Geckofx弹出下载保存框

最近养成一个好习惯,遇到不会的事了就去源码找找

之前一直以为像弹出保存框和右键菜单这些基本功能,应该都配套的有的,

后来发现这些全部都要自己实现,而在 源码里官方其实已经把大多数的方法都写好了,可以直接提出来就用。

比如:弹出下载保存框

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)
                }
            }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值