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" | 7 #include "base/bind.h" |
8 #include "base/callback.h" | 8 #include "base/callback.h" |
9 #include "base/json/json_reader.h" | 9 #include "base/json/json_reader.h" |
10 #include "base/json/json_writer.h" | 10 #include "base/json/json_writer.h" |
11 #include "base/logging.h" // For CHECK macros. | 11 #include "base/logging.h" // For CHECK macros. |
12 #include "base/memory/scoped_ptr.h" | 12 #include "base/memory/scoped_ptr.h" |
13 #include "base/message_loop/message_loop.h" | 13 #include "base/message_loop/message_loop.h" |
14 #include "base/message_loop/message_loop_proxy.h" | 14 #include "base/message_loop/message_loop_proxy.h" |
15 #include "base/strings/string_split.h" | 15 #include "base/strings/string_split.h" |
16 #include "base/strings/string_util.h" | 16 #include "base/strings/string_util.h" |
17 #include "base/strings/stringprintf.h" | 17 #include "base/strings/stringprintf.h" |
18 #include "base/sys_info.h" | 18 #include "base/sys_info.h" |
19 #include "base/values.h" | 19 #include "base/values.h" |
20 #include "chrome/test/chromedriver/alert_commands.h" | 20 #include "chrome/test/chromedriver/alert_commands.h" |
21 #include "chrome/test/chromedriver/chrome/adb_impl.h" | 21 #include "chrome/test/chromedriver/chrome/adb_impl.h" |
22 #include "chrome/test/chromedriver/chrome/device_manager.h" | 22 #include "chrome/test/chromedriver/chrome/device_manager.h" |
23 #include "chrome/test/chromedriver/chrome/log.h" | |
24 #include "chrome/test/chromedriver/chrome/status.h" | 23 #include "chrome/test/chromedriver/chrome/status.h" |
25 #include "chrome/test/chromedriver/chrome/version.h" | 24 #include "chrome/test/chromedriver/chrome/version.h" |
26 #include "chrome/test/chromedriver/net/url_request_context_getter.h" | 25 #include "chrome/test/chromedriver/net/url_request_context_getter.h" |
27 #include "chrome/test/chromedriver/session.h" | 26 #include "chrome/test/chromedriver/session.h" |
28 #include "chrome/test/chromedriver/session_thread_map.h" | 27 #include "chrome/test/chromedriver/session_thread_map.h" |
29 #include "chrome/test/chromedriver/util.h" | 28 #include "chrome/test/chromedriver/util.h" |
30 #include "net/server/http_server_request_info.h" | 29 #include "net/server/http_server_request_info.h" |
31 #include "net/server/http_server_response_info.h" | 30 #include "net/server/http_server_response_info.h" |
32 | 31 |
33 #if defined(OS_MACOSX) | 32 #if defined(OS_MACOSX) |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
73 weak_ptr_factory_(this) { | 72 weak_ptr_factory_(this) { |
74 #if defined(OS_MACOSX) | 73 #if defined(OS_MACOSX) |
75 base::mac::ScopedNSAutoreleasePool autorelease_pool; | 74 base::mac::ScopedNSAutoreleasePool autorelease_pool; |
76 #endif | 75 #endif |
77 context_getter_ = new URLRequestContextGetter(io_task_runner); | 76 context_getter_ = new URLRequestContextGetter(io_task_runner); |
78 socket_factory_ = CreateSyncWebSocketFactory(context_getter_.get()); | 77 socket_factory_ = CreateSyncWebSocketFactory(context_getter_.get()); |
79 adb_.reset(new AdbImpl(io_task_runner, adb_port)); | 78 adb_.reset(new AdbImpl(io_task_runner, adb_port)); |
80 device_manager_.reset(new DeviceManager(adb_.get())); | 79 device_manager_.reset(new DeviceManager(adb_.get())); |
81 | 80 |
82 CommandMapping commands[] = { | 81 CommandMapping commands[] = { |
83 CommandMapping(kPost, | 82 CommandMapping( |
84 internal::kNewSessionPathPattern, | 83 kPost, |
85 base::Bind(&ExecuteNewSession, | 84 internal::kNewSessionPathPattern, |
86 NewSessionParams(&session_thread_map_, | 85 base::Bind(&ExecuteCreateSession, |
87 context_getter_, | 86 &session_thread_map_, |
88 socket_factory_, | 87 WrapToCommand("InitSession", |
89 device_manager_.get()))), | 88 base::Bind(&ExecuteInitSession, |
| 89 InitSessionParams( |
| 90 context_getter_, |
| 91 socket_factory_, |
| 92 device_manager_.get()))))), |
90 CommandMapping(kGet, | 93 CommandMapping(kGet, |
91 "session/:sessionId", | 94 "session/:sessionId", |
92 WrapToCommand(base::Bind(&ExecuteGetSessionCapabilities))), | 95 WrapToCommand("GetSessionCapabilities", |
| 96 base::Bind(&ExecuteGetSessionCapabilities))), |
93 CommandMapping(kDelete, | 97 CommandMapping(kDelete, |
94 "session/:sessionId", | 98 "session/:sessionId", |
95 base::Bind(&ExecuteSessionCommand, | 99 base::Bind(&ExecuteSessionCommand, |
96 &session_thread_map_, | 100 &session_thread_map_, |
| 101 "Quit", |
97 base::Bind(&ExecuteQuit, false), | 102 base::Bind(&ExecuteQuit, false), |
98 true)), | 103 true)), |
99 CommandMapping(kGet, | 104 CommandMapping(kGet, |
100 "session/:sessionId/window_handle", | 105 "session/:sessionId/window_handle", |
101 WrapToCommand(base::Bind(&ExecuteGetCurrentWindowHandle))), | 106 WrapToCommand("GetWindow", |
102 CommandMapping(kGet, | 107 base::Bind(&ExecuteGetCurrentWindowHandle))), |
103 "session/:sessionId/window_handles", | 108 CommandMapping( |
104 WrapToCommand(base::Bind(&ExecuteGetWindowHandles))), | 109 kGet, |
| 110 "session/:sessionId/window_handles", |
| 111 WrapToCommand("GetWindows", base::Bind(&ExecuteGetWindowHandles))), |
105 CommandMapping(kPost, | 112 CommandMapping(kPost, |
106 "session/:sessionId/url", | 113 "session/:sessionId/url", |
107 WrapToCommand(base::Bind(&ExecuteGet))), | 114 WrapToCommand("Navigate", base::Bind(&ExecuteGet))), |
108 CommandMapping(kGet, | 115 CommandMapping(kGet, |
109 "session/:sessionId/alert", | 116 "session/:sessionId/alert", |
110 WrapToCommand(base::Bind(&ExecuteAlertCommand, | 117 WrapToCommand("IsAlertOpen", |
| 118 base::Bind(&ExecuteAlertCommand, |
111 base::Bind(&ExecuteGetAlert)))), | 119 base::Bind(&ExecuteGetAlert)))), |
112 CommandMapping( | 120 CommandMapping( |
113 kPost, | 121 kPost, |
114 "session/:sessionId/dismiss_alert", | 122 "session/:sessionId/dismiss_alert", |
115 WrapToCommand(base::Bind(&ExecuteAlertCommand, | 123 WrapToCommand("DismissAlert", |
| 124 base::Bind(&ExecuteAlertCommand, |
116 base::Bind(&ExecuteDismissAlert)))), | 125 base::Bind(&ExecuteDismissAlert)))), |
117 CommandMapping( | 126 CommandMapping( |
118 kPost, | 127 kPost, |
119 "session/:sessionId/accept_alert", | 128 "session/:sessionId/accept_alert", |
120 WrapToCommand(base::Bind(&ExecuteAlertCommand, | 129 WrapToCommand("AcceptAlert", |
| 130 base::Bind(&ExecuteAlertCommand, |
121 base::Bind(&ExecuteAcceptAlert)))), | 131 base::Bind(&ExecuteAcceptAlert)))), |
122 CommandMapping( | 132 CommandMapping( |
123 kGet, | 133 kGet, |
124 "session/:sessionId/alert_text", | 134 "session/:sessionId/alert_text", |
125 WrapToCommand(base::Bind(&ExecuteAlertCommand, | 135 WrapToCommand("GetAlertMessage", |
| 136 base::Bind(&ExecuteAlertCommand, |
126 base::Bind(&ExecuteGetAlertText)))), | 137 base::Bind(&ExecuteGetAlertText)))), |
127 CommandMapping( | 138 CommandMapping( |
128 kPost, | 139 kPost, |
129 "session/:sessionId/alert_text", | 140 "session/:sessionId/alert_text", |
130 WrapToCommand(base::Bind(&ExecuteAlertCommand, | 141 WrapToCommand("SetAlertPrompt", |
| 142 base::Bind(&ExecuteAlertCommand, |
131 base::Bind(&ExecuteSetAlertValue)))), | 143 base::Bind(&ExecuteSetAlertValue)))), |
132 CommandMapping(kPost, | 144 CommandMapping(kPost, |
133 "session/:sessionId/forward", | 145 "session/:sessionId/forward", |
134 WrapToCommand(base::Bind(&ExecuteGoForward))), | 146 WrapToCommand("GoForward", base::Bind(&ExecuteGoForward))), |
135 CommandMapping(kPost, | 147 CommandMapping(kPost, |
136 "session/:sessionId/back", | 148 "session/:sessionId/back", |
137 WrapToCommand(base::Bind(&ExecuteGoBack))), | 149 WrapToCommand("GoBack", base::Bind(&ExecuteGoBack))), |
138 CommandMapping(kPost, | 150 CommandMapping(kPost, |
139 "session/:sessionId/refresh", | 151 "session/:sessionId/refresh", |
140 WrapToCommand(base::Bind(&ExecuteRefresh))), | 152 WrapToCommand("Refresh", base::Bind(&ExecuteRefresh))), |
141 CommandMapping(kPost, | 153 CommandMapping( |
142 "session/:sessionId/execute", | 154 kPost, |
143 WrapToCommand(base::Bind(&ExecuteExecuteScript))), | 155 "session/:sessionId/execute", |
| 156 WrapToCommand("ExecuteScript", base::Bind(&ExecuteExecuteScript))), |
144 CommandMapping(kPost, | 157 CommandMapping(kPost, |
145 "session/:sessionId/execute_async", | 158 "session/:sessionId/execute_async", |
146 WrapToCommand(base::Bind(&ExecuteExecuteAsyncScript))), | 159 WrapToCommand("ExecuteAsyncScript", |
147 CommandMapping(kGet, | 160 base::Bind(&ExecuteExecuteAsyncScript))), |
148 "session/:sessionId/url", | 161 CommandMapping( |
149 WrapToCommand(base::Bind(&ExecuteGetCurrentUrl))), | 162 kGet, |
| 163 "session/:sessionId/url", |
| 164 WrapToCommand("GetUrl", base::Bind(&ExecuteGetCurrentUrl))), |
150 CommandMapping(kGet, | 165 CommandMapping(kGet, |
151 "session/:sessionId/title", | 166 "session/:sessionId/title", |
152 WrapToCommand(base::Bind(&ExecuteGetTitle))), | 167 WrapToCommand("GetTitle", base::Bind(&ExecuteGetTitle))), |
153 CommandMapping(kGet, | 168 CommandMapping( |
154 "session/:sessionId/source", | 169 kGet, |
155 WrapToCommand(base::Bind(&ExecuteGetPageSource))), | 170 "session/:sessionId/source", |
156 CommandMapping(kGet, | 171 WrapToCommand("GetSource", base::Bind(&ExecuteGetPageSource))), |
157 "session/:sessionId/screenshot", | 172 CommandMapping( |
158 WrapToCommand(base::Bind(&ExecuteScreenshot))), | 173 kGet, |
| 174 "session/:sessionId/screenshot", |
| 175 WrapToCommand("Screenshot", base::Bind(&ExecuteScreenshot))), |
159 CommandMapping(kPost, | 176 CommandMapping(kPost, |
160 "session/:sessionId/visible", | 177 "session/:sessionId/visible", |
161 base::Bind(&UnimplementedCommand)), | 178 base::Bind(&UnimplementedCommand)), |
162 CommandMapping(kGet, | 179 CommandMapping(kGet, |
163 "session/:sessionId/visible", | 180 "session/:sessionId/visible", |
164 base::Bind(&UnimplementedCommand)), | 181 base::Bind(&UnimplementedCommand)), |
165 CommandMapping(kPost, | 182 CommandMapping( |
166 "session/:sessionId/element", | 183 kPost, |
167 WrapToCommand(base::Bind(&ExecuteFindElement, 50))), | 184 "session/:sessionId/element", |
168 CommandMapping(kPost, | 185 WrapToCommand("FindElement", base::Bind(&ExecuteFindElement, 50))), |
169 "session/:sessionId/elements", | 186 CommandMapping( |
170 WrapToCommand(base::Bind(&ExecuteFindElements, 50))), | 187 kPost, |
| 188 "session/:sessionId/elements", |
| 189 WrapToCommand("FindElements", base::Bind(&ExecuteFindElements, 50))), |
171 CommandMapping(kPost, | 190 CommandMapping(kPost, |
172 "session/:sessionId/element/active", | 191 "session/:sessionId/element/active", |
173 WrapToCommand(base::Bind(&ExecuteGetActiveElement))), | 192 WrapToCommand("GetActiveElement", |
| 193 base::Bind(&ExecuteGetActiveElement))), |
174 CommandMapping(kPost, | 194 CommandMapping(kPost, |
175 "session/:sessionId/element/:id/element", | 195 "session/:sessionId/element/:id/element", |
176 WrapToCommand(base::Bind(&ExecuteFindChildElement, 50))), | 196 WrapToCommand("FindChildElement", |
| 197 base::Bind(&ExecuteFindChildElement, 50))), |
177 CommandMapping(kPost, | 198 CommandMapping(kPost, |
178 "session/:sessionId/element/:id/elements", | 199 "session/:sessionId/element/:id/elements", |
179 WrapToCommand(base::Bind(&ExecuteFindChildElements, 50))), | 200 WrapToCommand("FindChildElements", |
180 CommandMapping(kPost, | 201 base::Bind(&ExecuteFindChildElements, 50))), |
181 "session/:sessionId/element/:id/click", | 202 CommandMapping( |
182 WrapToCommand(base::Bind(&ExecuteClickElement))), | 203 kPost, |
183 CommandMapping(kPost, | 204 "session/:sessionId/element/:id/click", |
184 "session/:sessionId/element/:id/clear", | 205 WrapToCommand("ClickElement", base::Bind(&ExecuteClickElement))), |
185 WrapToCommand(base::Bind(&ExecuteClearElement))), | 206 CommandMapping( |
186 CommandMapping(kPost, | 207 kPost, |
187 "session/:sessionId/element/:id/submit", | 208 "session/:sessionId/element/:id/clear", |
188 WrapToCommand(base::Bind(&ExecuteSubmitElement))), | 209 WrapToCommand("ClearElement", base::Bind(&ExecuteClearElement))), |
189 CommandMapping(kGet, | 210 CommandMapping( |
190 "session/:sessionId/element/:id/text", | 211 kPost, |
191 WrapToCommand(base::Bind(&ExecuteGetElementText))), | 212 "session/:sessionId/element/:id/submit", |
192 CommandMapping(kPost, | 213 WrapToCommand("SubmitElement", base::Bind(&ExecuteSubmitElement))), |
| 214 CommandMapping( |
| 215 kGet, |
| 216 "session/:sessionId/element/:id/text", |
| 217 WrapToCommand("GetElementText", base::Bind(&ExecuteGetElementText))), |
| 218 CommandMapping( |
| 219 kPost, |
| 220 "session/:sessionId/element/:id/value", |
| 221 WrapToCommand("TypeElement", base::Bind(&ExecuteSendKeysToElement))), |
| 222 CommandMapping( |
| 223 kPost, |
| 224 "session/:sessionId/file", |
| 225 WrapToCommand("UploadFile", base::Bind(&ExecuteUploadFile))), |
| 226 CommandMapping(kGet, |
193 "session/:sessionId/element/:id/value", | 227 "session/:sessionId/element/:id/value", |
194 WrapToCommand(base::Bind(&ExecuteSendKeysToElement))), | 228 WrapToCommand("GetElementValue", |
195 CommandMapping(kPost, | 229 base::Bind(&ExecuteGetElementValue))), |
196 "session/:sessionId/file", | |
197 WrapToCommand(base::Bind(&ExecuteUploadFile))), | |
198 CommandMapping(kGet, | |
199 "session/:sessionId/element/:id/value", | |
200 WrapToCommand(base::Bind(&ExecuteGetElementValue))), | |
201 CommandMapping(kGet, | 230 CommandMapping(kGet, |
202 "session/:sessionId/element/:id/name", | 231 "session/:sessionId/element/:id/name", |
203 WrapToCommand(base::Bind(&ExecuteGetElementTagName))), | 232 WrapToCommand("GetElementTagName", |
| 233 base::Bind(&ExecuteGetElementTagName))), |
204 CommandMapping(kGet, | 234 CommandMapping(kGet, |
205 "session/:sessionId/element/:id/selected", | 235 "session/:sessionId/element/:id/selected", |
206 WrapToCommand(base::Bind(&ExecuteIsElementSelected))), | 236 WrapToCommand("IsElementSelected", |
| 237 base::Bind(&ExecuteIsElementSelected))), |
207 CommandMapping(kGet, | 238 CommandMapping(kGet, |
208 "session/:sessionId/element/:id/enabled", | 239 "session/:sessionId/element/:id/enabled", |
209 WrapToCommand(base::Bind(&ExecuteIsElementEnabled))), | 240 WrapToCommand("IsElementEnabled", |
| 241 base::Bind(&ExecuteIsElementEnabled))), |
210 CommandMapping(kGet, | 242 CommandMapping(kGet, |
211 "session/:sessionId/element/:id/displayed", | 243 "session/:sessionId/element/:id/displayed", |
212 WrapToCommand(base::Bind(&ExecuteIsElementDisplayed))), | 244 WrapToCommand("IsElementDisplayed", |
213 CommandMapping(kPost, | 245 base::Bind(&ExecuteIsElementDisplayed))), |
214 "session/:sessionId/element/:id/hover", | 246 CommandMapping( |
215 WrapToCommand(base::Bind(&ExecuteHoverOverElement))), | 247 kPost, |
| 248 "session/:sessionId/element/:id/hover", |
| 249 WrapToCommand("HoverElement", base::Bind(&ExecuteHoverOverElement))), |
216 CommandMapping(kGet, | 250 CommandMapping(kGet, |
217 "session/:sessionId/element/:id/location", | 251 "session/:sessionId/element/:id/location", |
218 WrapToCommand(base::Bind(&ExecuteGetElementLocation))), | 252 WrapToCommand("GetElementLocation", |
219 CommandMapping(kGet, | 253 base::Bind(&ExecuteGetElementLocation))), |
220 "session/:sessionId/element/:id/location_in_view", | 254 CommandMapping( |
221 WrapToCommand(base::Bind( | 255 kGet, |
222 &ExecuteGetElementLocationOnceScrolledIntoView))), | 256 "session/:sessionId/element/:id/location_in_view", |
223 CommandMapping(kGet, | 257 WrapToCommand( |
224 "session/:sessionId/element/:id/size", | 258 "GetElementLocationInView", |
225 WrapToCommand(base::Bind(&ExecuteGetElementSize))), | 259 base::Bind(&ExecuteGetElementLocationOnceScrolledIntoView))), |
| 260 CommandMapping( |
| 261 kGet, |
| 262 "session/:sessionId/element/:id/size", |
| 263 WrapToCommand("GetElementSize", base::Bind(&ExecuteGetElementSize))), |
226 CommandMapping(kGet, | 264 CommandMapping(kGet, |
227 "session/:sessionId/element/:id/attribute/:name", | 265 "session/:sessionId/element/:id/attribute/:name", |
228 WrapToCommand(base::Bind(&ExecuteGetElementAttribute))), | 266 WrapToCommand("GetElementAttribute", |
229 CommandMapping(kGet, | 267 base::Bind(&ExecuteGetElementAttribute))), |
230 "session/:sessionId/element/:id/equals/:other", | 268 CommandMapping( |
231 WrapToCommand(base::Bind(&ExecuteElementEquals))), | 269 kGet, |
232 CommandMapping(kGet, | 270 "session/:sessionId/element/:id/equals/:other", |
| 271 WrapToCommand("IsElementEqual", base::Bind(&ExecuteElementEquals))), |
| 272 CommandMapping( |
| 273 kGet, |
| 274 "session/:sessionId/cookie", |
| 275 WrapToCommand("GetCookies", base::Bind(&ExecuteGetCookies))), |
| 276 CommandMapping(kPost, |
233 "session/:sessionId/cookie", | 277 "session/:sessionId/cookie", |
234 WrapToCommand(base::Bind(&ExecuteGetCookies))), | 278 WrapToCommand("AddCookie", base::Bind(&ExecuteAddCookie))), |
235 CommandMapping(kPost, | |
236 "session/:sessionId/cookie", | |
237 WrapToCommand(base::Bind(&ExecuteAddCookie))), | |
238 CommandMapping(kDelete, | 279 CommandMapping(kDelete, |
239 "session/:sessionId/cookie", | 280 "session/:sessionId/cookie", |
240 WrapToCommand(base::Bind(&ExecuteDeleteAllCookies))), | 281 WrapToCommand("DeleteAllCookies", |
241 CommandMapping(kDelete, | 282 base::Bind(&ExecuteDeleteAllCookies))), |
242 "session/:sessionId/cookie/:name", | 283 CommandMapping( |
243 WrapToCommand(base::Bind(&ExecuteDeleteCookie))), | 284 kDelete, |
244 CommandMapping(kPost, | 285 "session/:sessionId/cookie/:name", |
245 "session/:sessionId/frame", | 286 WrapToCommand("DeleteCookie", base::Bind(&ExecuteDeleteCookie))), |
246 WrapToCommand(base::Bind(&ExecuteSwitchToFrame))), | 287 CommandMapping( |
247 CommandMapping(kPost, | 288 kPost, |
248 "session/:sessionId/window", | 289 "session/:sessionId/frame", |
249 WrapToCommand(base::Bind(&ExecuteSwitchToWindow))), | 290 WrapToCommand("SwitchToFrame", base::Bind(&ExecuteSwitchToFrame))), |
250 CommandMapping(kGet, | 291 CommandMapping( |
251 "session/:sessionId/window/:windowHandle/size", | 292 kPost, |
252 WrapToCommand(base::Bind(&ExecuteGetWindowSize))), | 293 "session/:sessionId/window", |
| 294 WrapToCommand("SwitchToWindow", base::Bind(&ExecuteSwitchToWindow))), |
| 295 CommandMapping( |
| 296 kGet, |
| 297 "session/:sessionId/window/:windowHandle/size", |
| 298 WrapToCommand("GetWindowSize", base::Bind(&ExecuteGetWindowSize))), |
253 CommandMapping(kGet, | 299 CommandMapping(kGet, |
254 "session/:sessionId/window/:windowHandle/position", | 300 "session/:sessionId/window/:windowHandle/position", |
255 WrapToCommand(base::Bind(&ExecuteGetWindowPosition))), | 301 WrapToCommand("GetWindowPosition", |
256 CommandMapping(kPost, | 302 base::Bind(&ExecuteGetWindowPosition))), |
257 "session/:sessionId/window/:windowHandle/size", | 303 CommandMapping( |
258 WrapToCommand(base::Bind(&ExecuteSetWindowSize))), | 304 kPost, |
| 305 "session/:sessionId/window/:windowHandle/size", |
| 306 WrapToCommand("SetWindowSize", base::Bind(&ExecuteSetWindowSize))), |
259 CommandMapping(kPost, | 307 CommandMapping(kPost, |
260 "session/:sessionId/window/:windowHandle/position", | 308 "session/:sessionId/window/:windowHandle/position", |
261 WrapToCommand(base::Bind(&ExecuteSetWindowPosition))), | 309 WrapToCommand("SetWindowPosition", |
262 CommandMapping(kPost, | 310 base::Bind(&ExecuteSetWindowPosition))), |
263 "session/:sessionId/window/:windowHandle/maximize", | 311 CommandMapping( |
264 WrapToCommand(base::Bind(&ExecuteMaximizeWindow))), | 312 kPost, |
| 313 "session/:sessionId/window/:windowHandle/maximize", |
| 314 WrapToCommand("MaximizeWindow", base::Bind(&ExecuteMaximizeWindow))), |
265 CommandMapping(kDelete, | 315 CommandMapping(kDelete, |
266 "session/:sessionId/window", | 316 "session/:sessionId/window", |
267 WrapToCommand(base::Bind(&ExecuteClose))), | 317 WrapToCommand("CloseWindow", base::Bind(&ExecuteClose))), |
268 CommandMapping(kPost, | 318 CommandMapping(kPost, |
269 "session/:sessionId/element/:id/drag", | 319 "session/:sessionId/element/:id/drag", |
270 base::Bind(&UnimplementedCommand)), | 320 base::Bind(&UnimplementedCommand)), |
271 CommandMapping( | 321 CommandMapping( |
272 kGet, | 322 kGet, |
273 "session/:sessionId/element/:id/css/:propertyName", | 323 "session/:sessionId/element/:id/css/:propertyName", |
274 WrapToCommand(base::Bind(&ExecuteGetElementValueOfCSSProperty))), | 324 WrapToCommand("GetElementCSSProperty", |
275 CommandMapping(kPost, | 325 base::Bind(&ExecuteGetElementValueOfCSSProperty))), |
276 "session/:sessionId/timeouts/implicit_wait", | 326 CommandMapping( |
277 WrapToCommand(base::Bind(&ExecuteImplicitlyWait))), | 327 kPost, |
| 328 "session/:sessionId/timeouts/implicit_wait", |
| 329 WrapToCommand("SetImplicitWait", base::Bind(&ExecuteImplicitlyWait))), |
278 CommandMapping(kPost, | 330 CommandMapping(kPost, |
279 "session/:sessionId/timeouts/async_script", | 331 "session/:sessionId/timeouts/async_script", |
280 WrapToCommand(base::Bind(&ExecuteSetScriptTimeout))), | 332 WrapToCommand("SetScriptTimeout", |
281 CommandMapping(kPost, | 333 base::Bind(&ExecuteSetScriptTimeout))), |
282 "session/:sessionId/timeouts", | 334 CommandMapping( |
283 WrapToCommand(base::Bind(&ExecuteSetTimeout))), | 335 kPost, |
| 336 "session/:sessionId/timeouts", |
| 337 WrapToCommand("SetTimeout", base::Bind(&ExecuteSetTimeout))), |
284 CommandMapping(kPost, | 338 CommandMapping(kPost, |
285 "session/:sessionId/execute_sql", | 339 "session/:sessionId/execute_sql", |
286 base::Bind(&UnimplementedCommand)), | 340 base::Bind(&UnimplementedCommand)), |
287 CommandMapping(kGet, | 341 CommandMapping( |
288 "session/:sessionId/location", | 342 kGet, |
289 WrapToCommand(base::Bind(&ExecuteGetLocation))), | 343 "session/:sessionId/location", |
290 CommandMapping(kPost, | 344 WrapToCommand("GetGeolocation", base::Bind(&ExecuteGetLocation))), |
291 "session/:sessionId/location", | 345 CommandMapping( |
292 WrapToCommand(base::Bind(&ExecuteSetLocation))), | 346 kPost, |
| 347 "session/:sessionId/location", |
| 348 WrapToCommand("SetGeolocation", base::Bind(&ExecuteSetLocation))), |
293 CommandMapping(kGet, | 349 CommandMapping(kGet, |
294 "session/:sessionId/application_cache/status", | 350 "session/:sessionId/application_cache/status", |
295 base::Bind(&ExecuteGetStatus)), | 351 base::Bind(&ExecuteGetStatus)), |
296 CommandMapping(kGet, | 352 CommandMapping(kGet, |
297 "session/:sessionId/browser_connection", | 353 "session/:sessionId/browser_connection", |
298 base::Bind(&UnimplementedCommand)), | 354 base::Bind(&UnimplementedCommand)), |
299 CommandMapping(kPost, | 355 CommandMapping(kPost, |
300 "session/:sessionId/browser_connection", | 356 "session/:sessionId/browser_connection", |
301 base::Bind(&UnimplementedCommand)), | 357 base::Bind(&UnimplementedCommand)), |
302 CommandMapping( | 358 CommandMapping( |
303 kGet, | 359 kGet, |
304 "session/:sessionId/local_storage/key/:key", | 360 "session/:sessionId/local_storage/key/:key", |
305 WrapToCommand(base::Bind(&ExecuteGetStorageItem, kLocalStorage))), | 361 WrapToCommand("GetLocalStorageItem", |
| 362 base::Bind(&ExecuteGetStorageItem, kLocalStorage))), |
306 CommandMapping( | 363 CommandMapping( |
307 kDelete, | 364 kDelete, |
308 "session/:sessionId/local_storage/key/:key", | 365 "session/:sessionId/local_storage/key/:key", |
309 WrapToCommand(base::Bind(&ExecuteRemoveStorageItem, kLocalStorage))), | 366 WrapToCommand("RemoveLocalStorageItem", |
| 367 base::Bind(&ExecuteRemoveStorageItem, kLocalStorage))), |
310 CommandMapping( | 368 CommandMapping( |
311 kGet, | 369 kGet, |
312 "session/:sessionId/local_storage", | 370 "session/:sessionId/local_storage", |
313 WrapToCommand(base::Bind(&ExecuteGetStorageKeys, kLocalStorage))), | 371 WrapToCommand("GetLocalStorageKeys", |
| 372 base::Bind(&ExecuteGetStorageKeys, kLocalStorage))), |
314 CommandMapping( | 373 CommandMapping( |
315 kPost, | 374 kPost, |
316 "session/:sessionId/local_storage", | 375 "session/:sessionId/local_storage", |
317 WrapToCommand(base::Bind(&ExecuteSetStorageItem, kLocalStorage))), | 376 WrapToCommand("SetLocalStorageKeys", |
| 377 base::Bind(&ExecuteSetStorageItem, kLocalStorage))), |
318 CommandMapping( | 378 CommandMapping( |
319 kDelete, | 379 kDelete, |
320 "session/:sessionId/local_storage", | 380 "session/:sessionId/local_storage", |
321 WrapToCommand(base::Bind(&ExecuteClearStorage, kLocalStorage))), | 381 WrapToCommand("ClearLocalStorage", |
| 382 base::Bind(&ExecuteClearStorage, kLocalStorage))), |
322 CommandMapping( | 383 CommandMapping( |
323 kGet, | 384 kGet, |
324 "session/:sessionId/local_storage/size", | 385 "session/:sessionId/local_storage/size", |
325 WrapToCommand(base::Bind(&ExecuteGetStorageSize, kLocalStorage))), | 386 WrapToCommand("GetLocalStorageSize", |
| 387 base::Bind(&ExecuteGetStorageSize, kLocalStorage))), |
326 CommandMapping( | 388 CommandMapping( |
327 kGet, | 389 kGet, |
328 "session/:sessionId/session_storage/key/:key", | 390 "session/:sessionId/session_storage/key/:key", |
329 WrapToCommand(base::Bind(&ExecuteGetStorageItem, kSessionStorage))), | 391 WrapToCommand("GetSessionStorageItem", |
| 392 base::Bind(&ExecuteGetStorageItem, kSessionStorage))), |
330 CommandMapping(kDelete, | 393 CommandMapping(kDelete, |
331 "session/:sessionId/session_storage/key/:key", | 394 "session/:sessionId/session_storage/key/:key", |
332 WrapToCommand(base::Bind(&ExecuteRemoveStorageItem, | 395 WrapToCommand("RemoveSessionStorageItem", |
| 396 base::Bind(&ExecuteRemoveStorageItem, |
333 kSessionStorage))), | 397 kSessionStorage))), |
334 CommandMapping( | 398 CommandMapping( |
335 kGet, | 399 kGet, |
336 "session/:sessionId/session_storage", | 400 "session/:sessionId/session_storage", |
337 WrapToCommand(base::Bind(&ExecuteGetStorageKeys, kSessionStorage))), | 401 WrapToCommand("GetSessionStorageKeys", |
| 402 base::Bind(&ExecuteGetStorageKeys, kSessionStorage))), |
338 CommandMapping( | 403 CommandMapping( |
339 kPost, | 404 kPost, |
340 "session/:sessionId/session_storage", | 405 "session/:sessionId/session_storage", |
341 WrapToCommand(base::Bind(&ExecuteSetStorageItem, kSessionStorage))), | 406 WrapToCommand("SetSessionStorageItem", |
| 407 base::Bind(&ExecuteSetStorageItem, kSessionStorage))), |
342 CommandMapping( | 408 CommandMapping( |
343 kDelete, | 409 kDelete, |
344 "session/:sessionId/session_storage", | 410 "session/:sessionId/session_storage", |
345 WrapToCommand(base::Bind(&ExecuteClearStorage, kSessionStorage))), | 411 WrapToCommand("ClearSessionStorage", |
| 412 base::Bind(&ExecuteClearStorage, kSessionStorage))), |
346 CommandMapping( | 413 CommandMapping( |
347 kGet, | 414 kGet, |
348 "session/:sessionId/session_storage/size", | 415 "session/:sessionId/session_storage/size", |
349 WrapToCommand(base::Bind(&ExecuteGetStorageSize, kSessionStorage))), | 416 WrapToCommand("GetSessionStorageSize", |
| 417 base::Bind(&ExecuteGetStorageSize, kSessionStorage))), |
350 CommandMapping(kGet, | 418 CommandMapping(kGet, |
351 "session/:sessionId/orientation", | 419 "session/:sessionId/orientation", |
352 base::Bind(&UnimplementedCommand)), | 420 base::Bind(&UnimplementedCommand)), |
353 CommandMapping(kPost, | 421 CommandMapping(kPost, |
354 "session/:sessionId/orientation", | 422 "session/:sessionId/orientation", |
355 base::Bind(&UnimplementedCommand)), | 423 base::Bind(&UnimplementedCommand)), |
356 CommandMapping(kPost, | 424 CommandMapping(kPost, |
357 "session/:sessionId/click", | 425 "session/:sessionId/click", |
358 WrapToCommand(base::Bind(&ExecuteMouseClick))), | 426 WrapToCommand("Click", base::Bind(&ExecuteMouseClick))), |
359 CommandMapping(kPost, | 427 CommandMapping( |
360 "session/:sessionId/doubleclick", | 428 kPost, |
361 WrapToCommand(base::Bind(&ExecuteMouseDoubleClick))), | 429 "session/:sessionId/doubleclick", |
362 CommandMapping(kPost, | 430 WrapToCommand("DoubleClick", base::Bind(&ExecuteMouseDoubleClick))), |
363 "session/:sessionId/buttondown", | 431 CommandMapping( |
364 WrapToCommand(base::Bind(&ExecuteMouseButtonDown))), | 432 kPost, |
365 CommandMapping(kPost, | 433 "session/:sessionId/buttondown", |
366 "session/:sessionId/buttonup", | 434 WrapToCommand("MouseDown", base::Bind(&ExecuteMouseButtonDown))), |
367 WrapToCommand(base::Bind(&ExecuteMouseButtonUp))), | 435 CommandMapping( |
368 CommandMapping(kPost, | 436 kPost, |
369 "session/:sessionId/moveto", | 437 "session/:sessionId/buttonup", |
370 WrapToCommand(base::Bind(&ExecuteMouseMoveTo))), | 438 WrapToCommand("MouseUp", base::Bind(&ExecuteMouseButtonUp))), |
| 439 CommandMapping( |
| 440 kPost, |
| 441 "session/:sessionId/moveto", |
| 442 WrapToCommand("MouseMove", base::Bind(&ExecuteMouseMoveTo))), |
371 CommandMapping( | 443 CommandMapping( |
372 kPost, | 444 kPost, |
373 "session/:sessionId/keys", | 445 "session/:sessionId/keys", |
374 WrapToCommand(base::Bind(&ExecuteSendKeysToActiveElement))), | 446 WrapToCommand("Type", base::Bind(&ExecuteSendKeysToActiveElement))), |
375 CommandMapping(kGet, | 447 CommandMapping(kGet, |
376 "session/:sessionId/ime/available_engines", | 448 "session/:sessionId/ime/available_engines", |
377 base::Bind(&UnimplementedCommand)), | 449 base::Bind(&UnimplementedCommand)), |
378 CommandMapping(kGet, | 450 CommandMapping(kGet, |
379 "session/:sessionId/ime/active_engine", | 451 "session/:sessionId/ime/active_engine", |
380 base::Bind(&UnimplementedCommand)), | 452 base::Bind(&UnimplementedCommand)), |
381 CommandMapping(kGet, | 453 CommandMapping(kGet, |
382 "session/:sessionId/ime/activated", | 454 "session/:sessionId/ime/activated", |
383 base::Bind(&UnimplementedCommand)), | 455 base::Bind(&UnimplementedCommand)), |
384 CommandMapping(kPost, | 456 CommandMapping(kPost, |
385 "session/:sessionId/ime/deactivate", | 457 "session/:sessionId/ime/deactivate", |
386 base::Bind(&UnimplementedCommand)), | 458 base::Bind(&UnimplementedCommand)), |
387 CommandMapping(kPost, | 459 CommandMapping(kPost, |
388 "session/:sessionId/ime/activate", | 460 "session/:sessionId/ime/activate", |
389 base::Bind(&UnimplementedCommand)), | 461 base::Bind(&UnimplementedCommand)), |
390 CommandMapping(kPost, | 462 CommandMapping(kPost, |
391 "session/:sessionId/touch/click", | 463 "session/:sessionId/touch/click", |
392 WrapToCommand(base::Bind(&ExecuteTouchSingleTap))), | 464 WrapToCommand("Tap", base::Bind(&ExecuteTouchSingleTap))), |
393 CommandMapping(kPost, | 465 CommandMapping(kPost, |
394 "session/:sessionId/touch/down", | 466 "session/:sessionId/touch/down", |
395 WrapToCommand(base::Bind(&ExecuteTouchDown))), | 467 WrapToCommand("TouchDown", base::Bind(&ExecuteTouchDown))), |
396 CommandMapping(kPost, | 468 CommandMapping(kPost, |
397 "session/:sessionId/touch/up", | 469 "session/:sessionId/touch/up", |
398 WrapToCommand(base::Bind(&ExecuteTouchUp))), | 470 WrapToCommand("TouchUp", base::Bind(&ExecuteTouchUp))), |
399 CommandMapping(kPost, | 471 CommandMapping(kPost, |
400 "session/:sessionId/touch/move", | 472 "session/:sessionId/touch/move", |
401 WrapToCommand(base::Bind(&ExecuteTouchMove))), | 473 WrapToCommand("TouchMove", base::Bind(&ExecuteTouchMove))), |
402 CommandMapping(kPost, | 474 CommandMapping(kPost, |
403 "session/:sessionId/touch/scroll", | 475 "session/:sessionId/touch/scroll", |
404 base::Bind(&UnimplementedCommand)), | 476 base::Bind(&UnimplementedCommand)), |
405 CommandMapping(kPost, | 477 CommandMapping(kPost, |
406 "session/:sessionId/touch/doubleclick", | 478 "session/:sessionId/touch/doubleclick", |
407 base::Bind(&UnimplementedCommand)), | 479 base::Bind(&UnimplementedCommand)), |
408 CommandMapping(kPost, | 480 CommandMapping(kPost, |
409 "session/:sessionId/touch/longclick", | 481 "session/:sessionId/touch/longclick", |
410 base::Bind(&UnimplementedCommand)), | 482 base::Bind(&UnimplementedCommand)), |
411 CommandMapping(kPost, | 483 CommandMapping(kPost, |
412 "session/:sessionId/touch/flick", | 484 "session/:sessionId/touch/flick", |
413 base::Bind(&UnimplementedCommand)), | 485 base::Bind(&UnimplementedCommand)), |
414 CommandMapping(kPost, | 486 CommandMapping(kPost, |
415 "session/:sessionId/log", | 487 "session/:sessionId/log", |
416 WrapToCommand(base::Bind(&ExecuteGetLog))), | 488 WrapToCommand("GetLog", base::Bind(&ExecuteGetLog))), |
417 CommandMapping(kGet, | 489 CommandMapping(kGet, |
418 "session/:sessionId/log/types", | 490 "session/:sessionId/log/types", |
419 WrapToCommand(base::Bind(&ExecuteGetAvailableLogTypes))), | 491 WrapToCommand("GetLogTypes", |
| 492 base::Bind(&ExecuteGetAvailableLogTypes))), |
420 CommandMapping(kPost, "logs", base::Bind(&UnimplementedCommand)), | 493 CommandMapping(kPost, "logs", base::Bind(&UnimplementedCommand)), |
421 CommandMapping(kGet, "status", base::Bind(&ExecuteGetStatus)), | 494 CommandMapping(kGet, "status", base::Bind(&ExecuteGetStatus)), |
422 | 495 |
423 // Custom Chrome commands: | 496 // Custom Chrome commands: |
424 // Allow quit all to be called with GET or POST. | 497 // Allow quit all to be called with GET or POST. |
425 CommandMapping(kGet, | 498 CommandMapping( |
426 kShutdownPath, | 499 kGet, |
427 base::Bind(&ExecuteQuitAll, | 500 kShutdownPath, |
428 WrapToCommand(base::Bind(&ExecuteQuit, true)), | 501 base::Bind(&ExecuteQuitAll, |
429 &session_thread_map_)), | 502 WrapToCommand("QuitAll", base::Bind(&ExecuteQuit, true)), |
430 CommandMapping(kPost, | 503 &session_thread_map_)), |
431 kShutdownPath, | 504 CommandMapping( |
432 base::Bind(&ExecuteQuitAll, | 505 kPost, |
433 WrapToCommand(base::Bind(&ExecuteQuit, true)), | 506 kShutdownPath, |
434 &session_thread_map_)), | 507 base::Bind(&ExecuteQuitAll, |
| 508 WrapToCommand("QuitAll", base::Bind(&ExecuteQuit, true)), |
| 509 &session_thread_map_)), |
435 CommandMapping(kGet, | 510 CommandMapping(kGet, |
436 "session/:sessionId/is_loading", | 511 "session/:sessionId/is_loading", |
437 WrapToCommand(base::Bind(&ExecuteIsLoading))), }; | 512 WrapToCommand("IsLoading", base::Bind(&ExecuteIsLoading))), |
| 513 }; |
438 command_map_.reset( | 514 command_map_.reset( |
439 new CommandMap(commands, commands + arraysize(commands))); | 515 new CommandMap(commands, commands + arraysize(commands))); |
440 } | 516 } |
441 | 517 |
442 HttpHandler::~HttpHandler() {} | 518 HttpHandler::~HttpHandler() {} |
443 | 519 |
444 void HttpHandler::Handle(const net::HttpServerRequestInfo& request, | 520 void HttpHandler::Handle(const net::HttpServerRequestInfo& request, |
445 const HttpResponseSenderFunc& send_response_func) { | 521 const HttpResponseSenderFunc& send_response_func) { |
446 CHECK(thread_checker_.CalledOnValidThread()); | 522 CHECK(thread_checker_.CalledOnValidThread()); |
447 | 523 |
(...skipping 11 matching lines...) Expand all Loading... |
459 | 535 |
460 path.erase(0, url_base_.length()); | 536 path.erase(0, url_base_.length()); |
461 | 537 |
462 HandleCommand(request, path, send_response_func); | 538 HandleCommand(request, path, send_response_func); |
463 | 539 |
464 if (path == kShutdownPath) | 540 if (path == kShutdownPath) |
465 received_shutdown_ = true; | 541 received_shutdown_ = true; |
466 } | 542 } |
467 | 543 |
468 Command HttpHandler::WrapToCommand( | 544 Command HttpHandler::WrapToCommand( |
| 545 const char* name, |
469 const SessionCommand& session_command) { | 546 const SessionCommand& session_command) { |
470 return base::Bind( | 547 return base::Bind(&ExecuteSessionCommand, |
471 &ExecuteSessionCommand, &session_thread_map_, session_command, false); | 548 &session_thread_map_, |
| 549 name, |
| 550 session_command, |
| 551 false); |
472 } | 552 } |
473 | 553 |
474 Command HttpHandler::WrapToCommand( | 554 Command HttpHandler::WrapToCommand( |
| 555 const char* name, |
475 const WindowCommand& window_command) { | 556 const WindowCommand& window_command) { |
476 return WrapToCommand( | 557 return WrapToCommand(name, base::Bind(&ExecuteWindowCommand, window_command)); |
477 base::Bind(&ExecuteWindowCommand, window_command)); | |
478 } | 558 } |
479 | 559 |
480 Command HttpHandler::WrapToCommand( | 560 Command HttpHandler::WrapToCommand( |
| 561 const char* name, |
481 const ElementCommand& element_command) { | 562 const ElementCommand& element_command) { |
482 return WrapToCommand( | 563 return WrapToCommand(name, |
483 base::Bind(&ExecuteElementCommand, element_command)); | 564 base::Bind(&ExecuteElementCommand, element_command)); |
484 } | 565 } |
485 | 566 |
486 void HttpHandler::HandleCommand( | 567 void HttpHandler::HandleCommand( |
487 const net::HttpServerRequestInfo& request, | 568 const net::HttpServerRequestInfo& request, |
488 const std::string& trimmed_path, | 569 const std::string& trimmed_path, |
489 const HttpResponseSenderFunc& send_response_func) { | 570 const HttpResponseSenderFunc& send_response_func) { |
490 if (IsVLogOn(0)) { | |
491 VLOG(0) << "Handling command: " << request.method << " " << trimmed_path | |
492 << " " << FormatJsonForDisplay(request.data); | |
493 } | |
494 | |
495 base::DictionaryValue params; | 571 base::DictionaryValue params; |
496 std::string session_id; | 572 std::string session_id; |
497 CommandMap::const_iterator iter = command_map_->begin(); | 573 CommandMap::const_iterator iter = command_map_->begin(); |
498 while (true) { | 574 while (true) { |
499 if (iter == command_map_->end()) { | 575 if (iter == command_map_->end()) { |
500 scoped_ptr<net::HttpServerResponseInfo> response( | 576 scoped_ptr<net::HttpServerResponseInfo> response( |
501 new net::HttpServerResponseInfo(net::HTTP_NOT_FOUND)); | 577 new net::HttpServerResponseInfo(net::HTTP_NOT_FOUND)); |
502 response->SetBody("unknown command: " + trimmed_path, "text/plain"); | 578 response->SetBody("unknown command: " + trimmed_path, "text/plain"); |
503 send_response_func.Run(response.Pass()); | 579 send_response_func.Run(response.Pass()); |
504 return; | 580 return; |
(...skipping 28 matching lines...) Expand all Loading... |
533 | 609 |
534 void HttpHandler::PrepareResponse( | 610 void HttpHandler::PrepareResponse( |
535 const std::string& trimmed_path, | 611 const std::string& trimmed_path, |
536 const HttpResponseSenderFunc& send_response_func, | 612 const HttpResponseSenderFunc& send_response_func, |
537 const Status& status, | 613 const Status& status, |
538 scoped_ptr<base::Value> value, | 614 scoped_ptr<base::Value> value, |
539 const std::string& session_id) { | 615 const std::string& session_id) { |
540 CHECK(thread_checker_.CalledOnValidThread()); | 616 CHECK(thread_checker_.CalledOnValidThread()); |
541 scoped_ptr<net::HttpServerResponseInfo> response = | 617 scoped_ptr<net::HttpServerResponseInfo> response = |
542 PrepareResponseHelper(trimmed_path, status, value.Pass(), session_id); | 618 PrepareResponseHelper(trimmed_path, status, value.Pass(), session_id); |
543 if (IsVLogOn(0)) { | |
544 VLOG(0) << "Sending response: " << response->status_code() << " " | |
545 << FormatJsonForDisplay(response->body()); | |
546 } | |
547 send_response_func.Run(response.Pass()); | 619 send_response_func.Run(response.Pass()); |
548 if (trimmed_path == kShutdownPath) | 620 if (trimmed_path == kShutdownPath) |
549 quit_func_.Run(); | 621 quit_func_.Run(); |
550 } | 622 } |
551 | 623 |
552 scoped_ptr<net::HttpServerResponseInfo> HttpHandler::PrepareResponseHelper( | 624 scoped_ptr<net::HttpServerResponseInfo> HttpHandler::PrepareResponseHelper( |
553 const std::string& trimmed_path, | 625 const std::string& trimmed_path, |
554 const Status& status, | 626 const Status& status, |
555 scoped_ptr<base::Value> value, | 627 scoped_ptr<base::Value> value, |
556 const std::string& session_id) { | 628 const std::string& session_id) { |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
643 params.SetString(name, path_parts[i]); | 715 params.SetString(name, path_parts[i]); |
644 } else if (command_path_parts[i] != path_parts[i]) { | 716 } else if (command_path_parts[i] != path_parts[i]) { |
645 return false; | 717 return false; |
646 } | 718 } |
647 } | 719 } |
648 out_params->MergeDictionary(¶ms); | 720 out_params->MergeDictionary(¶ms); |
649 return true; | 721 return true; |
650 } | 722 } |
651 | 723 |
652 } // namespace internal | 724 } // namespace internal |
OLD | NEW |