You've already forked CEF4Delphi
mirror of
https://github.com/salvadordf/CEF4Delphi.git
synced 2025-08-14 21:42:50 +02:00
Update to CEF 113.1.5
This commit is contained in:
14
README.md
14
README.md
@@ -3,15 +3,15 @@ CEF4Delphi is an open source project created by Salvador Díaz Fau to embed Chro
|
|||||||
|
|
||||||
CEF4Delphi is based on DCEF3 and fpCEF3. The original license of those projects still applies to CEF4Delphi. Read the license terms in the first lines of any *.pas file.
|
CEF4Delphi is based on DCEF3 and fpCEF3. The original license of those projects still applies to CEF4Delphi. Read the license terms in the first lines of any *.pas file.
|
||||||
|
|
||||||
CEF4Delphi uses CEF 113.1.4 which includes Chromium 113.0.5672.63.
|
CEF4Delphi uses CEF 113.1.5 which includes Chromium 113.0.5672.93.
|
||||||
|
|
||||||
The CEF binaries used by CEF4Delphi are available for download at Spotify :
|
The CEF binaries used by CEF4Delphi are available for download at Spotify :
|
||||||
* [Windows 32 bits](https://cef-builds.spotifycdn.com/cef_binary_113.1.4%2Bg327635f%2Bchromium-113.0.5672.63_windows32.tar.bz2)
|
* [Windows 32 bits](https://cef-builds.spotifycdn.com/cef_binary_113.1.5%2Bge452d82%2Bchromium-113.0.5672.93_windows32.tar.bz2)
|
||||||
* [Windows 64 bits](https://cef-builds.spotifycdn.com/cef_binary_113.1.4%2Bg327635f%2Bchromium-113.0.5672.63_windows64.tar.bz2)
|
* [Windows 64 bits](https://cef-builds.spotifycdn.com/cef_binary_113.1.5%2Bge452d82%2Bchromium-113.0.5672.93_windows64.tar.bz2)
|
||||||
* [Linux x86 64 bits](https://cef-builds.spotifycdn.com/cef_binary_113.1.4%2Bg327635f%2Bchromium-113.0.5672.63_linux64.tar.bz2)
|
* [Linux x86 64 bits](https://cef-builds.spotifycdn.com/cef_binary_113.1.5%2Bge452d82%2Bchromium-113.0.5672.93_linux64.tar.bz2)
|
||||||
* [Linux ARM 32 bits](https://cef-builds.spotifycdn.com/cef_binary_113.1.4%2Bg327635f%2Bchromium-113.0.5672.63_linuxarm.tar.bz2)
|
* [Linux ARM 32 bits](https://cef-builds.spotifycdn.com/cef_binary_113.1.5%2Bge452d82%2Bchromium-113.0.5672.93_linuxarm.tar.bz2)
|
||||||
* [Linux ARM 64 bits](https://cef-builds.spotifycdn.com/cef_binary_113.1.4%2Bg327635f%2Bchromium-113.0.5672.63_linuxarm64.tar.bz2)
|
* [Linux ARM 64 bits](https://cef-builds.spotifycdn.com/cef_binary_113.1.5%2Bge452d82%2Bchromium-113.0.5672.93_linuxarm64.tar.bz2)
|
||||||
* [MacOS x86 64 bits](https://cef-builds.spotifycdn.com/cef_binary_113.1.4%2Bg327635f%2Bchromium-113.0.5672.63_macosx64.tar.bz2)
|
* [MacOS x86 64 bits](https://cef-builds.spotifycdn.com/cef_binary_113.1.5%2Bge452d82%2Bchromium-113.0.5672.93_macosx64.tar.bz2)
|
||||||
|
|
||||||
CEF4Delphi was developed and tested on Delphi 11.3 and it has been tested in Delphi 7, Delphi XE, Delphi 10, Delphi 10.2, Delphi 10.3, Delphi 10.4 and Lazarus 2.2.6/FPC 3.2.2. CEF4Delphi includes VCL, FireMonkey (FMX) and Lazarus components.
|
CEF4Delphi was developed and tested on Delphi 11.3 and it has been tested in Delphi 7, Delphi XE, Delphi 10, Delphi 10.2, Delphi 10.3, Delphi 10.4 and Lazarus 2.2.6/FPC 3.2.2. CEF4Delphi includes VCL, FireMonkey (FMX) and Lazarus components.
|
||||||
|
|
||||||
|
@@ -68,19 +68,23 @@ type
|
|||||||
FDefaultURL : ustring;
|
FDefaultURL : ustring;
|
||||||
FDelayMs : integer;
|
FDelayMs : integer;
|
||||||
FOnSnapshotAvailable : TNotifyEvent;
|
FOnSnapshotAvailable : TNotifyEvent;
|
||||||
|
FOnHTMLAvailable : TNotifyEvent;
|
||||||
FOnError : TNotifyEvent;
|
FOnError : TNotifyEvent;
|
||||||
FErrorCode : integer;
|
FErrorCode : integer;
|
||||||
FErrorText : ustring;
|
FErrorText : ustring;
|
||||||
FFailedUrl : ustring;
|
FFailedUrl : ustring;
|
||||||
FPendingUrl : ustring;
|
FPendingUrl : ustring;
|
||||||
FSyncEvents : boolean;
|
FSyncEvents : boolean;
|
||||||
|
FHTMLcopy : ustring;
|
||||||
|
|
||||||
function GetErrorCode : integer;
|
function GetErrorCode : integer;
|
||||||
function GetErrorText : ustring;
|
function GetErrorText : ustring;
|
||||||
function GetFailedUrl : ustring;
|
function GetFailedUrl : ustring;
|
||||||
|
function GetHTMLcopy : ustring;
|
||||||
function GetInitialized : boolean;
|
function GetInitialized : boolean;
|
||||||
|
|
||||||
procedure SetErrorText(const aValue : ustring);
|
procedure SetErrorText(const aValue : ustring);
|
||||||
|
procedure SetHTMLcopy(const aValue : ustring);
|
||||||
|
|
||||||
procedure Browser_OnAfterCreated(Sender: TObject; const browser: ICefBrowser);
|
procedure Browser_OnAfterCreated(Sender: TObject; const browser: ICefBrowser);
|
||||||
procedure Browser_OnPaint(Sender: TObject; const browser: ICefBrowser; kind: TCefPaintElementType; dirtyRectsCount: NativeUInt; const dirtyRects: PCefRectArray; const buffer: Pointer; aWidth, aHeight: Integer);
|
procedure Browser_OnPaint(Sender: TObject; const browser: ICefBrowser; kind: TCefPaintElementType; dirtyRectsCount: NativeUInt; const dirtyRects: PCefRectArray; const buffer: Pointer; aWidth, aHeight: Integer);
|
||||||
@@ -93,9 +97,11 @@ type
|
|||||||
procedure Browser_OnBeforeClose(Sender: TObject; const browser: ICefBrowser);
|
procedure Browser_OnBeforeClose(Sender: TObject; const browser: ICefBrowser);
|
||||||
procedure Browser_OnLoadError(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; errorCode: Integer; const errorText, failedUrl: ustring);
|
procedure Browser_OnLoadError(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; errorCode: Integer; const errorText, failedUrl: ustring);
|
||||||
procedure Browser_OnLoadingStateChange(Sender: TObject; const browser: ICefBrowser; isLoading, canGoBack, canGoForward: Boolean);
|
procedure Browser_OnLoadingStateChange(Sender: TObject; const browser: ICefBrowser; isLoading, canGoBack, canGoForward: Boolean);
|
||||||
|
procedure Browser_OnTextResultAvailable(Sender: TObject; const aText : ustring);
|
||||||
|
|
||||||
procedure DoOnError;
|
procedure DoOnError;
|
||||||
procedure DoOnSnapshotAvailable;
|
procedure DoOnSnapshotAvailable;
|
||||||
|
procedure DoOnHTMLAvailable;
|
||||||
procedure Resize;
|
procedure Resize;
|
||||||
function CreateBrowser : boolean;
|
function CreateBrowser : boolean;
|
||||||
procedure CloseBrowser;
|
procedure CloseBrowser;
|
||||||
@@ -120,8 +126,10 @@ type
|
|||||||
property Initialized : boolean read GetInitialized;
|
property Initialized : boolean read GetInitialized;
|
||||||
property Closing : boolean read FClosing;
|
property Closing : boolean read FClosing;
|
||||||
property SyncEvents : boolean read FSyncEvents write FSyncEvents;
|
property SyncEvents : boolean read FSyncEvents write FSyncEvents;
|
||||||
|
property HTMLcopy : ustring read GetHTMLcopy write SetHTMLcopy;
|
||||||
|
|
||||||
property OnSnapshotAvailable : TNotifyEvent read FOnSnapshotAvailable write FOnSnapshotAvailable;
|
property OnSnapshotAvailable : TNotifyEvent read FOnSnapshotAvailable write FOnSnapshotAvailable;
|
||||||
|
property OnHTMLAvailable : TNotifyEvent read FOnHTMLAvailable write FOnHTMLAvailable;
|
||||||
property OnError : TNotifyEvent read FOnError write FOnError;
|
property OnError : TNotifyEvent read FOnError write FOnError;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@@ -154,6 +162,7 @@ begin
|
|||||||
FBrowserInfoCS := nil;
|
FBrowserInfoCS := nil;
|
||||||
FDelayMs := aDelayMs;
|
FDelayMs := aDelayMs;
|
||||||
FOnSnapshotAvailable := nil;
|
FOnSnapshotAvailable := nil;
|
||||||
|
FOnHTMLAvailable := nil;
|
||||||
FOnError := nil;
|
FOnError := nil;
|
||||||
FClosing := False;
|
FClosing := False;
|
||||||
FSyncEvents := False;
|
FSyncEvents := False;
|
||||||
@@ -206,6 +215,7 @@ begin
|
|||||||
FBrowser.OnBeforeClose := Browser_OnBeforeClose;
|
FBrowser.OnBeforeClose := Browser_OnBeforeClose;
|
||||||
FBrowser.OnLoadError := Browser_OnLoadError;
|
FBrowser.OnLoadError := Browser_OnLoadError;
|
||||||
FBrowser.OnLoadingStateChange := Browser_OnLoadingStateChange;
|
FBrowser.OnLoadingStateChange := Browser_OnLoadingStateChange;
|
||||||
|
FBrowser.OnTextResultAvailable := Browser_OnTextResultAvailable;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TCEFBrowserThread.GetErrorCode : integer;
|
function TCEFBrowserThread.GetErrorCode : integer;
|
||||||
@@ -247,6 +257,19 @@ begin
|
|||||||
Result := '';
|
Result := '';
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TCEFBrowserThread.GetHTMLcopy : ustring;
|
||||||
|
begin
|
||||||
|
if assigned(FBrowserInfoCS) then
|
||||||
|
try
|
||||||
|
FBrowserInfoCS.Acquire;
|
||||||
|
Result := FHTMLcopy;
|
||||||
|
finally
|
||||||
|
FBrowserInfoCS.Release;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
Result := '';
|
||||||
|
end;
|
||||||
|
|
||||||
function TCEFBrowserThread.GetInitialized : boolean;
|
function TCEFBrowserThread.GetInitialized : boolean;
|
||||||
begin
|
begin
|
||||||
Result := False;
|
Result := False;
|
||||||
@@ -271,6 +294,17 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TCEFBrowserThread.SetHTMLcopy(const aValue : ustring);
|
||||||
|
begin
|
||||||
|
if assigned(FBrowserInfoCS) then
|
||||||
|
try
|
||||||
|
FBrowserInfoCS.Acquire;
|
||||||
|
FHTMLcopy := aValue;
|
||||||
|
finally
|
||||||
|
FBrowserInfoCS.Release;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
function TCEFBrowserThread.CopySnapshot(var aSnapshot : TBitmap) : boolean;
|
function TCEFBrowserThread.CopySnapshot(var aSnapshot : TBitmap) : boolean;
|
||||||
begin
|
begin
|
||||||
Result := False;
|
Result := False;
|
||||||
@@ -566,6 +600,19 @@ begin
|
|||||||
PostThreadMessage(ThreadID, CEF_WEBPAGE_LOADED_MSG, 0, 0);
|
PostThreadMessage(ThreadID, CEF_WEBPAGE_LOADED_MSG, 0, 0);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TCEFBrowserThread.Browser_OnTextResultAvailable(Sender: TObject; const aText : ustring);
|
||||||
|
begin
|
||||||
|
HTMLcopy := aText;
|
||||||
|
|
||||||
|
if assigned(FOnHTMLAvailable) then
|
||||||
|
begin
|
||||||
|
if FSyncEvents then
|
||||||
|
Synchronize(DoOnHTMLAvailable)
|
||||||
|
else
|
||||||
|
DoOnHTMLAvailable;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TCEFBrowserThread.Resize;
|
procedure TCEFBrowserThread.Resize;
|
||||||
begin
|
begin
|
||||||
if FClosing or Terminated or not(Initialized) then exit;
|
if FClosing or Terminated or not(Initialized) then exit;
|
||||||
@@ -620,6 +667,9 @@ begin
|
|||||||
if (FDelayMs > 0) then
|
if (FDelayMs > 0) then
|
||||||
sleep(FDelayMs);
|
sleep(FDelayMs);
|
||||||
|
|
||||||
|
if assigned(FOnHTMLAvailable) then
|
||||||
|
FBrowser.RetrieveHTML();
|
||||||
|
|
||||||
if assigned(FOnSnapshotAvailable) then
|
if assigned(FOnSnapshotAvailable) then
|
||||||
begin
|
begin
|
||||||
if FSyncEvents then
|
if FSyncEvents then
|
||||||
@@ -659,6 +709,11 @@ begin
|
|||||||
FOnSnapshotAvailable(self);
|
FOnSnapshotAvailable(self);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TCEFBrowserThread.DoOnHTMLAvailable;
|
||||||
|
begin
|
||||||
|
FOnHTMLAvailable(self);
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TCEFBrowserThread.InitError;
|
procedure TCEFBrowserThread.InitError;
|
||||||
begin
|
begin
|
||||||
ErrorText := 'There was an error initializing the CEF browser.';
|
ErrorText := 'There was an error initializing the CEF browser.';
|
||||||
|
@@ -18,15 +18,25 @@ object WebpageSnapshotFrm: TWebpageSnapshotFrm
|
|||||||
Left = 0
|
Left = 0
|
||||||
Top = 25
|
Top = 25
|
||||||
Width = 1028
|
Width = 1028
|
||||||
Height = 692
|
Height = 532
|
||||||
Align = alClient
|
Align = alClient
|
||||||
AutoSize = True
|
AutoSize = True
|
||||||
Center = True
|
Center = True
|
||||||
Proportional = True
|
Proportional = True
|
||||||
ExplicitLeft = 104
|
ExplicitLeft = 104
|
||||||
ExplicitTop = 112
|
ExplicitTop = 112
|
||||||
ExplicitWidth = 105
|
ExplicitWidth = 777
|
||||||
ExplicitHeight = 105
|
ExplicitHeight = 329
|
||||||
|
end
|
||||||
|
object Splitter1: TSplitter
|
||||||
|
Left = 0
|
||||||
|
Top = 557
|
||||||
|
Width = 1028
|
||||||
|
Height = 3
|
||||||
|
Cursor = crVSplit
|
||||||
|
Align = alBottom
|
||||||
|
ExplicitTop = 25
|
||||||
|
ExplicitWidth = 535
|
||||||
end
|
end
|
||||||
object StatusBar1: TStatusBar
|
object StatusBar1: TStatusBar
|
||||||
Left = 0
|
Left = 0
|
||||||
@@ -37,8 +47,8 @@ object WebpageSnapshotFrm: TWebpageSnapshotFrm
|
|||||||
item
|
item
|
||||||
Width = 1000
|
Width = 1000
|
||||||
end>
|
end>
|
||||||
ExplicitTop = 718
|
ExplicitTop = 716
|
||||||
ExplicitWidth = 1032
|
ExplicitWidth = 1024
|
||||||
end
|
end
|
||||||
object NavigationPnl: TPanel
|
object NavigationPnl: TPanel
|
||||||
Left = 0
|
Left = 0
|
||||||
@@ -52,9 +62,9 @@ object WebpageSnapshotFrm: TWebpageSnapshotFrm
|
|||||||
Padding.Right = 2
|
Padding.Right = 2
|
||||||
Padding.Bottom = 2
|
Padding.Bottom = 2
|
||||||
TabOrder = 1
|
TabOrder = 1
|
||||||
ExplicitWidth = 1032
|
ExplicitWidth = 1024
|
||||||
object GoBtn: TButton
|
object GoBtn: TButton
|
||||||
Left = 955
|
Left = 951
|
||||||
Top = 2
|
Top = 2
|
||||||
Width = 75
|
Width = 75
|
||||||
Height = 21
|
Height = 21
|
||||||
@@ -62,15 +72,27 @@ object WebpageSnapshotFrm: TWebpageSnapshotFrm
|
|||||||
Caption = 'Go'
|
Caption = 'Go'
|
||||||
TabOrder = 0
|
TabOrder = 0
|
||||||
OnClick = GoBtnClick
|
OnClick = GoBtnClick
|
||||||
|
ExplicitLeft = 947
|
||||||
end
|
end
|
||||||
object AddressEdt: TEdit
|
object AddressEdt: TEdit
|
||||||
Left = 2
|
Left = 2
|
||||||
Top = 2
|
Top = 2
|
||||||
Width = 953
|
Width = 949
|
||||||
Height = 21
|
Height = 21
|
||||||
Align = alClient
|
Align = alClient
|
||||||
TabOrder = 1
|
TabOrder = 1
|
||||||
Text = 'https://www.google.com'
|
Text = 'https://www.google.com'
|
||||||
|
ExplicitWidth = 945
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
object Memo1: TMemo
|
||||||
|
Left = 0
|
||||||
|
Top = 560
|
||||||
|
Width = 1028
|
||||||
|
Height = 157
|
||||||
|
Align = alBottom
|
||||||
|
ReadOnly = True
|
||||||
|
ScrollBars = ssBoth
|
||||||
|
TabOrder = 2
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
@@ -58,6 +58,8 @@ type
|
|||||||
NavigationPnl: TPanel;
|
NavigationPnl: TPanel;
|
||||||
GoBtn: TButton;
|
GoBtn: TButton;
|
||||||
AddressEdt: TEdit;
|
AddressEdt: TEdit;
|
||||||
|
Memo1: TMemo;
|
||||||
|
Splitter1: TSplitter;
|
||||||
procedure GoBtnClick(Sender: TObject);
|
procedure GoBtnClick(Sender: TObject);
|
||||||
procedure FormCreate(Sender: TObject);
|
procedure FormCreate(Sender: TObject);
|
||||||
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
|
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
|
||||||
@@ -67,6 +69,7 @@ type
|
|||||||
|
|
||||||
procedure Thread_OnError(Sender: TObject);
|
procedure Thread_OnError(Sender: TObject);
|
||||||
procedure Thread_OnSnapshotAvailable(Sender: TObject);
|
procedure Thread_OnSnapshotAvailable(Sender: TObject);
|
||||||
|
procedure Thread_OnHTMLAvailable(Sender: TObject);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
var
|
var
|
||||||
@@ -114,6 +117,7 @@ begin
|
|||||||
FThread := TCEFBrowserThread.Create(AddressEdt.Text, 1024, 768);
|
FThread := TCEFBrowserThread.Create(AddressEdt.Text, 1024, 768);
|
||||||
FThread.OnError := Thread_OnError;
|
FThread.OnError := Thread_OnError;
|
||||||
FThread.OnSnapshotAvailable := Thread_OnSnapshotAvailable;
|
FThread.OnSnapshotAvailable := Thread_OnSnapshotAvailable;
|
||||||
|
FThread.OnHTMLAvailable := Thread_OnHTMLAvailable;
|
||||||
FThread.SyncEvents := True;
|
FThread.SyncEvents := True;
|
||||||
FThread.Start;
|
FThread.Start;
|
||||||
end
|
end
|
||||||
@@ -162,4 +166,10 @@ begin
|
|||||||
StatusBar1.Panels[0].Text := 'There was an error copying the snapshot';
|
StatusBar1.Panels[0].Text := 'There was an error copying the snapshot';
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TWebpageSnapshotFrm.Thread_OnHTMLAvailable(Sender: TObject);
|
||||||
|
begin
|
||||||
|
if (FThread <> nil) then
|
||||||
|
Memo1.Lines.Add(FThread.HTMLcopy);
|
||||||
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
@@ -21,7 +21,7 @@
|
|||||||
</CompilerOptions>
|
</CompilerOptions>
|
||||||
<Description Value="CEF4Delphi is an open source project created by Salvador Díaz Fau to embed Chromium-based browsers in applications made with Delphi or Lazarus/FPC."/>
|
<Description Value="CEF4Delphi is an open source project created by Salvador Díaz Fau to embed Chromium-based browsers in applications made with Delphi or Lazarus/FPC."/>
|
||||||
<License Value="MPL 1.1"/>
|
<License Value="MPL 1.1"/>
|
||||||
<Version Major="113" Minor="1" Release="4"/>
|
<Version Major="113" Minor="1" Release="5"/>
|
||||||
<Files Count="214">
|
<Files Count="214">
|
||||||
<Item1>
|
<Item1>
|
||||||
<Filename Value="..\source\uCEFAccessibilityHandler.pas"/>
|
<Filename Value="..\source\uCEFAccessibilityHandler.pas"/>
|
||||||
|
@@ -1,9 +1,9 @@
|
|||||||
CEF_SUPPORTED_VERSION_MAJOR = 113;
|
CEF_SUPPORTED_VERSION_MAJOR = 113;
|
||||||
CEF_SUPPORTED_VERSION_MINOR = 1;
|
CEF_SUPPORTED_VERSION_MINOR = 1;
|
||||||
CEF_SUPPORTED_VERSION_RELEASE = 4;
|
CEF_SUPPORTED_VERSION_RELEASE = 5;
|
||||||
CEF_SUPPORTED_VERSION_BUILD = 0;
|
CEF_SUPPORTED_VERSION_BUILD = 0;
|
||||||
|
|
||||||
CEF_CHROMEELF_VERSION_MAJOR = CEF_SUPPORTED_VERSION_MAJOR;
|
CEF_CHROMEELF_VERSION_MAJOR = CEF_SUPPORTED_VERSION_MAJOR;
|
||||||
CEF_CHROMEELF_VERSION_MINOR = 0;
|
CEF_CHROMEELF_VERSION_MINOR = 0;
|
||||||
CEF_CHROMEELF_VERSION_RELEASE = 5672;
|
CEF_CHROMEELF_VERSION_RELEASE = 5672;
|
||||||
CEF_CHROMEELF_VERSION_BUILD = 63;
|
CEF_CHROMEELF_VERSION_BUILD = 93;
|
||||||
|
@@ -2,9 +2,9 @@
|
|||||||
"UpdateLazPackages" : [
|
"UpdateLazPackages" : [
|
||||||
{
|
{
|
||||||
"ForceNotify" : true,
|
"ForceNotify" : true,
|
||||||
"InternalVersion" : 485,
|
"InternalVersion" : 486,
|
||||||
"Name" : "cef4delphi_lazarus.lpk",
|
"Name" : "cef4delphi_lazarus.lpk",
|
||||||
"Version" : "113.1.4"
|
"Version" : "113.1.5"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"UpdatePackageData" : {
|
"UpdatePackageData" : {
|
||||||
|
Reference in New Issue
Block a user