Firefox Cocoa插件

时间:2009-11-20 13:27:30

标签: cocoa npapi

我创建了一个简单的hello world-like插件,它绘制了红色框。

- 嵌入xulrunner应用程序后,插件工作得非常好。 Xulrunner应用程序成功重绘了调整应用程序窗口大小的方框。

但是在任何鼠标事件之后 - 例如 - 左键单击,我的应用程序崩溃了“堆栈溢出”。调试器说原因是2次调用forwardMethod后跟一次调用JSD_GetValueForObject的无休止循环

崩溃堆栈内容是下一个:

  • -[NSApplication _indexOfWindow:]
  • -[NSEvent window]
  • JSD_GetValueForObject
  • JSD_GetValueForObject
  • JSD_GetValueForObject
  • forwardMethod
  • forwardMethod
  • JSD_GetValueForObject
  • forwardMethod
  • forwardMethod
  • JSD_GetValueForObject
  • forwardMethod
  • forwardMethod
  • JSD_GetValueForObject
  • forwardMethod
  • forwardMethod
  • JSD_GetValueForObject
  • forwardMethod
  • forwardMethod
  • JSD_GetValueForObject
  • forwardMethod
  • forwardMethod
  • .....等

我的代码是:

int16_t NPP_HandleEvent(NPP instance, void* event)
{
    EventRecord* carbonEvent = (EventRecord*)event;

    if (carbonEvent && (carbonEvent->what == updateEvt))
    {       
        PluginInstance* currentInstance = (PluginInstance*)(instance->pdata);
        CGContextRef cgContext = ((NP_CGContext*)(currentInstance->window.window))->context;
        float windowWidth = currentInstance->window.width;
        float windowHeight = currentInstance->window.height;

        static int x = 0;

        if (x++)
            return;

        NPRect clipRect = currentInstance->window.clipRect;

        NP_CGContext* npContext = currentInstance->window.window;

        NSWindow* browserWindow = [[[NSWindow alloc] initWithWindowRef:npContext->window] autorelease];

        int y = [browserWindow frame].size.height - (clipRect.bottom - clipRect.top) -  currentInstance->window.y;

        //[plugin attachToWindow:browserWindow at:NSMakePoint(window->x, y)];
        NSPoint point = NSMakePoint(currentInstance->window.x, y);

        // find the NSView at the point
        NSView* hitView = [[browserWindow contentView] hitTest:NSMakePoint(point.x+1, point.y+1)];
        if (hitView == nil || ![[hitView className] isEqualToString:@"ChildView"]) 
        {
            x = 0;
            return;
        }

        NSView* parentView = hitView;       

        NSBox *box = [[NSBox alloc] initWithFrame:NSMakeRect(0.0, 0.0, 100, 100)];
        [box setBoxType:NSBoxCustom];
        [box setBorderType:NSLineBorder];
        [box setTitlePosition:NSNoTitle];
        [box setFillColor:[NSColor redColor]];

        [parentView addSubview:box];

        //DrawPlugin(cgContext, windowWidth, windowHeight);
    }

    return 0;
}

3 个答案:

答案 0 :(得分:3)

非常感谢Winz!

我刚刚从

下载了最新的mozilla构建和SDK

http://ftp.mozilla.org/pub/mozilla.org/xulrunner/nightly/latest-trunk/

来自

的BasicPlugin.xcodeproj

http://mxr.mozilla.org/mozilla-central/source/modules/plugin/sdk/samples/basic/mac/

现在可以访问Cocoa事件模型。

答案 1 :(得分:1)

我不认为Cocoa和旧的EventRecord系统很好地融合在一起。

现在可以在mozilla的最后版本中使用可可事件模型。

使用Mercurial检查通信中心的树并尝试:
hg clone http://hg.mozilla.org/mozilla-central/ src
Xcode项目的路径是:
的src /模块/插件/ SDK /样品/基本/ MAC /
并且插件必须复制到:
/ Library / Internet Plug-Ins /

我自己尝试使用基本的firefox插件和可可事件系统 我只是不知道如何获得指向当前NSView的指针。

我认为必须在Mac上使用64位版本的Firefox。它在Firefox 3.6中不可用,但可能在Firefox 3.7中,而带有Cocoa事件模型的NPAPI SDK的版本是0.23版本。

编辑:
直接尝试它没有mercurial下载最新的mozilla构建为Misha:
http://ftp.mozilla.org/pub/mozilla.org/xulrunner/nightly/latest-trunk/
带有Cocoa事件模型的Xcode项目位于:
http://mxr.mozilla.org/mozilla-central/source/modules/plugin/sdk/samples/basic/mac/

Webkit源代码中的NetscapeCocoaPlugin示例也使用了cocoa事件模型。

答案 2 :(得分:0)

  

我只是不知道如何获得指向当前NSView的指针

您好,Winz!

答案似乎很明显 - 我们可以使用EventRecord遗留事件模型获取NSView,然后通过添加以下行来切换到Cocoa事件模型:

browser-> setvalue(instance,NPPVpluginEventModel,(void *)NPEventModelCocoa);

之后我的申请变得绝对稳定。没有更多的崩溃!!!

我刚刚在激活应用程序的主窗口后收到了一个N​​PCocoaEventDrawRect。所以可可事件模型似乎有效。