CefSharp加载chrome Extension插件

简介

CefSharp简单来说就是一款.Net编写的浏览器包,方便你在Winform和WPF中内嵌的Chrome浏览器组件。.

问题

我们都知道chrome extensions可以大大的扩展你的浏览器的功能。包括但不仅限于这些功能:捕捉特定网页的内容,捕捉HTTP报文,捕捉用户浏览动作,改变浏览器地址栏/起始页/书签/Tab等界面元素的行为,与别的站点通信,修改网页内容等等。CefSharp是基本Chrome的,所以能否在CefSharp支持chrome extensions呢。答案是肯定的。

解决办法

我们可以看到对应的  IssuesFeature Request - Add Chrome Extension Support #2497

那么我们来看下如何实现呢

1、首先需要准备一个浏览器插件

CefSharp加载chrome Extension插件

 

2、添加ExtensionHandler类,并继承IExtensionHandler

 

 public class ExtensionHandler : IExtensionHandler
    {
        public Func<IExtension, bool, IBrowser> GetActiveBrowser;
        public Action<string> LoadExtensionPopup;

        public void Dispose()
        {
            GetActiveBrowser = null;
            LoadExtensionPopup = null;
        }

        bool IExtensionHandler.CanAccessBrowser(IExtension extension, IBrowser browser, bool includeIncognito, IBrowser targetBrowser)
        {
            return false;
        }

        IBrowser IExtensionHandler.GetActiveBrowser(IExtension extension, IBrowser browser, bool includeIncognito)
        {
            return GetActiveBrowser?.Invoke(extension, includeIncognito);
            return null;
        }

        bool IExtensionHandler.GetExtensionResource(IExtension extension, IBrowser browser, string file, IGetExtensionResourceCallback callback)
        {
            return false;
        }

        bool IExtensionHandler.OnBeforeBackgroundBrowser(IExtension extension, string url, IBrowserSettings settings)
        {
            return false;
        }

        bool IExtensionHandler.OnBeforeBrowser(IExtension extension, IBrowser browser, IBrowser activeBrowser, int index, string url, bool active, IWindowInfo windowInfo, IBrowserSettings settings)
        {
            return false;
        }

        void IExtensionHandler.OnExtensionLoaded(IExtension extension)
        {
            var manifest = extension.Manifest;
            var browserAction = manifest["browser_action"].GetDictionary();
            if (browserAction.ContainsKey("default_popup"))
            {
                var popupUrl = browserAction["default_popup"].GetString();

                popupUrl = "chrome-extension://" + extension.Identifier + "/" + popupUrl;

                LoadExtensionPopup?.Invoke(popupUrl);
            }
        }

        void IExtensionHandler.OnExtensionLoadFailed(CefErrorCode errorCode)
        {

        }

        void IExtensionHandler.OnExtensionUnloaded(IExtension extension)
        {

        }
    }

3、读取插件Extensions,通过委托Action触发事件Show。

  //The sample extension only works for http(s) schemes
            string path = System.Windows.Forms.Application.StartupPath;
            var requestContext = CWebBrowser.GetBrowserHost().RequestContext;
            string cefSharpExampleResourcesFolder = path + @"\Extensions";
            var dir = Path.Combine(AppContext.BaseDirectory, cefSharpExampleResourcesFolder);
            dir = Path.GetFullPath(dir);
            if (!Directory.Exists(dir))
            {
                throw new DirectoryNotFoundException("Unable to locate example extensions folder - " + dir);
            }
            var extensionHandler = new ExtensionHandler
            {
                LoadExtensionPopup = (url) =>
                {
                    BeginInvoke(new Action(() =>
                    {
                        var extensionForm = new Form();
                        var extensionBrowser = new ChromiumWebBrowser(url);
                        ////extensionBrowser.IsBrowserInitializedChanged += (s, args) =>
                        ////{
                        ////    extensionBrowser.ShowDevTools();
                        ////};

                        extensionForm.Controls.Add(extensionBrowser);
                        extensionForm.Show(this);
                    }));
                },
                GetActiveBrowser = (extension, isIncognito) =>
                {
                    //Return the active browser for which the extension will act upon
                    return CWebBrowser.BrowserCore;
                }
            };

            requestContext.LoadExtensionsFromDirectory(dir, extensionHandler);
        }
    }

运行验证,问题解决。