如何从Safari中的NPAPI插件呈现HTML

时间:2011-07-24 02:10:13

标签: cocoa macos safari npapi

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

在Firefox上,这一点相对简单:我使用NPN_NewStream mimetype调用text/html,将转换后的HTML写入流中,然后使用NPN_DestroySteam进行清理。浏览器自动处理对新HTML流的请求,并将给定的HTML呈现到选项卡或窗口中。很标准。

对于Safari,NPN_NewStream似乎没有实现(我确实检查了WebKit源代码)。以前,我能够使用WebKitPlugin API。使用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从NPAPI插件渲染到Safari窗口中?或者,如果这不起作用,请进入Google Chrome窗口?或者其他一些让我处理自定义MIME类型并显示它的HTML表示的方法?

1 个答案:

答案 0 :(得分:0)

老实说,我很惊讶您的新流方法适用于Firefox;这是我从未听说过的新事物。如果您必须自己进行绘图,则仅限于使用带有CGContext的CoreGraphics或带有CALayer的CoreAnimation。换句话说,您没有获得NSView,因此您无法直接将WebView呈现在其中。

也就是说,您可以将webview放在屏幕外的上下文中并将其呈现给您的CGContext,然后代理事件;对于你想要做的事情来说,这似乎有点复杂,但我不知道另一种方法。

experimental libraryFireBreath可以做到这一点;滚轮未实现,但其他事件工作,包括鼠标拖动和键盘。使用表单事件时仍然有一些奇怪的东西,所以这是否适合你取决于你将显示什么内容。

如果你有兴趣尝试使用FireBreath,你可以在营业时间(GMT-0600)进入FireBreath chat room,我常常在那里讨论它。