代码之家  ›  专栏  ›  技术社区  ›  l3r

NPAPI插件-Mac OS-[NASlert runModal]在打开多个模式对话框时无法在Firefox上正常工作

  •  0
  • l3r  · 技术社区  · 10 年前

    我正在开发一些插件,我需要在插件加载期间进行用户交互。准确地说,当加载插件时,将显示弹出模式对话框,用户必须通过单击“允许”或“拒绝”允许(拒绝)插件访问外部设备。

    我使用Firebreath的方法FB::BrowserHost::ScheduleOnMainThread来调度主线程上的函数调用“showPopUpAlert”,并且对于模式对话框,我使用Cocoa API调用[alert-runModal]和[alert-abortModal]或[alert-stopModal]。

    当我在一个选项卡中运行插件时,不要通过单击对话框的按钮来回答(对话框仍然打开),并尝试在单独的选项卡中再次加载插件。对话框的新实例显示在顶部。然后,在第二个对话框激活之前,我无法访问第一个打开的对话框。

    如果我单击第二个打开的对话框“允许或拒绝”,它将关闭,第一个对话框仍将处于活动状态。

    尝试关闭两个打开的选项卡之一时出现问题。

    1) 如果我关闭第二个打开的选项卡,它们的弹出对话框将关闭,而下面的第一个打开的对话框仍将处于活动状态。 2) 我尝试关闭第一个打开的选项卡,第二个弹出对话框将关闭,第一个打开对话框将不活动。

    这只是Firefox的问题,Chrome和Safari都能完美工作。

    在Chrome和Safari上,如果一个对话框处于活动状态,整个浏览器将被阻止,并且在打开对话框之前无法打开新选项卡。

    如果Firefox能够像Chrome和Safari一样工作,那就太好了。你有什么建议吗?

    我已经尝试访问浏览器窗口并使用beginSheetModulForWindow方法,但我已经阅读了几个主题,因为插件和浏览器在单独的线程中运行,所以这是不可能的。

    我的代码依赖于 taxilian's example ,请看一看,如果有人能帮助我,我将非常感激。

    当做 13升

    对不起,如果我不清楚。

    我有一个使用插件的示例web应用程序。

    当我运行示例应用程序时,会显示一个模式对话框(NSAlert),其中有一个问题:“您允许插件访问您的外部设备吗?” 可以通过单击“允许”或“拒绝”按钮来回答问题。

    1) 我在Firefox中的一个选项卡中运行了示例应用程序,但没有回答问题,模式对话框保持在顶部。

    2) 我打开一个新选项卡,再次运行示例应用程序,显示新的模式对话框。现在,两个模态对话框一个出现在另一个前面。

    3) 如果我关闭1)中打开的选项卡,2)中的模态对话框将关闭,1)中的模式对话框将保持不活动状态(无法回答问题)。

    如果之前打开了一个模式对话框,或者如果关闭了一个选项卡,我希望浏览器(Firefox)不要打开新的选项卡,而不是关闭位于顶部的另一个选项卡。 有可能吗?你有什么建议吗?

    我希望我说得更清楚一点。

    当做 13升

    2 回复  |  直到 10 年前
        1
  •  1
  •   smorgan    10 年前

    实际上,NPAPI插件中的对话框不可能是真正的模态对话框;现代浏览器在一个单独的进程(而不是线程)中运行插件,而OSX没有办法使对话框在应用程序之间成为模态。相反,每个浏览器都近似于行为。

    你可以针对Firefox提交一个bug,也许他们可以用不同的方式处理这个问题,但从根本上来说,设计是有缺陷的:强烈不鼓励使用插件中的模态对话框,而且不能保证它能正常工作。

    更好的解决方案是根本不使用模态对话框,并将您需要的任何UI放在插件的范围内,因为NPAPI插件旨在被使用。

        2
  •  0
  •   taxilian    10 年前

    根据您更新的文本,听起来您真正要问的是如何防止多个选项卡打开模式对话框。

    基本上,我建议创建一个管理对话框的全局单例;在其上放置YourAPIWeakPtr以引用它应该调用的内容(或类似内容),然后在允许任何内容打开第二个对话框之前检查另一个对话框是否打开。

    然后,您可以拒绝旧请求并关闭对话框,也可以在新请求传入且旧请求仍处于打开状态时忽略将来的请求。

    请记住,对于插件的所有实例,您仍然处于相同的进程中,所以这只是确保每个进程只能使用一次资源的问题。