1
0
mirror of https://github.com/salvadordf/CEF4Delphi.git synced 2025-06-12 22:07:39 +02:00

Update to CEF 83.4.0

This commit is contained in:
Salvador Díaz Fau
2020-06-21 21:27:55 +02:00
parent ef2277fe6c
commit 7e3e8bad24
25 changed files with 1106 additions and 298 deletions

View File

@ -3,10 +3,10 @@ CEF4Delphi is an open source project created by Salvador Díaz Fau to embed Chro
CEF4Delphi is based on DCEF3, made by Henri Gourvest. The original license of DCEF3 still applies to CEF4Delphi. Read the license terms in the first lines of any *.pas file. CEF4Delphi is based on DCEF3, made by Henri Gourvest. The original license of DCEF3 still applies to CEF4Delphi. Read the license terms in the first lines of any *.pas file.
CEF4Delphi uses CEF 83.3.12 which includes Chromium 83.0.4103.97. CEF4Delphi uses CEF 83.4.0 which includes Chromium 83.0.4103.106.
The CEF binaries used by CEF4Delphi are available for download at spotify : The CEF binaries used by CEF4Delphi are available for download at spotify :
* [32 bits](http://opensource.spotify.com/cefbuilds/cef_binary_83.3.12%2Bg0889ff0%2Bchromium-83.0.4103.97_windows32.tar.bz2) * [32 bits](http://opensource.spotify.com/cefbuilds/cef_binary_83.4.0%2Bgfd6631b%2Bchromium-83.0.4103.106_windows32.tar.bz2)
* [64 bits](http://opensource.spotify.com/cefbuilds/cef_binary_83.3.12%2Bg0889ff0%2Bchromium-83.0.4103.97_windows64.tar.bz2) * [64 bits](http://opensource.spotify.com/cefbuilds/cef_binary_83.4.0%2Bgfd6631b%2Bchromium-83.0.4103.106_windows64.tar.bz2)
CEF4Delphi was developed and tested on Delphi 10.4 and it has been tested in Delphi 7, Delphi XE, Delphi 10, Delphi 10.2, Delphi 10.3 and Lazarus 2.0.8/FPC 3.0.4. CEF4Delphi includes VCL, FireMonkey (FMX) and Lazarus components. CEF4Delphi was developed and tested on Delphi 10.4 and it has been tested in Delphi 7, Delphi XE, Delphi 10, Delphi 10.2, Delphi 10.3 and Lazarus 2.0.8/FPC 3.0.4. CEF4Delphi includes VCL, FireMonkey (FMX) and Lazarus components.

View File

@ -183,7 +183,7 @@ uses
// This method for sending text messages is limited to around 10000 characters // This method for sending text messages is limited to around 10000 characters
// but it's much easier to implement than using a JavaScript extension. // but it's much easier to implement than using a JavaScript extension.
// It cosist of using the JavaScript command "console.log" with a known text // It cosist of using the JavaScript command "console.log" with a known text
// preamble. The browser process rceives the console message in the // preamble. The browser process receives the console message in the
// TChromium.OnConsoleMessage event and we identify the right message thanks to // TChromium.OnConsoleMessage event and we identify the right message thanks to
// the preamble in the message. // the preamble in the message.
@ -399,6 +399,18 @@ begin
// Remove it if you don't want to use the DOM visitor // Remove it if you don't want to use the DOM visitor
GlobalCEFApp.LogFile := 'debug.log'; GlobalCEFApp.LogFile := 'debug.log';
GlobalCEFApp.LogSeverity := LOGSEVERITY_INFO; GlobalCEFApp.LogSeverity := LOGSEVERITY_INFO;
// Delphi can only debug one process and it debugs the browser process by
// default. If you need to debug code executed in the render process you will
// need to use any of the methods described here :
// https://www.briskbard.com/index.php?lang=en&pageid=cef#debugging
// Using the "Single process" mode is one of the ways to debug all the code
// because everything is executed in the browser process and Delphi won't have
// any problems. However, The "Single process" mode is unsupported by CEF and
// it causes unexpected issues. You should *ONLY* use it for debugging
// purposses.
//GlobalCEFApp.SingleProcess := True;
end; end;
procedure TDOMVisitorFrm.Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); procedure TDOMVisitorFrm.Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser);

View File

