Adding mapbox-gl branch

This commit is contained in:
Andreas Hocevar
2015-03-16 18:50:27 +01:00
parent 7985f030fa
commit 57ee7f52fd
3109 changed files with 943365 additions and 0 deletions
@@ -0,0 +1,225 @@
// Copyright 2006 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.
/**
* @fileoverview Utilities for window manipulation.
*/
goog.provide('goog.window');
goog.require('goog.string');
goog.require('goog.userAgent');
/**
* Default height for popup windows
* @type {number}
*/
goog.window.DEFAULT_POPUP_HEIGHT = 500;
/**
* Default width for popup windows
* @type {number}
*/
goog.window.DEFAULT_POPUP_WIDTH = 690;
/**
* Default target for popup windows
* @type {string}
*/
goog.window.DEFAULT_POPUP_TARGET = 'google_popup';
/**
* Opens a new window.
*
* @param {string|Object} linkRef A string or an object that supports toString,
* for example goog.Uri. If this is an object with a 'href' attribute, such
* as HTMLAnchorElement, it will be used instead.
*
* @param {Object=} opt_options supports the following options:
* 'target': (string) target (window name). If null, linkRef.target will
* be used.
* 'width': (number) window width.
* 'height': (number) window height.
* 'top': (number) distance from top of screen
* 'left': (number) distance from left of screen
* 'toolbar': (boolean) show toolbar
* 'scrollbars': (boolean) show scrollbars
* 'location': (boolean) show location
* 'statusbar': (boolean) show statusbar
* 'menubar': (boolean) show menubar
* 'resizable': (boolean) resizable
* 'noreferrer': (boolean) whether to attempt to remove the referrer header
* from the request headers. Does this by opening a blank window that
* then redirects to the target url, so users may see some flickering.
*
* @param {Window=} opt_parentWin Parent window that should be used to open the
* new window.
*
* @return {Window} Returns the window object that was opened. This returns
* null if a popup blocker prevented the window from being
* opened.
*/
goog.window.open = function(linkRef, opt_options, opt_parentWin) {
if (!opt_options) {
opt_options = {};
}
var parentWin = opt_parentWin || window;
// HTMLAnchorElement has a toString() method with the same behavior as
// goog.Uri in all browsers except for Safari, which returns
// '[object HTMLAnchorElement]'. We check for the href first, then
// assume that it's a goog.Uri or String otherwise.
var href = typeof linkRef.href != 'undefined' ? linkRef.href :
String(linkRef);
var target = opt_options.target || linkRef.target;
var sb = [];
for (var option in opt_options) {
switch (option) {
case 'width':
case 'height':
case 'top':
case 'left':
sb.push(option + '=' + opt_options[option]);
break;
case 'target':
case 'noreferrer':
break;
default:
sb.push(option + '=' + (opt_options[option] ? 1 : 0));
}
}
var optionString = sb.join(',');
var newWin;
if (opt_options['noreferrer']) {
// Use a meta-refresh to stop the referrer from being included in the
// request headers.
newWin = parentWin.open('', target, optionString);
if (newWin) {
if (goog.userAgent.IE) {
// IE has problems parsing the content attribute if the url contains
// a semicolon. We can fix this by adding quotes around the url, but
// then we can't parse quotes in the URL correctly. We take a
// best-effort approach.
//
// If the URL has semicolons, wrap it in single quotes to protect
// the semicolons.
// If the URL has semicolons and single quotes, url-encode the single
// quotes as well.
//
// This is imperfect. Notice that both ' and ; are reserved characters
// in URIs, so this could do the wrong thing, but at least it will
// do the wrong thing in only rare cases.
// ugh.
if (href.indexOf(';') != -1) {
href = "'" + href.replace(/'/g, '%27') + "'";
}
}
newWin.opener = null;
href = goog.string.htmlEscape(href);
newWin.document.write('<META HTTP-EQUIV="refresh" content="0; url=' +
href + '">');
newWin.document.close();
}
} else {
newWin = parentWin.open(href, target, optionString);
}
// newWin is null if a popup blocker prevented the window open.
return newWin;
};
/**
* Opens a new window without any real content in it.
*
* This can be used to get around popup blockers if you need to open a window
* in response to a user event, but need to do asynchronous work to determine
* the URL to open, and then set the URL later.
*
* Example usage:
*
* var newWin = goog.window.openBlank('Loading...');
* setTimeout(
* function() {
* newWin.location.href = 'http://www.google.com';
* }, 100);
*
* @param {string=} opt_message String to show in the new window. This string
* will be HTML-escaped to avoid XSS issues.
* @param {Object=} opt_options Options to open window with.
* {@see goog.window.open for exact option semantics}.
* @param {Window=} opt_parentWin Parent window that should be used to open the
* new window.
* @return {Window} Returns the window object that was opened. This returns
* null if a popup blocker prevented the window from being
* opened.
*/
goog.window.openBlank = function(opt_message, opt_options, opt_parentWin) {
// Open up a window with the loading message and nothing else.
// This will be interpreted as HTML content type with a missing doctype
// and html/body tags, but is otherwise acceptable.
var loadingMessage = opt_message ? goog.string.htmlEscape(opt_message) : '';
return /** @type {Window} */ (goog.window.open(
'javascript:"' + encodeURI(loadingMessage) + '"',
opt_options, opt_parentWin));
};
/**
* Raise a help popup window, defaulting to "Google standard" size and name.
*
* (If your project is using GXPs, consider using {@link PopUpLink.gxp}.)
*
* @param {string|Object} linkRef if this is a string, it will be used as the
* URL of the popped window; otherwise it's assumed to be an HTMLAnchorElement
* (or some other object with "target" and "href" properties).
*
* @param {Object=} opt_options Options to open window with.
* {@see goog.window.open for exact option semantics}
* Additional wrinkles to the options:
* - if 'target' field is null, linkRef.target will be used. If *that's*
* null, the default is "google_popup".
* - if 'width' field is not specified, the default is 690.
* - if 'height' field is not specified, the default is 500.
*
* @return {boolean} true if the window was not popped up, false if it was.
*/
goog.window.popup = function(linkRef, opt_options) {
if (!opt_options) {
opt_options = {};
}
// set default properties
opt_options['target'] = opt_options['target'] ||
linkRef['target'] || goog.window.DEFAULT_POPUP_TARGET;
opt_options['width'] = opt_options['width'] ||
goog.window.DEFAULT_POPUP_WIDTH;
opt_options['height'] = opt_options['height'] ||
goog.window.DEFAULT_POPUP_HEIGHT;
var newWin = goog.window.open(linkRef, opt_options);
if (!newWin) {
return true;
}
newWin.focus();
return false;
};
@@ -0,0 +1,44 @@
<!DOCTYPE html>
<html>
<!--
Copyright 2009 The Closure Library Authors. All Rights Reserved.
Use of this source code is governed by the Apache License, Version 2.0.
See the COPYING file for details.
-->
<!--
@author marcosalmeida@google.com (Marcos Almeida)
-->
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>
Closure Unit Tests - goog.window
</title>
<script src="../base.js">
</script>
<script>
goog.require('goog.windowTest');
</script>
<style type="text/css">
.goog-like-link {
color: blue;
text-decoration: underline;
cursor: pointer;
}
</style>
</head>
<body>
<h4>Some links for testing referrer stripping manually.</h4>
<div class='goog-like-link'>http://www.google.com/search?q=;</div>
<div class='goog-like-link'>http://www.google.com/search?q=x&amp;lang=en</div>
<div class='goog-like-link'>http://www.google.com/search?q=x;lang=en</div>
<div class='goog-like-link'>http://www.google.com/search?q="</div>
<div class='goog-like-link'>http://www.google.com/search?q='</div>
<div class='goog-like-link'>http://www.google.com/search?q=&lt;</div>
<div class='goog-like-link'>http://www.google.com/search?q=&gt;</div>
</body>
</html>
@@ -0,0 +1,217 @@
// 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});
}