开发者

How to specify different match patterns for multiple content scripts in the manifest.json file of the same extension

Here is the scenario:

Scenario 1: I want to inject different content scripts into different pages based on the URL Domain.

For ex: Inject cs1.js content script into www.a.com but inject 开发者_Python百科cs2.js content script into www.b.com. Both the content scripts cs1.js and cs2.js are part of the same chrome extension.So how can I specify different match patterns ( under "matches" section while defining "content_scripts" in the manifest.json file ) so that one script is injected in one page while other is injected in other page.

Scenario 2: How can I mention, if under a subdomain of say www.a.com, I wish to inject the content script into all pages in the domain except www.b.a.com ( all other subdomains need to be injected with the content script ). How do I specify match pattern for this case.

Thanks in advance.


Specifying the content_scripts within manifest.json is a bit limiting. Although you can specify different match patterns, you can only have it execute one possible slew of files.

To achieve what you want, you'll need to set up a background_page that can interpret page URLs, and execute content scripts as you see fit.

Three different methods might be:

  1. Use the manifest's content_scripts to match all possible URLs and execute a simple content script to send a message request to the background page via chrome.extension.sendRequest(). The background page listens for messages with chrome.extension.onRequest.addListener(), receives the message, interprets the tab's URL with sender.tab.url (or have the tab's message send window.location.hostname, probably easier), then decides what content scripts to inject to the tab via chrome.tabs.executeScript().
     
    or

  2. Just have your background_page listen for chrome.tabs.onCreated.addListener() and chrome.tabs.onUpdated.addListener() to get a tab's URL, then decide what content scripts to inject to the tab via chrome.tabs.executeScript(). No need to specify content_scripts in the manifest for this.  
     
    or

  3. Similar to 1, but have your manifest content_scripts script figure out what to do based on the current URL (again could interpret window.location.hostname), then use chrome.extension.sendRequest() with a message for your background_page stating which content scripts to execute (meaning your background_page doesn't decide - the original content script does). Same result though.


Meanwhile szenario 1 can be solved: You can inject different content scripts into different pages this way:

"content_scripts": 
[{
  "run_at": "document_end",
  "js": [
    "cs1.js"
  ],
  "matches": [
    "https://www.a.com/*"
  ]
},
{
  "run_at": "document_end",
  "js": [
    "cs2.js"
  ],
  "matches": [
    "https://www.b.com/*"
  ]
}],

Hope this answear helps for the initial question.


http://code.google.com/chrome/extensions/content_scripts.html#include-exclude-globs

Does this help at all?

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