Commit be8ffd36 authored by jzfeng's avatar jzfeng Committed by Commit bot

fix testWindowMaximize bug

Add sleep to SetWindowBounds to give chrome ui enough time to respond to devtools command.

BUG=chromedriver:1779

Review-Url: https://codereview.chromium.org/2836023003
Cr-Commit-Position: refs/heads/master@{#467893}
parent 93637728
...@@ -264,19 +264,47 @@ Status ChromeDesktopImpl::GetWindowSize(const std::string& target_id, ...@@ -264,19 +264,47 @@ Status ChromeDesktopImpl::GetWindowSize(const std::string& target_id,
Status ChromeDesktopImpl::SetWindowPosition(const std::string& target_id, Status ChromeDesktopImpl::SetWindowPosition(const std::string& target_id,
int x, int x,
int y) { int y) {
Window window;
Status status = GetWindow(target_id, &window);
if (status.IsError())
return status;
if (window.state != "normal") {
// restore window to normal first to allow position change.
auto bounds = base::MakeUnique<base::DictionaryValue>();
bounds->SetString("windowState", "normal");
status = SetWindowBounds(window.id, std::move(bounds));
if (status.IsError())
return status;
}
auto bounds = base::MakeUnique<base::DictionaryValue>(); auto bounds = base::MakeUnique<base::DictionaryValue>();
bounds->SetInteger("left", x); bounds->SetInteger("left", x);
bounds->SetInteger("top", y); bounds->SetInteger("top", y);
return SetWindowBounds(target_id, std::move(bounds)); return SetWindowBounds(window.id, std::move(bounds));
} }
Status ChromeDesktopImpl::SetWindowSize(const std::string& target_id, Status ChromeDesktopImpl::SetWindowSize(const std::string& target_id,
int width, int width,
int height) { int height) {
Window window;
Status status = GetWindow(target_id, &window);
if (status.IsError())
return status;
if (window.state != "normal") {
// restore window to normal first to allow size change.
auto bounds = base::MakeUnique<base::DictionaryValue>();
bounds->SetString("windowState", "normal");
status = SetWindowBounds(window.id, std::move(bounds));
if (status.IsError())
return status;
}
auto bounds = base::MakeUnique<base::DictionaryValue>(); auto bounds = base::MakeUnique<base::DictionaryValue>();
bounds->SetInteger("width", width); bounds->SetInteger("width", width);
bounds->SetInteger("height", height); bounds->SetInteger("height", height);
return SetWindowBounds(target_id, std::move(bounds)); return SetWindowBounds(window.id, std::move(bounds));
} }
Status ChromeDesktopImpl::MaximizeWindow(const std::string& target_id) { Status ChromeDesktopImpl::MaximizeWindow(const std::string& target_id) {
...@@ -291,20 +319,21 @@ Status ChromeDesktopImpl::MaximizeWindow(const std::string& target_id) { ...@@ -291,20 +319,21 @@ Status ChromeDesktopImpl::MaximizeWindow(const std::string& target_id) {
if (window.state != "normal") { if (window.state != "normal") {
// always restore window to normal first, since chrome ui doesn't allow // always restore window to normal first, since chrome ui doesn't allow
// maximizing a minimized or fullscreen window. // maximizing a minimized or fullscreen window.
status = SetWindowState(window.id, "normal"); auto bounds = base::MakeUnique<base::DictionaryValue>();
bounds->SetString("windowState", "normal");
status = SetWindowBounds(window.id, std::move(bounds));
if (status.IsError()) if (status.IsError())
return status; return status;
} }
return SetWindowState(window.id, "maximized"); auto bounds = base::MakeUnique<base::DictionaryValue>();
bounds->SetString("windowState", "maximized");
return SetWindowBounds(window.id, std::move(bounds));
} }
Status ChromeDesktopImpl::ParseWindow( Status ChromeDesktopImpl::ParseWindowBounds(
std::unique_ptr<base::DictionaryValue> params, std::unique_ptr<base::DictionaryValue> params,
Window* window) { Window* window) {
if (!params->GetInteger("windowId", &window->id))
return Status(kUnknownError, "no window id in response");
const base::Value* value = nullptr; const base::Value* value = nullptr;
const base::DictionaryValue* bounds_dict = nullptr; const base::DictionaryValue* bounds_dict = nullptr;
if (!params->Get("bounds", &value) || !value->GetAsDictionary(&bounds_dict)) if (!params->Get("bounds", &value) || !value->GetAsDictionary(&bounds_dict))
...@@ -325,6 +354,15 @@ Status ChromeDesktopImpl::ParseWindow( ...@@ -325,6 +354,15 @@ Status ChromeDesktopImpl::ParseWindow(
return Status(kOk); return Status(kOk);
} }
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");
return ParseWindowBounds(std::move(params), window);
}
Status ChromeDesktopImpl::GetWindow(const std::string& target_id, Status ChromeDesktopImpl::GetWindow(const std::string& target_id,
Window* window) { Window* window) {
Status status = devtools_websocket_client_->ConnectIfNecessary(); Status status = devtools_websocket_client_->ConnectIfNecessary();
...@@ -342,47 +380,48 @@ Status ChromeDesktopImpl::GetWindow(const std::string& target_id, ...@@ -342,47 +380,48 @@ Status ChromeDesktopImpl::GetWindow(const std::string& target_id,
return ParseWindow(std::move(result), window); return ParseWindow(std::move(result), window);
} }
Status ChromeDesktopImpl::SetWindowState(int window_id, Status ChromeDesktopImpl::GetWindowBounds(int window_id, Window* window) {
const std::string& window_state) {
Status status = devtools_websocket_client_->ConnectIfNecessary(); Status status = devtools_websocket_client_->ConnectIfNecessary();
if (status.IsError()) if (status.IsError())
return status; return status;
base::DictionaryValue params; base::DictionaryValue params;
params.SetInteger("windowId", window_id); params.SetInteger("windowId", window_id);
auto bounds_object = base::MakeUnique<base::DictionaryValue>(); std::unique_ptr<base::DictionaryValue> result;
bounds_object->SetString("windowState", window_state); status = devtools_websocket_client_->SendCommandAndGetResult(
params.Set("bounds", std::move(bounds_object)); "Browser.getWindowBounds", params, &result);
status = devtools_websocket_client_->SendCommand("Browser.setWindowBounds",
params);
if (status.IsError()) if (status.IsError())
return status; return status;
base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(100)); return ParseWindowBounds(std::move(result), window);
return Status(kOk);
} }
Status ChromeDesktopImpl::SetWindowBounds( Status ChromeDesktopImpl::SetWindowBounds(
const std::string& target_id, int window_id,
std::unique_ptr<base::DictionaryValue> bounds) { std::unique_ptr<base::DictionaryValue> bounds) {
Window window; Status status = devtools_websocket_client_->ConnectIfNecessary();
Status status = GetWindow(target_id, &window);
if (status.IsError()) if (status.IsError())
return status; return status;
if (window.state != "normal") {
status = SetWindowState(window.id, "normal");
if (status.IsError())
return status;
}
base::DictionaryValue params; base::DictionaryValue params;
params.SetInteger("windowId", window.id); params.SetInteger("windowId", window_id);
params.Set("bounds", std::move(bounds)); params.Set("bounds", bounds->CreateDeepCopy());
status = devtools_websocket_client_->SendCommand("Browser.setWindowBounds", status = devtools_websocket_client_->SendCommand("Browser.setWindowBounds",
params); params);
if (status.IsError()) if (status.IsError())
return status; return status;
base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(100));
std::string state;
if (!bounds->GetString("windowState", &state))
return Status(kOk);
Window window;
status = GetWindowBounds(window_id, &window);
if (status.IsError())
return status;
if (window.state != state)
return Status(kUnknownError, "failed to change window state to " + state +
", current state is " + window.state);
return Status(kOk); return Status(kOk);
} }
...@@ -82,12 +82,14 @@ class ChromeDesktopImpl : public ChromeImpl { ...@@ -82,12 +82,14 @@ class ChromeDesktopImpl : public ChromeImpl {
int width; int width;
int height; int height;
}; };
Status ParseWindowBounds(std::unique_ptr<base::DictionaryValue> params,
Window* window);
Status ParseWindow(std::unique_ptr<base::DictionaryValue> params, Status ParseWindow(std::unique_ptr<base::DictionaryValue> params,
Window* window); Window* window);
Status GetWindow(const std::string& target_id, Window* window); Status GetWindow(const std::string& target_id, Window* window);
Status SetWindowState(int window_id, const std::string& window_state); Status GetWindowBounds(int window_id, Window* window);
Status SetWindowBounds(const std::string& target_id, Status SetWindowBounds(int window_id,
std::unique_ptr<base::DictionaryValue> bounds); std::unique_ptr<base::DictionaryValue> bounds);
base::Process process_; base::Process process_;
......
...@@ -99,10 +99,7 @@ _OS_SPECIFIC_FILTER['linux'] = [ ...@@ -99,10 +99,7 @@ _OS_SPECIFIC_FILTER['linux'] = [
# Xvfb doesn't support maximization. # Xvfb doesn't support maximization.
'ChromeDriverTest.testWindowMaximize', 'ChromeDriverTest.testWindowMaximize',
] ]
_OS_SPECIFIC_FILTER['mac'] = [ _OS_SPECIFIC_FILTER['mac'] = []
# https://bugs.chromium.org/p/chromedriver/issues/detail?id=1779
'ChromeDriverTest.testWindowMaximize',
]
_DESKTOP_NEGATIVE_FILTER = [ _DESKTOP_NEGATIVE_FILTER = [
# Desktop doesn't support touch (without --touch-events). # Desktop doesn't support touch (without --touch-events).
...@@ -864,11 +861,11 @@ class ChromeDriverTest(ChromeDriverBaseTestWithWebServer): ...@@ -864,11 +861,11 @@ class ChromeDriverTest(ChromeDriverBaseTestWithWebServer):
def testWindowMaximize(self): def testWindowMaximize(self):
self._driver.SetWindowPosition(100, 200) self._driver.SetWindowPosition(100, 200)
self._driver.SetWindowSize(600, 400) self._driver.SetWindowSize(500, 300)
self._driver.MaximizeWindow() self._driver.MaximizeWindow()
self.assertNotEqual([100, 200], self._driver.GetWindowPosition()) self.assertNotEqual([100, 200], self._driver.GetWindowPosition())
self.assertNotEqual([600, 400], self._driver.GetWindowSize()) self.assertNotEqual([500, 300], self._driver.GetWindowSize())
# Set size first so that the window isn't moved offscreen. # Set size first so that the window isn't moved offscreen.
# See https://bugs.chromium.org/p/chromedriver/issues/detail?id=297. # See https://bugs.chromium.org/p/chromedriver/issues/detail?id=297.
self._driver.SetWindowSize(600, 400) self._driver.SetWindowSize(600, 400)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment