Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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 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.

like image 642
Venkatesh Avatar asked Apr 25 '11 17:04

Venkatesh


1 Answers

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.

like image 144
Chris McFarland Avatar answered Sep 17 '22 14:09

Chris McFarland