Javascript greasemonkey为简单脚本抛出SecurityError

Javascript greasemonkey为简单脚本抛出SecurityError,javascript,firefox,greasemonkey,Javascript,Firefox,Greasemonkey,我是greasemonkey的新手,我试图了解greasemonkey与嵌入式web控制台的不同之处。在web控制台上完美运行的简单脚本在greasemonkey上不起作用,我不知道为什么 环境 Arch Linux上的Firefox 74.0 Greasemonkey 4.9 网络控制台 以下是我使用的测试脚本: (function() { "use strict"; const w = window.open('https://www.google.com/', 'w'

我是greasemonkey的新手,我试图了解greasemonkey与嵌入式web控制台的不同之处。在web控制台上完美运行的简单脚本在greasemonkey上不起作用,我不知道为什么

环境
  • Arch Linux上的Firefox 74.0

  • Greasemonkey 4.9

网络控制台 以下是我使用的测试脚本:

(function() {
    "use strict";

    const w = window.open('https://www.google.com/', 'w');

    console.log("Hello");

    w.onload = () => {
        console.log("World");
    };

})();
当我访问(谷歌美国首页)时,将脚本复制并粘贴到web控制台,然后执行它

  • 将打开一个新窗口
    w
    加载

  • 将打印字符串
    Hello

  • 将打印字符串
    World

  • 一切如期而至

    油嘴滑舌 关于greasemonkey,我使用下面的脚本。标题部分是唯一的区别

    // ==UserScript==
    // @name     test
    // @namespace n
    // @match https://www.google.com/webhp?gl=us&hl=en&gws_rd=cr&pws=0
    // ==/UserScript==
    
    (function() {
        "use strict";
    
        const w = window.open('https://www.google.com/', 'w');
    
        console.log("Hello");
    
        w.onload = () => {
            console.log("World");
        };
    
    })();
    
    当我访问(谷歌美国首页)时

  • 将打开一个新窗口
    w
    加载

  • 将打印字符串
    Hello

  • SecurityError
    被抛出

    [Greasemonkey脚本n/test]中的脚本错误:
    SecurityError:访问跨源对象测试的属性“onload”的权限被拒绝:42:19
    用户脚本:n/测试:42

  • 当我使用
    unsafeWindow
    而不是
    window

  • 将打开一个新窗口
    w
    加载

  • 将打印字符串
    Hello

  • 没有别的事情发生。(无错误,无
    World

  • 问题: 我应该如何修改脚本以便可以在greasemonkey上执行


    更新

    根据,该脚本在Chrome下的Tampermonkey或Violentmonkey上运行


    我还没有确认这一点,但已经确认该脚本在
    Tampermonkey 4.10.6105
    Violentmonkey 2.12.7
    下的Firefox

    Web控制台是浏览器范围的一部分,而GreaseMonkey脚本被注入页面内容,其范围仅限于该页面

    您可以使用GM从页面内容打开一个新的选项卡/窗口,但该窗口/选项卡将有其自己的页面内容范围,该范围与第一个窗口不同。因此,您无法从不同选项卡的页面内容访问属于其他选项卡/窗口的属性

    这种分离适用于所有内容脚本,而不仅仅适用于GM。否则,如果一个选项卡/页面中的JS可以访问其他选项卡上的数据,就会产生巨大的安全风险

    更新:

    正如wOxxOm所指出的,CSP和跨原产地政策防止了这种情况

    在您的示例中,在Firefox中,第一个问题是Firefox将从内容脚本中“阻止弹出窗口”

    允许弹出后,在上测试Firefox专用API仍会导致错误:

    SecurityError:访问上的属性“onload”的权限被拒绝 交叉原点对象

    在这种情况下,我认为这是由于为了安全起见对用户脚本进行了沙箱处理


    GM/TM/VM不使用userScripts API,而是使用其他方式注入用户脚本,这会导致不同的结果。

    此脚本在Chrome中使用Tampermonkey或Violentmonkey(页面和内容注入模式),尽管erosman声称,但没有任何东西会阻止它工作。web中的安全性基于同源原则,因此Greasemonkey或Firefox抛出错误的事实意味着这只是一个错误或userscript API实现的固有缺陷。@wOxxOm正如您所建议的,在Firefox上使用
    Tampermonkey 4.10.6105
    ,问题已经完全解决。但Tampermonkey不是OSS…好吧,那就用Violentmonkey吧。@wOxxOm我不知道它们。谢谢你的建议。