Запись пользовательских входов и подтверждений в Firefox Addon SDK - PullRequest
0 голосов
/ 07 марта 2012

У меня есть проблема, с которой я боролся уже несколько дней.

Я пишу систему записи userInput для Firefox с целью ее использования для записи тестов для веб-приложения.

Я записываю события onchange в поля формы и сохраняю их в хранилище, используя contentScript с добавленными прослушивателями для события onchange каждого поля.

field.addEventListener('change', recordFieldChange);

Я также записываю, что пользователь js подтверждает ответы, используя переопределение на основе сервиса наблюдателя методов window.confirm.

var obs = require("observer-service");

obs.add("content-document-global-created", observeWindow);

function observeWindow(subject) {
  var window = subject.wrappedJSObject;
  var standardConfirm = window.confirm;

  window.confirm = function(pMessage) {
    response = standardConfirm(pMessage);
    recordConfirm(response);
    return response;
  }
};

Проблема, с которой я столкнулся, заключается в том, что любые подтверждающие ответы, когда подтверждение инициируется изменением поля, записываются до изменения поля, что является неправильным порядком для запуска теста.

Я думаю, это потому, что обмен страниц оценивается до добавления содержимого аддона, есть ли способ изменить этот порядок?

Я надеюсь на решение или обходной путь, в котором не используются тайм-ауты или изменение основного содержимого страницы. Мне также нужно иметь возможность записывать подтверждения, вызванные другими событиями, такими как загрузка страниц.

1 Ответ

1 голос
/ 07 марта 2012

Проблема в том, что страница и ваш скрипт контента регистрируют обработчики событий на одном и том же элементе - и порядок их вызова не определен (однако я думаю, что Firefox последовательно вызывает onchange до того, как какие-либо слушатели будут добавлены через addEventListener). Вам нужно получить событие change до того, как это сделает веб-страница, и вызвать дополнительные действия. Решением было бы перехватить событие во время фазы захвата на верхнем уровне. На этапе захвата событие «впитывается» в фактический элемент и запускает захват прослушивателей событий до начала фазы пузырька, и событие снова повышается, вызывая регулярные прослушиватели событий. Примерно так должно работать:

window.addEventListener("change", recordFieldChange, true);

function recordFieldChange(event)
{
  var field = event.target;
  ...
}

Это больше не регистрирует слушателя событий в отдельном поле, а скорее на уровне window. Обратите внимание, что это не сильно поможет, если веб-страница прослушивает другое событие, например input или keypress.

...