плагин какао, вызывающий веб-страницу javascript - PullRequest
0 голосов
/ 05 июля 2011

У меня есть плагин какао, встроенный в HTML-страницу.Эта страница также определяет функцию javascript в заголовке.Я хотел бы программно вызвать эту функцию javascript из моего плагина.Это было достаточно просто под плагинами IE / firefox / chrome.Как это работает под какао / сафари?Я думаю, что проблема сводится к доступу к веб-просмотру страниц и получению объекта webScriptObject.После этого я могу использовать callWebScriptMethod следующим образом:

[scriptObject callWebScriptMethod:@"sayHello" withArguments:[NSArray arrayWithObjects:"@chris"]];

Однако я не знаю, как получить доступ к веб-просмотру страницы с моим плагином.Мой плагин определен как «WASafariPluginView: NSView», и я не вижу ничего в его иерархии объектов, которую я могу использовать, чтобы получить «родительское» веб-представление.

Спасибо,

1 Ответ

1 голос
/ 06 июля 2011

Когда создается представление вашего плагина, WebKit вызывает метод +plugInViewWithArguments: основного класса вашего представления.

Параметр arguments этого метода представляет собой словарь, к которому можно обращаться за различной информацией. В вашем случае вам нужен объект, соответствующий WebPlugInContainerKey.

Это объект, соответствующий неофициальному протоколу WebPlugInContainer. Если это не nil, вы можете запросить у этого объекта -webFrame, который возвращает объект WebFrame. Затем вы можете запросить у объекта WebFrame его -webView.

Затем вы можете создать свой плагин и сохранить ссылку на WebView.

YourPluginView.h:

#import <Cocoa/Cocoa.h>
#import <WebKit/WebKit.h>

@interface YourPluginView : NSView <WebPlugInViewFactory>
{
    WebView* webViewIvar;
}

- (id)initWithWebView:(WebView *)aWebView;
@end

YourPluginView.m:

//the WebPlugInViewFactory protocol required method
+ (NSView *)plugInViewWithArguments:(NSDictionary *)arguments 
{
    WebView* containerView = [[[arguments objectForKey:WebPlugInContainerKey] webFrame] webView];
    YourPluginView* view = [[self alloc] initWithWebView:containerView];
    return view;
}

- (id)initWithWebView:(WebView *)aWebView
{
    self = [super init];
    if(self)
    {
        webViewIvar = [aWebView retain];
    }
    return self;
}

- (void)dealloc
{
    [webViewIvar release];
    [super dealloc];
}
...