Index: ui/file_manager/file_manager/background/js/device_handler.js |
diff --git a/ui/file_manager/file_manager/background/js/device_handler.js b/ui/file_manager/file_manager/background/js/device_handler.js |
deleted file mode 100644 |
index ede54098f505c1ab065868d0e40aedc21991e81a..0000000000000000000000000000000000000000 |
--- a/ui/file_manager/file_manager/background/js/device_handler.js |
+++ /dev/null |
@@ -1,411 +0,0 @@ |
-// Copyright 2014 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. |
- |
-'use strict'; |
- |
-/** |
- * Handler of device event. |
- * @constructor |
- * @extends {cr.EventTarget} |
- */ |
-function DeviceHandler() { |
- cr.EventTarget.call(this); |
- |
- /** |
- * Map of device path and mount status of devices. |
- * @type {Object.<string, DeviceHandler.MountStatus>} |
- * @private |
- */ |
- this.mountStatus_ = {}; |
- |
- chrome.fileManagerPrivate.onDeviceChanged.addListener( |
- this.onDeviceChanged_.bind(this)); |
- chrome.fileManagerPrivate.onMountCompleted.addListener( |
- this.onMountCompleted_.bind(this)); |
- chrome.notifications.onButtonClicked.addListener( |
- this.onNotificationButtonClicked_.bind(this)); |
-} |
- |
-DeviceHandler.prototype = { |
- __proto__: cr.EventTarget.prototype |
-}; |
- |
-/** |
- * An event name trigerred when a user requests to navigate to a volume. |
- * The event object must have a volumeId property. |
- * @type {string} |
- * @const |
- */ |
-DeviceHandler.VOLUME_NAVIGATION_REQUESTED = 'volumenavigationrequested'; |
- |
-/** |
- * Notification type. |
- * @param {string} prefix Prefix of notification ID. |
- * @param {string} title String ID of title. |
- * @param {string} message String ID of message. |
- * @param {string=} opt_buttonLabel String ID of the button label. |
- * @constructor |
- */ |
-DeviceHandler.Notification = function(prefix, title, message, opt_buttonLabel) { |
- /** |
- * Prefix of notification ID. |
- * @type {string} |
- */ |
- this.prefix = prefix; |
- |
- /** |
- * String ID of title. |
- * @type {string} |
- */ |
- this.title = title; |
- |
- /** |
- * String ID of message. |
- * @type {string} |
- */ |
- this.message = message; |
- |
- /** |
- * String ID of button label. |
- * @type {?string} |
- */ |
- this.buttonLabel = opt_buttonLabel || null; |
- |
- /** |
- * Queue of API call. |
- * @type {AsyncUtil.Queue} |
- * @private |
- */ |
- this.queue_ = new AsyncUtil.Queue(); |
- |
- Object.seal(this); |
-}; |
- |
-/** |
- * @type {DeviceHandler.Notification} |
- * @const |
- */ |
-DeviceHandler.Notification.DEVICE_NAVIGATION = new DeviceHandler.Notification( |
- 'deviceNavigation', |
- 'REMOVABLE_DEVICE_DETECTION_TITLE', |
- 'REMOVABLE_DEVICE_NAVIGATION_MESSAGE', |
- 'REMOVABLE_DEVICE_NAVIGATION_BUTTON_LABEL'); |
- |
-/** |
- * @type {DeviceHandler.Notification} |
- * @const |
- */ |
-DeviceHandler.Notification.DEVICE_FAIL = new DeviceHandler.Notification( |
- 'deviceFail', |
- 'REMOVABLE_DEVICE_DETECTION_TITLE', |
- 'DEVICE_UNSUPPORTED_DEFAULT_MESSAGE'); |
- |
-/** |
- * @type {DeviceHandler.Notification} |
- * @const |
- */ |
-DeviceHandler.Notification.DEVICE_FAIL_UNKNOWN = new DeviceHandler.Notification( |
- 'deviceFail', |
- 'REMOVABLE_DEVICE_DETECTION_TITLE', |
- 'DEVICE_UNKNOWN_DEFAULT_MESSAGE', |
- 'DEVICE_UNKNOWN_BUTTON_LABEL'); |
- |
-/** |
- * @type {DeviceHandler.Notification} |
- * @const |
- */ |
-DeviceHandler.Notification.DEVICE_EXTERNAL_STORAGE_DISABLED = |
- new DeviceHandler.Notification( |
- 'deviceFail', |
- 'REMOVABLE_DEVICE_DETECTION_TITLE', |
- 'EXTERNAL_STORAGE_DISABLED_MESSAGE'); |
- |
-/** |
- * @type {DeviceHandler.Notification} |
- * @const |
- */ |
-DeviceHandler.Notification.DEVICE_HARD_UNPLUGGED = |
- new DeviceHandler.Notification( |
- 'hardUnplugged', |
- 'DEVICE_HARD_UNPLUGGED_TITLE', |
- 'DEVICE_HARD_UNPLUGGED_MESSAGE'); |
- |
-/** |
- * @type {DeviceHandler.Notification} |
- * @const |
- */ |
-DeviceHandler.Notification.FORMAT_START = new DeviceHandler.Notification( |
- 'formatStart', |
- 'FORMATTING_OF_DEVICE_PENDING_TITLE', |
- 'FORMATTING_OF_DEVICE_PENDING_MESSAGE'); |
- |
-/** |
- * @type {DeviceHandler.Notification} |
- * @const |
- */ |
-DeviceHandler.Notification.FORMAT_SUCCESS = new DeviceHandler.Notification( |
- 'formatSuccess', |
- 'FORMATTING_OF_DEVICE_FINISHED_TITLE', |
- 'FORMATTING_FINISHED_SUCCESS_MESSAGE'); |
- |
-/** |
- * @type {DeviceHandler.Notification} |
- * @const |
- */ |
-DeviceHandler.Notification.FORMAT_FAIL = new DeviceHandler.Notification( |
- 'formatFail', |
- 'FORMATTING_OF_DEVICE_FAILED_TITLE', |
- 'FORMATTING_FINISHED_FAILURE_MESSAGE'); |
- |
-/** |
- * Shows the notification for the device path. |
- * @param {string} devicePath Device path. |
- * @param {string=} opt_message Message overrides the default message. |
- * @return {string} Notification ID. |
- */ |
-DeviceHandler.Notification.prototype.show = function(devicePath, opt_message) { |
- var notificationId = this.makeId_(devicePath); |
- this.queue_.run(function(callback) { |
- this.showInternal_(notificationId, opt_message || null, callback); |
- }.bind(this)); |
- return notificationId; |
-}; |
- |
-/** |
- * Shows the notification for the device path. |
- * If the existing notification has been already shown, it does not anything. |
- * @param {string} devicePath Device path. |
- */ |
-DeviceHandler.Notification.prototype.showOnce = function(devicePath) { |
- var notificationId = this.makeId_(devicePath); |
- this.queue_.run(function(callback) { |
- chrome.notifications.getAll(function(idList) { |
- if (idList.indexOf(notificationId) !== -1) { |
- callback(); |
- return; |
- } |
- this.showInternal_(notificationId, null, callback); |
- }.bind(this)); |
- }); |
-}; |
- |
-/** |
- * Shows the notificaiton without using AsyncQueue. |
- * @param {string} notificationId Notification ID. |
- * @param {?string} message Message overriding the normal message. |
- * @param {function()} callback Callback to be invoked when the notification is |
- * created. |
- * @private |
- */ |
-DeviceHandler.Notification.prototype.showInternal_ = function( |
- notificationId, message, callback) { |
- var buttons = |
- this.buttonLabel ? [{title: str(this.buttonLabel)}] : undefined; |
- chrome.notifications.create( |
- notificationId, |
- { |
- type: 'basic', |
- title: str(this.title), |
- message: message || str(this.message), |
- iconUrl: chrome.runtime.getURL('/common/images/icon96.png'), |
- buttons: buttons |
- }, |
- callback); |
-}; |
- |
-/** |
- * Hides the notification for the device path. |
- * @param {string} devicePath Device path. |
- */ |
-DeviceHandler.Notification.prototype.hide = function(devicePath) { |
- this.queue_.run(function(callback) { |
- chrome.notifications.clear(this.makeId_(devicePath), callback); |
- }.bind(this)); |
-}; |
- |
-/** |
- * Makes a notification ID for the device path. |
- * @param {string} devicePath Device path. |
- * @return {string} Notification ID. |
- * @private |
- */ |
-DeviceHandler.Notification.prototype.makeId_ = function(devicePath) { |
- return this.prefix + ':' + devicePath; |
-}; |
- |
-/** |
- * Handles notifications from C++ sides. |
- * @param {DeviceEvent} event Device event. |
- * @private |
- */ |
-DeviceHandler.prototype.onDeviceChanged_ = function(event) { |
- switch (event.type) { |
- case 'disabled': |
- DeviceHandler.Notification.DEVICE_EXTERNAL_STORAGE_DISABLED.show( |
- event.devicePath); |
- break; |
- case 'removed': |
- DeviceHandler.Notification.DEVICE_FAIL.hide(event.devicePath); |
- DeviceHandler.Notification.DEVICE_EXTERNAL_STORAGE_DISABLED.hide( |
- event.devicePath); |
- delete this.mountStatus_[event.devicePath]; |
- break; |
- case 'hard_unplugged': |
- DeviceHandler.Notification.DEVICE_HARD_UNPLUGGED.show( |
- event.devicePath); |
- break; |
- case 'format_start': |
- DeviceHandler.Notification.FORMAT_START.show(event.devicePath); |
- break; |
- case 'format_success': |
- DeviceHandler.Notification.FORMAT_START.hide(event.devicePath); |
- DeviceHandler.Notification.FORMAT_SUCCESS.show(event.devicePath); |
- break; |
- case 'format_fail': |
- DeviceHandler.Notification.FORMAT_START.hide(event.devicePath); |
- DeviceHandler.Notification.FORMAT_FAIL.show(event.devicePath); |
- break; |
- default: |
- console.error('Unknown event tyep: ' + event.type); |
- break; |
- } |
-}; |
- |
-/** |
- * Mount status for the device. |
- * Each multi-partition devices can obtain multiple mount completed events. |
- * This status shows what results are already obtained for the device. |
- * @enum {string} |
- * @const |
- */ |
-DeviceHandler.MountStatus = { |
- // There is no mount results on the device. |
- NO_RESULT: 'noResult', |
- // There is no error on the device. |
- SUCCESS: 'success', |
- // There is only parent errors, that can be overridden by child results. |
- ONLY_PARENT_ERROR: 'onlyParentError', |
- // There is one child error. |
- CHILD_ERROR: 'childError', |
- // There is multiple child results and at least one is failure. |
- MULTIPART_ERROR: 'multipartError' |
-}; |
-Object.freeze(DeviceHandler.MountStatus); |
- |
-/** |
- * Handles mount completed events to show notifications for removable devices. |
- * @param {MountCompletedEvent} event Mount completed event. |
- * @private |
- */ |
-DeviceHandler.prototype.onMountCompleted_ = function(event) { |
- // If this is remounting, which happens when resuming ChromeOS, the device has |
- // already inserted to the computer. So we suppress the notification. |
- var volume = event.volumeMetadata; |
- if (!volume.deviceType || !volume.devicePath || !event.shouldNotify) |
- return; |
- |
- // If the current volume status is succeed and it should be handled in |
- // Files.app, show the notification to navigate the volume. |
- if (event.eventType === 'mount' && event.status === 'success') { |
- DeviceHandler.Notification.DEVICE_NAVIGATION.show(volume.devicePath); |
- } else if (event.eventType === 'unmount') { |
- DeviceHandler.Notification.DEVICE_NAVIGATION.hide(volume.devicePath); |
- } |
- |
- var getFirstStatus = function(event) { |
- if (event.status === 'success') |
- return DeviceHandler.MountStatus.SUCCESS; |
- else if (event.volumeMetadata.isParentDevice) |
- return DeviceHandler.MountStatus.ONLY_PARENT_ERROR; |
- else |
- return DeviceHandler.MountStatus.CHILD_ERROR; |
- }; |
- |
- // Update the current status. |
- if (!this.mountStatus_[volume.devicePath]) |
- this.mountStatus_[volume.devicePath] = DeviceHandler.MountStatus.NO_RESULT; |
- switch (this.mountStatus_[volume.devicePath]) { |
- // If the multipart error message has already shown, do nothing because the |
- // message does not changed by the following mount results. |
- case DeviceHandler.MountStatus.MULTIPART_ERROR: |
- return; |
- // If this is the first result, hide the scanning notification. |
- case DeviceHandler.MountStatus.NO_RESULT: |
- this.mountStatus_[volume.devicePath] = getFirstStatus(event); |
- break; |
- // If there are only parent errors, and the new result is child's one, hide |
- // the parent error. (parent device contains partition table, which is |
- // unmountable) |
- case DeviceHandler.MountStatus.ONLY_PARENT_ERROR: |
- if (!volume.isParentDevice) |
- DeviceHandler.Notification.DEVICE_FAIL.hide(volume.devicePath); |
- this.mountStatus_[volume.devicePath] = getFirstStatus(event); |
- break; |
- // We have a multi-partition device for which at least one mount |
- // failed. |
- case DeviceHandler.MountStatus.SUCCESS: |
- case DeviceHandler.MountStatus.CHILD_ERROR: |
- if (this.mountStatus_[volume.devicePath] === |
- DeviceHandler.MountStatus.SUCCESS && |
- event.status === 'success') { |
- this.mountStatus_[volume.devicePath] = |
- DeviceHandler.MountStatus.SUCCESS; |
- } else { |
- this.mountStatus_[volume.devicePath] = |
- DeviceHandler.MountStatus.MULTIPART_ERROR; |
- } |
- break; |
- } |
- |
- if (event.eventType === 'unmount') |
- return; |
- |
- // Show the notification for the current errors. |
- // If there is no error, do not show/update the notification. |
- var message; |
- switch (this.mountStatus_[volume.devicePath]) { |
- case DeviceHandler.MountStatus.MULTIPART_ERROR: |
- message = volume.deviceLabel ? |
- strf('MULTIPART_DEVICE_UNSUPPORTED_MESSAGE', volume.deviceLabel) : |
- str('MULTIPART_DEVICE_UNSUPPORTED_DEFAULT_MESSAGE'); |
- DeviceHandler.Notification.DEVICE_FAIL.show( |
- volume.devicePath, |
- message); |
- break; |
- case DeviceHandler.MountStatus.CHILD_ERROR: |
- case DeviceHandler.MountStatus.ONLY_PARENT_ERROR: |
- if (event.status === 'error_unsupported_filesystem') { |
- message = volume.deviceLabel ? |
- strf('DEVICE_UNSUPPORTED_MESSAGE', volume.deviceLabel) : |
- str('DEVICE_UNSUPPORTED_DEFAULT_MESSAGE'); |
- DeviceHandler.Notification.DEVICE_FAIL.show( |
- volume.devicePath, |
- message); |
- } else { |
- message = volume.deviceLabel ? |
- strf('DEVICE_UNKNOWN_MESSAGE', volume.deviceLabel) : |
- str('DEVICE_UNKNOWN_DEFAULT_MESSAGE'); |
- DeviceHandler.Notification.DEVICE_FAIL_UNKNOWN.show( |
- volume.devicePath, |
- message); |
- } |
- } |
-}; |
- |
-/** |
- * Handles notification button click. |
- * @param {string} id ID of the notification. |
- * @private |
- */ |
-DeviceHandler.prototype.onNotificationButtonClicked_ = function(id) { |
- var pos = id.indexOf(':'); |
- var type = id.substr(0, pos); |
- var devicePath = id.substr(pos + 1); |
- if (type === 'deviceNavigation' || type === 'deviceFail') { |
- chrome.notifications.clear(id, function() {}); |
- var event = new Event(DeviceHandler.VOLUME_NAVIGATION_REQUESTED); |
- event.devicePath = devicePath; |
- this.dispatchEvent(event); |
- } |
-}; |