From 9f202b19c019f5ec6510e18d4b33f4283e8f706b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Salvador=20D=C3=ADaz=20Fau?= Date: Tue, 1 Oct 2019 18:47:24 +0200 Subject: [PATCH 01/13] Update to CEF 77.1.3 --- README.md | 6 +- .../FMXExternalPumpBrowser.dproj | 2 +- .../uFMXExternalPumpBrowser.pas | 1 - .../FMXToolBoxBrowser/FMXToolBoxBrowser.dproj | 2 +- .../FMXToolBoxBrowser/uMainForm.pas | 1 - .../SimpleFMXBrowser/SimpleFMXBrowser.dproj | 2 +- .../SimpleFMXBrowser/uSimpleFMXBrowser.pas | 1 - .../ConsoleBrowser/OSRDLLBrowser.dpr | 1 - .../ConsoleBrowser/OSRSubProcess.dpr | 1 - .../CookieVisitor/uCookieVisitor.pas | 1 - .../CustomResourceBrowser/uMainForm.dfm | 1 - .../CustomResourceBrowser/uMainForm.pas | 8 +-- demos/Delphi_VCL/DLLBrowser/DLLBrowser.dpr | 1 - demos/Delphi_VCL/DLLBrowser/SubProcess.dpr | 1 - demos/Delphi_VCL/DOMVisitor/uDOMVisitor.pas | 1 - .../EditorBrowser/uEditorBrowser.pas | 5 +- .../uExternalPumpBrowser.pas | 1 - .../FullScreenBrowser/uMainForm.pas | 1 - .../JavaScript/JSDialog/uJSDialogBrowser.pas | 3 +- .../Delphi_VCL/JavaScript/JSEval/uJSEval.pas | 1 - .../uJSExecutingFunctions.pas | 1 - .../JavaScript/JSExtension/uJSExtension.pas | 1 - .../uJSExtensionWithFunction.pas | 1 - .../uJSExtensionWithObjectParameter.pas | 1 - .../JSRTTIExtension/uJSRTTIExtension.pas | 1 - .../JSSimpleExtension/uJSSimpleExtension.pas | 1 - .../uJSSimpleWindowBinding.pas | 1 - .../JSWindowBindingSubProcess/SubProcess.dpr | 1 - .../uJSSimpleWindowBinding.pas | 1 - .../uJSWindowBindingWithArrayBuffer.pas | 1 - .../uJSWindowBindingWithFunction.pas | 1 - .../uJSWindowBindingWithObject.pas | 1 - .../KioskOSRBrowser/uKioskOSRBrowser.pas | 1 - demos/Delphi_VCL/MDIBrowser/uMainForm.pas | 1 - .../MDIExternalPumpBrowser/uMainForm.pas | 1 - demos/Delphi_VCL/MiniBrowser/uMiniBrowser.pas | 10 +-- .../uOSRExternalPumpBrowser.pas | 1 - demos/Delphi_VCL/PopupBrowser/uMainForm.pas | 1 - demos/Delphi_VCL/PopupBrowser2/uMainForm.pas | 1 - .../uPostInspectorBrowser.pas | 2 +- .../uResponseFilterBrowser.pas | 1 - .../uSchemeRegistrationBrowser.pas | 1 - .../SimpleBrowser/SimpleBrowser.dpr | 3 - .../SimpleBrowser2/SimpleBrowser2.dpr | 3 - .../uSimpleExternalPumpBrowser.pas | 1 - .../SimpleOSRBrowser/uSimpleOSRBrowser.pas | 1 - .../Delphi_VCL/SimpleServer/uSimpleServer.pas | 60 +++++++++++------- demos/Delphi_VCL/SubProcess/SubProcess.dpr | 1 - demos/Delphi_VCL/SubProcess/uCEFLoader.pas | 1 - demos/Delphi_VCL/TabbedBrowser/uMainForm.pas | 1 - demos/Delphi_VCL/ToolBoxBrowser/uMainForm.pas | 1 - demos/Delphi_VCL/URLRequest/uURLRequest.pas | 3 +- demos/Lazarus/CookieVisitor/CookieVisitor.lps | 9 ++- .../Lazarus/CookieVisitor/uCookieVisitor.lfm | 2 +- .../Lazarus/CookieVisitor/uCookieVisitor.pas | 3 +- .../CustomResourceBrowser/CRBrowser.lps | 2 +- .../CustomResourceBrowser/uMainForm.lfm | 2 +- .../CustomResourceBrowser/uMainForm.pas | 1 - demos/Lazarus/DOMVisitor/DOMVisitor.lps | 2 +- demos/Lazarus/DOMVisitor/uDOMVisitor.lfm | 2 +- demos/Lazarus/DOMVisitor/uDOMVisitor.pas | 1 - demos/Lazarus/EditorBrowser/EditorBrowser.lps | 2 +- .../Lazarus/EditorBrowser/uEditorBrowser.lfm | 2 +- .../Lazarus/EditorBrowser/uEditorBrowser.pas | 3 +- .../ExternalPumpBrowser.lps | 2 +- .../uExternalPumpBrowser.lfm | 2 +- .../uExternalPumpBrowser.pas | 1 - .../FullScreenBrowser/FullScreenBrowser.lps | 4 +- demos/Lazarus/FullScreenBrowser/uMainForm.lfm | 6 +- demos/Lazarus/FullScreenBrowser/uMainForm.pas | 5 +- .../JavaScript/JSDialog/JSDialogBrowser.lps | 2 +- .../JavaScript/JSDialog/uJSDialogBrowser.lfm | 2 +- .../JavaScript/JSDialog/uJSDialogBrowser.pas | 3 +- demos/Lazarus/JavaScript/JSEval/JSEval.lps | 2 +- demos/Lazarus/JavaScript/JSEval/uJSEval.lfm | 2 +- demos/Lazarus/JavaScript/JSEval/uJSEval.pas | 1 - .../uJSExecutingFunctions.lfm | 2 +- .../uJSExecutingFunctions.pas | 1 - .../JavaScript/JSExtension/JSExtension.lps | 2 +- .../JavaScript/JSExtension/uJSExtension.pas | 1 - .../JSExtensionWithFunction.lps | 2 +- .../uJSExtensionWithFunction.lfm | 2 +- .../uJSExtensionWithFunction.pas | 1 - .../JSExtensionWithObjectParameter.lps | 2 +- .../uJSExtensionWithObjectParameter.lfm | 2 +- .../uJSExtensionWithObjectParameter.pas | 1 - .../JSSimpleExtension/JSSimpleExtension.lps | 2 +- .../JSSimpleExtension/uJSSimpleExtension.lfm | 2 +- .../JSSimpleExtension/uJSSimpleExtension.pas | 1 - .../JSSimpleWindowBinding.lps | 2 +- .../uJSSimpleWindowBinding.lfm | 2 +- .../uJSSimpleWindowBinding.pas | 1 - .../JSSimpleWindowBinding.lpr | 1 - .../JSSimpleWindowBinding.lps | 4 +- .../JSWindowBindingSubProcess/SubProcess.lpr | 1 - .../JSWindowBindingSubProcess/SubProcess.lps | 4 +- .../JSWindowBindingWithArrayBuffer.lps | 4 +- .../uJSWindowBindingWithArrayBuffer.pas | 1 - .../JSWindowBindingWithFunction.lps | 2 +- .../uJSWindowBindingWithFunction.lfm | 2 +- .../uJSWindowBindingWithFunction.pas | 1 - .../JSWindowBindingWithObject.lps | 2 +- .../uJSWindowBindingWithObject.lfm | 2 +- .../uJSWindowBindingWithObject.pas | 1 - demos/Lazarus/MiniBrowser/MiniBrowser.lps | 2 +- demos/Lazarus/MiniBrowser/uMiniBrowser.pas | 4 +- .../OSRExternalPumpBrowser.lps | 4 +- .../uOSRExternalPumpBrowser.lfm | 2 +- .../uOSRExternalPumpBrowser.pas | 1 - demos/Lazarus/PopupBrowser/PopupBrowser.lps | 2 +- demos/Lazarus/PopupBrowser/uMainForm.lfm | 2 +- demos/Lazarus/PopupBrowser/uMainForm.pas | 1 - demos/Lazarus/PopupBrowser2/PopupBrowser2.lps | 2 +- demos/Lazarus/PopupBrowser2/uMainForm.lfm | 2 +- demos/Lazarus/PopupBrowser2/uMainForm.pas | 1 - .../PostInspectorBrowser.lps | 7 +-- .../uPostInspectorBrowser.pas | 5 +- .../SchemeRegistrationBrowser.lps | 2 +- .../uSchemeRegistrationBrowser.lfm | 2 +- .../uSchemeRegistrationBrowser.pas | 1 - demos/Lazarus/SimpleBrowser/SimpleBrowser.lps | 2 +- .../Lazarus/SimpleBrowser/uSimpleBrowser.pas | 1 - .../Lazarus/SimpleBrowser2/SimpleBrowser2.lps | 15 +++-- .../SimpleBrowser2/usimplelazarusbrowser.lfm | 2 +- .../SimpleBrowser2/usimplelazarusbrowser.pas | 5 +- .../SimpleExternalPumpBrowser.lps | 2 +- .../uSimpleExternalPumpBrowser.lfm | 2 +- .../uSimpleExternalPumpBrowser.pas | 1 - .../SimpleOSRBrowser/SimpleOSRBrowser.lps | 4 +- .../SimpleOSRBrowser/usimplelazosrbrowser.lfm | 2 +- .../SimpleOSRBrowser/usimplelazosrbrowser.pas | 1 - demos/Lazarus/SimpleServer/SimpleServer.lps | 8 +-- demos/Lazarus/SimpleServer/uSimpleServer.lfm | 2 +- demos/Lazarus/SimpleServer/uSimpleServer.pas | 60 +++++++++++------- demos/Lazarus/SubProcess/SimpleBrowser.lps | 4 +- demos/Lazarus/SubProcess/SubProcess.lpr | 1 - demos/Lazarus/SubProcess/SubProcess.lps | 2 +- demos/Lazarus/SubProcess/uCEFLoader.pas | 1 - demos/Lazarus/TabbedBrowser/TabBrowser.lps | 2 +- demos/Lazarus/TabbedBrowser/uMainForm.lfm | 2 +- demos/Lazarus/TabbedBrowser/uMainForm.pas | 1 - .../Lazarus/ToolBoxBrowser/ToolBoxBrowser.lps | 2 +- demos/Lazarus/ToolBoxBrowser/uChildForm.lfm | 6 +- demos/Lazarus/ToolBoxBrowser/uMainForm.lfm | 2 +- demos/Lazarus/ToolBoxBrowser/uMainForm.pas | 1 - demos/Lazarus/URLRequest/URLRequest.lps | 19 +++++- demos/Lazarus/URLRequest/uURLRequest.pas | 3 +- packages/CEF4Delphi.dpk | 1 - packages/CEF4Delphi.dproj | 7 ++- packages/CEF4Delphi_D7.dpk | 1 - packages/CEF4Delphi_FMX.dpk | 1 - packages/CEF4Delphi_FMX.dproj | 3 +- packages/cef4delphi_lazarus.lpk | 22 +++---- packages/cef4delphi_lazarus.pas | 6 +- source/uCEFApplication.pas | 18 +++--- source/uCEFChromium.pas | 63 +------------------ source/uCEFChromiumEvents.pas | 5 -- source/uCEFClient.pas | 45 +------------ source/uCEFFMXChromium.pas | 57 ----------------- source/uCEFInterfaces.pas | 19 ------ source/uCEFTypes.pas | 47 -------------- update_CEF4Delphi.json | 6 +- 162 files changed, 252 insertions(+), 504 deletions(-) diff --git a/README.md b/README.md index d4d11423..2a057ab5 100644 --- a/README.md +++ b/README.md @@ -3,10 +3,10 @@ CEF4Delphi is an open source project created by Salvador D 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 76.1.13 which includes Chromium 76.0.3809.132. +CEF4Delphi uses CEF 77.1.3 which includes Chromium 77.0.3865.90. The CEF binaries used by CEF4Delphi are available for download at spotify : -* [32 bits](http://opensource.spotify.com/cefbuilds/cef_binary_76.1.13%2Bgf19c584%2Bchromium-76.0.3809.132_windows32.tar.bz2) -* [64 bits](http://opensource.spotify.com/cefbuilds/cef_binary_76.1.13%2Bgf19c584%2Bchromium-76.0.3809.132_windows64.tar.bz2) +* [32 bits](http://opensource.spotify.com/cefbuilds/cef_binary_77.1.3%2Bgf0a1c44%2Bchromium-77.0.3865.90_windows32.tar.bz2) +* [64 bits](http://opensource.spotify.com/cefbuilds/cef_binary_77.1.3%2Bgf0a1c44%2Bchromium-77.0.3865.90_windows64.tar.bz2) CEF4Delphi was developed and tested on Delphi 10.3 Rio and it has been tested in Delphi 7, Delphi XE, Delphi 10, Delphi 10.2 and Lazarus 2.0.4/FPC 3.0.4. CEF4Delphi includes VCL, FireMonkey (FMX) and Lazarus components. diff --git a/demos/Delphi_FMX/FMXExternalPumpBrowser/FMXExternalPumpBrowser.dproj b/demos/Delphi_FMX/FMXExternalPumpBrowser/FMXExternalPumpBrowser.dproj index 71cbf61f..b0992db9 100644 --- a/demos/Delphi_FMX/FMXExternalPumpBrowser/FMXExternalPumpBrowser.dproj +++ b/demos/Delphi_FMX/FMXExternalPumpBrowser/FMXExternalPumpBrowser.dproj @@ -5,7 +5,7 @@ FMX FMXExternalPumpBrowser.dpr True - Release + Debug Win32 3 Application diff --git a/demos/Delphi_FMX/FMXExternalPumpBrowser/uFMXExternalPumpBrowser.pas b/demos/Delphi_FMX/FMXExternalPumpBrowser/uFMXExternalPumpBrowser.pas index f521f7cf..1320a6d1 100644 --- a/demos/Delphi_FMX/FMXExternalPumpBrowser/uFMXExternalPumpBrowser.pas +++ b/demos/Delphi_FMX/FMXExternalPumpBrowser/uFMXExternalPumpBrowser.pas @@ -199,7 +199,6 @@ begin GlobalCEFApp.ExternalMessagePump := True; GlobalCEFApp.MultiThreadedMessageLoop := False; GlobalCEFApp.OnScheduleMessagePumpWork := GlobalCEFApp_OnScheduleMessagePumpWork; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; end; procedure TFMXExternalPumpBrowserFrm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); diff --git a/demos/Delphi_FMX/FMXToolBoxBrowser/FMXToolBoxBrowser.dproj b/demos/Delphi_FMX/FMXToolBoxBrowser/FMXToolBoxBrowser.dproj index e49bc2cb..1d03e1d3 100644 --- a/demos/Delphi_FMX/FMXToolBoxBrowser/FMXToolBoxBrowser.dproj +++ b/demos/Delphi_FMX/FMXToolBoxBrowser/FMXToolBoxBrowser.dproj @@ -5,7 +5,7 @@ FMX FMXToolBoxBrowser.dpr True - Release + Debug Win32 3 Application diff --git a/demos/Delphi_FMX/FMXToolBoxBrowser/uMainForm.pas b/demos/Delphi_FMX/FMXToolBoxBrowser/uMainForm.pas index adf421ed..0c097f92 100644 --- a/demos/Delphi_FMX/FMXToolBoxBrowser/uMainForm.pas +++ b/demos/Delphi_FMX/FMXToolBoxBrowser/uMainForm.pas @@ -133,7 +133,6 @@ procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.OnContextInitialized := GlobalCEFApp_OnContextInitialized; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; end; function TMainForm.PostCustomMessage(aMessage, wParam : cardinal; lParam : integer) : boolean; diff --git a/demos/Delphi_FMX/SimpleFMXBrowser/SimpleFMXBrowser.dproj b/demos/Delphi_FMX/SimpleFMXBrowser/SimpleFMXBrowser.dproj index 6105bb67..621b1b99 100644 --- a/demos/Delphi_FMX/SimpleFMXBrowser/SimpleFMXBrowser.dproj +++ b/demos/Delphi_FMX/SimpleFMXBrowser/SimpleFMXBrowser.dproj @@ -5,7 +5,7 @@ FMX SimpleFMXBrowser.dpr True - Release + Debug Win32 3 Application diff --git a/demos/Delphi_FMX/SimpleFMXBrowser/uSimpleFMXBrowser.pas b/demos/Delphi_FMX/SimpleFMXBrowser/uSimpleFMXBrowser.pas index fac57018..f2ce8952 100644 --- a/demos/Delphi_FMX/SimpleFMXBrowser/uSimpleFMXBrowser.pas +++ b/demos/Delphi_FMX/SimpleFMXBrowser/uSimpleFMXBrowser.pas @@ -149,7 +149,6 @@ uses procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; //GlobalCEFApp.LogFile := 'cef.log'; //GlobalCEFApp.LogSeverity := LOGSEVERITY_VERBOSE; diff --git a/demos/Delphi_VCL/ConsoleBrowser/OSRDLLBrowser.dpr b/demos/Delphi_VCL/ConsoleBrowser/OSRDLLBrowser.dpr index ff773b6a..afa416bd 100644 --- a/demos/Delphi_VCL/ConsoleBrowser/OSRDLLBrowser.dpr +++ b/demos/Delphi_VCL/ConsoleBrowser/OSRDLLBrowser.dpr @@ -113,7 +113,6 @@ begin GlobalCEFApp.BrowserSubprocessPath := 'OSRSubProcess.exe'; GlobalCEFApp.ExternalMessagePump := False; GlobalCEFApp.MultiThreadedMessageLoop := False; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; // This demo uses a different EXE for the subprocesses. // With this configuration it's not necessary to have the diff --git a/demos/Delphi_VCL/ConsoleBrowser/OSRSubProcess.dpr b/demos/Delphi_VCL/ConsoleBrowser/OSRSubProcess.dpr index 646cdd77..b0e3a7f5 100644 --- a/demos/Delphi_VCL/ConsoleBrowser/OSRSubProcess.dpr +++ b/demos/Delphi_VCL/ConsoleBrowser/OSRSubProcess.dpr @@ -78,7 +78,6 @@ begin GlobalCEFApp.SetCurrentDir := True; GlobalCEFApp.ExternalMessagePump := False; GlobalCEFApp.MultiThreadedMessageLoop := False; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; GlobalCEFApp.StartSubProcess; GlobalCEFApp.Free; diff --git a/demos/Delphi_VCL/CookieVisitor/uCookieVisitor.pas b/demos/Delphi_VCL/CookieVisitor/uCookieVisitor.pas index a06a6da5..9b885b31 100644 --- a/demos/Delphi_VCL/CookieVisitor/uCookieVisitor.pas +++ b/demos/Delphi_VCL/CookieVisitor/uCookieVisitor.pas @@ -146,7 +146,6 @@ uses procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; //GlobalCEFApp.LogFile := 'cef.log'; //GlobalCEFApp.LogSeverity := LOGSEVERITY_VERBOSE; end; diff --git a/demos/Delphi_VCL/CustomResourceBrowser/uMainForm.dfm b/demos/Delphi_VCL/CustomResourceBrowser/uMainForm.dfm index a813dc11..76d85e3c 100644 --- a/demos/Delphi_VCL/CustomResourceBrowser/uMainForm.dfm +++ b/demos/Delphi_VCL/CustomResourceBrowser/uMainForm.dfm @@ -12,7 +12,6 @@ object MainForm: TMainForm Font.Style = [] OldCreateOrder = False Position = poScreenCenter - OnClose = FormClose OnCloseQuery = FormCloseQuery OnCreate = FormCreate OnShow = FormShow diff --git a/demos/Delphi_VCL/CustomResourceBrowser/uMainForm.pas b/demos/Delphi_VCL/CustomResourceBrowser/uMainForm.pas index 29dd19f2..cd143261 100644 --- a/demos/Delphi_VCL/CustomResourceBrowser/uMainForm.pas +++ b/demos/Delphi_VCL/CustomResourceBrowser/uMainForm.pas @@ -63,7 +63,6 @@ type procedure FormCreate(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); procedure FormShow(Sender: TObject); - procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure Button1Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); @@ -113,7 +112,6 @@ uses procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; //GlobalCEFApp.LogFile := 'cef.log'; //GlobalCEFApp.LogSeverity := LOGSEVERITY_VERBOSE; end; @@ -123,11 +121,6 @@ begin ChromiumWindow1.LoadURL(Edit1.Text); end; -procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction); -begin - FHandler := nil; -end; - procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin CanClose := FCanClose; @@ -136,6 +129,7 @@ begin begin FClosing := True; Visible := False; + FHandler := nil; ChromiumWindow1.CloseBrowser(True); end; end; diff --git a/demos/Delphi_VCL/DLLBrowser/DLLBrowser.dpr b/demos/Delphi_VCL/DLLBrowser/DLLBrowser.dpr index 8056ff91..fb1e1f93 100644 --- a/demos/Delphi_VCL/DLLBrowser/DLLBrowser.dpr +++ b/demos/Delphi_VCL/DLLBrowser/DLLBrowser.dpr @@ -100,7 +100,6 @@ begin GlobalCEFApp.UserDataPath := 'cef\User Data'; } - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; GlobalCEFApp.SetCurrentDir := True; GlobalCEFApp.BrowserSubprocessPath := 'SubProcess.exe'; diff --git a/demos/Delphi_VCL/DLLBrowser/SubProcess.dpr b/demos/Delphi_VCL/DLLBrowser/SubProcess.dpr index 81d20082..efac37b4 100644 --- a/demos/Delphi_VCL/DLLBrowser/SubProcess.dpr +++ b/demos/Delphi_VCL/DLLBrowser/SubProcess.dpr @@ -70,7 +70,6 @@ begin GlobalCEFApp.UserDataPath := 'cef\User Data'; } - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; GlobalCEFApp.SetCurrentDir := True; GlobalCEFApp.StartSubProcess; diff --git a/demos/Delphi_VCL/DOMVisitor/uDOMVisitor.pas b/demos/Delphi_VCL/DOMVisitor/uDOMVisitor.pas index edff340e..d83fae57 100644 --- a/demos/Delphi_VCL/DOMVisitor/uDOMVisitor.pas +++ b/demos/Delphi_VCL/DOMVisitor/uDOMVisitor.pas @@ -343,7 +343,6 @@ begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.RemoteDebuggingPort := 9000; GlobalCEFApp.OnProcessMessageReceived := GlobalCEFApp_OnProcessMessageReceived; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; // Enabling the debug log file for then DOM visitor demo. // This adds lots of warnings to the console, specially if you run this inside VirtualBox. diff --git a/demos/Delphi_VCL/EditorBrowser/uEditorBrowser.pas b/demos/Delphi_VCL/EditorBrowser/uEditorBrowser.pas index 9bf659f0..97955bd7 100644 --- a/demos/Delphi_VCL/EditorBrowser/uEditorBrowser.pas +++ b/demos/Delphi_VCL/EditorBrowser/uEditorBrowser.pas @@ -174,8 +174,9 @@ uses procedure CreateGlobalCEFApp; begin - GlobalCEFApp := TCefApplication.Create; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; + GlobalCEFApp := TCefApplication.Create; + //GlobalCEFApp.LogFile := 'cef.log'; + //GlobalCEFApp.LogSeverity := LOGSEVERITY_VERBOSE; end; procedure TForm1.FillColorBtnClick(Sender: TObject); diff --git a/demos/Delphi_VCL/ExternalPumpBrowser/uExternalPumpBrowser.pas b/demos/Delphi_VCL/ExternalPumpBrowser/uExternalPumpBrowser.pas index bb925234..dc7e219e 100644 --- a/demos/Delphi_VCL/ExternalPumpBrowser/uExternalPumpBrowser.pas +++ b/demos/Delphi_VCL/ExternalPumpBrowser/uExternalPumpBrowser.pas @@ -128,7 +128,6 @@ begin GlobalCEFApp.ExternalMessagePump := True; GlobalCEFApp.MultiThreadedMessageLoop := False; GlobalCEFApp.OnScheduleMessagePumpWork := GlobalCEFApp_OnScheduleMessagePumpWork; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; end; procedure TExternalPumpBrowserFrm.FormCreate(Sender: TObject); diff --git a/demos/Delphi_VCL/FullScreenBrowser/uMainForm.pas b/demos/Delphi_VCL/FullScreenBrowser/uMainForm.pas index e6637b1b..4691edd2 100644 --- a/demos/Delphi_VCL/FullScreenBrowser/uMainForm.pas +++ b/demos/Delphi_VCL/FullScreenBrowser/uMainForm.pas @@ -115,7 +115,6 @@ uses procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; //GlobalCEFApp.LogFile := 'cef.log'; //GlobalCEFApp.LogSeverity := LOGSEVERITY_VERBOSE; end; diff --git a/demos/Delphi_VCL/JavaScript/JSDialog/uJSDialogBrowser.pas b/demos/Delphi_VCL/JavaScript/JSDialog/uJSDialogBrowser.pas index a4646c56..ce262982 100644 --- a/demos/Delphi_VCL/JavaScript/JSDialog/uJSDialogBrowser.pas +++ b/demos/Delphi_VCL/JavaScript/JSDialog/uJSDialogBrowser.pas @@ -44,7 +44,7 @@ interface uses {$IFDEF DELPHI16_UP} Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, - Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, System.SyncObjs, + Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, System.SyncObjs, System.UITypes, {$ELSE} Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, SyncObjs, @@ -119,7 +119,6 @@ uses procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; //GlobalCEFApp.LogFile := 'cef.log'; //GlobalCEFApp.LogSeverity := LOGSEVERITY_VERBOSE; end; diff --git a/demos/Delphi_VCL/JavaScript/JSEval/uJSEval.pas b/demos/Delphi_VCL/JavaScript/JSEval/uJSEval.pas index ddecb764..ecade24c 100644 --- a/demos/Delphi_VCL/JavaScript/JSEval/uJSEval.pas +++ b/demos/Delphi_VCL/JavaScript/JSEval/uJSEval.pas @@ -524,7 +524,6 @@ procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.OnProcessMessageReceived := RenderProcessHandler_OnProcessMessageReceivedEvent; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; end; procedure TJSEvalFrm.Chromium1ProcessMessageReceived( Sender : TObject; diff --git a/demos/Delphi_VCL/JavaScript/JSExecutingFunctions/uJSExecutingFunctions.pas b/demos/Delphi_VCL/JavaScript/JSExecutingFunctions/uJSExecutingFunctions.pas index a203cdcd..44622364 100644 --- a/demos/Delphi_VCL/JavaScript/JSExecutingFunctions/uJSExecutingFunctions.pas +++ b/demos/Delphi_VCL/JavaScript/JSExecutingFunctions/uJSExecutingFunctions.pas @@ -174,7 +174,6 @@ begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.OnContextCreated := GlobalCEFApp_OnContextCreated; GlobalCEFApp.OnProcessMessageReceived := GlobalCEFApp_OnProcessMessageReceived; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; end; procedure TJSExecutingFunctionsFrm.GoBtnClick(Sender: TObject); diff --git a/demos/Delphi_VCL/JavaScript/JSExtension/uJSExtension.pas b/demos/Delphi_VCL/JavaScript/JSExtension/uJSExtension.pas index cf4746ee..f2a9f659 100644 --- a/demos/Delphi_VCL/JavaScript/JSExtension/uJSExtension.pas +++ b/demos/Delphi_VCL/JavaScript/JSExtension/uJSExtension.pas @@ -315,7 +315,6 @@ procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.OnWebKitInitialized := GlobalCEFApp_OnWebKitInitialized; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; {$IFDEF DEBUG} GlobalCEFApp.LogFile := 'debug.log'; GlobalCEFApp.LogSeverity := LOGSEVERITY_INFO; diff --git a/demos/Delphi_VCL/JavaScript/JSExtensionWithFunction/uJSExtensionWithFunction.pas b/demos/Delphi_VCL/JavaScript/JSExtensionWithFunction/uJSExtensionWithFunction.pas index b86b2cf5..3f823515 100644 --- a/demos/Delphi_VCL/JavaScript/JSExtensionWithFunction/uJSExtensionWithFunction.pas +++ b/demos/Delphi_VCL/JavaScript/JSExtensionWithFunction/uJSExtensionWithFunction.pas @@ -152,7 +152,6 @@ begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.OnWebKitInitialized := {$IFNDEF DELPHI12_UP}TJSSimpleExtensionFrm.{$ENDIF} GlobalCEFApp_OnWebKitInitializedEvent; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; end; procedure TJSExtensionWithFunctionFrm.GoBtnClick(Sender: TObject); diff --git a/demos/Delphi_VCL/JavaScript/JSExtensionWithObjectParameter/uJSExtensionWithObjectParameter.pas b/demos/Delphi_VCL/JavaScript/JSExtensionWithObjectParameter/uJSExtensionWithObjectParameter.pas index 7a90b831..c9bc17d5 100644 --- a/demos/Delphi_VCL/JavaScript/JSExtensionWithObjectParameter/uJSExtensionWithObjectParameter.pas +++ b/demos/Delphi_VCL/JavaScript/JSExtensionWithObjectParameter/uJSExtensionWithObjectParameter.pas @@ -155,7 +155,6 @@ begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.OnWebKitInitialized := {$IFNDEF DELPHI12_UP}TJSSimpleExtensionFrm.{$ENDIF} GlobalCEFApp_OnWebKitInitializedEvent; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; end; procedure TJSExtensionWithObjectParameterFrm.GoBtnClick(Sender: TObject); diff --git a/demos/Delphi_VCL/JavaScript/JSRTTIExtension/uJSRTTIExtension.pas b/demos/Delphi_VCL/JavaScript/JSRTTIExtension/uJSRTTIExtension.pas index 14aa51dc..a119e00c 100644 --- a/demos/Delphi_VCL/JavaScript/JSRTTIExtension/uJSRTTIExtension.pas +++ b/demos/Delphi_VCL/JavaScript/JSRTTIExtension/uJSRTTIExtension.pas @@ -173,7 +173,6 @@ procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.OnWebKitInitialized := GlobalCEFApp_OnWebKitInitialized; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; {$IFDEF DEBUG} GlobalCEFApp.LogFile := 'debug.log'; GlobalCEFApp.LogSeverity := LOGSEVERITY_INFO; diff --git a/demos/Delphi_VCL/JavaScript/JSSimpleExtension/uJSSimpleExtension.pas b/demos/Delphi_VCL/JavaScript/JSSimpleExtension/uJSSimpleExtension.pas index e20a1b6a..64fee3de 100644 --- a/demos/Delphi_VCL/JavaScript/JSSimpleExtension/uJSSimpleExtension.pas +++ b/demos/Delphi_VCL/JavaScript/JSSimpleExtension/uJSSimpleExtension.pas @@ -142,7 +142,6 @@ begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.OnWebKitInitialized := {$IFNDEF DELPHI12_UP}TJSSimpleExtensionFrm.{$ENDIF} GlobalCEFApp_OnWebKitInitializedEvent; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; end; procedure TJSSimpleExtensionFrm.GoBtnClick(Sender: TObject); diff --git a/demos/Delphi_VCL/JavaScript/JSSimpleWindowBinding/uJSSimpleWindowBinding.pas b/demos/Delphi_VCL/JavaScript/JSSimpleWindowBinding/uJSSimpleWindowBinding.pas index 5703a9e4..24cbb5f6 100644 --- a/demos/Delphi_VCL/JavaScript/JSSimpleWindowBinding/uJSSimpleWindowBinding.pas +++ b/demos/Delphi_VCL/JavaScript/JSSimpleWindowBinding/uJSSimpleWindowBinding.pas @@ -130,7 +130,6 @@ procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.OnContextCreated := GlobalCEFApp_OnContextCreated; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; end; procedure TJSSimpleWindowBindingFrm.GoBtnClick(Sender: TObject); diff --git a/demos/Delphi_VCL/JavaScript/JSWindowBindingSubProcess/SubProcess.dpr b/demos/Delphi_VCL/JavaScript/JSWindowBindingSubProcess/SubProcess.dpr index d017f94f..8bf3a8ca 100644 --- a/demos/Delphi_VCL/JavaScript/JSWindowBindingSubProcess/SubProcess.dpr +++ b/demos/Delphi_VCL/JavaScript/JSWindowBindingSubProcess/SubProcess.dpr @@ -68,7 +68,6 @@ end; begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.OnContextCreated := GlobalCEFApp_OnContextCreated; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; // The main process and the subprocess *MUST* have the same FrameworkDirPath, ResourcesDirPath, // LocalesDirPath, cache, cookies and UserDataPath paths diff --git a/demos/Delphi_VCL/JavaScript/JSWindowBindingSubProcess/uJSSimpleWindowBinding.pas b/demos/Delphi_VCL/JavaScript/JSWindowBindingSubProcess/uJSSimpleWindowBinding.pas index 7e640c22..fd64cd5d 100644 --- a/demos/Delphi_VCL/JavaScript/JSWindowBindingSubProcess/uJSSimpleWindowBinding.pas +++ b/demos/Delphi_VCL/JavaScript/JSWindowBindingSubProcess/uJSSimpleWindowBinding.pas @@ -129,7 +129,6 @@ begin // 4. Run this demo : JSSimpleWindowBinding GlobalCEFApp.BrowserSubprocessPath := 'SubProcess.exe'; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; //GlobalCEFApp.LogFile := 'cef.log'; //GlobalCEFApp.LogSeverity := LOGSEVERITY_VERBOSE; end; diff --git a/demos/Delphi_VCL/JavaScript/JSWindowBindingWithArrayBuffer/uJSWindowBindingWithArrayBuffer.pas b/demos/Delphi_VCL/JavaScript/JSWindowBindingWithArrayBuffer/uJSWindowBindingWithArrayBuffer.pas index 59170d0b..37e4fef7 100644 --- a/demos/Delphi_VCL/JavaScript/JSWindowBindingWithArrayBuffer/uJSWindowBindingWithArrayBuffer.pas +++ b/demos/Delphi_VCL/JavaScript/JSWindowBindingWithArrayBuffer/uJSWindowBindingWithArrayBuffer.pas @@ -155,7 +155,6 @@ procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.OnContextCreated := GlobalCEFApp_OnContextCreated; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; end; procedure TJSWindowBindingWithArrayBufferFrm.GoBtnClick(Sender: TObject); diff --git a/demos/Delphi_VCL/JavaScript/JSWindowBindingWithFunction/uJSWindowBindingWithFunction.pas b/demos/Delphi_VCL/JavaScript/JSWindowBindingWithFunction/uJSWindowBindingWithFunction.pas index b450bc0b..515e8d2b 100644 --- a/demos/Delphi_VCL/JavaScript/JSWindowBindingWithFunction/uJSWindowBindingWithFunction.pas +++ b/demos/Delphi_VCL/JavaScript/JSWindowBindingWithFunction/uJSWindowBindingWithFunction.pas @@ -135,7 +135,6 @@ procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.OnContextCreated := GlobalCEFApp_OnContextCreated; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; end; procedure TJSWindowBindingWithFunctionFrm.GoBtnClick(Sender: TObject); diff --git a/demos/Delphi_VCL/JavaScript/JSWindowBindingWithObject/uJSWindowBindingWithObject.pas b/demos/Delphi_VCL/JavaScript/JSWindowBindingWithObject/uJSWindowBindingWithObject.pas index edf39f49..fcbdf24c 100644 --- a/demos/Delphi_VCL/JavaScript/JSWindowBindingWithObject/uJSWindowBindingWithObject.pas +++ b/demos/Delphi_VCL/JavaScript/JSWindowBindingWithObject/uJSWindowBindingWithObject.pas @@ -136,7 +136,6 @@ procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.OnContextCreated := GlobalCEFApp_OnContextCreated; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; end; procedure TJSWindowBindingWithObjectFrm.GoBtnClick(Sender: TObject); diff --git a/demos/Delphi_VCL/KioskOSRBrowser/uKioskOSRBrowser.pas b/demos/Delphi_VCL/KioskOSRBrowser/uKioskOSRBrowser.pas index 950247c7..012b3916 100644 --- a/demos/Delphi_VCL/KioskOSRBrowser/uKioskOSRBrowser.pas +++ b/demos/Delphi_VCL/KioskOSRBrowser/uKioskOSRBrowser.pas @@ -174,7 +174,6 @@ begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.WindowlessRenderingEnabled := True; GlobalCEFApp.EnableHighDPISupport := True; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; end; procedure TForm1.AppEventsMessage(var Msg: tagMSG; var Handled: Boolean); diff --git a/demos/Delphi_VCL/MDIBrowser/uMainForm.pas b/demos/Delphi_VCL/MDIBrowser/uMainForm.pas index 2e187c95..f5432216 100644 --- a/demos/Delphi_VCL/MDIBrowser/uMainForm.pas +++ b/demos/Delphi_VCL/MDIBrowser/uMainForm.pas @@ -116,7 +116,6 @@ procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.OnContextInitialized := GlobalCEFApp_OnContextInitialized; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; end; procedure TMainForm.CreateMDIChild(const Name: string); diff --git a/demos/Delphi_VCL/MDIExternalPumpBrowser/uMainForm.pas b/demos/Delphi_VCL/MDIExternalPumpBrowser/uMainForm.pas index 0872e388..c5d0c1ba 100644 --- a/demos/Delphi_VCL/MDIExternalPumpBrowser/uMainForm.pas +++ b/demos/Delphi_VCL/MDIExternalPumpBrowser/uMainForm.pas @@ -129,7 +129,6 @@ begin GlobalCEFApp.MultiThreadedMessageLoop := False; GlobalCEFApp.OnScheduleMessagePumpWork := GlobalCEFApp_OnScheduleMessagePumpWork; GlobalCEFApp.OnContextInitialized := GlobalCEFApp_OnContextInitialized; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; end; procedure TMainForm.CreateMDIChild(const Name: string); diff --git a/demos/Delphi_VCL/MiniBrowser/uMiniBrowser.pas b/demos/Delphi_VCL/MiniBrowser/uMiniBrowser.pas index 06690c95..6fa03f25 100644 --- a/demos/Delphi_VCL/MiniBrowser/uMiniBrowser.pas +++ b/demos/Delphi_VCL/MiniBrowser/uMiniBrowser.pas @@ -290,11 +290,11 @@ uses procedure CreateGlobalCEFApp; begin - GlobalCEFApp := TCefApplication.Create; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; - GlobalCEFApp.LogFile := 'debug.log'; - GlobalCEFApp.LogSeverity := LOGSEVERITY_INFO; - GlobalCEFApp.cache := 'cache'; + GlobalCEFApp := TCefApplication.Create; + GlobalCEFApp.LogFile := 'debug.log'; + GlobalCEFApp.LogSeverity := LOGSEVERITY_INFO; + GlobalCEFApp.cache := 'cache'; + GlobalCEFApp.EnablePrintPreview := True; //GlobalCEFApp.RemoteDebuggingPort := 19999; end; diff --git a/demos/Delphi_VCL/OSRExternalPumpBrowser/uOSRExternalPumpBrowser.pas b/demos/Delphi_VCL/OSRExternalPumpBrowser/uOSRExternalPumpBrowser.pas index 269d59ec..ca2d5de5 100644 --- a/demos/Delphi_VCL/OSRExternalPumpBrowser/uOSRExternalPumpBrowser.pas +++ b/demos/Delphi_VCL/OSRExternalPumpBrowser/uOSRExternalPumpBrowser.pas @@ -187,7 +187,6 @@ begin GlobalCEFApp.EnableHighDPISupport := True; GlobalCEFApp.ExternalMessagePump := True; GlobalCEFApp.MultiThreadedMessageLoop := False; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; GlobalCEFApp.OnScheduleMessagePumpWork := GlobalCEFApp_OnScheduleMessagePumpWork; end; diff --git a/demos/Delphi_VCL/PopupBrowser/uMainForm.pas b/demos/Delphi_VCL/PopupBrowser/uMainForm.pas index e7c3622f..1fd4c3ac 100644 --- a/demos/Delphi_VCL/PopupBrowser/uMainForm.pas +++ b/demos/Delphi_VCL/PopupBrowser/uMainForm.pas @@ -149,7 +149,6 @@ begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.WindowlessRenderingEnabled := True; GlobalCEFApp.EnableHighDPISupport := True; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; //GlobalCEFApp.LogFile := 'debug.log'; //GlobalCEFApp.LogSeverity := LOGSEVERITY_INFO; end; diff --git a/demos/Delphi_VCL/PopupBrowser2/uMainForm.pas b/demos/Delphi_VCL/PopupBrowser2/uMainForm.pas index 56809fcc..750ff632 100644 --- a/demos/Delphi_VCL/PopupBrowser2/uMainForm.pas +++ b/demos/Delphi_VCL/PopupBrowser2/uMainForm.pas @@ -146,7 +146,6 @@ procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.EnableHighDPISupport := True; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; //GlobalCEFApp.LogFile := 'cef.log'; //GlobalCEFApp.LogSeverity := LOGSEVERITY_VERBOSE; end; diff --git a/demos/Delphi_VCL/PostInspectorBrowser/uPostInspectorBrowser.pas b/demos/Delphi_VCL/PostInspectorBrowser/uPostInspectorBrowser.pas index e0f0cdba..13227b86 100644 --- a/demos/Delphi_VCL/PostInspectorBrowser/uPostInspectorBrowser.pas +++ b/demos/Delphi_VCL/PostInspectorBrowser/uPostInspectorBrowser.pas @@ -146,7 +146,6 @@ uses procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; //GlobalCEFApp.LogFile := 'cef.log'; //GlobalCEFApp.LogSeverity := LOGSEVERITY_VERBOSE; end; @@ -256,6 +255,7 @@ var i : integer; begin TempArray := nil; + try try TempPostData := request.PostData; diff --git a/demos/Delphi_VCL/ResponseFilterBrowser/uResponseFilterBrowser.pas b/demos/Delphi_VCL/ResponseFilterBrowser/uResponseFilterBrowser.pas index 16acf37d..19df8d2d 100644 --- a/demos/Delphi_VCL/ResponseFilterBrowser/uResponseFilterBrowser.pas +++ b/demos/Delphi_VCL/ResponseFilterBrowser/uResponseFilterBrowser.pas @@ -192,7 +192,6 @@ uses procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; GlobalCEFApp.LogFile := 'cef.log'; GlobalCEFApp.LogSeverity := LOGSEVERITY_VERBOSE; end; diff --git a/demos/Delphi_VCL/SchemeRegistrationBrowser/uSchemeRegistrationBrowser.pas b/demos/Delphi_VCL/SchemeRegistrationBrowser/uSchemeRegistrationBrowser.pas index 5c51d6d6..aa900997 100644 --- a/demos/Delphi_VCL/SchemeRegistrationBrowser/uSchemeRegistrationBrowser.pas +++ b/demos/Delphi_VCL/SchemeRegistrationBrowser/uSchemeRegistrationBrowser.pas @@ -146,7 +146,6 @@ procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.OnRegCustomSchemes := GlobalCEFApp_OnRegCustomSchemes; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; // GlobalCEFApp.LogFile := 'debug.log'; // GlobalCEFApp.LogSeverity := LOGSEVERITY_VERBOSE; diff --git a/demos/Delphi_VCL/SimpleBrowser/SimpleBrowser.dpr b/demos/Delphi_VCL/SimpleBrowser/SimpleBrowser.dpr index c4324c93..35cb4d71 100644 --- a/demos/Delphi_VCL/SimpleBrowser/SimpleBrowser.dpr +++ b/demos/Delphi_VCL/SimpleBrowser/SimpleBrowser.dpr @@ -68,9 +68,6 @@ begin GlobalCEFApp.UserDataPath := 'cef\User Data'; } - // Disabling some features to improve stability - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; - // You *MUST* call GlobalCEFApp.StartMainProcess in a if..then clause // with the Application initialization inside the begin..end. // Read this https://www.briskbard.com/index.php?lang=en&pageid=cef diff --git a/demos/Delphi_VCL/SimpleBrowser2/SimpleBrowser2.dpr b/demos/Delphi_VCL/SimpleBrowser2/SimpleBrowser2.dpr index 9cdca1d7..31cc1502 100644 --- a/demos/Delphi_VCL/SimpleBrowser2/SimpleBrowser2.dpr +++ b/demos/Delphi_VCL/SimpleBrowser2/SimpleBrowser2.dpr @@ -70,9 +70,6 @@ begin GlobalCEFApp.UserDataPath := 'cef\User Data'; } - // Disabling some features to improve stability - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; - // You *MUST* call GlobalCEFApp.StartMainProcess in a if..then clause // with the Application initialization inside the begin..end. // Read this https://www.briskbard.com/index.php?lang=en&pageid=cef diff --git a/demos/Delphi_VCL/SimpleExternalPumpBrowser/uSimpleExternalPumpBrowser.pas b/demos/Delphi_VCL/SimpleExternalPumpBrowser/uSimpleExternalPumpBrowser.pas index 4697498c..194d296f 100644 --- a/demos/Delphi_VCL/SimpleExternalPumpBrowser/uSimpleExternalPumpBrowser.pas +++ b/demos/Delphi_VCL/SimpleExternalPumpBrowser/uSimpleExternalPumpBrowser.pas @@ -120,7 +120,6 @@ begin GlobalCEFApp.ExternalMessagePump := True; GlobalCEFApp.MultiThreadedMessageLoop := False; GlobalCEFApp.OnScheduleMessagePumpWork := GlobalCEFApp_OnScheduleMessagePumpWork; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; end; procedure TSimpleExternalPumpBrowserFrm.FormCreate(Sender: TObject); diff --git a/demos/Delphi_VCL/SimpleOSRBrowser/uSimpleOSRBrowser.pas b/demos/Delphi_VCL/SimpleOSRBrowser/uSimpleOSRBrowser.pas index 414eaf7b..60c52618 100644 --- a/demos/Delphi_VCL/SimpleOSRBrowser/uSimpleOSRBrowser.pas +++ b/demos/Delphi_VCL/SimpleOSRBrowser/uSimpleOSRBrowser.pas @@ -181,7 +181,6 @@ begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.WindowlessRenderingEnabled := True; GlobalCEFApp.EnableHighDPISupport := True; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; // If you need transparency leave the GlobalCEFApp.BackgroundColor property // with the default value or set the alpha channel to 0 diff --git a/demos/Delphi_VCL/SimpleServer/uSimpleServer.pas b/demos/Delphi_VCL/SimpleServer/uSimpleServer.pas index 9bc581b4..de8835eb 100644 --- a/demos/Delphi_VCL/SimpleServer/uSimpleServer.pas +++ b/demos/Delphi_VCL/SimpleServer/uSimpleServer.pas @@ -195,37 +195,55 @@ end; procedure TSimpleServerFrm.ShowPostDataInfo(const aPostData : ICefPostData); var - i, j : integer; + i : integer; TempLen : NativeUInt; - TempList : IInterfaceList; - TempElement : ICefPostDataElement; TempBytes : TBytes; + TempArray : TCefPostDataElementArray; begin - if (aPostData = nil) then exit; + TempArray := nil; - i := 0; - j := aPostData.GetCount; - - TempList := aPostData.GetElements(j); - - while (i < j) do - begin - TempElement := TempList.Items[i] as ICefPostDataElement; - - if (TempElement.GetBytesCount > 0) then + try + try + if (aPostData <> nil) and (aPostData.GetElementCount > 0) then begin - SetLength(TempBytes, TempElement.GetBytesCount); - TempLen := TempElement.GetBytes(TempElement.GetBytesCount, @TempBytes[0]); + aPostData.GetElements(aPostData.GetElementCount, TempArray); - if (TempLen > 0) then + i := 0; + while (i < length(TempArray)) do begin - ConnectionLogMem.Lines.Add('Post contents length : ' + inttostr(TempLen)); - ConnectionLogMem.Lines.Add('Post contents sample : ' + BufferToString(TempBytes)); + if (TempArray[i].GetBytesCount > 0) then + begin + SetLength(TempBytes, TempArray[i].GetBytesCount); + TempLen := TempArray[i].GetBytes(TempArray[i].GetBytesCount, @TempBytes[0]); + + if (TempLen > 0) then + begin + ConnectionLogMem.Lines.Add('Post contents length : ' + inttostr(TempLen)); + ConnectionLogMem.Lines.Add('Post contents sample : ' + BufferToString(TempBytes)); + end; + end; + + inc(i); + end; + + i := 0; + while (i < length(TempArray)) do + begin + TempArray[i] := nil; + inc(i); end; end; - - inc(i); + except + on e : exception do + if CustomExceptionHandler('TSimpleServerFrm.ShowPostDataInfo', e) then raise; end; + finally + if (TempArray <> nil) then + begin + Finalize(TempArray); + TempArray := nil; + end; + end; end; function TSimpleServerFrm.BufferToString(const aBuffer : TBytes) : string; diff --git a/demos/Delphi_VCL/SubProcess/SubProcess.dpr b/demos/Delphi_VCL/SubProcess/SubProcess.dpr index 531af3c2..8ea8dd85 100644 --- a/demos/Delphi_VCL/SubProcess/SubProcess.dpr +++ b/demos/Delphi_VCL/SubProcess/SubProcess.dpr @@ -53,7 +53,6 @@ uses begin GlobalCEFApp := TCefApplication.Create; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; // The main process and the subprocess *MUST* have the same GlobalCEFApp // properties and events, specially FrameworkDirPath, ResourcesDirPath, diff --git a/demos/Delphi_VCL/SubProcess/uCEFLoader.pas b/demos/Delphi_VCL/SubProcess/uCEFLoader.pas index 42998641..1e579091 100644 --- a/demos/Delphi_VCL/SubProcess/uCEFLoader.pas +++ b/demos/Delphi_VCL/SubProcess/uCEFLoader.pas @@ -65,7 +65,6 @@ begin GlobalCEFApp.UserDataPath := 'cef\User Data'; } - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; GlobalCEFApp.BrowserSubprocessPath := 'SubProcess.exe'; // This demo uses a different EXE for the subprocesses. diff --git a/demos/Delphi_VCL/TabbedBrowser/uMainForm.pas b/demos/Delphi_VCL/TabbedBrowser/uMainForm.pas index 857a3ab8..5ca90519 100644 --- a/demos/Delphi_VCL/TabbedBrowser/uMainForm.pas +++ b/demos/Delphi_VCL/TabbedBrowser/uMainForm.pas @@ -156,7 +156,6 @@ procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.OnContextInitialized := GlobalCEFApp_OnContextInitialized; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; end; procedure TMainForm.AddTabBtnClick(Sender: TObject); diff --git a/demos/Delphi_VCL/ToolBoxBrowser/uMainForm.pas b/demos/Delphi_VCL/ToolBoxBrowser/uMainForm.pas index 37fcddbd..b4b060f8 100644 --- a/demos/Delphi_VCL/ToolBoxBrowser/uMainForm.pas +++ b/demos/Delphi_VCL/ToolBoxBrowser/uMainForm.pas @@ -112,7 +112,6 @@ procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.OnContextInitialized := GlobalCEFApp_OnContextInitialized; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; end; procedure TMainForm.CreateToolboxChild(const ChildCaption, URL: string); diff --git a/demos/Delphi_VCL/URLRequest/uURLRequest.pas b/demos/Delphi_VCL/URLRequest/uURLRequest.pas index 108bc737..9330d3b7 100644 --- a/demos/Delphi_VCL/URLRequest/uURLRequest.pas +++ b/demos/Delphi_VCL/URLRequest/uURLRequest.pas @@ -143,7 +143,8 @@ uses procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; + //GlobalCEFApp.LogFile := 'cef.log'; + //GlobalCEFApp.LogSeverity := LOGSEVERITY_VERBOSE; end; procedure TURLRequestFrm.DownloadBtnClick(Sender: TObject); diff --git a/demos/Lazarus/CookieVisitor/CookieVisitor.lps b/demos/Lazarus/CookieVisitor/CookieVisitor.lps index 1b4cd3f3..e96ecdf8 100644 --- a/demos/Lazarus/CookieVisitor/CookieVisitor.lps +++ b/demos/Lazarus/CookieVisitor/CookieVisitor.lps @@ -20,9 +20,10 @@ + - + @@ -41,12 +42,10 @@ - - - + + - diff --git a/demos/Lazarus/CookieVisitor/uCookieVisitor.lfm b/demos/Lazarus/CookieVisitor/uCookieVisitor.lfm index e93731ec..405a51f5 100644 --- a/demos/Lazarus/CookieVisitor/uCookieVisitor.lfm +++ b/demos/Lazarus/CookieVisitor/uCookieVisitor.lfm @@ -15,7 +15,7 @@ object CookieVisitorFrm: TCookieVisitorFrm OnDestroy = FormDestroy OnShow = FormShow Position = poScreenCenter - LCLVersion = '2.0.2.0' + LCLVersion = '2.0.4.0' object AddressBarPnl: TPanel Left = 0 Height = 21 diff --git a/demos/Lazarus/CookieVisitor/uCookieVisitor.pas b/demos/Lazarus/CookieVisitor/uCookieVisitor.pas index 6e29257b..464c21f9 100644 --- a/demos/Lazarus/CookieVisitor/uCookieVisitor.pas +++ b/demos/Lazarus/CookieVisitor/uCookieVisitor.pas @@ -146,7 +146,8 @@ uses procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; + //GlobalCEFApp.LogFile := 'cef.log'; + //GlobalCEFApp.LogSeverity := LOGSEVERITY_VERBOSE; end; // This function is called in the IO thread. diff --git a/demos/Lazarus/CustomResourceBrowser/CRBrowser.lps b/demos/Lazarus/CustomResourceBrowser/CRBrowser.lps index 74c160b8..11fd40a6 100644 --- a/demos/Lazarus/CustomResourceBrowser/CRBrowser.lps +++ b/demos/Lazarus/CustomResourceBrowser/CRBrowser.lps @@ -23,7 +23,7 @@ - + diff --git a/demos/Lazarus/CustomResourceBrowser/uMainForm.lfm b/demos/Lazarus/CustomResourceBrowser/uMainForm.lfm index 1d7e2900..aba73b58 100644 --- a/demos/Lazarus/CustomResourceBrowser/uMainForm.lfm +++ b/demos/Lazarus/CustomResourceBrowser/uMainForm.lfm @@ -14,7 +14,7 @@ object MainForm: TMainForm OnCreate = FormCreate OnShow = FormShow Position = poScreenCenter - LCLVersion = '2.0.2.0' + LCLVersion = '2.0.4.0' object ChromiumWindow1: TChromiumWindow Left = 0 Height = 637 diff --git a/demos/Lazarus/CustomResourceBrowser/uMainForm.pas b/demos/Lazarus/CustomResourceBrowser/uMainForm.pas index e6469815..9c25651b 100644 --- a/demos/Lazarus/CustomResourceBrowser/uMainForm.pas +++ b/demos/Lazarus/CustomResourceBrowser/uMainForm.pas @@ -112,7 +112,6 @@ uses procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; //GlobalCEFApp.LogFile := 'cef.log'; //GlobalCEFApp.LogSeverity := LOGSEVERITY_VERBOSE; end; diff --git a/demos/Lazarus/DOMVisitor/DOMVisitor.lps b/demos/Lazarus/DOMVisitor/DOMVisitor.lps index 4f6e469f..0983734f 100644 --- a/demos/Lazarus/DOMVisitor/DOMVisitor.lps +++ b/demos/Lazarus/DOMVisitor/DOMVisitor.lps @@ -23,7 +23,7 @@ - + diff --git a/demos/Lazarus/DOMVisitor/uDOMVisitor.lfm b/demos/Lazarus/DOMVisitor/uDOMVisitor.lfm index 6d3c4423..262dea8b 100644 --- a/demos/Lazarus/DOMVisitor/uDOMVisitor.lfm +++ b/demos/Lazarus/DOMVisitor/uDOMVisitor.lfm @@ -14,7 +14,7 @@ object DOMVisitorFrm: TDOMVisitorFrm OnCreate = FormCreate OnShow = FormShow Position = poScreenCenter - LCLVersion = '2.0.2.0' + LCLVersion = '2.0.4.0' object CEFWindowParent1: TCEFWindowParent Left = 0 Height = 539 diff --git a/demos/Lazarus/DOMVisitor/uDOMVisitor.pas b/demos/Lazarus/DOMVisitor/uDOMVisitor.pas index 6af6cacc..d27d268c 100644 --- a/demos/Lazarus/DOMVisitor/uDOMVisitor.pas +++ b/demos/Lazarus/DOMVisitor/uDOMVisitor.pas @@ -302,7 +302,6 @@ begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.RemoteDebuggingPort := 9000; GlobalCEFApp.OnProcessMessageReceived := GlobalCEFApp_OnProcessMessageReceived; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; // Enabling the debug log file for then DOM visitor demo. // This adds lots of warnings to the console, specially if you run this inside VirtualBox. diff --git a/demos/Lazarus/EditorBrowser/EditorBrowser.lps b/demos/Lazarus/EditorBrowser/EditorBrowser.lps index 22d774c3..0c446ebd 100644 --- a/demos/Lazarus/EditorBrowser/EditorBrowser.lps +++ b/demos/Lazarus/EditorBrowser/EditorBrowser.lps @@ -21,7 +21,7 @@ - + diff --git a/demos/Lazarus/EditorBrowser/uEditorBrowser.lfm b/demos/Lazarus/EditorBrowser/uEditorBrowser.lfm index 5837890e..e934c88c 100644 --- a/demos/Lazarus/EditorBrowser/uEditorBrowser.lfm +++ b/demos/Lazarus/EditorBrowser/uEditorBrowser.lfm @@ -14,7 +14,7 @@ object Form1: TForm1 OnCreate = FormCreate OnShow = FormShow Position = poScreenCenter - LCLVersion = '2.0.2.0' + LCLVersion = '2.0.4.0' object CEFWindowParent1: TCEFWindowParent Left = 0 Height = 599 diff --git a/demos/Lazarus/EditorBrowser/uEditorBrowser.pas b/demos/Lazarus/EditorBrowser/uEditorBrowser.pas index a7825aaa..5c5d2c56 100644 --- a/demos/Lazarus/EditorBrowser/uEditorBrowser.pas +++ b/demos/Lazarus/EditorBrowser/uEditorBrowser.pas @@ -171,7 +171,8 @@ uses procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; + //GlobalCEFApp.LogFile := 'cef.log'; + //GlobalCEFApp.LogSeverity := LOGSEVERITY_VERBOSE; end; procedure TForm1.FillColorBtnClick(Sender: TObject); diff --git a/demos/Lazarus/ExternalPumpBrowser/ExternalPumpBrowser.lps b/demos/Lazarus/ExternalPumpBrowser/ExternalPumpBrowser.lps index e8be0322..2b847811 100644 --- a/demos/Lazarus/ExternalPumpBrowser/ExternalPumpBrowser.lps +++ b/demos/Lazarus/ExternalPumpBrowser/ExternalPumpBrowser.lps @@ -23,7 +23,7 @@ - + diff --git a/demos/Lazarus/ExternalPumpBrowser/uExternalPumpBrowser.lfm b/demos/Lazarus/ExternalPumpBrowser/uExternalPumpBrowser.lfm index 80aebbf9..f05e47e7 100644 --- a/demos/Lazarus/ExternalPumpBrowser/uExternalPumpBrowser.lfm +++ b/demos/Lazarus/ExternalPumpBrowser/uExternalPumpBrowser.lfm @@ -14,7 +14,7 @@ object ExternalPumpBrowserFrm: TExternalPumpBrowserFrm OnCreate = FormCreate OnShow = FormShow Position = poScreenCenter - LCLVersion = '2.0.2.0' + LCLVersion = '2.0.4.0' object AddressPnl: TPanel Left = 0 Height = 21 diff --git a/demos/Lazarus/ExternalPumpBrowser/uExternalPumpBrowser.pas b/demos/Lazarus/ExternalPumpBrowser/uExternalPumpBrowser.pas index 7947e15e..517dce46 100644 --- a/demos/Lazarus/ExternalPumpBrowser/uExternalPumpBrowser.pas +++ b/demos/Lazarus/ExternalPumpBrowser/uExternalPumpBrowser.pas @@ -131,7 +131,6 @@ begin GlobalCEFApp.FlashEnabled := False; GlobalCEFApp.ExternalMessagePump := True; GlobalCEFApp.MultiThreadedMessageLoop := False; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; GlobalCEFApp.OnScheduleMessagePumpWork := GlobalCEFApp_OnScheduleMessagePumpWork; end; diff --git a/demos/Lazarus/FullScreenBrowser/FullScreenBrowser.lps b/demos/Lazarus/FullScreenBrowser/FullScreenBrowser.lps index 7d0e4f30..8c79ffab 100644 --- a/demos/Lazarus/FullScreenBrowser/FullScreenBrowser.lps +++ b/demos/Lazarus/FullScreenBrowser/FullScreenBrowser.lps @@ -22,8 +22,8 @@ - - + + diff --git a/demos/Lazarus/FullScreenBrowser/uMainForm.lfm b/demos/Lazarus/FullScreenBrowser/uMainForm.lfm index 6217028d..9aed59d9 100644 --- a/demos/Lazarus/FullScreenBrowser/uMainForm.lfm +++ b/demos/Lazarus/FullScreenBrowser/uMainForm.lfm @@ -1,7 +1,7 @@ object MainForm: TMainForm - Left = -8 + Left = 165 Height = 673 - Top = 0 + Top = 130 Width = 1364 BorderIcons = [] BorderStyle = bsNone @@ -16,7 +16,7 @@ object MainForm: TMainForm OnCloseQuery = FormCloseQuery OnCreate = FormCreate OnShow = FormShow - LCLVersion = '2.0.2.0' + LCLVersion = '2.0.4.0' WindowState = wsMaximized object CEFWindowParent1: TCEFWindowParent Left = 0 diff --git a/demos/Lazarus/FullScreenBrowser/uMainForm.pas b/demos/Lazarus/FullScreenBrowser/uMainForm.pas index f3f7447b..1dd36291 100644 --- a/demos/Lazarus/FullScreenBrowser/uMainForm.pas +++ b/demos/Lazarus/FullScreenBrowser/uMainForm.pas @@ -116,8 +116,9 @@ uses procedure CreateGlobalCEFApp; begin - GlobalCEFApp := TCefApplication.Create; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; + GlobalCEFApp := TCefApplication.Create; + //GlobalCEFApp.LogFile := 'cef.log'; + //GlobalCEFApp.LogSeverity := LOGSEVERITY_VERBOSE; end; procedure TMainForm.HandleKeyUp(const aMsg : TMsg; var aHandled : boolean); diff --git a/demos/Lazarus/JavaScript/JSDialog/JSDialogBrowser.lps b/demos/Lazarus/JavaScript/JSDialog/JSDialogBrowser.lps index a1d657b9..d31fad69 100644 --- a/demos/Lazarus/JavaScript/JSDialog/JSDialogBrowser.lps +++ b/demos/Lazarus/JavaScript/JSDialog/JSDialogBrowser.lps @@ -23,7 +23,7 @@ - + diff --git a/demos/Lazarus/JavaScript/JSDialog/uJSDialogBrowser.lfm b/demos/Lazarus/JavaScript/JSDialog/uJSDialogBrowser.lfm index 0b656b3d..86b84546 100644 --- a/demos/Lazarus/JavaScript/JSDialog/uJSDialogBrowser.lfm +++ b/demos/Lazarus/JavaScript/JSDialog/uJSDialogBrowser.lfm @@ -15,7 +15,7 @@ object JSDialogBrowserFrm: TJSDialogBrowserFrm OnDestroy = FormDestroy OnShow = FormShow Position = poScreenCenter - LCLVersion = '2.0.2.0' + LCLVersion = '2.0.4.0' object ChromiumWindow1: TChromiumWindow Left = 0 Height = 603 diff --git a/demos/Lazarus/JavaScript/JSDialog/uJSDialogBrowser.pas b/demos/Lazarus/JavaScript/JSDialog/uJSDialogBrowser.pas index f27927ef..cf1dc248 100644 --- a/demos/Lazarus/JavaScript/JSDialog/uJSDialogBrowser.pas +++ b/demos/Lazarus/JavaScript/JSDialog/uJSDialogBrowser.pas @@ -119,7 +119,8 @@ uses procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; + //GlobalCEFApp.LogFile := 'cef.log'; + //GlobalCEFApp.LogSeverity := LOGSEVERITY_VERBOSE; end; procedure TJSDialogBrowserFrm.FormCreate(Sender: TObject); diff --git a/demos/Lazarus/JavaScript/JSEval/JSEval.lps b/demos/Lazarus/JavaScript/JSEval/JSEval.lps index 06217d06..2970d53c 100644 --- a/demos/Lazarus/JavaScript/JSEval/JSEval.lps +++ b/demos/Lazarus/JavaScript/JSEval/JSEval.lps @@ -23,7 +23,7 @@ - + diff --git a/demos/Lazarus/JavaScript/JSEval/uJSEval.lfm b/demos/Lazarus/JavaScript/JSEval/uJSEval.lfm index 098d163c..074c3da4 100644 --- a/demos/Lazarus/JavaScript/JSEval/uJSEval.lfm +++ b/demos/Lazarus/JavaScript/JSEval/uJSEval.lfm @@ -13,7 +13,7 @@ object JSEvalFrm: TJSEvalFrm OnCloseQuery = FormCloseQuery OnShow = FormShow Position = poScreenCenter - LCLVersion = '2.0.2.0' + LCLVersion = '2.0.4.0' object CEFWindowParent1: TCEFWindowParent Left = 0 Height = 550 diff --git a/demos/Lazarus/JavaScript/JSEval/uJSEval.pas b/demos/Lazarus/JavaScript/JSEval/uJSEval.pas index 83f9deea..4bd5182b 100644 --- a/demos/Lazarus/JavaScript/JSEval/uJSEval.pas +++ b/demos/Lazarus/JavaScript/JSEval/uJSEval.pas @@ -539,7 +539,6 @@ procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.OnProcessMessageReceived := RenderProcessHandler_OnProcessMessageReceivedEvent; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; end; procedure TJSEvalFrm.Chromium1ProcessMessageReceived(Sender : TObject; diff --git a/demos/Lazarus/JavaScript/JSExecutingFunctions/uJSExecutingFunctions.lfm b/demos/Lazarus/JavaScript/JSExecutingFunctions/uJSExecutingFunctions.lfm index b349b5ce..23e22fa9 100644 --- a/demos/Lazarus/JavaScript/JSExecutingFunctions/uJSExecutingFunctions.lfm +++ b/demos/Lazarus/JavaScript/JSExecutingFunctions/uJSExecutingFunctions.lfm @@ -15,7 +15,7 @@ object JSExecutingFunctionsFrm: TJSExecutingFunctionsFrm OnDestroy = FormDestroy OnShow = FormShow Position = poScreenCenter - LCLVersion = '2.0.2.0' + LCLVersion = '2.0.4.0' object NavControlPnl: TPanel Left = 0 Height = 21 diff --git a/demos/Lazarus/JavaScript/JSExecutingFunctions/uJSExecutingFunctions.pas b/demos/Lazarus/JavaScript/JSExecutingFunctions/uJSExecutingFunctions.pas index 6fb731fd..9f03728a 100644 --- a/demos/Lazarus/JavaScript/JSExecutingFunctions/uJSExecutingFunctions.pas +++ b/demos/Lazarus/JavaScript/JSExecutingFunctions/uJSExecutingFunctions.pas @@ -176,7 +176,6 @@ begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.OnContextCreated := GlobalCEFApp_OnContextCreated; GlobalCEFApp.OnProcessMessageReceived := GlobalCEFApp_OnProcessMessageReceived; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; end; procedure TJSExecutingFunctionsFrm.GoBtnClick(Sender: TObject); diff --git a/demos/Lazarus/JavaScript/JSExtension/JSExtension.lps b/demos/Lazarus/JavaScript/JSExtension/JSExtension.lps index 9fd5caa0..84fc5bea 100644 --- a/demos/Lazarus/JavaScript/JSExtension/JSExtension.lps +++ b/demos/Lazarus/JavaScript/JSExtension/JSExtension.lps @@ -23,7 +23,7 @@ - + diff --git a/demos/Lazarus/JavaScript/JSExtension/uJSExtension.pas b/demos/Lazarus/JavaScript/JSExtension/uJSExtension.pas index 40c5aa00..ca62af96 100644 --- a/demos/Lazarus/JavaScript/JSExtension/uJSExtension.pas +++ b/demos/Lazarus/JavaScript/JSExtension/uJSExtension.pas @@ -319,7 +319,6 @@ procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.OnWebKitInitialized := GlobalCEFApp_OnWebKitInitialized; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; {$IFDEF DEBUG} GlobalCEFApp.LogFile := 'debug.log'; GlobalCEFApp.LogSeverity := LOGSEVERITY_INFO; diff --git a/demos/Lazarus/JavaScript/JSExtensionWithFunction/JSExtensionWithFunction.lps b/demos/Lazarus/JavaScript/JSExtensionWithFunction/JSExtensionWithFunction.lps index 7744bcde..5498d649 100644 --- a/demos/Lazarus/JavaScript/JSExtensionWithFunction/JSExtensionWithFunction.lps +++ b/demos/Lazarus/JavaScript/JSExtensionWithFunction/JSExtensionWithFunction.lps @@ -23,7 +23,7 @@ - + diff --git a/demos/Lazarus/JavaScript/JSExtensionWithFunction/uJSExtensionWithFunction.lfm b/demos/Lazarus/JavaScript/JSExtensionWithFunction/uJSExtensionWithFunction.lfm index 8ff4e1fa..3e14ce7d 100644 --- a/demos/Lazarus/JavaScript/JSExtensionWithFunction/uJSExtensionWithFunction.lfm +++ b/demos/Lazarus/JavaScript/JSExtensionWithFunction/uJSExtensionWithFunction.lfm @@ -14,7 +14,7 @@ object JSExtensionWithFunctionFrm: TJSExtensionWithFunctionFrm OnCreate = FormCreate OnShow = FormShow Position = poScreenCenter - LCLVersion = '2.0.2.0' + LCLVersion = '2.0.4.0' object NavControlPnl: TPanel Left = 0 Height = 21 diff --git a/demos/Lazarus/JavaScript/JSExtensionWithFunction/uJSExtensionWithFunction.pas b/demos/Lazarus/JavaScript/JSExtensionWithFunction/uJSExtensionWithFunction.pas index 967b9b30..7e5fe351 100644 --- a/demos/Lazarus/JavaScript/JSExtensionWithFunction/uJSExtensionWithFunction.pas +++ b/demos/Lazarus/JavaScript/JSExtensionWithFunction/uJSExtensionWithFunction.pas @@ -150,7 +150,6 @@ procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.OnWebKitInitialized := GlobalCEFApp_OnWebKitInitializedEvent; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; end; procedure TJSExtensionWithFunctionFrm.GoBtnClick(Sender: TObject); diff --git a/demos/Lazarus/JavaScript/JSExtensionWithObjectParameter/JSExtensionWithObjectParameter.lps b/demos/Lazarus/JavaScript/JSExtensionWithObjectParameter/JSExtensionWithObjectParameter.lps index 12c77903..ee6fa447 100644 --- a/demos/Lazarus/JavaScript/JSExtensionWithObjectParameter/JSExtensionWithObjectParameter.lps +++ b/demos/Lazarus/JavaScript/JSExtensionWithObjectParameter/JSExtensionWithObjectParameter.lps @@ -23,7 +23,7 @@ - + diff --git a/demos/Lazarus/JavaScript/JSExtensionWithObjectParameter/uJSExtensionWithObjectParameter.lfm b/demos/Lazarus/JavaScript/JSExtensionWithObjectParameter/uJSExtensionWithObjectParameter.lfm index 256286eb..1e54ef4e 100644 --- a/demos/Lazarus/JavaScript/JSExtensionWithObjectParameter/uJSExtensionWithObjectParameter.lfm +++ b/demos/Lazarus/JavaScript/JSExtensionWithObjectParameter/uJSExtensionWithObjectParameter.lfm @@ -14,7 +14,7 @@ object JSExtensionWithObjectParameterFrm: TJSExtensionWithObjectParameterFrm OnCreate = FormCreate OnShow = FormShow Position = poScreenCenter - LCLVersion = '2.0.2.0' + LCLVersion = '2.0.4.0' object NavControlPnl: TPanel Left = 0 Height = 21 diff --git a/demos/Lazarus/JavaScript/JSExtensionWithObjectParameter/uJSExtensionWithObjectParameter.pas b/demos/Lazarus/JavaScript/JSExtensionWithObjectParameter/uJSExtensionWithObjectParameter.pas index ed46c1b0..f4d83e20 100644 --- a/demos/Lazarus/JavaScript/JSExtensionWithObjectParameter/uJSExtensionWithObjectParameter.pas +++ b/demos/Lazarus/JavaScript/JSExtensionWithObjectParameter/uJSExtensionWithObjectParameter.pas @@ -153,7 +153,6 @@ procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.OnWebKitInitialized := GlobalCEFApp_OnWebKitInitializedEvent; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; end; procedure TJSExtensionWithObjectParameterFrm.GoBtnClick(Sender: TObject); diff --git a/demos/Lazarus/JavaScript/JSSimpleExtension/JSSimpleExtension.lps b/demos/Lazarus/JavaScript/JSSimpleExtension/JSSimpleExtension.lps index 22dfde4b..d5c420f8 100644 --- a/demos/Lazarus/JavaScript/JSSimpleExtension/JSSimpleExtension.lps +++ b/demos/Lazarus/JavaScript/JSSimpleExtension/JSSimpleExtension.lps @@ -23,7 +23,7 @@ - + diff --git a/demos/Lazarus/JavaScript/JSSimpleExtension/uJSSimpleExtension.lfm b/demos/Lazarus/JavaScript/JSSimpleExtension/uJSSimpleExtension.lfm index cb5e75ae..8c3eb63e 100644 --- a/demos/Lazarus/JavaScript/JSSimpleExtension/uJSSimpleExtension.lfm +++ b/demos/Lazarus/JavaScript/JSSimpleExtension/uJSSimpleExtension.lfm @@ -14,7 +14,7 @@ object JSSimpleExtensionFrm: TJSSimpleExtensionFrm OnCreate = FormCreate OnShow = FormShow Position = poScreenCenter - LCLVersion = '2.0.2.0' + LCLVersion = '2.0.4.0' object NavControlPnl: TPanel Left = 0 Height = 21 diff --git a/demos/Lazarus/JavaScript/JSSimpleExtension/uJSSimpleExtension.pas b/demos/Lazarus/JavaScript/JSSimpleExtension/uJSSimpleExtension.pas index a491e016..37987db2 100644 --- a/demos/Lazarus/JavaScript/JSSimpleExtension/uJSSimpleExtension.pas +++ b/demos/Lazarus/JavaScript/JSSimpleExtension/uJSSimpleExtension.pas @@ -140,7 +140,6 @@ procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.OnWebKitInitialized := GlobalCEFApp_OnWebKitInitializedEvent; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; end; procedure TJSSimpleExtensionFrm.GoBtnClick(Sender: TObject); diff --git a/demos/Lazarus/JavaScript/JSSimpleWindowBinding/JSSimpleWindowBinding.lps b/demos/Lazarus/JavaScript/JSSimpleWindowBinding/JSSimpleWindowBinding.lps index d9fd6e13..42acbcbd 100644 --- a/demos/Lazarus/JavaScript/JSSimpleWindowBinding/JSSimpleWindowBinding.lps +++ b/demos/Lazarus/JavaScript/JSSimpleWindowBinding/JSSimpleWindowBinding.lps @@ -23,7 +23,7 @@ - + diff --git a/demos/Lazarus/JavaScript/JSSimpleWindowBinding/uJSSimpleWindowBinding.lfm b/demos/Lazarus/JavaScript/JSSimpleWindowBinding/uJSSimpleWindowBinding.lfm index 1c88504e..17da8ba9 100644 --- a/demos/Lazarus/JavaScript/JSSimpleWindowBinding/uJSSimpleWindowBinding.lfm +++ b/demos/Lazarus/JavaScript/JSSimpleWindowBinding/uJSSimpleWindowBinding.lfm @@ -14,7 +14,7 @@ object JSSimpleWindowBindingFrm: TJSSimpleWindowBindingFrm OnCreate = FormCreate OnShow = FormShow Position = poScreenCenter - LCLVersion = '2.0.2.0' + LCLVersion = '2.0.4.0' object NavControlPnl: TPanel Left = 0 Height = 21 diff --git a/demos/Lazarus/JavaScript/JSSimpleWindowBinding/uJSSimpleWindowBinding.pas b/demos/Lazarus/JavaScript/JSSimpleWindowBinding/uJSSimpleWindowBinding.pas index 108efd0b..653c84d6 100644 --- a/demos/Lazarus/JavaScript/JSSimpleWindowBinding/uJSSimpleWindowBinding.pas +++ b/demos/Lazarus/JavaScript/JSSimpleWindowBinding/uJSSimpleWindowBinding.pas @@ -132,7 +132,6 @@ procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.OnContextCreated := GlobalCEFApp_OnContextCreated; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; end; procedure TJSSimpleWindowBindingFrm.GoBtnClick(Sender: TObject); diff --git a/demos/Lazarus/JavaScript/JSWindowBindingSubProcess/JSSimpleWindowBinding.lpr b/demos/Lazarus/JavaScript/JSWindowBindingSubProcess/JSSimpleWindowBinding.lpr index 80c5c3e9..f780ae0a 100644 --- a/demos/Lazarus/JavaScript/JSWindowBindingSubProcess/JSSimpleWindowBinding.lpr +++ b/demos/Lazarus/JavaScript/JSWindowBindingSubProcess/JSSimpleWindowBinding.lpr @@ -65,7 +65,6 @@ begin // 4. Run this demo : JSSimpleWindowBinding GlobalCEFApp.BrowserSubprocessPath := 'SubProcess.exe'; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; if GlobalCEFApp.StartMainProcess then begin diff --git a/demos/Lazarus/JavaScript/JSWindowBindingSubProcess/JSSimpleWindowBinding.lps b/demos/Lazarus/JavaScript/JSWindowBindingSubProcess/JSSimpleWindowBinding.lps index bd0f37b8..edffd64f 100644 --- a/demos/Lazarus/JavaScript/JSWindowBindingSubProcess/JSSimpleWindowBinding.lps +++ b/demos/Lazarus/JavaScript/JSWindowBindingSubProcess/JSSimpleWindowBinding.lps @@ -9,8 +9,8 @@ - - + + diff --git a/demos/Lazarus/JavaScript/JSWindowBindingSubProcess/SubProcess.lpr b/demos/Lazarus/JavaScript/JSWindowBindingSubProcess/SubProcess.lpr index ad508c31..698b8598 100644 --- a/demos/Lazarus/JavaScript/JSWindowBindingSubProcess/SubProcess.lpr +++ b/demos/Lazarus/JavaScript/JSWindowBindingSubProcess/SubProcess.lpr @@ -70,7 +70,6 @@ end; begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.OnContextCreated := GlobalCEFApp_OnContextCreated; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; // The main process and the subprocess *MUST* have the same FrameworkDirPath, ResourcesDirPath, // LocalesDirPath, cache and UserDataPath paths diff --git a/demos/Lazarus/JavaScript/JSWindowBindingSubProcess/SubProcess.lps b/demos/Lazarus/JavaScript/JSWindowBindingSubProcess/SubProcess.lps index 1ba57d36..14002b37 100644 --- a/demos/Lazarus/JavaScript/JSWindowBindingSubProcess/SubProcess.lps +++ b/demos/Lazarus/JavaScript/JSWindowBindingSubProcess/SubProcess.lps @@ -9,8 +9,8 @@ - - + + diff --git a/demos/Lazarus/JavaScript/JSWindowBindingWithArrayBuffer/JSWindowBindingWithArrayBuffer.lps b/demos/Lazarus/JavaScript/JSWindowBindingWithArrayBuffer/JSWindowBindingWithArrayBuffer.lps index 9d5b79d2..e74d5963 100644 --- a/demos/Lazarus/JavaScript/JSWindowBindingWithArrayBuffer/JSWindowBindingWithArrayBuffer.lps +++ b/demos/Lazarus/JavaScript/JSWindowBindingWithArrayBuffer/JSWindowBindingWithArrayBuffer.lps @@ -22,8 +22,8 @@ - - + + diff --git a/demos/Lazarus/JavaScript/JSWindowBindingWithArrayBuffer/uJSWindowBindingWithArrayBuffer.pas b/demos/Lazarus/JavaScript/JSWindowBindingWithArrayBuffer/uJSWindowBindingWithArrayBuffer.pas index f8e2af7b..c758bbdb 100644 --- a/demos/Lazarus/JavaScript/JSWindowBindingWithArrayBuffer/uJSWindowBindingWithArrayBuffer.pas +++ b/demos/Lazarus/JavaScript/JSWindowBindingWithArrayBuffer/uJSWindowBindingWithArrayBuffer.pas @@ -157,7 +157,6 @@ procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.OnContextCreated := GlobalCEFApp_OnContextCreated; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; end; procedure TJSWindowBindingWithArrayBufferFrm.GoBtnClick(Sender: TObject); diff --git a/demos/Lazarus/JavaScript/JSWindowBindingWithFunction/JSWindowBindingWithFunction.lps b/demos/Lazarus/JavaScript/JSWindowBindingWithFunction/JSWindowBindingWithFunction.lps index 38330b02..4903a486 100644 --- a/demos/Lazarus/JavaScript/JSWindowBindingWithFunction/JSWindowBindingWithFunction.lps +++ b/demos/Lazarus/JavaScript/JSWindowBindingWithFunction/JSWindowBindingWithFunction.lps @@ -23,7 +23,7 @@ - + diff --git a/demos/Lazarus/JavaScript/JSWindowBindingWithFunction/uJSWindowBindingWithFunction.lfm b/demos/Lazarus/JavaScript/JSWindowBindingWithFunction/uJSWindowBindingWithFunction.lfm index f1d176d2..1549cdc0 100644 --- a/demos/Lazarus/JavaScript/JSWindowBindingWithFunction/uJSWindowBindingWithFunction.lfm +++ b/demos/Lazarus/JavaScript/JSWindowBindingWithFunction/uJSWindowBindingWithFunction.lfm @@ -14,7 +14,7 @@ object JSWindowBindingWithFunctionFrm: TJSWindowBindingWithFunctionFrm OnCreate = FormCreate OnShow = FormShow Position = poScreenCenter - LCLVersion = '2.0.2.0' + LCLVersion = '2.0.4.0' object NavControlPnl: TPanel Left = 0 Height = 21 diff --git a/demos/Lazarus/JavaScript/JSWindowBindingWithFunction/uJSWindowBindingWithFunction.pas b/demos/Lazarus/JavaScript/JSWindowBindingWithFunction/uJSWindowBindingWithFunction.pas index 5d54b05f..223917e8 100644 --- a/demos/Lazarus/JavaScript/JSWindowBindingWithFunction/uJSWindowBindingWithFunction.pas +++ b/demos/Lazarus/JavaScript/JSWindowBindingWithFunction/uJSWindowBindingWithFunction.pas @@ -137,7 +137,6 @@ procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.OnContextCreated := GlobalCEFApp_OnContextCreated; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; end; procedure TJSWindowBindingWithFunctionFrm.GoBtnClick(Sender: TObject); diff --git a/demos/Lazarus/JavaScript/JSWindowBindingWithObject/JSWindowBindingWithObject.lps b/demos/Lazarus/JavaScript/JSWindowBindingWithObject/JSWindowBindingWithObject.lps index 6406d11f..ed6b74a5 100644 --- a/demos/Lazarus/JavaScript/JSWindowBindingWithObject/JSWindowBindingWithObject.lps +++ b/demos/Lazarus/JavaScript/JSWindowBindingWithObject/JSWindowBindingWithObject.lps @@ -23,7 +23,7 @@ - + diff --git a/demos/Lazarus/JavaScript/JSWindowBindingWithObject/uJSWindowBindingWithObject.lfm b/demos/Lazarus/JavaScript/JSWindowBindingWithObject/uJSWindowBindingWithObject.lfm index b4748663..d47145f1 100644 --- a/demos/Lazarus/JavaScript/JSWindowBindingWithObject/uJSWindowBindingWithObject.lfm +++ b/demos/Lazarus/JavaScript/JSWindowBindingWithObject/uJSWindowBindingWithObject.lfm @@ -14,7 +14,7 @@ object JSWindowBindingWithObjectFrm: TJSWindowBindingWithObjectFrm OnCreate = FormCreate OnShow = FormShow Position = poScreenCenter - LCLVersion = '2.0.2.0' + LCLVersion = '2.0.4.0' object NavControlPnl: TPanel Left = 0 Height = 21 diff --git a/demos/Lazarus/JavaScript/JSWindowBindingWithObject/uJSWindowBindingWithObject.pas b/demos/Lazarus/JavaScript/JSWindowBindingWithObject/uJSWindowBindingWithObject.pas index beebb0a1..3aa41c27 100644 --- a/demos/Lazarus/JavaScript/JSWindowBindingWithObject/uJSWindowBindingWithObject.pas +++ b/demos/Lazarus/JavaScript/JSWindowBindingWithObject/uJSWindowBindingWithObject.pas @@ -138,7 +138,6 @@ procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.OnContextCreated := GlobalCEFApp_OnContextCreated; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; end; procedure TJSWindowBindingWithObjectFrm.GoBtnClick(Sender: TObject); diff --git a/demos/Lazarus/MiniBrowser/MiniBrowser.lps b/demos/Lazarus/MiniBrowser/MiniBrowser.lps index 3979fb4d..bed2df6b 100644 --- a/demos/Lazarus/MiniBrowser/MiniBrowser.lps +++ b/demos/Lazarus/MiniBrowser/MiniBrowser.lps @@ -23,7 +23,7 @@ - + diff --git a/demos/Lazarus/MiniBrowser/uMiniBrowser.pas b/demos/Lazarus/MiniBrowser/uMiniBrowser.pas index a7b658a8..2550fe86 100644 --- a/demos/Lazarus/MiniBrowser/uMiniBrowser.pas +++ b/demos/Lazarus/MiniBrowser/uMiniBrowser.pas @@ -290,8 +290,8 @@ begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.LogFile := 'debug.log'; GlobalCEFApp.LogSeverity := LOGSEVERITY_INFO; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; - GlobalCEFApp.cache := 'cache'; + GlobalCEFApp.cache := 'cache'; + GlobalCEFApp.EnablePrintPreview := True; end; procedure TMiniBrowserFrm.BackBtnClick(Sender: TObject); diff --git a/demos/Lazarus/OSRExternalPumpBrowser/OSRExternalPumpBrowser.lps b/demos/Lazarus/OSRExternalPumpBrowser/OSRExternalPumpBrowser.lps index 0d3b8726..50f78310 100644 --- a/demos/Lazarus/OSRExternalPumpBrowser/OSRExternalPumpBrowser.lps +++ b/demos/Lazarus/OSRExternalPumpBrowser/OSRExternalPumpBrowser.lps @@ -22,8 +22,8 @@ - - + + diff --git a/demos/Lazarus/OSRExternalPumpBrowser/uOSRExternalPumpBrowser.lfm b/demos/Lazarus/OSRExternalPumpBrowser/uOSRExternalPumpBrowser.lfm index aeca7f31..1098f300 100644 --- a/demos/Lazarus/OSRExternalPumpBrowser/uOSRExternalPumpBrowser.lfm +++ b/demos/Lazarus/OSRExternalPumpBrowser/uOSRExternalPumpBrowser.lfm @@ -16,7 +16,7 @@ object OSRExternalPumpBrowserFrm: TOSRExternalPumpBrowserFrm OnHide = FormHide OnShow = FormShow Position = poScreenCenter - LCLVersion = '2.0.2.0' + LCLVersion = '2.0.4.0' object NavControlPnl: TPanel Left = 0 Height = 21 diff --git a/demos/Lazarus/OSRExternalPumpBrowser/uOSRExternalPumpBrowser.pas b/demos/Lazarus/OSRExternalPumpBrowser/uOSRExternalPumpBrowser.pas index 7829442b..d933f305 100644 --- a/demos/Lazarus/OSRExternalPumpBrowser/uOSRExternalPumpBrowser.pas +++ b/demos/Lazarus/OSRExternalPumpBrowser/uOSRExternalPumpBrowser.pas @@ -195,7 +195,6 @@ begin GlobalCEFApp.EnableHighDPISupport := True; GlobalCEFApp.ExternalMessagePump := True; GlobalCEFApp.MultiThreadedMessageLoop := False; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; GlobalCEFApp.OnScheduleMessagePumpWork := @GlobalCEFApp_OnScheduleMessagePumpWork; end; diff --git a/demos/Lazarus/PopupBrowser/PopupBrowser.lps b/demos/Lazarus/PopupBrowser/PopupBrowser.lps index 4d72bb1c..8ad3fc01 100644 --- a/demos/Lazarus/PopupBrowser/PopupBrowser.lps +++ b/demos/Lazarus/PopupBrowser/PopupBrowser.lps @@ -23,7 +23,7 @@ - + diff --git a/demos/Lazarus/PopupBrowser/uMainForm.lfm b/demos/Lazarus/PopupBrowser/uMainForm.lfm index 2147cfbb..35a22ad7 100644 --- a/demos/Lazarus/PopupBrowser/uMainForm.lfm +++ b/demos/Lazarus/PopupBrowser/uMainForm.lfm @@ -15,7 +15,7 @@ object MainForm: TMainForm OnDestroy = FormDestroy OnShow = FormShow Position = poScreenCenter - LCLVersion = '2.0.2.0' + LCLVersion = '2.0.4.0' object AddressPnl: TPanel Left = 0 Height = 21 diff --git a/demos/Lazarus/PopupBrowser/uMainForm.pas b/demos/Lazarus/PopupBrowser/uMainForm.pas index e50c5a06..d14dca7e 100644 --- a/demos/Lazarus/PopupBrowser/uMainForm.pas +++ b/demos/Lazarus/PopupBrowser/uMainForm.pas @@ -147,7 +147,6 @@ begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.WindowlessRenderingEnabled := True; GlobalCEFApp.EnableHighDPISupport := True; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; end; procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); diff --git a/demos/Lazarus/PopupBrowser2/PopupBrowser2.lps b/demos/Lazarus/PopupBrowser2/PopupBrowser2.lps index 3c3afc2c..c21dfb8e 100644 --- a/demos/Lazarus/PopupBrowser2/PopupBrowser2.lps +++ b/demos/Lazarus/PopupBrowser2/PopupBrowser2.lps @@ -23,7 +23,7 @@ - + diff --git a/demos/Lazarus/PopupBrowser2/uMainForm.lfm b/demos/Lazarus/PopupBrowser2/uMainForm.lfm index 0f388ab8..d9739c2a 100644 --- a/demos/Lazarus/PopupBrowser2/uMainForm.lfm +++ b/demos/Lazarus/PopupBrowser2/uMainForm.lfm @@ -15,7 +15,7 @@ object MainForm: TMainForm OnDestroy = FormDestroy OnShow = FormShow Position = poScreenCenter - LCLVersion = '2.0.2.0' + LCLVersion = '2.0.4.0' object AddressPnl: TPanel Left = 0 Height = 21 diff --git a/demos/Lazarus/PopupBrowser2/uMainForm.pas b/demos/Lazarus/PopupBrowser2/uMainForm.pas index 7af50471..f8b1e814 100644 --- a/demos/Lazarus/PopupBrowser2/uMainForm.pas +++ b/demos/Lazarus/PopupBrowser2/uMainForm.pas @@ -146,7 +146,6 @@ procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.EnableHighDPISupport := True; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; end; procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); diff --git a/demos/Lazarus/PostInspectorBrowser/PostInspectorBrowser.lps b/demos/Lazarus/PostInspectorBrowser/PostInspectorBrowser.lps index 9c1a8e77..1811a736 100644 --- a/demos/Lazarus/PostInspectorBrowser/PostInspectorBrowser.lps +++ b/demos/Lazarus/PostInspectorBrowser/PostInspectorBrowser.lps @@ -22,8 +22,8 @@ - - + + @@ -31,11 +31,10 @@ - + - diff --git a/demos/Lazarus/PostInspectorBrowser/uPostInspectorBrowser.pas b/demos/Lazarus/PostInspectorBrowser/uPostInspectorBrowser.pas index 7988652e..b968c03a 100644 --- a/demos/Lazarus/PostInspectorBrowser/uPostInspectorBrowser.pas +++ b/demos/Lazarus/PostInspectorBrowser/uPostInspectorBrowser.pas @@ -146,8 +146,9 @@ uses procedure CreateGlobalCEFApp; begin - GlobalCEFApp := TCefApplication.Create; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; + GlobalCEFApp := TCefApplication.Create; + //GlobalCEFApp.LogFile := 'cef.log'; + //GlobalCEFApp.LogSeverity := LOGSEVERITY_VERBOSE; end; procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); diff --git a/demos/Lazarus/SchemeRegistrationBrowser/SchemeRegistrationBrowser.lps b/demos/Lazarus/SchemeRegistrationBrowser/SchemeRegistrationBrowser.lps index 050dd9c8..6431de81 100644 --- a/demos/Lazarus/SchemeRegistrationBrowser/SchemeRegistrationBrowser.lps +++ b/demos/Lazarus/SchemeRegistrationBrowser/SchemeRegistrationBrowser.lps @@ -23,7 +23,7 @@ - + diff --git a/demos/Lazarus/SchemeRegistrationBrowser/uSchemeRegistrationBrowser.lfm b/demos/Lazarus/SchemeRegistrationBrowser/uSchemeRegistrationBrowser.lfm index b68c42a2..d056e4ec 100644 --- a/demos/Lazarus/SchemeRegistrationBrowser/uSchemeRegistrationBrowser.lfm +++ b/demos/Lazarus/SchemeRegistrationBrowser/uSchemeRegistrationBrowser.lfm @@ -14,7 +14,7 @@ object SchemeRegistrationBrowserFrm: TSchemeRegistrationBrowserFrm OnCreate = FormCreate OnShow = FormShow Position = poScreenCenter - LCLVersion = '2.0.2.0' + LCLVersion = '2.0.4.0' object AddressBarPnl: TPanel Left = 0 Height = 21 diff --git a/demos/Lazarus/SchemeRegistrationBrowser/uSchemeRegistrationBrowser.pas b/demos/Lazarus/SchemeRegistrationBrowser/uSchemeRegistrationBrowser.pas index f739dfa8..9cc603f3 100644 --- a/demos/Lazarus/SchemeRegistrationBrowser/uSchemeRegistrationBrowser.pas +++ b/demos/Lazarus/SchemeRegistrationBrowser/uSchemeRegistrationBrowser.pas @@ -137,7 +137,6 @@ procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.OnRegCustomSchemes := GlobalCEFApp_OnRegCustomSchemes; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; end; procedure TSchemeRegistrationBrowserFrm.Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); diff --git a/demos/Lazarus/SimpleBrowser/SimpleBrowser.lps b/demos/Lazarus/SimpleBrowser/SimpleBrowser.lps index 650bff98..a5c6bf78 100644 --- a/demos/Lazarus/SimpleBrowser/SimpleBrowser.lps +++ b/demos/Lazarus/SimpleBrowser/SimpleBrowser.lps @@ -23,7 +23,7 @@ - + diff --git a/demos/Lazarus/SimpleBrowser/uSimpleBrowser.pas b/demos/Lazarus/SimpleBrowser/uSimpleBrowser.pas index 1d378928..d091cb96 100644 --- a/demos/Lazarus/SimpleBrowser/uSimpleBrowser.pas +++ b/demos/Lazarus/SimpleBrowser/uSimpleBrowser.pas @@ -120,7 +120,6 @@ uses procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; // In case you want to use custom directories for the CEF3 binaries, cache and user data. { diff --git a/demos/Lazarus/SimpleBrowser2/SimpleBrowser2.lps b/demos/Lazarus/SimpleBrowser2/SimpleBrowser2.lps index dac3d456..990bef31 100644 --- a/demos/Lazarus/SimpleBrowser2/SimpleBrowser2.lps +++ b/demos/Lazarus/SimpleBrowser2/SimpleBrowser2.lps @@ -8,7 +8,7 @@ - + @@ -35,8 +35,8 @@ - - + + @@ -418,13 +418,12 @@ - + - - + @@ -453,6 +452,10 @@ + + + + diff --git a/demos/Lazarus/SimpleBrowser2/usimplelazarusbrowser.lfm b/demos/Lazarus/SimpleBrowser2/usimplelazarusbrowser.lfm index 2de5c6a8..dc47b1bd 100644 --- a/demos/Lazarus/SimpleBrowser2/usimplelazarusbrowser.lfm +++ b/demos/Lazarus/SimpleBrowser2/usimplelazarusbrowser.lfm @@ -10,7 +10,7 @@ object Form1: TForm1 OnCreate = FormCreate OnShow = FormShow Position = poScreenCenter - LCLVersion = '2.0.2.0' + LCLVersion = '2.0.4.0' object AddressPnl: TPanel Left = 0 Height = 23 diff --git a/demos/Lazarus/SimpleBrowser2/usimplelazarusbrowser.pas b/demos/Lazarus/SimpleBrowser2/usimplelazarusbrowser.pas index a4d9a9fc..ff6c608f 100644 --- a/demos/Lazarus/SimpleBrowser2/usimplelazarusbrowser.pas +++ b/demos/Lazarus/SimpleBrowser2/usimplelazarusbrowser.pas @@ -125,8 +125,9 @@ uses procedure CreateGlobalCEFApp; begin - GlobalCEFApp := TCefApplication.Create; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; + GlobalCEFApp := TCefApplication.Create; + //GlobalCEFApp.LogFile := 'cef.log'; + //GlobalCEFApp.LogSeverity := LOGSEVERITY_VERBOSE; end; procedure TForm1.FormCreate(Sender: TObject); diff --git a/demos/Lazarus/SimpleExternalPumpBrowser/SimpleExternalPumpBrowser.lps b/demos/Lazarus/SimpleExternalPumpBrowser/SimpleExternalPumpBrowser.lps index a597ccd3..75048ba7 100644 --- a/demos/Lazarus/SimpleExternalPumpBrowser/SimpleExternalPumpBrowser.lps +++ b/demos/Lazarus/SimpleExternalPumpBrowser/SimpleExternalPumpBrowser.lps @@ -23,7 +23,7 @@ - + diff --git a/demos/Lazarus/SimpleExternalPumpBrowser/uSimpleExternalPumpBrowser.lfm b/demos/Lazarus/SimpleExternalPumpBrowser/uSimpleExternalPumpBrowser.lfm index f7620039..972fbe03 100644 --- a/demos/Lazarus/SimpleExternalPumpBrowser/uSimpleExternalPumpBrowser.lfm +++ b/demos/Lazarus/SimpleExternalPumpBrowser/uSimpleExternalPumpBrowser.lfm @@ -14,7 +14,7 @@ object SimpleExternalPumpBrowserFrm: TSimpleExternalPumpBrowserFrm OnCreate = FormCreate OnShow = FormShow Position = poScreenCenter - LCLVersion = '2.0.2.0' + LCLVersion = '2.0.4.0' object AddressPnl: TPanel Left = 0 Height = 21 diff --git a/demos/Lazarus/SimpleExternalPumpBrowser/uSimpleExternalPumpBrowser.pas b/demos/Lazarus/SimpleExternalPumpBrowser/uSimpleExternalPumpBrowser.pas index 9ec8f989..d50e9f4b 100644 --- a/demos/Lazarus/SimpleExternalPumpBrowser/uSimpleExternalPumpBrowser.pas +++ b/demos/Lazarus/SimpleExternalPumpBrowser/uSimpleExternalPumpBrowser.pas @@ -119,7 +119,6 @@ begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.ExternalMessagePump := True; GlobalCEFApp.MultiThreadedMessageLoop := False; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; GlobalCEFApp.OnScheduleMessagePumpWork := GlobalCEFApp_OnScheduleMessagePumpWork; end; diff --git a/demos/Lazarus/SimpleOSRBrowser/SimpleOSRBrowser.lps b/demos/Lazarus/SimpleOSRBrowser/SimpleOSRBrowser.lps index 0e60970a..9445c423 100644 --- a/demos/Lazarus/SimpleOSRBrowser/SimpleOSRBrowser.lps +++ b/demos/Lazarus/SimpleOSRBrowser/SimpleOSRBrowser.lps @@ -39,10 +39,10 @@ - + - + diff --git a/demos/Lazarus/SimpleOSRBrowser/usimplelazosrbrowser.lfm b/demos/Lazarus/SimpleOSRBrowser/usimplelazosrbrowser.lfm index 6c895808..7961e768 100644 --- a/demos/Lazarus/SimpleOSRBrowser/usimplelazosrbrowser.lfm +++ b/demos/Lazarus/SimpleOSRBrowser/usimplelazosrbrowser.lfm @@ -16,7 +16,7 @@ object Form1: TForm1 OnHide = FormHide OnShow = FormShow Position = poScreenCenter - LCLVersion = '2.0.2.0' + LCLVersion = '2.0.4.0' object NavControlPnl: TPanel Left = 0 Height = 21 diff --git a/demos/Lazarus/SimpleOSRBrowser/usimplelazosrbrowser.pas b/demos/Lazarus/SimpleOSRBrowser/usimplelazosrbrowser.pas index 84f6a9a7..6bbf00b1 100644 --- a/demos/Lazarus/SimpleOSRBrowser/usimplelazosrbrowser.pas +++ b/demos/Lazarus/SimpleOSRBrowser/usimplelazosrbrowser.pas @@ -175,7 +175,6 @@ begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.WindowlessRenderingEnabled := True; GlobalCEFApp.EnableHighDPISupport := True; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; end; procedure TForm1.GoBtnClick(Sender: TObject); diff --git a/demos/Lazarus/SimpleServer/SimpleServer.lps b/demos/Lazarus/SimpleServer/SimpleServer.lps index 3d002d06..37284496 100644 --- a/demos/Lazarus/SimpleServer/SimpleServer.lps +++ b/demos/Lazarus/SimpleServer/SimpleServer.lps @@ -8,8 +8,7 @@ - - + @@ -20,9 +19,10 @@ + - - + + diff --git a/demos/Lazarus/SimpleServer/uSimpleServer.lfm b/demos/Lazarus/SimpleServer/uSimpleServer.lfm index 0445eac4..e31ae509 100644 --- a/demos/Lazarus/SimpleServer/uSimpleServer.lfm +++ b/demos/Lazarus/SimpleServer/uSimpleServer.lfm @@ -15,7 +15,7 @@ object SimpleServerFrm: TSimpleServerFrm OnCloseQuery = FormCloseQuery OnCreate = FormCreate Position = poScreenCenter - LCLVersion = '2.0.2.0' + LCLVersion = '2.0.4.0' object ButtonPnl: TPanel Left = 0 Height = 94 diff --git a/demos/Lazarus/SimpleServer/uSimpleServer.pas b/demos/Lazarus/SimpleServer/uSimpleServer.pas index a30aed12..95645e2b 100644 --- a/demos/Lazarus/SimpleServer/uSimpleServer.pas +++ b/demos/Lazarus/SimpleServer/uSimpleServer.pas @@ -197,37 +197,55 @@ end; procedure TSimpleServerFrm.ShowPostDataInfo(const aPostData : ICefPostData); var - i, j : integer; + i : integer; TempLen : NativeUInt; - TempList : IInterfaceList; - TempElement : ICefPostDataElement; TempBytes : TBytes; + TempArray : TCefPostDataElementArray; begin - if (aPostData = nil) then exit; + TempArray := nil; - i := 0; - j := aPostData.GetCount; - - TempList := aPostData.GetElements(j); - - while (i < j) do - begin - TempElement := TempList.Items[i] as ICefPostDataElement; - - if (TempElement.GetBytesCount > 0) then + try + try + if (aPostData <> nil) and (aPostData.GetElementCount > 0) then begin - SetLength(TempBytes, TempElement.GetBytesCount); - TempLen := TempElement.GetBytes(TempElement.GetBytesCount, @TempBytes[0]); + aPostData.GetElements(aPostData.GetElementCount, TempArray); - if (TempLen > 0) then + i := 0; + while (i < length(TempArray)) do begin - ConnectionLogMem.Lines.Add('Post contents length : ' + inttostr(TempLen)); - ConnectionLogMem.Lines.Add('Post contents sample : ' + BufferToString(TempBytes)); + if (TempArray[i].GetBytesCount > 0) then + begin + SetLength(TempBytes, TempArray[i].GetBytesCount); + TempLen := TempArray[i].GetBytes(TempArray[i].GetBytesCount, @TempBytes[0]); + + if (TempLen > 0) then + begin + ConnectionLogMem.Lines.Add('Post contents length : ' + inttostr(TempLen)); + ConnectionLogMem.Lines.Add('Post contents sample : ' + BufferToString(TempBytes)); + end; + end; + + inc(i); + end; + + i := 0; + while (i < length(TempArray)) do + begin + TempArray[i] := nil; + inc(i); end; end; - - inc(i); + except + on e : exception do + if CustomExceptionHandler('TSimpleServerFrm.ShowPostDataInfo', e) then raise; end; + finally + if (TempArray <> nil) then + begin + Finalize(TempArray); + TempArray := nil; + end; + end; end; function TSimpleServerFrm.BufferToString(const aBuffer : TBytes) : string; diff --git a/demos/Lazarus/SubProcess/SimpleBrowser.lps b/demos/Lazarus/SubProcess/SimpleBrowser.lps index 86976546..0307073e 100644 --- a/demos/Lazarus/SubProcess/SimpleBrowser.lps +++ b/demos/Lazarus/SubProcess/SimpleBrowser.lps @@ -8,7 +8,6 @@ - @@ -32,9 +31,10 @@ + - + diff --git a/demos/Lazarus/SubProcess/SubProcess.lpr b/demos/Lazarus/SubProcess/SubProcess.lpr index 0efffaae..25ecf195 100644 --- a/demos/Lazarus/SubProcess/SubProcess.lpr +++ b/demos/Lazarus/SubProcess/SubProcess.lpr @@ -51,7 +51,6 @@ uses begin GlobalCEFApp := TCefApplication.Create; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; // The main process and the subprocess *MUST* have the same GlobalCEFApp // properties and events, specially FrameworkDirPath, ResourcesDirPath, diff --git a/demos/Lazarus/SubProcess/SubProcess.lps b/demos/Lazarus/SubProcess/SubProcess.lps index f74a68ca..3f2a5f57 100644 --- a/demos/Lazarus/SubProcess/SubProcess.lps +++ b/demos/Lazarus/SubProcess/SubProcess.lps @@ -10,7 +10,7 @@ - + diff --git a/demos/Lazarus/SubProcess/uCEFLoader.pas b/demos/Lazarus/SubProcess/uCEFLoader.pas index 42998641..1e579091 100644 --- a/demos/Lazarus/SubProcess/uCEFLoader.pas +++ b/demos/Lazarus/SubProcess/uCEFLoader.pas @@ -65,7 +65,6 @@ begin GlobalCEFApp.UserDataPath := 'cef\User Data'; } - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; GlobalCEFApp.BrowserSubprocessPath := 'SubProcess.exe'; // This demo uses a different EXE for the subprocesses. diff --git a/demos/Lazarus/TabbedBrowser/TabBrowser.lps b/demos/Lazarus/TabbedBrowser/TabBrowser.lps index 37aa1dac..b2161791 100644 --- a/demos/Lazarus/TabbedBrowser/TabBrowser.lps +++ b/demos/Lazarus/TabbedBrowser/TabBrowser.lps @@ -23,7 +23,7 @@ - + diff --git a/demos/Lazarus/TabbedBrowser/uMainForm.lfm b/demos/Lazarus/TabbedBrowser/uMainForm.lfm index 857e9b14..f8052216 100644 --- a/demos/Lazarus/TabbedBrowser/uMainForm.lfm +++ b/demos/Lazarus/TabbedBrowser/uMainForm.lfm @@ -14,7 +14,7 @@ object MainForm: TMainForm OnCreate = FormCreate OnShow = FormShow Position = poScreenCenter - LCLVersion = '2.0.2.0' + LCLVersion = '2.0.4.0' object ButtonPnl: TPanel Left = 0 Height = 25 diff --git a/demos/Lazarus/TabbedBrowser/uMainForm.pas b/demos/Lazarus/TabbedBrowser/uMainForm.pas index 2fb1f955..fac381fb 100644 --- a/demos/Lazarus/TabbedBrowser/uMainForm.pas +++ b/demos/Lazarus/TabbedBrowser/uMainForm.pas @@ -156,7 +156,6 @@ procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.OnContextInitialized := GlobalCEFApp_OnContextInitialized; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; end; procedure TMainForm.AddTabBtnClick(Sender: TObject); diff --git a/demos/Lazarus/ToolBoxBrowser/ToolBoxBrowser.lps b/demos/Lazarus/ToolBoxBrowser/ToolBoxBrowser.lps index 50630515..4e414527 100644 --- a/demos/Lazarus/ToolBoxBrowser/ToolBoxBrowser.lps +++ b/demos/Lazarus/ToolBoxBrowser/ToolBoxBrowser.lps @@ -23,7 +23,7 @@ - + diff --git a/demos/Lazarus/ToolBoxBrowser/uChildForm.lfm b/demos/Lazarus/ToolBoxBrowser/uChildForm.lfm index 88d5d25d..d2531f6c 100644 --- a/demos/Lazarus/ToolBoxBrowser/uChildForm.lfm +++ b/demos/Lazarus/ToolBoxBrowser/uChildForm.lfm @@ -1,7 +1,7 @@ object ChildForm: TChildForm - Left = 0 + Left = 577 Height = 394 - Top = 0 + Top = 408 Width = 602 BorderStyle = bsToolWindow Caption = 'Browser' @@ -18,7 +18,7 @@ object ChildForm: TChildForm OnShow = FormShow Position = poScreenCenter ShowInTaskBar = stAlways - LCLVersion = '2.0.2.0' + LCLVersion = '2.0.4.0' object CEFWindowParent1: TCEFWindowParent Left = 0 Height = 394 diff --git a/demos/Lazarus/ToolBoxBrowser/uMainForm.lfm b/demos/Lazarus/ToolBoxBrowser/uMainForm.lfm index c8ffb9b5..e8bdaccc 100644 --- a/demos/Lazarus/ToolBoxBrowser/uMainForm.lfm +++ b/demos/Lazarus/ToolBoxBrowser/uMainForm.lfm @@ -15,7 +15,7 @@ object MainForm: TMainForm OnCreate = FormCreate OnShow = FormShow Position = poScreenCenter - LCLVersion = '2.0.2.0' + LCLVersion = '2.0.4.0' object ButtonPnl: TPanel Left = 0 Height = 37 diff --git a/demos/Lazarus/ToolBoxBrowser/uMainForm.pas b/demos/Lazarus/ToolBoxBrowser/uMainForm.pas index a4080729..15c02bec 100644 --- a/demos/Lazarus/ToolBoxBrowser/uMainForm.pas +++ b/demos/Lazarus/ToolBoxBrowser/uMainForm.pas @@ -114,7 +114,6 @@ procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.OnContextInitialized := GlobalCEFApp_OnContextInitialized; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; end; procedure TMainForm.CreateToolboxChild(const ChildCaption, URL: string); diff --git a/demos/Lazarus/URLRequest/URLRequest.lps b/demos/Lazarus/URLRequest/URLRequest.lps index e360aabb..8cf3d075 100644 --- a/demos/Lazarus/URLRequest/URLRequest.lps +++ b/demos/Lazarus/URLRequest/URLRequest.lps @@ -4,11 +4,10 @@ - + - @@ -21,17 +20,31 @@ + + + + + + + + + + - + + + + + diff --git a/demos/Lazarus/URLRequest/uURLRequest.pas b/demos/Lazarus/URLRequest/uURLRequest.pas index d20aa0c2..77c92c93 100644 --- a/demos/Lazarus/URLRequest/uURLRequest.pas +++ b/demos/Lazarus/URLRequest/uURLRequest.pas @@ -144,7 +144,8 @@ uses procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; - GlobalCEFApp.DisableFeatures := 'NetworkService,OutOfBlinkCors'; + //GlobalCEFApp.LogFile := 'cef.log'; + //GlobalCEFApp.LogSeverity := LOGSEVERITY_VERBOSE; end; procedure TURLRequestFrm.DownloadBtnClick(Sender: TObject); diff --git a/packages/CEF4Delphi.dpk b/packages/CEF4Delphi.dpk index d0a1f037..cb305eec 100644 --- a/packages/CEF4Delphi.dpk +++ b/packages/CEF4Delphi.dpk @@ -168,7 +168,6 @@ contains uCEFUrlRequestClientEvents in '..\source\uCEFUrlRequestClientEvents.pas', uCEFUrlRequestClientComponent in '..\source\uCEFUrlRequestClientComponent.pas', uCEFOSRIMEHandler in '..\source\uCEFOSRIMEHandler.pas', - uCEFAudioHandler in '..\source\uCEFAudioHandler.pas', uCEFCookieAccessFilter in '..\source\uCEFCookieAccessFilter.pas', uCEFResourceRequestHandler in '..\source\uCEFResourceRequestHandler.pas', uCEFResourceSkipCallback in '..\source\uCEFResourceSkipCallback.pas', diff --git a/packages/CEF4Delphi.dproj b/packages/CEF4Delphi.dproj index 94e966b8..0f4af41b 100644 --- a/packages/CEF4Delphi.dproj +++ b/packages/CEF4Delphi.dproj @@ -262,7 +262,10 @@ - + + + + Base @@ -298,7 +301,7 @@ - + CEF4Delphi.bpl true diff --git a/packages/CEF4Delphi_D7.dpk b/packages/CEF4Delphi_D7.dpk index 0dc73f13..1a74394a 100644 --- a/packages/CEF4Delphi_D7.dpk +++ b/packages/CEF4Delphi_D7.dpk @@ -165,7 +165,6 @@ contains uCEFUrlRequestClientEvents in '..\source\uCEFUrlRequestClientEvents.pas', uCEFUrlRequestClientComponent in '..\source\uCEFUrlRequestClientComponent.pas', uCEFOSRIMEHandler in '..\source\uCEFOSRIMEHandler.pas', - uCEFAudioHandler in '..\source\uCEFAudioHandler.pas', uCEFCookieAccessFilter in '..\source\uCEFCookieAccessFilter.pas', uCEFResourceRequestHandler in '..\source\uCEFResourceRequestHandler.pas', uCEFResourceSkipCallback in '..\source\uCEFResourceSkipCallback.pas', diff --git a/packages/CEF4Delphi_FMX.dpk b/packages/CEF4Delphi_FMX.dpk index 9c75bbbf..4739aad5 100644 --- a/packages/CEF4Delphi_FMX.dpk +++ b/packages/CEF4Delphi_FMX.dpk @@ -173,7 +173,6 @@ contains uCEFUrlRequestClientEvents in '..\source\uCEFUrlRequestClientEvents.pas', uCEFUrlRequestClientComponent in '..\source\uCEFUrlRequestClientComponent.pas', uCEFOSRIMEHandler in '..\source\uCEFOSRIMEHandler.pas', - uCEFAudioHandler in '..\source\uCEFAudioHandler.pas', uCEFCookieAccessFilter in '..\source\uCEFCookieAccessFilter.pas', uCEFResourceRequestHandler in '..\source\uCEFResourceRequestHandler.pas', uCEFResourceSkipCallback in '..\source\uCEFResourceSkipCallback.pas', diff --git a/packages/CEF4Delphi_FMX.dproj b/packages/CEF4Delphi_FMX.dproj index 39b3285b..1d9e5434 100644 --- a/packages/CEF4Delphi_FMX.dproj +++ b/packages/CEF4Delphi_FMX.dproj @@ -288,7 +288,6 @@ - @@ -330,7 +329,7 @@ - + CEF4Delphi_FMX.bpl true diff --git a/packages/cef4delphi_lazarus.lpk b/packages/cef4delphi_lazarus.lpk index 7c0e1499..fcfc8224 100644 --- a/packages/cef4delphi_lazarus.lpk +++ b/packages/cef4delphi_lazarus.lpk @@ -21,8 +21,8 @@ - - + + @@ -584,25 +584,21 @@ - - - - - - + + - - + + - - + + - + diff --git a/packages/cef4delphi_lazarus.pas b/packages/cef4delphi_lazarus.pas index a90ee1f8..7c8912e9 100644 --- a/packages/cef4delphi_lazarus.pas +++ b/packages/cef4delphi_lazarus.pas @@ -47,9 +47,9 @@ uses uCEFZipReader, uCEFChromium, uCEFBufferPanel, uCEFServer, uCEFServerComponent, uCEFServerEvents, uCEFServerHandler, uCEFWinControl, uCEFLinkedWindowParent, uCEFUrlRequestClientEvents, - uCEFUrlRequestClientComponent, uCEFOSRIMEHandler, uCEFAudioHandler, - uCEFCookieAccessFilter, uCEFResourceReadCallback, - uCEFResourceRequestHandler, uCEFResourceSkipCallback, LazarusPackageIntf; + uCEFUrlRequestClientComponent, uCEFOSRIMEHandler, uCEFCookieAccessFilter, + uCEFResourceReadCallback, uCEFResourceRequestHandler, + uCEFResourceSkipCallback, LazarusPackageIntf; implementation diff --git a/source/uCEFApplication.pas b/source/uCEFApplication.pas index 810b1b49..91067d5e 100644 --- a/source/uCEFApplication.pas +++ b/source/uCEFApplication.pas @@ -60,15 +60,15 @@ uses uCEFTypes, uCEFInterfaces, uCEFBaseRefCounted, uCEFSchemeRegistrar; const - CEF_SUPPORTED_VERSION_MAJOR = 76; + CEF_SUPPORTED_VERSION_MAJOR = 77; CEF_SUPPORTED_VERSION_MINOR = 1; - CEF_SUPPORTED_VERSION_RELEASE = 13; + CEF_SUPPORTED_VERSION_RELEASE = 3; CEF_SUPPORTED_VERSION_BUILD = 0; - CEF_CHROMEELF_VERSION_MAJOR = 76; + CEF_CHROMEELF_VERSION_MAJOR = 77; CEF_CHROMEELF_VERSION_MINOR = 0; - CEF_CHROMEELF_VERSION_RELEASE = 3809; - CEF_CHROMEELF_VERSION_BUILD = 132; + CEF_CHROMEELF_VERSION_RELEASE = 3865; + CEF_CHROMEELF_VERSION_BUILD = 90; {$IFDEF MSWINDOWS} LIBCEF_DLL = 'libcef.dll'; @@ -182,7 +182,7 @@ type FEnableProfanityFilter : boolean; FDisableSpellChecking : boolean; FOverrideSpellCheckLang : string; - //FEnablePrintPreview : boolean; + FEnablePrintPreview : boolean; FMustCreateResourceBundleHandler : boolean; FMustCreateBrowserProcessHandler : boolean; @@ -441,7 +441,7 @@ type property MetricsRecordingOnly : boolean read FMetricsRecordingOnly write FMetricsRecordingOnly; property AllowFileAccessFromFiles : boolean read FAllowFileAccessFromFiles write FAllowFileAccessFromFiles; property AllowRunningInsecureContent : boolean read FAllowRunningInsecureContent write FAllowRunningInsecureContent; - //property EnablePrintPreview : boolean read FEnablePrintPreview write FEnablePrintPreview; + property EnablePrintPreview : boolean read FEnablePrintPreview write FEnablePrintPreview; property PluginPolicy : TCefPluginPolicySwitch read FPluginPolicy write FPluginPolicy; property DefaultEncoding : string read FDefaultEncoding write FDefaultEncoding; property DisableJavascript : boolean read FDisableJavascript write FDisableJavascript; @@ -634,7 +634,7 @@ begin FEnableProfanityFilter := False; FDisableSpellChecking := False; FOverrideSpellCheckLang := ''; - //FEnablePrintPreview := False; + FEnablePrintPreview := False; FMustCreateResourceBundleHandler := False; FMustCreateBrowserProcessHandler := True; @@ -1601,7 +1601,7 @@ begin if FAllowRunningInsecureContent then commandLine.AppendSwitch('--allow-running-insecure-content'); - //if FEnablePrintPreview then commandLine.AppendSwitch('--enable-print-preview'); + if FEnablePrintPreview then commandLine.AppendSwitch('--enable-print-preview'); case FPluginPolicy of PLUGIN_POLICY_SWITCH_DETECT : commandLine.AppendSwitchWithValue('--plugin-policy', 'detect'); diff --git a/source/uCEFChromium.pas b/source/uCEFChromium.pas index 8fa9b820..873ec0e1 100644 --- a/source/uCEFChromium.pas +++ b/source/uCEFChromium.pas @@ -234,11 +234,6 @@ type // ICefFindHandler FOnFindResult : TOnFindResult; - // ICefAudioHandler - FOnAudioStreamStarted : TOnAudioStreamStarted; - FOnAudioStreamPacket : TOnAudioStreamPacket; - FOnAudioStreamStopped : TOnAudioStreamStopped; - // Custom FOnTextResultAvailable : TOnTextResultAvailableEvent; FOnPdfPrintFinished : TOnPdfPrintFinishedEvent; @@ -474,12 +469,7 @@ type // ICefFindHandler procedure doOnFindResult(const browser: ICefBrowser; identifier, count: Integer; const selectionRect: PCefRect; activeMatchOrdinal: Integer; finalUpdate: Boolean); virtual; - // ICefAudioHandler - procedure doOnAudioStreamStarted(const browser: ICefBrowser; audio_stream_id, channels: integer; channel_layout: TCefChannelLayout; sample_rate, frames_per_buffer: integer); virtual; - procedure doOnAudioStreamPacket(const browser: ICefBrowser; audio_stream_id: integer; const data : PPSingle; frames: integer; pts: int64); virtual; - procedure doOnAudioStreamStopped(const browser: ICefBrowser; audio_stream_id: integer); virtual; - - // Custom + // Custom procedure doCookiesDeleted(numDeleted : integer); virtual; procedure doPdfPrintFinished(aResultOK : boolean); virtual; procedure doTextResultAvailable(const aText : ustring); virtual; @@ -503,8 +493,7 @@ type function MustCreateRequestHandler : boolean; virtual; function MustCreateDragHandler : boolean; virtual; function MustCreateFindHandler : boolean; virtual; - function MustCreateAudioHandler : boolean; virtual; - function MustCreateResourceRequestHandler : boolean; virtual; + function MustCreateResourceRequestHandler : boolean; virtual; function MustCreateCookieAccessFilter : boolean; virtual; public @@ -806,12 +795,6 @@ type // ICefFindHandler property OnFindResult : TOnFindResult read FOnFindResult write FOnFindResult; - - // ICefAudioHandler - property OnAudioStreamStarted : TOnAudioStreamStarted read FOnAudioStreamStarted write FOnAudioStreamStarted; - property OnAudioStreamPacket : TOnAudioStreamPacket read FOnAudioStreamPacket write FOnAudioStreamPacket; - property OnAudioStreamStopped : TOnAudioStreamStopped read FOnAudioStreamStopped write FOnAudioStreamStopped; - end; {$IFDEF FPC} @@ -1162,11 +1145,6 @@ begin // ICefFindHandler FOnFindResult := nil; - // ICefAudioHandler - FOnAudioStreamStarted := nil; - FOnAudioStreamPacket := nil; - FOnAudioStreamStopped := nil; - // Custom FOnTextResultAvailable := nil; FOnPdfPrintFinished := nil; @@ -3148,14 +3126,7 @@ begin Result := assigned(FOnFindResult); end; -function TChromium.MustCreateAudioHandler : boolean; -begin - Result := assigned(FOnAudioStreamStarted) or - assigned(FOnAudioStreamPacket) or - assigned(FOnAudioStreamStopped); -end; - -function TChromium.MustCreateResourceRequestHandler : boolean; +function TChromium.MustCreateResourceRequestHandler : boolean; begin Result := assigned(FOnBeforeResourceLoad) or assigned(FOnGetResourceHandler) or @@ -3671,34 +3642,6 @@ begin FOnFindResult(Self, browser, identifier, count, selectionRect, activeMatchOrdinal, finalUpdate); end; -procedure TChromium.doOnAudioStreamStarted(const browser : ICefBrowser; - audio_stream_id : integer; - channels : integer; - channel_layout : TCefChannelLayout; - sample_rate : integer; - frames_per_buffer : integer); -begin - if Assigned(FOnAudioStreamStarted) then - FOnAudioStreamStarted(Self, browser, audio_stream_id, channels, channel_layout, sample_rate, frames_per_buffer); -end; - -procedure TChromium.doOnAudioStreamPacket(const browser : ICefBrowser; - audio_stream_id : integer; - const data : PPSingle; - frames : integer; - pts : int64); -begin - if Assigned(FOnAudioStreamPacket) then - FOnAudioStreamPacket(Self, browser, audio_stream_id, data, frames, pts); -end; - -procedure TChromium.doOnAudioStreamStopped(const browser : ICefBrowser; - audio_stream_id : integer); -begin - if Assigned(FOnAudioStreamStopped) then - FOnAudioStreamStopped(Self, browser, audio_stream_id); -end; - procedure TChromium.doOnFullScreenModeChange(const browser: ICefBrowser; fullscreen: Boolean); begin if Assigned(FOnFullScreenModeChange) then FOnFullScreenModeChange(Self, browser, fullscreen); diff --git a/source/uCEFChromiumEvents.pas b/source/uCEFChromiumEvents.pas index 71adf274..d625ef18 100644 --- a/source/uCEFChromiumEvents.pas +++ b/source/uCEFChromiumEvents.pas @@ -161,11 +161,6 @@ type // ICefFindHandler TOnFindResult = procedure(Sender: TObject; const browser: ICefBrowser; identifier, count: Integer; const selectionRect: PCefRect; activeMatchOrdinal: Integer; finalUpdate: Boolean) of Object; - // ICefAudioHandler - TOnAudioStreamStarted = procedure(Sender: TObject; const browser: ICefBrowser; audio_stream_id, channels: integer; channel_layout: TCefChannelLayout; sample_rate, frames_per_buffer: integer) of Object; - TOnAudioStreamPacket = procedure(Sender: TObject; const browser: ICefBrowser; audio_stream_id: integer; const data : PPSingle; frames: integer; pts: int64) of Object; - TOnAudioStreamStopped = procedure(Sender: TObject; const browser: ICefBrowser; audio_stream_id: integer) of Object; - // Custom TOnTextResultAvailableEvent = procedure(Sender: TObject; const aText : ustring) of object; TOnPdfPrintFinishedEvent = procedure(Sender: TObject; aResultOK : boolean) of object; diff --git a/source/uCEFClient.pas b/source/uCEFClient.pas index f6802fae..44792921 100644 --- a/source/uCEFClient.pas +++ b/source/uCEFClient.pas @@ -54,7 +54,6 @@ uses type TCefClientRef = class(TCefBaseRefCountedRef, ICefClient) protected - procedure GetAudioHandler(var aHandler : ICefAudioHandler); virtual; procedure GetContextMenuHandler(var aHandler : ICefContextMenuHandler); virtual; procedure GetDialogHandler(var aHandler : ICefDialogHandler); virtual; procedure GetDisplayHandler(var aHandler : ICefDisplayHandler); virtual; @@ -78,7 +77,6 @@ type TCefClientOwn = class(TCefBaseRefCountedOwn, ICefClient) protected - procedure GetAudioHandler(var aHandler : ICefAudioHandler); virtual; procedure GetContextMenuHandler(var aHandler : ICefContextMenuHandler); virtual; procedure GetDialogHandler(var aHandler : ICefDialogHandler); virtual; procedure GetDisplayHandler(var aHandler : ICefDisplayHandler); virtual; @@ -116,9 +114,7 @@ type FRequestHandler : ICefRequestHandler; FDragHandler : ICefDragHandler; FFindHandler : ICefFindHandler; - FAudioHandler : ICefAudioHandler; - procedure GetAudioHandler(var aHandler : ICefAudioHandler); override; procedure GetContextMenuHandler(var aHandler : ICefContextMenuHandler); override; procedure GetDialogHandler(var aHandler : ICefDialogHandler); override; procedure GetDisplayHandler(var aHandler : ICefDisplayHandler); override; @@ -154,7 +150,7 @@ uses uCEFFocusHandler, uCEFContextMenuHandler, uCEFDialogHandler, uCEFKeyboardHandler, uCEFDisplayHandler, uCEFDownloadHandler, uCEFJsDialogHandler, uCEFLifeSpanHandler, uCEFRequestHandler, uCEFRenderHandler, uCEFDragHandler, - uCEFFindHandler, uCEFAudioHandler, uCEFConstants, uCEFApplication, uCEFFrame; + uCEFFindHandler, uCEFConstants, uCEFApplication, uCEFFrame; // ****************************************************** @@ -169,11 +165,6 @@ begin Result := nil; end; -procedure TCefClientRef.GetAudioHandler(var aHandler : ICefAudioHandler); -begin - aHandler := nil; -end; - procedure TCefClientRef.GetContextMenuHandler(var aHandler : ICefContextMenuHandler); begin aHandler := nil; @@ -255,23 +246,6 @@ end; // ****************************************************** -function cef_client_own_get_audio_handler(self: PCefClient): PCefAudioHandler; stdcall; -var - TempObject : TObject; - TempHandler : ICefAudioHandler; -begin - Result := nil; - TempObject := CefGetObject(self); - - if (TempObject <> nil) and (TempObject is TCefClientOwn) then - try - TCefClientOwn(TempObject).GetAudioHandler(TempHandler); - if (TempHandler <> nil) then Result := TempHandler.Wrap; - finally - TempHandler := nil; - end; -end; - function cef_client_own_get_context_menu_handler(self: PCefClient): PCefContextMenuHandler; stdcall; var TempObject : TObject; @@ -517,7 +491,6 @@ begin with PCefClient(FData)^ do begin - get_audio_handler := {$IFDEF FPC}@{$ENDIF}cef_client_own_get_audio_handler; get_context_menu_handler := {$IFDEF FPC}@{$ENDIF}cef_client_own_get_context_menu_handler; get_dialog_handler := {$IFDEF FPC}@{$ENDIF}cef_client_own_get_dialog_handler; get_display_handler := {$IFDEF FPC}@{$ENDIF}cef_client_own_get_display_handler; @@ -535,11 +508,6 @@ begin end; end; -procedure TCefClientOwn.GetAudioHandler(var aHandler : ICefAudioHandler); -begin - aHandler := nil; -end; - procedure TCefClientOwn.GetContextMenuHandler(var aHandler : ICefContextMenuHandler); begin aHandler := nil; @@ -653,7 +621,6 @@ begin if events.MustCreateRequestHandler then FRequestHandler := TCustomRequestHandler.Create(events); if events.MustCreateDragHandler then FDragHandler := TCustomDragHandler.Create(events); if events.MustCreateFindHandler then FFindHandler := TCustomFindHandler.Create(events); - if events.MustCreateAudioHandler then FAudioHandler := TCustomAudioHandler.Create(events); end; end; end; @@ -682,7 +649,6 @@ begin if (FRenderHandler <> nil) then FRenderHandler.RemoveReferences; if (FDragHandler <> nil) then FDragHandler.RemoveReferences; if (FFindHandler <> nil) then FFindHandler.RemoveReferences; - if (FAudioHandler <> nil) then FAudioHandler.RemoveReferences; end; procedure TCustomClientHandler.InitializeVars; @@ -700,18 +666,9 @@ begin FRenderHandler := nil; FDragHandler := nil; FFindHandler := nil; - FAudioHandler := nil; FEvents := nil; end; -procedure TCustomClientHandler.GetAudioHandler(var aHandler : ICefAudioHandler); -begin - if (FAudioHandler <> nil) then - aHandler := FAudioHandler - else - aHandler := nil; -end; - procedure TCustomClientHandler.GetContextMenuHandler(var aHandler : ICefContextMenuHandler); begin if (FContextMenuHandler <> nil) then diff --git a/source/uCEFFMXChromium.pas b/source/uCEFFMXChromium.pas index 3c843f02..1fdb7b00 100644 --- a/source/uCEFFMXChromium.pas +++ b/source/uCEFFMXChromium.pas @@ -218,11 +218,6 @@ type // ICefFindHandler FOnFindResult : TOnFindResult; - // ICefAudioHandler - FOnAudioStreamStarted : TOnAudioStreamStarted; - FOnAudioStreamPacket : TOnAudioStreamPacket; - FOnAudioStreamStopped : TOnAudioStreamStopped; - // Custom FOnTextResultAvailable : TOnTextResultAvailableEvent; FOnPdfPrintFinished : TOnPdfPrintFinishedEvent; @@ -441,11 +436,6 @@ type // ICefFindHandler procedure doOnFindResult(const browser: ICefBrowser; identifier, count: Integer; const selectionRect: PCefRect; activeMatchOrdinal: Integer; finalUpdate: Boolean); virtual; - // ICefAudioHandler - procedure doOnAudioStreamStarted(const browser: ICefBrowser; audio_stream_id, channels: integer; channel_layout: TCefChannelLayout; sample_rate, frames_per_buffer: integer); virtual; - procedure doOnAudioStreamPacket(const browser: ICefBrowser; audio_stream_id: integer; const data : PPSingle; frames: integer; pts: int64); virtual; - procedure doOnAudioStreamStopped(const browser: ICefBrowser; audio_stream_id: integer); virtual; - // Custom procedure doCookiesDeleted(numDeleted : integer); virtual; procedure doPdfPrintFinished(aResultOK : boolean); virtual; @@ -470,7 +460,6 @@ type function MustCreateRequestHandler : boolean; virtual; function MustCreateDragHandler : boolean; virtual; function MustCreateFindHandler : boolean; virtual; - function MustCreateAudioHandler : boolean; virtual; function MustCreateResourceRequestHandler : boolean; virtual; function MustCreateCookieAccessFilter : boolean; virtual; @@ -763,12 +752,6 @@ type // ICefFindHandler property OnFindResult : TOnFindResult read FOnFindResult write FOnFindResult; - - // ICefAudioHandler - property OnAudioStreamStarted : TOnAudioStreamStarted read FOnAudioStreamStarted write FOnAudioStreamStarted; - property OnAudioStreamPacket : TOnAudioStreamPacket read FOnAudioStreamPacket write FOnAudioStreamPacket; - property OnAudioStreamStopped : TOnAudioStreamStopped read FOnAudioStreamStopped write FOnAudioStreamStopped; - end; implementation @@ -1067,11 +1050,6 @@ begin // ICefFindHandler FOnFindResult := nil; - // ICefAudioHandler - FOnAudioStreamStarted := nil; - FOnAudioStreamPacket := nil; - FOnAudioStreamStopped := nil; - // Custom FOnTextResultAvailable := nil; FOnPdfPrintFinished := nil; @@ -2867,13 +2845,6 @@ begin Result := assigned(FOnFindResult); end; -function TFMXChromium.MustCreateAudioHandler : boolean; -begin - Result := assigned(FOnAudioStreamStarted) or - assigned(FOnAudioStreamPacket) or - assigned(FOnAudioStreamStopped); -end; - function TFMXChromium.MustCreateResourceRequestHandler : boolean; begin Result := assigned(FOnBeforeResourceLoad) or @@ -3278,34 +3249,6 @@ begin FOnFindResult(Self, browser, identifier, count, selectionRect, activeMatchOrdinal, finalUpdate); end; -procedure TFMXChromium.doOnAudioStreamStarted(const browser : ICefBrowser; - audio_stream_id : integer; - channels : integer; - channel_layout : TCefChannelLayout; - sample_rate : integer; - frames_per_buffer : integer); -begin - if Assigned(FOnAudioStreamStarted) then - FOnAudioStreamStarted(Self, browser, audio_stream_id, channels, channel_layout, sample_rate, frames_per_buffer); -end; - -procedure TFMXChromium.doOnAudioStreamPacket(const browser : ICefBrowser; - audio_stream_id : integer; - const data : PPSingle; - frames : integer; - pts : int64); -begin - if Assigned(FOnAudioStreamPacket) then - FOnAudioStreamPacket(Self, browser, audio_stream_id, data, frames, pts); -end; - -procedure TFMXChromium.doOnAudioStreamStopped(const browser : ICefBrowser; - audio_stream_id : integer); -begin - if Assigned(FOnAudioStreamStopped) then - FOnAudioStreamStopped(Self, browser, audio_stream_id); -end; - procedure TFMXChromium.doOnFullScreenModeChange(const browser: ICefBrowser; fullscreen: Boolean); begin if Assigned(FOnFullScreenModeChange) then FOnFullScreenModeChange(Self, browser, fullscreen); diff --git a/source/uCEFInterfaces.pas b/source/uCEFInterfaces.pas index 22855673..14ead903 100644 --- a/source/uCEFInterfaces.pas +++ b/source/uCEFInterfaces.pas @@ -142,7 +142,6 @@ type ICefLabelButton = interface; ICefMenuButton = interface; ICefUrlRequest = interface; - ICefAudioHandler = interface; ICefPostDataElement = interface; TCefv8ValueArray = array of ICefv8Value; @@ -375,11 +374,6 @@ type // ICefFindHandler procedure doOnFindResult(const browser: ICefBrowser; identifier, count: Integer; const selectionRect: PCefRect; activeMatchOrdinal: Integer; finalUpdate: Boolean); - // ICefAudioHandler - procedure doOnAudioStreamStarted(const browser: ICefBrowser; audio_stream_id, channels: integer; channel_layout: TCefChannelLayout; sample_rate, frames_per_buffer: integer); - procedure doOnAudioStreamPacket(const browser: ICefBrowser; audio_stream_id: integer; const data : PPSingle; frames: integer; pts: int64); - procedure doOnAudioStreamStopped(const browser: ICefBrowser; audio_stream_id: integer); - // Custom procedure doCookiesDeleted(numDeleted : integer); procedure doPdfPrintFinished(aResultOK : boolean); @@ -404,7 +398,6 @@ type function MustCreateRequestHandler : boolean; function MustCreateDragHandler : boolean; function MustCreateFindHandler : boolean; - function MustCreateAudioHandler : boolean; function MustCreateResourceRequestHandler : boolean; function MustCreateCookieAccessFilter : boolean; end; @@ -1770,17 +1763,6 @@ type procedure RemoveReferences; // custom procedure to clear all references end; - // TCefAudioHandler - // /include/capi/cef_audio_handler_capi.h (cef_audio_handler_t) - ICefAudioHandler = interface(ICefBaseRefCounted) - ['{8963271A-0B94-4279-82C8-FB2EA7B3CDEC}'] - procedure OnAudioStreamStarted(const browser: ICefBrowser; audio_stream_id, channels: integer; channel_layout: TCefChannelLayout; sample_rate, frames_per_buffer: integer); - procedure OnAudioStreamPacket(const browser: ICefBrowser; audio_stream_id: integer; const data : PPSingle; frames: integer; pts: int64); - procedure OnAudioStreamStopped(const browser: ICefBrowser; audio_stream_id: integer); - - procedure RemoveReferences; // custom procedure to clear all references - end; - // TCefRunContextMenuCallback // /include/capi/cef_context_menu_handler_capi.h (cef_run_context_menu_callback_t) ICefRunContextMenuCallback = interface(ICefBaseRefCounted) @@ -1846,7 +1828,6 @@ type // /include/capi/cef_client_capi.h (cef_client_t) ICefClient = interface(ICefBaseRefCounted) ['{1D502075-2FF0-4E13-A112-9E541CD811F4}'] - procedure GetAudioHandler(var aHandler : ICefAudioHandler); procedure GetContextMenuHandler(var aHandler : ICefContextMenuHandler); procedure GetDialogHandler(var aHandler : ICefDialogHandler); procedure GetDisplayHandler(var aHandler : ICefDisplayHandler); diff --git a/source/uCEFTypes.pas b/source/uCEFTypes.pas index 4c312bcf..fa7a1378 100644 --- a/source/uCEFTypes.pas +++ b/source/uCEFTypes.pas @@ -133,7 +133,6 @@ type PCefLifeSpanHandler = ^TCefLifeSpanHandler; PCefGetExtensionResourceCallback = ^TCefGetExtensionResourceCallback; PCefExtensionHandler = ^TCefExtensionHandler; - PCefAudioHandler = ^TCefAudioHandler; PCefExtension = ^TCefExtension; PCefPopupFeatures = ^TCefPopupFeatures; PCefBrowserSettings = ^TCefBrowserSettings; @@ -666,43 +665,6 @@ type CEF_POINTER_TYPE_UNKNOWN ); - // /include/internal/cef_types.h (cef_channel_layout_t) - TCefChannelLayout = ( - CEF_CHANNEL_LAYOUT_NONE = 0, - CEF_CHANNEL_LAYOUT_UNSUPPORTED, - CEF_CHANNEL_LAYOUT_MONO, - CEF_CHANNEL_LAYOUT_STEREO, - CEF_CHANNEL_LAYOUT_2_1, - CEF_CHANNEL_LAYOUT_SURROUND, - CEF_CHANNEL_LAYOUT_4_0, - CEF_CHANNEL_LAYOUT_2_2, - CEF_CHANNEL_LAYOUT_QUAD, - CEF_CHANNEL_LAYOUT_5_0, - CEF_CHANNEL_LAYOUT_5_1, - CEF_CHANNEL_LAYOUT_5_0_BACK, - CEF_CHANNEL_LAYOUT_5_1_BACK, - CEF_CHANNEL_LAYOUT_7_0, - CEF_CHANNEL_LAYOUT_7_1, - CEF_CHANNEL_LAYOUT_7_1_WIDE, - CEF_CHANNEL_LAYOUT_STEREO_DOWNMIX, - CEF_CHANNEL_LAYOUT_2POINT1, - CEF_CHANNEL_LAYOUT_3_1, - CEF_CHANNEL_LAYOUT_4_1, - CEF_CHANNEL_LAYOUT_6_0, - CEF_CHANNEL_LAYOUT_6_0_FRONT, - CEF_CHANNEL_LAYOUT_HEXAGONAL, - CEF_CHANNEL_LAYOUT_6_1, - CEF_CHANNEL_LAYOUT_6_1_BACK, - CEF_CHANNEL_LAYOUT_6_1_FRONT, - CEF_CHANNEL_LAYOUT_7_0_FRONT, - CEF_CHANNEL_LAYOUT_7_1_WIDE_BACK, - CEF_CHANNEL_LAYOUT_OCTAGONAL, - CEF_CHANNEL_LAYOUT_DISCRETE, - CEF_CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC, - CEF_CHANNEL_LAYOUT_4_1_QUAD_SIDE, - CEF_CHANNEL_LAYOUT_BITSTREAM // CEF_CHANNEL_LAYOUT_MAX = CEF_CHANNEL_LAYOUT_BITSTREAM - ); - // /include/internal/cef_types.h (cef_paint_element_type_t) TCefPaintElementType = ( PET_VIEW, @@ -1488,14 +1450,6 @@ type get_extension_resource : function(self: PCefExtensionHandler; extension: PCefExtension; browser: PCefBrowser; const file_: PCefString; callback: PCefGetExtensionResourceCallback): Integer; stdcall; end; - // /include/capi/cef_audio_handler_capi.h (cef_audio_handler_t) - TCefAudioHandler = record - base : TCefBaseRefCounted; - on_audio_stream_started : procedure(self: PCefAudioHandler; browser: PCefBrowser; audio_stream_id, channels: integer; channel_layout: TCefChannelLayout; sample_rate, frames_per_buffer: integer); stdcall; - on_audio_stream_packet : procedure(self: PCefAudioHandler; browser: PCefBrowser; audio_stream_id: integer; const data : PPSingle; frames: integer; pts: int64); stdcall; - on_audio_stream_stopped : procedure(self: PCefAudioHandler; browser: PCefBrowser; audio_stream_id: integer); stdcall; - end; - // /include/capi/cef_extension_capi.h (cef_extension_t) TCefExtension = record base : TCefBaseRefCounted; @@ -2640,7 +2594,6 @@ type // /include/capi/cef_client_capi.h (cef_client_t) TCefClient = record base : TCefBaseRefCounted; - get_audio_handler : function(self: PCefClient): PCefAudioHandler; stdcall; get_context_menu_handler : function(self: PCefClient): PCefContextMenuHandler; stdcall; get_dialog_handler : function(self: PCefClient): PCefDialogHandler; stdcall; get_display_handler : function(self: PCefClient): PCefDisplayHandler; stdcall; diff --git a/update_CEF4Delphi.json b/update_CEF4Delphi.json index 91dc2f25..4e0338ea 100644 --- a/update_CEF4Delphi.json +++ b/update_CEF4Delphi.json @@ -1,10 +1,10 @@ { "UpdateLazPackages" : [ { - "ForceNotify" : true, - "InternalVersion" : 33, + "ForceNotify" : false, + "InternalVersion" : 34, "Name" : "cef4delphi_lazarus.lpk", - "Version" : "76.1.13.0" + "Version" : "77.1.3.0" } ], "UpdatePackageData" : { From ed327ed4795b657f4e2a299fbdf1af8afffa30e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Salvador=20D=C3=ADaz=20Fau?= Date: Thu, 3 Oct 2019 12:25:40 +0200 Subject: [PATCH 02/13] Update to CEF 77.1.7 --- README.md | 6 +++--- packages/cef4delphi_lazarus.lpk | 2 +- source/uCEFApplication.pas | 2 +- update_CEF4Delphi.json | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 2a057ab5..c6c05e6b 100644 --- a/README.md +++ b/README.md @@ -3,10 +3,10 @@ CEF4Delphi is an open source project created by Salvador D 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 77.1.3 which includes Chromium 77.0.3865.90. +CEF4Delphi uses CEF 77.1.7 which includes Chromium 77.0.3865.90. The CEF binaries used by CEF4Delphi are available for download at spotify : -* [32 bits](http://opensource.spotify.com/cefbuilds/cef_binary_77.1.3%2Bgf0a1c44%2Bchromium-77.0.3865.90_windows32.tar.bz2) -* [64 bits](http://opensource.spotify.com/cefbuilds/cef_binary_77.1.3%2Bgf0a1c44%2Bchromium-77.0.3865.90_windows64.tar.bz2) +* [32 bits](http://opensource.spotify.com/cefbuilds/cef_binary_77.1.7%2Bgc7dbc2f%2Bchromium-77.0.3865.90_windows32.tar.bz2) +* [64 bits](http://opensource.spotify.com/cefbuilds/cef_binary_77.1.7%2Bgc7dbc2f%2Bchromium-77.0.3865.90_windows64.tar.bz2) CEF4Delphi was developed and tested on Delphi 10.3 Rio and it has been tested in Delphi 7, Delphi XE, Delphi 10, Delphi 10.2 and Lazarus 2.0.4/FPC 3.0.4. CEF4Delphi includes VCL, FireMonkey (FMX) and Lazarus components. diff --git a/packages/cef4delphi_lazarus.lpk b/packages/cef4delphi_lazarus.lpk index fcfc8224..17e14a37 100644 --- a/packages/cef4delphi_lazarus.lpk +++ b/packages/cef4delphi_lazarus.lpk @@ -21,7 +21,7 @@ - + diff --git a/source/uCEFApplication.pas b/source/uCEFApplication.pas index 91067d5e..8c5310b6 100644 --- a/source/uCEFApplication.pas +++ b/source/uCEFApplication.pas @@ -62,7 +62,7 @@ uses const CEF_SUPPORTED_VERSION_MAJOR = 77; CEF_SUPPORTED_VERSION_MINOR = 1; - CEF_SUPPORTED_VERSION_RELEASE = 3; + CEF_SUPPORTED_VERSION_RELEASE = 7; CEF_SUPPORTED_VERSION_BUILD = 0; CEF_CHROMEELF_VERSION_MAJOR = 77; diff --git a/update_CEF4Delphi.json b/update_CEF4Delphi.json index 4e0338ea..ffa99e6f 100644 --- a/update_CEF4Delphi.json +++ b/update_CEF4Delphi.json @@ -2,9 +2,9 @@ "UpdateLazPackages" : [ { "ForceNotify" : false, - "InternalVersion" : 34, + "InternalVersion" : 36, "Name" : "cef4delphi_lazarus.lpk", - "Version" : "77.1.3.0" + "Version" : "77.1.7.0" } ], "UpdatePackageData" : { From 33213f25e465b4a853ade98c98a91d50d1400c91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Salvador=20D=C3=ADaz=20Fau?= Date: Fri, 4 Oct 2019 15:13:24 +0200 Subject: [PATCH 03/13] Update to CEF 77.1.8 --- README.md | 6 +- demos/Delphi_VCL/MiniBrowser/uMiniBrowser.pas | 5 +- demos/Delphi_VCL/MiniBrowser/uPreferences.dfm | 71 ++++++++++++------- demos/Delphi_VCL/MiniBrowser/uPreferences.pas | 9 +-- demos/Lazarus/MiniBrowser/MiniBrowser.lps | 66 ++++++++--------- demos/Lazarus/MiniBrowser/uMiniBrowser.pas | 5 +- packages/cef4delphi_lazarus.lpk | 2 +- source/uCEFApplication.pas | 2 +- update_CEF4Delphi.json | 4 +- 9 files changed, 99 insertions(+), 71 deletions(-) diff --git a/README.md b/README.md index c6c05e6b..7886bc60 100644 --- a/README.md +++ b/README.md @@ -3,10 +3,10 @@ CEF4Delphi is an open source project created by Salvador D 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 77.1.7 which includes Chromium 77.0.3865.90. +CEF4Delphi uses CEF 77.1.8 which includes Chromium 77.0.3865.90. The CEF binaries used by CEF4Delphi are available for download at spotify : -* [32 bits](http://opensource.spotify.com/cefbuilds/cef_binary_77.1.7%2Bgc7dbc2f%2Bchromium-77.0.3865.90_windows32.tar.bz2) -* [64 bits](http://opensource.spotify.com/cefbuilds/cef_binary_77.1.7%2Bgc7dbc2f%2Bchromium-77.0.3865.90_windows64.tar.bz2) +* [32 bits](http://opensource.spotify.com/cefbuilds/cef_binary_77.1.8%2Bg41b180d%2Bchromium-77.0.3865.90_windows32.tar.bz2) +* [64 bits](http://opensource.spotify.com/cefbuilds/cef_binary_77.1.8%2Bg41b180d%2Bchromium-77.0.3865.90_windows64.tar.bz2) CEF4Delphi was developed and tested on Delphi 10.3 Rio and it has been tested in Delphi 7, Delphi XE, Delphi 10, Delphi 10.2 and Lazarus 2.0.4/FPC 3.0.4. CEF4Delphi includes VCL, FireMonkey (FMX) and Lazarus components. diff --git a/demos/Delphi_VCL/MiniBrowser/uMiniBrowser.pas b/demos/Delphi_VCL/MiniBrowser/uMiniBrowser.pas index 6fa03f25..1f441494 100644 --- a/demos/Delphi_VCL/MiniBrowser/uMiniBrowser.pas +++ b/demos/Delphi_VCL/MiniBrowser/uMiniBrowser.pas @@ -1156,8 +1156,11 @@ begin end; procedure TMiniBrowserFrm.CopyAllTextMsg(var aMessage : TMessage); +var + TempName : string; begin - Chromium1.RetrieveText; + TempName := InputBox('Frame name', 'Type the fame name or leave it blank to select the main frame :', ''); + Chromium1.RetrieveText(TempName); end; procedure TMiniBrowserFrm.CopyFramesIDsMsg(var aMessage : TMessage); diff --git a/demos/Delphi_VCL/MiniBrowser/uPreferences.dfm b/demos/Delphi_VCL/MiniBrowser/uPreferences.dfm index edbf117a..4dc5aa06 100644 --- a/demos/Delphi_VCL/MiniBrowser/uPreferences.dfm +++ b/demos/Delphi_VCL/MiniBrowser/uPreferences.dfm @@ -4,7 +4,7 @@ object PreferencesFrm: TPreferencesFrm BorderIcons = [biSystemMenu] BorderStyle = bsSingle Caption = 'Preferences' - ClientHeight = 397 + ClientHeight = 388 ClientWidth = 428 Color = clBtnFace Font.Charset = DEFAULT_CHARSET @@ -13,33 +13,20 @@ object PreferencesFrm: TPreferencesFrm Font.Name = 'Tahoma' Font.Style = [] FormStyle = fsStayOnTop + Padding.Left = 10 + Padding.Top = 10 + Padding.Right = 10 + Padding.Bottom = 10 OldCreateOrder = False Position = poScreenCenter PixelsPerInch = 96 TextHeight = 13 - object Button1: TButton - Left = 232 - Top = 364 - Width = 75 - Height = 25 - Caption = 'Ok' - ModalResult = 1 - TabOrder = 2 - end - object Button2: TButton - Left = 345 - Top = 364 - Width = 75 - Height = 25 - Caption = 'Cancel' - ModalResult = 2 - TabOrder = 3 - end object GroupBox1: TGroupBox - Left = 8 - Top = 8 - Width = 412 + Left = 10 + Top = 10 + Width = 408 Height = 250 + Align = alTop Caption = ' Proxy ' TabOrder = 0 object ProxyTypeLbl: TLabel @@ -186,10 +173,11 @@ object PreferencesFrm: TPreferencesFrm end end object GroupBox2: TGroupBox - Left = 8 - Top = 271 - Width = 412 + Left = 10 + Top = 260 + Width = 408 Height = 84 + Align = alTop Caption = ' Custom header ' TabOrder = 1 object HeaderNameLbl: TLabel @@ -221,4 +209,37 @@ object PreferencesFrm: TPreferencesFrm TabOrder = 1 end end + object Panel1: TPanel + Left = 10 + Top = 353 + Width = 408 + Height = 25 + Align = alBottom + BevelOuter = bvNone + Padding.Left = 30 + Padding.Right = 30 + TabOrder = 2 + ExplicitTop = 373 + object Button1: TButton + Left = 30 + Top = 0 + Width = 120 + Height = 25 + Align = alLeft + Caption = 'Ok' + ModalResult = 1 + TabOrder = 0 + end + object Button2: TButton + Left = 258 + Top = 0 + Width = 120 + Height = 25 + Align = alRight + Caption = 'Cancel' + ModalResult = 2 + TabOrder = 1 + ExplicitLeft = 278 + end + end end diff --git a/demos/Delphi_VCL/MiniBrowser/uPreferences.pas b/demos/Delphi_VCL/MiniBrowser/uPreferences.pas index 7d05726b..dcc0ec84 100644 --- a/demos/Delphi_VCL/MiniBrowser/uPreferences.pas +++ b/demos/Delphi_VCL/MiniBrowser/uPreferences.pas @@ -44,16 +44,14 @@ interface uses {$IFDEF DELPHI16_UP} Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, - Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Samples.Spin; + Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Samples.Spin, Vcl.ExtCtrls; {$ELSE} Windows, Messages, SysUtils, Variants, Classes, Graphics, - Controls, Forms, Dialogs, StdCtrls, Spin; + Controls, Forms, Dialogs, StdCtrls, Spin, ExtCtrls; {$ENDIF} type TPreferencesFrm = class(TForm) - Button1: TButton; - Button2: TButton; GroupBox1: TGroupBox; ProxyTypeCbx: TComboBox; ProxyTypeLbl: TLabel; @@ -77,6 +75,9 @@ type ProxySchemeCb: TComboBox; MaxConnectionsPerProxyLbl: TLabel; MaxConnectionsPerProxyEdt: TSpinEdit; + Panel1: TPanel; + Button1: TButton; + Button2: TButton; private { Private declarations } public diff --git a/demos/Lazarus/MiniBrowser/MiniBrowser.lps b/demos/Lazarus/MiniBrowser/MiniBrowser.lps index bed2df6b..559a529e 100644 --- a/demos/Lazarus/MiniBrowser/MiniBrowser.lps +++ b/demos/Lazarus/MiniBrowser/MiniBrowser.lps @@ -22,8 +22,8 @@ - - + + @@ -83,7 +83,7 @@ - + @@ -91,115 +91,115 @@ - + - + - + - + - + - + - + - + - - - - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/demos/Lazarus/MiniBrowser/uMiniBrowser.pas b/demos/Lazarus/MiniBrowser/uMiniBrowser.pas index 2550fe86..69e7d5df 100644 --- a/demos/Lazarus/MiniBrowser/uMiniBrowser.pas +++ b/demos/Lazarus/MiniBrowser/uMiniBrowser.pas @@ -1224,8 +1224,11 @@ begin end; procedure TMiniBrowserFrm.CopyAllTextMsg(var aMessage : TMessage); +var + TempName : string; begin - Chromium1.RetrieveText; + TempName := InputBox('Frame name', 'Type the fame name or leave it blank to select the main frame :', ''); + Chromium1.RetrieveText(TempName); end; procedure TMiniBrowserFrm.CopyFramesIDsMsg(var aMessage : TMessage); diff --git a/packages/cef4delphi_lazarus.lpk b/packages/cef4delphi_lazarus.lpk index 17e14a37..eb340098 100644 --- a/packages/cef4delphi_lazarus.lpk +++ b/packages/cef4delphi_lazarus.lpk @@ -21,7 +21,7 @@ - + diff --git a/source/uCEFApplication.pas b/source/uCEFApplication.pas index 8c5310b6..ca5b3ae6 100644 --- a/source/uCEFApplication.pas +++ b/source/uCEFApplication.pas @@ -62,7 +62,7 @@ uses const CEF_SUPPORTED_VERSION_MAJOR = 77; CEF_SUPPORTED_VERSION_MINOR = 1; - CEF_SUPPORTED_VERSION_RELEASE = 7; + CEF_SUPPORTED_VERSION_RELEASE = 8; CEF_SUPPORTED_VERSION_BUILD = 0; CEF_CHROMEELF_VERSION_MAJOR = 77; diff --git a/update_CEF4Delphi.json b/update_CEF4Delphi.json index ffa99e6f..c107fb08 100644 --- a/update_CEF4Delphi.json +++ b/update_CEF4Delphi.json @@ -2,9 +2,9 @@ "UpdateLazPackages" : [ { "ForceNotify" : false, - "InternalVersion" : 36, + "InternalVersion" : 37, "Name" : "cef4delphi_lazarus.lpk", - "Version" : "77.1.7.0" + "Version" : "77.1.8.0" } ], "UpdatePackageData" : { From 594ed4a1c2db402e26a6d2068d5fd6a3dfb4ea48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Salvador=20D=C3=ADaz=20Fau?= Date: Fri, 4 Oct 2019 16:58:42 +0200 Subject: [PATCH 04/13] Fixed CookieAccessFilter events not being triggered --- source/uCEFChromium.pas | 3 ++- source/uCEFFMXChromium.pas | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/source/uCEFChromium.pas b/source/uCEFChromium.pas index 873ec0e1..2f3bd123 100644 --- a/source/uCEFChromium.pas +++ b/source/uCEFChromium.pas @@ -3134,7 +3134,8 @@ begin assigned(FOnResourceResponse) or assigned(FOnGetResourceResponseFilter) or assigned(FOnResourceLoadComplete) or - assigned(FOnProtocolExecution); + assigned(FOnProtocolExecution) or + MustCreateCookieAccessFilter; end; function TChromium.MustCreateCookieAccessFilter : boolean; diff --git a/source/uCEFFMXChromium.pas b/source/uCEFFMXChromium.pas index 1fdb7b00..b786ab99 100644 --- a/source/uCEFFMXChromium.pas +++ b/source/uCEFFMXChromium.pas @@ -2853,7 +2853,8 @@ begin assigned(FOnResourceResponse) or assigned(FOnGetResourceResponseFilter) or assigned(FOnResourceLoadComplete) or - assigned(FOnProtocolExecution); + assigned(FOnProtocolExecution) or + MustCreateCookieAccessFilter; end; function TFMXChromium.MustCreateCookieAccessFilter : boolean; From 29f5f3475d7a915ce7ecb361757058052dc4e253 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Salvador=20D=C3=ADaz=20Fau?= Date: Sat, 5 Oct 2019 09:53:21 +0200 Subject: [PATCH 05/13] Update to CEF 77.1.11 --- README.md | 6 +++--- packages/cef4delphi_lazarus.lpk | 2 +- source/uCEFApplication.pas | 2 +- update_CEF4Delphi.json | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 7886bc60..551790cd 100644 --- a/README.md +++ b/README.md @@ -3,10 +3,10 @@ CEF4Delphi is an open source project created by Salvador D 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 77.1.8 which includes Chromium 77.0.3865.90. +CEF4Delphi uses CEF 77.1.11 which includes Chromium 77.0.3865.90. The CEF binaries used by CEF4Delphi are available for download at spotify : -* [32 bits](http://opensource.spotify.com/cefbuilds/cef_binary_77.1.8%2Bg41b180d%2Bchromium-77.0.3865.90_windows32.tar.bz2) -* [64 bits](http://opensource.spotify.com/cefbuilds/cef_binary_77.1.8%2Bg41b180d%2Bchromium-77.0.3865.90_windows64.tar.bz2) +* [32 bits](http://opensource.spotify.com/cefbuilds/cef_binary_77.1.11%2Bg1687a63%2Bchromium-77.0.3865.90_windows32.tar.bz2) +* [64 bits](http://opensource.spotify.com/cefbuilds/cef_binary_77.1.11%2Bg1687a63%2Bchromium-77.0.3865.90_windows64.tar.bz2) CEF4Delphi was developed and tested on Delphi 10.3 Rio and it has been tested in Delphi 7, Delphi XE, Delphi 10, Delphi 10.2 and Lazarus 2.0.4/FPC 3.0.4. CEF4Delphi includes VCL, FireMonkey (FMX) and Lazarus components. diff --git a/packages/cef4delphi_lazarus.lpk b/packages/cef4delphi_lazarus.lpk index eb340098..76a49875 100644 --- a/packages/cef4delphi_lazarus.lpk +++ b/packages/cef4delphi_lazarus.lpk @@ -21,7 +21,7 @@ - + diff --git a/source/uCEFApplication.pas b/source/uCEFApplication.pas index ca5b3ae6..e051b1c9 100644 --- a/source/uCEFApplication.pas +++ b/source/uCEFApplication.pas @@ -62,7 +62,7 @@ uses const CEF_SUPPORTED_VERSION_MAJOR = 77; CEF_SUPPORTED_VERSION_MINOR = 1; - CEF_SUPPORTED_VERSION_RELEASE = 8; + CEF_SUPPORTED_VERSION_RELEASE = 11; CEF_SUPPORTED_VERSION_BUILD = 0; CEF_CHROMEELF_VERSION_MAJOR = 77; diff --git a/update_CEF4Delphi.json b/update_CEF4Delphi.json index c107fb08..2b8cbda8 100644 --- a/update_CEF4Delphi.json +++ b/update_CEF4Delphi.json @@ -2,9 +2,9 @@ "UpdateLazPackages" : [ { "ForceNotify" : false, - "InternalVersion" : 37, + "InternalVersion" : 38, "Name" : "cef4delphi_lazarus.lpk", - "Version" : "77.1.8.0" + "Version" : "77.1.11.0" } ], "UpdatePackageData" : { From 00552ef11740aaea90eeaeefe8556857eb64bbf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Salvador=20D=C3=ADaz=20Fau?= Date: Sun, 6 Oct 2019 22:30:36 +0200 Subject: [PATCH 06/13] Added TChromium.SafeSearch and TChromium.YouTubeRestrict --- source/uCEFChromium.pas | 29 +++++++++++++++++++++++++++++ source/uCEFConstants.pas | 6 ++++++ source/uCEFFMXChromium.pas | 28 ++++++++++++++++++++++++++++ source/uCEFRequestHandler.pas | 2 +- update_CEF4Delphi.json | 4 ++-- 5 files changed, 66 insertions(+), 3 deletions(-) diff --git a/source/uCEFChromium.pas b/source/uCEFChromium.pas index 2f3bd123..23852b9c 100644 --- a/source/uCEFChromium.pas +++ b/source/uCEFChromium.pas @@ -105,6 +105,8 @@ type FIsOSR : boolean; FInitialized : boolean; FClosing : boolean; + FSafeSearch : boolean; + FYouTubeRestrict : integer; FWindowInfo : TCefWindowInfo; FBrowserSettings : TCefBrowserSettings; FDevWindowInfo : TCefWindowInfo; @@ -302,6 +304,8 @@ type procedure SetZoomStep(aValue : byte); procedure SetWindowlessFrameRate(aValue : integer); procedure SetAudioMuted(aValue : boolean); + procedure SetSafeSearch(aValue : boolean); + procedure SetYouTubeRestrict(aValue : integer); function CreateBrowserHost(aWindowInfo : PCefWindowInfo; const aURL : ustring; const aSettings : PCefBrowserSettings; const aExtraInfo : ICefDictionaryValue; const aContext : ICefRequestContext): boolean; @@ -662,6 +666,8 @@ type property FrameCount : NativeUInt read GetFrameCount; property DragOperations : TCefDragOperations read FDragOperations write FDragOperations; property AudioMuted : boolean read GetAudioMuted write SetAudioMuted; + property SafeSearch : boolean read FSafeSearch write SetSafeSearch; + property YouTubeRestrict : integer read FYouTubeRestrict write SetYouTubeRestrict; property WebRTCIPHandlingPolicy : TCefWebRTCHandlingPolicy read FWebRTCIPHandlingPolicy write SetWebRTCIPHandlingPolicy; property WebRTCMultipleRoutes : TCefState read FWebRTCMultipleRoutes write SetWebRTCMultipleRoutes; @@ -844,6 +850,9 @@ begin FCookiePrefs := CEF_CONTENT_SETTING_ALLOW; FImagesPrefs := CEF_CONTENT_SETTING_ALLOW; FZoomStep := ZOOM_STEP_DEF; + FSafeSearch := False; + FYouTubeRestrict := YOUTUBE_RESTRICT_OFF; + {$IFNDEF FPC} FOldBrowserCompWndPrc := nil; FOldWidgetCompWndPrc := nil; @@ -2032,6 +2041,24 @@ begin end; end; +procedure TChromium.SetSafeSearch(aValue : boolean); +begin + if (FSafeSearch <> aValue) then + begin + FSafeSearch := aValue; + FUpdatePreferences := True; + end; +end; + +procedure TChromium.SetYouTubeRestrict(aValue : integer); +begin + if (FYouTubeRestrict <> aValue) then + begin + FYouTubeRestrict := aValue; + FUpdatePreferences := True; + end; +end; + procedure TChromium.SetWebRTCIPHandlingPolicy(aValue : TCefWebRTCHandlingPolicy); begin if (FWebRTCIPHandlingPolicy <> aValue) then @@ -2485,6 +2512,8 @@ begin UpdatePreference(aBrowser, 'plugins.always_authorize', FAlwaysAuthorizePlugins); UpdatePreference(aBrowser, 'browser.enable_spellchecking', FSpellChecking); UpdateStringListPref(aBrowser, 'spellcheck.dictionaries', FSpellCheckerDicts); + UpdatePreference(aBrowser, 'settings.force_google_safesearch', FSafeSearch); + UpdatePreference(aBrowser, 'settings.force_youtube_restrict', FYouTubeRestrict); if (FMaxConnectionsPerProxy <> CEF_MAX_CONNECTIONS_PER_PROXY_DEFAULT_VALUE) then UpdatePreference(aBrowser, 'net.max_connections_per_proxy', FMaxConnectionsPerProxy); diff --git a/source/uCEFConstants.pas b/source/uCEFConstants.pas index 72ed29c3..75d518fe 100644 --- a/source/uCEFConstants.pas +++ b/source/uCEFConstants.pas @@ -552,6 +552,12 @@ const CEF_MAX_CONNECTIONS_PER_PROXY_MIN_VALUE = 7; CEF_MAX_CONNECTIONS_PER_PROXY_MAX_VALUE = 99; + // https://chromium.googlesource.com/chromium/src/+/refs/tags/77.0.3865.90/chrome/common/net/safe_search_util.h (YouTubeRestrictMode) + // https://www.chromium.org/administrators/policy-list-3#ForceYouTubeRestrict + YOUTUBE_RESTRICT_OFF = 0; + YOUTUBE_RESTRICT_MODERATE = 1; + YOUTUBE_RESTRICT_STRICT = 2; + ZOOM_STEP_25 = 0; ZOOM_STEP_33 = 1; ZOOM_STEP_50 = 2; diff --git a/source/uCEFFMXChromium.pas b/source/uCEFFMXChromium.pas index b786ab99..e16c2c9f 100644 --- a/source/uCEFFMXChromium.pas +++ b/source/uCEFFMXChromium.pas @@ -94,6 +94,8 @@ type FIsOSR : boolean; FInitialized : boolean; FClosing : boolean; + FSafeSearch : boolean; + FYouTubeRestrict : integer; FWindowInfo : TCefWindowInfo; FBrowserSettings : TCefBrowserSettings; FDevWindowInfo : TCefWindowInfo; @@ -285,6 +287,8 @@ type procedure SetZoomStep(aValue : byte); procedure SetWindowlessFrameRate(aValue : integer); procedure SetAudioMuted(aValue : boolean); + procedure SetSafeSearch(aValue : boolean); + procedure SetYouTubeRestrict(aValue : integer); function CreateBrowserHost(aWindowInfo : PCefWindowInfo; const aURL : ustring; const aSettings : PCefBrowserSettings; const aExtraInfo : ICefDictionaryValue; const aContext : ICefRequestContext): boolean; @@ -622,6 +626,8 @@ type property FrameCount : NativeUInt read GetFrameCount; property DragOperations : TCefDragOperations read FDragOperations write FDragOperations; property AudioMuted : boolean read GetAudioMuted write SetAudioMuted; + property SafeSearch : boolean read FSafeSearch write SetSafeSearch; + property YouTubeRestrict : integer read FYouTubeRestrict write SetYouTubeRestrict; property WebRTCIPHandlingPolicy : TCefWebRTCHandlingPolicy read FWebRTCIPHandlingPolicy write SetWebRTCIPHandlingPolicy; property WebRTCMultipleRoutes : TCefState read FWebRTCMultipleRoutes write SetWebRTCMultipleRoutes; @@ -792,6 +798,8 @@ begin FCookiePrefs := CEF_CONTENT_SETTING_ALLOW; FImagesPrefs := CEF_CONTENT_SETTING_ALLOW; FZoomStep := ZOOM_STEP_DEF; + FSafeSearch := False; + FYouTubeRestrict := YOUTUBE_RESTRICT_OFF; {$IFDEF MSWINDOWS} FOldBrowserCompWndPrc := nil; @@ -1808,6 +1816,24 @@ begin end; end; +procedure TFMXChromium.SetSafeSearch(aValue : boolean); +begin + if (FSafeSearch <> aValue) then + begin + FSafeSearch := aValue; + FUpdatePreferences := True; + end; +end; + +procedure TFMXChromium.SetYouTubeRestrict(aValue : integer); +begin + if (FYouTubeRestrict <> aValue) then + begin + FYouTubeRestrict := aValue; + FUpdatePreferences := True; + end; +end; + procedure TFMXChromium.SetWebRTCIPHandlingPolicy(aValue : TCefWebRTCHandlingPolicy); begin if (FWebRTCIPHandlingPolicy <> aValue) then @@ -2210,6 +2236,8 @@ begin UpdatePreference(aBrowser, 'plugins.always_authorize', FAlwaysAuthorizePlugins); UpdatePreference(aBrowser, 'browser.enable_spellchecking', FSpellChecking); UpdateStringListPref(aBrowser, 'spellcheck.dictionaries', FSpellCheckerDicts); + UpdatePreference(aBrowser, 'settings.force_google_safesearch', FSafeSearch); + UpdatePreference(aBrowser, 'settings.force_youtube_restrict', FYouTubeRestrict); if FRunAllFlashInAllowMode then UpdatePreference(aBrowser, 'profile.default_content_setting_values.plugins', 1); diff --git a/source/uCEFRequestHandler.pas b/source/uCEFRequestHandler.pas index 55b24f8c..0df7a1f5 100644 --- a/source/uCEFRequestHandler.pas +++ b/source/uCEFRequestHandler.pas @@ -494,7 +494,7 @@ function TCustomRequestHandler.GetAuthCredentials(const browser : ICefBrowser; isProxy : Boolean; const host : ustring; port : Integer; - const realm : ustring; + const realm : ustring; const scheme : ustring; const callback : ICefAuthCallback): Boolean; begin diff --git a/update_CEF4Delphi.json b/update_CEF4Delphi.json index 2b8cbda8..b673ad4c 100644 --- a/update_CEF4Delphi.json +++ b/update_CEF4Delphi.json @@ -1,8 +1,8 @@ { "UpdateLazPackages" : [ { - "ForceNotify" : false, - "InternalVersion" : 38, + "ForceNotify" : true, + "InternalVersion" : 39, "Name" : "cef4delphi_lazarus.lpk", "Version" : "77.1.11.0" } From 1dc18e6aa61477731db6784470bb98fd2c8b034a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Salvador=20D=C3=ADaz=20Fau?= Date: Tue, 8 Oct 2019 15:03:22 +0200 Subject: [PATCH 07/13] Update to CEF 77.1.12 - Added TChromium.PrintingEnabled property - Added TChromium.ClearCertificateExceptions function - Added TChromium.ClearHttpAuthCredentialsfunction - Added TChromium.CloseAllConnections function - Added TChromium.OnCertificateExceptionsCleared event - Added TChromium.OnHttpAuthCredentialsCleared event - Added TChromium.OnAllConnectionsClosed event --- README.md | 6 +- packages/cef4delphi_lazarus.lpk | 2 +- source/uCEFApplication.pas | 2 +- source/uCEFChromium.pas | 406 +++++++++++++++++++++----------- source/uCEFFMXChromium.pas | 405 ++++++++++++++++++++----------- source/uCEFInterfaces.pas | 3 + source/uCEFRequestContext.pas | 70 +++++- update_CEF4Delphi.json | 6 +- 8 files changed, 622 insertions(+), 278 deletions(-) diff --git a/README.md b/README.md index 551790cd..193bddc4 100644 --- a/README.md +++ b/README.md @@ -3,10 +3,10 @@ CEF4Delphi is an open source project created by Salvador D 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 77.1.11 which includes Chromium 77.0.3865.90. +CEF4Delphi uses CEF 77.1.12 which includes Chromium 77.0.3865.90. The CEF binaries used by CEF4Delphi are available for download at spotify : -* [32 bits](http://opensource.spotify.com/cefbuilds/cef_binary_77.1.11%2Bg1687a63%2Bchromium-77.0.3865.90_windows32.tar.bz2) -* [64 bits](http://opensource.spotify.com/cefbuilds/cef_binary_77.1.11%2Bg1687a63%2Bchromium-77.0.3865.90_windows64.tar.bz2) +* [32 bits](http://opensource.spotify.com/cefbuilds/cef_binary_77.1.12%2Bgc63c001%2Bchromium-77.0.3865.90_windows32.tar.bz2) +* [64 bits](http://opensource.spotify.com/cefbuilds/cef_binary_77.1.12%2Bgc63c001%2Bchromium-77.0.3865.90_windows64.tar.bz2) CEF4Delphi was developed and tested on Delphi 10.3 Rio and it has been tested in Delphi 7, Delphi XE, Delphi 10, Delphi 10.2 and Lazarus 2.0.4/FPC 3.0.4. CEF4Delphi includes VCL, FireMonkey (FMX) and Lazarus components. diff --git a/packages/cef4delphi_lazarus.lpk b/packages/cef4delphi_lazarus.lpk index 76a49875..64683f22 100644 --- a/packages/cef4delphi_lazarus.lpk +++ b/packages/cef4delphi_lazarus.lpk @@ -21,7 +21,7 @@ - + diff --git a/source/uCEFApplication.pas b/source/uCEFApplication.pas index e051b1c9..e0b62c4e 100644 --- a/source/uCEFApplication.pas +++ b/source/uCEFApplication.pas @@ -62,7 +62,7 @@ uses const CEF_SUPPORTED_VERSION_MAJOR = 77; CEF_SUPPORTED_VERSION_MINOR = 1; - CEF_SUPPORTED_VERSION_RELEASE = 11; + CEF_SUPPORTED_VERSION_RELEASE = 12; CEF_SUPPORTED_VERSION_BUILD = 0; CEF_CHROMEELF_VERSION_MAJOR = 77; diff --git a/source/uCEFChromium.pas b/source/uCEFChromium.pas index 23852b9c..b5bd0e29 100644 --- a/source/uCEFChromium.pas +++ b/source/uCEFChromium.pas @@ -107,6 +107,7 @@ type FClosing : boolean; FSafeSearch : boolean; FYouTubeRestrict : integer; + FPrintingEnabled : boolean; FWindowInfo : TCefWindowInfo; FBrowserSettings : TCefBrowserSettings; FDevWindowInfo : TCefWindowInfo; @@ -245,6 +246,9 @@ type FOnNavigationVisitorResultAvailable : TOnNavigationVisitorResultAvailableEvent; FOnDownloadImageFinished : TOnDownloadImageFinishedEvent; FOnCookiesFlushed : TNotifyEvent; + FOnCertificateExceptionsCleared : TNotifyEvent; + FOnHttpAuthCredentialsCleared : TNotifyEvent; + FOnAllConnectionsClosed : TNotifyEvent; {$IFNDEF FPC} FOnBrowserCompMsg : TOnCompMsgEvent; FOnWidgetCompMsg : TOnCompMsgEvent; @@ -306,6 +310,7 @@ type procedure SetAudioMuted(aValue : boolean); procedure SetSafeSearch(aValue : boolean); procedure SetYouTubeRestrict(aValue : integer); + procedure SetPrintingEnabled(aValue : boolean); function CreateBrowserHost(aWindowInfo : PCefWindowInfo; const aURL : ustring; const aSettings : PCefBrowserSettings; const aExtraInfo : ICefDictionaryValue; const aContext : ICefRequestContext): boolean; @@ -484,6 +489,9 @@ type function doNavigationVisitorResultAvailable(const entry: ICefNavigationEntry; current: Boolean; index, total: Integer) : boolean; virtual; procedure doDownloadImageFinished(const imageUrl: ustring; httpStatusCode: Integer; const image: ICefImage); virtual; procedure doOnCookiesStoreFlushed; virtual; + procedure doCertificateExceptionsCleared; virtual; + procedure doHttpAuthCredentialsCleared; virtual; + procedure doAllConnectionsClosed; virtual; function MustCreateLoadHandler : boolean; virtual; function MustCreateFocusHandler : boolean; virtual; function MustCreateContextMenuHandler : boolean; virtual; @@ -532,6 +540,9 @@ type procedure SimulateMouseWheel(aDeltaX, aDeltaY : integer); function DeleteCookies(const url : ustring = ''; const cookieName : ustring = '') : boolean; function FlushCookieStore(aFlushImmediately : boolean = True) : boolean; + function ClearCertificateExceptions(aClearImmediately : boolean = True) : boolean; + function ClearHttpAuthCredentials(aClearImmediately : boolean = True) : boolean; + function CloseAllConnections(aCloseImmediately : boolean = True) : boolean; procedure RetrieveHTML(const aFrameName : ustring = ''); overload; procedure RetrieveHTML(const aFrame : ICefFrame); overload; procedure RetrieveHTML(const aFrameIdentifier : int64); overload; @@ -668,6 +679,7 @@ type property AudioMuted : boolean read GetAudioMuted write SetAudioMuted; property SafeSearch : boolean read FSafeSearch write SetSafeSearch; property YouTubeRestrict : integer read FYouTubeRestrict write SetYouTubeRestrict; + property PrintingEnabled : boolean read FPrintingEnabled write SetPrintingEnabled; property WebRTCIPHandlingPolicy : TCefWebRTCHandlingPolicy read FWebRTCIPHandlingPolicy write SetWebRTCIPHandlingPolicy; property WebRTCMultipleRoutes : TCefState read FWebRTCMultipleRoutes write SetWebRTCMultipleRoutes; @@ -692,6 +704,9 @@ type property OnNavigationVisitorResultAvailable : TOnNavigationVisitorResultAvailableEvent read FOnNavigationVisitorResultAvailable write FOnNavigationVisitorResultAvailable; property OnDownloadImageFinished : TOnDownloadImageFinishedEvent read FOnDownloadImageFinished write FOnDownloadImageFinished; property OnCookiesFlushed : TNotifyEvent read FOnCookiesFlushed write FOnCookiesFlushed; + property OnCertificateExceptionsCleared : TNotifyEvent read FOnCertificateExceptionsCleared write FOnCertificateExceptionsCleared; + property OnHttpAuthCredentialsCleared : TNotifyEvent read FOnHttpAuthCredentialsCleared write FOnHttpAuthCredentialsCleared; + property OnAllConnectionsClosed : TNotifyEvent read FOnAllConnectionsClosed write FOnAllConnectionsClosed; {$IFNDEF FPC} property OnBrowserCompMsg : TOnCompMsgEvent read FOnBrowserCompMsg write FOnBrowserCompMsg; property OnWidgetCompMsg : TOnCompMsgEvent read FOnWidgetCompMsg write FOnWidgetCompMsg; @@ -852,6 +867,7 @@ begin FZoomStep := ZOOM_STEP_DEF; FSafeSearch := False; FYouTubeRestrict := YOUTUBE_RESTRICT_OFF; + FPrintingEnabled := True; {$IFNDEF FPC} FOldBrowserCompWndPrc := nil; @@ -1163,6 +1179,9 @@ begin FOnNavigationVisitorResultAvailable := nil; FOnDownloadImageFinished := nil; FOnCookiesFlushed := nil; + FOnCertificateExceptionsCleared := nil; + FOnHttpAuthCredentialsCleared := nil; + FOnAllConnectionsClosed := nil; {$IFNDEF FPC} FOnBrowserCompMsg := nil; FOnWidgetCompMsg := nil; @@ -2059,6 +2078,15 @@ begin end; end; +procedure TChromium.SetPrintingEnabled(aValue : boolean); +begin + if (FPrintingEnabled <> aValue) then + begin + FPrintingEnabled := aValue; + FUpdatePreferences := True; + end; +end; + procedure TChromium.SetWebRTCIPHandlingPolicy(aValue : TCefWebRTCHandlingPolicy); begin if (FWebRTCIPHandlingPolicy <> aValue) then @@ -2225,7 +2253,8 @@ begin end; end; -function TChromium.FlushCookieStore(aFlushImmediately : boolean = True) : boolean; +// If aFlushImmediately is false then OnCookiesFlushed is triggered when the cookies are flushed +function TChromium.FlushCookieStore(aFlushImmediately : boolean) : boolean; var TempManager : ICefCookieManager; TempCallback : ICefCompletionCallback; @@ -2250,6 +2279,69 @@ begin end; end; +// If aClearImmediately is false then OnCertificateExceptionsCleared is triggered when the exceptions are cleared +function TChromium.ClearCertificateExceptions(aClearImmediately : boolean) : boolean; +var + TempCallback : ICefCompletionCallback; +begin + Result := False; + + if Initialized and (FBrowser.Host <> nil) and (FBrowser.Host.RequestContext <> nil) then + try + if aClearImmediately then + TempCallback := nil + else + TempCallback := TCefClearCertificateExceptionsCompletionCallback.Create(self); + + FBrowser.Host.RequestContext.ClearCertificateExceptions(TempCallback); + Result := True; + finally + TempCallback := nil; + end; +end; + +// If aClearImmediately is false then OnHttpAuthCredentialsCleared is triggered when the credeintials are cleared +function TChromium.ClearHttpAuthCredentials(aClearImmediately : boolean) : boolean; +var + TempCallback : ICefCompletionCallback; +begin + Result := False; + + if Initialized and (FBrowser.Host <> nil) and (FBrowser.Host.RequestContext <> nil) then + try + if aClearImmediately then + TempCallback := nil + else + TempCallback := TCefClearHttpAuthCredentialsCompletionCallback.Create(self); + + FBrowser.Host.RequestContext.ClearHttpAuthCredentials(TempCallback); + Result := True; + finally + TempCallback := nil; + end; +end; + +// If aCloseImmediately is false then OnAllConnectionsClosed is triggered when the connections are closed +function TChromium.CloseAllConnections(aCloseImmediately : boolean) : boolean; +var + TempCallback : ICefCompletionCallback; +begin + Result := False; + + if Initialized and (FBrowser.Host <> nil) and (FBrowser.Host.RequestContext <> nil) then + try + if aCloseImmediately then + TempCallback := nil + else + TempCallback := TCefCloseAllConnectionsCompletionCallback.Create(self); + + FBrowser.Host.RequestContext.CloseAllConnections(TempCallback); + Result := True; + finally + TempCallback := nil; + end; +end; + // Leave aFrameName empty to get the HTML source from the main frame procedure TChromium.RetrieveHTML(const aFrameName : ustring); var @@ -2503,6 +2595,9 @@ procedure TChromium.doUpdatePreferences(const aBrowser: ICefBrowser); begin FUpdatePreferences := False; + // The preferences registered in CEF are defined in : + // /libcef/browser/prefs/browser_prefs.cc + UpdateProxyPrefs(aBrowser); UpdatePreference(aBrowser, 'enable_do_not_track', FDoNotTrack); UpdatePreference(aBrowser, 'enable_referrers', FSendReferrer); @@ -2514,6 +2609,7 @@ begin UpdateStringListPref(aBrowser, 'spellcheck.dictionaries', FSpellCheckerDicts); UpdatePreference(aBrowser, 'settings.force_google_safesearch', FSafeSearch); UpdatePreference(aBrowser, 'settings.force_youtube_restrict', FYouTubeRestrict); + UpdatePreference(aBrowser, 'printing.enabled', FPrintingEnabled); if (FMaxConnectionsPerProxy <> CEF_MAX_CONNECTIONS_PER_PROXY_DEFAULT_VALUE) then UpdatePreference(aBrowser, 'net.max_connections_per_proxy', FMaxConnectionsPerProxy); @@ -2554,64 +2650,70 @@ begin Result := False; try - if (aBrowser <> nil) and - (aBrowser.Host <> nil) and - aBrowser.Host.RequestContext.CanSetPreference('proxy') then - begin - TempProxy := TCefValueRef.New; - TempValue := TCefValueRef.New; - TempDict := TCefDictionaryValueRef.New; + try + if (aBrowser <> nil) and + (aBrowser.Host <> nil) and + aBrowser.Host.RequestContext.CanSetPreference('proxy') then + begin + TempProxy := TCefValueRef.New; + TempValue := TCefValueRef.New; + TempDict := TCefDictionaryValueRef.New; - case FProxyType of - CEF_PROXYTYPE_AUTODETECT : - begin - TempValue.SetString('auto_detect'); - TempDict.SetValue('mode', TempValue); - end; - - CEF_PROXYTYPE_SYSTEM : - begin - TempValue.SetString('system'); - TempDict.SetValue('mode', TempValue); - end; - - CEF_PROXYTYPE_FIXED_SERVERS : - begin - TempValue.SetString('fixed_servers'); - TempDict.SetValue('mode', TempValue); - - case FProxyScheme of - psSOCKS4 : TempDict.SetString('server', 'socks4://' + FProxyServer + ':' + inttostr(FProxyPort)); - psSOCKS5 : TempDict.SetString('server', 'socks5://' + FProxyServer + ':' + inttostr(FProxyPort)); - else TempDict.SetString('server', FProxyServer + ':' + inttostr(FProxyPort)); + case FProxyType of + CEF_PROXYTYPE_AUTODETECT : + begin + TempValue.SetString('auto_detect'); + TempDict.SetValue('mode', TempValue); end; - if (length(FProxyByPassList) > 0) then TempDict.SetString('bypass_list', FProxyByPassList); - end; + CEF_PROXYTYPE_SYSTEM : + begin + TempValue.SetString('system'); + TempDict.SetValue('mode', TempValue); + end; - CEF_PROXYTYPE_PAC_SCRIPT : - begin - TempValue.SetString('pac_script'); - TempDict.SetValue('mode', TempValue); - TempDict.SetString('pac_url', FProxyScriptURL); - end; + CEF_PROXYTYPE_FIXED_SERVERS : + begin + TempValue.SetString('fixed_servers'); + TempDict.SetValue('mode', TempValue); - else // CEF_PROXYTYPE_DIRECT - begin - TempValue.SetString('direct'); - TempDict.SetValue('mode', TempValue); - end; + case FProxyScheme of + psSOCKS4 : TempDict.SetString('server', 'socks4://' + FProxyServer + ':' + inttostr(FProxyPort)); + psSOCKS5 : TempDict.SetString('server', 'socks5://' + FProxyServer + ':' + inttostr(FProxyPort)); + else TempDict.SetString('server', FProxyServer + ':' + inttostr(FProxyPort)); + end; + + if (length(FProxyByPassList) > 0) then TempDict.SetString('bypass_list', FProxyByPassList); + end; + + CEF_PROXYTYPE_PAC_SCRIPT : + begin + TempValue.SetString('pac_script'); + TempDict.SetValue('mode', TempValue); + TempDict.SetString('pac_url', FProxyScriptURL); + end; + + else // CEF_PROXYTYPE_DIRECT + begin + TempValue.SetString('direct'); + TempDict.SetValue('mode', TempValue); + end; + end; + + Result := TempProxy.SetDictionary(TempDict) and + aBrowser.Host.RequestContext.SetPreference('proxy', TempProxy, TempError); + + if not(Result) then + OutputDebugMessage('TChromium.UpdateProxyPrefs error : ' + quotedstr(TempError)); end; - - Result := TempProxy.SetDictionary(TempDict) and - aBrowser.Host.RequestContext.SetPreference('proxy', TempProxy, TempError); - - if not(Result) then - OutputDebugMessage('TChromium.UpdateProxyPrefs error : ' + quotedstr(TempError)); - end; - except - on e : exception do - if CustomExceptionHandler('TChromium.UpdateProxyPrefs', e) then raise; + except + on e : exception do + if CustomExceptionHandler('TChromium.UpdateProxyPrefs', e) then raise; + end; + finally + TempProxy := nil; + TempValue := nil; + TempDict := nil; end; end; @@ -2623,25 +2725,29 @@ begin Result := False; try - if (aBrowser <> nil) and - (aBrowser.Host <> nil) and - aBrowser.Host.RequestContext.CanSetPreference(aName) then - begin - TempValue := TCefValueRef.New; + try + if (aBrowser <> nil) and + (aBrowser.Host <> nil) and + aBrowser.Host.RequestContext.CanSetPreference(aName) then + begin + TempValue := TCefValueRef.New; - if aValue then - TempValue.SetBool(1) - else - TempValue.SetBool(0); + if aValue then + TempValue.SetBool(1) + else + TempValue.SetBool(0); - Result := aBrowser.Host.RequestContext.SetPreference(aName, TempValue, TempError); + Result := aBrowser.Host.RequestContext.SetPreference(aName, TempValue, TempError); - if not(Result) then - OutputDebugMessage('TChromium.UpdatePreference error : ' + quotedstr(TempError)); - end; - except - on e : exception do - if CustomExceptionHandler('TChromium.UpdatePreference', e) then raise; + if not(Result) then + OutputDebugMessage('TChromium.UpdatePreference error : ' + quotedstr(TempError)); + end; + except + on e : exception do + if CustomExceptionHandler('TChromium.UpdatePreference', e) then raise; + end; + finally + TempValue := nil; end; end; @@ -2653,20 +2759,24 @@ begin Result := False; try - if (aBrowser <> nil) and - (aBrowser.Host <> nil) and - aBrowser.Host.RequestContext.CanSetPreference(aName) then - begin - TempValue := TCefValueRef.New; - TempValue.SetInt(aValue); - Result := aBrowser.Host.RequestContext.SetPreference(aName, TempValue, TempError); + try + if (aBrowser <> nil) and + (aBrowser.Host <> nil) and + aBrowser.Host.RequestContext.CanSetPreference(aName) then + begin + TempValue := TCefValueRef.New; + TempValue.SetInt(aValue); + Result := aBrowser.Host.RequestContext.SetPreference(aName, TempValue, TempError); - if not(Result) then - OutputDebugMessage('TChromium.UpdatePreference error : ' + quotedstr(TempError)); - end; - except - on e : exception do - if CustomExceptionHandler('TChromium.UpdatePreference', e) then raise; + if not(Result) then + OutputDebugMessage('TChromium.UpdatePreference error : ' + quotedstr(TempError)); + end; + except + on e : exception do + if CustomExceptionHandler('TChromium.UpdatePreference', e) then raise; + end; + finally + TempValue := nil; end; end; @@ -2678,20 +2788,24 @@ begin Result := False; try - if (aBrowser <> nil) and - (aBrowser.Host <> nil) and - aBrowser.Host.RequestContext.CanSetPreference(aName) then - begin - TempValue := TCefValueRef.New; - TempValue.SetDouble(aValue); - Result := aBrowser.Host.RequestContext.SetPreference(aName, TempValue, TempError); + try + if (aBrowser <> nil) and + (aBrowser.Host <> nil) and + aBrowser.Host.RequestContext.CanSetPreference(aName) then + begin + TempValue := TCefValueRef.New; + TempValue.SetDouble(aValue); + Result := aBrowser.Host.RequestContext.SetPreference(aName, TempValue, TempError); - if not(Result) then - OutputDebugMessage('TChromium.UpdatePreference error : ' + quotedstr(TempError)); - end; - except - on e : exception do - if CustomExceptionHandler('TChromium.UpdatePreference', e) then raise; + if not(Result) then + OutputDebugMessage('TChromium.UpdatePreference error : ' + quotedstr(TempError)); + end; + except + on e : exception do + if CustomExceptionHandler('TChromium.UpdatePreference', e) then raise; + end; + finally + Tempvalue := nil; end; end; @@ -2703,20 +2817,24 @@ begin Result := False; try - if (aBrowser <> nil) and - (aBrowser.Host <> nil) and - aBrowser.Host.RequestContext.CanSetPreference(aName) then - begin - TempValue := TCefValueRef.New; - TempValue.SetString(aValue); - Result := aBrowser.Host.RequestContext.SetPreference(aName, TempValue, TempError); + try + if (aBrowser <> nil) and + (aBrowser.Host <> nil) and + aBrowser.Host.RequestContext.CanSetPreference(aName) then + begin + TempValue := TCefValueRef.New; + TempValue.SetString(aValue); + Result := aBrowser.Host.RequestContext.SetPreference(aName, TempValue, TempError); - if not(Result) then - OutputDebugMessage('TChromium.UpdatePreference error : ' + quotedstr(TempError)); - end; - except - on e : exception do - if CustomExceptionHandler('TChromium.UpdatePreference', e) then raise; + if not(Result) then + OutputDebugMessage('TChromium.UpdatePreference error : ' + quotedstr(TempError)); + end; + except + on e : exception do + if CustomExceptionHandler('TChromium.UpdatePreference', e) then raise; + end; + finally + TempValue := nil; end; end; @@ -2731,35 +2849,40 @@ begin Result := False; try - if (aValue <> nil) and - (aValue.Count > 0) and - (aBrowser <> nil) and - (aBrowser.Host <> nil) and - aBrowser.Host.RequestContext.CanSetPreference(aName) then - begin - TempSize := aValue.Count; - TempList := TCefListValueRef.New; + try + if (aValue <> nil) and + (aValue.Count > 0) and + (aBrowser <> nil) and + (aBrowser.Host <> nil) and + aBrowser.Host.RequestContext.CanSetPreference(aName) then + begin + TempSize := aValue.Count; + TempList := TCefListValueRef.New; - if TempList.SetSize(TempSize) then - begin - i := 0; - while (i < TempSize) do - begin - TempList.SetString(i, aValue[i]); - inc(i); - end; + if TempList.SetSize(TempSize) then + begin + i := 0; + while (i < TempSize) do + begin + TempList.SetString(i, aValue[i]); + inc(i); + end; - TempValue := TCefValueRef.New; - Result := TempValue.SetList(TempList) and - aBrowser.Host.RequestContext.SetPreference(aName, TempValue, TempError); + TempValue := TCefValueRef.New; + Result := TempValue.SetList(TempList) and + aBrowser.Host.RequestContext.SetPreference(aName, TempValue, TempError); - if not(Result) then - OutputDebugMessage('TChromium.UpdatePreference error : ' + quotedstr(TempError)); - end; - end; - except - on e : exception do - if CustomExceptionHandler('TChromium.UpdatePreference', e) then raise; + if not(Result) then + OutputDebugMessage('TChromium.UpdatePreference error : ' + quotedstr(TempError)); + end; + end; + except + on e : exception do + if CustomExceptionHandler('TChromium.UpdatePreference', e) then raise; + end; + finally + TempValue := nil; + TempList := nil; end; end; @@ -3068,6 +3191,21 @@ begin if assigned(FOnCookiesFlushed) then FOnCookiesFlushed(self); end; +procedure TChromium.doCertificateExceptionsCleared; +begin + if assigned(FOnCertificateExceptionsCleared) then FOnCertificateExceptionsCleared(self); +end; + +procedure TChromium.doHttpAuthCredentialsCleared; +begin + if assigned(FOnHttpAuthCredentialsCleared) then FOnHttpAuthCredentialsCleared(self); +end; + +procedure TChromium.doAllConnectionsClosed; +begin + if assigned(FOnAllConnectionsClosed) then FOnAllConnectionsClosed(self); +end; + function TChromium.MustCreateLoadHandler : boolean; begin Result := assigned(FOnLoadStart) or diff --git a/source/uCEFFMXChromium.pas b/source/uCEFFMXChromium.pas index e16c2c9f..4a1c5237 100644 --- a/source/uCEFFMXChromium.pas +++ b/source/uCEFFMXChromium.pas @@ -96,6 +96,7 @@ type FClosing : boolean; FSafeSearch : boolean; FYouTubeRestrict : integer; + FPrintingEnabled : boolean; FWindowInfo : TCefWindowInfo; FBrowserSettings : TCefBrowserSettings; FDevWindowInfo : TCefWindowInfo; @@ -228,6 +229,9 @@ type FOnNavigationVisitorResultAvailable : TOnNavigationVisitorResultAvailableEvent; FOnDownloadImageFinished : TOnDownloadImageFinishedEvent; FOnCookiesFlushed : TNotifyEvent; + FOnCertificateExceptionsCleared : TNotifyEvent; + FOnHttpAuthCredentialsCleared : TNotifyEvent; + FOnAllConnectionsClosed : TNotifyEvent; {$IFDEF MSWINDOWS} FOnBrowserCompMsg : TOnCompMsgEvent; FOnWidgetCompMsg : TOnCompMsgEvent; @@ -289,6 +293,7 @@ type procedure SetAudioMuted(aValue : boolean); procedure SetSafeSearch(aValue : boolean); procedure SetYouTubeRestrict(aValue : integer); + procedure SetPrintingEnabled(aValue : boolean); function CreateBrowserHost(aWindowInfo : PCefWindowInfo; const aURL : ustring; const aSettings : PCefBrowserSettings; const aExtraInfo : ICefDictionaryValue; const aContext : ICefRequestContext): boolean; @@ -451,6 +456,9 @@ type function doNavigationVisitorResultAvailable(const entry: ICefNavigationEntry; current: Boolean; index, total: Integer) : boolean; virtual; procedure doDownloadImageFinished(const imageUrl: ustring; httpStatusCode: Integer; const image: ICefImage); virtual; procedure doOnCookiesStoreFlushed; virtual; + procedure doCertificateExceptionsCleared; virtual; + procedure doHttpAuthCredentialsCleared; virtual; + procedure doAllConnectionsClosed; virtual; function MustCreateLoadHandler : boolean; virtual; function MustCreateFocusHandler : boolean; virtual; function MustCreateContextMenuHandler : boolean; virtual; @@ -499,6 +507,9 @@ type procedure SimulateMouseWheel(aDeltaX, aDeltaY : integer); function DeleteCookies(const url : ustring = ''; const cookieName : ustring = '') : boolean; function FlushCookieStore(aFlushImmediately : boolean = True) : boolean; + function ClearCertificateExceptions(aClearImmediately : boolean = True) : boolean; + function ClearHttpAuthCredentials(aClearImmediately : boolean = True) : boolean; + function CloseAllConnections(aCloseImmediately : boolean = True) : boolean; procedure RetrieveHTML(const aFrameName : ustring = ''); overload; procedure RetrieveHTML(const aFrame : ICefFrame); overload; procedure RetrieveHTML(const aFrameIdentifier : int64); overload; @@ -628,6 +639,7 @@ type property AudioMuted : boolean read GetAudioMuted write SetAudioMuted; property SafeSearch : boolean read FSafeSearch write SetSafeSearch; property YouTubeRestrict : integer read FYouTubeRestrict write SetYouTubeRestrict; + property PrintingEnabled : boolean read FPrintingEnabled write SetPrintingEnabled; property WebRTCIPHandlingPolicy : TCefWebRTCHandlingPolicy read FWebRTCIPHandlingPolicy write SetWebRTCIPHandlingPolicy; property WebRTCMultipleRoutes : TCefState read FWebRTCMultipleRoutes write SetWebRTCMultipleRoutes; @@ -651,6 +663,9 @@ type property OnNavigationVisitorResultAvailable : TOnNavigationVisitorResultAvailableEvent read FOnNavigationVisitorResultAvailable write FOnNavigationVisitorResultAvailable; property OnDownloadImageFinishedEvent : TOnDownloadImageFinishedEvent read FOnDownloadImageFinished write FOnDownloadImageFinished; property OnCookiesFlushed : TNotifyEvent read FOnCookiesFlushed write FOnCookiesFlushed; + property OnCertificateExceptionsCleared : TNotifyEvent read FOnCertificateExceptionsCleared write FOnCertificateExceptionsCleared; + property OnHttpAuthCredentialsCleared : TNotifyEvent read FOnHttpAuthCredentialsCleared write FOnHttpAuthCredentialsCleared; + property OnAllConnectionsClosed : TNotifyEvent read FOnAllConnectionsClosed write FOnAllConnectionsClosed; {$IFDEF MSWINDOWS} property OnBrowserCompMsg : TOnCompMsgEvent read FOnBrowserCompMsg write FOnBrowserCompMsg; property OnWidgetCompMsg : TOnCompMsgEvent read FOnWidgetCompMsg write FOnWidgetCompMsg; @@ -1066,6 +1081,9 @@ begin FOnNavigationVisitorResultAvailable := nil; FOnDownloadImageFinished := nil; FOnCookiesFlushed := nil; + FOnCertificateExceptionsCleared := nil; + FOnHttpAuthCredentialsCleared := nil; + FOnAllConnectionsClosed := nil; end; function TFMXChromium.CreateBrowser(const aWindowName : ustring; @@ -1834,6 +1852,15 @@ begin end; end; +procedure TFMXChromium.SetPrintingEnabled(aValue : boolean); +begin + if (FPrintingEnabled <> aValue) then + begin + FPrintingEnabled := aValue; + FUpdatePreferences := True; + end; +end; + procedure TFMXChromium.SetWebRTCIPHandlingPolicy(aValue : TCefWebRTCHandlingPolicy); begin if (FWebRTCIPHandlingPolicy <> aValue) then @@ -2000,7 +2027,8 @@ begin end; end; -function TFMXChromium.FlushCookieStore(aFlushImmediately : boolean = True) : boolean; +// If aFlushImmediately is false then OnCookiesFlushed is triggered when the cookies are flushed +function TFMXChromium.FlushCookieStore(aFlushImmediately : boolean) : boolean; var TempManager : ICefCookieManager; TempCallback : ICefCompletionCallback; @@ -2025,6 +2053,69 @@ begin end; end; +// If aClearImmediately is false then OnCertificateExceptionsCleared is triggered when the exceptions are cleared +function TFMXChromium.ClearCertificateExceptions(aClearImmediately : boolean) : boolean; +var + TempCallback : ICefCompletionCallback; +begin + Result := False; + + if Initialized and (FBrowser.Host <> nil) and (FBrowser.Host.RequestContext <> nil) then + try + if aClearImmediately then + TempCallback := nil + else + TempCallback := TCefClearCertificateExceptionsCompletionCallback.Create(self); + + FBrowser.Host.RequestContext.ClearCertificateExceptions(TempCallback); + Result := True; + finally + TempCallback := nil; + end; +end; + +// If aClearImmediately is false then OnHttpAuthCredentialsCleared is triggered when the credeintials are cleared +function TFMXChromium.ClearHttpAuthCredentials(aClearImmediately : boolean) : boolean; +var + TempCallback : ICefCompletionCallback; +begin + Result := False; + + if Initialized and (FBrowser.Host <> nil) and (FBrowser.Host.RequestContext <> nil) then + try + if aClearImmediately then + TempCallback := nil + else + TempCallback := TCefClearHttpAuthCredentialsCompletionCallback.Create(self); + + FBrowser.Host.RequestContext.ClearHttpAuthCredentials(TempCallback); + Result := True; + finally + TempCallback := nil; + end; +end; + +// If aCloseImmediately is false then OnAllConnectionsClosed is triggered when the connections are closed +function TFMXChromium.CloseAllConnections(aCloseImmediately : boolean) : boolean; +var + TempCallback : ICefCompletionCallback; +begin + Result := False; + + if Initialized and (FBrowser.Host <> nil) and (FBrowser.Host.RequestContext <> nil) then + try + if aCloseImmediately then + TempCallback := nil + else + TempCallback := TCefCloseAllConnectionsCompletionCallback.Create(self); + + FBrowser.Host.RequestContext.CloseAllConnections(TempCallback); + Result := True; + finally + TempCallback := nil; + end; +end; + // Leave aFrameName empty to get the HTML source from the main frame procedure TFMXChromium.RetrieveHTML(const aFrameName : ustring); var @@ -2227,6 +2318,9 @@ procedure TFMXChromium.doUpdatePreferences(const aBrowser: ICefBrowser); begin FUpdatePreferences := False; + // The preferences registered in CEF are defined in : + // /libcef/browser/prefs/browser_prefs.cc + UpdateProxyPrefs(aBrowser); UpdatePreference(aBrowser, 'enable_do_not_track', FDoNotTrack); UpdatePreference(aBrowser, 'enable_referrers', FSendReferrer); @@ -2238,6 +2332,7 @@ begin UpdateStringListPref(aBrowser, 'spellcheck.dictionaries', FSpellCheckerDicts); UpdatePreference(aBrowser, 'settings.force_google_safesearch', FSafeSearch); UpdatePreference(aBrowser, 'settings.force_youtube_restrict', FYouTubeRestrict); + UpdatePreference(aBrowser, 'printing.enabled', FPrintingEnabled); if FRunAllFlashInAllowMode then UpdatePreference(aBrowser, 'profile.default_content_setting_values.plugins', 1); @@ -2275,64 +2370,70 @@ begin Result := False; try - if (aBrowser <> nil) and - (aBrowser.Host <> nil) and - aBrowser.Host.RequestContext.CanSetPreference('proxy') then - begin - TempProxy := TCefValueRef.New; - TempValue := TCefValueRef.New; - TempDict := TCefDictionaryValueRef.New; + try + if (aBrowser <> nil) and + (aBrowser.Host <> nil) and + aBrowser.Host.RequestContext.CanSetPreference('proxy') then + begin + TempProxy := TCefValueRef.New; + TempValue := TCefValueRef.New; + TempDict := TCefDictionaryValueRef.New; - case FProxyType of - CEF_PROXYTYPE_AUTODETECT : - begin - TempValue.SetString('auto_detect'); - TempDict.SetValue('mode', TempValue); - end; - - CEF_PROXYTYPE_SYSTEM : - begin - TempValue.SetString('system'); - TempDict.SetValue('mode', TempValue); - end; - - CEF_PROXYTYPE_FIXED_SERVERS : - begin - TempValue.SetString('fixed_servers'); - TempDict.SetValue('mode', TempValue); - - case FProxyScheme of - psSOCKS4 : TempDict.SetString('server', 'socks4://' + FProxyServer + ':' + inttostr(FProxyPort)); - psSOCKS5 : TempDict.SetString('server', 'socks5://' + FProxyServer + ':' + inttostr(FProxyPort)); - else TempDict.SetString('server', FProxyServer + ':' + inttostr(FProxyPort)); + case FProxyType of + CEF_PROXYTYPE_AUTODETECT : + begin + TempValue.SetString('auto_detect'); + TempDict.SetValue('mode', TempValue); end; - if (length(FProxyByPassList) > 0) then TempDict.SetString('bypass_list', FProxyByPassList); - end; + CEF_PROXYTYPE_SYSTEM : + begin + TempValue.SetString('system'); + TempDict.SetValue('mode', TempValue); + end; - CEF_PROXYTYPE_PAC_SCRIPT : - begin - TempValue.SetString('pac_script'); - TempDict.SetValue('mode', TempValue); - TempDict.SetString('pac_url', FProxyScriptURL); - end; + CEF_PROXYTYPE_FIXED_SERVERS : + begin + TempValue.SetString('fixed_servers'); + TempDict.SetValue('mode', TempValue); - else // CEF_PROXYTYPE_DIRECT - begin - TempValue.SetString('direct'); - TempDict.SetValue('mode', TempValue); - end; + case FProxyScheme of + psSOCKS4 : TempDict.SetString('server', 'socks4://' + FProxyServer + ':' + inttostr(FProxyPort)); + psSOCKS5 : TempDict.SetString('server', 'socks5://' + FProxyServer + ':' + inttostr(FProxyPort)); + else TempDict.SetString('server', FProxyServer + ':' + inttostr(FProxyPort)); + end; + + if (length(FProxyByPassList) > 0) then TempDict.SetString('bypass_list', FProxyByPassList); + end; + + CEF_PROXYTYPE_PAC_SCRIPT : + begin + TempValue.SetString('pac_script'); + TempDict.SetValue('mode', TempValue); + TempDict.SetString('pac_url', FProxyScriptURL); + end; + + else // CEF_PROXYTYPE_DIRECT + begin + TempValue.SetString('direct'); + TempDict.SetValue('mode', TempValue); + end; + end; + + Result := TempProxy.SetDictionary(TempDict) and + aBrowser.Host.RequestContext.SetPreference('proxy', TempProxy, TempError); + + if not(Result) then + OutputDebugMessage('TFMXChromium.UpdateProxyPrefs error : ' + quotedstr(TempError)); end; - - Result := TempProxy.SetDictionary(TempDict) and - aBrowser.Host.RequestContext.SetPreference('proxy', TempProxy, TempError); - - if not(Result) then - OutputDebugMessage('TFMXChromium.UpdateProxyPrefs error : ' + quotedstr(TempError)); - end; - except - on e : exception do - if CustomExceptionHandler('TFMXChromium.UpdateProxyPrefs', e) then raise; + except + on e : exception do + if CustomExceptionHandler('TFMXChromium.UpdateProxyPrefs', e) then raise; + end; + finally + TempProxy := nil; + TempValue := nil; + TempDict := nil; end; end; @@ -2344,25 +2445,29 @@ begin Result := False; try - if (aBrowser <> nil) and - (aBrowser.Host <> nil) and - aBrowser.Host.RequestContext.CanSetPreference(aName) then - begin - TempValue := TCefValueRef.New; + try + if (aBrowser <> nil) and + (aBrowser.Host <> nil) and + aBrowser.Host.RequestContext.CanSetPreference(aName) then + begin + TempValue := TCefValueRef.New; - if aValue then - TempValue.SetBool(1) - else - TempValue.SetBool(0); + if aValue then + TempValue.SetBool(1) + else + TempValue.SetBool(0); - Result := aBrowser.Host.RequestContext.SetPreference(aName, TempValue, TempError); + Result := aBrowser.Host.RequestContext.SetPreference(aName, TempValue, TempError); - if not(Result) then - OutputDebugMessage('TFMXChromium.UpdatePreference error : ' + quotedstr(TempError)); - end; - except - on e : exception do - if CustomExceptionHandler('TFMXChromium.UpdatePreference', e) then raise; + if not(Result) then + OutputDebugMessage('TFMXChromium.UpdatePreference error : ' + quotedstr(TempError)); + end; + except + on e : exception do + if CustomExceptionHandler('TFMXChromium.UpdatePreference', e) then raise; + end; + finally + TempValue := nil; end; end; @@ -2374,20 +2479,24 @@ begin Result := False; try - if (aBrowser <> nil) and - (aBrowser.Host <> nil) and - aBrowser.Host.RequestContext.CanSetPreference(aName) then - begin - TempValue := TCefValueRef.New; - TempValue.SetInt(aValue); - Result := aBrowser.Host.RequestContext.SetPreference(aName, TempValue, TempError); + try + if (aBrowser <> nil) and + (aBrowser.Host <> nil) and + aBrowser.Host.RequestContext.CanSetPreference(aName) then + begin + TempValue := TCefValueRef.New; + TempValue.SetInt(aValue); + Result := aBrowser.Host.RequestContext.SetPreference(aName, TempValue, TempError); - if not(Result) then - OutputDebugMessage('TFMXChromium.UpdatePreference error : ' + quotedstr(TempError)); - end; - except - on e : exception do - if CustomExceptionHandler('TFMXChromium.UpdatePreference', e) then raise; + if not(Result) then + OutputDebugMessage('TFMXChromium.UpdatePreference error : ' + quotedstr(TempError)); + end; + except + on e : exception do + if CustomExceptionHandler('TFMXChromium.UpdatePreference', e) then raise; + end; + finally + TempValue := nil; end; end; @@ -2399,20 +2508,24 @@ begin Result := False; try - if (aBrowser <> nil) and - (aBrowser.Host <> nil) and - aBrowser.Host.RequestContext.CanSetPreference(aName) then - begin - TempValue := TCefValueRef.New; - TempValue.SetDouble(aValue); - Result := aBrowser.Host.RequestContext.SetPreference(aName, TempValue, TempError); + try + if (aBrowser <> nil) and + (aBrowser.Host <> nil) and + aBrowser.Host.RequestContext.CanSetPreference(aName) then + begin + TempValue := TCefValueRef.New; + TempValue.SetDouble(aValue); + Result := aBrowser.Host.RequestContext.SetPreference(aName, TempValue, TempError); - if not(Result) then - OutputDebugMessage('TFMXChromium.UpdatePreference error : ' + quotedstr(TempError)); - end; - except - on e : exception do - if CustomExceptionHandler('TFMXChromium.UpdatePreference', e) then raise; + if not(Result) then + OutputDebugMessage('TFMXChromium.UpdatePreference error : ' + quotedstr(TempError)); + end; + except + on e : exception do + if CustomExceptionHandler('TFMXChromium.UpdatePreference', e) then raise; + end; + finally + TempValue := nil; end; end; @@ -2424,20 +2537,24 @@ begin Result := False; try - if (aBrowser <> nil) and - (aBrowser.Host <> nil) and - aBrowser.Host.RequestContext.CanSetPreference(aName) then - begin - TempValue := TCefValueRef.New; - TempValue.SetString(aValue); - Result := aBrowser.Host.RequestContext.SetPreference(aName, TempValue, TempError); + try + if (aBrowser <> nil) and + (aBrowser.Host <> nil) and + aBrowser.Host.RequestContext.CanSetPreference(aName) then + begin + TempValue := TCefValueRef.New; + TempValue.SetString(aValue); + Result := aBrowser.Host.RequestContext.SetPreference(aName, TempValue, TempError); - if not(Result) then - OutputDebugMessage('TFMXChromium.UpdatePreference error : ' + quotedstr(TempError)); - end; - except - on e : exception do - if CustomExceptionHandler('TFMXChromium.UpdatePreference', e) then raise; + if not(Result) then + OutputDebugMessage('TFMXChromium.UpdatePreference error : ' + quotedstr(TempError)); + end; + except + on e : exception do + if CustomExceptionHandler('TFMXChromium.UpdatePreference', e) then raise; + end; + finally + TempValue := nil; end; end; @@ -2452,35 +2569,40 @@ begin Result := False; try - if (aValue <> nil) and - (aValue.Count > 0) and - (aBrowser <> nil) and - (aBrowser.Host <> nil) and - aBrowser.Host.RequestContext.CanSetPreference(aName) then - begin - TempSize := aValue.Count; - TempList := TCefListValueRef.New; + try + if (aValue <> nil) and + (aValue.Count > 0) and + (aBrowser <> nil) and + (aBrowser.Host <> nil) and + aBrowser.Host.RequestContext.CanSetPreference(aName) then + begin + TempSize := aValue.Count; + TempList := TCefListValueRef.New; - if TempList.SetSize(TempSize) then - begin - i := 0; - while (i < TempSize) do - begin - TempList.SetString(i, aValue[i]); - inc(i); - end; + if TempList.SetSize(TempSize) then + begin + i := 0; + while (i < TempSize) do + begin + TempList.SetString(i, aValue[i]); + inc(i); + end; - TempValue := TCefValueRef.New; - Result := TempValue.SetList(TempList) and - aBrowser.Host.RequestContext.SetPreference(aName, TempValue, TempError); + TempValue := TCefValueRef.New; + Result := TempValue.SetList(TempList) and + aBrowser.Host.RequestContext.SetPreference(aName, TempValue, TempError); - if not(Result) then - OutputDebugMessage('TFMXChromium.UpdatePreference error : ' + quotedstr(TempError)); - end; - end; - except - on e : exception do - if CustomExceptionHandler('TFMXChromium.UpdatePreference', e) then raise; + if not(Result) then + OutputDebugMessage('TFMXChromium.UpdatePreference error : ' + quotedstr(TempError)); + end; + end; + except + on e : exception do + if CustomExceptionHandler('TFMXChromium.UpdatePreference', e) then raise; + end; + finally + TempValue := nil; + TempList := nil; end; end; @@ -2786,6 +2908,21 @@ begin if assigned(FOnCookiesFlushed) then FOnCookiesFlushed(self); end; +procedure TFMXChromium.doCertificateExceptionsCleared; +begin + if assigned(FOnCertificateExceptionsCleared) then FOnCertificateExceptionsCleared(self); +end; + +procedure TFMXChromium.doHttpAuthCredentialsCleared; +begin + if assigned(FOnHttpAuthCredentialsCleared) then FOnHttpAuthCredentialsCleared(self); +end; + +procedure TFMXChromium.doAllConnectionsClosed; +begin + if assigned(FOnAllConnectionsClosed) then FOnAllConnectionsClosed(self); +end; + function TFMXChromium.MustCreateLoadHandler : boolean; begin Result := assigned(FOnLoadStart) or diff --git a/source/uCEFInterfaces.pas b/source/uCEFInterfaces.pas index 14ead903..e675cc3c 100644 --- a/source/uCEFInterfaces.pas +++ b/source/uCEFInterfaces.pas @@ -385,6 +385,9 @@ type function doNavigationVisitorResultAvailable(const entry: ICefNavigationEntry; current: Boolean; index, total: Integer) : boolean; procedure doDownloadImageFinished(const imageUrl: ustring; httpStatusCode: Integer; const image: ICefImage); procedure doOnCookiesStoreFlushed; + procedure doCertificateExceptionsCleared; + procedure doHttpAuthCredentialsCleared; + procedure doAllConnectionsClosed; function MustCreateLoadHandler : boolean; function MustCreateFocusHandler : boolean; function MustCreateContextMenuHandler : boolean; diff --git a/source/uCEFRequestContext.pas b/source/uCEFRequestContext.pas index 6dc4b124..fa1fbc34 100644 --- a/source/uCEFRequestContext.pas +++ b/source/uCEFRequestContext.pas @@ -54,7 +54,7 @@ uses {$ELSE} Classes, SysUtils, {$ENDIF} - uCEFBaseRefCounted, uCEFInterfaces, uCEFTypes; + uCEFBaseRefCounted, uCEFInterfaces, uCEFTypes, uCEFCompletionCallback; type TCefRequestContextRef = class(TCefBaseRefCountedRef, ICefRequestContext) @@ -92,11 +92,26 @@ type class function Shared(const other: ICefRequestContext; const handler: ICefRequestContextHandler): ICefRequestContext; end; + TCefClearCertificateExceptionsCompletionCallback = class(TCefCustomCompletionCallback) + protected + procedure OnComplete; override; + end; + + TCefClearHttpAuthCredentialsCompletionCallback = class(TCefCustomCompletionCallback) + protected + procedure OnComplete; override; + end; + + TCefCloseAllConnectionsCompletionCallback = class(TCefCustomCompletionCallback) + protected + procedure OnComplete; override; + end; + implementation uses uCEFMiscFunctions, uCEFLibFunctions, uCEFValue, uCEFDictionaryValue, uCEFCookieManager, - uCEFCompletionCallback, uCEFRequestContextHandler, uCEFExtension, uCEFStringList; + uCEFRequestContextHandler, uCEFExtension, uCEFStringList; function TCefRequestContextRef.ClearSchemeHandlerFactories: Boolean; begin @@ -314,4 +329,55 @@ begin Result := nil; end; + +// TCefClearCertificateExceptionsCompletionCallback + +procedure TCefClearCertificateExceptionsCompletionCallback.OnComplete; +begin + try + try + if (FEvents <> nil) then IChromiumEvents(FEvents).doCertificateExceptionsCleared; + except + on e : exception do + if CustomExceptionHandler('TCefClearCertificateExceptionsCompletionCallback.OnComplete', e) then raise; + end; + finally + FEvents := nil; + end; +end; + + +// TCefClearHttpAuthCredentialsCompletionCallback + +procedure TCefClearHttpAuthCredentialsCompletionCallback.OnComplete; +begin + try + try + if (FEvents <> nil) then IChromiumEvents(FEvents).doHttpAuthCredentialsCleared; + except + on e : exception do + if CustomExceptionHandler('TCefClearHttpAuthCredentialsCompletionCallback.OnComplete', e) then raise; + end; + finally + FEvents := nil; + end; +end; + + +// TCefCloseAllConnectionsCompletionCallback + +procedure TCefCloseAllConnectionsCompletionCallback.OnComplete; +begin + try + try + if (FEvents <> nil) then IChromiumEvents(FEvents).doAllConnectionsClosed; + except + on e : exception do + if CustomExceptionHandler('TCefCloseAllConnectionsCompletionCallback.OnComplete', e) then raise; + end; + finally + FEvents := nil; + end; +end; + end. diff --git a/update_CEF4Delphi.json b/update_CEF4Delphi.json index b673ad4c..14c3ca48 100644 --- a/update_CEF4Delphi.json +++ b/update_CEF4Delphi.json @@ -1,10 +1,10 @@ { "UpdateLazPackages" : [ { - "ForceNotify" : true, - "InternalVersion" : 39, + "ForceNotify" : false, + "InternalVersion" : 40, "Name" : "cef4delphi_lazarus.lpk", - "Version" : "77.1.11.0" + "Version" : "77.1.12.0" } ], "UpdatePackageData" : { From 213162cef57498f344b54d6e4b9c01095d94c9a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Salvador=20D=C3=ADaz=20Fau?= Date: Tue, 8 Oct 2019 15:17:37 +0200 Subject: [PATCH 08/13] Default TFMXChromium.PrintingEnabled value set to True --- source/uCEFFMXChromium.pas | 1 + 1 file changed, 1 insertion(+) diff --git a/source/uCEFFMXChromium.pas b/source/uCEFFMXChromium.pas index 4a1c5237..06e757fa 100644 --- a/source/uCEFFMXChromium.pas +++ b/source/uCEFFMXChromium.pas @@ -815,6 +815,7 @@ begin FZoomStep := ZOOM_STEP_DEF; FSafeSearch := False; FYouTubeRestrict := YOUTUBE_RESTRICT_OFF; + FPrintingEnabled := True; {$IFDEF MSWINDOWS} FOldBrowserCompWndPrc := nil; From 096b2c9a4b838195bf91657e41c5ba7ec9f716a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Salvador=20D=C3=ADaz=20Fau?= Date: Wed, 9 Oct 2019 12:24:47 +0200 Subject: [PATCH 09/13] Added TCEFSentinel component - Added TCEFSentinel to MiniBrowser, TabbedBrowser, ToolBoxBrowser and SimpleBrowser2. --- demos/Delphi_VCL/MiniBrowser/uMiniBrowser.dfm | 5 + demos/Delphi_VCL/MiniBrowser/uMiniBrowser.pas | 16 +- .../SimpleBrowser2/uSimpleBrowser2.dfm | 5 + .../SimpleBrowser2/uSimpleBrowser2.pas | 13 +- demos/Delphi_VCL/TabbedBrowser/TabBrowser.dpr | 2 +- demos/Delphi_VCL/TabbedBrowser/uMainForm.dfm | 5 + demos/Delphi_VCL/TabbedBrowser/uMainForm.pas | 17 +- demos/Delphi_VCL/ToolBoxBrowser/uMainForm.dfm | 4 + demos/Delphi_VCL/ToolBoxBrowser/uMainForm.pas | 19 +- demos/Lazarus/MiniBrowser/MiniBrowser.lps | 72 ++-- demos/Lazarus/MiniBrowser/uMiniBrowser.lfm | 5 + demos/Lazarus/MiniBrowser/uMiniBrowser.pas | 16 +- demos/Lazarus/PopupBrowser2/PopupBrowser2.lps | 102 +++--- demos/Lazarus/PopupBrowser2/uMainForm.pas | 1 - .../PostInspectorBrowser.lps | 153 +++------ .../uPostInspectorBrowser.lfm | 4 +- .../Lazarus/SimpleBrowser2/SimpleBrowser2.lps | 14 +- .../SimpleBrowser2/usimplelazarusbrowser.lfm | 5 + .../SimpleBrowser2/usimplelazarusbrowser.pas | 15 +- demos/Lazarus/TabbedBrowser/TabBrowser.lps | 29 +- demos/Lazarus/TabbedBrowser/uMainForm.lfm | 5 + demos/Lazarus/TabbedBrowser/uMainForm.pas | 20 +- .../Lazarus/ToolBoxBrowser/ToolBoxBrowser.lps | 54 ++- demos/Lazarus/ToolBoxBrowser/uMainForm.lfm | 4 + demos/Lazarus/ToolBoxBrowser/uMainForm.pas | 21 +- demos/Lazarus/URLRequest/URLRequest.lps | 94 +++++- demos/Lazarus/URLRequest/uURLRequest.pas | 4 +- packages/CEF4Delphi.dpk | 3 +- packages/CEF4Delphi.dproj | 3 +- packages/CEF4Delphi_D7.dpk | 3 +- packages/CEF4Delphi_D7_Register.pas | 4 +- packages/CEF4Delphi_FMX.dpk | 3 +- packages/CEF4Delphi_FMX.dproj | 1 + packages/CEF4Delphi_FMX_Register.pas | 6 +- packages/CEF4Delphi_Register.pas | 4 +- packages/cef4delphi_lazarus.lpk | 11 +- packages/cef4delphi_lazarus.pas | 3 +- packages/res/chromium.dcr | Bin 20184 -> 22008 bytes packages/res/chromium.rc | 3 +- packages/res/tcefsentinel.bmp | Bin 0 -> 1782 bytes packages/res/tcefsentinel.png | Bin 0 -> 1343 bytes source/res/tcefsentinel.lrs | 59 ++++ source/uCEFConstants.pas | 2 + source/uCEFSentinel.pas | 318 ++++++++++++++++++ update_CEF4Delphi.json | 4 +- 45 files changed, 852 insertions(+), 279 deletions(-) create mode 100644 packages/res/tcefsentinel.bmp create mode 100644 packages/res/tcefsentinel.png create mode 100644 source/res/tcefsentinel.lrs create mode 100644 source/uCEFSentinel.pas diff --git a/demos/Delphi_VCL/MiniBrowser/uMiniBrowser.dfm b/demos/Delphi_VCL/MiniBrowser/uMiniBrowser.dfm index 0e696c1b..2b878157 100644 --- a/demos/Delphi_VCL/MiniBrowser/uMiniBrowser.dfm +++ b/demos/Delphi_VCL/MiniBrowser/uMiniBrowser.dfm @@ -395,4 +395,9 @@ object MiniBrowserFrm: TMiniBrowserFrm Left = 32 Top = 344 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + Left = 32 + Top = 408 + end end diff --git a/demos/Delphi_VCL/MiniBrowser/uMiniBrowser.pas b/demos/Delphi_VCL/MiniBrowser/uMiniBrowser.pas index 1f441494..e138bf9c 100644 --- a/demos/Delphi_VCL/MiniBrowser/uMiniBrowser.pas +++ b/demos/Delphi_VCL/MiniBrowser/uMiniBrowser.pas @@ -51,7 +51,7 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Types, ComCtrls, ClipBrd, AppEvnts, ActiveX, ShlObj, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFApplication, uCEFTypes, uCEFConstants, - uCEFWinControl; + uCEFWinControl, uCEFSentinel; const MINIBROWSER_SHOWDEVTOOLS = WM_APP + $101; @@ -126,6 +126,7 @@ type Downloadimage1: TMenuItem; Simulatekeyboardpresses1: TMenuItem; Flushcookies1: TMenuItem; + CEFSentinel1: TCEFSentinel; procedure FormShow(Sender: TObject); procedure BackBtnClick(Sender: TObject); procedure ForwardBtnClick(Sender: TObject); @@ -226,6 +227,7 @@ type procedure Simulatekeyboardpresses1Click(Sender: TObject); procedure Flushcookies1Click(Sender: TObject); procedure Chromium1CookiesFlushed(Sender: TObject); + procedure CEFSentinel1Close(Sender: TObject); protected FResponse : TStringList; @@ -331,6 +333,12 @@ begin if (length(TempURL) > 0) then Chromium1.ResolveHost(TempURL); end; +procedure TMiniBrowserFrm.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TMiniBrowserFrm.Chromium1AddressChange(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const url: ustring); begin @@ -348,11 +356,7 @@ end; procedure TMiniBrowserFrm.Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); begin // The main browser is being destroyed - if (Chromium1.BrowserId = 0) then - begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); - end; + if (Chromium1.BrowserId = 0) then CEFSentinel1.Start; end; procedure TMiniBrowserFrm.Chromium1BeforeContextMenu(Sender: TObject; diff --git a/demos/Delphi_VCL/SimpleBrowser2/uSimpleBrowser2.dfm b/demos/Delphi_VCL/SimpleBrowser2/uSimpleBrowser2.dfm index 9e168af3..985eed34 100644 --- a/demos/Delphi_VCL/SimpleBrowser2/uSimpleBrowser2.dfm +++ b/demos/Delphi_VCL/SimpleBrowser2/uSimpleBrowser2.dfm @@ -77,4 +77,9 @@ object Form1: TForm1 Left = 56 Top = 152 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + Left = 56 + Top = 224 + end end diff --git a/demos/Delphi_VCL/SimpleBrowser2/uSimpleBrowser2.pas b/demos/Delphi_VCL/SimpleBrowser2/uSimpleBrowser2.pas index 9ba479d0..59d8825c 100644 --- a/demos/Delphi_VCL/SimpleBrowser2/uSimpleBrowser2.pas +++ b/demos/Delphi_VCL/SimpleBrowser2/uSimpleBrowser2.pas @@ -50,7 +50,7 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFConstants, uCEFTypes, - uCEFWinControl; + uCEFWinControl, uCEFSentinel; type TForm1 = class(TForm) @@ -60,6 +60,7 @@ type Timer1: TTimer; Chromium1: TChromium; CEFWindowParent1: TCEFWindowParent; + CEFSentinel1: TCEFSentinel; procedure GoBtnClick(Sender: TObject); procedure FormShow(Sender: TObject); procedure Timer1Timer(Sender: TObject); @@ -84,6 +85,7 @@ type const targetUrl: ustring; targetDisposition: TCefWindowOpenDisposition; userGesture: Boolean; out Result: Boolean); + procedure CEFSentinel1Close(Sender: TObject); protected // Variables to control when can we destroy the form safely FCanClose : boolean; // Set to True in TChromium.OnBeforeClose @@ -162,6 +164,12 @@ begin if not(Chromium1.CreateBrowser(CEFWindowParent1)) then Timer1.Enabled := True; end; +procedure TForm1.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TForm1.Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); begin // Now the browser is fully initialized we can send a message to the main form to load the initial web page. @@ -171,8 +179,7 @@ end; procedure TForm1.Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TForm1.Chromium1BeforePopup(Sender: TObject; diff --git a/demos/Delphi_VCL/TabbedBrowser/TabBrowser.dpr b/demos/Delphi_VCL/TabbedBrowser/TabBrowser.dpr index 59596d2e..6dcae923 100644 --- a/demos/Delphi_VCL/TabbedBrowser/TabBrowser.dpr +++ b/demos/Delphi_VCL/TabbedBrowser/TabBrowser.dpr @@ -39,7 +39,7 @@ program TabBrowser; {$I cef.inc} -uses +uses {$IFDEF DELPHI16_UP} Vcl.Forms, WinApi.Windows, diff --git a/demos/Delphi_VCL/TabbedBrowser/uMainForm.dfm b/demos/Delphi_VCL/TabbedBrowser/uMainForm.dfm index 8733adbb..757e2284 100644 --- a/demos/Delphi_VCL/TabbedBrowser/uMainForm.dfm +++ b/demos/Delphi_VCL/TabbedBrowser/uMainForm.dfm @@ -202,4 +202,9 @@ object MainForm: TMainForm TabOrder = 1 OnChange = PageControl1Change end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + Left = 344 + Top = 104 + end end diff --git a/demos/Delphi_VCL/TabbedBrowser/uMainForm.pas b/demos/Delphi_VCL/TabbedBrowser/uMainForm.pas index 5ca90519..63c6285f 100644 --- a/demos/Delphi_VCL/TabbedBrowser/uMainForm.pas +++ b/demos/Delphi_VCL/TabbedBrowser/uMainForm.pas @@ -49,7 +49,8 @@ uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, Buttons, ExtCtrls, StdCtrls, {$ENDIF} - uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFApplication, uCEFTypes, uCEFConstants; + uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFApplication, uCEFTypes, uCEFConstants, + uCEFSentinel; const CEFBROWSER_DESTROYWNDPARENT = WM_APP + $100; @@ -72,6 +73,7 @@ type URLCbx: TComboBox; AddTabBtn: TButton; RemoveTabBtn: TButton; + CEFSentinel1: TCEFSentinel; procedure AddTabBtnClick(Sender: TObject); procedure RemoveTabBtnClick(Sender: TObject); procedure FormShow(Sender: TObject); @@ -83,6 +85,7 @@ type procedure StopBtnClick(Sender: TObject); procedure GoBtnClick(Sender: TObject); procedure FormCreate(Sender: TObject); + procedure CEFSentinel1Close(Sender: TObject); protected FClosingTab : boolean; @@ -349,11 +352,7 @@ begin begin PageControl1.Pages[aMessage.lParam].Tag := 1; - if AllTabSheetsAreTagged then - begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); - end; + if AllTabSheetsAreTagged then CEFSentinel1.Start; end; end; @@ -575,4 +574,10 @@ begin end; end; +procedure TMainForm.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + end. diff --git a/demos/Delphi_VCL/ToolBoxBrowser/uMainForm.dfm b/demos/Delphi_VCL/ToolBoxBrowser/uMainForm.dfm index 7855e381..fc1929fa 100644 --- a/demos/Delphi_VCL/ToolBoxBrowser/uMainForm.dfm +++ b/demos/Delphi_VCL/ToolBoxBrowser/uMainForm.dfm @@ -45,4 +45,8 @@ object MainForm: TMainForm OnClick = Button1Click end end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + Left = 224 + end end diff --git a/demos/Delphi_VCL/ToolBoxBrowser/uMainForm.pas b/demos/Delphi_VCL/ToolBoxBrowser/uMainForm.pas index b4b060f8..19bf295a 100644 --- a/demos/Delphi_VCL/ToolBoxBrowser/uMainForm.pas +++ b/demos/Delphi_VCL/ToolBoxBrowser/uMainForm.pas @@ -44,11 +44,12 @@ interface uses {$IFDEF DELPHI16_UP} Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, - Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls; + Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, {$ELSE} Windows, Messages, SysUtils, Variants, Classes, Graphics, - Controls, Forms, Dialogs, StdCtrls, ExtCtrls; + Controls, Forms, Dialogs, StdCtrls, ExtCtrls, {$ENDIF} + uCEFSentinel; const CEFBROWSER_CREATED = WM_APP + $100; @@ -61,9 +62,11 @@ type ButtonPnl: TPanel; Edit1: TEdit; Button1: TButton; + CEFSentinel1: TCEFSentinel; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure FormShow(Sender: TObject); + procedure CEFSentinel1Close(Sender: TObject); private // Variables to control when can we destroy the form safely FCanClose : boolean; // Set to True when all the child forms are closed @@ -206,11 +209,7 @@ end; procedure TMainForm.ChildDestroyedMsg(var aMessage : TMessage); begin // If there are no more child forms we can destroy the main form - if FClosing and (ChildFormCount = 0) then - begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); - end; + if FClosing and (ChildFormCount = 0) then CEFSentinel1.Start; end; function TMainForm.CloseQuery: Boolean; @@ -241,6 +240,12 @@ begin cursor := crDefault; end; +procedure TMainForm.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TMainForm.FormShow(Sender: TObject); begin if (GlobalCEFApp <> nil) and GlobalCEFApp.GlobalContextInitialized then diff --git a/demos/Lazarus/MiniBrowser/MiniBrowser.lps b/demos/Lazarus/MiniBrowser/MiniBrowser.lps index 559a529e..4865a81e 100644 --- a/demos/Lazarus/MiniBrowser/MiniBrowser.lps +++ b/demos/Lazarus/MiniBrowser/MiniBrowser.lps @@ -22,12 +22,12 @@ - - + + - - + + @@ -83,123 +83,123 @@ - + - + - + - + - + - - + + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/demos/Lazarus/MiniBrowser/uMiniBrowser.lfm b/demos/Lazarus/MiniBrowser/uMiniBrowser.lfm index e0ed887d..825cde4d 100644 --- a/demos/Lazarus/MiniBrowser/uMiniBrowser.lfm +++ b/demos/Lazarus/MiniBrowser/uMiniBrowser.lfm @@ -365,4 +365,9 @@ object MiniBrowserFrm: TMiniBrowserFrm left = 32 top = 344 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + left = 32 + top = 404 + end end diff --git a/demos/Lazarus/MiniBrowser/uMiniBrowser.pas b/demos/Lazarus/MiniBrowser/uMiniBrowser.pas index 69e7d5df..b1657343 100644 --- a/demos/Lazarus/MiniBrowser/uMiniBrowser.pas +++ b/demos/Lazarus/MiniBrowser/uMiniBrowser.pas @@ -45,7 +45,7 @@ uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Menus, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Types, ComCtrls, ClipBrd, ActiveX, ShlObj, uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFApplication, uCEFTypes, uCEFConstants, - uCEFWinControl, uCEFChromiumEvents; + uCEFWinControl, uCEFChromiumEvents, uCEFSentinel; const MINIBROWSER_SHOWDEVTOOLS = WM_APP + $101; @@ -82,6 +82,7 @@ type { TMiniBrowserFrm } TMiniBrowserFrm = class(TForm) + CEFSentinel1: TCEFSentinel; MenuItem1: TMenuItem; MenuItem2: TMenuItem; MenuItem3: TMenuItem; @@ -123,6 +124,7 @@ type OpenfilewithaDAT1: TMenuItem; N5: TMenuItem; Memoryinfo1: TMenuItem; + procedure CEFSentinel1Close(Sender: TObject); procedure Chromium1CookiesFlushed(Sender: TObject); procedure Chromium1DownloadImageFinished(Sender: TObject; const imageUrl: ustring; httpStatusCode: Integer; const image: ICefImage); @@ -394,11 +396,7 @@ end; procedure TMiniBrowserFrm.Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); begin // The main browser is being destroyed - if (Chromium1.BrowserId = 0) then - begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); - end; + if (Chromium1.BrowserId = 0) then CEFSentinel1.Start; end; procedure TMiniBrowserFrm.Chromium1BeforeContextMenu(Sender: TObject; @@ -985,6 +983,12 @@ begin PostMessage(Handle, MINIBROWSER_COOKIESFLUSHED, 0, 0); end; +procedure TMiniBrowserFrm.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TMiniBrowserFrm.CookiesFlushedMsg(var aMessage : TMessage); begin showmessage('The cookies were flushed successfully'); diff --git a/demos/Lazarus/PopupBrowser2/PopupBrowser2.lps b/demos/Lazarus/PopupBrowser2/PopupBrowser2.lps index c21dfb8e..2f74c249 100644 --- a/demos/Lazarus/PopupBrowser2/PopupBrowser2.lps +++ b/demos/Lazarus/PopupBrowser2/PopupBrowser2.lps @@ -22,8 +22,8 @@ - - + + @@ -36,8 +36,8 @@ - - + + @@ -80,119 +80,127 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - + - - - - - - - - - - + + - - + + + + + + + + + + - + - - - - - - - - + + + + + + + + + + + + + + + + diff --git a/demos/Lazarus/PopupBrowser2/uMainForm.pas b/demos/Lazarus/PopupBrowser2/uMainForm.pas index f8b1e814..37340ef3 100644 --- a/demos/Lazarus/PopupBrowser2/uMainForm.pas +++ b/demos/Lazarus/PopupBrowser2/uMainForm.pas @@ -165,7 +165,6 @@ begin if not(FClosingMainForm) then begin FClosingMainForm := True; - Visible := False; Chromium1.CloseBrowser(True); end; end; diff --git a/demos/Lazarus/PostInspectorBrowser/PostInspectorBrowser.lps b/demos/Lazarus/PostInspectorBrowser/PostInspectorBrowser.lps index 1811a736..cbb7c8c8 100644 --- a/demos/Lazarus/PostInspectorBrowser/PostInspectorBrowser.lps +++ b/demos/Lazarus/PostInspectorBrowser/PostInspectorBrowser.lps @@ -4,11 +4,12 @@ - + - + + @@ -20,13 +21,10 @@ - - - - + + + - - @@ -36,111 +34,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/demos/Lazarus/PostInspectorBrowser/uPostInspectorBrowser.lfm b/demos/Lazarus/PostInspectorBrowser/uPostInspectorBrowser.lfm index 7add8bc8..33f35539 100644 --- a/demos/Lazarus/PostInspectorBrowser/uPostInspectorBrowser.lfm +++ b/demos/Lazarus/PostInspectorBrowser/uPostInspectorBrowser.lfm @@ -1,7 +1,7 @@ object Form1: TForm1 - Left = 71 + Left = 670 Height = 699 - Top = 65 + Top = 69 Width = 1038 Caption = 'Initializing browser. Please wait...' ClientHeight = 699 diff --git a/demos/Lazarus/SimpleBrowser2/SimpleBrowser2.lps b/demos/Lazarus/SimpleBrowser2/SimpleBrowser2.lps index 990bef31..4e8e82b9 100644 --- a/demos/Lazarus/SimpleBrowser2/SimpleBrowser2.lps +++ b/demos/Lazarus/SimpleBrowser2/SimpleBrowser2.lps @@ -35,8 +35,8 @@ - - + + @@ -423,7 +423,7 @@ - + @@ -456,6 +456,14 @@ + + + + + + + + diff --git a/demos/Lazarus/SimpleBrowser2/usimplelazarusbrowser.lfm b/demos/Lazarus/SimpleBrowser2/usimplelazarusbrowser.lfm index dc47b1bd..ea35093d 100644 --- a/demos/Lazarus/SimpleBrowser2/usimplelazarusbrowser.lfm +++ b/demos/Lazarus/SimpleBrowser2/usimplelazarusbrowser.lfm @@ -66,4 +66,9 @@ object Form1: TForm1 left = 40 top = 136 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + left = 40 + top = 216 + end end diff --git a/demos/Lazarus/SimpleBrowser2/usimplelazarusbrowser.pas b/demos/Lazarus/SimpleBrowser2/usimplelazarusbrowser.pas index ff6c608f..827d02a4 100644 --- a/demos/Lazarus/SimpleBrowser2/usimplelazarusbrowser.pas +++ b/demos/Lazarus/SimpleBrowser2/usimplelazarusbrowser.pas @@ -42,19 +42,21 @@ unit uSimpleLazarusBrowser; interface uses - Windows, Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, - StdCtrls, LMessages, - uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFConstants, uCEFTypes, uCEFChromiumEvents; + Windows, Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, + ExtCtrls, StdCtrls, LMessages, uCEFChromium, uCEFWindowParent, uCEFInterfaces, + uCEFConstants, uCEFTypes, uCEFChromiumEvents, uCEFSentinel; type { TForm1 } TForm1 = class(TForm) + CEFSentinel1: TCEFSentinel; CEFWindowParent1: TCEFWindowParent; Chromium1: TChromium; GoBtn: TButton; AddressEdt: TEdit; AddressPnl: TPanel; Timer1: TTimer; + procedure CEFSentinel1Close(Sender: TObject); procedure Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser ); procedure Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); @@ -154,12 +156,17 @@ begin PostMessage(Handle, CEF_AFTERCREATED, 0, 0); end; -procedure TForm1.Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); +procedure TForm1.CEFSentinel1Close(Sender: TObject); begin FCanClose := True; PostMessage(Handle, WM_CLOSE, 0, 0); end; +procedure TForm1.Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); +begin + CEFSentinel1.Start; +end; + procedure TForm1.Chromium1BeforePopup(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const targetUrl, targetFrameName: ustring; targetDisposition: TCefWindowOpenDisposition; diff --git a/demos/Lazarus/TabbedBrowser/TabBrowser.lps b/demos/Lazarus/TabbedBrowser/TabBrowser.lps index b2161791..cc34764b 100644 --- a/demos/Lazarus/TabbedBrowser/TabBrowser.lps +++ b/demos/Lazarus/TabbedBrowser/TabBrowser.lps @@ -22,15 +22,18 @@ - - + + + + + - + @@ -50,6 +53,26 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/demos/Lazarus/TabbedBrowser/uMainForm.lfm b/demos/Lazarus/TabbedBrowser/uMainForm.lfm index f8052216..87b9c13b 100644 --- a/demos/Lazarus/TabbedBrowser/uMainForm.lfm +++ b/demos/Lazarus/TabbedBrowser/uMainForm.lfm @@ -193,4 +193,9 @@ object MainForm: TMainForm TabOrder = 1 OnChange = PageControl1Change end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + left = 160 + top = 121 + end end diff --git a/demos/Lazarus/TabbedBrowser/uMainForm.pas b/demos/Lazarus/TabbedBrowser/uMainForm.pas index fac381fb..d5d35c09 100644 --- a/demos/Lazarus/TabbedBrowser/uMainForm.pas +++ b/demos/Lazarus/TabbedBrowser/uMainForm.pas @@ -49,7 +49,8 @@ uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, Buttons, ExtCtrls, StdCtrls, {$ENDIF} - uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFApplication, uCEFTypes, uCEFConstants; + uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFApplication, uCEFTypes, + uCEFConstants, uCEFSentinel; const CEFBROWSER_DESTROYWNDPARENT = WM_APP + $100; @@ -58,7 +59,11 @@ const CEFBROWSER_CHECKTAGGEDTABS = WM_APP + $103; type + + { TMainForm } + TMainForm = class(TForm) + CEFSentinel1: TCEFSentinel; PageControl1: TPageControl; ButtonPnl: TPanel; NavButtonPnl: TPanel; @@ -73,6 +78,7 @@ type AddTabBtn: TButton; RemoveTabBtn: TButton; procedure AddTabBtnClick(Sender: TObject); + procedure CEFSentinel1Close(Sender: TObject); procedure RemoveTabBtnClick(Sender: TObject); procedure FormShow(Sender: TObject); procedure PageControl1Change(Sender: TObject); @@ -187,6 +193,12 @@ begin TempChromium.CreateBrowser(TempWindowParent, ''); end; +procedure TMainForm.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TMainForm.RemoveTabBtnClick(Sender: TObject); var TempChromium : TChromium; @@ -349,11 +361,7 @@ begin begin PageControl1.Pages[aMessage.lParam].Tag := 1; - if AllTabSheetsAreTagged then - begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); - end; + if AllTabSheetsAreTagged then CEFSentinel1.Start; end; end; diff --git a/demos/Lazarus/ToolBoxBrowser/ToolBoxBrowser.lps b/demos/Lazarus/ToolBoxBrowser/ToolBoxBrowser.lps index 4e414527..9bbc5798 100644 --- a/demos/Lazarus/ToolBoxBrowser/ToolBoxBrowser.lps +++ b/demos/Lazarus/ToolBoxBrowser/ToolBoxBrowser.lps @@ -4,13 +4,13 @@ - + - + @@ -22,9 +22,13 @@ - - - + + + + + + + @@ -36,15 +40,29 @@ - + - + + + + + + + + + + + + + + + - + @@ -56,6 +74,26 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/demos/Lazarus/ToolBoxBrowser/uMainForm.lfm b/demos/Lazarus/ToolBoxBrowser/uMainForm.lfm index e8bdaccc..35c3c87d 100644 --- a/demos/Lazarus/ToolBoxBrowser/uMainForm.lfm +++ b/demos/Lazarus/ToolBoxBrowser/uMainForm.lfm @@ -45,4 +45,8 @@ object MainForm: TMainForm TabOrder = 1 end end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + left = 232 + end end diff --git a/demos/Lazarus/ToolBoxBrowser/uMainForm.pas b/demos/Lazarus/ToolBoxBrowser/uMainForm.pas index 15c02bec..1a1d98c8 100644 --- a/demos/Lazarus/ToolBoxBrowser/uMainForm.pas +++ b/demos/Lazarus/ToolBoxBrowser/uMainForm.pas @@ -49,7 +49,7 @@ uses Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls; {$ELSE} LCLIntf, LCLType, LMessages, Messages, SysUtils, Variants, Classes, Graphics, - Controls, Forms, Dialogs, StdCtrls, ExtCtrls; + Controls, Forms, Dialogs, StdCtrls, ExtCtrls, uCEFSentinel; {$ENDIF} const @@ -59,10 +59,15 @@ const CEFBROWSER_INITIALIZED = WM_APP + $103; type + + { TMainForm } + TMainForm = class(TForm) ButtonPnl: TPanel; + CEFSentinel1: TCEFSentinel; Edit1: TEdit; Button1: TButton; + procedure CEFSentinel1Close(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure FormShow(Sender: TObject); @@ -132,6 +137,12 @@ begin FClosing := False; end; +procedure TMainForm.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TMainForm.CloseAllChildForms; var i : integer; @@ -207,12 +218,8 @@ end; procedure TMainForm.ChildDestroyedMsg(var aMessage : TMessage); begin - // If there are no more child forms we can destroy the main form - if FClosing and (ChildFormCount = 0) then - begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); - end; + // If there are no more child forms we start the sentinel + if FClosing and (ChildFormCount = 0) then CEFSentinel1.Start; end; function TMainForm.CloseQuery: Boolean; diff --git a/demos/Lazarus/URLRequest/URLRequest.lps b/demos/Lazarus/URLRequest/URLRequest.lps index 8cf3d075..e6172724 100644 --- a/demos/Lazarus/URLRequest/URLRequest.lps +++ b/demos/Lazarus/URLRequest/URLRequest.lps @@ -4,13 +4,13 @@ - + - + @@ -20,11 +20,10 @@ - - - - + + + @@ -36,8 +35,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -45,6 +69,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demos/Lazarus/URLRequest/uURLRequest.pas b/demos/Lazarus/URLRequest/uURLRequest.pas index 77c92c93..b77dc9b8 100644 --- a/demos/Lazarus/URLRequest/uURLRequest.pas +++ b/demos/Lazarus/URLRequest/uURLRequest.pas @@ -144,8 +144,8 @@ uses procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; - //GlobalCEFApp.LogFile := 'cef.log'; - //GlobalCEFApp.LogSeverity := LOGSEVERITY_VERBOSE; + GlobalCEFApp.LogFile := 'cef.log'; + GlobalCEFApp.LogSeverity := LOGSEVERITY_VERBOSE; end; procedure TURLRequestFrm.DownloadBtnClick(Sender: TObject); diff --git a/packages/CEF4Delphi.dpk b/packages/CEF4Delphi.dpk index cb305eec..76efd990 100644 --- a/packages/CEF4Delphi.dpk +++ b/packages/CEF4Delphi.dpk @@ -171,7 +171,8 @@ contains uCEFCookieAccessFilter in '..\source\uCEFCookieAccessFilter.pas', uCEFResourceRequestHandler in '..\source\uCEFResourceRequestHandler.pas', uCEFResourceSkipCallback in '..\source\uCEFResourceSkipCallback.pas', - uCEFResourceReadCallback in '..\source\uCEFResourceReadCallback.pas'; + uCEFResourceReadCallback in '..\source\uCEFResourceReadCallback.pas', + uCEFSentinel in '..\source\uCEFSentinel.pas'; end. diff --git a/packages/CEF4Delphi.dproj b/packages/CEF4Delphi.dproj index 0f4af41b..a038e580 100644 --- a/packages/CEF4Delphi.dproj +++ b/packages/CEF4Delphi.dproj @@ -266,6 +266,7 @@ + Base @@ -301,13 +302,13 @@ + CEF4Delphi.bpl true - 1 diff --git a/packages/CEF4Delphi_D7.dpk b/packages/CEF4Delphi_D7.dpk index 1a74394a..ffae016f 100644 --- a/packages/CEF4Delphi_D7.dpk +++ b/packages/CEF4Delphi_D7.dpk @@ -168,6 +168,7 @@ contains uCEFCookieAccessFilter in '..\source\uCEFCookieAccessFilter.pas', uCEFResourceRequestHandler in '..\source\uCEFResourceRequestHandler.pas', uCEFResourceSkipCallback in '..\source\uCEFResourceSkipCallback.pas', - uCEFResourceReadCallback in '..\source\uCEFResourceReadCallback.pas'; + uCEFResourceReadCallback in '..\source\uCEFResourceReadCallback.pas', + uCEFSentinel in '..\source\uCEFSentinel.pas'; end. diff --git a/packages/CEF4Delphi_D7_Register.pas b/packages/CEF4Delphi_D7_Register.pas index b7d40754..6717434b 100644 --- a/packages/CEF4Delphi_D7_Register.pas +++ b/packages/CEF4Delphi_D7_Register.pas @@ -50,13 +50,13 @@ implementation uses Classes, uCEFChromium, uCEFWindowParent, uCEFChromiumWindow, uCEFBufferPanel, uCEFWorkScheduler, - uCEFServerComponent, uCEFLinkedWindowParent, uCEFUrlRequestClientComponent; + uCEFServerComponent, uCEFLinkedWindowParent, uCEFUrlRequestClientComponent, uCEFSentinel; procedure Register; begin RegisterComponents('Chromium', [TChromium, TCEFWindowParent, TChromiumWindow, TBufferPanel, TCEFWorkScheduler, TCEFServerComponent, TCEFLinkedWindowParent, - TCEFUrlRequestClientComponent]); + TCEFUrlRequestClientComponent, TCEFSentinel]); end; end. diff --git a/packages/CEF4Delphi_FMX.dpk b/packages/CEF4Delphi_FMX.dpk index 4739aad5..020ec26f 100644 --- a/packages/CEF4Delphi_FMX.dpk +++ b/packages/CEF4Delphi_FMX.dpk @@ -176,7 +176,8 @@ contains uCEFCookieAccessFilter in '..\source\uCEFCookieAccessFilter.pas', uCEFResourceRequestHandler in '..\source\uCEFResourceRequestHandler.pas', uCEFResourceSkipCallback in '..\source\uCEFResourceSkipCallback.pas', - uCEFResourceReadCallback in '..\source\uCEFResourceReadCallback.pas'; + uCEFResourceReadCallback in '..\source\uCEFResourceReadCallback.pas', + uCEFSentinel in '..\source\uCEFSentinel.pas'; end. diff --git a/packages/CEF4Delphi_FMX.dproj b/packages/CEF4Delphi_FMX.dproj index 1d9e5434..20a75516 100644 --- a/packages/CEF4Delphi_FMX.dproj +++ b/packages/CEF4Delphi_FMX.dproj @@ -292,6 +292,7 @@ + Base diff --git a/packages/CEF4Delphi_FMX_Register.pas b/packages/CEF4Delphi_FMX_Register.pas index 533864a9..c3af03d0 100644 --- a/packages/CEF4Delphi_FMX_Register.pas +++ b/packages/CEF4Delphi_FMX_Register.pas @@ -51,7 +51,8 @@ uses System.Classes, uCEFChromium, uCEFWindowParent, uCEFChromiumWindow, uCEFBufferPanel, uCEFWorkScheduler, uCEFFMXBufferPanel, uCEFFMXChromium, uCEFFMXWorkScheduler, - uCEFServerComponent, uCEFLinkedWindowParent, uCEFUrlRequestClientComponent; + uCEFServerComponent, uCEFLinkedWindowParent, uCEFUrlRequestClientComponent, + uCEFSentinel; procedure Register; begin @@ -59,7 +60,8 @@ begin TBufferPanel, TFMXBufferPanel, TFMXChromium, TFMXWorkScheduler, TCEFWorkScheduler, TCEFServerComponent, TCEFLinkedWindowParent, - TCEFUrlRequestClientComponent]); + TCEFUrlRequestClientComponent, + TCEFSentinel]); end; end. diff --git a/packages/CEF4Delphi_Register.pas b/packages/CEF4Delphi_Register.pas index 1cc52135..6ee4b150 100644 --- a/packages/CEF4Delphi_Register.pas +++ b/packages/CEF4Delphi_Register.pas @@ -54,13 +54,13 @@ uses Classes, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFChromiumWindow, uCEFBufferPanel, uCEFWorkScheduler, - uCEFServerComponent, uCEFLinkedWindowParent, uCEFUrlRequestClientComponent; + uCEFServerComponent, uCEFLinkedWindowParent, uCEFUrlRequestClientComponent, uCEFSentinel; procedure Register; begin RegisterComponents('Chromium', [TChromium, TCEFWindowParent, TChromiumWindow, TBufferPanel, TCEFWorkScheduler, TCEFServerComponent, TCEFLinkedWindowParent, - TCEFUrlRequestClientComponent]); + TCEFUrlRequestClientComponent, TCEFSentinel]); end; end. diff --git a/packages/cef4delphi_lazarus.lpk b/packages/cef4delphi_lazarus.lpk index 64683f22..fa502f37 100644 --- a/packages/cef4delphi_lazarus.lpk +++ b/packages/cef4delphi_lazarus.lpk @@ -22,7 +22,7 @@ - + @@ -599,6 +599,15 @@ + + + + + + + + + diff --git a/packages/cef4delphi_lazarus.pas b/packages/cef4delphi_lazarus.pas index 7c8912e9..03f2724f 100644 --- a/packages/cef4delphi_lazarus.pas +++ b/packages/cef4delphi_lazarus.pas @@ -49,7 +49,7 @@ uses uCEFLinkedWindowParent, uCEFUrlRequestClientEvents, uCEFUrlRequestClientComponent, uCEFOSRIMEHandler, uCEFCookieAccessFilter, uCEFResourceReadCallback, uCEFResourceRequestHandler, - uCEFResourceSkipCallback, LazarusPackageIntf; + uCEFResourceSkipCallback, uCEFSentinel, LazarusPackageIntf; implementation @@ -64,6 +64,7 @@ begin RegisterUnit('uCEFLinkedWindowParent', @uCEFLinkedWindowParent.Register); RegisterUnit('uCEFUrlRequestClientComponent', @uCEFUrlRequestClientComponent.Register); + RegisterUnit('uCEFSentinel', @uCEFSentinel.Register); end; initialization diff --git a/packages/res/chromium.dcr b/packages/res/chromium.dcr index c6bc0923a470252947226f05335727bf7d414352..7219d918b9e5054f948402f60e0033ff63eaf56e 100644 GIT binary patch delta 1168 zcmZ9Kc}$yi7{_1ckx10dDNbF$G1!(d$o^o0GsZACNfxkx>=2kEl%YEU+W;AIb{w*U za`bJv3-+QH(39SMd-ImIZx4EbAcx>Kkq{+eg~(yoWhCzR*Y8O_-|zE0zu$M97_`O? z;*O(0OvtO?R75aXmJs|F3OEOx1yI0OKr#S;;m6KYZ*OluY$t>!CLBDUbh7?td`WIa zLpi3dtgx!^!wZS~l1_zZr$(3NM%~E#IQh)MZ;~?03jLCo&gSOk+S*!9P3hr+jNQ3k zS8@m{tJE=Ra8JVvi;ldZ2M1~{rBUnoi1>I#&TFZkMb}*YuCa1uWo5hi|4u%i&+GLj zUqhd4FVCPik||xpF0hw`M`h)No=A^Nz3~w$x3#-j)KBafBBKSJXkPo5`DmBRwZ6W- zlSIji^K}i|%*F)w}n1MWpRHp7CZxDnrJV*s8TkyK$J$ z{3P-8o}|w?!-AKL{F^=bYcVV@1&E0}htASHnq-a0<#X0My`%%Dt{+OgzAyd~2hsDK zIxeE=A-4l@hu+IinR>k7A7W>q=a-Gm&9nE4cSVO>#^g(#7MfWtcN@ZsAA+G@T!}n= zjWsY;A9WbMJ;kO)ftPugy!V_+Fq<4vd+gaU><@2LSjW zXzx(~cpu9q3mq`WJkrAG@#9Cr>5zr`C^O`Al}sZsVIqkV{_g-Z)iZICoQBdZDoy99!& z7Tm=gG)~CHv)SnvE;g`PjRTYbh2;(I242s;b+b>W$}9QtomYbK65#_XE8VOyq^t=T3TAd zwqeWgjkVoid2{`p+Nz(h^>^EvOB*mHHI;RpxN<@x26s;)7YA^U$HmeMwX;^0OD}in zA(uhn)QN47deS7ds}**gY68~GSx7@xIK^GfO4nSafWIjHMO(d}{qqxET)*&`cqfkwFlx}CIR6z27DgQ-}sOgy*no@MXpQ5$E|M+}!i+{G# zso1_=1!DgD>C-=!7C|PJAdzq(N#K?IjcmV7361d7!i+!R|88s;JZ`Dg@@RS4U;5U4 PYKKjZJS)Mugued(ab4Pd delta 9 Qcmeydn(@Y5#tk?802)&S@c;k- diff --git a/packages/res/chromium.rc b/packages/res/chromium.rc index 453bda22..750be6e8 100644 --- a/packages/res/chromium.rc +++ b/packages/res/chromium.rc @@ -8,4 +8,5 @@ TFMXBufferPanel BITMAP "bufferpanel.bmp" TCEFWorkScheduler BITMAP "workscheduler.bmp" TFMXWorkScheduler BITMAP "workscheduler.bmp" TCEFServerComponent BITMAP "server.bmp" -TCEFUrlRequestClientComponent BITMAP "tcefurlrequestclientcomponent.bmp" \ No newline at end of file +TCEFUrlRequestClientComponent BITMAP "tcefurlrequestclientcomponent.bmp" +TCEFSentinel BITMAP "tcefsentinel.bmp" \ No newline at end of file diff --git a/packages/res/tcefsentinel.bmp b/packages/res/tcefsentinel.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2aa78befbd5172cb3738be64bf270bba306c3474 GIT binary patch literal 1782 zcmd5*X-pJn7+!5^(j(QLwoR}qYO1C22Nr76G*ugt1{Ek(3s?z@v>pK!C{nHlptg@u%o+(Q`&J5$dT z3Tco-~aaJI9ibMZ0tv2C0D+#Dx962#YqK&!9XBz`YQ2w zLw*9cipgrGH&fae)U!z`A;;n)Vz0k_Hnpy$M&3bh>}C?BO+<0S$#kOE>s?%2d?K~7 zvNAU}XSG_7-Adk*opd!j9qfhVUc2cR_mw+$w}-~`HQaX(~m!(I-{~+qr zuIP`2JyM(w_Fj*EpW2faLwNtdm&7E~gCU?-qZxPHZe#2{aqVE#wcU{yg{WEVF^Nz^ zE3<(RaqzYDnBj+$n1?5R){>>=<6F}lkzQg?b}{COdz~L z5-??ML}=@+<+b8GYz4WXn(wem`mNO+j52y74N@0VYB&a!(C1(~kVYAQDY5B1^-y@^rIH`Asw*cZCUB3& z!RhH~Qave;T2RYTPDx=|6FHw&RZOl_Y7{sk4*LCGz$`P4 zIUuiD<28d`SnDwKKysnoB!Ja` zQGv}A&m*OC zfK{)W7-WgLPtghZ`BtsSi*`E9EQ=oKw{?3^07bf-2)h^JIuNnXAs-uHN%{Y-6BzKb zVHH)=BQzWIgMK;MNABvV>lSbfT4>O(^Ld(7QU>;uOP=CqWOS6Hli%%N8STiQ!QlAR zZ*^QYsl82$+WwfI|8;tb!e`TzN)f2s_%$}?m|N%1!!ippJUNP;{GL;K@$#@gqNJq?st7=Zh9QA)P6UuO&<-Sct>A<|IR2# zjMhyphq|_RPFRS}zTv^!TS`(6*6hbmzx3+KHG#>Q+05{6XDj6vk3!x#SgY3#rdnfI z0^iPII`TjehXH{A)nticMVuH!ktR(|7As(x2{8sbijjs*JywKCh*xw- z6(GdgfME!-C=Jq-1oIl-x2cB-wLs%~Ici~om$yiDf>w$!6(q4jC^9BU6xk%w^C`Bt zK!WE;lvcz^O!LMP%e4>_NiHvmgnTQPv4cY6+Qzd_KM(Nb(=R{w=!NqW?A^bIZCyLK z+&|Byi<4}Bx|8|YW&V18jKfFnC%>VQmwxeVFTjJ3JalV7Ysq>FexA=C`UIUFTd6L@ zY}wSxBVV|eBvClF%fkf1cvmm^BxV2Hs#wOO(RsCl14FF1>`-K^{k|`qDkOj zn-a@$dHdo3-LJgG$lw6ye)o4KCaa`K>M?}%RIo~{7Z8B_=kP1v_|kW8*N=Ytvs%gm zt{}lVCQ@q$`;FENRXzy_dVNr;KN(^(EB^sx1&h0VIvC*DNeyc7?Q)sJN0YlpFgKj zTUK|wdJz-jlh(EIzRt|98>rGza_$|aNb(jMl92YBkl4+0VU#{W*BySvZDz{tL2^E)4ZxP5P9 zX@P;Eal(3xu&3zjpTua~Ou4Owf)?`hcC}jt@ZM$2Rgaq&W};>%k1927q`&Bx!1qL+m~io&iC-{u5JAC zw=ZzzQZMiOKo_MA{w!LIf{wEOfdayb!NtFb(7)enXrjOOHF4q1Ze4QsFQP0NC6(Nj z!QbcOnxZ;%k>N| literal 0 HcmV?d00001 diff --git a/source/res/tcefsentinel.lrs b/source/res/tcefsentinel.lrs new file mode 100644 index 00000000..7d5269fd --- /dev/null +++ b/source/res/tcefsentinel.lrs @@ -0,0 +1,59 @@ +LazarusResources.Add('tcefsentinel','PNG',[ + #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#6#0#0#0#224'w='#248#0 + +#0#5#6'IDATx^'#181#211'[l\G'#29#128#241'o'#206#236#185#236'9{'#214#235#181 + +#157#198#137#227#144#218#169#9#165'$'#144#134'DEA\[B+E@i'#27'E'#225#5#137'B' + +#218'*'#8#132#130'P'#145#130'J'#11#15#180'@_'#10'<'#18'*5\BRPE'#220#10#25#169 + +#165'PH'#8'%u'#28#223#18'_c'#27';'#190#236#174#247'\g'#224#201'N'#240#241'#?' + +'i'#164'y'#251#230#175#191'F'#140']{'#147',37'#150#136#162#152#186#200#209 + +#209#218'Dei'#145' L'#208#128'm'#230'('#20'\'#174'W'#2#140'0'#192#0#220#188 + +'E'#22#131#255#171#245#3#18'8'#13'h'#224'I'#0#192#7'.'#0'!p'#4#0#216#10#244#3 + +'s'#192#17'2'#228'N'#158#250'#'#25'>'#178#235#238'w}fnz'#28#175#212'~7'#173 + +'M'#31#13#162'xG_'#127#255#206'(H'#140#214'M-'#135#186#182'wNX'#136#206#190 + +#225#193#219'[JR'#14#214#236#199'O'#191#244#234#201'5'#129#201#153#217#204 + +#240'ng+'#229#22#143'B'#222'9X'#171#215#14#166'ZcX'#2#223#206'a:'#242'@'#16 + +#135#7#156#156#162#212'hSjv'#24#156#158#181#1#1#232'['#2'hE'#22'i'#154'4'#183 + +#182'Q'#143#18'f'#230#199#240'\'#155#174';'#218#136#162#4#12#201#244#220#4 + +#142'#'#217#220#182#17#215'31'#196#156#150#134'\'#251#210'4'#213'd'#137'bE' + +#156#24'D'#145'&MM'#22'+`'#153#9'1'#6':'#138#145#134'M=V'#132'I'#136'WtH'#21 + +' '#196#218#128'a'#8#178'('#13#210#148#4#243#26#223#183#169#135#9#181'@'#227 + +'z9ja'#130#151#183'Hu'#130'V'#138'0'#21'$'#177'B(2&H'#20#217'$'#210#243')' + +#182#184'@'#130#231'H'#148'V'#196'IL'#243#198#18#203#181#16#19'I./'#137#132 + +#129#22#8#141'Z'#187#3#149'$d'#232'{'#163#231#31'W'#154'J'#162#203#182#243',' + +'U'#3#194'j'#130#237#26#184'y'#135#197#197':i'#172'h'#185#173'H'#148#212'IR' + +#147#153#235#213#179#128'Z3'#1#217'F'#22#230#166'z6'#149#203']/'#254#228#12 + +#31#188#231'Nv'#237#220'F'#239#229#171#156#237#249#23#135#14#127#18#179#168 + +'8'#249#179'3'#28'<'#184#15#225'5'#167#19#163'S'#167#132#153#177#131'B'#227 + +#218#198#179'O?'#15#240#229#211'/?'#247#232#133#243#19#236#221#191#135'm];' + +#184#220'?'#207#165#139#147'l'#127#186#147#249#217'e'#254'z~'#140#195'G'#238 + +''''#191#161#145#151'~'#241'l/'#192#131#143''#201#177#207'='#206#247#158'8'#193 + +#244#204#20'ab'#162'S'#143'J50X'#229#220#28'1'#186#187#187#249#239#1#144#245 + +#160#178#235#167'?'#127#230#235'gN'#141'`'#231'|'#26#202#22#203'aH'#144#166 + +#188#247'='#219'y'#224#195'['#248#208#251';'#216#183#163'H'#177'a#'#11#11')N' + +#193'B'#24#146#195#199';'#245'k'#231#159'?'#167'Q[Vw'#187'z'#17#19#227#147 + +#214#181#241#190#206#201#201#177'r'#131'P'#220#24']'#166#161#201'e'#254#154 + +'I'#177#0#197'&'#137'%%HA'#177#152#167#185#201'E[PY'#142#137#130'<'#127#235 + +#25#162'V'#127#234'^['#181#31#232'h'#221#247#194'J'#224#232#209#163#0'ttt' + +#202'T'#197#11'-]~m'#239'}'#237#133'2-'#140'_'#139'i,'#22#144#194'ajl'#145 + +#235#163#163'8'#133'"'#245'j'#194#236'\H'#185#165#132'-M'#202'%'#147#246#210 + +#30#230#134#7'x'#234#196#15#2#17#251#198#255'N'#160#187#187#207#197#192#200 + +#190'd'#243';'#31#127#184'}oci'#129#129#161'q'#194'z'#140#176#167#232#235#159 + +#196'h'#220'L'#185#173#149'@'#141'sud'#154#185#217'"'#166'3@'#221'|'#139#7#31 + +#187#139#151'_'#188'1'#248#135'_'#189#241#186#214#168#149#192#208#208#16#0'@' + +#4'\'#181#253#220#191#135'/'#207'Q'#173#245#242#169#7':'#185#227#206#143'Q' + +#240#203#236#222#191#23#183#208#192#185#215#191#195#219#151'fX'#206#247#240 + +#238#174'm'#252#242#183'/p'#229'R/'#239#251'@'#23#165#13#254',Z'#140#130#142 + +#178#254#129#2#194#137#193#197#191#136#208#191#223'kh'#162#191#247'5q'#225 + +#205'n]r'#247'/'#162','#25'%'#149#220#149#193#223#231#227#154#162':t'#145#225 + +'K'#223'"'#172'('#220'd'#19'c'#23#151#169#4'I'#5#168#176#138#255#0#174#140#28 + +'#'#173#140#155#148#0#0#0#0'IEND'#174'B`'#130 +]); diff --git a/source/uCEFConstants.pas b/source/uCEFConstants.pas index 75d518fe..4fe41123 100644 --- a/source/uCEFConstants.pas +++ b/source/uCEFConstants.pas @@ -589,6 +589,8 @@ const CEF_DOONBEFORECLOSE = WM_APP + $A07; CEF_PENDINGINVALIDATE = WM_APP + $A08; CEF_IMERANGECHANGED = WM_APP + $A09; + CEF_SENTINEL_START = WM_APP + $A0A; + CEF_SENTINEL_DOCLOSE = WM_APP + $A0B; {$ENDIF} CEF_TIMER_MINIMUM = $0000000A; diff --git a/source/uCEFSentinel.pas b/source/uCEFSentinel.pas new file mode 100644 index 00000000..ac7ba920 --- /dev/null +++ b/source/uCEFSentinel.pas @@ -0,0 +1,318 @@ +// ************************************************************************ +// ***************************** CEF4Delphi ******************************* +// ************************************************************************ +// +// CEF4Delphi is based on DCEF3 which uses CEF3 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 © 2019 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 + * 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. + * + *) + + // Attribution : + // TCEFSentinel icon made by Everaldo Coelho + // https://www.iconfinder.com/icons/17914/castle_fortress_tower_war_icon + // http://www.everaldo.com/ + +unit uCEFSentinel; + +{$IFDEF FPC} + {$MODE OBJFPC}{$H+} +{$ENDIF} + +{$IFNDEF CPUX64}{$ALIGN ON}{$ENDIF} +{$MINENUMSIZE 4} + +{$I cef.inc} + +interface + +uses + {$IFDEF DELPHI16_UP} + {$IFDEF MSWINDOWS}WinApi.Windows, WinApi.Messages,{$ENDIF} + System.Classes, Vcl.Controls, Vcl.ExtCtrls, System.SysUtils, System.SyncObjs, System.Math, + {$ELSE} + {$IFDEF MSWINDOWS}Windows, {$ENDIF} Classes, Controls, ExtCtrls, SysUtils, SyncObjs, Math, + {$IFDEF FPC} + LCLProc, LCLIntf, LResources, LMessages, InterfaceBase, + {$ELSE} + Messages, + {$ENDIF} + {$ENDIF} + uCEFTypes, uCEFInterfaces; + +const + CEFSENTINEL_DEFAULT_DELAYPERPROCMS = 200; + CEFSENTINEL_DEFAULT_MININITDELAYMS = 1500; + CEFSENTINEL_DEFAULT_FINALDELAYMS = 100; + CEFSENTINEL_DEFAULT_MINCHILDPROCS = 2; + CEFSENTINEL_DEFAULT_MAXCHECKCOUNTS = 10; + +type + TSentinelStatus = (ssIdle, ssInitialDelay, ssCheckingChildren, ssClosing); + + {$IFNDEF FPC}{$IFDEF DELPHI16_UP}[ComponentPlatformsAttribute(pidWin32 or pidWin64)]{$ENDIF}{$ENDIF} + TCEFSentinel = class(TComponent) + protected + FCompHandle : HWND; + FStatus : TSentinelStatus; + FStatusCS : TCriticalSection; + FDelayPerProcMs : cardinal; + FMinInitDelayMs : cardinal; + FFinalDelayMs : cardinal; + FMinChildProcs : integer; + FMaxCheckCount : integer; + FCheckCount : integer; + FOnClose : TNotifyEvent; + FTimer : TTimer; + + function GetStatus : TSentinelStatus; + function GetChildProcCount : integer; + + {$IFDEF MSWINDOWS} + procedure WndProc(var aMessage: TMessage); + procedure doStartMsg(var aMessage : TMessage); virtual; + procedure doCloseMsg(var aMessage : TMessage); virtual; + {$ENDIF} + function SendCompMessage(aMsg : cardinal) : boolean; + function CanClose : boolean; virtual; + + procedure Timer_OnTimer(Sender: TObject); virtual; + + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure AfterConstruction; override; + procedure Start; virtual; + + property Status : TSentinelStatus read GetStatus; + property ChildProcCount : integer read GetChildProcCount; + + published + property DelayPerProcMs : cardinal read FDelayPerProcMs write FDelayPerProcMs default CEFSENTINEL_DEFAULT_DELAYPERPROCMS; + property MinInitDelayMs : cardinal read FMinInitDelayMs write FMinInitDelayMs default CEFSENTINEL_DEFAULT_MININITDELAYMS; + property FinalDelayMs : cardinal read FFinalDelayMs write FFinalDelayMs default CEFSENTINEL_DEFAULT_FINALDELAYMS; + property MinChildProcs : integer read FMinChildProcs write FMinChildProcs default CEFSENTINEL_DEFAULT_MINCHILDPROCS; + property MaxCheckCount : integer read FMaxCheckCount write FMaxCheckCount default CEFSENTINEL_DEFAULT_MAXCHECKCOUNTS; + + property OnClose : TNotifyEvent read FOnClose write FOnClose; + end; + +{$IFDEF FPC} +procedure Register; +{$ENDIF} + +implementation + +uses + uCEFLibFunctions, uCEFApplication, uCEFMiscFunctions, uCEFConstants; + +constructor TCEFSentinel.Create(AOwner: TComponent); +begin + inherited Create(aOwner); + + FCompHandle := 0; + FDelayPerProcMs := CEFSENTINEL_DEFAULT_DELAYPERPROCMS; + FMinInitDelayMs := CEFSENTINEL_DEFAULT_MININITDELAYMS; + FFinalDelayMs := CEFSENTINEL_DEFAULT_FINALDELAYMS; + FMinChildProcs := CEFSENTINEL_DEFAULT_MINCHILDPROCS; + FMaxCheckCount := CEFSENTINEL_DEFAULT_MAXCHECKCOUNTS; + FOnClose := nil; + FTimer := nil; + FStatusCS := nil; + FStatus := ssIdle; + FCheckCount := 0; +end; + +procedure TCEFSentinel.AfterConstruction; +{$IFDEF FPC} +var + TempWndMethod : TWndMethod; +{$ENDIF} +begin + inherited AfterConstruction; + + if not(csDesigning in ComponentState) then + begin + {$IFDEF FPC} + {$IFDEF MSWINDOWS} + TempWndMethod := @WndProc; + FCompHandle := AllocateHWnd(TempWndMethod); + {$ENDIF} + {$ELSE} + FCompHandle := AllocateHWnd(WndProc); + {$ENDIF} + + FStatusCS := TCriticalSection.Create; + FTimer := TTimer.Create(nil); + FTimer.Enabled := False; + FTimer.OnTimer := {$IFDEF FPC}@{$ENDIF}Timer_OnTimer; + end; +end; + +destructor TCEFSentinel.Destroy; +begin + try + {$IFDEF MSWINDOWS} + if (FCompHandle <> 0) then + begin + DeallocateHWnd(FCompHandle); + FCompHandle := 0; + end; + {$ENDIF} + + if (FTimer <> nil) then FreeAndNil(FTimer); + if (FStatusCS <> nil) then FreeAndNil(FStatusCS); + finally + inherited Destroy; + end; +end; + +{$IFDEF MSWINDOWS} +procedure TCEFSentinel.WndProc(var aMessage: TMessage); +begin + case aMessage.Msg of + CEF_SENTINEL_START : doStartMsg(aMessage); + CEF_SENTINEL_DOCLOSE : doCloseMsg(aMessage); + + else aMessage.Result := DefWindowProc(FCompHandle, aMessage.Msg, aMessage.WParam, aMessage.LParam); + end; +end; + +procedure TCEFSentinel.doStartMsg(var aMessage : TMessage); +begin + if (FTimer <> nil) then + begin + FTimer.Interval := max(ChildProcCount * CEFSENTINEL_DEFAULT_DELAYPERPROCMS, FMinInitDelayMs); + FTimer.Enabled := True; + end; +end; + +procedure TCEFSentinel.doCloseMsg(var aMessage : TMessage); +begin + if assigned(FOnClose) then FOnClose(self); +end; +{$ENDIF} + +function TCEFSentinel.SendCompMessage(aMsg : cardinal) : boolean; +begin + Result := (FCompHandle <> 0) and PostMessage(FCompHandle, aMsg, 0, 0); +end; + +procedure TCEFSentinel.Start; +begin + try + if (FStatusCS <> nil) then FStatusCS.Acquire; + + if (FStatus = ssIdle) then + begin + FStatus := ssInitialDelay; + SendCompMessage(CEF_SENTINEL_START); + end; + finally + if (FStatusCS <> nil) then FStatusCS.Release; + end; +end; + +function TCEFSentinel.GetStatus : TSentinelStatus; +begin + Result := ssIdle; + + if (FStatusCS <> nil) then + try + FStatusCS.Acquire; + Result := FStatus; + finally + FStatusCS.Release; + end; +end; + +function TCEFSentinel.GetChildProcCount : integer; +begin + if (GlobalCEFApp <> nil) then + Result := GlobalCEFApp.ChildProcessesCount + else + Result := 0; +end; + +function TCEFSentinel.CanClose : boolean; +begin + Result := (FCheckCount >= FMaxCheckCount) or + (GlobalCEFApp = nil) or + (ChildProcCount <= FMinChildProcs); +end; + +procedure TCEFSentinel.Timer_OnTimer(Sender: TObject); +begin + FTimer.Enabled := False; + + try + if (FStatusCS <> nil) then FStatusCS.Acquire; + + case FStatus of + ssInitialDelay : + if CanClose then + begin + FStatus := ssClosing; + SendCompMessage(CEF_SENTINEL_DOCLOSE); + end + else + begin + FStatus := ssCheckingChildren; + FCheckCount := 0; + FTimer.Interval := FFinalDelayMs; + FTimer.Enabled := True; + end; + + ssCheckingChildren : + if CanClose then + begin + FStatus := ssClosing; + SendCompMessage(CEF_SENTINEL_DOCLOSE); + end + else + begin + inc(FCheckCount); + FTimer.Enabled := True; + end; + end; + finally + if (FStatusCS <> nil) then FStatusCS.Release; + end; +end; + +{$IFDEF FPC} +procedure Register; +begin + {$I res/tcefsentinel.lrs} + RegisterComponents('Chromium', [TCEFSentinel]); +end; +{$ENDIF} + +end. diff --git a/update_CEF4Delphi.json b/update_CEF4Delphi.json index 14c3ca48..8dffd7ad 100644 --- a/update_CEF4Delphi.json +++ b/update_CEF4Delphi.json @@ -1,8 +1,8 @@ { "UpdateLazPackages" : [ { - "ForceNotify" : false, - "InternalVersion" : 40, + "ForceNotify" : true, + "InternalVersion" : 41, "Name" : "cef4delphi_lazarus.lpk", "Version" : "77.1.12.0" } From 9391d68ee0e0f357d8ca99bfbe90d61755757c04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Salvador=20D=C3=ADaz=20Fau?= Date: Fri, 11 Oct 2019 17:51:16 +0200 Subject: [PATCH 10/13] Update to CEF 77.1.13 - Added TChromium.OnRequestContextInitialized - Added TChromium.OnBeforePluginLoad - Added TChromium.ReqContextHandler - Removed GlobalCEFApp.ShutdownWaitTime --- README.md | 6 +- demos/Delphi_VCL/MiniBrowser/uMiniBrowser.dfm | 1 + demos/Delphi_VCL/MiniBrowser/uMiniBrowser.pas | 20 ++ demos/Lazarus/MiniBrowser/MiniBrowser.lps | 14 +- demos/Lazarus/MiniBrowser/uMiniBrowser.lfm | 1 + demos/Lazarus/MiniBrowser/uMiniBrowser.pas | 20 ++ demos/Lazarus/PopupBrowser2/PopupBrowser2.lps | 95 +++---- packages/cef4delphi_lazarus.lpk | 2 +- source/uCEFApplication.pas | 23 +- source/uCEFChromium.pas | 174 ++++++++++-- source/uCEFChromiumEvents.pas | 4 + source/uCEFFMXChromium.pas | 249 ++++++++++++++---- source/uCEFInterfaces.pas | 9 +- source/uCEFRequestContextHandler.pas | 127 ++++++++- update_CEF4Delphi.json | 6 +- 15 files changed, 588 insertions(+), 163 deletions(-) diff --git a/README.md b/README.md index 193bddc4..7a41ee29 100644 --- a/README.md +++ b/README.md @@ -3,10 +3,10 @@ CEF4Delphi is an open source project created by Salvador D 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 77.1.12 which includes Chromium 77.0.3865.90. +CEF4Delphi uses CEF 77.1.13 which includes Chromium 77.0.3865.90. The CEF binaries used by CEF4Delphi are available for download at spotify : -* [32 bits](http://opensource.spotify.com/cefbuilds/cef_binary_77.1.12%2Bgc63c001%2Bchromium-77.0.3865.90_windows32.tar.bz2) -* [64 bits](http://opensource.spotify.com/cefbuilds/cef_binary_77.1.12%2Bgc63c001%2Bchromium-77.0.3865.90_windows64.tar.bz2) +* [32 bits](http://opensource.spotify.com/cefbuilds/cef_binary_77.1.13%2Bg676b147%2Bchromium-77.0.3865.90_windows32.tar.bz2) +* [64 bits](http://opensource.spotify.com/cefbuilds/cef_binary_77.1.13%2Bg676b147%2Bchromium-77.0.3865.90_windows64.tar.bz2) CEF4Delphi was developed and tested on Delphi 10.3 Rio and it has been tested in Delphi 7, Delphi XE, Delphi 10, Delphi 10.2 and Lazarus 2.0.4/FPC 3.0.4. CEF4Delphi includes VCL, FireMonkey (FMX) and Lazarus components. diff --git a/demos/Delphi_VCL/MiniBrowser/uMiniBrowser.dfm b/demos/Delphi_VCL/MiniBrowser/uMiniBrowser.dfm index 2b878157..ee2e2cab 100644 --- a/demos/Delphi_VCL/MiniBrowser/uMiniBrowser.dfm +++ b/demos/Delphi_VCL/MiniBrowser/uMiniBrowser.dfm @@ -290,6 +290,7 @@ object MiniBrowserFrm: TMiniBrowserFrm OnCertificateError = Chromium1CertificateError OnBeforeResourceLoad = Chromium1BeforeResourceLoad OnResourceResponse = Chromium1ResourceResponse + OnBeforePluginLoad = Chromium1BeforePluginLoad Left = 32 Top = 224 end diff --git a/demos/Delphi_VCL/MiniBrowser/uMiniBrowser.pas b/demos/Delphi_VCL/MiniBrowser/uMiniBrowser.pas index e138bf9c..71a53864 100644 --- a/demos/Delphi_VCL/MiniBrowser/uMiniBrowser.pas +++ b/demos/Delphi_VCL/MiniBrowser/uMiniBrowser.pas @@ -228,6 +228,10 @@ type procedure Flushcookies1Click(Sender: TObject); procedure Chromium1CookiesFlushed(Sender: TObject); procedure CEFSentinel1Close(Sender: TObject); + procedure Chromium1BeforePluginLoad(Sender: TObject; const mimeType, + pluginUrl: ustring; isMainFrame: Boolean; + const topOriginUrl: ustring; const pluginInfo: ICefWebPluginInfo; + var pluginPolicy: TCefPluginPolicy; var aResult: Boolean); protected FResponse : TStringList; @@ -443,6 +447,22 @@ begin callback.cont(TempFullPath, False); end; +procedure TMiniBrowserFrm.Chromium1BeforePluginLoad(Sender: TObject; + const mimeType, pluginUrl: ustring; isMainFrame: Boolean; + const topOriginUrl: ustring; const pluginInfo: ICefWebPluginInfo; + var pluginPolicy: TCefPluginPolicy; var aResult: Boolean); +begin + // Always allow the PDF plugin to load. + if (pluginPolicy <> PLUGIN_POLICY_ALLOW) and + (CompareText(mimeType, 'application/pdf') = 0) then + begin + pluginPolicy := PLUGIN_POLICY_ALLOW; + aResult := True; + end + else + aResult := False; +end; + procedure TMiniBrowserFrm.Chromium1BeforeResourceLoad(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; const callback: ICefRequestCallback; diff --git a/demos/Lazarus/MiniBrowser/MiniBrowser.lps b/demos/Lazarus/MiniBrowser/MiniBrowser.lps index 4865a81e..dac60fd8 100644 --- a/demos/Lazarus/MiniBrowser/MiniBrowser.lps +++ b/demos/Lazarus/MiniBrowser/MiniBrowser.lps @@ -22,12 +22,12 @@ - - + + - - + + @@ -191,15 +191,15 @@ - + - + - + diff --git a/demos/Lazarus/MiniBrowser/uMiniBrowser.lfm b/demos/Lazarus/MiniBrowser/uMiniBrowser.lfm index 825cde4d..34078b77 100644 --- a/demos/Lazarus/MiniBrowser/uMiniBrowser.lfm +++ b/demos/Lazarus/MiniBrowser/uMiniBrowser.lfm @@ -263,6 +263,7 @@ object MiniBrowserFrm: TMiniBrowserFrm OnCertificateError = Chromium1CertificateError OnBeforeResourceLoad = Chromium1BeforeResourceLoad OnResourceResponse = Chromium1ResourceResponse + OnBeforePluginLoad = Chromium1BeforePluginLoad left = 32 top = 224 end diff --git a/demos/Lazarus/MiniBrowser/uMiniBrowser.pas b/demos/Lazarus/MiniBrowser/uMiniBrowser.pas index b1657343..bc76ff94 100644 --- a/demos/Lazarus/MiniBrowser/uMiniBrowser.pas +++ b/demos/Lazarus/MiniBrowser/uMiniBrowser.pas @@ -125,6 +125,10 @@ type N5: TMenuItem; Memoryinfo1: TMenuItem; procedure CEFSentinel1Close(Sender: TObject); + procedure Chromium1BeforePluginLoad(Sender: TObject; const mimeType, + pluginUrl: ustring; isMainFrame: boolean; const topOriginUrl: ustring; + const pluginInfo: ICefWebPluginInfo; var pluginPolicy: TCefPluginPolicy; + var aResult: boolean); procedure Chromium1CookiesFlushed(Sender: TObject); procedure Chromium1DownloadImageFinished(Sender: TObject; const imageUrl: ustring; httpStatusCode: Integer; const image: ICefImage); @@ -989,6 +993,22 @@ begin PostMessage(Handle, WM_CLOSE, 0, 0); end; +procedure TMiniBrowserFrm.Chromium1BeforePluginLoad(Sender: TObject; + const mimeType, pluginUrl: ustring; isMainFrame: boolean; + const topOriginUrl: ustring; const pluginInfo: ICefWebPluginInfo; + var pluginPolicy: TCefPluginPolicy; var aResult: boolean); +begin + // Always allow the PDF plugin to load. + if (pluginPolicy <> PLUGIN_POLICY_ALLOW) and + (CompareText(mimeType, 'application/pdf') = 0) then + begin + pluginPolicy := PLUGIN_POLICY_ALLOW; + aResult := True; + end + else + aResult := False; +end; + procedure TMiniBrowserFrm.CookiesFlushedMsg(var aMessage : TMessage); begin showmessage('The cookies were flushed successfully'); diff --git a/demos/Lazarus/PopupBrowser2/PopupBrowser2.lps b/demos/Lazarus/PopupBrowser2/PopupBrowser2.lps index 2f74c249..2e287d70 100644 --- a/demos/Lazarus/PopupBrowser2/PopupBrowser2.lps +++ b/demos/Lazarus/PopupBrowser2/PopupBrowser2.lps @@ -8,7 +8,7 @@ - + @@ -22,8 +22,8 @@ - - + + @@ -35,9 +35,9 @@ - - - + + + @@ -52,10 +52,11 @@ - - - + + + + @@ -83,123 +84,123 @@ - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - - + + - + - - + + - + - + - + - - + + - + - - + + - + - - + + - - + + - + - + - + - + diff --git a/packages/cef4delphi_lazarus.lpk b/packages/cef4delphi_lazarus.lpk index fa502f37..c8aa66e2 100644 --- a/packages/cef4delphi_lazarus.lpk +++ b/packages/cef4delphi_lazarus.lpk @@ -21,7 +21,7 @@ - + diff --git a/source/uCEFApplication.pas b/source/uCEFApplication.pas index e0b62c4e..cdf9d737 100644 --- a/source/uCEFApplication.pas +++ b/source/uCEFApplication.pas @@ -62,7 +62,7 @@ uses const CEF_SUPPORTED_VERSION_MAJOR = 77; CEF_SUPPORTED_VERSION_MINOR = 1; - CEF_SUPPORTED_VERSION_RELEASE = 12; + CEF_SUPPORTED_VERSION_RELEASE = 13; CEF_SUPPORTED_VERSION_BUILD = 0; CEF_CHROMEELF_VERSION_MAJOR = 77; @@ -158,7 +158,6 @@ type FStatus : TCefAplicationStatus; FMissingLibFiles : string; FProcessType : TCefProcessType; - FShutdownWaitTime : cardinal; FWidevinePath : ustring; FMustFreeLibrary : boolean; FAutoplayPolicy : TCefAutoplayPolicy; @@ -433,7 +432,6 @@ type property OsmodalLoop : boolean write SetOsmodalLoop; property Status : TCefAplicationStatus read FStatus; property MissingLibFiles : string read FMissingLibFiles; - property ShutdownWaitTime : cardinal read FShutdownWaitTime write FShutdownWaitTime; property WidevinePath : ustring read FWidevinePath write FWidevinePath; property MustFreeLibrary : boolean read FMustFreeLibrary write FMustFreeLibrary; property AutoplayPolicy : TCefAutoplayPolicy read FAutoplayPolicy write FAutoplayPolicy; @@ -606,7 +604,6 @@ begin FDisableGPUCache := True; FLocalesRequired := ''; FProcessType := ParseProcessType; - FShutdownWaitTime := 0; FWidevinePath := ''; FMustFreeLibrary := False; FAutoplayPolicy := appDefault; @@ -694,12 +691,7 @@ end; destructor TCefApplication.Destroy; begin try - if (FProcessType = ptBrowser) then - begin - if (FShutdownWaitTime > 0) then sleep(FShutdownWaitTime); - - ShutDown; - end; + if (FProcessType = ptBrowser) then ShutDown; FreeLibcefLibrary; @@ -1030,7 +1022,7 @@ end; procedure TCefApplication.SetOsmodalLoop(aValue : boolean); begin - if FLibLoaded then cef_set_osmodal_loop(Ord(aValue)); + if (FStatus = asInitialized) then cef_set_osmodal_loop(Ord(aValue)); end; procedure TCefApplication.UpdateDeviceScaleFactor; @@ -1041,8 +1033,11 @@ end; procedure TCefApplication.ShutDown; begin try - FStatus := asShuttingDown; - if FLibLoaded then cef_shutdown(); + if (FStatus = asInitialized) then + begin + FStatus := asShuttingDown; + cef_shutdown(); + end; except on e : exception do if CustomExceptionHandler('TCefApplication.ShutDown', e) then raise; @@ -2000,7 +1995,7 @@ begin FStatus := asErrorDLLVersion; TempString := 'Unsupported CEF version !' + CRLF + CRLF + - 'Use only the CEF3 binaries specified in the CEF4Delphi Readme.md file at ' + + 'Use only the CEF binaries specified in the CEF4Delphi Readme.md file at ' + CRLF + CEF4DELPHI_URL; ShowErrorMessageDlg(TempString); diff --git a/source/uCEFChromium.pas b/source/uCEFChromium.pas index b5bd0e29..24b0434b 100644 --- a/source/uCEFChromium.pas +++ b/source/uCEFChromium.pas @@ -72,6 +72,7 @@ type FHandler : ICefClient; FBrowser : ICefBrowser; FBrowserId : Integer; + FReqContextHandler : ICefRequestContextHandler; FDefaultUrl : ustring; FOptions : TChromiumOptions; FFontOptions : TChromiumFontOptions; @@ -237,6 +238,10 @@ type // ICefFindHandler FOnFindResult : TOnFindResult; + // ICefRequestContextHandler + FOnRequestContextInitialized : TOnRequestContextInitialized; + FOnBeforePluginLoad : TOnBeforePluginLoad; + // Custom FOnTextResultAvailable : TOnTextResultAvailableEvent; FOnPdfPrintFinished : TOnPdfPrintFinishedEvent; @@ -311,14 +316,16 @@ type procedure SetSafeSearch(aValue : boolean); procedure SetYouTubeRestrict(aValue : integer); procedure SetPrintingEnabled(aValue : boolean); - + procedure SetOnRequestContextInitialized(const aValue : TOnRequestContextInitialized); + procedure SetOnBeforePluginLoad(const aValue : TOnBeforePluginLoad); function CreateBrowserHost(aWindowInfo : PCefWindowInfo; const aURL : ustring; const aSettings : PCefBrowserSettings; const aExtraInfo : ICefDictionaryValue; const aContext : ICefRequestContext): boolean; function CreateBrowserHostSync(aWindowInfo : PCefWindowInfo; const aURL : ustring; const aSettings : PCefBrowserSettings; const aExtraInfo : ICefDictionaryValue; const aContext : ICefRequestContext): Boolean; procedure DestroyClientHandler; - + procedure DestroyReqContextHandler; procedure ClearBrowserReference; + procedure CreateReqContextHandler; procedure InitializeEvents; procedure InitializeSettings(var aSettings : TCefBrowserSettings); @@ -478,6 +485,11 @@ type // ICefFindHandler procedure doOnFindResult(const browser: ICefBrowser; identifier, count: Integer; const selectionRect: PCefRect; activeMatchOrdinal: Integer; finalUpdate: Boolean); virtual; + // ICefRequestContextHandler + procedure doOnRequestContextInitialized(const request_context: ICefRequestContext); virtual; + function doOnBeforePluginLoad(const mimeType, pluginUrl:ustring; isMainFrame : boolean; const topOriginUrl: ustring; const pluginInfo: ICefWebPluginInfo; var pluginPolicy: TCefPluginPolicy): Boolean; virtual; + procedure doGetResourceRequestHandler(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; is_navigation, is_download: boolean; const request_initiator: ustring; var disable_default_handling: boolean; var aResourceRequestHandler : ICefResourceRequestHandler); virtual; + // Custom procedure doCookiesDeleted(numDeleted : integer); virtual; procedure doPdfPrintFinished(aResultOK : boolean); virtual; @@ -507,6 +519,7 @@ type function MustCreateFindHandler : boolean; virtual; function MustCreateResourceRequestHandler : boolean; virtual; function MustCreateCookieAccessFilter : boolean; virtual; + function MustCreateRequestContextHandler : boolean; virtual; public constructor Create(AOwner: TComponent); override; @@ -636,6 +649,7 @@ type property BrowserId : integer read FBrowserId; property Browser : ICefBrowser read FBrowser; property CefClient : ICefClient read FHandler; + property ReqContextHandler : ICefRequestContextHandler read FReqContextHandler; property CefWindowInfo : TCefWindowInfo read FWindowInfo; property VisibleNavigationEntry : ICefNavigationEntry read GetVisibleNavigationEntry; property MultithreadApp : boolean read GetMultithreadApp; @@ -816,6 +830,10 @@ type // ICefFindHandler property OnFindResult : TOnFindResult read FOnFindResult write FOnFindResult; + + // ICefRequestContextHandler + property OnRequestContextInitialized : TOnRequestContextInitialized read FOnRequestContextInitialized write SetOnRequestContextInitialized; + property OnBeforePluginLoad : TOnBeforePluginLoad read FOnBeforePluginLoad write SetOnBeforePluginLoad; end; {$IFDEF FPC} @@ -833,7 +851,8 @@ uses uCEFBrowser, uCEFValue, uCEFDictionaryValue, uCEFStringMultimap, uCEFFrame, uCEFApplication, uCEFProcessMessage, uCEFRequestContext, {$IFNDEF FPC}uCEFOLEDragAndDrop,{$ENDIF} uCEFPDFPrintCallback, uCEFResolveCallback, uCEFDeleteCookiesCallback, uCEFStringVisitor, - uCEFListValue, uCEFNavigationEntryVisitor, uCEFDownloadImageCallBack, uCEFCookieManager; + uCEFListValue, uCEFNavigationEntryVisitor, uCEFDownloadImageCallBack, uCEFCookieManager, + uCEFRequestContextHandler; constructor TChromium.Create(AOwner: TComponent); begin @@ -845,6 +864,7 @@ begin FIsOSR := False; FDefaultUrl := 'about:blank'; FHandler := nil; + FReqContextHandler := nil; FOptions := nil; FFontOptions := nil; FDefaultEncoding := ''; @@ -967,6 +987,7 @@ begin {$ENDIF} DestroyClientHandler; + DestroyReqContextHandler; inherited BeforeDestruction; end; @@ -1007,6 +1028,27 @@ begin end; end; +procedure TChromium.DestroyReqContextHandler; +begin + try + if (FReqContextHandler <> nil) then + begin + FReqContextHandler.RemoveReferences; + FReqContextHandler := nil; + end; + except + on e : exception do + if CustomExceptionHandler('TChromium.DestroyReqContextHandler', e) then raise; + end; +end; + +procedure TChromium.CreateReqContextHandler; +begin + if MustCreateRequestContextHandler and + (FReqContextHandler = nil) then + FReqContextHandler := TCustomRequestContextHandler.Create(self); +end; + procedure TChromium.AfterConstruction; {$IFDEF FPC} var @@ -1170,6 +1212,10 @@ begin // ICefFindHandler FOnFindResult := nil; + // ICefRequestContextHandler + FOnRequestContextInitialized := nil; + FOnBeforePluginLoad := nil; + // Custom FOnTextResultAvailable := nil; FOnPdfPrintFinished := nil; @@ -1216,36 +1262,57 @@ function TChromium.CreateBrowser( aParentHandle : HWND; const aWindowName : ustring; const aContext : ICefRequestContext; const aExtraInfo : ICefDictionaryValue) : boolean; +var + TempNewContext, TempGlobalContext : ICefRequestContext; begin - Result := False; + Result := False; + TempNewContext := nil; try - // GlobalCEFApp.GlobalContextInitialized has to be TRUE before creating any browser - // even if you use a custom request context. - // If you create a browser in the initialization of your app, make sure you call this - // function when GlobalCEFApp.GlobalContextInitialized is TRUE. - // Use the GlobalCEFApp.OnContextInitialized event to know when - // GlobalCEFApp.GlobalContextInitialized is set to TRUE. + try + // GlobalCEFApp.GlobalContextInitialized has to be TRUE before creating any browser + // even if you use a custom request context. + // If you create a browser in the initialization of your app, make sure you call this + // function when GlobalCEFApp.GlobalContextInitialized is TRUE. + // Use the GlobalCEFApp.OnContextInitialized event to know when + // GlobalCEFApp.GlobalContextInitialized is set to TRUE. - if not(csDesigning in ComponentState) and - not(FClosing) and - (FBrowser = nil) and - (FBrowserId = 0) and - (GlobalCEFApp <> nil) and - GlobalCEFApp.GlobalContextInitialized and - CreateClientHandler(aParentHandle = 0) then - begin - GetSettings(FBrowserSettings); - InitializeWindowInfo(aParentHandle, aParentRect, aWindowName); + if not(csDesigning in ComponentState) and + not(FClosing) and + (FBrowser = nil) and + (FBrowserId = 0) and + (GlobalCEFApp <> nil) and + GlobalCEFApp.GlobalContextInitialized and + CreateClientHandler(aParentHandle = 0) then + begin + GetSettings(FBrowserSettings); + InitializeWindowInfo(aParentHandle, aParentRect, aWindowName); - if GlobalCEFApp.MultiThreadedMessageLoop then - Result := CreateBrowserHost(@FWindowInfo, FDefaultUrl, @FBrowserSettings, aExtraInfo, aContext) - else - Result := CreateBrowserHostSync(@FWindowInfo, FDefaultUrl, @FBrowserSettings, aExtraInfo, aContext); - end; - except - on e : exception do - if CustomExceptionHandler('TChromium.CreateBrowser', e) then raise; + if (aContext = nil) then + begin + CreateReqContextHandler; + + if (FReqContextHandler <> nil) then + begin + TempGlobalContext := TCefRequestContextRef.Global(); + TempNewContext := TCefRequestContextRef.Shared(TempGlobalContext, FReqContextHandler); + end; + end + else + TempNewContext := aContext; + + if GlobalCEFApp.MultiThreadedMessageLoop then + Result := CreateBrowserHost(@FWindowInfo, FDefaultUrl, @FBrowserSettings, aExtraInfo, TempNewContext) + else + Result := CreateBrowserHostSync(@FWindowInfo, FDefaultUrl, @FBrowserSettings, aExtraInfo, TempNewContext); + end; + except + on e : exception do + if CustomExceptionHandler('TChromium.CreateBrowser', e) then raise; + end; + finally + TempGlobalContext := nil; + TempNewContext := nil; end; end; @@ -2087,6 +2154,20 @@ begin end; end; +procedure TChromium.SetOnRequestContextInitialized(const aValue : TOnRequestContextInitialized); +begin + FOnRequestContextInitialized := aValue; + + CreateReqContextHandler; +end; + +procedure TChromium.SetOnBeforePluginLoad(const aValue : TOnBeforePluginLoad); +begin + FOnBeforePluginLoad := aValue; + + CreateReqContextHandler; +end; + procedure TChromium.SetWebRTCIPHandlingPolicy(aValue : TCefWebRTCHandlingPolicy); begin if (FWebRTCIPHandlingPolicy <> aValue) then @@ -3311,6 +3392,12 @@ begin assigned(FOnCanSaveCookie); end; +function TChromium.MustCreateRequestContextHandler : boolean; +begin + Result := assigned(FOnRequestContextInitialized) or + assigned(FOnBeforePluginLoad); +end; + {$IFDEF MSWINDOWS} procedure TChromium.PrefsAvailableMsg(var aMessage : TMessage); begin @@ -3810,6 +3897,37 @@ begin FOnFindResult(Self, browser, identifier, count, selectionRect, activeMatchOrdinal, finalUpdate); end; +procedure TChromium.doOnRequestContextInitialized(const request_context: ICefRequestContext); +begin + if assigned(FOnRequestContextInitialized) then FOnRequestContextInitialized(self, request_context); +end; + +function TChromium.doOnBeforePluginLoad(const mimeType : ustring; + const pluginUrl : ustring; + isMainFrame : boolean; + const topOriginUrl : ustring; + const pluginInfo : ICefWebPluginInfo; + var pluginPolicy : TCefPluginPolicy): Boolean; +begin + Result := False; + + if assigned(FOnBeforePluginLoad) then + FOnBeforePluginLoad(self, mimeType, pluginUrl, isMainFrame, topOriginUrl, pluginInfo, pluginPolicy, Result); +end; + +procedure TChromium.doGetResourceRequestHandler(const browser : ICefBrowser; + const frame : ICefFrame; + const request : ICefRequest; + is_navigation : boolean; + is_download : boolean; + const request_initiator : ustring; + var disable_default_handling : boolean; + var aResourceRequestHandler : ICefResourceRequestHandler); +begin + disable_default_handling := False; + aResourceRequestHandler := nil; +end; + procedure TChromium.doOnFullScreenModeChange(const browser: ICefBrowser; fullscreen: Boolean); begin if Assigned(FOnFullScreenModeChange) then FOnFullScreenModeChange(Self, browser, fullscreen); diff --git a/source/uCEFChromiumEvents.pas b/source/uCEFChromiumEvents.pas index d625ef18..3f2b6b1e 100644 --- a/source/uCEFChromiumEvents.pas +++ b/source/uCEFChromiumEvents.pas @@ -161,6 +161,10 @@ type // ICefFindHandler TOnFindResult = procedure(Sender: TObject; const browser: ICefBrowser; identifier, count: Integer; const selectionRect: PCefRect; activeMatchOrdinal: Integer; finalUpdate: Boolean) of Object; + // ICefRequestContextHandler + TOnRequestContextInitialized = procedure(Sender: TObject; const request_context: ICefRequestContext) of Object; + TOnBeforePluginLoad = procedure(Sender: TObject; const mimeType, pluginUrl:ustring; isMainFrame : boolean; const topOriginUrl: ustring; const pluginInfo: ICefWebPluginInfo; var pluginPolicy: TCefPluginPolicy; var aResult : boolean) of Object; + // Custom TOnTextResultAvailableEvent = procedure(Sender: TObject; const aText : ustring) of object; TOnPdfPrintFinishedEvent = procedure(Sender: TObject; aResultOK : boolean) of object; diff --git a/source/uCEFFMXChromium.pas b/source/uCEFFMXChromium.pas index 06e757fa..f07bba7f 100644 --- a/source/uCEFFMXChromium.pas +++ b/source/uCEFFMXChromium.pas @@ -61,6 +61,7 @@ type FHandler : ICefClient; FBrowser : ICefBrowser; FBrowserId : Integer; + FReqContextHandler : ICefRequestContextHandler; FDefaultUrl : ustring; FOptions : TChromiumOptions; FFontOptions : TChromiumFontOptions; @@ -221,6 +222,10 @@ type // ICefFindHandler FOnFindResult : TOnFindResult; + // ICefRequestContextHandler + FOnRequestContextInitialized : TOnRequestContextInitialized; + FOnBeforePluginLoad : TOnBeforePluginLoad; + // Custom FOnTextResultAvailable : TOnTextResultAvailableEvent; FOnPdfPrintFinished : TOnPdfPrintFinishedEvent; @@ -294,14 +299,16 @@ type procedure SetSafeSearch(aValue : boolean); procedure SetYouTubeRestrict(aValue : integer); procedure SetPrintingEnabled(aValue : boolean); - + procedure SetOnRequestContextInitialized(const aValue : TOnRequestContextInitialized); + procedure SetOnBeforePluginLoad(const aValue : TOnBeforePluginLoad); function CreateBrowserHost(aWindowInfo : PCefWindowInfo; const aURL : ustring; const aSettings : PCefBrowserSettings; const aExtraInfo : ICefDictionaryValue; const aContext : ICefRequestContext): boolean; function CreateBrowserHostSync(aWindowInfo : PCefWindowInfo; const aURL : ustring; const aSettings : PCefBrowserSettings; const aExtraInfo : ICefDictionaryValue; const aContext : ICefRequestContext): boolean; procedure DestroyClientHandler; - + procedure DestroyReqContextHandler; procedure ClearBrowserReference; + procedure CreateReqContextHandler; procedure InitializeEvents; procedure InitializeSettings(var aSettings : TCefBrowserSettings); @@ -445,6 +452,11 @@ type // ICefFindHandler procedure doOnFindResult(const browser: ICefBrowser; identifier, count: Integer; const selectionRect: PCefRect; activeMatchOrdinal: Integer; finalUpdate: Boolean); virtual; + // ICefRequestContextHandler + procedure doOnRequestContextInitialized(const request_context: ICefRequestContext); virtual; + function doOnBeforePluginLoad(const mimeType, pluginUrl:ustring; isMainFrame : boolean; const topOriginUrl: ustring; const pluginInfo: ICefWebPluginInfo; var pluginPolicy: TCefPluginPolicy): Boolean; virtual; + procedure doGetResourceRequestHandler(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; is_navigation, is_download: boolean; const request_initiator: ustring; var disable_default_handling: boolean; var aResourceRequestHandler : ICefResourceRequestHandler); virtual; + // Custom procedure doCookiesDeleted(numDeleted : integer); virtual; procedure doPdfPrintFinished(aResultOK : boolean); virtual; @@ -474,6 +486,7 @@ type function MustCreateFindHandler : boolean; virtual; function MustCreateResourceRequestHandler : boolean; virtual; function MustCreateCookieAccessFilter : boolean; virtual; + function MustCreateRequestContextHandler : boolean; virtual; public constructor Create(AOwner: TComponent); override; @@ -596,6 +609,7 @@ type property BrowserId : integer read FBrowserId; property Browser : ICefBrowser read FBrowser; property CefClient : ICefClient read FHandler; + property ReqContextHandler : ICefRequestContextHandler read FReqContextHandler; property CefWindowInfo : TCefWindowInfo read FWindowInfo; property VisibleNavigationEntry : ICefNavigationEntry read GetVisibleNavigationEntry; property MultithreadApp : boolean read GetMultithreadApp; @@ -773,6 +787,10 @@ type // ICefFindHandler property OnFindResult : TOnFindResult read FOnFindResult write FOnFindResult; + + // ICefRequestContextHandler + property OnRequestContextInitialized : TOnRequestContextInitialized read FOnRequestContextInitialized write SetOnRequestContextInitialized; + property OnBeforePluginLoad : TOnBeforePluginLoad read FOnBeforePluginLoad write SetOnBeforePluginLoad; end; implementation @@ -782,7 +800,8 @@ uses uCEFBrowser, uCEFValue, uCEFDictionaryValue, uCEFStringMultimap, uCEFFrame, uCEFApplication, uCEFProcessMessage, uCEFRequestContext, uCEFCookieManager, uCEFPDFPrintCallback, uCEFResolveCallback, uCEFDeleteCookiesCallback, uCEFStringVisitor, - uCEFListValue, uCEFNavigationEntryVisitor, uCEFDownloadImageCallBack; + uCEFListValue, uCEFNavigationEntryVisitor, uCEFDownloadImageCallBack, + uCEFRequestContextHandler; constructor TFMXChromium.Create(AOwner: TComponent); begin @@ -793,6 +812,7 @@ begin FInitialized := False; FDefaultUrl := 'about:blank'; FHandler := nil; + FReqContextHandler := nil; FOptions := nil; FFontOptions := nil; FDefaultEncoding := ''; @@ -901,6 +921,7 @@ begin {$ENDIF} DestroyClientHandler; + DestroyReqContextHandler; inherited BeforeDestruction; end; @@ -925,6 +946,27 @@ begin end; end; +procedure TFMXChromium.DestroyReqContextHandler; +begin + try + if (FReqContextHandler <> nil) then + begin + FReqContextHandler.RemoveReferences; + FReqContextHandler := nil; + end; + except + on e : exception do + if CustomExceptionHandler('TFMXChromium.DestroyReqContextHandler', e) then raise; + end; +end; + +procedure TFMXChromium.CreateReqContextHandler; +begin + if MustCreateRequestContextHandler and + (FReqContextHandler = nil) then + FReqContextHandler := TCustomRequestContextHandler.Create(self); +end; + procedure TFMXChromium.AfterConstruction; begin inherited AfterConstruction; @@ -1074,6 +1116,10 @@ begin // ICefFindHandler FOnFindResult := nil; + // ICefRequestContextHandler + FOnRequestContextInitialized := nil; + FOnBeforePluginLoad := nil; + // Custom FOnTextResultAvailable := nil; FOnPdfPrintFinished := nil; @@ -1090,36 +1136,57 @@ end; function TFMXChromium.CreateBrowser(const aWindowName : ustring; const aContext : ICefRequestContext; const aExtraInfo : ICefDictionaryValue) : boolean; +var + TempNewContext, TempGlobalContext : ICefRequestContext; begin - Result := False; + Result := False; + TempNewContext := nil; try - // GlobalCEFApp.GlobalContextInitialized has to be TRUE before creating any browser - // even if you use a custom request context. - // If you create a browser in the initialization of your app, make sure you call this - // function when GlobalCEFApp.GlobalContextInitialized is TRUE. - // Use the GlobalCEFApp.OnContextInitialized event to know when - // GlobalCEFApp.GlobalContextInitialized is set to TRUE. + try + // GlobalCEFApp.GlobalContextInitialized has to be TRUE before creating any browser + // even if you use a custom request context. + // If you create a browser in the initialization of your app, make sure you call this + // function when GlobalCEFApp.GlobalContextInitialized is TRUE. + // Use the GlobalCEFApp.OnContextInitialized event to know when + // GlobalCEFApp.GlobalContextInitialized is set to TRUE. - if not(csDesigning in ComponentState) and - not(FClosing) and - (FBrowser = nil) and - (FBrowserId = 0) and - (GlobalCEFApp <> nil) and - GlobalCEFApp.GlobalContextInitialized and - CreateClientHandler then - begin - GetSettings(FBrowserSettings); - WindowInfoAsWindowless(FWindowInfo, 0, aWindowName); + if not(csDesigning in ComponentState) and + not(FClosing) and + (FBrowser = nil) and + (FBrowserId = 0) and + (GlobalCEFApp <> nil) and + GlobalCEFApp.GlobalContextInitialized and + CreateClientHandler then + begin + GetSettings(FBrowserSettings); + WindowInfoAsWindowless(FWindowInfo, 0, aWindowName); - if GlobalCEFApp.MultiThreadedMessageLoop then - Result := CreateBrowserHost(@FWindowInfo, FDefaultUrl, @FBrowserSettings, aExtraInfo, aContext) - else - Result := CreateBrowserHostSync(@FWindowInfo, FDefaultUrl, @FBrowserSettings, aExtraInfo, aContext); - end; - except - on e : exception do - if CustomExceptionHandler('TFMXChromium.CreateBrowser', e) then raise; + if (aContext = nil) then + begin + CreateReqContextHandler; + + if (FReqContextHandler <> nil) then + begin + TempGlobalContext := TCefRequestContextRef.Global(); + TempNewContext := TCefRequestContextRef.Shared(TempGlobalContext, FReqContextHandler); + end; + end + else + TempNewContext := aContext; + + if GlobalCEFApp.MultiThreadedMessageLoop then + Result := CreateBrowserHost(@FWindowInfo, FDefaultUrl, @FBrowserSettings, aExtraInfo, TempNewContext) + else + Result := CreateBrowserHostSync(@FWindowInfo, FDefaultUrl, @FBrowserSettings, aExtraInfo, TempNewContext); + end; + except + on e : exception do + if CustomExceptionHandler('TFMXChromium.CreateBrowser', e) then raise; + end; + finally + TempGlobalContext := nil; + TempNewContext := nil; end; end; @@ -1129,36 +1196,60 @@ function TFMXChromium.CreateBrowser( aParentHandle : HWND; const aWindowName : ustring; const aContext : ICefRequestContext; const aExtraInfo : ICefDictionaryValue) : boolean; +var + TempNewContext, TempGlobalContext : ICefRequestContext; begin - Result := False; + Result := False; + TempNewContext := nil; + TempGlobalContext := nil; try - // GlobalCEFApp.GlobalContextInitialized has to be TRUE before creating any browser - // even if you use a custom request context. - // If you create a browser in the initialization of your app, make sure you call this - // function when GlobalCEFApp.GlobalContextInitialized is TRUE. - // Use the GlobalCEFApp.OnContextInitialized event to know when - // GlobalCEFApp.GlobalContextInitialized is set to TRUE. + try + // GlobalCEFApp.GlobalContextInitialized has to be TRUE before creating any browser + // even if you use a custom request context. + // If you create a browser in the initialization of your app, make sure you call this + // function when GlobalCEFApp.GlobalContextInitialized is TRUE. + // Use the GlobalCEFApp.OnContextInitialized event to know when + // GlobalCEFApp.GlobalContextInitialized is set to TRUE. - if not(csDesigning in ComponentState) and - not(FClosing) and - (FBrowser = nil) and - (FBrowserId = 0) and - (GlobalCEFApp <> nil) and - GlobalCEFApp.GlobalContextInitialized and - CreateClientHandler(aParentHandle = 0) then - begin - GetSettings(FBrowserSettings); - InitializeWindowInfo(aParentHandle, aParentRect, aWindowName); + if not(csDesigning in ComponentState) and + not(FClosing) and + (FBrowser = nil) and + (FBrowserId = 0) and + (GlobalCEFApp <> nil) and + GlobalCEFApp.GlobalContextInitialized and + CreateClientHandler(aParentHandle = 0) then + begin + GetSettings(FBrowserSettings); + InitializeWindowInfo(aParentHandle, aParentRect, aWindowName); - if GlobalCEFApp.MultiThreadedMessageLoop then - Result := CreateBrowserHost(@FWindowInfo, FDefaultUrl, @FBrowserSettings, aExtraInfo, aContext) - else - Result := CreateBrowserHostSync(@FWindowInfo, FDefaultUrl, @FBrowserSettings, aExtraInfo, aContext); - end; - except - on e : exception do - if CustomExceptionHandler('TFMXChromium.CreateBrowser', e) then raise; + if (aContext = nil) then + begin + CreateReqContextHandler; + + if (FReqContextHandler = nil) then + TempNewContext := nil + else + begin + TempGlobalContext := TCefRequestContextRef.Global(); + TempNewContext := TCefRequestContextRef.Shared(TempGlobalContext, FReqContextHandler); + end; + end + else + TempNewContext := aContext; + + if GlobalCEFApp.MultiThreadedMessageLoop then + Result := CreateBrowserHost(@FWindowInfo, FDefaultUrl, @FBrowserSettings, aExtraInfo, TempNewContext) + else + Result := CreateBrowserHostSync(@FWindowInfo, FDefaultUrl, @FBrowserSettings, aExtraInfo, TempNewContext); + end; + except + on e : exception do + if CustomExceptionHandler('TFMXChromium.CreateBrowser', e) then raise; + end; + finally + TempGlobalContext := nil; + TempNewContext := nil; end; end; @@ -1862,6 +1953,20 @@ begin end; end; +procedure TFMXChromium.SetOnRequestContextInitialized(const aValue : TOnRequestContextInitialized); +begin + FOnRequestContextInitialized := aValue; + + CreateReqContextHandler; +end; + +procedure TFMXChromium.SetOnBeforePluginLoad(const aValue : TOnBeforePluginLoad); +begin + FOnBeforePluginLoad := aValue; + + CreateReqContextHandler; +end; + procedure TFMXChromium.SetWebRTCIPHandlingPolicy(aValue : TCefWebRTCHandlingPolicy); begin if (FWebRTCIPHandlingPolicy <> aValue) then @@ -3029,6 +3134,12 @@ begin assigned(FOnCanSaveCookie); end; +function TFMXChromium.MustCreateRequestContextHandler : boolean; +begin + Result := assigned(FOnRequestContextInitialized) or + assigned(FOnBeforePluginLoad); +end; + procedure TFMXChromium.doTextResultAvailable(const aText : ustring); begin if assigned(FOnTextResultAvailable) then FOnTextResultAvailable(self, aText); @@ -3174,6 +3285,7 @@ begin if (browser <> nil) and (FBrowserId = browser.Identifier) then begin FInitialized := False; + DestroyReqContextHandler; ClearBrowserReference; DestroyClientHandler; end; @@ -3416,6 +3528,37 @@ begin FOnFindResult(Self, browser, identifier, count, selectionRect, activeMatchOrdinal, finalUpdate); end; +procedure TFMXChromium.doOnRequestContextInitialized(const request_context: ICefRequestContext); +begin + if assigned(FOnRequestContextInitialized) then FOnRequestContextInitialized(self, request_context); +end; + +function TFMXChromium.doOnBeforePluginLoad(const mimeType : ustring; + const pluginUrl : ustring; + isMainFrame : boolean; + const topOriginUrl : ustring; + const pluginInfo : ICefWebPluginInfo; + var pluginPolicy : TCefPluginPolicy): Boolean; +begin + Result := False; + + if assigned(FOnBeforePluginLoad) then + FOnBeforePluginLoad(self, mimeType, pluginUrl, isMainFrame, topOriginUrl, pluginInfo, pluginPolicy, Result); +end; + +procedure TFMXChromium.doGetResourceRequestHandler(const browser : ICefBrowser; + const frame : ICefFrame; + const request : ICefRequest; + is_navigation : boolean; + is_download : boolean; + const request_initiator : ustring; + var disable_default_handling : boolean; + var aResourceRequestHandler : ICefResourceRequestHandler); +begin + disable_default_handling := False; + aResourceRequestHandler := nil; +end; + procedure TFMXChromium.doOnFullScreenModeChange(const browser: ICefBrowser; fullscreen: Boolean); begin if Assigned(FOnFullScreenModeChange) then FOnFullScreenModeChange(Self, browser, fullscreen); diff --git a/source/uCEFInterfaces.pas b/source/uCEFInterfaces.pas index e675cc3c..71cba2f0 100644 --- a/source/uCEFInterfaces.pas +++ b/source/uCEFInterfaces.pas @@ -374,6 +374,11 @@ type // ICefFindHandler procedure doOnFindResult(const browser: ICefBrowser; identifier, count: Integer; const selectionRect: PCefRect; activeMatchOrdinal: Integer; finalUpdate: Boolean); + // ICefRequestContextHandler + procedure doOnRequestContextInitialized(const request_context: ICefRequestContext); + function doOnBeforePluginLoad(const mimeType, pluginUrl:ustring; isMainFrame : boolean; const topOriginUrl: ustring; const pluginInfo: ICefWebPluginInfo; var pluginPolicy: TCefPluginPolicy): Boolean; + procedure doGetResourceRequestHandler(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; is_navigation, is_download: boolean; const request_initiator: ustring; var disable_default_handling: boolean; var aResourceRequestHandler : ICefResourceRequestHandler); + // Custom procedure doCookiesDeleted(numDeleted : integer); procedure doPdfPrintFinished(aResultOK : boolean); @@ -1971,8 +1976,10 @@ type ICefRequestContextHandler = interface(ICefBaseRefCounted) ['{76EB1FA7-78DF-4FD5-ABB3-1CDD3E73A140}'] procedure OnRequestContextInitialized(const request_context: ICefRequestContext); - function OnBeforePluginLoad(const mimeType, pluginUrl:ustring; isMainFrame : boolean; const topOriginUrl: ustring; const pluginInfo: ICefWebPluginInfo; pluginPolicy: PCefPluginPolicy): Boolean; + function OnBeforePluginLoad(const mimeType, pluginUrl:ustring; isMainFrame : boolean; const topOriginUrl: ustring; const pluginInfo: ICefWebPluginInfo; var pluginPolicy: TCefPluginPolicy): Boolean; procedure GetResourceRequestHandler(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; is_navigation, is_download: boolean; const request_initiator: ustring; var disable_default_handling: boolean; var aResourceRequestHandler : ICefResourceRequestHandler); + + procedure RemoveReferences; // custom procedure to clear all references end; // TCefResolveCallback diff --git a/source/uCEFRequestContextHandler.pas b/source/uCEFRequestContextHandler.pas index f2a785a3..eb3cfaca 100644 --- a/source/uCEFRequestContextHandler.pas +++ b/source/uCEFRequestContextHandler.pas @@ -55,9 +55,11 @@ type TCefRequestContextHandlerRef = class(TCefBaseRefCountedRef, ICefRequestContextHandler) protected procedure OnRequestContextInitialized(const request_context: ICefRequestContext); - function OnBeforePluginLoad(const mimeType, pluginUrl: ustring; isMainFrame : boolean; const topOriginUrl: ustring; const pluginInfo: ICefWebPluginInfo; pluginPolicy: PCefPluginPolicy): Boolean; + function OnBeforePluginLoad(const mimeType, pluginUrl: ustring; isMainFrame : boolean; const topOriginUrl: ustring; const pluginInfo: ICefWebPluginInfo; var pluginPolicy: TCefPluginPolicy): Boolean; procedure GetResourceRequestHandler(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; is_navigation, is_download: boolean; const request_initiator: ustring; var disable_default_handling: boolean; var aResourceRequestHandler : ICefResourceRequestHandler); + procedure RemoveReferences; virtual; + public class function UnWrap(data: Pointer): ICefRequestContextHandler; end; @@ -65,13 +67,29 @@ type TCefRequestContextHandlerOwn = class(TCefBaseRefCountedOwn, ICefRequestContextHandler) protected procedure OnRequestContextInitialized(const request_context: ICefRequestContext); virtual; - function OnBeforePluginLoad(const mimeType, pluginUrl: ustring; isMainFrame : boolean; const topOriginUrl: ustring; const pluginInfo: ICefWebPluginInfo; pluginPolicy: PCefPluginPolicy): Boolean; virtual; + function OnBeforePluginLoad(const mimeType, pluginUrl: ustring; isMainFrame : boolean; const topOriginUrl: ustring; const pluginInfo: ICefWebPluginInfo; var pluginPolicy: TCefPluginPolicy): Boolean; virtual; procedure GetResourceRequestHandler(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; is_navigation, is_download: boolean; const request_initiator: ustring; var disable_default_handling: boolean; var aResourceRequestHandler : ICefResourceRequestHandler); virtual; + procedure RemoveReferences; virtual; + public constructor Create; virtual; end; + TCustomRequestContextHandler = class(TCefRequestContextHandlerOwn) + protected + FEvents : Pointer; + + procedure OnRequestContextInitialized(const request_context: ICefRequestContext); override; + function OnBeforePluginLoad(const mimeType, pluginUrl: ustring; isMainFrame : boolean; const topOriginUrl: ustring; const pluginInfo: ICefWebPluginInfo; var pluginPolicy: TCefPluginPolicy): Boolean; override; + procedure GetResourceRequestHandler(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; is_navigation, is_download: boolean; const request_initiator: ustring; var disable_default_handling: boolean; var aResourceRequestHandler : ICefResourceRequestHandler); override; + + public + constructor Create(const events : IChromiumEvents); reintroduce; virtual; + procedure BeforeDestruction; override; + procedure RemoveReferences; override; + end; + implementation uses @@ -100,9 +118,11 @@ function cef_request_context_handler_on_before_plugin_load( self plugin_policy : PCefPluginPolicy): Integer; stdcall; var TempObject : TObject; + TempPolicy : TCefPluginPolicy; begin Result := Ord(False); TempObject := CefGetObject(self); + TempPolicy := plugin_policy^; if (TempObject <> nil) and (TempObject is TCefRequestContextHandlerOwn) then Result := Ord(TCefRequestContextHandlerOwn(TempObject).OnBeforePluginLoad(CefString(mime_type), @@ -110,7 +130,8 @@ begin (is_main_frame <> 0), CefString(top_origin_url), TCefWebPluginInfoRef.UnWrap(plugin_info), - plugin_policy)); + TempPolicy)); + plugin_policy^ := TempPolicy; end; function cef_request_context_handler_get_resource_request_handler( self : PCefRequestContextHandler; @@ -171,7 +192,7 @@ function TCefRequestContextHandlerOwn.OnBeforePluginLoad(const mimeType : us isMainFrame : boolean; const topOriginUrl : ustring; const pluginInfo : ICefWebPluginInfo; - pluginPolicy : PCefPluginPolicy): Boolean; + var pluginPolicy : TCefPluginPolicy): Boolean; begin Result := False; end; @@ -188,6 +209,12 @@ begin aResourceRequestHandler := nil; end; +procedure TCefRequestContextHandlerOwn.RemoveReferences; +begin + // +end; + + // TCefRequestContextHandlerRef procedure TCefRequestContextHandlerRef.OnRequestContextInitialized(const request_context: ICefRequestContext); @@ -200,7 +227,7 @@ function TCefRequestContextHandlerRef.OnBeforePluginLoad(const mimeType : us isMainFrame : boolean; const topOriginUrl : ustring; const pluginInfo : ICefWebPluginInfo; - pluginPolicy : PCefPluginPolicy): Boolean; + var pluginPolicy : TCefPluginPolicy): Boolean; var TempType, TempPluginURL, TempOriginURL : TCefString; begin @@ -214,7 +241,7 @@ begin ord(isMainFrame), @TempOriginURL, CefGetData(pluginInfo), - pluginPolicy) <> 0; + @pluginPolicy) <> 0; end; @@ -250,6 +277,11 @@ begin aResourceRequestHandler := nil; end; +procedure TCefRequestContextHandlerRef.RemoveReferences; +begin + // +end; + class function TCefRequestContextHandlerRef.UnWrap(data: Pointer): ICefRequestContextHandler; begin if (data <> nil) then @@ -258,4 +290,87 @@ begin Result := nil; end; + +// TCustomRequestContextHandler + +constructor TCustomRequestContextHandler.Create(const events : IChromiumEvents); +begin + inherited Create; + + FEvents := Pointer(events); +end; + +procedure TCustomRequestContextHandler.BeforeDestruction; +begin + FEvents := nil; + + inherited BeforeDestruction; +end; + +procedure TCustomRequestContextHandler.RemoveReferences; +begin + FEvents := nil; +end; + +procedure TCustomRequestContextHandler.OnRequestContextInitialized(const request_context: ICefRequestContext); +begin + if (FEvents <> nil) then + IChromiumEvents(FEvents).doOnRequestContextInitialized(request_context) + else + inherited OnRequestContextInitialized(request_context); +end; + +function TCustomRequestContextHandler.OnBeforePluginLoad(const mimeType : ustring; + const pluginUrl : ustring; + isMainFrame : boolean; + const topOriginUrl : ustring; + const pluginInfo : ICefWebPluginInfo; + var pluginPolicy : TCefPluginPolicy): Boolean; +begin + if (FEvents <> nil) then + Result := IChromiumEvents(FEvents).doOnBeforePluginLoad(mimeType, + pluginUrl, + isMainFrame, + topOriginUrl, + pluginInfo, + pluginPolicy) + else + Result := inherited OnBeforePluginLoad(mimeType, + pluginUrl, + isMainFrame, + topOriginUrl, + pluginInfo, + pluginPolicy); +end; + +procedure TCustomRequestContextHandler.GetResourceRequestHandler(const browser : ICefBrowser; + const frame : ICefFrame; + const request : ICefRequest; + is_navigation : boolean; + is_download : boolean; + const request_initiator : ustring; + var disable_default_handling : boolean; + var aResourceRequestHandler : ICefResourceRequestHandler); +begin + if (FEvents <> nil) then + IChromiumEvents(FEvents).doGetResourceRequestHandler(browser, + frame, + request, + is_navigation, + is_download, + request_initiator, + disable_default_handling, + aResourceRequestHandler) + else + inherited GetResourceRequestHandler(browser, + frame, + request, + is_navigation, + is_download, + request_initiator, + disable_default_handling, + aResourceRequestHandler); +end; + + end. diff --git a/update_CEF4Delphi.json b/update_CEF4Delphi.json index 8dffd7ad..21efc087 100644 --- a/update_CEF4Delphi.json +++ b/update_CEF4Delphi.json @@ -1,10 +1,10 @@ { "UpdateLazPackages" : [ { - "ForceNotify" : true, - "InternalVersion" : 41, + "ForceNotify" : false, + "InternalVersion" : 42, "Name" : "cef4delphi_lazarus.lpk", - "Version" : "77.1.12.0" + "Version" : "77.1.13.0" } ], "UpdatePackageData" : { From 77121dc5104a4b94dbc3b9700f35ec44ab0abc03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Salvador=20D=C3=ADaz=20Fau?= Date: Sun, 13 Oct 2019 18:50:23 +0200 Subject: [PATCH 11/13] Added TCEFSentinel to more demos - Check that all frames are valid before using them - Added an error page to MiniBrowser. --- .../CookieVisitor/uCookieVisitor.dfm | 5 + .../CookieVisitor/uCookieVisitor.pas | 16 +- .../CustomResourceBrowser/uMainForm.dfm | 5 + .../CustomResourceBrowser/uMainForm.pas | 43 +++- demos/Delphi_VCL/DOMVisitor/uDOMVisitor.dfm | 5 + demos/Delphi_VCL/DOMVisitor/uDOMVisitor.pas | 73 ++++--- .../EditorBrowser/uEditorBrowser.dfm | 5 + .../EditorBrowser/uEditorBrowser.pas | 18 +- .../uExternalPumpBrowser.dfm | 5 + .../uExternalPumpBrowser.pas | 25 ++- .../FullScreenBrowser/uMainForm.dfm | 5 + .../FullScreenBrowser/uMainForm.pas | 20 +- .../JavaScript/JSDialog/uJSDialogBrowser.dfm | 5 + .../JavaScript/JSDialog/uJSDialogBrowser.pas | 22 +- .../Delphi_VCL/JavaScript/JSEval/uJSEval.dfm | 5 + .../Delphi_VCL/JavaScript/JSEval/uJSEval.pas | 24 +- .../uJSExecutingFunctions.dfm | 6 + .../uJSExecutingFunctions.pas | 16 +- .../JavaScript/JSExtension/uJSExtension.dfm | 5 + .../JavaScript/JSExtension/uJSExtension.pas | 24 +- .../JSExtension/uTestExtensionHandler.pas | 49 +++-- .../uJSExtensionWithFunction.dfm | 5 + .../uJSExtensionWithFunction.pas | 16 +- .../JSExtensionWithFunction/uMyV8Handler.pas | 31 ++- .../uJSExtensionWithObjectParameter.dfm | 5 + .../uJSExtensionWithObjectParameter.pas | 17 +- .../JSRTTIExtension/uJSRTTIExtension.dfm | 5 + .../JSRTTIExtension/uJSRTTIExtension.pas | 24 +- .../JSRTTIExtension/uTestExtension.pas | 37 +++- .../JSSimpleExtension/uJSSimpleExtension.dfm | 5 + .../JSSimpleExtension/uJSSimpleExtension.pas | 16 +- .../uJSSimpleWindowBinding.dfm | 5 + .../uJSSimpleWindowBinding.pas | 16 +- .../uJSSimpleWindowBinding.dfm | 5 + .../uJSSimpleWindowBinding.pas | 16 +- .../uJSWindowBindingWithArrayBuffer.dfm | 5 + .../uJSWindowBindingWithArrayBuffer.pas | 17 +- .../uJSWindowBindingWithFunction.dfm | 5 + .../uJSWindowBindingWithFunction.pas | 17 +- .../uJSWindowBindingWithObject.dfm | 5 + .../uJSWindowBindingWithObject.pas | 16 +- .../KioskOSRBrowser/uKioskOSRBrowser.dfm | 5 + .../KioskOSRBrowser/uKioskOSRBrowser.pas | 17 +- demos/Delphi_VCL/MDIBrowser/uMainForm.dfm | 5 + demos/Delphi_VCL/MDIBrowser/uMainForm.pas | 19 +- .../MDIExternalPumpBrowser/uMainForm.dfm | 5 + .../MDIExternalPumpBrowser/uMainForm.pas | 16 +- demos/Delphi_VCL/MiniBrowser/uMiniBrowser.pas | 36 ++- .../uOSRExternalPumpBrowser.dfm | 5 + .../uOSRExternalPumpBrowser.pas | 13 +- demos/Delphi_VCL/PopupBrowser/uMainForm.dfm | 5 + demos/Delphi_VCL/PopupBrowser/uMainForm.pas | 16 +- demos/Delphi_VCL/PopupBrowser2/uMainForm.dfm | 5 + demos/Delphi_VCL/PopupBrowser2/uMainForm.pas | 16 +- .../uPostInspectorBrowser.dfm | 5 + .../uPostInspectorBrowser.pas | 16 +- .../uResponseFilterBrowser.dfm | 5 + .../uResponseFilterBrowser.pas | 20 +- .../uSchemeRegistrationBrowser.dfm | 5 + .../uSchemeRegistrationBrowser.pas | 16 +- .../SimpleBrowser/uSimpleBrowser.dfm | 5 + .../SimpleBrowser/uSimpleBrowser.pas | 20 +- .../SimpleBrowser2/uSimpleBrowser2.pas | 3 +- .../uSimpleExternalPumpBrowser.dfm | 5 + .../uSimpleExternalPumpBrowser.pas | 15 +- .../SimpleOSRBrowser/uSimpleOSRBrowser.dfm | 5 + .../SimpleOSRBrowser/uSimpleOSRBrowser.pas | 17 +- .../Delphi_VCL/SubProcess/uSimpleBrowser.dfm | 5 + .../Delphi_VCL/SubProcess/uSimpleBrowser.pas | 18 +- demos/Delphi_VCL/TabbedBrowser/uMainForm.pas | 4 +- demos/Delphi_VCL/ToolBoxBrowser/uMainForm.pas | 3 +- demos/Delphi_VCL/URLRequest/uURLRequest.dfm | 5 + demos/Delphi_VCL/URLRequest/uURLRequest.pas | 22 +- demos/Lazarus/DOMVisitor/uDOMVisitor.pas | 41 ++-- .../Lazarus/EditorBrowser/uEditorBrowser.pas | 4 +- demos/Lazarus/JavaScript/JSEval/uJSEval.pas | 11 +- .../JavaScript/JSExtension/uJSExtension.pas | 8 +- .../JSExtension/uTestExtensionHandler.pas | 51 +++-- .../JSExtensionWithFunction/uMyV8Handler.pas | 33 ++- demos/Lazarus/MiniBrowser/uMiniBrowser.pas | 14 +- demos/Lazarus/PopupBrowser2/PopupBrowser2.lps | 96 ++++---- demos/Lazarus/PopupBrowser2/uMainForm.lfm | 8 +- demos/Lazarus/PopupBrowser2/uMainForm.pas | 5 +- .../uPostInspectorBrowser.pas | 4 +- source/uCEFChromium.pas | 206 +++++++++--------- source/uCEFFMXChromium.pas | 56 ++--- source/uCEFMiscFunctions.pas | 24 ++ source/uCEFRequestHandler.pas | 48 ++-- update_CEF4Delphi.json | 4 +- 89 files changed, 1097 insertions(+), 522 deletions(-) diff --git a/demos/Delphi_VCL/CookieVisitor/uCookieVisitor.dfm b/demos/Delphi_VCL/CookieVisitor/uCookieVisitor.dfm index 88222ee7..7f422052 100644 --- a/demos/Delphi_VCL/CookieVisitor/uCookieVisitor.dfm +++ b/demos/Delphi_VCL/CookieVisitor/uCookieVisitor.dfm @@ -82,4 +82,9 @@ object CookieVisitorFrm: TCookieVisitorFrm Left = 32 Top = 280 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + Left = 32 + Top = 336 + end end diff --git a/demos/Delphi_VCL/CookieVisitor/uCookieVisitor.pas b/demos/Delphi_VCL/CookieVisitor/uCookieVisitor.pas index 9b885b31..07143090 100644 --- a/demos/Delphi_VCL/CookieVisitor/uCookieVisitor.pas +++ b/demos/Delphi_VCL/CookieVisitor/uCookieVisitor.pas @@ -50,7 +50,7 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFApplication, uCEFTypes, uCEFConstants, - uCEFCookieManager, uCEFCookieVisitor, uCEFWinControl; + uCEFCookieManager, uCEFCookieVisitor, uCEFWinControl, uCEFSentinel; const MINIBROWSER_SHOWCOOKIES = WM_APP + $101; @@ -68,6 +68,7 @@ type CEFWindowParent1: TCEFWindowParent; Chromium1: TChromium; Timer1: TTimer; + CEFSentinel1: TCEFSentinel; procedure Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); procedure FormShow(Sender: TObject); procedure GoBtnClick(Sender: TObject); @@ -96,6 +97,7 @@ type var aAction : TCefCloseBrowserAction); procedure Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); + procedure CEFSentinel1Close(Sender: TObject); private procedure WMMove(var aMessage : TWMMove); message WM_MOVE; @@ -141,7 +143,8 @@ uses // ================= // 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. // 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. -// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form. +// 3. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure CreateGlobalCEFApp; begin @@ -229,6 +232,12 @@ begin Chromium1.LoadURL(Edit1.Text); end; +procedure TCookieVisitorFrm.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TCookieVisitorFrm.Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); begin PostMessage(Handle, CEF_AFTERCREATED, 0, 0); @@ -236,8 +245,7 @@ end; procedure TCookieVisitorFrm.Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TCookieVisitorFrm.Chromium1BeforeContextMenu(Sender: TObject; diff --git a/demos/Delphi_VCL/CustomResourceBrowser/uMainForm.dfm b/demos/Delphi_VCL/CustomResourceBrowser/uMainForm.dfm index 76d85e3c..9494b165 100644 --- a/demos/Delphi_VCL/CustomResourceBrowser/uMainForm.dfm +++ b/demos/Delphi_VCL/CustomResourceBrowser/uMainForm.dfm @@ -72,4 +72,9 @@ object MainForm: TMainForm Left = 48 Top = 240 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + Left = 48 + Top = 304 + end end diff --git a/demos/Delphi_VCL/CustomResourceBrowser/uMainForm.pas b/demos/Delphi_VCL/CustomResourceBrowser/uMainForm.pas index cd143261..11884096 100644 --- a/demos/Delphi_VCL/CustomResourceBrowser/uMainForm.pas +++ b/demos/Delphi_VCL/CustomResourceBrowser/uMainForm.pas @@ -50,7 +50,7 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFChromiumWindow, uCEFInterfaces, uCustomResourceHandler, - uCEFConstants, uCEFTypes, uCEFWinControl; + uCEFConstants, uCEFTypes, uCEFWinControl, uCEFSentinel; type TMainForm = class(TForm) @@ -59,6 +59,7 @@ type Edit1: TEdit; Button1: TButton; Timer1: TTimer; + CEFSentinel1: TCEFSentinel; procedure FormCreate(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); @@ -69,6 +70,7 @@ type procedure ChromiumWindow1Close(Sender: TObject); procedure ChromiumWindow1BeforeClose(Sender: TObject); + procedure CEFSentinel1Close(Sender: TObject); private procedure WMMove(var aMessage : TWMMove); message WM_MOVE; @@ -86,6 +88,7 @@ type procedure Chromium_OnAfterCreated(Sender: TObject); procedure Chromium_OnGetResourceHandler(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; var aResourceHandler : ICefResourceHandler); procedure Chromium_OnBeforePopup(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const targetUrl, targetFrameName: ustring; targetDisposition: TCefWindowOpenDisposition; userGesture: Boolean; const popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo; var client: ICefClient; var settings: TCefBrowserSettings; var extra_info: ICefDictionaryValue; var noJavascriptAccess: Boolean; var Result: Boolean); + procedure Chromium_OnGetResourceRequestHandler(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; var aUseInternalResourceRequestHandler : boolean); public { Public declarations } @@ -107,7 +110,8 @@ uses // ================= // 1. The FormCloseQuery event sets CanClose to False and calls TChromiumWindow.CloseBrowser, which triggers the TChromiumWindow.OnClose event. // 2. The TChromiumWindow.OnClose event calls TChromiumWindow.DestroyChildWindow which triggers the TChromiumWindow.OnBeforeClose event. -// 3. TChromiumWindow.OnBeforeClose sets FCanClose to True and closes the form. +// 3. TChromiumWindow.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure CreateGlobalCEFApp; begin @@ -157,9 +161,10 @@ end; procedure TMainForm.FormShow(Sender: TObject); begin - ChromiumWindow1.OnAfterCreated := Chromium_OnAfterCreated; - ChromiumWindow1.ChromiumBrowser.OnGetResourceHandler := Chromium_OnGetResourceHandler; - ChromiumWindow1.ChromiumBrowser.OnBeforePopup := Chromium_OnBeforePopup; + ChromiumWindow1.OnAfterCreated := Chromium_OnAfterCreated; + ChromiumWindow1.ChromiumBrowser.OnGetResourceHandler := Chromium_OnGetResourceHandler; + ChromiumWindow1.ChromiumBrowser.OnGetResourceRequestHandler := Chromium_OnGetResourceRequestHandler; + ChromiumWindow1.ChromiumBrowser.OnBeforePopup := Chromium_OnBeforePopup; // GlobalCEFApp.GlobalContextInitialized has to be TRUE before creating any browser // If it's not initialized yet, we use a simple timer to create the browser later. @@ -173,20 +178,21 @@ begin Timer1.Enabled := True; end; -procedure TMainForm.ChromiumWindow1BeforeClose(Sender: TObject); +procedure TMainForm.CEFSentinel1Close(Sender: TObject); begin FCanClose := True; PostMessage(Handle, WM_CLOSE, 0, 0); end; +procedure TMainForm.ChromiumWindow1BeforeClose(Sender: TObject); +begin + CEFSentinel1.Start; +end; + procedure TMainForm.ChromiumWindow1Close(Sender: TObject); begin // DestroyChildWindow will destroy the child window created by CEF at the top of the Z order. - if not(ChromiumWindow1.DestroyChildWindow) then - begin - FCanClose := True; - Close; - end; + if not(ChromiumWindow1.DestroyChildWindow) then CEFSentinel1.Start; end; procedure TMainForm.Chromium_OnAfterCreated(Sender: TObject); @@ -223,6 +229,21 @@ begin Result := (targetDisposition in [WOD_NEW_FOREGROUND_TAB, WOD_NEW_BACKGROUND_TAB, WOD_NEW_POPUP, WOD_NEW_WINDOW]); end; +procedure TMainForm.Chromium_OnGetResourceRequestHandler( Sender : TObject; + const browser : ICefBrowser; + const frame : ICefFrame; + const request : ICefRequest; + is_navigation : boolean; + is_download : boolean; + const request_initiator : ustring; + var disable_default_handling : boolean; + var aExternalResourceRequestHandler : ICefResourceRequestHandler; + var aUseInternalResourceRequestHandler : boolean); +begin + disable_default_handling := True; + aUseInternalResourceRequestHandler := True; +end; + procedure TMainForm.WMMove(var aMessage : TWMMove); begin inherited; diff --git a/demos/Delphi_VCL/DOMVisitor/uDOMVisitor.dfm b/demos/Delphi_VCL/DOMVisitor/uDOMVisitor.dfm index 53e478d0..559f9b73 100644 --- a/demos/Delphi_VCL/DOMVisitor/uDOMVisitor.dfm +++ b/demos/Delphi_VCL/DOMVisitor/uDOMVisitor.dfm @@ -110,4 +110,9 @@ object DOMVisitorFrm: TDOMVisitorFrm Left = 16 Top = 96 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + Left = 16 + Top = 160 + end end diff --git a/demos/Delphi_VCL/DOMVisitor/uDOMVisitor.pas b/demos/Delphi_VCL/DOMVisitor/uDOMVisitor.pas index d83fae57..1f88efed 100644 --- a/demos/Delphi_VCL/DOMVisitor/uDOMVisitor.pas +++ b/demos/Delphi_VCL/DOMVisitor/uDOMVisitor.pas @@ -51,7 +51,7 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Types, ComCtrls, ClipBrd, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFApplication, uCEFTypes, uCEFConstants, - uCEFWinControl; + uCEFWinControl, uCEFSentinel; const MINIBROWSER_VISITDOM_PARTIAL = WM_APP + $101; @@ -81,6 +81,7 @@ type Panel1: TPanel; GoBtn: TButton; VisitDOMBtn: TButton; + CEFSentinel1: TCEFSentinel; procedure GoBtnClick(Sender: TObject); procedure FormShow(Sender: TObject); procedure Chromium1AfterCreated(Sender: TObject; @@ -111,6 +112,7 @@ type var aAction : TCefCloseBrowserAction); procedure Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); + procedure CEFSentinel1Close(Sender: TObject); private { Private declarations } protected @@ -165,7 +167,8 @@ uses // ================= // 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. // 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. -// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form. +// 3. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure SimpleDOMIteration(const aDocument: ICefDomDocument); var @@ -226,7 +229,7 @@ end; procedure DOMVisitor_OnDocAvailable(const browser: ICefBrowser; const frame: ICefFrame; const document: ICefDomDocument); var - msg: ICefProcessMessage; + TempMessage : ICefProcessMessage; begin // This function is called from a different process. // document is only valid inside this function. @@ -247,21 +250,33 @@ begin // Sending back some custom results to the browser process // Notice that the DOMVISITOR_MSGNAME_PARTIAL message name needs to be recognized in // Chromium1ProcessMessageReceived - msg := TCefProcessMessageRef.New(DOMVISITOR_MSGNAME_PARTIAL); - msg.ArgumentList.SetString(0, 'document.Title : ' + document.Title); - frame.SendProcessMessage(PID_BROWSER, msg); + try + TempMessage := TCefProcessMessageRef.New(DOMVISITOR_MSGNAME_PARTIAL); + TempMessage.ArgumentList.SetString(0, 'document.Title : ' + document.Title); + + if (frame <> nil) and frame.IsValid then + frame.SendProcessMessage(PID_BROWSER, TempMessage); + finally + TempMessage := nil; + end; end; procedure DOMVisitor_OnDocAvailableFullMarkup(const browser: ICefBrowser; const frame: ICefFrame; const document: ICefDomDocument); var - msg: ICefProcessMessage; + TempMessage : ICefProcessMessage; begin // Sending back some custom results to the browser process // Notice that the DOMVISITOR_MSGNAME_FULL message name needs to be recognized in // Chromium1ProcessMessageReceived - msg := TCefProcessMessageRef.New(DOMVISITOR_MSGNAME_FULL); - msg.ArgumentList.SetString(0, document.Body.AsMarkup); - frame.SendProcessMessage(PID_BROWSER, msg); + try + TempMessage := TCefProcessMessageRef.New(DOMVISITOR_MSGNAME_FULL); + TempMessage.ArgumentList.SetString(0, document.Body.AsMarkup); + + if (frame <> nil) and frame.IsValid then + frame.SendProcessMessage(PID_BROWSER, TempMessage); + finally + TempMessage := nil; + end; end; procedure DOMVisitor_GetFrameIDs(const browser: ICefBrowser; const frame : ICefFrame); @@ -285,9 +300,15 @@ begin inc(i); end; - TempMsg := TCefProcessMessageRef.New(FRAMEIDS_MSGNAME); - TempMsg.ArgumentList.SetString(0, TempString); - frame.SendProcessMessage(PID_BROWSER, TempMsg); + try + TempMsg := TCefProcessMessageRef.New(FRAMEIDS_MSGNAME); + TempMsg.ArgumentList.SetString(0, TempString); + + if (frame <> nil) and frame.IsValid then + frame.SendProcessMessage(PID_BROWSER, TempMsg); + finally + TempMsg := nil; + end; end; end; @@ -297,7 +318,6 @@ procedure GlobalCEFApp_OnProcessMessageReceived(const browser : ICefBrowse const message : ICefProcessMessage; var aHandled : boolean); var - TempFrame : ICefFrame; TempVisitor : TCefFastDomVisitor2; begin aHandled := False; @@ -306,12 +326,10 @@ begin begin if (message.name = RETRIEVEDOM_MSGNAME_PARTIAL) then begin - TempFrame := browser.MainFrame; - - if (TempFrame <> nil) then + if (frame <> nil) and frame.IsValid then begin - TempVisitor := TCefFastDomVisitor2.Create(browser, TempFrame, DOMVisitor_OnDocAvailable); - TempFrame.VisitDom(TempVisitor); + TempVisitor := TCefFastDomVisitor2.Create(browser, frame, DOMVisitor_OnDocAvailable); + frame.VisitDom(TempVisitor); end; aHandled := True; @@ -319,12 +337,10 @@ begin else if (message.name = RETRIEVEDOM_MSGNAME_FULL) then begin - TempFrame := browser.MainFrame; - - if (TempFrame <> nil) then + if (frame <> nil) and frame.IsValid then begin - TempVisitor := TCefFastDomVisitor2.Create(browser, TempFrame, DOMVisitor_OnDocAvailableFullMarkup); - TempFrame.VisitDom(TempVisitor); + TempVisitor := TCefFastDomVisitor2.Create(browser, frame, DOMVisitor_OnDocAvailableFullMarkup); + frame.VisitDom(TempVisitor); end; aHandled := True; @@ -351,6 +367,12 @@ begin GlobalCEFApp.LogSeverity := LOGSEVERITY_INFO; end; +procedure TDOMVisitorFrm.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TDOMVisitorFrm.Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); begin PostMessage(Handle, CEF_AFTERCREATED, 0, 0); @@ -359,8 +381,7 @@ end; procedure TDOMVisitorFrm.Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TDOMVisitorFrm.Chromium1BeforeContextMenu(Sender: TObject; diff --git a/demos/Delphi_VCL/EditorBrowser/uEditorBrowser.dfm b/demos/Delphi_VCL/EditorBrowser/uEditorBrowser.dfm index 27380698..086fa2b6 100644 --- a/demos/Delphi_VCL/EditorBrowser/uEditorBrowser.dfm +++ b/demos/Delphi_VCL/EditorBrowser/uEditorBrowser.dfm @@ -1122,4 +1122,9 @@ object Form1: TForm1 Left = 128 Top = 200 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + Left = 56 + Top = 256 + end end diff --git a/demos/Delphi_VCL/EditorBrowser/uEditorBrowser.pas b/demos/Delphi_VCL/EditorBrowser/uEditorBrowser.pas index 97955bd7..e5f5b371 100644 --- a/demos/Delphi_VCL/EditorBrowser/uEditorBrowser.pas +++ b/demos/Delphi_VCL/EditorBrowser/uEditorBrowser.pas @@ -52,7 +52,7 @@ uses ImageList, ImgList, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFConstants, uCEFTypes, - uCEFWinControl; + uCEFWinControl, uCEFSentinel; type TForm1 = class(TForm) @@ -91,6 +91,7 @@ type RemoveFormatBtn: TToolButton; OutdentBtn: TToolButton; Separator7: TToolButton; + CEFSentinel1: TCEFSentinel; procedure Timer1Timer(Sender: TObject); @@ -124,6 +125,7 @@ type procedure FillColorBtnClick(Sender: TObject); procedure RemoveFormatBtnClick(Sender: TObject); procedure OutdentBtnClick(Sender: TObject); + procedure CEFSentinel1Close(Sender: TObject); protected // Variables to control when can we destroy the form safely @@ -170,7 +172,8 @@ uses // ================= // 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. // 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. -// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form. +// 3. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure CreateGlobalCEFApp; begin @@ -226,6 +229,12 @@ begin if not(Chromium1.CreateBrowser(CEFWindowParent1)) then Timer1.Enabled := True; end; +procedure TForm1.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TForm1.Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); begin // Now the browser is fully initialized we can send a message to the main form to load the initial web page. @@ -235,8 +244,7 @@ end; procedure TForm1.Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TForm1.Chromium1Close(Sender: TObject; @@ -250,7 +258,7 @@ procedure TForm1.Chromium1LoadEnd(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; httpStatusCode: Integer); begin - if (frame <> nil) and not(frame.isMain) then exit; + if (frame <> nil) and (not(frame.IsValid) or not(frame.isMain)) then exit; // Enable the "designMode" for all loaded files to edit them EnableDesignMode; diff --git a/demos/Delphi_VCL/ExternalPumpBrowser/uExternalPumpBrowser.dfm b/demos/Delphi_VCL/ExternalPumpBrowser/uExternalPumpBrowser.dfm index 8f052feb..e11f474c 100644 --- a/demos/Delphi_VCL/ExternalPumpBrowser/uExternalPumpBrowser.dfm +++ b/demos/Delphi_VCL/ExternalPumpBrowser/uExternalPumpBrowser.dfm @@ -99,4 +99,9 @@ object ExternalPumpBrowserFrm: TExternalPumpBrowserFrm Left = 56 Top = 152 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + Left = 56 + Top = 224 + end end diff --git a/demos/Delphi_VCL/ExternalPumpBrowser/uExternalPumpBrowser.pas b/demos/Delphi_VCL/ExternalPumpBrowser/uExternalPumpBrowser.pas index dc7e219e..545de05b 100644 --- a/demos/Delphi_VCL/ExternalPumpBrowser/uExternalPumpBrowser.pas +++ b/demos/Delphi_VCL/ExternalPumpBrowser/uExternalPumpBrowser.pas @@ -50,7 +50,7 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFTypes, uCEFConstants, uCEFInterfaces, uCEFWorkScheduler, - uCEFWinControl; + uCEFWinControl, uCEFSentinel; type TExternalPumpBrowserFrm = class(TForm) @@ -60,6 +60,7 @@ type CEFWindowParent1: TCEFWindowParent; Chromium1: TChromium; URLCbx: TComboBox; + CEFSentinel1: TCEFSentinel; procedure GoBtnClick(Sender: TObject); procedure FormShow(Sender: TObject); @@ -79,6 +80,7 @@ type var client: ICefClient; var settings: TCefBrowserSettings; var extra_info: ICefDictionaryValue; var noJavascriptAccess: Boolean; var Result: Boolean); + procedure CEFSentinel1Close(Sender: TObject); private FCanClose : boolean; @@ -110,6 +112,13 @@ uses // This demo has a simple browser with a TChromium + TCEFWindowParent combination // It was necessary to destroy the browser following the destruction sequence described in the MDIBrowser demo. +// Destruction steps +// ================= +// 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. +// 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. +// 3. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. + procedure GlobalCEFApp_OnScheduleMessagePumpWork(const aDelayMS : int64); begin if (GlobalCEFWorkScheduler <> nil) then GlobalCEFWorkScheduler.ScheduleMessagePumpWork(aDelayMS); @@ -142,9 +151,8 @@ begin if not(FClosing) then begin - FClosing := True; - Visible := False; - AddressPnl.Enabled := False; + FClosing := True; + Visible := False; Chromium1.CloseBrowser(True); end; end; @@ -156,6 +164,12 @@ begin if not(Chromium1.CreateBrowser(CEFWindowParent1, '')) then Timer1.Enabled := True; end; +procedure TExternalPumpBrowserFrm.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TExternalPumpBrowserFrm.Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); begin PostMessage(Handle, CEF_AFTERCREATED, 0, 0); @@ -163,8 +177,7 @@ end; procedure TExternalPumpBrowserFrm.Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TExternalPumpBrowserFrm.Chromium1BeforePopup(Sender: TObject; diff --git a/demos/Delphi_VCL/FullScreenBrowser/uMainForm.dfm b/demos/Delphi_VCL/FullScreenBrowser/uMainForm.dfm index ae4f530f..6cdeddbe 100644 --- a/demos/Delphi_VCL/FullScreenBrowser/uMainForm.dfm +++ b/demos/Delphi_VCL/FullScreenBrowser/uMainForm.dfm @@ -45,4 +45,9 @@ object MainForm: TMainForm Left = 272 Top = 120 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + Left = 328 + Top = 120 + end end diff --git a/demos/Delphi_VCL/FullScreenBrowser/uMainForm.pas b/demos/Delphi_VCL/FullScreenBrowser/uMainForm.pas index 4691edd2..979e9924 100644 --- a/demos/Delphi_VCL/FullScreenBrowser/uMainForm.pas +++ b/demos/Delphi_VCL/FullScreenBrowser/uMainForm.pas @@ -49,13 +49,14 @@ uses Controls, Forms, Dialogs, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFTypes, uCEFConstants, - Vcl.ExtCtrls, uCEFWinControl; + Vcl.ExtCtrls, uCEFWinControl, uCEFSentinel; type TMainForm = class(TForm) CEFWindowParent1: TCEFWindowParent; Chromium1: TChromium; Timer1: TTimer; + CEFSentinel1: TCEFSentinel; procedure Chromium1PreKeyEvent(Sender: TObject; const browser: ICefBrowser; const event: PCefKeyEvent; osEvent: PMsg; out isKeyboardShortcut, Result: Boolean); @@ -80,6 +81,7 @@ type const browser: ICefBrowser); procedure Chromium1Close(Sender: TObject; const browser: ICefBrowser; var aAction : TCefCloseBrowserAction); + procedure CEFSentinel1Close(Sender: TObject); private { Private declarations } protected @@ -112,6 +114,13 @@ implementation uses uCEFApplication; +// Destruction steps +// ================= +// 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. +// 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. +// 3. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. + procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; @@ -157,6 +166,12 @@ begin if (TempKeyMsg.CharCode = VK_ESCAPE) then aHandled := True; end; +procedure TMainForm.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TMainForm.Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); begin PostMessage(Handle, CEF_AFTERCREATED, 0, 0); @@ -164,8 +179,7 @@ end; procedure TMainForm.Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TMainForm.Chromium1BeforePopup(Sender: TObject; diff --git a/demos/Delphi_VCL/JavaScript/JSDialog/uJSDialogBrowser.dfm b/demos/Delphi_VCL/JavaScript/JSDialog/uJSDialogBrowser.dfm index c837e2fc..fed2877c 100644 --- a/demos/Delphi_VCL/JavaScript/JSDialog/uJSDialogBrowser.dfm +++ b/demos/Delphi_VCL/JavaScript/JSDialog/uJSDialogBrowser.dfm @@ -72,4 +72,9 @@ object JSDialogBrowserFrm: TJSDialogBrowserFrm Left = 56 Top = 88 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + Left = 56 + Top = 152 + end end diff --git a/demos/Delphi_VCL/JavaScript/JSDialog/uJSDialogBrowser.pas b/demos/Delphi_VCL/JavaScript/JSDialog/uJSDialogBrowser.pas index ce262982..23a86896 100644 --- a/demos/Delphi_VCL/JavaScript/JSDialog/uJSDialogBrowser.pas +++ b/demos/Delphi_VCL/JavaScript/JSDialog/uJSDialogBrowser.pas @@ -50,7 +50,7 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, SyncObjs, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFChromiumWindow, uCEFInterfaces, uCEFTypes, uCEFConstants, - uCEFWinControl; + uCEFWinControl, uCEFSentinel; const CEFBROWSER_SHOWJSDIALOG = WM_APP + $101; @@ -62,6 +62,7 @@ type AddressEdt: TEdit; GoBtn: TButton; Timer1: TTimer; + CEFSentinel1: TCEFSentinel; procedure GoBtnClick(Sender: TObject); procedure FormShow(Sender: TObject); procedure ChromiumWindow1AfterCreated(Sender: TObject); @@ -71,6 +72,7 @@ type procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); procedure ChromiumWindow1Close(Sender: TObject); procedure ChromiumWindow1BeforeClose(Sender: TObject); + procedure CEFSentinel1Close(Sender: TObject); protected FJSDialogInfoCS : TCriticalSection; @@ -114,7 +116,8 @@ uses // ================= // 1. The FormCloseQuery event sets CanClose to False and calls TChromiumWindow.CloseBrowser, which triggers the TChromiumWindow.OnClose event. // 2. The TChromiumWindow.OnClose event calls TChromiumWindow.DestroyChildWindow which triggers the TChromiumWindow.OnBeforeClose event. -// 3. TChromiumWindow.OnBeforeClose sets FCanClose to True and closes the form. +// 3. TChromiumWindow.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure CreateGlobalCEFApp; begin @@ -164,6 +167,12 @@ begin if not(ChromiumWindow1.CreateBrowser) then Timer1.Enabled := True; end; +procedure TJSDialogBrowserFrm.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TJSDialogBrowserFrm.ChromiumWindow1AfterCreated(Sender: TObject); begin Caption := 'JS Dialog Browser'; @@ -248,18 +257,13 @@ end; procedure TJSDialogBrowserFrm.ChromiumWindow1BeforeClose(Sender: TObject); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TJSDialogBrowserFrm.ChromiumWindow1Close(Sender: TObject); begin // DestroyChildWindow will destroy the child window created by CEF at the top of the Z order. - if not(ChromiumWindow1.DestroyChildWindow) then - begin - FCanClose := True; - Close; - end; + if not(ChromiumWindow1.DestroyChildWindow) then CEFSentinel1.Start; end; procedure TJSDialogBrowserFrm.Chromium_OnBeforePopup(Sender: TObject; diff --git a/demos/Delphi_VCL/JavaScript/JSEval/uJSEval.dfm b/demos/Delphi_VCL/JavaScript/JSEval/uJSEval.dfm index 185ea0f1..b64f2335 100644 --- a/demos/Delphi_VCL/JavaScript/JSEval/uJSEval.dfm +++ b/demos/Delphi_VCL/JavaScript/JSEval/uJSEval.dfm @@ -79,4 +79,9 @@ object JSEvalFrm: TJSEvalFrm Left = 16 Top = 96 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + Left = 16 + Top = 160 + end end diff --git a/demos/Delphi_VCL/JavaScript/JSEval/uJSEval.pas b/demos/Delphi_VCL/JavaScript/JSEval/uJSEval.pas index ecade24c..53ae5da4 100644 --- a/demos/Delphi_VCL/JavaScript/JSEval/uJSEval.pas +++ b/demos/Delphi_VCL/JavaScript/JSEval/uJSEval.pas @@ -51,7 +51,7 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Types, ComCtrls, ClipBrd, EncdDecd, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFApplication, uCEFTypes, uCEFConstants, - uCEFWinControl; + uCEFWinControl, uCEFSentinel; const MINIBROWSER_SHOWTEXTVIEWER = WM_APP + $101; @@ -74,6 +74,7 @@ type GoBtn: TButton; AddressEdt: TEdit; Timer1: TTimer; + CEFSentinel1: TCEFSentinel; procedure Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); procedure GoBtnClick(Sender: TObject); procedure FormShow(Sender: TObject); @@ -102,6 +103,7 @@ type var aAction : TCefCloseBrowserAction); procedure Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); + procedure CEFSentinel1Close(Sender: TObject); private { Private declarations } @@ -178,8 +180,14 @@ uses // ================= // 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. // 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. -// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form. +// 3. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. +procedure TJSEvalFrm.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; procedure TJSEvalFrm.Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); begin @@ -189,8 +197,7 @@ end; procedure TJSEvalFrm.Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TJSEvalFrm.Chromium1BeforeContextMenu(Sender : TObject; @@ -435,7 +442,8 @@ begin end; end; - pFrame.SendProcessMessage(PID_BROWSER, pAnswer); + if (pFrame <> nil) and pFrame.IsValid then + pFrame.SendProcessMessage(PID_BROWSER, pAnswer); end; procedure ParseBinaryValue(const pBrowser : ICefBrowser; const pFrame : ICefFrame; const aBinaryValue : ICefBinaryValue); @@ -464,7 +472,7 @@ begin TempString := 'Image size : ' + inttostr(TempSize) + #13 + #10 + 'Encoded image : ' + EncodeBase64(TempPointer, TempSize); - if pAnswer.ArgumentList.SetString(0, TempString) then + if (pFrame <> nil) and pFrame.IsValid and pAnswer.ArgumentList.SetString(0, TempString) then pFrame.SendProcessMessage(PID_BROWSER, pAnswer); end; end; @@ -497,9 +505,9 @@ begin begin TempScript := pMessage.ArgumentList.GetString(0); - if (length(TempScript) > 0) then + if (length(TempScript) > 0) and (pFrame <> nil) and pFrame.IsValid then begin - pV8Context := pBrowser.MainFrame.GetV8Context; + pV8Context := pFrame.GetV8Context; if pV8Context.Enter then begin diff --git a/demos/Delphi_VCL/JavaScript/JSExecutingFunctions/uJSExecutingFunctions.dfm b/demos/Delphi_VCL/JavaScript/JSExecutingFunctions/uJSExecutingFunctions.dfm index 826440ec..d5d809ba 100644 --- a/demos/Delphi_VCL/JavaScript/JSExecutingFunctions/uJSExecutingFunctions.dfm +++ b/demos/Delphi_VCL/JavaScript/JSExecutingFunctions/uJSExecutingFunctions.dfm @@ -79,4 +79,10 @@ object JSExecutingFunctionsFrm: TJSExecutingFunctionsFrm Left = 32 Top = 288 end + object CEFSentinel1: TCEFSentinel + MinInitDelayMs = 2000 + OnClose = CEFSentinel1Close + Left = 32 + Top = 360 + end end diff --git a/demos/Delphi_VCL/JavaScript/JSExecutingFunctions/uJSExecutingFunctions.pas b/demos/Delphi_VCL/JavaScript/JSExecutingFunctions/uJSExecutingFunctions.pas index 44622364..eb4301a1 100644 --- a/demos/Delphi_VCL/JavaScript/JSExecutingFunctions/uJSExecutingFunctions.pas +++ b/demos/Delphi_VCL/JavaScript/JSExecutingFunctions/uJSExecutingFunctions.pas @@ -50,7 +50,7 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFApplication, uCEFTypes, - uCEFConstants, uCEFv8Value, uCEFWinControl; + uCEFConstants, uCEFv8Value, uCEFWinControl, uCEFSentinel; const JSDEMO_CONTEXTMENU_EXECFUNCTION = MENU_ID_USER_FIRST + 1; @@ -65,6 +65,7 @@ type CEFWindowParent1: TCEFWindowParent; Chromium1: TChromium; Timer1: TTimer; + CEFSentinel1: TCEFSentinel; procedure FormShow(Sender: TObject); procedure GoBtnClick(Sender: TObject); procedure Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); @@ -91,6 +92,7 @@ type var aAction : TCefCloseBrowserAction); procedure Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); + procedure CEFSentinel1Close(Sender: TObject); protected // Variables to control when can we destroy the form safely FCanClose : boolean; // Set to True in TChromium.OnBeforeClose @@ -134,7 +136,8 @@ implementation // ================= // 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. // 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. -// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form. +// 3. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. uses uCEFProcessMessage, uMyV8Handler; @@ -181,6 +184,12 @@ begin Chromium1.LoadURL(Edit1.Text); end; +procedure TJSExecutingFunctionsFrm.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TJSExecutingFunctionsFrm.Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); begin PostMessage(Handle, CEF_AFTERCREATED, 0, 0); @@ -189,8 +198,7 @@ end; procedure TJSExecutingFunctionsFrm.Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TJSExecutingFunctionsFrm.Chromium1BeforeContextMenu( diff --git a/demos/Delphi_VCL/JavaScript/JSExtension/uJSExtension.dfm b/demos/Delphi_VCL/JavaScript/JSExtension/uJSExtension.dfm index 7cbbd875..de625531 100644 --- a/demos/Delphi_VCL/JavaScript/JSExtension/uJSExtension.dfm +++ b/demos/Delphi_VCL/JavaScript/JSExtension/uJSExtension.dfm @@ -89,4 +89,9 @@ object JSExtensionFrm: TJSExtensionFrm Left = 32 Top = 288 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + Left = 32 + Top = 360 + end end diff --git a/demos/Delphi_VCL/JavaScript/JSExtension/uJSExtension.pas b/demos/Delphi_VCL/JavaScript/JSExtension/uJSExtension.pas index f2a9f659..fec856df 100644 --- a/demos/Delphi_VCL/JavaScript/JSExtension/uJSExtension.pas +++ b/demos/Delphi_VCL/JavaScript/JSExtension/uJSExtension.pas @@ -50,7 +50,7 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFApplication, uCEFTypes, uCEFConstants, - uCEFWinControl; + uCEFWinControl, uCEFSentinel; const MINIBROWSER_SHOWTEXTVIEWER = WM_APP + $100; @@ -71,6 +71,7 @@ type CEFWindowParent1: TCEFWindowParent; Chromium1: TChromium; Timer1: TTimer; + CEFSentinel1: TCEFSentinel; procedure FormShow(Sender: TObject); procedure GoBtnClick(Sender: TObject); procedure Chromium1BeforeContextMenu(Sender: TObject; @@ -99,6 +100,7 @@ type var aAction : TCefCloseBrowserAction); procedure Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); + procedure CEFSentinel1Close(Sender: TObject); protected FText : string; // Variables to control when can we destroy the form safely @@ -273,7 +275,8 @@ uses // the TChromium.OnClose event. // 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 // in the main thread, which triggers the TChromium.OnBeforeClose event. -// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form. +// 3. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure GlobalCEFApp_OnWebKitInitialized; @@ -326,6 +329,12 @@ begin Chromium1.LoadURL(Edit1.Text); end; +procedure TJSExtensionFrm.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TJSExtensionFrm.Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); begin PostMessage(Handle, CEF_AFTERCREATED, 0, 0); @@ -334,8 +343,7 @@ end; procedure TJSExtensionFrm.Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TJSExtensionFrm.Chromium1BeforeContextMenu(Sender: TObject; @@ -382,7 +390,7 @@ begin case commandId of MINIBROWSER_CONTEXTMENU_SETJSEVENT : - if (browser <> nil) and (browser.MainFrame <> nil) then + if (frame <> nil) and frame.IsValid then begin TempJSCode := 'document.body.addEventListener("mouseover", function(evt){'+ 'function getpath(n){'+ @@ -393,16 +401,16 @@ begin 'myextension.mouseover(getpath(evt.target))}'+ ')'; - browser.MainFrame.ExecuteJavaScript(TempJSCode, 'about:blank', 0); + frame.ExecuteJavaScript(TempJSCode, 'about:blank', 0); end; MINIBROWSER_CONTEXTMENU_JSVISITDOM : - if (browser <> nil) and (browser.MainFrame <> nil) then + if (frame <> nil) and frame.IsValid then begin TempJSCode := 'var testhtml = document.body.innerHTML; ' + 'myextension.sendresulttobrowser(testhtml, ' + quotedstr(CUSTOMNAME_MESSAGE_NAME) + ');'; - browser.MainFrame.ExecuteJavaScript(TempJSCode, 'about:blank', 0); + frame.ExecuteJavaScript(TempJSCode, 'about:blank', 0); end; MINIBROWSER_CONTEXTMENU_SHOWDEVTOOLS : diff --git a/demos/Delphi_VCL/JavaScript/JSExtension/uTestExtensionHandler.pas b/demos/Delphi_VCL/JavaScript/JSExtension/uTestExtensionHandler.pas index b47473b7..4a19f534 100644 --- a/demos/Delphi_VCL/JavaScript/JSExtension/uTestExtensionHandler.pas +++ b/demos/Delphi_VCL/JavaScript/JSExtension/uTestExtensionHandler.pas @@ -67,35 +67,46 @@ function TTestExtensionHandler.Execute(const name : ustring; var retval : ICefv8Value; var exception : ustring): Boolean; var - msg: ICefProcessMessage; + TempMessage : ICefProcessMessage; + TempFrame : ICefFrame; begin - if (name = 'mouseover') then - begin - if (length(arguments) > 0) and arguments[0].IsString then - begin - msg := TCefProcessMessageRef.New(MOUSEOVER_MESSAGE_NAME); - msg.ArgumentList.SetString(0, arguments[0].GetStringValue); + Result := False; - TCefv8ContextRef.Current.Browser.MainFrame.SendProcessMessage(PID_BROWSER, msg); - end; - - Result := True; - end - else - if (name = 'sendresulttobrowser') then + try + if (name = 'mouseover') then begin - if (length(arguments) > 1) and arguments[0].IsString and arguments[1].IsString then + if (length(arguments) > 0) and arguments[0].IsString then begin - msg := TCefProcessMessageRef.New(arguments[1].GetStringValue); - msg.ArgumentList.SetString(0, arguments[0].GetStringValue); + TempMessage := TCefProcessMessageRef.New(MOUSEOVER_MESSAGE_NAME); + TempMessage.ArgumentList.SetString(0, arguments[0].GetStringValue); - TCefv8ContextRef.Current.Browser.MainFrame.SendProcessMessage(PID_BROWSER, msg); + TempFrame := TCefv8ContextRef.Current.Browser.MainFrame; + + if (TempFrame <> nil) and TempFrame.IsValid then + TempFrame.SendProcessMessage(PID_BROWSER, TempMessage); end; Result := True; end else - Result := False; + if (name = 'sendresulttobrowser') then + begin + if (length(arguments) > 1) and arguments[0].IsString and arguments[1].IsString then + begin + TempMessage := TCefProcessMessageRef.New(arguments[1].GetStringValue); + TempMessage.ArgumentList.SetString(0, arguments[0].GetStringValue); + + TempFrame := TCefv8ContextRef.Current.Browser.MainFrame; + + if (TempFrame <> nil) and TempFrame.IsValid then + TempFrame.SendProcessMessage(PID_BROWSER, TempMessage); + end; + + Result := True; + end; + finally + TempMessage := nil; + end; end; end. diff --git a/demos/Delphi_VCL/JavaScript/JSExtensionWithFunction/uJSExtensionWithFunction.dfm b/demos/Delphi_VCL/JavaScript/JSExtensionWithFunction/uJSExtensionWithFunction.dfm index d668e4cf..f58c6095 100644 --- a/demos/Delphi_VCL/JavaScript/JSExtensionWithFunction/uJSExtensionWithFunction.dfm +++ b/demos/Delphi_VCL/JavaScript/JSExtensionWithFunction/uJSExtensionWithFunction.dfm @@ -87,4 +87,9 @@ object JSExtensionWithFunctionFrm: TJSExtensionWithFunctionFrm Left = 32 Top = 288 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + Left = 32 + Top = 352 + end end diff --git a/demos/Delphi_VCL/JavaScript/JSExtensionWithFunction/uJSExtensionWithFunction.pas b/demos/Delphi_VCL/JavaScript/JSExtensionWithFunction/uJSExtensionWithFunction.pas index 3f823515..ddcefb58 100644 --- a/demos/Delphi_VCL/JavaScript/JSExtensionWithFunction/uJSExtensionWithFunction.pas +++ b/demos/Delphi_VCL/JavaScript/JSExtensionWithFunction/uJSExtensionWithFunction.pas @@ -50,7 +50,7 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFApplication, uCEFTypes, uCEFConstants, - uCEFWinControl; + uCEFWinControl, uCEFSentinel; type TJSExtensionWithFunctionFrm = class(TForm) @@ -61,6 +61,7 @@ type Chromium1: TChromium; Timer1: TTimer; StatusBar1: TStatusBar; + CEFSentinel1: TCEFSentinel; procedure FormShow(Sender: TObject); procedure GoBtnClick(Sender: TObject); procedure Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); @@ -82,6 +83,7 @@ type var aAction : TCefCloseBrowserAction); procedure Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); + procedure CEFSentinel1Close(Sender: TObject); protected // Variables to control when can we destroy the form safely FCanClose : boolean; // Set to True in TChromium.OnBeforeClose @@ -121,7 +123,8 @@ uses // ================= // 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. // 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. -// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form. +// 3. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. {$IFDEF DELPHI12_UP}procedure {$ELSE}class procedure TJSSimpleExtensionFrm.{$ENDIF}GlobalCEFApp_OnWebKitInitializedEvent; @@ -159,6 +162,12 @@ begin Chromium1.LoadURL(Edit1.Text); end; +procedure TJSExtensionWithFunctionFrm.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TJSExtensionWithFunctionFrm.Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); begin PostMessage(Handle, CEF_AFTERCREATED, 0, 0); @@ -167,8 +176,7 @@ end; procedure TJSExtensionWithFunctionFrm.Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TJSExtensionWithFunctionFrm.Chromium1BeforePopup(Sender: TObject; diff --git a/demos/Delphi_VCL/JavaScript/JSExtensionWithFunction/uMyV8Handler.pas b/demos/Delphi_VCL/JavaScript/JSExtensionWithFunction/uMyV8Handler.pas index c4b60a99..13f26591 100644 --- a/demos/Delphi_VCL/JavaScript/JSExtensionWithFunction/uMyV8Handler.pas +++ b/demos/Delphi_VCL/JavaScript/JSExtensionWithFunction/uMyV8Handler.pas @@ -61,19 +61,28 @@ function TMyV8Handler.Execute(const name : ustring; var retval : ICefv8Value; var exception : ustring): Boolean; var - msg: ICefProcessMessage; + TempMessage : ICefProcessMessage; + TempFrame : ICefFrame; begin - if (name = 'myfunc') then - begin - msg := TCefProcessMessageRef.New(TEST_MESSAGE_NAME); - msg.ArgumentList.SetString(0, 'Message received!'); - TCefv8ContextRef.Current.Browser.MainFrame.SendProcessMessage(PID_BROWSER, msg); + Result := False; - retval := TCefv8ValueRef.NewString('My Value!'); - Result := True; - end - else - Result := False; + try + if (name = 'myfunc') then + begin + TempMessage := TCefProcessMessageRef.New(TEST_MESSAGE_NAME); + TempMessage.ArgumentList.SetString(0, 'Message received!'); + + TempFrame := TCefv8ContextRef.Current.Browser.MainFrame; + + if (TempFrame <> nil) and TempFrame.IsValid then + TempFrame.SendProcessMessage(PID_BROWSER, TempMessage); + + retval := TCefv8ValueRef.NewString('My Value!'); + Result := True; + end; + finally + TempMessage := nil; + end; end; diff --git a/demos/Delphi_VCL/JavaScript/JSExtensionWithObjectParameter/uJSExtensionWithObjectParameter.dfm b/demos/Delphi_VCL/JavaScript/JSExtensionWithObjectParameter/uJSExtensionWithObjectParameter.dfm index 19e1706f..0277d1b0 100644 --- a/demos/Delphi_VCL/JavaScript/JSExtensionWithObjectParameter/uJSExtensionWithObjectParameter.dfm +++ b/demos/Delphi_VCL/JavaScript/JSExtensionWithObjectParameter/uJSExtensionWithObjectParameter.dfm @@ -76,4 +76,9 @@ object JSExtensionWithObjectParameterFrm: TJSExtensionWithObjectParameterFrm Left = 32 Top = 288 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + Left = 32 + Top = 352 + end end diff --git a/demos/Delphi_VCL/JavaScript/JSExtensionWithObjectParameter/uJSExtensionWithObjectParameter.pas b/demos/Delphi_VCL/JavaScript/JSExtensionWithObjectParameter/uJSExtensionWithObjectParameter.pas index c9bc17d5..1ff9d835 100644 --- a/demos/Delphi_VCL/JavaScript/JSExtensionWithObjectParameter/uJSExtensionWithObjectParameter.pas +++ b/demos/Delphi_VCL/JavaScript/JSExtensionWithObjectParameter/uJSExtensionWithObjectParameter.pas @@ -50,7 +50,7 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFApplication, uCEFTypes, uCEFConstants, - uCEFWinControl; + uCEFWinControl, uCEFSentinel; type TJSExtensionWithObjectParameterFrm = class(TForm) @@ -60,6 +60,7 @@ type CEFWindowParent1: TCEFWindowParent; Chromium1: TChromium; Timer1: TTimer; + CEFSentinel1: TCEFSentinel; procedure FormShow(Sender: TObject); procedure GoBtnClick(Sender: TObject); procedure Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); @@ -78,6 +79,7 @@ type var aAction : TCefCloseBrowserAction); procedure Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); + procedure CEFSentinel1Close(Sender: TObject); protected // Variables to control when can we destroy the form safely FCanClose : boolean; // Set to True in TChromium.OnBeforeClose @@ -120,7 +122,8 @@ uses // ================= // 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. // 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. -// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form. +// 3. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. {$IFDEF DELPHI12_UP}procedure {$ELSE}class procedure TJSSimpleExtensionFrm.{$ENDIF}GlobalCEFApp_OnWebKitInitializedEvent; @@ -162,6 +165,13 @@ begin Chromium1.LoadURL(Edit1.Text); end; +procedure TJSExtensionWithObjectParameterFrm.CEFSentinel1Close( + Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TJSExtensionWithObjectParameterFrm.Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); begin PostMessage(Handle, CEF_AFTERCREATED, 0, 0); @@ -170,8 +180,7 @@ end; procedure TJSExtensionWithObjectParameterFrm.Chromium1BeforeClose( Sender: TObject; const browser: ICefBrowser); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TJSExtensionWithObjectParameterFrm.Chromium1BeforePopup( diff --git a/demos/Delphi_VCL/JavaScript/JSRTTIExtension/uJSRTTIExtension.dfm b/demos/Delphi_VCL/JavaScript/JSRTTIExtension/uJSRTTIExtension.dfm index b9d4b1e0..7156bab3 100644 --- a/demos/Delphi_VCL/JavaScript/JSRTTIExtension/uJSRTTIExtension.dfm +++ b/demos/Delphi_VCL/JavaScript/JSRTTIExtension/uJSRTTIExtension.dfm @@ -89,4 +89,9 @@ object JSRTTIExtensionFrm: TJSRTTIExtensionFrm Left = 32 Top = 288 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + Left = 32 + Top = 352 + end end diff --git a/demos/Delphi_VCL/JavaScript/JSRTTIExtension/uJSRTTIExtension.pas b/demos/Delphi_VCL/JavaScript/JSRTTIExtension/uJSRTTIExtension.pas index a119e00c..2e994476 100644 --- a/demos/Delphi_VCL/JavaScript/JSRTTIExtension/uJSRTTIExtension.pas +++ b/demos/Delphi_VCL/JavaScript/JSRTTIExtension/uJSRTTIExtension.pas @@ -50,7 +50,7 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFApplication, uCEFTypes, uCEFConstants, - uCEFWinControl; + uCEFWinControl, uCEFSentinel; const MINIBROWSER_SHOWTEXTVIEWER = WM_APP + $100; @@ -72,6 +72,7 @@ type CEFWindowParent1: TCEFWindowParent; Chromium1: TChromium; Timer1: TTimer; + CEFSentinel1: TCEFSentinel; procedure FormShow(Sender: TObject); procedure GoBtnClick(Sender: TObject); procedure Chromium1BeforeContextMenu(Sender: TObject; @@ -100,6 +101,7 @@ type var aAction : TCefCloseBrowserAction); procedure Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); + procedure CEFSentinel1Close(Sender: TObject); protected FText : string; // Variables to control when can we destroy the form safely @@ -155,7 +157,8 @@ uses // ================= // 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. // 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. -// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form. +// 3. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure GlobalCEFApp_OnWebKitInitialized; begin @@ -184,6 +187,12 @@ begin Chromium1.LoadURL(Edit1.Text); end; +procedure TJSRTTIExtensionFrm.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TJSRTTIExtensionFrm.Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); begin PostMessage(Handle, CEF_AFTERCREATED, 0, 0); @@ -228,7 +237,7 @@ begin // Here is the code executed for each custom context menu entry case commandId of MINIBROWSER_CONTEXTMENU_SETJSEVENT : - if (browser <> nil) and (browser.MainFrame <> nil) then + if (frame <> nil) and frame.IsValid then begin TempJSCode := 'document.body.addEventListener("mouseover", function(evt){'+ 'function getpath(n){'+ @@ -239,17 +248,17 @@ begin 'myextension.mouseover(getpath(evt.target))}'+ // This is the call from JavaScript to the extension with DELPHI code in uTestExtension.pas ')'; - browser.MainFrame.ExecuteJavaScript(TempJSCode, 'about:blank', 0); + frame.ExecuteJavaScript(TempJSCode, 'about:blank', 0); end; MINIBROWSER_CONTEXTMENU_JSVISITDOM : - if (browser <> nil) and (browser.MainFrame <> nil) then + if (frame <> nil) and frame.IsValid then begin // This is the call from JavaScript to the extension with DELPHI code in uTestExtension.pas TempJSCode := 'var testhtml = document.body.innerHTML; ' + 'myextension.sendresulttobrowser(testhtml, ' + quotedstr(CUSTOMNAME_MESSAGE_NAME) + ');'; - browser.MainFrame.ExecuteJavaScript(TempJSCode, 'about:blank', 0); + frame.ExecuteJavaScript(TempJSCode, 'about:blank', 0); end; MINIBROWSER_CONTEXTMENU_SHOWDEVTOOLS : @@ -342,8 +351,7 @@ end; procedure TJSRTTIExtensionFrm.Chromium1BeforeClose( Sender: TObject; const browser: ICefBrowser); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TJSRTTIExtensionFrm.Chromium1Close( diff --git a/demos/Delphi_VCL/JavaScript/JSRTTIExtension/uTestExtension.pas b/demos/Delphi_VCL/JavaScript/JSRTTIExtension/uTestExtension.pas index 720e368e..aa25ab33 100644 --- a/demos/Delphi_VCL/JavaScript/JSRTTIExtension/uTestExtension.pas +++ b/demos/Delphi_VCL/JavaScript/JSRTTIExtension/uTestExtension.pas @@ -63,24 +63,41 @@ uses class procedure TTestExtension.mouseover(const data: string); var - msg: ICefProcessMessage; + TempMessage : ICefProcessMessage; + TempFrame : ICefFrame; begin - msg := TCefProcessMessageRef.New(MOUSEOVER_MESSAGE_NAME); - msg.ArgumentList.SetString(0, data); + try + TempMessage := TCefProcessMessageRef.New(MOUSEOVER_MESSAGE_NAME); + TempMessage.ArgumentList.SetString(0, data); - // Sending a message back to the browser. It'll be received in the TChromium.OnProcessMessageReceived event. - // TCefv8ContextRef.Current returns the v8 context for the frame that is currently executing Javascript. - TCefv8ContextRef.Current.Browser.MainFrame.SendProcessMessage(PID_BROWSER, msg); + // Sending a message back to the browser. It'll be received in the TChromium.OnProcessMessageReceived event. + // TCefv8ContextRef.Current returns the v8 context for the frame that is currently executing Javascript. + + TempFrame := TCefv8ContextRef.Current.Browser.MainFrame; + + if (TempFrame <> nil) and TempFrame.IsValid then + TempFrame.SendProcessMessage(PID_BROWSER, TempMessage); + finally + TempMessage := nil; + end; end; class procedure TTestExtension.sendresulttobrowser(const msgtext, msgname : string); var - msg: ICefProcessMessage; + TempMessage : ICefProcessMessage; + TempFrame : ICefFrame; begin - msg := TCefProcessMessageRef.New(msgname); - msg.ArgumentList.SetString(0, msgtext); + try + TempMessage := TCefProcessMessageRef.New(msgname); + TempMessage.ArgumentList.SetString(0, msgtext); - TCefv8ContextRef.Current.Browser.MainFrame.SendProcessMessage(PID_BROWSER, msg); + TempFrame := TCefv8ContextRef.Current.Browser.MainFrame; + + if (TempFrame <> nil) and TempFrame.IsValid then + TempFrame.SendProcessMessage(PID_BROWSER, TempMessage); + finally + TempMessage := nil; + end; end; end. diff --git a/demos/Delphi_VCL/JavaScript/JSSimpleExtension/uJSSimpleExtension.dfm b/demos/Delphi_VCL/JavaScript/JSSimpleExtension/uJSSimpleExtension.dfm index 3435c774..82d23110 100644 --- a/demos/Delphi_VCL/JavaScript/JSSimpleExtension/uJSSimpleExtension.dfm +++ b/demos/Delphi_VCL/JavaScript/JSSimpleExtension/uJSSimpleExtension.dfm @@ -76,4 +76,9 @@ object JSSimpleExtensionFrm: TJSSimpleExtensionFrm Left = 32 Top = 288 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + Left = 32 + Top = 344 + end end diff --git a/demos/Delphi_VCL/JavaScript/JSSimpleExtension/uJSSimpleExtension.pas b/demos/Delphi_VCL/JavaScript/JSSimpleExtension/uJSSimpleExtension.pas index 64fee3de..a87a8b70 100644 --- a/demos/Delphi_VCL/JavaScript/JSSimpleExtension/uJSSimpleExtension.pas +++ b/demos/Delphi_VCL/JavaScript/JSSimpleExtension/uJSSimpleExtension.pas @@ -50,7 +50,7 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFApplication, uCEFTypes, uCEFConstants, - uCEFWinControl; + uCEFWinControl, uCEFSentinel; type TJSSimpleExtensionFrm = class(TForm) @@ -60,6 +60,7 @@ type CEFWindowParent1: TCEFWindowParent; Chromium1: TChromium; Timer1: TTimer; + CEFSentinel1: TCEFSentinel; procedure FormShow(Sender: TObject); procedure GoBtnClick(Sender: TObject); procedure Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); @@ -78,6 +79,7 @@ type var aAction : TCefCloseBrowserAction); procedure Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); + procedure CEFSentinel1Close(Sender: TObject); protected // Variables to control when can we destroy the form safely FCanClose : boolean; // Set to True in TChromium.OnBeforeClose @@ -117,7 +119,8 @@ uses // ================= // 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. // 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. -// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form. +// 3. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. {$IFDEF DELPHI12_UP}procedure {$ELSE}class procedure TJSSimpleExtensionFrm.{$ENDIF}GlobalCEFApp_OnWebKitInitializedEvent; @@ -149,6 +152,12 @@ begin Chromium1.LoadURL(Edit1.Text); end; +procedure TJSSimpleExtensionFrm.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TJSSimpleExtensionFrm.Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); begin PostMessage(Handle, CEF_AFTERCREATED, 0, 0); @@ -220,8 +229,7 @@ end; procedure TJSSimpleExtensionFrm.Chromium1BeforeClose( Sender: TObject; const browser: ICefBrowser); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TJSSimpleExtensionFrm.Chromium1Close( diff --git a/demos/Delphi_VCL/JavaScript/JSSimpleWindowBinding/uJSSimpleWindowBinding.dfm b/demos/Delphi_VCL/JavaScript/JSSimpleWindowBinding/uJSSimpleWindowBinding.dfm index 55816cca..001fdecb 100644 --- a/demos/Delphi_VCL/JavaScript/JSSimpleWindowBinding/uJSSimpleWindowBinding.dfm +++ b/demos/Delphi_VCL/JavaScript/JSSimpleWindowBinding/uJSSimpleWindowBinding.dfm @@ -76,4 +76,9 @@ object JSSimpleWindowBindingFrm: TJSSimpleWindowBindingFrm Left = 32 Top = 288 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + Left = 32 + Top = 344 + end end diff --git a/demos/Delphi_VCL/JavaScript/JSSimpleWindowBinding/uJSSimpleWindowBinding.pas b/demos/Delphi_VCL/JavaScript/JSSimpleWindowBinding/uJSSimpleWindowBinding.pas index 24cbb5f6..dde70dca 100644 --- a/demos/Delphi_VCL/JavaScript/JSSimpleWindowBinding/uJSSimpleWindowBinding.pas +++ b/demos/Delphi_VCL/JavaScript/JSSimpleWindowBinding/uJSSimpleWindowBinding.pas @@ -50,7 +50,7 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFApplication, uCEFTypes, - uCEFConstants, uCEFv8Value, uCEFWinControl; + uCEFConstants, uCEFv8Value, uCEFWinControl, uCEFSentinel; type TJSSimpleWindowBindingFrm = class(TForm) @@ -60,6 +60,7 @@ type CEFWindowParent1: TCEFWindowParent; Chromium1: TChromium; Timer1: TTimer; + CEFSentinel1: TCEFSentinel; procedure FormShow(Sender: TObject); procedure GoBtnClick(Sender: TObject); procedure Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); @@ -78,6 +79,7 @@ type var aAction : TCefCloseBrowserAction); procedure Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); + procedure CEFSentinel1Close(Sender: TObject); protected // Variables to control when can we destroy the form safely FCanClose : boolean; // Set to True in TChromium.OnBeforeClose @@ -112,7 +114,8 @@ implementation // ================= // 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. // 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. -// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form. +// 3. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure GlobalCEFApp_OnContextCreated(const browser: ICefBrowser; const frame: ICefFrame; const context: ICefv8Context); var @@ -137,6 +140,12 @@ begin Chromium1.LoadURL(Edit1.Text); end; +procedure TJSSimpleWindowBindingFrm.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TJSSimpleWindowBindingFrm.Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); begin PostMessage(Handle, CEF_AFTERCREATED, 0, 0); @@ -208,8 +217,7 @@ end; procedure TJSSimpleWindowBindingFrm.Chromium1BeforeClose( Sender: TObject; const browser: ICefBrowser); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TJSSimpleWindowBindingFrm.Chromium1Close( diff --git a/demos/Delphi_VCL/JavaScript/JSWindowBindingSubProcess/uJSSimpleWindowBinding.dfm b/demos/Delphi_VCL/JavaScript/JSWindowBindingSubProcess/uJSSimpleWindowBinding.dfm index 55816cca..63fac2e0 100644 --- a/demos/Delphi_VCL/JavaScript/JSWindowBindingSubProcess/uJSSimpleWindowBinding.dfm +++ b/demos/Delphi_VCL/JavaScript/JSWindowBindingSubProcess/uJSSimpleWindowBinding.dfm @@ -76,4 +76,9 @@ object JSSimpleWindowBindingFrm: TJSSimpleWindowBindingFrm Left = 32 Top = 288 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + Left = 32 + Top = 352 + end end diff --git a/demos/Delphi_VCL/JavaScript/JSWindowBindingSubProcess/uJSSimpleWindowBinding.pas b/demos/Delphi_VCL/JavaScript/JSWindowBindingSubProcess/uJSSimpleWindowBinding.pas index fd64cd5d..7ddf4728 100644 --- a/demos/Delphi_VCL/JavaScript/JSWindowBindingSubProcess/uJSSimpleWindowBinding.pas +++ b/demos/Delphi_VCL/JavaScript/JSWindowBindingSubProcess/uJSSimpleWindowBinding.pas @@ -50,7 +50,7 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFApplication, uCEFTypes, - uCEFConstants, uCEFv8Value, uCEFWinControl; + uCEFConstants, uCEFv8Value, uCEFWinControl, uCEFSentinel; type TJSSimpleWindowBindingFrm = class(TForm) @@ -60,6 +60,7 @@ type CEFWindowParent1: TCEFWindowParent; Chromium1: TChromium; Timer1: TTimer; + CEFSentinel1: TCEFSentinel; procedure FormShow(Sender: TObject); procedure GoBtnClick(Sender: TObject); procedure Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); @@ -78,6 +79,7 @@ type var aAction : TCefCloseBrowserAction); procedure Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); + procedure CEFSentinel1Close(Sender: TObject); protected FText : string; // Variables to control when can we destroy the form safely @@ -113,7 +115,8 @@ implementation // ================= // 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. // 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. -// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form. +// 3. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure CreateGlobalCEFApp; begin @@ -138,6 +141,12 @@ begin Chromium1.LoadURL(Edit1.Text); end; +procedure TJSSimpleWindowBindingFrm.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TJSSimpleWindowBindingFrm.Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); begin PostMessage(Handle, CEF_AFTERCREATED, 0, 0); @@ -209,8 +218,7 @@ end; procedure TJSSimpleWindowBindingFrm.Chromium1BeforeClose( Sender: TObject; const browser: ICefBrowser); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TJSSimpleWindowBindingFrm.Chromium1Close( diff --git a/demos/Delphi_VCL/JavaScript/JSWindowBindingWithArrayBuffer/uJSWindowBindingWithArrayBuffer.dfm b/demos/Delphi_VCL/JavaScript/JSWindowBindingWithArrayBuffer/uJSWindowBindingWithArrayBuffer.dfm index 8a48eb21..fcea4705 100644 --- a/demos/Delphi_VCL/JavaScript/JSWindowBindingWithArrayBuffer/uJSWindowBindingWithArrayBuffer.dfm +++ b/demos/Delphi_VCL/JavaScript/JSWindowBindingWithArrayBuffer/uJSWindowBindingWithArrayBuffer.dfm @@ -76,4 +76,9 @@ object JSWindowBindingWithArrayBufferFrm: TJSWindowBindingWithArrayBufferFrm Left = 32 Top = 288 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + Left = 32 + Top = 344 + end end diff --git a/demos/Delphi_VCL/JavaScript/JSWindowBindingWithArrayBuffer/uJSWindowBindingWithArrayBuffer.pas b/demos/Delphi_VCL/JavaScript/JSWindowBindingWithArrayBuffer/uJSWindowBindingWithArrayBuffer.pas index 37e4fef7..cf0503e1 100644 --- a/demos/Delphi_VCL/JavaScript/JSWindowBindingWithArrayBuffer/uJSWindowBindingWithArrayBuffer.pas +++ b/demos/Delphi_VCL/JavaScript/JSWindowBindingWithArrayBuffer/uJSWindowBindingWithArrayBuffer.pas @@ -50,7 +50,7 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFApplication, uCEFTypes, uCEFConstants, - uCEFWinControl; + uCEFWinControl, uCEFSentinel; type TJSWindowBindingWithArrayBufferFrm = class(TForm) @@ -60,6 +60,7 @@ type CEFWindowParent1: TCEFWindowParent; Chromium1: TChromium; Timer1: TTimer; + CEFSentinel1: TCEFSentinel; procedure FormShow(Sender: TObject); procedure GoBtnClick(Sender: TObject); procedure Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); @@ -78,6 +79,7 @@ type var aAction : TCefCloseBrowserAction); procedure Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); + procedure CEFSentinel1Close(Sender: TObject); protected // Variables to control when can we destroy the form safely FCanClose : boolean; // Set to True in TChromium.OnBeforeClose @@ -115,7 +117,8 @@ uses // ================= // 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. // 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. -// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form. +// 3. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure FreeCustomArrayBufer(buffer : Pointer); begin @@ -162,6 +165,13 @@ begin Chromium1.LoadURL(Edit1.Text); end; +procedure TJSWindowBindingWithArrayBufferFrm.CEFSentinel1Close( + Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TJSWindowBindingWithArrayBufferFrm.Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); begin PostMessage(Handle, CEF_AFTERCREATED, 0, 0); @@ -233,8 +243,7 @@ end; procedure TJSWindowBindingWithArrayBufferFrm.Chromium1BeforeClose( Sender: TObject; const browser: ICefBrowser); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TJSWindowBindingWithArrayBufferFrm.Chromium1Close( diff --git a/demos/Delphi_VCL/JavaScript/JSWindowBindingWithFunction/uJSWindowBindingWithFunction.dfm b/demos/Delphi_VCL/JavaScript/JSWindowBindingWithFunction/uJSWindowBindingWithFunction.dfm index 1b4a4075..985eec52 100644 --- a/demos/Delphi_VCL/JavaScript/JSWindowBindingWithFunction/uJSWindowBindingWithFunction.dfm +++ b/demos/Delphi_VCL/JavaScript/JSWindowBindingWithFunction/uJSWindowBindingWithFunction.dfm @@ -76,4 +76,9 @@ object JSWindowBindingWithFunctionFrm: TJSWindowBindingWithFunctionFrm Left = 32 Top = 288 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + Left = 32 + Top = 352 + end end diff --git a/demos/Delphi_VCL/JavaScript/JSWindowBindingWithFunction/uJSWindowBindingWithFunction.pas b/demos/Delphi_VCL/JavaScript/JSWindowBindingWithFunction/uJSWindowBindingWithFunction.pas index 515e8d2b..e873eff8 100644 --- a/demos/Delphi_VCL/JavaScript/JSWindowBindingWithFunction/uJSWindowBindingWithFunction.pas +++ b/demos/Delphi_VCL/JavaScript/JSWindowBindingWithFunction/uJSWindowBindingWithFunction.pas @@ -50,7 +50,7 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFApplication, uCEFTypes, uCEFConstants, - uCEFWinControl; + uCEFWinControl, uCEFSentinel; type TJSWindowBindingWithFunctionFrm = class(TForm) @@ -60,6 +60,7 @@ type CEFWindowParent1: TCEFWindowParent; Chromium1: TChromium; Timer1: TTimer; + CEFSentinel1: TCEFSentinel; procedure FormShow(Sender: TObject); procedure GoBtnClick(Sender: TObject); procedure Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); @@ -78,6 +79,7 @@ type var aAction : TCefCloseBrowserAction); procedure Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); + procedure CEFSentinel1Close(Sender: TObject); protected // Variables to control when can we destroy the form safely FCanClose : boolean; // Set to True in TChromium.OnBeforeClose @@ -115,7 +117,8 @@ uses // ================= // 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. // 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. -// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form. +// 3. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure GlobalCEFApp_OnContextCreated(const browser: ICefBrowser; const frame: ICefFrame; const context: ICefv8Context); var @@ -142,6 +145,13 @@ begin Chromium1.LoadURL(Edit1.Text); end; +procedure TJSWindowBindingWithFunctionFrm.CEFSentinel1Close( + Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TJSWindowBindingWithFunctionFrm.Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); begin PostMessage(Handle, CEF_AFTERCREATED, 0, 0); @@ -213,8 +223,7 @@ end; procedure TJSWindowBindingWithFunctionFrm.Chromium1BeforeClose( Sender: TObject; const browser: ICefBrowser); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TJSWindowBindingWithFunctionFrm.Chromium1Close( diff --git a/demos/Delphi_VCL/JavaScript/JSWindowBindingWithObject/uJSWindowBindingWithObject.dfm b/demos/Delphi_VCL/JavaScript/JSWindowBindingWithObject/uJSWindowBindingWithObject.dfm index 597ca244..0742a1f5 100644 --- a/demos/Delphi_VCL/JavaScript/JSWindowBindingWithObject/uJSWindowBindingWithObject.dfm +++ b/demos/Delphi_VCL/JavaScript/JSWindowBindingWithObject/uJSWindowBindingWithObject.dfm @@ -76,4 +76,9 @@ object JSWindowBindingWithObjectFrm: TJSWindowBindingWithObjectFrm Left = 32 Top = 288 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + Left = 32 + Top = 352 + end end diff --git a/demos/Delphi_VCL/JavaScript/JSWindowBindingWithObject/uJSWindowBindingWithObject.pas b/demos/Delphi_VCL/JavaScript/JSWindowBindingWithObject/uJSWindowBindingWithObject.pas index fcbdf24c..c83a4501 100644 --- a/demos/Delphi_VCL/JavaScript/JSWindowBindingWithObject/uJSWindowBindingWithObject.pas +++ b/demos/Delphi_VCL/JavaScript/JSWindowBindingWithObject/uJSWindowBindingWithObject.pas @@ -50,7 +50,7 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFApplication, uCEFTypes, uCEFConstants, - uCEFWinControl; + uCEFWinControl, uCEFSentinel; type TJSWindowBindingWithObjectFrm = class(TForm) @@ -60,6 +60,7 @@ type CEFWindowParent1: TCEFWindowParent; Chromium1: TChromium; Timer1: TTimer; + CEFSentinel1: TCEFSentinel; procedure FormShow(Sender: TObject); procedure GoBtnClick(Sender: TObject); procedure Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); @@ -78,6 +79,7 @@ type var aAction : TCefCloseBrowserAction); procedure Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); + procedure CEFSentinel1Close(Sender: TObject); protected // Variables to control when can we destroy the form safely FCanClose : boolean; // Set to True in TChromium.OnBeforeClose @@ -115,7 +117,8 @@ uses // ================= // 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. // 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. -// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form. +// 3. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure GlobalCEFApp_OnContextCreated(const browser: ICefBrowser; const frame: ICefFrame; const context: ICefv8Context); var @@ -143,6 +146,12 @@ begin Chromium1.LoadURL(Edit1.Text); end; +procedure TJSWindowBindingWithObjectFrm.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TJSWindowBindingWithObjectFrm.Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); begin PostMessage(Handle, CEF_AFTERCREATED, 0, 0); @@ -214,8 +223,7 @@ end; procedure TJSWindowBindingWithObjectFrm.Chromium1BeforeClose( Sender: TObject; const browser: ICefBrowser); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TJSWindowBindingWithObjectFrm.Chromium1Close( diff --git a/demos/Delphi_VCL/KioskOSRBrowser/uKioskOSRBrowser.dfm b/demos/Delphi_VCL/KioskOSRBrowser/uKioskOSRBrowser.dfm index cbbf729e..0316fe1b 100644 --- a/demos/Delphi_VCL/KioskOSRBrowser/uKioskOSRBrowser.dfm +++ b/demos/Delphi_VCL/KioskOSRBrowser/uKioskOSRBrowser.dfm @@ -80,4 +80,9 @@ object Form1: TForm1 Left = 24 Top = 206 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + Left = 24 + Top = 280 + end end diff --git a/demos/Delphi_VCL/KioskOSRBrowser/uKioskOSRBrowser.pas b/demos/Delphi_VCL/KioskOSRBrowser/uKioskOSRBrowser.pas index 012b3916..1a27c2d4 100644 --- a/demos/Delphi_VCL/KioskOSRBrowser/uKioskOSRBrowser.pas +++ b/demos/Delphi_VCL/KioskOSRBrowser/uKioskOSRBrowser.pas @@ -50,7 +50,8 @@ uses Windows, Messages, SysUtils, Variants, Classes, SyncObjs, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, AppEvnts, Keyboard, {$ENDIF} - uCEFChromium, uCEFTypes, uCEFInterfaces, uCEFConstants, uCEFBufferPanel; + uCEFChromium, uCEFTypes, uCEFInterfaces, uCEFConstants, uCEFBufferPanel, + uCEFSentinel; const HOMEPAGE_URL = 'https://www.google.com'; @@ -72,9 +73,11 @@ type Timer1: TTimer; Panel1: TBufferPanel; TouchKeyboard1: TTouchKeyboard; + CEFSentinel1: TCEFSentinel; procedure AppEventsMessage(var Msg: tagMSG; var Handled: Boolean); procedure Timer1Timer(Sender: TObject); + procedure CEFSentinel1Close(Sender: TObject); procedure Panel1Enter(Sender: TObject); procedure Panel1Exit(Sender: TObject); @@ -167,7 +170,8 @@ uses // 2- chrmosr.CloseBrowser(True) will trigger chrmosr.OnClose and we have to // set "Result" to false and CEF3 will destroy the internal browser immediately. // 3- chrmosr.OnBeforeClose is triggered because the internal browser was destroyed. -// Now we set FCanClose to True and send WM_CLOSE to the form. +// Now we call TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4- TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure CreateGlobalCEFApp; begin @@ -299,8 +303,7 @@ end; procedure TForm1.chrmosrBeforeClose(Sender: TObject; const browser: ICefBrowser); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TForm1.chrmosrBeforeContextMenu( Sender : TObject; @@ -861,6 +864,12 @@ begin (cardinal(aCurrentTime - FLastClickTime) > GetDoubleClickTime); end; +procedure TForm1.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TForm1.Panel1Enter(Sender: TObject); begin chrmosr.SendFocusEvent(True); diff --git a/demos/Delphi_VCL/MDIBrowser/uMainForm.dfm b/demos/Delphi_VCL/MDIBrowser/uMainForm.dfm index 3bca3c50..c122f6d5 100644 --- a/demos/Delphi_VCL/MDIBrowser/uMainForm.dfm +++ b/demos/Delphi_VCL/MDIBrowser/uMainForm.dfm @@ -80,4 +80,9 @@ object MainForm: TMainForm TabOrder = 0 end end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + Left = 56 + Top = 80 + end end diff --git a/demos/Delphi_VCL/MDIBrowser/uMainForm.pas b/demos/Delphi_VCL/MDIBrowser/uMainForm.pas index f5432216..dc93c4f0 100644 --- a/demos/Delphi_VCL/MDIBrowser/uMainForm.pas +++ b/demos/Delphi_VCL/MDIBrowser/uMainForm.pas @@ -45,12 +45,13 @@ uses {$IFDEF DELPHI16_UP} Winapi.Windows, System.SysUtils, System.Classes, Vcl.Graphics, Vcl.Forms, Vcl.Controls, Vcl.StdCtrls, Vcl.Dialogs, Vcl.Buttons, Winapi.Messages, - Vcl.ExtCtrls, Vcl.ComCtrls; + Vcl.ExtCtrls, Vcl.ComCtrls, {$ELSE} Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls, Dialogs, Buttons, Messages, - ExtCtrls, ComCtrls; + ExtCtrls, ComCtrls, {$ENDIF} + uCEFSentinel; const CEFBROWSER_CREATED = WM_APP + $100; @@ -64,10 +65,12 @@ type NewBtn: TSpeedButton; ExitBtn: TSpeedButton; NewContextChk: TCheckBox; + CEFSentinel1: TCEFSentinel; procedure FormCreate(Sender: TObject); procedure NewBtnClick(Sender: TObject); procedure ExitBtnClick(Sender: TObject); procedure FormShow(Sender: TObject); + procedure CEFSentinel1Close(Sender: TObject); private // Variables to control when can we destroy the form safely FCanClose : boolean; // Set to True when all the child forms are closed @@ -104,7 +107,8 @@ uses // Destruction steps // ================= // 1. Destroy all child forms -// 2. Wait until all the child forms are closed before closing the main form and terminating the application. +// 2. Wait until all the child forms are closed before calling TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when all renderer processes are closed +// 3. TCEFSentinel.OnClose closes the main form. procedure GlobalCEFApp_OnContextInitialized; begin @@ -181,14 +185,19 @@ begin CloseAllChildForms; end; +procedure TMainForm.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TMainForm.ChildDestroyedMsg(var aMessage : TMessage); begin // If there are no more child forms we can destroy the main form if FClosing and (MDIChildCount = 0) then begin ButtonPnl.Enabled := False; - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; end; diff --git a/demos/Delphi_VCL/MDIExternalPumpBrowser/uMainForm.dfm b/demos/Delphi_VCL/MDIExternalPumpBrowser/uMainForm.dfm index b24e73ad..e7c4edb8 100644 --- a/demos/Delphi_VCL/MDIExternalPumpBrowser/uMainForm.dfm +++ b/demos/Delphi_VCL/MDIExternalPumpBrowser/uMainForm.dfm @@ -80,4 +80,9 @@ object MainForm: TMainForm TabOrder = 0 end end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + Left = 32 + Top = 56 + end end diff --git a/demos/Delphi_VCL/MDIExternalPumpBrowser/uMainForm.pas b/demos/Delphi_VCL/MDIExternalPumpBrowser/uMainForm.pas index c5d0c1ba..ed9ce522 100644 --- a/demos/Delphi_VCL/MDIExternalPumpBrowser/uMainForm.pas +++ b/demos/Delphi_VCL/MDIExternalPumpBrowser/uMainForm.pas @@ -51,7 +51,7 @@ uses Controls, StdCtrls, Dialogs, Buttons, Messages, ExtCtrls, ComCtrls, {$ENDIF} - uCEFWorkScheduler; + uCEFWorkScheduler, uCEFSentinel; const CEFBROWSER_CREATED = WM_APP + $100; @@ -65,10 +65,12 @@ type NewBtn: TSpeedButton; ExitBtn: TSpeedButton; NewContextChk: TCheckBox; + CEFSentinel1: TCEFSentinel; procedure FormCreate(Sender: TObject); procedure NewBtnClick(Sender: TObject); procedure ExitBtnClick(Sender: TObject); procedure FormShow(Sender: TObject); + procedure CEFSentinel1Close(Sender: TObject); private // Variables to control when can we destroy the form safely FCanClose : boolean; // Set to True when all the child forms are closed @@ -103,7 +105,8 @@ uses // Destruction steps // ================= // 1. Destroy all child forms -// 2. Wait until all the child forms are closed before closing the main form and terminating the application. +// 2. Wait until all the child forms are closed before calling TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when all renderer processes are closed +// 3. TCEFSentinel.OnClose closes the main form. procedure GlobalCEFApp_OnContextInitialized; begin @@ -198,11 +201,16 @@ begin if FClosing and (MDIChildCount = 0) then begin ButtonPnl.Enabled := False; - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; end; +procedure TMainForm.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TMainForm.CEFInitializedMsg(var aMessage : TMessage); begin Caption := 'MDI External Pump Browser'; diff --git a/demos/Delphi_VCL/MiniBrowser/uMiniBrowser.pas b/demos/Delphi_VCL/MiniBrowser/uMiniBrowser.pas index 71a53864..19027f1c 100644 --- a/demos/Delphi_VCL/MiniBrowser/uMiniBrowser.pas +++ b/demos/Delphi_VCL/MiniBrowser/uMiniBrowser.pas @@ -292,7 +292,8 @@ uses // ================= // 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. // 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. -// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form. +// 3. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure CreateGlobalCEFApp; begin @@ -472,7 +473,8 @@ begin if Chromium1.IsSameBrowser(browser) and (frame <> nil) and - frame.IsMain then + frame.IsMain and + frame.IsValid then InspectRequest(request); end; @@ -544,8 +546,8 @@ begin end; MINIBROWSER_CONTEXTMENU_JSWRITEDOC : - if (browser <> nil) and (browser.MainFrame <> nil) then - browser.MainFrame.ExecuteJavaScript( + if (frame <> nil) and frame.IsValid then + frame.ExecuteJavaScript( 'var css = ' + chr(39) + '@page {size: A4; margin: 0;} @media print {html, body {width: 210mm; height: 297mm;}}' + chr(39) + '; ' + 'var style = document.createElement(' + chr(39) + 'style' + chr(39) + '); ' + 'style.type = ' + chr(39) + 'text/css' + chr(39) + '; ' + @@ -554,8 +556,8 @@ begin 'about:blank', 0); MINIBROWSER_CONTEXTMENU_JSPRINTDOC : - if (browser <> nil) and (browser.MainFrame <> nil) then - browser.MainFrame.ExecuteJavaScript('window.print();', 'about:blank', 0); + if (frame <> nil) and frame.IsValid then + frame.ExecuteJavaScript('window.print();', 'about:blank', 0); MINIBROWSER_CONTEXTMENU_UNMUTEAUDIO : Chromium1.AudioMuted := False; @@ -708,6 +710,8 @@ procedure TMiniBrowserFrm.Chromium1LoadEnd(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; httpStatusCode: Integer); begin + if (frame = nil) or not(frame.IsValid) then exit; + if frame.IsMain then StatusBar1.Panels[1].Text := 'main frame loaded : ' + quotedstr(frame.name) else @@ -717,10 +721,17 @@ end; procedure TMiniBrowserFrm.Chromium1LoadError(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; errorCode: Integer; const errorText, failedUrl: ustring); +var + TempString : string; begin - CefDebugLog('Error code:' + inttostr(errorCode) + - ' - Error text :' + quotedstr(errorText) + - ' - URL:' + failedUrl, CEF_LOG_SEVERITY_ERROR); + if (errorCode = ERR_ABORTED) then exit; + + TempString := '' + + '

Failed to load URL ' + failedUrl + + ' with error ' + errorText + + ' (' + inttostr(errorCode) + ').

'; + + frame.LoadURL(CefGetDataURI(TempString, 'text/html')); end; procedure TMiniBrowserFrm.Chromium1LoadingProgressChange(Sender: TObject; @@ -890,7 +901,8 @@ begin if Chromium1.IsSameBrowser(browser) and (frame <> nil) and - frame.IsMain then + frame.IsMain and + frame.IsValid then InspectResponse(response); end; @@ -1084,9 +1096,9 @@ begin TempFile.LoadFromFile(OpenDialog1.FileName); if (OpenDialog1.FilterIndex = 1) then - TempDATA := 'data:text/html;charset=utf-8;base64,' + CefBase64Encode(TempFile.Memory, TempFile.Size) + TempDATA := CefGetDataURI(TempFile.Memory, TempFile.Size, 'text/html', 'utf-8') else - TempDATA := 'data:application/pdf;charset=utf-8;base64,' + CefBase64Encode(TempFile.Memory, TempFile.Size); + TempDATA := CefGetDataURI(TempFile.Memory, TempFile.Size, 'application/pdf', 'utf-8'); Chromium1.LoadURL(TempDATA); end; diff --git a/demos/Delphi_VCL/OSRExternalPumpBrowser/uOSRExternalPumpBrowser.dfm b/demos/Delphi_VCL/OSRExternalPumpBrowser/uOSRExternalPumpBrowser.dfm index 139392ba..d12f3f5c 100644 --- a/demos/Delphi_VCL/OSRExternalPumpBrowser/uOSRExternalPumpBrowser.dfm +++ b/demos/Delphi_VCL/OSRExternalPumpBrowser/uOSRExternalPumpBrowser.dfm @@ -157,4 +157,9 @@ object OSRExternalPumpBrowserFrm: TOSRExternalPumpBrowserFrm Left = 24 Top = 206 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + Left = 24 + Top = 342 + end end diff --git a/demos/Delphi_VCL/OSRExternalPumpBrowser/uOSRExternalPumpBrowser.pas b/demos/Delphi_VCL/OSRExternalPumpBrowser/uOSRExternalPumpBrowser.pas index ca2d5de5..9b890640 100644 --- a/demos/Delphi_VCL/OSRExternalPumpBrowser/uOSRExternalPumpBrowser.pas +++ b/demos/Delphi_VCL/OSRExternalPumpBrowser/uOSRExternalPumpBrowser.pas @@ -50,7 +50,8 @@ uses Windows, Messages, SysUtils, Variants, Classes, SyncObjs, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, AppEvnts, {$ENDIF} - uCEFChromium, uCEFTypes, uCEFInterfaces, uCEFConstants, uCEFBufferPanel, uCEFWorkScheduler; + uCEFChromium, uCEFTypes, uCEFInterfaces, uCEFConstants, uCEFBufferPanel, uCEFWorkScheduler, + uCEFSentinel; type TOSRExternalPumpBrowserFrm = class(TForm) @@ -64,6 +65,7 @@ type SaveDialog1: TSaveDialog; Timer1: TTimer; Panel1: TBufferPanel; + CEFSentinel1: TCEFSentinel; procedure AppEventsMessage(var Msg: tagMSG; var Handled: Boolean); @@ -107,6 +109,7 @@ type procedure Timer1Timer(Sender: TObject); procedure ComboBox1Enter(Sender: TObject); + procedure CEFSentinel1Close(Sender: TObject); protected FPopUpBitmap : TBitmap; @@ -152,7 +155,8 @@ var // 2- chrmosr.CloseBrowser(True) will trigger chrmosr.OnClose and we have to // set "Result" to false and CEF3 will destroy the internal browser immediately. // 3- chrmosr.OnBeforeClose is triggered because the internal browser was destroyed. -// Now we set FCanClose to True and send WM_CLOSE to the form. +// Now we call TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4- TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure CreateGlobalCEFApp; procedure GlobalCEFApp_OnScheduleMessagePumpWork(const aDelayMS : int64); @@ -325,6 +329,11 @@ begin end; procedure TOSRExternalPumpBrowserFrm.chrmosrBeforeClose(Sender: TObject; const browser: ICefBrowser); +begin + CEFSentinel1.Start; +end; + +procedure TOSRExternalPumpBrowserFrm.CEFSentinel1Close(Sender: TObject); begin FCanClose := True; PostMessage(Handle, WM_CLOSE, 0, 0); diff --git a/demos/Delphi_VCL/PopupBrowser/uMainForm.dfm b/demos/Delphi_VCL/PopupBrowser/uMainForm.dfm index 9385b60c..cbdcbdda 100644 --- a/demos/Delphi_VCL/PopupBrowser/uMainForm.dfm +++ b/demos/Delphi_VCL/PopupBrowser/uMainForm.dfm @@ -82,4 +82,9 @@ object MainForm: TMainForm Left = 56 Top = 216 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + Left = 56 + Top = 288 + end end diff --git a/demos/Delphi_VCL/PopupBrowser/uMainForm.pas b/demos/Delphi_VCL/PopupBrowser/uMainForm.pas index 1fd4c3ac..4bb2b9f4 100644 --- a/demos/Delphi_VCL/PopupBrowser/uMainForm.pas +++ b/demos/Delphi_VCL/PopupBrowser/uMainForm.pas @@ -50,7 +50,7 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, SyncObjs, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFConstants, uCEFTypes, uChildForm, - Vcl.AppEvnts, uCEFWinControl; + Vcl.AppEvnts, uCEFWinControl, uCEFSentinel; const CEF_CREATENEXTCHILD = WM_APP + $A50; @@ -65,6 +65,7 @@ type Chromium1: TChromium; CEFWindowParent1: TCEFWindowParent; AppEvents: TApplicationEvents; + CEFSentinel1: TCEFSentinel; procedure GoBtnClick(Sender: TObject); procedure Timer1Timer(Sender: TObject); @@ -79,6 +80,7 @@ type procedure Chromium1BeforePopup(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const targetUrl, targetFrameName: ustring; targetDisposition: TCefWindowOpenDisposition; userGesture: Boolean; const popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo; var client: ICefClient; var settings: TCefBrowserSettings; var extra_info: ICefDictionaryValue; var noJavascriptAccess: Boolean; var Result: Boolean); procedure Chromium1Close(Sender: TObject; const browser: ICefBrowser; var aAction: TCefCloseBrowserAction); procedure Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); + procedure CEFSentinel1Close(Sender: TObject); protected FChildForm : TChildForm; @@ -142,7 +144,8 @@ uses // 1. FormCloseQuery sets CanClose to FALSE and it closes all child forms. // 2. When all the child forms are closed then FormCloseQuery is triggered again, sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. // 3. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. -// 4. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form. +// 4. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 5. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure CreateGlobalCEFApp; begin @@ -243,8 +246,7 @@ end; procedure TMainForm.Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; function TMainForm.CreateClientHandler(var windowInfo : TCefWindowInfo; @@ -352,6 +354,12 @@ begin end; end; +procedure TMainForm.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TMainForm.ChildDestroyedMsg(var aMessage : TMessage); begin if FClosingChildren and (PopupChildCount = 0) then Close; diff --git a/demos/Delphi_VCL/PopupBrowser2/uMainForm.dfm b/demos/Delphi_VCL/PopupBrowser2/uMainForm.dfm index 2f239092..f7a0525c 100644 --- a/demos/Delphi_VCL/PopupBrowser2/uMainForm.dfm +++ b/demos/Delphi_VCL/PopupBrowser2/uMainForm.dfm @@ -77,4 +77,9 @@ object MainForm: TMainForm Left = 56 Top = 152 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + Left = 48 + Top = 208 + end end diff --git a/demos/Delphi_VCL/PopupBrowser2/uMainForm.pas b/demos/Delphi_VCL/PopupBrowser2/uMainForm.pas index 750ff632..f71b6707 100644 --- a/demos/Delphi_VCL/PopupBrowser2/uMainForm.pas +++ b/demos/Delphi_VCL/PopupBrowser2/uMainForm.pas @@ -50,7 +50,7 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, SyncObjs, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFConstants, uCEFTypes, uChildForm, - Vcl.AppEvnts, uCEFWinControl; + Vcl.AppEvnts, uCEFWinControl, uCEFSentinel; const CEF_CREATENEXTCHILD = WM_APP + $A50; @@ -64,6 +64,7 @@ type Timer1: TTimer; Chromium1: TChromium; CEFWindowParent1: TCEFWindowParent; + CEFSentinel1: TCEFSentinel; procedure GoBtnClick(Sender: TObject); procedure Timer1Timer(Sender: TObject); @@ -77,6 +78,7 @@ type procedure Chromium1BeforePopup(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const targetUrl, targetFrameName: ustring; targetDisposition: TCefWindowOpenDisposition; userGesture: Boolean; const popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo; var client: ICefClient; var settings: TCefBrowserSettings; var extra_info: ICefDictionaryValue; var noJavascriptAccess: Boolean; var Result: Boolean); procedure Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); procedure Chromium1Close(Sender: TObject; const browser: ICefBrowser; var aAction: TCefCloseBrowserAction); + procedure CEFSentinel1Close(Sender: TObject); protected FChildForm : TChildForm; @@ -140,7 +142,8 @@ uses // 1. FormCloseQuery sets CanClose to FALSE and it closes all child forms. // 2. When all the child forms are closed then FormCloseQuery is triggered again, sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. // 3. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. -// 4. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form. +// 4. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 5. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure CreateGlobalCEFApp; begin @@ -208,8 +211,7 @@ end; procedure TMainForm.Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TMainForm.Chromium1BeforePopup(Sender : TObject; @@ -333,6 +335,12 @@ begin end; end; +procedure TMainForm.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TMainForm.ChildDestroyedMsg(var aMessage : TMessage); begin if FClosingChildren and (PopupChildCount = 0) then Close; diff --git a/demos/Delphi_VCL/PostInspectorBrowser/uPostInspectorBrowser.dfm b/demos/Delphi_VCL/PostInspectorBrowser/uPostInspectorBrowser.dfm index 278b7a11..618ddc18 100644 --- a/demos/Delphi_VCL/PostInspectorBrowser/uPostInspectorBrowser.dfm +++ b/demos/Delphi_VCL/PostInspectorBrowser/uPostInspectorBrowser.dfm @@ -98,4 +98,9 @@ object Form1: TForm1 Left = 56 Top = 152 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + Left = 56 + Top = 224 + end end diff --git a/demos/Delphi_VCL/PostInspectorBrowser/uPostInspectorBrowser.pas b/demos/Delphi_VCL/PostInspectorBrowser/uPostInspectorBrowser.pas index 13227b86..8ade34a5 100644 --- a/demos/Delphi_VCL/PostInspectorBrowser/uPostInspectorBrowser.pas +++ b/demos/Delphi_VCL/PostInspectorBrowser/uPostInspectorBrowser.pas @@ -50,7 +50,7 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, SyncObjs, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFConstants, uCEFTypes, - uCEFWinControl; + uCEFWinControl, uCEFSentinel; const CEF_SHOWDATA = WM_APP + $B00; @@ -65,6 +65,7 @@ type Memo1: TMemo; AddressCb: TComboBox; Splitter1: TSplitter; + CEFSentinel1: TCEFSentinel; procedure GoBtnClick(Sender: TObject); procedure FormShow(Sender: TObject); procedure Timer1Timer(Sender: TObject); @@ -88,6 +89,7 @@ type const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; const callback: ICefRequestCallback; out Result: TCefReturnValue); + procedure CEFSentinel1Close(Sender: TObject); protected // Variables to control when can we destroy the form safely FCanClose : boolean; // Set to True in TChromium.OnBeforeClose @@ -141,7 +143,8 @@ uses // ================= // 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. // 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. -// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form. +// 3. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure CreateGlobalCEFApp; begin @@ -357,7 +360,9 @@ procedure TForm1.Chromium1BeforeResourceLoad(Sender: TObject; begin // This event is called before a resource request is loaded. // The request object may be modified. - HandleRequest(request, frame.IsMain); + if (frame <> nil) and frame.IsValid then + HandleRequest(request, frame.IsMain); + Result := RV_CONTINUE; end; @@ -379,6 +384,11 @@ begin end; procedure TForm1.Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); +begin + CEFSentinel1.Start; +end; + +procedure TForm1.CEFSentinel1Close(Sender: TObject); begin FCanClose := True; PostMessage(Handle, WM_CLOSE, 0, 0); diff --git a/demos/Delphi_VCL/ResponseFilterBrowser/uResponseFilterBrowser.dfm b/demos/Delphi_VCL/ResponseFilterBrowser/uResponseFilterBrowser.dfm index e3ba3193..acb9480f 100644 --- a/demos/Delphi_VCL/ResponseFilterBrowser/uResponseFilterBrowser.dfm +++ b/demos/Delphi_VCL/ResponseFilterBrowser/uResponseFilterBrowser.dfm @@ -167,4 +167,9 @@ object ResponseFilterBrowserFrm: TResponseFilterBrowserFrm Left = 56 Top = 160 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + Left = 56 + Top = 232 + end end diff --git a/demos/Delphi_VCL/ResponseFilterBrowser/uResponseFilterBrowser.pas b/demos/Delphi_VCL/ResponseFilterBrowser/uResponseFilterBrowser.pas index 19df8d2d..277db43f 100644 --- a/demos/Delphi_VCL/ResponseFilterBrowser/uResponseFilterBrowser.pas +++ b/demos/Delphi_VCL/ResponseFilterBrowser/uResponseFilterBrowser.pas @@ -51,7 +51,7 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, SyncObjs, ComCtrls, pngimage, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFConstants, uCEFTypes, uCEFResponseFilter, - uCEFWinControl; + uCEFWinControl, uCEFSentinel; const STREAM_COPY_COMPLETE = WM_APP + $B00; @@ -72,6 +72,7 @@ type StatusBar1: TStatusBar; CopyScriptBtn: TRadioButton; ReplaceLogoBtn: TRadioButton; + CEFSentinel1: TCEFSentinel; procedure Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); procedure Chromium1GetResourceResponseFilter(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; const response: ICefResponse; out Result: ICefResponseFilter); @@ -90,6 +91,7 @@ type procedure GoBtnClick(Sender: TObject); procedure Timer1Timer(Sender: TObject); + procedure CEFSentinel1Close(Sender: TObject); protected FFilter : ICefResponseFilter; // CEF Filter interface that receives the resource contents @@ -159,8 +161,9 @@ uses // 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy // CEFWindowParent1 in the main thread, which triggers the // TChromium.OnBeforeClose event. -// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE -// to the form. +// 3. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger +// TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. // TCustomResponseFilter.OnFilter event might be called multiple times // when the resource is too big. In that case the resource will be split into @@ -403,8 +406,7 @@ end; procedure TResponseFilterBrowserFrm.Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TResponseFilterBrowserFrm.Chromium1BeforePopup( Sender : TObject; @@ -506,7 +508,7 @@ const var TempPath : string; begin - if frame.IsMain then + if (frame <> nil) and frame.IsValid and frame.IsMain then try try FStreamCS.Acquire; @@ -541,6 +543,12 @@ begin {$ENDIF} end; +procedure TResponseFilterBrowserFrm.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TResponseFilterBrowserFrm.CheckResponseHeaders(const response : ICefResponse); var TempContentLength, TempContentEncoding : string; diff --git a/demos/Delphi_VCL/SchemeRegistrationBrowser/uSchemeRegistrationBrowser.dfm b/demos/Delphi_VCL/SchemeRegistrationBrowser/uSchemeRegistrationBrowser.dfm index bb803d4a..9aee6ad6 100644 --- a/demos/Delphi_VCL/SchemeRegistrationBrowser/uSchemeRegistrationBrowser.dfm +++ b/demos/Delphi_VCL/SchemeRegistrationBrowser/uSchemeRegistrationBrowser.dfm @@ -82,4 +82,9 @@ object SchemeRegistrationBrowserFrm: TSchemeRegistrationBrowserFrm Left = 16 Top = 96 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + Left = 16 + Top = 152 + end end diff --git a/demos/Delphi_VCL/SchemeRegistrationBrowser/uSchemeRegistrationBrowser.pas b/demos/Delphi_VCL/SchemeRegistrationBrowser/uSchemeRegistrationBrowser.pas index aa900997..f2b4206d 100644 --- a/demos/Delphi_VCL/SchemeRegistrationBrowser/uSchemeRegistrationBrowser.pas +++ b/demos/Delphi_VCL/SchemeRegistrationBrowser/uSchemeRegistrationBrowser.pas @@ -51,7 +51,7 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Types, ComCtrls, ClipBrd, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFApplication, uCEFSchemeRegistrar, - uCEFTypes, uCEFConstants, uCEFWinControl; + uCEFTypes, uCEFConstants, uCEFWinControl, uCEFSentinel; const MINIBROWSER_CONTEXTMENU_REGSCHEME = MENU_ID_USER_FIRST + 1; @@ -65,6 +65,7 @@ type Chromium1: TChromium; AddressCbx: TComboBox; Timer1: TTimer; + CEFSentinel1: TCEFSentinel; procedure Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); procedure Chromium1BeforeContextMenu(Sender: TObject; @@ -91,6 +92,7 @@ type var aAction : TCefCloseBrowserAction); procedure Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); + procedure CEFSentinel1Close(Sender: TObject); private { Private declarations } protected @@ -135,7 +137,8 @@ uses // ================= // 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. // 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. -// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form. +// 3. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure GlobalCEFApp_OnRegCustomSchemes(const registrar: TCefSchemeRegistrarRef); begin @@ -151,6 +154,12 @@ begin // GlobalCEFApp.LogSeverity := LOGSEVERITY_VERBOSE; end; +procedure TSchemeRegistrationBrowserFrm.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TSchemeRegistrationBrowserFrm.Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); begin PostMessage(Handle, CEF_AFTERCREATED, 0, 0); @@ -159,8 +168,7 @@ end; procedure TSchemeRegistrationBrowserFrm.Chromium1BeforeClose( Sender: TObject; const browser: ICefBrowser); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TSchemeRegistrationBrowserFrm.Chromium1BeforeContextMenu( diff --git a/demos/Delphi_VCL/SimpleBrowser/uSimpleBrowser.dfm b/demos/Delphi_VCL/SimpleBrowser/uSimpleBrowser.dfm index 84ca34e8..40463dfa 100644 --- a/demos/Delphi_VCL/SimpleBrowser/uSimpleBrowser.dfm +++ b/demos/Delphi_VCL/SimpleBrowser/uSimpleBrowser.dfm @@ -72,4 +72,9 @@ object Form1: TForm1 Left = 56 Top = 88 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + Left = 56 + Top = 160 + end end diff --git a/demos/Delphi_VCL/SimpleBrowser/uSimpleBrowser.pas b/demos/Delphi_VCL/SimpleBrowser/uSimpleBrowser.pas index ab7c42ed..a128a95a 100644 --- a/demos/Delphi_VCL/SimpleBrowser/uSimpleBrowser.pas +++ b/demos/Delphi_VCL/SimpleBrowser/uSimpleBrowser.pas @@ -50,7 +50,7 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFChromiumWindow, uCEFTypes, uCEFInterfaces, - uCEFWinControl; + uCEFWinControl, uCEFSentinel; type TForm1 = class(TForm) @@ -59,6 +59,7 @@ type AddressEdt: TEdit; GoBtn: TButton; Timer1: TTimer; + CEFSentinel1: TCEFSentinel; procedure GoBtnClick(Sender: TObject); procedure Timer1Timer(Sender: TObject); @@ -70,6 +71,7 @@ type procedure ChromiumWindow1AfterCreated(Sender: TObject); procedure ChromiumWindow1Close(Sender: TObject); procedure ChromiumWindow1BeforeClose(Sender: TObject); + procedure CEFSentinel1Close(Sender: TObject); private // You have to handle this two messages to call NotifyMoveOrResizeStarted or some page elements will be misaligned. @@ -116,7 +118,8 @@ uses // ================= // 1. The FormCloseQuery event sets CanClose to False and calls TChromiumWindow.CloseBrowser, which triggers the TChromiumWindow.OnClose event. // 2. The TChromiumWindow.OnClose event calls TChromiumWindow.DestroyChildWindow which triggers the TChromiumWindow.OnBeforeClose event. -// 3. TChromiumWindow.OnBeforeClose sets FCanClose to True and closes the form. +// 3. TChromiumWindow.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); @@ -151,20 +154,21 @@ begin if not(ChromiumWindow1.CreateBrowser) then Timer1.Enabled := True; end; -procedure TForm1.ChromiumWindow1BeforeClose(Sender: TObject); +procedure TForm1.CEFSentinel1Close(Sender: TObject); begin FCanClose := True; PostMessage(Handle, WM_CLOSE, 0, 0); end; +procedure TForm1.ChromiumWindow1BeforeClose(Sender: TObject); +begin + CEFSentinel1.Start; +end; + procedure TForm1.ChromiumWindow1Close(Sender: TObject); begin // DestroyChildWindow will destroy the child window created by CEF at the top of the Z order. - if not(ChromiumWindow1.DestroyChildWindow) then - begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); - end; + if not(ChromiumWindow1.DestroyChildWindow) then CEFSentinel1.Start; end; procedure TForm1.Chromium_OnBeforePopup( Sender : TObject; diff --git a/demos/Delphi_VCL/SimpleBrowser2/uSimpleBrowser2.pas b/demos/Delphi_VCL/SimpleBrowser2/uSimpleBrowser2.pas index 59d8825c..695a88e0 100644 --- a/demos/Delphi_VCL/SimpleBrowser2/uSimpleBrowser2.pas +++ b/demos/Delphi_VCL/SimpleBrowser2/uSimpleBrowser2.pas @@ -132,7 +132,8 @@ uses // ================= // 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. // 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. -// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form. +// 3. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin diff --git a/demos/Delphi_VCL/SimpleExternalPumpBrowser/uSimpleExternalPumpBrowser.dfm b/demos/Delphi_VCL/SimpleExternalPumpBrowser/uSimpleExternalPumpBrowser.dfm index 26f10886..8198c360 100644 --- a/demos/Delphi_VCL/SimpleExternalPumpBrowser/uSimpleExternalPumpBrowser.dfm +++ b/demos/Delphi_VCL/SimpleExternalPumpBrowser/uSimpleExternalPumpBrowser.dfm @@ -94,4 +94,9 @@ object SimpleExternalPumpBrowserFrm: TSimpleExternalPumpBrowserFrm Left = 56 Top = 88 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + Left = 56 + Top = 160 + end end diff --git a/demos/Delphi_VCL/SimpleExternalPumpBrowser/uSimpleExternalPumpBrowser.pas b/demos/Delphi_VCL/SimpleExternalPumpBrowser/uSimpleExternalPumpBrowser.pas index 194d296f..aa1882bf 100644 --- a/demos/Delphi_VCL/SimpleExternalPumpBrowser/uSimpleExternalPumpBrowser.pas +++ b/demos/Delphi_VCL/SimpleExternalPumpBrowser/uSimpleExternalPumpBrowser.pas @@ -50,7 +50,8 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFTypes, uCEFConstants, uCEFInterfaces, uCEFWorkScheduler, - uCEFChromiumWindow, Vcl.ComCtrls, Vcl.AppEvnts, uCEFWinControl; + uCEFChromiumWindow, Vcl.ComCtrls, Vcl.AppEvnts, uCEFWinControl, + uCEFSentinel; type TSimpleExternalPumpBrowserFrm = class(TForm) @@ -59,10 +60,12 @@ type Timer1: TTimer; URLCbx: TComboBox; ChromiumWindow1: TChromiumWindow; + CEFSentinel1: TCEFSentinel; procedure GoBtnClick(Sender: TObject); procedure FormShow(Sender: TObject); procedure Timer1Timer(Sender: TObject); + procedure CEFSentinel1Close(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); @@ -101,7 +104,8 @@ uses // It was necessary to destroy the browser with the following destruction sequence : // 1. The FormCloseQuery event sets CanClose to False and calls TChromiumWindow.CloseBrowser, which triggers the TChromiumWindow.OnClose event. // 2. The TChromiumWindow.OnClose event calls TChromiumWindow.DestroyChildWindow which triggers the TChromiumWindow.OnBeforeClose event. -// 3. TChromiumWindow.OnBeforeClose sets FCanClose to True and closes the form. +// 3. TChromiumWindow.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure GlobalCEFApp_OnScheduleMessagePumpWork(const aDelayMS : int64); begin @@ -172,12 +176,17 @@ begin GoBtn.Click; end; -procedure TSimpleExternalPumpBrowserFrm.ChromiumWindow1BeforeClose(Sender: TObject); +procedure TSimpleExternalPumpBrowserFrm.CEFSentinel1Close(Sender: TObject); begin FCanClose := True; PostMessage(Handle, WM_CLOSE, 0, 0); end; +procedure TSimpleExternalPumpBrowserFrm.ChromiumWindow1BeforeClose(Sender: TObject); +begin + CEFSentinel1.Start; +end; + procedure TSimpleExternalPumpBrowserFrm.ChromiumWindow1Close(Sender: TObject); begin // DestroyChildWindow will destroy the child window created by CEF at the top of the Z order. diff --git a/demos/Delphi_VCL/SimpleOSRBrowser/uSimpleOSRBrowser.dfm b/demos/Delphi_VCL/SimpleOSRBrowser/uSimpleOSRBrowser.dfm index da045e0a..e65f9d81 100644 --- a/demos/Delphi_VCL/SimpleOSRBrowser/uSimpleOSRBrowser.dfm +++ b/demos/Delphi_VCL/SimpleOSRBrowser/uSimpleOSRBrowser.dfm @@ -160,4 +160,9 @@ object Form1: TForm1 Left = 24 Top = 206 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + Left = 24 + Top = 350 + end end diff --git a/demos/Delphi_VCL/SimpleOSRBrowser/uSimpleOSRBrowser.pas b/demos/Delphi_VCL/SimpleOSRBrowser/uSimpleOSRBrowser.pas index 60c52618..95c9325a 100644 --- a/demos/Delphi_VCL/SimpleOSRBrowser/uSimpleOSRBrowser.pas +++ b/demos/Delphi_VCL/SimpleOSRBrowser/uSimpleOSRBrowser.pas @@ -50,7 +50,8 @@ uses Windows, Messages, SysUtils, Variants, Classes, SyncObjs, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, AppEvnts, {$ENDIF} - uCEFChromium, uCEFTypes, uCEFInterfaces, uCEFConstants, uCEFBufferPanel; + uCEFChromium, uCEFTypes, uCEFInterfaces, uCEFConstants, uCEFBufferPanel, + uCEFSentinel; const // Set this constant to True and load "file://transparency.html" to test a @@ -69,6 +70,7 @@ type SaveDialog1: TSaveDialog; Timer1: TTimer; Panel1: TBufferPanel; + CEFSentinel1: TCEFSentinel; procedure AppEventsMessage(var Msg: tagMSG; var Handled: Boolean); @@ -113,6 +115,7 @@ type procedure Timer1Timer(Sender: TObject); procedure ComboBox1Enter(Sender: TObject); + procedure CEFSentinel1Close(Sender: TObject); protected FPopUpBitmap : TBitmap; @@ -174,7 +177,8 @@ uses // 2- chrmosr.CloseBrowser(True) will trigger chrmosr.OnClose and we have to // set "Result" to false and CEF3 will destroy the internal browser immediately. // 3- chrmosr.OnBeforeClose is triggered because the internal browser was destroyed. -// Now we set FCanClose to True and send WM_CLOSE to the form. +// Now we call TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4- TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure CreateGlobalCEFApp; begin @@ -326,8 +330,7 @@ end; procedure TForm1.chrmosrBeforeClose(Sender: TObject; const browser: ICefBrowser); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TForm1.chrmosrBeforePopup(Sender : TObject; @@ -894,6 +897,12 @@ begin (cardinal(aCurrentTime - FLastClickTime) > GetDoubleClickTime); end; +procedure TForm1.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TForm1.Panel1Enter(Sender: TObject); begin chrmosr.SendFocusEvent(True); diff --git a/demos/Delphi_VCL/SubProcess/uSimpleBrowser.dfm b/demos/Delphi_VCL/SubProcess/uSimpleBrowser.dfm index fc3d0e45..fc01a8d2 100644 --- a/demos/Delphi_VCL/SubProcess/uSimpleBrowser.dfm +++ b/demos/Delphi_VCL/SubProcess/uSimpleBrowser.dfm @@ -70,4 +70,9 @@ object Form1: TForm1 Left = 80 Top = 88 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + Left = 80 + Top = 160 + end end diff --git a/demos/Delphi_VCL/SubProcess/uSimpleBrowser.pas b/demos/Delphi_VCL/SubProcess/uSimpleBrowser.pas index 0bbda56a..113d61dd 100644 --- a/demos/Delphi_VCL/SubProcess/uSimpleBrowser.pas +++ b/demos/Delphi_VCL/SubProcess/uSimpleBrowser.pas @@ -50,7 +50,7 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFChromiumWindow, uCEFTypes, uCEFInterfaces, - uCEFWinControl; + uCEFWinControl, uCEFSentinel; type TForm1 = class(TForm) @@ -59,6 +59,7 @@ type AddressEdt: TEdit; GoBtn: TButton; Timer1: TTimer; + CEFSentinel1: TCEFSentinel; procedure GoBtnClick(Sender: TObject); procedure FormShow(Sender: TObject); procedure ChromiumWindow1AfterCreated(Sender: TObject); @@ -66,6 +67,7 @@ type procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); procedure ChromiumWindow1Close(Sender: TObject); procedure ChromiumWindow1BeforeClose(Sender: TObject); + procedure CEFSentinel1Close(Sender: TObject); private // You have to handle this two messages to call NotifyMoveOrResizeStarted or some page elements will be misaligned. procedure WMMove(var aMessage : TWMMove); message WM_MOVE; @@ -110,7 +112,8 @@ uses // ================= // 1. The FormCloseQuery event sets CanClose to False and calls TChromiumWindow.CloseBrowser, which triggers the TChromiumWindow.OnClose event. // 2. The TChromiumWindow.OnClose event calls TChromiumWindow.DestroyChildWindow which triggers the TChromiumWindow.OnBeforeClose event. -// 3. TChromiumWindow.OnBeforeClose sets FCanClose to True and closes the form. +// 3. TChromiumWindow.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin @@ -147,14 +150,15 @@ end; procedure TForm1.ChromiumWindow1Close(Sender: TObject); begin // DestroyChildWindow will destroy the child window created by CEF at the top of the Z order. - if not(ChromiumWindow1.DestroyChildWindow) then - begin - FCanClose := True; - Close; - end; + if not(ChromiumWindow1.DestroyChildWindow) then CEFSentinel1.Start; end; procedure TForm1.ChromiumWindow1BeforeClose(Sender: TObject); +begin + CEFSentinel1.Start; +end; + +procedure TForm1.CEFSentinel1Close(Sender: TObject); begin FCanClose := True; PostMessage(Handle, WM_CLOSE, 0, 0); diff --git a/demos/Delphi_VCL/TabbedBrowser/uMainForm.pas b/demos/Delphi_VCL/TabbedBrowser/uMainForm.pas index 63c6285f..c393d191 100644 --- a/demos/Delphi_VCL/TabbedBrowser/uMainForm.pas +++ b/demos/Delphi_VCL/TabbedBrowser/uMainForm.pas @@ -147,7 +147,9 @@ implementation // This is the destruction sequence when the user closes the main form // 1. FormCloseQuery hides the form and calls CloseAllBrowsers which calls TChromium.CloseBrowser in all tabs and triggers the TChromium.OnClose event. // 2. TChromium.OnClose sends a CEFBROWSER_DESTROYWNDPARENT message to destroy TCEFWindowParent in the main thread which triggers a TChromium.OnBeforeClose event. -// 3. TChromium.OnBeforeClose sends a CEFBROWSER_CHECKTAGGEDTABS message to set the TAG property to 1 in the TabSheet containing the TChromium. Then sends WM_CLOSE in case all tabsheets have a TAG = 1. +// 3. TChromium.OnBeforeClose sends a CEFBROWSER_CHECKTAGGEDTABS message to set the TAG property to 1 in the TabSheet containing the TChromium. +// When all tabsheets have a TAG = 1 it calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sends WM_CLOSE to the form. procedure GlobalCEFApp_OnContextInitialized; begin diff --git a/demos/Delphi_VCL/ToolBoxBrowser/uMainForm.pas b/demos/Delphi_VCL/ToolBoxBrowser/uMainForm.pas index 19bf295a..a9e7d0ca 100644 --- a/demos/Delphi_VCL/ToolBoxBrowser/uMainForm.pas +++ b/demos/Delphi_VCL/ToolBoxBrowser/uMainForm.pas @@ -103,7 +103,8 @@ uses // Destruction steps // ================= // 1. Destroy all child forms -// 2. Wait until all the child forms are closed before closing the main form and terminating the application. +// 2. Wait until all the child forms are closed before calling TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when all renderer processes are closed +// 3. TCEFSentinel.OnClose closes the main form. procedure GlobalCEFApp_OnContextInitialized; begin diff --git a/demos/Delphi_VCL/URLRequest/uURLRequest.dfm b/demos/Delphi_VCL/URLRequest/uURLRequest.dfm index c28f9029..f153c246 100644 --- a/demos/Delphi_VCL/URLRequest/uURLRequest.dfm +++ b/demos/Delphi_VCL/URLRequest/uURLRequest.dfm @@ -193,4 +193,9 @@ object URLRequestFrm: TURLRequestFrm Left = 304 Top = 104 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + Left = 160 + Top = 112 + end end diff --git a/demos/Delphi_VCL/URLRequest/uURLRequest.pas b/demos/Delphi_VCL/URLRequest/uURLRequest.pas index 9330d3b7..022c19eb 100644 --- a/demos/Delphi_VCL/URLRequest/uURLRequest.pas +++ b/demos/Delphi_VCL/URLRequest/uURLRequest.pas @@ -47,7 +47,8 @@ uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls, {$ENDIF} - uCEFInterfaces, uCEFUrlRequestClientComponent, uCEFRequest, uCEFUrlRequest; + uCEFInterfaces, uCEFUrlRequestClientComponent, uCEFRequest, uCEFUrlRequest, + uCEFSentinel; const URLREQUEST_SUCCESS = WM_APP + $101; @@ -77,9 +78,12 @@ type Label6: TLabel; PostParam2NameEdt: TEdit; PostParam2ValueEdt: TEdit; + CEFSentinel1: TCEFSentinel; procedure DownloadBtnClick(Sender: TObject); procedure SendPostReqBtnClick(Sender: TObject); + procedure Button1Click(Sender: TObject); + procedure CEFSentinel1Close(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormCreate(Sender: TObject); @@ -90,8 +94,6 @@ type procedure CEFUrlRequestClientComponent1RequestComplete(Sender: TObject; const request: ICefUrlRequest); procedure CEFUrlRequestClientComponent1CreateURLRequest(Sender: TObject); - procedure Button1Click(Sender: TObject); - private FMemStream : TMemoryStream; FCanClose : boolean; @@ -134,7 +136,8 @@ implementation // 1- Set CanClose to FALSE in the TForm.OnCloseQuery event and set FClosing to TRUE. // 2- The next time TCEFUrlRequestClientComponent.OnDownloadProgress is executed we call request.Cancel, which triggers the // TCEFUrlRequestClientComponent.OnRequestComplete event. -// 3- in the TCEFUrlRequestClientComponent.OnRequestComplete event we set FCanClose to TRUE and send WM_CLOSE to the form. +// 3- in the TCEFUrlRequestClientComponent.OnRequestComplete event we call TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4- TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. uses ShellApi, @@ -222,6 +225,12 @@ begin ShellExecute(0, 'open', 'https://ptsv2.com/t/cef4delphi', nil, nil, SW_SHOWNORMAL); end; +procedure TURLRequestFrm.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TURLRequestFrm.CEFUrlRequestClientComponent1CreateURLRequest(Sender: TObject); begin if FSendingGET then @@ -345,10 +354,7 @@ begin // Use request.response here to get a ICefResponse interface with all the response headers, status, error code, etc. if FClosing then - begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); - end + CEFSentinel1.Start else if (request <> nil) and (request.RequestStatus = UR_SUCCESS) then PostMessage(Handle, URLREQUEST_SUCCESS, 0, 0) diff --git a/demos/Lazarus/DOMVisitor/uDOMVisitor.pas b/demos/Lazarus/DOMVisitor/uDOMVisitor.pas index d27d268c..ab682af8 100644 --- a/demos/Lazarus/DOMVisitor/uDOMVisitor.pas +++ b/demos/Lazarus/DOMVisitor/uDOMVisitor.pas @@ -218,7 +218,7 @@ end; procedure DOMVisitor_OnDocAvailable(const browser: ICefBrowser; const frame: ICefFrame; const document: ICefDomDocument); var - msg: ICefProcessMessage; + TempMessage : ICefProcessMessage; begin // This function is called from a different process. // document is only valid inside this function. @@ -239,21 +239,33 @@ begin // Sending back some custom results to the browser process // Notice that the DOMVISITOR_MSGNAME_PARTIAL message name needs to be recognized in // Chromium1ProcessMessageReceived - msg := TCefProcessMessageRef.New(DOMVISITOR_MSGNAME_PARTIAL); - msg.ArgumentList.SetString(0, 'document.Title : ' + document.Title); - frame.SendProcessMessage(PID_BROWSER, msg); + try + TempMessage := TCefProcessMessageRef.New(DOMVISITOR_MSGNAME_PARTIAL); + TempMessage.ArgumentList.SetString(0, 'document.Title : ' + document.Title); + + if (frame <> nil) and frame.IsValid then + frame.SendProcessMessage(PID_BROWSER, TempMessage); + finally + TempMessage := nil; + end; end; procedure DOMVisitor_OnDocAvailableFullMarkup(const browser: ICefBrowser; const frame: ICefFrame; const document: ICefDomDocument); var - msg: ICefProcessMessage; + TempMessage : ICefProcessMessage; begin // Sending back some custom results to the browser process // Notice that the DOMVISITOR_MSGNAME_FULL message name needs to be recognized in // Chromium1ProcessMessageReceived - msg := TCefProcessMessageRef.New(DOMVISITOR_MSGNAME_FULL); - msg.ArgumentList.SetString(0, document.Body.AsMarkup); - frame.SendProcessMessage(PID_BROWSER, msg); + try + TempMessage := TCefProcessMessageRef.New(DOMVISITOR_MSGNAME_FULL); + TempMessage.ArgumentList.SetString(0, document.Body.AsMarkup); + + if (frame <> nil) and frame.IsValid then + frame.SendProcessMessage(PID_BROWSER, TempMessage); + finally + TempMessage := nil; + end; end; procedure GlobalCEFApp_OnProcessMessageReceived(const browser : ICefBrowser; @@ -262,7 +274,6 @@ procedure GlobalCEFApp_OnProcessMessageReceived(const browser : ICefBrowse const message : ICefProcessMessage; var aHandled : boolean); var - TempFrame : ICefFrame; TempVisitor : TCefFastDomVisitor2; begin aHandled := False; @@ -271,12 +282,10 @@ begin begin if (message.name = RETRIEVEDOM_MSGNAME_PARTIAL) then begin - TempFrame := browser.MainFrame; - - if (TempFrame <> nil) then + if (frame <> nil) and frame.IsValid then begin TempVisitor := TCefFastDomVisitor2.Create(browser, frame, DOMVisitor_OnDocAvailable); - TempFrame.VisitDom(TempVisitor); + frame.VisitDom(TempVisitor); end; aHandled := True; @@ -284,12 +293,10 @@ begin else if (message.name = RETRIEVEDOM_MSGNAME_FULL) then begin - TempFrame := browser.MainFrame; - - if (TempFrame <> nil) then + if (frame <> nil) and frame.IsValid then begin TempVisitor := TCefFastDomVisitor2.Create(browser, frame, DOMVisitor_OnDocAvailableFullMarkup); - TempFrame.VisitDom(TempVisitor); + frame.VisitDom(TempVisitor); end; aHandled := True; diff --git a/demos/Lazarus/EditorBrowser/uEditorBrowser.pas b/demos/Lazarus/EditorBrowser/uEditorBrowser.pas index 5c5d2c56..0359c653 100644 --- a/demos/Lazarus/EditorBrowser/uEditorBrowser.pas +++ b/demos/Lazarus/EditorBrowser/uEditorBrowser.pas @@ -1,4 +1,4 @@ -// ************************************************************************ +// ************************************************************************ // ***************************** CEF4Delphi ******************************* // ************************************************************************ // @@ -246,7 +246,7 @@ procedure TForm1.Chromium1LoadEnd(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; httpStatusCode: Integer); begin - if (frame <> nil) and not(frame.isMain) then exit; + if (frame <> nil) and (not(frame.IsValid) or not(frame.isMain)) then exit; // Enable the "designMode" for all loaded files to edit them EnableDesignMode; diff --git a/demos/Lazarus/JavaScript/JSEval/uJSEval.pas b/demos/Lazarus/JavaScript/JSEval/uJSEval.pas index 4bd5182b..fb226d36 100644 --- a/demos/Lazarus/JavaScript/JSEval/uJSEval.pas +++ b/demos/Lazarus/JavaScript/JSEval/uJSEval.pas @@ -1,4 +1,4 @@ -// ************************************************************************ +// ************************************************************************ // ***************************** CEF4Delphi ******************************* // ************************************************************************ // @@ -432,7 +432,8 @@ begin end; end; - pFrame.SendProcessMessage(PID_BROWSER, pAnswer); + if (pFrame <> nil) and pFrame.IsValid then + pFrame.SendProcessMessage(PID_BROWSER, pAnswer); end; procedure ParseBinaryValue(const pBrowser : ICefBrowser; const pFrame: ICefFrame; const aBinaryValue : ICefBinaryValue); @@ -476,7 +477,7 @@ begin TempString := 'Image size : ' + inttostr(TempSize) + #13 + #10 + 'Encoded image : ' + TempEncodedStream.DataString; - if pAnswer.ArgumentList.SetString(0, TempString) then + if (pFrame <> nil) and pFrame.IsValid and pAnswer.ArgumentList.SetString(0, TempString) then pFrame.SendProcessMessage(PID_BROWSER, pAnswer); end; end; @@ -512,9 +513,9 @@ begin begin TempScript := pMessage.ArgumentList.GetString(0); - if (length(TempScript) > 0) then + if (length(TempScript) > 0) and (pFrame <> nil) and pFrame.IsValid then begin - pV8Context := pBrowser.MainFrame.GetV8Context; + pV8Context := pFrame.GetV8Context; if pV8Context.Enter then begin diff --git a/demos/Lazarus/JavaScript/JSExtension/uJSExtension.pas b/demos/Lazarus/JavaScript/JSExtension/uJSExtension.pas index ca62af96..dd4aa142 100644 --- a/demos/Lazarus/JavaScript/JSExtension/uJSExtension.pas +++ b/demos/Lazarus/JavaScript/JSExtension/uJSExtension.pas @@ -388,7 +388,7 @@ begin case commandId of MINIBROWSER_CONTEXTMENU_SETJSEVENT : - if (browser <> nil) and (browser.MainFrame <> nil) then + if (frame <> nil) and frame.IsValid then begin TempJSCode := 'document.body.addEventListener("mouseover", function(evt){'+ 'function getpath(n){'+ @@ -399,16 +399,16 @@ begin 'myextension.mouseover(getpath(evt.target))}'+ ')'; - browser.MainFrame.ExecuteJavaScript(TempJSCode, 'about:blank', 0); + frame.ExecuteJavaScript(TempJSCode, 'about:blank', 0); end; MINIBROWSER_CONTEXTMENU_JSVISITDOM : - if (browser <> nil) and (browser.MainFrame <> nil) then + if (frame <> nil) and frame.IsValid then begin TempJSCode := 'var testhtml = document.body.innerHTML; ' + 'myextension.sendresulttobrowser(testhtml, ' + quotedstr(CUSTOMNAME_MESSAGE_NAME) + ');'; - browser.MainFrame.ExecuteJavaScript(TempJSCode, 'about:blank', 0); + frame.ExecuteJavaScript(TempJSCode, 'about:blank', 0); end; MINIBROWSER_CONTEXTMENU_SHOWDEVTOOLS : diff --git a/demos/Lazarus/JavaScript/JSExtension/uTestExtensionHandler.pas b/demos/Lazarus/JavaScript/JSExtension/uTestExtensionHandler.pas index a171f7b4..8c2c0b22 100644 --- a/demos/Lazarus/JavaScript/JSExtension/uTestExtensionHandler.pas +++ b/demos/Lazarus/JavaScript/JSExtension/uTestExtensionHandler.pas @@ -1,4 +1,4 @@ -// ************************************************************************ +// ************************************************************************ // ***************************** CEF4Delphi ******************************* // ************************************************************************ // @@ -69,35 +69,46 @@ function TTestExtensionHandler.Execute(const name : ustring; var retval : ICefv8Value; var exception : ustring): Boolean; var - msg: ICefProcessMessage; + TempMessage : ICefProcessMessage; + TempFrame : ICefFrame; begin - if (name = 'mouseover') then - begin - if (length(arguments) > 0) and arguments[0].IsString then - begin - msg := TCefProcessMessageRef.New(MOUSEOVER_MESSAGE_NAME); - msg.ArgumentList.SetString(0, arguments[0].GetStringValue); + Result := False; - TCefv8ContextRef.Current.Browser.MainFrame.SendProcessMessage(PID_BROWSER, msg); - end; - - Result := True; - end - else - if (name = 'sendresulttobrowser') then + try + if (name = 'mouseover') then begin - if (length(arguments) > 1) and arguments[0].IsString and arguments[1].IsString then + if (length(arguments) > 0) and arguments[0].IsString then begin - msg := TCefProcessMessageRef.New(arguments[1].GetStringValue); - msg.ArgumentList.SetString(0, arguments[0].GetStringValue); + TempMessage := TCefProcessMessageRef.New(MOUSEOVER_MESSAGE_NAME); + TempMessage.ArgumentList.SetString(0, arguments[0].GetStringValue); - TCefv8ContextRef.Current.Browser.MainFrame.SendProcessMessage(PID_BROWSER, msg); + TempFrame := TCefv8ContextRef.Current.Browser.MainFrame; + + if (TempFrame <> nil) and TempFrame.IsValid then + TempFrame.SendProcessMessage(PID_BROWSER, TempMessage); end; Result := True; end else - Result := False; + if (name = 'sendresulttobrowser') then + begin + if (length(arguments) > 1) and arguments[0].IsString and arguments[1].IsString then + begin + TempMessage := TCefProcessMessageRef.New(arguments[1].GetStringValue); + TempMessage.ArgumentList.SetString(0, arguments[0].GetStringValue); + + TempFrame := TCefv8ContextRef.Current.Browser.MainFrame; + + if (TempFrame <> nil) and TempFrame.IsValid then + TempFrame.SendProcessMessage(PID_BROWSER, TempMessage); + end; + + Result := True; + end; + finally + TempMessage := nil; + end; end; end. diff --git a/demos/Lazarus/JavaScript/JSExtensionWithFunction/uMyV8Handler.pas b/demos/Lazarus/JavaScript/JSExtensionWithFunction/uMyV8Handler.pas index 4ecd1a85..45e28bba 100644 --- a/demos/Lazarus/JavaScript/JSExtensionWithFunction/uMyV8Handler.pas +++ b/demos/Lazarus/JavaScript/JSExtensionWithFunction/uMyV8Handler.pas @@ -1,4 +1,4 @@ -// ************************************************************************ +// ************************************************************************ // ***************************** CEF4Delphi ******************************* // ************************************************************************ // @@ -63,19 +63,28 @@ function TMyV8Handler.Execute(const name : ustring; var retval : ICefv8Value; var exception : ustring): Boolean; var - msg: ICefProcessMessage; + TempMessage : ICefProcessMessage; + TempFrame : ICefFrame; begin - if (name = 'myfunc') then - begin - msg := TCefProcessMessageRef.New(TEST_MESSAGE_NAME); - msg.ArgumentList.SetString(0, 'Message received!'); - TCefv8ContextRef.Current.Browser.MainFrame.SendProcessMessage(PID_BROWSER, msg); + Result := False; - retval := TCefv8ValueRef.NewString('My Value!'); - Result := True; - end - else - Result := False; + try + if (name = 'myfunc') then + begin + TempMessage := TCefProcessMessageRef.New(TEST_MESSAGE_NAME); + TempMessage.ArgumentList.SetString(0, 'Message received!'); + + TempFrame := TCefv8ContextRef.Current.Browser.MainFrame; + + if (TempFrame <> nil) and TempFrame.IsValid then + TempFrame.SendProcessMessage(PID_BROWSER, TempMessage); + + retval := TCefv8ValueRef.NewString('My Value!'); + Result := True; + end; + finally + TempMessage := nil; + end; end; diff --git a/demos/Lazarus/MiniBrowser/uMiniBrowser.pas b/demos/Lazarus/MiniBrowser/uMiniBrowser.pas index bc76ff94..da90365c 100644 --- a/demos/Lazarus/MiniBrowser/uMiniBrowser.pas +++ b/demos/Lazarus/MiniBrowser/uMiniBrowser.pas @@ -1,4 +1,4 @@ -// ************************************************************************ +// ************************************************************************ // ***************************** CEF4Delphi ******************************* // ************************************************************************ // @@ -496,6 +496,7 @@ begin if Chromium1.IsSameBrowser(browser) and (frame <> nil) and + frame.IsValid and frame.IsMain then InspectRequest(request); end; @@ -568,8 +569,8 @@ begin end; MINIBROWSER_CONTEXTMENU_JSWRITEDOC : - if (browser <> nil) and (browser.MainFrame <> nil) then - browser.MainFrame.ExecuteJavaScript( + if (frame <> nil) and frame.IsValid then + frame.ExecuteJavaScript( 'var css = ' + chr(39) + '@page {size: A4; margin: 0;} @media print {html, body {width: 210mm; height: 297mm;}}' + chr(39) + '; ' + 'var style = document.createElement(' + chr(39) + 'style' + chr(39) + '); ' + 'style.type = ' + chr(39) + 'text/css' + chr(39) + '; ' + @@ -578,8 +579,8 @@ begin 'about:blank', 0); MINIBROWSER_CONTEXTMENU_JSPRINTDOC : - if (browser <> nil) and (browser.MainFrame <> nil) then - browser.MainFrame.ExecuteJavaScript('window.print();', 'about:blank', 0); + if (frame <> nil) and frame.IsValid then + frame.ExecuteJavaScript('window.print();', 'about:blank', 0); MINIBROWSER_CONTEXTMENU_UNMUTEAUDIO : Chromium1.AudioMuted := False; @@ -720,6 +721,8 @@ procedure TMiniBrowserFrm.Chromium1LoadEnd(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; httpStatusCode: Integer); begin + if (frame = nil) or not(frame.IsValid) then exit; + if frame.IsMain then StatusPnl.Caption := 'main frame loaded : ' + quotedstr(frame.name) else @@ -902,6 +905,7 @@ begin if Chromium1.IsSameBrowser(browser) and (frame <> nil) and + frame.IsValid and frame.IsMain then InspectResponse(response); end; diff --git a/demos/Lazarus/PopupBrowser2/PopupBrowser2.lps b/demos/Lazarus/PopupBrowser2/PopupBrowser2.lps index 2e287d70..27cb990e 100644 --- a/demos/Lazarus/PopupBrowser2/PopupBrowser2.lps +++ b/demos/Lazarus/PopupBrowser2/PopupBrowser2.lps @@ -10,7 +10,7 @@ - +
@@ -22,9 +22,12 @@ - - - + + + + + + @@ -35,10 +38,10 @@ - + - + @@ -52,11 +55,10 @@ - - - + + + - @@ -83,120 +85,120 @@
- - + + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - - + + - + - + - - + + - - + + - + - - + + - - + + - + - + - + - + - + - + - + diff --git a/demos/Lazarus/PopupBrowser2/uMainForm.lfm b/demos/Lazarus/PopupBrowser2/uMainForm.lfm index d9739c2a..5bd2846e 100644 --- a/demos/Lazarus/PopupBrowser2/uMainForm.lfm +++ b/demos/Lazarus/PopupBrowser2/uMainForm.lfm @@ -1,7 +1,7 @@ object MainForm: TMainForm - Left = 101 + Left = 679 Height = 624 - Top = 120 + Top = 160 Width = 1038 Caption = 'Initializing browser. Please wait...' ClientHeight = 624 @@ -71,7 +71,7 @@ object MainForm: TMainForm top = 152 end object ApplicationProperties1: TApplicationProperties - left = 59 - top = 235 + left = 56 + top = 216 end end diff --git a/demos/Lazarus/PopupBrowser2/uMainForm.pas b/demos/Lazarus/PopupBrowser2/uMainForm.pas index 37340ef3..eb32a160 100644 --- a/demos/Lazarus/PopupBrowser2/uMainForm.pas +++ b/demos/Lazarus/PopupBrowser2/uMainForm.pas @@ -45,7 +45,7 @@ uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, SyncObjs, uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFConstants, uCEFTypes, uChildForm, - uCEFWinControl, uCEFChromiumEvents; + uCEFWinControl, uCEFChromiumEvents, uCEFSentinel; const CEF_CREATENEXTCHILD = WM_APP + $A50; @@ -325,8 +325,7 @@ begin Chromium1.LoadURL(AddressEdt.Text); end; -procedure TMainForm.Chromium1BeforeClose(Sender: TObject; - const browser: ICefBrowser); +procedure TMainForm.Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); begin FCanClose := True; PostMessage(Handle, WM_CLOSE, 0, 0); diff --git a/demos/Lazarus/PostInspectorBrowser/uPostInspectorBrowser.pas b/demos/Lazarus/PostInspectorBrowser/uPostInspectorBrowser.pas index b968c03a..faed5a1d 100644 --- a/demos/Lazarus/PostInspectorBrowser/uPostInspectorBrowser.pas +++ b/demos/Lazarus/PostInspectorBrowser/uPostInspectorBrowser.pas @@ -366,7 +366,9 @@ procedure TForm1.Chromium1BeforeResourceLoad(Sender: TObject; begin // This event is called before a resource request is loaded. // The request object may be modified. - HandleRequest(request, frame.IsMain); + if (frame <> nil) and frame.IsValid then + HandleRequest(request, frame.IsMain); + Result := RV_CONTINUE; end; diff --git a/source/uCEFChromium.pas b/source/uCEFChromium.pas index 24b0434b..fcd64c92 100644 --- a/source/uCEFChromium.pas +++ b/source/uCEFChromium.pas @@ -241,7 +241,7 @@ type // ICefRequestContextHandler FOnRequestContextInitialized : TOnRequestContextInitialized; FOnBeforePluginLoad : TOnBeforePluginLoad; - + // Custom FOnTextResultAvailable : TOnTextResultAvailableEvent; FOnPdfPrintFinished : TOnPdfPrintFinishedEvent; @@ -445,17 +445,17 @@ type procedure doOnRenderProcessTerminated(const browser: ICefBrowser; status: TCefTerminationStatus); virtual; // ICefResourceRequestHandler - function doOnBeforeResourceLoad(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; const callback: ICefRequestCallback): TCefReturnValue; virtual; - procedure doOnGetResourceHandler(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; var aResourceHandler : ICefResourceHandler); virtual; - procedure doOnResourceRedirect(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; const response: ICefResponse; var newUrl: ustring); virtual; - function doOnResourceResponse(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; const response: ICefResponse): Boolean; virtual; - procedure doOnGetResourceResponseFilter(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; const response: ICefResponse; var aResponseFilter: ICefResponseFilter); virtual; - procedure doOnResourceLoadComplete(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; const response: ICefResponse; status: TCefUrlRequestStatus; receivedContentLength: Int64); virtual; - procedure doOnProtocolExecution(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; var allowOsExecution: Boolean); virtual; - - // ICefCookieAccessFilter - function doCanSendCookie(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; const cookie: PCefCookie): boolean; virtual; - function doCanSaveCookie(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; const response: ICefResponse; const cookie: PCefCookie): boolean; virtual; + function doOnBeforeResourceLoad(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; const callback: ICefRequestCallback): TCefReturnValue; virtual; + procedure doOnGetResourceHandler(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; var aResourceHandler : ICefResourceHandler); virtual; + procedure doOnResourceRedirect(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; const response: ICefResponse; var newUrl: ustring); virtual; + function doOnResourceResponse(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; const response: ICefResponse): Boolean; virtual; + procedure doOnGetResourceResponseFilter(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; const response: ICefResponse; var aResponseFilter: ICefResponseFilter); virtual; + procedure doOnResourceLoadComplete(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; const response: ICefResponse; status: TCefUrlRequestStatus; receivedContentLength: Int64); virtual; + procedure doOnProtocolExecution(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; var allowOsExecution: Boolean); virtual; + + // ICefCookieAccessFilter + function doCanSendCookie(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; const cookie: PCefCookie): boolean; virtual; + function doCanSaveCookie(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; const response: ICefResponse; const cookie: PCefCookie): boolean; virtual; // ICefDialogHandler function doOnFileDialog(const browser: ICefBrowser; mode: TCefFileDialogMode; const title, defaultFilePath: ustring; const acceptFilters: TStrings; selectedAcceptFilter: Integer; const callback: ICefFileDialogCallback): Boolean; virtual; @@ -486,11 +486,11 @@ type procedure doOnFindResult(const browser: ICefBrowser; identifier, count: Integer; const selectionRect: PCefRect; activeMatchOrdinal: Integer; finalUpdate: Boolean); virtual; // ICefRequestContextHandler - procedure doOnRequestContextInitialized(const request_context: ICefRequestContext); virtual; - function doOnBeforePluginLoad(const mimeType, pluginUrl:ustring; isMainFrame : boolean; const topOriginUrl: ustring; const pluginInfo: ICefWebPluginInfo; var pluginPolicy: TCefPluginPolicy): Boolean; virtual; - procedure doGetResourceRequestHandler(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; is_navigation, is_download: boolean; const request_initiator: ustring; var disable_default_handling: boolean; var aResourceRequestHandler : ICefResourceRequestHandler); virtual; + procedure doOnRequestContextInitialized(const request_context: ICefRequestContext); virtual; + function doOnBeforePluginLoad(const mimeType, pluginUrl:ustring; isMainFrame : boolean; const topOriginUrl: ustring; const pluginInfo: ICefWebPluginInfo; var pluginPolicy: TCefPluginPolicy): Boolean; virtual; + procedure doGetResourceRequestHandler(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; is_navigation, is_download: boolean; const request_initiator: ustring; var disable_default_handling: boolean; var aResourceRequestHandler : ICefResourceRequestHandler); virtual; - // Custom + // Custom procedure doCookiesDeleted(numDeleted : integer); virtual; procedure doPdfPrintFinished(aResultOK : boolean); virtual; procedure doTextResultAvailable(const aText : ustring); virtual; @@ -502,7 +502,7 @@ type procedure doDownloadImageFinished(const imageUrl: ustring; httpStatusCode: Integer; const image: ICefImage); virtual; procedure doOnCookiesStoreFlushed; virtual; procedure doCertificateExceptionsCleared; virtual; - procedure doHttpAuthCredentialsCleared; virtual; + procedure doHttpAuthCredentialsCleared; virtual; procedure doAllConnectionsClosed; virtual; function MustCreateLoadHandler : boolean; virtual; function MustCreateFocusHandler : boolean; virtual; @@ -554,7 +554,7 @@ type function DeleteCookies(const url : ustring = ''; const cookieName : ustring = '') : boolean; function FlushCookieStore(aFlushImmediately : boolean = True) : boolean; function ClearCertificateExceptions(aClearImmediately : boolean = True) : boolean; - function ClearHttpAuthCredentials(aClearImmediately : boolean = True) : boolean; + function ClearHttpAuthCredentials(aClearImmediately : boolean = True) : boolean; function CloseAllConnections(aCloseImmediately : boolean = True) : boolean; procedure RetrieveHTML(const aFrameName : ustring = ''); overload; procedure RetrieveHTML(const aFrame : ICefFrame); overload; @@ -636,8 +636,8 @@ type procedure DragSourceSystemDragEnded; procedure IMESetComposition(const text: ustring; const underlines : TCefCompositionUnderlineDynArray; const replacement_range, selection_range : PCefRange); - procedure IMECommitText(const text: ustring; const replacement_range : PCefRange; relative_cursor_pos : integer); - procedure IMEFinishComposingText(keep_selection : boolean); + procedure IMECommitText(const text: ustring; const replacement_range : PCefRange; relative_cursor_pos : integer); + procedure IMEFinishComposingText(keep_selection : boolean); procedure IMECancelComposition; @@ -1553,7 +1553,7 @@ begin TempFrame := FBrowser.FocusedFrame; if (TempFrame = nil) then TempFrame := FBrowser.MainFrame; - if (TempFrame <> nil) then TempFrame.Copy; + if (TempFrame <> nil) and TempFrame.IsValid then TempFrame.Copy; end; end; @@ -1566,7 +1566,7 @@ begin TempFrame := FBrowser.FocusedFrame; if (TempFrame = nil) then TempFrame := FBrowser.MainFrame; - if (TempFrame <> nil) then TempFrame.Paste; + if (TempFrame <> nil) and TempFrame.IsValid then TempFrame.Paste; end; end; @@ -1579,7 +1579,7 @@ begin TempFrame := FBrowser.FocusedFrame; if (TempFrame = nil) then TempFrame := FBrowser.MainFrame; - if (TempFrame <> nil) then TempFrame.Cut; + if (TempFrame <> nil) and TempFrame.IsValid then TempFrame.Cut; end; end; @@ -1592,7 +1592,7 @@ begin TempFrame := FBrowser.FocusedFrame; if (TempFrame = nil) then TempFrame := FBrowser.MainFrame; - if (TempFrame <> nil) then TempFrame.Undo; + if (TempFrame <> nil) and TempFrame.IsValid then TempFrame.Undo; end; end; @@ -1605,7 +1605,7 @@ begin TempFrame := FBrowser.FocusedFrame; if (TempFrame = nil) then TempFrame := FBrowser.MainFrame; - if (TempFrame <> nil) then TempFrame.Redo; + if (TempFrame <> nil) and TempFrame.IsValid then TempFrame.Redo; end; end; @@ -1618,7 +1618,7 @@ begin TempFrame := FBrowser.FocusedFrame; if (TempFrame = nil) then TempFrame := FBrowser.MainFrame; - if (TempFrame <> nil) then TempFrame.Del; + if (TempFrame <> nil) and TempFrame.IsValid then TempFrame.Del; end; end; @@ -1631,7 +1631,7 @@ begin TempFrame := FBrowser.FocusedFrame; if (TempFrame = nil) then TempFrame := FBrowser.MainFrame; - if (TempFrame <> nil) then TempFrame.SelectAll; + if (TempFrame <> nil) and TempFrame.IsValid then TempFrame.SelectAll; end; end; @@ -1743,13 +1743,13 @@ begin else TempFrame := FBrowser.MainFrame; - if (TempFrame <> nil) then TempFrame.LoadUrl(aURL); + if (TempFrame <> nil) and TempFrame.IsValid then TempFrame.LoadUrl(aURL); end; end; procedure TChromium.LoadURL(const aURL : ustring; const aFrame : ICefFrame); begin - if Initialized and (aFrame <> nil) then aFrame.LoadUrl(aURL); + if Initialized and (aFrame <> nil) and aFrame.IsValid then aFrame.LoadUrl(aURL); end; procedure TChromium.LoadURL(const aURL : ustring; const aFrameIdentifier : int64); @@ -1763,7 +1763,7 @@ begin else TempFrame := FBrowser.MainFrame; - if (TempFrame <> nil) then TempFrame.LoadUrl(aURL); + if (TempFrame <> nil) and TempFrame.IsValid then TempFrame.LoadUrl(aURL); end; end; @@ -1774,7 +1774,7 @@ begin if Initialized then begin TempFrame := FBrowser.MainFrame; - if (TempFrame <> nil) then TempFrame.LoadString(aString, aURL); + if (TempFrame <> nil) and TempFrame.IsValid then TempFrame.LoadString(aString, aURL); end; end; @@ -1785,7 +1785,7 @@ begin if Initialized then begin TempFrame := FBrowser.MainFrame; - if (TempFrame <> nil) then TempFrame.LoadRequest(aRequest); + if (TempFrame <> nil) and TempFrame.IsValid then TempFrame.LoadRequest(aRequest); end; end; @@ -1975,7 +1975,7 @@ begin if Initialized then begin TempFrame := FBrowser.MainFrame; - if (TempFrame <> nil) then Result := TempFrame.URL; + if (TempFrame <> nil) and TempFrame.IsValid then Result := TempFrame.URL; end; end; @@ -2382,9 +2382,9 @@ begin end; // If aClearImmediately is false then OnHttpAuthCredentialsCleared is triggered when the credeintials are cleared -function TChromium.ClearHttpAuthCredentials(aClearImmediately : boolean) : boolean; -var - TempCallback : ICefCompletionCallback; +function TChromium.ClearHttpAuthCredentials(aClearImmediately : boolean) : boolean; +var + TempCallback : ICefCompletionCallback; begin Result := False; @@ -2400,9 +2400,9 @@ begin finally TempCallback := nil; end; -end; - -// If aCloseImmediately is false then OnAllConnectionsClosed is triggered when the connections are closed +end; + +// If aCloseImmediately is false then OnAllConnectionsClosed is triggered when the connections are closed function TChromium.CloseAllConnections(aCloseImmediately : boolean) : boolean; var TempCallback : ICefCompletionCallback; @@ -2436,7 +2436,7 @@ begin else TempFrame := FBrowser.MainFrame; - if (TempFrame <> nil) then + if (TempFrame <> nil) and TempFrame.IsValid then try TempVisitor := TCustomCefStringVisitor.Create(self); TempFrame.GetSource(TempVisitor); @@ -2450,7 +2450,7 @@ procedure TChromium.RetrieveHTML(const aFrame : ICefFrame); var TempVisitor : ICefStringVisitor; begin - if Initialized and (aFrame <> nil) then + if Initialized and (aFrame <> nil) and aFrame.IsValid then try TempVisitor := TCustomCefStringVisitor.Create(self); aFrame.GetSource(TempVisitor); @@ -2471,7 +2471,7 @@ begin else TempFrame := FBrowser.MainFrame; - if (TempFrame <> nil) then + if (TempFrame <> nil) and TempFrame.IsValid then try TempVisitor := TCustomCefStringVisitor.Create(self); TempFrame.GetSource(TempVisitor); @@ -2494,7 +2494,7 @@ begin else TempFrame := FBrowser.MainFrame; - if (TempFrame <> nil) then + if (TempFrame <> nil) and TempFrame.IsValid then try TempVisitor := TCustomCefStringVisitor.Create(self); TempFrame.GetText(TempVisitor); @@ -2508,7 +2508,7 @@ procedure TChromium.RetrieveText(const aFrame : ICefFrame); var TempVisitor : ICefStringVisitor; begin - if Initialized and (aFrame <> nil) then + if Initialized and (aFrame <> nil) and aFrame.IsValid then try TempVisitor := TCustomCefStringVisitor.Create(self); aFrame.GetText(TempVisitor); @@ -2529,7 +2529,7 @@ begin else TempFrame := FBrowser.MainFrame; - if (TempFrame <> nil) then + if (TempFrame <> nil) and TempFrame.IsValid then try TempVisitor := TCustomCefStringVisitor.Create(self); TempFrame.GetText(TempVisitor); @@ -3277,11 +3277,11 @@ begin if assigned(FOnCertificateExceptionsCleared) then FOnCertificateExceptionsCleared(self); end; -procedure TChromium.doHttpAuthCredentialsCleared; -begin +procedure TChromium.doHttpAuthCredentialsCleared; +begin if assigned(FOnHttpAuthCredentialsCleared) then FOnHttpAuthCredentialsCleared(self); -end; - +end; + procedure TChromium.doAllConnectionsClosed; begin if assigned(FOnAllConnectionsClosed) then FOnAllConnectionsClosed(self); @@ -3375,7 +3375,7 @@ begin end; function TChromium.MustCreateResourceRequestHandler : boolean; -begin +begin Result := assigned(FOnBeforeResourceLoad) or assigned(FOnGetResourceHandler) or assigned(FOnResourceRedirect) or @@ -3385,7 +3385,7 @@ begin assigned(FOnProtocolExecution) or MustCreateCookieAccessFilter; end; - + function TChromium.MustCreateCookieAccessFilter : boolean; begin Result := assigned(FOnCanSendCookie) or @@ -3427,7 +3427,7 @@ begin else TempFrame := FBrowser.MainFrame; - if (TempFrame <> nil) then + if (TempFrame <> nil) and TempFrame.IsValid then TempFrame.ExecuteJavaScript(aCode, aScriptURL, aStartLine); end; except @@ -3439,7 +3439,7 @@ end; procedure TChromium.ExecuteJavaScript(const aCode, aScriptURL : ustring; const aFrame : ICefFrame; aStartLine : integer); begin try - if Initialized and (aFrame <> nil) then + if Initialized and (aFrame <> nil) and aFrame.IsValid then aFrame.ExecuteJavaScript(aCode, aScriptURL, aStartLine); except on e : exception do @@ -3459,7 +3459,7 @@ begin else TempFrame := FBrowser.MainFrame; - if (TempFrame <> nil) then + if (TempFrame <> nil) and TempFrame.IsValid then TempFrame.ExecuteJavaScript(aCode, aScriptURL, aStartLine); end; except @@ -3628,11 +3628,11 @@ begin // TempAction values // ----------------- - // cbaCancel : stop closing the browser - // cbaClose : continue closing the browser - // cbaDelay : stop closing the browser momentarily. Used when the application - // needs to execute some custom processes before closing the - // browser. This is usually needed to destroy a TCEFWindowParent + // cbaCancel : stop closing the browser + // cbaClose : continue closing the browser + // cbaDelay : stop closing the browser momentarily. Used when the application + // needs to execute some custom processes before closing the + // browser. This is usually needed to destroy a TCEFWindowParent // in the main thread before closing the browser. if Assigned(FOnClose) then FOnClose(Self, browser, TempAction); @@ -3902,31 +3902,31 @@ begin if assigned(FOnRequestContextInitialized) then FOnRequestContextInitialized(self, request_context); end; -function TChromium.doOnBeforePluginLoad(const mimeType : ustring; - const pluginUrl : ustring; - isMainFrame : boolean; - const topOriginUrl : ustring; - const pluginInfo : ICefWebPluginInfo; - var pluginPolicy : TCefPluginPolicy): Boolean; -begin +function TChromium.doOnBeforePluginLoad(const mimeType : ustring; + const pluginUrl : ustring; + isMainFrame : boolean; + const topOriginUrl : ustring; + const pluginInfo : ICefWebPluginInfo; + var pluginPolicy : TCefPluginPolicy): Boolean; +begin Result := False; if assigned(FOnBeforePluginLoad) then FOnBeforePluginLoad(self, mimeType, pluginUrl, isMainFrame, topOriginUrl, pluginInfo, pluginPolicy, Result); -end; - -procedure TChromium.doGetResourceRequestHandler(const browser : ICefBrowser; - const frame : ICefFrame; - const request : ICefRequest; - is_navigation : boolean; - is_download : boolean; - const request_initiator : ustring; - var disable_default_handling : boolean; - var aResourceRequestHandler : ICefResourceRequestHandler); -begin +end; + +procedure TChromium.doGetResourceRequestHandler(const browser : ICefBrowser; + const frame : ICefFrame; + const request : ICefRequest; + is_navigation : boolean; + is_download : boolean; + const request_initiator : ustring; + var disable_default_handling : boolean; + var aResourceRequestHandler : ICefResourceRequestHandler); +begin disable_default_handling := False; aResourceRequestHandler := nil; -end; +end; procedure TChromium.doOnFullScreenModeChange(const browser: ICefBrowser; fullscreen: Boolean); begin @@ -3967,11 +3967,11 @@ begin if assigned(FOnCanSendCookie) then FOnCanSendCookie(self, browser, frame, request, cookie, Result); end; -function TChromium.doCanSaveCookie(const browser : ICefBrowser; - const frame : ICefFrame; - const request : ICefRequest; - const response : ICefResponse; - const cookie : PCefCookie): boolean; +function TChromium.doCanSaveCookie(const browser : ICefBrowser; + const frame : ICefFrame; + const request : ICefRequest; + const response : ICefResponse; + const cookie : PCefCookie): boolean; begin Result := True; @@ -4095,10 +4095,10 @@ begin end; procedure TChromium.doOnGetResourceRequestHandler(const browser : ICefBrowser; - const frame : ICefFrame; - const request : ICefRequest; - is_navigation : boolean; - is_download : boolean; + const frame : ICefFrame; + const request : ICefRequest; + is_navigation : boolean; + is_download : boolean; const request_initiator : ustring; var disable_default_handling : boolean; var aResourceRequestHandler : ICefResourceRequestHandler; @@ -4602,7 +4602,7 @@ begin else TempFrame := FBrowser.MainFrame; - if (TempFrame <> nil) then + if (TempFrame <> nil) and TempFrame.IsValid then TempFrame.SendProcessMessage(targetProcess, ProcMessage); end; except @@ -4614,7 +4614,7 @@ end; procedure TChromium.SendProcessMessage(targetProcess: TCefProcessId; const ProcMessage: ICefProcessMessage; const aFrame : ICefFrame); begin try - if Initialized and (aFrame <> nil) then + if Initialized and (aFrame <> nil) and aFrame.IsValid then aFrame.SendProcessMessage(targetProcess, ProcMessage); except on e : exception do @@ -4634,7 +4634,7 @@ begin else TempFrame := FBrowser.MainFrame; - if (TempFrame <> nil) then + if (TempFrame <> nil) and TempFrame.IsValid then TempFrame.SendProcessMessage(targetProcess, ProcMessage); end; except @@ -4657,7 +4657,7 @@ begin else TempFrame := FBrowser.MainFrame; - if (TempFrame <> nil) then + if (TempFrame <> nil) and TempFrame.IsValid then Result := TempFrame.CreateUrlRequest(request, client); end; except @@ -4671,7 +4671,7 @@ begin Result := nil; try - if Initialized and (aFrame <> nil) then + if Initialized and (aFrame <> nil) and aFrame.IsValid then Result := aFrame.CreateUrlRequest(request, client); except on e : exception do @@ -4693,7 +4693,7 @@ begin else TempFrame := FBrowser.MainFrame; - if (TempFrame <> nil) then + if (TempFrame <> nil) and TempFrame.IsValid then Result := TempFrame.CreateUrlRequest(request, client); end; except @@ -4741,19 +4741,19 @@ begin FBrowser.Host.IMESetComposition(text, underlines, replacement_range, selection_range); end; -procedure TChromium.IMECommitText(const text : ustring; - const replacement_range : PCefRange; - relative_cursor_pos : integer); -begin +procedure TChromium.IMECommitText(const text : ustring; + const replacement_range : PCefRange; + relative_cursor_pos : integer); +begin if Initialized then FBrowser.Host.IMECommitText(text, replacement_range, relative_cursor_pos); -end; - -procedure TChromium.IMEFinishComposingText(keep_selection : boolean); -begin +end; + +procedure TChromium.IMEFinishComposingText(keep_selection : boolean); +begin if Initialized then FBrowser.Host.IMEFinishComposingText(keep_selection); -end; - +end; + procedure TChromium.IMECancelComposition; begin if Initialized then FBrowser.Host.IMECancelComposition; diff --git a/source/uCEFFMXChromium.pas b/source/uCEFFMXChromium.pas index f07bba7f..b249b1c8 100644 --- a/source/uCEFFMXChromium.pas +++ b/source/uCEFFMXChromium.pas @@ -1352,7 +1352,7 @@ begin TempFrame := FBrowser.FocusedFrame; if (TempFrame = nil) then TempFrame := FBrowser.MainFrame; - if (TempFrame <> nil) then TempFrame.Copy; + if (TempFrame <> nil) and TempFrame.IsValid then TempFrame.Copy; end; end; @@ -1365,7 +1365,7 @@ begin TempFrame := FBrowser.FocusedFrame; if (TempFrame = nil) then TempFrame := FBrowser.MainFrame; - if (TempFrame <> nil) then TempFrame.Paste; + if (TempFrame <> nil) and TempFrame.IsValid then TempFrame.Paste; end; end; @@ -1378,7 +1378,7 @@ begin TempFrame := FBrowser.FocusedFrame; if (TempFrame = nil) then TempFrame := FBrowser.MainFrame; - if (TempFrame <> nil) then TempFrame.Cut; + if (TempFrame <> nil) and TempFrame.IsValid then TempFrame.Cut; end; end; @@ -1391,7 +1391,7 @@ begin TempFrame := FBrowser.FocusedFrame; if (TempFrame = nil) then TempFrame := FBrowser.MainFrame; - if (TempFrame <> nil) then TempFrame.Undo; + if (TempFrame <> nil) and TempFrame.IsValid then TempFrame.Undo; end; end; @@ -1404,7 +1404,7 @@ begin TempFrame := FBrowser.FocusedFrame; if (TempFrame = nil) then TempFrame := FBrowser.MainFrame; - if (TempFrame <> nil) then TempFrame.Redo; + if (TempFrame <> nil) and TempFrame.IsValid then TempFrame.Redo; end; end; @@ -1417,7 +1417,7 @@ begin TempFrame := FBrowser.FocusedFrame; if (TempFrame = nil) then TempFrame := FBrowser.MainFrame; - if (TempFrame <> nil) then TempFrame.Del; + if (TempFrame <> nil) and TempFrame.IsValid then TempFrame.Del; end; end; @@ -1430,7 +1430,7 @@ begin TempFrame := FBrowser.FocusedFrame; if (TempFrame = nil) then TempFrame := FBrowser.MainFrame; - if (TempFrame <> nil) then TempFrame.SelectAll; + if (TempFrame <> nil) and TempFrame.IsValid then TempFrame.SelectAll; end; end; @@ -1542,13 +1542,13 @@ begin else TempFrame := FBrowser.MainFrame; - if (TempFrame <> nil) then TempFrame.LoadUrl(aURL); + if (TempFrame <> nil) and TempFrame.IsValid then TempFrame.LoadUrl(aURL); end; end; procedure TFMXChromium.LoadURL(const aURL : ustring; const aFrame : ICefFrame); begin - if Initialized and (aFrame <> nil) then aFrame.LoadUrl(aURL); + if Initialized and (aFrame <> nil) and aFrame.IsValid then aFrame.LoadUrl(aURL); end; procedure TFMXChromium.LoadURL(const aURL : ustring; const aFrameIdentifier : int64); @@ -1562,7 +1562,7 @@ begin else TempFrame := FBrowser.MainFrame; - if (TempFrame <> nil) then TempFrame.LoadUrl(aURL); + if (TempFrame <> nil) and TempFrame.IsValid then TempFrame.LoadUrl(aURL); end; end; @@ -1573,7 +1573,7 @@ begin if Initialized then begin TempFrame := FBrowser.MainFrame; - if (TempFrame <> nil) then TempFrame.LoadString(aString, aURL); + if (TempFrame <> nil) and TempFrame.IsValid then TempFrame.LoadString(aString, aURL); end; end; @@ -1584,7 +1584,7 @@ begin if Initialized then begin TempFrame := FBrowser.MainFrame; - if (TempFrame <> nil) then TempFrame.LoadRequest(aRequest); + if (TempFrame <> nil) and TempFrame.IsValid then TempFrame.LoadRequest(aRequest); end; end; @@ -1774,7 +1774,7 @@ begin if Initialized then begin TempFrame := FBrowser.MainFrame; - if (TempFrame <> nil) then Result := TempFrame.URL; + if (TempFrame <> nil) and TempFrame.IsValid then Result := TempFrame.URL; end; end; @@ -2235,7 +2235,7 @@ begin else TempFrame := FBrowser.MainFrame; - if (TempFrame <> nil) then + if (TempFrame <> nil) and TempFrame.IsValid then try TempVisitor := TCustomCefStringVisitor.Create(self); TempFrame.GetSource(TempVisitor); @@ -2249,7 +2249,7 @@ procedure TFMXChromium.RetrieveHTML(const aFrame : ICefFrame); var TempVisitor : ICefStringVisitor; begin - if Initialized and (aFrame <> nil) then + if Initialized and (aFrame <> nil) and aFrame.IsValid then try TempVisitor := TCustomCefStringVisitor.Create(self); aFrame.GetSource(TempVisitor); @@ -2270,7 +2270,7 @@ begin else TempFrame := FBrowser.MainFrame; - if (TempFrame <> nil) then + if (TempFrame <> nil) and TempFrame.IsValid then try TempVisitor := TCustomCefStringVisitor.Create(self); TempFrame.GetSource(TempVisitor); @@ -2293,7 +2293,7 @@ begin else TempFrame := FBrowser.MainFrame; - if (TempFrame <> nil) then + if (TempFrame <> nil) and TempFrame.IsValid then try TempVisitor := TCustomCefStringVisitor.Create(self); TempFrame.GetText(TempVisitor); @@ -2307,7 +2307,7 @@ procedure TFMXChromium.RetrieveText(const aFrame : ICefFrame); var TempVisitor : ICefStringVisitor; begin - if Initialized and (aFrame <> nil) then + if Initialized and (aFrame <> nil) and aFrame.IsValid then try TempVisitor := TCustomCefStringVisitor.Create(self); aFrame.GetText(TempVisitor); @@ -2328,7 +2328,7 @@ begin else TempFrame := FBrowser.MainFrame; - if (TempFrame <> nil) then + if (TempFrame <> nil) and TempFrame.IsValid then try TempVisitor := TCustomCefStringVisitor.Create(self); TempFrame.GetText(TempVisitor); @@ -3157,7 +3157,7 @@ begin else TempFrame := FBrowser.MainFrame; - if (TempFrame <> nil) then + if (TempFrame <> nil) and TempFrame.IsValid then TempFrame.ExecuteJavaScript(aCode, aScriptURL, aStartLine); end; except @@ -3169,7 +3169,7 @@ end; procedure TFMXChromium.ExecuteJavaScript(const aCode, aScriptURL : ustring; const aFrame : ICefFrame; aStartLine : integer); begin try - if Initialized and (aFrame <> nil) then + if Initialized and (aFrame <> nil) and aFrame.IsValid then aFrame.ExecuteJavaScript(aCode, aScriptURL, aStartLine); except on e : exception do @@ -3189,7 +3189,7 @@ begin else TempFrame := FBrowser.MainFrame; - if (TempFrame <> nil) then + if (TempFrame <> nil) and TempFrame.IsValid then TempFrame.ExecuteJavaScript(aCode, aScriptURL, aStartLine); end; except @@ -4305,7 +4305,7 @@ begin else TempFrame := FBrowser.MainFrame; - if (TempFrame <> nil) then + if (TempFrame <> nil) and TempFrame.IsValid then TempFrame.SendProcessMessage(targetProcess, ProcMessage); end; except @@ -4317,7 +4317,7 @@ end; procedure TFMXChromium.SendProcessMessage(targetProcess: TCefProcessId; const ProcMessage: ICefProcessMessage; const aFrame : ICefFrame); begin try - if Initialized and (aFrame <> nil) then + if Initialized and (aFrame <> nil) and aFrame.IsValid then aFrame.SendProcessMessage(targetProcess, ProcMessage); except on e : exception do @@ -4337,7 +4337,7 @@ begin else TempFrame := FBrowser.MainFrame; - if (TempFrame <> nil) then + if (TempFrame <> nil) and TempFrame.IsValid then TempFrame.SendProcessMessage(targetProcess, ProcMessage); end; except @@ -4360,7 +4360,7 @@ begin else TempFrame := FBrowser.MainFrame; - if (TempFrame <> nil) then + if (TempFrame <> nil) and TempFrame.IsValid then Result := TempFrame.CreateUrlRequest(request, client); end; except @@ -4374,7 +4374,7 @@ begin Result := nil; try - if Initialized and (aFrame <> nil) then + if Initialized and (aFrame <> nil) and aFrame.IsValid then Result := aFrame.CreateUrlRequest(request, client); except on e : exception do @@ -4396,7 +4396,7 @@ begin else TempFrame := FBrowser.MainFrame; - if (TempFrame <> nil) then + if (TempFrame <> nil) and TempFrame.IsValid then Result := TempFrame.CreateUrlRequest(request, client); end; except diff --git a/source/uCEFMiscFunctions.pas b/source/uCEFMiscFunctions.pas index a4187272..8bffb48e 100644 --- a/source/uCEFMiscFunctions.pas +++ b/source/uCEFMiscFunctions.pas @@ -241,6 +241,9 @@ function DeleteDirContents(const aDirectory : string; const aExcludeFiles : TStr function DeleteFileList(const aFileList : TStringList) : boolean; function MoveFileList(const aFileList : TStringList; const aSrcDirectory, aDstDirectory : string) : boolean; +function CefGetDataURI(const aString, aMimeType : ustring) : ustring; overload; +function CefGetDataURI(aData : pointer; aSize : integer; const aMimeType : ustring; const aCharset : ustring = '') : ustring; overload; + implementation uses @@ -2132,4 +2135,25 @@ begin end; end; +function CefGetDataURI(const aString, aMimeType : ustring) : ustring; +var + TempUTF : AnsiString; +begin + TempUTF := UTF8Encode(aString); + + if (length(TempUTF) > 0) then + Result := CefGetDataURI(@TempUTF[1], length(TempUTF), aMimeType, 'utf-8') + else + Result := ''; +end; + +function CefGetDataURI(aData : pointer; aSize : integer; const aMimeType, aCharset : ustring) : ustring; +begin + Result := 'data:' + aMimeType; + + if (length(aCharset) > 0) then Result := Result + ';charset=' + aCharset; + + Result := Result + ';base64,' + CefURIEncode(CefBase64Encode(aData, aSize), false); +end; + end. diff --git a/source/uCEFRequestHandler.pas b/source/uCEFRequestHandler.pas index 0df7a1f5..d5f9667b 100644 --- a/source/uCEFRequestHandler.pas +++ b/source/uCEFRequestHandler.pas @@ -163,8 +163,8 @@ begin Result := nil; TempResourceRequestHandler := nil; TempObject := CefGetObject(self); - TempDisableDefHandling := disable_default_handling^ <> 0; - + TempDisableDefHandling := disable_default_handling^ <> 0; + if (TempObject <> nil) and (TempObject is TCefRequestHandlerOwn) then try TCefRequestHandlerOwn(TempObject).GetResourceRequestHandler(TCefBrowserRef.UnWrap(browser), @@ -485,8 +485,8 @@ end; procedure TCustomRequestHandler.InitializeVars; begin - FResourceRequestHandler := nil; - FEvents := nil; + FResourceRequestHandler := nil; + FEvents := nil; end; function TCustomRequestHandler.GetAuthCredentials(const browser : ICefBrowser; @@ -552,32 +552,32 @@ var TempUseInternalHandler : boolean; begin if (FEvents <> nil) then - begin - TempUseInternalHandler := True; - - IChromiumEvents(FEvents).doOnGetResourceRequestHandler(browser, frame, request, - is_navigation, is_download, - request_initiator, - disable_default_handling, - aResourceRequestHandler, - TempUseInternalHandler); - - if TempUseInternalHandler then - begin - if (FResourceRequestHandler <> nil) then - aResourceRequestHandler := FResourceRequestHandler - else - aResourceRequestHandler := nil; - end; - end - else + begin + TempUseInternalHandler := True; + + IChromiumEvents(FEvents).doOnGetResourceRequestHandler(browser, frame, request, + is_navigation, is_download, + request_initiator, + disable_default_handling, + aResourceRequestHandler, + TempUseInternalHandler); + + if TempUseInternalHandler then + begin + if (FResourceRequestHandler <> nil) then + aResourceRequestHandler := FResourceRequestHandler + else + aResourceRequestHandler := nil; + end; + end + else inherited GetResourceRequestHandler(browser, frame, request, is_navigation, is_download, request_initiator, disable_default_handling, aResourceRequestHandler); end; - + function TCustomRequestHandler.OnSelectClientCertificate(const browser : ICefBrowser; isProxy : boolean; const host : ustring; diff --git a/update_CEF4Delphi.json b/update_CEF4Delphi.json index 21efc087..80e36aae 100644 --- a/update_CEF4Delphi.json +++ b/update_CEF4Delphi.json @@ -1,8 +1,8 @@ { "UpdateLazPackages" : [ { - "ForceNotify" : false, - "InternalVersion" : 42, + "ForceNotify" : true, + "InternalVersion" : 43, "Name" : "cef4delphi_lazarus.lpk", "Version" : "77.1.13.0" } From 4d994de2e9f937a389b74164837d1320d1312a81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Salvador=20D=C3=ADaz=20Fau?= Date: Mon, 14 Oct 2019 15:39:27 +0200 Subject: [PATCH 12/13] Fixed the CustomResourceHandler demo - Added TCEFSentinel to more demos --- .../uCustomResourceHandler.pas | 2 +- .../CustomResourceBrowser/uMainForm.pas | 17 ---- .../uPostInspectorBrowser.pas | 1 - .../uSimpleExternalPumpBrowser.pas | 6 +- demos/Lazarus/CookieVisitor/CookieVisitor.lps | 16 +++- .../Lazarus/CookieVisitor/uCookieVisitor.lfm | 5 ++ .../Lazarus/CookieVisitor/uCookieVisitor.pas | 17 +++- .../CustomResourceBrowser/CRBrowser.lps | 46 +++++----- .../uCustomResourceHandler.pas | 2 +- .../CustomResourceBrowser/uMainForm.lfm | 9 +- .../CustomResourceBrowser/uMainForm.pas | 22 +++-- demos/Lazarus/DOMVisitor/DOMVisitor.lps | 67 +++++++------- demos/Lazarus/DOMVisitor/uDOMVisitor.lfm | 5 ++ demos/Lazarus/DOMVisitor/uDOMVisitor.pas | 16 +++- demos/Lazarus/EditorBrowser/EditorBrowser.lps | 18 +++- .../Lazarus/EditorBrowser/uEditorBrowser.lfm | 5 ++ .../Lazarus/EditorBrowser/uEditorBrowser.pas | 19 +++- .../ExternalPumpBrowser.lps | 26 +++++- .../uExternalPumpBrowser.lfm | 6 +- .../uExternalPumpBrowser.pas | 20 +++-- .../FullScreenBrowser/FullScreenBrowser.lps | 14 ++- demos/Lazarus/FullScreenBrowser/uMainForm.lfm | 5 ++ demos/Lazarus/FullScreenBrowser/uMainForm.pas | 23 ++++- .../JavaScript/JSDialog/JSDialogBrowser.lps | 30 ++++++- .../JavaScript/JSDialog/uJSDialogBrowser.lfm | 5 ++ .../JavaScript/JSDialog/uJSDialogBrowser.pas | 44 ++++++---- demos/Lazarus/JavaScript/JSEval/JSEval.lps | 78 ++++++++--------- demos/Lazarus/JavaScript/JSEval/uJSEval.lfm | 5 ++ demos/Lazarus/JavaScript/JSEval/uJSEval.pas | 20 +++-- .../JSExecutingFunctions.lps | 14 ++- .../uJSExecutingFunctions.lfm | 5 ++ .../uJSExecutingFunctions.pas | 19 +++- .../JavaScript/JSExtension/JSExtension.lps | 87 ++++++++++++------- .../JavaScript/JSExtension/uJSExtension.lfm | 5 ++ .../JavaScript/JSExtension/uJSExtension.pas | 13 ++- .../JSExtensionWithFunction.lps | 14 ++- .../uJSExtensionWithFunction.lfm | 5 ++ .../uJSExtensionWithFunction.pas | 19 +++- .../JSExtensionWithObjectParameter.lps | 14 ++- .../uJSExtensionWithObjectParameter.lfm | 5 ++ .../uJSExtensionWithObjectParameter.pas | 19 +++- .../JSSimpleExtension/JSSimpleExtension.lps | 18 +++- .../JSSimpleExtension/uJSSimpleExtension.lfm | 5 ++ .../JSSimpleExtension/uJSSimpleExtension.pas | 19 +++- .../JSSimpleWindowBinding.lps | 34 +++++++- .../uJSSimpleWindowBinding.lfm | 5 ++ .../uJSSimpleWindowBinding.pas | 19 +++- .../JSSimpleWindowBinding.lps | 18 ++-- .../uJSSimpleWindowBinding.lfm | 7 +- .../uJSSimpleWindowBinding.pas | 19 +++- .../JSWindowBindingWithArrayBuffer.lps | 14 ++- .../uJSWindowBindingWithArrayBuffer.lfm | 5 ++ .../uJSWindowBindingWithArrayBuffer.pas | 19 +++- .../JSWindowBindingWithFunction.lps | 26 +++++- .../uJSWindowBindingWithFunction.lfm | 5 ++ .../uJSWindowBindingWithFunction.pas | 19 +++- .../JSWindowBindingWithObject.lps | 14 ++- .../uJSWindowBindingWithObject.lfm | 5 ++ .../uJSWindowBindingWithObject.pas | 19 +++- demos/Lazarus/MiniBrowser/MiniBrowser.lps | 4 +- demos/Lazarus/MiniBrowser/uMiniBrowser.pas | 4 +- .../OSRExternalPumpBrowser.lps | 72 +++++++-------- .../uOSRExternalPumpBrowser.lfm | 5 ++ .../uOSRExternalPumpBrowser.pas | 38 ++++---- demos/Lazarus/PopupBrowser/PopupBrowser.lps | 14 ++- demos/Lazarus/PopupBrowser/uMainForm.lfm | 9 +- demos/Lazarus/PopupBrowser/uMainForm.pas | 14 ++- demos/Lazarus/PopupBrowser2/PopupBrowser2.lps | 70 +++++++-------- demos/Lazarus/PopupBrowser2/uMainForm.lfm | 5 ++ demos/Lazarus/PopupBrowser2/uMainForm.pas | 17 +++- .../PostInspectorBrowser.lps | 22 +++-- .../uPostInspectorBrowser.lfm | 5 ++ .../uPostInspectorBrowser.pas | 21 +++-- .../SchemeRegistrationBrowser.lps | 14 ++- .../uSchemeRegistrationBrowser.lfm | 5 ++ .../uSchemeRegistrationBrowser.pas | 19 +++- demos/Lazarus/SimpleBrowser/SimpleBrowser.lps | 14 ++- .../Lazarus/SimpleBrowser/uSimpleBrowser.lfm | 5 ++ .../Lazarus/SimpleBrowser/uSimpleBrowser.pas | 25 ++++-- .../Lazarus/SimpleBrowser2/SimpleBrowser2.lps | 12 +-- .../SimpleBrowser2/usimplelazarusbrowser.pas | 7 ++ .../SimpleExternalPumpBrowser.lps | 14 ++- .../uSimpleExternalPumpBrowser.lfm | 5 ++ .../uSimpleExternalPumpBrowser.pas | 25 ++++-- .../SimpleOSRBrowser/SimpleOSRBrowser.lps | 20 ++++- .../SimpleOSRBrowser/usimplelazosrbrowser.lfm | 5 ++ .../SimpleOSRBrowser/usimplelazosrbrowser.pas | 21 +++-- demos/Lazarus/SubProcess/SimpleBrowser.lps | 18 ++-- demos/Lazarus/SubProcess/uSimpleBrowser.lfm | 7 +- demos/Lazarus/SubProcess/uSimpleBrowser.pas | 25 ++++-- demos/Lazarus/TabbedBrowser/TabBrowser.lps | 6 +- demos/Lazarus/TabbedBrowser/uMainForm.pas | 4 +- .../Lazarus/ToolBoxBrowser/ToolBoxBrowser.lps | 8 +- demos/Lazarus/ToolBoxBrowser/uMainForm.pas | 3 +- demos/Lazarus/URLRequest/URLRequest.lps | 47 +++++----- demos/Lazarus/URLRequest/uURLRequest.lfm | 5 ++ demos/Lazarus/URLRequest/uURLRequest.pas | 19 ++-- source/uCEFChromium.pas | 18 ++-- update_CEF4Delphi.json | 2 +- 99 files changed, 1179 insertions(+), 512 deletions(-) diff --git a/demos/Delphi_VCL/CustomResourceBrowser/uCustomResourceHandler.pas b/demos/Delphi_VCL/CustomResourceBrowser/uCustomResourceHandler.pas index e2fd7608..ede02872 100644 --- a/demos/Delphi_VCL/CustomResourceBrowser/uCustomResourceHandler.pas +++ b/demos/Delphi_VCL/CustomResourceBrowser/uCustomResourceHandler.pas @@ -159,7 +159,7 @@ begin if (FStream <> nil) and (DataOut <> nil) then begin BytesRead := FStream.Read(DataOut^, BytesToRead); - Result := True; + Result := (BytesRead > 0); end else Result := False; diff --git a/demos/Delphi_VCL/CustomResourceBrowser/uMainForm.pas b/demos/Delphi_VCL/CustomResourceBrowser/uMainForm.pas index 11884096..293531ee 100644 --- a/demos/Delphi_VCL/CustomResourceBrowser/uMainForm.pas +++ b/demos/Delphi_VCL/CustomResourceBrowser/uMainForm.pas @@ -88,7 +88,6 @@ type procedure Chromium_OnAfterCreated(Sender: TObject); procedure Chromium_OnGetResourceHandler(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; var aResourceHandler : ICefResourceHandler); procedure Chromium_OnBeforePopup(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const targetUrl, targetFrameName: ustring; targetDisposition: TCefWindowOpenDisposition; userGesture: Boolean; const popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo; var client: ICefClient; var settings: TCefBrowserSettings; var extra_info: ICefDictionaryValue; var noJavascriptAccess: Boolean; var Result: Boolean); - procedure Chromium_OnGetResourceRequestHandler(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; var aUseInternalResourceRequestHandler : boolean); public { Public declarations } @@ -163,7 +162,6 @@ procedure TMainForm.FormShow(Sender: TObject); begin ChromiumWindow1.OnAfterCreated := Chromium_OnAfterCreated; ChromiumWindow1.ChromiumBrowser.OnGetResourceHandler := Chromium_OnGetResourceHandler; - ChromiumWindow1.ChromiumBrowser.OnGetResourceRequestHandler := Chromium_OnGetResourceRequestHandler; ChromiumWindow1.ChromiumBrowser.OnBeforePopup := Chromium_OnBeforePopup; // GlobalCEFApp.GlobalContextInitialized has to be TRUE before creating any browser @@ -229,21 +227,6 @@ begin Result := (targetDisposition in [WOD_NEW_FOREGROUND_TAB, WOD_NEW_BACKGROUND_TAB, WOD_NEW_POPUP, WOD_NEW_WINDOW]); end; -procedure TMainForm.Chromium_OnGetResourceRequestHandler( Sender : TObject; - const browser : ICefBrowser; - const frame : ICefFrame; - const request : ICefRequest; - is_navigation : boolean; - is_download : boolean; - const request_initiator : ustring; - var disable_default_handling : boolean; - var aExternalResourceRequestHandler : ICefResourceRequestHandler; - var aUseInternalResourceRequestHandler : boolean); -begin - disable_default_handling := True; - aUseInternalResourceRequestHandler := True; -end; - procedure TMainForm.WMMove(var aMessage : TWMMove); begin inherited; diff --git a/demos/Delphi_VCL/PostInspectorBrowser/uPostInspectorBrowser.pas b/demos/Delphi_VCL/PostInspectorBrowser/uPostInspectorBrowser.pas index 8ade34a5..315bd2ca 100644 --- a/demos/Delphi_VCL/PostInspectorBrowser/uPostInspectorBrowser.pas +++ b/demos/Delphi_VCL/PostInspectorBrowser/uPostInspectorBrowser.pas @@ -138,7 +138,6 @@ uses // After the request has been handled we send a custom message to the form (CEF_SHOWDATA) // to add the information to the TMemo safely in the main thread. - // Destruction steps // ================= // 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. diff --git a/demos/Delphi_VCL/SimpleExternalPumpBrowser/uSimpleExternalPumpBrowser.pas b/demos/Delphi_VCL/SimpleExternalPumpBrowser/uSimpleExternalPumpBrowser.pas index aa1882bf..60c9a322 100644 --- a/demos/Delphi_VCL/SimpleExternalPumpBrowser/uSimpleExternalPumpBrowser.pas +++ b/demos/Delphi_VCL/SimpleExternalPumpBrowser/uSimpleExternalPumpBrowser.pas @@ -190,11 +190,7 @@ end; procedure TSimpleExternalPumpBrowserFrm.ChromiumWindow1Close(Sender: TObject); begin // DestroyChildWindow will destroy the child window created by CEF at the top of the Z order. - if not(ChromiumWindow1.DestroyChildWindow) then - begin - FCanClose := True; - Close; - end; + if not(ChromiumWindow1.DestroyChildWindow) then CEFSentinel1.Start; end; procedure TSimpleExternalPumpBrowserFrm.GoBtnClick(Sender: TObject); diff --git a/demos/Lazarus/CookieVisitor/CookieVisitor.lps b/demos/Lazarus/CookieVisitor/CookieVisitor.lps index e96ecdf8..5730d376 100644 --- a/demos/Lazarus/CookieVisitor/CookieVisitor.lps +++ b/demos/Lazarus/CookieVisitor/CookieVisitor.lps @@ -8,7 +8,7 @@ - + @@ -22,8 +22,8 @@ - - + + @@ -48,7 +48,7 @@ - + @@ -96,6 +96,14 @@ + + + + + + + + diff --git a/demos/Lazarus/CookieVisitor/uCookieVisitor.lfm b/demos/Lazarus/CookieVisitor/uCookieVisitor.lfm index 405a51f5..ec0d20f2 100644 --- a/demos/Lazarus/CookieVisitor/uCookieVisitor.lfm +++ b/demos/Lazarus/CookieVisitor/uCookieVisitor.lfm @@ -75,4 +75,9 @@ object CookieVisitorFrm: TCookieVisitorFrm left = 32 top = 280 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + left = 32 + top = 352 + end end diff --git a/demos/Lazarus/CookieVisitor/uCookieVisitor.pas b/demos/Lazarus/CookieVisitor/uCookieVisitor.pas index 464c21f9..2a79fb69 100644 --- a/demos/Lazarus/CookieVisitor/uCookieVisitor.pas +++ b/demos/Lazarus/CookieVisitor/uCookieVisitor.pas @@ -50,7 +50,7 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFApplication, uCEFTypes, uCEFConstants, - uCEFCookieManager, uCEFCookieVisitor, uCEFWinControl; + uCEFCookieManager, uCEFCookieVisitor, uCEFWinControl, uCEFSentinel; const MINIBROWSER_SHOWCOOKIES = WM_APP + $101; @@ -61,13 +61,18 @@ const MINIBROWSER_CONTEXTMENU_SETCOOKIE = MENU_ID_USER_FIRST + 3; type + + { TCookieVisitorFrm } + TCookieVisitorFrm = class(TForm) AddressBarPnl: TPanel; + CEFSentinel1: TCEFSentinel; Edit1: TEdit; GoBtn: TButton; CEFWindowParent1: TCEFWindowParent; Chromium1: TChromium; Timer1: TTimer; + procedure CEFSentinel1Close(Sender: TObject); procedure Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); procedure FormShow(Sender: TObject); procedure GoBtnClick(Sender: TObject); @@ -141,7 +146,8 @@ uses // ================= // 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. // 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. -// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form. +// 3. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure CreateGlobalCEFApp; begin @@ -234,12 +240,17 @@ begin PostMessage(Handle, CEF_AFTERCREATED, 0, 0); end; -procedure TCookieVisitorFrm.Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); +procedure TCookieVisitorFrm.CEFSentinel1Close(Sender: TObject); begin FCanClose := True; PostMessage(Handle, WM_CLOSE, 0, 0); end; +procedure TCookieVisitorFrm.Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); +begin + CEFSentinel1.Start; +end; + procedure TCookieVisitorFrm.Chromium1BeforeContextMenu(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const params: ICefContextMenuParams; const model: ICefMenuModel); diff --git a/demos/Lazarus/CustomResourceBrowser/CRBrowser.lps b/demos/Lazarus/CustomResourceBrowser/CRBrowser.lps index 11fd40a6..38f9607d 100644 --- a/demos/Lazarus/CustomResourceBrowser/CRBrowser.lps +++ b/demos/Lazarus/CustomResourceBrowser/CRBrowser.lps @@ -8,7 +8,7 @@ - + @@ -21,9 +21,9 @@ - - - + + + @@ -32,11 +32,11 @@ - - - - + + + + @@ -56,22 +56,20 @@ - + - - + - - + @@ -108,25 +106,33 @@ - - + + - + - + - + - - + + + + + + + + + + diff --git a/demos/Lazarus/CustomResourceBrowser/uCustomResourceHandler.pas b/demos/Lazarus/CustomResourceBrowser/uCustomResourceHandler.pas index 63b007f7..5a6d19af 100644 --- a/demos/Lazarus/CustomResourceBrowser/uCustomResourceHandler.pas +++ b/demos/Lazarus/CustomResourceBrowser/uCustomResourceHandler.pas @@ -131,7 +131,7 @@ begin if (FStream <> nil) and (DataOut <> nil) then begin BytesRead := FStream.Read(DataOut^, BytesToRead); - Result := True; + Result := (BytesRead > 0); end else Result := False; diff --git a/demos/Lazarus/CustomResourceBrowser/uMainForm.lfm b/demos/Lazarus/CustomResourceBrowser/uMainForm.lfm index aba73b58..52a5d019 100644 --- a/demos/Lazarus/CustomResourceBrowser/uMainForm.lfm +++ b/demos/Lazarus/CustomResourceBrowser/uMainForm.lfm @@ -1,7 +1,7 @@ object MainForm: TMainForm - Left = 386 + Left = 377 Height = 658 - Top = 91 + Top = 131 Width = 781 Caption = 'Custom Resource Browser' ClientHeight = 658 @@ -66,4 +66,9 @@ object MainForm: TMainForm left = 48 top = 240 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + left = 48 + top = 320 + end end diff --git a/demos/Lazarus/CustomResourceBrowser/uMainForm.pas b/demos/Lazarus/CustomResourceBrowser/uMainForm.pas index 9c25651b..bf32297b 100644 --- a/demos/Lazarus/CustomResourceBrowser/uMainForm.pas +++ b/demos/Lazarus/CustomResourceBrowser/uMainForm.pas @@ -50,19 +50,21 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFChromiumWindow, uCEFInterfaces, uCustomResourceHandler, - uCEFConstants, uCEFTypes; + uCEFConstants, uCEFTypes, uCEFSentinel; type { TMainForm } TMainForm = class(TForm) + CEFSentinel1: TCEFSentinel; ChromiumWindow1: TChromiumWindow; AddressBarPnl: TPanel; Edit1: TEdit; Button1: TButton; Timer1: TTimer; + procedure CEFSentinel1Close(Sender: TObject); procedure ChromiumWindow1AfterCreated(Sender: TObject); procedure FormShow(Sender: TObject); procedure Button1Click(Sender: TObject); @@ -107,7 +109,8 @@ uses // ================= // 1. The FormCloseQuery event sets CanClose to False and calls TChromiumWindow.CloseBrowser, which triggers the TChromiumWindow.OnClose event. // 2. The TChromiumWindow.OnClose event calls TChromiumWindow.DestroyChildWindow which triggers the TChromiumWindow.OnBeforeClose event. -// 3. TChromiumWindow.OnBeforeClose sets FCanClose to True and closes the form. +// 3. TChromiumWindow.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure CreateGlobalCEFApp; begin @@ -155,6 +158,12 @@ begin end; +procedure TMainForm.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TMainForm.Timer1Timer(Sender: TObject); begin Timer1.Enabled := False; @@ -164,18 +173,13 @@ end; procedure TMainForm.ChromiumWindow1BeforeClose(Sender: TObject); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TMainForm.ChromiumWindow1Close(Sender: TObject); begin // DestroyChildWindow will destroy the child window created by CEF at the top of the Z order. - if not(ChromiumWindow1.DestroyChildWindow) then - begin - FCanClose := True; - Close; - end; + if not(ChromiumWindow1.DestroyChildWindow) then CEFSentinel1.Start; end; procedure TMainForm.Chromium_OnAfterCreated(Sender: TObject); diff --git a/demos/Lazarus/DOMVisitor/DOMVisitor.lps b/demos/Lazarus/DOMVisitor/DOMVisitor.lps index 0983734f..3b2aa06d 100644 --- a/demos/Lazarus/DOMVisitor/DOMVisitor.lps +++ b/demos/Lazarus/DOMVisitor/DOMVisitor.lps @@ -22,8 +22,8 @@ - - + + @@ -61,45 +61,46 @@ - + - + + - + - + - + - + - + - + - + - + - + @@ -107,46 +108,46 @@ - + - + - + - + - + - + - + - + - + - + @@ -154,28 +155,32 @@ - + - + - + - + - - - - + + + + + + + + diff --git a/demos/Lazarus/DOMVisitor/uDOMVisitor.lfm b/demos/Lazarus/DOMVisitor/uDOMVisitor.lfm index 262dea8b..1a77d978 100644 --- a/demos/Lazarus/DOMVisitor/uDOMVisitor.lfm +++ b/demos/Lazarus/DOMVisitor/uDOMVisitor.lfm @@ -104,4 +104,9 @@ object DOMVisitorFrm: TDOMVisitorFrm left = 16 top = 96 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + left = 16 + top = 160 + end end diff --git a/demos/Lazarus/DOMVisitor/uDOMVisitor.pas b/demos/Lazarus/DOMVisitor/uDOMVisitor.pas index ab682af8..2f98af19 100644 --- a/demos/Lazarus/DOMVisitor/uDOMVisitor.pas +++ b/demos/Lazarus/DOMVisitor/uDOMVisitor.pas @@ -47,7 +47,7 @@ uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Menus, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Types, ComCtrls, ClipBrd, uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFApplication, uCEFTypes, uCEFConstants, - uCEFWinControl; + uCEFWinControl, uCEFSentinel; const MINIBROWSER_VISITDOM_PARTIAL = WM_APP + $101; @@ -66,6 +66,7 @@ type { TDOMVisitorFrm } TDOMVisitorFrm = class(TForm) + CEFSentinel1: TCEFSentinel; CEFWindowParent1: TCEFWindowParent; Chromium1: TChromium; AddressBarPnl: TPanel; @@ -75,6 +76,7 @@ type Panel1: TPanel; GoBtn: TButton; VisitDOMBtn: TButton; + procedure CEFSentinel1Close(Sender: TObject); procedure GoBtnClick(Sender: TObject); procedure FormShow(Sender: TObject); procedure Chromium1AfterCreated(Sender: TObject; @@ -157,7 +159,8 @@ uses // ================= // 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. // 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. -// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form. +// 3. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure SimpleDOMIteration(const aDocument: ICefDomDocument); var @@ -325,8 +328,7 @@ end; procedure TDOMVisitorFrm.Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TDOMVisitorFrm.Chromium1BeforeContextMenu(Sender: TObject; @@ -429,6 +431,12 @@ begin Chromium1.LoadURL(AddressEdt.Text); end; +procedure TDOMVisitorFrm.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TDOMVisitorFrm.BrowserCreatedMsg(var aMessage : TMessage); begin CEFWindowParent1.UpdateSize; diff --git a/demos/Lazarus/EditorBrowser/EditorBrowser.lps b/demos/Lazarus/EditorBrowser/EditorBrowser.lps index 0c446ebd..9fee6355 100644 --- a/demos/Lazarus/EditorBrowser/EditorBrowser.lps +++ b/demos/Lazarus/EditorBrowser/EditorBrowser.lps @@ -20,8 +20,8 @@ - - + + @@ -35,7 +35,7 @@ - + @@ -60,6 +60,18 @@ + + + + + + + + + + + + diff --git a/demos/Lazarus/EditorBrowser/uEditorBrowser.lfm b/demos/Lazarus/EditorBrowser/uEditorBrowser.lfm index e934c88c..5810ffef 100644 --- a/demos/Lazarus/EditorBrowser/uEditorBrowser.lfm +++ b/demos/Lazarus/EditorBrowser/uEditorBrowser.lfm @@ -987,4 +987,9 @@ object Form1: TForm1 left = 128 top = 200 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + left = 56 + top = 272 + end end diff --git a/demos/Lazarus/EditorBrowser/uEditorBrowser.pas b/demos/Lazarus/EditorBrowser/uEditorBrowser.pas index 0359c653..c577aeec 100644 --- a/demos/Lazarus/EditorBrowser/uEditorBrowser.pas +++ b/demos/Lazarus/EditorBrowser/uEditorBrowser.pas @@ -48,10 +48,14 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ToolWin, ComCtrls, ImgList, uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFConstants, uCEFTypes, - uCEFWinControl; + uCEFWinControl, uCEFSentinel; type + + { TForm1 } + TForm1 = class(TForm) + CEFSentinel1: TCEFSentinel; Timer1: TTimer; Chromium1: TChromium; CEFWindowParent1: TCEFWindowParent; @@ -88,6 +92,7 @@ type OutdentBtn: TToolButton; Separator7: TToolButton; + procedure CEFSentinel1Close(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure FormShow(Sender: TObject); @@ -166,7 +171,8 @@ uses // ================= // 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. // 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. -// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form. +// 3. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure CreateGlobalCEFApp; begin @@ -231,8 +237,7 @@ end; procedure TForm1.Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TForm1.Chromium1Close(Sender: TObject; @@ -436,6 +441,12 @@ begin Timer1.Enabled := True; end; +procedure TForm1.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TForm1.OpenBtnClick(Sender: TObject); begin OpenDialog1.Filter := 'HTML Files (*.html)|*.HTML'; diff --git a/demos/Lazarus/ExternalPumpBrowser/ExternalPumpBrowser.lps b/demos/Lazarus/ExternalPumpBrowser/ExternalPumpBrowser.lps index 2b847811..b40ba9b6 100644 --- a/demos/Lazarus/ExternalPumpBrowser/ExternalPumpBrowser.lps +++ b/demos/Lazarus/ExternalPumpBrowser/ExternalPumpBrowser.lps @@ -22,8 +22,8 @@ - - + + @@ -46,7 +46,7 @@ - + @@ -85,6 +85,26 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/demos/Lazarus/ExternalPumpBrowser/uExternalPumpBrowser.lfm b/demos/Lazarus/ExternalPumpBrowser/uExternalPumpBrowser.lfm index f05e47e7..b7514dd6 100644 --- a/demos/Lazarus/ExternalPumpBrowser/uExternalPumpBrowser.lfm +++ b/demos/Lazarus/ExternalPumpBrowser/uExternalPumpBrowser.lfm @@ -74,7 +74,6 @@ object ExternalPumpBrowserFrm: TExternalPumpBrowserFrm Width = 1038 Align = alClient TabOrder = 1 - OnResize = CEFWindowParent1Resize end object Timer1: TTimer Enabled = False @@ -91,4 +90,9 @@ object ExternalPumpBrowserFrm: TExternalPumpBrowserFrm left = 56 top = 152 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + left = 56 + top = 216 + end end diff --git a/demos/Lazarus/ExternalPumpBrowser/uExternalPumpBrowser.pas b/demos/Lazarus/ExternalPumpBrowser/uExternalPumpBrowser.pas index 517dce46..ebc378b0 100644 --- a/demos/Lazarus/ExternalPumpBrowser/uExternalPumpBrowser.pas +++ b/demos/Lazarus/ExternalPumpBrowser/uExternalPumpBrowser.pas @@ -50,7 +50,7 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFTypes, uCEFConstants, uCEFInterfaces, uCEFWorkScheduler, - uCEFWinControl; + uCEFWinControl, uCEFSentinel; type @@ -58,13 +58,14 @@ type TExternalPumpBrowserFrm = class(TForm) AddressPnl: TPanel; + CEFSentinel1: TCEFSentinel; GoBtn: TButton; Timer1: TTimer; CEFWindowParent1: TCEFWindowParent; Chromium1: TChromium; URLCbx: TComboBox; - procedure CEFWindowParent1Resize(Sender: TObject); + procedure CEFSentinel1Close(Sender: TObject); procedure GoBtnClick(Sender: TObject); procedure FormShow(Sender: TObject); procedure Timer1Timer(Sender: TObject); @@ -114,6 +115,13 @@ uses // This demo has a simple browser with a TChromium + TCEFWindowParent combination // It was necessary to destroy the browser following the destruction sequence described in the MDIBrowser demo. +// Destruction steps +// ================= +// 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. +// 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. +// 3. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. + procedure GlobalCEFApp_OnScheduleMessagePumpWork(const aDelayMS : int64); begin if (GlobalCEFWorkScheduler <> nil) then GlobalCEFWorkScheduler.ScheduleMessagePumpWork(aDelayMS); @@ -167,8 +175,7 @@ end; procedure TExternalPumpBrowserFrm.Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TExternalPumpBrowserFrm.Chromium1BeforePopup(Sender: TObject; @@ -209,9 +216,10 @@ begin Chromium1.LoadURL(URLCbx.Text); end; -procedure TExternalPumpBrowserFrm.CEFWindowParent1Resize(Sender: TObject); +procedure TExternalPumpBrowserFrm.CEFSentinel1Close(Sender: TObject); begin - + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); end; procedure TExternalPumpBrowserFrm.Timer1Timer(Sender: TObject); diff --git a/demos/Lazarus/FullScreenBrowser/FullScreenBrowser.lps b/demos/Lazarus/FullScreenBrowser/FullScreenBrowser.lps index 8c79ffab..c848ef69 100644 --- a/demos/Lazarus/FullScreenBrowser/FullScreenBrowser.lps +++ b/demos/Lazarus/FullScreenBrowser/FullScreenBrowser.lps @@ -22,15 +22,15 @@ - - + + - + @@ -50,6 +50,14 @@ + + + + + + + + diff --git a/demos/Lazarus/FullScreenBrowser/uMainForm.lfm b/demos/Lazarus/FullScreenBrowser/uMainForm.lfm index 9aed59d9..553cb38f 100644 --- a/demos/Lazarus/FullScreenBrowser/uMainForm.lfm +++ b/demos/Lazarus/FullScreenBrowser/uMainForm.lfm @@ -43,4 +43,9 @@ object MainForm: TMainForm left = 272 top = 120 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + left = 344 + top = 120 + end end diff --git a/demos/Lazarus/FullScreenBrowser/uMainForm.pas b/demos/Lazarus/FullScreenBrowser/uMainForm.pas index 1dd36291..4c4ff972 100644 --- a/demos/Lazarus/FullScreenBrowser/uMainForm.pas +++ b/demos/Lazarus/FullScreenBrowser/uMainForm.pas @@ -51,13 +51,18 @@ uses Controls, Forms, Dialogs, ExtCtrls, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFTypes, uCEFConstants, - uCEFWinControl; + uCEFWinControl, uCEFSentinel; type + + { TMainForm } + TMainForm = class(TForm) + CEFSentinel1: TCEFSentinel; CEFWindowParent1: TCEFWindowParent; Chromium1: TChromium; Timer1: TTimer; + procedure CEFSentinel1Close(Sender: TObject); procedure Chromium1PreKeyEvent(Sender: TObject; const browser: ICefBrowser; const event: PCefKeyEvent; osEvent: PMsg; out isKeyboardShortcut, Result: Boolean); @@ -114,6 +119,13 @@ implementation uses uCEFApplication; +// Destruction steps +// ================= +// 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. +// 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. +// 3. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. + procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; @@ -166,8 +178,7 @@ end; procedure TMainForm.Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TMainForm.Chromium1BeforePopup(Sender: TObject; @@ -238,6 +249,12 @@ begin isKeyboardShortcut := True; end; +procedure TMainForm.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin CanClose := FCanClose; diff --git a/demos/Lazarus/JavaScript/JSDialog/JSDialogBrowser.lps b/demos/Lazarus/JavaScript/JSDialog/JSDialogBrowser.lps index d31fad69..4bf60c36 100644 --- a/demos/Lazarus/JavaScript/JSDialog/JSDialogBrowser.lps +++ b/demos/Lazarus/JavaScript/JSDialog/JSDialogBrowser.lps @@ -22,15 +22,15 @@ - - + + - + @@ -50,6 +50,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demos/Lazarus/JavaScript/JSDialog/uJSDialogBrowser.lfm b/demos/Lazarus/JavaScript/JSDialog/uJSDialogBrowser.lfm index 86b84546..4a281f73 100644 --- a/demos/Lazarus/JavaScript/JSDialog/uJSDialogBrowser.lfm +++ b/demos/Lazarus/JavaScript/JSDialog/uJSDialogBrowser.lfm @@ -65,4 +65,9 @@ object JSDialogBrowserFrm: TJSDialogBrowserFrm left = 56 top = 88 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + left = 128 + top = 88 + end end diff --git a/demos/Lazarus/JavaScript/JSDialog/uJSDialogBrowser.pas b/demos/Lazarus/JavaScript/JSDialog/uJSDialogBrowser.pas index cf1dc248..ce243d30 100644 --- a/demos/Lazarus/JavaScript/JSDialog/uJSDialogBrowser.pas +++ b/demos/Lazarus/JavaScript/JSDialog/uJSDialogBrowser.pas @@ -49,18 +49,24 @@ uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, SyncObjs, {$ENDIF} - uCEFChromium, uCEFWindowParent, uCEFChromiumWindow, uCEFInterfaces, uCEFTypes, uCEFConstants; + uCEFChromium, uCEFWindowParent, uCEFChromiumWindow, uCEFInterfaces, uCEFTypes, + uCEFConstants, uCEFSentinel; const CEFBROWSER_SHOWJSDIALOG = WM_APP + $101; type + + { TJSDialogBrowserFrm } + TJSDialogBrowserFrm = class(TForm) + CEFSentinel1: TCEFSentinel; ChromiumWindow1: TChromiumWindow; AddressPnl: TPanel; AddressEdt: TEdit; GoBtn: TButton; Timer1: TTimer; + procedure CEFSentinel1Close(Sender: TObject); procedure GoBtnClick(Sender: TObject); procedure FormShow(Sender: TObject); procedure ChromiumWindow1AfterCreated(Sender: TObject); @@ -113,8 +119,8 @@ uses // ================= // 1. The FormCloseQuery event sets CanClose to False and calls TChromiumWindow.CloseBrowser, which triggers the TChromiumWindow.OnClose event. // 2. The TChromiumWindow.OnClose event calls TChromiumWindow.DestroyChildWindow which triggers the TChromiumWindow.OnBeforeClose event. -// 3. TChromiumWindow.OnBeforeClose sets FCanClose to True and closes the form. - +// 3. TChromiumWindow.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure CreateGlobalCEFApp; begin @@ -176,6 +182,12 @@ begin ChromiumWindow1.LoadURL(AddressEdt.Text); end; +procedure TJSDialogBrowserFrm.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TJSDialogBrowserFrm.Timer1Timer(Sender: TObject); begin Timer1.Enabled := False; @@ -211,15 +223,14 @@ begin if (aMessage.wParam = 0) and (GlobalCEFApp <> nil) then GlobalCEFApp.OsmodalLoop := False; end; -procedure TJSDialogBrowserFrm.Chromium_OnJsdialog(Sender : TObject; - const browser : ICefBrowser; - const originUrl : ustring; - dialogType : TCefJsDialogType; - const messageText : ustring; - const defaultPromptText : ustring; - const callback : ICefJsDialogCallback; - out suppressMessage : Boolean; - out Result : Boolean); +procedure TJSDialogBrowserFrm.Chromium_OnJsdialog(Sender: TObject; + const browser: ICefBrowser; + const originUrl: ustring; + dialogType: TCefJsDialogType; + const messageText, defaultPromptText: ustring; + const callback: ICefJsDialogCallback; + out suppressMessage: Boolean; + out Result: Boolean); begin // In this event we must store the dialog information and post a message to the main form to show the dialog FJSDialogInfoCS.Acquire; @@ -248,18 +259,13 @@ end; procedure TJSDialogBrowserFrm.ChromiumWindow1BeforeClose(Sender: TObject); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TJSDialogBrowserFrm.ChromiumWindow1Close(Sender: TObject); begin // DestroyChildWindow will destroy the child window created by CEF at the top of the Z order. - if not(ChromiumWindow1.DestroyChildWindow) then - begin - FCanClose := True; - Close; - end; + if not(ChromiumWindow1.DestroyChildWindow) then CEFSentinel1.Start; end; procedure TJSDialogBrowserFrm.Chromium_OnBeforePopup(Sender: TObject; diff --git a/demos/Lazarus/JavaScript/JSEval/JSEval.lps b/demos/Lazarus/JavaScript/JSEval/JSEval.lps index 2970d53c..6b8feb69 100644 --- a/demos/Lazarus/JavaScript/JSEval/JSEval.lps +++ b/demos/Lazarus/JavaScript/JSEval/JSEval.lps @@ -22,11 +22,11 @@ - - + + - + @@ -118,123 +118,123 @@ - + - + - + - + - + - + - + - + - + - - + + - + - - + + - + - + - + - + - + - + - + - - + + - + - - + + - + - + - + - + - - + + - + - - + + - + diff --git a/demos/Lazarus/JavaScript/JSEval/uJSEval.lfm b/demos/Lazarus/JavaScript/JSEval/uJSEval.lfm index 074c3da4..bf0fd2a9 100644 --- a/demos/Lazarus/JavaScript/JSEval/uJSEval.lfm +++ b/demos/Lazarus/JavaScript/JSEval/uJSEval.lfm @@ -73,4 +73,9 @@ object JSEvalFrm: TJSEvalFrm left = 16 top = 96 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + left = 16 + top = 160 + end end diff --git a/demos/Lazarus/JavaScript/JSEval/uJSEval.pas b/demos/Lazarus/JavaScript/JSEval/uJSEval.pas index fb226d36..62e7a09d 100644 --- a/demos/Lazarus/JavaScript/JSEval/uJSEval.pas +++ b/demos/Lazarus/JavaScript/JSEval/uJSEval.pas @@ -47,7 +47,7 @@ uses LCLIntf, LCLType, LMessages, Messages, SysUtils, Variants, Classes, Graphics, Menus, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Types, ComCtrls, ClipBrd, base64, uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFApplication, uCEFTypes, uCEFConstants, - uCEFWinControl; + uCEFWinControl, uCEFSentinel; const MINIBROWSER_SHOWTEXTVIEWER = WM_APP + $101; @@ -63,13 +63,18 @@ const BINARY_PARAM_JS = 'JSBinaryParameter'; type + + { TJSEvalFrm } + TJSEvalFrm = class(TForm) + CEFSentinel1: TCEFSentinel; CEFWindowParent1: TCEFWindowParent; Chromium1: TChromium; AddressBarPnl: TPanel; GoBtn: TButton; AddressEdt: TEdit; Timer1: TTimer; + procedure CEFSentinel1Close(Sender: TObject); procedure Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); procedure GoBtnClick(Sender: TObject); procedure FormShow(Sender: TObject); @@ -174,21 +179,26 @@ uses // ================= // 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. // 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. -// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form. - +// 3. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure TJSEvalFrm.Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); begin PostMessage(Handle, CEF_AFTERCREATED, 0, 0); end; -procedure TJSEvalFrm.Chromium1BeforeClose(Sender: TObject; - const browser: ICefBrowser); +procedure TJSEvalFrm.CEFSentinel1Close(Sender: TObject); begin FCanClose := True; PostMessage(Handle, WM_CLOSE, 0, 0); end; +procedure TJSEvalFrm.Chromium1BeforeClose(Sender: TObject; + const browser: ICefBrowser); +begin + CEFSentinel1.Start; +end; + procedure TJSEvalFrm.Chromium1BeforeContextMenu(Sender : TObject; const browser : ICefBrowser; const frame : ICefFrame; diff --git a/demos/Lazarus/JavaScript/JSExecutingFunctions/JSExecutingFunctions.lps b/demos/Lazarus/JavaScript/JSExecutingFunctions/JSExecutingFunctions.lps index 9b2ca50f..a5596eda 100644 --- a/demos/Lazarus/JavaScript/JSExecutingFunctions/JSExecutingFunctions.lps +++ b/demos/Lazarus/JavaScript/JSExecutingFunctions/JSExecutingFunctions.lps @@ -22,8 +22,8 @@ - - + + @@ -53,7 +53,7 @@ - + @@ -89,6 +89,14 @@ + + + + + + + + diff --git a/demos/Lazarus/JavaScript/JSExecutingFunctions/uJSExecutingFunctions.lfm b/demos/Lazarus/JavaScript/JSExecutingFunctions/uJSExecutingFunctions.lfm index 23e22fa9..a2989da0 100644 --- a/demos/Lazarus/JavaScript/JSExecutingFunctions/uJSExecutingFunctions.lfm +++ b/demos/Lazarus/JavaScript/JSExecutingFunctions/uJSExecutingFunctions.lfm @@ -72,4 +72,9 @@ object JSExecutingFunctionsFrm: TJSExecutingFunctionsFrm left = 32 top = 288 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + left = 32 + top = 352 + end end diff --git a/demos/Lazarus/JavaScript/JSExecutingFunctions/uJSExecutingFunctions.pas b/demos/Lazarus/JavaScript/JSExecutingFunctions/uJSExecutingFunctions.pas index 9f03728a..eda0cda3 100644 --- a/demos/Lazarus/JavaScript/JSExecutingFunctions/uJSExecutingFunctions.pas +++ b/demos/Lazarus/JavaScript/JSExecutingFunctions/uJSExecutingFunctions.pas @@ -52,7 +52,7 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFApplication, uCEFTypes, - uCEFConstants, uCEFv8Value, uCEFWinControl; + uCEFConstants, uCEFv8Value, uCEFWinControl, uCEFSentinel; const JSDEMO_CONTEXTMENU_EXECFUNCTION = MENU_ID_USER_FIRST + 1; @@ -60,13 +60,18 @@ const EXECFUNCTION_MSGNAME = 'execfunction'; type + + { TJSExecutingFunctionsFrm } + TJSExecutingFunctionsFrm = class(TForm) + CEFSentinel1: TCEFSentinel; NavControlPnl: TPanel; Edit1: TEdit; GoBtn: TButton; CEFWindowParent1: TCEFWindowParent; Chromium1: TChromium; Timer1: TTimer; + procedure CEFSentinel1Close(Sender: TObject); procedure FormShow(Sender: TObject); procedure GoBtnClick(Sender: TObject); procedure Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); @@ -136,7 +141,8 @@ implementation // ================= // 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. // 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. -// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form. +// 3. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. uses uCEFProcessMessage, uMyV8Handler; @@ -191,8 +197,7 @@ end; procedure TJSExecutingFunctionsFrm.Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TJSExecutingFunctionsFrm.Chromium1BeforeContextMenu( @@ -273,6 +278,12 @@ begin if not(Chromium1.CreateBrowser(CEFWindowParent1, '')) then Timer1.Enabled := True; end; +procedure TJSExecutingFunctionsFrm.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TJSExecutingFunctionsFrm.WMMove(var aMessage : TWMMove); begin inherited; diff --git a/demos/Lazarus/JavaScript/JSExtension/JSExtension.lps b/demos/Lazarus/JavaScript/JSExtension/JSExtension.lps index 84fc5bea..8b004115 100644 --- a/demos/Lazarus/JavaScript/JSExtension/JSExtension.lps +++ b/demos/Lazarus/JavaScript/JSExtension/JSExtension.lps @@ -22,8 +22,8 @@ - - + + @@ -50,98 +50,127 @@ - + + - + - + - + - - - - - - + + - - + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demos/Lazarus/JavaScript/JSExtension/uJSExtension.lfm b/demos/Lazarus/JavaScript/JSExtension/uJSExtension.lfm index 28c39eac..9991bc43 100644 --- a/demos/Lazarus/JavaScript/JSExtension/uJSExtension.lfm +++ b/demos/Lazarus/JavaScript/JSExtension/uJSExtension.lfm @@ -81,4 +81,9 @@ object JSExtensionFrm: TJSExtensionFrm left = 32 top = 288 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + left = 32 + top = 365 + end end diff --git a/demos/Lazarus/JavaScript/JSExtension/uJSExtension.pas b/demos/Lazarus/JavaScript/JSExtension/uJSExtension.pas index dd4aa142..ff41fa39 100644 --- a/demos/Lazarus/JavaScript/JSExtension/uJSExtension.pas +++ b/demos/Lazarus/JavaScript/JSExtension/uJSExtension.pas @@ -52,7 +52,7 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFApplication, uCEFTypes, uCEFConstants, - uCEFWinControl; + uCEFWinControl, uCEFSentinel; const MINIBROWSER_SHOWTEXTVIEWER = WM_APP + $100; @@ -69,6 +69,7 @@ type { TJSExtensionFrm } TJSExtensionFrm = class(TForm) + CEFSentinel1: TCEFSentinel; NavControlPnl: TPanel; Edit1: TEdit; GoBtn: TButton; @@ -76,6 +77,7 @@ type Chromium1: TChromium; StatusPnl: TPanel; Timer1: TTimer; + procedure CEFSentinel1Close(Sender: TObject); procedure FormShow(Sender: TObject); procedure GoBtnClick(Sender: TObject); procedure Chromium1BeforeContextMenu(Sender: TObject; @@ -338,8 +340,7 @@ end; procedure TJSExtensionFrm.Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TJSExtensionFrm.Chromium1BeforeContextMenu(Sender: TObject; @@ -479,6 +480,12 @@ begin if not(Chromium1.CreateBrowser(CEFWindowParent1, '')) then Timer1.Enabled := True; end; +procedure TJSExtensionFrm.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TJSExtensionFrm.WMMove(var aMessage : TWMMove); begin inherited; diff --git a/demos/Lazarus/JavaScript/JSExtensionWithFunction/JSExtensionWithFunction.lps b/demos/Lazarus/JavaScript/JSExtensionWithFunction/JSExtensionWithFunction.lps index 5498d649..ddbaa4ec 100644 --- a/demos/Lazarus/JavaScript/JSExtensionWithFunction/JSExtensionWithFunction.lps +++ b/demos/Lazarus/JavaScript/JSExtensionWithFunction/JSExtensionWithFunction.lps @@ -22,8 +22,8 @@ - - + + @@ -56,7 +56,7 @@ - + @@ -104,6 +104,14 @@ + + + + + + + + diff --git a/demos/Lazarus/JavaScript/JSExtensionWithFunction/uJSExtensionWithFunction.lfm b/demos/Lazarus/JavaScript/JSExtensionWithFunction/uJSExtensionWithFunction.lfm index 3e14ce7d..af65ea5f 100644 --- a/demos/Lazarus/JavaScript/JSExtensionWithFunction/uJSExtensionWithFunction.lfm +++ b/demos/Lazarus/JavaScript/JSExtensionWithFunction/uJSExtensionWithFunction.lfm @@ -80,4 +80,9 @@ object JSExtensionWithFunctionFrm: TJSExtensionWithFunctionFrm left = 32 top = 288 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + left = 32 + top = 360 + end end diff --git a/demos/Lazarus/JavaScript/JSExtensionWithFunction/uJSExtensionWithFunction.pas b/demos/Lazarus/JavaScript/JSExtensionWithFunction/uJSExtensionWithFunction.pas index 7e5fe351..d7d03fac 100644 --- a/demos/Lazarus/JavaScript/JSExtensionWithFunction/uJSExtensionWithFunction.pas +++ b/demos/Lazarus/JavaScript/JSExtensionWithFunction/uJSExtensionWithFunction.pas @@ -52,10 +52,14 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFApplication, uCEFTypes, uCEFConstants, - uCEFWinControl; + uCEFWinControl, uCEFSentinel; type + + { TJSExtensionWithFunctionFrm } + TJSExtensionWithFunctionFrm = class(TForm) + CEFSentinel1: TCEFSentinel; NavControlPnl: TPanel; Edit1: TEdit; GoBtn: TButton; @@ -63,6 +67,7 @@ type Chromium1: TChromium; Timer1: TTimer; StatusBar1: TStatusBar; + procedure CEFSentinel1Close(Sender: TObject); procedure FormShow(Sender: TObject); procedure GoBtnClick(Sender: TObject); procedure Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); @@ -121,7 +126,8 @@ uses // ================= // 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. // 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. -// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form. +// 3. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the procedure GlobalCEFApp_OnWebKitInitializedEvent; var @@ -165,8 +171,7 @@ end; procedure TJSExtensionWithFunctionFrm.Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TJSExtensionWithFunctionFrm.Chromium1BeforePopup(Sender: TObject; @@ -228,6 +233,12 @@ begin if not(Chromium1.CreateBrowser(CEFWindowParent1, '')) then Timer1.Enabled := True; end; +procedure TJSExtensionWithFunctionFrm.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TJSExtensionWithFunctionFrm.WMMove(var aMessage : TWMMove); begin inherited; diff --git a/demos/Lazarus/JavaScript/JSExtensionWithObjectParameter/JSExtensionWithObjectParameter.lps b/demos/Lazarus/JavaScript/JSExtensionWithObjectParameter/JSExtensionWithObjectParameter.lps index ee6fa447..95a0b62d 100644 --- a/demos/Lazarus/JavaScript/JSExtensionWithObjectParameter/JSExtensionWithObjectParameter.lps +++ b/demos/Lazarus/JavaScript/JSExtensionWithObjectParameter/JSExtensionWithObjectParameter.lps @@ -22,8 +22,8 @@ - - + + @@ -37,7 +37,7 @@ - + @@ -53,6 +53,14 @@ + + + + + + + + diff --git a/demos/Lazarus/JavaScript/JSExtensionWithObjectParameter/uJSExtensionWithObjectParameter.lfm b/demos/Lazarus/JavaScript/JSExtensionWithObjectParameter/uJSExtensionWithObjectParameter.lfm index 1e54ef4e..320867fd 100644 --- a/demos/Lazarus/JavaScript/JSExtensionWithObjectParameter/uJSExtensionWithObjectParameter.lfm +++ b/demos/Lazarus/JavaScript/JSExtensionWithObjectParameter/uJSExtensionWithObjectParameter.lfm @@ -69,4 +69,9 @@ object JSExtensionWithObjectParameterFrm: TJSExtensionWithObjectParameterFrm left = 32 top = 288 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + left = 32 + top = 360 + end end diff --git a/demos/Lazarus/JavaScript/JSExtensionWithObjectParameter/uJSExtensionWithObjectParameter.pas b/demos/Lazarus/JavaScript/JSExtensionWithObjectParameter/uJSExtensionWithObjectParameter.pas index f4d83e20..866633e4 100644 --- a/demos/Lazarus/JavaScript/JSExtensionWithObjectParameter/uJSExtensionWithObjectParameter.pas +++ b/demos/Lazarus/JavaScript/JSExtensionWithObjectParameter/uJSExtensionWithObjectParameter.pas @@ -52,16 +52,21 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFApplication, uCEFTypes, uCEFConstants, - uCEFWinControl; + uCEFWinControl, uCEFSentinel; type + + { TJSExtensionWithObjectParameterFrm } + TJSExtensionWithObjectParameterFrm = class(TForm) + CEFSentinel1: TCEFSentinel; NavControlPnl: TPanel; Edit1: TEdit; GoBtn: TButton; CEFWindowParent1: TCEFWindowParent; Chromium1: TChromium; Timer1: TTimer; + procedure CEFSentinel1Close(Sender: TObject); procedure FormShow(Sender: TObject); procedure GoBtnClick(Sender: TObject); procedure Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); @@ -120,7 +125,8 @@ uses // ================= // 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. // 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. -// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form. +// 3. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure GlobalCEFApp_OnWebKitInitializedEvent; var @@ -168,8 +174,7 @@ end; procedure TJSExtensionWithObjectParameterFrm.Chromium1BeforeClose( Sender: TObject; const browser: ICefBrowser); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TJSExtensionWithObjectParameterFrm.Chromium1BeforePopup( @@ -218,6 +223,12 @@ begin if not(Chromium1.CreateBrowser(CEFWindowParent1, '')) then Timer1.Enabled := True; end; +procedure TJSExtensionWithObjectParameterFrm.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TJSExtensionWithObjectParameterFrm.WMMove(var aMessage : TWMMove); begin inherited; diff --git a/demos/Lazarus/JavaScript/JSSimpleExtension/JSSimpleExtension.lps b/demos/Lazarus/JavaScript/JSSimpleExtension/JSSimpleExtension.lps index d5c420f8..132dc271 100644 --- a/demos/Lazarus/JavaScript/JSSimpleExtension/JSSimpleExtension.lps +++ b/demos/Lazarus/JavaScript/JSSimpleExtension/JSSimpleExtension.lps @@ -22,15 +22,15 @@ - - + + - + @@ -46,6 +46,18 @@ + + + + + + + + + + + + diff --git a/demos/Lazarus/JavaScript/JSSimpleExtension/uJSSimpleExtension.lfm b/demos/Lazarus/JavaScript/JSSimpleExtension/uJSSimpleExtension.lfm index 8c3eb63e..ed690f51 100644 --- a/demos/Lazarus/JavaScript/JSSimpleExtension/uJSSimpleExtension.lfm +++ b/demos/Lazarus/JavaScript/JSSimpleExtension/uJSSimpleExtension.lfm @@ -69,4 +69,9 @@ object JSSimpleExtensionFrm: TJSSimpleExtensionFrm left = 32 top = 288 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + left = 32 + top = 352 + end end diff --git a/demos/Lazarus/JavaScript/JSSimpleExtension/uJSSimpleExtension.pas b/demos/Lazarus/JavaScript/JSSimpleExtension/uJSSimpleExtension.pas index 37987db2..5c37adfe 100644 --- a/demos/Lazarus/JavaScript/JSSimpleExtension/uJSSimpleExtension.pas +++ b/demos/Lazarus/JavaScript/JSSimpleExtension/uJSSimpleExtension.pas @@ -52,16 +52,21 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFApplication, uCEFTypes, uCEFConstants, - uCEFWinControl; + uCEFWinControl, uCEFSentinel; type + + { TJSSimpleExtensionFrm } + TJSSimpleExtensionFrm = class(TForm) + CEFSentinel1: TCEFSentinel; NavControlPnl: TPanel; Edit1: TEdit; GoBtn: TButton; CEFWindowParent1: TCEFWindowParent; Chromium1: TChromium; Timer1: TTimer; + procedure CEFSentinel1Close(Sender: TObject); procedure FormShow(Sender: TObject); procedure GoBtnClick(Sender: TObject); procedure Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); @@ -117,7 +122,8 @@ uses // ================= // 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. // 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. -// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form. +// 3. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure GlobalCEFApp_OnWebKitInitializedEvent; var @@ -173,6 +179,12 @@ begin if not(Chromium1.CreateBrowser(CEFWindowParent1, '')) then Timer1.Enabled := True; end; +procedure TJSSimpleExtensionFrm.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TJSSimpleExtensionFrm.WMMove(var aMessage : TWMMove); begin inherited; @@ -219,8 +231,7 @@ end; procedure TJSSimpleExtensionFrm.Chromium1BeforeClose( Sender: TObject; const browser: ICefBrowser); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TJSSimpleExtensionFrm.Chromium1Close( diff --git a/demos/Lazarus/JavaScript/JSSimpleWindowBinding/JSSimpleWindowBinding.lps b/demos/Lazarus/JavaScript/JSSimpleWindowBinding/JSSimpleWindowBinding.lps index 42acbcbd..09f5c2e9 100644 --- a/demos/Lazarus/JavaScript/JSSimpleWindowBinding/JSSimpleWindowBinding.lps +++ b/demos/Lazarus/JavaScript/JSSimpleWindowBinding/JSSimpleWindowBinding.lps @@ -22,15 +22,15 @@ - - + + - + @@ -62,6 +62,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demos/Lazarus/JavaScript/JSSimpleWindowBinding/uJSSimpleWindowBinding.lfm b/demos/Lazarus/JavaScript/JSSimpleWindowBinding/uJSSimpleWindowBinding.lfm index 17da8ba9..fed97336 100644 --- a/demos/Lazarus/JavaScript/JSSimpleWindowBinding/uJSSimpleWindowBinding.lfm +++ b/demos/Lazarus/JavaScript/JSSimpleWindowBinding/uJSSimpleWindowBinding.lfm @@ -69,4 +69,9 @@ object JSSimpleWindowBindingFrm: TJSSimpleWindowBindingFrm left = 32 top = 288 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + left = 32 + top = 360 + end end diff --git a/demos/Lazarus/JavaScript/JSSimpleWindowBinding/uJSSimpleWindowBinding.pas b/demos/Lazarus/JavaScript/JSSimpleWindowBinding/uJSSimpleWindowBinding.pas index 653c84d6..5ac9954a 100644 --- a/demos/Lazarus/JavaScript/JSSimpleWindowBinding/uJSSimpleWindowBinding.pas +++ b/demos/Lazarus/JavaScript/JSSimpleWindowBinding/uJSSimpleWindowBinding.pas @@ -52,16 +52,21 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFApplication, uCEFTypes, - uCEFConstants, uCEFv8Value, uCEFWinControl; + uCEFConstants, uCEFv8Value, uCEFWinControl, uCEFSentinel; type + + { TJSSimpleWindowBindingFrm } + TJSSimpleWindowBindingFrm = class(TForm) + CEFSentinel1: TCEFSentinel; NavControlPnl: TPanel; Edit1: TEdit; GoBtn: TButton; CEFWindowParent1: TCEFWindowParent; Chromium1: TChromium; Timer1: TTimer; + procedure CEFSentinel1Close(Sender: TObject); procedure FormShow(Sender: TObject); procedure GoBtnClick(Sender: TObject); procedure Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); @@ -114,7 +119,8 @@ implementation // ================= // 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. // 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. -// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form. +// 3. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure GlobalCEFApp_OnContextCreated(const browser: ICefBrowser; const frame: ICefFrame; const context: ICefv8Context); var @@ -165,6 +171,12 @@ begin if not(Chromium1.CreateBrowser(CEFWindowParent1, '')) then Timer1.Enabled := True; end; +procedure TJSSimpleWindowBindingFrm.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TJSSimpleWindowBindingFrm.WMMove(var aMessage : TWMMove); begin inherited; @@ -211,8 +223,7 @@ end; procedure TJSSimpleWindowBindingFrm.Chromium1BeforeClose( Sender: TObject; const browser: ICefBrowser); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TJSSimpleWindowBindingFrm.Chromium1Close( diff --git a/demos/Lazarus/JavaScript/JSWindowBindingSubProcess/JSSimpleWindowBinding.lps b/demos/Lazarus/JavaScript/JSWindowBindingSubProcess/JSSimpleWindowBinding.lps index edffd64f..2692113e 100644 --- a/demos/Lazarus/JavaScript/JSWindowBindingSubProcess/JSSimpleWindowBinding.lps +++ b/demos/Lazarus/JavaScript/JSWindowBindingSubProcess/JSSimpleWindowBinding.lps @@ -8,8 +8,7 @@ - - + @@ -21,16 +20,17 @@ + - - + + - + @@ -38,6 +38,14 @@ + + + + + + + + diff --git a/demos/Lazarus/JavaScript/JSWindowBindingSubProcess/uJSSimpleWindowBinding.lfm b/demos/Lazarus/JavaScript/JSWindowBindingSubProcess/uJSSimpleWindowBinding.lfm index aca1fe59..99abb246 100644 --- a/demos/Lazarus/JavaScript/JSWindowBindingSubProcess/uJSSimpleWindowBinding.lfm +++ b/demos/Lazarus/JavaScript/JSWindowBindingSubProcess/uJSSimpleWindowBinding.lfm @@ -14,7 +14,7 @@ object JSSimpleWindowBindingFrm: TJSSimpleWindowBindingFrm OnCreate = FormCreate OnShow = FormShow Position = poScreenCenter - LCLVersion = '2.0.2.0' + LCLVersion = '2.0.4.0' object NavControlPnl: TPanel Left = 0 Height = 21 @@ -69,4 +69,9 @@ object JSSimpleWindowBindingFrm: TJSSimpleWindowBindingFrm left = 32 top = 288 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + left = 32 + top = 352 + end end diff --git a/demos/Lazarus/JavaScript/JSWindowBindingSubProcess/uJSSimpleWindowBinding.pas b/demos/Lazarus/JavaScript/JSWindowBindingSubProcess/uJSSimpleWindowBinding.pas index 0845441e..54acfc19 100644 --- a/demos/Lazarus/JavaScript/JSWindowBindingSubProcess/uJSSimpleWindowBinding.pas +++ b/demos/Lazarus/JavaScript/JSWindowBindingSubProcess/uJSSimpleWindowBinding.pas @@ -52,16 +52,21 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFApplication, uCEFTypes, - uCEFConstants, uCEFv8Value, uCEFWinControl; + uCEFConstants, uCEFv8Value, uCEFWinControl, uCEFSentinel; type + + { TJSSimpleWindowBindingFrm } + TJSSimpleWindowBindingFrm = class(TForm) + CEFSentinel1: TCEFSentinel; NavControlPnl: TPanel; Edit1: TEdit; GoBtn: TButton; CEFWindowParent1: TCEFWindowParent; Chromium1: TChromium; Timer1: TTimer; + procedure CEFSentinel1Close(Sender: TObject); procedure FormShow(Sender: TObject); procedure GoBtnClick(Sender: TObject); procedure Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); @@ -113,7 +118,8 @@ implementation // ================= // 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. // 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. -// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form. +// 3. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure TJSSimpleWindowBindingFrm.GoBtnClick(Sender: TObject); begin @@ -146,6 +152,12 @@ begin if not(Chromium1.CreateBrowser(CEFWindowParent1, '')) then Timer1.Enabled := True; end; +procedure TJSSimpleWindowBindingFrm.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TJSSimpleWindowBindingFrm.WMMove(var aMessage : TWMMove); begin inherited; @@ -192,8 +204,7 @@ end; procedure TJSSimpleWindowBindingFrm.Chromium1BeforeClose( Sender: TObject; const browser: ICefBrowser); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TJSSimpleWindowBindingFrm.Chromium1Close( diff --git a/demos/Lazarus/JavaScript/JSWindowBindingWithArrayBuffer/JSWindowBindingWithArrayBuffer.lps b/demos/Lazarus/JavaScript/JSWindowBindingWithArrayBuffer/JSWindowBindingWithArrayBuffer.lps index e74d5963..c5e8b6b2 100644 --- a/demos/Lazarus/JavaScript/JSWindowBindingWithArrayBuffer/JSWindowBindingWithArrayBuffer.lps +++ b/demos/Lazarus/JavaScript/JSWindowBindingWithArrayBuffer/JSWindowBindingWithArrayBuffer.lps @@ -22,8 +22,8 @@ - - + + @@ -38,7 +38,7 @@ - + @@ -51,6 +51,14 @@ + + + + + + + + diff --git a/demos/Lazarus/JavaScript/JSWindowBindingWithArrayBuffer/uJSWindowBindingWithArrayBuffer.lfm b/demos/Lazarus/JavaScript/JSWindowBindingWithArrayBuffer/uJSWindowBindingWithArrayBuffer.lfm index beef6742..62a7826d 100644 --- a/demos/Lazarus/JavaScript/JSWindowBindingWithArrayBuffer/uJSWindowBindingWithArrayBuffer.lfm +++ b/demos/Lazarus/JavaScript/JSWindowBindingWithArrayBuffer/uJSWindowBindingWithArrayBuffer.lfm @@ -69,4 +69,9 @@ object JSWindowBindingWithArrayBufferFrm: TJSWindowBindingWithArrayBufferFrm left = 32 top = 288 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + left = 32 + top = 363 + end end diff --git a/demos/Lazarus/JavaScript/JSWindowBindingWithArrayBuffer/uJSWindowBindingWithArrayBuffer.pas b/demos/Lazarus/JavaScript/JSWindowBindingWithArrayBuffer/uJSWindowBindingWithArrayBuffer.pas index c758bbdb..1dbc4bf1 100644 --- a/demos/Lazarus/JavaScript/JSWindowBindingWithArrayBuffer/uJSWindowBindingWithArrayBuffer.pas +++ b/demos/Lazarus/JavaScript/JSWindowBindingWithArrayBuffer/uJSWindowBindingWithArrayBuffer.pas @@ -52,16 +52,21 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFApplication, uCEFTypes, uCEFConstants, - uCEFWinControl; + uCEFWinControl, uCEFSentinel; type + + { TJSWindowBindingWithArrayBufferFrm } + TJSWindowBindingWithArrayBufferFrm = class(TForm) + CEFSentinel1: TCEFSentinel; NavControlPnl: TPanel; Edit1: TEdit; GoBtn: TButton; CEFWindowParent1: TCEFWindowParent; Chromium1: TChromium; Timer1: TTimer; + procedure CEFSentinel1Close(Sender: TObject); procedure FormShow(Sender: TObject); procedure GoBtnClick(Sender: TObject); procedure Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); @@ -117,7 +122,8 @@ uses // ================= // 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. // 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. -// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form. +// 3. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure FreeCustomArrayBufer(buffer : Pointer); begin @@ -189,6 +195,12 @@ begin if not(Chromium1.CreateBrowser(CEFWindowParent1, '')) then Timer1.Enabled := True; end; +procedure TJSWindowBindingWithArrayBufferFrm.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TJSWindowBindingWithArrayBufferFrm.WMMove(var aMessage : TWMMove); begin inherited; @@ -235,8 +247,7 @@ end; procedure TJSWindowBindingWithArrayBufferFrm.Chromium1BeforeClose( Sender: TObject; const browser: ICefBrowser); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TJSWindowBindingWithArrayBufferFrm.Chromium1Close( diff --git a/demos/Lazarus/JavaScript/JSWindowBindingWithFunction/JSWindowBindingWithFunction.lps b/demos/Lazarus/JavaScript/JSWindowBindingWithFunction/JSWindowBindingWithFunction.lps index 4903a486..ebc7a673 100644 --- a/demos/Lazarus/JavaScript/JSWindowBindingWithFunction/JSWindowBindingWithFunction.lps +++ b/demos/Lazarus/JavaScript/JSWindowBindingWithFunction/JSWindowBindingWithFunction.lps @@ -22,8 +22,8 @@ - - + + @@ -37,7 +37,7 @@ - + @@ -49,6 +49,26 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/demos/Lazarus/JavaScript/JSWindowBindingWithFunction/uJSWindowBindingWithFunction.lfm b/demos/Lazarus/JavaScript/JSWindowBindingWithFunction/uJSWindowBindingWithFunction.lfm index 1549cdc0..602abeed 100644 --- a/demos/Lazarus/JavaScript/JSWindowBindingWithFunction/uJSWindowBindingWithFunction.lfm +++ b/demos/Lazarus/JavaScript/JSWindowBindingWithFunction/uJSWindowBindingWithFunction.lfm @@ -69,4 +69,9 @@ object JSWindowBindingWithFunctionFrm: TJSWindowBindingWithFunctionFrm left = 32 top = 288 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + left = 32 + top = 352 + end end diff --git a/demos/Lazarus/JavaScript/JSWindowBindingWithFunction/uJSWindowBindingWithFunction.pas b/demos/Lazarus/JavaScript/JSWindowBindingWithFunction/uJSWindowBindingWithFunction.pas index 223917e8..bd32a57d 100644 --- a/demos/Lazarus/JavaScript/JSWindowBindingWithFunction/uJSWindowBindingWithFunction.pas +++ b/demos/Lazarus/JavaScript/JSWindowBindingWithFunction/uJSWindowBindingWithFunction.pas @@ -52,16 +52,21 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFApplication, uCEFTypes, uCEFConstants, - uCEFWinControl; + uCEFWinControl, uCEFSentinel; type + + { TJSWindowBindingWithFunctionFrm } + TJSWindowBindingWithFunctionFrm = class(TForm) + CEFSentinel1: TCEFSentinel; NavControlPnl: TPanel; Edit1: TEdit; GoBtn: TButton; CEFWindowParent1: TCEFWindowParent; Chromium1: TChromium; Timer1: TTimer; + procedure CEFSentinel1Close(Sender: TObject); procedure FormShow(Sender: TObject); procedure GoBtnClick(Sender: TObject); procedure Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); @@ -117,7 +122,8 @@ uses // ================= // 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. // 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. -// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form. +// 3. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure GlobalCEFApp_OnContextCreated(const browser: ICefBrowser; const frame: ICefFrame; const context: ICefv8Context); var @@ -169,6 +175,12 @@ begin if not(Chromium1.CreateBrowser(CEFWindowParent1, '')) then Timer1.Enabled := True; end; +procedure TJSWindowBindingWithFunctionFrm.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TJSWindowBindingWithFunctionFrm.WMMove(var aMessage : TWMMove); begin inherited; @@ -215,8 +227,7 @@ end; procedure TJSWindowBindingWithFunctionFrm.Chromium1BeforeClose( Sender: TObject; const browser: ICefBrowser); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TJSWindowBindingWithFunctionFrm.Chromium1Close( diff --git a/demos/Lazarus/JavaScript/JSWindowBindingWithObject/JSWindowBindingWithObject.lps b/demos/Lazarus/JavaScript/JSWindowBindingWithObject/JSWindowBindingWithObject.lps index ed6b74a5..a31638f6 100644 --- a/demos/Lazarus/JavaScript/JSWindowBindingWithObject/JSWindowBindingWithObject.lps +++ b/demos/Lazarus/JavaScript/JSWindowBindingWithObject/JSWindowBindingWithObject.lps @@ -22,8 +22,8 @@ - - + + @@ -37,7 +37,7 @@ - + @@ -57,6 +57,14 @@ + + + + + + + + diff --git a/demos/Lazarus/JavaScript/JSWindowBindingWithObject/uJSWindowBindingWithObject.lfm b/demos/Lazarus/JavaScript/JSWindowBindingWithObject/uJSWindowBindingWithObject.lfm index d47145f1..02cc0f9c 100644 --- a/demos/Lazarus/JavaScript/JSWindowBindingWithObject/uJSWindowBindingWithObject.lfm +++ b/demos/Lazarus/JavaScript/JSWindowBindingWithObject/uJSWindowBindingWithObject.lfm @@ -69,4 +69,9 @@ object JSWindowBindingWithObjectFrm: TJSWindowBindingWithObjectFrm left = 32 top = 288 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + left = 32 + top = 360 + end end diff --git a/demos/Lazarus/JavaScript/JSWindowBindingWithObject/uJSWindowBindingWithObject.pas b/demos/Lazarus/JavaScript/JSWindowBindingWithObject/uJSWindowBindingWithObject.pas index 3aa41c27..f03a264d 100644 --- a/demos/Lazarus/JavaScript/JSWindowBindingWithObject/uJSWindowBindingWithObject.pas +++ b/demos/Lazarus/JavaScript/JSWindowBindingWithObject/uJSWindowBindingWithObject.pas @@ -52,16 +52,21 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFApplication, uCEFTypes, uCEFConstants, - uCEFWinControl; + uCEFWinControl, uCEFSentinel; type + + { TJSWindowBindingWithObjectFrm } + TJSWindowBindingWithObjectFrm = class(TForm) + CEFSentinel1: TCEFSentinel; NavControlPnl: TPanel; Edit1: TEdit; GoBtn: TButton; CEFWindowParent1: TCEFWindowParent; Chromium1: TChromium; Timer1: TTimer; + procedure CEFSentinel1Close(Sender: TObject); procedure FormShow(Sender: TObject); procedure GoBtnClick(Sender: TObject); procedure Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); @@ -117,7 +122,8 @@ uses // ================= // 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. // 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. -// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form. +// 3. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure GlobalCEFApp_OnContextCreated(const browser: ICefBrowser; const frame: ICefFrame; const context: ICefv8Context); var @@ -172,6 +178,12 @@ begin if not(Chromium1.CreateBrowser(CEFWindowParent1, '')) then Timer1.Enabled := True; end; +procedure TJSWindowBindingWithObjectFrm.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TJSWindowBindingWithObjectFrm.WMMove(var aMessage : TWMMove); begin inherited; @@ -218,8 +230,7 @@ end; procedure TJSWindowBindingWithObjectFrm.Chromium1BeforeClose( Sender: TObject; const browser: ICefBrowser); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TJSWindowBindingWithObjectFrm.Chromium1Close( diff --git a/demos/Lazarus/MiniBrowser/MiniBrowser.lps b/demos/Lazarus/MiniBrowser/MiniBrowser.lps index dac60fd8..f89700c3 100644 --- a/demos/Lazarus/MiniBrowser/MiniBrowser.lps +++ b/demos/Lazarus/MiniBrowser/MiniBrowser.lps @@ -22,8 +22,8 @@ - - + + diff --git a/demos/Lazarus/MiniBrowser/uMiniBrowser.pas b/demos/Lazarus/MiniBrowser/uMiniBrowser.pas index da90365c..cdb83f2d 100644 --- a/demos/Lazarus/MiniBrowser/uMiniBrowser.pas +++ b/demos/Lazarus/MiniBrowser/uMiniBrowser.pas @@ -288,8 +288,8 @@ uses // ================= // 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. // 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. -// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form. - +// 3. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure CreateGlobalCEFApp; begin diff --git a/demos/Lazarus/OSRExternalPumpBrowser/OSRExternalPumpBrowser.lps b/demos/Lazarus/OSRExternalPumpBrowser/OSRExternalPumpBrowser.lps index 50f78310..afaa5fe9 100644 --- a/demos/Lazarus/OSRExternalPumpBrowser/OSRExternalPumpBrowser.lps +++ b/demos/Lazarus/OSRExternalPumpBrowser/OSRExternalPumpBrowser.lps @@ -22,8 +22,8 @@ - - + + @@ -59,123 +59,127 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - - + + - + + + + + diff --git a/demos/Lazarus/OSRExternalPumpBrowser/uOSRExternalPumpBrowser.lfm b/demos/Lazarus/OSRExternalPumpBrowser/uOSRExternalPumpBrowser.lfm index 1098f300..efc9fcfc 100644 --- a/demos/Lazarus/OSRExternalPumpBrowser/uOSRExternalPumpBrowser.lfm +++ b/demos/Lazarus/OSRExternalPumpBrowser/uOSRExternalPumpBrowser.lfm @@ -144,4 +144,9 @@ object OSRExternalPumpBrowserFrm: TOSRExternalPumpBrowserFrm left = 24 top = 206 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + left = 24 + top = 136 + end end diff --git a/demos/Lazarus/OSRExternalPumpBrowser/uOSRExternalPumpBrowser.pas b/demos/Lazarus/OSRExternalPumpBrowser/uOSRExternalPumpBrowser.pas index d933f305..eece15fd 100644 --- a/demos/Lazarus/OSRExternalPumpBrowser/uOSRExternalPumpBrowser.pas +++ b/demos/Lazarus/OSRExternalPumpBrowser/uOSRExternalPumpBrowser.pas @@ -47,13 +47,14 @@ uses Windows, Messages, SysUtils, LCLType, Variants, Classes, SyncObjs, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, uCEFChromium, uCEFTypes, uCEFInterfaces, uCEFConstants, uCEFBufferPanel, - uCEFWorkScheduler, Types; + uCEFWorkScheduler, uCEFSentinel, Types; type { TOSRExternalPumpBrowserFrm } TOSRExternalPumpBrowserFrm = class(TForm) + CEFSentinel1: TCEFSentinel; NavControlPnl: TPanel; chrmosr: TChromium; ComboBox1: TComboBox; @@ -64,6 +65,7 @@ type Timer1: TTimer; Panel1: TBufferPanel; + procedure CEFSentinel1Close(Sender: TObject); procedure GoBtnClick(Sender: TObject); procedure GoBtnEnter(Sender: TObject); @@ -164,7 +166,8 @@ var // 2- chrmosr.CloseBrowser(True) will trigger chrmosr.OnClose and we have to // set "Result" to false and CEF3 will destroy the internal browser immediately. // 3- chrmosr.OnBeforeClose is triggered because the internal browser was destroyed. -// Now we set FCanClose to True and send WM_CLOSE to the form. +// Now we call TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4- TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure CreateGlobalCEFApp; procedure GlobalCEFApp_OnScheduleMessagePumpWork(const aDelayMS : int64); @@ -208,11 +211,17 @@ begin chrmosr.LoadURL(ComboBox1.Text); end; +procedure TOSRExternalPumpBrowserFrm.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TOSRExternalPumpBrowserFrm.chrmosrIMECompositionRangeChanged( Sender : TObject; - const browser : ICefBrowser; - const selected_range : PCefRange; - character_boundsCount : NativeUInt; - const character_bounds : PCefRect); + const browser : ICefBrowser; + const selected_range : PCefRange; + character_boundsCount : NativeUInt; + const character_bounds : PCefRect); var TempPRect : PCefRect; i : NativeUInt; @@ -269,8 +278,7 @@ end; procedure TOSRExternalPumpBrowserFrm.chrmosrBeforeClose(Sender: TObject; const browser: ICefBrowser); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TOSRExternalPumpBrowserFrm.Panel1UTF8KeyPress(Sender: TObject; var UTF8Key: TUTF8Char); @@ -920,18 +928,18 @@ begin end; procedure TOSRExternalPumpBrowserFrm.Panel1IMECommitText( Sender : TObject; - const aText : ustring; - const replacement_range : PCefRange; - relative_cursor_pos : Integer); + const aText : ustring; + const replacement_range : PCefRange; + relative_cursor_pos : Integer); begin chrmosr.IMECommitText(aText, replacement_range, relative_cursor_pos); end; procedure TOSRExternalPumpBrowserFrm.Panel1IMESetComposition( Sender : TObject; - const aText : ustring; - const underlines : TCefCompositionUnderlineDynArray; - const replacement_range : TCefRange; - const selection_range : TCefRange); + const aText : ustring; + const underlines : TCefCompositionUnderlineDynArray; + const replacement_range : TCefRange; + const selection_range : TCefRange); begin chrmosr.IMESetComposition(aText, underlines, @replacement_range, @selection_range); end; diff --git a/demos/Lazarus/PopupBrowser/PopupBrowser.lps b/demos/Lazarus/PopupBrowser/PopupBrowser.lps index 8ad3fc01..e8549e89 100644 --- a/demos/Lazarus/PopupBrowser/PopupBrowser.lps +++ b/demos/Lazarus/PopupBrowser/PopupBrowser.lps @@ -22,8 +22,8 @@ - - + + @@ -56,7 +56,7 @@ - + @@ -121,6 +121,14 @@ + + + + + + + + diff --git a/demos/Lazarus/PopupBrowser/uMainForm.lfm b/demos/Lazarus/PopupBrowser/uMainForm.lfm index 35a22ad7..9a1cf29c 100644 --- a/demos/Lazarus/PopupBrowser/uMainForm.lfm +++ b/demos/Lazarus/PopupBrowser/uMainForm.lfm @@ -71,7 +71,12 @@ object MainForm: TMainForm top = 152 end object ApplicationProperties1: TApplicationProperties - left = 52 - top = 36 + left = 56 + top = 40 + end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + left = 56 + top = 221 end end diff --git a/demos/Lazarus/PopupBrowser/uMainForm.pas b/demos/Lazarus/PopupBrowser/uMainForm.pas index d14dca7e..f7d39b70 100644 --- a/demos/Lazarus/PopupBrowser/uMainForm.pas +++ b/demos/Lazarus/PopupBrowser/uMainForm.pas @@ -45,7 +45,7 @@ uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, SyncObjs, uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFConstants, uCEFTypes, uChildForm, - uCEFWinControl, uCEFChromiumEvents; + uCEFWinControl, uCEFChromiumEvents, uCEFSentinel; const CEF_CREATENEXTCHILD = WM_APP + $A50; @@ -59,11 +59,13 @@ type AddressPnl: TPanel; AddressEdt: TEdit; ApplicationProperties1: TApplicationProperties; + CEFSentinel1: TCEFSentinel; GoBtn: TButton; Timer1: TTimer; Chromium1: TChromium; CEFWindowParent1: TCEFWindowParent; + procedure CEFSentinel1Close(Sender: TObject); procedure GoBtnClick(Sender: TObject); procedure Timer1Timer(Sender: TObject); @@ -139,7 +141,8 @@ uses // 1. FormCloseQuery sets CanClose to FALSE and it closes all child forms. // 2. When all the child forms are closed then FormCloseQuery is triggered again, sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. // 3. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. -// 4. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form. +// 4. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 5. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure CreateGlobalCEFApp; @@ -327,12 +330,17 @@ begin Chromium1.LoadURL(AddressEdt.Text); end; -procedure TMainForm.Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); +procedure TMainForm.CEFSentinel1Close(Sender: TObject); begin FCanClose := True; PostMessage(Handle, WM_CLOSE, 0, 0); end; +procedure TMainForm.Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); +begin + CEFSentinel1.Start; +end; + procedure TMainForm.Chromium1Close(Sender: TObject; const browser: ICefBrowser; var aAction: TCefCloseBrowserAction); begin PostMessage(Handle, CEF_DESTROY, 0, 0); diff --git a/demos/Lazarus/PopupBrowser2/PopupBrowser2.lps b/demos/Lazarus/PopupBrowser2/PopupBrowser2.lps index 27cb990e..b558b881 100644 --- a/demos/Lazarus/PopupBrowser2/PopupBrowser2.lps +++ b/demos/Lazarus/PopupBrowser2/PopupBrowser2.lps @@ -8,7 +8,7 @@ - + @@ -22,11 +22,11 @@ - - + + - + @@ -85,124 +85,124 @@ - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/demos/Lazarus/PopupBrowser2/uMainForm.lfm b/demos/Lazarus/PopupBrowser2/uMainForm.lfm index 5bd2846e..7d5b4c77 100644 --- a/demos/Lazarus/PopupBrowser2/uMainForm.lfm +++ b/demos/Lazarus/PopupBrowser2/uMainForm.lfm @@ -74,4 +74,9 @@ object MainForm: TMainForm left = 56 top = 216 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + left = 56 + top = 288 + end end diff --git a/demos/Lazarus/PopupBrowser2/uMainForm.pas b/demos/Lazarus/PopupBrowser2/uMainForm.pas index eb32a160..3dd3e146 100644 --- a/demos/Lazarus/PopupBrowser2/uMainForm.pas +++ b/demos/Lazarus/PopupBrowser2/uMainForm.pas @@ -59,11 +59,13 @@ type AddressPnl: TPanel; AddressEdt: TEdit; ApplicationProperties1: TApplicationProperties; + CEFSentinel1: TCEFSentinel; GoBtn: TButton; Timer1: TTimer; Chromium1: TChromium; CEFWindowParent1: TCEFWindowParent; + procedure CEFSentinel1Close(Sender: TObject); procedure GoBtnClick(Sender: TObject); procedure Timer1Timer(Sender: TObject); @@ -139,13 +141,15 @@ uses // 1. FormCloseQuery sets CanClose to FALSE and it closes all child forms. // 2. When all the child forms are closed then FormCloseQuery is triggered again, sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. // 3. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. -// 4. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form. - +// 4. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 5. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; - GlobalCEFApp.EnableHighDPISupport := True; + GlobalCEFApp.EnableHighDPISupport := True; + //GlobalCEFApp.LogFile := 'cef.log'; + //GlobalCEFApp.LogSeverity := LOGSEVERITY_VERBOSE; end; procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); @@ -325,12 +329,17 @@ begin Chromium1.LoadURL(AddressEdt.Text); end; -procedure TMainForm.Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); +procedure TMainForm.CEFSentinel1Close(Sender: TObject); begin FCanClose := True; PostMessage(Handle, WM_CLOSE, 0, 0); end; +procedure TMainForm.Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); +begin + CEFSentinel1.Start; +end; + procedure TMainForm.Chromium1Close(Sender: TObject; const browser: ICefBrowser; var aAction: TCefCloseBrowserAction); begin diff --git a/demos/Lazarus/PostInspectorBrowser/PostInspectorBrowser.lps b/demos/Lazarus/PostInspectorBrowser/PostInspectorBrowser.lps index cbb7c8c8..8ab5ac07 100644 --- a/demos/Lazarus/PostInspectorBrowser/PostInspectorBrowser.lps +++ b/demos/Lazarus/PostInspectorBrowser/PostInspectorBrowser.lps @@ -8,8 +8,7 @@ - - + @@ -21,10 +20,13 @@ - - - + + + + + + @@ -72,10 +74,18 @@ - + + + + + + + + + diff --git a/demos/Lazarus/PostInspectorBrowser/uPostInspectorBrowser.lfm b/demos/Lazarus/PostInspectorBrowser/uPostInspectorBrowser.lfm index 33f35539..48f6e315 100644 --- a/demos/Lazarus/PostInspectorBrowser/uPostInspectorBrowser.lfm +++ b/demos/Lazarus/PostInspectorBrowser/uPostInspectorBrowser.lfm @@ -94,4 +94,9 @@ object Form1: TForm1 left = 56 top = 152 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + left = 56 + top = 216 + end end diff --git a/demos/Lazarus/PostInspectorBrowser/uPostInspectorBrowser.pas b/demos/Lazarus/PostInspectorBrowser/uPostInspectorBrowser.pas index faed5a1d..cfcbafb1 100644 --- a/demos/Lazarus/PostInspectorBrowser/uPostInspectorBrowser.pas +++ b/demos/Lazarus/PostInspectorBrowser/uPostInspectorBrowser.pas @@ -50,14 +50,18 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, SyncObjs, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFConstants, uCEFTypes, - uCEFWinControl; + uCEFWinControl, uCEFSentinel; const CEF_SHOWDATA = WM_APP + $B00; type + + { TForm1 } + TForm1 = class(TForm) AddressPnl: TPanel; + CEFSentinel1: TCEFSentinel; GoBtn: TButton; Timer1: TTimer; Chromium1: TChromium; @@ -65,6 +69,7 @@ type Memo1: TMemo; AddressCb: TComboBox; Splitter1: TSplitter; + procedure CEFSentinel1Close(Sender: TObject); procedure GoBtnClick(Sender: TObject); procedure FormShow(Sender: TObject); procedure Timer1Timer(Sender: TObject); @@ -136,13 +141,12 @@ uses // After the request has been handled we send a custom message to the form (CEF_SHOWDATA) // to add the information to the TMemo safely in the main thread. - // Destruction steps // ================= // 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. // 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. -// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form. - +// 3. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure CreateGlobalCEFApp; begin @@ -391,8 +395,7 @@ end; procedure TForm1.Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TForm1.Chromium1BeforePopup(Sender: TObject; @@ -433,6 +436,12 @@ begin Chromium1.LoadURL(AddressCb.Text); end; +procedure TForm1.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TForm1.Timer1Timer(Sender: TObject); begin Timer1.Enabled := False; diff --git a/demos/Lazarus/SchemeRegistrationBrowser/SchemeRegistrationBrowser.lps b/demos/Lazarus/SchemeRegistrationBrowser/SchemeRegistrationBrowser.lps index 6431de81..b69c3bd4 100644 --- a/demos/Lazarus/SchemeRegistrationBrowser/SchemeRegistrationBrowser.lps +++ b/demos/Lazarus/SchemeRegistrationBrowser/SchemeRegistrationBrowser.lps @@ -22,8 +22,8 @@ - - + + @@ -54,7 +54,7 @@ - + @@ -147,6 +147,14 @@ + + + + + + + + diff --git a/demos/Lazarus/SchemeRegistrationBrowser/uSchemeRegistrationBrowser.lfm b/demos/Lazarus/SchemeRegistrationBrowser/uSchemeRegistrationBrowser.lfm index d056e4ec..f3d6a345 100644 --- a/demos/Lazarus/SchemeRegistrationBrowser/uSchemeRegistrationBrowser.lfm +++ b/demos/Lazarus/SchemeRegistrationBrowser/uSchemeRegistrationBrowser.lfm @@ -79,4 +79,9 @@ object SchemeRegistrationBrowserFrm: TSchemeRegistrationBrowserFrm left = 16 top = 96 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + left = 16 + top = 160 + end end diff --git a/demos/Lazarus/SchemeRegistrationBrowser/uSchemeRegistrationBrowser.pas b/demos/Lazarus/SchemeRegistrationBrowser/uSchemeRegistrationBrowser.pas index 9cc603f3..37ffcdf3 100644 --- a/demos/Lazarus/SchemeRegistrationBrowser/uSchemeRegistrationBrowser.pas +++ b/demos/Lazarus/SchemeRegistrationBrowser/uSchemeRegistrationBrowser.pas @@ -53,20 +53,25 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Types, ComCtrls, ClipBrd, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFApplication, uCEFSchemeRegistrar, - uCEFTypes, uCEFConstants, uCEFWinControl; + uCEFTypes, uCEFConstants, uCEFWinControl, uCEFSentinel; const MINIBROWSER_CONTEXTMENU_REGSCHEME = MENU_ID_USER_FIRST + 1; MINIBROWSER_CONTEXTMENU_CLEARFACT = MENU_ID_USER_FIRST + 2; type + + { TSchemeRegistrationBrowserFrm } + TSchemeRegistrationBrowserFrm = class(TForm) AddressBarPnl: TPanel; + CEFSentinel1: TCEFSentinel; GoBtn: TButton; CEFWindowParent1: TCEFWindowParent; Chromium1: TChromium; AddressCbx: TComboBox; Timer1: TTimer; + procedure CEFSentinel1Close(Sender: TObject); procedure Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); procedure Chromium1BeforeContextMenu(Sender: TObject; @@ -126,7 +131,8 @@ uses // ================= // 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. // 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. -// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form. +// 3. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure GlobalCEFApp_OnRegCustomSchemes(const registrar: TCefSchemeRegistrarRef); begin @@ -144,13 +150,18 @@ begin PostMessage(Handle, CEF_AFTERCREATED, 0, 0); end; -procedure TSchemeRegistrationBrowserFrm.Chromium1BeforeClose( - Sender: TObject; const browser: ICefBrowser); +procedure TSchemeRegistrationBrowserFrm.CEFSentinel1Close(Sender: TObject); begin FCanClose := True; PostMessage(Handle, WM_CLOSE, 0, 0); end; +procedure TSchemeRegistrationBrowserFrm.Chromium1BeforeClose( + Sender: TObject; const browser: ICefBrowser); +begin + CEFSentinel1.Start; +end; + procedure TSchemeRegistrationBrowserFrm.Chromium1BeforeContextMenu( Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const params: ICefContextMenuParams; const model: ICefMenuModel); diff --git a/demos/Lazarus/SimpleBrowser/SimpleBrowser.lps b/demos/Lazarus/SimpleBrowser/SimpleBrowser.lps index a5c6bf78..5dde9ff8 100644 --- a/demos/Lazarus/SimpleBrowser/SimpleBrowser.lps +++ b/demos/Lazarus/SimpleBrowser/SimpleBrowser.lps @@ -22,8 +22,8 @@ - - + + @@ -38,7 +38,7 @@ - + @@ -55,6 +55,14 @@ + + + + + + + + diff --git a/demos/Lazarus/SimpleBrowser/uSimpleBrowser.lfm b/demos/Lazarus/SimpleBrowser/uSimpleBrowser.lfm index 8cf4b3c1..54d4a46b 100644 --- a/demos/Lazarus/SimpleBrowser/uSimpleBrowser.lfm +++ b/demos/Lazarus/SimpleBrowser/uSimpleBrowser.lfm @@ -65,4 +65,9 @@ object Form1: TForm1 left = 56 top = 88 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + left = 56 + top = 154 + end end diff --git a/demos/Lazarus/SimpleBrowser/uSimpleBrowser.pas b/demos/Lazarus/SimpleBrowser/uSimpleBrowser.pas index d091cb96..333e2dde 100644 --- a/demos/Lazarus/SimpleBrowser/uSimpleBrowser.pas +++ b/demos/Lazarus/SimpleBrowser/uSimpleBrowser.pas @@ -50,15 +50,20 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFChromiumWindow, uCEFTypes, uCEFInterfaces, - uCEFWinControl; + uCEFWinControl, uCEFSentinel; type + + { TForm1 } + TForm1 = class(TForm) + CEFSentinel1: TCEFSentinel; ChromiumWindow1: TChromiumWindow; AddressPnl: TPanel; AddressEdt: TEdit; GoBtn: TButton; Timer1: TTimer; + procedure CEFSentinel1Close(Sender: TObject); procedure GoBtnClick(Sender: TObject); procedure FormShow(Sender: TObject); procedure ChromiumWindow1AfterCreated(Sender: TObject); @@ -114,7 +119,8 @@ uses // ================= // 1. The FormCloseQuery event sets CanClose to False and calls TChromiumWindow.CloseBrowser, which triggers the TChromiumWindow.OnClose event. // 2. The TChromiumWindow.OnClose event calls TChromiumWindow.DestroyChildWindow which triggers the TChromiumWindow.OnBeforeClose event. -// 3. TChromiumWindow.OnBeforeClose sets FCanClose to True and closes the form. +// 3. TChromiumWindow.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure CreateGlobalCEFApp; @@ -165,18 +171,13 @@ end; procedure TForm1.ChromiumWindow1BeforeClose(Sender: TObject); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TForm1.ChromiumWindow1Close(Sender: TObject); begin // DestroyChildWindow will destroy the child window created by CEF at the top of the Z order. - if not(ChromiumWindow1.DestroyChildWindow) then - begin - FCanClose := True; - Close; - end; + if not(ChromiumWindow1.DestroyChildWindow) then CEFSentinel1.Start; end; procedure TForm1.Chromium_OnBeforePopup(Sender: TObject; @@ -207,6 +208,12 @@ begin ChromiumWindow1.LoadURL(AddressEdt.Text); end; +procedure TForm1.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TForm1.Timer1Timer(Sender: TObject); begin Timer1.Enabled := False; diff --git a/demos/Lazarus/SimpleBrowser2/SimpleBrowser2.lps b/demos/Lazarus/SimpleBrowser2/SimpleBrowser2.lps index 4e8e82b9..4325faec 100644 --- a/demos/Lazarus/SimpleBrowser2/SimpleBrowser2.lps +++ b/demos/Lazarus/SimpleBrowser2/SimpleBrowser2.lps @@ -35,8 +35,8 @@ - - + + @@ -423,7 +423,7 @@ - + @@ -457,13 +457,9 @@ - - - - - + diff --git a/demos/Lazarus/SimpleBrowser2/usimplelazarusbrowser.pas b/demos/Lazarus/SimpleBrowser2/usimplelazarusbrowser.pas index 827d02a4..b59cf375 100644 --- a/demos/Lazarus/SimpleBrowser2/usimplelazarusbrowser.pas +++ b/demos/Lazarus/SimpleBrowser2/usimplelazarusbrowser.pas @@ -119,6 +119,13 @@ implementation // This demo uses a TChromium and a TCEFWindowParent +// Destruction steps +// ================= +// 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. +// 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event. +// 3. TChromium.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. + uses uCEFApplication; diff --git a/demos/Lazarus/SimpleExternalPumpBrowser/SimpleExternalPumpBrowser.lps b/demos/Lazarus/SimpleExternalPumpBrowser/SimpleExternalPumpBrowser.lps index 75048ba7..8f6a1321 100644 --- a/demos/Lazarus/SimpleExternalPumpBrowser/SimpleExternalPumpBrowser.lps +++ b/demos/Lazarus/SimpleExternalPumpBrowser/SimpleExternalPumpBrowser.lps @@ -22,15 +22,15 @@ - - + + - + @@ -58,6 +58,14 @@ + + + + + + + + diff --git a/demos/Lazarus/SimpleExternalPumpBrowser/uSimpleExternalPumpBrowser.lfm b/demos/Lazarus/SimpleExternalPumpBrowser/uSimpleExternalPumpBrowser.lfm index 972fbe03..2bb01891 100644 --- a/demos/Lazarus/SimpleExternalPumpBrowser/uSimpleExternalPumpBrowser.lfm +++ b/demos/Lazarus/SimpleExternalPumpBrowser/uSimpleExternalPumpBrowser.lfm @@ -85,4 +85,9 @@ object SimpleExternalPumpBrowserFrm: TSimpleExternalPumpBrowserFrm left = 56 top = 88 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + left = 56 + top = 168 + end end diff --git a/demos/Lazarus/SimpleExternalPumpBrowser/uSimpleExternalPumpBrowser.pas b/demos/Lazarus/SimpleExternalPumpBrowser/uSimpleExternalPumpBrowser.pas index d50e9f4b..694caa9c 100644 --- a/demos/Lazarus/SimpleExternalPumpBrowser/uSimpleExternalPumpBrowser.pas +++ b/demos/Lazarus/SimpleExternalPumpBrowser/uSimpleExternalPumpBrowser.pas @@ -50,16 +50,21 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFTypes, uCEFConstants, uCEFInterfaces, uCEFWorkScheduler, - uCEFChromiumWindow {, Vcl.ComCtrls, Vcl.AppEvnts}; + uCEFChromiumWindow, uCEFSentinel {, Vcl.ComCtrls, Vcl.AppEvnts}; type + + { TSimpleExternalPumpBrowserFrm } + TSimpleExternalPumpBrowserFrm = class(TForm) AddressPnl: TPanel; + CEFSentinel1: TCEFSentinel; GoBtn: TButton; Timer1: TTimer; URLCbx: TComboBox; ChromiumWindow1: TChromiumWindow; + procedure CEFSentinel1Close(Sender: TObject); procedure GoBtnClick(Sender: TObject); procedure FormShow(Sender: TObject); procedure Timer1Timer(Sender: TObject); @@ -101,7 +106,8 @@ uses // It was necessary to destroy the browser with the following destruction sequence : // 1. The FormCloseQuery event sets CanClose to False and calls TChromiumWindow.CloseBrowser, which triggers the TChromiumWindow.OnClose event. // 2. The TChromiumWindow.OnClose event calls TChromiumWindow.DestroyChildWindow which triggers the TChromiumWindow.OnBeforeClose event. -// 3. TChromiumWindow.OnBeforeClose sets FCanClose to True and closes the form. +// 3. TChromiumWindow.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure GlobalCEFApp_OnScheduleMessagePumpWork(const aDelayMS : int64); begin @@ -174,18 +180,13 @@ end; procedure TSimpleExternalPumpBrowserFrm.ChromiumWindow1BeforeClose(Sender: TObject); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TSimpleExternalPumpBrowserFrm.ChromiumWindow1Close(Sender: TObject); begin // DestroyChildWindow will destroy the child window created by CEF at the top of the Z order. - if not(ChromiumWindow1.DestroyChildWindow) then - begin - FCanClose := True; - Close; - end; + if not(ChromiumWindow1.DestroyChildWindow) then CEFSentinel1.Start; end; procedure TSimpleExternalPumpBrowserFrm.GoBtnClick(Sender: TObject); @@ -193,6 +194,12 @@ begin ChromiumWindow1.LoadURL(URLCbx.Text); end; +procedure TSimpleExternalPumpBrowserFrm.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TSimpleExternalPumpBrowserFrm.Timer1Timer(Sender: TObject); begin Timer1.Enabled := False; diff --git a/demos/Lazarus/SimpleOSRBrowser/SimpleOSRBrowser.lps b/demos/Lazarus/SimpleOSRBrowser/SimpleOSRBrowser.lps index 9445c423..f8729352 100644 --- a/demos/Lazarus/SimpleOSRBrowser/SimpleOSRBrowser.lps +++ b/demos/Lazarus/SimpleOSRBrowser/SimpleOSRBrowser.lps @@ -38,11 +38,11 @@ - - + + - + @@ -229,7 +229,7 @@ - + @@ -258,6 +258,18 @@ + + + + + + + + + + + + diff --git a/demos/Lazarus/SimpleOSRBrowser/usimplelazosrbrowser.lfm b/demos/Lazarus/SimpleOSRBrowser/usimplelazosrbrowser.lfm index 7961e768..45de383f 100644 --- a/demos/Lazarus/SimpleOSRBrowser/usimplelazosrbrowser.lfm +++ b/demos/Lazarus/SimpleOSRBrowser/usimplelazosrbrowser.lfm @@ -139,4 +139,9 @@ object Form1: TForm1 left = 24 top = 128 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + left = 24 + top = 272 + end end diff --git a/demos/Lazarus/SimpleOSRBrowser/usimplelazosrbrowser.pas b/demos/Lazarus/SimpleOSRBrowser/usimplelazosrbrowser.pas index 6bbf00b1..e9b7aa5d 100644 --- a/demos/Lazarus/SimpleOSRBrowser/usimplelazosrbrowser.pas +++ b/demos/Lazarus/SimpleOSRBrowser/usimplelazosrbrowser.pas @@ -42,15 +42,17 @@ unit usimplelazosrbrowser; interface uses - Windows, LCLIntf, LCLType, LMessages, Messages, SysUtils, Variants, Classes, SyncObjs, - Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Types, - uCEFChromium, uCEFTypes, uCEFInterfaces, uCEFConstants, uCEFBufferPanel, uCEFChromiumEvents; + Windows, LCLIntf, LCLType, LMessages, Messages, SysUtils, Variants, Classes, + SyncObjs, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Types, + uCEFChromium, uCEFTypes, uCEFInterfaces, uCEFConstants, uCEFBufferPanel, + uCEFChromiumEvents, uCEFSentinel; type { TForm1 } TForm1 = class(TForm) + CEFSentinel1: TCEFSentinel; NavControlPnl: TPanel; chrmosr: TChromium; ComboBox1: TComboBox; @@ -61,6 +63,7 @@ type Timer1: TTimer; Panel1: TBufferPanel; + procedure CEFSentinel1Close(Sender: TObject); procedure GoBtnClick(Sender: TObject); procedure GoBtnEnter(Sender: TObject); @@ -167,7 +170,8 @@ uses // 2- chrmosr.CloseBrowser(True) will trigger chrmosr.OnClose and we have to // set "Result" to false and CEF3 will destroy the internal browser immediately. // 3- chrmosr.OnBeforeClose is triggered because the internal browser was destroyed. -// Now we set FCanClose to True and send WM_CLOSE to the form. +// Now we call TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4- TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure CreateGlobalCEFApp; @@ -187,6 +191,12 @@ begin chrmosr.LoadURL(ComboBox1.Text); end; +procedure TForm1.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TForm1.chrmosrIMECompositionRangeChanged( Sender : TObject; const browser : ICefBrowser; const selected_range : PCefRange; @@ -248,8 +258,7 @@ end; procedure TForm1.chrmosrBeforeClose(Sender: TObject; const browser: ICefBrowser); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TForm1.Panel1UTF8KeyPress(Sender: TObject; var UTF8Key: TUTF8Char); diff --git a/demos/Lazarus/SubProcess/SimpleBrowser.lps b/demos/Lazarus/SubProcess/SimpleBrowser.lps index 0307073e..788a2725 100644 --- a/demos/Lazarus/SubProcess/SimpleBrowser.lps +++ b/demos/Lazarus/SubProcess/SimpleBrowser.lps @@ -20,9 +20,10 @@ + - - + + @@ -31,16 +32,15 @@ - - + - + @@ -56,6 +56,14 @@ + + + + + + + + diff --git a/demos/Lazarus/SubProcess/uSimpleBrowser.lfm b/demos/Lazarus/SubProcess/uSimpleBrowser.lfm index 993dfd98..4f5fbe88 100644 --- a/demos/Lazarus/SubProcess/uSimpleBrowser.lfm +++ b/demos/Lazarus/SubProcess/uSimpleBrowser.lfm @@ -13,7 +13,7 @@ object Form1: TForm1 OnCloseQuery = FormCloseQuery OnShow = FormShow Position = poScreenCenter - LCLVersion = '2.0.2.0' + LCLVersion = '2.0.4.0' object ChromiumWindow1: TChromiumWindow Left = 0 Height = 603 @@ -63,4 +63,9 @@ object Form1: TForm1 left = 80 top = 88 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + left = 80 + top = 168 + end end diff --git a/demos/Lazarus/SubProcess/uSimpleBrowser.pas b/demos/Lazarus/SubProcess/uSimpleBrowser.pas index 6137147d..d3cb7663 100644 --- a/demos/Lazarus/SubProcess/uSimpleBrowser.pas +++ b/demos/Lazarus/SubProcess/uSimpleBrowser.pas @@ -50,15 +50,20 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFChromiumWindow, uCEFTypes, uCEFInterfaces, - uCEFWinControl; + uCEFWinControl, uCEFSentinel; type + + { TForm1 } + TForm1 = class(TForm) + CEFSentinel1: TCEFSentinel; ChromiumWindow1: TChromiumWindow; AddressPnl: TPanel; AddressEdt: TEdit; GoBtn: TButton; Timer1: TTimer; + procedure CEFSentinel1Close(Sender: TObject); procedure GoBtnClick(Sender: TObject); procedure FormShow(Sender: TObject); procedure ChromiumWindow1AfterCreated(Sender: TObject); @@ -110,7 +115,8 @@ uses // ================= // 1. The FormCloseQuery event sets CanClose to False and calls TChromiumWindow.CloseBrowser, which triggers the TChromiumWindow.OnClose event. // 2. The TChromiumWindow.OnClose event calls TChromiumWindow.DestroyChildWindow which triggers the TChromiumWindow.OnBeforeClose event. -// 3. TChromiumWindow.OnBeforeClose sets FCanClose to True and closes the form. +// 3. TChromiumWindow.OnBeforeClose calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sets FCanClose := True and sends WM_CLOSE to the form. procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin @@ -147,17 +153,12 @@ end; procedure TForm1.ChromiumWindow1Close(Sender: TObject); begin // DestroyChildWindow will destroy the child window created by CEF at the top of the Z order. - if not(ChromiumWindow1.DestroyChildWindow) then - begin - FCanClose := True; - Close; - end; + if not(ChromiumWindow1.DestroyChildWindow) then CEFSentinel1.Start; end; procedure TForm1.ChromiumWindow1BeforeClose(Sender: TObject); begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); + CEFSentinel1.Start; end; procedure TForm1.Chromium_OnBeforePopup(Sender: TObject; @@ -188,6 +189,12 @@ begin ChromiumWindow1.LoadURL(AddressEdt.Text); end; +procedure TForm1.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TForm1.Timer1Timer(Sender: TObject); begin Timer1.Enabled := False; diff --git a/demos/Lazarus/TabbedBrowser/TabBrowser.lps b/demos/Lazarus/TabbedBrowser/TabBrowser.lps index cc34764b..fc8ead76 100644 --- a/demos/Lazarus/TabbedBrowser/TabBrowser.lps +++ b/demos/Lazarus/TabbedBrowser/TabBrowser.lps @@ -22,11 +22,11 @@ - - + + - + diff --git a/demos/Lazarus/TabbedBrowser/uMainForm.pas b/demos/Lazarus/TabbedBrowser/uMainForm.pas index d5d35c09..554089ba 100644 --- a/demos/Lazarus/TabbedBrowser/uMainForm.pas +++ b/demos/Lazarus/TabbedBrowser/uMainForm.pas @@ -150,7 +150,9 @@ implementation // This is the destruction sequence when the user closes the main form // 1. FormCloseQuery hides the form and calls CloseAllBrowsers which calls TChromium.CloseBrowser in all tabs and triggers the TChromium.OnClose event. // 2. TChromium.OnClose sends a CEFBROWSER_DESTROYWNDPARENT message to destroy TCEFWindowParent in the main thread which triggers a TChromium.OnBeforeClose event. -// 3. TChromium.OnBeforeClose sends a CEFBROWSER_CHECKTAGGEDTABS message to set the TAG property to 1 in the TabSheet containing the TChromium. Then sends WM_CLOSE in case all tabsheets have a TAG = 1. +// 3. TChromium.OnBeforeClose sends a CEFBROWSER_CHECKTAGGEDTABS message to set the TAG property to 1 in the TabSheet containing the TChromium. +// When all tabsheets have a TAG = 1 it calls TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when the renderer processes are closed. +// 4. TCEFSentinel.OnClose sends WM_CLOSE to the form. procedure GlobalCEFApp_OnContextInitialized; begin diff --git a/demos/Lazarus/ToolBoxBrowser/ToolBoxBrowser.lps b/demos/Lazarus/ToolBoxBrowser/ToolBoxBrowser.lps index 9bbc5798..255d326f 100644 --- a/demos/Lazarus/ToolBoxBrowser/ToolBoxBrowser.lps +++ b/demos/Lazarus/ToolBoxBrowser/ToolBoxBrowser.lps @@ -22,12 +22,12 @@ - - + + - - + + diff --git a/demos/Lazarus/ToolBoxBrowser/uMainForm.pas b/demos/Lazarus/ToolBoxBrowser/uMainForm.pas index 1a1d98c8..44fcbb03 100644 --- a/demos/Lazarus/ToolBoxBrowser/uMainForm.pas +++ b/demos/Lazarus/ToolBoxBrowser/uMainForm.pas @@ -107,7 +107,8 @@ uses // Destruction steps // ================= // 1. Destroy all child forms -// 2. Wait until all the child forms are closed before closing the main form and terminating the application. +// 2. Wait until all the child forms are closed before calling TCEFSentinel.Start, which will trigger TCEFSentinel.OnClose when all renderer processes are closed +// 3. TCEFSentinel.OnClose closes the main form. procedure GlobalCEFApp_OnContextInitialized; begin diff --git a/demos/Lazarus/URLRequest/URLRequest.lps b/demos/Lazarus/URLRequest/URLRequest.lps index e6172724..fee8bbe9 100644 --- a/demos/Lazarus/URLRequest/URLRequest.lps +++ b/demos/Lazarus/URLRequest/URLRequest.lps @@ -20,9 +20,10 @@ + - - + + @@ -37,31 +38,27 @@ - - + + - - + - - - + - - + @@ -90,41 +87,37 @@ - - + + - - + + - - + + - - + + - + - + - + - + - - - - diff --git a/demos/Lazarus/URLRequest/uURLRequest.lfm b/demos/Lazarus/URLRequest/uURLRequest.lfm index 172ec8da..0988ab9d 100644 --- a/demos/Lazarus/URLRequest/uURLRequest.lfm +++ b/demos/Lazarus/URLRequest/uURLRequest.lfm @@ -203,4 +203,9 @@ object URLRequestFrm: TURLRequestFrm left = 304 top = 104 end + object CEFSentinel1: TCEFSentinel + OnClose = CEFSentinel1Close + left = 152 + top = 112 + end end diff --git a/demos/Lazarus/URLRequest/uURLRequest.pas b/demos/Lazarus/URLRequest/uURLRequest.pas index b77dc9b8..ff7c4d1a 100644 --- a/demos/Lazarus/URLRequest/uURLRequest.pas +++ b/demos/Lazarus/URLRequest/uURLRequest.pas @@ -49,14 +49,19 @@ uses LCLIntf, LCLType, LMessages, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls, {$ENDIF} - uCEFInterfaces, uCEFUrlRequestClientComponent, uCEFRequest, uCEFUrlRequest; + uCEFInterfaces, uCEFUrlRequestClientComponent, uCEFRequest, uCEFUrlRequest, + uCEFSentinel; const URLREQUEST_SUCCESS = WM_APP + $101; URLREQUEST_ERROR = WM_APP + $102; type + + { TURLRequestFrm } + TURLRequestFrm = class(TForm) + CEFSentinel1: TCEFSentinel; StatusBar1: TStatusBar; SaveDialog1: TSaveDialog; CEFUrlRequestClientComponent1: TCEFUrlRequestClientComponent; @@ -80,6 +85,7 @@ type PostParam2NameEdt: TEdit; PostParam2ValueEdt: TEdit; + procedure CEFSentinel1Close(Sender: TObject); procedure DownloadBtnClick(Sender: TObject); procedure SendPostReqBtnClick(Sender: TObject); @@ -197,6 +203,12 @@ begin end; end; +procedure TURLRequestFrm.CEFSentinel1Close(Sender: TObject); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + procedure TURLRequestFrm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin CanClose := FCanClose or not(FBusy); @@ -346,10 +358,7 @@ begin // Use request.response here to get a ICefResponse interface with all the response headers, status, error code, etc. if FClosing then - begin - FCanClose := True; - PostMessage(Handle, WM_CLOSE, 0, 0); - end + CEFSentinel1.Start else if (request <> nil) and (request.RequestStatus = UR_SUCCESS) then PostMessage(Handle, URLREQUEST_SUCCESS, 0, 0) diff --git a/source/uCEFChromium.pas b/source/uCEFChromium.pas index fcd64c92..99d601fc 100644 --- a/source/uCEFChromium.pas +++ b/source/uCEFChromium.pas @@ -722,9 +722,9 @@ type property OnHttpAuthCredentialsCleared : TNotifyEvent read FOnHttpAuthCredentialsCleared write FOnHttpAuthCredentialsCleared; property OnAllConnectionsClosed : TNotifyEvent read FOnAllConnectionsClosed write FOnAllConnectionsClosed; {$IFNDEF FPC} - property OnBrowserCompMsg : TOnCompMsgEvent read FOnBrowserCompMsg write FOnBrowserCompMsg; - property OnWidgetCompMsg : TOnCompMsgEvent read FOnWidgetCompMsg write FOnWidgetCompMsg; - property OnRenderCompMsg : TOnCompMsgEvent read FOnRenderCompMsg write FOnRenderCompMsg; + property OnBrowserCompMsg : TOnCompMsgEvent read FOnBrowserCompMsg write FOnBrowserCompMsg; + property OnWidgetCompMsg : TOnCompMsgEvent read FOnWidgetCompMsg write FOnWidgetCompMsg; + property OnRenderCompMsg : TOnCompMsgEvent read FOnRenderCompMsg write FOnRenderCompMsg; {$ENDIF} // ICefClient @@ -3376,13 +3376,13 @@ end; function TChromium.MustCreateResourceRequestHandler : boolean; begin - Result := assigned(FOnBeforeResourceLoad) or - assigned(FOnGetResourceHandler) or - assigned(FOnResourceRedirect) or - assigned(FOnResourceResponse) or + Result := assigned(FOnBeforeResourceLoad) or + assigned(FOnGetResourceHandler) or + assigned(FOnResourceRedirect) or + assigned(FOnResourceResponse) or assigned(FOnGetResourceResponseFilter) or - assigned(FOnResourceLoadComplete) or - assigned(FOnProtocolExecution) or + assigned(FOnResourceLoadComplete) or + assigned(FOnProtocolExecution) or MustCreateCookieAccessFilter; end; diff --git a/update_CEF4Delphi.json b/update_CEF4Delphi.json index 80e36aae..1ea981eb 100644 --- a/update_CEF4Delphi.json +++ b/update_CEF4Delphi.json @@ -2,7 +2,7 @@ "UpdateLazPackages" : [ { "ForceNotify" : true, - "InternalVersion" : 43, + "InternalVersion" : 44, "Name" : "cef4delphi_lazarus.lpk", "Version" : "77.1.13.0" } From 4756bd864a22413a595ec3f9b708252592910cd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Salvador=20D=C3=ADaz=20Fau?= Date: Tue, 15 Oct 2019 11:22:42 +0200 Subject: [PATCH 13/13] Update to CEF 77.1.14 --- README.md | 9 ++++++--- packages/cef4delphi_lazarus.lpk | 2 +- source/uCEFApplication.pas | 4 ++-- update_CEF4Delphi.json | 6 +++--- 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 7a41ee29..af7f007f 100644 --- a/README.md +++ b/README.md @@ -3,10 +3,10 @@ CEF4Delphi is an open source project created by Salvador D 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 77.1.13 which includes Chromium 77.0.3865.90. +CEF4Delphi uses CEF 77.1.14 which includes Chromium 77.0.3865.120. The CEF binaries used by CEF4Delphi are available for download at spotify : -* [32 bits](http://opensource.spotify.com/cefbuilds/cef_binary_77.1.13%2Bg676b147%2Bchromium-77.0.3865.90_windows32.tar.bz2) -* [64 bits](http://opensource.spotify.com/cefbuilds/cef_binary_77.1.13%2Bg676b147%2Bchromium-77.0.3865.90_windows64.tar.bz2) +* [32 bits](http://opensource.spotify.com/cefbuilds/cef_binary_77.1.14%2Bg4fb61d2%2Bchromium-77.0.3865.120_windows32.tar.bz2) +* [64 bits](http://opensource.spotify.com/cefbuilds/cef_binary_77.1.14%2Bg4fb61d2%2Bchromium-77.0.3865.120_windows64.tar.bz2) CEF4Delphi was developed and tested on Delphi 10.3 Rio and it has been tested in Delphi 7, Delphi XE, Delphi 10, Delphi 10.2 and Lazarus 2.0.4/FPC 3.0.4. CEF4Delphi includes VCL, FireMonkey (FMX) and Lazarus components. @@ -16,6 +16,9 @@ CEF4Delphi was developed and tested on Delphi 10.3 Rio and it has been tested in * [Developer Forums](https://www.briskbard.com/forum) * These components need Windows 7, 8, 8.1, 10 or newer to run. If you need Windows XP and Vista support use [OldCEF4Delphi](https://github.com/salvadordf/OldCEF4Delphi) +## Stable releases +This is the development branch and it may have issues. Use the [latest release](https://github.com/salvadordf/CEF4Delphi/releases) if you need a stable component. + ## Suppport If you find this project useful, please consider making a donation. diff --git a/packages/cef4delphi_lazarus.lpk b/packages/cef4delphi_lazarus.lpk index c8aa66e2..d5724d65 100644 --- a/packages/cef4delphi_lazarus.lpk +++ b/packages/cef4delphi_lazarus.lpk @@ -21,7 +21,7 @@ - + diff --git a/source/uCEFApplication.pas b/source/uCEFApplication.pas index cdf9d737..68950c1b 100644 --- a/source/uCEFApplication.pas +++ b/source/uCEFApplication.pas @@ -62,13 +62,13 @@ uses const CEF_SUPPORTED_VERSION_MAJOR = 77; CEF_SUPPORTED_VERSION_MINOR = 1; - CEF_SUPPORTED_VERSION_RELEASE = 13; + CEF_SUPPORTED_VERSION_RELEASE = 14; CEF_SUPPORTED_VERSION_BUILD = 0; CEF_CHROMEELF_VERSION_MAJOR = 77; CEF_CHROMEELF_VERSION_MINOR = 0; CEF_CHROMEELF_VERSION_RELEASE = 3865; - CEF_CHROMEELF_VERSION_BUILD = 90; + CEF_CHROMEELF_VERSION_BUILD = 120; {$IFDEF MSWINDOWS} LIBCEF_DLL = 'libcef.dll'; diff --git a/update_CEF4Delphi.json b/update_CEF4Delphi.json index 1ea981eb..b8f2787f 100644 --- a/update_CEF4Delphi.json +++ b/update_CEF4Delphi.json @@ -1,10 +1,10 @@ { "UpdateLazPackages" : [ { - "ForceNotify" : true, - "InternalVersion" : 44, + "ForceNotify" : false, + "InternalVersion" : 45, "Name" : "cef4delphi_lazarus.lpk", - "Version" : "77.1.13.0" + "Version" : "77.1.14.0" } ], "UpdatePackageData" : {