12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CHROME_TEST_CHROMEDRIVER_CHROME_WEB_VIEW_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CHROME_TEST_CHROMEDRIVER_CHROME_WEB_VIEW_H_
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <list>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string>
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <vector>
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base {
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class DictionaryValue;
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class FilePath;
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ListValue;
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class TimeDelta;
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Value;
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class DevToolsClient;
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct Geoposition;
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class JavaScriptDialogManager;
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct KeyEvent;
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct MouseEvent;
27d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochstruct TouchEvent;
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Status;
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WebView {
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~WebView() {}
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Return the id for this WebView.
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual std::string GetId() = 0;
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Return true if the web view was crashed.
3868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual bool WasCrashed() = 0;
3968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Make DevToolsCient connect to DevTools if it is disconnected.
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual Status ConnectIfNecessary() = 0;
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
43868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Handles events that have been received but not yet handled.
44868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual Status HandleReceivedEvents() = 0;
4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Load a given URL in the main frame.
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual Status Load(const std::string& url) = 0;
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Reload the current page.
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual Status Reload() = 0;
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Evaluates a JavaScript expression in a specified frame and returns
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the result. |frame| is a frame ID or an empty string for the main frame.
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the expression evaluates to a element, it will be bound to a unique ID
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // (per frame) and the ID will be returned.
56424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // |result| will never be NULL on success.
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual Status EvaluateScript(const std::string& frame,
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                const std::string& expression,
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                scoped_ptr<base::Value>* result) = 0;
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Calls a JavaScript function in a specified frame with the given args and
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // returns the result. |frame| is a frame ID or an empty string for the main
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // frame. |args| may contain IDs that refer to previously returned elements.
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // These will be translated back to their referred objects before invoking the
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // function.
66424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // |result| will never be NULL on success.
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual Status CallFunction(const std::string& frame,
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              const std::string& function,
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              const base::ListValue& args,
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              scoped_ptr<base::Value>* result) = 0;
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Calls a JavaScript function in a specified frame with the given args and
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // two callbacks. The first may be invoked with a value to return to the user.
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The second may be used to report an error. This function waits until
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // one of the callbacks is invoked or the timeout occurs.
76424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // |result| will never be NULL on success.
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual Status CallAsyncFunction(const std::string& frame,
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   const std::string& function,
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   const base::ListValue& args,
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   const base::TimeDelta& timeout,
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   scoped_ptr<base::Value>* result) = 0;
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Same as |CallAsyncFunction|, except no additional error callback is passed
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // to the function. Also, |kJavaScriptError| or |kScriptTimeout| is used
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // as the error code instead of |kUnknownError| in appropriate cases.
86424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // |result| will never be NULL on success.
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual Status CallUserAsyncFunction(const std::string& frame,
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       const std::string& function,
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       const base::ListValue& args,
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       const base::TimeDelta& timeout,
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       scoped_ptr<base::Value>* result) = 0;
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Gets the frame ID for a frame element returned by invoking the given
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // JavaScript function. |frame| is a frame ID or an empty string for the main
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // frame.
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual Status GetFrameByFunction(const std::string& frame,
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    const std::string& function,
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    const base::ListValue& args,
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    std::string* out_frame) = 0;
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Dispatch a sequence of mouse events.
102ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  virtual Status DispatchMouseEvents(const std::list<MouseEvent>& events,
103ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                     const std::string& frame) = 0;
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Dispatch a single touch event.
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual Status DispatchTouchEvent(const TouchEvent& event) = 0;
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
108d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  // Dispatch a sequence of touch events.
109d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  virtual Status DispatchTouchEvents(const std::list<TouchEvent>& events) = 0;
110d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Dispatch a sequence of key events.
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual Status DispatchKeyEvents(const std::list<KeyEvent>& events) = 0;
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Return all the cookies visible to the current page.
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual Status GetCookies(scoped_ptr<base::ListValue>* cookies) = 0;
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Delete the cookie with the given name.
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual Status DeleteCookie(const std::string& name,
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              const std::string& url) = 0;
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Waits until all pending navigations have completed in the given frame.
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If |frame_id| is "", waits for navigations on the main frame.
12390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // If a modal dialog appears while waiting, kUnexpectedAlertOpen will be
12490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // returned.
125424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // If timeout is exceeded, will return a timeout status.
126424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // If |stop_load_on_timeout| is true, will attempt to stop the page load on
127424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // timeout before returning the timeout status.
128868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual Status WaitForPendingNavigations(const std::string& frame_id,
129424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                           const base::TimeDelta& timeout,
130424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                           bool stop_load_on_timeout) = 0;
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns whether the frame is pending navigation.
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual Status IsPendingNavigation(
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& frame_id, bool* is_pending) = 0;
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns the JavaScriptDialogManager. Never null.
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual JavaScriptDialogManager* GetJavaScriptDialogManager() = 0;
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Overrides normal geolocation with a given geoposition.
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual Status OverrideGeolocation(const Geoposition& geoposition) = 0;
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Captures the visible portions of the web view as a base64-encoded PNG.
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual Status CaptureScreenshot(std::string* screenshot) = 0;
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Set files in a file input element.
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // |element| is the WebElement JSON Object of the input element.
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual Status SetFileInputFiles(
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const std::string& frame,
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const base::DictionaryValue& element,
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const std::vector<base::FilePath>& files) = 0;
151d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
152d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Take a heap snapshot which can build up a graph of Javascript objects.
153d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // A raw heap snapshot is in JSON format:
154d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  //  1. A meta data element "snapshot" about how to parse data elements.
155d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  //  2. Data elements: "nodes", "edges", "strings".
156d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  virtual Status TakeHeapSnapshot(scoped_ptr<base::Value>* snapshot) = 0;
157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Start recording Javascript CPU Profile.
159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual Status StartProfile() = 0;
160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Stop recording Javascript CPU Profile and returns a graph of
162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // CPUProfile objects. The format for the captured profile is defined
163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // (by DevTools) in protocol.json.
164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual Status EndProfile(scoped_ptr<base::Value>* profile_data) = 0;
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // CHROME_TEST_CHROMEDRIVER_CHROME_WEB_VIEW_H_
168