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