.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()を呼べばいい。