2013-04-14 40 views
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" 
    ] 
} 

据我了解分机不能禁用绝对,其proccess将在后台再次运行。但这不是问题。我只是不想在其他网站上显示上下文菜单项。

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

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文件和其他的东西不用于现在。

+0

你能证明你的代码的相关部分:

要在创建使用chrome.contextMenus.create上下文菜单限制上下文菜单项向某些域,pecify的documentUrlPatterns关键?我对'scripts/background.js'的内容非常好奇,因为你将它包含了两次(作为后台脚本和内容脚本)。我怀疑其中的一个(甚至是所有内容脚本)都放错了位置。只要结构和Chrome API调用仍可见('popup.js','background.js'),就可以去除应用程序逻辑。 –

+0

@RobW,你说得对,我从'content_scripts'中删除了'js',它又重新开始工作。我只是有其他的想法来扩展扩展(添加历史记录等弹出窗口),清单并没有从不必要的东西中清除。你有权限的建议吗? – enenen

+0

是的,我已经键入了一个答案,但因为我没有发布它,因为它假定你采取了某种方法。我不想玩猜谜游戏,那么你可以分享创建上下文菜单的代码吗? (你使用'contextmenu'事件或'chrome.contextMenus' API?如果你点击上下文菜单项,会发生什么?) –

回答

2

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

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

非常感谢!这正是我正在寻找的。 – enenen

2

按照content scripts documentation

“如果你想只是有时注入代码,使用权限字段,而不是,如Programmatic injection描述”

所以不是

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

使用

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