酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

WebBrowserコントロールでレスポンスをフックしてページ遷移をキャンセルする

例えば○○社の販促アプリケーションで、○○社以外のコンテンツが閲覧できるのが問題だ。または、特定の競合先である△△社のウェブページを見せたくないという要望が上がってくるかもしれません。

WebBrowserコントロールでは、ページの遷移前にNavigatingイベントが発生します。特定の条件が満たされなかった場合など、イベントハンドラに渡されるNavigatingEventArgsオブジェクトのCancelプロパティを「True」に設定することで遷移をキャンセルすることが可能です。

テストに使用したページは、以下のように普通のリンク先が2件、2ちゃんねる関係のリンクが2件あるHTMLファイルを用意しました。

<html>
  <body>
    <a href="http://ch3cooh.jp/">CH3COOH(酢酸)の実験室</a><br />
    <a href="http://www.yahoo.co.jp/">Yahoo! JAPAN</a><br />
    <a href="http://www.2ch.net/">2ちゃんねる</a><br />
    <a href="http://hibari.2ch.net/smartphone/">
      スマートフォン@2ch掲示板</a><br />
  </body>
</html>

テスト用ページをアプリで表示させてみました。

下記の例は、Navigatingイベントハンドラ内にてURLを判定し、2ch.netを含むページへの遷移をすべてキャンセルしています*1

using System.Text.RegularExpressions;
using Microsoft.Phone.Controls;
using System.Windows;
using System;
using System.Windows.Navigation;

namespace WebBrowserHookTest {
    public partial class MainPage : PhoneApplicationPage {
        public MainPage() {
            InitializeComponent();
        }

        protected override void OnNavigatedTo(NavigationEventArgs e) {
            webBrowser.Navigate(new Uri("http://ch3cooh.jp/files/webbrowser_linkhook.html"));
        }

        private void webBrowser_Navigating(object sender, NavigatingEventArgs e) {
            // 2ちゃんねるドメインであればページ遷移させない
            if (Regex.IsMatch(e.Uri.Host, "(?:.*\\.)2ch\\.net$")) {
                MessageBox.Show("本アプリは2chの閲覧を許可していません!");
                e.Cancel = true;
            }
        }
    }
}

ページの遷移をキャンセルし、メッセージボックスで注意を促してみました。

*1:正規表現が合っているかは微妙