Reputation: 36703
I have developed a chrome extension and it is working absolutely fine.
Part of the manifest.json
looks like this:
"content_scripts":[
{
"js":["js/script.js"],
"css": ["css/style.css"],
"matches": ["http://localhost/*", "https://localhost/*"]
}
],
so the extension injects the content script only when the domain is localhost
, which is also working fine. Now I want a way by which the extension popup can have a enable extension on this domain
or disable extension on this domain
in the so the user can enable/disable the extension according to needs.
I have seen that in multiple ad-blocker plugins, so I guess it should be possible.
Upvotes: 11
Views: 7076
Reputation: 31698
This needs two parts:
Now there's the chrome.scripting.registerContentScripts()
API, which lets you programmatically register content scripts.
chrome.scripting.registerContentScripts([{
id: "a-script",
matches: ['https://your-dynamic-domain.example.com/*'],
js: ['content.js']
}]);
By using chrome.permissions.request
you can add new domains on which you can inject content scripts. An example would be:
// In a content script, options page or popup
document.querySelector('button').addEventListener('click', () => {
chrome.permissions.request({
origins: ['https://your-dynamic-domain.example.com/*']
}, granted => {
if (granted) {
/* Use contentScripts.register */
}
});
});
For this to work, you'll have to allow new origins to be added on demand by adding this in your manifest.json
{
"optional_permissions": [
"http://*/*",
"https://*/*"
]
}
There are also tools to further simplify this for you and for the end user, such as
webext-domain-permission-toggle
and webext-dynamic-content-scripts
, which are used by many GitHub-related extensions to add support for self-hosted GitHub installations.
They will also register your scripts in the next browser launches and allow the user the remove the new permissions and scripts as well.
Upvotes: 4
Reputation: 573
Google is working on programmatic script registration for extension manifest v3. The new API will be called chrome.scripting.registerContentScript and pretty much matches what Firefox already has, minus the intuitive naming of the API. You can follow the implementation status in this Chrome bug.
Upvotes: 1