Mozilla扩展:从新打开的选项卡中获取文档

时间:2015-07-22 10:51:46

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

我的插件应自动处理新打开的标签,例如提取链接。因此我需要获取DOM文档。我尝试了不同的方法,但似乎没有人工作。最小的例子如下:

var { viewFor } = require("sdk/view/core"); //convert to low lvl
var mtabs_utils = require("sdk/tabs/utils");
var mtabs = require("sdk/tabs"); //all tabs across all windows

mtabs.open("http://www.stackoverflow.com");

mtabs.on('pageshow', newTabLoaded);


function newTabLoaded(tabHighLevel) {
    console.log("v0: "+tabHighLevel.url);
    tabHighLevel.activate(); //does not matter

    //v1
    var chromeWindow = viewFor(tabHighLevel.window);
    console.log("v1: "+chromeWindow.content.location.href);
    //v2
    console.log("v2: "+mtabs_utils.getTabContentWindow(viewFor(tabHighLevel)).content.location.href);
    //v3
    console.log("v3: "+mtabs_utils.getTabBrowserForTab(viewFor(tabHighLevel)).contentDocument.location.href);
    //v4
    console.log("v4: "+mtabs.activeTab.url); //http://stackoverflow.com/questions/12609753/get-window-object-from-tab
    console.log();
}

之后的输出
jpm run

显然是

v0: http://stackoverflow.com/
v1: http://stackoverflow.com/
v2: http://stackoverflow.com/
v3: http://stackoverflow.com/
v4: http://stackoverflow.com/

并且正确。打开新选项卡(鼠标中键点击“问题”)后,再次调用“newTabLoaded()”并输出

v0: http://stackoverflow.com/questions
v1: http://stackoverflow.com/
v2: http://stackoverflow.com/
v3: http://stackoverflow.com/
v4: http://stackoverflow.com/

这意味着传递的参数tabHighLevel是正确的,但各种转换根本不起作用。这条线

tabHighLevel.activate();

对输出没有影响。它只会将实际浏览器中的焦点自动更改为新打开的选项卡(正确的行为)。这很奇怪,因为如果我通过鼠标中键打开一个新选项卡而不是手动选择新选项卡(在我看来同样的事情“.activate();”确实如此),在pageshow事件触发之前和“newTabLoaded()”被调用,然后输出是正确的。

v0: http://stackoverflow.com/questions
v1: http://stackoverflow.com/questions
v2: http://stackoverflow.com/questions
v3: http://stackoverflow.com/questions
v4: http://stackoverflow.com/questions

我读到了一些关于只能获取活动窗口文档以防止安全隐患的内容,但如果这是真的,那么调用“.activate();”应该是适当的解决方法...

那么,如何从新打开的标签中获取文档?最好不要更改实际选中的标签。

1 个答案:

答案 0 :(得分:0)

嗯,这似乎工作正常。

var doc = mtabs_utils.getBrowserForTab(viewFor(tabHighLevel)).contentDocument;
console.log(doc.location.href);

另一个没有直接使用“sdk / tabs / utils”的variante:

var doc = viewFor(tabHighLevel.window).top.gBrowser.getBrowserForTab(viewFor(tabHighLevel)).contentDocument;
console.log(doc.location.href);

你得到最顶层的chromeWindow(低级窗口)/“主窗口”来调用“.getBrowserForTab(...);”在那。