Luca
Luca

Reputation: 31

GeckoFX browser - Control new window

I'm working for the first time with GeckoFX. I searched everywhere but there are not answered questions about it.

I'm trying to add a DocumentCompleted listener on a new window that pops up after clicking on href with blank target

<a href='newWindow.html' target='_blank'>Click here</a>

GeckoFX creates a new window and pops it up, but I can't get control over the new window WebBrowser events.

I tried doing something like

    private void browser_CreateWindow(object sender, Gecko.GeckoCreateWindowEventArgs e)
    {
        e.WebBrowser.DocumentCompleted += WebBrowser_DocumentCompleted;
    }

    private void WebBrowser_DocumentCompleted(object sender, GeckoDocumentCompletedEventArgs e)
    {
        MessageBox.Show("Document Completed!");
    }

but e.WebBrowser is always null.

Upvotes: 2

Views: 1719

Answers (1)

Bartosz
Bartosz

Reputation: 4786

the original answer is here, but I'm pasting it in case link dies etc.

Let's say that is you form:

 public partial class MainForm: Form
{
    public MainForm()
    {
        InitializeComponent();

        WindowWatcher.WindowCreator = new TabbedBrowserCreator( this );
        WindowWatcher.LockWindowCreator();

        gwBrowser.DocumentTitleChanged += gwBrowser_DocumentTitleChanged;
        gwBrowser.DocumentCompleted += gwBrowser_DocumentCompleted;

        gwBrowser.Navigate( "http://www.popuptest.com/" );
    }

    void gwBrowser_DocumentTitleChanged( object sender, EventArgs e )
    {
        tabPageMain.Text = gwBrowser.DocumentTitle;
    }

    void gwBrowser_DocumentCompleted( object sender, EventArgs e )
    {
        // Some work on document completed
    }

    internal nsIWebBrowserChrome AddNewTab()
    {
        GeckoWebBrowser gwBrowserTab = new GeckoWebBrowser();
        gwBrowserTab.DocumentTitleChanged += gwBrowserTab_DocumentTitleChanged;
        gwBrowserTab.DocumentCompleted += gwBrowserTab_DocumentCompleted;

        TabPage oTabPage = new TabPage( "New Tab" );
        Padding oPadding = oTabPage.Margin; oPadding.All = 0;
        oPadding = oTabPage.Padding; oPadding.All = 0;
        oTabPage.Controls.Add( gwBrowserTab );

        gwBrowserTab.Dock = DockStyle.Fill;

        tabControlMain.TabPages.Add( oTabPage );

        return gwBrowserTab;
    }

    private void gwBrowserTab_DocumentTitleChanged( object sender, EventArgs e )
    {
        GeckoWebBrowser gwBrowserTab = sender as GeckoWebBrowser;
        if ( gwBrowserTab == null ) return;

        TabPage oTabPage = gwBrowserTab.Parent as TabPage;
        if ( oTabPage == null ) return;

        oTabPage.Text = gwBrowserTab.DocumentTitle;
    }

    private void gwBrowserTab_DocumentCompleted( object sender, EventArgs e )
    {
        GeckoWebBrowser gwBrowserTab = sender as GeckoWebBrowser;
        if ( gwBrowserTab == null ) return;

        TabPage oTabPage = gwBrowserTab.Parent as TabPage;
        if ( oTabPage == null ) return;

        tabControlMain.SelectedTab = oTabPage;
    }
}

And the key thing, custom windows creator:

public sealed class TabbedBrowserCreator: nsIWindowCreator2
{
    private MainForm m_Parent;

    public TabbedBrowserCreator( MainForm p_Parent )
    {
        m_Parent = p_Parent;
    }

    nsIWebBrowserChrome nsIWindowCreator2.CreateChromeWindow( nsIWebBrowserChrome parent, uint chromeFlags )
    {
        bool bCancel = false;
        return CreateWindow( parent, chromeFlags, 0, null, ref bCancel );
    }

    nsIWebBrowserChrome nsIWindowCreator2.CreateChromeWindow2( nsIWebBrowserChrome parent, uint chromeFlags, uint contextFlags, nsIURI uri, ref bool cancel )
    {
        return CreateWindow( parent, chromeFlags, contextFlags, uri, ref cancel );
    }

    nsIWebBrowserChrome nsIWindowCreator.CreateChromeWindow( nsIWebBrowserChrome parent, uint chromeFlags )
    {

        bool cancel = false;
        return CreateWindow( parent, chromeFlags, 0, null, ref cancel );
    }

    private nsIWebBrowserChrome CreateWindow( nsIWebBrowserChrome parent, uint chromeFlags, uint contextFlags, nsIURI uri, ref bool cancel )
    {
        GeckoWindowFlags flags = (GeckoWindowFlags)chromeFlags;

        if ( (flags & GeckoWindowFlags.OpenAsChrome) != 0 )
        {
            // create the child window
            nsIXULWindow xulChild = AppShellService.CreateTopLevelWindow( null, null, chromeFlags, -1, -1 );

            // this little gem allows the GeckoWebBrowser to be properly activated when it gains the focus again
            if ( parent is GeckoWebBrowser && (flags & GeckoWindowFlags.OpenAsDialog) != 0 )
            {
                EventHandler gotFocus = null;
                gotFocus = delegate( object sender, EventArgs e )
                {
                    var br = (sender as GeckoWebBrowser);
                    if ( br != null )
                    {
                        br.GotFocus -= gotFocus;
                        br.WebBrowserFocus.Activate();
                    }

                };
                var parBr = parent as GeckoWebBrowser;
                parBr.GotFocus += gotFocus;
            }

            // return the chrome
            return Xpcom.QueryInterface<nsIWebBrowserChrome>( xulChild );
        }

        nsIWebBrowserChrome oBrowser = m_Parent.AddNewTab();
        oBrowser.SetChromeFlagsAttribute( chromeFlags );
        return oBrowser;
    }
}

Hope this helps. Cheers

Upvotes: 1

Related Questions