| // 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() { |
| 'use strict'; |
| |
| var eventsByCategory = { |
| notifier: [ |
| 'onIncomingNotification', |
| 'onNotificationStateChange', |
| ], |
| |
| manager: [ |
| 'onActionableError', |
| 'onChangesApplied', |
| 'onChangesComplete', |
| 'onClearServerDataFailed', |
| 'onClearServerDataSucceeded', |
| 'onConnectionStatusChange', |
| 'onEncryptedTypesChanged', |
| 'onEncryptionComplete', |
| 'onInitializationComplete', |
| 'onPassphraseAccepted', |
| 'onPassphraseRequired', |
| 'onStopSyncingPermanently', |
| 'onSyncCycleCompleted', |
| ], |
| |
| transaction: [ |
| 'onTransactionWrite', |
| ], |
| |
| protocol: [ |
| 'onProtocolEvent', |
| ] |
| }; |
| |
| /** |
| * 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; |
| |
| /** |
| * Creates a callback function to be invoked when an event arrives. |
| */ |
| var makeCallback = function(categoryName, eventName) { |
| return function(e) { |
| self.log_(categoryName, eventName, e.details); |
| }; |
| }; |
| |
| for (var categoryName in eventsByCategory) { |
| for (var i = 0; i < eventsByCategory[categoryName].length; ++i) { |
| var eventName = eventsByCategory[categoryName][i]; |
| chrome.sync.events.addEventListener( |
| eventName, |
| makeCallback(categoryName, eventName)); |
| } |
| } |
| } |
| |
| 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, |
| textDetails: '' |
| }; |
| entry.textDetails = JSON.stringify(entry.details, null, 2); |
| 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() |
| }; |
| }); |