Зачем использовать createElement вместо описания XUL?

Я расширял средство просмотра правил css в Firefox Devtools и нашел кое-что интересное: это содержимое chrome://browser/content/devtools/cssruleview.xul:

<?xml version="1.0"?>
<!-- This Source Code Form is subject to the terms of the Mozilla Public
   - License, v. 2.0. If a copy of the MPL was not distributed with this
   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<?xml-stylesheet href="chrome://global/skin/global.css"?>
<?xml-stylesheet href="chrome://browser/content/devtools/styleinspector.css" type="text/css"?>
<?xml-stylesheet href="chrome://browser/skin/devtools/csshtmltree.css" type="text/css"?>
<?xml-stylesheet href="chrome://browser/skin/devtools/common.css" type="text/css"?>

<!DOCTYPE window [
  <!ENTITY % inspectorDTD SYSTEM "chrome://browser/locale/devtools/styleinspector.dtd">
  %inspectorDTD;
]>
<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" title="&ruleViewTitle;">
  <script type="application/javascript;version=1.8">
    window.setPanel = function(panel, iframe) {
      Components.utils.import("resource:///modules/devtools/StyleInspector.jsm");
      this.ruleview = new RuleViewTool(panel, window, iframe);
    }
    window.onunload = function() {
      if (this.ruleview) {
        this.ruleview.destroy();
      }
    }
  </script>
</window>

Тем не менее, инспектор DOM показывает множество различных элементов, всплывающее меню с элементами контекстного меню и т. д. Я пытался наложить это на файл, но это не сработало... возможно, потому что оно генерируется динамически. Это не сработало:

<?xml version="1.0" encoding="utf-8"?>
<overlay id="cssInspectorOverlay" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">


<menupopup id="rule-view-context-menu">
    <menuitem id="new-rule-devtooltweak"
        label="New Rule..."
        accesskey="N"
        oncommand="alert('yahoo')"/>
</menupopup>

</overlay>

Глядя на CssRuleView.jsm в Mozilla, я обнаружил, что элементы создаются с помощью createElement, а не файла xul! Интересно, почему они делают это именно так — из соображений производительности или по какой-то другой причине?


person NoBugs    schedule 01.06.2013    source источник


Ответы (1)


Вы просите здесь предположений. Рассматриваемый код был первоначально представлен в ошибке 703643, и я не вижу никаких обсуждение подхода там - Майкл Рэтклифф, по-видимому, считал это лучшим подходом, и никто не беспокоился. Инструменты разработчика обычно предпочитают генерировать содержимое динамически и использовать только минимальное начальное содержимое XUL/HTML — обычно это оправдано, поскольку большая часть отображаемого содержимого является динамической. Поэтому неудивительно, что разработчики злоупотребляют динамической генерацией контента в тех случаях, когда это не является строго необходимым.

Здесь я вижу еще две причины для динамического создания контента:

  • Все данные локализации можно хранить в .properties файлах, а не разделять между .properties и .dtd.
  • Вы все равно должны динамически прикреплять обработчики событий, потому что документ XUL не может «видеть» функции модуля JS.
person Wladimir Palant    schedule 03.06.2013
comment
Что вы имеете в виду, XUL не может видеть функции JS? Атрибут oncommand="mymodule.somefunction()" работает хорошо. - person NoBugs; 04.06.2013
comment
@NoBugs: это модуль JavaScript (jsm), он работает в отдельном контексте и не импортируется в этот фрейм. - person Wladimir Palant; 04.06.2013
comment
Как ни странно, кажется, что контекстное меню было удалено из Firefox 22, возможно, в пользу лучшей системы меню, которая будет добавлена ​​позже? bugzilla.mozilla.org/show_bug.cgi?id=879603 - person NoBugs; 07.06.2013
comment
Похоже, начиная с Firefox 22, они переключают инструменты разработки с XUL на HTML5. (bugzilla.mozilla.org/show_bug.cgi?id=875727) cssruleview.xul больше нет, теперь это файл HTML, на который вы должны ссылаться из наложения во внешнем фрейме. - person NoBugs; 13.06.2013