Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(776)

Unified Diff: chrome/test/chromedriver/chrome/chrome_desktop_impl.cc

Issue 2826393002: use devtools command to do window management (Closed)
Patch Set: nit change Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/test/chromedriver/chrome/chrome_desktop_impl.h ('k') | chrome/test/chromedriver/session_commands.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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..05613c408b12d1831d7407908888e05f30ec4c69 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,155 @@ void ChromeDesktopImpl::SetNetworkConnection(
int network_connection) {
network_connection_ = network_connection;
}
+
+Status ChromeDesktopImpl::GetWindowPosition(const 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(const 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(const std::string& target_id,
+ int x,
+ int y) {
+ auto bounds = base::MakeUnique<base::DictionaryValue>();
+ bounds->SetInteger("left", x);
+ bounds->SetInteger("top", y);
+ return SetWindowBounds(target_id, std::move(bounds));
+}
+
+Status ChromeDesktopImpl::SetWindowSize(const std::string& target_id,
+ int width,
+ int height) {
+ auto bounds = base::MakeUnique<base::DictionaryValue>();
+ bounds->SetInteger("width", width);
+ bounds->SetInteger("height", height);
+ return SetWindowBounds(target_id, std::move(bounds));
+}
+
+Status ChromeDesktopImpl::MaximizeWindow(const 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, since chrome ui doesn't allow
+ // maximizing a minimized or fullscreen window.
+ 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(const 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,
+ const 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(
+ const 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);
+}
« no previous file with comments | « chrome/test/chromedriver/chrome/chrome_desktop_impl.h ('k') | chrome/test/chromedriver/session_commands.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698