如果您希望頁面完全不可見,我相信唯一的選擇是將其加載到背景頁面的iframe中。然後,您可以使用內容腳本訪問iframe中的頁面,就像訪問任何正常的可見頁面一樣。
由於許多網站使用X-Frame-Options
標頭限制嵌入,因此在將頁面加載到iframe之前,您可能必須使用webRequest API刪除該標頭。有些頁面還使用其他技術來防止嵌入,這可能會使這一過程複雜化。
示例代碼:
的manifest.json
{
"manifest_version": 2,
"name": "Hidden page in background",
"description": "Interact with a hidden page in background",
"version": "1.0",
"background": {
"page": "background.html",
"persistent": true
},
"content_scripts": [
{
"matches": ["*://*.google.fr/*"],
"js": ["contentscript.js"],
"all_frames": true
}
],
"permissions": ["*://*.google.fr/*", "webRequest", "webRequestBlocking"]
}
background.html
<!DOCTYPE html>
<html>
<head>
<script src="background.js"></script>
</head>
<body>
<iframe id="iframe1" width="1000 px" height="600 px" src="http://www.google.fr"></iframe>
</body>
</html>
個background.js
// This is to remove X-Frame-Options header, if present
chrome.webRequest.onHeadersReceived.addListener(
function(info) {
var headers = info.responseHeaders;
var index = headers.findIndex(x=>x.name.toLowerCase() == "x-frame-options");
if (index !=-1) {
headers.splice(index, 1);
}
return {responseHeaders: headers};
},
{
urls: ['*://*.google.fr/*'], //
types: ['sub_frame']
},
['blocking', 'responseHeaders']
);
content_script.js
var elementToInsert = document.createElement("h1");
elementToInsert.textContent = "This text comes from my content script.";
document.body.insertBefore(elementToInsert, document.body.firstChild);
夫婦的注意事項:
- 去除的
X-Frame-Options
標題不限於此處的背景頁面。這將允許將相關頁面嵌入到任何其他頁面上的iframe中。不幸的是,Chrome似乎不支持ALLOW-FROM uri
值,該值只能用於限制您的擴展程序的嵌入。
- 內容腳本正在被注入到所有頁面。您可以通過編程方式將其注入到背景頁面上的iframe,但這會變得更加複雜。
- 我以
www.google.fr
爲例,因爲它使用X-Frame-Options
,但不使用任何其他技術來防止嵌入。我使用了法國域名,因爲google.com
傾向於自動重定向到本地國家/地區級域名。
這正是我所期待的。在我的情況下,我意外地甚至不需要刪除X-Frame-Options標頭。 – Pete