Firefox扩展是发送JavaScript数组作为一个对象,而不是(Firefox extensi

2019-09-23 12:32发布

我有问题路过的JavaScript阵列的插件,这是我正在写在附加生成器 。

为了沟通我使用的事件,并发送一个数组的事件,但加载项(内容脚本)获取的对象,而不是一个数组。

这是事件:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xml:lang="en" xmlns="http://www.w3.org/1999/xhtml"> 
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script src="http://code.jquery.com/jquery-latest.min.js" type="text/javascript"></script>
<script type="application/x-javascript">

$(function() {
    $(window).bind('Runner-PageEvent', function(event) {
        console.log('PAGE: Reakcja na Runner-PageEvent na stronie');
    });

    $(window).bind('RunnerResult', function(event) {
        console.log('PAGE: Result is ' + event.originalEvent.detail.Result);

//// PROBLEM!!!
        console.log('PAGE: Should be array: ' + event.originalEvent.detail.array); // firebug shows object

        });

    $(window).bind('Runner-DetectCallback', function(event) {
        console.log('PAGE: Reakcja na Runner-DetectCallback na stronie');
        $('#browser-detection').text('Extension detected').css('background-color', 'green').css('color', 'white');
    });

    var event = new CustomEvent("Runner-Detect", {});
    window.dispatchEvent(event);
    console.log('PAGE: Runner-Detect sent');
});

function CallExtension() {
    var event = new CustomEvent("Runner-PageEvent", { detail : {
            a: "messageA",
            b: "messageB",
            c: "messageC",
            d: "messageD",
            arrayA: ["a", "b", "c", "d"],
            arrayB: [0, "info", "info2", 3]
        }});
    window.dispatchEvent(event);
    console.log('PAGE: CALL EXTENSION clicked');
}

</script> 
</head>
<body>
<div id="browser-detection" style="background-color: red">No extension</div>
<br/>
Run extension: <button onclick="CallExtension()">Run!</button>
</body>
</html>

萤火显示我的事件与一个属性对象detail.tab与四个项目阵列。

内容脚本接收对象e ,其中e.detail.tab是一个对象(但应该是阵列)。

window.addEventListener(
    'eventname', 
    function(e) { 
        // console.log(e.detail.tab.length); -> produce an error on console (Ctrl+Shift+J)
        // console.log(e.detail.tab[0]); -> as above
        for(var x in e.detail.tab){
            console.log(x);
            console.log(e.detail.tab[x]);
        }            
        self.port.emit('SendToExtension', e.detail);
    }
);


我不知道是否有与附加生成器或我做错了什么问题?
请帮忙!

Answer 1:

似乎有在如何的一个错误CustomEvent()发送进出沙箱(的信息XPCNativeWrapper )。 它是不正确序列化CustomEventInit.detail在某些情况下值,第一个这样的实例后,未能通过detail都值-这表明某种内存/国家腐败的正在发生。

  1. 发生下列情况时,请参阅本测试页: jsbin.com/ajegib/1

  2. 安装,或者在“测试”模式下运行,这Firefox插件: 自定义事件data_中跨沙箱

  3. 请注意这两个测试网页,以及扩展的内容脚本有这样的代码:

     window.addEventListener ("EventWithArrayData", function (zEvent) { console.log ( "Event detail: ", zEvent.detail, Array.isArray (zEvent.detail) ); } ); var zEvent = new CustomEvent ("EventWithArrayData", {"detail": [5,6,7] } ); window.dispatchEvent (zEvent) 
  4. 打开这两个萤火虫的控制台,和Firefox的错误控制台(Ctrl键 移位 J),来观察结果与对数组值的自定义事件detail被发送。 (您可以按普通阵列数据按钮,送他们。)


应该发生什么:

无论是网页和扩展应该看到的数据,从两个事件,一个数组。

  1. Firebug控制台显示:

     **The Normal button was pressed.** In web page (Normal) from page: [1, 2, 3] true In web page (Normal) to page: [5, 6, 7] true 
  2. FF错误控制台显示:

     info: In Content Script (Normal) from page: 1,2,3 true info: In Content Script (Normal) to page: 5,6,7 true 


什么发生:

  1. 第一个事件

    1. Firebug控制台显示:

       **The Normal button was pressed.** In web page (Normal) from page: [1, 2, 3] true In web page (Normal) to page: {0: 5, 1: 6, 2: 7} false 
    2. FF错误控制台显示:

       info: In Content Script (Normal) from page: [object Object] false info: In Content Script (Normal) to page: 5,6,7 true 
  2. 所有后续事件

    1. Firebug控制台显示:

       **The Normal button was pressed.** In web page (Normal) from page: [1, 2, 3] true In web page (Normal) to page: null false 
    2. FF错误控制台显示:

       info: In Content Script (Normal) from page: [object Object] false info: In Content Script (Normal) to page: null false 

注意:

  1. 在所有情况下,该网页看到通过自己的事件正确发送阵列数据。 它看到的阵列。
  2. 但是,延伸部看到的阵列状物体来代替。
  3. 阵列数据,从扩展发送,正确地出现在第一道次的延伸部,但为空的所有后续尝试。
  4. 阵列数据,从扩展发送,显示为对象的页面,然后没有( null )!


解决方法:

无论在自定义事件文档和DOM的标准状态eventInitDict.detail可以有任意类型。 但对于整个附加沙箱发送的事件,这显然并非如此。
目前似乎没有任何被火狐漏洞这一点。 也许我们应该打开一个。

无论如何,这似乎工作的解决方法是JSON编码我们与发送数据CustomEvent()

发送像这样:

var detailVal   = JSON.stringify ( [1, 2, 3] );

var zEvent = new CustomEvent ("EventWithJSON_Data",
    {"detail": detailVal }
);
window.dispatchEvent (zEvent)

收到像这样:

window.addEventListener ("EventWithJSON_Data", function (zEvent) {
    var datArray    = JSON.parse (zEvent.detail);
    console.log (
        "JSON data: ", datArray, Array.isArray (datArray)
    );
} );


您可以通过按下JSON编码数组数据按钮测试页+延长工作看到这一点。 (一定要刷新页面首先清除上面讨论的腐败。)



文章来源: Firefox extension is sending Javascript Array as an Object instead