about.js revision e5d81f57cb97b3b6b7fccc9c5610d21eb81db09d
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochcr.define('chrome.sync.about_tab', function() {
6effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Contains the latest snapshot of sync about info.
7effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  chrome.sync.aboutInfo = {};
8effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  function refreshAboutInfo(aboutInfo) {
10effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    chrome.sync.aboutInfo = aboutInfo;
11effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    var aboutInfoDiv = $('about-info');
12effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    jstProcess(new JsEvalContext(aboutInfo), aboutInfoDiv);
13effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
14effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  function onAboutInfoUpdatedEvent(e) {
16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    refreshAboutInfo(e.details);
17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
18effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
19effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  /** Container for accumulated sync protocol events. */
20effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  var protocolEvents = [];
21effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
22e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  /** We may receive re-delivered events.  Keep a record of ones we've seen. */
23e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  var knownEventTimestamps = {};
24e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  /**
26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch   * Callback for incoming protocol events.
27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch   * @param {Event} e The protocol event.
28effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch   */
29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  function onReceivedProtocolEvent(e) {
30effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    var details = e.details;
31e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
32e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    // Return early if we've seen this event before.  Assumes that timestamps
33e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    // are sufficiently high resolution to uniquely identify an event.
34e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    if (knownEventTimestamps.hasOwnProperty(details.time)) {
35e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      return;
36e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    }
37e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
38e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    knownEventTimestamps[details.time] = true;
39effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    protocolEvents.push(details);
40effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    var context = new JsEvalContext({ events: protocolEvents });
42effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    jstProcess(context, $('traffic-event-container'));
43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
44effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
45effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  /**
46effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch   * Initializes state and callbacks for the protocol event log UI.
47effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch   */
48effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  function initProtocolEventLog() {
49effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    chrome.sync.events.addEventListener(
50effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        'onProtocolEvent', onReceivedProtocolEvent);
51effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
52effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    // Make the prototype jscontent element disappear.
53effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    jstProcess({}, $('traffic-event-container'));
54effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
55effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  /**
57e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch   * Initializes listeners for status dump and import UI.
58effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch   */
59e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  function initStatusDumpButton() {
60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    $('status-data').hidden = true;
61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
62effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    var dumpStatusButton = $('dump-status');
63effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    dumpStatusButton.addEventListener('click', function(event) {
64effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      var aboutInfo = chrome.sync.aboutInfo;
65effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      if (!$('include-ids').checked) {
66effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        aboutInfo.details = chrome.sync.aboutInfo.details.filter(function(el) {
67effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          return !el.is_sensitive;
68effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        });
69effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      }
70effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      var data = '';
71effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      data += new Date().toString() + '\n';
72effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      data += '======\n';
73effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      data += 'Status\n';
74effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      data += '======\n';
75effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      data += JSON.stringify(aboutInfo, null, 2) + '\n';
76effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
77effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      $('status-text').value = data;
78effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      $('status-data').hidden = false;
79effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    });
80effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
81effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    var importStatusButton = $('import-status');
82effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    importStatusButton.addEventListener('click', function(event) {
83effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      $('status-data').hidden = false;
84effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      if ($('status-text').value.length == 0) {
85effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        $('status-text').value =
86effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            'Paste sync status dump here then click import.';
87effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        return;
88effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      }
89effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
90effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      // First remove any characters before the '{'.
91effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      var data = $('status-text').value;
92effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      var firstBrace = data.indexOf('{');
93effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      if (firstBrace < 0) {
94effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        $('status-text').value = 'Invalid sync status dump.';
95effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        return;
96effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      }
97effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      data = data.substr(firstBrace);
98effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
99effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      // Remove listeners to prevent sync events from overwriting imported data.
100effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      chrome.sync.events.removeEventListener(
101effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          'onAboutInfoUpdated',
102effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          onAboutInfoUpdatedEvent);
103effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
104effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      var aboutInfo = JSON.parse(data);
105effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      refreshAboutInfo(aboutInfo);
106effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    });
107e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
108effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
109e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  /**
110e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch   * Toggles the given traffic event entry div's "expanded" state.
111e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch   * @param {HTMLElement} element the element to toggle.
112e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch   */
113e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  function expandListener(element) {
114e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    element.target.classList.toggle('traffic-event-entry-expanded');
115e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
116e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
117e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  /**
118e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch   * Attaches a listener to the given traffic event entry div.
119e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch   * @param {HTMLElement} element the element to attach the listener to.
120e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch   */
121e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  function addExpandListener(element) {
122e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    element.addEventListener('click', expandListener, false);
123e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
124e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
125e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  function onLoad() {
126e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    initStatusDumpButton();
127effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    initProtocolEventLog();
128e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
129e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    chrome.sync.events.addEventListener(
130e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        'onAboutInfoUpdated',
131e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        onAboutInfoUpdatedEvent);
132e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
133e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    // Register to receive a stream of event notifications.
134e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    chrome.sync.registerForEvents();
135e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
136e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    // Request an about info update event to initialize the page.
137e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    chrome.sync.requestUpdatedAboutInfo();
138effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
140effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return {
141effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    onLoad: onLoad,
142effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    addExpandListener: addExpandListener
143effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  };
144effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch});
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
146effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochdocument.addEventListener(
147effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    'DOMContentLoaded', chrome.sync.about_tab.onLoad, false);
148