简介
CefSharp简单来说就是一款.Net编写的浏览器包,方便你在Winform和WPF中内嵌的Chrome浏览器组件。.
问题
我们都知道chrome extensions可以大大的扩展你的浏览器的功能。包括但不仅限于这些功能:捕捉特定网页的内容,捕捉HTTP报文,捕捉用户浏览动作,改变浏览器地址栏/起始页/书签/Tab等界面元素的行为,与别的站点通信,修改网页内容等等。CefSharp是基本Chrome的,所以能否在CefSharp支持chrome extensions呢。答案是肯定的。
解决办法
我们可以看到对应的 IssuesFeature Request - Add Chrome Extension Support #2497
那么我们来看下如何实现呢
1、首先需要准备一个浏览器插件
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);
}
}
运行验证,问题解决。