如何仅允许两个域的扩展?

时间:2013-04-14 08:47:57

标签: google-chrome-extension

我写了一个谷歌浏览器扩展程序。它没关系,现在可以使用,但我希望扩展只能在两个域上使用,因为它只为这两个网站编写,对其他网站没用。只有context menu。目前它甚至没有弹出窗口或右上角的操作按钮(默认隐藏)。怎么能实现这个?

我当前的 manifest.json

{
  "manifest_version": 2,

"background": {
        "scripts": [ "scripts/jquery.min.js", "scripts/background.js" ]
    },
  "name": "Export Entries",
  "description": "some descriptions here",
  "version": "1.0",

"icons": {
    "16": "images/logo.png",
    "48": "images/logo.png",
    "128": "images/logo.png"
  },
  "permissions": [ "downloads", "tabs", "contextMenus", "http://my-own-domain-accessed-via-ajax-for-creating-some-files-there.com/*" ],
  "content_scripts": [ 
      {
        "matches": [ "*://allowed-domain1.com/*", "*://allowed-domain2.com/*" ],
        "css" : [ "styles/style.css" ],
        "js" : [ "scripts/jquery.min.js", "scripts/popup.js", "scripts/background.js" ],
        "run_at": "document_end"
      } 
  ],
  "web_accessible_resources": [
    "images/logo.png"
  ]
}

据我所知,扩展无法绝对禁用,其进程将再次在后台运行。但这不是问题。我只是想不在其他网站上显示上下文菜单项。

background.js 创建上下文菜单项并处理其点击事件:

function exportEntries(info, tab) { 
    if(info['linkUrl'].indexOf('domain1.com/user/') > -1) {
        var user = info['linkUrl'].substr('27'); 
    } else {
        var user = null; // export all entries from this topic
    }

    $.ajax({
        url: 'http://my-own-domain-which-creates-the-file.eu/exportEntries/create.php',
        method: 'POST',
        data: { topic: tab.url, user: user }
    }).done(function ( url ) {
        forceDownload(url);
    });
}

function forceDownload(url) {
    var filename = url.replace(/^.*\/|\.[^.]*$/g, '');

    chrome.downloads.download(
        {url: url, saveAs: true}, // options array
        function(id) {
            // callback function
        }
    );
};

document.addEventListener('DOMContentLoaded', function () {
    chrome.contextMenus.create({
        'title': 'Export Entries',
        'contexts': ['link'],
        'onclick': function(info, tab) {
            exportEntries(info, tab);
        }
    });
});

create.php 位于我自己的域中。它只获取当前页面的URL和用户的昵称。然后导出给定用户的给定主题(即页面URL)中的所有条目,创建文件(.txt,.pdf等)并发送回url以下载文件。

popup.html popup.js css文件以及其他内容目前尚未使用。

2 个答案:

答案 0 :(得分:3)

删除所有内容脚本,它们没用,因为chrome.contextMenus API只能在后台页面上使用。

要将上下文菜单条目限制为某些域,请在使用chrome.contextMenus.create创建上下文菜单时指定documentUrlPatterns键:

chrome.contextMenus.create({
    'title': 'Export Entries',
    'contexts': ['link'],
    'onclick': function(info, tab) {
        exportEntries(info, tab);
    },
    'documentUrlPatterns': [
        '*://allowed-domain1.com/*',
        '*://allowed-domain2.com/*'
    ]
});

答案 1 :(得分:2)

根据content scripts documentation

“如果您只想有时注入代码,请改用权限字段,如Programmatic injection中所述。”

所以而不是

"content_scripts": [
  {
     "matches": [ "http://allowed-domain.com" ]
  }
],

使用

permissions: [
  "tabs", "http://allowed-domain.com"
],