XUL диалоговият прозорец не се затваря след натискане на бутона Затвори

Имам диалогов прозорец в моя аддон, който се отваря, когато завърши някакъв процес на изтриване. Използвам за всички подобни съобщения XUL диалогов прозорец, който изглежда така:

<?xml version="1.0"?>
<?xml-stylesheet href="/bgchrome://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(), така че трябва да плъзгам диалоговия прозорец прозорец отново наоколо, за да изчезне. Какво трябва да направя?


person Ivan Kashtanov    schedule 28.06.2012    source източник
comment

Нов съм в java. Когато преминавах през езиковата спецификация, открих, че статичните класове не могат да бъдат декларирани, но можем да имаме статични вътрешни класове. Малко съм объркан защо не можем да имаме статичен клас от най-високо ниво. Ако искам да създам клас, съдържащ само помощни методи, мога да избера статичен клас. Някаква причина защо разработчиците на Java са ограничили тази функция?

  -  person Wladimir Palant    schedule 28.06.2012
comment
Работата е там, че другите употреби на диалоговия прозорец нямат никакви проблеми (напр. нов инициализатор за успех на профил има различен параметър за низ на съобщението, това е всичко). И този диалогов прозорец за завършване на процеса на изтриване работи добре, след като рестартирам браузъра отново (така че това са две рестартирания след актуализиране на добавката).   -  person Ivan Kashtanov    schedule 28.06.2012


Отговори (1)


Най-накрая открих причината. Проблемът наистина беше причинен от скрипта dialogInit.js.

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

Той съдържа дори манипулатори за събития "зареждане" и "разтоварване". Първият извиква инициализатор, посочен в метод, който отваря този прозорец. Но имаше още един манипулатор за събитието „MozAfterPaint“, който извика window.sizeToContent, така че този безкраен цикъл беше задействан, предполагам. Разширението не е създадено от нулата, така че не забелязах тази грешка известно време. Преместих преоразмеряването към манипулатора на събитието „зареждане“ след извикване на този инициализатор, работи добре.

person Ivan Kashtanov    schedule 04.07.2012