注入脚本错误:脚本在Firefox扩展上返回非结构化可克隆数据

时间:2017-06-15 12:27:34

标签: javascript firefox-addon firefox-webextensions

我想将firefox web扩展中的脚本注入tabId思想browser.tabs.executeScript API。

我有一个文件Browser.js

MyFunc.Browser = (function() {
  var self;

  function Browser() {
    self = this;
  }

  Browser.getExtensionURI = function() {
    return "chrome-extension://";
  };

  return Browser;

})();

执行脚本功能:

var executing = browser.tabs.executeScript(tabId, {
            file: "js/contentscripts/Browser.js"
          });
 executing.then(function(results) {
    console.log("url: " + tabUrl + ", result", results);

 }, function(error) {
    return console.log("Inject scripts error: " + error);
 });

但是脚本无法注入选项卡并显示错误。

我该如何解决?

清单文件:

{
  "name": "abc",

  "background": {
    "page": "background.html"
  },
  "browser_action": {
    "default_icon": "icons/icon_19.png",
    "default_popup": "login.html",
  },
  "content_scripts": [
    {
      "web_accessible_resources": [


        "js/contentscripts/Browser.js",

      ],
      "js": [
        "js/contentscripts/ContentScript.js"
      ],
      "matches": [
        "file://*/*",
        "http://*/*",
        "https://*/*"
      ],
      "run_at": "document_end",
      "all_frames": true
    },
    {
      "js": [

        "js/contentscripts/Browser.js",
      ],
      "matches": [
        "file://*/*",
        "http://*/*",
        "https://*/*"
      ],
      "run_at": "document_start",
      "all_frames": true
    }
  ],
  "icons": {
    "16": "icons/icon_16.png",
    "19": "icons/icon_19.png"
  },
  "incognito": "spanning",
  "permissions": [
    "activeTab",
    "tabs",
    "http://*/*",
    "https://*/*",
    "<all_urls>"
  ],
  "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'",
  "version": "1.1.16"
}

3 个答案:

答案 0 :(得分:4)

在“js / contentscripts / Browser.js”文件中,添加“undefined;”到最后一行。
该值将返回“execution.then”第一个回调参数的结果
参考:https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/tabs/executeScript#Return_value

答案 1 :(得分:2)

我想我现在明白你的问题。

你的executeScript的返回数据必须是可克隆的 为了被认为是结构化克隆,数据必须匹配以下数据类型之一:

  • 所有原始类型 - 但不是符号
  • 布尔对象
  • 字符串对象
  • 日期
  • RegExp - 不保留lastIndex字段。
  • Blob
  • 档案
  • FileList
  • ArrayBuffer
  • ArrayBufferView - 这基本上意味着所有类型的数组,如Int32Array等。
  • ImageData
  • 数组
  • 对象 - 这只包括普通对象(例如来自对象文字)
  • 地图
  • 设置

https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm#Supported_types

在您的情况下,问题是您正在返回一个在其属性中具有函数的对象。因此,它是非结构化克隆的,这可以解释您的错误。

答案 2 :(得分:0)

根据MDN

  

脚本的结果是最后计算的语句,...

(类似于脚本 bash 函数如何将最后计算的结果用作其返回结果。)

该结果必须是上述@Forivin的answer中的类型列表之一。但是,这并不是对脚本中最后一条命令的通常约束,因此,它会吸引很多人,这在搜索OP错误消息时会看到许多结果。

添加字符串

"Browser.js END OF FILE"

在文件 Browser.js 的末尾(如果实际到达该行)可以安全地将结果设置为该字符串。

(注意:脚本中的各种处理程序和活动对象将继续计算,但是解释器将完成对脚本的解析,依次执行命令,并返回最终解析的行。)


就我而言,重构脚本后出现错误

window.onhashchange=winHashHandler;

作为最后一行。只需在该行之后放置一个字符串即可消除错误。