Chromium Code Reviews| Index: chrome/test/chromedriver/chrome/chrome_desktop_impl.cc |
| diff --git a/chrome/test/chromedriver/chrome/chrome_desktop_impl.cc b/chrome/test/chromedriver/chrome/chrome_desktop_impl.cc |
| index c2deb622d93b0e9a6eaa1a767a3b944cfab39926..4678aceb731d39acf245e76b9b3edec2ca0a2fa0 100644 |
| --- a/chrome/test/chromedriver/chrome/chrome_desktop_impl.cc |
| +++ b/chrome/test/chromedriver/chrome/chrome_desktop_impl.cc |
| @@ -9,6 +9,7 @@ |
| #include "base/files/file_path.h" |
| #include "base/logging.h" |
| +#include "base/memory/ptr_util.h" |
| #include "base/posix/eintr_wrapper.h" |
| #include "base/process/kill.h" |
| #include "base/strings/string_util.h" |
| @@ -233,3 +234,151 @@ void ChromeDesktopImpl::SetNetworkConnection( |
| int network_connection) { |
| network_connection_ = network_connection; |
| } |
| + |
| +Status ChromeDesktopImpl::GetWindowPosition(std::string target_id, |
| + int* x, |
| + int* y) { |
| + Window window; |
| + Status status = GetWindow(target_id, &window); |
| + if (status.IsError()) |
| + return status; |
| + |
| + *x = window.left; |
| + *y = window.top; |
| + return Status(kOk); |
| +} |
| + |
| +Status ChromeDesktopImpl::GetWindowSize(std::string target_id, |
| + int* width, |
| + int* height) { |
| + Window window; |
| + Status status = GetWindow(target_id, &window); |
| + if (status.IsError()) |
| + return status; |
| + |
| + *width = window.width; |
| + *height = window.height; |
| + return Status(kOk); |
| +} |
| + |
| +Status ChromeDesktopImpl::SetWindowPosition(std::string window, int x, int y) { |
| + auto bounds = base::MakeUnique<base::DictionaryValue>(); |
| + bounds->SetInteger("left", x); |
| + bounds->SetInteger("top", y); |
| + return SetWindowBounds(window, std::move(bounds)); |
| +} |
| + |
| +Status ChromeDesktopImpl::SetWindowSize(std::string window, |
| + int width, |
| + int height) { |
| + auto bounds = base::MakeUnique<base::DictionaryValue>(); |
| + bounds->SetInteger("width", width); |
| + bounds->SetInteger("height", height); |
| + return SetWindowBounds(window, std::move(bounds)); |
| +} |
| + |
| +Status ChromeDesktopImpl::MaximizeWindow(std::string target_id) { |
| + Window window; |
| + Status status = GetWindow(target_id, &window); |
| + if (status.IsError()) |
| + return status; |
| + |
| + if (window.state == "maximized") |
| + return Status(kOk); |
| + |
| + if (window.state != "normal") { |
| + // 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.
|
| + status = SetWindowState(window.id, "normal"); |
| + if (status.IsError()) |
| + return status; |
| + } |
| + |
| + return SetWindowState(window.id, "maximized"); |
| +} |
| + |
| +Status ChromeDesktopImpl::ParseWindow( |
| + std::unique_ptr<base::DictionaryValue> params, |
| + Window* window) { |
| + if (!params->GetInteger("windowId", &window->id)) |
| + return Status(kUnknownError, "no window id in response"); |
| + |
| + const base::Value* value = nullptr; |
| + const base::DictionaryValue* bounds_dict = nullptr; |
| + if (!params->Get("bounds", &value) || !value->GetAsDictionary(&bounds_dict)) |
| + return Status(kUnknownError, "no window bounds in response"); |
| + |
| + if (!bounds_dict->GetString("windowState", &window->state)) |
| + return Status(kUnknownError, "no window state in window bounds"); |
| + |
| + if (!bounds_dict->GetInteger("left", &window->left)) |
| + return Status(kUnknownError, "no left offset in window bounds"); |
| + if (!bounds_dict->GetInteger("top", &window->top)) |
| + return Status(kUnknownError, "no top offset in window bounds"); |
| + if (!bounds_dict->GetInteger("width", &window->width)) |
| + return Status(kUnknownError, "no width in window bounds"); |
| + if (!bounds_dict->GetInteger("height", &window->height)) |
| + return Status(kUnknownError, "no height in window bounds"); |
| + |
| + return Status(kOk); |
| +} |
| + |
| +Status ChromeDesktopImpl::GetWindow(std::string target_id, Window* window) { |
| + Status status = devtools_websocket_client_->ConnectIfNecessary(); |
| + if (status.IsError()) |
| + return status; |
| + |
| + base::DictionaryValue params; |
| + params.SetString("targetId", target_id); |
| + std::unique_ptr<base::DictionaryValue> result; |
| + status = devtools_websocket_client_->SendCommandAndGetResult( |
| + "Browser.getWindowForTarget", params, &result); |
| + if (status.IsError()) |
| + return status; |
| + |
| + return ParseWindow(std::move(result), window); |
| +} |
| + |
| +Status ChromeDesktopImpl::SetWindowState(int window_id, |
| + std::string window_state) { |
| + Status status = devtools_websocket_client_->ConnectIfNecessary(); |
| + if (status.IsError()) |
| + return status; |
| + |
| + base::DictionaryValue params; |
| + params.SetInteger("windowId", window_id); |
| + auto bounds_object = base::MakeUnique<base::DictionaryValue>(); |
| + bounds_object->SetString("windowState", window_state); |
| + params.Set("bounds", std::move(bounds_object)); |
| + status = devtools_websocket_client_->SendCommand("Browser.setWindowBounds", |
| + params); |
| + if (status.IsError()) |
| + return status; |
| + |
| + base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(100)); |
| + return Status(kOk); |
| +} |
| + |
| +Status ChromeDesktopImpl::SetWindowBounds( |
| + std::string target_id, |
| + std::unique_ptr<base::DictionaryValue> bounds) { |
| + Window window; |
| + Status status = GetWindow(target_id, &window); |
| + if (status.IsError()) |
| + return status; |
| + |
| + if (window.state != "normal") { |
| + status = SetWindowState(window.id, "normal"); |
| + if (status.IsError()) |
| + return status; |
| + } |
| + |
| + base::DictionaryValue params; |
| + params.SetInteger("windowId", window.id); |
| + params.Set("bounds", std::move(bounds)); |
| + status = devtools_websocket_client_->SendCommand("Browser.setWindowBounds", |
| + params); |
| + if (status.IsError()) |
| + return status; |
| + |
| + return Status(kOk); |
| +} |