Wenn Sie die Seite sein, völlig unsichtbar wollen, glaube ich, dass die einzige Option, um es in einen iframe auf dem Hintergrund Seite zu laden ist. Sie können dann mit Inhaltsskripten auf die Seite im Iframe zugreifen, genau so wie Sie auf eine normale sichtbare Seite zugreifen würden.
Da viele Websites die Einbettung mithilfe des Headers X-Frame-Options
begrenzen, müssen Sie wahrscheinlich die webRequest-API verwenden, um diesen Header vor dem Laden der Seite in einen Iframe zu entfernen. Einige Seiten verwenden auch andere Techniken, um eine Einbettung zu verhindern, die dies weiter verkomplizieren könnte.
Beispielcode:
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);
Paar von Noten:
- Die Entfernung von
X-Frame-Options
Header ist nicht auf die Hintergrundseite hier beschränkt. Es würde ermöglichen, die relevante Seite in Iframes auf jeder anderen Seite einzubetten. Leider scheint Chrome den ALLOW-FROM uri
Wert nicht zu unterstützen, der verwendet werden könnte, um die Einbettung auf Ihre Erweiterung zu beschränken.
- Das Inhaltsskript wird hier in alle Seiten eingefügt. Sie können es programmatisch nur auf den iframe auf der Hintergrundseite injizieren, aber das wird ein bisschen komplizierter.
- Ich habe
www.google.fr
als Beispiel verwendet, weil es X-Frame-Options
verwendet, aber keine anderen Techniken verwendet, um die Einbettung zu verhindern. Ich habe die französische Domain verwendet, da google.com
automatisch zu lokalen Domains auf Länderebene umleitet.
Genau das habe ich gesucht. In meinem Fall muss ich überraschenderweise nicht einmal den X-Frame-Options-Header entfernen. – Pete