ページ

2009年10月27日火曜日

Safari用独自プラグインを作る(10) - コンテキストメニューの調査

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

(前回)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&ltmpl=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のサブクラス。