From 5e5d0dcb749c68fa24afcc77272e7e1ce486c929 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Salvador=20D=C3=ADaz=20Fau?= Date: Tue, 24 Jul 2018 18:18:54 +0200 Subject: [PATCH] TCefFileDialogMode and TCefDuplexMode defined as constants - Added more parameter checks in CefRegisterExtension - Minor change registering the extension in JSExtension demo. The TempHandler reference is valid until it reaches the "finally". --- .../JavaScript/JSExtension/00-DeleteDCUs.bat | 1 + .../JavaScript/JSExtension/JSExtension.dproj | 37 +++- demos/JavaScript/JSExtension/uJSExtension.pas | 14 +- demos/SubProcess/uSimpleBrowser.pas | 159 +++++++++--------- source/uCEFConstants.pas | 10 ++ source/uCEFMiscFunctions.pas | 5 +- source/uCEFTypes.pas | 22 +-- source/uCEFv8Context.pas | 4 +- 8 files changed, 145 insertions(+), 107 deletions(-) diff --git a/demos/JavaScript/JSExtension/00-DeleteDCUs.bat b/demos/JavaScript/JSExtension/00-DeleteDCUs.bat index dbd008bc..19861011 100644 --- a/demos/JavaScript/JSExtension/00-DeleteDCUs.bat +++ b/demos/JavaScript/JSExtension/00-DeleteDCUs.bat @@ -9,6 +9,7 @@ del /s /q *.local del /s /q *.~* rmdir Win32\Debug rmdir Win32\Release +rmdir "Win32\Debug with log" rmdir Win32 rmdir __history rmdir __recovery diff --git a/demos/JavaScript/JSExtension/JSExtension.dproj b/demos/JavaScript/JSExtension/JSExtension.dproj index 5e3b7313..faa7f71f 100644 --- a/demos/JavaScript/JSExtension/JSExtension.dproj +++ b/demos/JavaScript/JSExtension/JSExtension.dproj @@ -45,6 +45,17 @@ true true + + true + Base + true + + + true + Cfg_3 + true + true + 3082 $(BDS)\bin\delphi_PROJECTICON.ico @@ -102,6 +113,22 @@ true Debug + + DEBUG;INTFLOG;$(DCC_Define) + + + true + true + true + true + 3 + true + true + true + 1033 + CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) + Debug + MainSource @@ -113,17 +140,21 @@
SimpleTextViewerFrm
+ + Base + Cfg_2 Base - - Base - Cfg_1 Base + + Cfg_3 + Base +
Delphi.Personality.12 diff --git a/demos/JavaScript/JSExtension/uJSExtension.pas b/demos/JavaScript/JSExtension/uJSExtension.pas index 4072de85..e73f6f2d 100644 --- a/demos/JavaScript/JSExtension/uJSExtension.pas +++ b/demos/JavaScript/JSExtension/uJSExtension.pas @@ -202,15 +202,23 @@ begin ' };' + '})();'; - TempHandler := TTestExtensionHandler.Create; - - CefRegisterExtension('myextension', TempExtensionCode, TempHandler); + try + TempHandler := TTestExtensionHandler.Create; + CefRegisterExtension('myextension', TempExtensionCode, TempHandler); + finally + TempHandler := nil; + end; end; procedure CreateGlobalCEFApp; begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.OnWebKitInitialized := GlobalCEFApp_OnWebKitInitialized; + + {$IFDEF INTFLOG} + GlobalCEFApp.LogFile := 'debug.log'; + GlobalCEFApp.LogSeverity := LOGSEVERITY_INFO; + {$ENDIF} end; procedure TJSExtensionFrm.GoBtnClick(Sender: TObject); diff --git a/demos/SubProcess/uSimpleBrowser.pas b/demos/SubProcess/uSimpleBrowser.pas index 63e9518d..44bca3e1 100644 --- a/demos/SubProcess/uSimpleBrowser.pas +++ b/demos/SubProcess/uSimpleBrowser.pas @@ -69,12 +69,12 @@ type // You have to handle this two messages to call NotifyMoveOrResizeStarted or some page elements will be misaligned. procedure WMMove(var aMessage : TWMMove); message WM_MOVE; procedure WMMoving(var aMessage : TMessage); message WM_MOVING; - // You also have to handle these two messages to set GlobalCEFApp.OsmodalLoop - procedure WMEnterMenuLoop(var aMessage: TMessage); message WM_ENTERMENULOOP; + // You also have to handle these two messages to set GlobalCEFApp.OsmodalLoop + procedure WMEnterMenuLoop(var aMessage: TMessage); message WM_ENTERMENULOOP; procedure WMExitMenuLoop(var aMessage: TMessage); message WM_EXITMENULOOP; protected - // Variables to control when can we destroy the form safely - FCanClose : boolean; // Set to True in TChromium.OnBeforeClose + // Variables to control when can we destroy the form safely + FCanClose : boolean; // Set to True in TChromium.OnBeforeClose FClosing : boolean; // Set to True in the CloseQuery event. 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 noJavascriptAccess: Boolean; var Result: Boolean); @@ -89,8 +89,8 @@ var implementation {$R *.dfm} - -uses + +uses uCEFApplication; // This is a demo with the simplest web browser you can build using CEF4Delphi and @@ -99,78 +99,79 @@ uses // Remember that it may take a few seconds to load if Windows update, your antivirus or // any other windows service is using your hard drive. -// Depending on your internet connection it may take longer than expected. - -// Please check that your firewall or antivirus are not blocking this application -// or the domain "google.com". If you don't live in the US, you'll be redirected to -// another domain which will take a little time too. - -// Destruction steps -// ================= -// 1. The FormCloseQuery event sets CanClose to False and calls TChromiumWindow.CloseBrowser, which triggers the TChromiumWindow.OnClose event. -// 2. The TChromiumWindow.OnClose event calls TChromiumWindow.DestroyChildWindow which triggers the TChromiumWindow.OnBeforeClose event. -// 3. TChromiumWindow.OnBeforeClose sets FCanClose to True and closes the form. - -procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); -begin - CanClose := FCanClose; - - if not(FClosing) then - begin - FClosing := True; - Visible := False; - ChromiumWindow1.CloseBrowser(True); - end; -end; - +// Depending on your internet connection it may take longer than expected. + +// Please check that your firewall or antivirus are not blocking this application +// or the domain "google.com". If you don't live in the US, you'll be redirected to +// another domain which will take a little time too. + +// Destruction steps +// ================= +// 1. The FormCloseQuery event sets CanClose to False and calls TChromiumWindow.CloseBrowser, which triggers the TChromiumWindow.OnClose event. +// 2. The TChromiumWindow.OnClose event calls TChromiumWindow.DestroyChildWindow which triggers the TChromiumWindow.OnBeforeClose event. +// 3. TChromiumWindow.OnBeforeClose sets FCanClose to True and closes the form. + +procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); +begin + CanClose := FCanClose; + + if not(FClosing) then + begin + FClosing := True; + Visible := False; + ChromiumWindow1.CloseBrowser(True); + end; +end; + procedure TForm1.FormShow(Sender: TObject); begin Caption := 'Simple Browser - Initializing browser. Please wait...'; - ChromiumWindow1.ChromiumBrowser.OnBeforePopup := Chromium_OnBeforePopup; - - // You *MUST* call CreateBrowser to create and initialize the browser. - // This will trigger the AfterCreated event when the browser is fully - // initialized and ready to receive commands. - - // GlobalCEFApp.GlobalContextInitialized has to be TRUE before creating any browser - // If it's not initialized yet, we use a simple timer to create the browser later. + + ChromiumWindow1.ChromiumBrowser.OnBeforePopup := Chromium_OnBeforePopup; + + // You *MUST* call CreateBrowser to create and initialize the browser. + // This will trigger the AfterCreated event when the browser is fully + // initialized and ready to receive commands. + + // GlobalCEFApp.GlobalContextInitialized has to be TRUE before creating any browser + // If it's not initialized yet, we use a simple timer to create the browser later. if not(ChromiumWindow1.CreateBrowser) then Timer1.Enabled := True; end; procedure TForm1.ChromiumWindow1Close(Sender: TObject); -begin - // DestroyChildWindow will destroy the child window created by CEF at the top of the Z order. - if not(ChromiumWindow1.DestroyChildWindow) then - begin - FCanClose := True; - Close; - end; +begin + // DestroyChildWindow will destroy the child window created by CEF at the top of the Z order. + if not(ChromiumWindow1.DestroyChildWindow) then + begin + FCanClose := True; + Close; + end; end; procedure TForm1.ChromiumWindow1BeforeClose(Sender: TObject); -begin - FCanClose := True; - Close; +begin + FCanClose := True; + Close; end; procedure TForm1.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 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]); + 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.ChromiumWindow1AfterCreated(Sender: TObject); -begin - // Now the browser is fully initialized we can load the initial web page. - Caption := 'Simple Browser'; - AddressPnl.Enabled := True; - GoBtn.Click; +begin + // Now the browser is fully initialized we can load the initial web page. + Caption := 'Simple Browser'; + AddressPnl.Enabled := True; + GoBtn.Click; end; procedure TForm1.GoBtnClick(Sender: TObject); @@ -180,10 +181,10 @@ begin end; procedure TForm1.Timer1Timer(Sender: TObject); -begin - Timer1.Enabled := False; - if not(ChromiumWindow1.CreateBrowser) and not(ChromiumWindow1.Initialized) then - Timer1.Enabled := True; +begin + Timer1.Enabled := False; + if not(ChromiumWindow1.CreateBrowser) and not(ChromiumWindow1.Initialized) then + Timer1.Enabled := True; end; procedure TForm1.WMMove(var aMessage : TWMMove); @@ -199,19 +200,19 @@ begin if (ChromiumWindow1 <> nil) then ChromiumWindow1.NotifyMoveOrResizeStarted; 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; + +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; end. diff --git a/source/uCEFConstants.pas b/source/uCEFConstants.pas index a11783fd..c899ec95 100644 --- a/source/uCEFConstants.pas +++ b/source/uCEFConstants.pas @@ -222,6 +222,10 @@ const DRAG_OPERATION_EVERY = $FFFFFFFF; // /include/internal/cef_types.h (cef_file_dialog_mode_t) + FILE_DIALOG_OPEN = $00000000; + FILE_DIALOG_OPEN_MULTIPLE = $00000001; + FILE_DIALOG_OPEN_FOLDER = $00000002; + FILE_DIALOG_SAVE = $00000003; FILE_DIALOG_TYPE_MASK = $000000FF; FILE_DIALOG_OVERWRITEPROMPT_FLAG = $01000000; FILE_DIALOG_HIDEREADONLY_FLAG = $02000000; @@ -326,6 +330,12 @@ const LOGSEVERITY_ERROR = 4; LOGSEVERITY_DISABLE = 99; + // /include/internal/cef_types.h (cef_duplex_mode_t) + DUPLEX_MODE_UNKNOWN = -1; + DUPLEX_MODE_SIMPLEX = 0; + DUPLEX_MODE_LONG_EDGE = 1; + DUPLEX_MODE_SHORT_EDGE = 2; + //****************************************************** //****************** OTHER CONSTANTS ******************* diff --git a/source/uCEFMiscFunctions.pas b/source/uCEFMiscFunctions.pas index ceb8d260..bcd12ff5 100644 --- a/source/uCEFMiscFunctions.pas +++ b/source/uCEFMiscFunctions.pas @@ -362,7 +362,10 @@ function CefRegisterExtension(const name, code: ustring; const Handler: ICefv8Ha var TempName, TempCode : TCefString; begin - if (GlobalCEFApp <> nil) and GlobalCEFApp.LibLoaded then + if (GlobalCEFApp <> nil) and + GlobalCEFApp.LibLoaded and + (length(name) > 0) and + (length(code) > 0) then begin TempName := CefString(name); TempCode := CefString(code); diff --git a/source/uCEFTypes.pas b/source/uCEFTypes.pas index 586bbcf4..6a514018 100644 --- a/source/uCEFTypes.pas +++ b/source/uCEFTypes.pas @@ -276,6 +276,9 @@ type TCefJsonWriterOptions = Cardinal; // /include/internal/cef_types.h (cef_json_writer_options_t) TCefSSLContentStatus = Cardinal; // /include/internal/cef_types.h (cef_ssl_content_status_t) TCefLogSeverity = Cardinal; // /include/internal/cef_types.h (cef_log_severity_t) + TCefFileDialogMode = Cardinal; // /include/internal/cef_types.h (cef_file_dialog_mode_t) + TCefDuplexMode = Integer; // /include/internal/cef_types.h (cef_duplex_mode_t) + {$IFDEF FPC} NativeInt = PtrInt; @@ -577,17 +580,6 @@ type MENUITEMTYPE_SUBMENU ); - // /include/internal/cef_types.h (cef_file_dialog_mode_t) - TCefFileDialogMode = ( - FILE_DIALOG_OPEN, - FILE_DIALOG_OPEN_MULTIPLE, - FILE_DIALOG_OPEN_FOLDER, - FILE_DIALOG_SAVE, - FILE_DIALOG_TYPE_MASK = $FF, - FILE_DIALOG_OVERWRITEPROMPT_FLAG = $01000000, - FILE_DIALOG_HIDEREADONLY_FLAG = $02000000 - ); - // /include/internal/cef_types.h (cef_focus_source_t) TCefFocusSource = ( FOCUS_SOURCE_NAVIGATION = 0, @@ -860,14 +852,6 @@ type COLOR_MODEL_PROCESSCOLORMODEL_RGB ); - // /include/internal/cef_types.h (cef_duplex_mode_t) - TCefDuplexMode = ( - DUPLEX_MODE_UNKNOWN = -1, - DUPLEX_MODE_SIMPLEX, - DUPLEX_MODE_LONG_EDGE, - DUPLEX_MODE_SHORT_EDGE - ); - // /include/internal/cef_types.h (cef_json_parser_options_t) TCefJsonParserOptions = ( JSON_PARSER_RFC = 0, diff --git a/source/uCEFv8Context.pas b/source/uCEFv8Context.pas index b663589e..abd5bcc3 100644 --- a/source/uCEFv8Context.pas +++ b/source/uCEFv8Context.pas @@ -79,7 +79,7 @@ uses class function TCefv8ContextRef.Current: ICefv8Context; begin - Result := UnWrap(cef_v8context_get_current_context()) + Result := UnWrap(cef_v8context_get_current_context()); end; function TCefv8ContextRef.Enter: Boolean; @@ -89,7 +89,7 @@ end; class function TCefv8ContextRef.Entered: ICefv8Context; begin - Result := UnWrap(cef_v8context_get_entered_context()) + Result := UnWrap(cef_v8context_get_entered_context()); end; function TCefv8ContextRef.Exit: Boolean;