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 """Python representation for Chromium Preferences.
      6 
      7 Obtain one of these from a call to PyUITest::GetPrefsInfo() or
      8 PyUITest::GetLocalStatePrefsInfo().
      9 
     10 Example:
     11 class MyTest(pyauto.PyUITest):
     12   def testBasic(self):
     13     info = self.GetPrefsInfo()  # fetch prefs snapshot
     14     print info.Prefs()  # all prefs
     15     print info.Prefs('session.restore_on_startup')  # a single pref
     16 
     17 See more tests in chrome/test/functional/prefs.py.
     18 """
     19 
     20 import simplejson as json
     21 
     22 from pyauto_errors import JSONInterfaceError
     23 
     24 
     25 class PrefsInfo(object):
     26   """Represent info for Chromium preferences.
     27 
     28   The info is represented as a hierarchy of prefs values.
     29   The values could be plain (integer, bool, float) or complex (like
     30   dictionary, list).
     31   """
     32   def __init__(self, prefs_dict):
     33     """Initialize a PrefsInfo from a json string.
     34 
     35     Args:
     36       prefs_dict: a dictionary as returned by the IPC command 'GetPrefsInfo'.
     37                    A typical dict representing prefs snapshot looks like:
     38                    { u'prefs':
     39                      { u'alternate_error_pages': {u'enabled': True},
     40                        u'autofill': { u'auxiliary_profiles_enabled': False,
     41                                       u'default_creditcard': u'',
     42                                       u'default_profile': u'',
     43                                       u'enabled': True,
     44                                       u'infobar_shown': False,
     45                                       u'negative_upload_rate': 0.01,
     46                                       u'positive_upload_rate': 0.01},
     47                        u'bookmark_bar': {u'show_on_all_tabs': False},
     48                        ...
     49                        ...
     50                      }
     51                    }
     52 
     53     Raises:
     54       pyauto_errors.JSONInterfaceError if the automation call returns an error.
     55     """
     56     # JSON string prepared in PrefsInfo() in automation_provider.cc
     57     self.prefsdict = prefs_dict
     58     if self.prefsdict.has_key('error'):
     59       raise JSONInterfaceError(self.prefsdict['error'])
     60 
     61   def Prefs(self, path=None):
     62     """Get preferences.
     63 
     64     The preference dictionary (when using path=None) looks like:
     65 
     66       { u'alternate_error_pages': {u'enabled': True},
     67         u'autofill': { u'auxiliary_profiles_enabled': False,
     68                        u'default_creditcard': u'',
     69                        u'default_profile': u'',
     70                        u'enabled': True,
     71                        u'infobar_shown': False,
     72                        u'negative_upload_rate': 0.01,
     73                        u'positive_upload_rate': 0.01},
     74         u'bookmark_bar': {u'show_on_all_tabs': False},
     75         ...
     76         ...
     77       }
     78 
     79     In this case, to fetch the preference value for autofill enabled, use
     80     'autofill.enabled' as the path.
     81 
     82     Args:
     83       path: If specified, return the preference item for the given path.
     84             path is a dot-separated string like "session.restore_on_startup".
     85             One of the equivalent names in chrome/common/pref_names.h could
     86             also be used.
     87 
     88     Returns:
     89       preference value. It could be a dictionary (like the example above), a
     90           list or a plain value.
     91       None, if prefernece for path not found (if path is given).
     92     """
     93     all = self.prefsdict.get('prefs', {})
     94     if not path:  # No path given. Return all prefs.
     95       return all
     96     for part in path.split('.'):  # Narrow down to the requested prefs path.
     97       all = all.get(part)
     98       if all is None: return None
     99     return all
    100