12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * States that the extension can be in. 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)var StateEnum = { 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISABLED: 'disabled', 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISPLAY: 'display', 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SYSTEM: 'system' 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Key used for storing the current state in {localStorage}. 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)var STATE_KEY = 'state'; 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Loads the locally-saved state asynchronously. 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {function} callback Callback invoked with the loaded {StateEnum}. 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)function loadSavedState(callback) { 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chrome.storage.local.get(STATE_KEY, function(items) { 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) var savedState = items[STATE_KEY]; 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (var key in StateEnum) { 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (savedState == StateEnum[key]) { 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) callback(savedState); 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) callback(StateEnum.DISABLED); 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }); 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Switches to a new state. 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {string} newState New {StateEnum} to use. 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)function setState(newState) { 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var imagePrefix = 'night'; 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var title = ''; 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (newState) { 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case StateEnum.DISABLED: 464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) chrome.power.releaseKeepAwake(); 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) imagePrefix = 'night'; 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) title = chrome.i18n.getMessage('disabledTitle'); 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case StateEnum.DISPLAY: 514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) chrome.power.requestKeepAwake('display'); 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) imagePrefix = 'day'; 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) title = chrome.i18n.getMessage('displayTitle'); 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case StateEnum.SYSTEM: 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome.power.requestKeepAwake('system'); 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) imagePrefix = 'sunset'; 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) title = chrome.i18n.getMessage('systemTitle'); 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) throw 'Invalid state "' + newState + '"'; 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) var items = {}; 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) items[STATE_KEY] = newState; 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chrome.storage.local.set(items); 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome.browserAction.setIcon({ 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) path: { 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '19': 'images/' + imagePrefix + '-19.png', 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '38': 'images/' + imagePrefix + '-38.png' 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }); 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome.browserAction.setTitle({title: title}); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)chrome.browserAction.onClicked.addListener(function() { 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) loadSavedState(function(state) { 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (state) { 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case StateEnum.DISABLED: 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) setState(StateEnum.DISPLAY); 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case StateEnum.DISPLAY: 844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) setState(StateEnum.SYSTEM); 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case StateEnum.SYSTEM: 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) setState(StateEnum.DISABLED); 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) throw 'Invalid state "' + state + '"'; 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }); 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}); 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)chrome.runtime.onStartup.addListener(function() { 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) loadSavedState(function(state) { setState(state); }); 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}); 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(derat): Remove this once http://crbug.com/222473 is fixed. 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)chrome.windows.onCreated.addListener(function() { 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) loadSavedState(function(state) { setState(state); }); 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}); 103