rainit2006 / C-Program

C# Program knowledge
0 stars 0 forks source link

CefSharp #35

Open rainit2006 opened 5 years ago

rainit2006 commented 5 years ago

ーーーーーー

rainit2006 commented 5 years ago

■ガイド

■参照

rainit2006 commented 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コンポーネントで問題ないのですが、少し複雑なことをやろうとするとつらくなってきます。

rainit2006 commented 5 years ago

■WebBrowserでの実装

<WebBrowser Name="webBrowser1"></>

   public MainWindow()
        {
            InitializeComponent();

            //string curDir = AppDomain.CurrentDomain.BaseDirectory; //Directory.GetCurrentDirectory();

            this.webBrowser1.Source = new Uri(@"file:///C:/html/test.html");
   }
rainit2006 commented 5 years ago

■参照 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で定義すべきメソッド

。。。略。。。。。

■SchemeHandler CefにもカスタムURLスキームを利用してブラウザから通知を受ける仕組みが提供されています。 カスタムURLスキーム 例:hoge://fugafuga ISchemeHandlerFactory:カスタムURLスキームのハンドリングにはISchemeHandlerではなくIResourceHandlerを利用します。URLは:///<path&query>となっていて、スキームごとにCefにハンドラを登録することができるのですが、直接ハンドラを登録するのではなくて、スキームのハンドラのファクトリをプロパティに持つカスタムスキームクラスをCefSettingsに登録する必要があって、手順が少し複雑です。

rainit2006 commented 5 years ago

■遭遇した問題