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 после активации главного окна моего приложения. Таким образом, модель события какао, кажется, работает.