I am making it again with cefsharp, but I think this is a difficult problem.
dcef3 was not properly handled, so I left a new window open and got the request information and reproduced it in a new tab.
cefsharp had to do that too.
I see that all of the projects have problems, so it seems that this project also has problems, so please check it when you have time.
In cef4delphi, new tabs other than onbeforepopup can be freed without events or postmessage, but I think that is normal.
Thank you for making a good project, please keep it for a long time.
Disclosure Statement: This site contains affiliate links, which means that I may receive a commission if you make a purchase using these links. As an eBay Partner, I earn from qualifying purchases.
how can I close beforepopup new tab?
- salvadordf
- Posts: 4080
- Joined: Thu Feb 02, 2017 12:24 pm
- Location: Spain
- Contact:
Re: how can I close beforepopup new tab?
Creating new custom tabs or custom popup windows from the TChromium.OnBeforePopup event is never easy with any of the CEF wrappers if you set GlobalCEFApp.MultiThreadedMessageLoop to True, which is the default value and the recommended setting for CEF browsers in Windows.
It would be slightly easier if you use set GlobalCEFApp.ExternalMessagePump to True and GlobalCEFApp.MultiThreadedMessageLoop to False but then you need to use a TCEFWorkScheduler as you can see in the ExternalPumpBrowser demo. With that configuration you should be able to create and destroy all Windows controls like tabs and popup windows inside the TChromium.OnBeforePopup event.
It would be slightly easier if you use set GlobalCEFApp.ExternalMessagePump to True and GlobalCEFApp.MultiThreadedMessageLoop to False but then you need to use a TCEFWorkScheduler as you can see in the ExternalPumpBrowser demo. With that configuration you should be able to create and destroy all Windows controls like tabs and popup windows inside the TChromium.OnBeforePopup event.
Re: how can I close beforepopup new tab?
Hi, try open the tab with PostMessage, It worked for me, here part of my code, I take and old demo of tabbedbrowser for the example
declare a constant
declare the functions
the functions
And finally make the call from beforePopup, globalUrl will be used when the browser are ready, so just catch the targetUrl
here open url
Now the tab or app can close without errors. Al least not this "System error 5 has occurred. Access is denied."
declare a constant
Code: Select all
const
NEW_TAB = WM_APP + $104;
Code: Select all
public
{ Public declarations }
procedure newTabMsg(var aMessage : TMessage); message NEW_TAB;
procedure newTab();
Code: Select all
procedure TMainForm.newTabMsg(var aMessage : TMessage); //process message
begin
newTab();
end;
procedure TMainForm.newTab(); // create new tab
var
TempSheet : TTabSheet;
TempWindowParent : TCEFWindowParent;
TempChromium : TChromium;
begin
ButtonPnl.Enabled := False;
PageControl1.Enabled := False;
TempSheet := TTabSheet.Create(PageControl1);
TempSheet.Caption := 'New tab';
TempSheet.PageControl := PageControl1;
TempWindowParent := TCEFWindowParent.Create(TempSheet);
TempWindowParent.Parent := TempSheet;
TempWindowParent.Color := clWhite;
TempWindowParent.Align := alClient;
TempChromium := TChromium.Create(TempSheet);
TempChromium.OnAfterCreated := Chromium_OnAfterCreated;
TempChromium.OnAddressChange := Chromium_OnAddressChange;
TempChromium.OnTitleChange := Chromium_OnTitleChange;
TempChromium.OnClose := Chromium_OnClose;
TempChromium.OnBeforeClose := Chromium_OnBeforeClose;
TempChromium.OnBeforePopup := Chromium_OnBeforePopup;
TempChromium.OnBeforeDownload := Chromium_OnBeforeDownload;
TempChromium.OnDownloadUpdated := Chromium_OnDownloadUpdated;
TempChromium.CreateBrowser(TempWindowParent, '');
end;
Code: Select all
procedure TMainForm.Chromium_OnBeforePopup(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame; const targetUrl,
targetFrameName: ustring; targetDisposition: TCefWindowOpenDisposition;
userGesture: Boolean; const popupFeatures: TCefPopupFeatures;
var windowInfo: TCefWindowInfo; var client: ICefClient;
var settings: TCefBrowserSettings; var noJavascriptAccess: Boolean;
var Result: Boolean);
begin
globalUrl:=targetUrl;
PostMessage(MainForm.Handle, NEW_TAB, 0, 0);
Result := true;
end;
Code: Select all
procedure TMainForm.BrowserCreatedMsg(var aMessage : TMessage);
var
TempWindowParent : TCEFWindowParent;
TempChromium : TChromium;
begin
ButtonPnl.Enabled := True;
PageControl1.Enabled := True;
if SearchWindowParent(aMessage.lParam, TempWindowParent) then
TempWindowParent.UpdateSize;
if SearchChromium(aMessage.lParam, TempChromium) then
TempChromium.LoadURL( globalUrl );
end;