OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 /** | 5 /** |
6 * Available levels of power-saving-overriding. | 6 * States that the extension can be in. |
7 */ | 7 */ |
8 var LevelEnum = { | 8 var StateEnum = { |
9 DISABLED: '', | 9 DISABLED: 'disabled', |
10 DISPLAY: 'display', | 10 DISPLAY: 'display', |
11 SYSTEM: 'system' | 11 SYSTEM: 'system' |
12 }; | 12 }; |
13 | 13 |
14 /** | 14 /** |
15 * Key used for storing the current level in {localStorage}. | 15 * Key used for storing the current state in {localStorage}. |
16 */ | 16 */ |
17 var LEVEL_KEY = 'level'; | 17 var STATE_KEY = 'state'; |
18 | |
19 /** | |
20 * Current {LevelEnum}. | |
21 */ | |
22 var currentLevel = LevelEnum.DISABLED; | |
23 | 18 |
24 /** | 19 /** |
25 * Should the old {chrome.experimental.power} API be used rather than | 20 * Should the old {chrome.experimental.power} API be used rather than |
26 * {chrome.power}? | 21 * {chrome.power}? |
27 */ | 22 */ |
28 var useOldApi = !chrome.power; | 23 var useOldApi = !chrome.power; |
29 | 24 |
30 /** | 25 /** |
31 * Returns the previously-used level. | 26 * Loads the locally-saved state asynchronously. |
32 * @return {string} Saved {LevelEnum} from local storage. | 27 * @param {function} callback Callback invoked with the loaded {StateEnum}. |
33 */ | 28 */ |
34 function getInitialLevel() { | 29 function loadSavedState(callback) { |
35 if (LEVEL_KEY in localStorage) { | 30 chrome.storage.local.get(STATE_KEY, function(items) { |
36 var savedLevel = localStorage[LEVEL_KEY]; | 31 var savedState = items[STATE_KEY]; |
37 for (var key in LevelEnum) { | 32 for (var key in StateEnum) { |
38 if (savedLevel == LevelEnum[key]) { | 33 if (savedState == StateEnum[key]) { |
39 return savedLevel; | 34 callback(savedState); |
| 35 return; |
40 } | 36 } |
41 } | 37 } |
42 } | 38 callback(StateEnum.DISABLED); |
43 return LevelEnum.DISABLED; | 39 }); |
44 } | 40 } |
45 | 41 |
46 /** | 42 /** |
47 * Switches to a new power-saving-overriding level. | 43 * Switches to a new state. |
48 * @param {string} newLevel New {LevelEnum} to use. | 44 * @param {string} newState New {StateEnum} to use. |
49 */ | 45 */ |
50 function setLevel(newLevel) { | 46 function setState(newState) { |
51 var imagePrefix = 'night'; | 47 var imagePrefix = 'night'; |
52 var title = ''; | 48 var title = ''; |
53 | 49 |
54 // The old API doesn't support the "system" level. | 50 // The old API doesn't support the "system" level. |
55 if (useOldApi && newLevel == LevelEnum.SYSTEM) | 51 if (useOldApi && newState == StateEnum.SYSTEM) |
56 newLevel = LevelEnum.DISPLAY; | 52 newState = StateEnum.DISPLAY; |
57 | 53 |
58 switch (newLevel) { | 54 switch (newState) { |
59 case LevelEnum.DISABLED: | 55 case StateEnum.DISABLED: |
60 (useOldApi ? chrome.experimental.power : chrome.power).releaseKeepAwake(); | 56 (useOldApi ? chrome.experimental.power : chrome.power).releaseKeepAwake(); |
61 imagePrefix = 'night'; | 57 imagePrefix = 'night'; |
62 title = chrome.i18n.getMessage('disabledTitle'); | 58 title = chrome.i18n.getMessage('disabledTitle'); |
63 break; | 59 break; |
64 case LevelEnum.DISPLAY: | 60 case StateEnum.DISPLAY: |
65 if (useOldApi) | 61 if (useOldApi) |
66 chrome.experimental.power.requestKeepAwake(function() {}); | 62 chrome.experimental.power.requestKeepAwake(function() {}); |
67 else | 63 else |
68 chrome.power.requestKeepAwake('display'); | 64 chrome.power.requestKeepAwake('display'); |
69 imagePrefix = 'day'; | 65 imagePrefix = 'day'; |
70 title = chrome.i18n.getMessage('displayTitle'); | 66 title = chrome.i18n.getMessage('displayTitle'); |
71 break; | 67 break; |
72 case LevelEnum.SYSTEM: | 68 case StateEnum.SYSTEM: |
73 chrome.power.requestKeepAwake('system'); | 69 chrome.power.requestKeepAwake('system'); |
74 imagePrefix = 'sunset'; | 70 imagePrefix = 'sunset'; |
75 title = chrome.i18n.getMessage('systemTitle'); | 71 title = chrome.i18n.getMessage('systemTitle'); |
76 break; | 72 break; |
77 default: | 73 default: |
78 throw 'Invalid level "' + newLevel + '"'; | 74 throw 'Invalid state "' + newState + '"'; |
79 } | 75 } |
80 | 76 |
81 currentLevel = newLevel; | 77 var items = {}; |
82 localStorage[LEVEL_KEY] = currentLevel; | 78 items[STATE_KEY] = newState; |
| 79 chrome.storage.local.set(items); |
83 | 80 |
84 chrome.browserAction.setIcon({ | 81 chrome.browserAction.setIcon({ |
85 path: { | 82 path: { |
86 '19': 'images/' + imagePrefix + '-19.png', | 83 '19': 'images/' + imagePrefix + '-19.png', |
87 '38': 'images/' + imagePrefix + '-38.png' | 84 '38': 'images/' + imagePrefix + '-38.png' |
88 } | 85 } |
89 }); | 86 }); |
90 chrome.browserAction.setTitle({title: title}); | 87 chrome.browserAction.setTitle({title: title}); |
91 } | 88 } |
92 | 89 |
93 /** | 90 chrome.browserAction.onClicked.addListener(function() { |
94 * Cycles levels in response to browser action icon clicks. | 91 loadSavedState(function(state) { |
95 */ | 92 switch (state) { |
96 function handleClicked() { | 93 case StateEnum.DISABLED: |
97 switch (currentLevel) { | 94 setState(StateEnum.DISPLAY); |
98 case LevelEnum.DISABLED: | 95 break; |
99 setLevel(LevelEnum.DISPLAY); | 96 case StateEnum.DISPLAY: |
100 break; | 97 setState(useOldApi ? StateEnum.DISABLED : StateEnum.SYSTEM); |
101 case LevelEnum.DISPLAY: | 98 break; |
102 setLevel(useOldApi ? LevelEnum.DISABLED : LevelEnum.SYSTEM); | 99 case StateEnum.SYSTEM: |
103 break; | 100 setState(StateEnum.DISABLED); |
104 case LevelEnum.SYSTEM: | 101 break; |
105 setLevel(LevelEnum.DISABLED); | 102 default: |
106 break; | 103 throw 'Invalid state "' + state + '"'; |
107 default: | 104 } |
108 throw 'Invalid level "' + currentLevel + '"'; | 105 }); |
109 } | 106 }); |
110 } | |
111 | 107 |
112 chrome.browserAction.onClicked.addListener(handleClicked); | 108 chrome.runtime.onStartup.addListener(function() { |
113 setLevel(getInitialLevel()); | 109 loadSavedState(function(state) { setState(state); }); |
| 110 }); |
| 111 |
| 112 // TODO(derat): Remove this once http://crbug.com/222473 is fixed. |
| 113 chrome.windows.onCreated.addListener(function() { |
| 114 loadSavedState(function(state) { setState(state); }); |
| 115 }); |
OLD | NEW |