getViews()的跨源问题

时间:2016-09-08 20:35:29

标签: javascript firefox firefox-addon firefox-webextensions

我一直在空闲时间创建一个基于Firefox WebExtensions的插件,它实际上是读取页面,打开本地HTML,在HTML页面上提交表单以导航到新的URL但是我遇到了问题一旦打开的页面更改了网址,我就会chrome.extension.getViews()

如果我重用getViews(),我收到以下错误:

  

不允许在[Object]或[Array] XrayWrapper

上将跨源对象定义为属性

我跟踪了这​​一点,发现一旦我的本地HTML导航就会发生这种情况。我应该如何与打开的网页进行交互以解决此问题?

以下是我与超时一起入侵的小型娱乐活动(不是我的实际项目,只是为了显示问题):

background.js

var views;

function openMyPage() {
  console.log("injecting");
    chrome.tabs.create({
        url: chrome.extension.getURL("content_scripts/my-page.html"),
        active: false
    }, function(tab) {
        chrome.windows.create({
            tabId: tab.id, 
            type: "normal",
            state: "maximized"
        }, function(window) {
            setTimeout(function(){
                views = chrome.extension.getViews();
                for(var i = 0; i < views.length; i++)
                    console.log("window location: " + views[i].location + " view id: " + i);
                views[1].example();
                setTimeout(function(){
                    for(var i = 0; i < views.length; i++)
                        console.log("window location: "+views[i].location+" view id: " + i);
                }, 5000);
            }, 2000);

        }); 
    });
}

chrome.browserAction.onClicked.addListener(openMyPage);

MY-page.html中

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <script src="my-page.js"></script>
  </head>
<body>
  <h1>It's my page!</h1>
</body>
</html>

MY-page.js

console.log("loaded in my-page");

function example() {
    document.location.href = "https://www.google.com/";
}

1 个答案:

答案 0 :(得分:0)

正如您所发现的那样,一旦您离开window对象所占据的页面,您提供的window对象就不再有效。 window对象在您打开的窗口显示与调用extension.getViews()时相同的页面时有效。一旦您离开该页面,它就会变为无效。即使您已导航到扩展程序中的其他页面,旧的window对象也将无效,因为将为新页面创建新的window对象。但是,如果新页面来自您的扩展程序,则您可以通过对window的新调用获取新的extension.getViews()对象。

离开扩展程序中的页面后,extension.getViews()将不再找到弹出/标签的window对象。

一旦您离开您自己扩展程序中的网页的网址,您就应该像使用其他任何内容一样与该网页进行互动:使用content script

extension.getViews()会获得window个对象:

  

为当前扩展程序中运行的每个页面返回Window个对象的数组。这包括,例如:

     
      
  • 背景页面,如果已定义
  •   
  • 任何弹出页面,如果已定义并加载
  •   
  • 任何选项页面,如果已定义并加载
  •   
  • 主机内容随附加
  • 打包的所有浏览器标签