OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/test/chromedriver/server/http_handler.h" | 5 #include "chrome/test/chromedriver/server/http_handler.h" |
6 | 6 |
| 7 #include "base/bind.h" |
| 8 #include "base/callback.h" |
7 #include "base/json/json_reader.h" | 9 #include "base/json/json_reader.h" |
8 #include "base/json/json_writer.h" | 10 #include "base/json/json_writer.h" |
| 11 #include "base/logging.h" // For CHECK macros. |
9 #include "base/memory/scoped_ptr.h" | 12 #include "base/memory/scoped_ptr.h" |
| 13 #include "base/message_loop.h" |
| 14 #include "base/message_loop/message_loop_proxy.h" |
10 #include "base/strings/string_split.h" | 15 #include "base/strings/string_split.h" |
11 #include "base/strings/string_util.h" | 16 #include "base/strings/string_util.h" |
12 #include "base/strings/stringprintf.h" | 17 #include "base/strings/stringprintf.h" |
| 18 #include "base/sys_info.h" |
13 #include "base/values.h" | 19 #include "base/values.h" |
| 20 #include "chrome/test/chromedriver/alert_commands.h" |
| 21 #include "chrome/test/chromedriver/chrome/adb_impl.h" |
| 22 #include "chrome/test/chromedriver/chrome/device_manager.h" |
14 #include "chrome/test/chromedriver/chrome/log.h" | 23 #include "chrome/test/chromedriver/chrome/log.h" |
15 #include "chrome/test/chromedriver/chrome/status.h" | 24 #include "chrome/test/chromedriver/chrome/status.h" |
16 #include "chrome/test/chromedriver/command_executor.h" | 25 #include "chrome/test/chromedriver/chrome/version.h" |
17 #include "chrome/test/chromedriver/command_names.h" | 26 #include "chrome/test/chromedriver/commands.h" |
| 27 #include "chrome/test/chromedriver/element_commands.h" |
| 28 #include "chrome/test/chromedriver/net/url_request_context_getter.h" |
18 #include "chrome/test/chromedriver/server/http_response.h" | 29 #include "chrome/test/chromedriver/server/http_response.h" |
| 30 #include "chrome/test/chromedriver/session.h" |
| 31 #include "chrome/test/chromedriver/session_commands.h" |
| 32 #include "chrome/test/chromedriver/session_map.h" |
19 #include "chrome/test/chromedriver/util.h" | 33 #include "chrome/test/chromedriver/util.h" |
| 34 #include "chrome/test/chromedriver/window_commands.h" |
| 35 |
| 36 #if defined(OS_MACOSX) |
| 37 #include "base/mac/scoped_nsautorelease_pool.h" |
| 38 #endif |
20 | 39 |
21 namespace { | 40 namespace { |
22 | 41 |
| 42 const char kLocalStorage[] = "localStorage"; |
| 43 const char kSessionStorage[] = "sessionStorage"; |
23 const char kShutdownPath[] = "shutdown"; | 44 const char kShutdownPath[] = "shutdown"; |
24 | 45 |
| 46 Status UnimplementedCommand( |
| 47 const base::DictionaryValue& params, |
| 48 const std::string& session_id, |
| 49 scoped_ptr<base::Value>* value, |
| 50 std::string* out_session_id) { |
| 51 return Status(kUnknownCommand); |
| 52 } |
| 53 |
25 } // namespace | 54 } // namespace |
26 | 55 |
27 HttpRequest::HttpRequest(HttpMethod method, | 56 HttpRequest::HttpRequest(HttpMethod method, |
28 const std::string& path, | 57 const std::string& path, |
29 const std::string& body) | 58 const std::string& body) |
30 : method(method), path(path), body(body) {} | 59 : method(method), path(path), body(body) {} |
31 | 60 |
32 HttpRequest::~HttpRequest() {} | 61 HttpRequest::~HttpRequest() {} |
33 | 62 |
34 CommandMapping::CommandMapping(HttpMethod method, | 63 CommandMapping::CommandMapping(HttpMethod method, |
35 const std::string& path_pattern, | 64 const std::string& path_pattern, |
36 const std::string& name) | 65 const Command& command) |
37 : method(method), path_pattern(path_pattern), name(name) {} | 66 : method(method), path_pattern(path_pattern), command(command) {} |
38 | 67 |
39 CommandMapping::~CommandMapping() {} | 68 CommandMapping::~CommandMapping() {} |
40 | 69 |
41 // static | 70 HttpHandler::HttpHandler(Log* log, const std::string& url_base) |
42 scoped_ptr<HttpHandler::CommandMap> HttpHandler::CreateCommandMap() { | 71 : log_(log), |
| 72 io_thread_("ChromeDriver IO"), |
| 73 url_base_(url_base) { |
| 74 #if defined(OS_MACOSX) |
| 75 base::mac::ScopedNSAutoreleasePool autorelease_pool; |
| 76 #endif |
| 77 base::Thread::Options options(base::MessageLoop::TYPE_IO, 0); |
| 78 CHECK(io_thread_.StartWithOptions(options)); |
| 79 context_getter_ = new URLRequestContextGetter( |
| 80 io_thread_.message_loop_proxy()); |
| 81 socket_factory_ = CreateSyncWebSocketFactory(context_getter_.get()); |
| 82 adb_.reset(new AdbImpl(io_thread_.message_loop_proxy(), log_)); |
| 83 device_manager_.reset(new DeviceManager(adb_.get())); |
| 84 |
43 CommandMapping commands[] = { | 85 CommandMapping commands[] = { |
44 CommandMapping(kPost, "session", CommandNames::kNewSession), | 86 CommandMapping(kPost, internal::kNewSessionPathPattern, |
| 87 base::Bind(&ExecuteNewSession, |
| 88 NewSessionParams(log_, &session_map_, |
| 89 context_getter_, socket_factory_, |
| 90 device_manager_.get()))), |
45 CommandMapping(kGet, "session/:sessionId", | 91 CommandMapping(kGet, "session/:sessionId", |
46 CommandNames::kGetSessionCapabilities), | 92 WrapToCommand( |
47 CommandMapping(kDelete, "session/:sessionId", CommandNames::kQuit), | 93 base::Bind(&ExecuteGetSessionCapabilities, |
| 94 &session_map_))), |
| 95 CommandMapping(kDelete, "session/:sessionId", |
| 96 base::Bind(&ExecuteQuit, false, &session_map_)), |
48 CommandMapping(kGet, "session/:sessionId/window_handle", | 97 CommandMapping(kGet, "session/:sessionId/window_handle", |
49 CommandNames::kGetCurrentWindowHandle), | 98 WrapToCommand(base::Bind(&ExecuteGetCurrentWindowHandle))), |
50 CommandMapping(kGet, "session/:sessionId/window_handles", | 99 CommandMapping(kGet, "session/:sessionId/window_handles", |
51 CommandNames::kGetWindowHandles), | 100 WrapToCommand(base::Bind(&ExecuteGetWindowHandles))), |
52 CommandMapping(kPost, "session/:sessionId/url", CommandNames::kGet), | 101 CommandMapping(kPost, "session/:sessionId/url", |
53 CommandMapping(kGet, "session/:sessionId/alert", CommandNames::kGetAlert), | 102 WrapToCommand(base::Bind(&ExecuteGet))), |
| 103 CommandMapping(kGet, "session/:sessionId/alert", |
| 104 WrapToCommand( |
| 105 base::Bind(&ExecuteAlertCommand, |
| 106 base::Bind(&ExecuteGetAlert)))), |
54 CommandMapping(kPost, "session/:sessionId/dismiss_alert", | 107 CommandMapping(kPost, "session/:sessionId/dismiss_alert", |
55 CommandNames::kDismissAlert), | 108 WrapToCommand( |
| 109 base::Bind(&ExecuteAlertCommand, |
| 110 base::Bind(&ExecuteDismissAlert)))), |
56 CommandMapping(kPost, "session/:sessionId/accept_alert", | 111 CommandMapping(kPost, "session/:sessionId/accept_alert", |
57 CommandNames::kAcceptAlert), | 112 WrapToCommand( |
| 113 base::Bind(&ExecuteAlertCommand, |
| 114 base::Bind(&ExecuteAcceptAlert)))), |
58 CommandMapping(kGet, "session/:sessionId/alert_text", | 115 CommandMapping(kGet, "session/:sessionId/alert_text", |
59 CommandNames::kGetAlertText), | 116 WrapToCommand( |
| 117 base::Bind(&ExecuteAlertCommand, |
| 118 base::Bind(&ExecuteGetAlertText)))), |
60 CommandMapping(kPost, "session/:sessionId/alert_text", | 119 CommandMapping(kPost, "session/:sessionId/alert_text", |
61 CommandNames::kSetAlertValue), | 120 WrapToCommand( |
| 121 base::Bind(&ExecuteAlertCommand, |
| 122 base::Bind(&ExecuteSetAlertValue)))), |
62 CommandMapping(kPost, "session/:sessionId/forward", | 123 CommandMapping(kPost, "session/:sessionId/forward", |
63 CommandNames::kGoForward), | 124 WrapToCommand(base::Bind(&ExecuteGoForward))), |
64 CommandMapping(kPost, "session/:sessionId/back", CommandNames::kGoBack), | 125 CommandMapping(kPost, "session/:sessionId/back", |
| 126 WrapToCommand(base::Bind(&ExecuteGoBack))), |
65 CommandMapping(kPost, "session/:sessionId/refresh", | 127 CommandMapping(kPost, "session/:sessionId/refresh", |
66 CommandNames::kRefresh), | 128 WrapToCommand(base::Bind(&ExecuteRefresh))), |
67 CommandMapping(kPost, "session/:sessionId/execute", | 129 CommandMapping(kPost, "session/:sessionId/execute", |
68 CommandNames::kExecuteScript), | 130 WrapToCommand(base::Bind(&ExecuteExecuteScript))), |
69 CommandMapping(kPost, "session/:sessionId/execute_async", | 131 CommandMapping(kPost, "session/:sessionId/execute_async", |
70 CommandNames::kExecuteAsyncScript), | 132 WrapToCommand(base::Bind(&ExecuteExecuteAsyncScript))), |
71 CommandMapping(kGet, "session/:sessionId/url", | 133 CommandMapping(kGet, "session/:sessionId/url", |
72 CommandNames::kGetCurrentUrl), | 134 WrapToCommand(base::Bind(&ExecuteGetCurrentUrl))), |
73 CommandMapping(kGet, "session/:sessionId/title", CommandNames::kGetTitle), | 135 CommandMapping(kGet, "session/:sessionId/title", |
| 136 WrapToCommand(base::Bind(&ExecuteGetTitle))), |
74 CommandMapping(kGet, "session/:sessionId/source", | 137 CommandMapping(kGet, "session/:sessionId/source", |
75 CommandNames::kGetPageSource), | 138 WrapToCommand(base::Bind(&ExecuteGetPageSource))), |
76 CommandMapping(kGet, "session/:sessionId/screenshot", | 139 CommandMapping(kGet, "session/:sessionId/screenshot", |
77 CommandNames::kScreenshot), | 140 WrapToCommand(base::Bind(&ExecuteScreenshot))), |
78 CommandMapping(kPost, "session/:sessionId/visible", | 141 CommandMapping(kPost, "session/:sessionId/visible", |
79 CommandNames::kSetBrowserVisible), | 142 base::Bind(&UnimplementedCommand)), |
80 CommandMapping(kGet, "session/:sessionId/visible", | 143 CommandMapping(kGet, "session/:sessionId/visible", |
81 CommandNames::kIsBrowserVisible), | 144 base::Bind(&UnimplementedCommand)), |
82 CommandMapping(kPost, "session/:sessionId/element", | 145 CommandMapping(kPost, "session/:sessionId/element", |
83 CommandNames::kFindElement), | 146 WrapToCommand(base::Bind(&ExecuteFindElement, 50))), |
84 CommandMapping(kPost, "session/:sessionId/elements", | 147 CommandMapping(kPost, "session/:sessionId/elements", |
85 CommandNames::kFindElements), | 148 WrapToCommand(base::Bind(&ExecuteFindElements, 50))), |
86 CommandMapping(kPost, "session/:sessionId/element/active", | 149 CommandMapping(kPost, "session/:sessionId/element/active", |
87 CommandNames::kGetActiveElement), | 150 WrapToCommand(base::Bind(&ExecuteGetActiveElement))), |
88 CommandMapping(kPost, "session/:sessionId/element/:id/element", | 151 CommandMapping(kPost, "session/:sessionId/element/:id/element", |
89 CommandNames::kFindChildElement), | 152 WrapToCommand(base::Bind(&ExecuteFindChildElement, 50))), |
90 CommandMapping(kPost, "session/:sessionId/element/:id/elements", | 153 CommandMapping(kPost, "session/:sessionId/element/:id/elements", |
91 CommandNames::kFindChildElements), | 154 WrapToCommand(base::Bind(&ExecuteFindChildElements, 50))), |
92 CommandMapping(kPost, "session/:sessionId/element/:id/click", | 155 CommandMapping(kPost, "session/:sessionId/element/:id/click", |
93 CommandNames::kClickElement), | 156 WrapToCommand(base::Bind(&ExecuteClickElement))), |
94 CommandMapping(kPost, "session/:sessionId/element/:id/clear", | 157 CommandMapping(kPost, "session/:sessionId/element/:id/clear", |
95 CommandNames::kClearElement), | 158 WrapToCommand(base::Bind(&ExecuteClearElement))), |
96 CommandMapping(kPost, "session/:sessionId/element/:id/submit", | 159 CommandMapping(kPost, "session/:sessionId/element/:id/submit", |
97 CommandNames::kSubmitElement), | 160 WrapToCommand(base::Bind(&ExecuteSubmitElement))), |
98 CommandMapping(kGet, "session/:sessionId/element/:id/text", | 161 CommandMapping(kGet, "session/:sessionId/element/:id/text", |
99 CommandNames::kGetElementText), | 162 WrapToCommand(base::Bind(&ExecuteGetElementText))), |
100 CommandMapping(kPost, "session/:sessionId/element/:id/value", | 163 CommandMapping(kPost, "session/:sessionId/element/:id/value", |
101 CommandNames::kSendKeysToElement), | 164 WrapToCommand(base::Bind(&ExecuteSendKeysToElement))), |
102 CommandMapping(kPost, "session/:sessionId/file", | 165 CommandMapping(kPost, "session/:sessionId/file", |
103 CommandNames::kUploadFile), | 166 WrapToCommand(base::Bind(&ExecuteUploadFile))), |
104 CommandMapping(kGet, "session/:sessionId/element/:id/value", | 167 CommandMapping(kGet, "session/:sessionId/element/:id/value", |
105 CommandNames::kGetElementValue), | 168 WrapToCommand(base::Bind(&ExecuteGetElementValue))), |
106 CommandMapping(kGet, "session/:sessionId/element/:id/name", | 169 CommandMapping(kGet, "session/:sessionId/element/:id/name", |
107 CommandNames::kGetElementTagName), | 170 WrapToCommand(base::Bind(&ExecuteGetElementTagName))), |
108 CommandMapping(kGet, "session/:sessionId/element/:id/selected", | 171 CommandMapping(kGet, "session/:sessionId/element/:id/selected", |
109 CommandNames::kIsElementSelected), | 172 WrapToCommand(base::Bind(&ExecuteIsElementSelected))), |
110 CommandMapping(kGet, "session/:sessionId/element/:id/enabled", | 173 CommandMapping(kGet, "session/:sessionId/element/:id/enabled", |
111 CommandNames::kIsElementEnabled), | 174 WrapToCommand(base::Bind(&ExecuteIsElementEnabled))), |
112 CommandMapping(kGet, "session/:sessionId/element/:id/displayed", | 175 CommandMapping(kGet, "session/:sessionId/element/:id/displayed", |
113 CommandNames::kIsElementDisplayed), | 176 WrapToCommand(base::Bind(&ExecuteIsElementDisplayed))), |
114 CommandMapping(kPost, "session/:sessionId/element/:id/hover", | 177 CommandMapping(kPost, "session/:sessionId/element/:id/hover", |
115 CommandNames::kHoverOverElement), | 178 WrapToCommand(base::Bind(&ExecuteHoverOverElement))), |
116 CommandMapping(kGet, "session/:sessionId/element/:id/location", | 179 CommandMapping(kGet, "session/:sessionId/element/:id/location", |
117 CommandNames::kGetElementLocation), | 180 WrapToCommand(base::Bind(&ExecuteGetElementLocation))), |
118 CommandMapping(kGet, "session/:sessionId/element/:id/location_in_view", | 181 CommandMapping(kGet, "session/:sessionId/element/:id/location_in_view", |
119 CommandNames::kGetElementLocationOnceScrolledIntoView), | 182 WrapToCommand( |
| 183 base::Bind( |
| 184 &ExecuteGetElementLocationOnceScrolledIntoView))), |
120 CommandMapping(kGet, "session/:sessionId/element/:id/size", | 185 CommandMapping(kGet, "session/:sessionId/element/:id/size", |
121 CommandNames::kGetElementSize), | 186 WrapToCommand(base::Bind(&ExecuteGetElementSize))), |
122 CommandMapping(kGet, "session/:sessionId/element/:id/attribute/:name", | 187 CommandMapping(kGet, "session/:sessionId/element/:id/attribute/:name", |
123 CommandNames::kGetElementAttribute), | 188 WrapToCommand(base::Bind(&ExecuteGetElementAttribute))), |
124 CommandMapping(kGet, "session/:sessionId/element/:id/equals/:other", | 189 CommandMapping(kGet, "session/:sessionId/element/:id/equals/:other", |
125 CommandNames::kElementEquals), | 190 WrapToCommand(base::Bind(&ExecuteElementEquals))), |
126 CommandMapping(kGet, "session/:sessionId/cookie", | 191 CommandMapping(kGet, "session/:sessionId/cookie", |
127 CommandNames::kGetCookies), | 192 WrapToCommand(base::Bind(&ExecuteGetCookies))), |
128 CommandMapping(kPost, "session/:sessionId/cookie", | 193 CommandMapping(kPost, "session/:sessionId/cookie", |
129 CommandNames::kAddCookie), | 194 WrapToCommand(base::Bind(&ExecuteAddCookie))), |
130 CommandMapping(kDelete, "session/:sessionId/cookie", | 195 CommandMapping(kDelete, "session/:sessionId/cookie", |
131 CommandNames::kDeleteAllCookies), | 196 WrapToCommand(base::Bind(&ExecuteDeleteAllCookies))), |
132 CommandMapping(kDelete, "session/:sessionId/cookie/:name", | 197 CommandMapping(kDelete, "session/:sessionId/cookie/:name", |
133 CommandNames::kDeleteCookie), | 198 WrapToCommand(base::Bind(&ExecuteDeleteCookie))), |
134 CommandMapping(kPost, "session/:sessionId/frame", | 199 CommandMapping(kPost, "session/:sessionId/frame", |
135 CommandNames::kSwitchToFrame), | 200 WrapToCommand(base::Bind(&ExecuteSwitchToFrame))), |
136 CommandMapping(kPost, "session/:sessionId/window", | 201 CommandMapping(kPost, "session/:sessionId/window", |
137 CommandNames::kSwitchToWindow), | 202 WrapToCommand(base::Bind(&ExecuteSwitchToWindow))), |
138 CommandMapping(kGet, "session/:sessionId/window/:windowHandle/size", | 203 CommandMapping(kGet, "session/:sessionId/window/:windowHandle/size", |
139 CommandNames::kGetWindowSize), | 204 WrapToCommand(base::Bind(&ExecuteGetWindowSize))), |
140 CommandMapping(kGet, "session/:sessionId/window/:windowHandle/position", | 205 CommandMapping(kGet, "session/:sessionId/window/:windowHandle/position", |
141 CommandNames::kGetWindowPosition), | 206 WrapToCommand(base::Bind(&ExecuteGetWindowPosition))), |
142 CommandMapping(kPost, "session/:sessionId/window/:windowHandle/size", | 207 CommandMapping(kPost, "session/:sessionId/window/:windowHandle/size", |
143 CommandNames::kSetWindowSize), | 208 WrapToCommand(base::Bind(&ExecuteSetWindowSize))), |
144 CommandMapping(kPost, "session/:sessionId/window/:windowHandle/position", | 209 CommandMapping(kPost, "session/:sessionId/window/:windowHandle/position", |
145 CommandNames::kSetWindowPosition), | 210 WrapToCommand(base::Bind(&ExecuteSetWindowPosition))), |
146 CommandMapping(kPost, "session/:sessionId/window/:windowHandle/maximize", | 211 CommandMapping(kPost, "session/:sessionId/window/:windowHandle/maximize", |
147 CommandNames::kMaximizeWindow), | 212 WrapToCommand(base::Bind(&ExecuteMaximizeWindow))), |
148 CommandMapping(kDelete, "session/:sessionId/window", | 213 CommandMapping(kDelete, "session/:sessionId/window", |
149 CommandNames::kClose), | 214 WrapToCommand(base::Bind(&ExecuteClose, &session_map_))), |
150 CommandMapping(kPost, "session/:sessionId/element/:id/drag", | 215 CommandMapping(kPost, "session/:sessionId/element/:id/drag", |
151 CommandNames::kDragElement), | 216 base::Bind(&UnimplementedCommand)), |
152 CommandMapping(kGet, "session/:sessionId/element/:id/css/:propertyName", | 217 CommandMapping(kGet, "session/:sessionId/element/:id/css/:propertyName", |
153 CommandNames::kGetElementValueOfCssProperty), | 218 WrapToCommand( |
| 219 base::Bind(&ExecuteGetElementValueOfCSSProperty))), |
154 CommandMapping(kPost, "session/:sessionId/timeouts/implicit_wait", | 220 CommandMapping(kPost, "session/:sessionId/timeouts/implicit_wait", |
155 CommandNames::kImplicitlyWait), | 221 WrapToCommand(base::Bind(&ExecuteImplicitlyWait))), |
156 CommandMapping(kPost, "session/:sessionId/timeouts/async_script", | 222 CommandMapping(kPost, "session/:sessionId/timeouts/async_script", |
157 CommandNames::kSetScriptTimeout), | 223 WrapToCommand(base::Bind(&ExecuteSetScriptTimeout))), |
158 CommandMapping(kPost, "session/:sessionId/timeouts", | 224 CommandMapping(kPost, "session/:sessionId/timeouts", |
159 CommandNames::kSetTimeout), | 225 WrapToCommand(base::Bind(&ExecuteSetTimeout))), |
160 CommandMapping(kPost, "session/:sessionId/execute_sql", | 226 CommandMapping(kPost, "session/:sessionId/execute_sql", |
161 CommandNames::kExecuteSQL), | 227 base::Bind(&UnimplementedCommand)), |
162 CommandMapping(kGet, "session/:sessionId/location", | 228 CommandMapping(kGet, "session/:sessionId/location", |
163 CommandNames::kGetLocation), | 229 WrapToCommand(base::Bind(&ExecuteGetLocation))), |
164 CommandMapping(kPost, "session/:sessionId/location", | 230 CommandMapping(kPost, "session/:sessionId/location", |
165 CommandNames::kSetLocation), | 231 WrapToCommand(base::Bind(&ExecuteSetLocation))), |
166 CommandMapping(kGet, "session/:sessionId/application_cache/status", | 232 CommandMapping(kGet, "session/:sessionId/application_cache/status", |
167 CommandNames::kGetStatus), | 233 base::Bind(&ExecuteGetStatus)), |
168 CommandMapping(kGet, "session/:sessionId/browser_connection", | 234 CommandMapping(kGet, "session/:sessionId/browser_connection", |
169 CommandNames::kIsBrowserOnline), | 235 base::Bind(&UnimplementedCommand)), |
170 CommandMapping(kPost, "session/:sessionId/browser_connection", | 236 CommandMapping(kPost, "session/:sessionId/browser_connection", |
171 CommandNames::kSetBrowserOnline), | 237 base::Bind(&UnimplementedCommand)), |
172 CommandMapping(kGet, "session/:sessionId/local_storage/key/:key", | 238 CommandMapping(kGet, "session/:sessionId/local_storage/key/:key", |
173 CommandNames::kGetLocalStorageItem), | 239 WrapToCommand( |
| 240 base::Bind(&ExecuteGetStorageItem, kLocalStorage))), |
174 CommandMapping(kDelete, "session/:sessionId/local_storage/key/:key", | 241 CommandMapping(kDelete, "session/:sessionId/local_storage/key/:key", |
175 CommandNames::kRemoveLocalStorageItem), | 242 WrapToCommand( |
| 243 base::Bind(&ExecuteRemoveStorageItem, kLocalStorage))), |
176 CommandMapping(kGet, "session/:sessionId/local_storage", | 244 CommandMapping(kGet, "session/:sessionId/local_storage", |
177 CommandNames::kGetLocalStorageKeys), | 245 WrapToCommand( |
| 246 base::Bind(&ExecuteGetStorageKeys, kLocalStorage))), |
178 CommandMapping(kPost, "session/:sessionId/local_storage", | 247 CommandMapping(kPost, "session/:sessionId/local_storage", |
179 CommandNames::kSetLocalStorageItem), | 248 WrapToCommand( |
| 249 base::Bind(&ExecuteSetStorageItem, kLocalStorage))), |
180 CommandMapping(kDelete, "session/:sessionId/local_storage", | 250 CommandMapping(kDelete, "session/:sessionId/local_storage", |
181 CommandNames::kClearLocalStorage), | 251 WrapToCommand( |
| 252 base::Bind(&ExecuteClearStorage, kLocalStorage))), |
182 CommandMapping(kGet, "session/:sessionId/local_storage/size", | 253 CommandMapping(kGet, "session/:sessionId/local_storage/size", |
183 CommandNames::kGetLocalStorageSize), | 254 WrapToCommand( |
| 255 base::Bind(&ExecuteGetStorageSize, kLocalStorage))), |
184 CommandMapping(kGet, "session/:sessionId/session_storage/key/:key", | 256 CommandMapping(kGet, "session/:sessionId/session_storage/key/:key", |
185 CommandNames::kGetSessionStorageItem), | 257 WrapToCommand( |
| 258 base::Bind(&ExecuteGetStorageItem, kSessionStorage))), |
186 CommandMapping(kDelete, "session/:sessionId/session_storage/key/:key", | 259 CommandMapping(kDelete, "session/:sessionId/session_storage/key/:key", |
187 CommandNames::kRemoveSessionStorageItem), | 260 WrapToCommand( |
| 261 base::Bind( |
| 262 &ExecuteRemoveStorageItem, kSessionStorage))), |
188 CommandMapping(kGet, "session/:sessionId/session_storage", | 263 CommandMapping(kGet, "session/:sessionId/session_storage", |
189 CommandNames::kGetSessionStorageKey), | 264 WrapToCommand( |
| 265 base::Bind(&ExecuteGetStorageKeys, kSessionStorage))), |
190 CommandMapping(kPost, "session/:sessionId/session_storage", | 266 CommandMapping(kPost, "session/:sessionId/session_storage", |
191 CommandNames::kSetSessionStorageItem), | 267 WrapToCommand( |
| 268 base::Bind(&ExecuteSetStorageItem, kSessionStorage))), |
192 CommandMapping(kDelete, "session/:sessionId/session_storage", | 269 CommandMapping(kDelete, "session/:sessionId/session_storage", |
193 CommandNames::kClearSessionStorage), | 270 WrapToCommand( |
| 271 base::Bind(&ExecuteClearStorage, kSessionStorage))), |
194 CommandMapping(kGet, "session/:sessionId/session_storage/size", | 272 CommandMapping(kGet, "session/:sessionId/session_storage/size", |
195 CommandNames::kGetSessionStorageSize), | 273 WrapToCommand( |
| 274 base::Bind(&ExecuteGetStorageSize, kSessionStorage))), |
196 CommandMapping(kGet, "session/:sessionId/orientation", | 275 CommandMapping(kGet, "session/:sessionId/orientation", |
197 CommandNames::kGetScreenOrientation), | 276 base::Bind(&UnimplementedCommand)), |
198 CommandMapping(kPost, "session/:sessionId/orientation", | 277 CommandMapping(kPost, "session/:sessionId/orientation", |
199 CommandNames::kSetScreenOrientation), | 278 base::Bind(&UnimplementedCommand)), |
200 CommandMapping(kPost, "session/:sessionId/click", | 279 CommandMapping(kPost, "session/:sessionId/click", |
201 CommandNames::kMouseClick), | 280 WrapToCommand(base::Bind(&ExecuteMouseClick))), |
202 CommandMapping(kPost, "session/:sessionId/doubleclick", | 281 CommandMapping(kPost, "session/:sessionId/doubleclick", |
203 CommandNames::kMouseDoubleClick), | 282 WrapToCommand(base::Bind(&ExecuteMouseDoubleClick))), |
204 CommandMapping(kPost, "session/:sessionId/buttondown", | 283 CommandMapping(kPost, "session/:sessionId/buttondown", |
205 CommandNames::kMouseButtonDown), | 284 WrapToCommand(base::Bind(&ExecuteMouseButtonDown))), |
206 CommandMapping(kPost, "session/:sessionId/buttonup", | 285 CommandMapping(kPost, "session/:sessionId/buttonup", |
207 CommandNames::kMouseButtonUp), | 286 WrapToCommand(base::Bind(&ExecuteMouseButtonUp))), |
208 CommandMapping(kPost, "session/:sessionId/moveto", | 287 CommandMapping(kPost, "session/:sessionId/moveto", |
209 CommandNames::kMouseMoveTo), | 288 WrapToCommand(base::Bind(&ExecuteMouseMoveTo))), |
210 CommandMapping(kPost, "session/:sessionId/keys", | 289 CommandMapping(kPost, "session/:sessionId/keys", |
211 CommandNames::kSendKeysToActiveElement), | 290 WrapToCommand( |
| 291 base::Bind(&ExecuteSendKeysToActiveElement))), |
212 CommandMapping(kGet, "session/:sessionId/ime/available_engines", | 292 CommandMapping(kGet, "session/:sessionId/ime/available_engines", |
213 CommandNames::kImeGetAvailableEngines), | 293 base::Bind(&UnimplementedCommand)), |
214 CommandMapping(kGet, "session/:sessionId/ime/active_engine", | 294 CommandMapping(kGet, "session/:sessionId/ime/active_engine", |
215 CommandNames::kImeGetActiveEngine), | 295 base::Bind(&UnimplementedCommand)), |
216 CommandMapping(kGet, "session/:sessionId/ime/activated", | 296 CommandMapping(kGet, "session/:sessionId/ime/activated", |
217 CommandNames::kImeIsActivated), | 297 base::Bind(&UnimplementedCommand)), |
218 CommandMapping(kPost, "session/:sessionId/ime/deactivate", | 298 CommandMapping(kPost, "session/:sessionId/ime/deactivate", |
219 CommandNames::kImeDeactivate), | 299 base::Bind(&UnimplementedCommand)), |
220 CommandMapping(kPost, "session/:sessionId/ime/activate", | 300 CommandMapping(kPost, "session/:sessionId/ime/activate", |
221 CommandNames::kImeActivateEngine), | 301 base::Bind(&UnimplementedCommand)), |
222 CommandMapping(kPost, "session/:sessionId/touch/click", | 302 CommandMapping(kPost, "session/:sessionId/touch/click", |
223 CommandNames::kTouchSingleTap), | 303 WrapToCommand(base::Bind(&ExecuteTouchSingleTap))), |
224 CommandMapping(kPost, "session/:sessionId/touch/down", | 304 CommandMapping(kPost, "session/:sessionId/touch/down", |
225 CommandNames::kTouchDown), | 305 base::Bind(&UnimplementedCommand)), |
226 CommandMapping(kPost, "session/:sessionId/touch/up", | 306 CommandMapping(kPost, "session/:sessionId/touch/up", |
227 CommandNames::kTouchUp), | 307 base::Bind(&UnimplementedCommand)), |
228 CommandMapping(kPost, "session/:sessionId/touch/move", | 308 CommandMapping(kPost, "session/:sessionId/touch/move", |
229 CommandNames::kTouchMove), | 309 base::Bind(&UnimplementedCommand)), |
230 CommandMapping(kPost, "session/:sessionId/touch/scroll", | 310 CommandMapping(kPost, "session/:sessionId/touch/scroll", |
231 CommandNames::kTouchScroll), | 311 base::Bind(&UnimplementedCommand)), |
232 CommandMapping(kPost, "session/:sessionId/touch/doubleclick", | 312 CommandMapping(kPost, "session/:sessionId/touch/doubleclick", |
233 CommandNames::kTouchDoubleTap), | 313 base::Bind(&UnimplementedCommand)), |
234 CommandMapping(kPost, "session/:sessionId/touch/longclick", | 314 CommandMapping(kPost, "session/:sessionId/touch/longclick", |
235 CommandNames::kTouchLongPress), | 315 base::Bind(&UnimplementedCommand)), |
236 CommandMapping(kPost, "session/:sessionId/touch/flick", | 316 CommandMapping(kPost, "session/:sessionId/touch/flick", |
237 CommandNames::kTouchFlick), | 317 base::Bind(&UnimplementedCommand)), |
238 CommandMapping(kPost, "session/:sessionId/log", CommandNames::kGetLog), | 318 CommandMapping(kPost, "session/:sessionId/log", |
| 319 WrapToCommand(base::Bind(&ExecuteGetLog))), |
239 CommandMapping(kGet, "session/:sessionId/log/types", | 320 CommandMapping(kGet, "session/:sessionId/log/types", |
240 CommandNames::kGetAvailableLogTypes), | 321 WrapToCommand(base::Bind(&ExecuteGetAvailableLogTypes))), |
241 CommandMapping(kPost, "logs", CommandNames::kGetSessionLogs), | 322 CommandMapping(kPost, "logs", base::Bind(&UnimplementedCommand)), |
242 CommandMapping(kGet, "status", CommandNames::kStatus), | 323 CommandMapping(kGet, "status", base::Bind(&ExecuteGetStatus)), |
243 | 324 |
244 // Custom Chrome commands: | 325 // Custom Chrome commands: |
245 // Allow quit all to be called with GET or POST. | 326 // Allow quit all to be called with GET or POST. |
246 CommandMapping(kGet, kShutdownPath, CommandNames::kQuitAll), | 327 CommandMapping(kGet, kShutdownPath, |
247 CommandMapping(kPost, kShutdownPath, CommandNames::kQuitAll), | 328 base::Bind(&ExecuteQuitAll, |
| 329 base::Bind(&ExecuteQuit, true, &session_map_), |
| 330 &session_map_)), |
| 331 CommandMapping(kPost, kShutdownPath, |
| 332 base::Bind(&ExecuteQuitAll, |
| 333 base::Bind(&ExecuteQuit, true, &session_map_), |
| 334 &session_map_)), |
248 CommandMapping(kGet, "session/:sessionId/is_loading", | 335 CommandMapping(kGet, "session/:sessionId/is_loading", |
249 CommandNames::kIsLoading), | 336 WrapToCommand(base::Bind(&ExecuteIsLoading))), |
250 }; | 337 }; |
251 return scoped_ptr<CommandMap>( | 338 this->command_map_.reset( |
252 new CommandMap(commands, commands + arraysize(commands))); | 339 new CommandMap(commands, commands + arraysize(commands))); |
253 } | 340 } |
254 | 341 |
255 HttpHandler::HttpHandler(Log* log, | |
256 scoped_ptr<CommandExecutor> executor, | |
257 scoped_ptr<CommandMap> command_map, | |
258 const std::string& url_base) | |
259 : log_(log), | |
260 executor_(executor.Pass()), | |
261 command_map_(command_map.Pass()), | |
262 url_base_(url_base) { | |
263 executor_->Init(); | |
264 } | |
265 | |
266 HttpHandler::~HttpHandler() {} | 342 HttpHandler::~HttpHandler() {} |
267 | 343 |
268 void HttpHandler::Handle(const HttpRequest& request, | 344 void HttpHandler::Handle(const HttpRequest& request, |
269 HttpResponse* response) { | 345 HttpResponse* response) { |
270 const char* method = "GET"; | 346 const char* method = "GET"; |
271 if (request.method == kPost) | 347 if (request.method == kPost) |
272 method = "POST"; | 348 method = "POST"; |
273 else if (request.method == kDelete) | 349 else if (request.method == kDelete) |
274 method = "DELETE"; | 350 method = "DELETE"; |
275 log_->AddEntry( | 351 log_->AddEntry( |
276 Log::kLog, | 352 Log::kLog, |
277 base::StringPrintf("received WebDriver request: %s %s %s", | 353 base::StringPrintf("received WebDriver request: %s %s %s", |
278 method, | 354 method, |
279 request.path.c_str(), | 355 request.path.c_str(), |
280 request.body.c_str())); | 356 request.body.c_str())); |
281 | 357 |
282 HandleInternal(request, response); | 358 HandleInternal(request, response); |
283 | 359 |
284 log_->AddEntry( | 360 log_->AddEntry( |
285 Log::kLog, | 361 Log::kLog, |
286 base::StringPrintf("sending WebDriver response: %d %s", | 362 base::StringPrintf("sending WebDriver response: %d %s", |
287 response->status(), | 363 response->status(), |
288 response->body().c_str())); | 364 response->body().c_str())); |
289 } | 365 } |
290 | 366 |
291 bool HttpHandler::ShouldShutdown(const HttpRequest& request) { | 367 bool HttpHandler::ShouldShutdown(const HttpRequest& request) { |
292 return request.path == url_base_ + kShutdownPath; | 368 return request.path == url_base_ + kShutdownPath; |
293 } | 369 } |
294 | 370 |
| 371 Command HttpHandler::WrapToCommand( |
| 372 const SessionCommand& session_command) { |
| 373 return base::Bind(&ExecuteSessionCommand, &session_map_, session_command); |
| 374 } |
| 375 |
| 376 Command HttpHandler::WrapToCommand( |
| 377 const WindowCommand& window_command) { |
| 378 return WrapToCommand( |
| 379 base::Bind(&ExecuteWindowCommand, window_command)); |
| 380 } |
| 381 |
| 382 Command HttpHandler::WrapToCommand( |
| 383 const ElementCommand& element_command) { |
| 384 return WrapToCommand( |
| 385 base::Bind(&ExecuteElementCommand, element_command)); |
| 386 } |
| 387 |
295 void HttpHandler::HandleInternal(const HttpRequest& request, | 388 void HttpHandler::HandleInternal(const HttpRequest& request, |
296 HttpResponse* response) { | 389 HttpResponse* response) { |
297 std::string path = request.path; | 390 std::string path = request.path; |
298 if (!StartsWithASCII(path, url_base_, true)) { | 391 if (!StartsWithASCII(path, url_base_, true)) { |
299 *response = HttpResponse(HttpResponse::kBadRequest); | 392 *response = HttpResponse(HttpResponse::kBadRequest); |
300 response->set_body("unhandled request"); | 393 response->set_body("unhandled request"); |
301 return; | 394 return; |
302 } | 395 } |
303 | 396 |
304 path.erase(0, url_base_.length()); | 397 path.erase(0, url_base_.length()); |
(...skipping 27 matching lines...) Expand all Loading... |
332 base::DictionaryValue* body_params; | 425 base::DictionaryValue* body_params; |
333 scoped_ptr<base::Value> parsed_body(base::JSONReader::Read(request.body)); | 426 scoped_ptr<base::Value> parsed_body(base::JSONReader::Read(request.body)); |
334 if (!parsed_body || !parsed_body->GetAsDictionary(&body_params)) { | 427 if (!parsed_body || !parsed_body->GetAsDictionary(&body_params)) { |
335 *response = HttpResponse(HttpResponse::kBadRequest); | 428 *response = HttpResponse(HttpResponse::kBadRequest); |
336 response->set_body("missing command parameters"); | 429 response->set_body("missing command parameters"); |
337 return true; | 430 return true; |
338 } | 431 } |
339 params.MergeDictionary(body_params); | 432 params.MergeDictionary(body_params); |
340 } | 433 } |
341 | 434 |
342 StatusCode status = kOk; | |
343 scoped_ptr<base::Value> value; | 435 scoped_ptr<base::Value> value; |
344 std::string out_session_id; | 436 std::string out_session_id; |
345 executor_->ExecuteCommand( | 437 Status status = iter->command.Run( |
346 iter->name, params, session_id, &status, &value, &out_session_id); | 438 params, session_id, &value, &out_session_id); |
347 | 439 |
348 if (status == kUnknownCommand) { | 440 if (status.code() == kUnknownCommand) { |
349 *response = HttpResponse(HttpResponse::kNotImplemented); | 441 *response = HttpResponse(HttpResponse::kNotImplemented); |
350 response->set_body("unimplemented command: " + iter->name); | 442 response->set_body("unimplemented command: " + trimmed_path); |
351 return true; | 443 return true; |
352 } | 444 } |
353 | 445 |
354 if (iter->name == CommandNames::kNewSession && status == kOk) { | 446 if (iter->path_pattern == internal::kNewSessionPathPattern && status.IsOk()) { |
355 // Creating a session involves a HTTP request to /session, which is | 447 // Creating a session involves a HTTP request to /session, which is |
356 // supposed to redirect to /session/:sessionId, which returns the | 448 // supposed to redirect to /session/:sessionId, which returns the |
357 // session info. | 449 // session info. |
358 *response = HttpResponse(HttpResponse::kSeeOther); | 450 *response = HttpResponse(HttpResponse::kSeeOther); |
359 response->AddHeader("Location", url_base_ + "session/" + out_session_id); | 451 response->AddHeader("Location", url_base_ + "session/" + out_session_id); |
360 return true; | 452 return true; |
| 453 } else if (status.IsError()) { |
| 454 status.AddDetails(base::StringPrintf( |
| 455 "Driver info: chromedriver=%s,platform=%s %s %s", |
| 456 kChromeDriverVersion, |
| 457 base::SysInfo::OperatingSystemName().c_str(), |
| 458 base::SysInfo::OperatingSystemVersion().c_str(), |
| 459 base::SysInfo::OperatingSystemArchitecture().c_str())); |
| 460 scoped_ptr<base::DictionaryValue> error(new base::DictionaryValue()); |
| 461 error->SetString("message", status.message()); |
| 462 value.reset(error.release()); |
361 } | 463 } |
| 464 if (!value) |
| 465 value.reset(base::Value::CreateNullValue()); |
362 | 466 |
363 base::DictionaryValue body_params; | 467 base::DictionaryValue body_params; |
364 body_params.SetInteger("status", status); | 468 body_params.SetInteger("status", status.code()); |
365 body_params.Set("value", value.release()); | 469 body_params.Set("value", value.release()); |
366 body_params.SetString("sessionId", out_session_id); | 470 body_params.SetString("sessionId", out_session_id); |
367 std::string body; | 471 std::string body; |
368 base::JSONWriter::WriteWithOptions( | 472 base::JSONWriter::WriteWithOptions( |
369 &body_params, base::JSONWriter::OPTIONS_OMIT_DOUBLE_TYPE_PRESERVATION, | 473 &body_params, base::JSONWriter::OPTIONS_OMIT_DOUBLE_TYPE_PRESERVATION, |
370 &body); | 474 &body); |
371 *response = HttpResponse(HttpResponse::kOk); | 475 *response = HttpResponse(HttpResponse::kOk); |
372 response->SetMimeType("application/json; charset=utf-8"); | 476 response->SetMimeType("application/json; charset=utf-8"); |
373 response->set_body(body); | 477 response->set_body(body); |
374 return true; | 478 return true; |
375 } | 479 } |
376 | 480 |
377 namespace internal { | 481 namespace internal { |
378 | 482 |
| 483 const char kNewSessionPathPattern[] = "session"; |
| 484 |
379 bool MatchesCommand(HttpMethod method, | 485 bool MatchesCommand(HttpMethod method, |
380 const std::string& path, | 486 const std::string& path, |
381 const CommandMapping& command, | 487 const CommandMapping& command, |
382 std::string* session_id, | 488 std::string* session_id, |
383 base::DictionaryValue* out_params) { | 489 base::DictionaryValue* out_params) { |
384 if (method != command.method) | 490 if (method != command.method) |
385 return false; | 491 return false; |
386 | 492 |
387 std::vector<std::string> path_parts; | 493 std::vector<std::string> path_parts; |
388 base::SplitString(path, '/', &path_parts); | 494 base::SplitString(path, '/', &path_parts); |
(...skipping 14 matching lines...) Expand all Loading... |
403 else | 509 else |
404 params.SetString(name, path_parts[i]); | 510 params.SetString(name, path_parts[i]); |
405 } else if (command_path_parts[i] != path_parts[i]) { | 511 } else if (command_path_parts[i] != path_parts[i]) { |
406 return false; | 512 return false; |
407 } | 513 } |
408 } | 514 } |
409 out_params->MergeDictionary(¶ms); | 515 out_params->MergeDictionary(¶ms); |
410 return true; | 516 return true; |
411 } | 517 } |
412 | 518 |
413 } // namespace | 519 } // namespace internal |
OLD | NEW |