// Copyright (c) 2012 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. /** * This class wraps the popup's form, and performs the proper clearing of data * based on the user's selections. It depends on the form containing a single * select element with an id of 'timeframe', and a single button with an id of * 'button'. When you write actual code you should probably be a little more * accepting of variance, but this is just a sample app. :) * * Most of this is boilerplate binding the controller to the UI. The bits that * specifically will be useful when using the BrowsingData API are contained in * `parseMilliseconds_`, `handleCallback_`, and `handleClick_`. * * @constructor */ var PopupController = function () { this.button_ = document.getElementById('button'); this.timeframe_ = document.getElementById('timeframe'); this.addListeners_(); }; PopupController.prototype = { /** * A cached reference to the button element. * * @type {Element} * @private */ button_: null, /** * A cached reference to the select element. * * @type {Element} * @private */ timeframe_: null, /** * Adds event listeners to the button in order to capture a user's click, and * perform some action in response. * * @private */ addListeners_: function () { this.button_.addEventListener('click', this.handleClick_.bind(this)); }, /** * Given a string, return milliseconds since epoch. If the string isn't * valid, returns undefined. * * @param {string} timeframe One of 'hour', 'day', 'week', '4weeks', or * 'forever'. * @returns {number} Milliseconds since epoch. * @private */ parseMilliseconds_: function (timeframe) { var now = new Date().getTime(); var milliseconds = { 'hour': 60 * 60 * 1000, 'day': 24 * 60 * 60 * 1000, 'week': 7 * 24 * 60 * 60 * 1000, '4weeks': 4 * 7 * 24 * 60 * 60 * 1000 }; if (milliseconds[timeframe]) return now - milliseconds[timeframe]; if (timeframe === 'forever') return 0; return null; }, /** * Handle a success/failure callback from the `browsingData` API methods, * updating the UI appropriately. * * @private */ handleCallback_: function () { var success = document.createElement('div'); success.classList.add('overlay'); success.setAttribute('role', 'alert'); success.textContent = 'Data has been cleared.'; document.body.appendChild(success); setTimeout(function() { success.classList.add('visible'); }, 10); setTimeout(function() { if (close === false) success.classList.remove('visible'); else window.close(); }, 4000); }, /** * When a user clicks the button, this method is called: it reads the current * state of `timeframe_` in order to pull a timeframe, then calls the clearing * method with appropriate arguments. * * @private */ handleClick_: function () { var removal_start = this.parseMilliseconds_(this.timeframe_.value); if (removal_start !== undefined) { this.button_.setAttribute('disabled', 'disabled'); this.button_.innerText = 'Clearing...'; chrome.browsingData.remove({ "since" : removal_start }, { "appcache": true, "cache": true, "cookies": true, "downloads": true, "fileSystems": true, "formData": true, "history": true, "indexedDB": true, "localStorage": true, "serverBoundCertificates": true, "pluginData": true, "passwords": true, "webSQL": true }, this.handleCallback_.bind(this)); } } }; document.addEventListener('DOMContentLoaded', function () { window.PC = new PopupController(); });