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)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)'use strict';
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/**
84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * TODO(dzvorygin): Here we use this hack, since 'hidden' is standard
94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * attribute and we can't use it's setter as usual.
104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @param {boolean} value New value of hidden property.
114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */
124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)cr.ui.Command.prototype.setHidden = function(value) {
134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  this.__lookupSetter__('hidden').call(this, value);
144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/**
174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * A command.
184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @interface
194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */
204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)var Command = function() {};
214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/**
234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Handles the execute event.
244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @param {Event} event Command event.
254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @param {FileManager} fileManager FileManager.
264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */
274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)Command.prototype.execute = function(event, fileManager) {};
284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/**
304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Handles the can execute event.
314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @param {Event} event Can execute event.
324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @param {FileManager} fileManager FileManager.
334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */
344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)Command.prototype.canExecute = function(event, fileManager) {};
354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/**
374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Utility for commands.
384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var CommandUtil = {};
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) * Extracts entry on which command event was dispatched.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
443240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch * @param {DirectoryTree|DirectoryItem|NavigationList|HTMLLIElement|cr.ui.List}
45a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) *     element Directory to extract a path from.
463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) * @return {Entry} Entry of the found node.
47a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) */
483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)CommandUtil.getCommandEntry = function(element) {
493240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  if (element instanceof NavigationList) {
503240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    // element is a NavigationList.
513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    /** @type {NavigationModelItem} */
533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    var selectedItem = element.selectedItem;
543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return selectedItem && selectedItem.getCachedEntry();
553240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  } else if (element instanceof NavigationListItem) {
563240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    // element is a subitem of NavigationList.
573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    /** @type {NavigationList} */
583240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    var navigationList = element.parentElement;
593240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    var index = navigationList.getIndexOfListItem(element);
603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    /** @type {NavigationModelItem} */
613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    var item = (index != -1) ? navigationList.dataModel.item(index) : null;
623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return item && item.getCachedEntry();
63a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  } else if (element instanceof DirectoryTree) {
64a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // element is a DirectoryTree.
653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return element.selectedItem;
66a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  } else if (element instanceof DirectoryItem) {
67a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // element is a sub item in DirectoryTree.
68a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
69a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // DirectoryItem.fullPath is set on initialization, but entry is lazily.
70a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // We may use fullPath just in case that the entry has not been set yet.
713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return element.entry;
724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  } else if (element instanceof cr.ui.List) {
73a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // element is a normal List (eg. the file list on the right panel).
74a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    var entry = element.selectedItem;
754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // Check if it is Entry or not by referring the fullPath member variable.
764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return entry && entry.fullPath ? entry : null;
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else {
78a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    console.warn('Unsupported element');
79a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return null;
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
843240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch * @param {NavigationList} navigationList navigation list to extract root node.
85a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) * @return {?RootType} Type of the found root.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
873240926e260ce088908e02ac07a6cf7b0c0cbf44Ben MurdochCommandUtil.getCommandRootType = function(navigationList) {
883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  var root = CommandUtil.getCommandEntry(navigationList);
893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return root &&
903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)         PathUtil.isRootPath(root.fullPath) &&
913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)         PathUtil.getRootType(root.fullPath);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Checks if command can be executed on drive.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {Event} event Command event to mark.
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {FileManager} fileManager FileManager to use.
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CommandUtil.canExecuteEnabledOnDriveOnly = function(event, fileManager) {
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event.canExecute = fileManager.isOnDrive();
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/**
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Checks if command should be visible on drive.
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {Event} event Command event to mark.
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {FileManager} fileManager FileManager to use.
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CommandUtil.canExecuteVisibleOnDriveOnly = function(event, fileManager) {
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event.canExecute = fileManager.isOnDrive();
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event.command.setHidden(!fileManager.isOnDrive());
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/**
114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * Sets as the command as always enabled.
115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * @param {Event} event Command event to mark.
116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch */
117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochCommandUtil.canExecuteAlways = function(event) {
118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  event.canExecute = true;
119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch/**
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Returns a single selected/passed entry or null.
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {Event} event Command event.
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {FileManager} fileManager FileManager to use.
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @return {FileEntry} The entry or null.
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CommandUtil.getSingleEntry = function(event, fileManager) {
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (event.target.entry) {
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return event.target.entry;
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  var selection = fileManager.getSelection();
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (selection.totalCount == 1) {
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return selection.entries[0];
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return null;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Obtains target entries that can be pinned from the selection.
1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * If directories are included in the selection, it just returns an empty
1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * array to avoid confusing because pinning directory is not supported
1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * currently.
1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *
1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @return {Array.<Entry>} Target entries.
1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */
1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandUtil.getPinTargetEntries = function() {
1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  var hasDirectory = false;
1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  var results = fileManager.getSelection().entries.filter(function(entry) {
1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    hasDirectory = hasDirectory || entry.isDirectory;
1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (!entry || hasDirectory)
1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return false;
1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    var metadata = fileManager.metadataCache_.getCached(entry, 'drive');
1534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (!metadata || metadata.hosted)
1544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return false;
1554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    entry.pinned = metadata.pinned;
1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return true;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  });
1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return hasDirectory ? [] : results;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
1624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Sets the default handler for the commandId and prevents handling
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the keydown events for this command. Not doing that breaks relationship
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of original keyboard event and the command. WebKit would handle it
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * differently in some cases.
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {Node} node to register command handler on.
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {string} commandId Command id to respond to.
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CommandUtil.forceDefaultHandler = function(node, commandId) {
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var doc = node.ownerDocument;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var command = doc.querySelector('command[id="' + commandId + '"]');
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  node.addEventListener('keydown', function(e) {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (command.matchesEvent(e)) {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Prevent cr.ui.CommandManager of handling it and leave it
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // for the default handler.
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      e.stopPropagation();
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  });
1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  node.addEventListener('command', function(event) {
1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (event.command.id !== commandId)
1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return;
1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    document.execCommand(event.command.id);
1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    event.cancelBubble = true;
1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  });
1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  node.addEventListener('canExecute', function(event) {
1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (event.command.id === commandId)
1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      event.canExecute = document.queryCommandEnabled(event.command.id);
1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  });
1894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
1904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/**
1924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Default command.
1934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Command}
1944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */
1954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandUtil.defaultCommand = {
1964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  execute: function(event, fileManager) {
1974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    fileManager.document.execCommand(event.command.id);
1984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  },
1994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  canExecute: function(event, fileManager) {
2004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    event.canExecute = fileManager.document.queryCommandEnabled(
2014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        event.command.id);
2024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
2034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
2044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/**
2064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Creates the volume switch command with index.
2074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @param {number} index Volume index from 1 to 9.
2084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @return {Command} Volume switch command.
2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */
2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandUtil.createVolumeSwitchCommand = function(index) {
2114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return {
2124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    execute: function(event, fileManager) {
2134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      fileManager.navigationList.selectByIndex(index - 1);
2144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    },
2154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    canExecute: function(event, fileManager) {
2164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      event.canExecute = index > 0 &&
2174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          index <= fileManager.navigationList.dataModel.length;
2184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
2194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  };
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)/**
22368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) * Handle of the command events.
2244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @param {FileManager} fileManager FileManager.
22568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) * @constructor
22668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) */
2274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)var CommandHandler = function(fileManager) {
2284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  /**
2294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   * FileManager.
2304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   * @type {FileManager}
2314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   * @private
2324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   */
2334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  this.fileManager_ = fileManager;
2344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  /**
2364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   * Command elements.
2374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   * @type {Object.<string, cr.ui.Command>}
2384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   * @private
2394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   */
24068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  this.commands_ = {};
24168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  /**
2434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   * Whether the ctrl key is pressed or not.
2444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   * @type {boolean}
2454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   * @private
2464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   */
2474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  this.ctrlKeyPressed_ = false;
2484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  Object.seal(this);
2504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
25168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Decorate command tags in the document.
2524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  var commands = fileManager.document.querySelectorAll('command');
25368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  for (var i = 0; i < commands.length; i++) {
25468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    cr.ui.Command.decorate(commands[i]);
2554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    this.commands_[commands[i].id] = commands[i];
25668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
25768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
25868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Register events.
2594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  fileManager.document.addEventListener('command', this.onCommand_.bind(this));
2604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  fileManager.document.addEventListener('canExecute',
2614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                        this.onCanExecute_.bind(this));
2624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  fileManager.document.addEventListener('keydown', this.onKeyDown_.bind(this));
2634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  fileManager.document.addEventListener('keyup', this.onKeyUp_.bind(this));
26468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)};
26568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
26668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)/**
2674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Updates the availability of all commands.
26868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) */
2694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.prototype.updateAvailability = function() {
2704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  for (var id in this.commands_) {
2714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    this.commands_[id].canExecuteChange();
2724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
27368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)};
27468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
27568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)/**
2761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) * Checks if the handler should ignore the current event, eg. since there is
2771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) * a popup dialog currently opened.
2781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) *
2791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) * @return {boolean} True if the event should be ignored, false otherwise.
2801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) * @private
2811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) */
2821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)CommandHandler.prototype.shouldIgnoreEvents_ = function() {
2831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Do not handle commands, when a dialog is shown.
2841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (this.fileManager_.document.querySelector('.cr-dialog-container.shown'))
2851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return true;
2861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return false;  // Do not ignore.
2881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)};
2891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)/**
29168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) * Handles command events.
29268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) * @param {Event} event Command event.
29368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) * @private
29468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) */
29568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)CommandHandler.prototype.onCommand_ = function(event) {
2961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (this.shouldIgnoreEvents_())
2971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return;
2984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  var handler = CommandHandler.COMMANDS_[event.command.id];
2994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  handler.execute.call(this, event, this.fileManager_);
30068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)};
30168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
30268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)/**
30368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) * Handles canExecute events.
30468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) * @param {Event} event Can execute event.
30568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) * @private
30668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) */
30768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)CommandHandler.prototype.onCanExecute_ = function(event) {
3081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (this.shouldIgnoreEvents_())
3091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return;
3104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  var handler = CommandHandler.COMMANDS_[event.command.id];
3114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  handler.canExecute.call(this, event, this.fileManager_);
31268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)};
31368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
31468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)/**
3154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Handle key down event.
3164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @param {Event} event Key down event.
3174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @private
31868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) */
3194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.prototype.onKeyDown_ = function(event) {
3204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // 17 is the keycode of Ctrl key and it means the event is not for other keys
3214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // with Ctrl modifier but for ctrl key itself.
3224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (util.getKeyModifiers(event) + event.keyCode == 'Ctrl-17') {
3234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    this.ctrlKeyPressed_ = true;
3244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    this.updateAvailability();
3254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
3264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
32768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
32868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)/**
3294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Handle key up event.
3304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @param {Event} event Key up event.
3314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @private
33268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) */
3334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.prototype.onKeyUp_ = function(event) {
3344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // 17 is the keycode of Ctrl key and it means the event is not for other keys
3354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // with Ctrl modifier but for ctrl key itself.
3364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (util.getKeyModifiers(event) + event.keyCode == '17') {
3374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    this.ctrlKeyPressed_ = false;
3384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    this.updateAvailability();
3394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
3404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
3434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Commands.
3444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Object.<string, Command>}
3454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @const
3464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @private
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
3484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_ = {};
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Unmounts external drive.
3524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Command}
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
3544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['unmount'] = {
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /**
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @param {Event} event Command event.
357bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch   * @param {FileManager} fileManager The file manager instance.
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   */
359bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  execute: function(event, fileManager) {
3603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    var root = CommandUtil.getCommandEntry(event.target);
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (root)
3623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      fileManager.unmountVolume(PathUtil.getRootPath(root.fullPath));
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /**
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @param {Event} event Command event.
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   */
3674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  canExecute: function(event, fileManager) {
368bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    var rootType = CommandUtil.getCommandRootType(event.target);
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event.canExecute = (rootType == RootType.ARCHIVE ||
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        rootType == RootType.REMOVABLE);
372bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    event.command.setHidden(!event.canExecute);
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    event.command.label = rootType == RootType.ARCHIVE ?
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        str('CLOSE_ARCHIVE_BUTTON_LABEL') :
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        str('UNMOUNT_DEVICE_BUTTON_LABEL');
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Formats external drive.
3814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Command}
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
3834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['format'] = {
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /**
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @param {Event} event Command event.
386a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)   * @param {FileManager} fileManager The file manager instance.
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   */
388bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  execute: function(event, fileManager) {
389f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    var directoryModel = fileManager.directoryModel;
3903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    var root = CommandUtil.getCommandEntry(event.target);
391f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // If an entry is not found from the event target, use the current
392f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // directory. This can happen for the format button for unsupported and
393f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // unrecognized volumes.
394f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (!root)
395f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      root = directoryModel.getCurrentDirEntry();
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
397f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // TODO(satorux): Stop assuming fullPath to be unique. crbug.com/320967
398f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    var mountPath = root.fullPath;
399f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    var volumeInfo = fileManager.volumeManager.getVolumeInfo(mountPath);
400f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (volumeInfo) {
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      fileManager.confirm.show(
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          loadTimeData.getString('FORMATTING_WARNING'),
403f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          chrome.fileBrowserPrivate.formatVolume.bind(null,
404f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                                      volumeInfo.volumeId));
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /**
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @param {Event} event Command event.
409a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)   * @param {FileManager} fileManager The file manager instance.
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   */
4114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  canExecute: function(event, fileManager) {
4124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    var directoryModel = fileManager.directoryModel;
4133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    var root = CommandUtil.getCommandEntry(event.target);
414f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // See the comment in execute() for why doing this.
415f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (!root)
416f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      root = directoryModel.getCurrentDirEntry();
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var removable = root &&
4183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    PathUtil.getRootType(root.fullPath) == RootType.REMOVABLE;
419f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Don't check if the volume is read-only. Unformatted volume is
420f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // considered read-only per directoryModel.isPathReadOnly(), but can be
421f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // formatted. An error will be raised if formatting failed anyway.
422f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    event.canExecute = removable;
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    event.command.setHidden(!removable);
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Initiates new folder creation.
4294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Command}
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
4314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['new-folder'] = {
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  execute: function(event, fileManager) {
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fileManager.createNewFolder();
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
4354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  canExecute: function(event, fileManager) {
4364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    var directoryModel = fileManager.directoryModel;
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event.canExecute = !fileManager.isOnReadonlyDirectory() &&
438eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                       !fileManager.isRenamingInProgress() &&
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       !directoryModel.isSearching() &&
440eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                       !directoryModel.isScanning();
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Initiates new window creation.
4464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Command}
4474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */
4484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['new-window'] = {
4494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  execute: function(event, fileManager) {
4504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    fileManager.backgroundPage.launchFileManager({
4514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      defaultPath: fileManager.getCurrentDirectory()
452eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    });
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  },
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  canExecute: function(event, fileManager) {
4554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    event.canExecute =
4564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        fileManager.getCurrentDirectoryEntry() &&
4574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        (fileManager.dialogType === DialogType.FULL_PAGE);
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/**
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Deletes selected files.
4634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Command}
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
4654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['delete'] = {
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  execute: function(event, fileManager) {
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fileManager.deleteSelection();
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  canExecute: function(event, fileManager) {
470f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    var allowDeletingWhileOffline =
471f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        fileManager.directoryModel.getCurrentRootType() === RootType.DRIVE;
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var selection = fileManager.getSelection();
473f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    event.canExecute = (!fileManager.isOnReadonlyDirectory() ||
474f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        allowDeletingWhileOffline) &&
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       selection &&
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       selection.totalCount > 0;
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Pastes files from clipboard.
4824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Command}
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
4844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['paste'] = {
4854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  execute: function() {
4864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    document.execCommand(event.command.id);
4874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  },
4884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  canExecute: function(event, fileManager) {
4894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    var document = fileManager.document;
4904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    var fileTransferController = fileManager.fileTransferController;
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event.canExecute = (fileTransferController &&
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fileTransferController.queryPasteCommandEnabled());
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['cut'] = CommandUtil.defaultCommand;
4974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['copy'] = CommandUtil.defaultCommand;
4984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Initiates file renaming.
5014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Command}
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
5034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['rename'] = {
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  execute: function(event, fileManager) {
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fileManager.initiateRename();
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  canExecute: function(event, fileManager) {
508a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    var allowRenamingWhileOffline =
509a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        fileManager.directoryModel.getCurrentRootType() === RootType.DRIVE;
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var selection = fileManager.getSelection();
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event.canExecute =
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        !fileManager.isRenamingInProgress() &&
513a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        (!fileManager.isOnReadonlyDirectory() || allowRenamingWhileOffline) &&
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        selection &&
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        selection.totalCount == 1;
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Opens drive help.
5214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Command}
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
5234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['volume-help'] = {
5244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  execute: function(event, fileManager) {
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (fileManager.isOnDrive())
526a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      util.visitURL(str('GOOGLE_DRIVE_HELP_URL'));
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else
528a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      util.visitURL(str('FILES_APP_HELP_URL'));
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
530eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  canExecute: CommandUtil.canExecuteAlways
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Opens drive buy-more-space url.
5354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Command}
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
5374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['drive-buy-more-space'] = {
5384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  execute: function(event, fileManager) {
539a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    util.visitURL(str('GOOGLE_DRIVE_BUY_STORAGE_URL'));
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  canExecute: CommandUtil.canExecuteVisibleOnDriveOnly
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Opens drive.google.com.
5464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Command}
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
5484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['drive-go-to-drive'] = {
5494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  execute: function(event, fileManager) {
550a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    util.visitURL(str('GOOGLE_DRIVE_ROOT_URL'));
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  canExecute: CommandUtil.canExecuteVisibleOnDriveOnly
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Displays open with dialog for current selection.
5574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Command}
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
5594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['open-with'] = {
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  execute: function(event, fileManager) {
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var tasks = fileManager.getSelection().tasks;
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (tasks) {
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tasks.showTaskPicker(fileManager.defaultTaskPicker,
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          str('OPEN_WITH_BUTTON_LABEL'),
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          null,
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          function(task) {
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            tasks.execute(task.taskId);
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          });
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  canExecute: function(event, fileManager) {
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var tasks = fileManager.getSelection().tasks;
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event.canExecute = tasks && tasks.size() > 1;
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/**
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Focuses search input box.
5794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Command}
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */
5814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['search'] = {
5824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  execute: function(event, fileManager) {
5834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    var element = fileManager.document.querySelector('#search-box input');
584868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    element.focus();
5855e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)    element.select();
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  },
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  canExecute: function(event, fileManager) {
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    event.canExecute = !fileManager.isRenamingInProgress();
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/**
593868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) * Activates the n-th volume.
5944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Command}
5954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */
5964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['volume-switch-1'] =
5974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    CommandUtil.createVolumeSwitchCommand(1);
5984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['volume-switch-2'] =
5994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    CommandUtil.createVolumeSwitchCommand(2);
6004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['volume-switch-3'] =
6014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    CommandUtil.createVolumeSwitchCommand(3);
6024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['volume-switch-4'] =
6034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    CommandUtil.createVolumeSwitchCommand(4);
6044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['volume-switch-5'] =
6054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    CommandUtil.createVolumeSwitchCommand(5);
6064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['volume-switch-6'] =
6074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    CommandUtil.createVolumeSwitchCommand(6);
6084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['volume-switch-7'] =
6094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    CommandUtil.createVolumeSwitchCommand(7);
6104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['volume-switch-8'] =
6114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    CommandUtil.createVolumeSwitchCommand(8);
6124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['volume-switch-9'] =
6134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    CommandUtil.createVolumeSwitchCommand(9);
614868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
615868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)/**
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Flips 'available offline' flag on the file.
6174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Command}
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */
6194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['toggle-pinned'] = {
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  execute: function(event, fileManager) {
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var pin = !event.command.checked;
622eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    event.command.checked = pin;
6234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    var entries = CommandUtil.getPinTargetEntries();
624eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    var currentEntry;
625eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    var error = false;
626eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    var steps = {
627eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      // Pick an entry and pin it.
628eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      start: function() {
629eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        // Check if all the entries are pinned or not.
630eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        if (entries.length == 0)
631eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          return;
632eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        currentEntry = entries.shift();
633eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        chrome.fileBrowserPrivate.pinDriveFile(
634eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            currentEntry.toURL(),
635eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            pin,
636eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            steps.entryPinned);
637eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      },
638eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
639eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      // Check the result of pinning
640eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      entryPinned: function() {
641eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        // Convert to boolean.
642eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        error = !!chrome.runtime.lastError;
643eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        if (error && pin) {
644eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          fileManager.metadataCache_.get(
645eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch              currentEntry, 'filesystem', steps.showError);
646eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        }
647eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        fileManager.metadataCache_.clear(currentEntry, 'drive');
648eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        fileManager.metadataCache_.get(
649eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            currentEntry, 'drive', steps.updateUI.bind(this));
650eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      },
651eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
652eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      // Update the user interface accoding to the cache state.
653eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      updateUI: function(drive) {
654eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        fileManager.updateMetadataInUI_(
655eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            'drive', [currentEntry.toURL()], [drive]);
656eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        if (!error)
657eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          steps.start();
658eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      },
659eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
660eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      // Show the error
661eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      showError: function(filesystem) {
662eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        fileManager.alert.showHtml(str('DRIVE_OUT_OF_SPACE_HEADER'),
663eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                   strf('DRIVE_OUT_OF_SPACE_MESSAGE',
664eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                        unescape(currentEntry.name),
665eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                        util.bytesToString(filesystem.size)));
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    };
668eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    steps.start();
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  },
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
671eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  canExecute: function(event, fileManager) {
6724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    var entries = CommandUtil.getPinTargetEntries();
673eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    var checked = true;
674eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    for (var i = 0; i < entries.length; i++) {
675eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      checked = checked && entries[i].pinned;
676eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
677eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (entries.length > 0) {
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      event.canExecute = true;
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      event.command.setHidden(false);
680eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      event.command.checked = checked;
681eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    } else {
682eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      event.canExecute = false;
683eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      event.command.setHidden(true);
6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/**
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Creates zip file for current selection.
6904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Command}
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */
6924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['zip-selection'] = {
6934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  execute: function(event, fileManager) {
6944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    var dirEntry = fileManager.getCurrentDirectoryEntry();
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var selectionEntries = fileManager.getSelection().entries;
696424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    fileManager.fileOperationManager_.zipSelection(dirEntry, selectionEntries);
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  },
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  canExecute: function(event, fileManager) {
6994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    var dirEntry = fileManager.getCurrentDirectoryEntry();
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var selection = fileManager.getSelection();
7014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    event.canExecute =
7024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        dirEntry &&
7034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        !fileManager.isOnReadonlyDirectory() &&
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        !fileManager.isOnDrive() &&
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        selection && selection.totalCount > 0;
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
708eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
709eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch/**
710eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * Shows the share dialog for the current selection (single only).
7114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Command}
712eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch */
7134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['share'] = {
714eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  execute: function(event, fileManager) {
715eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    fileManager.shareSelection();
716eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  },
717eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  canExecute: function(event, fileManager) {
718eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    var selection = fileManager.getSelection();
719eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    event.canExecute = fileManager.isOnDrive() &&
720eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        !fileManager.isDriveOffline() &&
721bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch        selection && selection.totalCount == 1;
722eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    event.command.setHidden(!fileManager.isOnDrive());
723eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
724eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
725eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
726eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch/**
727bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch * Creates a shortcut of the selected folder (single only).
7284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Command}
7297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch */
7304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['create-folder-shortcut'] = {
7317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  /**
7327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch   * @param {Event} event Command event.
7337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch   * @param {FileManager} fileManager The file manager instance.
7347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch   */
7357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  execute: function(event, fileManager) {
7363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    var entry = CommandUtil.getCommandEntry(event.target);
7373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (entry)
7383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      fileManager.createFolderShortcut(entry.fullPath);
7397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  },
740a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
7417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  /**
7427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch   * @param {Event} event Command event.
7437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch   * @param {FileManager} fileManager The file manager instance.
7447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch   */
7457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  canExecute: function(event, fileManager) {
7463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    var entry = CommandUtil.getCommandEntry(event.target);
7473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    var folderShortcutExists = entry &&
7483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                               fileManager.folderShortcutExists(entry.fullPath);
749a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
750a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    var onlyOneFolderSelected = true;
751a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // Only on list, user can select multiple files. The command is enabled only
752a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // when a single file is selected.
7533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (event.target instanceof cr.ui.List &&
7543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        !(event.target instanceof NavigationList)) {
755a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      var items = event.target.selectedItems;
756a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      onlyOneFolderSelected = (items.length == 1 && items[0].isDirectory);
757a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
758a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
7593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    var eligible = entry &&
7603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                   PathUtil.isEligibleForFolderShortcut(entry.fullPath);
761a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    event.canExecute =
762a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        eligible && onlyOneFolderSelected && !folderShortcutExists;
763bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    event.command.setHidden(!eligible || !onlyOneFolderSelected);
7647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
7657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
7667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
7677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch/**
768bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch * Removes the folder shortcut.
7694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Command}
7707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch */
7714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['remove-folder-shortcut'] = {
7727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  /**
7737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch   * @param {Event} event Command event.
7747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch   * @param {FileManager} fileManager The file manager instance.
7757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch   */
776a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  execute: function(event, fileManager) {
7773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    var entry = CommandUtil.getCommandEntry(event.target);
77858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (entry && entry.fullPath)
77958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      fileManager.removeFolderShortcut(entry.fullPath);
7807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  },
781a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
7827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  /**
7837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch   * @param {Event} event Command event.
7847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch   * @param {FileManager} fileManager The file manager instance.
7857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch   */
786a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  canExecute: function(event, fileManager) {
787a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    var entry = CommandUtil.getCommandEntry(event.target);
78858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    var path = entry && entry.fullPath;
789424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
790424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    var eligible = path && PathUtil.isEligibleForFolderShortcut(path);
791424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    var isShortcut = path && fileManager.folderShortcutExists(path);
792a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    event.canExecute = isShortcut && eligible;
793bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    event.command.setHidden(!event.canExecute);
7947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
7957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
7967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
7977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch/**
798eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * Zoom in to the Files.app.
7994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Command}
800eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch */
8014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['zoom-in'] = {
8024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  execute: function(event, fileManager) {
803eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    chrome.fileBrowserPrivate.zoom('in');
804eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  },
805eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  canExecute: CommandUtil.canExecuteAlways
806eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
807eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
808eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch/**
809eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * Zoom out from the Files.app.
8104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Command}
811eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch */
8124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['zoom-out'] = {
8134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  execute: function(event, fileManager) {
814eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    chrome.fileBrowserPrivate.zoom('out');
815eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  },
816eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  canExecute: CommandUtil.canExecuteAlways
817eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
818eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
819eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch/**
820eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * Reset the zoom factor.
8214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Command}
822eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch */
8234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['zoom-reset'] = {
8244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  execute: function(event, fileManager) {
825eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    chrome.fileBrowserPrivate.zoom('reset');
826eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  },
827eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  canExecute: CommandUtil.canExecuteAlways
828eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
829