Как отобразить HTML из плагина NPAPI в Safari - PullRequest
2 голосов
/ 24 июля 2011

Я писал плагин для браузера на основе Mac NPAPI для преобразования файла с пользовательским mimetype (скажем, «application / x-foo») в представление HTML, которое затем можно просматривать непосредственно в браузере.Эти файлы обычно обслуживаются напрямую, поэтому меня больше заботит поддержка просмотра всей страницы, а не встроенного просмотра с помощью тегов <object>.

В Firefox это было относительно просто: я звонюNPN_NewStream с mimetype text/html, запишите преобразованный HTML-код в поток, а затем очистите его с помощью NPN_DestroySteam.Браузер автоматически обрабатывает запрос на новый поток HTML и отображает данный HTML-код во вкладку или окно.Довольно стандартный.

Для Safari, однако, NPN_NewStream не реализован (и я проверял исходный код WebKit).Ранее я мог использовать API WebKitPlugin.В Safari 5.1 этот API исчез.

Я думал, что смогу создать WebView в обработчике событий рисования, например:

NSRect rect = NSMakeRect(0, 0, obj->window.width, obj->window.height);
//...
WebView* webView = [[WebView alloc] initWithFrame:rect frameName:nil groupName:nil];
[[webView mainFrame] loadHTMLString:@"<html><head><title>This is a message from my plug-in!</title></head><body><p><strong>This is a message from my plug-in!</strong></p></body>/html>" baseURL:[NSURL URLWithString:@"http://example.com"]];
[webView drawRect:rect];

и увидеть его в браузере.Но все, что нужно, это сделать серый экран без содержимого, как будто он не нарисован.Если я заменим WebView на NSTextView и установлю его строку в HTML, все отрисовывается просто отлично, но, конечно, HTML не визуализируется NSTextView.

Мой вопрос сводится к: Есть ли хороший способ визуализации HTML-кода в окне Safari из плагина NPAPI?Или, если это не сработает, в окно Google Chrome?Или какой-то другой подход, который позволяет мне обрабатывать пользовательский тип MIME и отображать какое-то его HTML-представление?

1 Ответ

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

Честно говоря, я удивлен, что ваш новый подход работает на Firefox; это новый, о котором я никогда не слышал. Если вам придется рисовать самостоятельно, вы можете использовать CoreGraphics с CGContext или CoreAnimation с CALayer. Другими словами, вы не получаете NSView, поэтому вы не можете напрямую отобразить в нем WebView.

Тем не менее, вы можете поместить веб-представление в неэкранный контекст и отобразить его в CGContext, а затем проксировать события; это кажется немного сложным для того, что вы пытаетесь сделать, но я не знаю другого способа сделать это.

Существует экспериментальная библиотека в FireBreath , которая делает это; колесо прокрутки не реализовано, но другие события работают, включая перетаскивание мышью и клавиатуру. При использовании событий формы все еще есть несколько странных вещей, поэтому то, будет ли это работать для вас, зависит от того, какой контент вы будете отображать.

Если вы заинтересованы в попытке использовать FireBreath для этого, вы можете зайти в чат-комнату FireBreath в рабочее время (GMT-0600), и я обычно рядом и могу обсудить это с вами.

...