Bloggerでマークダウン

Bloggerでマークダウンコードテストvar Person = function(firstname, lastname, age) {this.firstName = firstname; this.lastName = lastname; this.age = age; this.setAge = function(age) {this.age = age; }; this.toString = function() {return ["Hi ! I'm ", this.firstName, " ", this.lastName, " and I'm ", this.age, " year old."].join(""); }; };

オレブラウザを作る 13

だいぶ間が空いてしまった。

今回は新規ターゲットと新規ウインドウ関連。

新規ターゲットは、例えば
<a href="http://www.apple.com/" target="_blank">http://www.apple.com/</a>
というようなターゲット指定のリンクをどう処理するか。

今作っているブラウザはシングルウィンドウアプリ。タブブラウジングの実装予定もなし。なのでターゲット指定は無視して同ウインドウでリンクを読み込む。

実装の内容はPolicyDelegateで
webView_decidePolicyForNewWindowAction_request_newFrameName_decisionListener_()
というハンドラを作る。例の如くInterface BuilderでPolicyDelegateを関連付け。







関連付けが出来たら次はコーディング。ハンドラの内容はこう。

on webView_decidePolicyForNewWindowAction_request_newFrameName_decisionListener_(sender, windowAction, request, frameName, listener)
    tell sender to setMainFrameURL_(absoluteString of |URL| of request as text)
end

以上。

テストページ https://dl.dropboxusercontent.com/u/11714503/mywebbrowser/test.html を開いて、http://www.apple.com/ を開くことが出来るのを確認。

次はJavaScriptの window.open() で同様の処理を行う。UIDelegate の webView_createWebViewWithRequest_() を定義すれば良いのだが、実はここ結構重大なバグが存在している。引数にsenderとrequestを持っているのだけど、なんとrequestの値はnullが入ってくる。これでは指定されたURLを扱えない。が、最終的に同ウインドウで指定されたURLが開くことが出来れば良くて、その方法は一応ある。それはsenderをそのまま返値とすれば良い。具体的にはこう書く。

on webView_createWebViewWithRequest_(sender, request)
    -- request is null, this is bug.
    -- if you open self webView, return sender
    -- log "you can't open new window, because request is null. this is bug of WebKit."
    return sender
end

一応コメントでバグの旨を書いておいた。こうすれば忘れない。これでwindow.open()も動作するようになった。

さっそくテストページで動作確認。ここでも http://www.apple.com/ を開くことが出来るはずだ。

今日の分までのソースは github https://github.com/mnicovideo/My-Web-Browser に置いてます。

今回はここまで。


コメント

このブログの人気の投稿

Bloggerでマークダウン