| Index: remoting/webapp/browser_test/bump_scroll_browser_test.js
|
| diff --git a/remoting/webapp/browser_test/bump_scroll_browser_test.js b/remoting/webapp/browser_test/bump_scroll_browser_test.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..cc9473446ca1535a4121f9b56d87b8c0afe3e5fe
|
| --- /dev/null
|
| +++ b/remoting/webapp/browser_test/bump_scroll_browser_test.js
|
| @@ -0,0 +1,266 @@
|
| +// Copyright 2014 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +/**
|
| + * @fileoverview
|
| + * @suppress {checkTypes}
|
| + * Browser test for the scenario below:
|
| + * 1. Enter full-screen mode
|
| + * 2. Move the mouse to each edge; verify that the desktop bump-scrolls.
|
| + */
|
| +
|
| +'use strict';
|
| +
|
| +/** @constructor */
|
| +browserTest.FakeClientSession = function() {
|
| + this.pluginPosition = {
|
| + top: 0,
|
| + left: 0
|
| + };
|
| + this.defineEvents(Object.keys(remoting.ClientSession.Events));
|
| +};
|
| +
|
| +base.extend(browserTest.FakeClientSession, base.EventSource);
|
| +
|
| +browserTest.FakeClientSession.prototype.getPluginPositionForTesting =
|
| + function() {
|
| + return this.pluginPosition;
|
| +};
|
| +
|
| +
|
| +/** @constructor */
|
| +browserTest.Bump_Scroll = function() {
|
| + // To aviod dependencies on the actual host desktop size, we simulate a
|
| + // desktop larger or smaller than the client window. The exact value is
|
| + // arbitrary, but must be positive.
|
| + this.kHostDesktopSizeDelta = 10;
|
| +};
|
| +
|
| +browserTest.Bump_Scroll.prototype.run = function(data) {
|
| + browserTest.expect(typeof data.pin == 'string');
|
| +
|
| + if (!remoting.isAppsV2) {
|
| + browserTest.fail(
|
| + 'Bump-scroll requires full-screen, which can only be activated ' +
|
| + 'programmatically in apps v2.')
|
| + }
|
| +
|
| + this.testVerifyScroll().then(function() {
|
| + return browserTest.connectMe2Me();
|
| + }).then(function() {
|
| + return browserTest.enterPIN(data.pin);
|
| + }).then(
|
| + this.noScrollWindowed.bind(this)
|
| + ).then(
|
| + this.activateFullscreen.bind(this)
|
| + ).then(
|
| + this.noScrollSmaller.bind(this)
|
| + // The order of these operations is important. Because the plugin starts
|
| + // scrolled to the top-left, it needs to be scrolled right and down first.
|
| + ).then(
|
| + this.scrollDirection.bind(this, 1.0, 0.5) // Right edge
|
| + ).then(
|
| + this.scrollDirection.bind(this, 0.5, 1.0) // Bottom edge
|
| + ).then(
|
| + this.scrollDirection.bind(this, 0.0, 0.5) // Left edge
|
| + ).then(
|
| + this.scrollDirection.bind(this, 0.5, 0.0) // Top edge
|
| + ).then(
|
| + function(value) {
|
| + browserTest.disconnect();
|
| + return browserTest.pass(value);
|
| + },
|
| + function(error) {
|
| + browserTest.disconnect();
|
| + return browserTest.fail(error);
|
| + }
|
| + );
|
| +};
|
| +
|
| +browserTest.Bump_Scroll.prototype.noScrollWindowed = function() {
|
| + remoting.clientSession.pluginWidthForBumpScrollTesting =
|
| + window.innerWidth + this.kHostDesktopSizeDelta;
|
| + remoting.clientSession.pluginHeightForBumpScrollTesting =
|
| + window.innerHeight + this.kHostDesktopSizeDelta;
|
| + this.moveMouseTo(0, 0);
|
| + return this.verifyScroll(undefined, undefined);
|
| +};
|
| +
|
| +browserTest.Bump_Scroll.prototype.noScrollSmaller = function() {
|
| + remoting.clientSession.pluginWidthForBumpScrollTesting =
|
| + window.innerWidth - this.kHostDesktopSizeDelta;
|
| + remoting.clientSession.pluginHeightForBumpScrollTesting =
|
| + window.innerHeight - this.kHostDesktopSizeDelta;
|
| + this.moveMouseTo(0, 0);
|
| + return this.verifyScroll(undefined, undefined);
|
| +};
|
| +
|
| +browserTest.Bump_Scroll.prototype.scrollDirection =
|
| + function(widthFraction, heightFraction) {
|
| + remoting.clientSession.pluginWidthForBumpScrollTesting =
|
| + screen.width + this.kHostDesktopSizeDelta;
|
| + remoting.clientSession.pluginHeightForBumpScrollTesting =
|
| + screen.height + this.kHostDesktopSizeDelta;
|
| + var expectedTop = heightFraction == 0.0 ? 0 :
|
| + heightFraction == 1.0 ? -this.kHostDesktopSizeDelta :
|
| + undefined;
|
| + var expectedLeft = widthFraction == 0.0 ? 0 :
|
| + widthFraction == 1.0 ? -this.kHostDesktopSizeDelta :
|
| + undefined;
|
| + var result = this.verifyScroll(expectedTop, expectedLeft);
|
| + this.moveMouseTo(widthFraction * screen.width,
|
| + heightFraction * screen.height);
|
| + return result;
|
| +};
|
| +
|
| +browserTest.Bump_Scroll.prototype.activateFullscreen = function() {
|
| + return new Promise(function(fulfill, reject) {
|
| + remoting.fullscreen.activate(true, function() {
|
| + // The onFullscreen callback is invoked before the window has
|
| + // resized, so defer fulfilling the promise so that innerWidth
|
| + // and innerHeight are correct.
|
| + base.Promise.sleep(1000).then(fulfill);
|
| + });
|
| + base.Promise.sleep(5000).then(function(){
|
| + reject('Timed out waiting for full-screen');
|
| + });
|
| + });
|
| +};
|
| +
|
| +browserTest.Bump_Scroll.prototype.moveMouseTo = function(x, y) {
|
| + var e = {
|
| + bubbles: true,
|
| + cancelable: false,
|
| + view: window,
|
| + detail: 0,
|
| + screenX: x,
|
| + screenY: y,
|
| + clientX: x,
|
| + clientY: y,
|
| + ctrlKey: false,
|
| + altKey: false,
|
| + shiftKey: false,
|
| + metaKey: false,
|
| + button: 0,
|
| + relatedTarget: undefined
|
| + };
|
| + var event = document.createEvent('MouseEvents');
|
| + event.initMouseEvent('mousemove',
|
| + e.bubbles, e.cancelable, e.view, e.detail,
|
| + e.screenX, e.screenY, e.clientX, e.clientY,
|
| + e.ctrlKey, e.altKey, e.shiftKey, e.metaKey,
|
| + e.button, document.documentElement);
|
| + document.documentElement.dispatchEvent(event);
|
| +};
|
| +
|
| +// verifyScroll is complicated enough to warrant a test
|
| +browserTest.Bump_Scroll.prototype.testVerifyScroll = function() {
|
| + var STARTED = remoting.ClientSession.Events.bumpScrollStarted;
|
| + var STOPPED = remoting.ClientSession.Events.bumpScrollStopped;
|
| + var fakeSession = new browserTest.FakeClientSession;
|
| + var that = this;
|
| +
|
| + // No events raised (e.g. windowed mode).
|
| + var result = this.verifyScroll(undefined, undefined, fakeSession)
|
| +
|
| + .then(function() {
|
| + // Start and end events raised, but no scrolling (e.g. full-screen mode
|
| + // with host desktop <= window size).
|
| + fakeSession = new browserTest.FakeClientSession;
|
| + var result = that.verifyScroll(undefined, undefined, fakeSession);
|
| + fakeSession.raiseEvent(STARTED, {});
|
| + fakeSession.raiseEvent(STOPPED, {});
|
| + return result;
|
| +
|
| + }).then(function() {
|
| + // Start and end events raised, with incorrect scrolling.
|
| + fakeSession = new browserTest.FakeClientSession;
|
| + var result = base.Promise.negate(
|
| + that.verifyScroll(2, 2, fakeSession));
|
| + fakeSession.raiseEvent(STARTED, {});
|
| + fakeSession.pluginPosition.top = 1;
|
| + fakeSession.pluginPosition.left = 1;
|
| + fakeSession.raiseEvent(STOPPED, {});
|
| + return result;
|
| +
|
| + }).then(function() {
|
| + // Start event raised, but not end event.
|
| + fakeSession = new browserTest.FakeClientSession;
|
| + var result = base.Promise.negate(
|
| + that.verifyScroll(2, 2, fakeSession));
|
| + fakeSession.raiseEvent(STARTED, {});
|
| + fakeSession.pluginPosition.top = 2;
|
| + fakeSession.pluginPosition.left = 2;
|
| + return result;
|
| +
|
| + }).then(function() {
|
| + // Start and end events raised, with correct scrolling.
|
| + fakeSession = new browserTest.FakeClientSession;
|
| + var result = that.verifyScroll(2, 2, fakeSession);
|
| + fakeSession.raiseEvent(STARTED, {});
|
| + fakeSession.pluginPosition.top = 2;
|
| + fakeSession.pluginPosition.left = 2;
|
| + fakeSession.raiseEvent(STOPPED, {});
|
| + return result;
|
| + });
|
| +
|
| + return result;
|
| +};
|
| +
|
| +/**
|
| + * Verify that a bump scroll operation takes place and that the top-left corner
|
| + * of the plugin is as expected when it completes.
|
| + * @param {number|undefined} expectedTop The expected vertical position of the
|
| + * plugin, or undefined if it is not expected to change.
|
| + * @param {number|undefined} expectedLeft The expected horizontal position of
|
| + * the plugin, or undefined if it is not expected to change.
|
| + * @param {browserTest.FakeClientSession=} opt_clientSession ClientSession-like
|
| + * fake, for testing.
|
| + */
|
| +browserTest.Bump_Scroll.prototype.verifyScroll =
|
| + function (expectedTop, expectedLeft, opt_clientSession) {
|
| + var clientSession = opt_clientSession || remoting.clientSession;
|
| + base.debug.assert(clientSession != null);
|
| + var STARTED = remoting.ClientSession.Events.bumpScrollStarted;
|
| + var STOPPED = remoting.ClientSession.Events.bumpScrollStopped;
|
| +
|
| + var initialPosition = clientSession.getPluginPositionForTesting();
|
| + var initialTop = initialPosition.top;
|
| + var initialLeft = initialPosition.left;
|
| +
|
| + var verifyPluginPosition = function() {
|
| + var position = clientSession.getPluginPositionForTesting();
|
| + if (expectedLeft === undefined) {
|
| + expectedLeft = initialLeft;
|
| + }
|
| + if (expectedTop === undefined) {
|
| + expectedTop = initialTop;
|
| + }
|
| + if (position.top != expectedTop || position.left != expectedLeft) {
|
| + return Promise.reject(
|
| + new Error('No or incorrect scroll detected: (' +
|
| + position.left + ',' + position.top + ' instead of ' +
|
| + expectedLeft + ',' + expectedTop + ')'));
|
| + } else {
|
| + return Promise.resolve();
|
| + }
|
| + };
|
| +
|
| + var started = browserTest.expectEvent(clientSession, STARTED, 1000);
|
| + var stopped = browserTest.expectEvent(clientSession, STOPPED, 5000);
|
| + return started.then(function() {
|
| + return stopped.then(function() {
|
| + return verifyPluginPosition();
|
| + });
|
| + }, function() {
|
| + // If no started event is raised, the test might still pass if it asserted
|
| + // no scrolling.
|
| + if (expectedTop == undefined && expectedLeft == undefined) {
|
| + return Promise.resolve();
|
| + } else {
|
| + return Promise.reject(
|
| + new Error('Scroll expected but no start event fired.'));
|
| + }
|
| + });
|
| +};
|
|
|