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 Omnibox. 6 7Obtain one of these from PyUITestSuite::GetOmniboxInfo() call. 8 9Example: 10class MyTest(pyauto.PyUITest): 11 def testBasic(self): 12 info = self.OmniboxInfo() # fetch omnibox snapshot 13 print info.Matches() 14 15See more tests in chrome/test/functional/omnibox.py. 16""" 17 18import simplejson as json 19 20from pyauto_errors import JSONInterfaceError 21 22 23class OmniboxInfo(object): 24 """Represent info for Chromium Omnibox. 25 26 Info contains: 27 - a list of matches in the same order as you'd see in the omnibox, 28 - a dictionary of properties related to the omnibox. 29 30 Sample info text: 31 32 { u'matches': [ 33 { 34 u'contents': u'google', 35 u'description': u'Google Search', 36 u'destination_url': u'http://www.google.com/search?aq=f&' 37 'sourceid=chrome&ie=UTF-8&q=google', 38 u'starred': False, 39 u'type': u'search-what-you-typed'}, 40 { 41 u'contents': u'maps.google.com/', 42 u'description': u'Google Maps', 43 u'destination_url': u'http://maps.google.com/', 44 u'starred': False, 45 u'type': u'navsuggest'}, 46 { u'contents': u'google maps', 47 u'description': u'', 48 u'destination_url': u'http://www.google.com/search?aq=0&oq=google&' 49 'sourceid=chrome&ie=UTF-8&q=google+maps', 50 u'starred': False, 51 u'type': u'search-suggest'}, 52 { u'contents': u'google earth', 53 u'description': u'', 54 u'destination_url': u'http://www.google.com/search?aq=1&oq=google&' 55 'sourceid=chrome&ie=UTF-8&q=google+earth', 56 u'starred': False, 57 u'type': u'search-suggest'}, 58 { u'contents': u'Search Google for <enter query>', 59 u'description': u'(Keyword: google.com)', 60 u'destination_url': u'', 61 u'starred': False, 62 u'type': u'search-other-engine'}], 63 64 u'properties': { u'has_focus': True, 65 u'keyword': u'', 66 u'query_in_progress': False, 67 u'text': u'google'}} 68 """ 69 def __init__(self, omnibox_dict): 70 """Initialize a OmniboxInfo from a json string. 71 72 Args: 73 omnibox_dict: returned by an IPC call for the command 'GetOmniboxInfo'. 74 75 Raises: 76 pyauto_errors.JSONInterfaceError if the automation call returns an error. 77 """ 78 # JSON string prepared in GetOmniboxInfo() in automation_provider.cc 79 self.omniboxdict = omnibox_dict 80 if self.omniboxdict.has_key('error'): 81 raise JSONInterfaceError(self.omniboxdict['error']) 82 83 def Matches(self): 84 """Get omnibox matches. 85 86 Returns: 87 a list of omnibox match items. 88 """ 89 return self.omniboxdict.get('matches', []) 90 91 def MatchesWithAttributes(self, attr_dict): 92 """Find all omnibox matches which match the attributes in |attr_dict|. 93 94 Args: 95 attr_dict: a dictionary of attributes to be satisfied. 96 All attributes in the given dictionary should be satisfied. 97 example: 98 { 'destiantion_url': 'http://www.google.com/', 99 'description': 'Google' } 100 101 Returns: 102 a list of omnibox match items. 103 """ 104 out = [] 105 for item in self.Matches(): 106 matched = True 107 for key, val in attr_dict.iteritems(): 108 if not item.has_key(key) or item[key] != val: 109 matched = False 110 if matched: 111 out.append(item) 112 return out 113 114 def Properties(self, key=None): 115 """Get the properties 116 117 Args: 118 key: if specified, value for the given property is returned. 119 120 Returns: 121 a dictionary of properties if no key is given, OR 122 value corresponding to a particular property if key is given 123 """ 124 all = self.omniboxdict.get('properties') 125 if not key: 126 return all 127 return all.get(key) 128 129 def Text(self): 130 """Get the text in the omnibox. 131 132 This need not be the same as the user-inputted text, since omnibox may 133 autocomplete some URLs, or the user may move omnibox popup selection 134 up/down. 135 """ 136 return self.Properties('text') 137 138 def IsQueryInProgress(self): 139 """Determine if a query is in progress.""" 140 return self.Properties('query_in_progress') 141