Javascript tabs.executeScript()未在扩展的内容页中注入脚本

Javascript tabs.executeScript()未在扩展的内容页中注入脚本,javascript,firefox-addon,firefox-addon-webextensions,Javascript,Firefox Addon,Firefox Addon Webextensions,我刚刚开始学习如何在firefox中创建自己的插件。我使用的是webExtensions,尽管我发现很难获得全面的文档(我想是因为它还是一个新的实现?)。代码似乎都工作正常,并且在executeScript调用后完成了一个“onExecuted”函数。但是我的注入脚本(output.js)似乎没有启动。运行代码后,javascript控制台中出现以下错误:“没有匹配的消息处理程序”。我不确定注入的脚本应该是一个自包含的js文件,还是只是js命令的集合。我也尝试了后者(只是一个简单的消息框),但也

我刚刚开始学习如何在firefox中创建自己的插件。我使用的是webExtensions,尽管我发现很难获得全面的文档(我想是因为它还是一个新的实现?)。代码似乎都工作正常,并且在executeScript调用后完成了一个“onExecuted”函数。但是我的注入脚本(output.js)似乎没有启动。运行代码后,javascript控制台中出现以下错误:“没有匹配的消息处理程序”。我不确定注入的脚本应该是一个自包含的js文件,还是只是js命令的集合。我也尝试了后者(只是一个简单的消息框),但也没有成功

我的代码: manifest.json:

{
    "manifest_version": 2,
    "name": "ExportTabs",
    "version": "0.9",

    "description": "Export/Import Tabs",
    "icons": {
        "48": "icons/export48.png"
    },

    "permissions": [
        "tabs",
        "activeTab",
        "<all_urls>"
    ],

    "applications": {
        "gecko": {
            "id": "938745934875@example.com"
        }
    },

    "browser_action": {
        "default_icon": "icons/export.png",
        "default_popup": "popup/popup.html" 
    }
}
新创建的选项卡的output.html:

<!DOCTYPE html>

<html>
  <head>
    <meta charset="utf-8">
  </head>

  <body>
    <div>testing stuff</div>
    <div id="output"></div>

  </body>

</html>
我应该补充一点,我有noscript插件,所以我用“全局允许脚本”尝试了一下,它仍然给出了相同的错误。 为任何帮助干杯

编辑:我尝试用
code:'alert(“hello”);'替换executeScript方法中的
文件:“popup/output.js”
但它仍然不起作用

从OP发布的答案中移动的信息:
碰撞我在另一个带有ff50.something(beta通道)的盒子上试用了这段代码,注入甚至没有使“onExecuted”。但它不会抛出任何错误。基本上,弹出窗口工作,然后什么也没有发生

个人问题分析 问题“没有匹配的消息处理程序” 在49之前的Firefox版本中,显示消息“没有匹配的消息处理程序”是一个已知的错误。该bug被记录为

问题“
executeScript
未注入脚本” 在49+版本中,由于以下原因,它仍然不起作用:

您只能将代码插入到其URL可以使用 匹配模式:意味着其方案必须是“http”、“https”之一, “文件”、“ftp”。这意味着您不能将代码注入任何 浏览器的内置页面,例如关于:调试、关于:插件或 打开新的空选项卡时打开的页面

因此,您不能使用
tabs.executeScript()
将脚本注入从您自己的扩展加载的内容中。当我将从扩展加载页面替换为从web加载页面时,该示例会起作用:

function save() 
{
    chrome.tabs.create({"url": "https://en.wikipedia.org/wiki/Bacon"}, onCreated);
}
当您希望在从扩展插件加载的页面中执行代码时,可以通过在内容页面中加载脚本文件直接执行JavaScript

如果需要将参数传递给加载内容页内的脚本,可以在打开选项卡的脚本和打开选项卡内的脚本之间发送消息

请参阅上的“与后台脚本通信”一章。虽然文档专门针对清单文件中的“内容脚本”,但有关通信的解释也适用于您的情况

示例代码:

popup.js
中执行函数
保存

function onCreated(newTab) 
{
    // Use setTimeOut to give the loaded page some time to register the message listener
    setTimeout(onCreatedInner, 500);
    function onCreatedInner()
    {   
        console.log("oncreated " +   " " +  newTab.id);
        chrome.runtime.sendMessage(42);
    }
}
output.js

chrome.runtime.onMessage.addListener(notify);

function notify(message) 
{
    window.alert(message);

}
var elem = document.getElementById("buttonSave");
elem.onclick  = save;

