2011-07-24 34 views
2

我一直在编写基于Mac NPAPI的浏览器插件,将自定义mimetype文件(比如“application/x-foo”)转换为HTML表示形式,它可以然后直接在浏览器中查看。这些文件通常是直接提供的,所以我更关心支持整页查看,而不是通过<object>标签嵌入视图。如何从Safari中的NPAPI插件呈现HTML

在Firefox上,这一直是比较简单的:我做出NPN_NewStreamtext/html MIME类型的电话,写HTML转换成流,然后用NPN_DestroySteam清理。浏览器自动处理对新HTML流的请求,并将给定的HTML呈现为标签或窗口。相当标准。

对于Safari,NPN_NewStream似乎没有实现(并且我没有检查WebKit源代码)。以前,我能够使用WebKitPlugin API。在Safari 5.1中,这个API不见了。

我想我能在一个绘图事件处理程序创建一个web视图,就像这样:

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渲染的。

我的问题归结为:是否有一种很好的方法来从NPAPI插件渲染一些HTML到Safari窗口?或者,如果这不起作用,进入谷歌浏览器窗口?或者让我处理自定义MIME类型并显示其一些HTML表示的其他方法?

回答

0

老实说,我很惊讶你的新的方法适用于Firefox;这是我从来没有听说过的新的。如果您必须自己完成绘图,那么您仅限于使用带有CGContext的CoreGraphics或带有CALayer的CoreAnimation。换句话说,你不会得到一个NSView,所以你不能直接渲染一个WebView。这就是说,你可以把webview放在屏幕外的上下文中,并将它呈现给你的CGContext,然后代理这些事件;这对于你想要做的事似乎有点复杂,但我不知道有另一种方式去做。

有一个experimental libraryFireBreath这样做;滚轮没有实现,但其他事件工作,包括鼠标拖动和键盘。当使用表单事件时,它仍然有一些奇怪的事情,所以这对你是否有效取决于你将显示的内容。

如果您有兴趣尝试使用FireBreath,则可以在营业时间(GMT-0600)内放入FireBreath chat room,我通常会在周围讨论。