hello friends, greetings.
I am practicing with the demo "TabbedBrowser2", my question is how can I open the popup web pages in a new tab.
I have reached the event "TBrowserFrame.Chromium1BeforePopup" and I have put "Result: = true" (to avoid showing a window), but now how can I send the order to the main process so that it creates a new tab with the new link. because I guess I can't do it directly from such an event.
please, any help I appreciate
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.
open popup in new tab
- salvadordf
- Posts: 4575
- Joined: Thu Feb 02, 2017 12:24 pm
- Location: Spain
- Contact:
Re: open popup in new tab
Hi,
You can cancel the new popup window and save the url in a class field or variable. Then send a windows message to the main form to create a new tab using the saved url.
This is a quick fix for your problem but it will have problems in case the new popup window had POST information.
The perfect solution would be to create a hidden tab with an uninitialized browser. You would initialize it by calling CreateClientHandler in the TChromium.OnBeforePopup event. The PopupBrowser2 demo do something very similar to handle new popup windows.
You can cancel the new popup window and save the url in a class field or variable. Then send a windows message to the main form to create a new tab using the saved url.
This is a quick fix for your problem but it will have problems in case the new popup window had POST information.
The perfect solution would be to create a hidden tab with an uninitialized browser. You would initialize it by calling CreateClientHandler in the TChromium.OnBeforePopup event. The PopupBrowser2 demo do something very similar to handle new popup windows.
Re: open popup in new tab
hello friend, thank you very much for answering.
I could achieve the cancellation of the pop-up window and save the url by putting it like this:
to send a message to the main form I have seen that they do it with "postmessage" or "sendmessage" but I don't know how to do it.
please help.
I could achieve the cancellation of the pop-up window and save the url by putting it like this:
Code: Select all
procedure TBrowserFrame.Chromium1BeforePopup(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame; const targetUrl,
targetFrameName: ustring; targetDisposition: TCefWindowOpenDisposition;
userGesture: Boolean; const popupFeatures: TCefPopupFeatures;
var windowInfo: TCefWindowInfo; var client: ICefClient;
var settings: TCefBrowserSettings; var extra_info: ICefDictionaryValue;
var noJavascriptAccess, Result: Boolean);
var
ID_addtab: integer;
begin
Result:=true; // cancel popup
mi_url_popup:=targetUrl; // capture link URL in variable "mi_url_popup" (string)
// here how can I send a message to the main form to create a new tab?
end;
please help.

- salvadordf
- Posts: 4575
- Joined: Thu Feb 02, 2017 12:24 pm
- Location: Spain
- Contact:
Re: open popup in new tab
You have most of the code you need in the PopupBrowser2 demo.
There are many tutorials in Internet about PostMessage. This one comes as one of the first google results when you search for "Delphi postmessage tutorial" :
https://www.cryer.co.uk/brian/delphi/ho ... essage.htm
There are many tutorials in Internet about PostMessage. This one comes as one of the first google results when you search for "Delphi postmessage tutorial" :
https://www.cryer.co.uk/brian/delphi/ho ... essage.htm
Re: open popup in new tab
Thanks friend for your advice, I will review it and tell you how it went, greetings
Re: open popup in new tab
hello friends, I could already create a new tab from the event "TBrowserFrame.Chromium1BeforePopup" the steps I followed are:
now in the event "TBrowserFrame.Chromium1BeforePopup" I use this code:
At the moment it is working well for me, but if something I am doing wrong or can be improved, I appreciate your advice.
Code: Select all
const
CEF_INITIALIZED = WM_APP + $100;
CEF_DESTROYTAB = WM_APP + $101;
NEW_TAB = WM_APP + $102; // add this code
HOMEPAGE_URL = 'https://www.google.com';
DEFAULT_TAB_CAPTION = 'New tab ';
......
public
procedure new_tab_crear(var aMessage : TMessage); message NEW_TAB; // add this code
procedure nuevo_tab(taburl: string); // add this code
end;
var
MainForm: TMainForm;
mi_url_popup: string; // add this code
.....
procedure TMainForm.nuevo_tab(taburl: string); // create new tab
var
TempNewTab : TBrowserTab;
ID_addtab: integer;
begin
// I use this code to order the tabs, because the last tab has the symbol "+" (new tab)
MainForm.BrowserPageCtrl.HandleNeeded;
ID_addtab:=MainForm.BrowserPageCtrl.PageCount-1;
///////////////// this is the main code /////////////////////////////////////////////////////////////
TempNewTab := TBrowserTab.Create(self, NextTabID, DEFAULT_TAB_CAPTION);
TempNewTab.PageControl := BrowserPageCtrl;
BrowserPageCtrl.ActivePageIndex := pred(BrowserPageCtrl.PageCount); // esto hace que cuando abramos nuevo tab el foco pase aqui
TempNewTab.CreateBrowser(taburl);
/////////////////////////////////////////////////////////////////////////////////////////////////
// I use this code to order the tabs, because the last tab has the symbol "+" (new tab)
MainForm.BrowserPageCtrl.TabIndex:=MainForm.BrowserPageCtrl.PageCount-1;
MainForm.BrowserPageCtrl.Pages[ID_addtab].PageIndex := MainForm.BrowserPageCtrl.PageCount-1;
end;
procedure TMainForm.new_tab_crear(var aMessage : TMessage);
begin
nuevo_tab(mi_url_popup);
end;
Code: Select all
procedure TBrowserFrame.Chromium1BeforePopup(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame; const targetUrl,
targetFrameName: ustring; targetDisposition: TCefWindowOpenDisposition;
userGesture: Boolean; const popupFeatures: TCefPopupFeatures;
var windowInfo: TCefWindowInfo; var client: ICefClient;
var settings: TCefBrowserSettings; var extra_info: ICefDictionaryValue;
var noJavascriptAccess, Result: Boolean);
var
ID_addtab: integer;
begin
Result:=true;
mi_url_popup:=targetUrl;
//PostMessage(Handle, NEW_TAB, 0, 0); // I do not work
PostMessage(MainForm.Handle, NEW_TAB, 0, 0); // It works well :)
end;