1 // Copyright (c) 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 /** 6 * @fileoverview Script that runs on the background page. 7 */ 8 9 CONTENT_SCRIPTS = [ 10 'accessibility_utils.js', 11 'traverse_util.js', 12 'caret_browsing.js' 13 ]; 14 15 /** 16 * The class handling the Caret Browsing background page, which keeps 17 * track of the current state, handles the browser action button, and 18 * initializes the content script in all running tabs when the extension 19 * is first loaded. 20 * @constructor 21 */ 22 var CaretBkgnd = function() {}; 23 24 /** 25 * Flag indicating whether caret browsing is enabled. Global, applies to 26 * all tabs simultaneously. 27 * @type {boolean} 28 */ 29 CaretBkgnd.isEnabled; 30 31 /** 32 * Change the browser action icon and tooltip based on the enabled state. 33 */ 34 CaretBkgnd.setIcon = function() { 35 chrome.browserAction.setIcon( 36 {'path': CaretBkgnd.isEnabled ? 37 '../caret_19_on.png' : 38 '../caret_19.png'}); 39 chrome.browserAction.setTitle( 40 {'title': CaretBkgnd.isEnabled ? 41 'Turn Off Caret Browsing (F7)' : 42 'Turn On Caret Browsing (F7)' }); 43 }; 44 45 /** 46 * This is called when the extension is first loaded, so that it can be 47 * immediately used in all already-open tabs. It's not needed for any 48 * new tabs that open after that, the content script will be automatically 49 * injected into any new tab. 50 */ 51 CaretBkgnd.injectContentScripts = function() { 52 chrome.windows.getAll({'populate': true}, function(windows) { 53 for (var i = 0; i < windows.length; i++) { 54 var tabs = windows[i].tabs; 55 for (var j = 0; j < tabs.length; j++) { 56 for (var k = 0; k < CONTENT_SCRIPTS.length; k++) { 57 chrome.tabs.executeScript( 58 tabs[j].id, 59 {file: CONTENT_SCRIPTS[k], allFrames: true}, 60 function(result) { 61 // Ignore. 62 chrome.runtime.lastError; 63 }); 64 } 65 } 66 } 67 }); 68 }; 69 70 /** 71 * Toggle caret browsing on or off, and update the browser action icon and 72 * all open tabs. 73 */ 74 CaretBkgnd.toggle = function() { 75 CaretBkgnd.isEnabled = !CaretBkgnd.isEnabled; 76 var obj = {}; 77 obj['enabled'] = CaretBkgnd.isEnabled; 78 chrome.storage.sync.set(obj); 79 CaretBkgnd.setIcon(); 80 }; 81 82 /** 83 * Initialize the background script. Set the initial value of the flag 84 * based on the saved preference in localStorage, update the browser action, 85 * inject into running tabs, and then set up communication with content 86 * scripts in tabs. Also check for prefs updates (from the options page) 87 * and send them to content scripts. 88 */ 89 CaretBkgnd.init = function() { 90 chrome.storage.sync.get('enabled', function(result) { 91 CaretBkgnd.isEnabled = result['enabled']; 92 CaretBkgnd.setIcon(); 93 CaretBkgnd.injectContentScripts(); 94 95 chrome.browserAction.onClicked.addListener(function(tab) { 96 CaretBkgnd.toggle(); 97 }); 98 }); 99 100 chrome.storage.onChanged.addListener(function() { 101 chrome.storage.sync.get('enabled', function(result) { 102 CaretBkgnd.isEnabled = result['enabled']; 103 CaretBkgnd.setIcon(); 104 }); 105 }); 106 }; 107 108 CaretBkgnd.init(); 109