授予 Chrome 扩展程序对 iframe 内容的访问权限
Give Chrome extension access to iframe contents
我制作了一个Chrome扩展程序,该扩展程序将我的"新标签页"加载到我的YouTube订阅页面的<iframe>
(我解决了X-frame-options
问题),并希望隔离文档的特定元素,确切地说#content
(即订阅提要)。无论是减去所有:not(#content)
的东西,还是#content
切下来,把它放到另一个<div>
都是可行的。这是我的代码:
背景.html
<html>
<head>
<script type="text/javascript" src="jquery-2.2.0.min.js"></script>
<script type="text/javascript" src="script.js"></script>
<script type="text/javascript" src="window.js"></script>
</head>
<body>
<iframe id="left" name="left"></iframe>
<div id="canvas"></div>
</body>
</html>
窗口.js
$(document).ready(function(){
var $left = $('#left');
$left.on('load', function() {
$(this).contents().find('#content').clone().appendTo('#canvas');
});
$left.attr('src', 'https://www.youtube.com/feed/subscriptions');
});
脚本.js
chrome.webRequest.onHeadersReceived.addListener(
function(info) {
var headers = info.responseHeaders;
for (var i = headers.length - 1; i >= 0; --i) {
var header = headers[i].name.toLowerCase();
if (header == 'x-frame-options' || header == 'frame-options') {
headers.splice(i, 1); // Remove header
}
}
return {
responseHeaders: headers
};
}, {
urls: ['*://*/*'], // Pattern to match all http(s) pages
types: ['sub_frame']
}, ['blocking', 'responseHeaders']
);
Manifest.json
{
"manifest_version": 2,
"version": "1.0",
"background": "background.html",
"chrome_url_overrides" : {
"newtab": "background.html"
},
"permissions": [
"background",
"contextMenus",
"webRequest",
"webRequestBlocking",
"tabs",
"<all_urls>"
]
}
就像现在一样,YouTube加载,但我无法在<iframe>
中获取文档,因为它记录了以下错误:
Uncaught SecurityError: Failed to read the 'contentDocument' property from
'HTMLIFrameElement': Blocked a frame with origin "chrome-extension://ID" from
accessing a frame with origin "https://www.youtube.com". The frame requesting
access has a protocol of "chrome-extension", the frame being accessed has a
protocol of "https". Protocols must match.
我正在尝试隔离该div#content
以便于从我的新标签页导航。我见过建议在manifest.json
文件中使用 "all_frames":true
的解决方案,但这似乎并不能解决它。有什么想法吗?谢谢!
从这里的描述和您最近提出的 chrome 扩展相关问题来看,我想建议您从官方指南中了解更多信息,因为您似乎对事件页面和内容脚本感到困惑(您应该知道all_frames仅适用于内容脚本)。
看看同源政策,你应该知道Chrome扩展程序不允许您访问内容iframe的文档。
由于您的目的是从 youtube 中提取 #content 部分,然后将其附加到新标签页中的画布中,为什么不呢
- 只需向YouTube发送Ajax请求
- 解析返回的 HTML 响应并提取 #content 部分
- 然后将其附加到画布
代码如下所示:
Manifest.json
{
"name": "Your extension name",
"manifest_version": 2,
"version": "1.0",
"chrome_url_overrides": {
"newtab": "newtab.html"
},
"permissions": [
"https://www.youtube.com/feed/subscriptions/*"
]
}
新标签.html
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<div id="canvas"></div>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="script.js"></script>
</body>
</html>
脚本.js
$.post("https://www.youtube.com/feed/subscriptions", function(html) {
$(html).find("#content").appendTo('#canvas');
});
请注意,youtube页面中的原始图片src看起来像src="//..."
,您应该在Chrome扩展程序//
之前添加正确的域。而且YouTube有很多脚本要加载,你还需要处理这部分逻辑。
最后并非最不重要的一点是,我认为最好的方法是从 youtube 中找到一些公共的 3rd 方 api,我没有使用它,但似乎 Youtube |Google Developer 可能会有所帮助。
- 访问布局信息是否也会导致浏览器重排
- Javascript,访问一个主要对象模块模式中的每个对象
- 如何访问声音管理器2创建的声音对象
- 在Twitter上用ie9中的空白src访问iframe的contentWindow
- JavaScript Pub/Sub属性访问问题
- 从JavaScript访问struts操作中的属性
- 是否可以从父类访问子类的属性
- 如何访问fastOpt.js
- 访问JSON对象内部的数组元素
- 从模块内部访问Express装载路径
- 难以访问的JS环境中的语法错误
- 如何从对象的原型方法访问JavaScript对象属性
- 访问json数组中的对象
- 通过javascript/html访问twitter共享iframe
- 如何访问访问过的链接历史记录
- 你有权访问iframe加载外部网站的内容吗
- 使用postmessage进行跨域iframe访问-访问被拒绝
- 流星与流量路由器:我有权访问流星.用户从流量路由器触发
- 在实例方法中获取对实例属性的访问权
- 获得对本地计算机信息的访问权