@ -58,6 +58,7 @@ const
MINIBROWSER_CONTEXTMENU_SETJSEVENT = MENU_ID_USER_FIRST + 1; MINIBROWSER_CONTEXTMENU_SETJSEVENT = MENU_ID_USER_FIRST + 1;
MINIBROWSER_CONTEXTMENU_JSVISITDOM = MENU_ID_USER_FIRST + 2; MINIBROWSER_CONTEXTMENU_JSVISITDOM = MENU_ID_USER_FIRST + 2;
MINIBROWSER_CONTEXTMENU_SHOWDEVTOOLS = MENU_ID_USER_FIRST + 3; MINIBROWSER_CONTEXTMENU_SHOWDEVTOOLS = MENU_ID_USER_FIRST + 3;
MINIBROWSER_CONTEXTMENU_OFFLINE = MENU_ID_USER_FIRST + 4;
MOUSEOVER_MESSAGE_NAME = 'mouseover'; MOUSEOVER_MESSAGE_NAME = 'mouseover';
CUSTOMNAME_MESSAGE_NAME = 'customname'; CUSTOMNAME_MESSAGE_NAME = 'customname';
@ -93,6 +94,8 @@ type
FCanClose : boolean; // Set to True in TChromium.OnBeforeClose FCanClose : boolean; // Set to True in TChromium.OnBeforeClose
FClosing : boolean; // Set to True in the CloseQuery event. FClosing : boolean; // Set to True in the CloseQuery event.
FOffline : boolean;
procedure BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED; procedure BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED;
procedure BrowserDestroyMsg(var aMessage : TMessage); message CEF_DESTROY; procedure BrowserDestroyMsg(var aMessage : TMessage); message CEF_DESTROY;
procedure ShowTextViewerMsg(var aMessage : TMessage); message MINIBROWSER_SHOWTEXTVIEWER; procedure ShowTextViewerMsg(var aMessage : TMessage); message MINIBROWSER_SHOWTEXTVIEWER;
@ -100,6 +103,8 @@ type
procedure WMMoving(var aMessage : TMessage); message WM_MOVING; procedure WMMoving(var aMessage : TMessage); message WM_MOVING;
procedure WMEnterMenuLoop(var aMessage: TMessage); message WM_ENTERMENULOOP; procedure WMEnterMenuLoop(var aMessage: TMessage); message WM_ENTERMENULOOP;
procedure WMExitMenuLoop(var aMessage: TMessage); message WM_EXITMENULOOP; procedure WMExitMenuLoop(var aMessage: TMessage); message WM_EXITMENULOOP;
function SwitchOfflineMode : integer;
end; end;
var var
@ -112,7 +117,7 @@ implementation
{$R *.dfm} {$R *.dfm}
uses uses
uSimpleTextViewer, uCEFMiscFunctions, uTestExtensionHandler; uSimpleTextViewer, uCEFMiscFunctions, uTestExtensionHandler, uCEFDictionaryValue;
// BASIC CONCEPTS // BASIC CONCEPTS
// ============== // ==============
@ -332,6 +337,8 @@ begin
model.AddItem(MINIBROWSER_CONTEXTMENU_SETJSEVENT, 'Set mouseover event'); model.AddItem(MINIBROWSER_CONTEXTMENU_SETJSEVENT, 'Set mouseover event');
model.AddItem(MINIBROWSER_CONTEXTMENU_JSVISITDOM, 'Visit DOM in JavaScript'); model.AddItem(MINIBROWSER_CONTEXTMENU_JSVISITDOM, 'Visit DOM in JavaScript');
model.AddItem(MINIBROWSER_CONTEXTMENU_SHOWDEVTOOLS, 'Show DevTools'); model.AddItem(MINIBROWSER_CONTEXTMENU_SHOWDEVTOOLS, 'Show DevTools');
model.AddCheckItem(MINIBROWSER_CONTEXTMENU_OFFLINE, 'Offline');
model.SetChecked(MINIBROWSER_CONTEXTMENU_OFFLINE, FOffline);
end; end;
procedure TJSExtensionFrm.Chromium1BeforePopup(Sender: TObject; procedure TJSExtensionFrm.Chromium1BeforePopup(Sender: TObject;
@ -396,6 +403,29 @@ begin
TempPoint.y := params.YCoord; TempPoint.y := params.YCoord;
Chromium1.ShowDevTools(TempPoint, nil); Chromium1.ShowDevTools(TempPoint, nil);
end; end;
MINIBROWSER_CONTEXTMENU_OFFLINE :
SwitchOfflineMode;
end;
end;
// This is a simple example to set the "offline" mode in the DevTools using the TChromium methods directly.
function TJSExtensionFrm.SwitchOfflineMode : integer;
var
TempParams : ICefDictionaryValue;
begin
try
FOffline := not(FOffline);
TempParams := TCefDictionaryValueRef.New;
TempParams.SetBool('offline', FOffline);
TempParams.SetDouble('latency', 0);
TempParams.SetDouble('downloadThroughput', 0);
TempParams.SetDouble('uploadThroughput', 0);
Result := Chromium1.ExecuteDevToolsMethod(0, 'Network.emulateNetworkConditions', TempParams);
finally
TempParams := nil;
end; end;
end; end;

View File

@ -22,8 +22,8 @@
<ResourceBaseClass Value="Form"/> <ResourceBaseClass Value="Form"/>
<IsVisibleTab Value="True"/> <IsVisibleTab Value="True"/>
<EditorIndex Value="1"/> <EditorIndex Value="1"/>
<TopLine Value="462"/> <TopLine Value="120"/>
<CursorPos Y="485"/> <CursorPos X="83" Y="140"/>
<UsageCount Value="20"/> <UsageCount Value="20"/>
<Loaded Value="True"/> <Loaded Value="True"/>
<LoadedDesigner Value="True"/> <LoadedDesigner Value="True"/>
@ -52,124 +52,124 @@
</Units> </Units>
<JumpHistory Count="30" HistoryIndex="29"> <JumpHistory Count="30" HistoryIndex="29">
<Position1> <Position1>
<Filename Value="uTestExtensionHandler.pas"/> <Filename Value="uJSExtension.pas"/>
<Caret Line="94" Column="56" TopLine="41"/> <Caret Line="136" Column="39" TopLine="127"/>
</Position1> </Position1>
<Position2> <Position2>
<Filename Value="uJSExtension.pas"/> <Filename Value="uJSExtension.pas"/>
<Caret Line="312" Column="54" TopLine="301"/> <Caret Line="144" Column="114" TopLine="127"/>
</Position2> </Position2>
<Position3> <Position3>
<Filename Value="JSExtension.lpr"/> <Filename Value="uJSExtension.pas"/>
<Caret Line="60" Column="17" TopLine="42"/> <Caret Line="150" Column="74" TopLine="127"/>
</Position3> </Position3>
<Position4> <Position4>
<Filename Value="uJSExtension.pas"/> <Filename Value="uJSExtension.pas"/>
<Caret Line="126" TopLine="111"/> <Caret Line="199" Column="41" TopLine="173"/>
</Position4> </Position4>
<Position5> <Position5>
<Filename Value="uJSExtension.pas"/> <Filename Value="uJSExtension.pas"/>
<Caret Line="136" Column="39" TopLine="127"/> <Caret Line="201" Column="92" TopLine="173"/>
</Position5> </Position5>
<Position6> <Position6>
<Filename Value="uJSExtension.pas"/> <Filename Value="uJSExtension.pas"/>
<Caret Line="144" Column="114" TopLine="127"/> <Caret Line="205" Column="77" TopLine="173"/>
</Position6> </Position6>
<Position7> <Position7>
<Filename Value="uJSExtension.pas"/> <Filename Value="uJSExtension.pas"/>
<Caret Line="150" Column="74" TopLine="127"/> <Caret Line="207" Column="18" TopLine="173"/>
</Position7> </Position7>
<Position8> <Position8>
<Filename Value="uJSExtension.pas"/> <Filename Value="uJSExtension.pas"/>
<Caret Line="199" Column="41" TopLine="173"/> <Caret Line="31" Column="76"/>
</Position8> </Position8>
<Position9> <Position9>
<Filename Value="uJSExtension.pas"/> <Filename Value="uJSExtension.pas"/>
<Caret Line="201" Column="92" TopLine="173"/> <Caret Line="149" Column="96" TopLine="108"/>
</Position9> </Position9>
<Position10> <Position10>
<Filename Value="uJSExtension.pas"/> <Filename Value="uJSExtension.pas"/>
<Caret Line="205" Column="77" TopLine="173"/> <Caret Line="150" Column="73" TopLine="127"/>
</Position10> </Position10>
<Position11> <Position11>
<Filename Value="uJSExtension.pas"/> <Filename Value="uJSExtension.pas"/>
<Caret Line="207" Column="18" TopLine="173"/> <Caret Line="199" Column="40" TopLine="173"/>
</Position11> </Position11>
<Position12> <Position12>
<Filename Value="uJSExtension.pas"/> <Filename Value="uJSExtension.pas"/>
<Caret Line="31" Column="76"/> <Caret Line="201" Column="91" TopLine="173"/>
</Position12> </Position12>
<Position13> <Position13>
<Filename Value="uJSExtension.pas"/> <Filename Value="uJSExtension.pas"/>
<Caret Line="149" Column="96" TopLine="108"/> <Caret Line="205" Column="75" TopLine="173"/>
</Position13> </Position13>
<Position14> <Position14>
<Filename Value="uJSExtension.pas"/> <Filename Value="uJSExtension.pas"/>
<Caret Line="150" Column="73" TopLine="127"/> <Caret Line="61" Column="30" TopLine="47"/>
</Position14> </Position14>
<Position15> <Position15>
<Filename Value="uJSExtension.pas"/> <Filename Value="uJSExtension.pas"/>
<Caret Line="199" Column="40" TopLine="173"/> <Caret Line="322" TopLine="303"/>
</Position15> </Position15>
<Position16> <Position16>
<Filename Value="uJSExtension.pas"/> <Filename Value="uJSExtension.pas"/>
<Caret Line="201" Column="91" TopLine="173"/> <Caret Line="324" TopLine="305"/>
</Position16> </Position16>
<Position17> <Position17>
<Filename Value="uJSExtension.pas"/> <Filename Value="uJSExtension.pas"/>
<Caret Line="205" Column="75" TopLine="173"/> <Caret Line="486" Column="3" TopLine="483"/>
</Position17> </Position17>
<Position18> <Position18>
<Filename Value="uJSExtension.pas"/> <Filename Value="uJSExtension.pas"/>
<Caret Line="61" Column="30" TopLine="47"/> <Caret Line="108" Column="15" TopLine="82"/>
</Position18> </Position18>
<Position19> <Position19>
<Filename Value="uJSExtension.pas"/> <Filename Value="uJSExtension.pas"/>
<Caret Line="322" TopLine="303"/> <Caret Line="343" TopLine="339"/>
</Position19> </Position19>
<Position20> <Position20>
<Filename Value="uJSExtension.pas"/> <Filename Value="uJSExtension.pas"/>
<Caret Line="324" TopLine="305"/> <Caret Line="486" Column="40" TopLine="483"/>
</Position20> </Position20>
<Position21> <Position21>
<Filename Value="uJSExtension.pas"/> <Filename Value="uJSExtension.pas"/>
<Caret Line="486" Column="3" TopLine="483"/> <Caret Line="108" Column="31" TopLine="81"/>
</Position21> </Position21>
<Position22> <Position22>
<Filename Value="uJSExtension.pas"/> <Filename Value="uJSExtension.pas"/>
<Caret Line="108" Column="15" TopLine="82"/> <Caret Line="343" Column="22" TopLine="339"/>
</Position22> </Position22>
<Position23> <Position23>
<Filename Value="uJSExtension.pas"/> <Filename Value="uJSExtension.pas"/>
<Caret Line="343" TopLine="339"/> <Caret Line="286" Column="56" TopLine="274"/>
</Position23> </Position23>
<Position24> <Position24>
<Filename Value="uJSExtension.pas"/> <Filename Value="uJSExtension.pas"/>
<Caret Line="486" Column="40" TopLine="483"/> <Caret Line="285" Column="56" TopLine="273"/>
</Position24> </Position24>
<Position25> <Position25>
<Filename Value="uJSExtension.pas"/> <Filename Value="uJSExtension.pas"/>
<Caret Line="108" Column="31" TopLine="81"/> <Caret Line="295" Column="9" TopLine="273"/>
</Position25> </Position25>
<Position26> <Position26>
<Filename Value="uJSExtension.pas"/> <Filename Value="uJSExtension.pas"/>
<Caret Line="343" Column="22" TopLine="339"/> <Caret Line="343" Column="41" TopLine="324"/>
</Position26> </Position26>
<Position27> <Position27>
<Filename Value="uJSExtension.pas"/> <Filename Value="uJSExtension.pas"/>
<Caret Line="286" Column="56" TopLine="274"/> <Caret Line="62" Column="35" TopLine="46"/>
</Position27> </Position27>
<Position28> <Position28>
<Filename Value="uJSExtension.pas"/> <Filename Value="uJSExtension.pas"/>
<Caret Line="285" Column="56" TopLine="273"/> <Caret Line="359" Column="65" TopLine="340"/>
</Position28> </Position28>
<Position29> <Position29>
<Filename Value="uJSExtension.pas"/> <Filename Value="uJSExtension.pas"/>
<Caret Line="295" Column="9" TopLine="273"/> <Caret Line="419" Column="88" TopLine="403"/>
</Position29> </Position29>
<Position30> <Position30>
<Filename Value="uJSExtension.pas"/> <Filename Value="uJSExtension.pas"/>
<Caret Line="343" Column="41" TopLine="324"/> <Caret Line="125" Column="42" TopLine="88"/>
</Position30> </Position30>
</JumpHistory> </JumpHistory>
<RunParams> <RunParams>

View File

@ -14,7 +14,7 @@ object JSExtensionFrm: TJSExtensionFrm
OnCreate = FormCreate OnCreate = FormCreate
OnShow = FormShow OnShow = FormShow
Position = poScreenCenter Position = poScreenCenter
LCLVersion = '2.0.6.0' LCLVersion = '2.0.8.0'
object NavControlPnl: TPanel object NavControlPnl: TPanel
Left = 0 Left = 0
Height = 21 Height = 21

View File

@ -60,6 +60,7 @@ const
MINIBROWSER_CONTEXTMENU_SETJSEVENT = MENU_ID_USER_FIRST + 1; MINIBROWSER_CONTEXTMENU_SETJSEVENT = MENU_ID_USER_FIRST + 1;
MINIBROWSER_CONTEXTMENU_JSVISITDOM = MENU_ID_USER_FIRST + 2; MINIBROWSER_CONTEXTMENU_JSVISITDOM = MENU_ID_USER_FIRST + 2;
MINIBROWSER_CONTEXTMENU_SHOWDEVTOOLS = MENU_ID_USER_FIRST + 3; MINIBROWSER_CONTEXTMENU_SHOWDEVTOOLS = MENU_ID_USER_FIRST + 3;
MINIBROWSER_CONTEXTMENU_OFFLINE = MENU_ID_USER_FIRST + 4;
MOUSEOVER_MESSAGE_NAME = 'mouseover'; MOUSEOVER_MESSAGE_NAME = 'mouseover';
CUSTOMNAME_MESSAGE_NAME = 'customname'; CUSTOMNAME_MESSAGE_NAME = 'customname';
@ -111,6 +112,8 @@ type
FCanClose : boolean; // Set to True in TChromium.OnBeforeClose FCanClose : boolean; // Set to True in TChromium.OnBeforeClose
FClosing : boolean; // Set to True in the CloseQuery event. FClosing : boolean; // Set to True in the CloseQuery event.
FOffline : boolean;
procedure BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED; procedure BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED;
procedure BrowserDestroyMsg(var aMessage : TMessage); message CEF_DESTROY; procedure BrowserDestroyMsg(var aMessage : TMessage); message CEF_DESTROY;
procedure ShowTextViewerMsg(var aMessage : TMessage); message MINIBROWSER_SHOWTEXTVIEWER; procedure ShowTextViewerMsg(var aMessage : TMessage); message MINIBROWSER_SHOWTEXTVIEWER;
@ -118,6 +121,8 @@ type
procedure WMMoving(var aMessage : TMessage); message WM_MOVING; procedure WMMoving(var aMessage : TMessage); message WM_MOVING;
procedure WMEnterMenuLoop(var aMessage: TMessage); message WM_ENTERMENULOOP; procedure WMEnterMenuLoop(var aMessage: TMessage); message WM_ENTERMENULOOP;
procedure WMExitMenuLoop(var aMessage: TMessage); message WM_EXITMENULOOP; procedure WMExitMenuLoop(var aMessage: TMessage); message WM_EXITMENULOOP;
function SwitchOfflineMode : integer;
public public
{ Public declarations } { Public declarations }
end; end;
@ -132,7 +137,7 @@ implementation
{$R *.lfm} {$R *.lfm}
uses uses
uSimpleTextViewer, uCEFMiscFunctions, uTestExtensionHandler; uSimpleTextViewer, uCEFMiscFunctions, uTestExtensionHandler, uCEFDictionaryValue;
// BASIC CONCEPTS // BASIC CONCEPTS
// ============== // ==============
@ -352,6 +357,8 @@ begin
model.AddItem(MINIBROWSER_CONTEXTMENU_SETJSEVENT, 'Set mouseover event'); model.AddItem(MINIBROWSER_CONTEXTMENU_SETJSEVENT, 'Set mouseover event');
model.AddItem(MINIBROWSER_CONTEXTMENU_JSVISITDOM, 'Visit DOM in JavaScript'); model.AddItem(MINIBROWSER_CONTEXTMENU_JSVISITDOM, 'Visit DOM in JavaScript');
model.AddItem(MINIBROWSER_CONTEXTMENU_SHOWDEVTOOLS, 'Show DevTools'); model.AddItem(MINIBROWSER_CONTEXTMENU_SHOWDEVTOOLS, 'Show DevTools');
model.AddCheckItem(MINIBROWSER_CONTEXTMENU_OFFLINE, 'Offline');
model.SetChecked(MINIBROWSER_CONTEXTMENU_OFFLINE, FOffline);
end; end;
procedure TJSExtensionFrm.Chromium1BeforePopup(Sender: TObject; procedure TJSExtensionFrm.Chromium1BeforePopup(Sender: TObject;
@ -418,6 +425,29 @@ begin
TempPoint.y := params.YCoord; TempPoint.y := params.YCoord;
Chromium1.ShowDevTools(TempPoint, nil); Chromium1.ShowDevTools(TempPoint, nil);
end; end;
MINIBROWSER_CONTEXTMENU_OFFLINE :
SwitchOfflineMode;
end;
end;
// This is a simple example to set the "offline" mode in the DevTools using the TChromium methods directly.
function TJSExtensionFrm.SwitchOfflineMode : integer;
var
TempParams : ICefDictionaryValue;
begin
try
FOffline := not(FOffline);
TempParams := TCefDictionaryValueRef.New;
TempParams.SetBool('offline', FOffline);
TempParams.SetDouble('latency', 0);
TempParams.SetDouble('downloadThroughput', 0);
TempParams.SetDouble('uploadThroughput', 0);
Result := Chromium1.ExecuteDevToolsMethod(0, 'Network.emulateNetworkConditions', TempParams);
finally
TempParams := nil;
end; end;
end; end;

View File

@ -4,14 +4,13 @@
<PathDelim Value="\"/> <PathDelim Value="\"/>
<Version Value="11"/> <Version Value="11"/>
<BuildModes Active="Default"/> <BuildModes Active="Default"/>
<Units Count="22"> <Units Count="32">
<Unit0> <Unit0>
<Filename Value="MiniBrowser.lpr"/> <Filename Value="MiniBrowser.lpr"/>
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
<IsVisibleTab Value="True"/>
<TopLine Value="37"/> <TopLine Value="37"/>
<CursorPos X="3" Y="51"/> <CursorPos X="50" Y="51"/>
<UsageCount Value="22"/> <UsageCount Value="27"/>
<Loaded Value="True"/> <Loaded Value="True"/>
<DefaultSyntaxHighlighter Value="Delphi"/> <DefaultSyntaxHighlighter Value="Delphi"/>
</Unit0> </Unit0>
@ -21,15 +20,11 @@
<ComponentName Value="MiniBrowserFrm"/> <ComponentName Value="MiniBrowserFrm"/>
<HasResources Value="True"/> <HasResources Value="True"/>
<ResourceBaseClass Value="Form"/> <ResourceBaseClass Value="Form"/>
<IsVisibleTab Value="True"/>
<EditorIndex Value="1"/> <EditorIndex Value="1"/>
<TopLine Value="509"/> <TopLine Value="293"/>
<CursorPos X="48" Y="543"/> <CursorPos X="66" Y="310"/>
<UsageCount Value="22"/> <UsageCount Value="27"/>
<Bookmarks Count="3">
<Item0 Y="842" ID="1"/>
<Item1 X="49" Y="61" ID="2"/>
<Item2 X="65" Y="1073" ID="3"/>
</Bookmarks>
<Loaded Value="True"/> <Loaded Value="True"/>
<LoadedDesigner Value="True"/> <LoadedDesigner Value="True"/>
<DefaultSyntaxHighlighter Value="Delphi"/> <DefaultSyntaxHighlighter Value="Delphi"/>
@ -43,7 +38,7 @@
<EditorIndex Value="-1"/> <EditorIndex Value="-1"/>
<TopLine Value="69"/> <TopLine Value="69"/>
<CursorPos X="86" Y="70"/> <CursorPos X="86" Y="70"/>
<UsageCount Value="22"/> <UsageCount Value="27"/>
<DefaultSyntaxHighlighter Value="Delphi"/> <DefaultSyntaxHighlighter Value="Delphi"/>
</Unit2> </Unit2>
<Unit3> <Unit3>
@ -53,7 +48,7 @@
<HasResources Value="True"/> <HasResources Value="True"/>
<ResourceBaseClass Value="Form"/> <ResourceBaseClass Value="Form"/>
<EditorIndex Value="-1"/> <EditorIndex Value="-1"/>
<UsageCount Value="22"/> <UsageCount Value="27"/>
<DefaultSyntaxHighlighter Value="Delphi"/> <DefaultSyntaxHighlighter Value="Delphi"/>
</Unit3> </Unit3>
<Unit4> <Unit4>
@ -82,14 +77,15 @@
<Filename Value="..\..\..\source\uCEFApplication.pas"/> <Filename Value="..\..\..\source\uCEFApplication.pas"/>
<EditorIndex Value="-1"/> <EditorIndex Value="-1"/>
<TopLine Value="43"/> <TopLine Value="43"/>
<UsageCount Value="10"/> <CursorPos X="42" Y="52"/>
<UsageCount Value="12"/>
</Unit7> </Unit7>
<Unit8> <Unit8>
<Filename Value="..\..\..\source\uCEFTypes.pas"/> <Filename Value="..\..\..\source\uCEFTypes.pas"/>
<EditorIndex Value="-1"/> <EditorIndex Value="-1"/>
<TopLine Value="280"/> <TopLine Value="295"/>
<CursorPos X="51" Y="290"/> <CursorPos X="57" Y="322"/>
<UsageCount Value="10"/> <UsageCount Value="11"/>
</Unit8> </Unit8>
<Unit9> <Unit9>
<Filename Value="..\..\..\source\uCEFInterfaces.pas"/> <Filename Value="..\..\..\source\uCEFInterfaces.pas"/>
@ -181,48 +177,87 @@
<CursorPos X="47" Y="219"/> <CursorPos X="47" Y="219"/>
<UsageCount Value="10"/> <UsageCount Value="10"/>
</Unit21> </Unit21>
<Unit22>
<Filename Value="..\..\..\source\uCEFApplicationCore.pas"/>
<EditorIndex Value="-1"/>
<TopLine Value="900"/>
<CursorPos X="77" Y="945"/>
<UsageCount Value="12"/>
</Unit22>
<Unit23>
<Filename Value="..\..\..\source\uCEFMiscFunctions.pas"/>
<EditorIndex Value="-1"/>
<TopLine Value="218"/>
<CursorPos X="10" Y="229"/>
<UsageCount Value="12"/>
<Bookmarks Count="3">
<Item0 X="9" Y="1299" ID="1"/>
<Item1 X="26" Y="896" ID="2"/>
<Item2 X="7" Y="1355" ID="3"/>
</Bookmarks>
</Unit23>
<Unit24>
<Filename Value="C:\lazarus\fpc\3.0.4\source\rtl\inc\systemh.inc"/>
<EditorIndex Value="-1"/>
<TopLine Value="424"/>
<CursorPos X="29" Y="413"/>
<UsageCount Value="11"/>
</Unit24>
<Unit25>
<Filename Value="C:\lazarus\fpc\3.0.4\source\rtl\objpas\sysutils\filutilh.inc"/>
<EditorIndex Value="-1"/>
<TopLine Value="118"/>
<CursorPos X="10" Y="130"/>
<UsageCount Value="11"/>
</Unit25>
<Unit26>
<Filename Value="C:\lazarus\fpc\3.0.4\source\rtl\objpas\sysutils\sysutilh.inc"/>
<EditorIndex Value="-1"/>
<TopLine Value="235"/>
<CursorPos X="13" Y="246"/>
<UsageCount Value="10"/>
</Unit26>
<Unit27>
<Filename Value="C:\lazarus\fpc\3.0.4\source\rtl\win\wininc\ascdef.inc"/>
<EditorIndex Value="-1"/>
<TopLine Value="61"/>
<CursorPos X="10" Y="70"/>
<UsageCount Value="10"/>
</Unit27>
<Unit28>
<Filename Value="C:\lazarus\fpc\3.0.4\source\rtl\inc\dynlibs.pas"/>
<EditorIndex Value="-1"/>
<TopLine Value="136"/>
<CursorPos X="3" Y="149"/>
<UsageCount Value="10"/>
</Unit28>
<Unit29>
<Filename Value="C:\lazarus\fpc\3.0.4\source\rtl\win\dynlibs.inc"/>
<EditorIndex Value="-1"/>
<TopLine Value="31"/>
<CursorPos X="41" Y="45"/>
<UsageCount Value="10"/>
</Unit29>
<Unit30>
<Filename Value="C:\lazarus\fpc\3.0.4\source\rtl\win\wininc\redef.inc"/>
<EditorIndex Value="-1"/>
<TopLine Value="894"/>
<CursorPos X="10" Y="906"/>
<UsageCount Value="10"/>
</Unit30>
<Unit31>
<Filename Value="C:\lazarus\fpc\3.0.4\source\rtl\win\wininc\unifun.inc"/>
<EditorIndex Value="-1"/>
<TopLine Value="59"/>
<CursorPos X="10" Y="70"/>
<UsageCount Value="10"/>
</Unit31>
</Units> </Units>
<JumpHistory Count="10" HistoryIndex="9"> <JumpHistory Count="1">
<Position1> <Position1>
<Filename Value="MiniBrowser.lpr"/> <Filename Value="uMiniBrowser.pas"/>
<Caret Line="65" TopLine="46"/> <Caret Line="305" TopLine="293"/>
</Position1> </Position1>
<Position2>
<Filename Value="uMiniBrowser.pas"/>
<Caret Line="66" Column="75" TopLine="46"/>
</Position2>
<Position3>
<Filename Value="uMiniBrowser.pas"/>
<Caret Line="67" Column="39" TopLine="46"/>
</Position3>
<Position4>
<Filename Value="uMiniBrowser.pas"/>
<Caret Line="461" TopLine="448"/>
</Position4>
<Position5>
<Filename Value="uMiniBrowser.pas"/>
<Caret Line="48" Column="37" TopLine="22"/>
</Position5>
<Position6>
<Filename Value="uMiniBrowser.pas"/>
<Caret Line="310" Column="52" TopLine="295"/>
</Position6>
<Position7>
<Filename Value="uMiniBrowser.pas"/>
<Caret Line="1005" Column="88" TopLine="979"/>
</Position7>
<Position8>
<Filename Value="uMiniBrowser.pas"/>
<Caret Line="1037" Column="50" TopLine="996"/>
</Position8>
<Position9>
<Filename Value="uMiniBrowser.pas"/>
<Caret Line="1157" Column="62" TopLine="1129"/>
</Position9>
<Position10>
<Filename Value="uMiniBrowser.pas"/>
<Caret Line="214" Column="29" TopLine="191"/>
</Position10>
</JumpHistory> </JumpHistory>
<RunParams> <RunParams>
<FormatVersion Value="2"/> <FormatVersion Value="2"/>

View File

@ -302,7 +302,6 @@ begin
GlobalCEFApp := TCefApplication.Create; GlobalCEFApp := TCefApplication.Create;
GlobalCEFApp.LogFile := 'debug.log'; GlobalCEFApp.LogFile := 'debug.log';
GlobalCEFApp.LogSeverity := LOGSEVERITY_INFO; GlobalCEFApp.LogSeverity := LOGSEVERITY_INFO;
GlobalCEFApp.cache := 'cache';
GlobalCEFApp.EnablePrintPreview := True; GlobalCEFApp.EnablePrintPreview := True;
end; end;

View File

@ -214,7 +214,8 @@ contains
uCEFButtonComponent in '..\source\uCEFButtonComponent.pas', uCEFButtonComponent in '..\source\uCEFButtonComponent.pas',
uCEFLabelButtonComponent in '..\source\uCEFLabelButtonComponent.pas', uCEFLabelButtonComponent in '..\source\uCEFLabelButtonComponent.pas',
uCEFMenuButtonComponent in '..\source\uCEFMenuButtonComponent.pas', uCEFMenuButtonComponent in '..\source\uCEFMenuButtonComponent.pas',
uCEFAudioHandler in '..\source\uCEFAudioHandler.pas'; uCEFAudioHandler in '..\source\uCEFAudioHandler.pas',
uCEFDevToolsMessageObserver in '..\source\uCEFDevToolsMessageObserver.pas';
end. end.

View File

@ -211,6 +211,7 @@ contains
uCEFButtonComponent in '..\source\uCEFButtonComponent.pas', uCEFButtonComponent in '..\source\uCEFButtonComponent.pas',
uCEFLabelButtonComponent in '..\source\uCEFLabelButtonComponent.pas', uCEFLabelButtonComponent in '..\source\uCEFLabelButtonComponent.pas',
uCEFMenuButtonComponent in '..\source\uCEFMenuButtonComponent.pas', uCEFMenuButtonComponent in '..\source\uCEFMenuButtonComponent.pas',
uCEFAudioHandler in '..\source\uCEFAudioHandler.pas'; uCEFAudioHandler in '..\source\uCEFAudioHandler.pas',
uCEFDevToolsMessageObserver in '..\source\uCEFDevToolsMessageObserver.pas';
end. end.

View File

@ -219,7 +219,8 @@ contains
uCEFButtonComponent in '..\source\uCEFButtonComponent.pas', uCEFButtonComponent in '..\source\uCEFButtonComponent.pas',
uCEFLabelButtonComponent in '..\source\uCEFLabelButtonComponent.pas', uCEFLabelButtonComponent in '..\source\uCEFLabelButtonComponent.pas',
uCEFMenuButtonComponent in '..\source\uCEFMenuButtonComponent.pas', uCEFMenuButtonComponent in '..\source\uCEFMenuButtonComponent.pas',
uCEFAudioHandler in '..\source\uCEFAudioHandler.pas'; uCEFAudioHandler in '..\source\uCEFAudioHandler.pas',
uCEFDevToolsMessageObserver in '..\source\uCEFDevToolsMessageObserver.pas';
end. end.

View File

@ -335,6 +335,7 @@
<DCCReference Include="..\source\uCEFLabelButtonComponent.pas"/> <DCCReference Include="..\source\uCEFLabelButtonComponent.pas"/>
<DCCReference Include="..\source\uCEFMenuButtonComponent.pas"/> <DCCReference Include="..\source\uCEFMenuButtonComponent.pas"/>
<DCCReference Include="..\source\uCEFAudioHandler.pas"/> <DCCReference Include="..\source\uCEFAudioHandler.pas"/>
<DCCReference Include="..\source\uCEFDevToolsMessageObserver.pas"/>
<BuildConfiguration Include="Base"> <BuildConfiguration Include="Base">
<Key>Base</Key> <Key>Base</Key>
</BuildConfiguration> </BuildConfiguration>

View File

@ -21,8 +21,8 @@
</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="83" Minor="3" Release="12"/> <Version Major="83" Minor="4"/>
<Files Count="186"> <Files Count="187">
<Item1> <Item1>
<Filename Value="..\source\uCEFAccessibilityHandler.pas"/> <Filename Value="..\source\uCEFAccessibilityHandler.pas"/>
<UnitName Value="uCEFAccessibilityHandler"/> <UnitName Value="uCEFAccessibilityHandler"/>
@ -783,6 +783,10 @@
<Filename Value="..\source\uCEFAudioHandler.pas"/> <Filename Value="..\source\uCEFAudioHandler.pas"/>
<UnitName Value="uCEFAudioHandler"/> <UnitName Value="uCEFAudioHandler"/>
</Item186> </Item186>
<Item187>
<Filename Value="..\source\uCEFDevToolsMessageObserver.pas"/>
<UnitName Value="uCEFDevToolsMessageObserver"/>
</Item187>
</Files> </Files>
<RequiredPkgs Count="4"> <RequiredPkgs Count="4">
<Item1> <Item1>

View File

@ -61,7 +61,8 @@ uses
uCEFMenuButtonComponent, uCEFLabelButtonComponent, uCEFButtonComponent, uCEFMenuButtonComponent, uCEFLabelButtonComponent, uCEFButtonComponent,
uCEFBrowserViewComponent, uCEFWindowComponent, uCEFPanelComponent, uCEFBrowserViewComponent, uCEFWindowComponent, uCEFPanelComponent,
uCEFScrollViewComponent, uCEFTextfieldComponent, uCEFViewComponent, uCEFScrollViewComponent, uCEFTextfieldComponent, uCEFViewComponent,
uCEFViewsFrameworkEvents, uCEFAudioHandler, LazarusPackageIntf; uCEFViewsFrameworkEvents, uCEFAudioHandler, uCEFDevToolsMessageObserver,
LazarusPackageIntf;
implementation implementation

View File

@ -61,14 +61,14 @@ uses
const const
CEF_SUPPORTED_VERSION_MAJOR = 83; CEF_SUPPORTED_VERSION_MAJOR = 83;
CEF_SUPPORTED_VERSION_MINOR = 3; CEF_SUPPORTED_VERSION_MINOR = 4;
CEF_SUPPORTED_VERSION_RELEASE = 12; CEF_SUPPORTED_VERSION_RELEASE = 0;
CEF_SUPPORTED_VERSION_BUILD = 0; CEF_SUPPORTED_VERSION_BUILD = 0;
CEF_CHROMEELF_VERSION_MAJOR = 83; CEF_CHROMEELF_VERSION_MAJOR = 83;
CEF_CHROMEELF_VERSION_MINOR = 0; CEF_CHROMEELF_VERSION_MINOR = 0;
CEF_CHROMEELF_VERSION_RELEASE = 4103; CEF_CHROMEELF_VERSION_RELEASE = 4103;
CEF_CHROMEELF_VERSION_BUILD = 97; CEF_CHROMEELF_VERSION_BUILD = 106;
{$IFDEF MSWINDOWS} {$IFDEF MSWINDOWS}
LIBCEF_DLL = 'libcef.dll'; LIBCEF_DLL = 'libcef.dll';
@ -169,6 +169,7 @@ type
FAllowRunningInsecureContent : boolean; FAllowRunningInsecureContent : boolean;
FSupportedSchemes : TStringList; FSupportedSchemes : TStringList;
FDisableNewBrowserInfoTimeout : boolean; FDisableNewBrowserInfoTimeout : boolean;
FDevToolsProtocolLogFile : ustring;
FPluginPolicy : TCefPluginPolicySwitch; FPluginPolicy : TCefPluginPolicySwitch;
FDefaultEncoding : string; FDefaultEncoding : string;
@ -440,6 +441,7 @@ type
property DisableReadingFromCanvas : boolean read FDisableReadingFromCanvas write FDisableReadingFromCanvas; // --disable-reading-from-canvas property DisableReadingFromCanvas : boolean read FDisableReadingFromCanvas write FDisableReadingFromCanvas; // --disable-reading-from-canvas
property HyperlinkAuditing : boolean read FHyperlinkAuditing write FHyperlinkAuditing; // --no-pings property HyperlinkAuditing : boolean read FHyperlinkAuditing write FHyperlinkAuditing; // --no-pings
property DisableNewBrowserInfoTimeout : boolean read FDisableNewBrowserInfoTimeout write FDisableNewBrowserInfoTimeout; // --disable-new-browser-info-timeout property DisableNewBrowserInfoTimeout : boolean read FDisableNewBrowserInfoTimeout write FDisableNewBrowserInfoTimeout; // --disable-new-browser-info-timeout
property DevToolsProtocolLogFile : ustring read FDevToolsProtocolLogFile write FDevToolsProtocolLogFile; // --devtools-protocol-log-file
// Properties used during the CEF initialization // Properties used during the CEF initialization
property WindowsSandboxInfo : Pointer read FWindowsSandboxInfo write FWindowsSandboxInfo; property WindowsSandboxInfo : Pointer read FWindowsSandboxInfo write FWindowsSandboxInfo;
@ -674,6 +676,7 @@ begin
FForceFieldTrialParams := ''; FForceFieldTrialParams := '';
FSupportedSchemes := nil; FSupportedSchemes := nil;
FDisableNewBrowserInfoTimeout := False; FDisableNewBrowserInfoTimeout := False;
FDevToolsProtocolLogFile := '';
FDisableJavascriptCloseWindows := False; FDisableJavascriptCloseWindows := False;
FDisableJavascriptAccessClipboard := False; FDisableJavascriptAccessClipboard := False;
@ -1709,6 +1712,9 @@ begin
if FDisableNewBrowserInfoTimeout then if FDisableNewBrowserInfoTimeout then
commandLine.AppendSwitch('--disable-new-browser-info-timeout'); commandLine.AppendSwitch('--disable-new-browser-info-timeout');
if (length(FDevToolsProtocolLogFile) > 0) then
commandLine.AppendSwitchWithValue('--devtools-protocol-log-file', FDevToolsProtocolLogFile);
case FPluginPolicy of case FPluginPolicy of
PLUGIN_POLICY_SWITCH_DETECT : commandLine.AppendSwitchWithValue('--plugin-policy', 'detect'); PLUGIN_POLICY_SWITCH_DETECT : commandLine.AppendSwitchWithValue('--plugin-policy', 'detect');
PLUGIN_POLICY_SWITCH_BLOCK : commandLine.AppendSwitchWithValue('--plugin-policy', 'block'); PLUGIN_POLICY_SWITCH_BLOCK : commandLine.AppendSwitchWithValue('--plugin-policy', 'block');
@ -2250,6 +2256,7 @@ begin
{$IFDEF FPC}Pointer({$ENDIF}cef_uriencode{$IFDEF FPC}){$ENDIF} := GetProcAddress(FLibHandle, 'cef_uriencode'); {$IFDEF FPC}Pointer({$ENDIF}cef_uriencode{$IFDEF FPC}){$ENDIF} := GetProcAddress(FLibHandle, 'cef_uriencode');
{$IFDEF FPC}Pointer({$ENDIF}cef_uridecode{$IFDEF FPC}){$ENDIF} := GetProcAddress(FLibHandle, 'cef_uridecode'); {$IFDEF FPC}Pointer({$ENDIF}cef_uridecode{$IFDEF FPC}){$ENDIF} := GetProcAddress(FLibHandle, 'cef_uridecode');
{$IFDEF FPC}Pointer({$ENDIF}cef_parse_json{$IFDEF FPC}){$ENDIF} := GetProcAddress(FLibHandle, 'cef_parse_json'); {$IFDEF FPC}Pointer({$ENDIF}cef_parse_json{$IFDEF FPC}){$ENDIF} := GetProcAddress(FLibHandle, 'cef_parse_json');
{$IFDEF FPC}Pointer({$ENDIF}cef_parse_json_buffer{$IFDEF FPC}){$ENDIF} := GetProcAddress(FLibHandle, 'cef_parse_json_buffer');
{$IFDEF FPC}Pointer({$ENDIF}cef_parse_jsonand_return_error{$IFDEF FPC}){$ENDIF} := GetProcAddress(FLibHandle, 'cef_parse_jsonand_return_error'); {$IFDEF FPC}Pointer({$ENDIF}cef_parse_jsonand_return_error{$IFDEF FPC}){$ENDIF} := GetProcAddress(FLibHandle, 'cef_parse_jsonand_return_error');
{$IFDEF FPC}Pointer({$ENDIF}cef_write_json{$IFDEF FPC}){$ENDIF} := GetProcAddress(FLibHandle, 'cef_write_json'); {$IFDEF FPC}Pointer({$ENDIF}cef_write_json{$IFDEF FPC}){$ENDIF} := GetProcAddress(FLibHandle, 'cef_write_json');
@ -2263,6 +2270,7 @@ begin
assigned(cef_uriencode) and assigned(cef_uriencode) and
assigned(cef_uridecode) and assigned(cef_uridecode) and
assigned(cef_parse_json) and assigned(cef_parse_json) and
assigned(cef_parse_json_buffer) and
assigned(cef_parse_jsonand_return_error) and assigned(cef_parse_jsonand_return_error) and
assigned(cef_write_json); assigned(cef_write_json);
end; end;

View File

@ -109,6 +109,9 @@ type
procedure ShowDevTools(const windowInfo: PCefWindowInfo; const client: ICefClient; const settings: PCefBrowserSettings; inspectElementAt: PCefPoint); procedure ShowDevTools(const windowInfo: PCefWindowInfo; const client: ICefClient; const settings: PCefBrowserSettings; inspectElementAt: PCefPoint);
procedure CloseDevTools; procedure CloseDevTools;
function HasDevTools: Boolean; function HasDevTools: Boolean;
function SendDevToolsMessage(const message_: ustring): boolean;
function ExecuteDevToolsMethod(message_id: integer; const method: ustring; const params: ICefDictionaryValue): Integer;
function AddDevToolsMessageObserver(const observer: ICefDevToolsMessageObserver): ICefRegistration;
procedure GetNavigationEntries(const visitor: ICefNavigationEntryVisitor; currentOnly: Boolean); procedure GetNavigationEntries(const visitor: ICefNavigationEntryVisitor; currentOnly: Boolean);
procedure GetNavigationEntriesProc(const proc: TCefNavigationEntryVisitorProc; currentOnly: Boolean); procedure GetNavigationEntriesProc(const proc: TCefNavigationEntryVisitorProc; currentOnly: Boolean);
procedure SetMouseCursorChangeDisabled(disabled: Boolean); procedure SetMouseCursorChangeDisabled(disabled: Boolean);
@ -158,7 +161,7 @@ implementation
uses uses
uCEFMiscFunctions, uCEFLibFunctions, uCEFDownloadImageCallBack, uCEFFrame, uCEFPDFPrintCallback, uCEFMiscFunctions, uCEFLibFunctions, uCEFDownloadImageCallBack, uCEFFrame, uCEFPDFPrintCallback,
uCEFRunFileDialogCallback, uCEFRequestContext, uCEFNavigationEntryVisitor, uCEFNavigationEntry, uCEFRunFileDialogCallback, uCEFRequestContext, uCEFNavigationEntryVisitor, uCEFNavigationEntry,
uCEFExtension, uCEFStringList; uCEFExtension, uCEFStringList, uCEFRegistration;
// TCefBrowserRef // TCefBrowserRef
@ -659,6 +662,35 @@ begin
Result := PCefBrowserHost(FData)^.has_dev_tools(PCefBrowserHost(FData)) <> 0; Result := PCefBrowserHost(FData)^.has_dev_tools(PCefBrowserHost(FData)) <> 0;
end; end;
function TCefBrowserHostRef.SendDevToolsMessage(const message_: ustring): boolean;
var
TempMsg : TCefStringUtf8;
TempLen : integer;
begin
TempMsg.str := nil;
TempMsg.length := 0;
TempMsg.dtor := nil;
TempLen := length(message_);
Result := (TempLen > 0) and
(cef_string_wide_to_utf8(PWideChar(@message_[1]), TempLen, @TempMsg) <> 0) and
(PCefBrowserHost(FData)^.send_dev_tools_message(PCefBrowserHost(FData), TempMsg.str, TempMsg.length) <> 0);
end;
function TCefBrowserHostRef.ExecuteDevToolsMethod(message_id: integer; const method: ustring; const params: ICefDictionaryValue): Integer;
var
TempMethod : TCefString;
begin
TempMethod := CefString(method);
Result := PCefBrowserHost(FData)^.execute_dev_tools_method(PCefBrowserHost(FData), message_id, @TempMethod, CefGetData(params));
end;
function TCefBrowserHostRef.AddDevToolsMessageObserver(const observer: ICefDevToolsMessageObserver): ICefRegistration;
begin
Result := TCefRegistrationRef.UnWrap(PCefBrowserHost(FData)^.add_dev_tools_message_observer(PCefBrowserHost(FData),
CefGetData(observer)));
end;
function TCefBrowserHostRef.HasView: Boolean; function TCefBrowserHostRef.HasView: Boolean;
begin begin
Result := PCefBrowserHost(FData)^.has_view(PCefBrowserHost(FData)) <> 0; Result := PCefBrowserHost(FData)^.has_view(PCefBrowserHost(FData)) <> 0;

File diff suppressed because it is too large Load Diff

View File

@ -110,15 +110,16 @@ type
// ICefRequestHandler // ICefRequestHandler
TOnBeforeBrowse = procedure(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; user_gesture, isRedirect: Boolean; out Result: Boolean) of object; TOnBeforeBrowse = procedure(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; user_gesture, isRedirect: Boolean; out Result: Boolean) of object;
TOnOpenUrlFromTab = procedure(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const targetUrl: ustring; targetDisposition: TCefWindowOpenDisposition; userGesture: Boolean; out Result: Boolean) of Object; TOnOpenUrlFromTab = procedure(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const targetUrl: ustring; targetDisposition: TCefWindowOpenDisposition; userGesture: Boolean; out Result: Boolean) of object;
TOnGetAuthCredentials = procedure(Sender: TObject; const browser: ICefBrowser; const originUrl: ustring; isProxy: Boolean; const host: ustring; port: Integer; const realm, scheme: ustring; const callback: ICefAuthCallback; out Result: Boolean) of object; TOnGetAuthCredentials = procedure(Sender: TObject; const browser: ICefBrowser; const originUrl: ustring; isProxy: Boolean; const host: ustring; port: Integer; const realm, scheme: ustring; const callback: ICefAuthCallback; out Result: Boolean) of object;
TOnQuotaRequest = procedure(Sender: TObject; const browser: ICefBrowser; const originUrl: ustring; newSize: Int64; const callback: ICefRequestCallback; out Result: Boolean) of object; TOnQuotaRequest = procedure(Sender: TObject; const browser: ICefBrowser; const originUrl: ustring; newSize: Int64; const callback: ICefRequestCallback; out Result: Boolean) of object;
TOnCertificateError = procedure(Sender: TObject; const browser: ICefBrowser; certError: TCefErrorcode; const requestUrl: ustring; const sslInfo: ICefSslInfo; const callback: ICefRequestCallback; out Result: Boolean) of Object; TOnCertificateError = procedure(Sender: TObject; const browser: ICefBrowser; certError: TCefErrorcode; const requestUrl: ustring; const sslInfo: ICefSslInfo; const callback: ICefRequestCallback; out Result: Boolean) of object;
TOnSelectClientCertificate = procedure(Sender: TObject; const browser: ICefBrowser; isProxy: boolean; const host: ustring; port: integer; certificatesCount: NativeUInt; const certificates: TCefX509CertificateArray; const callback: ICefSelectClientCertificateCallback; var aResult : boolean) of object; TOnSelectClientCertificate = procedure(Sender: TObject; const browser: ICefBrowser; isProxy: boolean; const host: ustring; port: integer; certificatesCount: NativeUInt; const certificates: TCefX509CertificateArray; const callback: ICefSelectClientCertificateCallback; var aResult : boolean) of object;
TOnPluginCrashed = procedure(Sender: TObject; const browser: ICefBrowser; const pluginPath: ustring) of object; TOnPluginCrashed = procedure(Sender: TObject; const browser: ICefBrowser; const pluginPath: ustring) of object;
TOnRenderViewReady = procedure(Sender: Tobject; const browser: ICefBrowser) of Object; TOnRenderViewReady = procedure(Sender: Tobject; const browser: ICefBrowser) of object;
TOnRenderProcessTerminated = procedure(Sender: TObject; const browser: ICefBrowser; status: TCefTerminationStatus) of object; TOnRenderProcessTerminated = procedure(Sender: TObject; const browser: ICefBrowser; status: TCefTerminationStatus) of object;
TOnGetResourceRequestHandler = procedure(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; is_navigation, is_download: boolean; const request_initiator: ustring; var disable_default_handling: boolean; var aExternalResourceRequestHandler : ICefResourceRequestHandler) of object; TOnGetResourceRequestHandler = procedure(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; is_navigation, is_download: boolean; const request_initiator: ustring; var disable_default_handling: boolean; var aExternalResourceRequestHandler : ICefResourceRequestHandler) of object;
TOnDocumentAvailableInMainFrame = procedure(Sender: Tobject; const browser: ICefBrowser) of object;
// ICefResourceRequestHandler // ICefResourceRequestHandler
TOnBeforeResourceLoad = procedure(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; const callback: ICefRequestCallback; out Result: TCefReturnValue) of object; TOnBeforeResourceLoad = procedure(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; const callback: ICefRequestCallback; out Result: TCefReturnValue) of object;
@ -179,6 +180,13 @@ type
TOnAudioStreamStoppedEvent = procedure(Sender: TObject; const browser: ICefBrowser) of object; TOnAudioStreamStoppedEvent = procedure(Sender: TObject; const browser: ICefBrowser) of object;
TOnAudioStreamErrorEvent = procedure(Sender: TObject; const browser: ICefBrowser; const message_: ustring) of object; TOnAudioStreamErrorEvent = procedure(Sender: TObject; const browser: ICefBrowser; const message_: ustring) of object;
// ICefDevToolsMessageObserver
TOnDevToolsMessageEvent = procedure(Sender: TObject; const browser: ICefBrowser; const message_: ICefValue; var aHandled: boolean) of object;
TOnDevToolsMethodResultEvent = procedure(Sender: TObject; const browser: ICefBrowser; message_id: integer; success: boolean; const result: ICefValue) of object;
TOnDevToolsEventEvent = procedure(Sender: TObject; const method: ustring; const params: ICefValue) of object;
TOnDevToolsAgentAttachedEvent = procedure(Sender: TObject; const browser: ICefBrowser) of object;
TOnDevToolsAgentDetachedEvent = procedure(Sender: TObject; const browser: ICefBrowser) of object;
// Custom // Custom
TOnTextResultAvailableEvent = procedure(Sender: TObject; const aText : ustring) of object; TOnTextResultAvailableEvent = procedure(Sender: TObject; const aText : ustring) of object;
TOnPdfPrintFinishedEvent = procedure(Sender: TObject; aResultOK : boolean) of object; TOnPdfPrintFinishedEvent = procedure(Sender: TObject; aResultOK : boolean) of object;

View File

@ -0,0 +1,313 @@
// ************************************************************************
// ***************************** CEF4Delphi *******************************
// ************************************************************************
//
// CEF4Delphi is based on DCEF3 which uses CEF to embed a chromium-based
// browser in Delphi applications.
//
// The original license of DCEF3 still applies to CEF4Delphi.
//
// For more information about CEF4Delphi visit :
// https://www.briskbard.com/index.php?lang=en&pageid=cef
//
// Copyright � 2020 Salvador Diaz Fau. All rights reserved.
//
// ************************************************************************
// ************ vvvv Original license and comments below vvvv *************
// ************************************************************************
(*
* Delphi Chromium Embedded 3
*
* Usage allowed under the restrictions of the Lesser GNU General Public License
* or alternatively the restrictions of the Mozilla Public License 1.1
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
* the specific language governing rights and limitations under the License.
*
* Unit owner : Henri Gourvest <hgourvest@gmail.com>
* Web site : http://www.progdigy.com
* Repository : http://code.google.com/p/delphichromiumembedded/
* Group : http://groups.google.com/group/delphichromiumembedded
*
* Embarcadero Technologies, Inc is not permitted to use or redistribute
* this source code without explicit permission.
*
*)
unit uCEFDevToolsMessageObserver;
{$IFDEF FPC}
{$MODE OBJFPC}{$H+}
{$ENDIF}
{$IFNDEF CPUX64}{$ALIGN ON}{$ENDIF}
{$MINENUMSIZE 4}
{$I cef.inc}
interface
uses
uCEFBaseRefCounted, uCEFInterfaces, uCEFTypes;
type
TCEFDevToolsMessageObserverOwn = class(TCefBaseRefCountedOwn, ICefDevToolsMessageObserver)
protected
procedure OnDevToolsMessage(const browser: ICefBrowser; const message_: ICefValue; var aHandled: boolean); virtual;
procedure OnDevToolsMethodResult(const browser: ICefBrowser; message_id: integer; success: boolean; const result: ICefValue); virtual;
procedure OnDevToolsEvent(const method: ustring; const params: ICefValue); virtual;
procedure OnDevToolsAgentAttached(const browser: ICefBrowser); virtual;
procedure OnDevToolsAgentDetached(const browser: ICefBrowser); virtual;
public
constructor Create; virtual;
end;
TCustomDevToolsMessageObserver = class(TCEFDevToolsMessageObserverOwn)
protected
FEvents : Pointer;
procedure OnDevToolsMessage(const browser: ICefBrowser; const message_: ICefValue; var aHandled: boolean); override;
procedure OnDevToolsMethodResult(const browser: ICefBrowser; message_id: integer; success: boolean; const result: ICefValue); override;
procedure OnDevToolsEvent(const method: ustring; const params: ICefValue); override;
procedure OnDevToolsAgentAttached(const browser: ICefBrowser); override;
procedure OnDevToolsAgentDetached(const browser: ICefBrowser); override;
public
constructor Create(const events: IChromiumEvents); reintroduce;
destructor Destroy; override;
end;
implementation
uses
{$IFDEF DELPHI16_UP}
System.SysUtils,
{$ELSE}
SysUtils,
{$ENDIF}
uCEFMiscFunctions, uCEFLibFunctions, uCEFBrowser;
// ************************************************************
// ************** TCEFDevToolsMessageObserverOwn **************
// ************************************************************
function cef_on_dev_tools_message( self : PCefDevToolsMessageObserver;
browser : PCefBrowser;
const message_ : Pointer;
message_size : NativeUInt): Integer; stdcall;
var
TempObject : TObject;
TempHandled : boolean;
TempValue : ICefValue;
begin
TempObject := CefGetObject(self);
TempHandled := False;
if (TempObject <> nil) and (TempObject is TCEFDevToolsMessageObserverOwn) then
try
TempValue := CefParseJson(message_, message_size);
TCEFDevToolsMessageObserverOwn(TempObject).OnDevToolsMessage(TCefBrowserRef.UnWrap(browser),
TempValue,
TempHandled);
finally
TempValue := nil;
end;
Result := ord(TempHandled);
end;
procedure cef_on_dev_tools_method_result( self : PCefDevToolsMessageObserver;
browser : PCefBrowser;
message_id : Integer;
success : Integer;
const result : Pointer;
result_size : NativeUInt); stdcall;
var
TempObject : TObject;
TempValue : ICefValue;
begin
TempObject := CefGetObject(self);
if (TempObject <> nil) and (TempObject is TCEFDevToolsMessageObserverOwn) then
try
TempValue := CefParseJson(result, result_size);
TCEFDevToolsMessageObserverOwn(TempObject).OnDevToolsMethodResult(TCefBrowserRef.UnWrap(browser),
message_id,
success <> 0,
TempValue);
finally
TempValue := nil;
end;
end;
procedure cef_on_dev_tools_event( self : PCefDevToolsMessageObserver;
const method : PCefString;
const params : Pointer;
params_size : NativeUInt); stdcall;
var
TempObject : TObject;
TempValue : ICefValue;
begin
TempObject := CefGetObject(self);
if (TempObject <> nil) and (TempObject is TCEFDevToolsMessageObserverOwn) then
try
TempValue := CefParseJson(params, params_size);
TCEFDevToolsMessageObserverOwn(TempObject).OnDevToolsEvent(CefString(method),
TempValue);
finally
TempValue := nil;
end;
end;
procedure cef_on_dev_tools_agent_attached(self : PCefDevToolsMessageObserver;
browser : PCefBrowser); stdcall;
var
TempObject : TObject;
begin
TempObject := CefGetObject(self);
if (TempObject <> nil) and (TempObject is TCEFDevToolsMessageObserverOwn) then
TCEFDevToolsMessageObserverOwn(TempObject).OnDevToolsAgentAttached(TCefBrowserRef.UnWrap(browser));
end;
procedure cef_on_dev_tools_agent_detached(self : PCefDevToolsMessageObserver;
browser : PCefBrowser); stdcall;
var
TempObject : TObject;
begin
TempObject := CefGetObject(self);
if (TempObject <> nil) and (TempObject is TCEFDevToolsMessageObserverOwn) then
TCEFDevToolsMessageObserverOwn(TempObject).OnDevToolsAgentDetached(TCefBrowserRef.UnWrap(browser));
end;
constructor TCEFDevToolsMessageObserverOwn.Create;
begin
inherited CreateData(SizeOf(TCefDevToolsMessageObserver));
with PCefDevToolsMessageObserver(FData)^ do
begin
on_dev_tools_message := {$IFDEF FPC}@{$ENDIF}cef_on_dev_tools_message;
on_dev_tools_method_result := {$IFDEF FPC}@{$ENDIF}cef_on_dev_tools_method_result;
on_dev_tools_event := {$IFDEF FPC}@{$ENDIF}cef_on_dev_tools_event;
on_dev_tools_agent_attached := {$IFDEF FPC}@{$ENDIF}cef_on_dev_tools_agent_attached;
on_dev_tools_agent_detached := {$IFDEF FPC}@{$ENDIF}cef_on_dev_tools_agent_detached;
end;
end;
procedure TCEFDevToolsMessageObserverOwn.OnDevToolsMessage(const browser : ICefBrowser;
const message_ : ICefValue;
var aHandled : boolean);
begin
//
end;
procedure TCEFDevToolsMessageObserverOwn.OnDevToolsMethodResult(const browser : ICefBrowser;
message_id : integer;
success : boolean;
const result : ICefValue);
begin
//
end;
procedure TCEFDevToolsMessageObserverOwn.OnDevToolsEvent(const method : ustring;
const params : ICefValue);
begin
//
end;
procedure TCEFDevToolsMessageObserverOwn.OnDevToolsAgentAttached(const browser: ICefBrowser);
begin
//
end;
procedure TCEFDevToolsMessageObserverOwn.OnDevToolsAgentDetached(const browser: ICefBrowser);
begin
//
end;
// ************************************************************
// ************** TCustomDevToolsMessageObserver **************
// ************************************************************
constructor TCustomDevToolsMessageObserver.Create(const events: IChromiumEvents);
begin
inherited Create;
FEvents := Pointer(events);
end;
destructor TCustomDevToolsMessageObserver.Destroy;
begin
FEvents := nil;
inherited Destroy;
end;
procedure TCustomDevToolsMessageObserver.OnDevToolsMessage(const browser : ICefBrowser;
const message_ : ICefValue;
var aHandled : boolean);
begin
try
if (FEvents <> nil) then
IChromiumEvents(FEvents).doOnDevToolsMessage(browser, message_, aHandled);
except
on e : exception do
if CustomExceptionHandler('TCustomDevToolsMessageObserver.OnDevToolsMessage', e) then raise;
end;
end;
procedure TCustomDevToolsMessageObserver.OnDevToolsMethodResult(const browser : ICefBrowser;
message_id : integer;
success : boolean;
const result : ICefValue);
begin
try
if (FEvents <> nil) then
IChromiumEvents(FEvents).doOnDevToolsMethodResult(browser, message_id, success, result);
except
on e : exception do
if CustomExceptionHandler('TCustomDevToolsMessageObserver.OnDevToolsMethodResult', e) then raise;
end;
end;
procedure TCustomDevToolsMessageObserver.OnDevToolsEvent(const method : ustring;
const params : ICefValue);
begin
try
if (FEvents <> nil) then
IChromiumEvents(FEvents).doOnDevToolsEvent(method, params);
except
on e : exception do
if CustomExceptionHandler('TCustomDevToolsMessageObserver.OnDevToolsEvent', e) then raise;
end;
end;
procedure TCustomDevToolsMessageObserver.OnDevToolsAgentAttached(const browser: ICefBrowser);
begin
try
if (FEvents <> nil) then
IChromiumEvents(FEvents).doOnDevToolsAgentAttached(browser);
except
on e : exception do
if CustomExceptionHandler('TCustomDevToolsMessageObserver.OnDevToolsAgentAttached', e) then raise;
end;
end;
procedure TCustomDevToolsMessageObserver.OnDevToolsAgentDetached(const browser: ICefBrowser);
begin
try
if (FEvents <> nil) then
IChromiumEvents(FEvents).doOnDevToolsAgentDetached(browser);
except
on e : exception do
if CustomExceptionHandler('TCustomDevToolsMessageObserver.OnDevToolsAgentDetached', e) then raise;
end;
end;
end.

View File

@ -151,6 +151,8 @@ type
ICefMediaSink = interface; ICefMediaSink = interface;
ICefMediaSource = interface; ICefMediaSource = interface;
ICefAudioHandler = interface; ICefAudioHandler = interface;
ICefDevToolsMessageObserver = interface;
ICefValue = interface;
TCefv8ValueArray = array of ICefv8Value; TCefv8ValueArray = array of ICefv8Value;
TCefX509CertificateArray = array of ICefX509Certificate; TCefX509CertificateArray = array of ICefX509Certificate;
@ -369,6 +371,7 @@ type
procedure doOnPluginCrashed(const browser: ICefBrowser; const pluginPath: ustring); procedure doOnPluginCrashed(const browser: ICefBrowser; const pluginPath: ustring);
procedure doOnRenderViewReady(const browser: ICefBrowser); procedure doOnRenderViewReady(const browser: ICefBrowser);
procedure doOnRenderProcessTerminated(const browser: ICefBrowser; status: TCefTerminationStatus); procedure doOnRenderProcessTerminated(const browser: ICefBrowser; status: TCefTerminationStatus);
procedure doOnDocumentAvailableInMainFrame(const browser: ICefBrowser);
// ICefResourceRequestHandler // ICefResourceRequestHandler
function doOnBeforeResourceLoad(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; const callback: ICefRequestCallback): TCefReturnValue; function doOnBeforeResourceLoad(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; const callback: ICefRequestCallback): TCefReturnValue;
@ -429,6 +432,13 @@ type
procedure doOnAudioStreamStopped(const browser: ICefBrowser); procedure doOnAudioStreamStopped(const browser: ICefBrowser);
procedure doOnAudioStreamError(const browser: ICefBrowser; const message_: ustring); procedure doOnAudioStreamError(const browser: ICefBrowser; const message_: ustring);
// ICefDevToolsMessageObserver
procedure doOnDevToolsMessage(const browser: ICefBrowser; const message_: ICefValue; var aHandled: boolean);
procedure doOnDevToolsMethodResult(const browser: ICefBrowser; message_id: integer; success: boolean; const result: ICefValue);
procedure doOnDevToolsEvent(const method: ustring; const params: ICefValue);
procedure doOnDevToolsAgentAttached(const browser: ICefBrowser);
procedure doOnDevToolsAgentDetached(const browser: ICefBrowser);
// Custom // Custom
procedure doCookiesDeleted(numDeleted : integer); procedure doCookiesDeleted(numDeleted : integer);
procedure doPdfPrintFinished(aResultOK : boolean); procedure doPdfPrintFinished(aResultOK : boolean);
@ -571,6 +581,9 @@ type
procedure ShowDevTools(const windowInfo: PCefWindowInfo; const client: ICefClient; const settings: PCefBrowserSettings; inspectElementAt: PCefPoint); procedure ShowDevTools(const windowInfo: PCefWindowInfo; const client: ICefClient; const settings: PCefBrowserSettings; inspectElementAt: PCefPoint);
procedure CloseDevTools; procedure CloseDevTools;
function HasDevTools: Boolean; function HasDevTools: Boolean;
function SendDevToolsMessage(const message_: ustring): boolean;
function ExecuteDevToolsMethod(message_id: integer; const method: ustring; const params: ICefDictionaryValue): Integer;
function AddDevToolsMessageObserver(const observer: ICefDevToolsMessageObserver): ICefRegistration;
procedure GetNavigationEntries(const visitor: ICefNavigationEntryVisitor; currentOnly: Boolean); procedure GetNavigationEntries(const visitor: ICefNavigationEntryVisitor; currentOnly: Boolean);
procedure GetNavigationEntriesProc(const proc: TCefNavigationEntryVisitorProc; currentOnly: Boolean); procedure GetNavigationEntriesProc(const proc: TCefNavigationEntryVisitorProc; currentOnly: Boolean);
procedure SetMouseCursorChangeDisabled(disabled: Boolean); procedure SetMouseCursorChangeDisabled(disabled: Boolean);
@ -1291,6 +1304,17 @@ type
['{9226018F-7A56-4F2E-AF01-43268E33EE6B}'] ['{9226018F-7A56-4F2E-AF01-43268E33EE6B}']
end; end;
// TCefDevToolsMessageObserver
// /include/capi/cef_devtools_message_observer_capi.h (cef_dev_tools_message_observer_t)
ICefDevToolsMessageObserver = interface(ICefBaseRefCounted)
['{76E5BB2B-7F69-4BC9-94C7-B55C61CE630F}']
procedure OnDevToolsMessage(const browser: ICefBrowser; const message_: ICefValue; var aHandled: boolean);
procedure OnDevToolsMethodResult(const browser: ICefBrowser; message_id: integer; success: boolean; const result: ICefValue);
procedure OnDevToolsEvent(const method: ustring; const params: ICefValue);
procedure OnDevToolsAgentAttached(const browser: ICefBrowser);
procedure OnDevToolsAgentDetached(const browser: ICefBrowser);
end;
// TCefMediaRouter // TCefMediaRouter
// /include/capi/cef_media_router_capi.h (cef_media_router_t) // /include/capi/cef_media_router_capi.h (cef_media_router_t)
ICefMediaRouter = interface(ICefBaseRefCounted) ICefMediaRouter = interface(ICefBaseRefCounted)
@ -1844,6 +1868,7 @@ type
procedure OnPluginCrashed(const browser: ICefBrowser; const pluginPath: ustring); procedure OnPluginCrashed(const browser: ICefBrowser; const pluginPath: ustring);
procedure OnRenderViewReady(const browser: ICefBrowser); procedure OnRenderViewReady(const browser: ICefBrowser);
procedure OnRenderProcessTerminated(const browser: ICefBrowser; status: TCefTerminationStatus); procedure OnRenderProcessTerminated(const browser: ICefBrowser; status: TCefTerminationStatus);
procedure OnDocumentAvailableInMainFrame(const browser: ICefBrowser);
procedure RemoveReferences; // custom procedure to clear all references procedure RemoveReferences; // custom procedure to clear all references
end; end;

View File

@ -120,6 +120,7 @@ var
cef_uriencode : function(const text: PCefString; use_plus: Integer): PCefStringUserFree; cdecl; cef_uriencode : function(const text: PCefString; use_plus: Integer): PCefStringUserFree; cdecl;
cef_uridecode : function(const text: PCefString; convert_to_utf8: Integer; unescape_rule: TCefUriUnescapeRule): PCefStringUserFree; cdecl; cef_uridecode : function(const text: PCefString; convert_to_utf8: Integer; unescape_rule: TCefUriUnescapeRule): PCefStringUserFree; cdecl;
cef_parse_json : function(const json_string: PCefString; options: TCefJsonParserOptions): PCefValue; cdecl; cef_parse_json : function(const json_string: PCefString; options: TCefJsonParserOptions): PCefValue; cdecl;
cef_parse_json_buffer : function(const json: Pointer; json_size: NativeUInt; options: TCefJsonParserOptions): PCefValue; cdecl;
cef_parse_jsonand_return_error : function(const json_string: PCefString; options: TCefJsonParserOptions; error_code_out: PCefJsonParserError; error_msg_out: PCefString): PCefValue; cdecl; cef_parse_jsonand_return_error : function(const json_string: PCefString; options: TCefJsonParserOptions; error_code_out: PCefJsonParserError; error_msg_out: PCefString): PCefValue; cdecl;
cef_write_json : function(node: PCefValue; options: TCefJsonWriterOptions): PCefStringUserFree; cdecl; cef_write_json : function(node: PCefValue; options: TCefJsonWriterOptions): PCefStringUserFree; cdecl;

View File

@ -245,7 +245,8 @@ function CefUriDecode(const text: ustring; convertToUtf8: Boolean; unescapeRule:
function CefGetPath(const aPathKey : TCefPathKey) : ustring; function CefGetPath(const aPathKey : TCefPathKey) : ustring;
function CefParseJson(const jsonString: ustring; options: TCefJsonParserOptions): ICefValue; function CefParseJson(const jsonString: ustring; options: TCefJsonParserOptions = JSON_PARSER_RFC): ICefValue; overload;
function CefParseJson(const json: Pointer; json_size: NativeUInt; options: TCefJsonParserOptions = JSON_PARSER_RFC): ICefValue; overload;
function CefParseJsonAndReturnError(const jsonString : ustring; function CefParseJsonAndReturnError(const jsonString : ustring;
options : TCefJsonParserOptions; options : TCefJsonParserOptions;
out errorCodeOut : TCefJsonParserError; out errorCodeOut : TCefJsonParserError;
@ -434,6 +435,7 @@ begin
cef_string_wide_to_utf16(PWideChar(str), Length(str), @Result); cef_string_wide_to_utf16(PWideChar(str), Length(str), @Result);
end; end;
procedure _free_string(str: PChar16); stdcall; procedure _free_string(str: PChar16); stdcall;
begin begin
if (str <> nil) then FreeMem(str); if (str <> nil) then FreeMem(str);
@ -1712,6 +1714,7 @@ begin
TempParts.origin := CefString(parts.origin); TempParts.origin := CefString(parts.origin);
TempParts.path := CefString(parts.path); TempParts.path := CefString(parts.path);
TempParts.query := CefString(parts.query); TempParts.query := CefString(parts.query);
TempParts.fragment := CefString(parts.fragment);
CefStringInitialize(@TempURL); CefStringInitialize(@TempURL);
@ -1815,6 +1818,14 @@ begin
Result := nil; Result := nil;
end; end;
function CefParseJson(const json: Pointer; json_size: NativeUInt; options: TCefJsonParserOptions): ICefValue;
begin
if (GlobalCEFApp <> nil) and GlobalCEFApp.LibLoaded and (json <> nil) and (json_size > 0) then
Result := TCefValueRef.UnWrap(cef_parse_json_buffer(json, json_size, options))
else
Result := nil;
end;
function CefParseJsonAndReturnError(const jsonString : ustring; function CefParseJsonAndReturnError(const jsonString : ustring;
options : TCefJsonParserOptions; options : TCefJsonParserOptions;
out errorCodeOut : TCefJsonParserError; out errorCodeOut : TCefJsonParserError;

View File

@ -64,6 +64,7 @@ type
procedure OnPluginCrashed(const browser: ICefBrowser; const pluginPath: ustring); virtual; procedure OnPluginCrashed(const browser: ICefBrowser; const pluginPath: ustring); virtual;
procedure OnRenderViewReady(const browser: ICefBrowser); virtual; procedure OnRenderViewReady(const browser: ICefBrowser); virtual;
procedure OnRenderProcessTerminated(const browser: ICefBrowser; status: TCefTerminationStatus); virtual; procedure OnRenderProcessTerminated(const browser: ICefBrowser; status: TCefTerminationStatus); virtual;
procedure OnDocumentAvailableInMainFrame(const browser: ICefBrowser); virtual;
procedure RemoveReferences; virtual; procedure RemoveReferences; virtual;
@ -85,6 +86,7 @@ type
procedure OnPluginCrashed(const browser: ICefBrowser; const pluginPath: ustring); override; procedure OnPluginCrashed(const browser: ICefBrowser; const pluginPath: ustring); override;
procedure OnRenderViewReady(const browser: ICefBrowser); override; procedure OnRenderViewReady(const browser: ICefBrowser); override;
procedure OnRenderProcessTerminated(const browser: ICefBrowser; status: TCefTerminationStatus); override; procedure OnRenderProcessTerminated(const browser: ICefBrowser; status: TCefTerminationStatus); override;
procedure OnDocumentAvailableInMainFrame(const browser: ICefBrowser); override;
public public
constructor Create(const events : IChromiumEvents); reintroduce; virtual; constructor Create(const events : IChromiumEvents); reintroduce; virtual;
@ -281,6 +283,17 @@ begin
status); status);
end; end;
procedure cef_request_handler_on_document_available_in_main_frame(self : PCefRequestHandler;
browser : PCefBrowser); stdcall;
var
TempObject : TObject;
begin
TempObject := CefGetObject(self);
if (TempObject <> nil) and (TempObject is TCefRequestHandlerOwn) then
TCefRequestHandlerOwn(TempObject).OnDocumentAvailableInMainFrame(TCefBrowserRef.UnWrap(browser));
end;
function cef_request_handler_on_select_client_certificate( self : PCefRequestHandler; function cef_request_handler_on_select_client_certificate( self : PCefRequestHandler;
browser : PCefBrowser; browser : PCefBrowser;
isProxy : integer; isProxy : integer;
@ -357,6 +370,7 @@ begin
on_plugin_crashed := {$IFDEF FPC}@{$ENDIF}cef_request_handler_on_plugin_crashed; on_plugin_crashed := {$IFDEF FPC}@{$ENDIF}cef_request_handler_on_plugin_crashed;
on_render_view_ready := {$IFDEF FPC}@{$ENDIF}cef_request_handler_on_render_view_ready; on_render_view_ready := {$IFDEF FPC}@{$ENDIF}cef_request_handler_on_render_view_ready;
on_render_process_terminated := {$IFDEF FPC}@{$ENDIF}cef_request_handler_on_render_process_terminated; on_render_process_terminated := {$IFDEF FPC}@{$ENDIF}cef_request_handler_on_render_process_terminated;
on_document_available_in_main_frame := {$IFDEF FPC}@{$ENDIF}cef_request_handler_on_document_available_in_main_frame;
end; end;
end; end;
@ -442,6 +456,11 @@ begin
// //
end; end;
procedure TCefRequestHandlerOwn.OnDocumentAvailableInMainFrame(const browser: ICefBrowser);
begin
//
end;
procedure TCefRequestHandlerOwn.OnRenderViewReady(const browser: ICefBrowser); procedure TCefRequestHandlerOwn.OnRenderViewReady(const browser: ICefBrowser);
begin begin
// //
@ -585,12 +604,20 @@ end;
procedure TCustomRequestHandler.OnRenderProcessTerminated(const browser: ICefBrowser; status: TCefTerminationStatus); procedure TCustomRequestHandler.OnRenderProcessTerminated(const browser: ICefBrowser; status: TCefTerminationStatus);
begin begin
if (FEvents <> nil) then IChromiumEvents(FEvents).doOnRenderProcessTerminated(browser, status); if (FEvents <> nil) then
IChromiumEvents(FEvents).doOnRenderProcessTerminated(browser, status);
end;
procedure TCustomRequestHandler.OnDocumentAvailableInMainFrame(const browser: ICefBrowser);
begin
if (FEvents <> nil) then
IChromiumEvents(FEvents).doOnDocumentAvailableInMainFrame(browser);
end; end;
procedure TCustomRequestHandler.OnRenderViewReady(const browser: ICefBrowser); procedure TCustomRequestHandler.OnRenderViewReady(const browser: ICefBrowser);
begin begin
if (FEvents <> nil) then IChromiumEvents(FEvents).doOnRenderViewReady(browser); if (FEvents <> nil) then
IChromiumEvents(FEvents).doOnRenderViewReady(browser);
end; end;
end. end.

View File

@ -238,6 +238,7 @@ type
PCefWindowDelegate = ^TCefWindowDelegate; PCefWindowDelegate = ^TCefWindowDelegate;
PCefBoxLayoutSettings = ^TCefBoxLayoutSettings; PCefBoxLayoutSettings = ^TCefBoxLayoutSettings;
PCefRegistration = ^TCefRegistration; PCefRegistration = ^TCefRegistration;
PCefDevToolsMessageObserver = ^TCefDevToolsMessageObserver;
PCefMediaRouter = ^TCefMediaRouter; PCefMediaRouter = ^TCefMediaRouter;
PCefMediaRoute = ^TCefMediaRoute; PCefMediaRoute = ^TCefMediaRoute;
PPCefMediaRoute = ^PCefMediaRoute; PPCefMediaRoute = ^PCefMediaRoute;
@ -1584,6 +1585,16 @@ type
base : TCefBaseRefCounted; base : TCefBaseRefCounted;
end; end;
// /include/capi/cef_devtools_message_observer_capi.h (cef_dev_tools_message_observer_t)
TCefDevToolsMessageObserver = record
base : TCefBaseRefCounted;
on_dev_tools_message : function(self: PCefDevToolsMessageObserver; browser: PCefBrowser; const message_: Pointer; message_size: NativeUInt): Integer; stdcall;
on_dev_tools_method_result : procedure(self: PCefDevToolsMessageObserver; browser: PCefBrowser; message_id, success: Integer; const result: Pointer; result_size: NativeUInt); stdcall;
on_dev_tools_event : procedure(self: PCefDevToolsMessageObserver; const method: PCefString; const params: Pointer; params_size: NativeUInt); stdcall;
on_dev_tools_agent_attached : procedure(self: PCefDevToolsMessageObserver; browser: PCefBrowser); stdcall;
on_dev_tools_agent_detached : procedure(self: PCefDevToolsMessageObserver; browser: PCefBrowser); stdcall;
end;
// /include/capi/cef_media_router_capi.h (cef_media_router_t) // /include/capi/cef_media_router_capi.h (cef_media_router_t)
TCefMediaRouter = record TCefMediaRouter = record
base : TCefBaseRefCounted; base : TCefBaseRefCounted;
@ -1950,6 +1961,7 @@ type
on_plugin_crashed : procedure(self: PCefRequestHandler; browser: PCefBrowser; const plugin_path: PCefString); stdcall; on_plugin_crashed : procedure(self: PCefRequestHandler; browser: PCefBrowser; const plugin_path: PCefString); stdcall;
on_render_view_ready : procedure(self: PCefRequestHandler; browser: PCefBrowser); stdcall; on_render_view_ready : procedure(self: PCefRequestHandler; browser: PCefBrowser); stdcall;
on_render_process_terminated : procedure(self: PCefRequestHandler; browser: PCefBrowser; status: TCefTerminationStatus); stdcall; on_render_process_terminated : procedure(self: PCefRequestHandler; browser: PCefBrowser; status: TCefTerminationStatus); stdcall;
on_document_available_in_main_frame : procedure(self: PCefRequestHandler; browser: PCefBrowser); stdcall;
end; end;
// /include/capi/cef_request_callback_capi.h (cef_request_callback_t) // /include/capi/cef_request_callback_capi.h (cef_request_callback_t)
@ -2856,6 +2868,9 @@ type
show_dev_tools : procedure(self: PCefBrowserHost; const windowInfo: PCefWindowInfo; client: PCefClient; const settings: PCefBrowserSettings; const inspect_element_at: PCefPoint); stdcall; show_dev_tools : procedure(self: PCefBrowserHost; const windowInfo: PCefWindowInfo; client: PCefClient; const settings: PCefBrowserSettings; const inspect_element_at: PCefPoint); stdcall;
close_dev_tools : procedure(self: PCefBrowserHost); stdcall; close_dev_tools : procedure(self: PCefBrowserHost); stdcall;
has_dev_tools : function(self: PCefBrowserHost): Integer; stdcall; has_dev_tools : function(self: PCefBrowserHost): Integer; stdcall;
send_dev_tools_message : function(self: PCefBrowserHost; const message_: Pointer; message_size: NativeUInt): Integer; stdcall;
execute_dev_tools_method : function(self: PCefBrowserHost; message_id: integer; const method: PCefString; params: PCefDictionaryValue): Integer; stdcall;
add_dev_tools_message_observer : function(self: PCefBrowserHost; observer: PCefDevToolsMessageObserver): PCefRegistration; stdcall;
get_navigation_entries : procedure(self: PCefBrowserHost; visitor: PCefNavigationEntryVisitor; current_only: Integer); stdcall; get_navigation_entries : procedure(self: PCefBrowserHost; visitor: PCefNavigationEntryVisitor; current_only: Integer); stdcall;
set_mouse_cursor_change_disabled : procedure(self: PCefBrowserHost; disabled: Integer); stdcall; set_mouse_cursor_change_disabled : procedure(self: PCefBrowserHost; disabled: Integer); stdcall;
is_mouse_cursor_change_disabled : function(self: PCefBrowserHost): Integer; stdcall; is_mouse_cursor_change_disabled : function(self: PCefBrowserHost): Integer; stdcall;

View File

@ -2,9 +2,9 @@
"UpdateLazPackages" : [ "UpdateLazPackages" : [
{ {
"ForceNotify" : true, "ForceNotify" : true,
"InternalVersion" : 146, "InternalVersion" : 147,
"Name" : "cef4delphi_lazarus.lpk", "Name" : "cef4delphi_lazarus.lpk",
"Version" : "83.3.12.0" "Version" : "83.4.0.0"
} }
], ],
"UpdatePackageData" : { "UpdatePackageData" : {