Firefox Какао Плагин

Я создал простой Hello World-подобный плагин, который рисует красную рамку.

После встраивания в приложение 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 ответа

Решение

Я не думаю, что Какао и старая система EventRecord хорошо сочетаются друг с другом.

Модель событий какао теперь доступна в последней сборке Mozilla.

Проверьте дерево для comm-central с Mercurial и попробуйте:
hg clone http://hg.mozilla.org/mozilla-central/ src
Путь к проекту Xcode:
SRC / модули / плагин / SDK / образцы / базовый / MAC /
и плагин должен быть скопирован в:
/ Библиотека / Интернет-плагины /

Я попробовал это сам с основным плагином Firefox, и система событий какао работает.
Я просто не знаю, как получить указатель на текущий NSView.

Я думаю, что это должно было быть сделано для 64-битной версии Firefox на Mac. Он недоступен в Firefox 3.6, но может быть в Firefox 3.7, а версия NPAPI SDK с моделью событий Cocoa - это версия 0.23.

РЕДАКТИРОВАТЬ:
Чтобы попробовать это прямо без Mercurial, загрузите последнюю сборку Mozilla под именем Миша по адресу:
http://ftp.mozilla.org/pub/mozilla.org/xulrunner/nightly/latest-trunk/
Проект Xcode с моделью событий Какао находится по адресу:
http://mxr.mozilla.org/mozilla-central/source/modules/plugin/sdk/samples/basic/mac/

Образец NetscapeCocoaPlugin в источниках Webkit также использует модель событий какао.

Спасибо, Винц, очень большое!

Я только что скачал последнюю сборку 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/

Модель событий Какао теперь доступна.

Я просто не знаю, как получить указатель на текущий NSView

Привет, Винц!

Ответ кажется очевидным - мы можем получить NSView, используя унаследованную модель событий EventRecord, и ПОСЛЕ ТОГО, ЧТОБЫ переключиться на модель событий Какао, добавив строку:

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

После этого мое приложение станет абсолютно стабильным. Больше никаких сбоев!!!

Я только что получил NPCocoaEventDrawRect после активации главного окна моего приложения. Таким образом, модель события какао, кажется, работает.

Другие вопросы по тегам