问题描述
我有一个 CEFSharp 浏览器实现,其中使用 JavascriptObjectRepository
绑定到 CEF 浏览器的 C# 对象很少。问题是当用户尝试跨页面导航时,他最终可能会进入可以利用此公开对象的意外页面。我需要将这些对象限制在特定域中。有没有正确的方法来实现这一目标?
注意:我已经看到可以在绑定选项中添加 MethodInterceptor,但它没有将 url 作为参数给出。
解决方法
在这个问题上停留了一段时间,但找到了答案。我必须实现 MethodInterceptor 来跟踪跨站点的对象使用情况。由于方法拦截器没有 URL 参数,我必须显式订阅以解决 ChromiumWebBrowser 实例中的更改事件。
-
绑定 -
BindingOptions bindingOptions = new BindingOptions(); bindingOptions.MethodInterceptor = new CefJSObjectInterceptor(browser); browser.JavascriptObjectRepository.Register(jsName,jsObj,true,bindingOptions); // Note: skipped LegacyJavascriptBindingEnabled check
-
方法拦截器实现 -
internal class CefJSObjectInterceptor : IMethodInterceptor { string currentAddress; public CefJSObjectInterceptor(ChromiumWebBrowser browser) { browser.AddressChanged += Browser_AddressChanged; } private void Browser_AddressChanged(object sender,System.Windows.DependencyPropertyChangedEventArgs e) { currentAddress = e.NewValue.ToString(); } public object Intercept(Func<object[],object> method,object[] parameters,string methodName) { Uri uri = new Uri(currentAddress); string url = uri.Host.ToString(); if (isAcceptableURL(url)) { object result = method(parameters); return result; } return null; } bool isAcceptableURL(string url) { HashSet<string> validURLs = new HashSet<string> { "google.com","microsoft.com","127.0.0.1" }; foreach (var validURL in validURLs) { if (url.EndsWith(validURL)) { return true; } } return false; } }