Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(50)

Unified Diff: chrome/browser/resources/image_burner.js

Issue 8221023: Add Content-security-policy to chrome://imageburner (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 9 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/resources/image_burner.js
===================================================================
--- chrome/browser/resources/image_burner.js (revision 0)
+++ chrome/browser/resources/image_burner.js (revision 0)
@@ -0,0 +1,338 @@
+// 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.
+
+var localStrings;
+var browserBridge;
+
+// Class that keeps track of current burn process state.
+function State(strings) {
+ this.setStrings(strings);
+ this.changeState(State.StatesEnum.DEVICE_NONE);
+}
+
+State.StatesEnum = {
+ DEVICE_NONE : {
+ cssState : "device-detected-none",
+ },
+ DEVICE_USB : {
+ cssState : "device-detected-usb warning",
+ },
+ DEVICE_SD : {
+ cssState : "device-detected-sd warning",
+ },
+ DEVICE_MUL : {
+ cssState: "device-detected-mul warning",
+ },
+ ERROR_NO_NETWORK : {
+ cssState : "warning-no-conf",
+ },
+ ERROR_DEVICE_TOO_SMALL : {
+ cssState : "warning-no-conf",
+ },
+ PROGRESS_DOWNLOAD : {
+ cssState : "progress progress-canceble",
+ },
+ PROGRESS_UNZIP : {
+ cssState : "progress progress-canceble",
+ },
+ PROGRESS_BURN : {
+ cssState : "progress",
+ },
+ FAIL : {
+ cssState : "error",
+ },
+ SUCCESS : {
+ cssState : "success",
+ },
+};
+
+State.prototype = {
+ setStrings: function(strings) {
+ State.StatesEnum.DEVICE_NONE.statusText =
+ strings.getString('statusDevicesNone');
+ State.StatesEnum.DEVICE_NONE.warningText =
+ strings.getString('warningDevicesNone');
+ State.StatesEnum.DEVICE_USB.statusText =
+ strings.getString('statusDeviceUSB');
+ State.StatesEnum.DEVICE_SD.statusText = strings.getString('statusDeviceSD');
+ State.StatesEnum.DEVICE_MUL.statusText =
+ strings.getString('statusDevicesMultiple');
+ State.StatesEnum.ERROR_NO_NETWORK.statusText =
+ strings.getString('statusNoConnection');
+ State.StatesEnum.ERROR_NO_NETWORK.warningText =
+ strings.getString('warningNoConnection');
+ State.StatesEnum.ERROR_DEVICE_TOO_SMALL.statusText =
+ strings.getString('statusNoSpace');
+ State.StatesEnum.PROGRESS_DOWNLOAD.statusText =
+ strings.getString('statusDownloading');
+ State.StatesEnum.PROGRESS_UNZIP.statusText =
+ strings.getString('statusUnzip');
+ State.StatesEnum.PROGRESS_BURN.statusText = strings.getString('statusBurn');
+ State.StatesEnum.FAIL.statusText = strings.getString('statusError');
+ State.StatesEnum.SUCCESS.statusText = strings.getString('statusSuccess');
+ State.StatesEnum.SUCCESS.warningText = strings.getString('warningSuccess');
+ },
+
+ changeState: function(newState) {
+ if (newState == this.state)
+ return;
+ this.state = newState;
+
+ $('main-content').className = this.state.cssState;
+
+ $('status-text').textContent = this.state.statusText;
+
+ if (newState.warningText) {
+ $('warning-text').textContent = this.state.warningText;
+ }
+
+ if (this.isInitialState() && this.state != State.StatesEnum.DEVICE_NONE) {
+ $('warning-button').textContent = localStrings.getString('confirmButton');
+ } else if (this.state == State.StatesEnum.FAIL) {
+ $('warning-button').textContent =
+ localStrings.getString('retryButton');
+ }
+ },
+
+ gotoInitialState: function(deviceCount) {
+ if (deviceCount == 0) {
+ this.changeState(State.StatesEnum.DEVICE_NONE);
+ } else if (deviceCount == 1) {
+ this.changeState(State.StatesEnum.DEVICE_USB);
+ } else {
+ this.changeState(State.StatesEnum.DEVICE_MUL);
+ }
+ },
+
+ isInitialState: function() {
+ return (this.state == State.StatesEnum.DEVICE_NONE ||
+ this.state == State.StatesEnum.DEVICE_USB ||
+ this.state == State.StatesEnum.DEVICE_SD ||
+ this.state == State.StatesEnum.DEVICE_MUL);
+ },
+
+ equals: function(stateName) {
+ return this.state == stateName;
+ }
+};
+
+// Class that keeps track of available devices.
+function DeviceSelection() {
+ this.deviceCount = 0;
+};
+
+DeviceSelection.prototype = {
+ clearSelectList: function(list) {
+ list.innerHtml = '';
+ },
+
+ showDeviceSelection: function() {
+ if (this.deviceCount == 0) {
+ this.selectedDevice = undefined;
+ } else {
+ var devices = document.getElementsByClassName('selection-element');
+ this.selectDevice(devices[0].devicePath);
+ }
+ return this.deviceCount;
+ },
+
+ onDeviceSelected: function(label, filePath, devicePath) {
+ $('warning-button').onclick =
+ browserBridge.sendBurnImageMessage.bind(browserBridge, filePath,
+ devicePath);
+
+ this.selectedDevice = devicePath;
+
+ $('warning-text').textContent =
+ localStrings.getStringF('warningDevices', label);
+ },
+
+ selectDevice: function(path) {
+ var element = $('radio ' + path);
+ element.checked = true;
+ element.onclick.apply(element);
+ },
+
+ createNewDeviceElement: function(device) {
+ var element = document.createElement('li');
+ var radioButton = document.createElement('input');
+ radioButton.type = 'radio';
Evan Stade 2011/10/11 21:35:23 all of this would (probably) be easier to read if
+ radioButton.name = 'device';
+ radioButton.value = device.label;
+ radioButton.id = 'radio ' + device.devicePath;
+ radioButton.className = 'float-start';
+ var deviceLabelText = document.createElement('p');
+ deviceLabelText.textContent = device.label;
+ deviceLabelText.className = 'select-option float-start';
+ var newLine = document.createElement('div');
+ newLine.className = 'new-line';
+ element.appendChild(radioButton);
+ element.appendChild(deviceLabelText);
+ element.appendChild(newLine);
+ element.id = 'select ' + device.devicePath;
Evan Stade 2011/10/11 21:35:23 an id with a space? Even if it works, it's out of
+ element.devicePath = device.devicePath;
+ element.className = 'selection-element';
+ radioButton.onclick = this.onDeviceSelected.bind(this,
+ device.label, device.filePath, device.devicePath);
+ return element;
+ },
+
+ getDevicesCallback: function(devices) {
+ var selectListDOM = $('device-selection');
+ this.clearSelectList(selectListDOM);
+ this.deviceCount = devices.length;
+ if (devices.length > 0) {
+ for (var i = 0; i < devices.length; i++) {
+ var element = this.createNewDeviceElement(devices[i]);
+ selectListDOM.appendChild(element);
+ }
+ this.selectDevice(devices[0].devicePath);
+ } else {
+ this.selectedDevice = undefined;
+ }
+ return this.deviceCount;
+ },
+
+ deviceAdded: function(device, allowSelect) {
+ var selectListDOM = $('device-selection');
+ selectListDOM.appendChild(this.createNewDeviceElement(device));
+ this.deviceCount++;
+ if (allowSelect && this.deviceCount == 1)
+ this.selectDevice(device.devicePath);
+ return this.deviceCount;
+ },
+
+ deviceRemoved: function(devicePath, allowSelect) {
+ var deviceSelectElement = $('select ' + devicePath);
+ deviceSelectElement.parentNode.removeChild(deviceSelectElement);
+ this.deviceCount--;
+ var devices = document.getElementsByClassName('selection-element');
+
+ if (allowSelect) {
+ if (devices.length > 0) {
+ if (this.selectedDevice == devicePath)
+ this.selectDevice(devices[0].devicePath);
+ } else {
+ this.selectedDevice = undefined;
+ }
+ }
+ return this.deviceCount;
+ }
+};
+
+// Class that handles communication with chrome.
+function BrowserBridge() {
+ this.currentState = new State(localStrings);
+ this.devices = new DeviceSelection();
+ // We will use these often so it makes sence making them class members to
+ // avoid frequent document.getElementById calls.
+ this.progressElement = $('progress-div');
+ this.progressText = $('progress-text');
+ this.progressTimeLeftText = $('pending-time');
+};
+
+BrowserBridge.prototype = {
+ sendCancelMessage: function() {
+ chrome.send("cancelBurnImage");
+ },
+
+ sendGetDevicesMessage: function() {
+ chrome.send("getDevices");
+ },
+
+ sendWebuiInitializedMessage: function() {
+ chrome.send("webuiInitialized");
+ },
+
+ sendBurnImageMessage: function(filePath, devicePath) {
+ chrome.send('burnImage', [devicePath, filePath]);
+ },
+
+ reportSuccess: function() {
+ this.currentState.changeState(State.StatesEnum.SUCCESS);
+ },
+
+ reportFail: function(errorMessage) {
+ this.currentState.changeState(State.StatesEnum.FAIL);
+ $('warning-text').textContent = errorMessage;
+ $('warning-button').onclick = this.onBurnRetry.bind(this);
+ },
+
+ deviceAdded: function(device) {
Evan Stade 2011/10/11 21:35:23 every one of these functions and parameters should
+ var inInitialState = this.currentState.isInitialState();
+ var deviceCount = this.devices.deviceAdded(device, inInitialState);
+ if (inInitialState)
+ this.currentState.gotoInitialState(deviceCount);
+ },
+
+ deviceRemoved: function(device) {
+ var inInitialState = this.currentState.isInitialState();
+ var deviceCount = this.devices.deviceRemoved(device, inInitialState);
+ if (inInitialState)
+ this.currentState.gotoInitialState(deviceCount);
+ },
+
+ getDevicesCallback: function(devices) {
+ var deviceCount = this.devices.getDevicesCallback(devices);
+ this.currentState.gotoInitialState(deviceCount);
+ this.sendWebuiInitializedMessage();
+ },
+
+ updateProgress: function(update_signal) {
+ if (update_signal.progressType == 'download' &&
+ !this.currentState.equals(State.StatesEnum.PROGRESS_DOWNLOAD)) {
+ this.currentState.changeState(State.StatesEnum.PROGRESS_DOWNLOAD);
+ } else if (update_signal.progressType == 'unzip' &&
+ !this.currentState.equals(State.StatesEnum.PROGRESS_UNZIP)) {
+ this.currentState.changeState(State.StatesEnum.PROGRESS_UNZIP);
+ } else if (update_signal.progressType == 'burn' &&
+ !this.currentState.equals(State.StatesEnum.PROGRESS_BURN)) {
+ this.currentState.changeState(State.StatesEnum.PROGRESS_BURN);
+ }
+
+ if (!(update_signal.amountTotal > 0)) {
+ this.progressElement.removeAttribute('value');
+ } else {
+ this.progressElement.value = update_signal.amountFinished;
+ this.progressElement.max = update_signal.amountTotal;
+ }
+
+ this.progressText.textContent = update_signal.progressText;
+ this.progressTimeLeftText.textContent = update_signal.timeLeftText;
+ },
+
+ reportNoNetwork: function() {
+ this.currentState.changeState(State.StatesEnum.ERROR_NO_NETWORK);
+ },
+
+ reportNetworkDetected: function() {
+ if (this.currentState.equals(State.StatesEnum.ERROR_NO_NETWORK)) {
+ var deviceCount = this.devices.showDeviceSelection();
+ this.currentState.gotoInitialState(deviceCount);
+ }
+ },
+
+ reportDeviceTooSmall: function(device_size) {
Evan Stade 2011/10/11 21:35:23 deviceSize
+ this.currentState.changeState(State.StatesEnum.ERROR_DEVICE_TOO_SMALL);
+ $('warning-text').textContent =
+ localStrings.getStringF('warningNoSpace', device_size);
+ },
+
+ // Processes click on "Retry" button in FAIL state.
+ onBurnRetry: function () {
+ var deviceCount = this.devices.showDeviceSelection();
+ this.currentState.gotoInitialState(deviceCount);
+ }
+};
+
+document.addEventListener('DOMContentLoaded', function() {
+ localStrings = new LocalStrings();
+ browserBridge = new BrowserBridge();
+
+ jstProcess(new JsEvalContext(templateData), $("more-info-link"));
+
+ $('cancel-button').onclick =
+ browserBridge.sendCancelMessage.bind(browserBridge);
+ browserBridge.sendGetDevicesMessage();
+});
Property changes on: chrome/browser/resources/image_burner.js
___________________________________________________________________
Added: svn:eol-style
+ LF

Powered by Google App Engine
This is Rietveld 408576698