1d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiang# Copyright 2015 The Chromium OS Authors. All rights reserved.
2d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiang# Use of this source code is governed by a BSD-style license that can be
3d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiang# found in the LICENSE file.
4d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiang
5d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiang"""An adapter to remotely access the browser facade on DUT."""
6d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiang
7d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiang
8d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiangclass BrowserFacadeRemoteAdapter(object):
9d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiang    """BrowserFacadeRemoteAdapter is an adapter to remotely control DUT browser.
10d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiang
11d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiang    The Autotest host object representing the remote DUT, passed to this
12d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiang    class on initialization, can be accessed from its _client property.
13d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiang
14d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiang    """
15d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiang    def __init__(self, remote_facade_proxy):
16d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiang        """Construct an BrowserFacadeRemoteAdapter.
17d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiang
18d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiang        @param remote_facade_proxy: RemoteFacadeProxy object.
19d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiang
20d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiang        """
21d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiang        self._proxy = remote_facade_proxy
22d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiang
23d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiang
24d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiang    @property
25d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiang    def _browser_proxy(self):
26d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiang        """Gets the proxy to DUT browser facade.
27d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiang
28d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiang        @return XML RPC proxy to DUT browser facade.
29d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiang
30d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiang        """
31d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiang        return self._proxy.browser
32d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiang
33d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiang
342ecf0e775e6a19152495003cf90410f53686af30Tom Wai-Hong Tam    def start_custom_chrome(self, kwargs):
352ecf0e775e6a19152495003cf90410f53686af30Tom Wai-Hong Tam        """Start a custom Chrome with given arguments.
362ecf0e775e6a19152495003cf90410f53686af30Tom Wai-Hong Tam
372ecf0e775e6a19152495003cf90410f53686af30Tom Wai-Hong Tam        @param kwargs: A dict of keyword arguments passed to Chrome.
38dec31fd5a2892dca125b1a7e5911cba24d1678f5Cheng-Yi Chiang        @return: True on success, False otherwise.
39dec31fd5a2892dca125b1a7e5911cba24d1678f5Cheng-Yi Chiang
402ecf0e775e6a19152495003cf90410f53686af30Tom Wai-Hong Tam        """
41dec31fd5a2892dca125b1a7e5911cba24d1678f5Cheng-Yi Chiang        return self._browser_proxy.start_custom_chrome(kwargs)
422ecf0e775e6a19152495003cf90410f53686af30Tom Wai-Hong Tam
432ecf0e775e6a19152495003cf90410f53686af30Tom Wai-Hong Tam
44eaea996e476b348db3c06b52192504339f2f0e9eCheng-Yi Chiang    def start_default_chrome(self, restart=False, extra_browser_args=None):
452ecf0e775e6a19152495003cf90410f53686af30Tom Wai-Hong Tam        """Start the default Chrome.
462ecf0e775e6a19152495003cf90410f53686af30Tom Wai-Hong Tam
472ecf0e775e6a19152495003cf90410f53686af30Tom Wai-Hong Tam        @param restart: True to start Chrome without clearing previous state.
48eaea996e476b348db3c06b52192504339f2f0e9eCheng-Yi Chiang        @param extra_browser_args: A list containing extra browser args passed
49eaea996e476b348db3c06b52192504339f2f0e9eCheng-Yi Chiang                                   to Chrome in addition to default ones.
50dec31fd5a2892dca125b1a7e5911cba24d1678f5Cheng-Yi Chiang        @return: True on success, False otherwise.
51dec31fd5a2892dca125b1a7e5911cba24d1678f5Cheng-Yi Chiang
522ecf0e775e6a19152495003cf90410f53686af30Tom Wai-Hong Tam        """
53eaea996e476b348db3c06b52192504339f2f0e9eCheng-Yi Chiang        return self._browser_proxy.start_default_chrome(
54eaea996e476b348db3c06b52192504339f2f0e9eCheng-Yi Chiang                restart, extra_browser_args)
552ecf0e775e6a19152495003cf90410f53686af30Tom Wai-Hong Tam
562ecf0e775e6a19152495003cf90410f53686af30Tom Wai-Hong Tam
57d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiang    def new_tab(self, url):
58d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiang        """Opens a new tab and loads URL.
59d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiang
60d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiang        @param url: The URL to load.
6174ef809f5647db614c5b8215303cc8f2f96c7d8aMoja Hsu        @return a str, the tab descriptor of the opened tab.
62d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiang
63d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiang        """
6474ef809f5647db614c5b8215303cc8f2f96c7d8aMoja Hsu        return self._browser_proxy.new_tab(url)
65d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiang
66d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiang
6774ef809f5647db614c5b8215303cc8f2f96c7d8aMoja Hsu    def close_tab(self, tab_descriptor):
68d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiang        """Closes a previously opened tab.
69d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiang
7074ef809f5647db614c5b8215303cc8f2f96c7d8aMoja Hsu        @param tab_descriptor: Indicate which tab to be closed.
71d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiang
72d0e7fd36b52f7895dea0545a658cd8538c2fbd6aCheng-Yi Chiang        """
7374ef809f5647db614c5b8215303cc8f2f96c7d8aMoja Hsu        self._browser_proxy.close_tab(tab_descriptor)
74dc4f0b28fa5cc36db00d600d182b80af5879ab24Chen-Hao Chang@google.com
75dc4f0b28fa5cc36db00d600d182b80af5879ab24Chen-Hao Chang@google.com
76dc4f0b28fa5cc36db00d600d182b80af5879ab24Chen-Hao Chang@google.com    def wait_for_javascript_expression(
77dc4f0b28fa5cc36db00d600d182b80af5879ab24Chen-Hao Chang@google.com            self, tab_descriptor, expression, timeout):
78dc4f0b28fa5cc36db00d600d182b80af5879ab24Chen-Hao Chang@google.com        """Waits for the given JavaScript expression to be True on the given tab
79dc4f0b28fa5cc36db00d600d182b80af5879ab24Chen-Hao Chang@google.com
80dc4f0b28fa5cc36db00d600d182b80af5879ab24Chen-Hao Chang@google.com        @param tab_descriptor: Indicate on which tab to wait for the expression.
81dc4f0b28fa5cc36db00d600d182b80af5879ab24Chen-Hao Chang@google.com        @param expression: Indiate for what expression to wait.
82dc4f0b28fa5cc36db00d600d182b80af5879ab24Chen-Hao Chang@google.com        @param timeout: Indicate the timeout of the expression.
83dc4f0b28fa5cc36db00d600d182b80af5879ab24Chen-Hao Chang@google.com        """
84dc4f0b28fa5cc36db00d600d182b80af5879ab24Chen-Hao Chang@google.com        self._browser_proxy.wait_for_javascript_expression(
85dc4f0b28fa5cc36db00d600d182b80af5879ab24Chen-Hao Chang@google.com                tab_descriptor, expression, timeout)
86dc4f0b28fa5cc36db00d600d182b80af5879ab24Chen-Hao Chang@google.com
87dc4f0b28fa5cc36db00d600d182b80af5879ab24Chen-Hao Chang@google.com
88dc4f0b28fa5cc36db00d600d182b80af5879ab24Chen-Hao Chang@google.com    def execute_javascript(self, tab_descriptor, statement, timeout):
89dc4f0b28fa5cc36db00d600d182b80af5879ab24Chen-Hao Chang@google.com        """Executes a JavaScript statement on the given tab.
90dc4f0b28fa5cc36db00d600d182b80af5879ab24Chen-Hao Chang@google.com
91dc4f0b28fa5cc36db00d600d182b80af5879ab24Chen-Hao Chang@google.com        @param tab_descriptor: Indicate on which tab to execute the statement.
92dc4f0b28fa5cc36db00d600d182b80af5879ab24Chen-Hao Chang@google.com        @param statement: Indiate what statement to execute.
93dc4f0b28fa5cc36db00d600d182b80af5879ab24Chen-Hao Chang@google.com        @param timeout: Indicate the timeout of the statement.
94dc4f0b28fa5cc36db00d600d182b80af5879ab24Chen-Hao Chang@google.com        """
95dc4f0b28fa5cc36db00d600d182b80af5879ab24Chen-Hao Chang@google.com        self._browser_proxy.execute_javascript(
96dc4f0b28fa5cc36db00d600d182b80af5879ab24Chen-Hao Chang@google.com                tab_descriptor, statement, timeout)
97dc4f0b28fa5cc36db00d600d182b80af5879ab24Chen-Hao Chang@google.com
98dc4f0b28fa5cc36db00d600d182b80af5879ab24Chen-Hao Chang@google.com
99dc4f0b28fa5cc36db00d600d182b80af5879ab24Chen-Hao Chang@google.com    def evaluate_javascript(self, tab_descriptor, expression, timeout):
100dc4f0b28fa5cc36db00d600d182b80af5879ab24Chen-Hao Chang@google.com        """Evaluates a JavaScript expression on the given tab.
101dc4f0b28fa5cc36db00d600d182b80af5879ab24Chen-Hao Chang@google.com
102dc4f0b28fa5cc36db00d600d182b80af5879ab24Chen-Hao Chang@google.com        @param tab_descriptor: Indicate on which tab to evaluate the expression.
103dc4f0b28fa5cc36db00d600d182b80af5879ab24Chen-Hao Chang@google.com        @param expression: Indiate what expression to evaluate.
104dc4f0b28fa5cc36db00d600d182b80af5879ab24Chen-Hao Chang@google.com        @param timeout: Indicate the timeout of the expression.
105dc4f0b28fa5cc36db00d600d182b80af5879ab24Chen-Hao Chang@google.com        @return the JSONized result of the given expression
106dc4f0b28fa5cc36db00d600d182b80af5879ab24Chen-Hao Chang@google.com        """
107dc4f0b28fa5cc36db00d600d182b80af5879ab24Chen-Hao Chang@google.com        return self._browser_proxy.evaluate_javascript(
108dc4f0b28fa5cc36db00d600d182b80af5879ab24Chen-Hao Chang@google.com                tab_descriptor, expression, timeout)
109