2009年10月22日

webkit-gtkのナビゲートをトラップする。

WebKitWebViewにはコールバックというかgtk用語でいうところのシグナルを設定できる。
今回は気になるURLのナビゲーション部分をみてみた。既存の関数を使うだけでは
ナビゲートの横取りはできないようだ。
少なくともFreeBSD用の1.0.1では問題有りだった。
コールバックは

g_signal_connect(G_OBJECT(web_view), "名称",
G_CALLBACK(関数), パラメータのポインタ);

なんだがマクロを使って将来的にはすっきりさせたいところ

コールバックのリストをみるにはAPIリファレンスであたりをつけて
「webkitwebview.cpp」をみるしかなかったが

ロード系はシグナルの「名称」で並べると
load-started

navigation-requested

load-started

load-committed

title-changed

load-progress-changed

load-finished

の順番で呼び出される事が分かった。
このうちvoidじゃないのはnavigation_requestedだけで


g_signal_connect(G_OBJECT(web_view)
, "navigation-requested"
, G_CALLBACK(webkit_navigation_requested_cb)
, NULL);

としてコールバックで

static WebKitNavigationResponse
webkit_navigation_requested_cb(WebKitWebView *web_view, WebKitWebFrame *frame, WebKitNetworkRequest *request)
{
puts(webkit_network_request_get_uri(request));

//return WEBKIT_NAVIGATION_RESPONSE_IGNORE;
return WEBKIT_NAVIGATION_RESPONSE_ACCEPT;
}

と設定できる。今回はユーザーデータをつけなかったが
タブ化した場合は必要だろう。

返り値をACCEPTにするとこの関数の後にそのまま動作する。
IGNOREを選ぶと動作しない。

webkit_network_request_set_uriという関数があり
requestのuriを変更できるのだがここで変更して戻しても何ら影響がなかった。

load-progress-changedは繰り返し呼び出され
progress
というgintの値が渡されるのでパーセント表示ができる。

ナビゲート機能について
POSTでの送信フォームの内容を取得する方法はなく
S-JISだと思うが右クリックでURLは取得できるのにクリックしても反応しないリンクがあったり
ファイルアップロードの処理がおかしかったりとフックしたい所だが
ソースをいじらない範囲ではload-finish後にコンテンツ自体変換するしか無いように感じた。

しかし取得したタイトルをタイトルバーに表示させると
ずいぶんと様になる。
posted by Xo_ox at 19:00| Comment(0) | FreeBSDアプリ | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。