Home | History | Annotate | Download | only in pyautolib
      1 # Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 """BookmarkModel: python representation of the bookmark model.
      6 
      7 Obtain one of these from PyUITestSuite::GetBookmarkModel() call.
      8 """
      9 
     10 import os
     11 import simplejson as json
     12 import sys
     13 
     14 class BookmarkModel(object):
     15 
     16   def __init__(self, json_string):
     17     """Initialize a BookmarkModel from a string of json.
     18 
     19     The JSON representation is the same as used by the bookmark model
     20     to save to disk.
     21 
     22     Args:
     23       json_string: a string of JSON.
     24     """
     25     self.bookdict = json.loads(json_string)
     26 
     27   def BookmarkBar(self):
     28     """Return the bookmark bar node as a dict."""
     29     return self.bookdict['roots']['bookmark_bar']
     30 
     31   def Other(self):
     32     """Return the 'other' node (e.g. parent of "Other Bookmarks")"""
     33     return self.bookdict['roots']['other']
     34 
     35   def NodeCount(self, node=None):
     36     """Return a count of bookmark nodes, including folders.
     37 
     38     The root node itself is included in the count.
     39 
     40     Args:
     41       node: the root to start with.  If not specified, count all."""
     42     if node == None:
     43       return reduce(lambda x, y: x + y,
     44                     [self.NodeCount(x)
     45                      for x in self.bookdict['roots'].values()])
     46     total = 1
     47     children = node.get('children', None)
     48     if children:
     49       total = total + reduce(lambda x,y: x + y,
     50                              [self.NodeCount(x) for x in children])
     51     return total
     52 
     53   def FindByID(self, id, nodes=None):
     54     """Find the bookmark by id.  Return the dict or None.
     55 
     56     Args:
     57       id: the id to look for.
     58       nodes: an iterable of nodes to start with.  If not specified, search all.
     59         'Not specified' means None, not [].
     60     """
     61     # Careful; we may get an empty list which is different than not
     62     # having specified a list.
     63     if nodes == None:
     64       nodes = self.bookdict['roots'].values()
     65     # Check each item.  If it matches, return.  If not, check each of
     66     # their kids.
     67     for node in nodes:
     68       if node['id'] == id:
     69         return node
     70       for child in node.get('children', []):
     71         found_node = self.FindByID(id, [child])
     72         if found_node:
     73           return found_node
     74     # Not found at all.
     75     return None
     76 
     77   def FindByTitle(self, title, nodes=None):
     78     """Return a tuple of all nodes which have |title| in their title.
     79 
     80     Args:
     81       title: the title to look for.
     82       node: an iterable of nodes to start with.  If not specified, search all.
     83         'Not specified' means None, not [].
     84     """
     85     # Careful; we may get an empty list which is different than not
     86     # having specified a list.
     87     if nodes == None:
     88       nodes = self.bookdict['roots'].values()
     89     # Check each item.  If it matches, return.  If not, check each of
     90     # their kids.
     91     results = []
     92     for node in nodes:
     93       node_title = node.get('title', None) or node.get('name', None)
     94       if title == node_title:
     95         results.append(node)
     96       # Note we check everything; unlike the FindByID, we do not stop early.
     97       for child in node.get('children', []):
     98         results += self.FindByTitle(title, [child])
     99     return results
    100