javascript - Chrome 扩展 : create tab then inject content script into it

标签 javascript google-chrome-extension

收到来自内容脚本的消息后,我想创建一个新选项卡并填充它动态打开的页面(现在我只是想将新创建的页面变成红色)。

事件页面.js:

// ... code that injects another content script, works fine

// Problem code...
chrome.runtime.onMessage.addListener(
  function(request, sender, sendResponse) 
  {
    chrome.tabs.create({url: chrome.extension.getURL("blankpage.html")}, 
                       turnTabRed);      
  });

function turnTabRed(tab)
{
  chrome.tabs.executeScript(
    tab.id,
    {code: 'document.body.style.backgroundColor="red"'}
  );
}

这成功地创建了一个新选项卡并加载了 blankpage.html(这只是一个带有一些文本的 HTML 页面),但未能将背景颜色涂成红色。在各个地方插入 console.log() 语句并在调试器中四处游荡后,我确定正在调用 turnTabRedtab.id 确实是新创建的标签的 ID,如果我从控制台调用 document.body.style.backgroundColor="red",新标签的背景会变成红色。我注意到如果我添加

(*)

chrome.tabs.query(
    {}, function (tabArr) { for (var i = 0; tabArr[i]; i++)    
                              console.log(tabArr[i].title); });

turnTabRed 的正文中,新选项卡的标题不会打印到控制台中,这表明脚本被注入(inject)得太早,所以我尝试用 延迟注入(inject)setTimeout 当失败时,我尝试监听 status-complete 事件:

function turnTabRed(tab)
{
  chrome.tabs.onUpdated.addListener(
    function(tabUpdatedId, changeInfo, tabUpdated)
    {
      if (tabUpdatedId == tab.id && changeInfo.status && 
                                    changeInfo.status == 'complete')
        chrome.tabs.executeScript(
          tabUpdatedId,
          {code: 'document.body.style.backgroundColor="red"'});
    });
}

同样失败了。在使用 setTimeout 等待后调用 (*) 确实打印了新选项卡的标题以及所有其他选项卡。

怎么了?如何创建新选项卡、加载 HTML 页面然后将其背景变为红色?

最佳答案

问题是您无法将脚本注入(inject) chrome-extension://* 页面(您的 blankpage.html 是)。

比如改

{url: chrome.extension.getURL("blankpage.html")} 

{url: "http://www.google.com"}

在您的原始代码块中,它会将背景更改为红色。据我所知,没有办法绕过注入(inject) chrome-extension://* 页面(我认为这是一个巨大的安全问题)。我不确定您的扩展程序试图做什么,但是注入(inject)“实时”页面应该可以工作...也许您可以创建一些 API 以在 chrome.runtime 时在您的服务器上生成一个新的“空白页” .onMessage.addListener 触发了吗?

编辑

所以你不能注入(inject)东西到 chrome-extension://* 页面,但是你可以向它们传递消息并在其中使用 chrome API 的一些子集如下所述的新页面。因此,使用消息传递,您将能够完全按照您的意愿进行操作(修改新页面),尽管是以一种迂回的方式。这是一个对我有用的非常简单的概念证明:

事件页面.js:

chrome.runtime.onMessage.addListener(
  function(request, sender, sendResponse) 
  {
    chrome.tabs.create({url: chrome.extension.getURL("blankpage.html")}, turnTabRed);      
  });

function turnTabRed(tab)
{
  chrome.tabs.sendMessage(tab.id, {"action" : "setBackground"});
}

空白页面.js:

chrome.runtime.onMessage.addListener(
  function(request, sender, sendResponse) {
    if(request.action == "setBackground") document.body.style.background = "red";
  });

关于javascript - Chrome 扩展 : create tab then inject content script into it,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21009637/

相关文章:

javascript - Chrome 扩展中的 Vue.js

google-chrome - 在谷歌浏览器扩展程序中存储首选项

javascript - 有条件地填充 d3 中两条线之间的区域

javascript - 按字母顺序排序下拉列表,然后按特定前缀排序

Javascript 的 "new Date()"返回 '2011-02-1' 和 '2011-02-01' 的不同日期

javascript - 为什么 Chrome 扩展程序不返回 Google Search API 结果?

javascript - 无法从函数返回值

javascript - 使用 setTimeout 在自身内部调用函数

javascript - Chrome 扩展程序 - 页面加载时的自定义警告框

javascript - 如何在 popup.html 中以编程方式隐藏扩展程序的浏览器操作图标?