Chromium Code Reviews| 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/chrome/chrome_desktop_impl.h" | 5 #include "chrome/test/chromedriver/chrome/chrome_desktop_impl.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
| 11 #include "base/logging.h" | 11 #include "base/logging.h" |
| 12 #include "base/memory/ptr_util.h" | |
| 12 #include "base/posix/eintr_wrapper.h" | 13 #include "base/posix/eintr_wrapper.h" |
| 13 #include "base/process/kill.h" | 14 #include "base/process/kill.h" |
| 14 #include "base/strings/string_util.h" | 15 #include "base/strings/string_util.h" |
| 15 #include "base/sys_info.h" | 16 #include "base/sys_info.h" |
| 16 #include "base/threading/platform_thread.h" | 17 #include "base/threading/platform_thread.h" |
| 17 #include "base/time/time.h" | 18 #include "base/time/time.h" |
| 18 #include "build/build_config.h" | 19 #include "build/build_config.h" |
| 19 #include "chrome/test/chromedriver/chrome/automation_extension.h" | 20 #include "chrome/test/chromedriver/chrome/automation_extension.h" |
| 20 #include "chrome/test/chromedriver/chrome/devtools_client.h" | 21 #include "chrome/test/chromedriver/chrome/devtools_client.h" |
| 21 #include "chrome/test/chromedriver/chrome/devtools_event_listener.h" | 22 #include "chrome/test/chromedriver/chrome/devtools_event_listener.h" |
| (...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 226 } | 227 } |
| 227 | 228 |
| 228 int ChromeDesktopImpl::GetNetworkConnection() const { | 229 int ChromeDesktopImpl::GetNetworkConnection() const { |
| 229 return network_connection_; | 230 return network_connection_; |
| 230 } | 231 } |
| 231 | 232 |
| 232 void ChromeDesktopImpl::SetNetworkConnection( | 233 void ChromeDesktopImpl::SetNetworkConnection( |
| 233 int network_connection) { | 234 int network_connection) { |
| 234 network_connection_ = network_connection; | 235 network_connection_ = network_connection; |
| 235 } | 236 } |
| 237 | |
| 238 Status ChromeDesktopImpl::GetWindowPosition(std::string target_id, | |
| 239 int* x, | |
| 240 int* y) { | |
| 241 Window window; | |
| 242 Status status = GetWindow(target_id, &window); | |
| 243 if (status.IsError()) | |
| 244 return status; | |
| 245 | |
| 246 *x = window.left; | |
| 247 *y = window.top; | |
| 248 return Status(kOk); | |
| 249 } | |
| 250 | |
| 251 Status ChromeDesktopImpl::GetWindowSize(std::string target_id, | |
| 252 int* width, | |
| 253 int* height) { | |
| 254 Window window; | |
| 255 Status status = GetWindow(target_id, &window); | |
| 256 if (status.IsError()) | |
| 257 return status; | |
| 258 | |
| 259 *width = window.width; | |
| 260 *height = window.height; | |
| 261 return Status(kOk); | |
| 262 } | |
| 263 | |
| 264 Status ChromeDesktopImpl::SetWindowPosition(std::string window, int x, int y) { | |
| 265 auto bounds = base::MakeUnique<base::DictionaryValue>(); | |
| 266 bounds->SetInteger("left", x); | |
| 267 bounds->SetInteger("top", y); | |
| 268 return SetWindowBounds(window, std::move(bounds)); | |
| 269 } | |
| 270 | |
| 271 Status ChromeDesktopImpl::SetWindowSize(std::string window, | |
| 272 int width, | |
| 273 int height) { | |
| 274 auto bounds = base::MakeUnique<base::DictionaryValue>(); | |
| 275 bounds->SetInteger("width", width); | |
| 276 bounds->SetInteger("height", height); | |
| 277 return SetWindowBounds(window, std::move(bounds)); | |
| 278 } | |
| 279 | |
| 280 Status ChromeDesktopImpl::MaximizeWindow(std::string target_id) { | |
| 281 Window window; | |
| 282 Status status = GetWindow(target_id, &window); | |
| 283 if (status.IsError()) | |
| 284 return status; | |
| 285 | |
| 286 if (window.state == "maximized") | |
| 287 return Status(kOk); | |
| 288 | |
| 289 if (window.state != "normal") { | |
| 290 // always restore window to normal first. | |
|
stgao
2017/04/21 05:06:31
Maybe some more detail on why.
jzfeng
2017/04/21 07:25:54
Done.
| |
| 291 status = SetWindowState(window.id, "normal"); | |
| 292 if (status.IsError()) | |
| 293 return status; | |
| 294 } | |
| 295 | |
| 296 return SetWindowState(window.id, "maximized"); | |
| 297 } | |
| 298 | |
| 299 Status ChromeDesktopImpl::ParseWindow( | |
| 300 std::unique_ptr<base::DictionaryValue> params, | |
| 301 Window* window) { | |
| 302 if (!params->GetInteger("windowId", &window->id)) | |
| 303 return Status(kUnknownError, "no window id in response"); | |
| 304 | |
| 305 const base::Value* value = nullptr; | |
| 306 const base::DictionaryValue* bounds_dict = nullptr; | |
| 307 if (!params->Get("bounds", &value) || !value->GetAsDictionary(&bounds_dict)) | |
| 308 return Status(kUnknownError, "no window bounds in response"); | |
| 309 | |
| 310 if (!bounds_dict->GetString("windowState", &window->state)) | |
| 311 return Status(kUnknownError, "no window state in window bounds"); | |
| 312 | |
| 313 if (!bounds_dict->GetInteger("left", &window->left)) | |
| 314 return Status(kUnknownError, "no left offset in window bounds"); | |
| 315 if (!bounds_dict->GetInteger("top", &window->top)) | |
| 316 return Status(kUnknownError, "no top offset in window bounds"); | |
| 317 if (!bounds_dict->GetInteger("width", &window->width)) | |
| 318 return Status(kUnknownError, "no width in window bounds"); | |
| 319 if (!bounds_dict->GetInteger("height", &window->height)) | |
| 320 return Status(kUnknownError, "no height in window bounds"); | |
| 321 | |
| 322 return Status(kOk); | |
| 323 } | |
| 324 | |
| 325 Status ChromeDesktopImpl::GetWindow(std::string target_id, Window* window) { | |
| 326 Status status = devtools_websocket_client_->ConnectIfNecessary(); | |
| 327 if (status.IsError()) | |
| 328 return status; | |
| 329 | |
| 330 base::DictionaryValue params; | |
| 331 params.SetString("targetId", target_id); | |
| 332 std::unique_ptr<base::DictionaryValue> result; | |
| 333 status = devtools_websocket_client_->SendCommandAndGetResult( | |
| 334 "Browser.getWindowForTarget", params, &result); | |
| 335 if (status.IsError()) | |
| 336 return status; | |
| 337 | |
| 338 return ParseWindow(std::move(result), window); | |
| 339 } | |
| 340 | |
| 341 Status ChromeDesktopImpl::SetWindowState(int window_id, | |
| 342 std::string window_state) { | |
| 343 Status status = devtools_websocket_client_->ConnectIfNecessary(); | |
| 344 if (status.IsError()) | |
| 345 return status; | |
| 346 | |
| 347 base::DictionaryValue params; | |
| 348 params.SetInteger("windowId", window_id); | |
| 349 auto bounds_object = base::MakeUnique<base::DictionaryValue>(); | |
| 350 bounds_object->SetString("windowState", window_state); | |
| 351 params.Set("bounds", std::move(bounds_object)); | |
| 352 status = devtools_websocket_client_->SendCommand("Browser.setWindowBounds", | |
| 353 params); | |
| 354 if (status.IsError()) | |
| 355 return status; | |
| 356 | |
| 357 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(100)); | |
| 358 return Status(kOk); | |
| 359 } | |
| 360 | |
| 361 Status ChromeDesktopImpl::SetWindowBounds( | |
| 362 std::string target_id, | |
| 363 std::unique_ptr<base::DictionaryValue> bounds) { | |
| 364 Window window; | |
| 365 Status status = GetWindow(target_id, &window); | |
| 366 if (status.IsError()) | |
| 367 return status; | |
| 368 | |
| 369 if (window.state != "normal") { | |
| 370 status = SetWindowState(window.id, "normal"); | |
| 371 if (status.IsError()) | |
| 372 return status; | |
| 373 } | |
| 374 | |
| 375 base::DictionaryValue params; | |
| 376 params.SetInteger("windowId", window.id); | |
| 377 params.Set("bounds", std::move(bounds)); | |
| 378 status = devtools_websocket_client_->SendCommand("Browser.setWindowBounds", | |
| 379 params); | |
| 380 if (status.IsError()) | |
| 381 return status; | |
| 382 | |
| 383 return Status(kOk); | |
| 384 } | |
| OLD | NEW |