Chrome扩展:在新标签页上打开新标签页

4

我创建了一个Chrome扩展程序,作为它的一部分操作,会打开一个指定URL的新选项卡。

chrome.runtime.onMessage.addListener(
  function(request, sender, sendResponse) {
    if( request.message === "open_new_tab" ) {
      chrome.tabs.create({"url": request.url});
    }
  }
);

完整代码可在GitHub上找到。

这段代码可以在包含网页的标签页上正常运行,但是我无法让它在空白标签页上运行,例如:chrome://apps/。为了澄清,如果我打开一个标签页并且它位于stackoverflow.com上,然后当我点击我的扩展按钮时,它会打开一个新的标签页来加载生成的URL。当我处于新标签页或URL以chrome://开头的标签页时,该扩展程序将无法工作。

我需要包含哪些权限才能允许扩展在任何标签页中打开?包括新标签页和任何chrome://标签页?

Manifest.json:

{
  "manifest_version": 2,

  "name": "MyMiniCity Checker",
    "short_name": "MyMiniCity Checker",
  "description": "Checks what your city needs most and redirects the browser accordingly.",
  "version": "0.2",
    "author":"Richard Parnaby-King",
    "homepage_url": "https://github.com/richard-parnaby-king/MyMiniCity-Checker/",
    "icons": {
      "128": "icon-big.png"
   },

    "options_page": "options/options.html",

  "browser_action": {
    "default_icon": "icon.png"
  },
    "permissions": ["tabs","storage","http://*.myminicity.com/","http://*/*", "https://*/*"],
    "background": {
    "scripts": ["background.js"],
    "persistent": false
    },
    "content_scripts": [ {
    "matches": [ "http://*/*", "https://*/*"],
    "js": [ "jquery-1.11.3.min.js" ]
  }]
}

Background.js:

//When user clicks on button, run script
chrome.browserAction.onClicked.addListener(function(tab) {
    chrome.tabs.executeScript(null, { file: "jquery-1.11.3.min.js" }, function() {
    chrome.tabs.executeScript(null, { file: "contentscript.js" });
    });
});

chrome.runtime.onMessage.addListener(
  function(request, sender, sendResponse) {
    if( request.message === "open_new_tab" ) {
      chrome.tabs.create({"url": request.url});
    }
  }
);

似乎background.js文件没有被执行。我怀疑这是权限问题。我需要哪些权限才能在每个选项卡中运行此扩展程序?


如果我正在浏览已加载stackoverflow.com的选项卡,点击我的扩展按钮将执行代码并打开一个由扩展生成的新选项卡。当我在一个新选项卡上或以“chrome://”开头的选项卡上时,单击扩展按钮似乎无法工作。 - Richard Parnaby-King
那么你没有展示实际上不起作用的代码。这一部分是完好无损的 - 它没有被调用。为了帮助,我需要知道你的其余代码是做什么的。 - Xan
我已经在我的清单和后台文件中包含了代码。我怀疑这是一个权限问题。 - Richard Parnaby-King
@RichardParnaby-King 我又错过了显而易见的事情。你的意思是它不能从内容脚本中触发消息吗?... 它确实可以 这个内容脚本通过后台脚本传递消息来启动我的应用程序... 来自新标签页...(我最近为 Opera 博客上的讨论制作的一些示例视频) - Wolf War
@WolfWar 我已经将所有的内容脚本代码迁移到了 background.js 文件中。由于我没有访问/操作 DOM,所以代码不需要在那里。我不知道为什么警报之前没有触发,但现在它可以了,扩展程序现在按预期工作 :) - Richard Parnaby-King
显示剩余4条评论
2个回答

8

嗯,这条信息应该来自您试图注入到当前标签页的内容脚本。

您可以请求的最广泛的权限"<all_urls>",但仍有一些URL被排除在外。

  1. 通常只能访问http:https:file:ftp:协议。

  2. file:协议需要用户在chrome://extensions/中手动批准访问:

<code>file:</code> access

  1. 基于安全原因,Chrome网上应用店的URL被特别列入黑名单。没有覆盖方式。

  2. chrome:// URL(也称为WebUI)基于安全原因被排除。在标志中有一个手动覆盖:chrome://flags/#extensions-on-chrome-urls,但不可能始终存在。

  3. 上述情况有一个例外,如果您声明了确切的权限,则可以访问chrome://favicon/ URL。

总之,即使您拥有最广泛的权限,也无法确定您是否具有访问权。在executeScript的回调中检查chrome.runtime.lastError并优雅地失败。


chrome-extension页面是否与chrome页面被同等对待?即,激活chrome://flags/#extensions-on-chrome-urls是否也适用于修改扩展弹出页面? - undefined

5

因为我希望这个代码可以在每个页面上运行,所以它不能被放在内容脚本中。我把所有的代码都移到了后台脚本中:

chrome.browserAction.onClicked.addListener(function(tab) {
        //... 
        chrome.tabs.create({"url": newTabUrl});
        //...
});

当我点击按钮时,以上代码将被调用,使用封装的jquery脚本。

如果你立即导航离开,注入某些东西有什么意义呢?更重要的是 - 如果这应该在每个页面上工作,那么你在内容脚本中有什么样的代码? - Xan
我在内容脚本中没有任何代码。它已被删除。插件的目的是当用户单击按钮执行ajax调用以获取xml响应时,处理响应并根据结果打开另一个页面的选项卡。这些都不需要访问选项卡内容。最初,用户单击按钮,执行内容脚本完成ajax和处理,然后发送消息回到背景脚本,该消息是要打开的新选项卡网址。现在所有内容都包含在背景脚本中。 - Richard Parnaby-King
那么为什么还要尝试注入jQuery呢? - Xan
jQuery已包含在插件中,并作为清单的一部分进行加载。chrome.tabs.executeScript部分在后台运行jQuery,以便其他代码可以工作。我会从答案中删除该部分,因为它并不是解决方案的一部分... - Richard Parnaby-King
"chrome.tabs.executeScript 部分是在后台运行 jQuery",不是这样的!使用 null 调用它会尝试将其注入到当前标签页中,而不是后台。这就是我正在努力修复的问题,即我无意中瞥见的一个(概念上的)错误。 - Xan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接