0

我写了一个谷歌浏览器扩展。没关系,现在可以使用,但我希望扩展只在两个域上可用,因为它只为这两个网站编写,对其他人无用。有一个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.htmlpopup.jscss 文件和其他东西暂时不用。

4

2 回答 2

4

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

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

chrome.contextMenus.create({
    'title': 'Export Entries',
    'contexts': ['link'],
    'onclick': function(info, tab) {
        exportEntries(info, tab);
    },
    'documentUrlPatterns': [
        '*://allowed-domain1.com/*',
        '*://allowed-domain2.com/*'
    ]
});
于 2013-04-14T10:11:10.557 回答
2

根据内容脚本文档

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

所以而不是

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

利用

permissions: [
  "tabs", "http://allowed-domain.com"
],
于 2013-04-14T08:59:53.830 回答