如果其标签存在,我希望我的插件在浏览器启动时重新加载内部页面(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
。
答案 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")