Safari 5.1 npapi проблема - PullRequest
       39

Safari 5.1 npapi проблема

0 голосов
/ 17 августа 2011

Уже несколько дней я пытаюсь решить следующую проблему, читая все, что я нашел в Интернете о npapi на Mac.

Цель состоит в том, чтобы иметь плагин npapi, который работает для safari и firefox (mac),Мое программное обеспечение (которое я не могу переписать специально для этой цели, имеющий около 45000 строк кода на C) основано на NSView, подключенном к NSDocument ....

У меня есть плагин на основе версии webkit, который я должен удалить(спасибо Apple!) на основе того же NSView.

У меня есть плагин версии npapi, который отлично работает на Firefox.В этом плагине npapi я использую графическое окно ref, я делаю NSWindow на основе этого: NSWindow * browserWindow = [[[NSWindow alloc] initWithWindowRef: wind] autorelease];

и я помещаю свой NSView в этоокно, и это работает.

Теперь, пб, я не могу сделать то же самое в сафари.

Посмотрите на прикрепленную картинку, окно не в окне сафари!the firefox window is between safari's window and my plugin window

Я пробовал несколько способов ... это доза не работает.Может ли какао-гуру сказать, где я делаю что-то не так?или это известная проблема?

NPError NPP_SetWindow (экземпляр NPP, NPWindow * window) {

NP_CGContext * ctx = window-> window;void * wind = ctx-> window;

... в функции инициализации NSView:

NSWindow *browserWindow = [[NSWindow alloc] initWithWindowRef:wind];
self = [super initWithFrame:frame];
if( self )
{
    [browserWindow makeFirstResponder: self];
    [self  setNextResponder: nil];
    [browserWindow setContentView:self];
    [self webPlugInInitialize];// my own initializing
}
return self;

Ответы [ 3 ]

3 голосов
/ 17 августа 2011

В Safari 5.1 веб-рендеринг выполняется не самим Safari, а другим способом повышения безопасности. Откройте Монитор активности, и вы увидите, что фоновый процесс называется «Веб-процесс Safari» или что-то в этом роде.

Итак, вы не можете и не должны создавать NSWindow на основе ссылки на окно Carbon, которую можно получить с помощью плагина NPAPI. Прочтите собственную документацию Apple по этому вопросу. Вы должны запросить основной метод графического рисования, и тогда поле WindowRef для NP_CGContext должно иметь NSWindow*, а не окно Carbon ref.

2 голосов
/ 18 августа 2011

Если он работает в Firefox, это просто шокирует и совершенно не поддерживается. Работает ли он в Firefox 4 и более поздних версиях?

Если вам абсолютно необходимо использовать NSView, единственный известный мне способ сделать это в плагине - это отобразить NSView в вашем CGContext. Имейте в виду, что в новых браузерах NPAPI с системой событий Cocoa вы получаете CGContextRef как часть события draw; чтобы запросить событие розыгрыша, вы можете вызвать NPN_InvalidateWindow.

FireBreath имеет полностью экспериментальный и не полностью функциональный пример рендеринга NSView (в частности, WebView) в CGContextRef, который вы можете посмотреть в качестве примера.

Кроме использования CGContextRef, ваш единственный выбор - использовать CALayer; если вы можете найти способ сделать NSWindow или NSView таким образом, с вами все будет в порядке, но я не знаю, есть ли такой. Кто-то предположил, что установка CALayer в качестве слоя рендеринга для NSView может работать. В любом случае вам, скорее всего, придется пересылать все события, поскольку вы в основном размещаете NSView в внеэкранном режиме.

Не ошибись; - это не поддерживаемый способ получить NSView в браузере. Никогда не было - методы, которые использовали люди, не были поддержаны и зависели от реализаций API, специфичных для браузера. Когда вы используете такие вещи, вы можете с уверенностью ожидать, что они в конечном итоге сломаются, как в этом случае. Для получения дополнительной информации о моделях чертежей вы можете прочитать сообщение в блоге Стюарта Моргана на тему , ознакомиться с документами для модели Mac FireBreath или прочитать спецификацию модели событий Cocoa. .

1 голос
/ 19 августа 2011

Учитывая, что вы начинаете с "взять ссылку на углеродное окно", ваш подход обречен, поскольку он основан на модели событий углерода (и не только на этом, но и на предположениях относительно внутренних деталей реализации).Любой, кто запускает Firefox в 64-битной системе, должен будет вручную перезапустить Firefox в 32-битном режиме, чтобы ваш хак работал, и даже тогда он будет работать только до тех пор, пока Firefox полностью не удалит поддержку Carbon (что планируется в обозримом будущем).

Как и в других ответах, вы ошибаетесь в том, что весь ваш подход полностью не поддерживается, и тот факт, что он вообще работал как плагин NPAPI, был удачей.Вы просто не можете использовать NSView напрямую в плагине NPAPI.

...