I'm trying to write a Google Chrome extension.
The documentation and even sample code say that a background page can run JavaScript on the active tab using the chrome.tabs.executeScript
method, but chrome.tabs
is always undefined
when I break in the debugger.
This behavior is manifest in both my code and the Google sample code.
The Real Question: How do I run JavaScript on the active tab from a background page in a Chrome extension?
background.js:
chrome.browserAction.onClicked.addListener(function(tab) {
debugger;
// chrome.tabs is undefined here
chrome.tabs.executeScript({
code: "console.log('hi')"
});
});
manifest.js:
{
"manifest_version": 2,
"name": "Hello World",
"description": "Says 'hello' to the world.",
"version": "0.1",
"permissions": ["tabs", "activeTab"],
"browser_action": {
"default_title": "hi"
},
"background": {
"scripts": ["background.js"]
}
}
Things I've tried:
persistent
flag on background
in the manifest file to false
, true
, "false"
, and "true"
"tabs"
permissionThe runtime throws this error when I try access chrome.tabs
:
Lazy require of tabs.binding did not set the binding field
query() Gets all tabs that have the specified properties, or all tabs if no properties are specified. This is an asynchronous function that returns a Promise .
The background script should be viewed as "running in the background of the Chrome browser". Your desired effect (running a script for every page) is actually a task for content scripts. To learn more, read https://developer.chrome.com/extensions/overview.html#arch. Follow this answer to receive notifications.
Starting with Google Chrome 79, a new Tab Freeze feature has been added that will automatically pause (freeze) tabs when they have been inactive in the background for 5 minutes by default until you return to the tab.
wOxxOm
's comment diagnosed this correctly:
This is a bug [in Chrome] when you use
debugger;
statement.
However, I've found it goes deeper than that. A breakpoint alone was sufficient to give me this issue. Thanks to this SO answer for pointing out that breakpoints can also cause this problem.
You have to be thorough to "clear out" the debugger. The debugger window must be closed when the extension is reloaded. Simply closing the debugger window without reloading was not enough to make the problem go away.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With