From 1484fdca25d6a371f0ceabf06c79d9376194a272 Mon Sep 17 00:00:00 2001 From: Salvador Diaz Fau Date: Sun, 6 Dec 2020 12:28:13 +0100 Subject: [PATCH] Added TinyBrowser2 demo - Added an overloaded version of TChromiumCore.CreateBrowser to create popup browser windows in the TinyBrowser2 demo. - Added more comments in the DOMVisitor demo describing alternative ways to send information between processes. --- .../FMXTabbedOSRBrowser.dpr | 4 +- demos/Delphi_VCL/DOMVisitor/uDOMVisitor.pas | 9 + demos/Delphi_VCL/MiniBrowser/uMiniBrowser.pas | 4 + .../Delphi_VCL/TinyBrowser2/00-DeleteDCUs.bat | 18 + .../Delphi_VCL/TinyBrowser2/TinyBrowser2.dpr | 61 ++ .../TinyBrowser2/TinyBrowser2.dproj | 913 ++++++++++++++++++ .../Delphi_VCL/TinyBrowser2/uTinyBrowser2.pas | 173 ++++ source/uCEFChromiumCore.pas | 29 + source/uCEFFMXChromium.pas | 9 +- update_CEF4Delphi.json | 2 +- 10 files changed, 1219 insertions(+), 3 deletions(-) create mode 100644 demos/Delphi_VCL/TinyBrowser2/00-DeleteDCUs.bat create mode 100644 demos/Delphi_VCL/TinyBrowser2/TinyBrowser2.dpr create mode 100644 demos/Delphi_VCL/TinyBrowser2/TinyBrowser2.dproj create mode 100644 demos/Delphi_VCL/TinyBrowser2/uTinyBrowser2.pas diff --git a/demos/Delphi_FMX/FMXTabbedOSRBrowser/FMXTabbedOSRBrowser.dpr b/demos/Delphi_FMX/FMXTabbedOSRBrowser/FMXTabbedOSRBrowser.dpr index 082f7f0c..1627699c 100644 --- a/demos/Delphi_FMX/FMXTabbedOSRBrowser/FMXTabbedOSRBrowser.dpr +++ b/demos/Delphi_FMX/FMXTabbedOSRBrowser/FMXTabbedOSRBrowser.dpr @@ -50,9 +50,11 @@ uses {$R *.res} {$IFDEF MSWINDOWS} -// CEF3 needs to set the LARGEADDRESSAWARE flag which allows 32-bit processes to use up to 3GB of RAM. +{$IFDEF WIN32} +// CEF3 needs to set the LARGEADDRESSAWARE ($20) flag which allows 32-bit processes to use up to 3GB of RAM. {$SetPEFlags $20} {$ENDIF} +{$ENDIF} begin // GlobalCEFApp creation and initialization moved to a different unit to fix the memory leak described in the bug #89 diff --git a/demos/Delphi_VCL/DOMVisitor/uDOMVisitor.pas b/demos/Delphi_VCL/DOMVisitor/uDOMVisitor.pas index 18c3fe11..c880be10 100644 --- a/demos/Delphi_VCL/DOMVisitor/uDOMVisitor.pas +++ b/demos/Delphi_VCL/DOMVisitor/uDOMVisitor.pas @@ -213,6 +213,15 @@ uses // TChromium.OnConsoleMessage event and we identify the right message thanks to // the preamble in the message. +// Other alternative ways to send information between processes : +// 1. Use the JavaScript functions "alert" or "prompt" : They're also limited to +// 10000 characters in the text message but "prompt" doesn't have limits for the +// value (defaultPromptText). https://www.briskbard.com/forum/viewtopic.php?t=1251#p5324 +// 2. Use websockets or any other custom IPC message. +// 3. Use a common database protected by a named mutex. A proces would only have to +// send commands to the other process when the information is ready to be read +// in the database. + // This demo also uses DevTool methods to change the "value" attribute of an // INPUT HTML element. Each method is called using the // TChromium.ExecuteDevToolsMethod function and the results are received in the diff --git a/demos/Delphi_VCL/MiniBrowser/uMiniBrowser.pas b/demos/Delphi_VCL/MiniBrowser/uMiniBrowser.pas index ea6177e1..bd2ee04f 100644 --- a/demos/Delphi_VCL/MiniBrowser/uMiniBrowser.pas +++ b/demos/Delphi_VCL/MiniBrowser/uMiniBrowser.pas @@ -283,6 +283,10 @@ begin GlobalCEFApp.LogSeverity := LOGSEVERITY_INFO; GlobalCEFApp.cache := 'cache'; GlobalCEFApp.EnablePrintPreview := True; + + // This is a workaround for the CEF4Delphi issue #324 : + // https://github.com/salvadordf/CEF4Delphi/issues/324 + GlobalCEFApp.DisableFeatures := 'WinUseBrowserSpellChecker'; end; procedure TMiniBrowserFrm.BackBtnClick(Sender: TObject); diff --git a/demos/Delphi_VCL/TinyBrowser2/00-DeleteDCUs.bat b/demos/Delphi_VCL/TinyBrowser2/00-DeleteDCUs.bat new file mode 100644 index 00000000..a9a84095 --- /dev/null +++ b/demos/Delphi_VCL/TinyBrowser2/00-DeleteDCUs.bat @@ -0,0 +1,18 @@ +del /s /q *.dcu +del /s /q *.exe +del /s /q *.res +del /s /q *.rsm +del /s /q *.log +del /s /q *.dsk +del /s /q *.identcache +del /s /q *.stat +del /s /q *.local +del /s /q *.~* +rmdir Win32\Debug +rmdir Win32\Release +rmdir Win32 +rmdir Win64\Debug +rmdir Win64\Release +rmdir Win64 +rmdir __history +rmdir __recovery diff --git a/demos/Delphi_VCL/TinyBrowser2/TinyBrowser2.dpr b/demos/Delphi_VCL/TinyBrowser2/TinyBrowser2.dpr new file mode 100644 index 00000000..9a6dcfaf --- /dev/null +++ b/demos/Delphi_VCL/TinyBrowser2/TinyBrowser2.dpr @@ -0,0 +1,61 @@ +// ************************************************************************ +// ***************************** 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 + * 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 TinyBrowser2; + +uses + uCEFApplication, + uTinyBrowser2 in 'uTinyBrowser2.pas'; + +{$R *.res} + +{$IFDEF WIN32} + // CEF needs to set the LARGEADDRESSAWARE ($20) flag which allows 32-bit processes to use up to 3GB of RAM. + {$SetPEFlags $20} +{$ENDIF} + +begin + CreateGlobalCEFApp; + + if GlobalCEFApp.StartMainProcess then + begin + GlobalCEFApp.RunMessageLoop; + DestroyTinyBrowser; + end; + + DestroyGlobalCEFApp; +end. diff --git a/demos/Delphi_VCL/TinyBrowser2/TinyBrowser2.dproj b/demos/Delphi_VCL/TinyBrowser2/TinyBrowser2.dproj new file mode 100644 index 00000000..82e82972 --- /dev/null +++ b/demos/Delphi_VCL/TinyBrowser2/TinyBrowser2.dproj @@ -0,0 +1,913 @@ + + + {517C64DC-EC82-4877-A799-FFD153AF96A2} + 19.1 + VCL + TinyBrowser2.dpr + True + Debug + Win32 + 3 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + .\$(Platform)\$(Config) + ..\..\..\bin + false + false + false + false + false + System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) + $(BDS)\bin\delphi_PROJECTICON.ico + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + TinyBrowser2 + 3082 + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + + + DBXSqliteDriver;RESTComponents;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;svnui;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;VisualStyles_runtime;vcltouch;vcldb;bindcompfmx;svn;DBXOracleDriver;inetdb;fmx;FireDACIBDriver;fmxdae;vcledge;FireDACDBXDriver;dbexpress;vclx;dsnap;emsclient;DataSnapCommon;FireDACCommon;IndySystem260;RESTBackendComponents;DataSnapConnectors;VCLRESTComponents;soapserver;vclie;CEF4Delphi_FMX;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;IndyProtocols260;bindcompdbx;vcl;DBXSybaseASEDriver;IndyCore260;FireDACDb2Driver;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;Componentes_UI;FireDAC;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;SVGPackage;soaprtl;DbxCommonDriver;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;bindcomp;appanalytics;DBXInformixDriver;bindcompvcl;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;inetdbxpress;FireDACMongoDBDriver;fmxase;$(DCC_UsePackage) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + $(BDS)\bin\default_app.manifest + + + DBXSqliteDriver;RESTComponents;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;VisualStyles_runtime;vcltouch;vcldb;bindcompfmx;DBXOracleDriver;inetdb;fmx;FireDACIBDriver;fmxdae;vcledge;FireDACDBXDriver;dbexpress;vclx;dsnap;emsclient;DataSnapCommon;FireDACCommon;IndySystem260;RESTBackendComponents;DataSnapConnectors;VCLRESTComponents;soapserver;vclie;CEF4Delphi_FMX;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;IndyProtocols260;bindcompdbx;vcl;DBXSybaseASEDriver;IndyCore260;FireDACDb2Driver;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;Componentes_UI;FireDAC;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;SVGPackage;soaprtl;DbxCommonDriver;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;bindcomp;appanalytics;DBXInformixDriver;bindcompvcl;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;inetdbxpress;FireDACMongoDBDriver;fmxase;$(DCC_UsePackage) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + 1033 + + + DEBUG;$(DCC_Define) + true + false + true + true + true + + + false + true + PerMonitorV2 + true + 1033 + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + true + PerMonitorV2 + + + + MainSource + + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + + + + Delphi.Personality.12 + Application + + + + TinyBrowser2.dpr + + + IP Abstraction Indy Implementation Design Time + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + + + + TinyBrowser2.exe + true + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + classes + 1 + + + classes + 1 + + + + + res\xml + 1 + + + res\xml + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\armeabi + 1 + + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\mips + 1 + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-v21 + 1 + + + res\values-v21 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-small + 1 + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + Contents\MacOS + 1 + .framework + + + Contents\MacOS + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + 0 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen + 64 + + + ..\$(PROJECTNAME).launchscreen + 64 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + + + Contents + 1 + + + Contents + 1 + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + Contents\MacOS + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + + + + + + + + + + + True + True + + + 12 + + + + + diff --git a/demos/Delphi_VCL/TinyBrowser2/uTinyBrowser2.pas b/demos/Delphi_VCL/TinyBrowser2/uTinyBrowser2.pas new file mode 100644 index 00000000..420cbadc --- /dev/null +++ b/demos/Delphi_VCL/TinyBrowser2/uTinyBrowser2.pas @@ -0,0 +1,173 @@ +// ************************************************************************ +// ***************************** 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 + * 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 uTinyBrowser2; + +interface + +uses + uCEFInterfaces, uCEFTypes, uCEFChromiumCore; + +type + TTinyBrowser2 = class + private + FChromium : TChromiumCore; + + procedure Chromium_OnClose(Sender: TObject; const browser: ICefBrowser; var aAction : TCefCloseBrowserAction); + procedure Chromium_OnBeforeClose(Sender: TObject; const browser: ICefBrowser); + procedure Chromium_OnBeforePopup(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const targetUrl, targetFrameName: ustring; targetDisposition: TCefWindowOpenDisposition; userGesture: Boolean; const popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo; var client: ICefClient; var settings: TCefBrowserSettings; var extra_info: ICefDictionaryValue; var noJavascriptAccess: Boolean; var Result: Boolean); + procedure Chromium_OnOpenUrlFromTab(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const targetUrl: ustring; targetDisposition: TCefWindowOpenDisposition; userGesture: Boolean; out Result: Boolean); + + public + constructor Create; + destructor Destroy; override; + procedure AfterConstruction; override; + end; + +procedure CreateGlobalCEFApp; +procedure DestroyTinyBrowser; + +implementation + +// This demo is similar to the cefsimple demo in the official CEF project. + +// It doesn't use VCL or FMX to create forms from Delphi code. +// It just uses CEF to create a browser window as if it was a popup browser window. + +// This browser doesn't use multiple threads to handle the browser and it doesn't use an external message pump. +// For this reason we have to call GlobalCEFApp.RunMessageLoop to let CEF handle the message loop and +// GlobalCEFApp.QuitMessageLoop when the browser has been destroyed. + +// The destruction steps are much simpler for that reason. +// In this demo it's only necessary to implement the TChromium.OnClose and TChromium.OnBeforeClose events. +// The TChromium.OnClose event only sets aAction to cbaClose to continue closing the browser. +// The TChromium.OnBeforeClose event calls GlobalCEFApp.QuitMessageLoop because the browser has been destroyed +// and it's necessary to close the message loop. + +uses + uCEFApplication; + +var + TinyBrowser : TTinyBrowser2 = nil; + +procedure GlobalCEFApp_OnContextInitialized; +begin + TinyBrowser := TTinyBrowser2.Create; +end; + +procedure CreateGlobalCEFApp; +begin + GlobalCEFApp := TCefApplication.Create; + GlobalCEFApp.MultiThreadedMessageLoop := False; + GlobalCEFApp.ExternalMessagePump := False; + GlobalCEFApp.OnContextInitialized := GlobalCEFApp_OnContextInitialized; + + // This is a workaround for the CEF4Delphi issue #324 : + // https://github.com/salvadordf/CEF4Delphi/issues/324 + GlobalCEFApp.DisableFeatures := 'WinUseBrowserSpellChecker'; +end; + +procedure DestroyTinyBrowser; +begin + if (TinyBrowser <> nil) then + begin + TinyBrowser.Free; + TinyBrowser := nil; + end; +end; + +constructor TTinyBrowser2.Create; +begin + inherited Create; + + FChromium := nil; +end; + +destructor TTinyBrowser2.Destroy; +begin + if (FChromium <> nil) then + begin + FChromium.Free; + FChromium := nil; + end; + + inherited Destroy; +end; + +procedure TTinyBrowser2.AfterConstruction; +begin + inherited AfterConstruction; + + FChromium := TChromiumCore.Create(nil); + FChromium.DefaultURL := 'https://www.google.com'; + FChromium.OnClose := Chromium_OnClose; + FChromium.OnBeforeClose := Chromium_OnBeforeClose; + FChromium.OnBeforePopup := Chromium_OnBeforePopup; + FChromium.OnOpenUrlFromTab := Chromium_OnOpenUrlFromTab; + FChromium.CreateBrowser('Tiny Browser 2'); +end; + +procedure TTinyBrowser2.Chromium_OnClose(Sender: TObject; const browser: ICefBrowser; var aAction : TCefCloseBrowserAction); +begin + aAction := cbaClose; +end; + +procedure TTinyBrowser2.Chromium_OnBeforeClose(Sender: TObject; const browser: ICefBrowser); +begin + GlobalCEFApp.QuitMessageLoop; +end; + +procedure TTinyBrowser2.Chromium_OnBeforePopup(Sender: TObject; const browser: ICefBrowser; + const frame: ICefFrame; const targetUrl, targetFrameName: ustring; targetDisposition: TCefWindowOpenDisposition; + userGesture: Boolean; const popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo; + var client: ICefClient; var settings: TCefBrowserSettings; var extra_info: ICefDictionaryValue; + var noJavascriptAccess: Boolean; var Result: Boolean); +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 TTinyBrowser2.Chromium_OnOpenUrlFromTab(Sender: TObject; + const browser: ICefBrowser; const frame: ICefFrame; + const targetUrl: ustring; targetDisposition: TCefWindowOpenDisposition; + userGesture: Boolean; out 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; + +end. diff --git a/source/uCEFChromiumCore.pas b/source/uCEFChromiumCore.pas index 3f6ff496..a9170877 100644 --- a/source/uCEFChromiumCore.pas +++ b/source/uCEFChromiumCore.pas @@ -682,6 +682,7 @@ type function CreateBrowser(aParentHandle : TCefWindowHandle; aParentRect : TRect; const aWindowName : ustring = ''; const aContext : ICefRequestContext = nil; const aExtraInfo : ICefDictionaryValue = nil) : boolean; overload; virtual; function CreateBrowser(const aURL : ustring; const aBrowserViewComp : TCEFBrowserViewComponent; const aContext : ICefRequestContext = nil; const aExtraInfo : ICefDictionaryValue = nil) : boolean; overload; virtual; + procedure CreateBrowser(const aWindowName : ustring); overload; virtual; procedure LoadURL(const aURL : ustring; const aFrameName : ustring = ''); overload; procedure LoadURL(const aURL : ustring; const aFrame : ICefFrame); overload; @@ -1889,6 +1890,34 @@ begin end; end; +procedure TChromiumCore.CreateBrowser(const aWindowName : ustring); +begin + try + // GlobalCEFApp.GlobalContextInitialized has to be TRUE before creating any browser + // even if you use a custom request context. + // If you create a browser in the initialization of your app, make sure you call this + // function when GlobalCEFApp.GlobalContextInitialized is TRUE. + // Use the GlobalCEFApp.OnContextInitialized event to know when + // GlobalCEFApp.GlobalContextInitialized is set to TRUE. + if (BrowserId = 0) and + (GlobalCEFApp <> nil) and + GlobalCEFApp.GlobalContextInitialized and + CreateClientHandler(False) then + begin + GetSettings(FBrowserSettings); + WindowInfoAsPopUp(FWindowInfo, 0, aWindowName); + CreateResourceRequestHandler; + CreateMediaObserver; + CreateDevToolsMsgObserver; + CreateExtensionHandler; + CreateBrowserHostSync(@FWindowInfo, FDefaultUrl, @FBrowserSettings, nil, nil); + end; + except + on e : exception do + if CustomExceptionHandler('TChromiumCore.CreateBrowser', e) then raise; + end; +end; + procedure TChromiumCore.InitializeWindowInfo( aParentHandle : TCefWindowHandle; aParentRect : TRect; const aWindowName : ustring); diff --git a/source/uCEFFMXChromium.pas b/source/uCEFFMXChromium.pas index fbfb1414..fb1932d2 100644 --- a/source/uCEFFMXChromium.pas +++ b/source/uCEFFMXChromium.pas @@ -116,8 +116,15 @@ uses function TFMXChromium.CreateBrowser(const aWindowName : ustring; const aContext : ICefRequestContext; const aExtraInfo : ICefDictionaryValue) : boolean; +var + TempHandle : TCefWindowHandle; begin - Result := inherited CreateBrowser(0, Rect(0, 0, 0, 0), aWindowName, aContext, aExtraInfo); + {$IFDEF MACOS} + TempHandle := nil; + {$ELSE} + TempHandle := 0; + {$ENDIF} + Result := inherited CreateBrowser(TempHandle, Rect(0, 0, 0, 0), aWindowName, aContext, aExtraInfo); end; procedure TFMXChromium.InitializeDevToolsWindowInfo; diff --git a/update_CEF4Delphi.json b/update_CEF4Delphi.json index eacb6e11..494472e0 100644 --- a/update_CEF4Delphi.json +++ b/update_CEF4Delphi.json @@ -2,7 +2,7 @@ "UpdateLazPackages" : [ { "ForceNotify" : true, - "InternalVersion" : 204, + "InternalVersion" : 205, "Name" : "cef4delphi_lazarus.lpk", "Version" : "87.1.11.0" }