1
0
mirror of https://github.com/salvadordf/CEF4Delphi.git synced 2025-06-02 21:57:37 +02:00

Update to CEF 3.3325.1756.g6d8faa4

This commit is contained in:
Salvador Díaz Fau 2018-03-31 18:08:18 +02:00
parent 1ce74299cb
commit 2c4fa2c94f
57 changed files with 1822 additions and 57 deletions

View File

@ -12,6 +12,7 @@ object CookieVisitorFrm: TCookieVisitorFrm
Font.Style = [] Font.Style = []
OldCreateOrder = False OldCreateOrder = False
Position = poScreenCenter Position = poScreenCenter
OnCloseQuery = FormCloseQuery
OnCreate = FormCreate OnCreate = FormCreate
OnDestroy = FormDestroy OnDestroy = FormDestroy
OnShow = FormShow OnShow = FormShow
@ -70,6 +71,8 @@ object CookieVisitorFrm: TCookieVisitorFrm
OnContextMenuCommand = Chromium1ContextMenuCommand OnContextMenuCommand = Chromium1ContextMenuCommand
OnBeforePopup = Chromium1BeforePopup OnBeforePopup = Chromium1BeforePopup
OnAfterCreated = Chromium1AfterCreated OnAfterCreated = Chromium1AfterCreated
OnBeforeClose = Chromium1BeforeClose
OnClose = Chromium1Close
Left = 32 Left = 32
Top = 224 Top = 224
end end

View File

