From aba0ec399c72443fea429cbca88dfd2690884c5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Salvador=20D=C3=ADaz=20Fau?= Date: Thu, 12 Sep 2024 12:42:58 +0200 Subject: [PATCH] Always run TryCloseBrowser in the CEF UI thread --- source/uCEFChromiumCore.pas | 47 +++++++++++++++++++++++++++++++++---- source/uCEFInterfaces.pas | 1 + source/uCEFTask.pas | 23 ++++++++++++++++++ update_CEF4Delphi.json | 2 +- 4 files changed, 67 insertions(+), 6 deletions(-) diff --git a/source/uCEFChromiumCore.pas b/source/uCEFChromiumCore.pas index 6f866a43..1c809f85 100644 --- a/source/uCEFChromiumCore.pas +++ b/source/uCEFChromiumCore.pas @@ -117,6 +117,7 @@ type FHTTPSUpgrade : TCefState; FHSTSPolicyBypassList : ustring; FCredentialsService : TCefState; + FTryingToCloseBrowser : boolean; {$IFDEF LINUX} FXDisplay : PXDisplay; @@ -694,6 +695,7 @@ type procedure doSetAudioMuted(aValue : boolean); virtual; procedure doToggleAudioMuted; virtual; procedure doEnableFocus; virtual; + function doTryCloseBrowser : boolean; virtual; function MustCreateAudioHandler : boolean; virtual; function MustCreateCommandHandler : boolean; virtual; @@ -1741,7 +1743,7 @@ type /// /// This property can only be read on the CEF UI thread. /// - property RuntimeStyle : TCefRuntimeStyle read GetRuntimeStyle write SetRuntimeStyle; + property RuntimeStyle : TCefRuntimeStyle read GetRuntimeStyle write SetRuntimeStyle; /// /// Returns a ICefRequestContext instance used by the selected browser. /// @@ -3979,6 +3981,7 @@ begin FHTTPSUpgrade := STATE_DEFAULT; FHSTSPolicyBypassList := ''; FCredentialsService := STATE_DEFAULT; + FTryingToCloseBrowser := False; {$IFDEF LINUX} FXDisplay := nil; {$ENDIF} @@ -4867,7 +4870,12 @@ end; procedure TChromiumCore.CloseBrowser(aForceClose : boolean); begin if Initialized then - Browser.Host.CloseBrowser(aForceClose); + begin + if (RuntimeStyle <> CEF_RUNTIME_STYLE_ALLOY) then + SetBrowserIsClosing(browser.Identifier); + + Browser.Host.CloseBrowser(aForceClose); + end; end; procedure TChromiumCore.CloseAllBrowsers; @@ -4882,9 +4890,26 @@ begin end; function TChromiumCore.TryCloseBrowser : boolean; +var + TempTask : ICefTask; begin if Initialized then - Result := Browser.Host.TryCloseBrowser + begin + if FTryingToCloseBrowser then + Result := False + else + if CefCurrentlyOn(TID_UI) then + Result := doTryCloseBrowser + else + try + Result := False; + FTryingToCloseBrowser := True; + TempTask := TCefTryCloseBrowserTask.Create(self); + CefPostTask(TID_UI, TempTask); + finally + TempTask := nil; + end; + end else Result := True; end; @@ -5196,7 +5221,8 @@ begin if Initialized then begin TempFrame := Browser.MainFrame; - if (TempFrame <> nil) and TempFrame.IsValid then TempFrame.LoadRequest(aRequest); + if (TempFrame <> nil) and TempFrame.IsValid then + TempFrame.LoadRequest(aRequest); end; end; @@ -5692,7 +5718,8 @@ begin if Initialized then begin TempFrame := Browser.MainFrame; - if (TempFrame <> nil) and TempFrame.IsValid then Result := TempFrame.URL; + if (TempFrame <> nil) and TempFrame.IsValid then + Result := TempFrame.URL; end; end; @@ -7697,6 +7724,16 @@ begin AudioMuted := not(AudioMuted); end; +function TChromiumCore.doTryCloseBrowser: boolean; +begin + if Initialized then + Result := Browser.Host.TryCloseBrowser + else + Result := True; + + FTryingToCloseBrowser := False; +end; + procedure TChromiumCore.doEnableFocus; begin FCanFocus := True; diff --git a/source/uCEFInterfaces.pas b/source/uCEFInterfaces.pas index 4585a4e5..3a580ab9 100644 --- a/source/uCEFInterfaces.pas +++ b/source/uCEFInterfaces.pas @@ -507,6 +507,7 @@ type procedure doSetAudioMuted(aValue : boolean); procedure doToggleAudioMuted; procedure doEnableFocus; + function doTryCloseBrowser : boolean; function MustCreateAudioHandler : boolean; function MustCreateCommandHandler : boolean; function MustCreateLoadHandler : boolean; diff --git a/source/uCEFTask.pas b/source/uCEFTask.pas index e2880fab..e03f711b 100644 --- a/source/uCEFTask.pas +++ b/source/uCEFTask.pas @@ -197,6 +197,11 @@ type procedure Execute; override; end; + TCefTryCloseBrowserTask = class(TCefChromiumTask) + protected + procedure Execute; override; + end; + implementation uses @@ -677,4 +682,22 @@ begin end; end; + +// TCefTryCloseBrowserTask + +procedure TCefTryCloseBrowserTask.Execute; +begin + try + try + if CanExecute then + IChromiumEvents(FEvents).doTryCloseBrowser; + except + on e : exception do + if CustomExceptionHandler('TCefTryCloseBrowserTask.Execute', e) then raise; + end; + finally + FEvents := nil; + end; +end; + end. diff --git a/update_CEF4Delphi.json b/update_CEF4Delphi.json index dacd0907..e7e06968 100644 --- a/update_CEF4Delphi.json +++ b/update_CEF4Delphi.json @@ -2,7 +2,7 @@ "UpdateLazPackages" : [ { "ForceNotify" : true, - "InternalVersion" : 654, + "InternalVersion" : 655, "Name" : "cef4delphi_lazarus.lpk", "Version" : "128.4.9" }