2012-06-28 57 views
0

我在我的插件中有一個對話框,當一些刪除過程完成時打開它。我用所有這些消息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

事情是其他對話使用沒有任何問題(例如,新的配置文件成功初始化具有不同的消息字符串參數)。在我重新啓動瀏覽器後,此刪除過程完成對話框正常工作(所以在更新插件後重新啓動了兩次)。 –

回答

1

我終於找到原因了。問題確實是由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'事件處理程序,工作正常。