在firefox插件sdk中记录用户输入和确认

时间:2012-03-07 12:45:09

标签: javascript firefox-addon-sdk

我有一个问题,我现在已经苦苦挣扎了几天。

我正在为firefox编写一个userInput记录系统,以便用它来记录基于Web的应用程序的测试。

我正在表单字段上记录onchange事件,并使用带有添加到每个字段的onchange事件的侦听器的contentScript将它们保存在商店中。

field.addEventListener('change', recordFieldChange);

我还使用基于观察者服务的window.confirm方法覆盖来记录用户js确认响应。

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;
  }
};

我遇到的麻烦是,在字段更改之前记录了由字段更改触发确认的任何确认响应,这是运行测试的错误顺序。

我认为这是因为页面的onchange是在插件内容之前评估的,有没有办法改变这个顺序?

我希望解决方案或解决方法不使用超时或更改基本页面内容。 我还需要能够记录由页面加载等其他事件引起的确认。

1 个答案:

答案 0 :(得分:1)

问题是页面和内容脚本在同一个元素上注册事件处理程序 - 并且它们将被调用的顺序是未定义的(但是,我认为Firefox在添加任何侦听器之前始终调用onchange通过addEventListener)。您需要在网页执行之前获取change事件并触发其他操作。解决方案是在顶级capture phase期间捕获事件。在捕获阶段,事件“吸入”到实际元素并在泡沫阶段开始之前触发捕获事件侦听器,并且事件再次上升触发常规事件侦听器。这样的事情应该有效:

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

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

这不再在单个字段中注册事件侦听器,而是在window级别注册。请注意,如果网页收听inputkeypress等其他事件,则无效。