| # Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """Python representation for Chromium Omnibox. |
| |
| Obtain one of these from PyUITestSuite::GetOmniboxInfo() call. |
| |
| Example: |
| class MyTest(pyauto.PyUITest): |
| def testBasic(self): |
| info = self.OmniboxInfo() # fetch omnibox snapshot |
| print info.Matches() |
| |
| See more tests in chrome/test/functional/omnibox.py. |
| """ |
| |
| import simplejson as json |
| |
| from pyauto_errors import JSONInterfaceError |
| |
| |
| class OmniboxInfo(object): |
| """Represent info for Chromium Omnibox. |
| |
| Info contains: |
| - a list of matches in the same order as you'd see in the omnibox, |
| - a dictionary of properties related to the omnibox. |
| |
| Sample info text: |
| |
| { u'matches': [ |
| { |
| u'contents': u'google', |
| u'description': u'Google Search', |
| u'destination_url': u'http://www.google.com/search?aq=f&' |
| 'sourceid=chrome&ie=UTF-8&q=google', |
| u'starred': False, |
| u'type': u'search-what-you-typed'}, |
| { |
| u'contents': u'maps.google.com/', |
| u'description': u'Google Maps', |
| u'destination_url': u'http://maps.google.com/', |
| u'starred': False, |
| u'type': u'navsuggest'}, |
| { u'contents': u'google maps', |
| u'description': u'', |
| u'destination_url': u'http://www.google.com/search?aq=0&oq=google&' |
| 'sourceid=chrome&ie=UTF-8&q=google+maps', |
| u'starred': False, |
| u'type': u'search-suggest'}, |
| { u'contents': u'google earth', |
| u'description': u'', |
| u'destination_url': u'http://www.google.com/search?aq=1&oq=google&' |
| 'sourceid=chrome&ie=UTF-8&q=google+earth', |
| u'starred': False, |
| u'type': u'search-suggest'}, |
| { u'contents': u'Search Google for <enter query>', |
| u'description': u'(Keyword: google.com)', |
| u'destination_url': u'', |
| u'starred': False, |
| u'type': u'search-other-engine'}], |
| |
| u'properties': { u'has_focus': True, |
| u'keyword': u'', |
| u'query_in_progress': False, |
| u'text': u'google'}} |
| """ |
| def __init__(self, omnibox_dict): |
| """Initialize a OmniboxInfo from a json string. |
| |
| Args: |
| omnibox_dict: returned by an IPC call for the command 'GetOmniboxInfo'. |
| |
| Raises: |
| pyauto_errors.JSONInterfaceError if the automation call returns an error. |
| """ |
| # JSON string prepared in GetOmniboxInfo() in automation_provider.cc |
| self.omniboxdict = omnibox_dict |
| if self.omniboxdict.has_key('error'): |
| raise JSONInterfaceError(self.omniboxdict['error']) |
| |
| def Matches(self): |
| """Get omnibox matches. |
| |
| Returns: |
| a list of omnibox match items. |
| """ |
| return self.omniboxdict.get('matches', []) |
| |
| def MatchesWithAttributes(self, attr_dict): |
| """Find all omnibox matches which match the attributes in |attr_dict|. |
| |
| Args: |
| attr_dict: a dictionary of attributes to be satisfied. |
| All attributes in the given dictionary should be satisfied. |
| example: |
| { 'destiantion_url': 'http://www.google.com/', |
| 'description': 'Google' } |
| |
| Returns: |
| a list of omnibox match items. |
| """ |
| out = [] |
| for item in self.Matches(): |
| matched = True |
| for key, val in attr_dict.iteritems(): |
| if not item.has_key(key) or item[key] != val: |
| matched = False |
| if matched: |
| out.append(item) |
| return out |
| |
| def Properties(self, key=None): |
| """Get the properties |
| |
| Args: |
| key: if specified, value for the given property is returned. |
| |
| Returns: |
| a dictionary of properties if no key is given, OR |
| value corresponding to a particular property if key is given |
| """ |
| all = self.omniboxdict.get('properties') |
| if not key: |
| return all |
| return all.get(key) |
| |
| def Text(self): |
| """Get the text in the omnibox. |
| |
| This need not be the same as the user-inputted text, since omnibox may |
| autocomplete some URLs, or the user may move omnibox popup selection |
| up/down. |
| """ |
| return self.Properties('text') |
| |
| def IsQueryInProgress(self): |
| """Determine if a query is in progress.""" |
| return self.Properties('query_in_progress') |