Chrome 无法从扩展[重复]中的内容脚本访问全局窗口对象

vwoqyblh  于 2023-01-15  发布在  Go
关注(0)|答案(1)|浏览(307)
    • 此问题在此处已有答案**:

Access variables and functions defined in page context using a content script(6个答案)
Access global js variables from js injected by a chrome extension(1个答案)
2天前关闭。
我创建了一个扩展,可以在twitter上的每条tweet上附加一个按钮,当我点击这个按钮时,我应该执行一个函数window.phantom.solana.connect()。
当我直接在控制台中输入window.phantom.solana.connect()时,它可以工作,但问题是当我尝试从内容脚本触发此函数时,窗口对象的上下文与我在浏览器中使用的上下文不同,并且它不包含phantom.solana...属性
这是我的清单. json

{
"manifest_version": 3,
"name": "react-boilerplate",
"description": "react-boilerplate for chrome extension",
"version": "1.0.0",
"action": {
"default_title": "React Boilerplate"
},
"permissions": \["tabs", "bookmarks", "storage", "identity", "scripting"\],
"icons": {
"16": "icon.png",
"48": "icon.png",
"128": "icon.png"
},
"background": {
"service_worker": "background.js"
},
"content_scripts": \[
{
"matches": \["https://*.twitter.com/*"\],
"js": \["contentScript.js"\]
}
\],
"web_accessible_resources": \[
{
"resources": \["web_accessible_resources.js"\],
"matches": \["\<all_urls\>"\],
"extension_ids": \["bfnaelmomeimhlpmgjnjophhpkkoljpa"\]
}
\]
}

我的内容脚本

import React from "react";
import { createRoot } from "react-dom/client";
import "../assets/tailwind.css";
import ContentScript from "./contentScript";

function init() {
const appContainer = document.createElement("div");
if (!appContainer) {
throw new Error("Cannot find app container");
}

const root = createRoot(appContainer);
const articleList = window.document.querySelectorAll("article");
root.render(\<ContentScript /\>);

for (const element of articleList) {
var btn = document.createElement("button");

    btn.appendChild(document.createTextNode("Bonk tweet"));
    btn.style.color = "white";
    btn.addEventListener("click", function () {
      // this function should catch the window object
      chrome.runtime.sendMessage(
        { greetings: "Bonk tweet" },
        function (response) {
          console.log(response.farewell);
          // don't have access to window.phantom.solana
          console.log(this);
          console.log(window);
        }
      );
    });
    
    element.appendChild(btn);

}
}
setTimeout(init, 4000);

我试着通过事件、web_accessible_resources等各种方式访问它......仍然没有运气。有人知道如何在我的扩展中访问相同的窗口对象吗

tvz2xvvm

tvz2xvvm1#

内容脚本不能访问主机页面的window对象,但它们可以访问主机页面的DOM。因此,您可以通过向主机页面的DOM添加script标记,使其在主机页面的上下文中执行并访问主机window对象来解决此限制。

const scriptTag = document.createElement('script');
scriptTag.setAttribute('type','application/javascript');
scriptTag.innerText = `window.phantom.solana.connect()`;
document.head.appendChild(scriptTag);

此外,您可以在上面的script标记中设置一个消息处理程序,并从内容脚本发送一条消息以执行该处理程序。

但如果页面具有内容安全策略,则此解决方法无效。

相关问题