Index: chrome/browser/resources/chromeos/chromevox/chromevox/background/background.js |
diff --git a/chrome/browser/resources/chromeos/chromevox/chromevox/background/background.js b/chrome/browser/resources/chromeos/chromevox/chromevox/background/background.js |
index c6730e45324b7defac1d0aab02cc2f9393fc98bb..f3b0d24390c680da0acdec1ee05e133f51b7ba2c 100644 |
--- a/chrome/browser/resources/chromeos/chromevox/chromevox/background/background.js |
+++ b/chrome/browser/resources/chromeos/chromevox/chromevox/background/background.js |
@@ -104,34 +104,6 @@ cvox.ChromeVoxBackground.prototype.init = function() { |
this.onLoadStateChanged); |
} |
- var listOfFiles; |
- |
- // These lists of files must match the content_scripts section in |
- // the manifest files. |
- if (COMPILED) { |
- listOfFiles = ['chromeVoxChromePageScript.js']; |
- } else { |
- listOfFiles = [ |
- 'closure/closure_preinit.js', |
- 'closure/base.js', |
- 'deps.js', |
- 'chromevox/injected/loader.js']; |
- } |
- |
- var self = this; |
- var stageTwo = function(code) { |
- // Inject the content script into all running tabs. |
- chrome.windows.getAll({'populate': true}, function(windows) { |
- for (var i = 0; i < windows.length; i++) { |
- var tabs = windows[i].tabs; |
- for (var j = 0; j < tabs.length; j++) { |
- var tab = tabs[j]; |
- self.injectChromeVoxIntoTab(tab, listOfFiles, code); |
- } |
- } |
- }); |
- }; |
- |
this.checkVersionNumber(); |
// Set up a message passing system for goog.provide() calls from |
@@ -149,10 +121,22 @@ cvox.ChromeVoxBackground.prototype.init = function() { |
return true; |
}); |
- // We use fetchCode instead of chrome.extensions.executeFile because |
- // executeFile doesn't propagate the file name to the content script |
- // which means that script is not visible in Dev Tools. |
- cvox.InjectedScriptLoader.fetchCode(listOfFiles, stageTwo); |
+ var self = this; |
+ if (chrome.commandLinePrivate) { |
+ chrome.commandLinePrivate.hasSwitch('enable-chromevox-next', |
+ goog.bind(function(result) { |
+ if (result) { |
+ return; |
+ } |
+ // Inject the content script into all running tabs. |
+ chrome.windows.getAll({'populate': true}, function(windows) { |
+ for (var i = 0; i < windows.length; i++) { |
+ var tabs = windows[i].tabs; |
+ self.injectChromeVoxIntoTabs(tabs); |
+ } |
+ }); |
+ }, this)); |
+ } |
if (localStorage['active'] == 'false') { |
// Warn the user when the browser first starts if ChromeVox is inactive. |
@@ -168,56 +152,79 @@ cvox.ChromeVoxBackground.prototype.init = function() { |
/** |
* Inject ChromeVox into a tab. |
- * @param {Tab} tab The tab where ChromeVox scripts should be injected. |
- * @param {Array.<string>} files The files to load. |
- * @param {Object.<string, string>} code The contents of the files. |
+ * @param {Array.<Tab>} tabs The tab where ChromeVox scripts should be injected. |
+ * @param {boolean=} opt_forceCompiled forces compiled ChromeVox to be injected; |
+ * defaults to Closure's compiled flag. |
*/ |
-cvox.ChromeVoxBackground.prototype.injectChromeVoxIntoTab = |
- function(tab, files, code) { |
- window.console.log('Injecting into ' + tab.id, tab); |
- var sawError = false; |
+cvox.ChromeVoxBackground.prototype.injectChromeVoxIntoTabs = |
+ function(tabs, opt_forceCompiled) { |
+ var listOfFiles; |
- /** |
- * A helper function which executes code. |
- * @param {string} code The code to execute. |
- */ |
- var executeScript = goog.bind(function(code) { |
- chrome.tabs.executeScript( |
- tab.id, |
- {'code': code, |
- 'allFrames': true}, |
- goog.bind(function() { |
- if (!chrome.extension.lastError) { |
- return; |
- } |
- if (sawError) { |
- return; |
- } |
- sawError = true; |
- console.error('Could not inject into tab', tab); |
- this.tts.speak('Error starting ChromeVox for ' + |
- tab.title + ', ' + tab.url, 1); |
- }, this)); |
- }, this); |
- |
- // There is a scenario where two copies of the content script can get |
- // loaded into the same tab on browser startup - one automatically |
- // and one because the background page injects the content script into |
- // every tab on startup. To work around potential bugs resulting from this, |
- // ChromeVox exports a global function called disableChromeVox() that can |
- // be used here to disable any existing running instance before we inject |
- // a new instance of the content script into this tab. |
- // |
- // It's harmless if there wasn't a copy of ChromeVox already running. |
- // |
- // Also, set some variables so that Closure deps work correctly and so |
- // that ChromeVox knows not to announce feedback as if a page just loaded. |
- executeScript('try { window.disableChromeVox(); } catch(e) { }\n' + |
- 'window.INJECTED_AFTER_LOAD = true;\n' + |
- 'window.CLOSURE_NO_DEPS = true\n'); |
- |
- // Now inject the ChromeVox content script code into the tab. |
- files.forEach(function(file) { executeScript(code[file]); }); |
+ // These lists of files must match the content_scripts section in |
+ // the manifest files. |
+ if (COMPILED || opt_forceCompiled) { |
+ listOfFiles = ['chromeVoxChromePageScript.js']; |
+ } else { |
+ listOfFiles = [ |
+ 'closure/closure_preinit.js', |
+ 'closure/base.js', |
+ 'deps.js', |
+ 'chromevox/injected/loader.js']; |
+ } |
+ |
+ var stageTwo = function(code) { |
+ for (var i = 0, tab; tab = tabs[i]; i++) { |
+ window.console.log('Injecting into ' + tab.id, tab); |
+ var sawError = false; |
+ |
+ /** |
+ * A helper function which executes code. |
+ * @param {string} code The code to execute. |
+ */ |
+ var executeScript = goog.bind(function(code) { |
+ chrome.tabs.executeScript( |
+ tab.id, |
+ {'code': code, |
+ 'allFrames': true}, |
+ goog.bind(function() { |
+ if (!chrome.extension.lastError) { |
+ return; |
+ } |
+ if (sawError) { |
+ return; |
+ } |
+ sawError = true; |
+ console.error('Could not inject into tab', tab); |
+ this.tts.speak('Error starting ChromeVox for ' + |
+ tab.title + ', ' + tab.url, 1); |
+ }, this)); |
+ }, this); |
+ |
+ // There is a scenario where two copies of the content script can get |
+ // loaded into the same tab on browser startup - one automatically and one |
+ // because the background page injects the content script into every tab |
+ // on startup. To work around potential bugs resulting from this, |
+ // ChromeVox exports a global function called disableChromeVox() that can |
+ // be used here to disable any existing running instance before we inject |
+ // a new instance of the content script into this tab. |
+ // |
+ // It's harmless if there wasn't a copy of ChromeVox already running. |
+ // |
+ // Also, set some variables so that Closure deps work correctly and so |
+ // that ChromeVox knows not to announce feedback as if a page just loaded. |
+ executeScript('try { window.disableChromeVox(); } catch(e) { }\n' + |
+ 'window.INJECTED_AFTER_LOAD = true;\n' + |
+ 'window.CLOSURE_NO_DEPS = true\n'); |
+ |
+ // Now inject the ChromeVox content script code into the tab. |
+ listOfFiles.forEach(function(file) { executeScript(code[file]); }); |
+ } |
+ }; |
+ |
+ // We use fetchCode instead of chrome.extensions.executeFile because |
+ // executeFile doesn't propagate the file name to the content script |
+ // which means that script is not visible in Dev Tools. |
+ cvox.InjectedScriptLoader.fetchCode(listOfFiles, stageTwo); |
}; |
@@ -543,4 +550,7 @@ cvox.ChromeVoxBackground.prototype.onLoadStateChanged = function( |
// Export the braille object for access by the options page. |
window['braille'] = cvox.ChromeVox.braille; |
+ |
+ // Export this background page for ChromeVox Next to access. |
+ cvox.ChromeVox.background = background; |
})(); |