218 lines
6.3 KiB
JavaScript
218 lines
6.3 KiB
JavaScript
// Copyright 2009 The Closure Library Authors. All Rights Reserved.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS-IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
goog.provide('goog.windowTest');
|
|
goog.setTestOnly('goog.windowTest');
|
|
|
|
goog.require('goog.dom');
|
|
goog.require('goog.events');
|
|
goog.require('goog.string');
|
|
goog.require('goog.testing.AsyncTestCase');
|
|
goog.require('goog.testing.jsunit');
|
|
goog.require('goog.window');
|
|
|
|
var newWin;
|
|
var REDIRECT_URL_PREFIX = 'window_test.html?runTests=';
|
|
var asyncTestCase =
|
|
goog.testing.AsyncTestCase.createAndInstall(document.title);
|
|
asyncTestCase.stepTimeout = 5000;
|
|
|
|
var WIN_LOAD_TRY_TIMEOUT = 100;
|
|
var MAX_WIN_LOAD_TRIES = 50; // 50x100ms = 5s waiting for window to load.
|
|
var winLoadCounter;
|
|
|
|
function setUpPage() {
|
|
var anchors = goog.dom.getElementsByTagNameAndClass(
|
|
'div', 'goog-like-link');
|
|
for (var i = 0; i < anchors.length; i++) {
|
|
goog.events.listen(
|
|
anchors[i], 'click',
|
|
function(e) {
|
|
goog.window.open(
|
|
goog.dom.getTextContent(e.target), {'noreferrer': true});
|
|
});
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Some tests should only run locally, because they will trigger
|
|
* popup blockers on http urls.
|
|
*/
|
|
function canOpenPopups() {
|
|
// TODO(nicksantos): Fix the test runner farm.
|
|
return window.location.toString().indexOf('file://') == 0;
|
|
}
|
|
|
|
if (canOpenPopups()) {
|
|
// To test goog.window.open we open a new window with this file again. Once
|
|
// the new window gets to this point in the file it notifies the opener that
|
|
// it has loaded, so that the opener knows that the new window has been
|
|
// populated with properties like referrer and location.
|
|
var newWinLoaded = false;
|
|
if (window.opener && window.opener.newWinLoaded === false) {
|
|
window.opener.newWinLoaded = true;
|
|
}
|
|
}
|
|
|
|
function setUp() {
|
|
newWinLoaded = false;
|
|
}
|
|
|
|
function tearDown() {
|
|
if (newWin) {
|
|
newWin.close();
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Uses setTimeout to keep checking if a new window has been loaded, and once
|
|
* it has, calls the given continuation function and then calls
|
|
* asyncTestCase.continueTesting() to resume the flow of the test.
|
|
* @param {Function} continueFn Continuation function to be called when the
|
|
* new window has loaded.
|
|
* @param {number=} opt_numTries Number of times this method has checked if
|
|
* the window has loaded, to prevent getting in an endless setTimeout
|
|
* loop. (Used internally, callers should omit.)
|
|
*/
|
|
function continueAfterWindowLoaded(continueFn, opt_numTries) {
|
|
opt_numTries = opt_numTries || 0;
|
|
if (newWinLoaded) {
|
|
continueFn();
|
|
asyncTestCase.continueTesting();
|
|
} else if (opt_numTries > MAX_WIN_LOAD_TRIES) {
|
|
fail('Window did not load after maximum number of checks.');
|
|
asyncTestCase.continueTesting();
|
|
} else {
|
|
setTimeout(goog.partial(continueAfterWindowLoaded,
|
|
continueFn, ++opt_numTries),
|
|
WIN_LOAD_TRY_TIMEOUT);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Helper to kick off a test that opens a window and checks that the referrer
|
|
* is hidden if requested and the url is properly encoded/decoded.
|
|
* @param {boolean} noreferrer Whether to test the noreferrer option.
|
|
* @param {string} urlParam Url param to append to the url being opened.
|
|
*/
|
|
function doTestOpenWindow(noreferrer, urlParam) {
|
|
if (!canOpenPopups()) {
|
|
return;
|
|
}
|
|
newWin = goog.window.open(REDIRECT_URL_PREFIX + urlParam,
|
|
{'noreferrer': noreferrer});
|
|
asyncTestCase.waitForAsync('Waiting for window to open and load.');
|
|
continueAfterWindowLoaded(
|
|
goog.partial(continueTestOpenWindow, noreferrer, urlParam));
|
|
}
|
|
|
|
|
|
/**
|
|
* Helper callback to do asserts after the window opens.
|
|
* @param {boolean} noreferrer Whether the noreferrer option is being tested.
|
|
* @param {string} urlParam Url param appended to the url being opened.
|
|
*/
|
|
function continueTestOpenWindow(noreferrer, urlParam) {
|
|
if (noreferrer) {
|
|
assertEquals('Referrer should have been stripped',
|
|
'', newWin.document.referrer);
|
|
}
|
|
|
|
var newWinUrl = decodeURI(newWin.location);
|
|
var expectedUrlSuffix = decodeURI(urlParam);
|
|
assertTrue('New window href should have ended with <' + expectedUrlSuffix +
|
|
'> but was <' + newWinUrl + '>',
|
|
goog.string.endsWith(newWinUrl, expectedUrlSuffix));
|
|
}
|
|
|
|
|
|
function testOpenNotEncoded() {
|
|
doTestOpenWindow(false, '"bogus~"');
|
|
}
|
|
|
|
function testOpenEncoded() {
|
|
doTestOpenWindow(false, '"bogus%7E"');
|
|
}
|
|
|
|
function testOpenEncodedPercent() {
|
|
// Intent of url is to pass %7E to the server, so it was encoded to %257E .
|
|
doTestOpenWindow(false, '"bogus%257E"');
|
|
}
|
|
|
|
function testOpenNotEncodedHidingReferrer() {
|
|
doTestOpenWindow(true, '"bogus~"');
|
|
}
|
|
|
|
function testOpenEncodedHidingReferrer() {
|
|
doTestOpenWindow(true, '"bogus%7E"');
|
|
}
|
|
|
|
function testOpenEncodedPercentHidingReferrer() {
|
|
// Intent of url is to pass %7E to the server, so it was encoded to %257E .
|
|
doTestOpenWindow(true, '"bogus%257E"');
|
|
}
|
|
|
|
function testOpenSemicolon() {
|
|
doTestOpenWindow(true, 'beforesemi;aftersemi');
|
|
}
|
|
|
|
function testTwoSemicolons() {
|
|
doTestOpenWindow(true, 'a;b;c');
|
|
}
|
|
|
|
function testOpenAmpersand() {
|
|
doTestOpenWindow(true, 'this&that');
|
|
}
|
|
|
|
function testOpenSingleQuote() {
|
|
doTestOpenWindow(true, "'");
|
|
}
|
|
|
|
function testOpenDoubleQuote() {
|
|
doTestOpenWindow(true, '"');
|
|
}
|
|
|
|
function testOpenDoubleQuote() {
|
|
doTestOpenWindow(true, '<');
|
|
}
|
|
|
|
function testOpenDoubleQuote() {
|
|
doTestOpenWindow(true, '>');
|
|
}
|
|
|
|
function testOpenBlank() {
|
|
if (!canOpenPopups()) {
|
|
return;
|
|
}
|
|
newWin = goog.window.openBlank('Loading...');
|
|
asyncTestCase.waitForAsync('Waiting for temp window to open and load.');
|
|
var urlParam = 'bogus~';
|
|
|
|
var continueFn = function() {
|
|
newWin.location.href = REDIRECT_URL_PREFIX + urlParam;
|
|
continueAfterWindowLoaded(
|
|
goog.partial(continueTestOpenWindow, false, urlParam));
|
|
};
|
|
setTimeout(continueFn, 100);
|
|
}
|
|
|
|
|
|
/** @this {Element} */
|
|
function stripReferrer() {
|
|
goog.window.open(this.href, {'noreferrer': true});
|
|
}
|