@ -88,6 +88,11 @@ type
const popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo; const popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo;
var client: ICefClient; var settings: TCefBrowserSettings; var client: ICefClient; var settings: TCefBrowserSettings;
var noJavascriptAccess: Boolean; var Result: Boolean); var noJavascriptAccess: Boolean; var Result: Boolean);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure Chromium1Close(Sender: TObject; const browser: ICefBrowser;
out Result: Boolean);
procedure Chromium1BeforeClose(Sender: TObject;
const browser: ICefBrowser);
private private
procedure WMMove(var aMessage : TWMMove); message WM_MOVE; procedure WMMove(var aMessage : TWMMove); message WM_MOVE;
@ -95,11 +100,15 @@ type
procedure WMEnterMenuLoop(var aMessage: TMessage); message WM_ENTERMENULOOP; procedure WMEnterMenuLoop(var aMessage: TMessage); message WM_ENTERMENULOOP;
procedure WMExitMenuLoop(var aMessage: TMessage); message WM_EXITMENULOOP; procedure WMExitMenuLoop(var aMessage: TMessage); message WM_EXITMENULOOP;
procedure BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED; procedure BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED;
procedure BrowserDestroyMsg(var aMessage : TMessage); message CEF_DESTROY;
procedure ShowCookiesMsg(var aMessage : TMessage); message MINIBROWSER_SHOWCOOKIES; procedure ShowCookiesMsg(var aMessage : TMessage); message MINIBROWSER_SHOWCOOKIES;
protected protected
FText : string; FText : string;
FVisitor : ICefCookieVisitor; FVisitor : ICefCookieVisitor;
// 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.
public public
procedure AddCookieInfo(const aCookie : TCookie); procedure AddCookieInfo(const aCookie : TCookie);
@ -122,6 +131,12 @@ uses
// The cookie visitor will call CookieVisitorProc for each cookie and it'll save the information using the AddCookieInfo function. // The cookie visitor will call CookieVisitorProc for each cookie and it'll save the information using the AddCookieInfo function.
// When the last cookie arrives we show the information in a SimpleTextViewer form. // When the last cookie arrives we show the information in a SimpleTextViewer form.
// Destruction steps
// =================
// 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event.
// 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event.
// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form.
// This function is called in the IO thread. // This function is called in the IO thread.
function CookieVisitorProc(const name, value, domain, path: ustring; function CookieVisitorProc(const name, value, domain, path: ustring;
secure, httponly, hasExpires: Boolean; secure, httponly, hasExpires: Boolean;
@ -170,6 +185,11 @@ begin
GoBtn.Click; GoBtn.Click;
end; end;
procedure TCookieVisitorFrm.BrowserDestroyMsg(var aMessage : TMessage);
begin
CEFWindowParent1.Free;
end;
procedure TCookieVisitorFrm.ShowCookiesMsg(var aMessage : TMessage); procedure TCookieVisitorFrm.ShowCookiesMsg(var aMessage : TMessage);
begin begin
SimpleTextViewerFrm.Memo1.Lines.Text := FText; // This should be protected by a mutex. SimpleTextViewerFrm.Memo1.Lines.Text := FText; // This should be protected by a mutex.
@ -193,6 +213,12 @@ begin
PostMessage(Handle, CEF_AFTERCREATED, 0, 0); PostMessage(Handle, CEF_AFTERCREATED, 0, 0);
end; end;
procedure TCookieVisitorFrm.Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser);
begin
FCanClose := True;
PostMessage(Handle, WM_CLOSE, 0, 0);
end;
procedure TCookieVisitorFrm.Chromium1BeforeContextMenu(Sender: TObject; procedure TCookieVisitorFrm.Chromium1BeforeContextMenu(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame; const browser: ICefBrowser; const frame: ICefFrame;
const params: ICefContextMenuParams; const model: ICefMenuModel); const params: ICefContextMenuParams; const model: ICefMenuModel);
@ -215,6 +241,13 @@ begin
Result := (targetDisposition in [WOD_NEW_FOREGROUND_TAB, WOD_NEW_BACKGROUND_TAB, WOD_NEW_POPUP, WOD_NEW_WINDOW]); Result := (targetDisposition in [WOD_NEW_FOREGROUND_TAB, WOD_NEW_BACKGROUND_TAB, WOD_NEW_POPUP, WOD_NEW_WINDOW]);
end; end;
procedure TCookieVisitorFrm.Chromium1Close(Sender: TObject;
const browser: ICefBrowser; out Result: Boolean);
begin
PostMessage(Handle, CEF_DESTROY, 0, 0);
Result := True;
end;
procedure TCookieVisitorFrm.Chromium1ContextMenuCommand(Sender: TObject; procedure TCookieVisitorFrm.Chromium1ContextMenuCommand(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame; const browser: ICefBrowser; const frame: ICefFrame;
const params: ICefContextMenuParams; commandId: Integer; const params: ICefContextMenuParams; commandId: Integer;
@ -241,9 +274,23 @@ begin
showmessage('Deleted cookies : ' + inttostr(numDeleted)); showmessage('Deleted cookies : ' + inttostr(numDeleted));
end; end;
procedure TCookieVisitorFrm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose := FCanClose;
if not(FClosing) then
begin
FClosing := True;
Visible := False;
Chromium1.CloseBrowser(True);
end;
end;
procedure TCookieVisitorFrm.FormCreate(Sender: TObject); procedure TCookieVisitorFrm.FormCreate(Sender: TObject);
begin begin
FVisitor := TCefFastCookieVisitor.Create(CookieVisitorProc); FVisitor := TCefFastCookieVisitor.Create(CookieVisitorProc);
FCanClose := False;
FClosing := False;
end; end;
procedure TCookieVisitorFrm.FormDestroy(Sender: TObject); procedure TCookieVisitorFrm.FormDestroy(Sender: TObject);

View File

@ -12,6 +12,8 @@ object MainForm: TMainForm
Font.Style = [] Font.Style = []
OldCreateOrder = False OldCreateOrder = False
Position = poScreenCenter Position = poScreenCenter
OnCloseQuery = FormCloseQuery
OnCreate = FormCreate
OnShow = FormShow OnShow = FormShow
PixelsPerInch = 96 PixelsPerInch = 96
TextHeight = 13 TextHeight = 13
@ -22,6 +24,8 @@ object MainForm: TMainForm
Height = 628 Height = 628
Align = alClient Align = alClient
TabOrder = 0 TabOrder = 0
OnClose = ChromiumWindow1Close
OnBeforeClose = ChromiumWindow1BeforeClose
end end
object AddressBarPnl: TPanel object AddressBarPnl: TPanel
Left = 0 Left = 0

View File

@ -63,6 +63,10 @@ type
procedure FormShow(Sender: TObject); procedure FormShow(Sender: TObject);
procedure Button1Click(Sender: TObject); procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject); procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure ChromiumWindow1Close(Sender: TObject);
procedure ChromiumWindow1BeforeClose(Sender: TObject);
private private
procedure WMMove(var aMessage : TWMMove); message WM_MOVE; procedure WMMove(var aMessage : TWMMove); message WM_MOVE;
@ -71,6 +75,10 @@ type
procedure WMExitMenuLoop(var aMessage: TMessage); message WM_EXITMENULOOP; procedure WMExitMenuLoop(var aMessage: TMessage); message WM_EXITMENULOOP;
protected protected
// 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_OnAfterCreated(Sender: TObject); procedure Chromium_OnAfterCreated(Sender: TObject);
procedure Chromium_OnGetResourceHandler(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; out Result: ICefResourceHandler); procedure Chromium_OnGetResourceHandler(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; out Result: ICefResourceHandler);
procedure Chromium_OnBeforePopup(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const targetUrl, targetFrameName: ustring; targetDisposition: TCefWindowOpenDisposition; userGesture: Boolean; const popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo; var client: ICefClient; var settings: TCefBrowserSettings; var noJavascriptAccess: Boolean; var Result: Boolean); 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,11 +97,35 @@ implementation
uses uses
uCEFMiscFunctions, uCEFApplication; uCEFMiscFunctions, uCEFApplication;
// 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 TMainForm.Button1Click(Sender: TObject); procedure TMainForm.Button1Click(Sender: TObject);
begin begin
ChromiumWindow1.LoadURL(Edit1.Text); ChromiumWindow1.LoadURL(Edit1.Text);
end; end;
procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose := FCanClose;
if not(FClosing) then
begin
FClosing := True;
Visible := False;
ChromiumWindow1.CloseBrowser(True);
end;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
FCanClose := False;
FClosing := False;
end;
procedure TMainForm.FormShow(Sender: TObject); procedure TMainForm.FormShow(Sender: TObject);
begin begin
ChromiumWindow1.OnAfterCreated := Chromium_OnAfterCreated; ChromiumWindow1.OnAfterCreated := Chromium_OnAfterCreated;
@ -112,6 +144,22 @@ begin
Timer1.Enabled := True; Timer1.Enabled := True;
end; end;
procedure TMainForm.ChromiumWindow1BeforeClose(Sender: TObject);
begin
FCanClose := True;
Close;
end;
procedure TMainForm.ChromiumWindow1Close(Sender: TObject);
begin
// DestroyChildWindow will destroy the child window created by CEF at the top of the Z order.
if not(ChromiumWindow1.DestroyChildWindow) then
begin
FCanClose := True;
Close;
end;
end;
procedure TMainForm.Chromium_OnAfterCreated(Sender: TObject); procedure TMainForm.Chromium_OnAfterCreated(Sender: TObject);
begin begin
ChromiumWindow1.UpdateSize; ChromiumWindow1.UpdateSize;

View File

@ -12,6 +12,8 @@ object DOMVisitorFrm: TDOMVisitorFrm
Font.Style = [] Font.Style = []
OldCreateOrder = False OldCreateOrder = False
Position = poScreenCenter Position = poScreenCenter
OnCloseQuery = FormCloseQuery
OnCreate = FormCreate
OnShow = FormShow OnShow = FormShow
PixelsPerInch = 96 PixelsPerInch = 96
TextHeight = 13 TextHeight = 13
@ -96,6 +98,8 @@ object DOMVisitorFrm: TDOMVisitorFrm
OnContextMenuCommand = Chromium1ContextMenuCommand OnContextMenuCommand = Chromium1ContextMenuCommand
OnBeforePopup = Chromium1BeforePopup OnBeforePopup = Chromium1BeforePopup
OnAfterCreated = Chromium1AfterCreated OnAfterCreated = Chromium1AfterCreated
OnBeforeClose = Chromium1BeforeClose
OnClose = Chromium1Close
Left = 16 Left = 16
Top = 40 Top = 40
end end

View File

@ -94,10 +94,21 @@ type
const popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo; const popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo;
var client: ICefClient; var settings: TCefBrowserSettings; var client: ICefClient; var settings: TCefBrowserSettings;
var noJavascriptAccess: Boolean; var Result: Boolean); var noJavascriptAccess: Boolean; var Result: Boolean);
procedure FormCreate(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure Chromium1Close(Sender: TObject; const browser: ICefBrowser;
out Result: Boolean);
procedure Chromium1BeforeClose(Sender: TObject;
const browser: ICefBrowser);
private private
{ Private declarations } { Private declarations }
protected protected
// 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 BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED; procedure BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED;
procedure BrowserDestroyMsg(var aMessage : TMessage); message CEF_DESTROY;
procedure VisitDOMMsg(var aMessage : TMessage); message MINIBROWSER_VISITDOM; procedure VisitDOMMsg(var aMessage : TMessage); message MINIBROWSER_VISITDOM;
procedure WMMove(var aMessage : TWMMove); message WM_MOVE; procedure WMMove(var aMessage : TWMMove); message WM_MOVE;
procedure WMMoving(var aMessage : TMessage); message WM_MOVING; procedure WMMoving(var aMessage : TMessage); message WM_MOVING;
@ -139,6 +150,12 @@ uses
// The OnProcessMessageReceived event can recognize any number of messages identifying them // The OnProcessMessageReceived event can recognize any number of messages identifying them
// by message.name // by message.name
// Destruction steps
// =================
// 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event.
// 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event.
// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form.
procedure SimpleDOMIteration(const aDocument: ICefDomDocument); procedure SimpleDOMIteration(const aDocument: ICefDomDocument);
var var
TempHead, TempChild : ICefDomNode; TempHead, TempChild : ICefDomNode;
@ -253,6 +270,13 @@ begin
PostMessage(Handle, CEF_AFTERCREATED, 0, 0); PostMessage(Handle, CEF_AFTERCREATED, 0, 0);
end; end;
procedure TDOMVisitorFrm.Chromium1BeforeClose(Sender: TObject;
const browser: ICefBrowser);
begin
FCanClose := True;
PostMessage(Handle, WM_CLOSE, 0, 0);
end;
procedure TDOMVisitorFrm.Chromium1BeforeContextMenu(Sender: TObject; procedure TDOMVisitorFrm.Chromium1BeforeContextMenu(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame; const browser: ICefBrowser; const frame: ICefFrame;
const params: ICefContextMenuParams; const model: ICefMenuModel); const params: ICefContextMenuParams; const model: ICefMenuModel);
@ -272,6 +296,13 @@ begin
Result := (targetDisposition in [WOD_NEW_FOREGROUND_TAB, WOD_NEW_BACKGROUND_TAB, WOD_NEW_POPUP, WOD_NEW_WINDOW]); Result := (targetDisposition in [WOD_NEW_FOREGROUND_TAB, WOD_NEW_BACKGROUND_TAB, WOD_NEW_POPUP, WOD_NEW_WINDOW]);
end; end;
procedure TDOMVisitorFrm.Chromium1Close(Sender: TObject;
const browser: ICefBrowser; out Result: Boolean);
begin
PostMessage(Handle, CEF_DESTROY, 0, 0);
Result := True;
end;
procedure TDOMVisitorFrm.Chromium1ContextMenuCommand(Sender: TObject; procedure TDOMVisitorFrm.Chromium1ContextMenuCommand(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame; const browser: ICefBrowser; const frame: ICefFrame;
const params: ICefContextMenuParams; commandId: Integer; const params: ICefContextMenuParams; commandId: Integer;
@ -301,6 +332,25 @@ begin
end; end;
end; end;
procedure TDOMVisitorFrm.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
begin
CanClose := FCanClose;
if not(FClosing) then
begin
FClosing := True;
Visible := False;
Chromium1.CloseBrowser(True);
end;
end;
procedure TDOMVisitorFrm.FormCreate(Sender: TObject);
begin
FCanClose := False;
FClosing := False;
end;
procedure TDOMVisitorFrm.FormShow(Sender: TObject); procedure TDOMVisitorFrm.FormShow(Sender: TObject);
begin begin
// GlobalCEFApp.GlobalContextInitialized has to be TRUE before creating any browser // GlobalCEFApp.GlobalContextInitialized has to be TRUE before creating any browser
@ -320,6 +370,11 @@ begin
GoBtn.Click; GoBtn.Click;
end; end;
procedure TDOMVisitorFrm.BrowserDestroyMsg(var aMessage : TMessage);
begin
CEFWindowParent1.Free;
end;
procedure TDOMVisitorFrm.VisitDOMBtnClick(Sender: TObject); procedure TDOMVisitorFrm.VisitDOMBtnClick(Sender: TObject);
begin begin
PostMessage(Handle, MINIBROWSER_VISITDOM, 0, 0); PostMessage(Handle, MINIBROWSER_VISITDOM, 0, 0);

View File

@ -15,6 +15,8 @@ object MainForm: TMainForm
FormStyle = fsStayOnTop FormStyle = fsStayOnTop
OldCreateOrder = False OldCreateOrder = False
WindowState = wsMaximized WindowState = wsMaximized
OnCloseQuery = FormCloseQuery
OnCreate = FormCreate
OnShow = FormShow OnShow = FormShow
PixelsPerInch = 96 PixelsPerInch = 96
TextHeight = 13 TextHeight = 13
@ -31,6 +33,8 @@ object MainForm: TMainForm
OnKeyEvent = Chromium1KeyEvent OnKeyEvent = Chromium1KeyEvent
OnBeforePopup = Chromium1BeforePopup OnBeforePopup = Chromium1BeforePopup
OnAfterCreated = Chromium1AfterCreated OnAfterCreated = Chromium1AfterCreated
OnBeforeClose = Chromium1BeforeClose
OnClose = Chromium1Close
Left = 208 Left = 208
Top = 120 Top = 120
end end

View File

@ -73,14 +73,25 @@ type
const popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo; const popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo;
var client: ICefClient; var settings: TCefBrowserSettings; var client: ICefClient; var settings: TCefBrowserSettings;
var noJavascriptAccess: Boolean; var Result: Boolean); var noJavascriptAccess: Boolean; var Result: Boolean);
procedure FormCreate(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure Chromium1BeforeClose(Sender: TObject;
const browser: ICefBrowser);
procedure Chromium1Close(Sender: TObject; const browser: ICefBrowser;
out Result: Boolean);
private private
{ Private declarations } { Private declarations }
protected protected
// 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 WMMove(var aMessage : TWMMove); message WM_MOVE; procedure WMMove(var aMessage : TWMMove); message WM_MOVE;
procedure WMMoving(var aMessage : TMessage); message WM_MOVING; procedure WMMoving(var aMessage : TMessage); message WM_MOVING;
procedure WMEnterMenuLoop(var aMessage: TMessage); message WM_ENTERMENULOOP; procedure WMEnterMenuLoop(var aMessage: TMessage); message WM_ENTERMENULOOP;
procedure WMExitMenuLoop(var aMessage: TMessage); message WM_EXITMENULOOP; procedure WMExitMenuLoop(var aMessage: TMessage); message WM_EXITMENULOOP;
procedure BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED; procedure BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED;
procedure BrowserDestroyMsg(var aMessage : TMessage); message CEF_DESTROY;
procedure HandleKeyUp(const aMsg : TMsg; var aHandled : boolean); procedure HandleKeyUp(const aMsg : TMsg; var aHandled : boolean);
procedure HandleKeyDown(const aMsg : TMsg; var aHandled : boolean); procedure HandleKeyDown(const aMsg : TMsg; var aHandled : boolean);
@ -141,6 +152,12 @@ begin
PostMessage(Handle, CEF_AFTERCREATED, 0, 0); PostMessage(Handle, CEF_AFTERCREATED, 0, 0);
end; end;
procedure TMainForm.Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser);
begin
FCanClose := True;
PostMessage(Handle, WM_CLOSE, 0, 0);
end;
procedure TMainForm.Chromium1BeforePopup(Sender: TObject; procedure TMainForm.Chromium1BeforePopup(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame; const targetUrl, const browser: ICefBrowser; const frame: ICefFrame; const targetUrl,
targetFrameName: ustring; targetDisposition: TCefWindowOpenDisposition; targetFrameName: ustring; targetDisposition: TCefWindowOpenDisposition;
@ -153,11 +170,22 @@ begin
Result := (targetDisposition in [WOD_NEW_FOREGROUND_TAB, WOD_NEW_BACKGROUND_TAB, WOD_NEW_POPUP, WOD_NEW_WINDOW]); Result := (targetDisposition in [WOD_NEW_FOREGROUND_TAB, WOD_NEW_BACKGROUND_TAB, WOD_NEW_POPUP, WOD_NEW_WINDOW]);
end; end;
procedure TMainForm.Chromium1Close(Sender: TObject; const browser: ICefBrowser; out Result: Boolean);
begin
PostMessage(Handle, CEF_DESTROY, 0, 0);
Result := True;
end;
procedure TMainForm.BrowserCreatedMsg(var aMessage : TMessage); procedure TMainForm.BrowserCreatedMsg(var aMessage : TMessage);
begin begin
CEFWindowParent1.UpdateSize; CEFWindowParent1.UpdateSize;
end; end;
procedure TMainForm.BrowserDestroyMsg(var aMessage : TMessage);
begin
CEFWindowParent1.Free;
end;
procedure TMainForm.Chromium1KeyEvent(Sender: TObject; procedure TMainForm.Chromium1KeyEvent(Sender: TObject;
const browser: ICefBrowser; const event: PCefKeyEvent; osEvent: PMsg; const browser: ICefBrowser; const event: PCefKeyEvent; osEvent: PMsg;
out Result: Boolean); out Result: Boolean);
@ -196,6 +224,24 @@ begin
isKeyboardShortcut := True; isKeyboardShortcut := True;
end; end;
procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose := FCanClose;
if not(FClosing) then
begin
FClosing := True;
Visible := False;
Chromium1.CloseBrowser(True);
end;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
FCanClose := False;
FClosing := False;
end;
procedure TMainForm.FormShow(Sender: TObject); procedure TMainForm.FormShow(Sender: TObject);
begin begin
Chromium1.DefaultUrl := 'https://www.google.com'; Chromium1.DefaultUrl := 'https://www.google.com';

View File

@ -12,6 +12,7 @@ object JSDialogBrowserFrm: TJSDialogBrowserFrm
Font.Style = [] Font.Style = []
OldCreateOrder = False OldCreateOrder = False
Position = poScreenCenter Position = poScreenCenter
OnCloseQuery = FormCloseQuery
OnCreate = FormCreate OnCreate = FormCreate
OnDestroy = FormDestroy OnDestroy = FormDestroy
OnShow = FormShow OnShow = FormShow
@ -24,6 +25,8 @@ object JSDialogBrowserFrm: TJSDialogBrowserFrm
Height = 594 Height = 594
Align = alClient Align = alClient
TabOrder = 0 TabOrder = 0
OnClose = ChromiumWindow1Close
OnBeforeClose = ChromiumWindow1BeforeClose
OnAfterCreated = ChromiumWindow1AfterCreated OnAfterCreated = ChromiumWindow1AfterCreated
end end
object AddressPnl: TPanel object AddressPnl: TPanel

View File

@ -67,6 +67,9 @@ type
procedure Timer1Timer(Sender: TObject); procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject); procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject); procedure FormDestroy(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure ChromiumWindow1Close(Sender: TObject);
procedure ChromiumWindow1BeforeClose(Sender: TObject);
protected protected
FJSDialogInfoCS : TCriticalSection; FJSDialogInfoCS : TCriticalSection;
@ -77,6 +80,10 @@ type
FDialogType : TCefJsDialogType; FDialogType : TCefJsDialogType;
FCallback : ICefJsDialogCallback; FCallback : ICefJsDialogCallback;
// 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_OnJsdialog(Sender: TObject; const browser: ICefBrowser; const originUrl: ustring; dialogType: TCefJsDialogType; const messageText, defaultPromptText: ustring; const callback: ICefJsDialogCallback; out suppressMessage: Boolean; out Result: Boolean); procedure Chromium_OnJsdialog(Sender: TObject; const browser: ICefBrowser; const originUrl: ustring; dialogType: TCefJsDialogType; const messageText, defaultPromptText: ustring; const callback: ICefJsDialogCallback; out suppressMessage: Boolean; out Result: Boolean);
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); 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);
@ -100,6 +107,12 @@ uses
// This is a demo with custom JS dialogs // This is a demo with custom JS dialogs
// 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 TJSDialogBrowserFrm.FormCreate(Sender: TObject); procedure TJSDialogBrowserFrm.FormCreate(Sender: TObject);
begin begin
FJSDialogInfoCS := TCriticalSection.Create; FJSDialogInfoCS := TCriticalSection.Create;
@ -109,6 +122,20 @@ begin
FPendingDlg := False; FPendingDlg := False;
FDialogType := JSDIALOGTYPE_ALERT; FDialogType := JSDIALOGTYPE_ALERT;
FCallback := nil; FCallback := nil;
FCanClose := False;
FClosing := False;
end;
procedure TJSDialogBrowserFrm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose := FCanClose;
if not(FClosing) then
begin
FClosing := True;
Visible := False;
ChromiumWindow1.CloseBrowser(True);
end;
end; end;
procedure TJSDialogBrowserFrm.FormDestroy(Sender: TObject); procedure TJSDialogBrowserFrm.FormDestroy(Sender: TObject);
@ -209,6 +236,22 @@ begin
FJSDialogInfoCS.Release; FJSDialogInfoCS.Release;
end; end;
procedure TJSDialogBrowserFrm.ChromiumWindow1BeforeClose(Sender: TObject);
begin
FCanClose := True;
Close;
end;
procedure TJSDialogBrowserFrm.ChromiumWindow1Close(Sender: TObject);
begin
// DestroyChildWindow will destroy the child window created by CEF at the top of the Z order.
if not(ChromiumWindow1.DestroyChildWindow) then
begin
FCanClose := True;
Close;
end;
end;
procedure TJSDialogBrowserFrm.Chromium_OnBeforePopup(Sender: TObject; procedure TJSDialogBrowserFrm.Chromium_OnBeforePopup(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame; const targetUrl, const browser: ICefBrowser; const frame: ICefFrame; const targetUrl,
targetFrameName: ustring; targetDisposition: TCefWindowOpenDisposition; targetFrameName: ustring; targetDisposition: TCefWindowOpenDisposition;

View File

@ -12,6 +12,7 @@ object JSEvalFrm: TJSEvalFrm
Font.Style = [] Font.Style = []
OldCreateOrder = False OldCreateOrder = False
Position = poScreenCenter Position = poScreenCenter
OnCloseQuery = FormCloseQuery
OnShow = FormShow OnShow = FormShow
PixelsPerInch = 96 PixelsPerInch = 96
TextHeight = 13 TextHeight = 13
@ -67,6 +68,8 @@ object JSEvalFrm: TJSEvalFrm
OnContextMenuCommand = Chromium1ContextMenuCommand OnContextMenuCommand = Chromium1ContextMenuCommand
OnBeforePopup = Chromium1BeforePopup OnBeforePopup = Chromium1BeforePopup
OnAfterCreated = Chromium1AfterCreated OnAfterCreated = Chromium1AfterCreated
OnBeforeClose = Chromium1BeforeClose
OnClose = Chromium1Close
Left = 16 Left = 16
Top = 40 Top = 40
end end

View File

@ -93,14 +93,23 @@ type
const popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo; const popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo;
var client: ICefClient; var settings: TCefBrowserSettings; var client: ICefClient; var settings: TCefBrowserSettings;
var noJavascriptAccess: Boolean; var Result: Boolean); var noJavascriptAccess: Boolean; var Result: Boolean);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure Chromium1Close(Sender: TObject; const browser: ICefBrowser;
out Result: Boolean);
procedure Chromium1BeforeClose(Sender: TObject;
const browser: ICefBrowser);
private private
{ Private declarations } { Private declarations }
protected protected
FText : string; FText : string;
// 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 BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED; procedure BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED;
procedure BrowserDestroyMsg(var aMessage : TMessage); message CEF_DESTROY;
procedure ShowTextViewerMsg(var aMessage : TMessage); message MINIBROWSER_SHOWTEXTVIEWER; procedure ShowTextViewerMsg(var aMessage : TMessage); message MINIBROWSER_SHOWTEXTVIEWER;
procedure EvalJSCodeMsg(var aMessage : TMessage); message MINIBROWSER_EVALJSCODE; procedure EvalJSCodeMsg(var aMessage : TMessage); message MINIBROWSER_EVALJSCODE;
procedure EvalJSBinParamMsg(var aMessage : TMessage); message MINIBROWSER_JSBINPARAM; procedure EvalJSBinParamMsg(var aMessage : TMessage); message MINIBROWSER_JSBINPARAM;
@ -164,12 +173,25 @@ uses
// Compress the binary data if necessary! // Compress the binary data if necessary!
// Destruction steps
// =================
// 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event.
// 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event.
// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form.
procedure TJSEvalFrm.Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); procedure TJSEvalFrm.Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser);
begin begin
PostMessage(Handle, CEF_AFTERCREATED, 0, 0); PostMessage(Handle, CEF_AFTERCREATED, 0, 0);
end; end;
procedure TJSEvalFrm.Chromium1BeforeClose(Sender: TObject;
const browser: ICefBrowser);
begin
FCanClose := True;
PostMessage(Handle, WM_CLOSE, 0, 0);
end;
procedure TJSEvalFrm.Chromium1BeforeContextMenu(Sender : TObject; procedure TJSEvalFrm.Chromium1BeforeContextMenu(Sender : TObject;
const browser : ICefBrowser; const browser : ICefBrowser;
const frame : ICefFrame; const frame : ICefFrame;
@ -192,6 +214,13 @@ begin
Result := (targetDisposition in [WOD_NEW_FOREGROUND_TAB, WOD_NEW_BACKGROUND_TAB, WOD_NEW_POPUP, WOD_NEW_WINDOW]); Result := (targetDisposition in [WOD_NEW_FOREGROUND_TAB, WOD_NEW_BACKGROUND_TAB, WOD_NEW_POPUP, WOD_NEW_WINDOW]);
end; end;
procedure TJSEvalFrm.Chromium1Close(Sender: TObject;
const browser: ICefBrowser; out Result: Boolean);
begin
PostMessage(Handle, CEF_DESTROY, 0, 0);
Result := True;
end;
procedure TJSEvalFrm.Chromium1ContextMenuCommand(Sender : TObject; procedure TJSEvalFrm.Chromium1ContextMenuCommand(Sender : TObject;
const browser : ICefBrowser; const browser : ICefBrowser;
const frame : ICefFrame; const frame : ICefFrame;
@ -208,6 +237,18 @@ begin
end; end;
end; end;
procedure TJSEvalFrm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose := FCanClose;
if not(FClosing) then
begin
FClosing := True;
Visible := False;
Chromium1.CloseBrowser(True);
end;
end;
procedure TJSEvalFrm.FormShow(Sender: TObject); procedure TJSEvalFrm.FormShow(Sender: TObject);
begin begin
// GlobalCEFApp.GlobalContextInitialized has to be TRUE before creating any browser // GlobalCEFApp.GlobalContextInitialized has to be TRUE before creating any browser
@ -227,6 +268,11 @@ begin
GoBtn.Click; GoBtn.Click;
end; end;
procedure TJSEvalFrm.BrowserDestroyMsg(var aMessage : TMessage);
begin
CEFWindowParent1.Free;
end;
procedure TJSEvalFrm.ShowTextViewerMsg(var aMessage : TMessage); procedure TJSEvalFrm.ShowTextViewerMsg(var aMessage : TMessage);
begin begin
SimpleTextViewerFrm.Memo1.Lines.Text := FText; SimpleTextViewerFrm.Memo1.Lines.Text := FText;

View File

@ -12,6 +12,8 @@ object JSExecutingFunctionsFrm: TJSExecutingFunctionsFrm
Font.Style = [] Font.Style = []
OldCreateOrder = False OldCreateOrder = False
Position = poScreenCenter Position = poScreenCenter
OnCloseQuery = FormCloseQuery
OnCreate = FormCreate
OnDestroy = FormDestroy OnDestroy = FormDestroy
OnShow = FormShow OnShow = FormShow
PixelsPerInch = 96 PixelsPerInch = 96
@ -66,6 +68,8 @@ object JSExecutingFunctionsFrm: TJSExecutingFunctionsFrm
OnContextMenuCommand = Chromium1ContextMenuCommand OnContextMenuCommand = Chromium1ContextMenuCommand
OnBeforePopup = Chromium1BeforePopup OnBeforePopup = Chromium1BeforePopup
OnAfterCreated = Chromium1AfterCreated OnAfterCreated = Chromium1AfterCreated
OnBeforeClose = Chromium1BeforeClose
OnClose = Chromium1Close
Left = 32 Left = 32
Top = 224 Top = 224
end end

View File

@ -84,8 +84,19 @@ type
var client: ICefClient; var settings: TCefBrowserSettings; var client: ICefClient; var settings: TCefBrowserSettings;
var noJavascriptAccess: Boolean; var Result: Boolean); var noJavascriptAccess: Boolean; var Result: Boolean);
procedure FormDestroy(Sender: TObject); procedure FormDestroy(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure FormCreate(Sender: TObject);
procedure Chromium1Close(Sender: TObject; const browser: ICefBrowser;
out Result: Boolean);
procedure Chromium1BeforeClose(Sender: TObject;
const browser: ICefBrowser);
protected protected
// 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 BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED; procedure BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED;
procedure BrowserDestroyMsg(var aMessage : TMessage); message CEF_DESTROY;
procedure WMMove(var aMessage : TWMMove); message WM_MOVE; procedure WMMove(var aMessage : TWMMove); message WM_MOVE;
procedure WMMoving(var aMessage : TMessage); message WM_MOVING; procedure WMMoving(var aMessage : TMessage); message WM_MOVING;
procedure WMEnterMenuLoop(var aMessage: TMessage); message WM_ENTERMENULOOP; procedure WMEnterMenuLoop(var aMessage: TMessage); message WM_ENTERMENULOOP;
@ -122,6 +133,12 @@ implementation
// This will send a process message to the "render" where the function can // This will send a process message to the "render" where the function can
// be executed. // be executed.
// Destruction steps
// =================
// 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event.
// 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event.
// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form.
uses uses
uCEFProcessMessage, uMyV8Handler; uCEFProcessMessage, uMyV8Handler;
@ -164,6 +181,13 @@ begin
PostMessage(Handle, CEF_AFTERCREATED, 0, 0); PostMessage(Handle, CEF_AFTERCREATED, 0, 0);
end; end;
procedure TJSExecutingFunctionsFrm.Chromium1BeforeClose(Sender: TObject;
const browser: ICefBrowser);
begin
FCanClose := True;
PostMessage(Handle, WM_CLOSE, 0, 0);
end;
procedure TJSExecutingFunctionsFrm.Chromium1BeforeContextMenu( procedure TJSExecutingFunctionsFrm.Chromium1BeforeContextMenu(
Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame;
const params: ICefContextMenuParams; const model: ICefMenuModel); const params: ICefContextMenuParams; const model: ICefMenuModel);
@ -184,6 +208,12 @@ begin
Result := (targetDisposition in [WOD_NEW_FOREGROUND_TAB, WOD_NEW_BACKGROUND_TAB, WOD_NEW_POPUP, WOD_NEW_WINDOW]); Result := (targetDisposition in [WOD_NEW_FOREGROUND_TAB, WOD_NEW_BACKGROUND_TAB, WOD_NEW_POPUP, WOD_NEW_WINDOW]);
end; end;
procedure TJSExecutingFunctionsFrm.Chromium1Close(Sender: TObject; const browser: ICefBrowser; out Result: Boolean);
begin
PostMessage(Handle, CEF_DESTROY, 0, 0);
Result := True;
end;
procedure TJSExecutingFunctionsFrm.Chromium1ContextMenuCommand( procedure TJSExecutingFunctionsFrm.Chromium1ContextMenuCommand(
Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame;
const params: ICefContextMenuParams; commandId: Integer; const params: ICefContextMenuParams; commandId: Integer;
@ -202,6 +232,25 @@ begin
end; end;
end; end;
procedure TJSExecutingFunctionsFrm.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
begin
CanClose := FCanClose;
if not(FClosing) then
begin
FClosing := True;
Visible := False;
Chromium1.CloseBrowser(True);
end;
end;
procedure TJSExecutingFunctionsFrm.FormCreate(Sender: TObject);
begin
FCanClose := False;
FClosing := False;
end;
procedure TJSExecutingFunctionsFrm.FormDestroy(Sender: TObject); procedure TJSExecutingFunctionsFrm.FormDestroy(Sender: TObject);
begin begin
GlobalCallbackFunc := nil; GlobalCallbackFunc := nil;
@ -258,4 +307,9 @@ begin
GoBtn.Click; GoBtn.Click;
end; end;
procedure TJSExecutingFunctionsFrm.BrowserDestroyMsg(var aMessage : TMessage);
begin
CEFWindowParent1.Free;
end;
end. end.

View File

@ -12,6 +12,8 @@ object JSExtensionFrm: TJSExtensionFrm
Font.Style = [] Font.Style = []
OldCreateOrder = False OldCreateOrder = False
Position = poScreenCenter Position = poScreenCenter
OnCloseQuery = FormCloseQuery
OnCreate = FormCreate
OnShow = FormShow OnShow = FormShow
PixelsPerInch = 96 PixelsPerInch = 96
TextHeight = 13 TextHeight = 13
@ -76,6 +78,8 @@ object JSExtensionFrm: TJSExtensionFrm
OnContextMenuCommand = Chromium1ContextMenuCommand OnContextMenuCommand = Chromium1ContextMenuCommand
OnBeforePopup = Chromium1BeforePopup OnBeforePopup = Chromium1BeforePopup
OnAfterCreated = Chromium1AfterCreated OnAfterCreated = Chromium1AfterCreated
OnBeforeClose = Chromium1BeforeClose
OnClose = Chromium1Close
Left = 32 Left = 32
Top = 224 Top = 224
end end

View File

@ -90,10 +90,20 @@ type
const popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo; const popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo;
var client: ICefClient; var settings: TCefBrowserSettings; var client: ICefClient; var settings: TCefBrowserSettings;
var noJavascriptAccess: Boolean; var Result: Boolean); var noJavascriptAccess: Boolean; var Result: Boolean);
procedure FormCreate(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure Chromium1Close(Sender: TObject; const browser: ICefBrowser;
out Result: Boolean);
procedure Chromium1BeforeClose(Sender: TObject;
const browser: ICefBrowser);
protected protected
FText : string; FText : string;
// 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 BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED; procedure BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED;
procedure BrowserDestroyMsg(var aMessage : TMessage); message CEF_DESTROY;
procedure ShowTextViewerMsg(var aMessage : TMessage); message MINIBROWSER_SHOWTEXTVIEWER; procedure ShowTextViewerMsg(var aMessage : TMessage); message MINIBROWSER_SHOWTEXTVIEWER;
procedure WMMove(var aMessage : TWMMove); message WM_MOVE; procedure WMMove(var aMessage : TWMMove); message WM_MOVE;
procedure WMMoving(var aMessage : TMessage); message WM_MOVING; procedure WMMoving(var aMessage : TMessage); message WM_MOVING;
@ -133,6 +143,12 @@ uses
// Even if you create several TChromium objects you should have no problem because each of them will have its own // Even if you create several TChromium objects you should have no problem because each of them will have its own
// TChromium.OnProcessMessageReceived event to receive the messages from the extension. // TChromium.OnProcessMessageReceived event to receive the messages from the extension.
// Destruction steps
// =================
// 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event.
// 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event.
// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form.
procedure GlobalCEFApp_OnWebKitInitialized; procedure GlobalCEFApp_OnWebKitInitialized;
var var
TempExtensionCode : string; TempExtensionCode : string;
@ -171,6 +187,13 @@ begin
PostMessage(Handle, CEF_AFTERCREATED, 0, 0); PostMessage(Handle, CEF_AFTERCREATED, 0, 0);
end; end;
procedure TJSExtensionFrm.Chromium1BeforeClose(Sender: TObject;
const browser: ICefBrowser);
begin
FCanClose := True;
PostMessage(Handle, WM_CLOSE, 0, 0);
end;
procedure TJSExtensionFrm.Chromium1BeforeContextMenu(Sender: TObject; procedure TJSExtensionFrm.Chromium1BeforeContextMenu(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame; const browser: ICefBrowser; const frame: ICefFrame;
const params: ICefContextMenuParams; const model: ICefMenuModel); const params: ICefContextMenuParams; const model: ICefMenuModel);
@ -193,6 +216,13 @@ begin
Result := (targetDisposition in [WOD_NEW_FOREGROUND_TAB, WOD_NEW_BACKGROUND_TAB, WOD_NEW_POPUP, WOD_NEW_WINDOW]); Result := (targetDisposition in [WOD_NEW_FOREGROUND_TAB, WOD_NEW_BACKGROUND_TAB, WOD_NEW_POPUP, WOD_NEW_WINDOW]);
end; end;
procedure TJSExtensionFrm.Chromium1Close(Sender: TObject;
const browser: ICefBrowser; out Result: Boolean);
begin
PostMessage(Handle, CEF_DESTROY, 0, 0);
Result := True;
end;
procedure TJSExtensionFrm.Chromium1ContextMenuCommand(Sender: TObject; procedure TJSExtensionFrm.Chromium1ContextMenuCommand(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame; const browser: ICefBrowser; const frame: ICefFrame;
const params: ICefContextMenuParams; commandId: Integer; const params: ICefContextMenuParams; commandId: Integer;
@ -255,6 +285,25 @@ begin
end; end;
end; end;
procedure TJSExtensionFrm.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
begin
CanClose := FCanClose;
if not(FClosing) then
begin
FClosing := True;
Visible := False;
Chromium1.CloseBrowser(True);
end;
end;
procedure TJSExtensionFrm.FormCreate(Sender: TObject);
begin
FCanClose := False;
FClosing := False;
end;
procedure TJSExtensionFrm.FormShow(Sender: TObject); procedure TJSExtensionFrm.FormShow(Sender: TObject);
begin begin
StatusBar1.Panels[0].Text := 'Initializing browser. Please wait...'; StatusBar1.Panels[0].Text := 'Initializing browser. Please wait...';
@ -314,4 +363,9 @@ begin
GoBtn.Click; GoBtn.Click;
end; end;
procedure TJSExtensionFrm.BrowserDestroyMsg(var aMessage : TMessage);
begin
CEFWindowParent1.Free;
end;
end. end.

View File

@ -12,6 +12,8 @@ object JSExtensionWithFunctionFrm: TJSExtensionWithFunctionFrm
Font.Style = [] Font.Style = []
OldCreateOrder = False OldCreateOrder = False
Position = poScreenCenter Position = poScreenCenter
OnCloseQuery = FormCloseQuery
OnCreate = FormCreate
OnShow = FormShow OnShow = FormShow
PixelsPerInch = 96 PixelsPerInch = 96
TextHeight = 13 TextHeight = 13
@ -74,6 +76,8 @@ object JSExtensionWithFunctionFrm: TJSExtensionWithFunctionFrm
OnProcessMessageReceived = Chromium1ProcessMessageReceived OnProcessMessageReceived = Chromium1ProcessMessageReceived
OnBeforePopup = Chromium1BeforePopup OnBeforePopup = Chromium1BeforePopup
OnAfterCreated = Chromium1AfterCreated OnAfterCreated = Chromium1AfterCreated
OnBeforeClose = Chromium1BeforeClose
OnClose = Chromium1Close
Left = 32 Left = 32
Top = 224 Top = 224
end end

View File

@ -74,8 +74,19 @@ type
procedure Chromium1ProcessMessageReceived(Sender: TObject; procedure Chromium1ProcessMessageReceived(Sender: TObject;
const browser: ICefBrowser; sourceProcess: TCefProcessId; const browser: ICefBrowser; sourceProcess: TCefProcessId;
const message: ICefProcessMessage; out Result: Boolean); const message: ICefProcessMessage; out Result: Boolean);
procedure FormCreate(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure Chromium1Close(Sender: TObject; const browser: ICefBrowser;
out Result: Boolean);
procedure Chromium1BeforeClose(Sender: TObject;
const browser: ICefBrowser);
protected protected
// 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 BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED; procedure BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED;
procedure BrowserDestroyMsg(var aMessage : TMessage); message CEF_DESTROY;
procedure WMMove(var aMessage : TWMMove); message WM_MOVE; procedure WMMove(var aMessage : TWMMove); message WM_MOVE;
procedure WMMoving(var aMessage : TMessage); message WM_MOVING; procedure WMMoving(var aMessage : TMessage); message WM_MOVING;
procedure WMEnterMenuLoop(var aMessage: TMessage); message WM_ENTERMENULOOP; procedure WMEnterMenuLoop(var aMessage: TMessage); message WM_ENTERMENULOOP;
@ -102,6 +113,12 @@ uses
// The HTML file in this demo has a button that shows the contents of 'test.myfunc()' // The HTML file in this demo has a button that shows the contents of 'test.myfunc()'
// which was registered in the GlobalCEFApp.OnWebKitInitialized event. // which was registered in the GlobalCEFApp.OnWebKitInitialized event.
// Destruction steps
// =================
// 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event.
// 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event.
// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form.
procedure GlobalCEFApp_OnWebKitInitializedEvent; procedure GlobalCEFApp_OnWebKitInitializedEvent;
var var
TempExtensionCode : string; TempExtensionCode : string;
@ -135,6 +152,13 @@ begin
PostMessage(Handle, CEF_AFTERCREATED, 0, 0); PostMessage(Handle, CEF_AFTERCREATED, 0, 0);
end; end;
procedure TJSExtensionWithFunctionFrm.Chromium1BeforeClose(Sender: TObject;
const browser: ICefBrowser);
begin
FCanClose := True;
PostMessage(Handle, WM_CLOSE, 0, 0);
end;
procedure TJSExtensionWithFunctionFrm.Chromium1BeforePopup(Sender: TObject; procedure TJSExtensionWithFunctionFrm.Chromium1BeforePopup(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame; const targetUrl, const browser: ICefBrowser; const frame: ICefFrame; const targetUrl,
targetFrameName: ustring; targetDisposition: TCefWindowOpenDisposition; targetFrameName: ustring; targetDisposition: TCefWindowOpenDisposition;
@ -147,6 +171,13 @@ begin
Result := (targetDisposition in [WOD_NEW_FOREGROUND_TAB, WOD_NEW_BACKGROUND_TAB, WOD_NEW_POPUP, WOD_NEW_WINDOW]); Result := (targetDisposition in [WOD_NEW_FOREGROUND_TAB, WOD_NEW_BACKGROUND_TAB, WOD_NEW_POPUP, WOD_NEW_WINDOW]);
end; end;
procedure TJSExtensionWithFunctionFrm.Chromium1Close(Sender: TObject;
const browser: ICefBrowser; out Result: Boolean);
begin
PostMessage(Handle, CEF_DESTROY, 0, 0);
Result := True;
end;
procedure TJSExtensionWithFunctionFrm.Chromium1ProcessMessageReceived( procedure TJSExtensionWithFunctionFrm.Chromium1ProcessMessageReceived(
Sender: TObject; const browser: ICefBrowser; Sender: TObject; const browser: ICefBrowser;
sourceProcess: TCefProcessId; const message: ICefProcessMessage; sourceProcess: TCefProcessId; const message: ICefProcessMessage;
@ -159,6 +190,25 @@ begin
end end
end; end;
procedure TJSExtensionWithFunctionFrm.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
begin
CanClose := FCanClose;
if not(FClosing) then
begin
FClosing := True;
Visible := False;
Chromium1.CloseBrowser(True);
end;
end;
procedure TJSExtensionWithFunctionFrm.FormCreate(Sender: TObject);
begin
FCanClose := False;
FClosing := False;
end;
procedure TJSExtensionWithFunctionFrm.FormShow(Sender: TObject); procedure TJSExtensionWithFunctionFrm.FormShow(Sender: TObject);
begin begin
// GlobalCEFApp.GlobalContextInitialized has to be TRUE before creating any browser // GlobalCEFApp.GlobalContextInitialized has to be TRUE before creating any browser
@ -209,4 +259,9 @@ begin
if (aMessage.wParam = 0) and (GlobalCEFApp <> nil) then GlobalCEFApp.OsmodalLoop := False; if (aMessage.wParam = 0) and (GlobalCEFApp <> nil) then GlobalCEFApp.OsmodalLoop := False;
end; end;
procedure TJSExtensionWithFunctionFrm.BrowserDestroyMsg(var aMessage : TMessage);
begin
CEFWindowParent1.Free;
end;
end. end.

View File

@ -12,6 +12,8 @@ object JSExtensionWithObjectParameterFrm: TJSExtensionWithObjectParameterFrm
Font.Style = [] Font.Style = []
OldCreateOrder = False OldCreateOrder = False
Position = poScreenCenter Position = poScreenCenter
OnCloseQuery = FormCloseQuery
OnCreate = FormCreate
OnShow = FormShow OnShow = FormShow
PixelsPerInch = 96 PixelsPerInch = 96
TextHeight = 13 TextHeight = 13
@ -63,6 +65,8 @@ object JSExtensionWithObjectParameterFrm: TJSExtensionWithObjectParameterFrm
object Chromium1: TChromium object Chromium1: TChromium
OnBeforePopup = Chromium1BeforePopup OnBeforePopup = Chromium1BeforePopup
OnAfterCreated = Chromium1AfterCreated OnAfterCreated = Chromium1AfterCreated
OnBeforeClose = Chromium1BeforeClose
OnClose = Chromium1Close
Left = 32 Left = 32
Top = 224 Top = 224
end end

View File

@ -70,8 +70,19 @@ type
const popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo; const popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo;
var client: ICefClient; var settings: TCefBrowserSettings; var client: ICefClient; var settings: TCefBrowserSettings;
var noJavascriptAccess: Boolean; var Result: Boolean); var noJavascriptAccess: Boolean; var Result: Boolean);
procedure FormCreate(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure Chromium1Close(Sender: TObject; const browser: ICefBrowser;
out Result: Boolean);
procedure Chromium1BeforeClose(Sender: TObject;
const browser: ICefBrowser);
protected protected
// 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 BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED; procedure BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED;
procedure BrowserDestroyMsg(var aMessage : TMessage); message CEF_DESTROY;
procedure WMMove(var aMessage : TWMMove); message WM_MOVE; procedure WMMove(var aMessage : TWMMove); message WM_MOVE;
procedure WMMoving(var aMessage : TMessage); message WM_MOVING; procedure WMMoving(var aMessage : TMessage); message WM_MOVING;
procedure WMEnterMenuLoop(var aMessage: TMessage); message WM_ENTERMENULOOP; procedure WMEnterMenuLoop(var aMessage: TMessage); message WM_ENTERMENULOOP;
@ -101,6 +112,12 @@ uses
// This demo is based in the code comments for the cef_register_extension function in the file // This demo is based in the code comments for the cef_register_extension function in the file
// /include/capi/cef_v8_capi.h // /include/capi/cef_v8_capi.h
// Destruction steps
// =================
// 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event.
// 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event.
// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form.
procedure GlobalCEFApp_OnWebKitInitializedEvent; procedure GlobalCEFApp_OnWebKitInitializedEvent;
var var
TempExtensionCode : string; TempExtensionCode : string;
@ -138,6 +155,13 @@ begin
PostMessage(Handle, CEF_AFTERCREATED, 0, 0); PostMessage(Handle, CEF_AFTERCREATED, 0, 0);
end; end;
procedure TJSExtensionWithObjectParameterFrm.Chromium1BeforeClose(
Sender: TObject; const browser: ICefBrowser);
begin
FCanClose := True;
PostMessage(Handle, WM_CLOSE, 0, 0);
end;
procedure TJSExtensionWithObjectParameterFrm.Chromium1BeforePopup( procedure TJSExtensionWithObjectParameterFrm.Chromium1BeforePopup(
Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame;
const targetUrl, targetFrameName: ustring; const targetUrl, targetFrameName: ustring;
@ -150,6 +174,32 @@ begin
Result := (targetDisposition in [WOD_NEW_FOREGROUND_TAB, WOD_NEW_BACKGROUND_TAB, WOD_NEW_POPUP, WOD_NEW_WINDOW]); Result := (targetDisposition in [WOD_NEW_FOREGROUND_TAB, WOD_NEW_BACKGROUND_TAB, WOD_NEW_POPUP, WOD_NEW_WINDOW]);
end; end;
procedure TJSExtensionWithObjectParameterFrm.Chromium1Close(
Sender: TObject; const browser: ICefBrowser; out Result: Boolean);
begin
PostMessage(Handle, CEF_DESTROY, 0, 0);
Result := True;
end;
procedure TJSExtensionWithObjectParameterFrm.FormCloseQuery(
Sender: TObject; var CanClose: Boolean);
begin
CanClose := FCanClose;
if not(FClosing) then
begin
FClosing := True;
Visible := False;
Chromium1.CloseBrowser(True);
end;
end;
procedure TJSExtensionWithObjectParameterFrm.FormCreate(Sender: TObject);
begin
FCanClose := False;
FClosing := False;
end;
procedure TJSExtensionWithObjectParameterFrm.FormShow(Sender: TObject); procedure TJSExtensionWithObjectParameterFrm.FormShow(Sender: TObject);
begin begin
// GlobalCEFApp.GlobalContextInitialized has to be TRUE before creating any browser // GlobalCEFApp.GlobalContextInitialized has to be TRUE before creating any browser
@ -200,4 +250,9 @@ begin
GoBtn.Click; GoBtn.Click;
end; end;
procedure TJSExtensionWithObjectParameterFrm.BrowserDestroyMsg(var aMessage : TMessage);
begin
CEFWindowParent1.Free;
end;
end. end.

View File

@ -12,6 +12,8 @@ object JSRTTIExtensionFrm: TJSRTTIExtensionFrm
Font.Style = [] Font.Style = []
OldCreateOrder = False OldCreateOrder = False
Position = poScreenCenter Position = poScreenCenter
OnCloseQuery = FormCloseQuery
OnCreate = FormCreate
OnShow = FormShow OnShow = FormShow
PixelsPerInch = 96 PixelsPerInch = 96
TextHeight = 13 TextHeight = 13
@ -76,6 +78,8 @@ object JSRTTIExtensionFrm: TJSRTTIExtensionFrm
OnContextMenuCommand = Chromium1ContextMenuCommand OnContextMenuCommand = Chromium1ContextMenuCommand
OnBeforePopup = Chromium1BeforePopup OnBeforePopup = Chromium1BeforePopup
OnAfterCreated = Chromium1AfterCreated OnAfterCreated = Chromium1AfterCreated
OnBeforeClose = Chromium1BeforeClose
OnClose = Chromium1Close
Left = 32 Left = 32
Top = 224 Top = 224
end end

View File

@ -90,10 +90,20 @@ type
const popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo; const popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo;
var client: ICefClient; var settings: TCefBrowserSettings; var client: ICefClient; var settings: TCefBrowserSettings;
var noJavascriptAccess: Boolean; var Result: Boolean); var noJavascriptAccess: Boolean; var Result: Boolean);
procedure FormCreate(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure Chromium1Close(Sender: TObject; const browser: ICefBrowser;
out Result: Boolean);
procedure Chromium1BeforeClose(Sender: TObject;
const browser: ICefBrowser);
protected protected
FText : string; FText : string;
// 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 BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED; procedure BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED;
procedure BrowserDestroyMsg(var aMessage : TMessage); message CEF_DESTROY;
procedure ShowTextViewerMsg(var aMessage : TMessage); message MINIBROWSER_SHOWTEXTVIEWER; procedure ShowTextViewerMsg(var aMessage : TMessage); message MINIBROWSER_SHOWTEXTVIEWER;
procedure WMMove(var aMessage : TWMMove); message WM_MOVE; procedure WMMove(var aMessage : TWMMove); message WM_MOVE;
procedure WMMoving(var aMessage : TMessage); message WM_MOVING; procedure WMMoving(var aMessage : TMessage); message WM_MOVING;
@ -131,6 +141,12 @@ uses
// Even if you create several TChromium objects you should have no problem because each of them will have its own // Even if you create several TChromium objects you should have no problem because each of them will have its own
// TChromium.OnProcessMessageReceived event to receive the messages from the extension. // TChromium.OnProcessMessageReceived event to receive the messages from the extension.
// Destruction steps
// =================
// 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event.
// 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event.
// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form.
procedure GlobalCEFApp_OnWebKitInitialized; procedure GlobalCEFApp_OnWebKitInitialized;
begin begin
{$IFDEF DELPHI14_UP} {$IFDEF DELPHI14_UP}
@ -279,4 +295,42 @@ begin
GoBtn.Click; GoBtn.Click;
end; end;
procedure TJSRTTIExtensionFrm.Chromium1BeforeClose(
Sender: TObject; const browser: ICefBrowser);
begin
FCanClose := True;
PostMessage(Handle, WM_CLOSE, 0, 0);
end;
procedure TJSRTTIExtensionFrm.Chromium1Close(
Sender: TObject; const browser: ICefBrowser; out Result: Boolean);
begin
PostMessage(Handle, CEF_DESTROY, 0, 0);
Result := True;
end;
procedure TJSRTTIExtensionFrm.FormCloseQuery(
Sender: TObject; var CanClose: Boolean);
begin
CanClose := FCanClose;
if not(FClosing) then
begin
FClosing := True;
Visible := False;
Chromium1.CloseBrowser(True);
end;
end;
procedure TJSRTTIExtensionFrm.FormCreate(Sender: TObject);
begin
FCanClose := False;
FClosing := False;
end;
procedure TJSRTTIExtensionFrm.BrowserDestroyMsg(var aMessage : TMessage);
begin
CEFWindowParent1.Free;
end;
end. end.

View File

@ -12,6 +12,8 @@ object JSSimpleExtensionFrm: TJSSimpleExtensionFrm
Font.Style = [] Font.Style = []
OldCreateOrder = False OldCreateOrder = False
Position = poScreenCenter Position = poScreenCenter
OnCloseQuery = FormCloseQuery
OnCreate = FormCreate
OnShow = FormShow OnShow = FormShow
PixelsPerInch = 96 PixelsPerInch = 96
TextHeight = 13 TextHeight = 13
@ -63,6 +65,8 @@ object JSSimpleExtensionFrm: TJSSimpleExtensionFrm
object Chromium1: TChromium object Chromium1: TChromium
OnBeforePopup = Chromium1BeforePopup OnBeforePopup = Chromium1BeforePopup
OnAfterCreated = Chromium1AfterCreated OnAfterCreated = Chromium1AfterCreated
OnBeforeClose = Chromium1BeforeClose
OnClose = Chromium1Close
Left = 32 Left = 32
Top = 224 Top = 224
end end

View File

@ -70,8 +70,19 @@ type
const popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo; const popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo;
var client: ICefClient; var settings: TCefBrowserSettings; var client: ICefClient; var settings: TCefBrowserSettings;
var noJavascriptAccess: Boolean; var Result: Boolean); var noJavascriptAccess: Boolean; var Result: Boolean);
procedure FormCreate(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure Chromium1Close(Sender: TObject; const browser: ICefBrowser;
out Result: Boolean);
procedure Chromium1BeforeClose(Sender: TObject;
const browser: ICefBrowser);
protected protected
// 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 BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED; procedure BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED;
procedure BrowserDestroyMsg(var aMessage : TMessage); message CEF_DESTROY;
procedure WMMove(var aMessage : TWMMove); message WM_MOVE; procedure WMMove(var aMessage : TWMMove); message WM_MOVE;
procedure WMMoving(var aMessage : TMessage); message WM_MOVING; procedure WMMoving(var aMessage : TMessage); message WM_MOVING;
procedure WMEnterMenuLoop(var aMessage: TMessage); message WM_ENTERMENULOOP; procedure WMEnterMenuLoop(var aMessage: TMessage); message WM_ENTERMENULOOP;
@ -98,6 +109,12 @@ uses
// The HTML file in this demo has a button that shows the contents of 'test.myval' // The HTML file in this demo has a button that shows the contents of 'test.myval'
// which was registered in the GlobalCEFApp.OnWebKitInitialized event. // which was registered in the GlobalCEFApp.OnWebKitInitialized event.
// Destruction steps
// =================
// 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event.
// 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event.
// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form.
procedure GlobalCEFApp_OnWebKitInitializedEvent; procedure GlobalCEFApp_OnWebKitInitializedEvent;
var var
TempExtensionCode : string; TempExtensionCode : string;
@ -187,4 +204,42 @@ begin
if (aMessage.wParam = 0) and (GlobalCEFApp <> nil) then GlobalCEFApp.OsmodalLoop := False; if (aMessage.wParam = 0) and (GlobalCEFApp <> nil) then GlobalCEFApp.OsmodalLoop := False;
end; end;
procedure TJSSimpleExtensionFrm.Chromium1BeforeClose(
Sender: TObject; const browser: ICefBrowser);
begin
FCanClose := True;
PostMessage(Handle, WM_CLOSE, 0, 0);
end;
procedure TJSSimpleExtensionFrm.Chromium1Close(
Sender: TObject; const browser: ICefBrowser; out Result: Boolean);
begin
PostMessage(Handle, CEF_DESTROY, 0, 0);
Result := True;
end;
procedure TJSSimpleExtensionFrm.FormCloseQuery(
Sender: TObject; var CanClose: Boolean);
begin
CanClose := FCanClose;
if not(FClosing) then
begin
FClosing := True;
Visible := False;
Chromium1.CloseBrowser(True);
end;
end;
procedure TJSSimpleExtensionFrm.FormCreate(Sender: TObject);
begin
FCanClose := False;
FClosing := False;
end;
procedure TJSSimpleExtensionFrm.BrowserDestroyMsg(var aMessage : TMessage);
begin
CEFWindowParent1.Free;
end;
end. end.

View File

@ -12,6 +12,8 @@ object JSSimpleWindowBindingFrm: TJSSimpleWindowBindingFrm
Font.Style = [] Font.Style = []
OldCreateOrder = False OldCreateOrder = False
Position = poScreenCenter Position = poScreenCenter
OnCloseQuery = FormCloseQuery
OnCreate = FormCreate
OnShow = FormShow OnShow = FormShow
PixelsPerInch = 96 PixelsPerInch = 96
TextHeight = 13 TextHeight = 13
@ -63,6 +65,8 @@ object JSSimpleWindowBindingFrm: TJSSimpleWindowBindingFrm
object Chromium1: TChromium object Chromium1: TChromium
OnBeforePopup = Chromium1BeforePopup OnBeforePopup = Chromium1BeforePopup
OnAfterCreated = Chromium1AfterCreated OnAfterCreated = Chromium1AfterCreated
OnBeforeClose = Chromium1BeforeClose
OnClose = Chromium1Close
Left = 32 Left = 32
Top = 224 Top = 224
end end

View File

@ -71,8 +71,19 @@ type
const popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo; const popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo;
var client: ICefClient; var settings: TCefBrowserSettings; var client: ICefClient; var settings: TCefBrowserSettings;
var noJavascriptAccess: Boolean; var Result: Boolean); var noJavascriptAccess: Boolean; var Result: Boolean);
procedure FormCreate(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure Chromium1Close(Sender: TObject; const browser: ICefBrowser;
out Result: Boolean);
procedure Chromium1BeforeClose(Sender: TObject;
const browser: ICefBrowser);
protected protected
// 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 BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED; procedure BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED;
procedure BrowserDestroyMsg(var aMessage : TMessage); message CEF_DESTROY;
procedure WMMove(var aMessage : TWMMove); message WM_MOVE; procedure WMMove(var aMessage : TWMMove); message WM_MOVE;
procedure WMMoving(var aMessage : TMessage); message WM_MOVING; procedure WMMoving(var aMessage : TMessage); message WM_MOVING;
procedure WMEnterMenuLoop(var aMessage: TMessage); message WM_ENTERMENULOOP; procedure WMEnterMenuLoop(var aMessage: TMessage); message WM_ENTERMENULOOP;
@ -96,6 +107,12 @@ implementation
// The HTML file in this demo has a button that shows the contents of 'window.myval' // The HTML file in this demo has a button that shows the contents of 'window.myval'
// which was set in the GlobalCEFApp.OnContextCreated event. // which was set in the GlobalCEFApp.OnContextCreated event.
// Destruction steps
// =================
// 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event.
// 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event.
// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form.
procedure GlobalCEFApp_OnContextCreated(const browser: ICefBrowser; const frame: ICefFrame; const context: ICefv8Context); procedure GlobalCEFApp_OnContextCreated(const browser: ICefBrowser; const frame: ICefFrame; const context: ICefv8Context);
var var
TempValue : ICEFv8Value; TempValue : ICEFv8Value;
@ -180,4 +197,42 @@ begin
if (aMessage.wParam = 0) and (GlobalCEFApp <> nil) then GlobalCEFApp.OsmodalLoop := False; if (aMessage.wParam = 0) and (GlobalCEFApp <> nil) then GlobalCEFApp.OsmodalLoop := False;
end; end;
procedure TJSSimpleWindowBindingFrm.Chromium1BeforeClose(
Sender: TObject; const browser: ICefBrowser);
begin
FCanClose := True;
PostMessage(Handle, WM_CLOSE, 0, 0);
end;
procedure TJSSimpleWindowBindingFrm.Chromium1Close(
Sender: TObject; const browser: ICefBrowser; out Result: Boolean);
begin
PostMessage(Handle, CEF_DESTROY, 0, 0);
Result := True;
end;
procedure TJSSimpleWindowBindingFrm.FormCloseQuery(
Sender: TObject; var CanClose: Boolean);
begin
CanClose := FCanClose;
if not(FClosing) then
begin
FClosing := True;
Visible := False;
Chromium1.CloseBrowser(True);
end;
end;
procedure TJSSimpleWindowBindingFrm.FormCreate(Sender: TObject);
begin
FCanClose := False;
FClosing := False;
end;
procedure TJSSimpleWindowBindingFrm.BrowserDestroyMsg(var aMessage : TMessage);
begin
CEFWindowParent1.Free;
end;
end. end.

View File

@ -12,6 +12,8 @@ object JSSimpleWindowBindingFrm: TJSSimpleWindowBindingFrm
Font.Style = [] Font.Style = []
OldCreateOrder = False OldCreateOrder = False
Position = poScreenCenter Position = poScreenCenter
OnCloseQuery = FormCloseQuery
OnCreate = FormCreate
OnShow = FormShow OnShow = FormShow
PixelsPerInch = 96 PixelsPerInch = 96
TextHeight = 13 TextHeight = 13
@ -63,6 +65,8 @@ object JSSimpleWindowBindingFrm: TJSSimpleWindowBindingFrm
object Chromium1: TChromium object Chromium1: TChromium
OnBeforePopup = Chromium1BeforePopup OnBeforePopup = Chromium1BeforePopup
OnAfterCreated = Chromium1AfterCreated OnAfterCreated = Chromium1AfterCreated
OnBeforeClose = Chromium1BeforeClose
OnClose = Chromium1Close
Left = 32 Left = 32
Top = 224 Top = 224
end end

View File

@ -71,8 +71,20 @@ type
const popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo; const popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo;
var client: ICefClient; var settings: TCefBrowserSettings; var client: ICefClient; var settings: TCefBrowserSettings;
var noJavascriptAccess: Boolean; var Result: Boolean); var noJavascriptAccess: Boolean; var Result: Boolean);
procedure FormCreate(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure Chromium1Close(Sender: TObject; const browser: ICefBrowser;
out Result: Boolean);
procedure Chromium1BeforeClose(Sender: TObject;
const browser: ICefBrowser);
protected protected
FText : string;
// 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 BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED; procedure BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED;
procedure BrowserDestroyMsg(var aMessage : TMessage); message CEF_DESTROY;
procedure WMMove(var aMessage : TWMMove); message WM_MOVE; procedure WMMove(var aMessage : TWMMove); message WM_MOVE;
procedure WMMoving(var aMessage : TMessage); message WM_MOVING; procedure WMMoving(var aMessage : TMessage); message WM_MOVING;
procedure WMEnterMenuLoop(var aMessage: TMessage); message WM_ENTERMENULOOP; procedure WMEnterMenuLoop(var aMessage: TMessage); message WM_ENTERMENULOOP;
@ -94,6 +106,12 @@ implementation
// The HTML file in this demo has a button that shows the contents of 'window.myval' // The HTML file in this demo has a button that shows the contents of 'window.myval'
// which was set in the GlobalCEFApp.OnContextCreated event. // which was set in the GlobalCEFApp.OnContextCreated event.
// Destruction steps
// =================
// 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event.
// 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event.
// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form.
procedure TJSSimpleWindowBindingFrm.GoBtnClick(Sender: TObject); procedure TJSSimpleWindowBindingFrm.GoBtnClick(Sender: TObject);
begin begin
Chromium1.LoadURL(Edit1.Text); Chromium1.LoadURL(Edit1.Text);
@ -166,4 +184,42 @@ begin
if (aMessage.wParam = 0) and (GlobalCEFApp <> nil) then GlobalCEFApp.OsmodalLoop := False; if (aMessage.wParam = 0) and (GlobalCEFApp <> nil) then GlobalCEFApp.OsmodalLoop := False;
end; end;
procedure TJSSimpleWindowBindingFrm.Chromium1BeforeClose(
Sender: TObject; const browser: ICefBrowser);
begin
FCanClose := True;
PostMessage(Handle, WM_CLOSE, 0, 0);
end;
procedure TJSSimpleWindowBindingFrm.Chromium1Close(
Sender: TObject; const browser: ICefBrowser; out Result: Boolean);
begin
PostMessage(Handle, CEF_DESTROY, 0, 0);
Result := True;
end;
procedure TJSSimpleWindowBindingFrm.FormCloseQuery(
Sender: TObject; var CanClose: Boolean);
begin
CanClose := FCanClose;
if not(FClosing) then
begin
FClosing := True;
Visible := False;
Chromium1.CloseBrowser(True);
end;
end;
procedure TJSSimpleWindowBindingFrm.FormCreate(Sender: TObject);
begin
FCanClose := False;
FClosing := False;
end;
procedure TJSSimpleWindowBindingFrm.BrowserDestroyMsg(var aMessage : TMessage);
begin
CEFWindowParent1.Free;
end;
end. end.

View File

@ -12,6 +12,8 @@ object JSWindowBindingWithFunctionFrm: TJSWindowBindingWithFunctionFrm
Font.Style = [] Font.Style = []
OldCreateOrder = False OldCreateOrder = False
Position = poScreenCenter Position = poScreenCenter
OnCloseQuery = FormCloseQuery
OnCreate = FormCreate
OnShow = FormShow OnShow = FormShow
PixelsPerInch = 96 PixelsPerInch = 96
TextHeight = 13 TextHeight = 13
@ -63,6 +65,8 @@ object JSWindowBindingWithFunctionFrm: TJSWindowBindingWithFunctionFrm
object Chromium1: TChromium object Chromium1: TChromium
OnBeforePopup = Chromium1BeforePopup OnBeforePopup = Chromium1BeforePopup
OnAfterCreated = Chromium1AfterCreated OnAfterCreated = Chromium1AfterCreated
OnBeforeClose = Chromium1BeforeClose
OnClose = Chromium1Close
Left = 32 Left = 32
Top = 224 Top = 224
end end

View File

@ -70,8 +70,19 @@ type
const popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo; const popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo;
var client: ICefClient; var settings: TCefBrowserSettings; var client: ICefClient; var settings: TCefBrowserSettings;
var noJavascriptAccess: Boolean; var Result: Boolean); var noJavascriptAccess: Boolean; var Result: Boolean);
procedure FormCreate(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure Chromium1Close(Sender: TObject; const browser: ICefBrowser;
out Result: Boolean);
procedure Chromium1BeforeClose(Sender: TObject;
const browser: ICefBrowser);
protected protected
// 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 BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED; procedure BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED;
procedure BrowserDestroyMsg(var aMessage : TMessage); message CEF_DESTROY;
procedure WMMove(var aMessage : TWMMove); message WM_MOVE; procedure WMMove(var aMessage : TWMMove); message WM_MOVE;
procedure WMMoving(var aMessage : TMessage); message WM_MOVING; procedure WMMoving(var aMessage : TMessage); message WM_MOVING;
procedure WMEnterMenuLoop(var aMessage: TMessage); message WM_ENTERMENULOOP; procedure WMEnterMenuLoop(var aMessage: TMessage); message WM_ENTERMENULOOP;
@ -98,6 +109,12 @@ uses
// The HTML file in this demo has a button that shows the result of 'window.myfunc()' // The HTML file in this demo has a button that shows the result of 'window.myfunc()'
// which was set in the GlobalCEFApp.OnContextCreated event. // which was set in the GlobalCEFApp.OnContextCreated event.
// Destruction steps
// =================
// 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event.
// 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event.
// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form.
procedure GlobalCEFApp_OnContextCreated(const browser: ICefBrowser; const frame: ICefFrame; const context: ICefv8Context); procedure GlobalCEFApp_OnContextCreated(const browser: ICefBrowser; const frame: ICefFrame; const context: ICefv8Context);
var var
TempHandler : ICefv8Handler; TempHandler : ICefv8Handler;
@ -184,4 +201,42 @@ begin
if (aMessage.wParam = 0) and (GlobalCEFApp <> nil) then GlobalCEFApp.OsmodalLoop := False; if (aMessage.wParam = 0) and (GlobalCEFApp <> nil) then GlobalCEFApp.OsmodalLoop := False;
end; end;
procedure TJSWindowBindingWithFunctionFrm.Chromium1BeforeClose(
Sender: TObject; const browser: ICefBrowser);
begin
FCanClose := True;
PostMessage(Handle, WM_CLOSE, 0, 0);
end;
procedure TJSWindowBindingWithFunctionFrm.Chromium1Close(
Sender: TObject; const browser: ICefBrowser; out Result: Boolean);
begin
PostMessage(Handle, CEF_DESTROY, 0, 0);
Result := True;
end;
procedure TJSWindowBindingWithFunctionFrm.FormCloseQuery(
Sender: TObject; var CanClose: Boolean);
begin
CanClose := FCanClose;
if not(FClosing) then
begin
FClosing := True;
Visible := False;
Chromium1.CloseBrowser(True);
end;
end;
procedure TJSWindowBindingWithFunctionFrm.FormCreate(Sender: TObject);
begin
FCanClose := False;
FClosing := False;
end;
procedure TJSWindowBindingWithFunctionFrm.BrowserDestroyMsg(var aMessage : TMessage);
begin
CEFWindowParent1.Free;
end;
end. end.

View File

@ -12,6 +12,8 @@ object JSWindowBindingWithObjectFrm: TJSWindowBindingWithObjectFrm
Font.Style = [] Font.Style = []
OldCreateOrder = False OldCreateOrder = False
Position = poScreenCenter Position = poScreenCenter
OnCloseQuery = FormCloseQuery
OnCreate = FormCreate
OnShow = FormShow OnShow = FormShow
PixelsPerInch = 96 PixelsPerInch = 96
TextHeight = 13 TextHeight = 13
@ -63,6 +65,8 @@ object JSWindowBindingWithObjectFrm: TJSWindowBindingWithObjectFrm
object Chromium1: TChromium object Chromium1: TChromium
OnBeforePopup = Chromium1BeforePopup OnBeforePopup = Chromium1BeforePopup
OnAfterCreated = Chromium1AfterCreated OnAfterCreated = Chromium1AfterCreated
OnBeforeClose = Chromium1BeforeClose
OnClose = Chromium1Close
Left = 32 Left = 32
Top = 224 Top = 224
end end

View File

@ -70,8 +70,19 @@ type
const popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo; const popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo;
var client: ICefClient; var settings: TCefBrowserSettings; var client: ICefClient; var settings: TCefBrowserSettings;
var noJavascriptAccess: Boolean; var Result: Boolean); var noJavascriptAccess: Boolean; var Result: Boolean);
procedure FormCreate(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure Chromium1Close(Sender: TObject; const browser: ICefBrowser;
out Result: Boolean);
procedure Chromium1BeforeClose(Sender: TObject;
const browser: ICefBrowser);
protected protected
// 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 BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED; procedure BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED;
procedure BrowserDestroyMsg(var aMessage : TMessage); message CEF_DESTROY;
procedure WMMove(var aMessage : TWMMove); message WM_MOVE; procedure WMMove(var aMessage : TWMMove); message WM_MOVE;
procedure WMMoving(var aMessage : TMessage); message WM_MOVING; procedure WMMoving(var aMessage : TMessage); message WM_MOVING;
procedure WMEnterMenuLoop(var aMessage: TMessage); message WM_ENTERMENULOOP; procedure WMEnterMenuLoop(var aMessage: TMessage); message WM_ENTERMENULOOP;
@ -98,6 +109,12 @@ uses
// The HTML file in this demo has a button that shows the contents of 'window.myobj.myval' // The HTML file in this demo has a button that shows the contents of 'window.myobj.myval'
// which was set in the GlobalCEFApp.OnContextCreated event. // which was set in the GlobalCEFApp.OnContextCreated event.
// Destruction steps
// =================
// 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event.
// 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event.
// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form.
procedure GlobalCEFApp_OnContextCreated(const browser: ICefBrowser; const frame: ICefFrame; const context: ICefv8Context); procedure GlobalCEFApp_OnContextCreated(const browser: ICefBrowser; const frame: ICefFrame; const context: ICefv8Context);
var var
TempAccessor : ICefV8Accessor; TempAccessor : ICefV8Accessor;
@ -185,4 +202,42 @@ begin
if (aMessage.wParam = 0) and (GlobalCEFApp <> nil) then GlobalCEFApp.OsmodalLoop := False; if (aMessage.wParam = 0) and (GlobalCEFApp <> nil) then GlobalCEFApp.OsmodalLoop := False;
end; end;
procedure TJSWindowBindingWithObjectFrm.Chromium1BeforeClose(
Sender: TObject; const browser: ICefBrowser);
begin
FCanClose := True;
PostMessage(Handle, WM_CLOSE, 0, 0);
end;
procedure TJSWindowBindingWithObjectFrm.Chromium1Close(
Sender: TObject; const browser: ICefBrowser; out Result: Boolean);
begin
PostMessage(Handle, CEF_DESTROY, 0, 0);
Result := True;
end;
procedure TJSWindowBindingWithObjectFrm.FormCloseQuery(
Sender: TObject; var CanClose: Boolean);
begin
CanClose := FCanClose;
if not(FClosing) then
begin
FClosing := True;
Visible := False;
Chromium1.CloseBrowser(True);
end;
end;
procedure TJSWindowBindingWithObjectFrm.FormCreate(Sender: TObject);
begin
FCanClose := False;
FClosing := False;
end;
procedure TJSWindowBindingWithObjectFrm.BrowserDestroyMsg(var aMessage : TMessage);
begin
CEFWindowParent1.Free;
end;
end. end.

View File

@ -240,6 +240,12 @@ object MiniBrowserFrm: TMiniBrowserFrm
end end
item item
Width = 500 Width = 500
end
item
Width = 100
end
item
Width = 100
end> end>
end end
object Chromium1: TChromium object Chromium1: TChromium
@ -247,6 +253,7 @@ object MiniBrowserFrm: TMiniBrowserFrm
OnPdfPrintFinished = Chromium1PdfPrintFinished OnPdfPrintFinished = Chromium1PdfPrintFinished
OnPrefsAvailable = Chromium1PrefsAvailable OnPrefsAvailable = Chromium1PrefsAvailable
OnResolvedHostAvailable = Chromium1ResolvedHostAvailable OnResolvedHostAvailable = Chromium1ResolvedHostAvailable
OnRenderCompMsg = Chromium1RenderCompMsg
OnLoadingStateChange = Chromium1LoadingStateChange OnLoadingStateChange = Chromium1LoadingStateChange
OnBeforeContextMenu = Chromium1BeforeContextMenu OnBeforeContextMenu = Chromium1BeforeContextMenu
OnContextMenuCommand = Chromium1ContextMenuCommand OnContextMenuCommand = Chromium1ContextMenuCommand
@ -259,6 +266,8 @@ object MiniBrowserFrm: TMiniBrowserFrm
OnBeforeDownload = Chromium1BeforeDownload OnBeforeDownload = Chromium1BeforeDownload
OnDownloadUpdated = Chromium1DownloadUpdated OnDownloadUpdated = Chromium1DownloadUpdated
OnAfterCreated = Chromium1AfterCreated OnAfterCreated = Chromium1AfterCreated
OnBeforeClose = Chromium1BeforeClose
OnClose = Chromium1Close
OnBeforeResourceLoad = Chromium1BeforeResourceLoad OnBeforeResourceLoad = Chromium1BeforeResourceLoad
OnResourceResponse = Chromium1ResourceResponse OnResourceResponse = Chromium1ResourceResponse
Left = 32 Left = 32

View File

@ -186,11 +186,18 @@ type
const request: ICefRequest; const callback: ICefRequestCallback; const request: ICefRequest; const callback: ICefRequestCallback;
out Result: TCefReturnValue); out Result: TCefReturnValue);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure Chromium1Close(Sender: TObject; const browser: ICefBrowser;
out Result: Boolean);
procedure Chromium1BeforeClose(Sender: TObject;
const browser: ICefBrowser);
procedure Chromium1RenderCompMsg(var aMessage : TMessage; var aHandled: Boolean);
protected protected
FResponse : TStringList; FResponse : TStringList;
FRequest : TStringList; FRequest : TStringList;
FClosing : boolean; // 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 AddURL(const aURL : string); procedure AddURL(const aURL : string);
@ -205,6 +212,7 @@ type
procedure InspectResponse(const aResponse : ICefResponse); procedure InspectResponse(const aResponse : ICefResponse);
procedure BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED; procedure BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED;
procedure BrowserDestroyMsg(var aMessage : TMessage); message CEF_DESTROY;
procedure ShowDevToolsMsg(var aMessage : TMessage); message MINIBROWSER_SHOWDEVTOOLS; procedure ShowDevToolsMsg(var aMessage : TMessage); message MINIBROWSER_SHOWDEVTOOLS;
procedure HideDevToolsMsg(var aMessage : TMessage); message MINIBROWSER_HIDEDEVTOOLS; procedure HideDevToolsMsg(var aMessage : TMessage); message MINIBROWSER_HIDEDEVTOOLS;
procedure CopyAllTextMsg(var aMessage : TMessage); message MINIBROWSER_COPYALLTEXT; procedure CopyAllTextMsg(var aMessage : TMessage); message MINIBROWSER_COPYALLTEXT;
@ -234,6 +242,12 @@ implementation
uses uses
uPreferences, uCefStringMultimap, uSimpleTextViewer; uPreferences, uCefStringMultimap, uSimpleTextViewer;
// Destruction steps
// =================
// 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event.
// 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event.
// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form.
procedure TMiniBrowserFrm.BackBtnClick(Sender: TObject); procedure TMiniBrowserFrm.BackBtnClick(Sender: TObject);
begin begin
Chromium1.GoBack; Chromium1.GoBack;
@ -276,7 +290,18 @@ end;
procedure TMiniBrowserFrm.Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); procedure TMiniBrowserFrm.Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser);
begin begin
if Chromium1.IsSameBrowser(browser) then if Chromium1.IsSameBrowser(browser) then
PostMessage(Handle, CEF_AFTERCREATED, 0, 0); PostMessage(Handle, CEF_AFTERCREATED, 0, 0)
else
SendMessage(browser.Host.WindowHandle, WM_SETICON, 1, application.Icon.Handle); // Use the same icon in the popup window
end;
procedure TMiniBrowserFrm.Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser);
begin
if (Chromium1.BrowserId = 0) then // The main browser is being destroyed
begin
FCanClose := True;
PostMessage(Handle, WM_CLOSE, 0, 0);
end;
end; end;
procedure TMiniBrowserFrm.Chromium1BeforeContextMenu(Sender: TObject; procedure TMiniBrowserFrm.Chromium1BeforeContextMenu(Sender: TObject;
@ -369,6 +394,17 @@ begin
InspectRequest(request); InspectRequest(request);
end; end;
procedure TMiniBrowserFrm.Chromium1Close(Sender: TObject; const browser: ICefBrowser; out Result: Boolean);
begin
if (browser <> nil) and (Chromium1.BrowserId = browser.Identifier) then
begin
PostMessage(Handle, CEF_DESTROY, 0, 0);
Result := True;
end
else
Result := False;
end;
procedure TMiniBrowserFrm.Chromium1ContextMenuCommand(Sender: TObject; procedure TMiniBrowserFrm.Chromium1ContextMenuCommand(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame; const browser: ICefBrowser; const frame: ICefFrame;
const params: ICefContextMenuParams; commandId: Integer; const params: ICefContextMenuParams; commandId: Integer;
@ -617,6 +653,15 @@ begin
isKeyboardShortcut := True; isKeyboardShortcut := True;
end; end;
procedure TMiniBrowserFrm.Chromium1RenderCompMsg(var aMessage : TMessage; var aHandled: Boolean);
begin
if not(FClosing) and (aMessage.Msg = WM_MOUSEMOVE) then
begin
StatusBar1.Panels[2].Text := 'x : ' + inttostr(aMessage.lParam and $FFFF);
StatusBar1.Panels[3].Text := 'y : ' + inttostr((aMessage.lParam and $FFFF0000) shr 16);
end;
end;
procedure TMiniBrowserFrm.Chromium1ResolvedHostAvailable(Sender: TObject; procedure TMiniBrowserFrm.Chromium1ResolvedHostAvailable(Sender: TObject;
result: Integer; const resolvedIps: TStrings); result: Integer; const resolvedIps: TStrings);
begin begin
@ -720,12 +765,19 @@ end;
procedure TMiniBrowserFrm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); procedure TMiniBrowserFrm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin begin
FClosing := True; CanClose := FCanClose;
CanClose := True;
if not(FClosing) then
begin
FClosing := True;
Visible := False;
Chromium1.CloseBrowser(True);
end;
end; end;
procedure TMiniBrowserFrm.FormCreate(Sender: TObject); procedure TMiniBrowserFrm.FormCreate(Sender: TObject);
begin begin
FCanClose := False;
FClosing := False; FClosing := False;
FResponse := TStringList.Create; FResponse := TStringList.Create;
FRequest := TStringList.Create; FRequest := TStringList.Create;
@ -767,6 +819,11 @@ begin
Chromium1.LoadURL(MINIBROWSER_HOMEPAGE); Chromium1.LoadURL(MINIBROWSER_HOMEPAGE);
end; end;
procedure TMiniBrowserFrm.BrowserDestroyMsg(var aMessage : TMessage);
begin
CEFWindowParent1.Free;
end;
procedure TMiniBrowserFrm.AddURL(const aURL : string); procedure TMiniBrowserFrm.AddURL(const aURL : string);
begin begin
if (URLCbx.Items.IndexOf(aURL) < 0) then URLCbx.Items.Add(aURL); if (URLCbx.Items.IndexOf(aURL) < 0) then URLCbx.Items.Add(aURL);

View File

@ -12,6 +12,7 @@ object ResponseFilterBrowserFrm: TResponseFilterBrowserFrm
Font.Style = [] Font.Style = []
OldCreateOrder = False OldCreateOrder = False
Position = poScreenCenter Position = poScreenCenter
OnCloseQuery = FormCloseQuery
OnCreate = FormCreate OnCreate = FormCreate
OnDestroy = FormDestroy OnDestroy = FormDestroy
OnShow = FormShow OnShow = FormShow
@ -120,6 +121,8 @@ object ResponseFilterBrowserFrm: TResponseFilterBrowserFrm
object Chromium1: TChromium object Chromium1: TChromium
OnBeforePopup = Chromium1BeforePopup OnBeforePopup = Chromium1BeforePopup
OnAfterCreated = Chromium1AfterCreated OnAfterCreated = Chromium1AfterCreated
OnBeforeClose = Chromium1BeforeClose
OnClose = Chromium1Close
OnGetResourceResponseFilter = Chromium1GetResourceResponseFilter OnGetResourceResponseFilter = Chromium1GetResourceResponseFilter
OnResourceLoadComplete = Chromium1ResourceLoadComplete OnResourceLoadComplete = Chromium1ResourceLoadComplete
Left = 56 Left = 56

View File

@ -82,18 +82,27 @@ type
const popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo; const popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo;
var client: ICefClient; var settings: TCefBrowserSettings; var client: ICefClient; var settings: TCefBrowserSettings;
var noJavascriptAccess: Boolean; var Result: Boolean); var noJavascriptAccess: Boolean; var Result: Boolean);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure Chromium1Close(Sender: TObject; const browser: ICefBrowser;
out Result: Boolean);
procedure Chromium1BeforeClose(Sender: TObject;
const browser: ICefBrowser);
protected protected
FFilter : ICefResponseFilter; // CEF Filter interface that receives the resource contents FFilter : ICefResponseFilter; // CEF Filter interface that receives the resource contents
FStream : TMemoryStream; // TMemoryStream to hold the resource contents FStream : TMemoryStream; // TMemoryStream to hold the resource contents
FStreamCS : TCriticalSection; // Critical section used to protect the memory stream FStreamCS : TCriticalSection; // Critical section used to protect the memory stream
FRscSize : int64; // size of the resource if the server sends the Content-Length header FRscSize : int64; // size of the resource if the server sends the Content-Length header
FRscCompleted : boolean; // This variable will be used to handle the results only once. FRscCompleted : boolean; // This variable will be used to handle the results only once.
// 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 WMMove(var aMessage : TWMMove); message WM_MOVE; procedure WMMove(var aMessage : TWMMove); message WM_MOVE;
procedure WMMoving(var aMessage : TMessage); message WM_MOVING; procedure WMMoving(var aMessage : TMessage); message WM_MOVING;
procedure WMEnterMenuLoop(var aMessage: TMessage); message WM_ENTERMENULOOP; procedure WMEnterMenuLoop(var aMessage: TMessage); message WM_ENTERMENULOOP;
procedure WMExitMenuLoop(var aMessage: TMessage); message WM_EXITMENULOOP; procedure WMExitMenuLoop(var aMessage: TMessage); message WM_EXITMENULOOP;
procedure BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED; procedure BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED;
procedure BrowserDestroyMsg(var aMessage : TMessage); message CEF_DESTROY;
procedure StreamCopyCompleteMsg(var aMessage : TMessage); message STREAM_COPY_COMPLETE; procedure StreamCopyCompleteMsg(var aMessage : TMessage); message STREAM_COPY_COMPLETE;
procedure Filter_OnFilter(Sender: TObject; data_in: Pointer; data_in_size: NativeUInt; var data_in_read: NativeUInt; data_out: Pointer; data_out_size : NativeUInt; var data_out_written: NativeUInt; var aResult : TCefResponseFilterStatus); procedure Filter_OnFilter(Sender: TObject; data_in: Pointer; data_in_size: NativeUInt; var data_in_read: NativeUInt; data_out: Pointer; data_out_size : NativeUInt; var data_out_written: NativeUInt; var aResult : TCefResponseFilterStatus);
@ -124,6 +133,12 @@ uses
// For more information read the CEF3 code comments here : // For more information read the CEF3 code comments here :
// https://github.com/chromiumembedded/cef/blob/master/include/capi/cef_response_filter_capi.h // https://github.com/chromiumembedded/cef/blob/master/include/capi/cef_response_filter_capi.h
// Destruction steps
// =================
// 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event.
// 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event.
// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form.
procedure TResponseFilterBrowserFrm.Filter_OnFilter(Sender: TObject; procedure TResponseFilterBrowserFrm.Filter_OnFilter(Sender: TObject;
data_in : Pointer; data_in : Pointer;
data_in_size : NativeUInt; data_in_size : NativeUInt;
@ -193,6 +208,18 @@ begin
Result := False; Result := False;
end; end;
procedure TResponseFilterBrowserFrm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose := FCanClose;
if not(FClosing) then
begin
FClosing := True;
Visible := False;
Chromium1.CloseBrowser(True);
end;
end;
procedure TResponseFilterBrowserFrm.FormCreate(Sender: TObject); procedure TResponseFilterBrowserFrm.FormCreate(Sender: TObject);
begin begin
FRscCompleted := False; FRscCompleted := False;
@ -201,6 +228,9 @@ begin
FStreamCS := TCriticalSection.Create; FStreamCS := TCriticalSection.Create;
FFilter := TCustomResponseFilter.Create; FFilter := TCustomResponseFilter.Create;
FCanClose := False;
FClosing := False;
// This event will receive the data // This event will receive the data
TCustomResponseFilter(FFilter).OnFilter := Filter_OnFilter; TCustomResponseFilter(FFilter).OnFilter := Filter_OnFilter;
end; end;
@ -225,6 +255,13 @@ begin
PostMessage(Handle, CEF_AFTERCREATED, 0, 0); PostMessage(Handle, CEF_AFTERCREATED, 0, 0);
end; end;
procedure TResponseFilterBrowserFrm.Chromium1BeforeClose(Sender: TObject;
const browser: ICefBrowser);
begin
FCanClose := True;
PostMessage(Handle, WM_CLOSE, 0, 0);
end;
procedure TResponseFilterBrowserFrm.Chromium1BeforePopup(Sender: TObject; procedure TResponseFilterBrowserFrm.Chromium1BeforePopup(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame; const targetUrl, const browser: ICefBrowser; const frame: ICefFrame; const targetUrl,
targetFrameName: ustring; targetDisposition: TCefWindowOpenDisposition; targetFrameName: ustring; targetDisposition: TCefWindowOpenDisposition;
@ -237,6 +274,13 @@ begin
Result := (targetDisposition in [WOD_NEW_FOREGROUND_TAB, WOD_NEW_BACKGROUND_TAB, WOD_NEW_POPUP, WOD_NEW_WINDOW]); Result := (targetDisposition in [WOD_NEW_FOREGROUND_TAB, WOD_NEW_BACKGROUND_TAB, WOD_NEW_POPUP, WOD_NEW_WINDOW]);
end; end;
procedure TResponseFilterBrowserFrm.Chromium1Close(Sender: TObject;
const browser: ICefBrowser; out Result: Boolean);
begin
PostMessage(Handle, CEF_DESTROY, 0, 0);
Result := True;
end;
procedure TResponseFilterBrowserFrm.Chromium1GetResourceResponseFilter(Sender : TObject; procedure TResponseFilterBrowserFrm.Chromium1GetResourceResponseFilter(Sender : TObject;
const browser : ICefBrowser; const browser : ICefBrowser;
const frame : ICefFrame; const frame : ICefFrame;
@ -283,6 +327,11 @@ begin
GoBtn.Click; GoBtn.Click;
end; end;
procedure TResponseFilterBrowserFrm.BrowserDestroyMsg(var aMessage : TMessage);
begin
CEFWindowParent1.Free;
end;
// This procedure handles the stream contents after it's fully downloaded // This procedure handles the stream contents after it's fully downloaded
procedure TResponseFilterBrowserFrm.StreamCopyCompleteMsg(var aMessage : TMessage); procedure TResponseFilterBrowserFrm.StreamCopyCompleteMsg(var aMessage : TMessage);
begin begin

View File

@ -12,6 +12,7 @@ object SchemeRegistrationBrowserFrm: TSchemeRegistrationBrowserFrm
Font.Style = [] Font.Style = []
OldCreateOrder = False OldCreateOrder = False
Position = poScreenCenter Position = poScreenCenter
OnCloseQuery = FormCloseQuery
OnCreate = FormCreate OnCreate = FormCreate
OnShow = FormShow OnShow = FormShow
PixelsPerInch = 96 PixelsPerInch = 96
@ -70,6 +71,8 @@ object SchemeRegistrationBrowserFrm: TSchemeRegistrationBrowserFrm
OnContextMenuCommand = Chromium1ContextMenuCommand OnContextMenuCommand = Chromium1ContextMenuCommand
OnBeforePopup = Chromium1BeforePopup OnBeforePopup = Chromium1BeforePopup
OnAfterCreated = Chromium1AfterCreated OnAfterCreated = Chromium1AfterCreated
OnBeforeClose = Chromium1BeforeClose
OnClose = Chromium1Close
Left = 16 Left = 16
Top = 40 Top = 40
end end

View File

@ -85,10 +85,20 @@ type
const popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo; const popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo;
var client: ICefClient; var settings: TCefBrowserSettings; var client: ICefClient; var settings: TCefBrowserSettings;
var noJavascriptAccess: Boolean; var Result: Boolean); var noJavascriptAccess: Boolean; var Result: Boolean);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure Chromium1Close(Sender: TObject; const browser: ICefBrowser;
out Result: Boolean);
procedure Chromium1BeforeClose(Sender: TObject;
const browser: ICefBrowser);
private private
{ Private declarations } { Private declarations }
protected protected
// 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 BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED; procedure BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED;
procedure BrowserDestroyMsg(var aMessage : TMessage); message CEF_DESTROY;
procedure WMMove(var aMessage : TWMMove); message WM_MOVE; procedure WMMove(var aMessage : TWMMove); message WM_MOVE;
procedure WMMoving(var aMessage : TMessage); message WM_MOVING; procedure WMMoving(var aMessage : TMessage); message WM_MOVING;
procedure WMEnterMenuLoop(var aMessage: TMessage); message WM_ENTERMENULOOP; procedure WMEnterMenuLoop(var aMessage: TMessage); message WM_ENTERMENULOOP;
@ -109,6 +119,12 @@ implementation
uses uses
uCEFSchemeHandlerFactory, uCEFMiscFunctions, uHelloScheme; uCEFSchemeHandlerFactory, uCEFMiscFunctions, uHelloScheme;
// Destruction steps
// =================
// 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event.
// 2. TChromium.OnClose sends a CEFBROWSER_DESTROY message to destroy CEFWindowParent1 in the main thread, which triggers the TChromium.OnBeforeClose event.
// 3. TChromium.OnBeforeClose sets FCanClose := True and sends WM_CLOSE to the form.
procedure GlobalCEFApp_OnRegCustomSchemes(const registrar: TCefSchemeRegistrarRef); procedure GlobalCEFApp_OnRegCustomSchemes(const registrar: TCefSchemeRegistrarRef);
begin begin
registrar.AddCustomScheme('hello', True, True, False, False, False, False); registrar.AddCustomScheme('hello', True, True, False, False, False, False);
@ -119,6 +135,13 @@ begin
PostMessage(Handle, CEF_AFTERCREATED, 0, 0); PostMessage(Handle, CEF_AFTERCREATED, 0, 0);
end; end;
procedure TSchemeRegistrationBrowserFrm.Chromium1BeforeClose(
Sender: TObject; const browser: ICefBrowser);
begin
FCanClose := True;
PostMessage(Handle, WM_CLOSE, 0, 0);
end;
procedure TSchemeRegistrationBrowserFrm.Chromium1BeforeContextMenu( procedure TSchemeRegistrationBrowserFrm.Chromium1BeforeContextMenu(
Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame;
const params: ICefContextMenuParams; const model: ICefMenuModel); const params: ICefContextMenuParams; const model: ICefMenuModel);
@ -139,6 +162,13 @@ begin
Result := (targetDisposition in [WOD_NEW_FOREGROUND_TAB, WOD_NEW_BACKGROUND_TAB, WOD_NEW_POPUP, WOD_NEW_WINDOW]); Result := (targetDisposition in [WOD_NEW_FOREGROUND_TAB, WOD_NEW_BACKGROUND_TAB, WOD_NEW_POPUP, WOD_NEW_WINDOW]);
end; end;
procedure TSchemeRegistrationBrowserFrm.Chromium1Close(Sender: TObject;
const browser: ICefBrowser; out Result: Boolean);
begin
PostMessage(Handle, CEF_DESTROY, 0, 0);
Result := True;
end;
procedure TSchemeRegistrationBrowserFrm.Chromium1ContextMenuCommand( procedure TSchemeRegistrationBrowserFrm.Chromium1ContextMenuCommand(
Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame;
const params: ICefContextMenuParams; commandId: Integer; const params: ICefContextMenuParams; commandId: Integer;
@ -171,6 +201,18 @@ begin
end; end;
end; end;
procedure TSchemeRegistrationBrowserFrm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose := FCanClose;
if not(FClosing) then
begin
FClosing := True;
Visible := False;
Chromium1.CloseBrowser(True);
end;
end;
procedure TSchemeRegistrationBrowserFrm.FormCreate(Sender: TObject); procedure TSchemeRegistrationBrowserFrm.FormCreate(Sender: TObject);
begin begin
// You can register the Scheme Handler Factory here or later, for example in a context menu command. // You can register the Scheme Handler Factory here or later, for example in a context menu command.
@ -203,6 +245,11 @@ begin
GoBtn.Click; GoBtn.Click;
end; end;
procedure TSchemeRegistrationBrowserFrm.BrowserDestroyMsg(var aMessage : TMessage);
begin
CEFWindowParent1.Free;
end;
procedure TSchemeRegistrationBrowserFrm.WMMove(var aMessage : TWMMove); procedure TSchemeRegistrationBrowserFrm.WMMove(var aMessage : TWMMove);
begin begin
inherited; inherited;

View File

@ -12,6 +12,8 @@ object Form1: TForm1
Font.Style = [] Font.Style = []
OldCreateOrder = False OldCreateOrder = False
Position = poScreenCenter Position = poScreenCenter
OnCloseQuery = FormCloseQuery
OnCreate = FormCreate
OnShow = FormShow OnShow = FormShow
PixelsPerInch = 96 PixelsPerInch = 96
TextHeight = 13 TextHeight = 13
@ -22,6 +24,8 @@ object Form1: TForm1
Height = 594 Height = 594
Align = alClient Align = alClient
TabOrder = 0 TabOrder = 0
OnClose = ChromiumWindow1Close
OnBeforeClose = ChromiumWindow1BeforeClose
OnAfterCreated = ChromiumWindow1AfterCreated OnAfterCreated = ChromiumWindow1AfterCreated
end end
object AddressPnl: TPanel object AddressPnl: TPanel

View File

@ -62,6 +62,10 @@ type
procedure FormShow(Sender: TObject); procedure FormShow(Sender: TObject);
procedure ChromiumWindow1AfterCreated(Sender: TObject); procedure ChromiumWindow1AfterCreated(Sender: TObject);
procedure Timer1Timer(Sender: TObject); procedure Timer1Timer(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure FormCreate(Sender: TObject);
procedure ChromiumWindow1Close(Sender: TObject);
procedure ChromiumWindow1BeforeClose(Sender: TObject);
private private
// You have to handle this two messages to call NotifyMoveOrResizeStarted or some page elements will be misaligned. // 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 WMMove(var aMessage : TWMMove); message WM_MOVE;
@ -71,6 +75,10 @@ type
procedure WMExitMenuLoop(var aMessage: TMessage); message WM_EXITMENULOOP; procedure WMExitMenuLoop(var aMessage: TMessage); message WM_EXITMENULOOP;
protected protected
// 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); 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);
public public
@ -99,6 +107,31 @@ uses
// or the domain "google.com". If you don't live in the US, you'll be redirected to // 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. // 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.FormCreate(Sender: TObject);
begin
FCanClose := False;
FClosing := False;
end;
procedure TForm1.FormShow(Sender: TObject); procedure TForm1.FormShow(Sender: TObject);
begin begin
// For simplicity, this demo blocks all popup windows and new tabs // For simplicity, this demo blocks all popup windows and new tabs
@ -113,6 +146,22 @@ begin
if not(ChromiumWindow1.CreateBrowser) then Timer1.Enabled := True; if not(ChromiumWindow1.CreateBrowser) then Timer1.Enabled := True;
end; end;
procedure TForm1.ChromiumWindow1BeforeClose(Sender: TObject);
begin
FCanClose := True;
Close;
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;
end;
procedure TForm1.Chromium_OnBeforePopup(Sender: TObject; procedure TForm1.Chromium_OnBeforePopup(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame; const targetUrl, const browser: ICefBrowser; const frame: ICefFrame; const targetUrl,
targetFrameName: ustring; targetDisposition: TCefWindowOpenDisposition; targetFrameName: ustring; targetDisposition: TCefWindowOpenDisposition;

View File

@ -12,6 +12,8 @@ object Form1: TForm1
Font.Style = [] Font.Style = []
OldCreateOrder = False OldCreateOrder = False
Position = poScreenCenter Position = poScreenCenter
OnCloseQuery = FormCloseQuery
OnCreate = FormCreate
OnShow = FormShow OnShow = FormShow
PixelsPerInch = 96 PixelsPerInch = 96
TextHeight = 13 TextHeight = 13
@ -70,6 +72,8 @@ object Form1: TForm1
object Chromium1: TChromium object Chromium1: TChromium
OnBeforePopup = Chromium1BeforePopup OnBeforePopup = Chromium1BeforePopup
OnAfterCreated = Chromium1AfterCreated OnAfterCreated = Chromium1AfterCreated
OnBeforeClose = Chromium1BeforeClose
OnClose = Chromium1Close
Left = 56 Left = 56
Top = 152 Top = 152
end end

View File

@ -70,7 +70,17 @@ type
const popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo; const popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo;
var client: ICefClient; var settings: TCefBrowserSettings; var client: ICefClient; var settings: TCefBrowserSettings;
var noJavascriptAccess: Boolean; var Result: Boolean); var noJavascriptAccess: Boolean; var Result: Boolean);
private procedure FormCreate(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure Chromium1Close(Sender: TObject; const browser: ICefBrowser;
out Result: Boolean);
procedure Chromium1BeforeClose(Sender: TObject;
const browser: ICefBrowser);
protected
// 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.
// You have to handle this two messages to call NotifyMoveOrResizeStarted or some page elements will be misaligned. // 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 WMMove(var aMessage : TWMMove); message WM_MOVE;
procedure WMMoving(var aMessage : TMessage); message WM_MOVING; procedure WMMoving(var aMessage : TMessage); message WM_MOVING;
@ -79,6 +89,7 @@ type
procedure WMExitMenuLoop(var aMessage: TMessage); message WM_EXITMENULOOP; procedure WMExitMenuLoop(var aMessage: TMessage); message WM_EXITMENULOOP;
procedure BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED; procedure BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED;
procedure BrowserDestroyMsg(var aMessage : TMessage); message CEF_DESTROY;
public public
{ Public declarations } { Public declarations }
end; end;
@ -107,6 +118,24 @@ uses
// This demo uses a TChromium and a TCEFWindowParent // This demo uses a TChromium and a TCEFWindowParent
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose := FCanClose;
if not(FClosing) then
begin
FClosing := True;
Visible := False;
Chromium1.CloseBrowser(True);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FCanClose := False;
FClosing := False;
end;
procedure TForm1.FormShow(Sender: TObject); procedure TForm1.FormShow(Sender: TObject);
begin begin
// You *MUST* call CreateBrowser to create and initialize the browser. // You *MUST* call CreateBrowser to create and initialize the browser.
@ -124,6 +153,13 @@ begin
PostMessage(Handle, CEF_AFTERCREATED, 0, 0); PostMessage(Handle, CEF_AFTERCREATED, 0, 0);
end; end;
procedure TForm1.Chromium1BeforeClose(Sender: TObject;
const browser: ICefBrowser);
begin
FCanClose := True;
PostMessage(Handle, WM_CLOSE, 0, 0);
end;
procedure TForm1.Chromium1BeforePopup(Sender: TObject; procedure TForm1.Chromium1BeforePopup(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame; const targetUrl, const browser: ICefBrowser; const frame: ICefFrame; const targetUrl,
targetFrameName: ustring; targetDisposition: TCefWindowOpenDisposition; targetFrameName: ustring; targetDisposition: TCefWindowOpenDisposition;
@ -136,6 +172,13 @@ begin
Result := (targetDisposition in [WOD_NEW_FOREGROUND_TAB, WOD_NEW_BACKGROUND_TAB, WOD_NEW_POPUP, WOD_NEW_WINDOW]); Result := (targetDisposition in [WOD_NEW_FOREGROUND_TAB, WOD_NEW_BACKGROUND_TAB, WOD_NEW_POPUP, WOD_NEW_WINDOW]);
end; end;
procedure TForm1.Chromium1Close(Sender: TObject;
const browser: ICefBrowser; out Result: Boolean);
begin
PostMessage(Handle, CEF_DESTROY, 0, 0);
Result := True;
end;
procedure TForm1.BrowserCreatedMsg(var aMessage : TMessage); procedure TForm1.BrowserCreatedMsg(var aMessage : TMessage);
begin begin
Caption := 'Simple Browser 2'; Caption := 'Simple Browser 2';
@ -143,6 +186,11 @@ begin
GoBtn.Click; GoBtn.Click;
end; end;
procedure TForm1.BrowserDestroyMsg(var aMessage : TMessage);
begin
CEFWindowParent1.Free;
end;
procedure TForm1.GoBtnClick(Sender: TObject); procedure TForm1.GoBtnClick(Sender: TObject);
begin begin
// This will load the URL in the edit box // This will load the URL in the edit box

View File

@ -166,7 +166,11 @@ end;
procedure TSimpleExternalPumpBrowserFrm.ChromiumWindow1Close(Sender: TObject); procedure TSimpleExternalPumpBrowserFrm.ChromiumWindow1Close(Sender: TObject);
begin begin
// DestroyChildWindow will destroy the child window created by CEF at the top of the Z order. // DestroyChildWindow will destroy the child window created by CEF at the top of the Z order.
ChromiumWindow1.DestroyChildWindow; if not(ChromiumWindow1.DestroyChildWindow) then
begin
FCanClose := True;
Close;
end;
end; end;
procedure TSimpleExternalPumpBrowserFrm.GoBtnClick(Sender: TObject); procedure TSimpleExternalPumpBrowserFrm.GoBtnClick(Sender: TObject);

View File

@ -12,6 +12,7 @@ object Form1: TForm1
Font.Style = [] Font.Style = []
OldCreateOrder = False OldCreateOrder = False
Position = poScreenCenter Position = poScreenCenter
OnCloseQuery = FormCloseQuery
OnShow = FormShow OnShow = FormShow
PixelsPerInch = 96 PixelsPerInch = 96
TextHeight = 13 TextHeight = 13
@ -22,6 +23,8 @@ object Form1: TForm1
Height = 594 Height = 594
Align = alClient Align = alClient
TabOrder = 0 TabOrder = 0
OnClose = ChromiumWindow1Close
OnBeforeClose = ChromiumWindow1BeforeClose
OnAfterCreated = ChromiumWindow1AfterCreated OnAfterCreated = ChromiumWindow1AfterCreated
end end
object AddressPnl: TPanel object AddressPnl: TPanel

View File

@ -62,6 +62,9 @@ type
procedure FormShow(Sender: TObject); procedure FormShow(Sender: TObject);
procedure ChromiumWindow1AfterCreated(Sender: TObject); procedure ChromiumWindow1AfterCreated(Sender: TObject);
procedure Timer1Timer(Sender: TObject); procedure Timer1Timer(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure ChromiumWindow1Close(Sender: TObject);
procedure ChromiumWindow1BeforeClose(Sender: TObject);
private private
// You have to handle this two messages to call NotifyMoveOrResizeStarted or some page elements will be misaligned. // 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 WMMove(var aMessage : TWMMove); message WM_MOVE;
@ -70,6 +73,10 @@ type
procedure WMEnterMenuLoop(var aMessage: TMessage); message WM_ENTERMENULOOP; procedure WMEnterMenuLoop(var aMessage: TMessage); message WM_ENTERMENULOOP;
procedure WMExitMenuLoop(var aMessage: TMessage); message WM_EXITMENULOOP; procedure WMExitMenuLoop(var aMessage: TMessage); message WM_EXITMENULOOP;
protected protected
// 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); 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);
public public
@ -98,6 +105,24 @@ uses
// or the domain "google.com". If you don't live in the US, you'll be redirected to // 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. // 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); procedure TForm1.FormShow(Sender: TObject);
begin begin
Caption := 'Simple Browser - Initializing browser. Please wait...'; Caption := 'Simple Browser - Initializing browser. Please wait...';
@ -112,6 +137,22 @@ begin
if not(ChromiumWindow1.CreateBrowser) then Timer1.Enabled := True; if not(ChromiumWindow1.CreateBrowser) then Timer1.Enabled := True;
end; 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;
end;
procedure TForm1.ChromiumWindow1BeforeClose(Sender: TObject);
begin
FCanClose := True;
Close;
end;
procedure TForm1.Chromium_OnBeforePopup(Sender: TObject; procedure TForm1.Chromium_OnBeforePopup(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame; const targetUrl, const browser: ICefBrowser; const frame: ICefFrame; const targetUrl,
targetFrameName: ustring; targetDisposition: TCefWindowOpenDisposition; targetFrameName: ustring; targetDisposition: TCefWindowOpenDisposition;

View File

@ -13,6 +13,7 @@ object MainForm: TMainForm
OldCreateOrder = False OldCreateOrder = False
Position = poScreenCenter Position = poScreenCenter
OnCloseQuery = FormCloseQuery OnCloseQuery = FormCloseQuery
OnCreate = FormCreate
OnShow = FormShow OnShow = FormShow
PixelsPerInch = 96 PixelsPerInch = 96
TextHeight = 13 TextHeight = 13

View File

@ -55,6 +55,7 @@ const
CEFBROWSER_DESTROYWNDPARENT = WM_APP + $100; CEFBROWSER_DESTROYWNDPARENT = WM_APP + $100;
CEFBROWSER_DESTROYTAB = WM_APP + $101; CEFBROWSER_DESTROYTAB = WM_APP + $101;
CEFBROWSER_INITIALIZED = WM_APP + $102; CEFBROWSER_INITIALIZED = WM_APP + $102;
CEFBROWSER_CHECKTAGGEDTABS = WM_APP + $103;
type type
TMainForm = class(TForm) TMainForm = class(TForm)
@ -81,9 +82,12 @@ type
procedure ReloadBtnClick(Sender: TObject); procedure ReloadBtnClick(Sender: TObject);
procedure StopBtnClick(Sender: TObject); procedure StopBtnClick(Sender: TObject);
procedure GoBtnClick(Sender: TObject); procedure GoBtnClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
protected protected
FDestroying : boolean; FClosingTab : boolean;
FCanClose : boolean;
FClosing : boolean;
procedure Chromium_OnAfterCreated(Sender: TObject; const browser: ICefBrowser); procedure Chromium_OnAfterCreated(Sender: TObject; const browser: ICefBrowser);
procedure Chromium_OnAddressChange(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const url: ustring); procedure Chromium_OnAddressChange(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const url: ustring);
@ -92,16 +96,18 @@ type
procedure Chromium_OnBeforeClose(Sender: TObject; const browser: ICefBrowser); 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 noJavascriptAccess: Boolean; var Result: Boolean); 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);
procedure BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED; procedure BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED;
procedure BrowserDestroyWindowParentMsg(var aMessage : TMessage); message CEFBROWSER_DESTROYWNDPARENT; procedure BrowserDestroyWindowParentMsg(var aMessage : TMessage); message CEFBROWSER_DESTROYWNDPARENT;
procedure BrowserDestroyTabMsg(var aMessage : TMessage); message CEFBROWSER_DESTROYTAB; procedure BrowserDestroyTabMsg(var aMessage : TMessage); message CEFBROWSER_DESTROYTAB;
procedure BrowserCheckTaggedTabsMsg(var aMessage : TMessage); message CEFBROWSER_CHECKTAGGEDTABS;
procedure CEFInitializedMsg(var aMessage : TMessage); message CEFBROWSER_INITIALIZED; procedure CEFInitializedMsg(var aMessage : TMessage); message CEFBROWSER_INITIALIZED;
procedure WMMove(var aMessage : TWMMove); message WM_MOVE; procedure WMMove(var aMessage : TWMMove); message WM_MOVE;
procedure WMMoving(var aMessage : TMessage); message WM_MOVING; procedure WMMoving(var aMessage : TMessage); message WM_MOVING;
procedure WMEnterMenuLoop(var aMessage: TMessage); message WM_ENTERMENULOOP; procedure WMEnterMenuLoop(var aMessage: TMessage); message WM_ENTERMENULOOP;
procedure WMExitMenuLoop(var aMessage: TMessage); message WM_EXITMENULOOP; procedure WMExitMenuLoop(var aMessage: TMessage); message WM_EXITMENULOOP;
function AllTabSheetsAreTagged : boolean;
procedure CloseAllBrowsers;
function GetPageIndex(const aSender : TObject; var aPageIndex : integer) : boolean; function GetPageIndex(const aSender : TObject; var aPageIndex : integer) : boolean;
procedure NotifyMoveOrResizeStarted; procedure NotifyMoveOrResizeStarted;
function SearchChromium(aPageIndex : integer; var aChromium : TChromium) : boolean; function SearchChromium(aPageIndex : integer; var aChromium : TChromium) : boolean;
@ -130,11 +136,16 @@ implementation
// For simplicity the Button panel and the PageControl are disabled while adding or removing tab sheets. // For simplicity the Button panel and the PageControl are disabled while adding or removing tab sheets.
// The Form can't be closed if it's destroying a tab. // The Form can't be closed if it's destroying a tab.
// This is the destruction sequence when you remove a tab sheet: // This is the destruction sequence when a user closes a tab sheet:
// 1. RemoveTabBtnClick calls TChromium.CloseBrowser of the selected tab which triggers a TChromium.OnClose event. // 1. RemoveTabBtnClick calls TChromium.CloseBrowser of the selected tab which triggers a TChromium.OnClose event.
// 2. TChromium.OnClose sends a CEFBROWSER_DESTROYWNDPARENT message to destroy TCEFWindowParent in the main thread which triggers a TChromium.OnBeforeClose event. // 2. TChromium.OnClose sends a CEFBROWSER_DESTROYWNDPARENT message to destroy TCEFWindowParent in the main thread which triggers a TChromium.OnBeforeClose event.
// 3. TChromium.OnBeforeClose sends a CEFBROWSER_DESTROYTAB message to destroy the tab in the main thread. // 3. TChromium.OnBeforeClose sends a CEFBROWSER_DESTROYTAB message to destroy the tab in the main thread.
// This is the destruction sequence when the user closes the main form
// 1. FormCloseQuery hides the form and calls CloseAllBrowsers which calls TChromium.CloseBrowser in all tabs and triggers the TChromium.OnClose event.
// 2. TChromium.OnClose sends a CEFBROWSER_DESTROYWNDPARENT message to destroy TCEFWindowParent in the main thread which triggers a TChromium.OnBeforeClose event.
// 3. TChromium.OnBeforeClose sends a CEFBROWSER_CHECKTAGGEDTABS message to set the TAG property to 1 in the TabSheet containing the TChromium. Then sends WM_CLOSE in case all tabsheets have a TAG = 1.
procedure GlobalCEFApp_OnContextInitialized; procedure GlobalCEFApp_OnContextInitialized;
begin begin
if (MainForm <> nil) and MainForm.HandleAllocated then if (MainForm <> nil) and MainForm.HandleAllocated then
@ -176,7 +187,7 @@ var
begin begin
if SearchChromium(PageControl1.TabIndex, TempChromium) then if SearchChromium(PageControl1.TabIndex, TempChromium) then
begin begin
FDestroying := True; FClosingTab := True;
ButtonPnl.Enabled := False; ButtonPnl.Enabled := False;
PageControl1.Enabled := False; PageControl1.Enabled := False;
TempChromium.CloseBrowser(True); TempChromium.CloseBrowser(True);
@ -185,7 +196,60 @@ end;
procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin begin
CanClose := not(FDestroying); if FClosingTab then
CanClose := False
else
begin
CanClose := FCanClose;
if not(FClosing) then
begin
FClosing := True;
Visible := False;
CloseAllBrowsers;
end;
end;
end;
procedure TMainForm.CloseAllBrowsers;
var
i, j, k : integer;
TempComponent : TComponent;
TempSheet : TTabSheet;
TempCtnue : boolean;
begin
k := pred(PageControl1.PageCount);
while (k >= 0) do
begin
TempSheet := PageControl1.Pages[k];
TempCtnue := True;
i := 0;
j := TempSheet.ComponentCount;
while (i < j) and TempCtnue do
begin
TempComponent := TempSheet.Components[i];
if (TempComponent <> nil) and (TempComponent is TChromium) then
begin
TChromium(TempComponent).CloseBrowser(True);
TempCtnue := False;
end
else
inc(i);
end;
dec(k);
end;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
FClosingTab := False;
FCanClose := False;
FClosing := False;
end; end;
procedure TMainForm.FormShow(Sender: TObject); procedure TMainForm.FormShow(Sender: TObject);
@ -264,9 +328,38 @@ begin
(aMessage.lParam < PageControl1.PageCount) then (aMessage.lParam < PageControl1.PageCount) then
PageControl1.Pages[aMessage.lParam].Free; PageControl1.Pages[aMessage.lParam].Free;
FClosingTab := False;
ButtonPnl.Enabled := True; ButtonPnl.Enabled := True;
PageControl1.Enabled := True; PageControl1.Enabled := True;
FDestroying := False; end;
procedure TMainForm.BrowserCheckTaggedTabsMsg(var aMessage : TMessage);
begin
if (aMessage.lParam >= 0) and
(aMessage.lParam < PageControl1.PageCount) then
begin
PageControl1.Pages[aMessage.lParam].Tag := 1;
if AllTabSheetsAreTagged then
begin
FCanClose := True;
PostMessage(Handle, WM_CLOSE, 0, 0);
end;
end;
end;
function TMainForm.AllTabSheetsAreTagged : boolean;
var
i : integer;
begin
Result := True;
i := pred(PageControl1.PageCount);
while (i >= 0) and Result do
if (PageControl1.Pages[i].Tag <> 1) then
Result := False
else
dec(i);
end; end;
procedure TMainForm.Chromium_OnAfterCreated(Sender: TObject; const browser: ICefBrowser); procedure TMainForm.Chromium_OnAfterCreated(Sender: TObject; const browser: ICefBrowser);
@ -281,7 +374,8 @@ procedure TMainForm.Chromium_OnAddressChange(Sender: TObject; const browser: ICe
var var
TempPageIndex : integer; TempPageIndex : integer;
begin begin
if (PageControl1.TabIndex >= 0) and if not(FClosing) and
(PageControl1.TabIndex >= 0) and
GetPageIndex(Sender, TempPageIndex) and GetPageIndex(Sender, TempPageIndex) and
(PageControl1.TabIndex = TempPageIndex) then (PageControl1.TabIndex = TempPageIndex) then
URLCbx.Text := url; URLCbx.Text := url;
@ -306,7 +400,7 @@ procedure TMainForm.Chromium_OnTitleChange(Sender: TObject; const browser: ICefB
var var
TempPageIndex : integer; TempPageIndex : integer;
begin begin
if GetPageIndex(Sender, TempPageIndex) then if not(FClosing) and GetPageIndex(Sender, TempPageIndex) then
PageControl1.Pages[TempPageIndex].Caption := title; PageControl1.Pages[TempPageIndex].Caption := title;
end; end;
@ -325,7 +419,12 @@ var
TempPageIndex : integer; TempPageIndex : integer;
begin begin
if GetPageIndex(Sender, TempPageIndex) then if GetPageIndex(Sender, TempPageIndex) then
PostMessage(Handle, CEFBROWSER_DESTROYTAB, 0, TempPageIndex); begin
if FClosing then
PostMessage(Handle, CEFBROWSER_CHECKTAGGEDTABS, 0, TempPageIndex)
else
PostMessage(Handle, CEFBROWSER_DESTROYTAB, 0, TempPageIndex);
end;
end; end;
procedure TMainForm.Chromium_OnBeforePopup(Sender: TObject; procedure TMainForm.Chromium_OnBeforePopup(Sender: TObject;
@ -405,7 +504,7 @@ var
i, j : integer; i, j : integer;
TempChromium : TChromium; TempChromium : TChromium;
begin begin
if not(showing) or (PageControl1 = nil) then exit; if not(showing) or (PageControl1 = nil) or FClosing then exit;
i := 0; i := 0;
j := PageControl1.PageCount; j := PageControl1.PageCount;
@ -436,14 +535,16 @@ procedure TMainForm.WMEnterMenuLoop(var aMessage: TMessage);
begin begin
inherited; inherited;
if (aMessage.wParam = 0) and (GlobalCEFApp <> nil) then GlobalCEFApp.OsmodalLoop := True; if not(FClosing) and (aMessage.wParam = 0) and (GlobalCEFApp <> nil) then
GlobalCEFApp.OsmodalLoop := True;
end; end;
procedure TMainForm.WMExitMenuLoop(var aMessage: TMessage); procedure TMainForm.WMExitMenuLoop(var aMessage: TMessage);
begin begin
inherited; inherited;
if (aMessage.wParam = 0) and (GlobalCEFApp <> nil) then GlobalCEFApp.OsmodalLoop := False; if not(FClosing) and (aMessage.wParam = 0) and (GlobalCEFApp <> nil) then
GlobalCEFApp.OsmodalLoop := False;
end; end;
procedure TMainForm.PageControl1Change(Sender: TObject); procedure TMainForm.PageControl1Change(Sender: TObject);

View File

@ -57,7 +57,7 @@ uses
const const
CEF_SUPPORTED_VERSION_MAJOR = 3; CEF_SUPPORTED_VERSION_MAJOR = 3;
CEF_SUPPORTED_VERSION_MINOR = 3325; CEF_SUPPORTED_VERSION_MINOR = 3325;
CEF_SUPPORTED_VERSION_RELEASE = 1755; CEF_SUPPORTED_VERSION_RELEASE = 1756;
CEF_SUPPORTED_VERSION_BUILD = 0; CEF_SUPPORTED_VERSION_BUILD = 0;
CEF_CHROMEELF_VERSION_MAJOR = 65; CEF_CHROMEELF_VERSION_MAJOR = 65;
@ -135,6 +135,7 @@ type
FMissingLibFiles : string; FMissingLibFiles : string;
FProcessType : TCefProcessType; FProcessType : TCefProcessType;
FShutdownWaitTime : cardinal; FShutdownWaitTime : cardinal;
FWidevinePath : string;
FMustCreateResourceBundleHandler : boolean; FMustCreateResourceBundleHandler : boolean;
FMustCreateBrowserProcessHandler : boolean; FMustCreateBrowserProcessHandler : boolean;
@ -162,6 +163,9 @@ type
FOnFocusedNodeChanged : TOnFocusedNodeChangedEvent; FOnFocusedNodeChanged : TOnFocusedNodeChangedEvent;
FOnProcessMessageReceived : TOnProcessMessageReceivedEvent; FOnProcessMessageReceived : TOnProcessMessageReceivedEvent;
// ICefRegisterCDMCallback
FOnCDMRegistrationComplete : TOnCDMRegistrationCompleteEvent;
procedure SetCache(const aValue : ustring); procedure SetCache(const aValue : ustring);
procedure SetFrameworkDirPath(const aValue : ustring); procedure SetFrameworkDirPath(const aValue : ustring);
procedure SetResourcesDirPath(const aValue : ustring); procedure SetResourcesDirPath(const aValue : ustring);
@ -175,6 +179,7 @@ type
function GetMustCreateBrowserProcessHandler : boolean; function GetMustCreateBrowserProcessHandler : boolean;
function GetMustCreateRenderProcessHandler : boolean; function GetMustCreateRenderProcessHandler : boolean;
function GetGlobalContextInitialized : boolean; function GetGlobalContextInitialized : boolean;
function GetChildProcessesCount : integer;
function LoadCEFlibrary : boolean; virtual; function LoadCEFlibrary : boolean; virtual;
function Load_cef_app_capi_h : boolean; function Load_cef_app_capi_h : boolean;
@ -227,6 +232,7 @@ type
function SingleExeProcessing : boolean; function SingleExeProcessing : boolean;
function CheckCEFLibrary : boolean; function CheckCEFLibrary : boolean;
procedure DeleteDirContents(const aDirectory : string); procedure DeleteDirContents(const aDirectory : string);
procedure RegisterWidevineCDM;
function FindFlashDLL(var aFileName : string) : boolean; function FindFlashDLL(var aFileName : string) : boolean;
procedure ShowErrorMessageDlg(const aError : string); virtual; procedure ShowErrorMessageDlg(const aError : string); virtual;
function ParseProcessType : TCefProcessType; function ParseProcessType : TCefProcessType;
@ -245,7 +251,8 @@ type
procedure UpdateDeviceScaleFactor; procedure UpdateDeviceScaleFactor;
// Internal procedures. Only TInternalApp, TCefCustomBrowserProcessHandler, // Internal procedures. Only TInternalApp, TCefCustomBrowserProcessHandler,
// ICefResourceBundleHandler and ICefRenderProcessHandler should use them. // ICefResourceBundleHandler, ICefRenderProcessHandler and ICefRegisterCDMCallback
// should use them.
procedure Internal_OnBeforeCommandLineProcessing(const processType: ustring; const commandLine: ICefCommandLine); procedure Internal_OnBeforeCommandLineProcessing(const processType: ustring; const commandLine: ICefCommandLine);
procedure Internal_OnRegisterCustomSchemes(const registrar: TCefSchemeRegistrarRef); procedure Internal_OnRegisterCustomSchemes(const registrar: TCefSchemeRegistrarRef);
procedure Internal_OnContextInitialized; procedure Internal_OnContextInitialized;
@ -264,7 +271,7 @@ type
procedure Internal_OnUncaughtException(const browser: ICefBrowser; const frame: ICefFrame; const context: ICefv8Context; const exception: ICefV8Exception; const stackTrace: ICefV8StackTrace); procedure Internal_OnUncaughtException(const browser: ICefBrowser; const frame: ICefFrame; const context: ICefv8Context; const exception: ICefV8Exception; const stackTrace: ICefV8StackTrace);
procedure Internal_OnFocusedNodeChanged(const browser: ICefBrowser; const frame: ICefFrame; const node: ICefDomNode); procedure Internal_OnFocusedNodeChanged(const browser: ICefBrowser; const frame: ICefFrame; const node: ICefDomNode);
procedure Internal_OnProcessMessageReceived(const browser: ICefBrowser; sourceProcess: TCefProcessId; const aMessage: ICefProcessMessage; var aHandled : boolean); procedure Internal_OnProcessMessageReceived(const browser: ICefBrowser; sourceProcess: TCefProcessId; const aMessage: ICefProcessMessage; var aHandled : boolean);
procedure Internal_OnCDMRegistrationComplete(result : TCefCDMRegistrationError; const error_message : ustring);
property Cache : ustring read FCache write SetCache; property Cache : ustring read FCache write SetCache;
property Cookies : ustring read FCookies write FCookies; property Cookies : ustring read FCookies write FCookies;
@ -334,6 +341,8 @@ type
property Status : TCefAplicationStatus read FStatus; property Status : TCefAplicationStatus read FStatus;
property MissingLibFiles : string read FMissingLibFiles; property MissingLibFiles : string read FMissingLibFiles;
property ShutdownWaitTime : cardinal read FShutdownWaitTime write FShutdownWaitTime; property ShutdownWaitTime : cardinal read FShutdownWaitTime write FShutdownWaitTime;
property WidevinePath : string read FWidevinePath write FWidevinePath;
property ChildProcessesCount : integer read GetChildProcessesCount;
property OnRegCustomSchemes : TOnRegisterCustomSchemes read FOnRegisterCustomSchemes write FOnRegisterCustomSchemes; property OnRegCustomSchemes : TOnRegisterCustomSchemes read FOnRegisterCustomSchemes write FOnRegisterCustomSchemes;
@ -358,6 +367,9 @@ type
property OnUncaughtException : TOnUncaughtExceptionEvent read FOnUncaughtException write FOnUncaughtException; property OnUncaughtException : TOnUncaughtExceptionEvent read FOnUncaughtException write FOnUncaughtException;
property OnFocusedNodeChanged : TOnFocusedNodeChangedEvent read FOnFocusedNodeChanged write FOnFocusedNodeChanged; property OnFocusedNodeChanged : TOnFocusedNodeChangedEvent read FOnFocusedNodeChanged write FOnFocusedNodeChanged;
property OnProcessMessageReceived : TOnProcessMessageReceivedEvent read FOnProcessMessageReceived write FOnProcessMessageReceived; property OnProcessMessageReceived : TOnProcessMessageReceivedEvent read FOnProcessMessageReceived write FOnProcessMessageReceived;
// ICefRegisterCDMCallback
property OnCDMRegistrationComplete : TOnCDMRegistrationCompleteEvent read FOnCDMRegistrationComplete write FOnCDMRegistrationComplete;
end; end;
var var
@ -372,7 +384,7 @@ uses
Math, {$IFDEF DELPHI14_UP}IOUtils,{$ENDIF} SysUtils, {$IFDEF MSWINDOWS}TlHelp32,{$ENDIF} Math, {$IFDEF DELPHI14_UP}IOUtils,{$ENDIF} SysUtils, {$IFDEF MSWINDOWS}TlHelp32,{$ENDIF}
{$ENDIF} {$ENDIF}
uCEFLibFunctions, uCEFMiscFunctions, uCEFCommandLine, uCEFConstants, uCEFLibFunctions, uCEFMiscFunctions, uCEFCommandLine, uCEFConstants,
uCEFSchemeHandlerFactory, uCEFCookieManager, uCEFApp; uCEFSchemeHandlerFactory, uCEFCookieManager, uCEFApp, uCEFRegisterCDMCallback;
constructor TCefApplication.Create; constructor TCefApplication.Create;
begin begin
@ -439,6 +451,7 @@ begin
FLocalesRequired := ''; FLocalesRequired := '';
FProcessType := ParseProcessType; FProcessType := ParseProcessType;
FShutdownWaitTime := 0; FShutdownWaitTime := 0;
FWidevinePath := '';
FMustCreateResourceBundleHandler := False; FMustCreateResourceBundleHandler := False;
FMustCreateBrowserProcessHandler := True; FMustCreateBrowserProcessHandler := True;
@ -466,6 +479,9 @@ begin
FOnFocusedNodeChanged := nil; FOnFocusedNodeChanged := nil;
FOnProcessMessageReceived := nil; FOnProcessMessageReceived := nil;
// ICefRegisterCDMCallback
FOnCDMRegistrationComplete := nil;
UpdateDeviceScaleFactor; UpdateDeviceScaleFactor;
FAppSettings.size := SizeOf(TCefSettings); FAppSettings.size := SizeOf(TCefSettings);
@ -489,6 +505,7 @@ begin
if (FProcessType = ptBrowser) then if (FProcessType = ptBrowser) then
begin begin
if (FShutdownWaitTime > 0) then sleep(FShutdownWaitTime); if (FShutdownWaitTime > 0) then sleep(FShutdownWaitTime);
ShutDown; ShutDown;
end; end;
@ -830,6 +847,8 @@ begin
if FDeleteCache then DeleteDirContents(FCache); if FDeleteCache then DeleteDirContents(FCache);
if FDeleteCookies then DeleteDirContents(FCookies); if FDeleteCookies then DeleteDirContents(FCookies);
RegisterWidevineCDM;
InitializeSettings(FAppSettings); InitializeSettings(FAppSettings);
TempArgs.instance := HINSTANCE; TempArgs.instance := HINSTANCE;
@ -910,6 +929,29 @@ begin
end; end;
end; end;
procedure TCefApplication.RegisterWidevineCDM;
var
TempPath : TCefString;
TempCallback : ICefRegisterCDMCallback;
begin
try
try
if FLibLoaded and (length(FWidevinePath) > 0) and DirectoryExists(FWidevinePath) then
begin
TempPath := CefString(FWidevinePath);
TempCallback := TCefCustomRegisterCDMCallback.Create(self);
cef_register_widevine_cdm(@TempPath, TempCallback.Wrap);
end;
except
on e : exception do
if CustomExceptionHandler('TCefApplication.RegisterWidevineCDM', e) then raise;
end;
finally
TempCallback := nil;
end;
end;
function TCefApplication.FindFlashDLL(var aFileName : string) : boolean; function TCefApplication.FindFlashDLL(var aFileName : string) : boolean;
var var
TempSearchRec : TSearchRec; TempSearchRec : TSearchRec;
@ -1083,6 +1125,11 @@ begin
aHandled := False; aHandled := False;
end; end;
procedure TCefApplication.Internal_OnCDMRegistrationComplete(result : TCefCDMRegistrationError; const error_message : ustring);
begin
if assigned(FOnCDMRegistrationComplete) then FOnCDMRegistrationComplete(result, error_message);
end;
procedure TCefApplication.Internal_OnBeforeCommandLineProcessing(const processType : ustring; procedure TCefApplication.Internal_OnBeforeCommandLineProcessing(const processType : ustring;
const commandLine : ICefCommandLine); const commandLine : ICefCommandLine);
var var
@ -1216,6 +1263,43 @@ begin
Result := FGlobalContextInitialized or not(MustCreateBrowserProcessHandler); Result := FGlobalContextInitialized or not(MustCreateBrowserProcessHandler);
end; end;
function TCefApplication.GetChildProcessesCount : integer;
{$IFDEF MSWINDOWS}
var
TempHandle : THandle;
TempProcess : TProcessEntry32;
TempPID : DWORD;
TempMain, TempSubProc, TempName : string;
{$ENDIF}
begin
Result := 0;
{$IFDEF MSWINDOWS}
TempHandle := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);
TempProcess.dwSize := Sizeof(TProcessEntry32);
TempPID := GetCurrentProcessID;
TempMain := ExtractFileName(paramstr(0));
TempSubProc := ExtractFileName(FBrowserSubprocessPath);
Process32First(TempHandle, TempProcess);
repeat
if (TempProcess.th32ProcessID <> TempPID) and
(TempProcess.th32ParentProcessID = TempPID) then
begin
TempName := TempProcess.szExeFile;
TempName := ExtractFileName(TempName);
if (CompareText(TempName, TempMain) = 0) or
((length(TempSubProc) > 0) and (CompareText(TempName, TempSubProc) = 0)) then
inc(Result);
end;
until not(Process32Next(TempHandle, TempProcess));
CloseHandle(TempHandle);
{$ENDIF}
end;
function TCefApplication.LoadCEFlibrary : boolean; function TCefApplication.LoadCEFlibrary : boolean;
var var
TempOldDir, TempString : string; TempOldDir, TempString : string;

View File

@ -105,6 +105,15 @@ type
FWebRTCIPHandlingPolicy : TCefWebRTCHandlingPolicy; FWebRTCIPHandlingPolicy : TCefWebRTCHandlingPolicy;
FWebRTCMultipleRoutes : TCefState; FWebRTCMultipleRoutes : TCefState;
FWebRTCNonProxiedUDP : TCefState; FWebRTCNonProxiedUDP : TCefState;
FOldBrowserCompWndPrc : Pointer;
FOldWidgetCompWndPrc : Pointer;
FOldRenderCompWndPrc : Pointer;
FBrowserCompHWND : THandle;
FWidgetCompHWND : THandle;
FRenderCompHWND : THandle;
FBrowserCompStub : Pointer;
FWidgetCompStub : Pointer;
FRenderCompStub : Pointer;
// ICefClient // ICefClient
FOnProcessMessageReceived : TOnProcessMessageReceived; FOnProcessMessageReceived : TOnProcessMessageReceived;
@ -207,6 +216,9 @@ type
FOnPrefsAvailable : TOnPrefsAvailableEvent; FOnPrefsAvailable : TOnPrefsAvailableEvent;
FOnCookiesDeleted : TOnCookiesDeletedEvent; FOnCookiesDeleted : TOnCookiesDeletedEvent;
FOnResolvedHostAvailable : TOnResolvedIPsAvailableEvent; FOnResolvedHostAvailable : TOnResolvedIPsAvailableEvent;
FOnBrowserCompMsg : TOnCompMsgEvent;
FOnWidgetCompMsg : TOnCompMsgEvent;
FOnRenderCompMsg : TOnCompMsgEvent;
function GetIsLoading : boolean; function GetIsLoading : boolean;
function GetMultithreadApp : boolean; function GetMultithreadApp : boolean;
@ -305,6 +317,10 @@ type
procedure ToMouseEvent(grfKeyState : Longint; pt : TPoint; var aMouseEvent : TCefMouseEvent); procedure ToMouseEvent(grfKeyState : Longint; pt : TPoint; var aMouseEvent : TCefMouseEvent);
procedure WndProc(var aMessage: TMessage); procedure WndProc(var aMessage: TMessage);
procedure BrowserCompWndProc(var aMessage: TMessage);
procedure WidgetCompWndProc(var aMessage: TMessage);
procedure RenderCompWndProc(var aMessage: TMessage);
procedure DragDropManager_OnDragEnter(Sender: TObject; const aDragData : ICefDragData; grfKeyState: Longint; pt: TPoint; var dwEffect: Longint); procedure DragDropManager_OnDragEnter(Sender: TObject; const aDragData : ICefDragData; grfKeyState: Longint; pt: TPoint; var dwEffect: Longint);
procedure DragDropManager_OnDragOver(Sender: TObject; grfKeyState: Longint; pt: TPoint; var dwEffect: Longint); procedure DragDropManager_OnDragOver(Sender: TObject; grfKeyState: Longint; pt: TPoint; var dwEffect: Longint);
procedure DragDropManager_OnDragLeave(Sender: TObject); procedure DragDropManager_OnDragLeave(Sender: TObject);
@ -576,6 +592,9 @@ type
property OnPrefsAvailable : TOnPrefsAvailableEvent read FOnPrefsAvailable write FOnPrefsAvailable; property OnPrefsAvailable : TOnPrefsAvailableEvent read FOnPrefsAvailable write FOnPrefsAvailable;
property OnCookiesDeleted : TOnCookiesDeletedEvent read FOnCookiesDeleted write FOnCookiesDeleted; property OnCookiesDeleted : TOnCookiesDeletedEvent read FOnCookiesDeleted write FOnCookiesDeleted;
property OnResolvedHostAvailable : TOnResolvedIPsAvailableEvent read FOnResolvedHostAvailable write FOnResolvedHostAvailable; property OnResolvedHostAvailable : TOnResolvedIPsAvailableEvent read FOnResolvedHostAvailable write FOnResolvedHostAvailable;
property OnBrowserCompMsg : TOnCompMsgEvent read FOnBrowserCompMsg write FOnBrowserCompMsg;
property OnWidgetCompMsg : TOnCompMsgEvent read FOnWidgetCompMsg write FOnWidgetCompMsg;
property OnRenderCompMsg : TOnCompMsgEvent read FOnRenderCompMsg write FOnRenderCompMsg;
// ICefClient // ICefClient
property OnProcessMessageReceived : TOnProcessMessageReceived read FOnProcessMessageReceived write FOnProcessMessageReceived; property OnProcessMessageReceived : TOnProcessMessageReceived read FOnProcessMessageReceived write FOnProcessMessageReceived;
@ -715,6 +734,15 @@ begin
FImagesPrefs := CEF_CONTENT_SETTING_ALLOW; FImagesPrefs := CEF_CONTENT_SETTING_ALLOW;
FZoomStep := ZOOM_STEP_DEF; FZoomStep := ZOOM_STEP_DEF;
FWindowName := ''; FWindowName := '';
FOldBrowserCompWndPrc := nil;
FOldWidgetCompWndPrc := nil;
FOldRenderCompWndPrc := nil;
FBrowserCompHWND := 0;
FWidgetCompHWND := 0;
FRenderCompHWND := 0;
FBrowserCompStub := nil;
FWidgetCompStub := nil;
FRenderCompStub := nil;
FDragOperations := DRAG_OPERATION_NONE; FDragOperations := DRAG_OPERATION_NONE;
FDragDropManager := nil; FDragDropManager := nil;
@ -773,6 +801,30 @@ end;
procedure TChromium.BeforeDestruction; procedure TChromium.BeforeDestruction;
begin begin
if (FBrowserCompHWND <> 0) and (FOldBrowserCompWndPrc <> nil) then
begin
SetWindowLongPtr(FBrowserCompHWND, GWL_WNDPROC, NativeInt(FOldBrowserCompWndPrc));
FreeObjectInstance(FBrowserCompStub);
FOldBrowserCompWndPrc := nil;
FBrowserCompStub := nil;
end;
if (FWidgetCompHWND <> 0) and (FOldWidgetCompWndPrc <> nil) then
begin
SetWindowLongPtr(FWidgetCompHWND, GWL_WNDPROC, NativeInt(FOldWidgetCompWndPrc));
FreeObjectInstance(FWidgetCompStub);
FOldWidgetCompWndPrc := nil;
FWidgetCompStub := nil;
end;
if (FRenderCompHWND <> 0) and (FOldRenderCompWndPrc <> nil) then
begin
SetWindowLongPtr(FRenderCompHWND, GWL_WNDPROC, NativeInt(FOldRenderCompWndPrc));
FreeObjectInstance(FRenderCompStub);
FOldRenderCompWndPrc := nil;
FRenderCompStub := nil;
end;
DestroyClientHandler; DestroyClientHandler;
inherited BeforeDestruction; inherited BeforeDestruction;
@ -961,6 +1013,9 @@ begin
FOnPrefsAvailable := nil; FOnPrefsAvailable := nil;
FOnCookiesDeleted := nil; FOnCookiesDeleted := nil;
FOnResolvedHostAvailable := nil; FOnResolvedHostAvailable := nil;
FOnBrowserCompMsg := nil;
FOnWidgetCompMsg := nil;
FOnRenderCompMsg := nil;
end; end;
function TChromium.CreateBrowser(const aBrowserParent : TWinControl; function TChromium.CreateBrowser(const aBrowserParent : TWinControl;
@ -986,11 +1041,11 @@ begin
Result := CreateBrowser(TempHandle, TempRect, aWindowName, aContext, aCookiesPath, aPersistSessionCookies); Result := CreateBrowser(TempHandle, TempRect, aWindowName, aContext, aCookiesPath, aPersistSessionCookies);
end; end;
function TChromium.CreateBrowser(aParentHandle : HWND; function TChromium.CreateBrowser( aParentHandle : HWND;
aParentRect : TRect; aParentRect : TRect;
const aWindowName : string; const aWindowName : string;
const aContext : ICefRequestContext; const aContext : ICefRequestContext;
const aCookiesPath : string; const aCookiesPath : string;
aPersistSessionCookies : boolean) : boolean; aPersistSessionCookies : boolean) : boolean;
var var
TempCookieManager : ICefCookieManager; TempCookieManager : ICefCookieManager;
@ -2779,6 +2834,63 @@ begin
end; end;
end; end;
procedure TChromium.BrowserCompWndProc(var aMessage: TMessage);
var
TempHandled : boolean;
begin
TempHandled := False;
if assigned(FOnBrowserCompMsg) then
FOnBrowserCompMsg(aMessage, TempHandled);
if not(TempHandled) and
(FOldBrowserCompWndPrc <> nil) and
(FBrowserCompHWND <> 0) then
aMessage.Result := CallWindowProc(FOldBrowserCompWndPrc,
FBrowserCompHWND,
aMessage.Msg,
aMessage.wParam,
aMessage.lParam);
end;
procedure TChromium.WidgetCompWndProc(var aMessage: TMessage);
var
TempHandled : boolean;
begin
TempHandled := False;
if assigned(FOnWidgetCompMsg) then
FOnWidgetCompMsg(aMessage, TempHandled);
if not(TempHandled) and
(FOldWidgetCompWndPrc <> nil) and
(FWidgetCompHWND <> 0) then
aMessage.Result := CallWindowProc(FOldWidgetCompWndPrc,
FWidgetCompHWND,
aMessage.Msg,
aMessage.wParam,
aMessage.lParam);
end;
procedure TChromium.RenderCompWndProc(var aMessage: TMessage);
var
TempHandled : boolean;
begin
TempHandled := False;
if assigned(FOnRenderCompMsg) then
FOnRenderCompMsg(aMessage, TempHandled);
if not(TempHandled) and
(FOldRenderCompWndPrc <> nil) and
(FRenderCompHWND <> 0) then
aMessage.Result := CallWindowProc(FOldRenderCompWndPrc,
FRenderCompHWND,
aMessage.Msg,
aMessage.wParam,
aMessage.lParam);
end;
function TChromium.doOnClose(const browser: ICefBrowser): Boolean; function TChromium.doOnClose(const browser: ICefBrowser): Boolean;
begin begin
Result := False; Result := False;
@ -3276,6 +3388,42 @@ end;
procedure TChromium.doOnRenderViewReady(const browser: ICefBrowser); procedure TChromium.doOnRenderViewReady(const browser: ICefBrowser);
begin begin
if (browser <> nil) and
(browser.Host <> nil) then
begin
FBrowserCompHWND := browser.Host.WindowHandle;
if (FBrowserCompHWND <> 0) then
FWidgetCompHWND := FindWindowEx(FBrowserCompHWND, 0, 'Chrome_WidgetWin_0', '');
if (FWidgetCompHWND <> 0) then
FRenderCompHWND := FindWindowEx(FWidgetCompHWND, 0, 'Chrome_RenderWidgetHostHWND', 'Chrome Legacy Window');
if assigned(FOnBrowserCompMsg) and (FBrowserCompHWND <> 0) then
begin
FBrowserCompStub := MakeObjectInstance(BrowserCompWndProc);
FOldBrowserCompWndPrc := Pointer(SetWindowLongPtr(FBrowserCompHWND,
GWL_WNDPROC,
NativeInt(FBrowserCompStub)));
end;
if assigned(FOnWidgetCompMsg) and (FWidgetCompHWND <> 0) then
begin
FWidgetCompStub := MakeObjectInstance(WidgetCompWndProc);
FOldWidgetCompWndPrc := Pointer(SetWindowLongPtr(FWidgetCompHWND,
GWL_WNDPROC,
NativeInt(FWidgetCompStub)));
end;
if assigned(FOnRenderCompMsg) and (FRenderCompHWND <> 0) then
begin
FRenderCompStub := MakeObjectInstance(RenderCompWndProc);
FOldRenderCompWndPrc := Pointer(SetWindowLongPtr(FRenderCompHWND,
GWL_WNDPROC,
NativeInt(FRenderCompStub)));
end;
end;
if Assigned(FOnRenderViewReady) then FOnRenderViewReady(Self, browser); if Assigned(FOnRenderViewReady) then FOnRenderViewReady(Self, browser);
end; end;

View File

@ -48,9 +48,9 @@ interface
uses uses
{$IFDEF DELPHI16_UP} {$IFDEF DELPHI16_UP}
System.Classes, System.Classes, {$IFDEF MSWINDOWS}WinApi.Messages,{$ENDIF}
{$ELSE} {$ELSE}
Classes, Classes, {$IFDEF MSWINDOWS}Messages,{$ENDIF}
{$ENDIF} {$ENDIF}
uCEFTypes, uCEFInterfaces; uCEFTypes, uCEFInterfaces;
@ -156,6 +156,9 @@ type
TOnPrefsAvailableEvent = procedure(Sender: TObject; aResultOK : boolean) of object; TOnPrefsAvailableEvent = procedure(Sender: TObject; aResultOK : boolean) of object;
TOnCookiesDeletedEvent = procedure(Sender: TObject; numDeleted : integer) of object; TOnCookiesDeletedEvent = procedure(Sender: TObject; numDeleted : integer) of object;
TOnResolvedIPsAvailableEvent = procedure(Sender: TObject; result: TCefErrorCode; const resolvedIps: TStrings) of object; TOnResolvedIPsAvailableEvent = procedure(Sender: TObject; result: TCefErrorCode; const resolvedIps: TStrings) of object;
{$IFDEF MSWINDOWS}
TOnCompMsgEvent = procedure (var aMessage: TMessage; var aHandled: Boolean) of object;
{$ENDIF}
implementation implementation

View File

@ -127,7 +127,7 @@ begin
if (FChromium <> nil) then if (FChromium <> nil) then
Result := FChromium.WindowHandle Result := FChromium.WindowHandle
else else
Result := 0; Result := inherited GetChildWindowHandle;
end; end;
function TChromiumWindow.GetBrowserInitialized : boolean; function TChromiumWindow.GetBrowserInitialized : boolean;

View File

@ -167,7 +167,7 @@ const
UR_FLAG_NONE = 0; UR_FLAG_NONE = 0;
UR_FLAG_SKIP_CACHE = 1 shl 0; UR_FLAG_SKIP_CACHE = 1 shl 0;
UR_FLAG_ONLY_FROM_CACHE = 1 shl 1; UR_FLAG_ONLY_FROM_CACHE = 1 shl 1;
UR_FLAG_ALLOW_CACHED_CREDENTIALS = 1 shl 2; UR_FLAG_ALLOW_STORED_CREDENTIALS = 1 shl 2;
UR_FLAG_REPORT_UPLOAD_PROGRESS = 1 shl 3; UR_FLAG_REPORT_UPLOAD_PROGRESS = 1 shl 3;
UR_FLAG_NO_DOWNLOAD_DATA = 1 shl 4; UR_FLAG_NO_DOWNLOAD_DATA = 1 shl 4;
UR_FLAG_NO_RETRY_ON_5XX = 1 shl 5; UR_FLAG_NO_RETRY_ON_5XX = 1 shl 5;

View File

@ -149,7 +149,7 @@ type
TOnGetDataResourceEvent = {$IFDEF DELPHI12_UP}reference to{$ENDIF} procedure(resourceId: Integer; out data: Pointer; out dataSize: NativeUInt; var aResult : Boolean) {$IFNDEF DELPHI12_UP}of object{$ENDIF}; TOnGetDataResourceEvent = {$IFDEF DELPHI12_UP}reference to{$ENDIF} procedure(resourceId: Integer; out data: Pointer; out dataSize: NativeUInt; var aResult : Boolean) {$IFNDEF DELPHI12_UP}of object{$ENDIF};
TOnGetLocalizedStringEvent = {$IFDEF DELPHI12_UP}reference to{$ENDIF} procedure(stringId: Integer; out stringVal: ustring; var aResult : Boolean) {$IFNDEF DELPHI12_UP}of object{$ENDIF}; TOnGetLocalizedStringEvent = {$IFDEF DELPHI12_UP}reference to{$ENDIF} procedure(stringId: Integer; out stringVal: ustring; var aResult : Boolean) {$IFNDEF DELPHI12_UP}of object{$ENDIF};
TOnGetDataResourceForScaleEvent = {$IFDEF DELPHI12_UP}reference to{$ENDIF} procedure(resourceId: Integer; scaleFactor: TCefScaleFactor; out data: Pointer; out dataSize: NativeUInt; var aResult : Boolean) {$IFNDEF DELPHI12_UP}of object{$ENDIF}; TOnGetDataResourceForScaleEvent = {$IFDEF DELPHI12_UP}reference to{$ENDIF} procedure(resourceId: Integer; scaleFactor: TCefScaleFactor; out data: Pointer; out dataSize: NativeUInt; var aResult : Boolean) {$IFNDEF DELPHI12_UP}of object{$ENDIF};
TOnCDMRegistrationCompleteEvent = {$IFDEF DELPHI12_UP}reference to{$ENDIF} procedure(result : TCefCDMRegistrationError; const error_message : ustring) {$IFNDEF DELPHI12_UP}of object{$ENDIF};
// ******************************************* // *******************************************

View File

@ -109,6 +109,16 @@ function SystemTimeToTzSpecificLocalTime(lpTimeZoneInformation: PTimeZoneInforma
function PathIsRelativeAnsi(pszPath: LPCSTR): BOOL; stdcall; external SHLWAPIDLL name 'PathIsRelativeA'; function PathIsRelativeAnsi(pszPath: LPCSTR): BOOL; stdcall; external SHLWAPIDLL name 'PathIsRelativeA';
function PathIsRelativeUnicode(pszPath: LPCWSTR): BOOL; stdcall; external SHLWAPIDLL name 'PathIsRelativeW'; function PathIsRelativeUnicode(pszPath: LPCWSTR): BOOL; stdcall; external SHLWAPIDLL name 'PathIsRelativeW';
{$IFNDEF DELPHI12_UP}
function SetWindowLongPtr(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; stdcall;
{$IFDEF WIN64}
function SetWindowLongPtr; external user32 name 'SetWindowLongPtrW';
{$ELSE}
function SetWindowLongPtr; external user32 name 'SetWindowLongW';
{$ENDIF}
{$ENDIF}
function CustomPathIsRelative(const aPath : string) : boolean; function CustomPathIsRelative(const aPath : string) : boolean;
function GetModulePath : string; function GetModulePath : string;
@ -190,9 +200,6 @@ procedure LogicalToDevice(var aRect : TCEFRect; const aDeviceScaleFactor : doubl
function GetScreenDPI : integer; function GetScreenDPI : integer;
function GetDeviceScaleFactor : single; function GetDeviceScaleFactor : single;
procedure CefRegisterWidevineCdm(const path: ustring; const callback: ICefRegisterCdmCallback);
procedure CefFastRegisterWidevineCdm(const path: ustring; const callback: TCefRegisterCDMProc);
implementation implementation
uses uses
@ -778,7 +785,6 @@ begin
TempList.Add(TempDir + 'swiftshader\libEGL.dll'); TempList.Add(TempDir + 'swiftshader\libEGL.dll');
TempList.Add(TempDir + 'swiftshader\libGLESv2.dll'); TempList.Add(TempDir + 'swiftshader\libGLESv2.dll');
TempList.Add(TempDir + 'icudtl.dat'); TempList.Add(TempDir + 'icudtl.dat');
TempList.Add(TempDir + 'widevinecdmadapter.dll');
if TempExists then if TempExists then
Result := CheckFilesExist(TempList, aMissingFiles) Result := CheckFilesExist(TempList, aMissingFiles)
@ -1418,17 +1424,4 @@ begin
Result := GetScreenDPI / 96; Result := GetScreenDPI / 96;
end; end;
procedure CefRegisterWidevineCdm(const path: ustring; const callback: ICefRegisterCdmCallback);
var
str: TCefString;
begin
str := CefString(path);
cef_register_widevine_cdm(@str, CefGetData(callback));
end;
procedure CefFastRegisterWidevineCdm(const path: ustring; const callback: TCefRegisterCDMProc);
begin
CefRegisterWidevineCdm(path, TCefFastRegisterCdmCallback.Create(callback) as ICefRegisterCdmCallback);
end;
end. end.

View File

@ -47,7 +47,7 @@ unit uCEFRegisterCDMCallback;
interface interface
uses uses
uCEFBaseRefCounted, uCEFInterfaces, uCEFTypes; uCEFBaseRefCounted, uCEFInterfaces, uCEFTypes, uCEFApplication;
type type
TCefRegisterCDMProc = {$IFDEF DELPHI12_UP}reference to{$ENDIF} procedure(result: TCefCDMRegistrationError; const error_message: ustring); TCefRegisterCDMProc = {$IFDEF DELPHI12_UP}reference to{$ENDIF} procedure(result: TCefCDMRegistrationError; const error_message: ustring);
@ -70,11 +70,33 @@ type
constructor Create(const callback: TCefRegisterCDMProc); reintroduce; constructor Create(const callback: TCefRegisterCDMProc); reintroduce;
end; end;
TCefCustomRegisterCDMCallback = class(TCefRegisterCDMCallbackOwn)
protected
FCefApp : TCefApplication;
procedure OnCDMRegistrationComplete(result: TCefCDMRegistrationError; const error_message: ustring); override;
public
constructor Create(const aCefApp : TCefApplication); reintroduce;
destructor Destroy; override;
end;
implementation implementation
uses uses
{$IFDEF DELPHI16_UP}
System.SysUtils,
{$ELSE}
SysUtils,
{$ENDIF}
uCEFMiscFunctions, uCEFLibFunctions; uCEFMiscFunctions, uCEFLibFunctions;
// ************************************************
// ********** TCefRegisterCDMCallbackOwn **********
// ************************************************
procedure cef_register_cdm_callback_on_cdm_registration_complete( self : PCefRegisterCDMCallback; procedure cef_register_cdm_callback_on_cdm_registration_complete( self : PCefRegisterCDMCallback;
result : TCefCDMRegistrationError; result : TCefCDMRegistrationError;
const error_message : PCefString); stdcall; const error_message : PCefString); stdcall;
@ -88,8 +110,6 @@ begin
CefString(error_message)); CefString(error_message));
end; end;
// TCefRegisterCDMCallbackOwn
constructor TCefRegisterCDMCallbackOwn.Create; constructor TCefRegisterCDMCallbackOwn.Create;
begin begin
inherited CreateData(SizeOf(TCefRegisterCDMCallback)); inherited CreateData(SizeOf(TCefRegisterCDMCallback));
@ -103,7 +123,11 @@ begin
// //
end; end;
// TCefFastRegisterCDMCallback
// ************************************************
// ********** TCefFastRegisterCDMCallback *********
// ************************************************
constructor TCefFastRegisterCDMCallback.Create(const callback: TCefRegisterCDMProc); constructor TCefFastRegisterCDMCallback.Create(const callback: TCefRegisterCDMProc);
begin begin
@ -117,4 +141,35 @@ begin
end; end;
// ************************************************
// ******** TCefCustomRegisterCDMCallback *********
// ************************************************
constructor TCefCustomRegisterCDMCallback.Create(const aCefApp : TCefApplication);
begin
inherited Create;
FCefApp := aCefApp;
end;
destructor TCefCustomRegisterCDMCallback.Destroy;
begin
FCefApp := nil;
inherited Destroy;
end;
procedure TCefCustomRegisterCDMCallback.OnCDMRegistrationComplete( result : TCefCDMRegistrationError;
const error_message : ustring);
begin
try
if (FCefApp <> nil) then FCefApp.Internal_OnCDMRegistrationComplete(result, error_message);
except
on e : exception do
if CustomExceptionHandler('TCefCustomRegisterCDMCallback.OnCDMRegistrationComplete', e) then raise;
end;
end;
end. end.

View File

@ -182,7 +182,7 @@ function TCEFWindowParent.DestroyChildWindow : boolean;
var var
TempHWND : HWND; TempHWND : HWND;
begin begin
TempHWND := GetWindow(Handle, GW_CHILD); TempHWND := ChildWindowHandle;
Result := (TempHWND <> 0) and DestroyWindow(TempHWND); Result := (TempHWND <> 0) and DestroyWindow(TempHWND);
end; end;

View File

@ -48,6 +48,9 @@ interface
uses uses
System.Classes, System.Types, System.Classes, System.Types,
{$IFDEF MSWINDOWS}
WinApi.Windows, WinApi.Messages,
{$ENDIF}
FMX.Types, FMX.Platform, FMX.Controls, FMX.Forms, FMX.Types, FMX.Platform, FMX.Controls, FMX.Forms,
uCEFTypes, uCEFInterfaces, uCEFLibFunctions, uCEFMiscFunctions, uCEFClient, uCEFTypes, uCEFInterfaces, uCEFLibFunctions, uCEFMiscFunctions, uCEFClient,
uCEFConstants, uCEFTask, uCEFChromiumEvents, uCEFChromiumOptions, uCEFChromiumFontOptions, uCEFConstants, uCEFTask, uCEFChromiumEvents, uCEFChromiumOptions, uCEFChromiumFontOptions,
@ -98,6 +101,17 @@ type
FWebRTCIPHandlingPolicy : TCefWebRTCHandlingPolicy; FWebRTCIPHandlingPolicy : TCefWebRTCHandlingPolicy;
FWebRTCMultipleRoutes : TCefState; FWebRTCMultipleRoutes : TCefState;
FWebRTCNonProxiedUDP : TCefState; FWebRTCNonProxiedUDP : TCefState;
{$IFDEF MSWINDOWS}
FOldBrowserCompWndPrc : Pointer;
FOldWidgetCompWndPrc : Pointer;
FOldRenderCompWndPrc : Pointer;
FBrowserCompHWND : THandle;
FWidgetCompHWND : THandle;
FRenderCompHWND : THandle;
FBrowserCompStub : Pointer;
FWidgetCompStub : Pointer;
FRenderCompStub : Pointer;
{$ENDIF}
// ICefClient // ICefClient
FOnProcessMessageReceived : TOnProcessMessageReceived; FOnProcessMessageReceived : TOnProcessMessageReceived;
@ -197,6 +211,11 @@ type
FOnPdfPrintFinished : TOnPdfPrintFinishedEvent; FOnPdfPrintFinished : TOnPdfPrintFinishedEvent;
FOnCookiesDeleted : TOnCookiesDeletedEvent; FOnCookiesDeleted : TOnCookiesDeletedEvent;
FOnResolvedHostAvailable : TOnResolvedIPsAvailableEvent; FOnResolvedHostAvailable : TOnResolvedIPsAvailableEvent;
{$IFDEF MSWINDOWS}
FOnBrowserCompMsg : TOnCompMsgEvent;
FOnWidgetCompMsg : TOnCompMsgEvent;
FOnRenderCompMsg : TOnCompMsgEvent;
{$ENDIF}
function GetIsLoading : boolean; function GetIsLoading : boolean;
function GetMultithreadApp : boolean; function GetMultithreadApp : boolean;
@ -290,6 +309,12 @@ type
procedure ApplyZoomStep; procedure ApplyZoomStep;
function GetParentForm : TCustomForm; function GetParentForm : TCustomForm;
{$IFDEF MSWINDOWS}
procedure BrowserCompWndProc(var aMessage: TMessage);
procedure WidgetCompWndProc(var aMessage: TMessage);
procedure RenderCompWndProc(var aMessage: TMessage);
{$ENDIF}
// IChromiumEvents // IChromiumEvents
procedure GetSettings(var aSettings : TCefBrowserSettings); procedure GetSettings(var aSettings : TCefBrowserSettings);
@ -547,6 +572,11 @@ type
property OnPdfPrintFinished : TOnPdfPrintFinishedEvent read FOnPdfPrintFinished write FOnPdfPrintFinished; property OnPdfPrintFinished : TOnPdfPrintFinishedEvent read FOnPdfPrintFinished write FOnPdfPrintFinished;
property OnCookiesDeleted : TOnCookiesDeletedEvent read FOnCookiesDeleted write FOnCookiesDeleted; property OnCookiesDeleted : TOnCookiesDeletedEvent read FOnCookiesDeleted write FOnCookiesDeleted;
property OnResolvedHostAvailable : TOnResolvedIPsAvailableEvent read FOnResolvedHostAvailable write FOnResolvedHostAvailable; property OnResolvedHostAvailable : TOnResolvedIPsAvailableEvent read FOnResolvedHostAvailable write FOnResolvedHostAvailable;
{$IFDEF MSWINDOWS}
property OnBrowserCompMsg : TOnCompMsgEvent read FOnBrowserCompMsg write FOnBrowserCompMsg;
property OnWidgetCompMsg : TOnCompMsgEvent read FOnWidgetCompMsg write FOnWidgetCompMsg;
property OnRenderCompMsg : TOnCompMsgEvent read FOnRenderCompMsg write FOnRenderCompMsg;
{$ENDIF}
// ICefClient // ICefClient
property OnProcessMessageReceived : TOnProcessMessageReceived read FOnProcessMessageReceived write FOnProcessMessageReceived; property OnProcessMessageReceived : TOnProcessMessageReceived read FOnProcessMessageReceived write FOnProcessMessageReceived;
@ -679,6 +709,18 @@ begin
FZoomStep := ZOOM_STEP_DEF; FZoomStep := ZOOM_STEP_DEF;
FWindowName := ''; FWindowName := '';
{$IFDEF MSWINDOWS}
FOldBrowserCompWndPrc := nil;
FOldWidgetCompWndPrc := nil;
FOldRenderCompWndPrc := nil;
FBrowserCompHWND := 0;
FWidgetCompHWND := 0;
FRenderCompHWND := 0;
FBrowserCompStub := nil;
FWidgetCompStub := nil;
FRenderCompStub := nil;
{$ENDIF}
FDragOperations := DRAG_OPERATION_NONE; FDragOperations := DRAG_OPERATION_NONE;
FDragAndDropInitialized := False; FDragAndDropInitialized := False;
@ -726,6 +768,32 @@ end;
procedure TFMXChromium.BeforeDestruction; procedure TFMXChromium.BeforeDestruction;
begin begin
{$IFDEF MSWINDOWS}
if (FBrowserCompHWND <> 0) and (FOldBrowserCompWndPrc <> nil) then
begin
SetWindowLongPtr(FBrowserCompHWND, GWL_WNDPROC, NativeInt(FOldBrowserCompWndPrc));
FreeObjectInstance(FBrowserCompStub);
FOldBrowserCompWndPrc := nil;
FBrowserCompStub := nil;
end;
if (FWidgetCompHWND <> 0) and (FOldWidgetCompWndPrc <> nil) then
begin
SetWindowLongPtr(FWidgetCompHWND, GWL_WNDPROC, NativeInt(FOldWidgetCompWndPrc));
FreeObjectInstance(FWidgetCompStub);
FOldWidgetCompWndPrc := nil;
FWidgetCompStub := nil;
end;
if (FRenderCompHWND <> 0) and (FOldRenderCompWndPrc <> nil) then
begin
SetWindowLongPtr(FRenderCompHWND, GWL_WNDPROC, NativeInt(FOldRenderCompWndPrc));
FreeObjectInstance(FRenderCompStub);
FOldRenderCompWndPrc := nil;
FRenderCompStub := nil;
end;
{$ENDIF}
DestroyClientHandler; DestroyClientHandler;
inherited BeforeDestruction; inherited BeforeDestruction;
@ -2978,6 +3046,44 @@ end;
procedure TFMXChromium.doOnRenderViewReady(const browser: ICefBrowser); procedure TFMXChromium.doOnRenderViewReady(const browser: ICefBrowser);
begin begin
{$IFDEF MSWINDOWS}
if (browser <> nil) and
(browser.Host <> nil) then
begin
FBrowserCompHWND := browser.Host.WindowHandle;
if (FBrowserCompHWND <> 0) then
FWidgetCompHWND := FindWindowEx(FBrowserCompHWND, 0, 'Chrome_WidgetWin_0', '');
if (FWidgetCompHWND <> 0) then
FRenderCompHWND := FindWindowEx(FWidgetCompHWND, 0, 'Chrome_RenderWidgetHostHWND', 'Chrome Legacy Window');
if assigned(FOnBrowserCompMsg) and (FBrowserCompHWND <> 0) then
begin
FBrowserCompStub := MakeObjectInstance(BrowserCompWndProc);
FOldBrowserCompWndPrc := Pointer(SetWindowLongPtr(FBrowserCompHWND,
GWL_WNDPROC,
NativeInt(FBrowserCompStub)));
end;
if assigned(FOnWidgetCompMsg) and (FWidgetCompHWND <> 0) then
begin
FWidgetCompStub := MakeObjectInstance(WidgetCompWndProc);
FOldWidgetCompWndPrc := Pointer(SetWindowLongPtr(FWidgetCompHWND,
GWL_WNDPROC,
NativeInt(FWidgetCompStub)));
end;
if assigned(FOnRenderCompMsg) and (FRenderCompHWND <> 0) then
begin
FRenderCompStub := MakeObjectInstance(RenderCompWndProc);
FOldRenderCompWndPrc := Pointer(SetWindowLongPtr(FRenderCompHWND,
GWL_WNDPROC,
NativeInt(FRenderCompStub)));
end;
end;
{$ENDIF}
if Assigned(FOnRenderViewReady) then FOnRenderViewReady(Self, browser); if Assigned(FOnRenderViewReady) then FOnRenderViewReady(Self, browser);
end; end;
@ -3100,6 +3206,65 @@ begin
TempComp := TempComp.owner; TempComp := TempComp.owner;
end; end;
{$IFDEF MSWINDOWS}
procedure TFMXChromium.BrowserCompWndProc(var aMessage: TMessage);
var
TempHandled : boolean;
begin
TempHandled := False;
if assigned(FOnBrowserCompMsg) then
FOnBrowserCompMsg(aMessage, TempHandled);
if not(TempHandled) and
(FOldBrowserCompWndPrc <> nil) and
(FBrowserCompHWND <> 0) then
aMessage.Result := CallWindowProc(FOldBrowserCompWndPrc,
FBrowserCompHWND,
aMessage.Msg,
aMessage.wParam,
aMessage.lParam);
end;
procedure TFMXChromium.WidgetCompWndProc(var aMessage: TMessage);
var
TempHandled : boolean;
begin
TempHandled := False;
if assigned(FOnWidgetCompMsg) then
FOnWidgetCompMsg(aMessage, TempHandled);
if not(TempHandled) and
(FOldWidgetCompWndPrc <> nil) and
(FWidgetCompHWND <> 0) then
aMessage.Result := CallWindowProc(FOldWidgetCompWndPrc,
FWidgetCompHWND,
aMessage.Msg,
aMessage.wParam,
aMessage.lParam);
end;
procedure TFMXChromium.RenderCompWndProc(var aMessage: TMessage);
var
TempHandled : boolean;
begin
TempHandled := False;
if assigned(FOnRenderCompMsg) then
FOnRenderCompMsg(aMessage, TempHandled);
if not(TempHandled) and
(FOldRenderCompWndPrc <> nil) and
(FRenderCompHWND <> 0) then
aMessage.Result := CallWindowProc(FOldRenderCompWndPrc,
FRenderCompHWND,
aMessage.Msg,
aMessage.wParam,
aMessage.lParam);
end;
{$ENDIF}
procedure TFMXChromium.MoveFormTo(const x, y: Integer); procedure TFMXChromium.MoveFormTo(const x, y: Integer);
var var
TempForm : TCustomForm; TempForm : TCustomForm;