Bug 1045103 - add Marionette support for setWindowSize; r=jgrffin

This commit is contained in:
Rob Wood 2014-09-08 06:05:49 -07:00
parent 55b880a990
commit f3923b6fad
5 changed files with 142 additions and 2 deletions

View File

@ -31,6 +31,7 @@ class ErrorCodes(object):
INVALID_RESPONSE = 53
FRAME_SEND_NOT_INITIALIZED_ERROR = 54
FRAME_SEND_FAILURE_ERROR = 55
UNSUPPORTED_OPERATION = 405
MARIONETTE_ERROR = 500
class MarionetteException(Exception):
@ -138,3 +139,6 @@ class FrameSendNotInitializedError(MarionetteException):
class FrameSendFailureError(MarionetteException):
pass
class UnsupportedOperationException(MarionetteException):
pass

View File

@ -708,6 +708,8 @@ class Marionette(object):
raise errors.FrameSendNotInitializedError(message=message, status=status, stacktrace=stacktrace)
elif status == errors.ErrorCodes.FRAME_SEND_FAILURE_ERROR:
raise errors.FrameSendFailureError(message=message, status=status, stacktrace=stacktrace)
elif status == errors.ErrorCodes.UNSUPPORTED_OPERATION:
raise errors.UnsupportedOperationException(message=message, status=status, stacktrace=stacktrace)
else:
raise errors.MarionetteException(message=message, status=status, stacktrace=stacktrace)
raise errors.MarionetteException(message=response, status=500)
@ -883,7 +885,6 @@ class Marionette(object):
:rtype: string
"""
self.window = self._send_message("getWindowHandle", "value")
return self.window
@ -1515,3 +1516,31 @@ class Marionette(object):
self._send_message("setScreenOrientation", "ok", orientation=orientation)
if self.emulator:
self.emulator.screen.orientation = orientation.lower()
@property
def window_size(self):
"""Get the current browser window size.
Will return the current browser window size in pixels. Refers to
window outerWidth and outerHeight values, which include scroll bars,
title bars, etc.
:returns: dictionary representation of current window width and height
"""
return self._send_message("getWindowSize", "value")
def set_window_size(self, width, height):
"""Resize the browser window currently in focus.
The supplied width and height values refer to the window outerWidth
and outerHeight values, which include scroll bars, title bars, etc.
An error will be returned if the requested window size would result
in the window being in the maximised state.
:param width: The width to resize the window to.
:param height: The height to resize the window to.
"""
self._send_message("setWindowSize", "ok", width=width, height=height)

View File

@ -0,0 +1,50 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
from errors import MarionetteException
from marionette_test import MarionetteTestCase
class TestSetWindowSize(MarionetteTestCase):
def setUp(self):
super(MarionetteTestCase, self).setUp()
self.start_size = self.marionette.window_size
self.max_width = self.marionette.execute_script("return window.screen.availWidth;")
self.max_height = self.marionette.execute_script("return window.screen.availHeight;")
def tearDown(self):
# WebDriver spec says a resize cannot result in window being maximized, an
# error is returned if that is the case; therefore if the window is maximized
# at the start of this test, returning to the original size via set_window_size
# size will result in error; so reset to original size minus 1 pixel width
if self.start_size['width'] == self.max_width and self.start_size['height'] == self.max_height:
self.start_size['width']-=1
self.marionette.set_window_size(self.start_size['width'], self.start_size['height'])
super(MarionetteTestCase, self).tearDown()
def test_set_window_size(self):
# event handler
self.marionette.execute_script("""
window.wrappedJSObject.rcvd_event = false;
window.onresize = function() {
window.wrappedJSObject.rcvd_event = true;
};
""")
# valid size
width = self.max_width - 100
height = self.max_height - 100
self.marionette.set_window_size(width, height)
self.wait_for_condition(lambda m: m.execute_script("return window.wrappedJSObject.rcvd_event;"))
size = self.marionette.window_size
self.assertEqual(size['width'], width,
"Window width is %s but should be %s" % (size['width'], width))
self.assertEqual(size['height'], height,
"Window height is %s but should be %s" % (size['height'], height))
# invalid size (cannot maximize)
with self.assertRaisesRegexp(MarionetteException, "Invalid requested size"):
self.marionette.set_window_size(self.max_width, self.max_height)
size = self.marionette.window_size
self.assertEqual(size['width'], width, "Window width should not have changed")
self.assertEqual(size['height'], height, "Window height should not have changed")

View File

@ -120,5 +120,7 @@ browser = false
[test_click_scrolling.py]
[test_profile_management.py]
b2g = false
[test_set_window_size.py]
b2g = false
[include:oop/manifest.ini]

View File

@ -2353,6 +2353,59 @@ MarionetteServerConnection.prototype = {
this.sendOk(this.command_id);
},
/**
* Get the size of the browser window currently in focus.
*
* Will return the current browser window size in pixels. Refers to
* window outerWidth and outerHeight values, which include scroll bars,
* title bars, etc.
*
*/
getWindowSize: function MDA_getWindowSize(aRequest) {
this.command_id = this.getCommandId();
let curWindow = this.getCurrentWindow();
let curWidth = curWindow.outerWidth;
let curHeight = curWindow.outerHeight;
this.sendResponse({width: curWidth, height: curHeight}, this.command_id);
},
/**
* Set the size of the browser window currently in focus.
*
* Not supported on B2G. The supplied width and height values refer to
* the window outerWidth and outerHeight values, which include scroll
* bars, title bars, etc.
*
* An error will be returned if the requested window size would result
* in the window being in the maximized state.
*/
setWindowSize: function MDA_setWindowSize(aRequest) {
this.command_id = this.getCommandId();
if (appName == "B2G") {
this.sendError("Not supported on B2G", 405, null, this.command_id);
return;
}
try {
var width = parseInt(aRequest.parameters.width);
var height = parseInt(aRequest.parameters.height);
}
catch(e) {
this.sendError(e.message, e.code, e.stack, this.command_id);
return;
}
let curWindow = this.getCurrentWindow();
if (width >= curWindow.screen.availWidth && height >= curWindow.screen.availHeight) {
this.sendError("Invalid requested size, cannot maximize", 405, null, this.command_id);
return;
}
curWindow.resizeTo(width, height);
this.sendOk(this.command_id);
},
/**
* Helper function to convert an outerWindowID into a UID that Marionette
* tracks.
@ -2558,7 +2611,9 @@ MarionetteServerConnection.prototype.requestTypes = {
"deleteCookie": MarionetteServerConnection.prototype.deleteCookie,
"getActiveElement": MarionetteServerConnection.prototype.getActiveElement,
"getScreenOrientation": MarionetteServerConnection.prototype.getScreenOrientation,
"setScreenOrientation": MarionetteServerConnection.prototype.setScreenOrientation
"setScreenOrientation": MarionetteServerConnection.prototype.setScreenOrientation,
"getWindowSize": MarionetteServerConnection.prototype.getWindowSize,
"setWindowSize": MarionetteServerConnection.prototype.setWindowSize
};
/**