今回は新規ターゲットと新規ウインドウ関連。
新規ターゲットは、例えば
<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 に置いてます。
今回はここまで。
0 件のコメント:
コメントを投稿