- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个 Chrome 扩展程序来增加网站的便利性。
我可以访问该页面的 DOM,但我还需要与该页面上的“第一方”JS 进行交互,而我无法通过我的扩展程序进行交互。
我可以在页面中插入任意标签(最值得注意的还有 <script>
标签),但由于转义字符串如
{
html: '<div onclick="doSomething(this, \'someName\')"></div>'
}
真的很痛苦,我想将注入(inject)的代码保持在绝对最低限度。
我尝试将事件监听器注入(inject)页面以从页面获取 JS 变量,但遇到了问题。
似乎如果一个CustomEvent
从扩展程序传递到网站或返回,如果 CustomEvent.detail
在某处包含某些类型的对象(至少是函数和错误),整个 CustomEvent.detail
将被清除,即设置为空。
脚本(extension.js):
(function()
{
var script = document.createElement('script');
script.innerHTML = [
"window.addEventListener('xyz', function(ev)",
" { ",
" console.log('after dispatch:'); ",
" console.log(ev.detail); ",
" }); ",
].join('\n');
document.head.appendChild(script);
// JSON-serializable data
var e = new CustomEvent('xyz', { detail: { x: 42, name: 'Schroedinger' } });
console.log('before dispatch:')
console.log(e.detail);
window.dispatchEvent(e);
// non-JSON-serializable data
var detail = { x: 42, name: 'Schroedinger' };
detail.detail = detail; // Create circular reference
e = new CustomEvent('xyz', { detail: detail });
console.log('before dispatch:')
console.log(e.detail);
window.dispatchEvent(e);
// data with function
e = new CustomEvent('xyz', { detail: { x: 42, name: 'Schroedinger', func: function(){} } });
console.log('before dispatch:');
console.log(e.detail);
window.dispatchEvent(e);
// data with error object
e = new CustomEvent('xyz', { detail: { x: 42, name: 'Schroedinger', err: new Error() } });
console.log('before dispatch:');
console.log(e.detail);
window.dispatchEvent(e);
})();
输出(为便于阅读而分段):
before dispatch:
Object {x: 42, name: "Schroedinger"}
after dispatch:
Object {x: 42, name: "Schroedinger"}
before dispatch:
Object {x: 42, name: "Schroedinger", detail: Object}
after dispatch:
Object {x: 42, name: "Schroedinger", detail: Object}
before dispatch:
Object {x: 42, name: "Schroedinger", func: function (){}}
after dispatch:
null
before dispatch:
Object {x: 42, name: "Schroedinger", err: Error at chrome-extension://...}
after dispatch:
null
我最初认为 JSON 可序列化是问题所在,但循环引用在事件中传递得很好,如果 JSON 序列化它们会中断。
感觉某些对象以相同的方式“污染”了事件细节 non-crossorigin images taint canvases , 除了控制台中没有任何内容。
我无法找到关于此行为的任何文档,并且(正如 Paul S. 建议的那样),在 Chrome permissions list 上似乎没有针对此行为的“特权” .
在 Chrome 40.0.2214.115m、43.0.2357.124m 和 48.0.2547.0-dev 中测试。
最佳答案
我最初认为这是一项安全功能,主要是因为 Firefox 的行为方式。
In ran an equivalent test in Firefox by putting the event listener in a separate file that could be loaded via
mozIJSSubScriptLoader
:test.js:
(function()
{
window.addEventListener('xyz', function(ev)
{
console.log('after dispatch:');
console.log(ev.detail);
});
})();firefox.js:
(function()
{
var mozIJSSubScriptLoader = Components.classes["@mozilla.org/moz/jssubscript-loader;1"].getService(Components.interfaces.mozIJSSubScriptLoader);
window.addEventListener('load', function load(event)
{
window.removeEventListener('load', load);
window.gBrowser.addEventListener('DOMContentLoaded', function(event)
{
mozIJSSubScriptLoader.loadSubScript('chrome://my-extension/content/test.js', window.content, 'UTF-8');
// JSON-serializable data
var e = new CustomEvent('xyz', { detail: { x: 42, name: 'Schroedinger' } });
console.log('before dispatch:')
console.log(e.detail);
window.content.dispatchEvent(e);
// non-JSON-serializable data
e = new CustomEvent('xyz', { detail: { x: 42, name: 'Schroedinger', func: function(){} } });
console.log('before dispatch:');
console.log(e.detail);
window.content.dispatchEvent(e);
});
});
})();Result:
(Note that the error occurs twice.)
So in Firefox it doesn't even matter what
detail
contains - as long as it comes from an extension, the page is not allowed to access it.
Looks like a security feature to me.
我之所以将以上内容放在引号中是因为这在 Chrome 中有些不同!
经过更深入的调查后,看起来虽然扩展和页面共享 DOM 树,但它们存在于两个不同的上下文中。
我不知道这实际上是一项安全功能还是仅仅是一种技术后果,但这当然会导致只能来回传递可克隆对象。
但令我困惑的是,根据the HTML standard, §2.7.5 (structured clone),操作无声无息地失败了。 ,整个操作应该失败并出现错误:
↪ If input is another native object type (e.g. Error, Function)
↪ If input is a host object (e.g. a DOM node)
Throw a DataCloneError exception and abort the overall structured clone algorithm.
我最终使用了一个相当简单(虽然不是很漂亮)的解决方法:
在 Chrome 中,没有等同于 mozIJSSubScriptLoader
的东西, 但您可以附加 <script>
从您的扩展程序中为页面添加标签(在 FF 中不允许这样做)。
连同chrome.extension.getURL
, 可用于运行在页面上下文中使用扩展名打包的 JS 文件:
(function()
{
var script = document.createElement('script');
script.src = chrome.extension.getURL('extension.js');
document.head.appendChild(script);
})();
当然需要那个
"web_accessible_resources": [ "extension.js" ]
设置在manifest.json
,这不是很漂亮,但不应该是一个实际问题。
这样做的缺点当然是来自 extension.js
内部您不再有权访问您的扩展程序有权访问的任何 chrome API,但就我而言,我不需要它。通过 CustomEvent
设置代理不会太难尽管如此,Chrome API 的最大部分只需要并返回可克隆的数据。
关于javascript - 自定义事件细节 "tainted"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28699159/
前言 本文主要介绍了关于MySQL主键为0与主键自排约束的关系,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 开始不设置主键表的设计如下: 如果id的位置有好几个0
我已经阅读了一些关于将消息从一个线程冒泡到所有其他线程以正常退出的正确方法的来源(每个线程都执行它自己的退出例程)。其中,我喜欢全局原子 bool 值的想法,它可以从任何线程进行标记,所有其他线程检查
本文深入探讨Go语言中的流程控制语法,包括基本的 if-else 条件分支、 for 循环、 switch-case 多条件分支,以及与特定数据类型相关的流程控制,如 for-r
我是 MVC 和 XCode 的新手,在将我对 MVC 的概念理解转化为设计和实现具体类时遇到了困难。我希望就如何构建 Controller 和 View 以获得预期的 UI 获得一些建议。这是针对
如果我尝试在 View 中打开 DeatilFragement,我的应用程序崩溃并收到以下错误: Caused by: java.lang.IllegalStateException: Require
我正在尝试构建我的 iOS 应用程序的界面。一遍又一遍地开始新项目我仍然遇到细节 View 控件的问题(见图)。 在这里我得到了截图: 详细 View 显示当用户触摸 UITableView 行时。您
我在与我正在处理的项目的类(class)中遇到问题。该类是一个接受标签和值的 GUI 组件。这里的想法是,用户可以指定一个标签,然后从任何地方链接一个值(更具体地说,该值的 ToString 方法),
嗯.. 我在我的应用程序中设置了表格 View - 详细 View 。 主视图使用常规代码将数据传递给详细 View - (void)tableView:(UITableView *)tableVie
我有 celery 任务,队列中有 100 个输入数据,需要使用 5 个 worker 来执行。 如何获取哪个工作人员正在执行哪个输入? 每个 worker 执行了多少输入及其状态? 如果任何任务失败
我有一个 .net github 项目,它基本上是一个 Web API 的包装器。在测试项目中,我使用 API key 调用 API。我需要将此 key 保密,如何在 Visual Studio 项目
我遇到一个问题,从 Ag-Grid 导出网格只会导出主网格的详细信息,而不会导出子网格。这是一个显示问题的 plunkr: https://next.plnkr.co/edit/jVcvWDJ1NKP
我在详细 View 中有一个不会消失的额外空间。该 View 来自 NavigationLink,但我已经尝试过使用或不使用 NavigationView。我试图包装它用 NavigationView
几天来,我一直在关注猫效应和 IO。我觉得我对这种效果有一些误解,或者只是我错过了它的重点。 首先——如果IO可以替代Scala的Future,我们如何创建异步IO任务?使用 IO.shift ?使用
如何将标高添加到主视图/详细 View 的详细信息 Pane 中,以在其下方提供阴影,同时定位为部分覆盖工具栏(如下面的底部图片)?我尝试使用 android:elevation="4dp" 但这对我
我试图在我的 UISplitViewController 的细节 View 上设置一个阴影,我希望在 iOS 6 中的主 View 上可见。 在我的细节 View Controller 中: sel
我正在阅读 std::basic_string::reserve(size_type res_arg=0) 上的标准.它是这样说的: void reserve(size_type res_arg=0)
Boost 文档说 Starting with Boost release 1.53, shared_ptr can be used to hold a pointer to a dynamicall
我用 OpenGL 编写了一个简单的 24 位位图加载器。我打开一个位图文件并读取它的像素,然后从中创建一个 RGB 像素数据数组,然后将其传递给 glDrawPixels()。 问题:我需要使图像的
for x in ...循环 就是把每个元素代入变量x,然后执行缩进块的语句。 range()函数,可以生成一个整数序列,再通过list()函数可以转换为list。 比如我们想计算1-10的整数
场景 我有一个 DevExpress XtraGrid。 显示的数据采用主/详细信息格式,点击行开头的“+”可展开该主行的详细信息。 我通过将网格数据源绑定(bind)到包含自己的字典属性(以保存详细
我是一名优秀的程序员,十分优秀!