1// Copyright (c) 2013 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#ifndef CHROME_TEST_CHROMEDRIVER_CHROME_WEB_VIEW_IMPL_H_
6#define CHROME_TEST_CHROMEDRIVER_CHROME_WEB_VIEW_IMPL_H_
7
8#include <list>
9#include <string>
10
11#include "base/callback.h"
12#include "base/compiler_specific.h"
13#include "base/memory/scoped_ptr.h"
14#include "chrome/test/chromedriver/chrome/web_view.h"
15
16namespace base {
17class DictionaryValue;
18class ListValue;
19class Value;
20}
21
22struct BrowserInfo;
23class DebuggerTracker;
24struct DeviceMetrics;
25class DevToolsClient;
26class DomTracker;
27class FrameTracker;
28class GeolocationOverrideManager;
29class MobileEmulationOverrideManager;
30class HeapSnapshotTaker;
31struct KeyEvent;
32struct MouseEvent;
33class NavigationTracker;
34class Status;
35
36class WebViewImpl : public WebView {
37 public:
38  WebViewImpl(const std::string& id,
39              const BrowserInfo* browser_info,
40              scoped_ptr<DevToolsClient> client);
41  WebViewImpl(const std::string& id,
42              const BrowserInfo* browser_info,
43              scoped_ptr<DevToolsClient> client,
44              const DeviceMetrics* device_metrics);
45  virtual ~WebViewImpl();
46
47  // Overridden from WebView:
48  virtual std::string GetId() OVERRIDE;
49  virtual bool WasCrashed() OVERRIDE;
50  virtual Status ConnectIfNecessary() OVERRIDE;
51  virtual Status HandleReceivedEvents() OVERRIDE;
52  virtual Status Load(const std::string& url) OVERRIDE;
53  virtual Status Reload() OVERRIDE;
54  virtual Status EvaluateScript(const std::string& frame,
55                                const std::string& expression,
56                                scoped_ptr<base::Value>* result) OVERRIDE;
57  virtual Status CallFunction(const std::string& frame,
58                              const std::string& function,
59                              const base::ListValue& args,
60                              scoped_ptr<base::Value>* result) OVERRIDE;
61  virtual Status CallAsyncFunction(const std::string& frame,
62                                   const std::string& function,
63                                   const base::ListValue& args,
64                                   const base::TimeDelta& timeout,
65                                   scoped_ptr<base::Value>* result) OVERRIDE;
66  virtual Status CallUserAsyncFunction(
67      const std::string& frame,
68      const std::string& function,
69      const base::ListValue& args,
70      const base::TimeDelta& timeout,
71      scoped_ptr<base::Value>* result) OVERRIDE;
72  virtual Status GetFrameByFunction(const std::string& frame,
73                                    const std::string& function,
74                                    const base::ListValue& args,
75                                    std::string* out_frame) OVERRIDE;
76  virtual Status DispatchMouseEvents(
77      const std::list<MouseEvent>& events, const std::string& frame) OVERRIDE;
78  virtual Status DispatchTouchEvent(const TouchEvent& event) OVERRIDE;
79  virtual Status DispatchTouchEvents(
80      const std::list<TouchEvent>& events) OVERRIDE;
81  virtual Status DispatchKeyEvents(const std::list<KeyEvent>& events) OVERRIDE;
82  virtual Status GetCookies(scoped_ptr<base::ListValue>* cookies) OVERRIDE;
83  virtual Status DeleteCookie(const std::string& name,
84                              const std::string& url) OVERRIDE;
85  virtual Status WaitForPendingNavigations(const std::string& frame_id,
86                                           const base::TimeDelta& timeout,
87                                           bool stop_load_on_timeout) OVERRIDE;
88  virtual Status IsPendingNavigation(
89      const std::string& frame_id, bool* is_pending) OVERRIDE;
90  virtual JavaScriptDialogManager* GetJavaScriptDialogManager() OVERRIDE;
91  virtual Status OverrideGeolocation(const Geoposition& geoposition) OVERRIDE;
92  virtual Status CaptureScreenshot(std::string* screenshot) OVERRIDE;
93  virtual Status SetFileInputFiles(
94      const std::string& frame,
95      const base::DictionaryValue& element,
96      const std::vector<base::FilePath>& files) OVERRIDE;
97  virtual Status TakeHeapSnapshot(scoped_ptr<base::Value>* snapshot) OVERRIDE;
98  virtual Status StartProfile() OVERRIDE;
99  virtual Status EndProfile(scoped_ptr<base::Value>* profile_data) OVERRIDE;
100
101 private:
102  Status CallAsyncFunctionInternal(const std::string& frame,
103                                   const std::string& function,
104                                   const base::ListValue& args,
105                                   bool is_user_supplied,
106                                   const base::TimeDelta& timeout,
107                                   scoped_ptr<base::Value>* result);
108  Status IsNotPendingNavigation(const std::string& frame_id,
109                                bool* is_not_pending);
110
111  Status InitProfileInternal();
112  Status StopProfileInternal();
113
114  std::string id_;
115  const BrowserInfo* browser_info_;
116  scoped_ptr<DomTracker> dom_tracker_;
117  scoped_ptr<FrameTracker> frame_tracker_;
118  scoped_ptr<NavigationTracker> navigation_tracker_;
119  scoped_ptr<JavaScriptDialogManager> dialog_manager_;
120  scoped_ptr<MobileEmulationOverrideManager> mobile_emulation_override_manager_;
121  scoped_ptr<GeolocationOverrideManager> geolocation_override_manager_;
122  scoped_ptr<HeapSnapshotTaker> heap_snapshot_taker_;
123  scoped_ptr<DebuggerTracker> debugger_;
124  scoped_ptr<DevToolsClient> client_;
125};
126
127namespace internal {
128
129enum EvaluateScriptReturnType {
130  ReturnByValue,
131  ReturnByObject
132};
133Status EvaluateScript(DevToolsClient* client,
134                      int context_id,
135                      const std::string& expression,
136                      EvaluateScriptReturnType return_type,
137                      scoped_ptr<base::DictionaryValue>* result);
138Status EvaluateScriptAndGetObject(DevToolsClient* client,
139                                  int context_id,
140                                  const std::string& expression,
141                                  bool* got_object,
142                                  std::string* object_id);
143Status EvaluateScriptAndGetValue(DevToolsClient* client,
144                                 int context_id,
145                                 const std::string& expression,
146                                 scoped_ptr<base::Value>* result);
147Status ParseCallFunctionResult(const base::Value& temp_result,
148                               scoped_ptr<base::Value>* result);
149Status GetNodeIdFromFunction(DevToolsClient* client,
150                             int context_id,
151                             const std::string& function,
152                             const base::ListValue& args,
153                             bool* found_node,
154                             int* node_id);
155
156}  // namespace internal
157
158#endif  // CHROME_TEST_CHROMEDRIVER_CHROME_WEB_VIEW_IMPL_H_
159