Help us understand the problem. What is going on with this article?

WinFormsでChromiumブラウザコンポーネント(CefSharp)を使ってみる その5

More than 1 year has passed since last update.

はじめに

ローカルサイトを表示する上で下記3つのメソッドを使用してみました。

  • Loadメソッド
  • LoadHtmlメソッド
  • LoadStringメソッド

前記事

Loadメソッド

HelloWorld.html
<html>
<head>
    <meta charset='utf-8' />
    <title>Hello World</title>
</head>
<body>
    <h1>Hello World!!</h1>
</body>
</html>

作成したHTMLを選択し、プロパティで「常にコピーする」に変更します。

_webBrowser.Load(Application.StartupPath + "\HelloWorld.html")

参照:4.CefSharpを使って、ローカルで動くWebアプリケーションを作る。

LoadHtmlメソッド

第2引数のUrlは、指定がない場合はダミーのURLを指定します。

Dim sb As New StringBuilder()
sb.AppendLine("<html>")
sb.AppendLine("<head>")
sb.AppendLine("<meta charset ='utf-8' />")
sb.AppendLine("<title>Hello World</title>")
sb.AppendLine("</head>")
sb.AppendLine("<body>")
sb.AppendLine("<h1>Hello World!!</h1>")
sb.AppendLine("</body>")
sb.AppendLine("</html>")
_webBrowser.LoadHtml(sb.ToString(), "http://example/")

LoadStringメソッド

第2引数のUrlは、指定がない場合はダミーのURLを指定します。
参照:CefSharp LoadHtml - stackoverflow

Dim sb As New StringBuilder()
sb.AppendLine("<html>")
sb.AppendLine("<head>")
sb.AppendLine("<meta charset ='utf-8' />")
sb.AppendLine("<title>Hello World</title>")
sb.AppendLine("</head>")
sb.AppendLine("<body>")
sb.AppendLine("<h1>Hello World!!</h1>")
sb.AppendLine("</body>")
sb.AppendLine("</html>")
_webBrowser.LoadHtml(sb.ToString(), "about:")

問題点

ネット接続が出来ない場合にエラーページを表示したいと思って、LoadStringメソッドでHTMLの文字列を指定するも真っ白なページのまま表示が出来ないという現象がありました。

調査

接続チェックを先にしており、接続出来ない場合はChromiumWebBrowserコンストラクタのURLに空白で指定していました。

_webBrowser = New ChromiumWebBrowser("")

Private Sub ToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ToolStripMenuItem.Click
        Dim str As String
        str = "<HTML><BODY>Hello Wolrd!</BODY></HTML>"
        _webBrowser.LoadString(str, "about:")
End Sub

しかし、ChromiumWebBrowserコンストラクタのURLを空白ではないアドレスを指定するとHello Wolrd!が表示されるようになります。

_webBrowser = New ChromiumWebBrowser("https://www.google.co.jp/")

また、次のようなURL「dummy:」を指定してもHello Wolrd!が表示されるようになりますが、その場合にエラー「ERR_UNKNOWN_URL_SCHEME」になるのでエラーイベントで無視するようにします。
参照:LoadString() ignoring string_value?

_webBrowser = New ChromiumWebBrowser("dummy:")
AddHandler _webBrowser.LoadError, AddressOf OnLoadError

Private Sub OnLoadError(sender As Object, e As LoadErrorEventArgs)
    If e.FailedUrl = "dummy:" Then Return
End Sub

最後に

ネット接続が出来ない場合にLoadStringメソッドを使用してエラーページを表示しようとするも真っ白のまま、調べている時間がなく仕方なくエラーページをキャプチャーして画像で表示するというトリッキーな方法でリリースしてしまいました。
その反省を込めて今回調べました。LoadHtmlメソッドがあることに気がつけば良かったな。また改修することがあれば、その時にこの部分も修正してリリースするようにします。

yaju
静岡県島田市在住ののシニアSE(元Microsoft MVP 2010-2012)がコンピューター、機械学習、Unity、数学について考える。
http://yaju3d.hatenablog.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away