cefsharp popup to newtab. trouble with secondary popup

Viewed 2682

I am making a program that loads up only one webpage. User can not access to any other webpage and this windows form is full screen, no borderline.

I manage to make one using windows form and cefsharp but now I have different problem. This specific website displays new pop up when I try to log on. Usually on chrome, it just opens another tab for this but here, it doesn't make new tab but open up new pop up. So I made code to direct popup to newtab as below but it only make new tab for first popup from the first tabpage.

For example, page 1 opens popup then this code takes that popup and create tabPage 2. It works just fine till that point but if there's pop up in tabPage2, it just opens up pop up instead of creating new tab.

How do I fix this? Help please.. I am thinking it's creating new tab for only pop up from tabPage1 and whatever popup it gets from tabPage2, it won't open new tab. Is there way to get around this and fix it?

I am doing this on visual studio 2017 winform, cefsharp ver 67.0.0

Main Class

private void initialize_browser()
    {
        try
        {
            CefSettings settings = new CefSettings();
            Cef.Initialize(settings);

            //main browser
            chromeBrowser = new ChromiumWebBrowser("url");
            LifespanHandler life = new LifespanHandler();
            chromeBrowser.LifeSpanHandler = life;
            life.popup_request += life_popup_request;
            this.tabPage1.Controls.Add(chromeBrowser);
            chromeBrowser.Dock = DockStyle.Fill; 
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error in initializing the browser. Error: " + ex.Message);
        }
    }



    private void life_popup_request(string popup_request)
    {
        this.Invoke((MethodInvoker)delegate ()
        {
            string title = "TabPage " + (tabControl1.TabCount + 1).ToString();
            TabPage myTabPage = new TabPage(title);
            tabControl1.TabPages.Add(myTabPage);
            tabControl1.SelectTab(tabControl1.TabCount - 1);
            ChromiumWebBrowser chromeBrowser = new ChromiumWebBrowser(popup_request);
            chromeBrowser.Parent = myTabPage;
            chromeBrowser.Dock = DockStyle.Fill;
        });
    }

LifespanHandler Class

 public class LifespanHandler : ILifeSpanHandler
    {
        //event that receive url popup
        public event Action<string> popup_request;

        bool ILifeSpanHandler.OnBeforePopup(IWebBrowser browserControl, IBrowser browser, IFrame frame, string targetUrl, string targetFrameName, WindowOpenDisposition targetDisposition, bool userGesture, IPopupFeatures popupFeatures, IWindowInfo windowInfo, IBrowserSettings browserSettings, ref bool noJavascriptAccess, out IWebBrowser newBrowser)
        {
            //get url popup
            if (this.popup_request != null)
                this.popup_request(targetUrl);

            //stop open popup
            newBrowser = null;
            return true;
        }


        bool ILifeSpanHandler.DoClose(IWebBrowser browserControl, IBrowser browser)
        { return false; }


        void ILifeSpanHandler.OnBeforeClose(IWebBrowser browserControl, IBrowser browser) { }


        void ILifeSpanHandler.OnAfterCreated(IWebBrowser browserControl, IBrowser browser) { }
    }
1 Answers

I had same your trouble, so I fixed it.

  1. You should declare a variable Life as a global variable LifespanHandler life = new LifespanHandler();

  2. in life_popup_request function add :chromeBrowser.LifeSpanHandler = life;

    private void life_popup_request(string popup_request) { this.Invoke((MethodInvoker)delegate () { string title = "TabPage " + (tabControl1.TabCount + 1).ToString();

         TabPage myTabPage = new TabPage(title);
    
         tabControl1.TabPages.Add(myTabPage);
    
         tabControl1.SelectTab(tabControl1.TabCount - 1);
    
         ChromiumWebBrowser chromeBrowser = new ChromiumWebBrowser(popup_request);
    
         chromeBrowser.LifeSpanHandler = life; 
    
         chromeBrowser.Parent = myTabPage;
    
         chromeBrowser.Dock = DockStyle.Fill;
     });
    

    }

good luck !

Related