首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Safari 5.1 npapi问题

Safari 5.1 npapi问题
EN

Stack Overflow用户
提问于 2011-08-17 21:33:40
回答 3查看 1.3K关注 0票数 0

几天来,我一直在努力解决这个问题,我在网上找到了所有关于mac上的npapi的信息。

我们的目标是拥有一个可以在safari和firefox(mac)上运行的npapi插件。我的软件(我不能为此特别重写,大约有45000行C代码)是基于连接到NSDocument上的NSView……

我有一个基于webkit版本的插件,我必须将其丢弃(感谢Apple!)基于相同的NSView。

我有一个npapi版本的插件,它在firefox上工作得很好。在这个npapi插件中,我采用了carbon window ref,并基于此创建了一个NSWindow : NSWindow *browserWindow = [[NSWindow alloc initWithWindowRef:wind]autorelease];

我把我的NSView放在这个窗口上,它就能工作了。

现在的pb是,我不能在safari上做同样的事情。

请看附件中的图片,窗口不在safari的窗口中!

我试了几种方法...它不起作用。可可的狗肉能说出我哪里做错了吗?或者这是一个已知的问题?

NPError窗口(NPP实例,NPWindow* NPP_SetWindow){

NP_CGContext *ctx =窗口->窗口;void *wind =ctx->窗口;

..。在NSView初始化函数中:

代码语言:javascript
复制
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;
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-17 22:05:27

在Safari 5.1中,web渲染不是由Safari本身完成的,而是在不同的进程上进行,以增强安全性。打开活动监视器,您将看到名为"Safari Web进程“或类似进程的后台进程。

因此,您不能也不应该基于可在NPAPI插件中获得的Carbon window ref来创建NSWindow。有关这一点,请阅读Apple's own documentation。您应该请求核心图形绘制方法,然后NP_CGContextWindowRef字段应该有一个NSWindow*,而不是Carbon窗口引用。

票数 3
EN

Stack Overflow用户

发布于 2011-08-19 03:17:47

如果它能在Firefox上运行,那就完全令人震惊了,而且完全不受支持。它能在Firefox4和更高版本中工作吗?

如果您一定要使用NSView,我所知道的在插件中实现的唯一方法就是将NSView呈现到您的CGContext中。请记住,在带有Cocoa事件系统的较新的NPAPI浏览器中,您将获得作为draw事件一部分的CGContextRef;要请求draw事件,您可以调用NPN_InvalidateWindow。

FireBreath将completely experimental and not-fully-functional example of rendering an NSView (特别是WebView)转换为CGContextRef,您可以将其作为示例。

除了使用CGContextRef之外,您唯一的其他选择就是使用CALayer;如果您能找到一种方法来制作NSWindow或NSView,那么您就可以了,但是我不知道是否有这样的方法。有人建议将CALayer设置为NSView的渲染层可能会起作用。无论采用哪种方式,您都很可能必须转发所有事件,因为您基本上是在离屏视图中托管NSView。

请不要误会;浏览器中没有支持的方法来获取NSView。从来没有--人们使用的方法是不受支持的,并且依赖于特定于浏览器的API实现。当您使用这样的东西时,您可以可靠地预期它们最终会崩溃,例如在本例中。有关绘图模型的更多信息,请访问read Stuart Morgan's blog post on the subject、查看FireBreath mac drawing model docs或阅读Cocoa event model spec

票数 2
EN

Stack Overflow用户

发布于 2011-08-19 14:34:56

假设您从"take the carbon window ref“开始,那么您的方法注定是失败的,因为它基于Carbon事件模型(不仅如此,而且还假设其内部实现细节)。任何在64位系统上运行Firefox的人都必须在32位模式下手动重启Firefox,这样黑客攻击才能起作用,即使这样,它也只能在Firefox完全取消对Carbon的支持之前才能工作(这是在可预见的未来计划的)。

正如其他答案所说,你的错误之处在于你的整个方法是完全不受支持的,而且它曾经作为一个NPAPI插件工作过,这是幸运的。你不能直接在NPAPI插件中使用NSView。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7093747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档