最近养成一个好习惯,遇到不会的事了就去源码找找
之前一直以为像弹出保存框和右键菜单这些基本功能,应该都配套的有的,
后来发现这些全部都要自己实现,而在 源码里官方其实已经把大多数的方法都写好了,可以直接提出来就用。
比如:弹出下载保存框
var mainForm = new MyForm();
首先官方写了一个窗口类,用来弹出下载界面
Gecko.LauncherDialog.Download += (s, e) => LauncherDialog_Download(mainForm, s, e);
然后注册事件就行,经过注册和取消注册测试,确认可以正确弹出下载界面
1、弹出保存框
class MyForm : Form
{
private TabControl m_tabControl;
public MyForm()
{
this.Width = 800;
this.Height = 600;
m_tabControl = new TabControl();
m_tabControl.Dock = DockStyle.Fill;
AddTab();
Controls.Add(m_tabControl);
m_tabControl.ControlRemoved += delegate {
if (m_tabControl.TabCount == 1)
{
AddTab();
}
};
}
protected void ModifyElements(GeckoElement element, string tagName, Action<GeckoElement> mod)
{
while (element != null)
{
if (element.TagName == tagName)
{
mod(element);
}
ModifyElements(element.FirstChild as GeckoHtmlElement, tagName, mod);
element = (element.NextSibling as GeckoHtmlElement);
}
}
protected void TestModifyingDom(GeckoWebBrowser browser)
{
GeckoElement g = browser.Document.DocumentElement;
ModifyElements(g, "BODY", e =>
{
for (int i = 1; i < 4; ++i)
{
var newElement = g.OwnerDocument.CreateElement(String.Format("h{0}", i));
newElement.TextContent = "Geckofx added this text.";
g.InsertBefore(newElement, e);
}
});
}
protected void DisplayElements(GeckoElement g)
{
while (g != null)
{
Console.WriteLine("tag = {0} value = {1}", g.TagName, g.TextContent);
DisplayElements(g.FirstChild as GeckoHtmlElement);
g = (g.NextSibling as GeckoHtmlElement);
}
}
protected void TestQueryingOfDom(GeckoWebBrowser browser)
{
GeckoElement g = browser.Document.DocumentElement;
DisplayElements(g);
}
protected GeckoWebBrowser AddTab()
{
var tabPage = new TabPage();
tabPage.Text = "blank";
var browser = new GeckoWebBrowser();
browser.Dock = DockStyle.Fill;
tabPage.DockPadding.Top = 25;
tabPage.Dock = DockStyle.Fill;
// add a handler showing how to view the DOM
// browser.DocumentCompleted += (s, e) => TestQueryingOfDom(browser);
// add a handler showing how to modify the DOM.
// browser.DocumentCompleted += (s, e) => TestModifyingDom(browser);
// add a handle to detect when user modifies a contentEditable part of the document.
browser.DomInput += (sender, args) => MessageBox.Show(String.Format("User modified element {0}", (args.Target.CastToGeckoElement() as GeckoHtmlElement).OuterHtml));
AddToolbarAndBrowserToTab(tabPage, browser);
m_tabControl.TabPages.Add(tabPage);
tabPage.Show();
m_tabControl.SelectedTab = tabPage;
// Uncomment this to stop links from navigating.
// browser.DomClick += StopLinksNavigating;
// Demo use of ReadyStateChange.
// For some special page, e.g. about:config browser.Document is null.
browser.ReadyStateChange += (s, e) => this.Text = browser.Document != null ? browser.Document.ReadyState : "";
browser.DocumentTitleChanged += (s, e) => tabPage.Text = browser.DocumentTitle;
browser.EnableDefaultFullscreen();
// Popup window management.
browser.CreateWindow += (s, e) =>
{
// A naive popup blocker, demonstrating popup cancelling.
Console.WriteLine("A popup is trying to show: " + e.Uri);
if (e.Uri.StartsWith("http://annoying-site.com"))
{
e.Cancel = true;
Console.WriteLine("A popup is blocked: " + e.Uri);
return;
}
// For <a target="_blank"> and window.open() without specs(3rd param),
// e.Flags == GeckoWindowFlags.All, and we load it in a new tab;
// otherwise, load it in a popup window, which is maximized by default.
// This simulates firefox's behavior.
if (e.Flags == GeckoWindowFlags.All)
e.WebBrowser = AddTab();
else
{
var wa = System.Windows.Forms.Screen.GetWorkingArea(this);
e.InitialWidth = wa.Width;
e.InitialHeight = wa.Height;
}
};
return browser;
}
/// <summary>
/// An example event handler for the DomClick event.
/// Prevents a link click from navigating.
/// </summary>
private void StopLinksNavigating(object sender, DomEventArgs e)
{
if (sender == null) return;
if (e == null) return;
if (e.Target == null) return;
var element = e.Target.CastToGeckoElement();
GeckoHtmlElement clicked = element as GeckoHtmlElement;
if (clicked == null) return;
// prevent clicking on Links from navigation to the
if (clicked.TagName == "A")
{
e.Handled = true;
MessageBox.Show(sender as IWin32Window, String.Format("You clicked on Link {0}", clicked.GetAttribute("href")));
}
}
protected void AddToolbarAndBrowserToTab(TabPage tabPage, GeckoWebBrowser browser)
{
TextBox urlbox = new TextBox();
urlbox.Top = 0;
urlbox.Width = 200;
Button nav = new Button();
nav.Text = "Go";
nav.Left = urlbox.Width;
Button newTab = new Button();
newTab.Text = "NewTab";
newTab.Left = nav.Left + nav.Width;
Button stop = new Button
{
Text = "Stop",
Left = newTab.Left + newTab.Width
};
Button closeTab = new Button();
closeTab.Text = "GC.Collect";
closeTab.Left = stop.Left + stop.Width;
Button closeWithDisposeTab = new Button();
closeWithDisposeTab.Text = "Close";
closeWithDisposeTab.Left = closeTab.Left + closeTab.Width;
Button open = new Button();
open.Text = "FileOpen";
open.Left = closeWithDisposeTab.Left + closeWithDisposeTab.Width;
Button print = new Button();
print.Text = "Print";
print.Left = open.Left + open.Width;
Button scrollDown = new Button { Text = "Down", Left = closeWithDisposeTab.Left + 250 };
Button scrollUp = new Button { Text = "Up", Left = closeWithDisposeTab.Left + 330 };
scrollDown.Click += (s, e) => { browser.Window.ScrollByPages(1); };
scrollUp.Click += (s, e) => { browser.Window.ScrollByPages(-1); };
nav.Click += delegate
{
// use javascript to warn if url box is empty.
if (string.IsNullOrEmpty(urlbox.Text.Trim()))
browser.Navigate("javascript:alert('hey try typing a url!');");
browser.Navigate(urlbox.Text);
};
newTab.Click += delegate { AddTab(); };
stop.Click += delegate { browser.Stop(); };
closeTab.Click += delegate {
GC.Collect();
GC.WaitForPendingFinalizers();
};
closeWithDisposeTab.Click += delegate
{
m_tabControl.Controls.Remove(tabPage);
tabPage.Dispose();
};
open.Click += (s, a) =>
{
nsIFilePicker filePicker = Xpcom.CreateInstance<nsIFilePicker>("@mozilla.org/filepicker;1");
filePicker.Init(browser.Window.DomWindow, new nsAString("hello"), nsIFilePickerConsts.modeOpen);
filePicker.AppendFilter(new nsAString("png"), new nsAString("*.png"));
filePicker.AppendFilter(new nsAString("html"), new nsAString("*.html"));
if (nsIFilePickerConsts.returnOK == filePicker.Show())
{
using (nsACString str = new nsACString())
{
filePicker.GetFileAttribute().GetNativePathAttribute(str);
browser.Navigate(str.ToString());
}
}
};
//url in Navigating event may be the mapped version,
//e.g. about:config in Navigating event is jar:file:///<xulrunner>/omni.ja!/chrome/toolkit/content/global/config.xul
browser.Navigating += (s, e) =>
{
Console.WriteLine("Navigating: url: " + e.Uri + ", top: " + e.DomWindowTopLevel);
};
browser.Navigated += (s, e) =>
{
if (e.DomWindowTopLevel)
urlbox.Text = e.Uri.ToString();
Console.WriteLine("Navigated: url: " + e.Uri + ", top: " + e.DomWindowTopLevel, ", errorPage: " + e.IsErrorPage);
};
browser.Retargeted += (s, e) =>
{
var ch = e.Request as Gecko.Net.Channel;
Console.WriteLine("Retargeted: url: " + e.Uri + ", contentType: " + ch.ContentType + ", top: " + e.DomWindowTopLevel);
};
browser.DocumentCompleted += (s, e) =>
{
Console.WriteLine("DocumentCompleted: url: " + e.Uri + ", top: " + e.IsTopLevel);
};
print.Click += delegate { browser.Window.Print(); };
tabPage.Controls.Add(urlbox);
tabPage.Controls.Add(nav);
tabPage.Controls.Add(newTab);
tabPage.Controls.Add(stop);
tabPage.Controls.Add(closeTab);
tabPage.Controls.Add(closeWithDisposeTab);
tabPage.Controls.Add(open);
tabPage.Controls.Add(print);
tabPage.Controls.Add(browser);
tabPage.Controls.Add(scrollDown);
tabPage.Controls.Add(scrollUp);
}
}
2、下载事件
/// <summary>
/// 下载文件事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void LauncherDialog_Download(IWin32Window owner, object sender, LauncherDialogEvent e)
{
uint flags = (uint)nsIWebBrowserPersistConsts.PERSIST_FLAGS_NO_CONVERSION |
(uint)nsIWebBrowserPersistConsts.PERSIST_FLAGS_REPLACE_EXISTING_FILES |
(uint)nsIWebBrowserPersistConsts.PERSIST_FLAGS_BYPASS_CACHE;
SaveFileDialog sfd = new SaveFileDialog();
sfd.FileName = e.Filename;
if (sfd.ShowDialog(owner) == DialogResult.OK)
{
// the part that do the download, may be used for automation, or when the source URI is known, or after a parse of the dom :
string url = e.Url; //url to download
string fullpath = sfd.FileName; //destination file absolute path
nsIWebBrowserPersist persist = Xpcom.GetService<nsIWebBrowserPersist>("@mozilla.org/embedding/browser/nsWebBrowserPersist;1");
nsIURI source = IOService.CreateNsIUri(url);
nsIURI dest = IOService.CreateNsIUri(new Uri(fullpath).AbsoluteUri);
persist.SetPersistFlagsAttribute(flags);
persist.SaveURI(source, null, null, (uint)Gecko.nsIHttpChannelConsts.REFERRER_POLICY_NO_REFERRER, null, null, (nsISupports)dest, null);
// file is saved - asynchronous call
// need to try to have a temp name while the file is downloaded eg filename.ext.geckodownload (one of the SaveURI option)
}
}