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 7Obtain one of these from a call to PyUITest::GetPrefsInfo() or 8PyUITest::GetLocalStatePrefsInfo(). 9 10Example: 11class 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 17See more tests in chrome/test/functional/prefs.py. 18""" 19 20import simplejson as json 21 22from pyauto_errors import JSONInterfaceError 23 24 25class 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