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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import simplejson as json  # found in third_party
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FileBrowser(object):
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """This class provides an API for automating the ChromeOS File Browser.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Example:
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Create and change into 'hello world' folder.
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    executor = pyauto.PyUITest.JavascriptExecutorInTab(self)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_browser = chromeos.file_browser.FileBrowser(self, executor)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if file_browser.WaitUntilInitialized():
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file_browser.CreateDirectory('hello world')
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file_browser.ChangeDirectory('hello world')
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  For complete examples refer to chromeos_file_browser.py.
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, ui_test, executor):
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Initialize FileBrowser.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Args:
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui_test: derived from pyauto.PyUITest - base class for UI test cases.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      executor: derived from pyauto.PyUITest.JavascriptExecutor.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._ui_test = ui_test
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.executor = executor
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def Select(self, name):
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Add entry with given name to the current selection.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Args:
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      name: Name of the entry to add to selection
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Returns:
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       Whether entry exists.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    script = """
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pyautoAPI.addItemToSelection('%s');
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """ % name
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return self.executor.Execute(script)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def DirectoryContents(self):
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Return a set containing all entries in the current directory.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Returns:
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      A set of entries.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    script = """
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pyautoAPI.listDirectory();
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    list = json.loads(self.executor.Execute(script))
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return set(list)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def Save(self, name):
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Save the entry using the given name.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Args:
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      name: Name given to entry to be saved.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    script = """
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pyautoAPI.saveItemAs('%s');
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """ % name
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.executor.Execute(script)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def Open(self):
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Open selected entries."""
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    script = """
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pyautoAPI.openItem();
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.executor.Execute(script)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def ExecuteDefaultTask(self):
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Open selected entries."""
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    script = """
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pyautoAPI.executeDefaultTask()
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.executor.Execute(script)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def Copy(self):
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Copy selected entries to clipboard."""
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    script = """
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pyautoAPI.copyItems();
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.executor.Execute(script)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def Cut(self):
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Cut selected entries to clipboard. """
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    script = """
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pyautoAPI.cutItems();
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.executor.Execute(script)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def Paste(self):
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Paste entries from clipboard."""
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    script = """
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pyautoAPI.pasteItems();
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.executor.Execute(script)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def Rename(self, name):
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Rename selected entry.
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Args:
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      name: New name of the entry.
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    script = """
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pyautoAPI.renameItem('%s');
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """ % name
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.executor.Execute(script)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def Delete(self):
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Delete selected entries."""
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    script = """
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pyautoAPI.deleteItems();
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.executor.Execute(script)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def CreateDirectory(self, name):
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Create directory.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Args:
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      name: Name of the directory.
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    script = """
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pyautoAPI.createDirectory('%s');
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """ % name
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.executor.Execute(script)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def ChangeDirectory(self, path):
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Change to a directory.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    A path starting with '/' is absolute, otherwise it is relative to the
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    current directory.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Args:
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      name: Path to directory.
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    script = """
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pyautoAPI.changeDirectory('%s');
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """ % path
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.executor.Execute(script)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def CurrentDirectory(self):
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Get the absolute path of current directory.
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Returns:
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Path to the current directory.
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    script = """
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pyautoAPI.currentDirectory();
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return self.executor.Execute(script)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def GetSelectedDirectorySizeStats(self):
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Get remaining and total size of selected directory.
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Returns:
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      A tuple: (remaining size in KB, total size in KB)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    script = """
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pyautoAPI.getSelectedDirectorySizeStats();
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    stats = json.loads(self.executor.Execute(script))
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return stats['remainingSizeKB'], stats['totalSizeKB']
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WaitUntilInitialized(self):
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Returns whether the file manager is initialized.
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    This should be called before calling any of the functions above.
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Returns:
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Whether file manager is initialied.
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    def _IsInitialized():
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      script = """
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pyautoAPI.isInitialized();
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      """
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return self.executor.Execute(script)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return self._ui_test.WaitUntil(lambda: _IsInitialized())
184