views:

313

answers:

2

I'm trying my hands at a simple Chrome Extension, but am running into a problem with providing a value for the matches array in my content_scripts.

{
  "name": "My Extension",
  "version": "1.0",
  "description": "My Extension Experiment",
  "browser_action": {
    "default_icon": "icon.png",
    "default_title": "Ext",
    "default_popup": "popup.html"
  },
  "content_scripts": {
    "matches": ["http://*"],
    "js": ["scripts.js"]
  }
}

When I try to load this extension into Chrome, I get the following message:

Could not load extension from 'C:\Users\foo\Desktop\Extensions\bar'.
Invalid value for 'content_scripts'.

I cannot see what is "invalid" about my value though. What I'm trying to do is match every URL, so my extension can manipulate the DOM (via javascript within scripts.js) of any page it is ran on. Am I missing something, going about this all wrong, or what?

update

After posting this question, I did notice that the Google example was slightly different than mine, so I modified my code a bit to reflect their syntax:

"content_scripts": [{
  "matches": ["http://*"],
  "js": ["scripts.js"]
}]

That being said, I still get the following error when trying to load my extension:

Could not load extension from 'C:\Users\foo\Desktop\Extensions\bar'.
Invalid value for 'content_scripts[0].matches[0]'.

+1  A: 

You need to surround the value of the content_scripts field in square brackets:

"content_scripts": [ {
  "matches": ["http://*"],
  "js": ["scripts.js"]
} ]

(see the Chrome Docs for more info)

Incidentally, using http://*/* would be a better match for all urls (see the docs), adding https://*/* if you also need to match those as well.

Edit:

Following your edit, the error you are getting is because of the match pattern being incorrect.

adrianbanks
I saw the `http://*/*` pattern, but was worried that this would require urls to have a `/` after the `http://` in order for my extension to run. Is this incorrect?
Aristotle
The docs page on pattern matching (http://code.google.com/chrome/extensions/match_patterns.html) explain it in detail. All extensions I have seen use the `http://*/*` pattern without issue.
adrianbanks
Yes. I saw this page just moments before asking my question. But their example shows `http://*/*` as matching `http://www.google.com/` which caused me to believe that a url must have a forward-slash after those associated with `http://` in order to invoke my extension logic.
Aristotle
Try it and see - I believe it will work for both `http://site.com` and `http://site.com/`
adrianbanks
Sure enough, it ended up being the pattern. Thank you, Adrian.
Aristotle
A: 

If you want to match every URL, then Google has a special pattern just for this purpose: <all_urls>

Sample usage:

"matches": ["<all_urls>"],

See this page for more info: http://code.google.com/chrome/extensions/content_scripts.html

10basetom