Open rainit2006 opened 5 years ago
■ガイド
■参照
■DotNetBrowser vs CefSharp The major difference between DotNetBrowser and CefSharp APIs is that DotNetBrowser provides the DOM layer API while CefSharp doesn't.
For example, in DotNetBrowser you can get the DOM element using the following approach:
DOMDocument document = Browser.GetDocument();
DOMNode div = Browser.GetDocument().GetElementsByTagName("div").FirstOrDefault();
And then you can work with the DOM element using C#. For instance, DotNetBrowser supports subscribing to DOM events from .NET side.
To do this in CefSharp you need to use JavaScript evaluation for working with DOM tree: browser.GetMainFrame().ExecuteJavaScriptAsync("document.getElementsByTagName('div')[0]");
■WebBrowser的问题 WebBrowser控件是IE的包装(IE7?版本很老),不能支持css和html5等新的标准。 このWebBrowserコンポーネントはなかなか厄介で、以下のような問題を抱えています。
デフォルトでIE7互換のブラウザとして振舞う(IE11互換で動かすためにはレジストリの書き換えが必要) UserAgent変えたりするのにアンマネージドなコードを触る必要がある 一時ファイル類の操作がつらい(キャッシュやCookie消せないしそもそもどこにいるのかわからない) 単にウェブページを表示するだけのアプリであればWebBrowserコンポーネントで問題ないのですが、少し複雑なことをやろうとするとつらくなってきます。
■WebBrowserでの実装
<WebBrowser Name="webBrowser1"></>
public MainWindow()
{
InitializeComponent();
//string curDir = AppDomain.CurrentDomain.BaseDirectory; //Directory.GetCurrentDirectory();
this.webBrowser1.Source = new Uri(@"file:///C:/html/test.html");
}
■参照 http://ghken.hatenablog.com/entry/2017/04/25/002132
■UserAgentの設定 WebBrowserの場合:urlmon.dllのUrlMkSetSessionOptionを利用すると実現できます。 Cefの場合:CefSharp.Wpf.ChromiumWebBrowserのインスタンスを生成する前に、Cef.Initialize(cefSettings)を呼び出すことでUserAgent等の設定を行うことができます。
■ページ遷移のハンドリング WebBrowserの場合:WebBrowser.Navigating, WebBrowser.Navigatedイベントがあるので、それぞれ遷移前、遷移後の処理をハンドリングすることができます。 Cefの場合:ChromiumWebBrowser.FrameLoadStart, ChromiumWebBrowser.FrameLoadEndイベントがあるので、それぞれ遷移開始、遷移後の処理をハンドリングすることができます。 ※ただ、このFrameLoadStartイベントでは遷移をキャンセルすることができず、リクエストの書き換えや遷移のキャンセルを制御するにはChromiumWebBrowser.RequestHandlerプロパティを実装する必要があります。
■Cookieの操作 WebBrowserの場合:Cookieをまとめて削除するような機能はなさそうです。 WebBrowserにはDocumentプロパティが存在して、HTMLにjsを挿入することができるので、そのjsでそのドメインのCookieのExpireをいじることは可能なのですが、すべてのページのCookieを削除することは難しそうです。
Cookieを操作するためのCookieManagerクラスが用意されていて、Cef.GetGlobalCookieManager()でCookieManagerを取得することができます。
■IRequestHandler IRequestHandlerはブラウザのリクエストをハンドリングするためのインタフェース。 http://ghken.hatenablog.com/entry/2017/05/02/001717
IRequestHandlerで定義すべきメソッド
bool OnBeforeBrowse(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, bool isRedirect) :ブラウザの遷移前に呼び出されるメソッドです。 ナビゲーションが許可された場合、IWebBrowser.FrameLoadStartとIWebBrowser.FrameLoadEndが呼び出される。 ナビゲーションがキャンセルされた場合、IWebBrowser.LoadErrorイベントが発火し、イベントの引数としてCefErrorCode.Abortedが渡される。
bool OnOpenUrlFromTab(IWebBrowser browserControl, IBrowser browser, IFrame frame, string targetUrl, WindowOpenDisposition targetDisposition, bool userGesture) 新しいタブやブラウザでurlを開こうとしたときに呼び出されるメソッドです。
。。。略。。。。。
■SchemeHandler
CefにもカスタムURLスキームを利用してブラウザから通知を受ける仕組みが提供されています。
カスタムURLスキーム 例:hoge://fugafuga
ISchemeHandlerFactory:カスタムURLスキームのハンドリングにはISchemeHandlerではなくIResourceHandlerを利用します。URLは
■遭遇した問題
ーーーーーー