From bf402109bfcb896519d35db1270265035cca29e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Salvador=20D=C3=ADaz=20Fau?= Date: Sun, 17 Jun 2018 14:18:11 +0200 Subject: [PATCH] Added GlobalCEFApp.DisablePDFExtension property - Bug fix #89 - New SimpleLazOSRBrowser demo --- demos/DOMVisitor/DOMVisitor.dpr | 21 +- demos/DOMVisitor/uDOMVisitor.dfm | 1 - demos/DOMVisitor/uDOMVisitor.pas | 18 +- .../ExternalPumpBrowser.dpr | 20 +- .../uExternalPumpBrowser.pas | 17 +- .../FMXExternalPumpBrowser.dpr | 21 +- .../uFMXExternalPumpBrowser.pas | 19 +- demos/FullScreenBrowser/FullScreenBrowser.dpr | 6 +- demos/JavaScript/JSEval/JSEval.dpr | 8 +- demos/JavaScript/JSEval/uJSEval.pas | 114 +-- .../JSExecutingFunctions.dpr | 9 +- .../uJSExecutingFunctions.pas | 13 +- demos/JavaScript/JSExtension/JSExtension.dpr | 8 +- demos/JavaScript/JSExtension/uJSExtension.pas | 8 +- .../JSExtensionWithFunction.dpr | 8 +- .../uJSExtensionWithFunction.pas | 8 +- .../JSExtensionWithObjectParameter.dpr | 8 +- .../JSExtensionWithObjectParameter.dproj | 2 +- .../uJSExtensionWithObjectParameter.pas | 8 +- .../JSRTTIExtension/JSRTTIExtension.dpr | 9 +- .../JSRTTIExtension/JSRTTIExtension.dproj | 2 +- .../JSRTTIExtension/uJSRTTIExtension.pas | 8 +- .../JSSimpleExtension/JSSimpleExtension.dpr | 8 +- .../JSSimpleExtension/uJSSimpleExtension.pas | 8 +- .../JSSimpleWindowBinding.dpr | 8 +- .../uJSSimpleWindowBinding.pas | 8 +- .../JSWindowBindingWithFunction.dpr | 8 +- .../uJSWindowBindingWithFunction.pas | 8 +- .../JSWindowBindingWithObject.dpr | 8 +- .../uJSWindowBindingWithObject.pas | 8 +- demos/MDIBrowser/MDIBrowser.dpr | 9 +- demos/MDIBrowser/uMainForm.dfm | 1 - demos/MDIBrowser/uMainForm.pas | 8 +- .../MDIExternalPumpBrowser.dpr | 21 +- demos/MDIExternalPumpBrowser/uMainForm.dfm | 5 +- demos/MDIExternalPumpBrowser/uMainForm.pas | 18 +- .../OSRExternalPumpBrowser.dpr | 22 +- .../uOSRExternalPumpBrowser.pas | 17 + .../SchemeRegistrationBrowser.dpr | 8 +- .../uSchemeRegistrationBrowser.pas | 8 +- demos/SimpleBrowser2/SimpleBrowser2.dpr | 2 - .../SimpleExternalPumpBrowser.dpr | 20 +- .../uSimpleExternalPumpBrowser.pas | 18 +- demos/SimpleFMXBrowser/SimpleFMXBrowser.dpr | 7 +- demos/SimpleLazOSRBrowser/00-Delete.bat | 2 + .../SimpleLazOSRBrowser.ico | Bin 0 -> 137040 bytes .../SimpleLazOSRBrowser.lpi | 92 ++ .../SimpleLazOSRBrowser.lpr | 68 ++ .../SimpleLazOSRBrowser.lps | 262 ++++++ .../SimpleLazOSRBrowser.res | Bin 0 -> 137304 bytes .../usimplelazosrbrowser.lfm | 139 +++ .../usimplelazosrbrowser.pas | 874 ++++++++++++++++++ demos/TabbedBrowser/TabBrowser.dpr | 9 +- demos/TabbedBrowser/uMainForm.pas | 8 +- demos/ToolBoxBrowser/ToolBoxBrowser.dpr | 9 +- demos/ToolBoxBrowser/uMainForm.pas | 8 +- source/uBufferPanel.pas | 8 +- source/uCEFApplication.pas | 13 + source/uCEFConstants.pas | 655 ++++++------- source/uCEFWorkScheduler.pas | 6 + source/uFMXWorkScheduler.pas | 7 + 61 files changed, 2141 insertions(+), 583 deletions(-) create mode 100644 demos/SimpleLazOSRBrowser/00-Delete.bat create mode 100644 demos/SimpleLazOSRBrowser/SimpleLazOSRBrowser.ico create mode 100644 demos/SimpleLazOSRBrowser/SimpleLazOSRBrowser.lpi create mode 100644 demos/SimpleLazOSRBrowser/SimpleLazOSRBrowser.lpr create mode 100644 demos/SimpleLazOSRBrowser/SimpleLazOSRBrowser.lps create mode 100644 demos/SimpleLazOSRBrowser/SimpleLazOSRBrowser.res create mode 100644 demos/SimpleLazOSRBrowser/usimplelazosrbrowser.lfm create mode 100644 demos/SimpleLazOSRBrowser/usimplelazosrbrowser.pas diff --git a/demos/DOMVisitor/DOMVisitor.dpr b/demos/DOMVisitor/DOMVisitor.dpr index df1543dc..57025819 100644 --- a/demos/DOMVisitor/DOMVisitor.dpr +++ b/demos/DOMVisitor/DOMVisitor.dpr @@ -48,7 +48,6 @@ uses Windows, {$ENDIF } uCEFApplication, - uCEFConstants, uDOMVisitor in 'uDOMVisitor.pas' {DOMVisitorFrm}; {$R *.res} @@ -56,25 +55,21 @@ uses {$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} begin - GlobalCEFApp := TCefApplication.Create; - GlobalCEFApp.RemoteDebuggingPort := 9000; - GlobalCEFApp.OnProcessMessageReceived := GlobalCEFApp_OnProcessMessageReceived; - - // 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. - // Remove it if you don't want to use the DOM visitor - GlobalCEFApp.LogFile := 'debug.log'; - GlobalCEFApp.LogSeverity := LOGSEVERITY_ERROR; - + // GlobalCEFApp creation and initialization moved to a different unit to fix the memory leak described in the bug #89 + // https://github.com/salvadordf/CEF4Delphi/issues/89 + CreateGlobalCEFApp; if GlobalCEFApp.StartMainProcess then begin + //ReportMemoryLeaksOnShutdown := True; + Application.Initialize; Application.MainFormOnTaskbar := True; Application.CreateForm(TDOMVisitorFrm, DOMVisitorFrm); Application.Run; end; - GlobalCEFApp.Free; - GlobalCEFApp := nil; + // This is not really necessary to fix the bug #89 but if you free GlobalCEFApp in a different unit + // then you can call 'FreeAndNil' without adding SysUtils to this DPR. + DestroyGlobalCEFApp; end. diff --git a/demos/DOMVisitor/uDOMVisitor.dfm b/demos/DOMVisitor/uDOMVisitor.dfm index e5981124..5da0dcc0 100644 --- a/demos/DOMVisitor/uDOMVisitor.dfm +++ b/demos/DOMVisitor/uDOMVisitor.dfm @@ -49,7 +49,6 @@ object DOMVisitorFrm: TDOMVisitorFrm Align = alClient TabOrder = 0 Text = 'https://www.google.com' - ExplicitWidth = 764 ExplicitHeight = 21 end object Panel1: TPanel diff --git a/demos/DOMVisitor/uDOMVisitor.pas b/demos/DOMVisitor/uDOMVisitor.pas index b64c259f..3ad61a9e 100644 --- a/demos/DOMVisitor/uDOMVisitor.pas +++ b/demos/DOMVisitor/uDOMVisitor.pas @@ -126,10 +126,7 @@ type var DOMVisitorFrm: TDOMVisitorFrm; -procedure GlobalCEFApp_OnProcessMessageReceived(const browser : ICefBrowser; - sourceProcess : TCefProcessId; - const message : ICefProcessMessage; - var aHandled : boolean); +procedure CreateGlobalCEFApp; implementation @@ -298,6 +295,19 @@ begin end; end; +procedure CreateGlobalCEFApp; +begin + GlobalCEFApp := TCefApplication.Create; + GlobalCEFApp.RemoteDebuggingPort := 9000; + GlobalCEFApp.OnProcessMessageReceived := GlobalCEFApp_OnProcessMessageReceived; + + // 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. + // Remove it if you don't want to use the DOM visitor + GlobalCEFApp.LogFile := 'debug.log'; + GlobalCEFApp.LogSeverity := LOGSEVERITY_ERROR; +end; + procedure TDOMVisitorFrm.Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); begin PostMessage(Handle, CEF_AFTERCREATED, 0, 0); diff --git a/demos/ExternalPumpBrowser/ExternalPumpBrowser.dpr b/demos/ExternalPumpBrowser/ExternalPumpBrowser.dpr index 88695424..275ede35 100644 --- a/demos/ExternalPumpBrowser/ExternalPumpBrowser.dpr +++ b/demos/ExternalPumpBrowser/ExternalPumpBrowser.dpr @@ -43,11 +43,9 @@ uses {$IFDEF DELPHI16_UP} Vcl.Forms, WinApi.Windows, - System.SysUtils, {$ELSE} Forms, Windows, - SysUtils, {$ENDIF } uCEFApplication, uCEFWorkScheduler, @@ -60,17 +58,9 @@ uses {$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} begin - // TCEFWorkScheduler will call cef_do_message_loop_work when - // it's told in the GlobalCEFApp.OnScheduleMessagePumpWork event. - // GlobalCEFWorkScheduler needs to be created before the - // GlobalCEFApp.StartMainProcess call. - GlobalCEFWorkScheduler := TCEFWorkScheduler.Create(nil); - - GlobalCEFApp := TCefApplication.Create; - GlobalCEFApp.FlashEnabled := False; - GlobalCEFApp.ExternalMessagePump := True; - GlobalCEFApp.MultiThreadedMessageLoop := False; - GlobalCEFApp.OnScheduleMessagePumpWork := GlobalCEFApp_OnScheduleMessagePumpWork; + // GlobalCEFApp creation and initialization moved to a different unit to fix the memory leak described in the bug #89 + // https://github.com/salvadordf/CEF4Delphi/issues/89 + CreateGlobalCEFApp; if GlobalCEFApp.StartMainProcess then begin @@ -87,6 +77,6 @@ begin GlobalCEFWorkScheduler.StopScheduler; end; - FreeAndNil(GlobalCEFApp); - FreeAndNil(GlobalCEFWorkScheduler); + DestroyGlobalCEFApp; + DestroyGlobalCEFWorkScheduler; end. diff --git a/demos/ExternalPumpBrowser/uExternalPumpBrowser.pas b/demos/ExternalPumpBrowser/uExternalPumpBrowser.pas index d022cd40..1aa2927e 100644 --- a/demos/ExternalPumpBrowser/uExternalPumpBrowser.pas +++ b/demos/ExternalPumpBrowser/uExternalPumpBrowser.pas @@ -96,7 +96,7 @@ type var ExternalPumpBrowserFrm : TExternalPumpBrowserFrm; -procedure GlobalCEFApp_OnScheduleMessagePumpWork(const aDelayMS : int64); +procedure CreateGlobalCEFApp; implementation @@ -113,6 +113,21 @@ begin if (GlobalCEFWorkScheduler <> nil) then GlobalCEFWorkScheduler.ScheduleMessagePumpWork(aDelayMS); end; +procedure CreateGlobalCEFApp; +begin + // TCEFWorkScheduler will call cef_do_message_loop_work when + // it's told in the GlobalCEFApp.OnScheduleMessagePumpWork event. + // GlobalCEFWorkScheduler needs to be created before the + // GlobalCEFApp.StartMainProcess call. + GlobalCEFWorkScheduler := TCEFWorkScheduler.Create(nil); + + GlobalCEFApp := TCefApplication.Create; + GlobalCEFApp.FlashEnabled := False; + GlobalCEFApp.ExternalMessagePump := True; + GlobalCEFApp.MultiThreadedMessageLoop := False; + GlobalCEFApp.OnScheduleMessagePumpWork := GlobalCEFApp_OnScheduleMessagePumpWork; +end; + procedure TExternalPumpBrowserFrm.FormCreate(Sender: TObject); begin FCanClose := False; diff --git a/demos/FMXExternalPumpBrowser/FMXExternalPumpBrowser.dpr b/demos/FMXExternalPumpBrowser/FMXExternalPumpBrowser.dpr index c6ce7784..8122fdd8 100644 --- a/demos/FMXExternalPumpBrowser/FMXExternalPumpBrowser.dpr +++ b/demos/FMXExternalPumpBrowser/FMXExternalPumpBrowser.dpr @@ -45,7 +45,6 @@ uses {$IFDEF MSWINDOWS} WinApi.Windows, {$ENDIF} - System.SysUtils, uCEFApplication, uFMXWorkScheduler, uFMXExternalPumpBrowser in 'uFMXExternalPumpBrowser.pas' {FMXExternalPumpBrowserFrm}, @@ -59,19 +58,9 @@ uses {$ENDIF} begin - // TFMXWorkScheduler will call cef_do_message_loop_work when - // it's told in the GlobalCEFApp.OnScheduleMessagePumpWork event. - // GlobalFMXWorkScheduler needs to be created before the - // GlobalCEFApp.StartMainProcess call. - GlobalFMXWorkScheduler := TFMXWorkScheduler.Create(nil); - - GlobalCEFApp := TCefApplication.Create; - GlobalCEFApp.WindowlessRenderingEnabled := True; - GlobalCEFApp.EnableHighDPISupport := True; - GlobalCEFApp.FlashEnabled := False; - GlobalCEFApp.ExternalMessagePump := True; - GlobalCEFApp.MultiThreadedMessageLoop := False; - GlobalCEFApp.OnScheduleMessagePumpWork := GlobalCEFApp_OnScheduleMessagePumpWork; + // GlobalCEFApp creation and initialization moved to a different unit to fix the memory leak described in the bug #89 + // https://github.com/salvadordf/CEF4Delphi/issues/89 + CreateGlobalCEFApp; if GlobalCEFApp.StartMainProcess then begin @@ -85,6 +74,6 @@ begin GlobalFMXWorkScheduler.StopScheduler; end; - FreeAndNil(GlobalCEFApp); - FreeAndNil(GlobalFMXWorkScheduler); + DestroyGlobalCEFApp; + DestroyGlobalFMXWorkScheduler; end. diff --git a/demos/FMXExternalPumpBrowser/uFMXExternalPumpBrowser.pas b/demos/FMXExternalPumpBrowser/uFMXExternalPumpBrowser.pas index 5846ffc0..2a844a66 100644 --- a/demos/FMXExternalPumpBrowser/uFMXExternalPumpBrowser.pas +++ b/demos/FMXExternalPumpBrowser/uFMXExternalPumpBrowser.pas @@ -164,7 +164,7 @@ var // 3- chrmosr.OnBeforeClose is triggered because the internal browser was destroyed. // Now we set FCanClose to True and send WM_CLOSE to the form. -procedure GlobalCEFApp_OnScheduleMessagePumpWork(const aDelayMS : int64); +procedure CreateGlobalCEFApp; implementation @@ -179,6 +179,23 @@ begin if (GlobalFMXWorkScheduler <> nil) then GlobalFMXWorkScheduler.ScheduleMessagePumpWork(aDelayMS); end; +procedure CreateGlobalCEFApp; +begin + // TFMXWorkScheduler will call cef_do_message_loop_work when + // it's told in the GlobalCEFApp.OnScheduleMessagePumpWork event. + // GlobalFMXWorkScheduler needs to be created before the + // GlobalCEFApp.StartMainProcess call. + GlobalFMXWorkScheduler := TFMXWorkScheduler.Create(nil); + + GlobalCEFApp := TCefApplication.Create; + GlobalCEFApp.WindowlessRenderingEnabled := True; + GlobalCEFApp.EnableHighDPISupport := True; + GlobalCEFApp.FlashEnabled := False; + GlobalCEFApp.ExternalMessagePump := True; + GlobalCEFApp.MultiThreadedMessageLoop := False; + GlobalCEFApp.OnScheduleMessagePumpWork := GlobalCEFApp_OnScheduleMessagePumpWork; +end; + procedure TFMXExternalPumpBrowserFrm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin CanClose := FCanClose; diff --git a/demos/FullScreenBrowser/FullScreenBrowser.dpr b/demos/FullScreenBrowser/FullScreenBrowser.dpr index d8062395..fa4b5beb 100644 --- a/demos/FullScreenBrowser/FullScreenBrowser.dpr +++ b/demos/FullScreenBrowser/FullScreenBrowser.dpr @@ -55,8 +55,7 @@ uses {$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} begin - GlobalCEFApp := TCefApplication.Create; - GlobalCEFApp.FlashEnabled := False; + GlobalCEFApp := TCefApplication.Create; if GlobalCEFApp.StartMainProcess then begin @@ -65,6 +64,5 @@ begin Application.Run; end; - GlobalCEFApp.Free; - GlobalCEFApp := nil; + DestroyGlobalCEFApp; end. diff --git a/demos/JavaScript/JSEval/JSEval.dpr b/demos/JavaScript/JSEval/JSEval.dpr index 515414bd..2002af1d 100644 --- a/demos/JavaScript/JSEval/JSEval.dpr +++ b/demos/JavaScript/JSEval/JSEval.dpr @@ -57,8 +57,9 @@ uses {$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} begin - GlobalCEFApp := TCefApplication.Create; - GlobalCEFApp.OnProcessMessageReceived := JSEvalFrm.RenderProcessHandler_OnProcessMessageReceivedEvent; + // GlobalCEFApp creation and initialization moved to a different unit to fix the memory leak described in the bug #89 + // https://github.com/salvadordf/CEF4Delphi/issues/89 + CreateGlobalCEFApp; if GlobalCEFApp.StartMainProcess then begin @@ -71,6 +72,5 @@ begin Application.Run; end; - GlobalCEFApp.Free; - GlobalCEFApp := nil; + DestroyGlobalCEFApp; end. diff --git a/demos/JavaScript/JSEval/uJSEval.pas b/demos/JavaScript/JSEval/uJSEval.pas index ed617912..cd748005 100644 --- a/demos/JavaScript/JSEval/uJSEval.pas +++ b/demos/JavaScript/JSEval/uJSEval.pas @@ -117,17 +117,13 @@ type procedure WMMoving(var aMessage : TMessage); message WM_MOVING; procedure WMEnterMenuLoop(var aMessage: TMessage); message WM_ENTERMENULOOP; procedure WMExitMenuLoop(var aMessage: TMessage); message WM_EXITMENULOOP; - - procedure ParseEvalJsAnswer(const pMessage: ICefProcessMessage; pBrowser: ICefBrowser; pReturnValue : ICefv8Value; pException : ICefV8Exception); - procedure ParseBinaryValue(const pBrowser : ICefBrowser; const aBinaryValue : ICefBinaryValue); - - public - procedure RenderProcessHandler_OnProcessMessageReceivedEvent(const pBrowser: ICefBrowser; uSourceProcess: TCefProcessId; const pMessage: ICefProcessMessage; var aHandled : boolean); end; var JSEvalFrm: TJSEvalFrm; +procedure CreateGlobalCEFApp; + implementation {$R *.dfm} @@ -139,7 +135,7 @@ uses // Steps to evaluate some JavaScript code using the V8Context // ---------------------------------------------------------- -// 1. Set GlobalCEFApp.OnProcessMessageReceived to JSEvalFrm.RenderProcessHandler_OnProcessMessageReceivedEvent in the DPR file. +// 1. Set GlobalCEFApp.OnProcessMessageReceived to RenderProcessHandler_OnProcessMessageReceivedEvent. // 2. To get the Javascript code in this demo we use a context menu that sends a MINIBROWSER_EVALJSCODE to the form. // 3. The EvalJSCodeMsg asks for the Javascript code and sends it to the renderer using a process message. // 4. RenderProcessHandler_OnProcessMessageReceivedEvent receives the process message and calls ParseEvalJsAnswer @@ -153,7 +149,7 @@ uses // This demo also has an example of binary parameters in process messages // ---------------------------------------------------------------------- -// 1. Set GlobalCEFApp.OnProcessMessageReceived to JSEvalFrm.RenderProcessHandler_OnProcessMessageReceivedEvent in the DPR file. +// 1. Set GlobalCEFApp.OnProcessMessageReceived to RenderProcessHandler_OnProcessMessageReceivedEvent. // 2. The context menu has a 'Send JPEG image' option that sends a MINIBROWSER_JSBINPARAM message to the form. // 3. EvalJSBinParamMsg asks for a JPEG image and sends a process message with a ICefBinaryValue parameter to the // renderer process. @@ -380,52 +376,10 @@ begin end; end; -procedure TJSEvalFrm.RenderProcessHandler_OnProcessMessageReceivedEvent(const pBrowser : ICefBrowser; - uSourceProcess : TCefProcessId; - const pMessage : ICefProcessMessage; - var aHandled : boolean); -var - pV8Context : ICefv8Context; - pReturnValue : ICefv8Value; - pException : ICefV8Exception; - TempScript : string; - TempBinValue : ICefBinaryValue; -begin - aHandled := False; - - if (pMessage = nil) or (pMessage.ArgumentList = nil) then exit; - - if (pMessage.Name = EVAL_JS) then - begin - TempScript := pMessage.ArgumentList.GetString(0); - - if (length(TempScript) > 0) then - begin - pV8Context := pBrowser.MainFrame.GetV8Context; - - if pV8Context.Enter then - begin - pV8Context.Eval(TempScript, '', 1, pReturnValue, pException); - ParseEvalJsAnswer(pMessage, pBrowser, pReturnValue, pException); - pV8Context.Exit; - end; - end; - - aHandled := True; - end - else - if (pMessage.Name = BINARY_PARAM_JS) then - begin - TempBinValue := pMessage.ArgumentList.GetBinary(0); - ParseBinaryValue(pBrowser, TempBinValue); - aHandled := True; - end; -end; - -procedure TJSEvalFrm.ParseEvalJsAnswer(const pMessage : ICefProcessMessage; - pBrowser : ICefBrowser; - pReturnValue : ICefv8Value; - pException : ICefV8Exception); +procedure ParseEvalJsAnswer(const pMessage : ICefProcessMessage; + pBrowser : ICefBrowser; + pReturnValue : ICefv8Value; + pException : ICefV8Exception); var pAnswer : ICefProcessMessage; strResult : String; @@ -464,7 +418,7 @@ begin pBrowser.SendProcessMessage(PID_BROWSER, pAnswer); end; -procedure TJSEvalFrm.ParseBinaryValue(const pBrowser : ICefBrowser; const aBinaryValue : ICefBinaryValue); +procedure ParseBinaryValue(const pBrowser : ICefBrowser; const aBinaryValue : ICefBinaryValue); var pAnswer : ICefProcessMessage; TempBuffer : TBytes; @@ -496,13 +450,61 @@ begin end; except on e : exception do - if CustomExceptionHandler('TJSEvalFrm.ParseBinaryValue', e) then raise; + if CustomExceptionHandler('ParseBinaryValue', e) then raise; end; finally SetLength(TempBuffer, 0); end; end; +procedure RenderProcessHandler_OnProcessMessageReceivedEvent(const pBrowser : ICefBrowser; + uSourceProcess : TCefProcessId; + const pMessage : ICefProcessMessage; + var aHandled : boolean); +var + pV8Context : ICefv8Context; + pReturnValue : ICefv8Value; + pException : ICefV8Exception; + TempScript : string; + TempBinValue : ICefBinaryValue; +begin + aHandled := False; + + if (pMessage = nil) or (pMessage.ArgumentList = nil) then exit; + + if (pMessage.Name = EVAL_JS) then + begin + TempScript := pMessage.ArgumentList.GetString(0); + + if (length(TempScript) > 0) then + begin + pV8Context := pBrowser.MainFrame.GetV8Context; + + if pV8Context.Enter then + begin + pV8Context.Eval(TempScript, '', 1, pReturnValue, pException); + ParseEvalJsAnswer(pMessage, pBrowser, pReturnValue, pException); + pV8Context.Exit; + end; + end; + + aHandled := True; + end + else + if (pMessage.Name = BINARY_PARAM_JS) then + begin + TempBinValue := pMessage.ArgumentList.GetBinary(0); + ParseBinaryValue(pBrowser, TempBinValue); + aHandled := True; + end; +end; + +procedure CreateGlobalCEFApp; +begin + GlobalCEFApp := TCefApplication.Create; + GlobalCEFApp.OnProcessMessageReceived := RenderProcessHandler_OnProcessMessageReceivedEvent; +end; + procedure TJSEvalFrm.Chromium1ProcessMessageReceived(Sender : TObject; const browser : ICefBrowser; sourceProcess : TCefProcessId; diff --git a/demos/JavaScript/JSExecutingFunctions/JSExecutingFunctions.dpr b/demos/JavaScript/JSExecutingFunctions/JSExecutingFunctions.dpr index b00bbab5..03ac2d24 100644 --- a/demos/JavaScript/JSExecutingFunctions/JSExecutingFunctions.dpr +++ b/demos/JavaScript/JSExecutingFunctions/JSExecutingFunctions.dpr @@ -57,9 +57,9 @@ uses {$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} begin - GlobalCEFApp := TCefApplication.Create; - GlobalCEFApp.OnContextCreated := GlobalCEFApp_OnContextCreated; - GlobalCEFApp.OnProcessMessageReceived := GlobalCEFApp_OnProcessMessageReceived; + // GlobalCEFApp creation and initialization moved to a different unit to fix the memory leak described in the bug #89 + // https://github.com/salvadordf/CEF4Delphi/issues/89 + CreateGlobalCEFApp; if GlobalCEFApp.StartMainProcess then begin @@ -71,6 +71,5 @@ begin Application.Run; end; - GlobalCEFApp.Free; - GlobalCEFApp := nil; + DestroyGlobalCEFApp; end. diff --git a/demos/JavaScript/JSExecutingFunctions/uJSExecutingFunctions.pas b/demos/JavaScript/JSExecutingFunctions/uJSExecutingFunctions.pas index 86ad3101..5b219e4b 100644 --- a/demos/JavaScript/JSExecutingFunctions/uJSExecutingFunctions.pas +++ b/demos/JavaScript/JSExecutingFunctions/uJSExecutingFunctions.pas @@ -110,11 +110,7 @@ var GlobalCallbackFunc : ICefv8Value = nil; GlobalCallbackContext : ICefv8Context = nil; -procedure GlobalCEFApp_OnContextCreated(const browser: ICefBrowser; const frame: ICefFrame; const context: ICefv8Context); -procedure GlobalCEFApp_OnProcessMessageReceived(const browser : ICefBrowser; - sourceProcess : TCefProcessId; - const aMessage : ICefProcessMessage; - var aHandled : boolean); +procedure CreateGlobalCEFApp; implementation @@ -171,6 +167,13 @@ begin aHandled := False; end; +procedure CreateGlobalCEFApp; +begin + GlobalCEFApp := TCefApplication.Create; + GlobalCEFApp.OnContextCreated := GlobalCEFApp_OnContextCreated; + GlobalCEFApp.OnProcessMessageReceived := GlobalCEFApp_OnProcessMessageReceived; +end; + procedure TJSExecutingFunctionsFrm.GoBtnClick(Sender: TObject); begin Chromium1.LoadURL(Edit1.Text); diff --git a/demos/JavaScript/JSExtension/JSExtension.dpr b/demos/JavaScript/JSExtension/JSExtension.dpr index 7960210a..42be12ce 100644 --- a/demos/JavaScript/JSExtension/JSExtension.dpr +++ b/demos/JavaScript/JSExtension/JSExtension.dpr @@ -58,8 +58,9 @@ uses {$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} begin - GlobalCEFApp := TCefApplication.Create; - GlobalCEFApp.OnWebKitInitialized := GlobalCEFApp_OnWebKitInitialized; + // GlobalCEFApp creation and initialization moved to a different unit to fix the memory leak described in the bug #89 + // https://github.com/salvadordf/CEF4Delphi/issues/89 + CreateGlobalCEFApp; if GlobalCEFApp.StartMainProcess then begin @@ -72,6 +73,5 @@ begin Application.Run; end; - GlobalCEFApp.Free; - GlobalCEFApp := nil; + DestroyGlobalCEFApp; end. diff --git a/demos/JavaScript/JSExtension/uJSExtension.pas b/demos/JavaScript/JSExtension/uJSExtension.pas index e9735647..892c4d8f 100644 --- a/demos/JavaScript/JSExtension/uJSExtension.pas +++ b/demos/JavaScript/JSExtension/uJSExtension.pas @@ -116,7 +116,7 @@ type var JSExtensionFrm: TJSExtensionFrm; -procedure GlobalCEFApp_OnWebKitInitialized; +procedure CreateGlobalCEFApp; implementation @@ -177,6 +177,12 @@ begin CefRegisterExtension('myextension', TempExtensionCode, TempHandler); end; +procedure CreateGlobalCEFApp; +begin + GlobalCEFApp := TCefApplication.Create; + GlobalCEFApp.OnWebKitInitialized := GlobalCEFApp_OnWebKitInitialized; +end; + procedure TJSExtensionFrm.GoBtnClick(Sender: TObject); begin Chromium1.LoadURL(Edit1.Text); diff --git a/demos/JavaScript/JSExtensionWithFunction/JSExtensionWithFunction.dpr b/demos/JavaScript/JSExtensionWithFunction/JSExtensionWithFunction.dpr index fe25c892..60f4b316 100644 --- a/demos/JavaScript/JSExtensionWithFunction/JSExtensionWithFunction.dpr +++ b/demos/JavaScript/JSExtensionWithFunction/JSExtensionWithFunction.dpr @@ -57,8 +57,9 @@ uses {$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} begin - GlobalCEFApp := TCefApplication.Create; - GlobalCEFApp.OnWebKitInitialized := GlobalCEFApp_OnWebKitInitializedEvent; + // GlobalCEFApp creation and initialization moved to a different unit to fix the memory leak described in the bug #89 + // https://github.com/salvadordf/CEF4Delphi/issues/89 + CreateGlobalCEFApp; if GlobalCEFApp.StartMainProcess then begin @@ -70,6 +71,5 @@ begin Application.Run; end; - GlobalCEFApp.Free; - GlobalCEFApp := nil; + DestroyGlobalCEFApp; end. diff --git a/demos/JavaScript/JSExtensionWithFunction/uJSExtensionWithFunction.pas b/demos/JavaScript/JSExtensionWithFunction/uJSExtensionWithFunction.pas index b4dbf26e..7d71ba59 100644 --- a/demos/JavaScript/JSExtensionWithFunction/uJSExtensionWithFunction.pas +++ b/demos/JavaScript/JSExtensionWithFunction/uJSExtensionWithFunction.pas @@ -98,7 +98,7 @@ type var JSExtensionWithFunctionFrm: TJSExtensionWithFunctionFrm; -procedure GlobalCEFApp_OnWebKitInitializedEvent; +procedure CreateGlobalCEFApp; implementation @@ -142,6 +142,12 @@ begin CefRegisterExtension('v8/test', TempExtensionCode, TempHandler); end; +procedure CreateGlobalCEFApp; +begin + GlobalCEFApp := TCefApplication.Create; + GlobalCEFApp.OnWebKitInitialized := GlobalCEFApp_OnWebKitInitializedEvent; +end; + procedure TJSExtensionWithFunctionFrm.GoBtnClick(Sender: TObject); begin Chromium1.LoadURL(Edit1.Text); diff --git a/demos/JavaScript/JSExtensionWithObjectParameter/JSExtensionWithObjectParameter.dpr b/demos/JavaScript/JSExtensionWithObjectParameter/JSExtensionWithObjectParameter.dpr index 78e0c854..3d0fde51 100644 --- a/demos/JavaScript/JSExtensionWithObjectParameter/JSExtensionWithObjectParameter.dpr +++ b/demos/JavaScript/JSExtensionWithObjectParameter/JSExtensionWithObjectParameter.dpr @@ -57,8 +57,9 @@ uses {$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} begin - GlobalCEFApp := TCefApplication.Create; - GlobalCEFApp.OnWebKitInitialized := GlobalCEFApp_OnWebKitInitializedEvent; + // GlobalCEFApp creation and initialization moved to a different unit to fix the memory leak described in the bug #89 + // https://github.com/salvadordf/CEF4Delphi/issues/89 + CreateGlobalCEFApp; if GlobalCEFApp.StartMainProcess then begin @@ -70,6 +71,5 @@ begin Application.Run; end; - GlobalCEFApp.Free; - GlobalCEFApp := nil; + DestroyGlobalCEFApp; end. diff --git a/demos/JavaScript/JSExtensionWithObjectParameter/JSExtensionWithObjectParameter.dproj b/demos/JavaScript/JSExtensionWithObjectParameter/JSExtensionWithObjectParameter.dproj index 10de11bd..ca63b6b8 100644 --- a/demos/JavaScript/JSExtensionWithObjectParameter/JSExtensionWithObjectParameter.dproj +++ b/demos/JavaScript/JSExtensionWithObjectParameter/JSExtensionWithObjectParameter.dproj @@ -137,13 +137,13 @@ + JSExtensionWithObjectParameter.exe true - 1 diff --git a/demos/JavaScript/JSExtensionWithObjectParameter/uJSExtensionWithObjectParameter.pas b/demos/JavaScript/JSExtensionWithObjectParameter/uJSExtensionWithObjectParameter.pas index 708e2209..eb45f45f 100644 --- a/demos/JavaScript/JSExtensionWithObjectParameter/uJSExtensionWithObjectParameter.pas +++ b/demos/JavaScript/JSExtensionWithObjectParameter/uJSExtensionWithObjectParameter.pas @@ -94,7 +94,7 @@ type var JSExtensionWithObjectParameterFrm: TJSExtensionWithObjectParameterFrm; -procedure GlobalCEFApp_OnWebKitInitializedEvent; +procedure CreateGlobalCEFApp; implementation @@ -145,6 +145,12 @@ begin CefRegisterExtension('v8/test', TempExtensionCode, TempHandler); end; +procedure CreateGlobalCEFApp; +begin + GlobalCEFApp := TCefApplication.Create; + GlobalCEFApp.OnWebKitInitialized := GlobalCEFApp_OnWebKitInitializedEvent; +end; + procedure TJSExtensionWithObjectParameterFrm.GoBtnClick(Sender: TObject); begin Chromium1.LoadURL(Edit1.Text); diff --git a/demos/JavaScript/JSRTTIExtension/JSRTTIExtension.dpr b/demos/JavaScript/JSRTTIExtension/JSRTTIExtension.dpr index 02da9d71..5a533f6e 100644 --- a/demos/JavaScript/JSRTTIExtension/JSRTTIExtension.dpr +++ b/demos/JavaScript/JSRTTIExtension/JSRTTIExtension.dpr @@ -58,9 +58,9 @@ uses {$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} begin - GlobalCEFApp := TCefApplication.Create; - GlobalCEFApp.OnWebKitInitialized := GlobalCEFApp_OnWebKitInitialized; - + // GlobalCEFApp creation and initialization moved to a different unit to fix the memory leak described in the bug #89 + // https://github.com/salvadordf/CEF4Delphi/issues/89 + CreateGlobalCEFApp; if GlobalCEFApp.StartMainProcess then begin @@ -73,6 +73,5 @@ begin Application.Run; end; - GlobalCEFApp.Free; - GlobalCEFApp := nil; + DestroyGlobalCEFApp; end. diff --git a/demos/JavaScript/JSRTTIExtension/JSRTTIExtension.dproj b/demos/JavaScript/JSRTTIExtension/JSRTTIExtension.dproj index fe2a6d4d..4d036284 100644 --- a/demos/JavaScript/JSRTTIExtension/JSRTTIExtension.dproj +++ b/demos/JavaScript/JSRTTIExtension/JSRTTIExtension.dproj @@ -139,13 +139,13 @@ - JSRTTIExtension.exe true + 1 diff --git a/demos/JavaScript/JSRTTIExtension/uJSRTTIExtension.pas b/demos/JavaScript/JSRTTIExtension/uJSRTTIExtension.pas index 0ca83c99..acc5cb8a 100644 --- a/demos/JavaScript/JSRTTIExtension/uJSRTTIExtension.pas +++ b/demos/JavaScript/JSRTTIExtension/uJSRTTIExtension.pas @@ -114,7 +114,7 @@ type var JSRTTIExtensionFrm: TJSRTTIExtensionFrm; -procedure GlobalCEFApp_OnWebKitInitialized; +procedure CreateGlobalCEFApp; implementation @@ -156,6 +156,12 @@ begin {$ENDIF} end; +procedure CreateGlobalCEFApp; +begin + GlobalCEFApp := TCefApplication.Create; + GlobalCEFApp.OnWebKitInitialized := GlobalCEFApp_OnWebKitInitialized; +end; + procedure TJSRTTIExtensionFrm.GoBtnClick(Sender: TObject); begin Chromium1.LoadURL(Edit1.Text); diff --git a/demos/JavaScript/JSSimpleExtension/JSSimpleExtension.dpr b/demos/JavaScript/JSSimpleExtension/JSSimpleExtension.dpr index 75069917..f31f3f5c 100644 --- a/demos/JavaScript/JSSimpleExtension/JSSimpleExtension.dpr +++ b/demos/JavaScript/JSSimpleExtension/JSSimpleExtension.dpr @@ -56,8 +56,9 @@ uses {$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} begin - GlobalCEFApp := TCefApplication.Create; - GlobalCEFApp.OnWebKitInitialized := GlobalCEFApp_OnWebKitInitializedEvent; + // GlobalCEFApp creation and initialization moved to a different unit to fix the memory leak described in the bug #89 + // https://github.com/salvadordf/CEF4Delphi/issues/89 + CreateGlobalCEFApp; if GlobalCEFApp.StartMainProcess then begin @@ -69,6 +70,5 @@ begin Application.Run; end; - GlobalCEFApp.Free; - GlobalCEFApp := nil; + DestroyGlobalCEFApp; end. diff --git a/demos/JavaScript/JSSimpleExtension/uJSSimpleExtension.pas b/demos/JavaScript/JSSimpleExtension/uJSSimpleExtension.pas index 77ff5e93..d18d9003 100644 --- a/demos/JavaScript/JSSimpleExtension/uJSSimpleExtension.pas +++ b/demos/JavaScript/JSSimpleExtension/uJSSimpleExtension.pas @@ -94,7 +94,7 @@ type var JSSimpleExtensionFrm: TJSSimpleExtensionFrm; -procedure GlobalCEFApp_OnWebKitInitializedEvent; +procedure CreateGlobalCEFApp; implementation @@ -132,6 +132,12 @@ begin CefRegisterExtension('v8/test', TempExtensionCode, nil); end; +procedure CreateGlobalCEFApp; +begin + GlobalCEFApp := TCefApplication.Create; + GlobalCEFApp.OnWebKitInitialized := GlobalCEFApp_OnWebKitInitializedEvent; +end; + procedure TJSSimpleExtensionFrm.GoBtnClick(Sender: TObject); begin Chromium1.LoadURL(Edit1.Text); diff --git a/demos/JavaScript/JSSimpleWindowBinding/JSSimpleWindowBinding.dpr b/demos/JavaScript/JSSimpleWindowBinding/JSSimpleWindowBinding.dpr index 36d6edba..1120e788 100644 --- a/demos/JavaScript/JSSimpleWindowBinding/JSSimpleWindowBinding.dpr +++ b/demos/JavaScript/JSSimpleWindowBinding/JSSimpleWindowBinding.dpr @@ -56,8 +56,9 @@ uses {$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} begin - GlobalCEFApp := TCefApplication.Create; - GlobalCEFApp.OnContextCreated := GlobalCEFApp_OnContextCreated; + // GlobalCEFApp creation and initialization moved to a different unit to fix the memory leak described in the bug #89 + // https://github.com/salvadordf/CEF4Delphi/issues/89 + CreateGlobalCEFApp; if GlobalCEFApp.StartMainProcess then begin @@ -69,6 +70,5 @@ begin Application.Run; end; - GlobalCEFApp.Free; - GlobalCEFApp := nil; + DestroyGlobalCEFApp; end. diff --git a/demos/JavaScript/JSSimpleWindowBinding/uJSSimpleWindowBinding.pas b/demos/JavaScript/JSSimpleWindowBinding/uJSSimpleWindowBinding.pas index b0c44bcd..c93a0edf 100644 --- a/demos/JavaScript/JSSimpleWindowBinding/uJSSimpleWindowBinding.pas +++ b/demos/JavaScript/JSSimpleWindowBinding/uJSSimpleWindowBinding.pas @@ -95,7 +95,7 @@ type var JSSimpleWindowBindingFrm: TJSSimpleWindowBindingFrm; -procedure GlobalCEFApp_OnContextCreated(const browser: ICefBrowser; const frame: ICefFrame; const context: ICefv8Context); +procedure CreateGlobalCEFApp; implementation @@ -125,6 +125,12 @@ begin context.Global.SetValueByKey('myval', TempValue, V8_PROPERTY_ATTRIBUTE_NONE); end; +procedure CreateGlobalCEFApp; +begin + GlobalCEFApp := TCefApplication.Create; + GlobalCEFApp.OnContextCreated := GlobalCEFApp_OnContextCreated; +end; + procedure TJSSimpleWindowBindingFrm.GoBtnClick(Sender: TObject); begin Chromium1.LoadURL(Edit1.Text); diff --git a/demos/JavaScript/JSWindowBindingWithFunction/JSWindowBindingWithFunction.dpr b/demos/JavaScript/JSWindowBindingWithFunction/JSWindowBindingWithFunction.dpr index 8dd69c5d..b31e7bb6 100644 --- a/demos/JavaScript/JSWindowBindingWithFunction/JSWindowBindingWithFunction.dpr +++ b/demos/JavaScript/JSWindowBindingWithFunction/JSWindowBindingWithFunction.dpr @@ -57,8 +57,9 @@ uses {$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} begin - GlobalCEFApp := TCefApplication.Create; - GlobalCEFApp.OnContextCreated := GlobalCEFApp_OnContextCreated; + // GlobalCEFApp creation and initialization moved to a different unit to fix the memory leak described in the bug #89 + // https://github.com/salvadordf/CEF4Delphi/issues/89 + CreateGlobalCEFApp; if GlobalCEFApp.StartMainProcess then begin @@ -70,6 +71,5 @@ begin Application.Run; end; - GlobalCEFApp.Free; - GlobalCEFApp := nil; + DestroyGlobalCEFApp; end. diff --git a/demos/JavaScript/JSWindowBindingWithFunction/uJSWindowBindingWithFunction.pas b/demos/JavaScript/JSWindowBindingWithFunction/uJSWindowBindingWithFunction.pas index 7ab9cdc0..9ccce222 100644 --- a/demos/JavaScript/JSWindowBindingWithFunction/uJSWindowBindingWithFunction.pas +++ b/demos/JavaScript/JSWindowBindingWithFunction/uJSWindowBindingWithFunction.pas @@ -94,7 +94,7 @@ type var JSWindowBindingWithFunctionFrm: TJSWindowBindingWithFunctionFrm; -procedure GlobalCEFApp_OnContextCreated(const browser: ICefBrowser; const frame: ICefFrame; const context: ICefv8Context); +procedure CreateGlobalCEFApp; implementation @@ -129,6 +129,12 @@ begin context.Global.SetValueByKey('myfunc', TempFunction, V8_PROPERTY_ATTRIBUTE_NONE); end; +procedure CreateGlobalCEFApp; +begin + GlobalCEFApp := TCefApplication.Create; + GlobalCEFApp.OnContextCreated := GlobalCEFApp_OnContextCreated; +end; + procedure TJSWindowBindingWithFunctionFrm.GoBtnClick(Sender: TObject); begin Chromium1.LoadURL(Edit1.Text); diff --git a/demos/JavaScript/JSWindowBindingWithObject/JSWindowBindingWithObject.dpr b/demos/JavaScript/JSWindowBindingWithObject/JSWindowBindingWithObject.dpr index d6b12259..447f5b3d 100644 --- a/demos/JavaScript/JSWindowBindingWithObject/JSWindowBindingWithObject.dpr +++ b/demos/JavaScript/JSWindowBindingWithObject/JSWindowBindingWithObject.dpr @@ -57,8 +57,9 @@ uses {$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} begin - GlobalCEFApp := TCefApplication.Create; - GlobalCEFApp.OnContextCreated := GlobalCEFApp_OnContextCreated; + // GlobalCEFApp creation and initialization moved to a different unit to fix the memory leak described in the bug #89 + // https://github.com/salvadordf/CEF4Delphi/issues/89 + CreateGlobalCEFApp; if GlobalCEFApp.StartMainProcess then begin @@ -70,6 +71,5 @@ begin Application.Run; end; - GlobalCEFApp.Free; - GlobalCEFApp := nil; + DestroyGlobalCEFApp; end. diff --git a/demos/JavaScript/JSWindowBindingWithObject/uJSWindowBindingWithObject.pas b/demos/JavaScript/JSWindowBindingWithObject/uJSWindowBindingWithObject.pas index 8d8f2313..ac445b27 100644 --- a/demos/JavaScript/JSWindowBindingWithObject/uJSWindowBindingWithObject.pas +++ b/demos/JavaScript/JSWindowBindingWithObject/uJSWindowBindingWithObject.pas @@ -94,7 +94,7 @@ type var JSWindowBindingWithObjectFrm: TJSWindowBindingWithObjectFrm; -procedure GlobalCEFApp_OnContextCreated(const browser: ICefBrowser; const frame: ICefFrame; const context: ICefv8Context); +procedure CreateGlobalCEFApp; implementation @@ -130,6 +130,12 @@ begin context.Global.SetValueByKey('myobj', TempObject, V8_PROPERTY_ATTRIBUTE_NONE); end; +procedure CreateGlobalCEFApp; +begin + GlobalCEFApp := TCefApplication.Create; + GlobalCEFApp.OnContextCreated := GlobalCEFApp_OnContextCreated; +end; + procedure TJSWindowBindingWithObjectFrm.GoBtnClick(Sender: TObject); begin Chromium1.LoadURL(Edit1.Text); diff --git a/demos/MDIBrowser/MDIBrowser.dpr b/demos/MDIBrowser/MDIBrowser.dpr index 184e6bdd..ee063796 100644 --- a/demos/MDIBrowser/MDIBrowser.dpr +++ b/demos/MDIBrowser/MDIBrowser.dpr @@ -56,9 +56,9 @@ uses {$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} begin - GlobalCEFApp := TCefApplication.Create; - GlobalCEFApp.FlashEnabled := False; - GlobalCEFApp.OnContextInitialized := GlobalCEFApp_OnContextInitialized; + // GlobalCEFApp creation and initialization moved to a different unit to fix the memory leak described in the bug #89 + // https://github.com/salvadordf/CEF4Delphi/issues/89 + CreateGlobalCEFApp; if GlobalCEFApp.StartMainProcess then begin @@ -67,6 +67,5 @@ begin Application.Run; end; - GlobalCEFApp.Free; - GlobalCEFApp := nil; + DestroyGlobalCEFApp; end. diff --git a/demos/MDIBrowser/uMainForm.dfm b/demos/MDIBrowser/uMainForm.dfm index 6d118fab..d4b10298 100644 --- a/demos/MDIBrowser/uMainForm.dfm +++ b/demos/MDIBrowser/uMainForm.dfm @@ -28,7 +28,6 @@ object MainForm: TMainForm Enabled = False ShowCaption = False TabOrder = 0 - ExplicitWidth = 933 object NewBtn: TSpeedButton Left = 4 Top = 4 diff --git a/demos/MDIBrowser/uMainForm.pas b/demos/MDIBrowser/uMainForm.pas index dbcc8c57..d8343059 100644 --- a/demos/MDIBrowser/uMainForm.pas +++ b/demos/MDIBrowser/uMainForm.pas @@ -90,7 +90,7 @@ type var MainForm: TMainForm; -procedure GlobalCEFApp_OnContextInitialized; +procedure CreateGlobalCEFApp; implementation @@ -110,6 +110,12 @@ begin PostMessage(MainForm.Handle, CEFBROWSER_INITIALIZED, 0, 0); end; +procedure CreateGlobalCEFApp; +begin + GlobalCEFApp := TCefApplication.Create; + GlobalCEFApp.OnContextInitialized := GlobalCEFApp_OnContextInitialized; +end; + procedure TMainForm.CreateMDIChild(const Name: string); var TempChild : TChildForm; diff --git a/demos/MDIExternalPumpBrowser/MDIExternalPumpBrowser.dpr b/demos/MDIExternalPumpBrowser/MDIExternalPumpBrowser.dpr index ff387f03..b46d025d 100644 --- a/demos/MDIExternalPumpBrowser/MDIExternalPumpBrowser.dpr +++ b/demos/MDIExternalPumpBrowser/MDIExternalPumpBrowser.dpr @@ -43,11 +43,9 @@ uses {$IFDEF DELPHI16_UP} Vcl.Forms, WinApi.Windows, - System.SysUtils, {$ELSE} Forms, Windows, - SysUtils, {$ENDIF } uCEFApplication, uCEFWorkScheduler, @@ -59,18 +57,9 @@ uses {$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} begin - // TCEFWorkScheduler will call cef_do_message_loop_work when - // it's told in the GlobalCEFApp.OnScheduleMessagePumpWork event. - // GlobalCEFWorkScheduler needs to be created before the - // GlobalCEFApp.StartMainProcess call. - GlobalCEFWorkScheduler := TCEFWorkScheduler.Create(nil); - - GlobalCEFApp := TCefApplication.Create; - GlobalCEFApp.FlashEnabled := False; - GlobalCEFApp.ExternalMessagePump := True; - GlobalCEFApp.MultiThreadedMessageLoop := False; - GlobalCEFApp.OnScheduleMessagePumpWork := GlobalCEFApp_OnScheduleMessagePumpWork; - GlobalCEFApp.OnContextInitialized := GlobalCEFApp_OnContextInitialized; + // GlobalCEFApp creation and initialization moved to a different unit to fix the memory leak described in the bug #89 + // https://github.com/salvadordf/CEF4Delphi/issues/89 + CreateGlobalCEFApp; if GlobalCEFApp.StartMainProcess then begin @@ -82,6 +71,6 @@ begin MainForm.Free; end; - FreeAndNil(GlobalCEFApp); - FreeAndNil(GlobalCEFWorkScheduler); + DestroyGlobalCEFApp; + DestroyGlobalCEFWorkScheduler; end. diff --git a/demos/MDIExternalPumpBrowser/uMainForm.dfm b/demos/MDIExternalPumpBrowser/uMainForm.dfm index 47e0dac9..e2bd23a5 100644 --- a/demos/MDIExternalPumpBrowser/uMainForm.dfm +++ b/demos/MDIExternalPumpBrowser/uMainForm.dfm @@ -4,7 +4,7 @@ object MainForm: TMainForm Cursor = crAppStart Caption = 'Initializing browser. Please wait...' ClientHeight = 631 - ClientWidth = 709 + ClientWidth = 934 Color = clAppWorkSpace Font.Charset = DEFAULT_CHARSET Font.Color = clBlack @@ -21,13 +21,14 @@ object MainForm: TMainForm object ButtonPnl: TPanel Left = 0 Top = 0 - Width = 709 + Width = 934 Height = 30 Align = alTop BevelOuter = bvNone Enabled = False ShowCaption = False TabOrder = 0 + ExplicitWidth = 709 object NewBtn: TSpeedButton Left = 4 Top = 4 diff --git a/demos/MDIExternalPumpBrowser/uMainForm.pas b/demos/MDIExternalPumpBrowser/uMainForm.pas index a4a9ac9b..f8617205 100644 --- a/demos/MDIExternalPumpBrowser/uMainForm.pas +++ b/demos/MDIExternalPumpBrowser/uMainForm.pas @@ -91,8 +91,7 @@ type var MainForm : TMainForm; -procedure GlobalCEFApp_OnContextInitialized; -procedure GlobalCEFApp_OnScheduleMessagePumpWork(const aDelayMS : int64); +procedure CreateGlobalCEFApp; implementation @@ -117,6 +116,21 @@ begin if (GlobalCEFWorkScheduler <> nil) then GlobalCEFWorkScheduler.ScheduleMessagePumpWork(aDelayMS); end; +procedure CreateGlobalCEFApp; +begin + // TCEFWorkScheduler will call cef_do_message_loop_work when + // it's told in the GlobalCEFApp.OnScheduleMessagePumpWork event. + // GlobalCEFWorkScheduler needs to be created before the + // GlobalCEFApp.StartMainProcess call. + GlobalCEFWorkScheduler := TCEFWorkScheduler.Create(nil); + + GlobalCEFApp := TCefApplication.Create; + GlobalCEFApp.ExternalMessagePump := True; + GlobalCEFApp.MultiThreadedMessageLoop := False; + GlobalCEFApp.OnScheduleMessagePumpWork := GlobalCEFApp_OnScheduleMessagePumpWork; + GlobalCEFApp.OnContextInitialized := GlobalCEFApp_OnContextInitialized; +end; + procedure TMainForm.CreateMDIChild(const Name: string); var TempChild : TChildForm; diff --git a/demos/OSRExternalPumpBrowser/OSRExternalPumpBrowser.dpr b/demos/OSRExternalPumpBrowser/OSRExternalPumpBrowser.dpr index 53559011..897a9556 100644 --- a/demos/OSRExternalPumpBrowser/OSRExternalPumpBrowser.dpr +++ b/demos/OSRExternalPumpBrowser/OSRExternalPumpBrowser.dpr @@ -43,11 +43,9 @@ uses {$IFDEF DELPHI16_UP} Vcl.Forms, WinApi.Windows, - System.SysUtils, {$ELSE} Forms, Windows, - SysUtils, {$ENDIF } uCEFApplication, uCEFWorkScheduler, @@ -59,19 +57,9 @@ uses {$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} begin - // TCEFWorkScheduler will call cef_do_message_loop_work when - // it's told in the GlobalCEFApp.OnScheduleMessagePumpWork event. - // GlobalCEFWorkScheduler needs to be created before the - // GlobalCEFApp.StartMainProcess call. - GlobalCEFWorkScheduler := TCEFWorkScheduler.Create(nil); - - GlobalCEFApp := TCefApplication.Create; - GlobalCEFApp.WindowlessRenderingEnabled := True; - GlobalCEFApp.EnableHighDPISupport := True; - GlobalCEFApp.FlashEnabled := False; - GlobalCEFApp.ExternalMessagePump := True; - GlobalCEFApp.MultiThreadedMessageLoop := False; - GlobalCEFApp.OnScheduleMessagePumpWork := GlobalCEFApp_OnScheduleMessagePumpWork; + // GlobalCEFApp creation and initialization moved to a different unit to fix the memory leak described in the bug #89 + // https://github.com/salvadordf/CEF4Delphi/issues/89 + CreateGlobalCEFApp; if GlobalCEFApp.StartMainProcess then begin @@ -88,6 +76,6 @@ begin GlobalCEFWorkScheduler.StopScheduler; end; - FreeAndNil(GlobalCEFApp); - FreeAndNil(GlobalCEFWorkScheduler); + DestroyGlobalCEFApp; + DestroyGlobalCEFWorkScheduler; end. diff --git a/demos/OSRExternalPumpBrowser/uOSRExternalPumpBrowser.pas b/demos/OSRExternalPumpBrowser/uOSRExternalPumpBrowser.pas index 3063dc0a..18f9a927 100644 --- a/demos/OSRExternalPumpBrowser/uOSRExternalPumpBrowser.pas +++ b/demos/OSRExternalPumpBrowser/uOSRExternalPumpBrowser.pas @@ -151,6 +151,7 @@ var // 3- chrmosr.OnBeforeClose is triggered because the internal browser was destroyed. // Now we set FCanClose to True and send WM_CLOSE to the form. +procedure CreateGlobalCEFApp; procedure GlobalCEFApp_OnScheduleMessagePumpWork(const aDelayMS : int64); implementation @@ -170,6 +171,22 @@ begin if (GlobalCEFWorkScheduler <> nil) then GlobalCEFWorkScheduler.ScheduleMessagePumpWork(aDelayMS); end; +procedure CreateGlobalCEFApp; +begin + // TCEFWorkScheduler will call cef_do_message_loop_work when + // it's told in the GlobalCEFApp.OnScheduleMessagePumpWork event. + // GlobalCEFWorkScheduler needs to be created before the + // GlobalCEFApp.StartMainProcess call. + GlobalCEFWorkScheduler := TCEFWorkScheduler.Create(nil); + + GlobalCEFApp := TCefApplication.Create; + GlobalCEFApp.WindowlessRenderingEnabled := True; + GlobalCEFApp.EnableHighDPISupport := True; + GlobalCEFApp.ExternalMessagePump := True; + GlobalCEFApp.MultiThreadedMessageLoop := False; + GlobalCEFApp.OnScheduleMessagePumpWork := GlobalCEFApp_OnScheduleMessagePumpWork; +end; + procedure TOSRExternalPumpBrowserFrm.AppEventsMessage(var Msg: tagMSG; var Handled: Boolean); var TempKeyEvent : TCefKeyEvent; diff --git a/demos/SchemeRegistrationBrowser/SchemeRegistrationBrowser.dpr b/demos/SchemeRegistrationBrowser/SchemeRegistrationBrowser.dpr index a9127c45..63d432dc 100644 --- a/demos/SchemeRegistrationBrowser/SchemeRegistrationBrowser.dpr +++ b/demos/SchemeRegistrationBrowser/SchemeRegistrationBrowser.dpr @@ -56,8 +56,9 @@ uses {$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} begin - GlobalCEFApp := TCefApplication.Create; - GlobalCEFApp.OnRegCustomSchemes := GlobalCEFApp_OnRegCustomSchemes; + // GlobalCEFApp creation and initialization moved to a different unit to fix the memory leak described in the bug #89 + // https://github.com/salvadordf/CEF4Delphi/issues/89 + CreateGlobalCEFApp; if GlobalCEFApp.StartMainProcess then begin @@ -67,6 +68,5 @@ begin Application.Run; end; - GlobalCEFApp.Free; - GlobalCEFApp := nil; + DestroyGlobalCEFApp; end. diff --git a/demos/SchemeRegistrationBrowser/uSchemeRegistrationBrowser.pas b/demos/SchemeRegistrationBrowser/uSchemeRegistrationBrowser.pas index a65be990..2227181c 100644 --- a/demos/SchemeRegistrationBrowser/uSchemeRegistrationBrowser.pas +++ b/demos/SchemeRegistrationBrowser/uSchemeRegistrationBrowser.pas @@ -110,7 +110,7 @@ type var SchemeRegistrationBrowserFrm: TSchemeRegistrationBrowserFrm; -procedure GlobalCEFApp_OnRegCustomSchemes(const registrar: TCefSchemeRegistrarRef); +procedure CreateGlobalCEFApp; implementation @@ -130,6 +130,12 @@ begin registrar.AddCustomScheme('hello', True, True, False, False, False, False); end; +procedure CreateGlobalCEFApp; +begin + GlobalCEFApp := TCefApplication.Create; + GlobalCEFApp.OnRegCustomSchemes := GlobalCEFApp_OnRegCustomSchemes; +end; + procedure TSchemeRegistrationBrowserFrm.Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); begin PostMessage(Handle, CEF_AFTERCREATED, 0, 0); diff --git a/demos/SimpleBrowser2/SimpleBrowser2.dpr b/demos/SimpleBrowser2/SimpleBrowser2.dpr index fff3c359..5030c1af 100644 --- a/demos/SimpleBrowser2/SimpleBrowser2.dpr +++ b/demos/SimpleBrowser2/SimpleBrowser2.dpr @@ -71,8 +71,6 @@ begin GlobalCEFApp.UserDataPath := 'cef\User Data'; } - GlobalCEFApp.SetCurrentDir := True; - // 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/SimpleExternalPumpBrowser/SimpleExternalPumpBrowser.dpr b/demos/SimpleExternalPumpBrowser/SimpleExternalPumpBrowser.dpr index 352776ae..3b8c818e 100644 --- a/demos/SimpleExternalPumpBrowser/SimpleExternalPumpBrowser.dpr +++ b/demos/SimpleExternalPumpBrowser/SimpleExternalPumpBrowser.dpr @@ -43,11 +43,9 @@ uses {$IFDEF DELPHI16_UP} Vcl.Forms, WinApi.Windows, - System.SysUtils, {$ELSE} Forms, Windows, - SysUtils, {$ENDIF } uCEFApplication, uCEFWorkScheduler, @@ -60,17 +58,9 @@ uses {$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} begin - // TCEFWorkScheduler will call cef_do_message_loop_work when - // it's told in the GlobalCEFApp.OnScheduleMessagePumpWork event. - // GlobalCEFWorkScheduler needs to be created before the - // GlobalCEFApp.StartMainProcess call. - GlobalCEFWorkScheduler := TCEFWorkScheduler.Create(nil); - - GlobalCEFApp := TCefApplication.Create; - GlobalCEFApp.FlashEnabled := False; - GlobalCEFApp.ExternalMessagePump := True; - GlobalCEFApp.MultiThreadedMessageLoop := False; - GlobalCEFApp.OnScheduleMessagePumpWork := GlobalCEFApp_OnScheduleMessagePumpWork; + // GlobalCEFApp creation and initialization moved to a different unit to fix the memory leak described in the bug #89 + // https://github.com/salvadordf/CEF4Delphi/issues/89 + CreateGlobalCEFApp; if GlobalCEFApp.StartMainProcess then begin @@ -87,6 +77,6 @@ begin GlobalCEFWorkScheduler.StopScheduler; end; - FreeAndNil(GlobalCEFApp); - FreeAndNil(GlobalCEFWorkScheduler); + DestroyGlobalCEFApp; + DestroyGlobalCEFWorkScheduler; end. diff --git a/demos/SimpleExternalPumpBrowser/uSimpleExternalPumpBrowser.pas b/demos/SimpleExternalPumpBrowser/uSimpleExternalPumpBrowser.pas index 535cf040..ec4bed91 100644 --- a/demos/SimpleExternalPumpBrowser/uSimpleExternalPumpBrowser.pas +++ b/demos/SimpleExternalPumpBrowser/uSimpleExternalPumpBrowser.pas @@ -50,7 +50,7 @@ uses Controls, Forms, Dialogs, StdCtrls, ExtCtrls, {$ENDIF} uCEFChromium, uCEFWindowParent, uCEFTypes, uCEFConstants, uCEFInterfaces, uCEFWorkScheduler, - uCEFChromiumWindow; + uCEFChromiumWindow, Vcl.ComCtrls, Vcl.AppEvnts; type TSimpleExternalPumpBrowserFrm = class(TForm) @@ -86,7 +86,7 @@ type var SimpleExternalPumpBrowserFrm : TSimpleExternalPumpBrowserFrm; -procedure GlobalCEFApp_OnScheduleMessagePumpWork(const aDelayMS : int64); +procedure CreateGlobalCEFApp; implementation @@ -108,6 +108,20 @@ begin if (GlobalCEFWorkScheduler <> nil) then GlobalCEFWorkScheduler.ScheduleMessagePumpWork(aDelayMS); end; +procedure CreateGlobalCEFApp; +begin + // TCEFWorkScheduler will call cef_do_message_loop_work when + // it's told in the GlobalCEFApp.OnScheduleMessagePumpWork event. + // GlobalCEFWorkScheduler needs to be created before the + // GlobalCEFApp.StartMainProcess call. + GlobalCEFWorkScheduler := TCEFWorkScheduler.Create(nil); + + GlobalCEFApp := TCefApplication.Create; + GlobalCEFApp.ExternalMessagePump := True; + GlobalCEFApp.MultiThreadedMessageLoop := False; + GlobalCEFApp.OnScheduleMessagePumpWork := GlobalCEFApp_OnScheduleMessagePumpWork; +end; + procedure TSimpleExternalPumpBrowserFrm.FormCreate(Sender: TObject); begin FCanClose := False; diff --git a/demos/SimpleFMXBrowser/SimpleFMXBrowser.dpr b/demos/SimpleFMXBrowser/SimpleFMXBrowser.dpr index 52236dcb..75e740a6 100644 --- a/demos/SimpleFMXBrowser/SimpleFMXBrowser.dpr +++ b/demos/SimpleFMXBrowser/SimpleFMXBrowser.dpr @@ -18,8 +18,7 @@ uses {$ENDIF} begin - GlobalCEFApp := TCefApplication.Create; - GlobalCEFApp.MustFreeLibrary := False; + GlobalCEFApp := TCefApplication.Create; // In case you want to use custom directories for the CEF3 binaries, cache, cookies and user data. // If you don't set a cache directory the browser will use in-memory cache. @@ -28,7 +27,6 @@ begin GlobalCEFApp.ResourcesDirPath := 'cef'; GlobalCEFApp.LocalesDirPath := 'cef\locales'; GlobalCEFApp.EnableGPU := True; // Enable hardware acceleration - GlobalCEFApp.DisableGPUCache := True; // Disable the creation of a 'GPUCache' directory in the hard drive. GlobalCEFApp.cache := 'cef\cache'; GlobalCEFApp.cookies := 'cef\cookies'; GlobalCEFApp.UserDataPath := 'cef\User Data'; @@ -46,6 +44,5 @@ begin SimpleFMXBrowserFrm.Free; end; - GlobalCEFApp.Free; - GlobalCEFApp := nil; + DestroyGlobalCEFApp; end. diff --git a/demos/SimpleLazOSRBrowser/00-Delete.bat b/demos/SimpleLazOSRBrowser/00-Delete.bat new file mode 100644 index 00000000..0b5ba5c8 --- /dev/null +++ b/demos/SimpleLazOSRBrowser/00-Delete.bat @@ -0,0 +1,2 @@ +rmdir /S /Q lib +rmdir /S /Q backup diff --git a/demos/SimpleLazOSRBrowser/SimpleLazOSRBrowser.ico b/demos/SimpleLazOSRBrowser/SimpleLazOSRBrowser.ico new file mode 100644 index 0000000000000000000000000000000000000000..0341321b5d952e1662a3d9444a73cf9f42a7db37 GIT binary patch literal 137040 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 G`+orYGy**U literal 0 HcmV?d00001 diff --git a/demos/SimpleLazOSRBrowser/SimpleLazOSRBrowser.lpi b/demos/SimpleLazOSRBrowser/SimpleLazOSRBrowser.lpi new file mode 100644 index 00000000..ec22b57a --- /dev/null +++ b/demos/SimpleLazOSRBrowser/SimpleLazOSRBrowser.lpi @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + <UseAppBundle Value="False"/> + <ResourceType Value="res"/> + <Icon Value="0"/> + </General> + <BuildModes Count="1"> + <Item1 Name="Default" Default="True"/> + </BuildModes> + <PublishOptions> + <Version Value="2"/> + </PublishOptions> + <RunParams> + <local> + <FormatVersion Value="1"/> + </local> + </RunParams> + <RequiredPackages Count="2"> + <Item1> + <PackageName Value="CEF4Delphi_Lazarus"/> + </Item1> + <Item2> + <PackageName Value="LCL"/> + </Item2> + </RequiredPackages> + <Units Count="2"> + <Unit0> + <Filename Value="SimpleLazOSRBrowser.lpr"/> + <IsPartOfProject Value="True"/> + </Unit0> + <Unit1> + <Filename Value="usimplelazosrbrowser.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="Form1"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + </Unit1> + </Units> + </ProjectOptions> + <CompilerOptions> + <Version Value="11"/> + <PathDelim Value="\"/> + <Target> + <Filename Value="..\..\bin\SimpleLazOSRBrowser"/> + </Target> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir)"/> + <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> + </SearchPaths> + <Parsing> + <SyntaxOptions> + <SyntaxMode Value="Delphi"/> + </SyntaxOptions> + </Parsing> + <Linking> + <Options> + <Win32> + <GraphicApplication Value="True"/> + </Win32> + </Options> + </Linking> + <Other> + <CustomOptions Value="-dBorland -dVer150 -dDelphi7 -dCompiler6_Up -dPUREPASCAL"/> + </Other> + </CompilerOptions> + <Debugging> + <Exceptions Count="3"> + <Item1> + <Name Value="EAbort"/> + </Item1> + <Item2> + <Name Value="ECodetoolError"/> + </Item2> + <Item3> + <Name Value="EFOpenError"/> + </Item3> + </Exceptions> + </Debugging> +</CONFIG> diff --git a/demos/SimpleLazOSRBrowser/SimpleLazOSRBrowser.lpr b/demos/SimpleLazOSRBrowser/SimpleLazOSRBrowser.lpr new file mode 100644 index 00000000..c38e910f --- /dev/null +++ b/demos/SimpleLazOSRBrowser/SimpleLazOSRBrowser.lpr @@ -0,0 +1,68 @@ +// ************************************************************************ +// ***************************** 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 © 2018 Salvador Díaz Fau. All rights reserved. +// +// ************************************************************************ +// ************ vvvv Original license and comments below vvvv ************* +// ************************************************************************ +(* + * Delphi Chromium Embedded 3 + * + * Usage allowed under the restrictions of the Lesser GNU General Public License + * or alternatively the restrictions of the Mozilla Public License 1.1 + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for + * the specific language governing rights and limitations under the License. + * + * Unit owner : Henri Gourvest <hgourvest@gmail.com> + * Web site : http://www.progdigy.com + * Repository : http://code.google.com/p/delphichromiumembedded/ + * Group : http://groups.google.com/group/delphichromiumembedded + * + * Embarcadero Technologies, Inc is not permitted to use or redistribute + * this source code without explicit permission. + * + *) + +program SimpleLazOSRBrowser; + +{$MODE OBJFPC}{$H+} + +uses + Forms, + LCLIntf, LCLType, LMessages, Interfaces, + uCEFApplication, + usimplelazosrbrowser in 'uSimpleOSRBrowser.pas' {Form1}; + +{$IFDEF MSWINDOWS} + // CEF3 needs to set the LARGEADDRESSAWARE flag which allows 32-bit processes to use up to 3GB of RAM. + {$SetPEFlags $20} +{$ENDIF} + +{$R *.res} + +begin + GlobalCEFApp := TCefApplication.Create; + GlobalCEFApp.WindowlessRenderingEnabled := True; + GlobalCEFApp.EnableHighDPISupport := True; + + if GlobalCEFApp.StartMainProcess then + begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; + end; + + DestroyGlobalCEFApp; +end. diff --git a/demos/SimpleLazOSRBrowser/SimpleLazOSRBrowser.lps b/demos/SimpleLazOSRBrowser/SimpleLazOSRBrowser.lps new file mode 100644 index 00000000..21c8b211 --- /dev/null +++ b/demos/SimpleLazOSRBrowser/SimpleLazOSRBrowser.lps @@ -0,0 +1,262 @@ +<?xml version="1.0" encoding="UTF-8"?> +<CONFIG> + <ProjectSession> + <PathDelim Value="\"/> + <Version Value="10"/> + <BuildModes Active="Default"/> + <Units Count="15"> + <Unit0> + <Filename Value="SimpleLazOSRBrowser.lpr"/> + <IsPartOfProject Value="True"/> + <IsVisibleTab Value="True"/> + <TopLine Value="31"/> + <CursorPos X="10" Y="43"/> + <UsageCount Value="39"/> + <Loaded Value="True"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit0> + <Unit1> + <Filename Value="usimplelazosrbrowser.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="Form1"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <EditorIndex Value="1"/> + <TopLine Value="781"/> + <CursorPos Y="788"/> + <UsageCount Value="39"/> + <Bookmarks Count="2"> + <Item0 Y="558" ID="2"/> + <Item1 X="43" Y="797" ID="1"/> + </Bookmarks> + <Loaded Value="True"/> + <LoadedDesigner Value="True"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit1> + <Unit2> + <Filename Value="..\..\..\..\..\..\..\..\stefan.otto\Downloads\CEF4Delphi-master\CEF4Delphi-master\demos\SimpleOSRBrowser\uSimpleOSRBrowser.pas"/> + <ComponentName Value="Form1"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <EditorIndex Value="-1"/> + <CursorPos X="67" Y="20"/> + <UsageCount Value="9"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit2> + <Unit3> + <Filename Value="..\..\source\uBufferPanel.pas"/> + <EditorIndex Value="-1"/> + <TopLine Value="138"/> + <CursorPos X="28" Y="163"/> + <UsageCount Value="16"/> + </Unit3> + <Unit4> + <Filename Value="..\..\..\..\lcl\lcltype.pp"/> + <UnitName Value="LCLType"/> + <EditorIndex Value="-1"/> + <TopLine Value="1303"/> + <CursorPos X="3" Y="1320"/> + <UsageCount Value="13"/> + <DefaultSyntaxHighlighter Value="Delphi"/> + </Unit4> + <Unit5> + <Filename Value="C:\lazarus\lcl\forms.pp"/> + <UnitName Value="Forms"/> + <EditorIndex Value="-1"/> + <TopLine Value="1549"/> + <CursorPos X="15" Y="1493"/> + <UsageCount Value="11"/> + </Unit5> + <Unit6> + <Filename Value="C:\lazarus\lcl\graphics.pp"/> + <UnitName Value="Graphics"/> + <EditorIndex Value="-1"/> + <TopLine Value="1376"/> + <CursorPos X="90" Y="1389"/> + <UsageCount Value="11"/> + </Unit6> + <Unit7> + <Filename Value="C:\lazarus\lcl\lclintf.pas"/> + <UnitName Value="LCLIntf"/> + <EditorIndex Value="-1"/> + <UsageCount Value="10"/> + </Unit7> + <Unit8> + <Filename Value="C:\lazarus\lcl\controls.pp"/> + <UnitName Value="Controls"/> + <EditorIndex Value="-1"/> + <TopLine Value="2054"/> + <CursorPos X="82" Y="2074"/> + <UsageCount Value="11"/> + </Unit8> + <Unit9> + <Filename Value="C:\lazarus\lcl\include\wincontrol.inc"/> + <EditorIndex Value="4"/> + <TopLine Value="5880"/> + <CursorPos Y="5898"/> + <UsageCount Value="11"/> + <Loaded Value="True"/> + </Unit9> + <Unit10> + <Filename Value="C:\lazarus\lcl\widgetset\wscontrols.pp"/> + <UnitName Value="WSControls"/> + <EditorIndex Value="-1"/> + <TopLine Value="329"/> + <CursorPos Y="331"/> + <UsageCount Value="10"/> + </Unit10> + <Unit11> + <Filename Value="..\..\source\uCEFMiscFunctions.pas"/> + <EditorIndex Value="2"/> + <TopLine Value="1508"/> + <CursorPos X="23" Y="1519"/> + <UsageCount Value="10"/> + <Loaded Value="True"/> + </Unit11> + <Unit12> + <Filename Value="..\..\source\uCEFConstants.pas"/> + <EditorIndex Value="-1"/> + <TopLine Value="361"/> + <CursorPos X="3" Y="384"/> + <UsageCount Value="10"/> + </Unit12> + <Unit13> + <Filename Value="C:\lazarus\lcl\include\application.inc"/> + <EditorIndex Value="-1"/> + <TopLine Value="1696"/> + <CursorPos X="3" Y="1701"/> + <UsageCount Value="11"/> + </Unit13> + <Unit14> + <Filename Value="C:\lazarus\fpc\3.0.4\source\rtl\win\wininc\defines.inc"/> + <EditorIndex Value="3"/> + <TopLine Value="4867"/> + <CursorPos X="6" Y="4753"/> + <UsageCount Value="10"/> + <Loaded Value="True"/> + </Unit14> + </Units> + <JumpHistory Count="30" HistoryIndex="29"> + <Position1> + <Filename Value="usimplelazosrbrowser.pas"/> + <Caret Line="858" Column="69" TopLine="844"/> + </Position1> + <Position2> + <Filename Value="usimplelazosrbrowser.pas"/> + <Caret Line="889" TopLine="862"/> + </Position2> + <Position3> + <Filename Value="usimplelazosrbrowser.pas"/> + <Caret Line="85" Column="87" TopLine="67"/> + </Position3> + <Position4> + <Filename Value="usimplelazosrbrowser.pas"/> + <Caret Line="90" Column="36" TopLine="67"/> + </Position4> + <Position5> + <Filename Value="usimplelazosrbrowser.pas"/> + <Caret Line="248" Column="39" TopLine="218"/> + </Position5> + <Position6> + <Filename Value="usimplelazosrbrowser.pas"/> + <Caret Line="288" TopLine="258"/> + </Position6> + <Position7> + <Filename Value="usimplelazosrbrowser.pas"/> + <Caret Line="90" Column="36" TopLine="73"/> + </Position7> + <Position8> + <Filename Value="usimplelazosrbrowser.pas"/> + <Caret Line="247" TopLine="224"/> + </Position8> + <Position9> + <Filename Value="usimplelazosrbrowser.pas"/> + <Caret Line="441" Column="79" TopLine="420"/> + </Position9> + <Position10> + <Filename Value="usimplelazosrbrowser.pas"/> + <Caret Line="96" Column="15" TopLine="86"/> + </Position10> + <Position11> + <Filename Value="usimplelazosrbrowser.pas"/> + <Caret Line="195" Column="24" TopLine="183"/> + </Position11> + <Position12> + <Filename Value="usimplelazosrbrowser.pas"/> + <Caret Line="612" TopLine="594"/> + </Position12> + <Position13> + <Filename Value="usimplelazosrbrowser.pas"/> + <Caret Line="87" Column="15" TopLine="63"/> + </Position13> + <Position14> + <Filename Value="usimplelazosrbrowser.pas"/> + <Caret Line="281" Column="21" TopLine="272"/> + </Position14> + <Position15> + <Filename Value="usimplelazosrbrowser.pas"/> + <Caret Line="811" Column="82" TopLine="793"/> + </Position15> + <Position16> + <Filename Value="usimplelazosrbrowser.pas"/> + <Caret Line="136" TopLine="113"/> + </Position16> + <Position17> + <Filename Value="usimplelazosrbrowser.pas"/> + <Caret Line="549" Column="70" TopLine="534"/> + </Position17> + <Position18> + <Filename Value="usimplelazosrbrowser.pas"/> + <Caret Line="78" Column="15" TopLine="75"/> + </Position18> + <Position19> + <Filename Value="usimplelazosrbrowser.pas"/> + <Caret Line="809" TopLine="793"/> + </Position19> + <Position20> + <Filename Value="usimplelazosrbrowser.pas"/> + <Caret Line="788" TopLine="770"/> + </Position20> + <Position21> + <Filename Value="usimplelazosrbrowser.pas"/> + <Caret Line="792" Column="66" TopLine="770"/> + </Position21> + <Position22> + <Filename Value="usimplelazosrbrowser.pas"/> + <Caret Line="87" Column="15" TopLine="61"/> + </Position22> + <Position23> + <Filename Value="usimplelazosrbrowser.pas"/> + <Caret Line="329" Column="59" TopLine="323"/> + </Position23> + <Position24> + <Filename Value="usimplelazosrbrowser.pas"/> + <Caret Line="78" Column="15" TopLine="70"/> + </Position24> + <Position25> + <Filename Value="usimplelazosrbrowser.pas"/> + <Caret Line="789" Column="74" TopLine="781"/> + </Position25> + <Position26> + <Filename Value="C:\lazarus\lcl\include\wincontrol.inc"/> + <Caret Line="7237" TopLine="7214"/> + </Position26> + <Position27> + <Filename Value="C:\lazarus\lcl\include\wincontrol.inc"/> + <Caret Line="5898" TopLine="5880"/> + </Position27> + <Position28> + <Filename Value="usimplelazosrbrowser.pas"/> + <Caret Line="788" TopLine="781"/> + </Position28> + <Position29> + <Filename Value="usimplelazosrbrowser.pas"/> + <Caret Line="789" TopLine="781"/> + </Position29> + <Position30> + <Filename Value="..\..\source\uCEFMiscFunctions.pas"/> + <Caret Line="1519" Column="23" TopLine="1508"/> + </Position30> + </JumpHistory> + </ProjectSession> +</CONFIG> diff --git a/demos/SimpleLazOSRBrowser/SimpleLazOSRBrowser.res b/demos/SimpleLazOSRBrowser/SimpleLazOSRBrowser.res new file mode 100644 index 0000000000000000000000000000000000000000..d36929a1f5062d8882ddc5021e630f3897d2bcdb GIT binary patch literal 137304 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%0A<uI+?ezou3 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 literal 0 HcmV?d00001 diff --git a/demos/SimpleLazOSRBrowser/usimplelazosrbrowser.lfm b/demos/SimpleLazOSRBrowser/usimplelazosrbrowser.lfm new file mode 100644 index 00000000..6d550d3c --- /dev/null +++ b/demos/SimpleLazOSRBrowser/usimplelazosrbrowser.lfm @@ -0,0 +1,139 @@ +object Form1: TForm1 + Left = 282 + Height = 565 + Top = 185 + Width = 800 + Caption = 'Simple OSR Browser - Initializing browser. Please wait...' + ClientHeight = 565 + ClientWidth = 800 + Color = clBtnFace + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + OnCloseQuery = FormCloseQuery + OnCreate = FormCreate + OnDestroy = FormDestroy + OnHide = FormHide + OnShow = FormShow + Position = poScreenCenter + LCLVersion = '1.8.4.0' + object NavControlPnl: TPanel + Left = 0 + Height = 21 + Top = 0 + Width = 800 + Align = alTop + BevelOuter = bvNone + ClientHeight = 21 + ClientWidth = 800 + Enabled = False + TabOrder = 0 + object ComboBox1: TComboBox + Left = 0 + Height = 21 + Top = 0 + Width = 731 + Align = alClient + ItemHeight = 13 + Items.Strings = ( + 'https://www.google.co' + 'https://www.w3schools.com/tags/tryit.asp?filename=tryhtml5_select_form' + 'https://www.briskbard.com' + 'https://frames-per-second.appspot.com/' + ) + OnEnter = ComboBox1Enter + TabOrder = 0 + Text = 'https://www.google.com' + end + object Panel2: TPanel + Left = 731 + Height = 21 + Top = 0 + Width = 69 + Align = alRight + BevelOuter = bvNone + ClientHeight = 21 + ClientWidth = 69 + TabOrder = 1 + object GoBtn: TButton + Left = 4 + Height = 21 + Top = 0 + Width = 31 + Caption = 'Go' + OnClick = GoBtnClick + OnEnter = GoBtnEnter + TabOrder = 0 + end + object SnapshotBtn: TButton + Left = 38 + Height = 21 + Hint = 'Take snapshot' + Top = 0 + Width = 31 + Caption = 'µ' + Font.CharSet = SYMBOL_CHARSET + Font.Color = clWindowText + Font.Height = -24 + Font.Name = 'Webdings' + OnClick = SnapshotBtnClick + OnEnter = SnapshotBtnEnter + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 1 + end + end + end + object Panel1: TBufferPanel + Left = 0 + Height = 544 + Top = 21 + Width = 800 + Align = alClient + Caption = 'Panel1' + TabOrder = 1 + TabStop = True + OnClick = Panel1Click + OnEnter = Panel1Enter + OnExit = Panel1Exit + OnMouseDown = Panel1MouseDown + OnMouseMove = Panel1MouseMove + OnMouseUp = Panel1MouseUp + OnMouseWheel = Panel1MouseWheel + OnKeyDown = Panel1KeyDown + OnKeyPress = Panel1KeyPress + OnKeyUp = Panel1KeyUp + OnResize = Panel1Resize + end + object chrmosr: TChromium + OnTooltip = chrmosrTooltip + OnBeforePopup = chrmosrBeforePopup + OnAfterCreated = chrmosrAfterCreated + OnBeforeClose = chrmosrBeforeClose + OnClose = chrmosrClose + OnGetViewRect = chrmosrGetViewRect + OnGetScreenPoint = chrmosrGetScreenPoint + OnGetScreenInfo = chrmosrGetScreenInfo + OnPopupShow = chrmosrPopupShow + OnPopupSize = chrmosrPopupSize + OnPaint = chrmosrPaint + OnCursorChange = chrmosrCursorChange + left = 24 + top = 56 + end + object SaveDialog1: TSaveDialog + Title = 'Save snapshot' + DefaultExt = '.bmp' + Filter = 'Bitmap files (*.bmp)|*.BMP' + left = 24 + top = 200 + end + object Timer1: TTimer + Enabled = False + Interval = 300 + OnTimer = Timer1Timer + left = 24 + top = 128 + end +end diff --git a/demos/SimpleLazOSRBrowser/usimplelazosrbrowser.pas b/demos/SimpleLazOSRBrowser/usimplelazosrbrowser.pas new file mode 100644 index 00000000..38d96363 --- /dev/null +++ b/demos/SimpleLazOSRBrowser/usimplelazosrbrowser.pas @@ -0,0 +1,874 @@ +// ************************************************************************ +// ***************************** 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 © 2018 Salvador Diaz Fau. All rights reserved. +// +// ************************************************************************ +// ************ vvvv Original license and comments below vvvv ************* +// ************************************************************************ +(* + * Delphi Chromium Embedded 3 + * + * Usage allowed under the restrictions of the Lesser GNU General Public License + * or alternatively the restrictions of the Mozilla Public License 1.1 + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for + * the specific language governing rights and limitations under the License. + * + * Unit owner : Henri Gourvest <hgourvest@gmail.com> + * Web site : http://www.progdigy.com + * Repository : http://code.google.com/p/delphichromiumembedded/ + * Group : http://groups.google.com/group/delphichromiumembedded + * + * Embarcadero Technologies, Inc is not permitted to use or redistribute + * this source code without explicit permission. + * + *) + +unit usimplelazosrbrowser; + +{$MODE OBJFPC}{$H+} + +interface + +uses + Windows, LCLIntf, LCLType, LMessages, Messages, SysUtils, Variants, Classes, SyncObjs, + Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, + uCEFChromium, uCEFTypes, uCEFInterfaces, uCEFConstants, uBufferPanel, Types; + +type + + { TForm1 } + + TForm1 = class(TForm) + NavControlPnl: TPanel; + chrmosr: TChromium; + ComboBox1: TComboBox; + Panel2: TPanel; + GoBtn: TButton; + SnapshotBtn: TButton; + SaveDialog1: TSaveDialog; + Timer1: TTimer; + Panel1: TBufferPanel; + + procedure GoBtnClick(Sender: TObject); + procedure GoBtnEnter(Sender: TObject); + + procedure Panel1Enter(Sender: TObject); + procedure Panel1Exit(Sender: TObject); + procedure Panel1Resize(Sender: TObject); + procedure Panel1Click(Sender: TObject); + procedure Panel1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); + procedure Panel1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); + procedure Panel1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); + procedure Panel1MouseLeave(Sender: TObject); + procedure Panel1MouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean); + procedure Panel1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); + procedure Panel1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); + procedure Panel1KeyPress(Sender: TObject; var Key: char); + + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure FormHide(Sender: TObject); + procedure FormAfterMonitorDpiChanged(Sender: TObject; OldDPI, NewDPI: Integer); + procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); + + procedure chrmosrPaint(Sender: TObject; const browser: ICefBrowser; kind: TCefPaintElementType; dirtyRectsCount: NativeUInt; const dirtyRects: PCefRectArray; const buffer: Pointer; aWidth, aHeight: Integer); + procedure chrmosrCursorChange(Sender: TObject; const browser: ICefBrowser; aCursor: HICON; cursorType: TCefCursorType; const customCursorInfo: PCefCursorInfo); + procedure chrmosrGetViewRect(Sender: TObject; const browser: ICefBrowser; var rect: TCefRect; out Result: Boolean); + procedure chrmosrGetScreenPoint(Sender: TObject; const browser: ICefBrowser; viewX, viewY: Integer; var screenX, screenY: Integer; out Result: Boolean); + procedure chrmosrGetScreenInfo(Sender: TObject; const browser: ICefBrowser; var screenInfo: TCefScreenInfo; out Result: Boolean); + procedure chrmosrPopupShow(Sender: TObject; const browser: ICefBrowser; aShow: Boolean); + procedure chrmosrPopupSize(Sender: TObject; const browser: ICefBrowser; const rect: PCefRect); + procedure chrmosrAfterCreated(Sender: TObject; const browser: ICefBrowser); + procedure chrmosrTooltip(Sender: TObject; const browser: ICefBrowser; var aText: ustring; out Result: Boolean); + procedure chrmosrBeforePopup(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 noJavascriptAccess: Boolean; var Result: Boolean); + procedure chrmosrClose(Sender: TObject; const browser: ICefBrowser; out Result: Boolean); + procedure chrmosrBeforeClose(Sender: TObject; const browser: ICefBrowser); + + procedure SnapshotBtnClick(Sender: TObject); + procedure Timer1Timer(Sender: TObject); + procedure SnapshotBtnEnter(Sender: TObject); + procedure ComboBox1Enter(Sender: TObject); + + protected + FbFirst : boolean; + FPopUpBitmap : TBitmap; + FPopUpRect : TRect; + FShowPopUp : boolean; + FResizing : boolean; + FPendingResize : boolean; + FCanClose : boolean; + FClosing : boolean; + FResizeCS : TCriticalSection; + + FLastClickCount : integer; + FLastClickTime : integer; + FLastClickPoint : TPoint; + FLastClickButton : TMouseButton; + + function getModifiers(Shift: TShiftState): TCefEventFlags; + function GetButton(Button: TMouseButton): TCefMouseButtonType; + procedure DoResize; + procedure InitializeLastClick; + function CancelPreviousClick(x, y : integer; var aCurrentTime : integer) : boolean; + + procedure WMMove(var aMessage : TWMMove); message WM_MOVE; + procedure WMMoving(var aMessage : TMessage); message WM_MOVING; + procedure WMCaptureChanged(var aMessage : TMessage); message WM_CAPTURECHANGED; + procedure WMCancelMode(var aMessage : TMessage); message WM_CANCELMODE; + procedure WMEnterMenuLoop(var aMessage: TMessage); message WM_ENTERMENULOOP; + procedure WMExitMenuLoop(var aMessage: TMessage); message WM_EXITMENULOOP; + procedure WMSysChar(var aMessage: TMessage); message WM_SYSCHAR; + procedure WMSysKeyDown(var aMessage: TMessage); message WM_SYSKEYDOWN; + procedure WMSysKeyUp(var aMessage: TMessage); message WM_SYSKEYUP; + procedure BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED; + procedure PendingResizeMsg(var aMessage : TMessage); message CEF_PENDINGRESIZE; + procedure PendingInvalidateMsg(var aMessage : TMessage); message CEF_PENDINGINVALIDATE; + + public + { Public declarations } + end; + +var + Form1: TForm1; + +implementation + +{$R *.lfm} + +uses + Math, + uCEFMiscFunctions, uCEFApplication; + +// This is the destruction sequence in OSR mode : +// 1- FormCloseQuery sets CanClose to the initial FCanClose value (False) and calls chrmosr.CloseBrowser(True). +// 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. + +procedure TForm1.GoBtnClick(Sender: TObject); +begin + FResizeCS.Acquire; + FResizing := False; + FPendingResize := False; + FResizeCS.Release; + + chrmosr.LoadURL(ComboBox1.Text); +end; + +procedure TForm1.GoBtnEnter(Sender: TObject); +begin + chrmosr.SendFocusEvent(False); +end; + +procedure TForm1.chrmosrAfterCreated(Sender: TObject; const browser: ICefBrowser); +begin + PostMessage(Handle, CEF_AFTERCREATED, 0, 0); +end; + +procedure TForm1.chrmosrBeforeClose(Sender: TObject; const browser: ICefBrowser); +begin + FCanClose := True; + PostMessage(Handle, WM_CLOSE, 0, 0); +end; + +procedure TForm1.chrmosrBeforePopup(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 noJavascriptAccess: Boolean; + var Result: Boolean); +begin + // For simplicity, this demo blocks all popup windows and new tabs + Result := (targetDisposition in [WOD_NEW_FOREGROUND_TAB, WOD_NEW_BACKGROUND_TAB, WOD_NEW_POPUP, WOD_NEW_WINDOW]); +end; + +procedure TForm1.chrmosrClose(Sender: TObject; const browser: ICefBrowser; out Result: Boolean); +begin + Result := False; +end; + +procedure TForm1.chrmosrCursorChange(Sender : TObject; + const browser : ICefBrowser; + aCursor : HICON; + cursorType : TCefCursorType; + const customCursorInfo : PCefCursorInfo); +begin + Panel1.Cursor := GefCursorToWindowsCursor(cursorType); +end; + +procedure TForm1.chrmosrGetScreenInfo(Sender : TObject; + const browser : ICefBrowser; + var screenInfo : TCefScreenInfo; + out Result : Boolean); +var + TempRect : TCEFRect; +begin + if (GlobalCEFApp <> nil) then + begin + TempRect.x := 0; + TempRect.y := 0; + TempRect.width := DeviceToLogical(Panel1.Width, GlobalCEFApp.DeviceScaleFactor); + TempRect.height := DeviceToLogical(Panel1.Height, GlobalCEFApp.DeviceScaleFactor); + + screenInfo.device_scale_factor := GlobalCEFApp.DeviceScaleFactor; + screenInfo.depth := 0; + screenInfo.depth_per_component := 0; + screenInfo.is_monochrome := Ord(False); + screenInfo.rect := TempRect; + screenInfo.available_rect := TempRect; + + Result := True; + end + else + Result := False; +end; + +procedure TForm1.chrmosrGetScreenPoint(Sender: TObject; + const browser: ICefBrowser; viewX, viewY: Integer; var screenX, + screenY: Integer; out Result: Boolean); +var + TempScreenPt, TempViewPt : TPoint; +begin + if (GlobalCEFApp <> nil) then + begin + TempViewPt.x := LogicalToDevice(viewX, GlobalCEFApp.DeviceScaleFactor); + TempViewPt.y := LogicalToDevice(viewY, GlobalCEFApp.DeviceScaleFactor); + TempScreenPt := Panel1.ClientToScreen(TempViewPt); + screenX := TempScreenPt.x; + screenY := TempScreenPt.y; + Result := True; + end + else + Result := False; +end; + +procedure TForm1.chrmosrGetViewRect(Sender : TObject; + const browser : ICefBrowser; + var rect : TCefRect; + out Result : Boolean); +begin + if (GlobalCEFApp <> nil) then + begin + rect.x := 0; + rect.y := 0; + rect.width := DeviceToLogical(Panel1.Width, GlobalCEFApp.DeviceScaleFactor); + rect.height := DeviceToLogical(Panel1.Height, GlobalCEFApp.DeviceScaleFactor); + Result := True; + end + else + Result := False; +end; + +procedure TForm1.chrmosrPaint(Sender: TObject; const browser: ICefBrowser; + kind: TCefPaintElementType; dirtyRectsCount: NativeUInt; + const dirtyRects: PCefRectArray; const buffer: Pointer; aWidth, + aHeight: Integer); +var + src, dst: PByte; + i, j, TempLineSize, TempSrcOffset, TempDstOffset, SrcStride : Integer; + n : NativeUInt; + TempWidth, TempHeight : integer; + TempBufferBits : Pointer; + TempForcedResize : boolean; + TempBitmap : TBitmap; +begin + try + FResizeCS.Acquire; + TempForcedResize := False; + + if Panel1.BeginBufferDraw then + begin + if (kind = PET_POPUP) then + begin + if (FPopUpBitmap = nil) or + (aWidth <> FPopUpBitmap.Width) or + (aHeight <> FPopUpBitmap.Height) then + begin + if (FPopUpBitmap <> nil) then FPopUpBitmap.Free; + + FPopUpBitmap := TBitmap.Create; + FPopUpBitmap.PixelFormat := pf32bit; + FPopUpBitmap.HandleType := bmDIB; + FPopUpBitmap.Width := aWidth; + FPopUpBitmap.Height := aHeight; + end; + + TempBitmap := FPopUpBitmap; + TempBitmap.BeginUpdate; + + TempWidth := FPopUpBitmap.Width; + TempHeight := FPopUpBitmap.Height; + end + else + begin + TempForcedResize := Panel1.UpdateBufferDimensions(aWidth, aHeight) or not(Panel1.BufferIsResized(False)); + + TempBitmap := Panel1.Buffer; + TempBitmap.BeginUpdate; + + TempWidth := Panel1.BufferWidth; + TempHeight := Panel1.BufferHeight; + end; + + if (TempBufferBits <> nil) then + begin + SrcStride := aWidth * SizeOf(TRGBQuad); + n := 0; + + while (n < dirtyRectsCount) do + begin + if (dirtyRects^[n].x >= 0) and (dirtyRects^[n].y >= 0) then + begin + TempLineSize := min(dirtyRects^[n].width, TempWidth - dirtyRects^[n].x) * SizeOf(TRGBQuad); + + if (TempLineSize > 0) then + begin + TempSrcOffset := ((dirtyRects^[n].y * aWidth) + dirtyRects^[n].x) * SizeOf(TRGBQuad); + TempDstOffset := (dirtyRects^[n].x * SizeOf(TRGBQuad)); + + src := @PByte(buffer)[TempSrcOffset]; + + i := 0; + j := min(dirtyRects^[n].height, TempHeight - dirtyRects^[n].y); + + while (i < j) do + begin + TempBufferBits := TempBitmap.Scanline[dirtyRects^[n].y + i]; + dst := @PByte(TempBufferBits)[TempDstOffset]; + + Move(src^, dst^, TempLineSize); + + Inc(src, SrcStride); + inc(i); + end; + end; + end; + + inc(n); + end; + + TempBitmap.EndUpdate; + + if FShowPopup and (FPopUpBitmap <> nil) then + Panel1.BufferDraw(FPopUpRect.Left, FPopUpRect.Top, FPopUpBitmap); + end; + + Panel1.EndBufferDraw; + + if HandleAllocated then PostMessage(Handle, CEF_PENDINGINVALIDATE, 0, 0); + + if (kind = PET_VIEW) then + begin + if (TempForcedResize or FPendingResize) and + HandleAllocated then + PostMessage(Handle, CEF_PENDINGRESIZE, 0, 0); + + FResizing := False; + FPendingResize := False; + end; + end; + finally + FResizeCS.Release; + end; +end; + +procedure TForm1.chrmosrPopupShow(Sender : TObject; + const browser : ICefBrowser; + aShow : Boolean); +begin + if aShow then + FShowPopUp := True + else + begin + FShowPopUp := False; + FPopUpRect := rect(0, 0, 0, 0); + + if (chrmosr <> nil) then chrmosr.Invalidate(PET_VIEW); + end; +end; + +procedure TForm1.chrmosrPopupSize(Sender : TObject; + const browser : ICefBrowser; + const rect : PCefRect); +begin + if (GlobalCEFApp <> nil) then + begin + LogicalToDevice(rect^, GlobalCEFApp.DeviceScaleFactor); + + FPopUpRect.Left := rect^.x; + FPopUpRect.Top := rect^.y; + FPopUpRect.Right := rect^.x + rect^.width - 1; + FPopUpRect.Bottom := rect^.y + rect^.height - 1; + end; +end; + +procedure TForm1.chrmosrTooltip(Sender: TObject; const browser: ICefBrowser; var aText: ustring; out Result: Boolean); +begin + Panel1.hint := aText; + Panel1.ShowHint := (length(aText) > 0); + Result := True; +end; + +procedure TForm1.ComboBox1Enter(Sender: TObject); +begin + chrmosr.SendFocusEvent(False); +end; + +function TForm1.getModifiers(Shift: TShiftState): TCefEventFlags; +begin + Result := EVENTFLAG_NONE; + + if (ssShift in Shift) then Result := Result or EVENTFLAG_SHIFT_DOWN; + if (ssAlt in Shift) then Result := Result or EVENTFLAG_ALT_DOWN; + if (ssCtrl in Shift) then Result := Result or EVENTFLAG_CONTROL_DOWN; + if (ssLeft in Shift) then Result := Result or EVENTFLAG_LEFT_MOUSE_BUTTON; + if (ssRight in Shift) then Result := Result or EVENTFLAG_RIGHT_MOUSE_BUTTON; + if (ssMiddle in Shift) then Result := Result or EVENTFLAG_MIDDLE_MOUSE_BUTTON; +end; + +function TForm1.GetButton(Button: TMouseButton): TCefMouseButtonType; +begin + case Button of + TMouseButton.mbRight : Result := MBT_RIGHT; + TMouseButton.mbMiddle : Result := MBT_MIDDLE; + else Result := MBT_LEFT; + end; +end; + +procedure TForm1.WMMove(var aMessage : TWMMove); +begin + inherited; + + if (chrmosr <> nil) then chrmosr.NotifyMoveOrResizeStarted; +end; + +procedure TForm1.WMMoving(var aMessage : TMessage); +begin + inherited; + + if (chrmosr <> nil) then chrmosr.NotifyMoveOrResizeStarted; +end; + +procedure TForm1.WMCaptureChanged(var aMessage : TMessage); +begin + inherited; + + if (chrmosr <> nil) then chrmosr.SendCaptureLostEvent; +end; + +procedure TForm1.WMCancelMode(var aMessage : TMessage); +begin + inherited; + + if (chrmosr <> nil) then chrmosr.SendCaptureLostEvent; +end; + +procedure TForm1.WMEnterMenuLoop(var aMessage: TMessage); +begin + inherited; + + if (aMessage.wParam = 0) and (GlobalCEFApp <> nil) then GlobalCEFApp.OsmodalLoop := True; +end; + +procedure TForm1.WMExitMenuLoop(var aMessage: TMessage); +begin + inherited; + + if (aMessage.wParam = 0) and (GlobalCEFApp <> nil) then GlobalCEFApp.OsmodalLoop := False; +end; + +procedure TForm1.WMSysChar(var aMessage: TMessage); +var + TempKeyEvent : TCefKeyEvent; +begin + inherited; + + if Panel1.Focused and (aMessage.wParam in [VK_BACK..VK_HELP]) then + begin + TempKeyEvent.kind := KEYEVENT_CHAR; + TempKeyEvent.modifiers := GetCefKeyboardModifiers(aMessage.wParam, aMessage.lParam); + TempKeyEvent.windows_key_code := aMessage.wParam; + TempKeyEvent.native_key_code := aMessage.lParam; + TempKeyEvent.is_system_key := ord(True); + TempKeyEvent.character := #0; + TempKeyEvent.unmodified_character := #0; + TempKeyEvent.focus_on_editable_field := ord(False); + + chrmosr.SendKeyEvent(@TempKeyEvent); + end; +end; + +procedure TForm1.WMSysKeyDown(var aMessage: TMessage); +var + TempKeyEvent : TCefKeyEvent; +begin + inherited; + + if Panel1.Focused and (aMessage.wParam in [VK_BACK..VK_HELP]) then + begin + TempKeyEvent.kind := KEYEVENT_RAWKEYDOWN; + TempKeyEvent.modifiers := GetCefKeyboardModifiers(aMessage.wParam, aMessage.lParam); + TempKeyEvent.windows_key_code := aMessage.wParam; + TempKeyEvent.native_key_code := aMessage.lParam; + TempKeyEvent.is_system_key := ord(True); + TempKeyEvent.character := #0; + TempKeyEvent.unmodified_character := #0; + TempKeyEvent.focus_on_editable_field := ord(False); + + chrmosr.SendKeyEvent(@TempKeyEvent); + end; +end; + +procedure TForm1.WMSysKeyUp(var aMessage: TMessage); +var + TempKeyEvent : TCefKeyEvent; +begin + inherited; + + if Panel1.Focused and (aMessage.wParam in [VK_BACK..VK_HELP]) then + begin + TempKeyEvent.kind := KEYEVENT_KEYUP; + TempKeyEvent.modifiers := GetCefKeyboardModifiers(aMessage.wParam, aMessage.lParam); + TempKeyEvent.windows_key_code := aMessage.wParam; + TempKeyEvent.native_key_code := aMessage.lParam; + TempKeyEvent.is_system_key := ord(True); + TempKeyEvent.character := #0; + TempKeyEvent.unmodified_character := #0; + TempKeyEvent.focus_on_editable_field := ord(False); + + chrmosr.SendKeyEvent(@TempKeyEvent); + end; +end; + +procedure TForm1.BrowserCreatedMsg(var aMessage : TMessage); +begin + Caption := 'Simple Lazarus OSR Browser'; + NavControlPnl.Enabled := True; + GoBtn.Click; +end; + +procedure TForm1.FormAfterMonitorDpiChanged(Sender: TObject; OldDPI, NewDPI: Integer); +begin + if (chrmosr <> nil) then + begin + chrmosr.NotifyScreenInfoChanged; + chrmosr.WasResized; + end; +end; + +procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); +begin + CanClose := FCanClose; + + if not(FClosing) then + begin + FClosing := True; + Visible := False; + chrmosr.CloseBrowser(True); + end; +end; + +procedure TForm1.FormCreate(Sender: TObject); +begin + FbFirst := False; + FPopUpBitmap := nil; + FPopUpRect := rect(0, 0, 0, 0); + FShowPopUp := False; + FResizing := False; + FPendingResize := False; + FCanClose := False; + FClosing := False; + FResizeCS := TCriticalSection.Create; + + InitializeLastClick; +end; + +procedure TForm1.FormDestroy(Sender: TObject); +begin + chrmosr.ShutdownDragAndDrop; + + if (FPopUpBitmap <> nil) then FreeAndNil(FPopUpBitmap); +end; + +procedure TForm1.FormHide(Sender: TObject); +begin + chrmosr.SendFocusEvent(False); + chrmosr.WasHidden(True); +end; + +procedure TForm1.FormShow(Sender: TObject); +begin + if chrmosr.Initialized then + begin + chrmosr.WasHidden(False); + chrmosr.SendFocusEvent(True); + end + else + begin + // opaque white background color + chrmosr.Options.BackgroundColor := CefColorSetARGB($FF, $FF, $FF, $FF); + + if chrmosr.CreateBrowser(nil, '') then + chrmosr.InitializeDragAndDrop(Panel1) + else + Timer1.Enabled := True; + end; +end; + +procedure TForm1.Panel1Click(Sender: TObject); +begin + Panel1.SetFocus; +end; + +procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +var + TempEvent : TCefMouseEvent; + TempTime : integer; +begin + if (GlobalCEFApp <> nil) and (chrmosr <> nil) then + begin + Panel1.SetFocus; + + if not(CancelPreviousClick(x, y, TempTime)) and (Button = FLastClickButton) then + inc(FLastClickCount) + else + begin + FLastClickPoint.x := x; + FLastClickPoint.y := y; + FLastClickCount := 1; + end; + + FLastClickTime := TempTime; + FLastClickButton := Button; + + TempEvent.x := X; + TempEvent.y := Y; + TempEvent.modifiers := getModifiers(Shift); + DeviceToLogical(TempEvent, GlobalCEFApp.DeviceScaleFactor); + chrmosr.SendMouseClickEvent(@TempEvent, GetButton(Button), False, FLastClickCount); + end; +end; + +procedure TForm1.Panel1MouseLeave(Sender: TObject); +var + TempEvent : TCefMouseEvent; + TempPoint : TPoint; + TempTime : integer; +begin + if (GlobalCEFApp <> nil) and (chrmosr <> nil) then + begin + GetCursorPos(TempPoint); + TempPoint := Panel1.ScreenToclient(TempPoint); + + if CancelPreviousClick(TempPoint.x, TempPoint.y, TempTime) then InitializeLastClick; + + TempEvent.x := TempPoint.x; + TempEvent.y := TempPoint.y; + TempEvent.modifiers := GetCefMouseModifiers; + DeviceToLogical(TempEvent, GlobalCEFApp.DeviceScaleFactor); + chrmosr.SendMouseMoveEvent(@TempEvent, True); + end; +end; + +procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); +var + TempEvent : TCefMouseEvent; + TempTime : integer; +begin + if (GlobalCEFApp <> nil) and (chrmosr <> nil) then + begin + if CancelPreviousClick(x, y, TempTime) then InitializeLastClick; + + TempEvent.x := x; + TempEvent.y := y; + TempEvent.modifiers := getModifiers(Shift); + DeviceToLogical(TempEvent, GlobalCEFApp.DeviceScaleFactor); + chrmosr.SendMouseMoveEvent(@TempEvent, False); + end; +end; + +procedure TForm1.Panel1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +var + TempEvent : TCefMouseEvent; +begin + if (GlobalCEFApp <> nil) and (chrmosr <> nil) then + begin + TempEvent.x := X; + TempEvent.y := Y; + TempEvent.modifiers := getModifiers(Shift); + DeviceToLogical(TempEvent, GlobalCEFApp.DeviceScaleFactor); + chrmosr.SendMouseClickEvent(@TempEvent, GetButton(Button), True, FLastClickCount); + end; +end; + +procedure TForm1.Panel1Resize(Sender: TObject); +begin + DoResize; +end; + +procedure TForm1.PendingResizeMsg(var aMessage : TMessage); +begin + DoResize; +end; + +procedure TForm1.PendingInvalidateMsg(var aMessage : TMessage); +begin + Panel1.Invalidate; +end; + +procedure TForm1.DoResize; +begin + try + FResizeCS.Acquire; + + if FResizing then + FPendingResize := True + else + if Panel1.BufferIsResized then + chrmosr.Invalidate(PET_VIEW) + else + begin + FResizing := True; + chrmosr.WasResized; + end; + finally + FResizeCS.Release; + end; +end; + +procedure TForm1.InitializeLastClick; +begin + FLastClickCount := 0; + FLastClickTime := 0; + FLastClickPoint.x := 0; + FLastClickPoint.y := 0; + FLastClickButton := mbLeft; +end; + +function TForm1.CancelPreviousClick(x, y : integer; var aCurrentTime : integer) : boolean; +begin + aCurrentTime := GetMessageTime; + + Result := (abs(FLastClickPoint.x - x) > (GetSystemMetrics(SM_CXDOUBLECLK) div 2)) or + (abs(FLastClickPoint.y - y) > (GetSystemMetrics(SM_CYDOUBLECLK) div 2)) or + (cardinal(aCurrentTime - FLastClickTime) > GetDoubleClickTime); +end; + +procedure TForm1.Panel1Enter(Sender: TObject); +begin + chrmosr.SendFocusEvent(True); +end; + +procedure TForm1.Panel1Exit(Sender: TObject); +begin + chrmosr.SendFocusEvent(False); +end; + +procedure TForm1.Panel1KeyPress(Sender: TObject; var Key: char); +var + TempKeyEvent : TCefKeyEvent; +begin + if Panel1.Focused then + begin + TempKeyEvent.kind := KEYEVENT_CHAR; + TempKeyEvent.modifiers := GetCefKeyboardModifiers(WParam(Key), 0); + TempKeyEvent.windows_key_code := ord(Key); + TempKeyEvent.native_key_code := 0; + TempKeyEvent.is_system_key := ord(False); + TempKeyEvent.character := #0; + TempKeyEvent.unmodified_character := #0; + TempKeyEvent.focus_on_editable_field := ord(False); + + chrmosr.SendKeyEvent(@TempKeyEvent); + end; +end; + +procedure TForm1.Panel1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); +var + TempKeyEvent : TCefKeyEvent; +begin + if (Key <> 0) and (chrmosr <> nil) then + begin + TempKeyEvent.kind := KEYEVENT_RAWKEYDOWN; + TempKeyEvent.modifiers := getModifiers(Shift); + TempKeyEvent.windows_key_code := Key; + TempKeyEvent.native_key_code := 0; + TempKeyEvent.is_system_key := ord(False); + TempKeyEvent.character := #0; + TempKeyEvent.unmodified_character := #0; + TempKeyEvent.focus_on_editable_field := ord(False); + + chrmosr.SendKeyEvent(@TempKeyEvent); + end; +end; + +procedure TForm1.Panel1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); +var + TempKeyEvent : TCefKeyEvent; +begin + if (Key <> 0) and (chrmosr <> nil) then + begin + TempKeyEvent.kind := KEYEVENT_KEYUP; + TempKeyEvent.modifiers := getModifiers(Shift); + TempKeyEvent.windows_key_code := Key; + TempKeyEvent.native_key_code := 0; + TempKeyEvent.is_system_key := ord(False); + TempKeyEvent.character := #0; + TempKeyEvent.unmodified_character := #0; + TempKeyEvent.focus_on_editable_field := ord(False); + + chrmosr.SendKeyEvent(@TempKeyEvent); + end; +end; + +procedure TForm1.Panel1MouseWheel(Sender: TObject; Shift: TShiftState; + WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean); +var + TempEvent : TCefMouseEvent; +begin + if (GlobalCEFApp <> nil) and (chrmosr <> nil) then + begin + TempEvent.x := MousePos.x; + TempEvent.y := MousePos.y; + TempEvent.modifiers := getModifiers(Shift); + DeviceToLogical(TempEvent, GlobalCEFApp.DeviceScaleFactor); + chrmosr.SendMouseWheelEvent(@TempEvent, 0, WheelDelta); + end; +end; + +procedure TForm1.SnapshotBtnClick(Sender: TObject); +begin + if SaveDialog1.Execute then Panel1.SaveToFile(SaveDialog1.FileName); +end; + +procedure TForm1.SnapshotBtnEnter(Sender: TObject); +begin + chrmosr.SendFocusEvent(False); +end; + +procedure TForm1.Timer1Timer(Sender: TObject); +begin + Timer1.Enabled := False; + + if chrmosr.CreateBrowser(nil, '') then + chrmosr.InitializeDragAndDrop(Panel1) + else + if not(chrmosr.Initialized) then Timer1.Enabled := True; +end; + +end. diff --git a/demos/TabbedBrowser/TabBrowser.dpr b/demos/TabbedBrowser/TabBrowser.dpr index 38eef958..59596d2e 100644 --- a/demos/TabbedBrowser/TabBrowser.dpr +++ b/demos/TabbedBrowser/TabBrowser.dpr @@ -55,9 +55,9 @@ uses {$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} begin - GlobalCEFApp := TCefApplication.Create; - GlobalCEFApp.FlashEnabled := False; - GlobalCEFApp.OnContextInitialized := GlobalCEFApp_OnContextInitialized; + // GlobalCEFApp creation and initialization moved to a different unit to fix the memory leak described in the bug #89 + // https://github.com/salvadordf/CEF4Delphi/issues/89 + CreateGlobalCEFApp; if GlobalCEFApp.StartMainProcess then begin @@ -69,6 +69,5 @@ begin Application.Run; end; - GlobalCEFApp.Free; - GlobalCEFApp := nil; + DestroyGlobalCEFApp; end. diff --git a/demos/TabbedBrowser/uMainForm.pas b/demos/TabbedBrowser/uMainForm.pas index 8b513b79..dfa3cbf2 100644 --- a/demos/TabbedBrowser/uMainForm.pas +++ b/demos/TabbedBrowser/uMainForm.pas @@ -120,7 +120,7 @@ type var MainForm: TMainForm; -procedure GlobalCEFApp_OnContextInitialized; +procedure CreateGlobalCEFApp; implementation @@ -152,6 +152,12 @@ begin PostMessage(MainForm.Handle, CEFBROWSER_INITIALIZED, 0, 0); end; +procedure CreateGlobalCEFApp; +begin + GlobalCEFApp := TCefApplication.Create; + GlobalCEFApp.OnContextInitialized := GlobalCEFApp_OnContextInitialized; +end; + procedure TMainForm.AddTabBtnClick(Sender: TObject); var TempSheet : TTabSheet; diff --git a/demos/ToolBoxBrowser/ToolBoxBrowser.dpr b/demos/ToolBoxBrowser/ToolBoxBrowser.dpr index c15e6605..c779c605 100644 --- a/demos/ToolBoxBrowser/ToolBoxBrowser.dpr +++ b/demos/ToolBoxBrowser/ToolBoxBrowser.dpr @@ -56,9 +56,9 @@ uses {$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} begin - GlobalCEFApp := TCefApplication.Create; - GlobalCEFApp.FlashEnabled := False; - GlobalCEFApp.OnContextInitialized := GlobalCEFApp_OnContextInitialized; + // GlobalCEFApp creation and initialization moved to a different unit to fix the memory leak described in the bug #89 + // https://github.com/salvadordf/CEF4Delphi/issues/89 + CreateGlobalCEFApp; if GlobalCEFApp.StartMainProcess then begin @@ -67,6 +67,5 @@ begin Application.Run; end; - GlobalCEFApp.Free; - GlobalCEFApp := nil; + DestroyGlobalCEFApp; end. diff --git a/demos/ToolBoxBrowser/uMainForm.pas b/demos/ToolBoxBrowser/uMainForm.pas index 82f0d580..96b2a0d0 100644 --- a/demos/ToolBoxBrowser/uMainForm.pas +++ b/demos/ToolBoxBrowser/uMainForm.pas @@ -88,7 +88,7 @@ type var MainForm: TMainForm; -procedure GlobalCEFApp_OnContextInitialized; +procedure CreateGlobalCEFApp; implementation @@ -108,6 +108,12 @@ begin PostMessage(MainForm.Handle, CEFBROWSER_INITIALIZED, 0, 0); end; +procedure CreateGlobalCEFApp; +begin + GlobalCEFApp := TCefApplication.Create; + GlobalCEFApp.OnContextInitialized := GlobalCEFApp_OnContextInitialized; +end; + procedure TMainForm.CreateToolboxChild(const ChildCaption, URL: string); var TempChild : TChildForm; diff --git a/source/uBufferPanel.pas b/source/uBufferPanel.pas index 1b05a308..861f871f 100644 --- a/source/uBufferPanel.pas +++ b/source/uBufferPanel.pas @@ -48,7 +48,7 @@ interface uses {$IFDEF DELPHI16_UP} {$IFDEF MSWINDOWS}Winapi.Windows, Winapi.Messages, Vcl.ExtCtrls, Vcl.Controls, Vcl.Graphics,{$ENDIF} - System.Classes, System.SyncObjs, System.SysUtils; + System.Classes, System.SyncObjs, System.SysUtils, {$ELSE} {$IFDEF MSWINDOWS}Windows,{$ENDIF} Classes, Forms, Controls, Graphics, {$IFDEF FPC} @@ -56,8 +56,9 @@ uses {$ELSE} Messages, {$ENDIF} - ExtCtrls, SyncObjs, SysUtils; + ExtCtrls, SyncObjs, SysUtils, {$ENDIF} + uCEFConstants; type TBufferPanel = class(TCustomPanel) @@ -158,7 +159,8 @@ type property OnGetSiteInfo; property OnMouseDown; property OnMouseMove; - property OnMouseUp; + property OnMouseUp; + property OnMouseWheel; property OnKeyDown; property OnKeyPress; property OnKeyUp; diff --git a/source/uCEFApplication.pas b/source/uCEFApplication.pas index 2d786aa2..0cc45687 100644 --- a/source/uCEFApplication.pas +++ b/source/uCEFApplication.pas @@ -127,6 +127,7 @@ type FGlobalContextInitialized : boolean; FSitePerProcess : boolean; FDisableWebSecurity : boolean; + FDisablePDFExtension : boolean; FChromeVersionInfo : TFileVersionInfo; {$IFDEF FPC} FLibHandle : TLibHandle; @@ -348,6 +349,7 @@ type property MuteAudio : boolean read FMuteAudio write FMuteAudio; property SitePerProcess : boolean read FSitePerProcess write FSitePerProcess; property DisableWebSecurity : boolean read FDisableWebSecurity write FDisableWebSecurity; + property DisablePDFExtension : boolean read FDisablePDFExtension write FDisablePDFExtension; property ReRaiseExceptions : boolean read FReRaiseExceptions write FReRaiseExceptions; property DeviceScaleFactor : single read FDeviceScaleFactor; property CheckDevToolsResources : boolean read FCheckDevToolsResources write FCheckDevToolsResources; @@ -396,6 +398,8 @@ type var GlobalCEFApp : TCefApplication = nil; +procedure DestroyGlobalCEFApp; + implementation uses @@ -412,6 +416,11 @@ uses uCEFLibFunctions, uCEFMiscFunctions, uCEFCommandLine, uCEFConstants, uCEFSchemeHandlerFactory, uCEFCookieManager, uCEFApp, uCEFRegisterCDMCallback; +procedure DestroyGlobalCEFApp; +begin + if (GlobalCEFApp <> nil) then FreeAndNil(GlobalCEFApp); +end; + constructor TCefApplication.Create; begin inherited Create; @@ -466,6 +475,7 @@ begin FMuteAudio := False; FSitePerProcess := False; FDisableWebSecurity := False; + FDisablePDFExtension := False; FReRaiseExceptions := False; FLibLoaded := False; FShowMessageDlg := True; @@ -1320,6 +1330,9 @@ begin if FDisableWebSecurity then commandLine.AppendSwitch('--disable-web-security'); + if FDisablePDFExtension then + commandLine.AppendSwitch('--disable-pdf-extension'); + if FSitePerProcess then commandLine.AppendSwitch('--site-per-process'); diff --git a/source/uCEFConstants.pas b/source/uCEFConstants.pas index 1494fe93..a11783fd 100644 --- a/source/uCEFConstants.pas +++ b/source/uCEFConstants.pas @@ -1,204 +1,204 @@ -// ************************************************************************ -// ***************************** 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 © 2018 Salvador Diaz Fau. All rights reserved. -// -// ************************************************************************ -// ************ vvvv Original license and comments below vvvv ************* -// ************************************************************************ -(* - * Delphi Chromium Embedded 3 - * - * Usage allowed under the restrictions of the Lesser GNU General Public License - * or alternatively the restrictions of the Mozilla Public License 1.1 - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for - * the specific language governing rights and limitations under the License. - * - * Unit owner : Henri Gourvest <hgourvest@gmail.com> - * Web site : http://www.progdigy.com - * Repository : http://code.google.com/p/delphichromiumembedded/ - * Group : http://groups.google.com/group/delphichromiumembedded - * - * Embarcadero Technologies, Inc is not permitted to use or redistribute - * this source code without explicit permission. - * - *) - -unit uCEFConstants; - -{$IFDEF FPC} +// ************************************************************************ +// ***************************** 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 © 2018 Salvador Diaz Fau. All rights reserved. +// +// ************************************************************************ +// ************ vvvv Original license and comments below vvvv ************* +// ************************************************************************ +(* + * Delphi Chromium Embedded 3 + * + * Usage allowed under the restrictions of the Lesser GNU General Public License + * or alternatively the restrictions of the Mozilla Public License 1.1 + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for + * the specific language governing rights and limitations under the License. + * + * Unit owner : Henri Gourvest <hgourvest@gmail.com> + * Web site : http://www.progdigy.com + * Repository : http://code.google.com/p/delphichromiumembedded/ + * Group : http://groups.google.com/group/delphichromiumembedded + * + * Embarcadero Technologies, Inc is not permitted to use or redistribute + * this source code without explicit permission. + * + *) + +unit uCEFConstants; + +{$IFDEF FPC} {$MODE OBJFPC}{$H+} -{$ENDIF} - -{$IFNDEF CPUX64} - {$ALIGN ON} - {$MINENUMSIZE 4} -{$ENDIF} - -{$I cef.inc} - -interface - -uses - {$IFDEF DELPHI16_UP} - Winapi.Messages; - {$ELSE} - Messages; - {$ENDIF} - -const - // /include/internal/cef_types.h (cef_errorcode_t) - ERR_NONE = 0; - ERR_FAILED = -2; - ERR_ABORTED = -3; - ERR_INVALID_ARGUMENT = -4; - ERR_INVALID_HANDLE = -5; - ERR_FILE_NOT_FOUND = -6; - ERR_TIMED_OUT = -7; - ERR_FILE_TOO_BIG = -8; - ERR_UNEXPECTED = -9; - ERR_ACCESS_DENIED = -10; - ERR_NOT_IMPLEMENTED = -11; - ERR_CONNECTION_CLOSED = -100; - ERR_CONNECTION_RESET = -101; - ERR_CONNECTION_REFUSED = -102; - ERR_CONNECTION_ABORTED = -103; - ERR_CONNECTION_FAILED = -104; - ERR_NAME_NOT_RESOLVED = -105; - ERR_INTERNET_DISCONNECTED = -106; - ERR_SSL_PROTOCOL_ERROR = -107; - ERR_ADDRESS_INVALID = -108; - ERR_ADDRESS_UNREACHABLE = -109; - ERR_SSL_CLIENT_AUTH_CERT_NEEDED = -110; - ERR_TUNNEL_CONNECTION_FAILED = -111; - ERR_NO_SSL_VERSIONS_ENABLED = -112; - ERR_SSL_VERSION_OR_CIPHER_MISMATCH = -113; - ERR_SSL_RENEGOTIATION_REQUESTED = -114; - ERR_CERT_COMMON_NAME_INVALID = -200; - ERR_CERT_BEGIN = ERR_CERT_COMMON_NAME_INVALID; - ERR_CERT_DATE_INVALID = -201; - ERR_CERT_AUTHORITY_INVALID = -202; - ERR_CERT_CONTAINS_ERRORS = -203; - ERR_CERT_NO_REVOCATION_MECHANISM = -204; - ERR_CERT_UNABLE_TO_CHECK_REVOCATION = -205; - ERR_CERT_REVOKED = -206; - ERR_CERT_INVALID = -207; - ERR_CERT_WEAK_SIGNATURE_ALGORITHM = -208; - ERR_CERT_NON_UNIQUE_NAME = -210; - ERR_CERT_WEAK_KEY = -211; - ERR_CERT_NAME_CONSTRAINT_VIOLATION = -212; - ERR_CERT_VALIDITY_TOO_LONG = -213; - ERR_CERT_END = ERR_CERT_VALIDITY_TOO_LONG; - ERR_INVALID_URL = -300; - ERR_DISALLOWED_URL_SCHEME = -301; - ERR_UNKNOWN_URL_SCHEME = -302; - ERR_TOO_MANY_REDIRECTS = -310; - ERR_UNSAFE_REDIRECT = -311; - ERR_UNSAFE_PORT = -312; - ERR_INVALID_RESPONSE = -320; - ERR_INVALID_CHUNKED_ENCODING = -321; - ERR_METHOD_NOT_SUPPORTED = -322; - ERR_UNEXPECTED_PROXY_AUTH = -323; - ERR_EMPTY_RESPONSE = -324; - ERR_RESPONSE_HEADERS_TOO_BIG = -325; - ERR_CACHE_MISS = -400; - ERR_INSECURE_RESPONSE = -501; - - // /include/internal/cef_types.h (cef_cert_status_t) - CERT_STATUS_NONE = 0; - CERT_STATUS_COMMON_NAME_INVALID = 1 shl 0; - CERT_STATUS_DATE_INVALID = 1 shl 1; - CERT_STATUS_AUTHORITY_INVALID = 1 shl 2; - CERT_STATUS_NO_REVOCATION_MECHANISM = 1 shl 4; - CERT_STATUS_UNABLE_TO_CHECK_REVOCATION = 1 shl 5; - CERT_STATUS_REVOKED = 1 shl 6; - CERT_STATUS_INVALID = 1 shl 7; - CERT_STATUS_WEAK_SIGNATURE_ALGORITHM = 1 shl 8; - CERT_STATUS_NON_UNIQUE_NAME = 1 shl 10; - CERT_STATUS_WEAK_KEY = 1 shl 11; - CERT_STATUS_PINNED_KEY_MISSING = 1 shl 13; - CERT_STATUS_NAME_CONSTRAINT_VIOLATION = 1 shl 14; - CERT_STATUS_VALIDITY_TOO_LONG = 1 shl 15; - CERT_STATUS_IS_EV = 1 shl 16; - CERT_STATUS_REV_CHECKING_ENABLED = 1 shl 17; - CERT_STATUS_SHA1_SIGNATURE_PRESENT = 1 shl 19; - CERT_STATUS_CT_COMPLIANCE_FAILED = 1 shl 20; - - CERT_STATUS_FIRST_ERROR = CERT_STATUS_COMMON_NAME_INVALID; - CERT_STATUS_LAST_ERROR = CERT_STATUS_VALIDITY_TOO_LONG; - - // /include/internal/cef_types.h (cef_v8_accesscontrol_t) - V8_ACCESS_CONTROL_DEFAULT = 0; - V8_ACCESS_CONTROL_ALL_CAN_READ = 1 shl 0; +{$ENDIF} + +{$IFNDEF CPUX64} + {$ALIGN ON} + {$MINENUMSIZE 4} +{$ENDIF} + +{$I cef.inc} + +interface + +uses + {$IFDEF DELPHI16_UP} + Winapi.Messages; + {$ELSE} + Messages; + {$ENDIF} + +const + // /include/internal/cef_types.h (cef_errorcode_t) + ERR_NONE = 0; + ERR_FAILED = -2; + ERR_ABORTED = -3; + ERR_INVALID_ARGUMENT = -4; + ERR_INVALID_HANDLE = -5; + ERR_FILE_NOT_FOUND = -6; + ERR_TIMED_OUT = -7; + ERR_FILE_TOO_BIG = -8; + ERR_UNEXPECTED = -9; + ERR_ACCESS_DENIED = -10; + ERR_NOT_IMPLEMENTED = -11; + ERR_CONNECTION_CLOSED = -100; + ERR_CONNECTION_RESET = -101; + ERR_CONNECTION_REFUSED = -102; + ERR_CONNECTION_ABORTED = -103; + ERR_CONNECTION_FAILED = -104; + ERR_NAME_NOT_RESOLVED = -105; + ERR_INTERNET_DISCONNECTED = -106; + ERR_SSL_PROTOCOL_ERROR = -107; + ERR_ADDRESS_INVALID = -108; + ERR_ADDRESS_UNREACHABLE = -109; + ERR_SSL_CLIENT_AUTH_CERT_NEEDED = -110; + ERR_TUNNEL_CONNECTION_FAILED = -111; + ERR_NO_SSL_VERSIONS_ENABLED = -112; + ERR_SSL_VERSION_OR_CIPHER_MISMATCH = -113; + ERR_SSL_RENEGOTIATION_REQUESTED = -114; + ERR_CERT_COMMON_NAME_INVALID = -200; + ERR_CERT_BEGIN = ERR_CERT_COMMON_NAME_INVALID; + ERR_CERT_DATE_INVALID = -201; + ERR_CERT_AUTHORITY_INVALID = -202; + ERR_CERT_CONTAINS_ERRORS = -203; + ERR_CERT_NO_REVOCATION_MECHANISM = -204; + ERR_CERT_UNABLE_TO_CHECK_REVOCATION = -205; + ERR_CERT_REVOKED = -206; + ERR_CERT_INVALID = -207; + ERR_CERT_WEAK_SIGNATURE_ALGORITHM = -208; + ERR_CERT_NON_UNIQUE_NAME = -210; + ERR_CERT_WEAK_KEY = -211; + ERR_CERT_NAME_CONSTRAINT_VIOLATION = -212; + ERR_CERT_VALIDITY_TOO_LONG = -213; + ERR_CERT_END = ERR_CERT_VALIDITY_TOO_LONG; + ERR_INVALID_URL = -300; + ERR_DISALLOWED_URL_SCHEME = -301; + ERR_UNKNOWN_URL_SCHEME = -302; + ERR_TOO_MANY_REDIRECTS = -310; + ERR_UNSAFE_REDIRECT = -311; + ERR_UNSAFE_PORT = -312; + ERR_INVALID_RESPONSE = -320; + ERR_INVALID_CHUNKED_ENCODING = -321; + ERR_METHOD_NOT_SUPPORTED = -322; + ERR_UNEXPECTED_PROXY_AUTH = -323; + ERR_EMPTY_RESPONSE = -324; + ERR_RESPONSE_HEADERS_TOO_BIG = -325; + ERR_CACHE_MISS = -400; + ERR_INSECURE_RESPONSE = -501; + + // /include/internal/cef_types.h (cef_cert_status_t) + CERT_STATUS_NONE = 0; + CERT_STATUS_COMMON_NAME_INVALID = 1 shl 0; + CERT_STATUS_DATE_INVALID = 1 shl 1; + CERT_STATUS_AUTHORITY_INVALID = 1 shl 2; + CERT_STATUS_NO_REVOCATION_MECHANISM = 1 shl 4; + CERT_STATUS_UNABLE_TO_CHECK_REVOCATION = 1 shl 5; + CERT_STATUS_REVOKED = 1 shl 6; + CERT_STATUS_INVALID = 1 shl 7; + CERT_STATUS_WEAK_SIGNATURE_ALGORITHM = 1 shl 8; + CERT_STATUS_NON_UNIQUE_NAME = 1 shl 10; + CERT_STATUS_WEAK_KEY = 1 shl 11; + CERT_STATUS_PINNED_KEY_MISSING = 1 shl 13; + CERT_STATUS_NAME_CONSTRAINT_VIOLATION = 1 shl 14; + CERT_STATUS_VALIDITY_TOO_LONG = 1 shl 15; + CERT_STATUS_IS_EV = 1 shl 16; + CERT_STATUS_REV_CHECKING_ENABLED = 1 shl 17; + CERT_STATUS_SHA1_SIGNATURE_PRESENT = 1 shl 19; + CERT_STATUS_CT_COMPLIANCE_FAILED = 1 shl 20; + + CERT_STATUS_FIRST_ERROR = CERT_STATUS_COMMON_NAME_INVALID; + CERT_STATUS_LAST_ERROR = CERT_STATUS_VALIDITY_TOO_LONG; + + // /include/internal/cef_types.h (cef_v8_accesscontrol_t) + V8_ACCESS_CONTROL_DEFAULT = 0; + V8_ACCESS_CONTROL_ALL_CAN_READ = 1 shl 0; V8_ACCESS_CONTROL_ALL_CAN_WRITE = 1 shl 1; - V8_ACCESS_CONTROL_PROHIBITS_OVERWRITING = 1 shl 2; - - // /include/internal/cef_types.h (cef_v8_propertyattribute_t) - V8_PROPERTY_ATTRIBUTE_NONE = 0; - V8_PROPERTY_ATTRIBUTE_READONLY = 1 shl 0; + V8_ACCESS_CONTROL_PROHIBITS_OVERWRITING = 1 shl 2; + + // /include/internal/cef_types.h (cef_v8_propertyattribute_t) + V8_PROPERTY_ATTRIBUTE_NONE = 0; + V8_PROPERTY_ATTRIBUTE_READONLY = 1 shl 0; V8_PROPERTY_ATTRIBUTE_DONTENUM = 1 shl 1; - V8_PROPERTY_ATTRIBUTE_DONTDELETE = 1 shl 2; - - // /include/internal/cef_types.h (cef_transition_type_t) - TT_LINK = 0; - TT_EXPLICIT = 1; - TT_AUTO_SUBFRAME = 3; - TT_MANUAL_SUBFRAME = 4; - TT_FORM_SUBMIT = 7; - TT_RELOAD = 8; - TT_SOURCE_MASK = $000000FF; - TT_BLOCKED_FLAG = $00800000; - TT_FORWARD_BACK_FLAG = $01000000; - TT_CHAIN_START_FLAG = $10000000; - TT_CHAIN_END_FLAG = $20000000; - TT_CLIENT_REDIRECT_FLAG = $40000000; - TT_SERVER_REDIRECT_FLAG = $80000000; - TT_IS_REDIRECT_MASK = $C0000000; - TT_QUALIFIER_MASK = $FFFFFF00; - - // /include/internal/cef_types.h (cef_urlrequest_flags_t) - UR_FLAG_NONE = 0; - UR_FLAG_SKIP_CACHE = 1 shl 0; - UR_FLAG_ONLY_FROM_CACHE = 1 shl 1; + V8_PROPERTY_ATTRIBUTE_DONTDELETE = 1 shl 2; + + // /include/internal/cef_types.h (cef_transition_type_t) + TT_LINK = 0; + TT_EXPLICIT = 1; + TT_AUTO_SUBFRAME = 3; + TT_MANUAL_SUBFRAME = 4; + TT_FORM_SUBMIT = 7; + TT_RELOAD = 8; + TT_SOURCE_MASK = $000000FF; + TT_BLOCKED_FLAG = $00800000; + TT_FORWARD_BACK_FLAG = $01000000; + TT_CHAIN_START_FLAG = $10000000; + TT_CHAIN_END_FLAG = $20000000; + TT_CLIENT_REDIRECT_FLAG = $40000000; + TT_SERVER_REDIRECT_FLAG = $80000000; + TT_IS_REDIRECT_MASK = $C0000000; + TT_QUALIFIER_MASK = $FFFFFF00; + + // /include/internal/cef_types.h (cef_urlrequest_flags_t) + UR_FLAG_NONE = 0; + UR_FLAG_SKIP_CACHE = 1 shl 0; + UR_FLAG_ONLY_FROM_CACHE = 1 shl 1; UR_FLAG_ALLOW_STORED_CREDENTIALS = 1 shl 2; UR_FLAG_REPORT_UPLOAD_PROGRESS = 1 shl 3; UR_FLAG_NO_DOWNLOAD_DATA = 1 shl 4; - UR_FLAG_NO_RETRY_ON_5XX = 1 shl 5; - UR_FLAG_STOP_ON_REDIRECT = 1 shl 6; - - // /include/internal/cef_types.h (cef_dom_event_category_t) - DOM_EVENT_CATEGORY_UNKNOWN = 0; - DOM_EVENT_CATEGORY_UI = 1 shl 0; - DOM_EVENT_CATEGORY_MOUSE = 1 shl 1; - DOM_EVENT_CATEGORY_MUTATION = 1 shl 2; - DOM_EVENT_CATEGORY_KEYBOARD = 1 shl 3; - DOM_EVENT_CATEGORY_TEXT = 1 shl 4; - DOM_EVENT_CATEGORY_COMPOSITION = 1 shl 5; - DOM_EVENT_CATEGORY_DRAG = 1 shl 6; - DOM_EVENT_CATEGORY_CLIPBOARD = 1 shl 7; - DOM_EVENT_CATEGORY_MESSAGE = 1 shl 8; - DOM_EVENT_CATEGORY_WHEEL = 1 shl 9; - DOM_EVENT_CATEGORY_BEFORE_TEXT_INSERTED = 1 shl 10; - DOM_EVENT_CATEGORY_OVERFLOW = 1 shl 11; - DOM_EVENT_CATEGORY_PAGE_TRANSITION = 1 shl 12; - DOM_EVENT_CATEGORY_POPSTATE = 1 shl 13; - DOM_EVENT_CATEGORY_PROGRESS = 1 shl 14; - DOM_EVENT_CATEGORY_XMLHTTPREQUEST_PROGRESS = 1 shl 15; - - // /include/internal/cef_types.h (cef_event_flags_t) - EVENTFLAG_NONE = 0; - EVENTFLAG_CAPS_LOCK_ON = 1 shl 0; + UR_FLAG_NO_RETRY_ON_5XX = 1 shl 5; + UR_FLAG_STOP_ON_REDIRECT = 1 shl 6; + + // /include/internal/cef_types.h (cef_dom_event_category_t) + DOM_EVENT_CATEGORY_UNKNOWN = 0; + DOM_EVENT_CATEGORY_UI = 1 shl 0; + DOM_EVENT_CATEGORY_MOUSE = 1 shl 1; + DOM_EVENT_CATEGORY_MUTATION = 1 shl 2; + DOM_EVENT_CATEGORY_KEYBOARD = 1 shl 3; + DOM_EVENT_CATEGORY_TEXT = 1 shl 4; + DOM_EVENT_CATEGORY_COMPOSITION = 1 shl 5; + DOM_EVENT_CATEGORY_DRAG = 1 shl 6; + DOM_EVENT_CATEGORY_CLIPBOARD = 1 shl 7; + DOM_EVENT_CATEGORY_MESSAGE = 1 shl 8; + DOM_EVENT_CATEGORY_WHEEL = 1 shl 9; + DOM_EVENT_CATEGORY_BEFORE_TEXT_INSERTED = 1 shl 10; + DOM_EVENT_CATEGORY_OVERFLOW = 1 shl 11; + DOM_EVENT_CATEGORY_PAGE_TRANSITION = 1 shl 12; + DOM_EVENT_CATEGORY_POPSTATE = 1 shl 13; + DOM_EVENT_CATEGORY_PROGRESS = 1 shl 14; + DOM_EVENT_CATEGORY_XMLHTTPREQUEST_PROGRESS = 1 shl 15; + + // /include/internal/cef_types.h (cef_event_flags_t) + EVENTFLAG_NONE = 0; + EVENTFLAG_CAPS_LOCK_ON = 1 shl 0; EVENTFLAG_SHIFT_DOWN = 1 shl 1; EVENTFLAG_CONTROL_DOWN = 1 shl 2; EVENTFLAG_ALT_DOWN = 1 shl 3; @@ -209,8 +209,8 @@ const EVENTFLAG_NUM_LOCK_ON = 1 shl 8; EVENTFLAG_IS_KEY_PAD = 1 shl 9; EVENTFLAG_IS_LEFT = 1 shl 10; - EVENTFLAG_IS_RIGHT = 1 shl 11; - + EVENTFLAG_IS_RIGHT = 1 shl 11; + // /include/internal/cef_types.h (cef_drag_operations_mask_t) DRAG_OPERATION_NONE = 0; DRAG_OPERATION_COPY = 1 shl 0; @@ -218,63 +218,63 @@ const DRAG_OPERATION_GENERIC = 1 shl 2; DRAG_OPERATION_PRIVATE = 1 shl 3; DRAG_OPERATION_MOVE = 1 shl 4; - DRAG_OPERATION_DELETE = 1 shl 5; - DRAG_OPERATION_EVERY = $FFFFFFFF; - - // /include/internal/cef_types.h (cef_file_dialog_mode_t) - FILE_DIALOG_TYPE_MASK = $000000FF; - FILE_DIALOG_OVERWRITEPROMPT_FLAG = $01000000; - FILE_DIALOG_HIDEREADONLY_FLAG = $02000000; - - // /include/internal/cef_types.h (cef_uri_unescape_rule_t) - UU_NONE = 0; - UU_NORMAL = 1 shl 0; - UU_SPACES = 1 shl 1; - UU_PATH_SEPARATORS = 1 shl 2; - UU_URL_SPECIAL_CHARS_EXCEPT_PATH_SEPARATORS = 1 shl 3; - UU_SPOOFING_AND_CONTROL_CHARS = 1 shl 4; - UU_REPLACE_PLUS_WITH_SPACE = 1 shl 5; - - // /include/internal/cef_types.h (cef_menu_id_t) - MENU_ID_BACK = 100; + DRAG_OPERATION_DELETE = 1 shl 5; + DRAG_OPERATION_EVERY = $FFFFFFFF; + + // /include/internal/cef_types.h (cef_file_dialog_mode_t) + FILE_DIALOG_TYPE_MASK = $000000FF; + FILE_DIALOG_OVERWRITEPROMPT_FLAG = $01000000; + FILE_DIALOG_HIDEREADONLY_FLAG = $02000000; + + // /include/internal/cef_types.h (cef_uri_unescape_rule_t) + UU_NONE = 0; + UU_NORMAL = 1 shl 0; + UU_SPACES = 1 shl 1; + UU_PATH_SEPARATORS = 1 shl 2; + UU_URL_SPECIAL_CHARS_EXCEPT_PATH_SEPARATORS = 1 shl 3; + UU_SPOOFING_AND_CONTROL_CHARS = 1 shl 4; + UU_REPLACE_PLUS_WITH_SPACE = 1 shl 5; + + // /include/internal/cef_types.h (cef_menu_id_t) + MENU_ID_BACK = 100; MENU_ID_FORWARD = 101; - MENU_ID_RELOAD = 102; - MENU_ID_RELOAD_NOCACHE = 103; - MENU_ID_STOPLOAD = 104; - MENU_ID_UNDO = 110; - MENU_ID_REDO = 111; - MENU_ID_CUT = 112; - MENU_ID_COPY = 113; - MENU_ID_PASTE = 114; - MENU_ID_DELETE = 115; - MENU_ID_SELECT_ALL = 116; - MENU_ID_FIND = 130; - MENU_ID_PRINT = 131; - MENU_ID_VIEW_SOURCE = 132; - MENU_ID_SPELLCHECK_SUGGESTION_0 = 200; - MENU_ID_SPELLCHECK_SUGGESTION_1 = 201; - MENU_ID_SPELLCHECK_SUGGESTION_2 = 202; - MENU_ID_SPELLCHECK_SUGGESTION_3 = 203; - MENU_ID_SPELLCHECK_SUGGESTION_4 = 204; - MENU_ID_SPELLCHECK_SUGGESTION_LAST = 204; - MENU_ID_NO_SPELLING_SUGGESTIONS = 205; - MENU_ID_ADD_TO_DICTIONARY = 206; - MENU_ID_CUSTOM_FIRST = 220; - MENU_ID_CUSTOM_LAST = 250; - MENU_ID_USER_FIRST = 26500; - MENU_ID_USER_LAST = 28500; - - // /include/internal/cef_types.h (cef_context_menu_type_flags_t) - CM_TYPEFLAG_NONE = 0; - CM_TYPEFLAG_PAGE = 1 shl 0; + MENU_ID_RELOAD = 102; + MENU_ID_RELOAD_NOCACHE = 103; + MENU_ID_STOPLOAD = 104; + MENU_ID_UNDO = 110; + MENU_ID_REDO = 111; + MENU_ID_CUT = 112; + MENU_ID_COPY = 113; + MENU_ID_PASTE = 114; + MENU_ID_DELETE = 115; + MENU_ID_SELECT_ALL = 116; + MENU_ID_FIND = 130; + MENU_ID_PRINT = 131; + MENU_ID_VIEW_SOURCE = 132; + MENU_ID_SPELLCHECK_SUGGESTION_0 = 200; + MENU_ID_SPELLCHECK_SUGGESTION_1 = 201; + MENU_ID_SPELLCHECK_SUGGESTION_2 = 202; + MENU_ID_SPELLCHECK_SUGGESTION_3 = 203; + MENU_ID_SPELLCHECK_SUGGESTION_4 = 204; + MENU_ID_SPELLCHECK_SUGGESTION_LAST = 204; + MENU_ID_NO_SPELLING_SUGGESTIONS = 205; + MENU_ID_ADD_TO_DICTIONARY = 206; + MENU_ID_CUSTOM_FIRST = 220; + MENU_ID_CUSTOM_LAST = 250; + MENU_ID_USER_FIRST = 26500; + MENU_ID_USER_LAST = 28500; + + // /include/internal/cef_types.h (cef_context_menu_type_flags_t) + CM_TYPEFLAG_NONE = 0; + CM_TYPEFLAG_PAGE = 1 shl 0; CM_TYPEFLAG_FRAME = 1 shl 1; CM_TYPEFLAG_LINK = 1 shl 2; CM_TYPEFLAG_MEDIA = 1 shl 3; CM_TYPEFLAG_SELECTION = 1 shl 4; - CM_TYPEFLAG_EDITABLE = 1 shl 5; - - // /include/internal/cef_types.h (cef_context_menu_media_state_flags_t) - CM_MEDIAFLAG_NONE = 0; + CM_TYPEFLAG_EDITABLE = 1 shl 5; + + // /include/internal/cef_types.h (cef_context_menu_media_state_flags_t) + CM_MEDIAFLAG_NONE = 0; CM_MEDIAFLAG_ERROR = 1 shl 0; CM_MEDIAFLAG_PAUSED = 1 shl 1; CM_MEDIAFLAG_MUTED = 1 shl 2; @@ -284,10 +284,10 @@ const CM_MEDIAFLAG_HAS_VIDEO = 1 shl 6; CM_MEDIAFLAG_CONTROL_ROOT_ELEMENT = 1 shl 7; CM_MEDIAFLAG_CAN_PRINT = 1 shl 8; - CM_MEDIAFLAG_CAN_ROTATE = 1 shl 9; - - // /include/internal/cef_types.h (cef_context_menu_edit_state_flags_t) - CM_EDITFLAG_NONE = 0; + CM_MEDIAFLAG_CAN_ROTATE = 1 shl 9; + + // /include/internal/cef_types.h (cef_context_menu_edit_state_flags_t) + CM_EDITFLAG_NONE = 0; CM_EDITFLAG_CAN_UNDO = 1 shl 0; CM_EDITFLAG_CAN_REDO = 1 shl 1; CM_EDITFLAG_CAN_CUT = 1 shl 2; @@ -295,20 +295,20 @@ const CM_EDITFLAG_CAN_PASTE = 1 shl 4; CM_EDITFLAG_CAN_DELETE = 1 shl 5; CM_EDITFLAG_CAN_SELECT_ALL = 1 shl 6; - CM_EDITFLAG_CAN_TRANSLATE = 1 shl 7; - - // /include/internal/cef_types.h (cef_ssl_version_t) - SSL_CONNECTION_VERSION_UNKNOWN = 0; + CM_EDITFLAG_CAN_TRANSLATE = 1 shl 7; + + // /include/internal/cef_types.h (cef_ssl_version_t) + SSL_CONNECTION_VERSION_UNKNOWN = 0; SSL_CONNECTION_VERSION_SSL2 = 1; SSL_CONNECTION_VERSION_SSL3 = 2; SSL_CONNECTION_VERSION_TLS1 = 3; SSL_CONNECTION_VERSION_TLS1_1 = 4; SSL_CONNECTION_VERSION_TLS1_2 = 5; SSL_CONNECTION_VERSION_QUIC = 7; - + // /include/internal/cef_types.h (cef_ssl_content_status_t) SSL_CONTENT_NORMAL_CONTENT = 0; - SSL_CONTENT_DISPLAYED_INSECURE_CONTENT = 1 shl 0; + SSL_CONTENT_DISPLAYED_INSECURE_CONTENT = 1 shl 0; SSL_CONTENT_RAN_INSECURE_CONTENT = 1 shl 1; // /include/internal/cef_types.h (cef_json_writer_options_t) @@ -327,72 +327,73 @@ const LOGSEVERITY_DISABLE = 99; -//****************************************************** -//****************** OTHER CONSTANTS ******************* -//****************************************************** - - DEVTOOLS_WINDOWNAME = 'DevTools'; - - CEF_PROXYTYPE_DIRECT = 0; +//****************************************************** +//****************** OTHER CONSTANTS ******************* +//****************************************************** + + DEVTOOLS_WINDOWNAME = 'DevTools'; + + CEF_PROXYTYPE_DIRECT = 0; CEF_PROXYTYPE_AUTODETECT = 1; - CEF_PROXYTYPE_SYSTEM = 2; - CEF_PROXYTYPE_FIXED_SERVERS = 3; - CEF_PROXYTYPE_PAC_SCRIPT = 4; - - CEF_CONTENT_SETTING_DEFAULT = 0; - CEF_CONTENT_SETTING_ALLOW = 1; - CEF_CONTENT_SETTING_BLOCK = 2; - CEF_CONTENT_SETTING_ASK = 3; - CEF_CONTENT_SETTING_SESSION_ONLY = 4; - CEF_CONTENT_SETTING_NUM_SETTINGS = 5; - - // Used in the severity parameter in the 'cef_log' function, also known as 'CefLog' in CEF4Delphi. - CEF_LOG_SEVERITY_INFO = 0; - CEF_LOG_SEVERITY_WARNING = 1; - CEF_LOG_SEVERITY_ERROR = 2; - - ZOOM_STEP_25 = 0; - ZOOM_STEP_33 = 1; - ZOOM_STEP_50 = 2; - ZOOM_STEP_67 = 3; - ZOOM_STEP_75 = 4; - ZOOM_STEP_90 = 5; - ZOOM_STEP_100 = 6; - ZOOM_STEP_110 = 7; - ZOOM_STEP_125 = 8; - ZOOM_STEP_150 = 9; - ZOOM_STEP_175 = 10; - ZOOM_STEP_200 = 11; - ZOOM_STEP_250 = 12; - ZOOM_STEP_300 = 13; - ZOOM_STEP_400 = 14; - ZOOM_STEP_500 = 15; - ZOOM_STEP_MIN = ZOOM_STEP_25; - ZOOM_STEP_MAX = ZOOM_STEP_500; - ZOOM_STEP_DEF = ZOOM_STEP_100; - - {$IFDEF MSWINDOWS} - CEF_PREFERENCES_SAVED = WM_APP + $A00; - CEF_DOONCLOSE = WM_APP + $A01; - CEF_STARTDRAGGING = WM_APP + $A02; - CEF_AFTERCREATED = WM_APP + $A03; - CEF_PENDINGRESIZE = WM_APP + $A04; - CEF_PUMPHAVEWORK = WM_APP + $A05; - CEF_DESTROY = WM_APP + $A06; - CEF_DOONBEFORECLOSE = WM_APP + $A07; - {$ENDIF} - - CEF_TIMER_MINIMUM = $0000000A; - CEF_TIMER_MAXIMUM = $7FFFFFFF; - CEF_TIMER_MAXDELAY = 1000 div 30; // 30fps - CEF_TIMER_DEPLETEWORK_CYCLES = 10; - CEF_TIMER_DEPLETEWORK_DELAY = 50; - - CEF4DELPHI_URL = 'https://github.com/salvadordf/CEF4Delphi'; - CRLF = #13 + #10; - -implementation - -end. - - + CEF_PROXYTYPE_SYSTEM = 2; + CEF_PROXYTYPE_FIXED_SERVERS = 3; + CEF_PROXYTYPE_PAC_SCRIPT = 4; + + CEF_CONTENT_SETTING_DEFAULT = 0; + CEF_CONTENT_SETTING_ALLOW = 1; + CEF_CONTENT_SETTING_BLOCK = 2; + CEF_CONTENT_SETTING_ASK = 3; + CEF_CONTENT_SETTING_SESSION_ONLY = 4; + CEF_CONTENT_SETTING_NUM_SETTINGS = 5; + + // Used in the severity parameter in the 'cef_log' function, also known as 'CefLog' in CEF4Delphi. + CEF_LOG_SEVERITY_INFO = 0; + CEF_LOG_SEVERITY_WARNING = 1; + CEF_LOG_SEVERITY_ERROR = 2; + + ZOOM_STEP_25 = 0; + ZOOM_STEP_33 = 1; + ZOOM_STEP_50 = 2; + ZOOM_STEP_67 = 3; + ZOOM_STEP_75 = 4; + ZOOM_STEP_90 = 5; + ZOOM_STEP_100 = 6; + ZOOM_STEP_110 = 7; + ZOOM_STEP_125 = 8; + ZOOM_STEP_150 = 9; + ZOOM_STEP_175 = 10; + ZOOM_STEP_200 = 11; + ZOOM_STEP_250 = 12; + ZOOM_STEP_300 = 13; + ZOOM_STEP_400 = 14; + ZOOM_STEP_500 = 15; + ZOOM_STEP_MIN = ZOOM_STEP_25; + ZOOM_STEP_MAX = ZOOM_STEP_500; + ZOOM_STEP_DEF = ZOOM_STEP_100; + + {$IFDEF MSWINDOWS} + CEF_PREFERENCES_SAVED = WM_APP + $A00; + CEF_DOONCLOSE = WM_APP + $A01; + CEF_STARTDRAGGING = WM_APP + $A02; + CEF_AFTERCREATED = WM_APP + $A03; + CEF_PENDINGRESIZE = WM_APP + $A04; + CEF_PUMPHAVEWORK = WM_APP + $A05; + CEF_DESTROY = WM_APP + $A06; + CEF_DOONBEFORECLOSE = WM_APP + $A07; + CEF_PENDINGINVALIDATE = WM_APP + $A08; + {$ENDIF} + + CEF_TIMER_MINIMUM = $0000000A; + CEF_TIMER_MAXIMUM = $7FFFFFFF; + CEF_TIMER_MAXDELAY = 1000 div 30; // 30fps + CEF_TIMER_DEPLETEWORK_CYCLES = 10; + CEF_TIMER_DEPLETEWORK_DELAY = 50; + + CEF4DELPHI_URL = 'https://github.com/salvadordf/CEF4Delphi'; + CRLF = #13 + #10; + +implementation + +end. + + diff --git a/source/uCEFWorkScheduler.pas b/source/uCEFWorkScheduler.pas index ec00e047..d145da90 100644 --- a/source/uCEFWorkScheduler.pas +++ b/source/uCEFWorkScheduler.pas @@ -122,6 +122,8 @@ var procedure Register; {$ENDIF} +procedure DestroyGlobalCEFWorkScheduler; + implementation uses @@ -132,6 +134,10 @@ uses {$ENDIF} uCEFMiscFunctions, uCEFApplication; +procedure DestroyGlobalCEFWorkScheduler; +begin + if (GlobalCEFWorkScheduler <> nil) then FreeAndNil(GlobalCEFWorkScheduler); +end; constructor TCEFWorkScheduler.Create(AOwner: TComponent); begin diff --git a/source/uFMXWorkScheduler.pas b/source/uFMXWorkScheduler.pas index 99d5b80d..5acc32e8 100644 --- a/source/uFMXWorkScheduler.pas +++ b/source/uFMXWorkScheduler.pas @@ -104,6 +104,8 @@ type var GlobalFMXWorkScheduler : TFMXWorkScheduler = nil; +procedure DestroyGlobalFMXWorkScheduler; + implementation uses @@ -111,6 +113,11 @@ uses FMX.Platform, FMX.Platform.Win, FMX.Forms, uCEFMiscFunctions, uCEFApplication; +procedure DestroyGlobalFMXWorkScheduler; +begin + if (GlobalFMXWorkScheduler <> nil) then FreeAndNil(GlobalFMXWorkScheduler); +end; + constructor TFMXWorkScheduler.Create(AOwner: TComponent); begin inherited Create(AOwner);