Как я могу проверить настройки моего расширения Firefox?

Каков общепринятый способ проверки значений предпочтений в расширении Firefox, особенно при использовании механизма prefwindow в XUL?

Я ввожу некоторые новые настройки в одном из моих расширений, которые я хотел бы проверить до закрытия окна настроек. Если есть ошибка, пользователь должен иметь возможность исправить проблему, а затем продолжить. Я вижу, что prefwindow Элемент имеет две потенциально полезные функции, чтобы помочь в этом отношении:

Первый, кажется, имеет связанную ошибку ( ошибка 474527), которая предотвращает prefwindow оставаясь открытым при возвращении false из этой функции. Это плохо, так как не дает пользователю возможности немедленно исправить свою ошибку.

В последнем случае проблема заключается в том, что настройки сохраняются перед выходом, что оставляет настройки в плохом состоянии внутри.

В дополнение prefwindow Механизм поддерживает browser.preferences.instantApply опция, в которой значения предпочтений записываются сразу после обновления соответствующего элемента управления. Это делает проверку более сложной. Есть ли чистый способ проверки пользовательских настроек в расширении Firefox, позволяющий пользователю исправлять любые потенциальные ошибки?

2 ответа

Решение

Обычно вы хотите проверить предпочтения при их изменении. Это то, что onchange атрибут (и соответствующий change событие) хорошо для:

<preference name="preference.name" onchange="validate(this);"/>

Событие запускается после изменения значения предпочтения. Есть два недостатка:

  • В случае instantApply новое значение предпочтения уже сохранено, слишком поздно для проверки и отклонения.
  • Для текстовых полей настройки сохраняются каждый раз, когда вводится новый символ. Это становится ужасным, если вы сообщаете об ошибке проверки, когда пользователь все еще печатает.

Вы можете решить первую проблему, перехватывая события изменения для фактических полей ввода. Например, для текстового поля вы должны сделать:

<input preference="preference.name"
    oninput="if (!validate(this)) event.stopPropagation();"
    onchange="if (!validate(this)) { event.stopPropagation(); this.focus(); }"/>

Таким образом, изменения, которые не проходят корректную проверку, не будут <prefpane> элемент и не спасаться. События для прослушивания: input а также change для текстовых полей, command для кнопок и флажков, select для <colorpicker> элемент.

Второй вопрос сложен. Вы все еще хотите проверить ввод, когда это произойдет, однако показ сообщения будет плохим пользовательским интерфейсом. Я думаю, что наилучшим решением является исходное допущение для каждого поля ввода, что оно все еще "в процессе". Вы только установите флаг, что значение завершено, когда вы впервые видите blur событие на поле. Именно тогда вы можете при необходимости показать сообщение проверки (в идеале красный текст должен отображаться на вашей странице предпочтений, а не модальное приглашение).

Итак, чтобы указать, как может выглядеть окончательное решение (непроверенный код, но я использовал что-то подобное в прошлом):

<description id="error" hidden="true">Invalid preference value</description>

<input preference="preference.name"
    _errorText="error"
    onblur="validate(event);"
    oninput="validate(event);"
    onchange="validate(event);/>

<script>
  function validate(event)
  {
    // Perform actual validation
    var field = event.target;
    var valid = isValid(field);

    // If this is the blur event then the element is no longer "in progress"
    if (event.type == "blur")
    {
      field._inputDone = true;
      if (!valid)
        field.focus();
    }

    // Prevent preferences changing to invalid value
    if (!valid)
      event.stopPropagation();

    // Show or hide error text
    var errorText = document.getElementById(field.getAttribute("_errorText"));
    errorText.hidden = valid || !field._inputDone;
  }
</script>

Если вы хотите проверить значения, как только поле будет изменено, вы можете обработать instantApply В этом случае вы можете подключиться к событиям изменения для отдельных полей (например, oninput для textbox). Отобразите сообщение об ошибке и верните фокус в поле, если значение недопустимо. Вы можете либо автоматически установить его обратно в допустимое значение, либо запретить пользователю закрывать диалоговое окно, пока оно не будет исправлено.

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