问题“弹出窗口中的JavaScript代码未执行” 在您朋友的设置中,您遇到了一个不同的问题:默认情况下,您不允许在Firefox的web扩展的内容页中使用内联脚本。您应该在浏览器控制台中看到错误

内容安全策略:页面设置阻止加载 自身资源

因此,不要使用带有保存按钮的内联“onclick”,而是从JavaScript脚本中动态分配onclick事件。如何更改弹出窗口.html

<button onclick="save" id="buttonSave">Save Tabs</button>
<button >View Tabs</button>

完整的工作示例 以下是按预期工作的完整最小示例代码:

文件
manifest.json

{
    "manifest_version": 2,
    "name": "ExportTabs",
    "version": "0.9",

    "description": "Export/Import Tabs",
    "icons": {
        "48": "icons/export48.png"
    },


    "permissions": [
        "tabs",
        "activeTab",
        "<all_urls>"
    ],

    "applications": {
        "gecko": {
            "id": "938745934875@example.com"
        }
    },

    "browser_action": {
        "default_icon": "icons/export.png",
        "default_popup": "popup/popup.html" 
    }
}
文件
popup.js

// Register onclick-Event for Save Button
var elem = document.getElementById("buttonSave");
elem.onclick  = save;

function save() 
{
     chrome.tabs.create({"url": chrome.extension.getURL("popup/output.html")}, onCreated);
}

function onCreated(newTab) 
{
    // Use setTimeOut to give the loaded page some time to register the message listener
    setTimeout(onCreatedInner, 500);
    function onCreatedInner()
    {   
        chrome.runtime.sendMessage(42);
    }
}
// register message handler
chrome.runtime.onMessage.addListener(notify);

function notify(message) 
{
    // Write message into page 
    var elem = document.getElementById("output");
    elem.innerText  = message;

    // Show alert
    window.alert(message);
}
文件
output.html

<!DOCTYPE html>

<html>
  <head>
    <meta charset="utf-8">
  </head>

  <body>
    <div>
        <button onclick="save" id="buttonSave">Save Tabs</button>
        <button >View Tabs</button>
    </div>

    <script src="popup.js"></script>
  </body>

</html>
<!DOCTYPE html>

<html>
  <head>
    <meta charset="utf-8">
  </head>

  <body>
    <div>testing stuff</div>
    <div id="output"></div>

  </body>
  <script src="output.js"></script>

</html>

谢谢你。没什么问题。FF50甚至不会创建新选项卡,更不用说加载任何内容了。我对popup.js使用了以下命令:
code
function save(){chrome.tabs.create({“url”:“})}另一个问题是,据我所知,您只能在内容脚本和背景脚本之间通信,而不能通过output.html代码加载脚本。但我无法加载内容脚本,因为它只接受您所述的有限匹配模式。My output.html是一个本地文件。有没有一种简单的方法将其托管在某个地方以通过http加载?注意:由于某种原因,它在上面添加了一个不存在的分号。代码是:chrome.tabs.create({“url”:“});编辑:我放弃了。它也加在这里了。忽略培根后面的分号“。它还将其超链接,并删除了h t p等@erv我已更新了答案的更多细节。请更具体地说明您遇到的问题。始终在浏览器控制台中检查错误或警告。@erv如果您有关于某个问题的更多详细信息,请更新该问题,而不是添加注释。在这里,您还完全支持格式化源代码。在评论中,你可以用一个反勾来标记源代码。干杯,九点,现在可以在ff50上使用了。关于内容安全错误,您是对的。我错过了它,因为我只是在控制台上查看javascript错误。
// Register onclick-Event for Save Button
var elem = document.getElementById("buttonSave");
elem.onclick  = save;

function save() 
{
     chrome.tabs.create({"url": chrome.extension.getURL("popup/output.html")}, onCreated);
}

function onCreated(newTab) 
{
    // Use setTimeOut to give the loaded page some time to register the message listener
    setTimeout(onCreatedInner, 500);
    function onCreatedInner()
    {   
        chrome.runtime.sendMessage(42);
    }
}
<!DOCTYPE html>

<html>
  <head>
    <meta charset="utf-8">
  </head>

  <body>
    <div>testing stuff</div>
    <div id="output"></div>

  </body>
  <script src="output.js"></script>

</html>
// register message handler
chrome.runtime.onMessage.addListener(notify);

function notify(message) 
{
    // Write message into page 
    var elem = document.getElementById("output");
    elem.innerText  = message;

    // Show alert
    window.alert(message);
}