按下“关闭”按钮后XUL对话框不会关闭

问题描述:

我在我的插件中有一个对话框,当一些删除过程完成时打开它。我用所有这些消息XUL对话框,如下所示:按下“关闭”按钮后XUL对话框不会关闭

<?xml version="1.0"?> 
<?xml-stylesheet href="chrome://myaddon/skin/Style.css" type="text/css"?> 
<!DOCTYPE overlay SYSTEM "chrome://myaddon/locale/mydtd.dtd"> 

<dialog xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" 
     class="dialog" ondialogcancel="return true;"> 
    <dialogheader id="dlgHdr"/> 
    <vbox flex="1" id="content" pack="center"> 
    </vbox> 
    <script 
     type="application/x-javascript" 
     src="chrome://myaddon/content/mainScript.js" 
    /> 
    <script 
     type="application/x-javascript" 
     src="chrome://myaddon/content/dialogInit.js" 
    /> 
    <tfs_string id="new-profile-success" value="&newProfileSuccess.Text;" 
       style="overflow: hidden" /> 
    <tfs_string id="delete-profile-success" value="&deleteProfileSuccess.Text;" 
       style="overflow: hidden" /> 
</dialog> 

它取消按钮,ondialogcancel处理函数返回true。但按下按钮后它不会立即关闭。我必须拖动这个对话框才能让它消失。而且,这个问题只发生在重新安装插件后重新启动浏览器。在按“取消”后,立即关闭另一个重新启动对话框。我使用这个对话框来处理其他一些消息,并且他们没有这样的问题。

如果我关闭窗口并使用Chromebug调试器再次打开它,而不是使用弹出窗口重新启动,我无法重现此错误。但是如果我推出另一个FF版本,然后又是第一个版本(使用调试器),我设法重现它。但是,当我在dialogcancel处理程序上使用逐步执行时,Chromebug的界面变得没有响应(脚本内容区域除外),并且在调试器中看到执行了window.close()后,对话框不会关闭,因此必须拖动对话框再绕过一点窗户,让它消失。 我该怎么办?

+0

如果删除这些脚本,该怎么办?这里的对话框应该可以正常工作(并且肯定不会在安装扩展时有任何依赖关系),我怀疑问题在其他地方 - 可能在'mainScript.js'或'dialogInit.js'中。 –

+0

事情是其他对话使用没有任何问题(例如,新的配置文件成功初始化具有不同的消息字符串参数)。在我重新启动浏览器后,此删除过程完成对话框正常工作(所以在更新插件后重新启动了两次)。 –

我终于找到原因了。问题确实是由dialogInit.js脚本造成的。

window.addEventListener('load', function() { myext.simpleDialogInitialize(); }, false); 
window.addEventListener("MozAfterPaint", function() { window.sizeToContent(); }, false); 
window.addEventListener('unload', function() { myext.simpleDialogFinalize(); }, false); 

它甚至包含用于“加载”和“卸载”事件的处理程序。首先调用打开此窗口的方法中指定的初始值设定项。但是,还有一个名为window.sizeToContent的'MozAfterPaint'事件处理程序,所以我猜,无限循环被触发了。扩展不是从头开始创建的,所以我在一段时间内没有注意到这个错误。我调用初始化器后调整大小到'load'事件处理程序,工作正常。