Javascript  |  163行  |  4.72 KB

// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// require: cr.js
// require: cr/event_target.js

/**
 * @fileoverview This creates a log object which listens to and
 * records all sync events.
 */

cr.define('chrome.sync', function() {
  /**
   * Creates a new log object which then immediately starts recording
   * sync events.  Recorded entries are available in the 'entries'
   * property and there is an 'append' event which can be listened to.
   * @constructor
   * @extends {cr.EventTarget}
   */
  var Log = function() {
    var self = this;

    // Service

    chrome.sync.onSyncServiceStateChanged.addListener(function () {
      self.log_('service', 'onSyncServiceStateChanged', {});
    });

    // Notifier

    chrome.sync.onSyncNotificationStateChange.addListener(
      function (notificationsEnabled) {
        self.log_('notifier', 'onSyncNotificationStateChange', {
                    notificationsEnabled: notificationsEnabled
                  });
      });

    chrome.sync.onSyncIncomingNotification.addListener(function (changedTypes) {
      self.log_('notifier', 'onSyncIncomingNotification', {
                  changedTypes: changedTypes
                });
    });

    // Manager

    chrome.sync.onChangesApplied.addListener(function (modelType, changes) {
      self.log_('manager', 'onChangesApplied', {
                  modelType: modelType,
                  changes: changes
                });
    });

    chrome.sync.onChangesComplete.addListener(function (modelType) {
      self.log_('manager', 'onChangesComplete', {
                  modelType: modelType
                });
    });

    chrome.sync.onSyncCycleCompleted.addListener(function (snapshot) {
      self.log_('manager', 'onSyncCycleCompleted', {
                  snapshot: snapshot
                });
    });

    chrome.sync.onAuthError.addListener(function (authError) {
      self.log_('manager', 'onAuthError', {
                  authError: authError
                });
    });

    chrome.sync.onUpdatedToken.addListener(function (token) {
      self.log_('manager', 'onUpdatedToken', {
                  token: token
                });
    });

    chrome.sync.onPassphraseRequired.addListener(function (forDecryption) {
      self.log_('manager', 'onPassphraseRequired', {
                  forDecryption: forDecryption
                });
    });

    chrome.sync.onPassphraseAccepted.addListener(function (bootstrapToken) {
      self.log_('manager', 'onPassphraseAccepted', {
                  bootstrapToken: bootstrapToken
                });
    });

    chrome.sync.onEncryptionComplete.addListener(function (encrypted_types) {
      self.log_('manager', 'onEncryptionComplete', {
                  encrypted_types: encrypted_types
                });
    });

    chrome.sync.onMigrationNeededForTypes.addListener(function (model_types) {
      self.log_('manager', 'onMigrationNeededForTypes', {
                  model_types: model_types
                });
    });

    chrome.sync.onInitializationComplete.addListener(function () {
      self.log_('manager', 'onInitializationComplete', {});
    });

    chrome.sync.onPaused.addListener(function () {
      self.log_('manager', 'onPaused', {});
    });

    chrome.sync.onResumed.addListener(function () {
      self.log_('manager', 'onResumed', {});
    });

    chrome.sync.onStopSyncingPermanently.addListener(function () {
      self.log_('manager', 'onStopSyncingPermanently', {});
    });

    chrome.sync.onClearServerDataSucceeded.addListener(function () {
      self.log_('manager', 'onClearServerDataSucceeded', {});
    });

    chrome.sync.onClearServerDataFailed.addListener(function () {
      self.log_('manager', 'onClearServerDataFailed', {});
    });
  };

  Log.prototype = {
    __proto__: cr.EventTarget.prototype,

    /**
     * The recorded log entries.
     * @type {array}
     */
    entries: [],

    /**
     * Records a single event with the given parameters and fires the
     * 'append' event with the newly-created event as the 'detail'
     * field of a custom event.
     * @param {string} submodule The sync submodule for the event.
     * @param {string} event The name of the event.
     * @param {dictionary} details A dictionary of event-specific details.
     */
    log_: function(submodule, event, details) {
      var entry = {
        submodule: submodule,
        event: event,
        date: new Date(),
        details: details
      };
      this.entries.push(entry);
      // Fire append event.
      var e = cr.doc.createEvent('CustomEvent');
      e.initCustomEvent('append', false, false, entry);
      this.dispatchEvent(e);
    }
  };

  return {
    log: new Log()
  };
});