Надстройка Bootstrap создает кнопку параметров с произвольным js

Я понял из Bugzilla, что вы можете установить URL-адрес параметров в install.rdf на произвольный js, и он будет работать отлично. Проблема только в том, что окно деактивируется, как будто над ним открылся невидимый диалог, и ни на что его не закрыть.

Например: В моем аддоне здесь: простой тестовый пример, при запуске он просто предупреждает о запуске, а в диспетчере аддонов он показывает кнопку параметров, при нажатии он делает notifyObserver, но затем переходит во все диалоговые режимы: GitHub :: Noitidart / PortableTester

Вы можете установить это дополнение прямо из репозитория с помощью дополнения GitHubExtensionInstaller

Код в моем optionsurl:

<em:optionsURL>
    javascript:Components.utils.import('resource://gre/modules/Services.jsm');Services.obs.notifyObservers(window, 'hellothisisyourcaptainspeaking', 'options')
</em:optionsURL>

Я хотел бы не переходить в этот режим невидимого диалога после нажатия кнопки параметров. Или, если мы не можем предотвратить это, я бы хотел добавить некоторый код в optionurl, чтобы выйти из этого заблокированного режима.

В этой заметке я пробовал этот код, и он не работал:

        javascript:
        Components.utils.import('resource://gre/modules/Services.jsm');
        Services.obs.notifyObservers(window, 'hellothisisyourcaptainspeaking', 'options');
        var DOMWin =    window.QueryInterface(Components.interfaces.nsIInterfaceRequestor).getInterface(Components.interfaces.nsIWebNavigation).QueryInterface(Components.interfaces.nsIDocShellTreeItem).rootTreeItem.QueryInterface(Components.interfaces.nsIInterfaceRequestor).getInterface(Components.interfaces.nsIDOMWindow);
        var utils = DOMWin.QueryInterface(Components.interfaces.nsIInterfaceRequestor).getInterface(Components.interfaces.nsIDOMWindowUtils);
        utils.leaveModalState();

Это можно увидеть в этом коммите здесь: GitHub :: Коммит Noitdart / PortableTester показывает попытку покинуть это диалоговое окно режим


person Noitidart    schedule 14.07.2014    source источник


Ответы (1)


Вы не можете запретить диспетчеру дополнений открывать модальное диалоговое окно. Однако вы можете легко закрыть его, просто добавьте window.close() к вашей команде. Это предполагает, что ваш код выполняется в контексте этого модального диалога, если нет, то Services.wm.getMostRecentWindow(null).close() должен подойти.

Тем не менее, я считаю использование здесь URL-адреса javascript: неудобным, этот подход также может сломаться в будущем. Вам следует подумать об использовании минимального диалогового окна XUL (без каких-либо таблиц стилей, поэтому оно также будет невидимым), которое включает файл JavaScript. Тогда у вас будет код в правильном файле скрипта, а не втиснутый в одну строку в install.rdf.

person Wladimir Palant    schedule 14.07.2014
comment
О, я не понимал, что код работает в диалоговом окне. Оба метода window.close() и Services.wm... работают идеально. Спасибо за рекомендацию использовать файл. - person Noitidart; 14.07.2014