Source: background/background.js

/*
 *  Copyright (c) 2015-2017, Michael A. Updike All rights reserved.
 *  Licensed under the BSD-3-Clause
 *  https://opensource.org/licenses/BSD-3-Clause
 *  https://github.com/opus1269/photo-screen-saver/blob/master/LICENSE.md
 */
(function() {
  'use strict';

  /**
   * The background script for the extension.<br>
   * @namespace Background
   */

  new ExceptionHandler();

  /**
   * Display the options tab
   * @private
   * @memberOf Background
   */
  function _showOptionsTab() {
    // send message to the option tab to focus it.
    Chrome.Msg.send(Chrome.Msg.HIGHLIGHT).catch(() => {
      // no one listening, create it
      chrome.tabs.create({url: '../html/options.html'});
    });
  }

  /**
   * Event: Fired when the extension is first installed,<br />
   * when the extension is updated to a new version,<br />
   * and when Chrome is updated to a new version.
   * @see https://developer.chrome.com/extensions/runtime#event-onInstalled
   * @param {Object} details - type of event
   * @param {string} details.reason - reason for install
   * @param {string} details.previousVersion - old version if 'update' reason
   * @private
   * @memberOf Background
   */
  function _onInstalled(details) {
    if (details.reason === 'install') {
      // initial install
      Chrome.GA.event(Chrome.GA.EVENT.INSTALLED, Chrome.Utils.getVersion());
      app.Data.initialize();
      _showOptionsTab();
    } else if (details.reason === 'update') {
      if (!app.Utils.DEBUG) {
        if (Chrome.Utils.getVersion() === details.previousVersion) {
          // spurious update: 
          // https://bugs.chromium.org/p/chromium/issues/detail?id=303481
          return;
        }
      }
      // extension updated
      app.Data.update();
    }
  }

  /**
   * Event: Fired when a profile that has this extension installed first
   * starts up
   * @see https://developer.chrome.com/extensions/runtime#event-onStartup
   * @private
   * @memberOf Background
   */
  function _onStartup() {
    Chrome.GA.page('/background.html');
    app.Data.processState();
  }

  /**
   * Event: Fired when a browser action icon is clicked.
   * @see https://goo.gl/abVwKu
   * @private
   * @memberOf Background
   */
  function _onIconClicked() {
    _showOptionsTab();
  }

  /**
   * Event: Fired when item in localStorage changes
   * @see https://developer.mozilla.org/en-US/docs/Web/Events/storage
   * @param {Event} event - StorageEvent
   * @param {string} event.key - storage item that changed
   * @private
   * @memberOf Background
   */
  function _onStorageChanged(event) {
    app.Data.processState(event.key);
  }

  // noinspection JSUnusedLocalSymbols
  /**
   * Event: Fired when a message is sent from either an extension process<br>
   * (by runtime.sendMessage) or a content script (by tabs.sendMessage).
   * @see https://developer.chrome.com/extensions/runtime#event-onMessage
   * @param {Chrome.Msg.Message} request - details for the message
   * @param {Object} [sender] - MessageSender object
   * @param {Function} [response] - function to call once after processing
   * @returns {boolean} true if asynchronous
   * @private
   * @memberOf Background
   */
  function _onChromeMessage(request, sender, response) {
    if (request.message === Chrome.Msg.RESTORE_DEFAULTS.message) {
      app.Data.restoreDefaults();
    } else if (request.message === Chrome.Msg.STORE.message) {
      Chrome.Storage.set(request.key, request.value);
    }
    return false;
  }

  /**
   * Event: called when document and resources are loaded
   * @private
   * @memberOf Background
   */
  function _onLoad() {
    // listen for extension install or update
    chrome.runtime.onInstalled.addListener(_onInstalled);

    // listen for Chrome starting
    chrome.runtime.onStartup.addListener(_onStartup);

    // listen for click on the icon
    chrome.browserAction.onClicked.addListener(_onIconClicked);

    // listen for changes to the stored data
    addEventListener('storage', _onStorageChanged, false);

    // listen for chrome messages
    Chrome.Msg.listen(_onChromeMessage);
  }
  
  // listen for document and resources loaded
  window.addEventListener('load', _onLoad);
})();