| Index: chrome/browser/resources/file_manager/js/action_choice.js
|
| diff --git a/chrome/browser/resources/file_manager/js/action_choice.js b/chrome/browser/resources/file_manager/js/action_choice.js
|
| deleted file mode 100644
|
| index 4c5bec5e02fd89196d62da31939742da26443683..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/resources/file_manager/js/action_choice.js
|
| +++ /dev/null
|
| @@ -1,525 +0,0 @@
|
| -// Copyright (c) 2013 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';
|
| -
|
| -document.addEventListener('DOMContentLoaded', function() {
|
| - ActionChoice.load();
|
| -});
|
| -
|
| -/**
|
| - * The main ActionChoice object.
|
| - *
|
| - * @param {HTMLElement} dom Container.
|
| - * @param {Object} params Parameters.
|
| - * @constructor
|
| - */
|
| -function ActionChoice(dom, params) {
|
| - this.dom_ = dom;
|
| - this.params_ = params;
|
| - this.document_ = this.dom_.ownerDocument;
|
| - this.metadataCache_ = this.params_.metadataCache;
|
| - this.volumeManager_ = new VolumeManagerWrapper(
|
| - VolumeManagerWrapper.DriveEnabledStatus.DRIVE_ENABLED);
|
| - this.volumeManager_.addEventListener('externally-unmounted',
|
| - this.onDeviceUnmounted_.bind(this));
|
| - this.initDom_();
|
| -
|
| - // Load defined actions and remembered choice, then initialize volumes.
|
| - this.actions_ = [];
|
| - this.actionsById_ = {};
|
| - this.rememberedChoice_ = null;
|
| -
|
| - ActionChoiceUtil.getDefinedActions(loadTimeData, function(actions) {
|
| - for (var i = 0; i < actions.length; i++) {
|
| - this.registerAction_(actions[i]);
|
| - }
|
| -
|
| - this.viewFilesAction_ = this.actionsById_['view-files'];
|
| - this.importPhotosToDriveAction_ =
|
| - this.actionsById_['import-photos-to-drive'];
|
| - this.watchSingleVideoAction_ =
|
| - this.actionsById_['watch-single-video'];
|
| -
|
| - // Special case: if Google+ Photos is installed, then do not show Drive.
|
| - for (var i = 0; i < actions.length; i++) {
|
| - if (actions[i].extensionId == ActionChoice.GPLUS_PHOTOS_EXTENSION_ID) {
|
| - this.importPhotosToDriveAction_.hidden = true;
|
| - break;
|
| - }
|
| - }
|
| -
|
| - if (this.params_.advancedMode) {
|
| - // In the advanced mode, skip auto-choice.
|
| - this.initializeVolumes_();
|
| - } else {
|
| - // Get the remembered action before initializing volumes.
|
| - ActionChoiceUtil.getRememberedActionId(function(actionId) {
|
| - this.rememberedChoice_ = actionId;
|
| - this.initializeVolumes_();
|
| - }.bind(this));
|
| - }
|
| - this.renderList_();
|
| - }.bind(this));
|
| -
|
| - // Try to render, what is already available.
|
| - this.renderList_();
|
| -}
|
| -
|
| -ActionChoice.prototype = { __proto__: cr.EventTarget.prototype };
|
| -
|
| -/**
|
| - * The number of previews shown.
|
| - * @type {number}
|
| - * @const
|
| - */
|
| -ActionChoice.PREVIEW_COUNT = 3;
|
| -
|
| -/**
|
| - * Extension id of Google+ Photos app.
|
| - * @type {string}
|
| - * @const
|
| - */
|
| -ActionChoice.GPLUS_PHOTOS_EXTENSION_ID = 'efjnaogkjbogokcnohkmnjdojkikgobo';
|
| -
|
| -/**
|
| - * Loads app in the document body.
|
| - * @param {Object=} opt_params Parameters.
|
| - */
|
| -ActionChoice.load = function(opt_params) {
|
| - ImageUtil.metrics = metrics;
|
| -
|
| - var hash = location.hash ? decodeURIComponent(location.hash.substr(1)) : '';
|
| - var query =
|
| - location.search ? decodeURIComponent(location.search.substr(1)) : '';
|
| - var params = opt_params || {};
|
| - if (!params.source) params.source = hash;
|
| - if (!params.advancedMode) params.advancedMode = (query == 'advanced-mode');
|
| - if (!params.metadataCache) params.metadataCache = MetadataCache.createFull();
|
| -
|
| - chrome.fileBrowserPrivate.getStrings(function(strings) {
|
| - loadTimeData.data = strings;
|
| - i18nTemplate.process(document, loadTimeData);
|
| - var dom = document.querySelector('.action-choice');
|
| - ActionChoice.instance = new ActionChoice(dom, params);
|
| - });
|
| -};
|
| -
|
| -/**
|
| - * Registers an action.
|
| - * @param {Object} action Action item.
|
| - * @private
|
| - */
|
| -ActionChoice.prototype.registerAction_ = function(action) {
|
| - this.actions_.push(action);
|
| - this.actionsById_[action.id] = action;
|
| -};
|
| -
|
| -/**
|
| - * Initializes the source and Drive. If the remembered choice is available,
|
| - * then performs the action.
|
| - * @private
|
| - */
|
| -ActionChoice.prototype.initializeVolumes_ = function() {
|
| - var checkDriveFinished = false;
|
| - var loadSourceFinished = false;
|
| -
|
| - var maybeRunRememberedAction = function() {
|
| - if (!checkDriveFinished || !loadSourceFinished)
|
| - return;
|
| -
|
| - // Run the remembered action if it is available.
|
| - if (this.rememberedChoice_) {
|
| - var action = this.actionsById_[this.rememberedChoice_];
|
| - if (action && !action.disabled)
|
| - this.runAction_(action);
|
| - }
|
| - }.bind(this);
|
| -
|
| - var onCheckDriveFinished = function() {
|
| - checkDriveFinished = true;
|
| - maybeRunRememberedAction();
|
| - };
|
| -
|
| - var onLoadSourceFinished = function() {
|
| - loadSourceFinished = true;
|
| - maybeRunRememberedAction();
|
| - };
|
| -
|
| - this.checkDrive_(onCheckDriveFinished);
|
| - this.loadSource_(this.params_.source, onLoadSourceFinished);
|
| -};
|
| -
|
| -/**
|
| - * One-time initialization of dom elements.
|
| - * @private
|
| - */
|
| -ActionChoice.prototype.initDom_ = function() {
|
| - this.list_ = new cr.ui.List();
|
| - this.list_.id = 'actions-list';
|
| - this.document_.querySelector('.choices').appendChild(this.list_);
|
| -
|
| - var self = this; // .bind(this) doesn't work on constructors.
|
| - this.list_.itemConstructor = function(item) {
|
| - return self.renderItem(item);
|
| - };
|
| -
|
| - this.list_.selectionModel = new cr.ui.ListSingleSelectionModel();
|
| - this.list_.dataModel = new cr.ui.ArrayDataModel([]);
|
| - this.list_.autoExpands = true;
|
| -
|
| - var acceptActionBound = function() {
|
| - this.acceptAction_();
|
| - }.bind(this);
|
| - this.list_.activateItemAtIndex = acceptActionBound;
|
| - this.list_.addEventListener('click', acceptActionBound);
|
| -
|
| - this.previews_ = this.document_.querySelector('.previews');
|
| - this.counter_ = this.document_.querySelector('.counter');
|
| - this.document_.addEventListener('keydown', this.onKeyDown_.bind(this));
|
| -
|
| - metrics.startInterval('PhotoImport.Load');
|
| - this.dom_.setAttribute('loading', '');
|
| -};
|
| -
|
| -/**
|
| - * Renders the list.
|
| - * @private
|
| - */
|
| -ActionChoice.prototype.renderList_ = function() {
|
| - var currentItem = this.list_.dataModel.item(
|
| - this.list_.selectionModel.selectedIndex);
|
| -
|
| - this.list_.startBatchUpdates();
|
| - this.list_.dataModel.splice(0, this.list_.dataModel.length);
|
| -
|
| - for (var i = 0; i < this.actions_.length; i++) {
|
| - if (!this.actions_[i].hidden)
|
| - this.list_.dataModel.push(this.actions_[i]);
|
| - }
|
| -
|
| - for (var i = 0; i < this.list_.dataModel.length; i++) {
|
| - if (this.list_.dataModel.item(i) == currentItem) {
|
| - this.list_.selectionModel.selectedIndex = i;
|
| - break;
|
| - }
|
| - }
|
| -
|
| - this.list_.endBatchUpdates();
|
| -};
|
| -
|
| -/**
|
| - * Renders an item in the list.
|
| - * @param {Object} item Item to render.
|
| - * @return {Element} DOM element with representing the item.
|
| - */
|
| -ActionChoice.prototype.renderItem = function(item) {
|
| - var result = this.document_.createElement('li');
|
| -
|
| - var div = this.document_.createElement('div');
|
| - if (item.disabled && item.disabledTitle)
|
| - div.textContent = item.disabledTitle;
|
| - else
|
| - div.textContent = item.title;
|
| -
|
| - if (item.class)
|
| - div.classList.add(item.class);
|
| - if (item.icon100 && item.icon200)
|
| - div.style.backgroundImage = '-webkit-image-set(' +
|
| - 'url(' + item.icon100 + ') 1x,' +
|
| - 'url(' + item.icon200 + ') 2x)';
|
| - if (item.disabled)
|
| - div.classList.add('disabled');
|
| -
|
| - cr.defineProperty(result, 'lead', cr.PropertyKind.BOOL_ATTR);
|
| - cr.defineProperty(result, 'selected', cr.PropertyKind.BOOL_ATTR);
|
| - result.appendChild(div);
|
| -
|
| - return result;
|
| -};
|
| -
|
| -/**
|
| - * Checks whether Drive is reachable.
|
| - *
|
| - * @param {function()} callback Completion callback.
|
| - * @private
|
| - */
|
| -ActionChoice.prototype.checkDrive_ = function(callback) {
|
| - this.volumeManager_.ensureInitialized(function() {
|
| - this.importPhotosToDriveAction_.disabled =
|
| - !this.volumeManager_.getVolumeInfo(RootDirectory.DRIVE);
|
| - this.renderList_();
|
| - callback();
|
| - }.bind(this));
|
| -};
|
| -
|
| -/**
|
| - * Load the source contents.
|
| - *
|
| - * @param {string} source Path to source.
|
| - * @param {function()} callback Completion callback.
|
| - * @private
|
| - */
|
| -ActionChoice.prototype.loadSource_ = function(source, callback) {
|
| - var onTraversed = function(results) {
|
| - metrics.recordInterval('PhotoImport.Scan');
|
| - var videos = results.filter(FileType.isVideo);
|
| - if (videos.length == 1) {
|
| - this.singleVideo_ = videos[0];
|
| - this.watchSingleVideoAction_.title = loadTimeData.getStringF(
|
| - 'ACTION_CHOICE_WATCH_SINGLE_VIDEO', videos[0].name);
|
| - this.watchSingleVideoAction_.hidden = false;
|
| - this.watchSingleVideoAction_.disabled = false;
|
| - this.renderList_();
|
| - }
|
| -
|
| - var mediaFiles = results.filter(FileType.isImageOrVideo);
|
| - if (mediaFiles.length == 0) {
|
| - // If we have no media files, the only choice is view files. So, don't
|
| - // confuse user with a single choice, and just open file manager.
|
| - this.viewFiles_();
|
| - this.recordAction_('view-files-auto');
|
| - this.close_();
|
| - }
|
| -
|
| - if (mediaFiles.length < ActionChoice.PREVIEW_COUNT) {
|
| - this.counter_.textContent = loadTimeData.getStringF(
|
| - 'ACTION_CHOICE_COUNTER_NO_MEDIA', results.length);
|
| - } else {
|
| - this.counter_.textContent = loadTimeData.getStringF(
|
| - 'ACTION_CHOICE_COUNTER', mediaFiles.length);
|
| - }
|
| - var previews = mediaFiles.length ? mediaFiles : results;
|
| - var previewsCount = Math.min(ActionChoice.PREVIEW_COUNT, previews.length);
|
| - this.renderPreview_(previews, previewsCount);
|
| - callback();
|
| - }.bind(this);
|
| -
|
| - var onEntry = function(entry) {
|
| - this.sourceEntry_ = entry;
|
| - this.document_.querySelector('title').textContent = entry.name;
|
| -
|
| - var volumeInfo = this.volumeManager_.getVolumeInfo(entry.fullPath);
|
| - var deviceType = volumeInfo && volumeInfo.deviceType;
|
| - if (deviceType != 'sd') deviceType = 'usb';
|
| - this.dom_.querySelector('.device-type').setAttribute('device-type',
|
| - deviceType);
|
| - this.dom_.querySelector('.loading-text').textContent =
|
| - loadTimeData.getString('ACTION_CHOICE_LOADING_' +
|
| - deviceType.toUpperCase());
|
| -
|
| - var entryList = [];
|
| - util.traverseTree(
|
| - entry,
|
| - function(traversedEntry) {
|
| - if (!FileType.isVisible(traversedEntry))
|
| - return false;
|
| - entryList.push(traversedEntry);
|
| - return true;
|
| - },
|
| - function() {
|
| - onTraversed(entryList);
|
| - },
|
| - function(error) {
|
| - console.error(
|
| - 'Failed to traverse [' + entry.fullPath + ']: ' + error.code);
|
| - });
|
| - }.bind(this);
|
| -
|
| - this.sourceEntry_ = null;
|
| - metrics.startInterval('PhotoImport.Scan');
|
| - this.volumeManager_.ensureInitialized(function() {
|
| - this.volumeManager_.resolvePath(
|
| - source, onEntry,
|
| - function(error) {
|
| - this.recordAction_('error');
|
| - this.close_();
|
| - }.bind(this));
|
| - }.bind(this));
|
| -};
|
| -
|
| -/**
|
| - * Renders a preview for a media entry.
|
| - * @param {Array.<FileEntry>} entries The entries.
|
| - * @param {number} count Remaining count.
|
| - * @private
|
| - */
|
| -ActionChoice.prototype.renderPreview_ = function(entries, count) {
|
| - var entry = entries.shift();
|
| - var box = this.document_.createElement('div');
|
| - box.className = 'img-container';
|
| -
|
| - var done = function() {
|
| - this.dom_.removeAttribute('loading');
|
| - metrics.recordInterval('PhotoImport.Load');
|
| - }.bind(this);
|
| -
|
| - var onSuccess = function() {
|
| - this.previews_.appendChild(box);
|
| - if (--count == 0) {
|
| - done();
|
| - } else {
|
| - this.renderPreview_(entries, count);
|
| - }
|
| - }.bind(this);
|
| -
|
| - var onError = function() {
|
| - if (entries.length == 0) {
|
| - // Append one image with generic thumbnail.
|
| - this.previews_.appendChild(box);
|
| - done();
|
| - } else {
|
| - this.renderPreview_(entries, count);
|
| - }
|
| - }.bind(this);
|
| -
|
| - this.metadataCache_.get(entry, 'thumbnail|filesystem',
|
| - function(metadata) {
|
| - new ThumbnailLoader(entry.toURL(),
|
| - ThumbnailLoader.LoaderType.IMAGE,
|
| - metadata).load(
|
| - box,
|
| - ThumbnailLoader.FillMode.FILL,
|
| - ThumbnailLoader.OptimizationMode.NEVER_DISCARD,
|
| - onSuccess,
|
| - onError,
|
| - onError);
|
| - });
|
| -};
|
| -
|
| -/**
|
| - * Closes the window.
|
| - * @private
|
| - */
|
| -ActionChoice.prototype.close_ = function() {
|
| - window.close();
|
| -};
|
| -
|
| -/**
|
| - * Keydown event handler.
|
| - * @param {Event} e The event.
|
| - * @private
|
| - */
|
| -ActionChoice.prototype.onKeyDown_ = function(e) {
|
| - switch (util.getKeyModifiers(e) + e.keyCode) {
|
| - case '13':
|
| - this.acceptAction_();
|
| - break;
|
| - case '27':
|
| - this.recordAction_('close');
|
| - this.close_();
|
| - break;
|
| - }
|
| -};
|
| -
|
| -/**
|
| - * Runs an action.
|
| - * @param {Object} action Action item to perform.
|
| - * @private
|
| - */
|
| -ActionChoice.prototype.runAction_ = function(action) {
|
| - // TODO(mtomasz): Remove these predefined actions in Apps v2.
|
| - if (action == this.importPhotosToDriveAction_) {
|
| - var url = chrome.runtime.getURL('photo_import.html') +
|
| - '#' + this.sourceEntry_.fullPath;
|
| - var width = 728;
|
| - var height = 656;
|
| - var top = Math.round((window.screen.availHeight - height) / 2);
|
| - var left = Math.round((window.screen.availWidth - width) / 2);
|
| - chrome.app.window.create(url,
|
| - {height: height, width: width, left: left, top: top});
|
| - this.recordAction_('import-photos-to-drive');
|
| - this.close_();
|
| - return;
|
| - }
|
| -
|
| - if (action == this.watchSingleVideoAction_) {
|
| - util.viewFilesInBrowser([this.singleVideo_.toURL()],
|
| - function(success) {});
|
| - this.recordAction_('watch-single-video');
|
| - this.close_();
|
| - return;
|
| - }
|
| -
|
| - if (action == this.viewFilesAction_) {
|
| - this.viewFiles_();
|
| - this.recordAction_('view-files');
|
| - this.close_();
|
| - return;
|
| - }
|
| -
|
| - if (!action.extensionId) {
|
| - console.error('Unknown predefined action.');
|
| - return;
|
| - }
|
| -
|
| - // Run the media galleries handler.
|
| - chrome.mediaGalleriesPrivate.launchHandler(action.extensionId,
|
| - action.actionId,
|
| - this.params_.source);
|
| - this.close_();
|
| -};
|
| -
|
| -/**
|
| - * Handles accepting an action. Checks if the action is available, remembers
|
| - * and runs it.
|
| - * @private
|
| - */
|
| -ActionChoice.prototype.acceptAction_ = function() {
|
| - var action =
|
| - this.list_.dataModel.item(this.list_.selectionModel.selectedIndex);
|
| - if (!action || action.hidden || action.disabled)
|
| - return;
|
| -
|
| - this.runAction_(action);
|
| - ActionChoiceUtil.setRememberedActionId(action.id);
|
| -};
|
| -
|
| -/**
|
| - * Called when some device is unmounted.
|
| - * @param {Event} event Event object.
|
| - * @private
|
| - */
|
| -ActionChoice.prototype.onDeviceUnmounted_ = function(event) {
|
| - if (this.sourceEntry_ && event.mountPath == this.sourceEntry_.fullPath)
|
| - window.close();
|
| -};
|
| -
|
| -/**
|
| - * Perform the 'view files' action.
|
| - * @private
|
| - */
|
| -ActionChoice.prototype.viewFiles_ = function() {
|
| - var path = this.sourceEntry_.fullPath;
|
| - chrome.runtime.getBackgroundPage(function(bg) {
|
| - bg.launchFileManager({defaultPath: path});
|
| - });
|
| -};
|
| -
|
| -/**
|
| - * Records an action chosen.
|
| - * @param {string} action Action name.
|
| - * @private
|
| - */
|
| -ActionChoice.prototype.recordAction_ = function(action) {
|
| - metrics.recordEnum('PhotoImport.Action', action,
|
| - ['import-photos-to-drive',
|
| - 'view-files',
|
| - 'view-files-auto',
|
| - 'watch-single-video',
|
| - 'error',
|
| - 'close']);
|
| -};
|
| -
|
| -/**
|
| - * Called when the page is unloaded.
|
| - */
|
| -ActionChoice.prototype.onUnload = function() {
|
| - this.volumeManager_.dispose();
|
| -};
|
| -
|
| -function unload() {
|
| - if (ActionChoice.instance)
|
| - ActionChoice.instance.onUnload();
|
| -}
|
|
|