.NETの WebBrowserコントロールでajaxが動作しない場合

 僕は「なろうReader」というWindows用アプリケーションを公開している。これは「小説家になろう」「カクヨム」「アルファポリス」という三つの小説投稿サイトに対応した、小説読み上げソフトだ。基本的にWebBrowserコントロールを貼り付けたFormに各小説投稿サイトのURLを適用し、読み込まれたページからテキストを抽出して音声で読み上げるものだ。なので投稿サイトにアクセスして操作する部分は普通にIEコンポーネントに任せている。

 最近「小説家になろう」が、サイトの改修を行い、これまで通常リンクでページ遷移を伴っていた、ブックマーク登録/解除と、しおりの更新処理を、その場で完結するajaxを使った処理に変更した。そしたらこれが「なろうReader」で動作しなくなってしまったのだ。ブックマーク登録やしおりのリンクをクリックしても何も起きない。WebBrowserコントロールIEと同じ動作をすると思ってたので、動作しないのはなぜだろうと悩んだ。

 ソースを見てみると、

<a href="javascript:void(0)" >しおりを挿む</a>
<input type="hidden" name="siori_url" value="http://syosetu.com/favnovelmain/ichiupdateajax/useridfavncode/639697_475037/no/48/?token=dfc11e44e54805f3825e1a4ab26e319d">

のようになっている。なので、"webbrowser control ajax void(0)"で検索した所、
WebBrowser control - behavior with links having href='javascript:void(0)'
という質問が見つかった。

 結局のところ、セキュリティのために無効化されているWebBrowserコントロールの、Script URL Migration機能を有効にすればいいらしい。これは、コントロールが初期化される前に、レジストリに書き込む必要がある。

Private Sub SetBrowserFratureControlKey(feature As String, appName As String, value As Integer)
        Dim key = Registry.CurrentUser.CreateSubKey(String.Concat("Software\Microsoft\Internet Explorer\Main\FeatureControl\", feature), RegistryKeyPermissionCheck.ReadWriteSubTree)
        key.SetValue(appName, CType(value, UInt32), RegistryValueKind.DWord)
End Sub
Private Sub SetBrowserFeatureControl()
        Dim filename = System.IO.Path.GetFileName(Process.GetCurrentProcess().MainModule.FileName)

        SetBrowserFratureControlKey("FEATURE_SCRIPTURL_MITIGATION", filename, 1)
End Sub

このように、"FEATURE_SCRIPTURL_MITIGATION"を1にするサブルーチンを書き、
Form1_Load()の中でSetBrowserFeatureControl()を呼べばいい。