Динамический способ отсоединения динамически связанного XBL

Я применяю связывание, как это в перезапускаемом дополнении:

var css = '.findbar-container { -moz-binding:url("' + self.path.chrome + 'findbar.xml#matchword") }';
var cssEnc = encodeURIComponent(css);
var newURIParam = {
    aURL: 'data:text/css,' + cssEnc,
    aOriginCharset: null,
    aBaseURI: null
}
cssUri = Services.io.newURI(newURIParam.aURL, newURIParam.aOriginCharset, newURIParam.aBaseURI);
myServices.sss.loadAndRegisterSheet(cssUri, myServices.sss.USER_SHEET);

findbar.xml Содержание:

<?xml version="1.0"?>
<bindings xmlns="http://www.mozilla.org/xbl" xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
    <binding id="matchword">
        <content>
            <children/>
            <xul:toolbarbutton anonid="matchwordbtn" accesskey="w" class="tabbable" label="Whole Word Only" tooltiptext="Match only whole words" oncommand="console.log('hi')" type="checkbox"/>
        </content>
    </binding>
</bindings>

Это просто добавляет кнопку к FindBar с пометкой "Только целое слово". Но теперь, чтобы удалить его, я просто отменяю регистрацию таблицы стилей myServices.sss.unregisterSheet(cssUri, myServices.sss.USER_SHEET);Однако это не освобождает от обязательств.

Ответ на ask.mozilla.org сказал мне, что это ожидаемое поведение, но не предложил решения.

Я подумал, может быть, мне следует динамически добавить привязку, а не через CSS, я не проверял это, но это не соответствует трем причинам для обновлений XBL:

  1. Связанный элемент соответствует правилу стиля, которое определяет другую привязку
  2. Элемент удален из связанного документа
  3. Элемент уничтожается (например, при закрытии документа)

Ответ сказал мне, что это ожидаемое поведение.

1 ответ

Решение

Ну, я только что вспомнил, что у меня есть некоторый рабочий код, который (ре) связывает различные XBL-привязки, по сути.

Это выглядит так:

  • Есть базовая привязка или нет (в вашем случае оригинальная привязка .findbar-container).
  • Тогда у меня есть несколько классов, которые определяют разные -moz-binding s.
  • Эти классы устанавливаются и удаляются во время выполнения.

Поскольку это работает для меня, теоретически это должно работать для вас:

  • В вашем стиле нет правила для самого элемента, но для класса, например

    .findbar-container.myaddonclass { moz-binding: ... }
    
  • В своем коде при загрузке добавьте этот новый класс, например

    Array.forEach(
      document.querySelectorAll(".findbar-container"),
      e => e.classList.add("myaddonclass")
      );
    
  • В вашем коде при выгрузке удалите класс снова:

    Array.forEach(
      document.querySelectorAll(".findbar-container"),
      e => e.classList.remove("myaddonclass")
      );
    

Это должно привести к переоценке правила CSS и переоценке привязок с этим и, следовательно, соответствовать правилу "Связанный элемент соответствует правилу стиля, которое задает другое правило привязки".

Конечно, это отстой, когда не все элементы, которые вы хотите перепривязать, уже присутствуют при загрузке вашего дополнения, но MutationObserver может помочь с этим...

Другие вопросы по тегам