在浏览器启动时执行插件代码

时间:2014-06-10 13:18:49

标签: javascript firefox firefox-addon firefox-addon-sdk

如果其标签存在,我希望我的插件在浏览器启动时重新加载内部页面(index.html)。这是我正在使用的代码,但根本没有任何反应。我做对了吗?文档似乎说这是正确的方法。

exports.main = function(options) {
  var tabs = require('sdk/tabs');
  if (options.loadReason === 'startup') {
    for (var i = tabs.length - 1; i >= 0; i--) {
      var tab = tabs[i];
      if (tab.url !== self.data.url('index.html')) {
        continue;
      }
      tab.once('ready', runScript.bind(null, tab));
      tab.reload();
    }
  }
};

很难调试,因为在执行cfx run时,loadReason总是install

2 个答案:

答案 0 :(得分:3)

嗯。经过测试,似乎在调用main()时,会话还原更改尚未传播(以SDK理解的方式)。

使用setTimeout(..., 0)修正了该行为:

const self = require("sdk/self");
const selfTabUrl = self.data.url("index.html");
console.log("self", selfTabUrl);

function runScript(tab) {
  console.log("runScript", tab.url);
}

function reloadTab(options) {
  var tabs = require('sdk/tabs');
  for (var i = tabs.length - 1; i >= 0; i--) {
    var tab = tabs[i];
    if (tab.url !== selfTabUrl) {
      continue;
    }
    tab.once('ready', runScript.bind(null, tab));
    tab.reload();
    console.log("reload", tab.url);
    return true;
  }
  return false;
}

exports.main = function(options) {
  if (options.loadReason === 'startup') {
    if (!reloadTab()) {
      console.log("didn't find a tab on first attempt; retrying");
      require("sdk/timers").setTimeout(reloadTab, 0);
    }
  }
};

这适用于Firefox稳定版(29),如果以后更改行为,则会避免使用setTimeout

关于调试: 为避免cfx run设置和重新安装(而不是重新使用配置文件并只启动扩展程序),请使用--profiledir=开关,例如(在* nix系统上)

$ mkdir p # run once
$ cfx run --profiledir=$PWD/p

答案 1 :(得分:0)

使用const { loadReason } = require("sdk/self");并检查if (loadReason == "startup")