1 // Copyright (c) 2013 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 * States that the extension can be in. 7 */ 8 var StateEnum = { 9 DISABLED: 'disabled', 10 DISPLAY: 'display', 11 SYSTEM: 'system' 12 }; 13 14 /** 15 * Key used for storing the current state in {localStorage}. 16 */ 17 var STATE_KEY = 'state'; 18 19 /** 20 * Loads the locally-saved state asynchronously. 21 * @param {function} callback Callback invoked with the loaded {StateEnum}. 22 */ 23 function loadSavedState(callback) { 24 chrome.storage.local.get(STATE_KEY, function(items) { 25 var savedState = items[STATE_KEY]; 26 for (var key in StateEnum) { 27 if (savedState == StateEnum[key]) { 28 callback(savedState); 29 return; 30 } 31 } 32 callback(StateEnum.DISABLED); 33 }); 34 } 35 36 /** 37 * Switches to a new state. 38 * @param {string} newState New {StateEnum} to use. 39 */ 40 function setState(newState) { 41 var imagePrefix = 'night'; 42 var title = ''; 43 44 switch (newState) { 45 case StateEnum.DISABLED: 46 chrome.power.releaseKeepAwake(); 47 imagePrefix = 'night'; 48 title = chrome.i18n.getMessage('disabledTitle'); 49 break; 50 case StateEnum.DISPLAY: 51 chrome.power.requestKeepAwake('display'); 52 imagePrefix = 'day'; 53 title = chrome.i18n.getMessage('displayTitle'); 54 break; 55 case StateEnum.SYSTEM: 56 chrome.power.requestKeepAwake('system'); 57 imagePrefix = 'sunset'; 58 title = chrome.i18n.getMessage('systemTitle'); 59 break; 60 default: 61 throw 'Invalid state "' + newState + '"'; 62 } 63 64 var items = {}; 65 items[STATE_KEY] = newState; 66 chrome.storage.local.set(items); 67 68 chrome.browserAction.setIcon({ 69 path: { 70 '19': 'images/' + imagePrefix + '-19.png', 71 '38': 'images/' + imagePrefix + '-38.png' 72 } 73 }); 74 chrome.browserAction.setTitle({title: title}); 75 } 76 77 chrome.browserAction.onClicked.addListener(function() { 78 loadSavedState(function(state) { 79 switch (state) { 80 case StateEnum.DISABLED: 81 setState(StateEnum.DISPLAY); 82 break; 83 case StateEnum.DISPLAY: 84 setState(StateEnum.SYSTEM); 85 break; 86 case StateEnum.SYSTEM: 87 setState(StateEnum.DISABLED); 88 break; 89 default: 90 throw 'Invalid state "' + state + '"'; 91 } 92 }); 93 }); 94 95 chrome.runtime.onStartup.addListener(function() { 96 loadSavedState(function(state) { setState(state); }); 97 }); 98 99 chrome.runtime.onInstalled.addListener(function(details) { 100 loadSavedState(function(state) { setState(state); }); 101 }); 102