1

赤いボックスを描画するシンプルな hello world のようなプラグインを作成しました。

xulrunner アプリケーションに埋め込んだ後、プラグインはほぼ問題なく動作します。Xulrunner アプリケーションは、アプリケーション ウィンドウのサイズ変更時にボックスを正常に再描画します。

しかし、左クリックなどのマウスイベントの後、アプリケーションが「スタックオーバーフロー」でクラッシュします。デバッガーは、その理由は forwardMethod の 2 回の呼び出しとそれに続く JSD_GetValueForObject の 1 回の呼び出しの無限サイクルであると述べています

クラッシュ スタックの内容の次は次のとおりです。

  • -[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;
}
4

3 に答える 3

3

ありがとう、ウィンズ!

から最新の 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 イベント モデルにアクセスできるようになりました。

于 2009-11-23T11:31:51.163 に答える
1

Cocoaと古いEventRecordシステムがうまく混ざり合っているとは思いません。

ココアイベントモデルは、Mozillaの最後のビルドで利用できるようになりました。

Mercurialを使用してcomm-centralのツリーをチェックアウトし、試してみてください。hg
clone http://hg.mozilla.org/mozilla-central/srcXcode
プロジェクトへのパスは次のとおりです
。src/modules/ plugin / sdk / samples / basic / mac /とプラグインは、 / Library / InternetPlug-Ins/
にコピーする必要があります。

基本的なFirefoxプラグインを使って自分で試してみましたが、ココアイベントシステムは機能します。
現在のNSViewへのポインタを取得する方法がわかりません。

Mac上の64ビットバージョンのFirefoxで実行する必要があったと思います。Firefox 3.6では使用できませんが、Firefox 3.7で使用できる可能性があり、Cocoaイベントモデルを使用したNPAPISDKのバージョンはバージョン0.23です。

編集:
水銀なしで直接試すには、最新のmozillaビルドをMishaとして次のURLからダウンロードしてください: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イベントモデルを使用しています。

于 2009-11-20T15:23:57.937 に答える
0

現在の NSView へのポインタを取得する方法がわかりません

こんにちは、ウィンズです!

答えは明らかです。EventRecord レガシー イベント モデルを使用して NSView を取得し、その後に次の行を追加して Cocoa イベント モデルに切り替えることができます。

browser->setvalue(インスタンス、NPPVpluginEventModel、(void*)NPEventModelCocoa);

その後、私のアプリケーションは完全に安定します。もうクラッシュしません!!!

アプリケーションのメイン ウィンドウをアクティブにした後、NPCocoaEventDrawRect を受け取りました。そのため、ココア イベント モデルが機能しているようです。

于 2009-11-25T05:16:22.223 に答える