(前回)Cocoaの日々: Safari用独自プラグインを作る(9) - Method Swizzling 補足
-[BrowserWebView webView:contextMenuItemsForElement:defaultMenuItems:] で渡される引数を調べてみた。webView は良いとして残りの二つをデバッグ出力してみた。
- (NSArray *)_sx_webView:(WebView *)sender contextMenuItemsForElement:(NSDictionary *)element
defaultMenuItems:(NSArray *)defaultMenuItems {
NSLog(@"element: %@", element);
NSLog(@"defaultMenuItems: %@", defaultMenuItems);
例えば「ログイン」リンクで右クリックすると
こんなものが得られる。
element: { WebElementDOMNode = <DOMText [#text]: 0x6bf3000 'ログイン'>; WebElementFrame = <WebFrame: 0x4a6a70>; WebElementIsContentEditableKey = 0; WebElementIsSelected = 1; WebElementLinkIsLive = 1; WebElementLinkLabel = "\U30ed\U30b0\U30a4\U30f3"; WebElementLinkURL = https://www.google.com/accounts/ServiceLogin? continue=http://www.google.co.jp/ig%3Fhl%3Dja%26source%3Diglk& followup=http://www.google.co.jp/ig%3Fhl%3Dja%26source%3Diglk& service=ig&passive=true&cd=JP&hl=ja&nui=1<mpl=default; WebElementTargetFrame = &;tWebFrame: 0x4a6a70>; }
defaultMenuItems: ( <menuitem: 0x51c4b20="" リンクを開く="">, <menuitem: 0x51dd5f0="" リンクを新規ウインドウで開く="">, <menuitem: 0x484550="" リンク先のファイルをダウンロード="">, <menuitem: 0x6e95410="" リンクをコピー="">, <menuitem: 0x6a66fb0="">, <menuitem: 0x6e951c0="" 要素の詳細を表示=""> )
element には DOM情報および、WebElementFrame のインスタンス情報などが得られる。文字列などが選択されている時には WebElementIsSelected =1 となる。またリンクの場合は WebElementLinkIsLive =1 となる。一方、defaultMenuItems はその名の通り Safariで用意されているデフォルトのメニューの一覧のようだ。
追加した sayHello: で渡される引数 sender は通常のメニューアクション同様 NSMenuItemのインスタンスが得られる。
- (void)sayHello:(id)sender
{
NSLog(@"%@", sender);
}
コンソール:
Safari[16335] <MenuItem: 0x5ad19a0 Say hello>
なお webView:contextMenuItemsForElement:defaultMenuItems: は右クリックの度に呼び出される(だからコンテキストメニューといえるが)。そこで sayHello: 内で WebView を手っ取り早く得るには -[NSMenuItem setRepresentedObject:] 経由で渡してやればよさそうだ。
- (NSArray *)_sx_webView:(WebView *)sender contextMenuItemsForElement:(NSDictionary *)element
defaultMenuItems:(NSArray *)defaultMenuItems {
:
NSMenuItem* item = [[[NSMenuItem alloc] initWithTitle:@"Take a screenshot"
action:@selector(takeScreenshot:)
keyEquivalent:@""] autorelease];
[item setRepresentedObject:sender];
:
- (void)sayHello:(id)sender
{
NSLog(@"%@", [sender representedObject]);
}
こうなる。
09/10/26 13:10:39 Safari[16429] <BrowserWebView: 0x44b660>
※BrowserWebView は Safari独自の WebViewのサブクラス。