Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to access page variables from Chrome extension background script

With a content script you can inject a script tag into the DOM in order to access variables in the original page (as explained in this question).

I want to avoid injecting my code into every page and instead only do that when the user clicks on the extension icon.

When I tried using the same code as for the content script the values were undefined, although the script was inserted correctly.

Is this possible? Otherwise is using a content script and communicating with it the preferred solution?

Here is the code I'm using:

var scr = document.createElement("script");
scr.type="text/javascript";
scr.innerHTML = "setInterval('console.log(window.testVar)', 1000)"
document.body.appendChild(scr)

Manifest excerpt:

 "permissions": [
    "tabs",
    "http://*/*", "https://*/*"
  ],
  "background": {
    "scripts": ["inject.js"]
  },
like image 836
Matt Zeunert Avatar asked Sep 09 '13 21:09

Matt Zeunert


2 Answers

Nope. That's not possible. You may inject a script, but it only have an access to DOM and it could make DOM manipulations. It can not read javascript variables or execute functions in the context of the current page. Your javascript code is run in a sandbox and you are restricted only to the DOM elements.

like image 66
Krasimir Avatar answered Sep 22 '22 12:09

Krasimir


You can create a new background script with the following code:

chrome.browserAction.onClicked.addListener( function() {
  chrome.tabs.executeScript( { file: 'inject.js' } );
});

Your inject.js should stay as part of the extension, but you don't need to mention it in the manifest. This way, it will be run as a content script each time you press the extension icon. You didn't include the part of the manifest where you define the browserAction, but you just need to not specify a default_popup.

like image 42
rsanchez Avatar answered Sep 20 '22 12:09

rsanchez