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

Post Reply
ericktux
Posts: 18
Joined: Thu Oct 29, 2020 10:11 am

open popup in new tab

Post by ericktux »

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
User avatar
salvadordf
Posts: 4016
Joined: Thu Feb 02, 2017 12:24 pm
Location: Spain
Contact:

Re: open popup in new tab

Post by salvadordf »

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.
ericktux
Posts: 18
Joined: Thu Oct 29, 2020 10:11 am

Re: open popup in new tab

Post by ericktux »

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:

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;  
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. :(
User avatar
salvadordf
Posts: 4016
Joined: Thu Feb 02, 2017 12:24 pm
Location: Spain
Contact:

Re: open popup in new tab

Post by salvadordf »

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
ericktux
Posts: 18
Joined: Thu Oct 29, 2020 10:11 am

Re: open popup in new tab

Post by ericktux »

Thanks friend for your advice, I will review it and tell you how it went, greetings
ericktux
Posts: 18
Joined: Thu Oct 29, 2020 10:11 am

Re: open popup in new tab

Post by ericktux »

hello friends, I could already create a new tab from the event "TBrowserFrame.Chromium1BeforePopup" the steps I followed are:

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;
now in the event "TBrowserFrame.Chromium1BeforePopup" I use this code:

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;
At the moment it is working well for me, but if something I am doing wrong or can be improved, I appreciate your advice.
Post Reply