我正在开发一些插件,在加载插件期间需要用户交互。确切地说,当加载插件时,会显示弹出模式对话框,用户必须通过单击"允许"或"拒绝"来允许(拒绝)插件访问外部设备。
我使用Firebreath的方法FB::BrowserHost::ScheduleOnMainThread在主线程上调度函数调用"showPopUpAlert",对于模式对话框,我使用Cocoa API调用[alert-runModal]和[alert-abortModel]或[alert-stopModal]。
当我在一个选项卡中运行插件时,不要通过单击对话框的按钮来回答(对话框仍然打开),并尝试在单独的选项卡中再次加载插件。对话框的新实例显示在顶部。然后,在第二个对话框处于活动状态之前,我无法访问第一个打开的对话框。
如果我点击第二个打开的对话框"允许"或"拒绝",它将被关闭,第一个对话框仍处于活动状态。
当我试图关闭两个打开的选项卡中的一个时,会出现问题。
1) 如果我关闭第二个打开的选项卡,它们的弹出对话框将关闭,下面第一个打开的对话框仍处于活动状态。2) 我尝试关闭第一个打开的选项卡,第二个弹出对话框将关闭,第一个打开对话框将处于非活动状态。
这只是Firefox的问题,Chrome和Safari可以完美地工作。
在Chrome和Safari上,如果一个对话框处于活动状态,则整个浏览器将被阻止,并且在打开对话框之前无法打开新选项卡。
如果能让Firefox像Chrome和Safari一样工作,那就太好了。你有什么建议吗?
我曾尝试访问浏览器窗口并使用方法beginSheetModalForWindow,但我在几个主题上读到这是不可能的,因为插件和浏览器在不同的线程中运行。
我的代码依赖于出租车司机的例子,请看一看,如果有人能帮助我,我将不胜感激。
谨致问候,l3r
很抱歉我说不清楚。
我有一个使用插件的示例web应用程序。
当我运行示例应用程序时,会显示一个模式对话框(NSAlert),其中包含一个问题:"你允许插件访问你的外部设备吗?"这个问题可以通过点击"允许"或"拒绝"按钮来回答。
1) 我在Firefox中的一个选项卡中运行了示例应用程序,但没有回答这个问题,模式对话框保持在顶部。
2) 我打开一个新的选项卡,再次运行示例应用程序,显示了新的模态对话框。现在出现了两个模态对话框,一个在另一个前面。
3) 如果我关闭在1)中打开的选项卡,则2)中的模式对话框将关闭,1)中的模态对话框将保持非活动状态(无法回答此问题)。
如果以前打开过一个模式对话框,我想阻止浏览器(Firefox)打开新的选项卡,或者如果我关闭了一个选项卡,我希望他们的模式对话框关闭,而不是顶部的另一个。有可能吗?你有什么建议吗?
我希望我说得更清楚一点。
谨致问候,l3r
实际上,从NPAPI插件中不可能真正实现对话框的模态;现代浏览器在一个单独的进程(而不是线程)中运行插件,而OSX没有办法使对话框在应用程序之间具有模式。相反,每个浏览器都近似于行为。
你可以针对Firefox提交一个bug,也许他们可以以不同的方式处理这种情况,但从根本上说,设计是有缺陷的:强烈反对使用插件中的模态对话框,也不能保证它能正确工作。
一个更好的解决方案是根本不使用模态对话框,并将您需要的任何UI放在插件的范围内,因为NPAPI插件是要使用的。
根据您更新的文本,听起来您真正想问的是如何防止多个选项卡打开模式对话框。
基本上,我建议创建一个全局单例来管理对话框;在上面放一个YourAPIWeakPtr来引用它应该调用的内容(或类似的内容),然后在允许任何东西打开第二个对话框之前检查是否打开了另一个对话框。
然后,您可以拒绝旧请求并关闭对话框,也可以在收到新请求而旧请求仍处于打开状态时忽略未来的请求。
请记住,对于插件的所有实例,您仍然处于同一个进程中,因此问题只是确保每个进程只能使用一次资源。