Getting variables outside executeScript in chrome extension

global-variables, google-chrome, google-chrome-extension, javascript

Solution

Content scripts executes in context of web page. See Content Scripts section in Chrome docs for more information.

If you want to pass string variable from background page to `chrome.tabs.executeScript` you must do something like this:

var x = "test";
chrome.tabs.executeScript(id, {code:"var x = '"+x+"'; try{alert(x);}catch(e){alert(e);}"},null);

If you want to modify variable, you have only one way - messaging:

var x = 1;
console.log('x=' + x);

chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
    console.log(request);
    if(request.command == 'setVar') {
        window[request.name] = request.data;
    }
});

chrome.browserAction.onClicked.addListener(function() {
    var code = "chrome.extension.sendRequest({command: 'setVar', name: 'x', data: 2});";
    chrome.tabs.executeScript(null, {code:code});
    window.setTimeout(function(){console.log('x=' + x);}, 1000);
});

Problem

I am trying to code a chrome extension, and I have a background.html with this code: ``` var x = "test"; function tabChanged(id, info, tab){ if(info.status == 'complete'){ chrome.tabs.executeScript(id, {code:"try{alert(x);}catch(e){alert(e);}"}, null); } } chrome.tabs.onUpdated.addListener(tabChanged); chrome.tabs.getAllInWindow(null,function(tabs){ for(var index=0; index < tabs.length; index++){ chrome.tabs.executeScript(tabs[index].id, {code:"try{alert(x);}catch(e){alert(e);}"}, null); } }); ``` But variable "x" is always undefined inside executeScript. How can I get/set x from executeScript? Without using messaging.

Original source