Reputation: 31
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
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