diff --git a/javascript/remote/ui/client.js b/javascript/remote/ui/client.js index bc5daedd5abba..9695da9fafdfb 100644 --- a/javascript/remote/ui/client.js +++ b/javascript/remote/ui/client.js @@ -19,8 +19,8 @@ goog.require('goog.Disposable'); goog.require('goog.Uri'); goog.require('goog.array'); goog.require('goog.debug.Console'); -goog.require('goog.debug.Logger'); goog.require('goog.events'); +goog.require('goog.log'); goog.require('remote.ui.Banner'); goog.require('remote.ui.Event.Type'); goog.require('remote.ui.ScreenshotDialog'); @@ -45,8 +45,8 @@ goog.require('webdriver.promise'); remote.ui.Client = function(url, executor) { goog.base(this); - /** @private {!goog.debug.Logger} */ - this.log_ = goog.debug.Logger.getLogger('remote.ui.Client'); + /** @private {goog.log.Logger} */ + this.log_ = goog.log.getLogger('remote.ui.Client'); /** @private {!goog.debug.Console} */ this.logConsole_ = new goog.debug.Console(); @@ -182,7 +182,7 @@ remote.ui.Client.prototype.execute_ = function(command) { * @private */ remote.ui.Client.prototype.logError_ = function(msg, e) { - this.log_.severe(msg + '\n' + e); + goog.log.error(this.log_, msg + '\n' + e); this.banner_.setMessage(msg); this.banner_.setVisible(true); }; @@ -195,7 +195,7 @@ remote.ui.Client.prototype.logError_ = function(msg, e) { * @private */ remote.ui.Client.prototype.updateServerInfo_ = function() { - this.log_.info('Retrieving server status...'); + goog.log.info(this.log_, 'Retrieving server status...'); return this.execute_( new webdriver.Command(webdriver.CommandName.GET_SERVER_STATUS)). then(goog.bind(function(response) { @@ -217,7 +217,7 @@ remote.ui.Client.prototype.updateServerInfo_ = function() { * @private */ remote.ui.Client.prototype.onRefresh_ = function() { - this.log_.info('Refreshing sessions...'); + goog.log.info(this.log_, 'Refreshing sessions...'); var self = this; this.execute_(new webdriver.Command(webdriver.CommandName.GET_SESSIONS)). then(function(response) { @@ -240,7 +240,7 @@ remote.ui.Client.prototype.onRefresh_ = function() { * @private */ remote.ui.Client.prototype.onCreate_ = function(e) { - this.log_.info('Creating new session for ' + e.data['browserName']); + goog.log.info(this.log_, 'Creating new session for ' + e.data['browserName']); var command = new webdriver.Command(webdriver.CommandName.NEW_SESSION). setParameter('desiredCapabilities', e.data); var self = this; @@ -265,11 +265,11 @@ remote.ui.Client.prototype.onCreate_ = function(e) { remote.ui.Client.prototype.onDelete_ = function() { var session = this.sessionContainer_.getSelectedSession(); if (!session) { - this.log_.warning('Cannot delete session; no session selected!'); + goog.log.warning(this.log_, 'Cannot delete session; no session selected!'); return; } - this.log_.info('Deleting session: ' + session.getId()); + goog.log.info(this.log_, 'Deleting session: ' + session.getId()); var command = new webdriver.Command(webdriver.CommandName.QUIT). setParameter('sessionId', session.getId()); var self = this; @@ -292,7 +292,8 @@ remote.ui.Client.prototype.onDelete_ = function() { remote.ui.Client.prototype.onLoad_ = function(e) { var session = this.sessionContainer_.getSelectedSession(); if (!session) { - this.log_.warning('Cannot load url: ' + e.data + '; no session selected!'); + goog.log.warning(this.log_, + 'Cannot load url: ' + e.data + '; no session selected!'); return; } @@ -303,7 +304,8 @@ remote.ui.Client.prototype.onLoad_ = function(e) { var command = new webdriver.Command(webdriver.CommandName.GET). setParameter('sessionId', session.getId()). setParameter('url', url.toString()); - this.log_.info('In session(' + session.getId() + '), loading ' + url); + goog.log.info(this.log_, + 'In session(' + session.getId() + '), loading ' + url); this.execute_(command).thenCatch(goog.bind(function(e) { this.logError_('Unable to load URL', e); }, this)); @@ -317,11 +319,12 @@ remote.ui.Client.prototype.onLoad_ = function(e) { remote.ui.Client.prototype.onScreenshot_ = function() { var session = this.sessionContainer_.getSelectedSession(); if (!session) { - this.log_.warning('Cannot take screenshot; no session selected!'); + goog.log.warning(this.log_, + 'Cannot take screenshot; no session selected!'); return; } - this.log_.info('Taking screenshot: ' + session.getId()); + goog.log.info(this.log_, 'Taking screenshot: ' + session.getId()); var command = new webdriver.Command(webdriver.CommandName.SCREENSHOT). setParameter('sessionId', session.getId()); diff --git a/javascript/safari-driver/client.js b/javascript/safari-driver/client.js index 47b3890a992b9..0edab1462c616 100644 --- a/javascript/safari-driver/client.js +++ b/javascript/safari-driver/client.js @@ -7,7 +7,7 @@ goog.provide('safaridriver.client'); goog.require('goog.Uri'); goog.require('goog.debug.DivConsole'); -goog.require('goog.debug.Logger'); +goog.require('goog.log'); goog.require('safaridriver.message.Connect'); @@ -25,19 +25,20 @@ safaridriver.client.init = function() { var divConsole = new goog.debug.DivConsole(div); divConsole.setCapturing(true); - var log = goog.debug.Logger.getLogger('safaridriver.client'); + var log = goog.log.getLogger('safaridriver.client'); var url = new goog.Uri(window.location).getQueryData().get('url'); if (!url) { - log.severe( + goog.log.error(log, 'No url specified. Please reload this page with the url parameter set'); return; } url = new goog.Uri(url); - log.info('Connecting to SafariDriver browser extension...'); - log.info('Extension logs may be viewed by clicking the Selenium [\u2713] ' + - 'button on the Safari toolbar'); + goog.log.info(log, 'Connecting to SafariDriver browser extension...'); + goog.log.info(log, + 'Extension logs may be viewed by clicking the Selenium [\u2713] ' + + 'button on the Safari toolbar'); var numAttempts = 0; var message = new safaridriver.message.Connect(url.toString()); connect(); @@ -46,13 +47,13 @@ safaridriver.client.init = function() { numAttempts += 1; var acknowledged = message.sendSync(window); if (acknowledged) { - log.info('Connected to extension'); - log.info('Requesting extension connect to client at ' + url); + goog.log.info(log, 'Connected to extension'); + goog.log.info(log, 'Requesting extension connect to client at ' + url); } else if (numAttempts < 5) { var timeout = 250 * numAttempts; setTimeout(connect, timeout); } else { - log.severe( + goog.log.error(log, 'Unable to establish a connection with the SafariDriver extension'); } } diff --git a/javascript/safari-driver/message/message.js b/javascript/safari-driver/message/message.js index a61e717be9faf..39d0ce9697a8b 100644 --- a/javascript/safari-driver/message/message.js +++ b/javascript/safari-driver/message/message.js @@ -23,7 +23,7 @@ goog.provide('safaridriver.message.Message'); goog.require('bot.json'); goog.require('goog.asserts'); -goog.require('goog.debug.Logger'); +goog.require('goog.log'); goog.require('safaridriver.dom'); @@ -43,11 +43,10 @@ safaridriver.message.ORIGIN = 'webdriver'; /** - * @private {!goog.debug.Logger} + * @private {goog.log.Logger} * @const */ -safaridriver.message.LOG_ = goog.debug.Logger.getLogger( - 'safaridriver.message'); +safaridriver.message.LOG_ = goog.log.getLogger('safaridriver.message'); /** @@ -111,7 +110,7 @@ safaridriver.message.fromEvent = function(event) { var type = data[safaridriver.message.Message.Field.TYPE]; var factory = safaridriver.message.factoryRegistry_[type]; if (!factory) { - safaridriver.message.LOG_.fine( + goog.log.fine(safaridriver.message.LOG_, 'Unknown message type; falling back to the default factory: ' + bot.json.stringify(data)); factory = safaridriver.message.Message.fromData_; diff --git a/rake-tasks/crazy_fun/mappings/javascript.rb b/rake-tasks/crazy_fun/mappings/javascript.rb index 4a64b4f7486c5..b348faf4fb7b2 100644 --- a/rake-tasks/crazy_fun/mappings/javascript.rb +++ b/rake-tasks/crazy_fun/mappings/javascript.rb @@ -222,7 +222,7 @@ def initialize() py = "python" end @calcdeps = "#{py} third_party/closure/bin/calcdeps.py " + - "-c third_party/closure/bin/compiler-20130603.jar " + "-c third_party/closure/bin/compiler-20140407.jar " end def js_name(dir, name) @@ -515,7 +515,7 @@ def handle(fun, dir, args) CrazyFunJava.ant.java :classname => "com.google.javascript.jscomp.CommandLineRunner", :failonerror => true do classpath do - pathelement :path => "third_party/closure/bin/compiler-20130603.jar" + pathelement :path => "third_party/closure/bin/compiler-20140407.jar" end arg :line => cmd end @@ -684,7 +684,7 @@ def handle(fun, dir, args) CrazyFunJava.ant.java :classname => "com.google.javascript.jscomp.CommandLineRunner", :failonerror => true do classpath do - pathelement :path => "third_party/closure/bin/compiler-20130603.jar" + pathelement :path => "third_party/closure/bin/compiler-20140407.jar" end arg :line => flags.join(" ") end @@ -807,7 +807,7 @@ def handle(fun, dir, args) CrazyFunJava.ant.java :classname => "com.google.javascript.jscomp.CommandLineRunner", :fork => false, :failonerror => true do classpath do - pathelement :path => "third_party/closure/bin/compiler-20130603.jar" + pathelement :path => "third_party/closure/bin/compiler-20140407.jar" end arg :line => cmd end diff --git a/third_party/closure/bin/compiler-20130603.jar b/third_party/closure/bin/compiler-20140407.jar similarity index 52% rename from third_party/closure/bin/compiler-20130603.jar rename to third_party/closure/bin/compiler-20140407.jar index 0b0e68c3dd165..67aa45afcffd2 100644 Binary files a/third_party/closure/bin/compiler-20130603.jar and b/third_party/closure/bin/compiler-20140407.jar differ diff --git a/third_party/closure/bin/compiler.jar b/third_party/closure/bin/compiler.jar new file mode 100644 index 0000000000000..67aa45afcffd2 Binary files /dev/null and b/third_party/closure/bin/compiler.jar differ diff --git a/third_party/closure/goog/a11y/aria/announcer.js b/third_party/closure/goog/a11y/aria/announcer.js index 0ffaf33f331c2..ee87199bc9991 100644 --- a/third_party/closure/goog/a11y/aria/announcer.js +++ b/third_party/closure/goog/a11y/aria/announcer.js @@ -36,9 +36,10 @@ goog.require('goog.object'); * @param {goog.dom.DomHelper=} opt_domHelper DOM helper. * @constructor * @extends {goog.Disposable} + * @final */ goog.a11y.aria.Announcer = function(opt_domHelper) { - goog.base(this); + goog.a11y.aria.Announcer.base(this, 'constructor'); /** * @type {goog.dom.DomHelper} @@ -49,7 +50,7 @@ goog.a11y.aria.Announcer = function(opt_domHelper) { /** * Map of priority to live region elements to use for communicating updates. * Elements are created on demand. - * @type {Object.} + * @type {Object.} * @private */ this.liveRegions_ = {}; @@ -63,7 +64,7 @@ goog.a11y.aria.Announcer.prototype.disposeInternal = function() { this.liveRegions_, this.domHelper_.removeNode, this.domHelper_); this.liveRegions_ = null; this.domHelper_ = null; - goog.base(this, 'disposeInternal'); + goog.a11y.aria.Announcer.base(this, 'disposeInternal'); }; @@ -83,14 +84,16 @@ goog.a11y.aria.Announcer.prototype.say = function(message, opt_priority) { /** * Returns an aria-live region that can be used to communicate announcements. * @param {!goog.a11y.aria.LivePriority} priority The required priority. - * @return {Element} A live region of the requested priority. + * @return {!Element} A live region of the requested priority. * @private */ goog.a11y.aria.Announcer.prototype.getLiveRegion_ = function(priority) { - if (this.liveRegions_[priority]) { - return this.liveRegions_[priority]; + var liveRegion = this.liveRegions_[priority]; + if (liveRegion) { + // Make sure the live region is not aria-hidden. + goog.a11y.aria.removeState(liveRegion, goog.a11y.aria.State.HIDDEN); + return liveRegion; } - var liveRegion; liveRegion = this.domHelper_.createElement('div'); // Note that IE has a habit of declaring things that aren't display:none as // invisible to third-party tools like JAWs, so we can't just use height:0. diff --git a/third_party/closure/goog/a11y/aria/aria.js b/third_party/closure/goog/a11y/aria/aria.js index abc261f6bfa2f..2774529b95aa3 100644 --- a/third_party/closure/goog/a11y/aria/aria.js +++ b/third_party/closure/goog/a11y/aria/aria.js @@ -31,7 +31,6 @@ goog.require('goog.asserts'); goog.require('goog.dom'); goog.require('goog.dom.TagName'); goog.require('goog.object'); -goog.require('goog.string'); /** @@ -104,7 +103,7 @@ goog.a11y.aria.setRole = function(element, roleName) { /** * Gets role of an element. * @param {!Element} element DOM element to get role of. - * @return {?goog.a11y.aria.Role} ARIA Role name. + * @return {!goog.a11y.aria.Role} ARIA Role name. */ goog.a11y.aria.getRole = function(element) { var role = element.getAttribute(goog.a11y.aria.ROLE_ATTRIBUTE_); @@ -267,38 +266,55 @@ goog.a11y.aria.assertRoleIsSetInternalUtil = function(element, allowedRoles) { /** * Gets the boolean value of an ARIA state/property. - * Only to be used internally by the ARIA library in goog.a11y.aria.*. * @param {!Element} element The element to get the ARIA state for. * @param {!goog.a11y.aria.State|string} stateName the ARIA state name. * @return {?boolean} Boolean value for the ARIA state value or null if - * the state value is not 'true' or 'false'. + * the state value is not 'true', not 'false', or not set. */ -goog.a11y.aria.getBooleanStateInternalUtil = function(element, stateName) { - var stringValue = goog.a11y.aria.getState(element, stateName); - if (stringValue == 'true') { - return true; - } - if (stringValue == 'false') { - return false; +goog.a11y.aria.getStateBoolean = function(element, stateName) { + var attr = + /** @type {string|boolean} */ (element.getAttribute( + goog.a11y.aria.getAriaAttributeName_(stateName))); + goog.asserts.assert( + goog.isBoolean(attr) || attr == null || attr == 'true' || + attr == 'false'); + if (attr == null) { + return attr; } - return null; + return goog.isBoolean(attr) ? attr : attr == 'true'; }; /** * Gets the number value of an ARIA state/property. - * Only to be used internally by the ARIA library in goog.a11y.aria.*. * @param {!Element} element The element to get the ARIA state for. * @param {!goog.a11y.aria.State|string} stateName the ARIA state name. * @return {?number} Number value for the ARIA state value or null if - * the state value is not a number. + * the state value is not a number or not set. */ -goog.a11y.aria.getNumberStateInternalUtil = function(element, stateName) { - var stringValue = goog.a11y.aria.getState(element, stateName); - if (goog.string.isNumeric(stringValue)) { - return goog.string.toNumber(stringValue); - } - return null; +goog.a11y.aria.getStateNumber = function(element, stateName) { + var attr = + /** @type {string|number} */ (element.getAttribute( + goog.a11y.aria.getAriaAttributeName_(stateName))); + goog.asserts.assert((attr == null || !isNaN(Number(attr))) && + !goog.isBoolean(attr)); + return attr == null ? null : Number(attr); +}; + + +/** + * Gets the string value of an ARIA state/property. + * @param {!Element} element The element to get the ARIA state for. + * @param {!goog.a11y.aria.State|string} stateName the ARIA state name. + * @return {?string} String value for the ARIA state value or null if + * the state value is empty string or not set. + */ +goog.a11y.aria.getStateString = function(element, stateName) { + var attr = element.getAttribute( + goog.a11y.aria.getAriaAttributeName_(stateName)); + goog.asserts.assert((attr == null || goog.isString(attr)) && + isNaN(Number(attr)) && attr != 'true' && attr != 'false'); + return attr == null ? null : attr; }; @@ -318,20 +334,6 @@ goog.a11y.aria.getStringArrayStateInternalUtil = function(element, stateName) { }; -/** - * Gets the string value of an ARIA state/property. - * Only to be used internally by the ARIA library in goog.a11y.aria.*. - * @param {!Element} element The element to get the ARIA state for. - * @param {!goog.a11y.aria.State|string} stateName the ARIA state name. - * @return {?string} String value for the ARIA state value or null if - * the state value is empty string. - */ -goog.a11y.aria.getStringStateInternalUtil = function(element, stateName) { - var stringValue = goog.a11y.aria.getState(element, stateName); - return stringValue || null; -}; - - /** * Splits the input stringValue on whitespace. * @param {string} stringValue The value of the string to split. diff --git a/third_party/closure/goog/a11y/aria/datatables.js b/third_party/closure/goog/a11y/aria/datatables.js index c97df20856524..05e2fb9e5e2df 100644 --- a/third_party/closure/goog/a11y/aria/datatables.js +++ b/third_party/closure/goog/a11y/aria/datatables.js @@ -40,7 +40,7 @@ goog.a11y.aria.DefaultStateValueMap_; * A method that creates a map that contains mapping between an ARIA state and * the default value for it. Note that not all ARIA states have default values. * - * @return {Object.} + * @return {!Object.} * The names for each of the notification methods. */ goog.a11y.aria.datatables.getDefaultValuesMap = function() { diff --git a/third_party/closure/goog/array/array.js b/third_party/closure/goog/array/array.js index 5eea925d73cfc..2d8c23f0d1d69 100644 --- a/third_party/closure/goog/array/array.js +++ b/third_party/closure/goog/array/array.js @@ -42,6 +42,14 @@ goog.require('goog.asserts'); goog.define('goog.NATIVE_ARRAY_PROTOTYPES', goog.TRUSTED_SITE); +/** + * @define {boolean} If true, JSCompiler will use the native implementation of + * array functions where appropriate (e.g., {@code Array#filter}) and remove the + * unused pure JS implementation. + */ +goog.define('goog.array.ASSUME_NATIVE_FUNCTIONS', false); + + /** * @typedef {Array|NodeList|Arguments|{length: number}} */ @@ -50,14 +58,26 @@ goog.array.ArrayLike; /** * Returns the last element in an array without removing it. - * @param {goog.array.ArrayLike} array The array. - * @return {*} Last item in array. + * Same as goog.array.last. + * @param {Array.|goog.array.ArrayLike} array The array. + * @return {T} Last item in array. + * @template T */ goog.array.peek = function(array) { return array[array.length - 1]; }; +/** + * Returns the last element in an array without removing it. + * Same as goog.array.peek. + * @param {Array.|goog.array.ArrayLike} array The array. + * @return {T} Last item in array. + * @template T + */ +goog.array.last = goog.array.peek; + + /** * Reference to the original {@code Array.prototype}. * @private @@ -73,19 +93,21 @@ goog.array.ARRAY_PROTOTYPE_ = Array.prototype; /** - * Returns the index of the first element of an array with a specified - * value, or -1 if the element is not present in the array. + * Returns the index of the first element of an array with a specified value, or + * -1 if the element is not present in the array. * * See {@link http://tinyurl.com/developer-mozilla-org-array-indexof} * - * @param {goog.array.ArrayLike} arr The array to be searched. - * @param {*} obj The object for which we are searching. + * @param {Array.|goog.array.ArrayLike} arr The array to be searched. + * @param {T} obj The object for which we are searching. * @param {number=} opt_fromIndex The index at which to start the search. If * omitted the search starts at index 0. * @return {number} The index of the first matching array element. + * @template T */ goog.array.indexOf = goog.NATIVE_ARRAY_PROTOTYPES && - goog.array.ARRAY_PROTOTYPE_.indexOf ? + (goog.array.ASSUME_NATIVE_FUNCTIONS || + goog.array.ARRAY_PROTOTYPE_.indexOf) ? function(arr, obj, opt_fromIndex) { goog.asserts.assert(arr.length != null); @@ -118,14 +140,16 @@ goog.array.indexOf = goog.NATIVE_ARRAY_PROTOTYPES && * * See {@link http://tinyurl.com/developer-mozilla-org-array-lastindexof} * - * @param {goog.array.ArrayLike} arr The array to be searched. - * @param {*} obj The object for which we are searching. + * @param {!Array.|!goog.array.ArrayLike} arr The array to be searched. + * @param {T} obj The object for which we are searching. * @param {?number=} opt_fromIndex The index at which to start the search. If * omitted the search starts at the end of the array. * @return {number} The index of the last matching array element. + * @template T */ goog.array.lastIndexOf = goog.NATIVE_ARRAY_PROTOTYPES && - goog.array.ARRAY_PROTOTYPE_.lastIndexOf ? + (goog.array.ASSUME_NATIVE_FUNCTIONS || + goog.array.ARRAY_PROTOTYPE_.lastIndexOf) ? function(arr, obj, opt_fromIndex) { goog.asserts.assert(arr.length != null); @@ -170,7 +194,8 @@ goog.array.lastIndexOf = goog.NATIVE_ARRAY_PROTOTYPES && * @template T,S */ goog.array.forEach = goog.NATIVE_ARRAY_PROTOTYPES && - goog.array.ARRAY_PROTOTYPE_.forEach ? + (goog.array.ASSUME_NATIVE_FUNCTIONS || + goog.array.ARRAY_PROTOTYPE_.forEach) ? function(arr, f, opt_obj) { goog.asserts.assert(arr.length != null); @@ -227,12 +252,13 @@ goog.array.forEachRight = function(arr, f, opt_obj) { * result array. If it is false the element is not included. * @param {S=} opt_obj The object to be used as the value of 'this' * within f. - * @return {!Array} a new array in which only elements that passed the test are - * present. + * @return {!Array.} a new array in which only elements that passed the test + * are present. * @template T,S */ goog.array.filter = goog.NATIVE_ARRAY_PROTOTYPES && - goog.array.ARRAY_PROTOTYPE_.filter ? + (goog.array.ASSUME_NATIVE_FUNCTIONS || + goog.array.ARRAY_PROTOTYPE_.filter) ? function(arr, f, opt_obj) { goog.asserts.assert(arr.length != null); @@ -261,19 +287,19 @@ goog.array.filter = goog.NATIVE_ARRAY_PROTOTYPES && * * See {@link http://tinyurl.com/developer-mozilla-org-array-map} * - * @param {Array.|goog.array.ArrayLike} arr Array or array - * like object over which to iterate. - * @param {?function(this:S, T, number, ?):?} f The function to call for every - * element. This function - * takes 3 arguments (the element, the index and the array) and should - * return something. The result will be inserted into a new array. - * @param {S=} opt_obj The object to be used as the value of 'this' - * within f. - * @return {!Array} a new array with the results from f. - * @template T,S + * @param {Array.|goog.array.ArrayLike} arr Array or array like object + * over which to iterate. + * @param {function(this:THIS, VALUE, number, ?): RESULT} f The function to call + * for every element. This function takes 3 arguments (the element, + * the index and the array) and should return something. The result will be + * inserted into a new array. + * @param {THIS=} opt_obj The object to be used as the value of 'this' within f. + * @return {!Array.} a new array with the results from f. + * @template THIS, VALUE, RESULT */ goog.array.map = goog.NATIVE_ARRAY_PROTOTYPES && - goog.array.ARRAY_PROTOTYPE_.map ? + (goog.array.ASSUME_NATIVE_FUNCTIONS || + goog.array.ARRAY_PROTOTYPE_.map) ? function(arr, f, opt_obj) { goog.asserts.assert(arr.length != null); @@ -316,20 +342,23 @@ goog.array.map = goog.NATIVE_ARRAY_PROTOTYPES && * @return {R} Result of evaluating f repeatedly across the values of the array. * @template T,S,R */ -goog.array.reduce = function(arr, f, val, opt_obj) { - if (arr.reduce) { - if (opt_obj) { - return arr.reduce(goog.bind(f, opt_obj), val); - } else { - return arr.reduce(f, val); - } - } - var rval = val; - goog.array.forEach(arr, function(val, index) { - rval = f.call(opt_obj, rval, val, index, arr); - }); - return rval; -}; +goog.array.reduce = goog.NATIVE_ARRAY_PROTOTYPES && + (goog.array.ASSUME_NATIVE_FUNCTIONS || + goog.array.ARRAY_PROTOTYPE_.reduce) ? + function(arr, f, val, opt_obj) { + goog.asserts.assert(arr.length != null); + if (opt_obj) { + f = goog.bind(f, opt_obj); + } + return goog.array.ARRAY_PROTOTYPE_.reduce.call(arr, f, val); + } : + function(arr, f, val, opt_obj) { + var rval = val; + goog.array.forEach(arr, function(val, index) { + rval = f.call(opt_obj, rval, val, index, arr); + }); + return rval; + }; /** @@ -358,20 +387,23 @@ goog.array.reduce = function(arr, f, val, opt_obj) { * values of the array. * @template T,S,R */ -goog.array.reduceRight = function(arr, f, val, opt_obj) { - if (arr.reduceRight) { - if (opt_obj) { - return arr.reduceRight(goog.bind(f, opt_obj), val); - } else { - return arr.reduceRight(f, val); - } - } - var rval = val; - goog.array.forEachRight(arr, function(val, index) { - rval = f.call(opt_obj, rval, val, index, arr); - }); - return rval; -}; +goog.array.reduceRight = goog.NATIVE_ARRAY_PROTOTYPES && + (goog.array.ASSUME_NATIVE_FUNCTIONS || + goog.array.ARRAY_PROTOTYPE_.reduceRight) ? + function(arr, f, val, opt_obj) { + goog.asserts.assert(arr.length != null); + if (opt_obj) { + f = goog.bind(f, opt_obj); + } + return goog.array.ARRAY_PROTOTYPE_.reduceRight.call(arr, f, val); + } : + function(arr, f, val, opt_obj) { + var rval = val; + goog.array.forEachRight(arr, function(val, index) { + rval = f.call(opt_obj, rval, val, index, arr); + }); + return rval; + }; /** @@ -392,7 +424,8 @@ goog.array.reduceRight = function(arr, f, val, opt_obj) { * @template T,S */ goog.array.some = goog.NATIVE_ARRAY_PROTOTYPES && - goog.array.ARRAY_PROTOTYPE_.some ? + (goog.array.ASSUME_NATIVE_FUNCTIONS || + goog.array.ARRAY_PROTOTYPE_.some) ? function(arr, f, opt_obj) { goog.asserts.assert(arr.length != null); @@ -428,7 +461,8 @@ goog.array.some = goog.NATIVE_ARRAY_PROTOTYPES && * @template T,S */ goog.array.every = goog.NATIVE_ARRAY_PROTOTYPES && - goog.array.ARRAY_PROTOTYPE_.every ? + (goog.array.ASSUME_NATIVE_FUNCTIONS || + goog.array.ARRAY_PROTOTYPE_.every) ? function(arr, f, opt_obj) { goog.asserts.assert(arr.length != null); @@ -478,7 +512,7 @@ goog.array.count = function(arr, f, opt_obj) { * for every element. This function takes 3 arguments (the element, the * index and the array) and should return a boolean. * @param {S=} opt_obj An optional "this" context for the function. - * @return {T} The first array element that passes the test, or null if no + * @return {?T} The first array element that passes the test, or null if no * element is found. * @template T,S */ @@ -524,7 +558,7 @@ goog.array.findIndex = function(arr, f, opt_obj) { * takes 3 arguments (the element, the index and the array) and should * return a boolean. * @param {S=} opt_obj An optional "this" context for the function. - * @return {T} The last array element that passes the test, or null if no + * @return {?T} The last array element that passes the test, or null if no * element is found. * @template T,S */ @@ -655,9 +689,11 @@ goog.array.insertBefore = function(arr, obj, opt_obj2) { /** * Removes the first occurrence of a particular value from an array. - * @param {goog.array.ArrayLike} arr Array from which to remove value. - * @param {*} obj Object to remove. + * @param {Array.|goog.array.ArrayLike} arr Array from which to remove + * value. + * @param {T} obj Object to remove. * @return {boolean} True if an element was removed. + * @template T */ goog.array.remove = function(arr, obj) { var i = goog.array.indexOf(arr, obj); @@ -741,13 +777,27 @@ goog.array.concat = function(var_args) { }; +/** + * Returns a new array that contains the contents of all the arrays passed. + * @param {...!Array.} var_args + * @return {!Array.} + * @template T + */ +goog.array.join = function(var_args) { + return goog.array.ARRAY_PROTOTYPE_.concat.apply( + goog.array.ARRAY_PROTOTYPE_, arguments); +}; + + /** * Converts an object to an array. - * @param {goog.array.ArrayLike} object The object to convert to an array. - * @return {!Array} The object converted into an array. If object has a + * @param {Array.|goog.array.ArrayLike} object The object to convert to an + * array. + * @return {!Array.} The object converted into an array. If object has a * length property, every property indexed with a non-negative number * less than length will be included in the result. If object does not * have a length property, an empty array will be returned. + * @template T */ goog.array.toArray = function(object) { var length = object.length; @@ -768,8 +818,10 @@ goog.array.toArray = function(object) { /** * Does a shallow copy of an array. - * @param {goog.array.ArrayLike} arr Array or array-like object to clone. - * @return {!Array} Clone of the input array. + * @param {Array.|goog.array.ArrayLike} arr Array or array-like object to + * clone. + * @return {!Array.} Clone of the input array. + * @template T */ goog.array.clone = goog.array.toArray; @@ -785,8 +837,10 @@ goog.array.clone = goog.array.toArray; * goog.array.extend(a, 2); * a; // [0, 1, 2] * - * @param {Array} arr1 The array to modify. - * @param {...*} var_args The elements or arrays of elements to add to arr1. + * @param {Array.} arr1 The array to modify. + * @param {...(Array.|VALUE)} var_args The elements or arrays of elements + * to add to arr1. + * @template VALUE */ goog.array.extend = function(arr1, var_args) { for (var i = 1; i < arguments.length; i++) { @@ -822,15 +876,16 @@ goog.array.extend = function(arr1, var_args) { * splice. This means that it might work on other objects similar to arrays, * such as the arguments object. * - * @param {goog.array.ArrayLike} arr The array to modify. + * @param {Array.|goog.array.ArrayLike} arr The array to modify. * @param {number|undefined} index The index at which to start changing the * array. If not defined, treated as 0. * @param {number} howMany How many elements to remove (0 means no removal. A * value below 0 is treated as zero and so is any other non number. Numbers * are floored). - * @param {...*} var_args Optional, additional elements to insert into the + * @param {...T} var_args Optional, additional elements to insert into the * array. - * @return {!Array} the removed elements. + * @return {!Array.} the removed elements. + * @template T */ goog.array.splice = function(arr, index, howMany, var_args) { goog.asserts.assert(arr.length != null); @@ -876,27 +931,36 @@ goog.array.slice = function(arr, start, opt_end) { * For objects, duplicates are identified as having the same unique ID as * defined by {@link goog.getUid}. * + * Alternatively you can specify a custom hash function that returns a unique + * value for each item in the array it should consider unique. + * * Runtime: N, * Worstcase space: 2N (no dupes) * - * @param {goog.array.ArrayLike} arr The array from which to remove duplicates. + * @param {Array.|goog.array.ArrayLike} arr The array from which to remove + * duplicates. * @param {Array=} opt_rv An optional array in which to return the results, * instead of performing the removal inplace. If specified, the original * array will remain unchanged. + * @param {function(T):string=} opt_hashFn An optional function to use to + * apply to every item in the array. This function should return a unique + * value for each item in the array it should consider unique. + * @template T */ -goog.array.removeDuplicates = function(arr, opt_rv) { +goog.array.removeDuplicates = function(arr, opt_rv, opt_hashFn) { var returnArray = opt_rv || arr; - - var seen = {}, cursorInsert = 0, cursorRead = 0; - while (cursorRead < arr.length) { - var current = arr[cursorRead++]; - + var defaultHashFn = function(item) { // Prefix each type with a single character representing the type to // prevent conflicting keys (e.g. true and 'true'). - var key = goog.isObject(current) ? - 'o' + goog.getUid(current) : + return goog.isObject(current) ? 'o' + goog.getUid(current) : (typeof current).charAt(0) + current; + }; + var hashFn = opt_hashFn || defaultHashFn; + var seen = {}, cursorInsert = 0, cursorRead = 0; + while (cursorRead < arr.length) { + var current = arr[cursorRead++]; + var key = hashFn(current); if (!Object.prototype.hasOwnProperty.call(seen, key)) { seen[key] = true; returnArray[cursorInsert++] = current; @@ -919,16 +983,18 @@ goog.array.removeDuplicates = function(arr, opt_rv) { * * Runtime: O(log n) * - * @param {goog.array.ArrayLike} arr The array to be searched. - * @param {*} target The sought value. - * @param {Function=} opt_compareFn Optional comparison function by which the - * array is ordered. Should take 2 arguments to compare, and return a - * negative number, zero, or a positive number depending on whether the - * first argument is less than, equal to, or greater than the second. + * @param {Array.|goog.array.ArrayLike} arr The array to be searched. + * @param {TARGET} target The sought value. + * @param {function(TARGET, VALUE): number=} opt_compareFn Optional comparison + * function by which the array is ordered. Should take 2 arguments to + * compare, and return a negative number, zero, or a positive number + * depending on whether the first argument is less than, equal to, or + * greater than the second. * @return {number} Lowest index of the target value if found, otherwise * (-(insertion point) - 1). The insertion point is where the value should * be inserted into arr to preserve the sorted property. Return value >= 0 * iff target is found. + * @template TARGET, VALUE */ goog.array.binarySearch = function(arr, target, opt_compareFn) { return goog.array.binarySearch_(arr, @@ -946,18 +1012,20 @@ goog.array.binarySearch = function(arr, target, opt_compareFn) { * * Runtime: O(log n) * - * @param {goog.array.ArrayLike} arr The array to be searched. - * @param {Function} evaluator Evaluator function that receives 3 arguments - * (the element, the index and the array). Should return a negative number, - * zero, or a positive number depending on whether the desired index is - * before, at, or after the element passed to it. - * @param {Object=} opt_obj The object to be used as the value of 'this' + * @param {Array.|goog.array.ArrayLike} arr The array to be searched. + * @param {function(this:THIS, VALUE, number, ?): number} evaluator + * Evaluator function that receives 3 arguments (the element, the index and + * the array). Should return a negative number, zero, or a positive number + * depending on whether the desired index is before, at, or after the + * element passed to it. + * @param {THIS=} opt_obj The object to be used as the value of 'this' * within evaluator. * @return {number} Index of the leftmost element matched by the evaluator, if * such exists; otherwise (-(insertion point) - 1). The insertion point is * the index of the first element for which the evaluator returns negative, * or arr.length if no such element exists. The return value is non-negative * iff a match is found. + * @template THIS, VALUE */ goog.array.binarySelect = function(arr, evaluator, opt_obj) { return goog.array.binarySearch_(arr, evaluator, true /* isEvaluator */, @@ -977,19 +1045,22 @@ goog.array.binarySelect = function(arr, evaluator, opt_obj) { * * Runtime: O(log n) * - * @param {goog.array.ArrayLike} arr The array to be searched. - * @param {Function} compareFn Either an evaluator or a comparison function, - * as defined by binarySearch and binarySelect above. + * @param {Array.|goog.array.ArrayLike} arr The array to be searched. + * @param {function(TARGET, VALUE): number| + * function(this:THIS, VALUE, number, ?): number} compareFn Either an + * evaluator or a comparison function, as defined by binarySearch + * and binarySelect above. * @param {boolean} isEvaluator Whether the function is an evaluator or a * comparison function. - * @param {*=} opt_target If the function is a comparison function, then this is - * the target to binary search for. - * @param {Object=} opt_selfObj If the function is an evaluator, this is an + * @param {TARGET=} opt_target If the function is a comparison function, then + * this is the target to binary search for. + * @param {THIS=} opt_selfObj If the function is an evaluator, this is an * optional this object for the evaluator. * @return {number} Lowest index of the target value if found, otherwise * (-(insertion point) - 1). The insertion point is where the value should * be inserted into arr to preserve the sorted property. Return value >= 0 * iff target is found. + * @template THIS, VALUE, TARGET * @private */ goog.array.binarySearch_ = function(arr, compareFn, isEvaluator, opt_target, @@ -1042,10 +1113,7 @@ goog.array.binarySearch_ = function(arr, compareFn, isEvaluator, opt_target, */ goog.array.sort = function(arr, opt_compareFn) { // TODO(arv): Update type annotation since null is not accepted. - goog.asserts.assert(arr.length != null); - - goog.array.ARRAY_PROTOTYPE_.sort.call( - arr, opt_compareFn || goog.array.defaultCompare); + arr.sort(opt_compareFn || goog.array.defaultCompare); }; @@ -1154,30 +1222,21 @@ goog.array.equals = function(arr1, arr2, opt_equalsFn) { }; -/** - * @deprecated Use {@link goog.array.equals}. - * @param {goog.array.ArrayLike} arr1 See {@link goog.array.equals}. - * @param {goog.array.ArrayLike} arr2 See {@link goog.array.equals}. - * @param {Function=} opt_equalsFn See {@link goog.array.equals}. - * @return {boolean} See {@link goog.array.equals}. - */ -goog.array.compare = function(arr1, arr2, opt_equalsFn) { - return goog.array.equals(arr1, arr2, opt_equalsFn); -}; - - /** * 3-way array compare function. - * @param {!goog.array.ArrayLike} arr1 The first array to compare. - * @param {!goog.array.ArrayLike} arr2 The second array to compare. - * @param {?function(?, ?): number=} opt_compareFn Optional comparison function - * by which the array is to be ordered. Should take 2 arguments to compare, - * and return a negative number, zero, or a positive number depending on - * whether the first argument is less than, equal to, or greater than the - * second. + * @param {!Array.|!goog.array.ArrayLike} arr1 The first array to + * compare. + * @param {!Array.|!goog.array.ArrayLike} arr2 The second array to + * compare. + * @param {function(VALUE, VALUE): number=} opt_compareFn Optional comparison + * function by which the array is to be ordered. Should take 2 arguments to + * compare, and return a negative number, zero, or a positive number + * depending on whether the first argument is less than, equal to, or + * greater than the second. * @return {number} Negative number, zero, or a positive number depending on * whether the first argument is less than, equal to, or greater than the * second. + * @template VALUE */ goog.array.compare3 = function(arr1, arr2, opt_compareFn) { var compare = opt_compareFn || goog.array.defaultCompare; @@ -1195,10 +1254,11 @@ goog.array.compare3 = function(arr1, arr2, opt_compareFn) { /** * Compares its two arguments for order, using the built in < and > * operators. - * @param {*} a The first object to be compared. - * @param {*} b The second object to be compared. + * @param {VALUE} a The first object to be compared. + * @param {VALUE} b The second object to be compared. * @return {number} A negative number, zero, or a positive number as the first * argument is less than, equal to, or greater than the second. + * @template VALUE */ goog.array.defaultCompare = function(a, b) { return a > b ? 1 : a < b ? -1 : 0; @@ -1219,15 +1279,15 @@ goog.array.defaultCompareEquality = function(a, b) { /** * Inserts a value into a sorted array. The array is not modified if the * value is already present. - * @param {Array.} array The array to modify. - * @param {T} value The object to insert. - * @param {?function(T,T):number=} opt_compareFn Optional comparison function by - * which the - * array is ordered. Should take 2 arguments to compare, and return a - * negative number, zero, or a positive number depending on whether the - * first argument is less than, equal to, or greater than the second. + * @param {Array.|goog.array.ArrayLike} array The array to modify. + * @param {VALUE} value The object to insert. + * @param {function(VALUE, VALUE): number=} opt_compareFn Optional comparison + * function by which the array is ordered. Should take 2 arguments to + * compare, and return a negative number, zero, or a positive number + * depending on whether the first argument is less than, equal to, or + * greater than the second. * @return {boolean} True if an element was inserted. - * @template T + * @template VALUE */ goog.array.binaryInsert = function(array, value, opt_compareFn) { var index = goog.array.binarySearch(array, value, opt_compareFn); @@ -1241,13 +1301,15 @@ goog.array.binaryInsert = function(array, value, opt_compareFn) { /** * Removes a value from a sorted array. - * @param {Array} array The array to modify. - * @param {*} value The object to remove. - * @param {Function=} opt_compareFn Optional comparison function by which the - * array is ordered. Should take 2 arguments to compare, and return a - * negative number, zero, or a positive number depending on whether the - * first argument is less than, equal to, or greater than the second. + * @param {!Array.|!goog.array.ArrayLike} array The array to modify. + * @param {VALUE} value The object to remove. + * @param {function(VALUE, VALUE): number=} opt_compareFn Optional comparison + * function by which the array is ordered. Should take 2 arguments to + * compare, and return a negative number, zero, or a positive number + * depending on whether the first argument is less than, equal to, or + * greater than the second. * @return {boolean} True if an element was removed. + * @template VALUE */ goog.array.binaryRemove = function(array, value, opt_compareFn) { var index = goog.array.binarySearch(array, value, opt_compareFn); @@ -1362,9 +1424,10 @@ goog.array.range = function(startOrEnd, opt_end, opt_step) { /** * Returns an array consisting of the given value repeated N times. * - * @param {*} value The value to repeat. + * @param {VALUE} value The value to repeat. * @param {number} n The repeat count. - * @return {!Array} An array with the repeated value. + * @return {!Array.} An array with the repeated value. + * @template VALUE */ goog.array.repeat = function(value, n) { var array = []; @@ -1425,6 +1488,28 @@ goog.array.rotate = function(array, n) { }; +/** + * Moves one item of an array to a new position keeping the order of the rest + * of the items. Example use case: keeping a list of JavaScript objects + * synchronized with the corresponding list of DOM elements after one of the + * elements has been dragged to a new position. + * @param {!(Array|Arguments|{length:number})} arr The array to modify. + * @param {number} fromIndex Index of the item to move between 0 and + * {@code arr.length - 1}. + * @param {number} toIndex Target index between 0 and {@code arr.length - 1}. + */ +goog.array.moveItem = function(arr, fromIndex, toIndex) { + goog.asserts.assert(fromIndex >= 0 && fromIndex < arr.length); + goog.asserts.assert(toIndex >= 0 && toIndex < arr.length); + // Remove 1 item at fromIndex. + var removedItems = goog.array.ARRAY_PROTOTYPE_.splice.call(arr, fromIndex, 1); + // Insert the removed item at toIndex. + goog.array.ARRAY_PROTOTYPE_.splice.call(arr, toIndex, 0, removedItems[0]); + // We don't use goog.array.insertAt and goog.array.removeAt, because they're + // significantly slower than splice. +}; + + /** * Creates a new array for which the element at position i is an array of the * ith element of the provided arrays. The returned array will only be as long diff --git a/third_party/closure/goog/asserts/asserts.js b/third_party/closure/goog/asserts/asserts.js index 905cd58d2f6d0..4afdac38b6427 100644 --- a/third_party/closure/goog/asserts/asserts.js +++ b/third_party/closure/goog/asserts/asserts.js @@ -37,6 +37,7 @@ goog.provide('goog.asserts'); goog.provide('goog.asserts.AssertionError'); goog.require('goog.debug.Error'); +goog.require('goog.dom.NodeType'); goog.require('goog.string'); @@ -53,6 +54,7 @@ goog.define('goog.asserts.ENABLE_ASSERTS', goog.DEBUG); * @param {!Array.<*>} messageArgs The items to substitute into the pattern. * @constructor * @extends {goog.debug.Error} + * @final */ goog.asserts.AssertionError = function(messagePattern, messageArgs) { messageArgs.unshift(messagePattern); @@ -106,10 +108,11 @@ goog.asserts.doAssertFailure_ = /** * Checks if the condition evaluates to true if goog.asserts.ENABLE_ASSERTS is * true. - * @param {*} condition The condition to check. + * @template T + * @param {T} condition The condition to check. * @param {string=} opt_message Error message in case of failure. * @param {...*} var_args The items to substitute into the failure message. - * @return {*} The value of the condition. + * @return {T} The value of the condition. * @throws {goog.asserts.AssertionError} When the condition evaluates to false. */ goog.asserts.assert = function(condition, opt_message, var_args) { @@ -258,6 +261,26 @@ goog.asserts.assertBoolean = function(value, opt_message, var_args) { }; +/** + * Checks if the value is a DOM Element if goog.asserts.ENABLE_ASSERTS is true. + * @param {*} value The value to check. + * @param {string=} opt_message Error message in case of failure. + * @param {...*} var_args The items to substitute into the failure message. + * @return {!Element} The value, likely to be a DOM Element when asserts are + * enabled. + * @throws {goog.asserts.AssertionError} When the value is not a boolean. + */ +goog.asserts.assertElement = function(value, opt_message, var_args) { + if (goog.asserts.ENABLE_ASSERTS && (!goog.isObject(value) || + value.nodeType != goog.dom.NodeType.ELEMENT)) { + goog.asserts.doAssertFailure_('Expected Element but got %s: %s.', + [goog.typeOf(value), value], opt_message, + Array.prototype.slice.call(arguments, 2)); + } + return /** @type {!Element} */ (value); +}; + + /** * Checks if the value is an instance of the user-defined type if * goog.asserts.ENABLE_ASSERTS is true. @@ -281,3 +304,13 @@ goog.asserts.assertInstanceof = function(value, type, opt_message, var_args) { return value; }; + +/** + * Checks that no enumerable keys are present in Object.prototype. Such keys + * would break most code that use {@code for (var ... in ...)} loops. + */ +goog.asserts.assertObjectPrototypeIsIntact = function() { + for (var key in Object.prototype) { + goog.asserts.fail(key + ' should not be enumerable in Object.prototype.'); + } +}; diff --git a/third_party/closure/goog/async/animationdelay.js b/third_party/closure/goog/async/animationdelay.js index e617eb0daf49c..48e156c003749 100644 --- a/third_party/closure/goog/async/animationdelay.js +++ b/third_party/closure/goog/async/animationdelay.js @@ -52,9 +52,10 @@ goog.require('goog.functions'); * @param {Object=} opt_handler The object scope to invoke the function in. * @constructor * @extends {goog.Disposable} + * @final */ goog.async.AnimationDelay = function(listener, opt_window, opt_handler) { - goog.base(this); + goog.async.AnimationDelay.base(this, 'constructor'); /** * The function that will be invoked after a delay. @@ -234,7 +235,7 @@ goog.async.AnimationDelay.prototype.doAction_ = function() { /** @override */ goog.async.AnimationDelay.prototype.disposeInternal = function() { this.stop(); - goog.base(this, 'disposeInternal'); + goog.async.AnimationDelay.base(this, 'disposeInternal'); }; diff --git a/third_party/closure/goog/async/delay.js b/third_party/closure/goog/async/delay.js index 3f3b262aeff85..1c5916a216e38 100644 --- a/third_party/closure/goog/async/delay.js +++ b/third_party/closure/goog/async/delay.js @@ -42,6 +42,7 @@ goog.require('goog.Timer'); * @param {Object=} opt_handler The object scope to invoke the function in. * @constructor * @extends {goog.Disposable} + * @final */ goog.async.Delay = function(listener, opt_interval, opt_handler) { goog.Disposable.call(this); @@ -83,6 +84,7 @@ goog.inherits(goog.async.Delay, goog.Disposable); * A deprecated alias. * @deprecated Use goog.async.Delay instead. * @constructor + * @final */ goog.Delay = goog.async.Delay; diff --git a/third_party/closure/goog/async/nexttick.js b/third_party/closure/goog/async/nexttick.js index 5f8b895e69b6e..29ba7d7aa1619 100644 --- a/third_party/closure/goog/async/nexttick.js +++ b/third_party/closure/goog/async/nexttick.js @@ -20,17 +20,33 @@ */ goog.provide('goog.async.nextTick'); +goog.provide('goog.async.throwException'); goog.require('goog.debug.entryPointRegistry'); goog.require('goog.functions'); +/** + * Throw an item without interrupting the current execution context. For + * example, if processing a group of items in a loop, sometimes it is useful + * to report an error while still allowing the rest of the batch to be + * processed. + * @param {*} exception + */ +goog.async.throwException = function(exception) { + // Each throw needs to be in its own context. + goog.global.setTimeout(function() { throw exception; }, 0); +}; + + /** * Fires the provided callbacks as soon as possible after the current JS * execution context. setTimeout(…, 0) always takes at least 5ms for legacy * reasons. - * @param {function()} callback Callback function to fire as soon as possible. - * @param {Object=} opt_context Object in whose scope to call the listener. + * @param {function(this:SCOPE)} callback Callback function to fire as soon as + * possible. + * @param {SCOPE=} opt_context Object in whose scope to call the listener. + * @template SCOPE */ goog.async.nextTick = function(callback, opt_context) { var cb = callback; @@ -67,6 +83,24 @@ goog.async.nextTick.setImmediate_; * @private */ goog.async.nextTick.getSetImmediateEmulator_ = function() { + // If native Promises are available in the browser, just schedule the callback + // on a fulfilled promise, which is specified to be async, but as fast as + // possible. + if (goog.global.Promise && goog.global.Promise.resolve) { + var promise = goog.global.Promise.resolve(); + return function(cb) { + promise.then(function() { + try { + cb(); + } catch (e) { + // If there is an error in the callback, make sure it is reported, + // since there is no chance to attach an error-handler to the + // promise used here. + goog.async.throwException(e); + } + }); + }; + } // Create a private message channel and use it to postMessage empty messages // to ourselves. var Channel = goog.global['MessageChannel']; @@ -82,7 +116,7 @@ goog.async.nextTick.getSetImmediateEmulator_ = function() { var iframe = document.createElement('iframe'); iframe.style.display = 'none'; iframe.src = ''; - document.body.appendChild(iframe); + document.documentElement.appendChild(iframe); var win = iframe.contentWindow; var doc = win.document; doc.open(); diff --git a/third_party/closure/goog/async/run.js b/third_party/closure/goog/async/run.js new file mode 100644 index 0000000000000..d281c246fd397 --- /dev/null +++ b/third_party/closure/goog/async/run.js @@ -0,0 +1,105 @@ +// Copyright 2013 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.async.run'); + +goog.require('goog.async.nextTick'); +goog.require('goog.async.throwException'); +goog.require('goog.testing.watchers'); + + +/** + * Fires the provided callback just before the current callstack unwinds, or as + * soon as possible after the current JS execution context. + * @param {function(this:THIS)} callback + * @param {THIS=} opt_context Object to use as the "this value" when calling + * the provided function. + * @template THIS + */ +goog.async.run = function(callback, opt_context) { + if (!goog.async.run.workQueueScheduled_) { + // Nothing is currently scheduled, schedule it now. + goog.async.nextTick(goog.async.run.processWorkQueue); + goog.async.run.workQueueScheduled_ = true; + } + + goog.async.run.workQueue_.push( + new goog.async.run.WorkItem_(callback, opt_context)); +}; + + +/** @private {boolean} */ +goog.async.run.workQueueScheduled_ = false; + + +/** @private {!Array.} */ +goog.async.run.workQueue_ = []; + + +if (goog.DEBUG) { + /** + * Reset the event queue. + * @private + */ + goog.async.run.resetQueue_ = function() { + goog.async.run.workQueueScheduled_ = false; + goog.async.run.workQueue_ = []; + }; + + // If there is a clock implemenation in use for testing + // and it is reset, reset the queue. + goog.testing.watchers.watchClockReset(goog.async.run.resetQueue_); +} + + +/** + * Run any pending goog.async.run work items. This function is not intended + * for general use, but for use by entry point handlers to run items ahead of + * goog.async.nextTick. + */ +goog.async.run.processWorkQueue = function() { + // NOTE: additional work queue items may be pushed while processing. + while (goog.async.run.workQueue_.length) { + // Don't let the work queue grow indefinitely. + var workItems = goog.async.run.workQueue_; + goog.async.run.workQueue_ = []; + for (var i = 0; i < workItems.length; i++) { + var workItem = workItems[i]; + try { + workItem.fn.call(workItem.scope); + } catch (e) { + goog.async.throwException(e); + } + } + } + + // There are no more work items, reset the work queue. + goog.async.run.workQueueScheduled_ = false; +}; + + + +/** + * @constructor + * @final + * @struct + * @private + * + * @param {function()} fn + * @param {Object|null|undefined} scope + */ +goog.async.run.WorkItem_ = function(fn, scope) { + /** @const */ this.fn = fn; + /** @const */ this.scope = scope; +}; diff --git a/third_party/closure/goog/async/throttle.js b/third_party/closure/goog/async/throttle.js index c8ece971bd7c5..939738eea415b 100644 --- a/third_party/closure/goog/async/throttle.js +++ b/third_party/closure/goog/async/throttle.js @@ -31,19 +31,22 @@ goog.require('goog.Timer'); * per interval (specified in milliseconds). If it gets multiple signals * to perform the action while it is waiting, it will only perform the action * once at the end of the interval. - * @param {Function} listener Function to callback when the action is triggered. - * @param {number} interval Interval over which to throttle. The handler can + * @param {function(this: T)} listener Function to callback when the action is + * triggered. + * @param {number} interval Interval over which to throttle. The listener can * only be called once per interval. - * @param {Object=} opt_handler Object in whose scope to call the listener. + * @param {T=} opt_handler Object in whose scope to call the listener. * @constructor * @extends {goog.Disposable} + * @final + * @template T */ goog.async.Throttle = function(listener, interval, opt_handler) { goog.Disposable.call(this); /** * Function to callback - * @type {Function} + * @type {function(this: T)} * @private */ this.listener_ = listener; @@ -77,6 +80,7 @@ goog.inherits(goog.async.Throttle, goog.Disposable); * A deprecated alias. * @deprecated Use goog.async.Throttle instead. * @constructor + * @final */ goog.Throttle = goog.async.Throttle; diff --git a/third_party/closure/goog/base.js b/third_party/closure/goog/base.js index 39bd73a66726f..68f871b163b98 100644 --- a/third_party/closure/goog/base.js +++ b/third_party/closure/goog/base.js @@ -32,9 +32,9 @@ var COMPILED = false; /** - * Base namespace for the Closure library. Checks to see goog is - * already defined in the current scope before assigning to prevent - * clobbering if base.js is loaded more than once. + * Base namespace for the Closure library. Checks to see goog is already + * defined in the current scope before assigning to prevent clobbering if + * base.js is loaded more than once. * * @const */ @@ -50,15 +50,36 @@ goog.global = this; /** * A hook for overriding the define values in uncompiled mode. * - * In uncompiled mode, {@code CLOSURE_DEFINES} may be defined before loading - * base.js. If a key is defined in {@code CLOSURE_DEFINES}, {@code goog.define} - * will use the value instead of the default value. This allows flags to be - * overwritten without compilation (this is normally accomplished with the - * compiler's "define" flag). + * In uncompiled mode, {@code CLOSURE_UNCOMPILED_DEFINES} may be defined before + * loading base.js. If a key is defined in {@code CLOSURE_UNCOMPILED_DEFINES}, + * {@code goog.define} will use the value instead of the default value. This + * allows flags to be overwritten without compilation (this is normally + * accomplished with the compiler's "define" flag). * * Example: *
- *   var CLOSURE_DEFINES = {'goog.DEBUG', false};
+ *   var CLOSURE_UNCOMPILED_DEFINES = {'goog.DEBUG': false};
+ * 
+ * + * @type {Object.|undefined} + */ +goog.global.CLOSURE_UNCOMPILED_DEFINES; + + +/** + * A hook for overriding the define values in uncompiled or compiled mode, + * like CLOSURE_UNCOMPILED_DEFINES but effective in compiled code. In + * uncompiled code CLOSURE_UNCOMPILED_DEFINES takes precedence. + * + * Also unlike CLOSURE_UNCOMPILED_DEFINES the values must be number, boolean or + * string literals or the compiler will emit an error. + * + * While any @define value may be set, only those set with goog.define will be + * effective for uncompiled code. + * + * Example: + *
+ *   var CLOSURE_DEFINES = {'goog.DEBUG': false};
  * 
* * @type {Object.|undefined} @@ -67,9 +88,23 @@ goog.global.CLOSURE_DEFINES; /** - * Builds an object structure for the provided namespace path, - * ensuring that names that already exist are not overwritten. For - * example: + * Returns true if the specified value is not undefined. + * WARNING: Do not use this to test if an object has a property. Use the in + * operator instead. + * + * @param {?} val Variable to test. + * @return {boolean} Whether variable is defined. + */ +goog.isDef = function(val) { + // void 0 always evaluates to undefined and hence we do not need to depend on + // the definition of the global variable named 'undefined'. + return val !== void 0; +}; + + +/** + * Builds an object structure for the provided namespace path, ensuring that + * names that already exist are not overwritten. For example: * "a.b.c" -> a = {};a.b={};a.b.c={}; * Used by goog.provide and goog.exportSymbol. * @param {string} name name of the object that this file defines. @@ -96,7 +131,7 @@ goog.exportPath_ = function(name, opt_object, opt_objectToExportTo) { // Parentheses added to eliminate strict JS warning in Firefox. for (var part; parts.length && (part = parts.shift());) { - if (!parts.length && opt_object !== undefined) { + if (!parts.length && goog.isDef(opt_object)) { // last part and we have an object; use it cur[part] = opt_object; } else if (cur[part]) { @@ -110,9 +145,10 @@ goog.exportPath_ = function(name, opt_object, opt_objectToExportTo) { /** * Defines a named value. In uncompiled mode, the value is retreived from - * CLOSURE_DEFINES if the object is defined and has the property specified, - * and otherwise used the defined defaultValue. When compiled, the default - * can be overridden using compiler command-line options. + * CLOSURE_DEFINES or CLOSURE_UNCOMPILED_DEFINES if the object is defined and + * has the property specified, and otherwise used the defined defaultValue. + * When compiled, the default can be overridden using compiler command-line + * options. * * @param {string} name The distinguished name to provide. * @param {string|number|boolean} defaultValue @@ -120,8 +156,13 @@ goog.exportPath_ = function(name, opt_object, opt_objectToExportTo) { goog.define = function(name, defaultValue) { var value = defaultValue; if (!COMPILED) { - if (goog.global.CLOSURE_DEFINES && Object.prototype.hasOwnProperty.call( - goog.global.CLOSURE_DEFINES, name)) { + if (goog.global.CLOSURE_UNCOMPILED_DEFINES && + Object.prototype.hasOwnProperty.call( + goog.global.CLOSURE_UNCOMPILED_DEFINES, name)) { + value = goog.global.CLOSURE_UNCOMPILED_DEFINES[name]; + } else if (goog.global.CLOSURE_DEFINES && + Object.prototype.hasOwnProperty.call( + goog.global.CLOSURE_DEFINES, name)) { value = goog.global.CLOSURE_DEFINES[name]; } } @@ -169,17 +210,28 @@ goog.define('goog.LOCALE', 'en'); // default to en * external libraries like Prototype, Datejs, and JQuery and setting this flag * to false forces closure to use its own implementations when possible. * - * If your javascript can be loaded by a third party site and you are wary about + * If your JavaScript can be loaded by a third party site and you are wary about * relying on non-standard implementations, specify * "--define goog.TRUSTED_SITE=false" to the JSCompiler. */ goog.define('goog.TRUSTED_SITE', true); +/** + * @define {boolean} Whether a project is expected to be running in strict mode. + * + * This define can be used to trigger alternate implementations compatible with + * running in EcmaScript Strict mode or warn about unavailable functionality. + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions_and_function_scope/Strict_mode + */ +goog.define('goog.STRICT_MODE_COMPATIBLE', false); + + /** * Creates object stubs for a namespace. The presence of one or more * goog.provide() calls indicate that the file defines the given - * objects/namespaces. Build tools also scan for provide/require statements + * objects/namespaces. Provided objects must not be null or undefined. + * Build tools also scan for provide/require statements * to discern dependencies, build dependency files (see deps.js), etc. * @see goog.require * @param {string} name Namespace provided by this file in the form @@ -214,9 +266,9 @@ goog.provide = function(name) { * Marks that the current file should only be used for testing, and never for * live code in production. * - * In the case of unit tests, the message may optionally be an exact - * namespace for the test (e.g. 'goog.stringTest'). The linter will then - * ignore the extra provide (if not explicitly defined in the code). + * In the case of unit tests, the message may optionally be an exact namespace + * for the test (e.g. 'goog.stringTest'). The linter will then ignore the extra + * provide (if not explicitly defined in the code). * * @param {string=} opt_message Optional message to add to the error that's * raised when used in production code. @@ -230,6 +282,25 @@ goog.setTestOnly = function(opt_message) { }; +/** + * Forward declares a symbol. This is an indication to the compiler that the + * symbol may be used in the source yet is not required and may not be provided + * in compilation. + * + * The most common usage of forward declaration is code that takes a type as a + * function parameter but does not need to require it. By forward declaring + * instead of requiring, no hard dependency is made, and (if not required + * elsewhere) the namespace may never be required and thus, not be pulled + * into the JavaScript binary. If it is required elsewhere, it will be type + * checked as normal. + * + * + * @param {string} name The namespace to forward declare in the form of + * "goog.package.part". + */ +goog.forwardDeclare = function(name) {}; + + if (!COMPILED) { /** @@ -240,13 +311,14 @@ if (!COMPILED) { * @private */ goog.isProvided_ = function(name) { - return !goog.implicitNamespaces_[name] && !!goog.getObjectByName(name); + return !goog.implicitNamespaces_[name] && + goog.isDefAndNotNull(goog.getObjectByName(name)); }; /** * Namespaces implicitly defined by goog.provide. For example, - * goog.provide('goog.events.Event') implicitly declares - * that 'goog' and 'goog.events' must be namespaces. + * goog.provide('goog.events.Event') implicitly declares that 'goog' and + * 'goog.events' must be namespaces. * * @type {Object} * @private @@ -256,9 +328,10 @@ if (!COMPILED) { /** - * Returns an object based on its fully qualified external name. If you are - * using a compilation pass that renames property names beware that using this - * function will not find renamed properties. + * Returns an object based on its fully qualified external name. The object + * is not found if null or undefined. If you are using a compilation pass that + * renames property names beware that using this function will not find renamed + * properties. * * @param {string} name The fully qualified name. * @param {Object=} opt_obj The object within which to look; default is @@ -327,14 +400,14 @@ goog.addDependency = function(relPath, provides, requires) { -// NOTE(nnaze): The debug DOM loader was included in base.js as an orignal -// way to do "debug-mode" development. The dependency system can sometimes -// be confusing, as can the debug DOM loader's asyncronous nature. +// NOTE(nnaze): The debug DOM loader was included in base.js as an original way +// to do "debug-mode" development. The dependency system can sometimes be +// confusing, as can the debug DOM loader's asynchronous nature. // -// With the DOM loader, a call to goog.require() is not blocking -- the -// script will not load until some point after the current script. If a -// namespace is needed at runtime, it needs to be defined in a previous -// script, or loaded via require() with its registered dependencies. +// With the DOM loader, a call to goog.require() is not blocking -- the script +// will not load until some point after the current script. If a namespace is +// needed at runtime, it needs to be defined in a previous script, or loaded via +// require() with its registered dependencies. // User-defined namespaces may need their own deps file. See http://go/js_deps, // http://go/genjsdeps, or, externally, DepsWriter. // http://code.google.com/closure/library/docs/depswriter.html @@ -359,22 +432,21 @@ goog.define('goog.ENABLE_DEBUG_LOADER', true); /** - * Implements a system for the dynamic resolution of dependencies - * that works in parallel with the BUILD system. Note that all calls - * to goog.require will be stripped by the JSCompiler when the - * --closure_pass option is used. + * Implements a system for the dynamic resolution of dependencies that works in + * parallel with the BUILD system. Note that all calls to goog.require will be + * stripped by the JSCompiler when the --closure_pass option is used. * @see goog.provide - * @param {string} name Namespace to include (as was given in goog.provide()) - * in the form "goog.package.part". + * @param {string} name Namespace to include (as was given in goog.provide()) in + * the form "goog.package.part". */ goog.require = function(name) { - // if the object already exists we do not need do do anything - // TODO(arv): If we start to support require based on file name this has - // to change - // TODO(arv): If we allow goog.foo.* this has to change + // If the object already exists we do not need do do anything. + // TODO(arv): If we start to support require based on file name this has to + // change. + // TODO(arv): If we allow goog.foo.* this has to change. // TODO(arv): If we implement dynamic load after page load we should probably - // not remove this code for the compiled output + // not remove this code for the compiled output. if (!COMPILED) { if (goog.isProvided_(name)) { return; @@ -402,7 +474,7 @@ goog.require = function(name) { /** - * Path for included scripts + * Path for included scripts. * @type {string} */ goog.basePath = ''; @@ -416,8 +488,7 @@ goog.global.CLOSURE_BASE_PATH; /** - * Whether to write out Closure's deps file. By default, - * the deps are written. + * Whether to write out Closure's deps file. By default, the deps are written. * @type {boolean|undefined} */ goog.global.CLOSURE_NO_DEPS; @@ -431,6 +502,7 @@ goog.global.CLOSURE_NO_DEPS; * * The function is passed the script source, which is a relative URI. It should * return true if the script was imported, false otherwise. + * @type {(function(string): boolean)|undefined} */ goog.global.CLOSURE_IMPORT_SCRIPT; @@ -458,19 +530,16 @@ goog.identityFunction = function(opt_returnValue, var_args) { /** * When defining a class Foo with an abstract method bar(), you can do: - * * Foo.prototype.bar = goog.abstractMethod * - * Now if a subclass of Foo fails to override bar(), an error - * will be thrown when bar() is invoked. + * Now if a subclass of Foo fails to override bar(), an error will be thrown + * when bar() is invoked. * - * Note: This does not take the name of the function to override as - * an argument because that would make it more difficult to obfuscate - * our JavaScript code. + * Note: This does not take the name of the function to override as an argument + * because that would make it more difficult to obfuscate our JavaScript code. * * @type {!Function} - * @throws {Error} when invoked to indicate the method should be - * overridden. + * @throws {Error} when invoked to indicate the method should be overridden. */ goog.abstractMethod = function() { throw Error('unimplemented abstract method'); @@ -478,8 +547,8 @@ goog.abstractMethod = function() { /** - * Adds a {@code getInstance} static method that always return the same instance - * object. + * Adds a {@code getInstance} static method that always returns the same + * instance object. * @param {!Function} ctor The constructor for the class to add the static * method to. */ @@ -516,8 +585,8 @@ goog.DEPENDENCIES_ENABLED = !COMPILED && goog.ENABLE_DEBUG_LOADER; if (goog.DEPENDENCIES_ENABLED) { /** - * Object used to keep track of urls that have already been added. This - * record allows the prevention of circular dependencies. + * Object used to keep track of urls that have already been added. This record + * allows the prevention of circular dependencies. * @type {Object} * @private */ @@ -526,7 +595,7 @@ if (goog.DEPENDENCIES_ENABLED) { /** * This object is used to keep track of dependencies and other data that is - * used for loading scripts + * used for loading scripts. * @private * @type {Object} */ @@ -534,10 +603,9 @@ if (goog.DEPENDENCIES_ENABLED) { pathToNames: {}, // 1 to many nameToPath: {}, // 1 to 1 requires: {}, // 1 to many - // used when resolving dependencies to prevent us from - // visiting the file twice + // Used when resolving dependencies to prevent us from visiting file twice. visited: {}, - written: {} // used to keep track of script files we have written + written: {} // Used to keep track of script files we have written. }; @@ -554,7 +622,7 @@ if (goog.DEPENDENCIES_ENABLED) { /** - * Tries to detect the base path of the base.js script that bootstraps Closure + * Tries to detect the base path of base.js script that bootstraps Closure. * @private */ goog.findBasePath_ = function() { @@ -638,7 +706,7 @@ if (goog.DEPENDENCIES_ENABLED) { * @private */ goog.writeScripts_ = function() { - // the scripts we need to write this time + // The scripts we need to write this time. var scripts = []; var seenScript = {}; var deps = goog.dependencies_; @@ -648,8 +716,8 @@ if (goog.DEPENDENCIES_ENABLED) { return; } - // we have already visited this one. We can get here if we have cyclic - // dependencies + // We have already visited this one. We can get here if we have cyclic + // dependencies. if (path in deps.visited) { if (!(path in seenScript)) { seenScript[path] = true; @@ -780,7 +848,7 @@ goog.typeOf = function(value) { if ((className == '[object Array]' || // In IE all non value types are wrapped as objects across window // boundaries (not iframe though) so we have to do object detection - // for this edge case + // for this edge case. typeof value.length == 'number' && typeof value.splice != 'undefined' && typeof value.propertyIsEnumerable != 'undefined' && @@ -810,17 +878,15 @@ goog.typeOf = function(value) { return 'function'; } - } else { return 'null'; } } else if (s == 'function' && typeof value.call == 'undefined') { - // In Safari typeof nodeList returns 'function', and on Firefox - // typeof behaves similarly for HTML{Applet,Embed,Object}Elements - // and RegExps. We would like to return object for those and we can - // detect an invalid function by making sure that the function - // object has a call method. + // In Safari typeof nodeList returns 'function', and on Firefox typeof + // behaves similarly for HTML{Applet,Embed,Object}, Elements and RegExps. We + // would like to return object for those and we can detect an invalid + // function by making sure that the function object has a call method. return 'object'; } return s; @@ -828,21 +894,8 @@ goog.typeOf = function(value) { /** - * Returns true if the specified value is not |undefined|. - * WARNING: Do not use this to test if an object has a property. Use the in - * operator instead. Additionally, this function assumes that the global - * undefined variable has not been redefined. - * @param {*} val Variable to test. - * @return {boolean} Whether variable is defined. - */ -goog.isDef = function(val) { - return val !== undefined; -}; - - -/** - * Returns true if the specified value is |null| - * @param {*} val Variable to test. + * Returns true if the specified value is null. + * @param {?} val Variable to test. * @return {boolean} Whether variable is null. */ goog.isNull = function(val) { @@ -851,8 +904,8 @@ goog.isNull = function(val) { /** - * Returns true if the specified value is defined and not null - * @param {*} val Variable to test. + * Returns true if the specified value is defined and not null. + * @param {?} val Variable to test. * @return {boolean} Whether variable is defined and not null. */ goog.isDefAndNotNull = function(val) { @@ -862,8 +915,8 @@ goog.isDefAndNotNull = function(val) { /** - * Returns true if the specified value is an array - * @param {*} val Variable to test. + * Returns true if the specified value is an array. + * @param {?} val Variable to test. * @return {boolean} Whether variable is an array. */ goog.isArray = function(val) { @@ -875,7 +928,7 @@ goog.isArray = function(val) { * Returns true if the object looks like an array. To qualify as array like * the value needs to be either a NodeList or an object with a Number length * property. - * @param {*} val Variable to test. + * @param {?} val Variable to test. * @return {boolean} Whether variable is an array. */ goog.isArrayLike = function(val) { @@ -885,9 +938,9 @@ goog.isArrayLike = function(val) { /** - * Returns true if the object looks like a Date. To qualify as Date-like - * the value needs to be an object and have a getFullYear() function. - * @param {*} val Variable to test. + * Returns true if the object looks like a Date. To qualify as Date-like the + * value needs to be an object and have a getFullYear() function. + * @param {?} val Variable to test. * @return {boolean} Whether variable is a like a Date. */ goog.isDateLike = function(val) { @@ -896,8 +949,8 @@ goog.isDateLike = function(val) { /** - * Returns true if the specified value is a string - * @param {*} val Variable to test. + * Returns true if the specified value is a string. + * @param {?} val Variable to test. * @return {boolean} Whether variable is a string. */ goog.isString = function(val) { @@ -906,8 +959,8 @@ goog.isString = function(val) { /** - * Returns true if the specified value is a boolean - * @param {*} val Variable to test. + * Returns true if the specified value is a boolean. + * @param {?} val Variable to test. * @return {boolean} Whether variable is boolean. */ goog.isBoolean = function(val) { @@ -916,8 +969,8 @@ goog.isBoolean = function(val) { /** - * Returns true if the specified value is a number - * @param {*} val Variable to test. + * Returns true if the specified value is a number. + * @param {?} val Variable to test. * @return {boolean} Whether variable is a number. */ goog.isNumber = function(val) { @@ -926,8 +979,8 @@ goog.isNumber = function(val) { /** - * Returns true if the specified value is a function - * @param {*} val Variable to test. + * Returns true if the specified value is a function. + * @param {?} val Variable to test. * @return {boolean} Whether variable is a function. */ goog.isFunction = function(val) { @@ -936,9 +989,9 @@ goog.isFunction = function(val) { /** - * Returns true if the specified value is an object. This includes arrays - * and functions. - * @param {*} val Variable to test. + * Returns true if the specified value is an object. This includes arrays and + * functions. + * @param {?} val Variable to test. * @return {boolean} Whether variable is an object. */ goog.isObject = function(val) { @@ -950,12 +1003,12 @@ goog.isObject = function(val) { /** - * Gets a unique ID for an object. This mutates the object so that further - * calls with the same object as a parameter returns the same value. The unique - * ID is guaranteed to be unique across the current session amongst objects that - * are passed into {@code getUid}. There is no guarantee that the ID is unique - * or consistent across sessions. It is unsafe to generate unique ID for - * function prototypes. + * Gets a unique ID for an object. This mutates the object so that further calls + * with the same object as a parameter returns the same value. The unique ID is + * guaranteed to be unique across the current session amongst objects that are + * passed into {@code getUid}. There is no guarantee that the ID is unique or + * consistent across sessions. It is unsafe to generate unique ID for function + * prototypes. * * @param {Object} obj The object to get the unique ID for. * @return {number} The unique ID for the object. @@ -971,6 +1024,19 @@ goog.getUid = function(obj) { }; +/** + * Whether the given object is alreay assigned a unique ID. + * + * This does not modify the object. + * + * @param {Object} obj The object to check. + * @return {boolean} Whether there an assigned unique id for the object. + */ +goog.hasUid = function(obj) { + return !!obj[goog.UID_PROPERTY_]; +}; + + /** * Removes the unique ID from an object. This is useful if the object was * previously mutated using {@code goog.getUid} in which case the mutation is @@ -980,8 +1046,8 @@ goog.getUid = function(obj) { goog.removeUid = function(obj) { // TODO(arv): Make the type stricter, do not accept null. - // DOM nodes in IE are not instance of Object and throws exception - // for delete. Instead we try to use removeAttribute + // In IE, DOM nodes are not instances of Object and throw an exception if we + // try to delete. Instead we try to use removeAttribute. if ('removeAttribute' in obj) { obj.removeAttribute(goog.UID_PROPERTY_); } @@ -995,7 +1061,7 @@ goog.removeUid = function(obj) { /** * Name for unique ID property. Initialized in a way to help avoid collisions - * with other closure javascript on the same page. + * with other closure JavaScript on the same page. * @type {string} * @private */ @@ -1063,15 +1129,15 @@ goog.cloneObject = function(obj) { /** * A native implementation of goog.bind. * @param {Function} fn A function to partially apply. - * @param {Object|undefined} selfObj Specifies the object which |this| should + * @param {Object|undefined} selfObj Specifies the object which this should * point to when the function is run. - * @param {...*} var_args Additional arguments that are partially - * applied to the function. + * @param {...*} var_args Additional arguments that are partially applied to the + * function. * @return {!Function} A partially-applied form of the function bind() was * invoked as a method of. * @private - * @suppress {deprecated} The compiler thinks that Function.prototype.bind - * is deprecated because some people have declared a pure-JS version. + * @suppress {deprecated} The compiler thinks that Function.prototype.bind is + * deprecated because some people have declared a pure-JS version. * Only the pure-JS version is truly deprecated. */ goog.bindNative_ = function(fn, selfObj, var_args) { @@ -1082,10 +1148,10 @@ goog.bindNative_ = function(fn, selfObj, var_args) { /** * A pure-JS implementation of goog.bind. * @param {Function} fn A function to partially apply. - * @param {Object|undefined} selfObj Specifies the object which |this| should + * @param {Object|undefined} selfObj Specifies the object which this should * point to when the function is run. - * @param {...*} var_args Additional arguments that are partially - * applied to the function. + * @param {...*} var_args Additional arguments that are partially applied to the + * function. * @return {!Function} A partially-applied form of the function bind() was * invoked as a method of. * @private @@ -1115,22 +1181,22 @@ goog.bindJs_ = function(fn, selfObj, var_args) { /** * Partially applies this function to a particular 'this object' and zero or * more arguments. The result is a new function with some arguments of the first - * function pre-filled and the value of |this| 'pre-specified'.

+ * function pre-filled and the value of this 'pre-specified'. * - * Remaining arguments specified at call-time are appended to the pre- - * specified ones.

+ * Remaining arguments specified at call-time are appended to the pre-specified + * ones. * - * Also see: {@link #partial}.

+ * Also see: {@link #partial}. * * Usage: *
var barMethBound = bind(myFunction, myObj, 'arg1', 'arg2');
  * barMethBound('arg3', 'arg4');
* * @param {?function(this:T, ...)} fn A function to partially apply. - * @param {T} selfObj Specifies the object which |this| should - * point to when the function is run. - * @param {...*} var_args Additional arguments that are partially - * applied to the function. + * @param {T} selfObj Specifies the object which this should point to when the + * function is run. + * @param {...*} var_args Additional arguments that are partially applied to the + * function. * @return {!Function} A partially-applied form of the function bind() was * invoked as a method of. * @template T @@ -1139,13 +1205,12 @@ goog.bindJs_ = function(fn, selfObj, var_args) { goog.bind = function(fn, selfObj, var_args) { // TODO(nicksantos): narrow the type signature. if (Function.prototype.bind && - // NOTE(nicksantos): Somebody pulled base.js into the default - // Chrome extension environment. This means that for Chrome extensions, - // they get the implementation of Function.prototype.bind that - // calls goog.bind instead of the native one. Even worse, we don't want - // to introduce a circular dependency between goog.bind and - // Function.prototype.bind, so we have to hack this to make sure it - // works correctly. + // NOTE(nicksantos): Somebody pulled base.js into the default Chrome + // extension environment. This means that for Chrome extensions, they get + // the implementation of Function.prototype.bind that calls goog.bind + // instead of the native one. Even worse, we don't want to introduce a + // circular dependency between goog.bind and Function.prototype.bind, so + // we have to hack this to make sure it works correctly. Function.prototype.bind.toString().indexOf('native code') != -1) { goog.bind = goog.bindNative_; } else { @@ -1164,17 +1229,17 @@ goog.bind = function(fn, selfObj, var_args) { * g(arg3, arg4); * * @param {Function} fn A function to partially apply. - * @param {...*} var_args Additional arguments that are partially - * applied to fn. + * @param {...*} var_args Additional arguments that are partially applied to fn. * @return {!Function} A partially-applied form of the function bind() was * invoked as a method of. */ goog.partial = function(fn, var_args) { var args = Array.prototype.slice.call(arguments, 1); return function() { - // Prepend the bound arguments to the current arguments. - var newArgs = Array.prototype.slice.call(arguments); - newArgs.unshift.apply(newArgs, args); + // Clone the array (with slice()) and append additional arguments + // to the existing arguments. + var newArgs = args.slice(); + newArgs.push.apply(newArgs, arguments); return fn.apply(this, newArgs); }; }; @@ -1212,7 +1277,7 @@ goog.now = (goog.TRUSTED_SITE && Date.now) || (function() { /** - * Evals javascript in the global scope. In IE this uses execScript, other + * Evals JavaScript in the global scope. In IE this uses execScript, other * browsers use goog.global.eval. If goog.global.eval does not evaluate in the * global scope (for example, in Safari), appends a script tag instead. * Throws an exception if neither execScript or eval is defined. @@ -1287,27 +1352,26 @@ goog.cssNameMappingStyle_; * * This function works in tandem with @see goog.setCssNameMapping. * - * Without any mapping set, the arguments are simple joined with a - * hyphen and passed through unaltered. + * Without any mapping set, the arguments are simple joined with a hyphen and + * passed through unaltered. * - * When there is a mapping, there are two possible styles in which - * these mappings are used. In the BY_PART style, each part (i.e. in - * between hyphens) of the passed in css name is rewritten according - * to the map. In the BY_WHOLE style, the full css name is looked up in - * the map directly. If a rewrite is not specified by the map, the - * compiler will output a warning. + * When there is a mapping, there are two possible styles in which these + * mappings are used. In the BY_PART style, each part (i.e. in between hyphens) + * of the passed in css name is rewritten according to the map. In the BY_WHOLE + * style, the full css name is looked up in the map directly. If a rewrite is + * not specified by the map, the compiler will output a warning. * - * When the mapping is passed to the compiler, it will replace calls - * to goog.getCssName with the strings from the mapping, e.g. + * When the mapping is passed to the compiler, it will replace calls to + * goog.getCssName with the strings from the mapping, e.g. * var x = goog.getCssName('foo'); * var y = goog.getCssName(this.baseClass, 'active'); * becomes: * var x= 'foo'; * var y = this.baseClass + '-active'; * - * If one argument is passed it will be processed, if two are passed - * only the modifier will be processed, as it is assumed the first - * argument was generated as a result of calling goog.getCssName. + * If one argument is passed it will be processed, if two are passed only the + * modifier will be processed, as it is assumed the first argument was generated + * as a result of calling goog.getCssName. * * @param {string} className The class name. * @param {string=} opt_modifier A modifier to be appended to the class name. @@ -1431,7 +1495,7 @@ goog.getMsg = function(str, opt_values) { * This is useful when introducing a new message that has not yet been * translated into all languages. * - * This function is a compiler primtive. Must be used in the form: + * This function is a compiler primitive. Must be used in the form: * var x = goog.getMsgWithFallback(MSG_A, MSG_B); * where MSG_A and MSG_B were initialized with goog.getMsg. * @@ -1446,17 +1510,14 @@ goog.getMsgWithFallback = function(a, b) { /** * Exposes an unobfuscated global namespace path for the given object. - * Note that fields of the exported object *will* be obfuscated, - * unless they are exported in turn via this function or - * goog.exportProperty + * Note that fields of the exported object *will* be obfuscated, unless they are + * exported in turn via this function or goog.exportProperty. * - *

Also handy for making public items that are defined in anonymous - * closures. + * Also handy for making public items that are defined in anonymous closures. * * ex. goog.exportSymbol('public.path.Foo', Foo); * - * ex. goog.exportSymbol('public.path.Foo.staticFunction', - * Foo.staticFunction); + * ex. goog.exportSymbol('public.path.Foo.staticFunction', Foo.staticFunction); * public.path.Foo.staticFunction(); * * ex. goog.exportSymbol('public.path.Foo.prototype.myMethod', @@ -1466,7 +1527,7 @@ goog.getMsgWithFallback = function(a, b) { * @param {string} publicPath Unobfuscated name to export. * @param {*} object Object the name should point to. * @param {Object=} opt_objectToExportTo The object to add the path to; default - * is |goog.global|. + * is goog.global. */ goog.exportSymbol = function(publicPath, object, opt_objectToExportTo) { goog.exportPath_(publicPath, object, opt_objectToExportTo); @@ -1500,16 +1561,16 @@ goog.exportProperty = function(object, publicName, symbol) { * goog.inherits(ChildClass, ParentClass); * * var child = new ChildClass('a', 'b', 'see'); - * child.foo(); // works + * child.foo(); // This works. * * - * In addition, a superclass' implementation of a method can be invoked - * as follows: + * In addition, a superclass' implementation of a method can be invoked as + * follows: * *

  * ChildClass.prototype.foo = function(a) {
  *   ChildClass.superClass_.foo.call(this, a);
- *   // other code
+ *   // Other code here.
  * };
  * 
* @@ -1524,6 +1585,28 @@ goog.inherits = function(childCtor, parentCtor) { childCtor.prototype = new tempCtor(); /** @override */ childCtor.prototype.constructor = childCtor; + + /** + * Calls superclass constructor/method. + * + * This function is only available if you use goog.inherits to + * express inheritance relationships between classes. + * + * NOTE: This is a replacement for goog.base and for superClass_ + * property defined in childCtor. + * + * @param {!Object} me Should always be "this". + * @param {string} methodName The method name to call. Calling + * superclass constructor can be done with the special string + * 'constructor'. + * @param {...*} var_args The arguments to pass to superclass + * method/constructor. + * @return {*} The return value of the superclass method/constructor. + */ + childCtor.base = function(me, methodName, var_args) { + var args = Array.prototype.slice.call(arguments, 2); + return parentCtor.prototype[methodName].apply(me, args); + }; }; @@ -1531,36 +1614,34 @@ goog.inherits = function(childCtor, parentCtor) { * Call up to the superclass. * * If this is called from a constructor, then this calls the superclass - * contructor with arguments 1-N. + * constructor with arguments 1-N. * - * If this is called from a prototype method, then you must pass - * the name of the method as the second argument to this function. If - * you do not, you will get a runtime error. This calls the superclass' - * method with arguments 2-N. + * If this is called from a prototype method, then you must pass the name of the + * method as the second argument to this function. If you do not, you will get a + * runtime error. This calls the superclass' method with arguments 2-N. * - * This function only works if you use goog.inherits to express - * inheritance relationships between your classes. + * This function only works if you use goog.inherits to express inheritance + * relationships between your classes. * - * This function is a compiler primitive. At compile-time, the - * compiler will do macro expansion to remove a lot of - * the extra overhead that this function introduces. The compiler - * will also enforce a lot of the assumptions that this function - * makes, and treat it as a compiler error if you break them. + * This function is a compiler primitive. At compile-time, the compiler will do + * macro expansion to remove a lot of the extra overhead that this function + * introduces. The compiler will also enforce a lot of the assumptions that this + * function makes, and treat it as a compiler error if you break them. * * @param {!Object} me Should always be "this". * @param {*=} opt_methodName The method name if calling a super method. * @param {...*} var_args The rest of the arguments. * @return {*} The return value of the superclass method. + * @suppress {es5Strict} This method can not be used in strict mode, but + * all Closure Library consumers must depend on this file. */ goog.base = function(me, opt_methodName, var_args) { var caller = arguments.callee.caller; - if (goog.DEBUG) { - if (!caller) { - throw Error('arguments.caller not defined. goog.base() expects not ' + - 'to be running in strict mode. See ' + - 'http://www.ecma-international.org/ecma-262/5.1/#sec-C'); - } + if (goog.STRICT_MODE_COMPATIBLE || (goog.DEBUG && !caller)) { + throw Error('arguments.caller not defined. goog.base() cannot be used ' + + 'with strict mode code. See ' + + 'http://www.ecma-international.org/ecma-262/5.1/#sec-C'); } if (caller.superClass_) { @@ -1580,8 +1661,8 @@ goog.base = function(me, opt_methodName, var_args) { } } - // If we did not find the caller in the prototype chain, - // then one of two things happened: + // If we did not find the caller in the prototype chain, then one of two + // things happened: // 1) The caller is an instance method. // 2) This method was not called by the right caller. if (me[opt_methodName] === caller) { @@ -1596,15 +1677,30 @@ goog.base = function(me, opt_methodName, var_args) { /** * Allow for aliasing within scope functions. This function exists for - * uncompiled code - in compiled code the calls will be inlined and the - * aliases applied. In uncompiled code the function is simply run since the - * aliases as written are valid JavaScript. + * uncompiled code - in compiled code the calls will be inlined and the aliases + * applied. In uncompiled code the function is simply run since the aliases as + * written are valid JavaScript. * @param {function()} fn Function to call. This function can contain aliases * to namespaces (e.g. "var dom = goog.dom") or classes - * (e.g. "var Timer = goog.Timer"). + * (e.g. "var Timer = goog.Timer"). */ goog.scope = function(fn) { fn.call(goog.global); }; +/* + * To support uncompiled, strict mode bundles that use eval to divide source + * like so: + * eval('someSource;//# sourceUrl sourcefile.js'); + * We need to export the globally defined symbols "goog" and "COMPILED". + * Exporting "goog" breaks the compiler optimizations, so we required that + * be defined externally. + * NOTE: We don't use goog.exportSymbol here because we don't want to trigger + * extern generation when that compiler option is enabled. + */ +if (!COMPILED) { + goog.global['COMPILED'] = COMPILED; +} + + diff --git a/third_party/closure/goog/bootstrap/nodejs.js b/third_party/closure/goog/bootstrap/nodejs.js new file mode 100644 index 0000000000000..076203791d8d4 --- /dev/null +++ b/third_party/closure/goog/bootstrap/nodejs.js @@ -0,0 +1,91 @@ +// Copyright 2013 The Closure Library Authors. +// +// 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 A nodejs script for dynamically requiring Closure within + * nodejs. + * + * Example of usage: + * + * require('./bootstrap/nodejs') + * goog.require('goog.ui.Component') + * + * + * This loads goog.ui.Component in the global scope. + * + * If you want to load custom libraries, you can require the custom deps file + * directly. If your custom libraries introduce new globals, you may + * need to run goog.nodeGlobalRequire to get them to load correctly. + * + * + * require('./path/to/my/deps.js') + * goog.bootstrap.nodeJs.nodeGlobalRequire('./path/to/my/base.js') + * goog.require('my.Class') + * + * + * @author nick@medium.com (Nick Santos) + * + * @nocompile + */ + + +var fs = require('fs'); +var path = require('path'); + + +/** + * The goog namespace in the global scope. + */ +global.goog = {}; + + +/** + * Imports a script using Node's require() API. + * + * @param {string} src The script source. + * @return {boolean} True if the script was imported, false otherwise. + */ +global.CLOSURE_IMPORT_SCRIPT = function(src) { + // Sources are always expressed relative to closure's base.js, but + // require() is always relative to the current source. + require('./../' + src); + return true; +}; + + +// Declared here so it can be used to require base.js +function nodeGlobalRequire(file) { + process.binding('evals').NodeScript.runInThisContext.call( + global, fs.readFileSync(file), file); +} + + +// Load Closure's base.js into memory. It is assumed base.js is in the +// directory above this directory given this script's location in +// bootstrap/nodejs.js. +nodeGlobalRequire(path.resolve(__dirname, '..', 'base.js')); + + +/** + * Bootstraps a file into the global scope. + * + * This is strictly for cases where normal require() won't work, + * because the file declares global symbols with 'var' that need to + * be added to the global scope. + * @suppress {missingProvide} + * + * @param {string} file The path to the file. + */ +goog.nodeGlobalRequire = nodeGlobalRequire; + diff --git a/third_party/closure/goog/color/alpha.js b/third_party/closure/goog/color/alpha.js index cfac60bfdee71..705379f83767f 100644 --- a/third_party/closure/goog/color/alpha.js +++ b/third_party/closure/goog/color/alpha.js @@ -25,8 +25,8 @@ goog.require('goog.color'); /** * Parses an alpha color out of a string. * @param {string} str Color in some format. - * @return {Object} Contains two properties: 'hex', which is a string containing - * a hex representation of the color, as well as 'type', which is a string + * @return {{hex: string, type: string}} 'hex' is a string containing + * a hex representation of the color, and 'type' is a string * containing the type of color format passed in ('hex', 'rgb', 'named'). */ goog.color.alpha.parse = function(str) { @@ -132,7 +132,8 @@ goog.color.alpha.normalizeAlphaHex_ = function(hexColor) { /** * Converts an 8-hex representation of a color to RGBA. * @param {string} hexColor Color to convert. - * @return {Array} array containing [r, g, b] as ints in [0, 255]. + * @return {!Array} array containing [r, g, b, a]. r, g, b are ints between 0 + * and 255, and a is a value between 0 and 1. */ goog.color.alpha.hexToRgba = function(hexColor) { // TODO(user): Enhance code sharing with goog.color, for example by @@ -271,7 +272,7 @@ goog.color.alpha.hslaToRgbaStyle = function(h, s, l, a) { * @param {number} s Amount of saturation, int between 0 and 100. * @param {number} l Amount of lightness, int between 0 and 100. * @param {number} a Amount of alpha, float between 0 and 1. - * @return {Array.} [r, g, b, a] values for the color, where r, g, b + * @return {!Array.} [r, g, b, a] values for the color, where r, g, b * are integers in [0, 255] and a is a float in [0, 1]. */ goog.color.alpha.hslaToRgba = function(h, s, l, a) { @@ -286,7 +287,7 @@ goog.color.alpha.hslaToRgba = function(h, s, l, a) { * @param {number} g Value of green, in [0, 255]. * @param {number} b Value of blue, in [0, 255]. * @param {number} a Value of alpha, in [0, 255]. - * @return {Array.} [h, s, l, a] values for the color, with h an int in + * @return {!Array.} [h, s, l, a] values for the color, with h an int in * [0, 360] and s, l and a in [0, 1]. */ goog.color.alpha.rgbaToHsla = function(r, g, b, a) { @@ -298,7 +299,7 @@ goog.color.alpha.rgbaToHsla = function(r, g, b, a) { * Converts a color from RGBA color space to HSLA color space. * @param {Array.} rgba [r, g, b, a] values for the color, each in * [0, 255]. - * @return {Array.} [h, s, l, a] values for the color, with h in + * @return {!Array.} [h, s, l, a] values for the color, with h in * [0, 360] and s, l and a in [0, 1]. */ goog.color.alpha.rgbaArrayToHsla = function(rgba) { @@ -373,7 +374,7 @@ goog.color.alpha.hslaColorRe_ = * '(r, g, b, a)', or 'rgba(r, g, b, a)', where r, g, b are ints in [0, 255] * and a is a float in [0, 1]. * @param {string} str String to check. - * @return {Array.} the integers [r, g, b, a] for valid colors or the + * @return {!Array.} the integers [r, g, b, a] for valid colors or the * empty array for invalid colors. * @private */ @@ -403,7 +404,7 @@ goog.color.alpha.isValidRgbaColor_ = function(str) { * 'hsla(h, s, l, a)', where s in an int in [0, 360], s and l are percentages * between 0 and 100 such as '50%' or '70%', and a is a float in [0, 1]. * @param {string} str String to check. - * @return {Array.} the integers [h, s, l, a] for valid colors or the + * @return {!Array.} the integers [h, s, l, a] for valid colors or the * empty array for invalid colors. * @private */ @@ -430,14 +431,17 @@ goog.color.alpha.isValidHslaColor_ = function(str) { /** * Takes an array of [r, g, b, a] and converts it into a string appropriate for - * CSS styles. + * CSS styles. The alpha channel value is rounded to 3 decimal places to make + * sure the produced string is not too long. * @param {Array.} rgba [r, g, b, a] with r, g, b in [0, 255] and a * in [0, 1]. * @return {string} string of the form 'rgba(r,g,b,a)'. * @private */ goog.color.alpha.rgbaStyle_ = function(rgba) { - return 'rgba(' + rgba.join(',') + ')'; + var roundedRgba = rgba.slice(0); + roundedRgba[3] = Math.round(rgba[3] * 1000) / 1000; + return 'rgba(' + roundedRgba.join(',') + ')'; }; diff --git a/third_party/closure/goog/color/color.js b/third_party/closure/goog/color/color.js index 61ca8d9510cc8..8e139a3572f86 100644 --- a/third_party/closure/goog/color/color.js +++ b/third_party/closure/goog/color/color.js @@ -17,6 +17,9 @@ */ goog.provide('goog.color'); +goog.provide('goog.color.Hsl'); +goog.provide('goog.color.Hsv'); +goog.provide('goog.color.Rgb'); goog.require('goog.color.names'); goog.require('goog.math'); @@ -54,9 +57,9 @@ goog.color.Hsl; /** * Parses a color out of a string. * @param {string} str Color in some format. - * @return {Object} Contains two properties: 'hex', which is a string containing - * a hex representation of the color, as well as 'type', which is a string - * containing the type of color format passed in ('hex', 'rgb', 'named'). + * @return {{hex: string, type: string}} 'hex' is a string containing a hex + * representation of the color, 'type' is a string containing the type + * of color format passed in ('hex', 'rgb', 'named'). */ goog.color.parse = function(str) { var result = {}; diff --git a/third_party/closure/goog/crypt/aes.js b/third_party/closure/goog/crypt/aes.js index 977906574723e..46a84025afa2f 100644 --- a/third_party/closure/goog/crypt/aes.js +++ b/third_party/closure/goog/crypt/aes.js @@ -42,6 +42,8 @@ goog.require('goog.crypt.BlockCipher'); * @param {!Array.} key The key as an array of integers in {0, 255}. * The key must have lengths of 16, 24, or 32 integers for 128-, * 192-, or 256-bit encryption, respectively. + * @final + * @struct */ goog.crypt.Aes = function(key) { goog.crypt.Aes.assertKeyArray_(key); diff --git a/third_party/closure/goog/crypt/arc4.js b/third_party/closure/goog/crypt/arc4.js index 30e82ca48a219..09e84bbddfb77 100644 --- a/third_party/closure/goog/crypt/arc4.js +++ b/third_party/closure/goog/crypt/arc4.js @@ -39,6 +39,8 @@ goog.require('goog.asserts'); /** * ARC4 streamcipher implementation. * @constructor + * @final + * @struct */ goog.crypt.Arc4 = function() { /** diff --git a/third_party/closure/goog/crypt/base64.js b/third_party/closure/goog/crypt/base64.js index b7a24581cf76e..30b9bddb84ad9 100644 --- a/third_party/closure/goog/crypt/base64.js +++ b/third_party/closure/goog/crypt/base64.js @@ -194,10 +194,17 @@ goog.crypt.base64.decodeString = function(input, opt_webSafe) { /** * Base64-decode a string. * - * @param {string} input to decode (length not required to be a multiple of 4). - * @param {boolean=} opt_webSafe True if we should use the - * alternative alphabet. - * @return {Array} bytes representing the decoded value. + * In base-64 decoding, groups of four characters are converted into three + * bytes. If the encoder did not apply padding, the input length may not + * be a multiple of 4. + * + * In this case, the last group will have fewer than 4 characters, and + * padding will be inferred. If the group has one or two characters, it decodes + * to one byte. If the group has three characters, it decodes to two bytes. + * + * @param {string} input Input to decode. + * @param {boolean=} opt_webSafe True if we should use the web-safe alphabet. + * @return {!Array} bytes representing the decoded value. */ goog.crypt.base64.decodeStringToByteArray = function(input, opt_webSafe) { goog.crypt.base64.init_(); @@ -216,11 +223,11 @@ goog.crypt.base64.decodeStringToByteArray = function(input, opt_webSafe) { ++i; var haveByte3 = i < input.length; - var byte3 = haveByte3 ? charToByteMap[input.charAt(i)] : 0; + var byte3 = haveByte3 ? charToByteMap[input.charAt(i)] : 64; ++i; var haveByte4 = i < input.length; - var byte4 = haveByte4 ? charToByteMap[input.charAt(i)] : 0; + var byte4 = haveByte4 ? charToByteMap[input.charAt(i)] : 64; ++i; if (byte1 == null || byte2 == null || diff --git a/third_party/closure/goog/crypt/basen.js b/third_party/closure/goog/crypt/basen.js index db60dcdc90663..cd8a10ee1d9fb 100644 --- a/third_party/closure/goog/crypt/basen.js +++ b/third_party/closure/goog/crypt/basen.js @@ -187,7 +187,7 @@ goog.crypt.baseN.recodeString = function(number, inputBase, outputBase) { * * @param {string} number The string to convert, most significant digit first. * @param {string} base Digits in the base. - * @return {Array.} Array of digit values, least significant digit + * @return {!Array.} Array of digit values, least significant digit * first. * @private */ diff --git a/third_party/closure/goog/crypt/blobhasher.js b/third_party/closure/goog/crypt/blobhasher.js index cb3c1a0f97744..3d04a4d9173bf 100644 --- a/third_party/closure/goog/crypt/blobhasher.js +++ b/third_party/closure/goog/crypt/blobhasher.js @@ -33,9 +33,9 @@ goog.provide('goog.crypt.BlobHasher.EventType'); goog.require('goog.asserts'); goog.require('goog.crypt'); goog.require('goog.crypt.Hash'); -goog.require('goog.debug.Logger'); goog.require('goog.events.EventTarget'); goog.require('goog.fs'); +goog.require('goog.log'); @@ -46,9 +46,10 @@ goog.require('goog.fs'); * @param {number=} opt_blockSize Processing block size. * @constructor * @extends {goog.events.EventTarget} + * @final */ goog.crypt.BlobHasher = function(hashFn, opt_blockSize) { - goog.base(this); + goog.crypt.BlobHasher.base(this, 'constructor'); /** * The actual hash function. @@ -101,10 +102,10 @@ goog.crypt.BlobHasher = function(hashFn, opt_blockSize) { /** * The logger used by this object. - * @type {!goog.debug.Logger} + * @type {goog.log.Logger} * @private */ - this.logger_ = goog.debug.Logger.getLogger('goog.crypt.BlobHasher'); + this.logger_ = goog.log.getLogger('goog.crypt.BlobHasher'); }; goog.inherits(goog.crypt.BlobHasher, goog.events.EventTarget); @@ -222,7 +223,7 @@ goog.crypt.BlobHasher.prototype.processNextBlock_ = function() { var chunk = goog.fs.sliceBlob(this.blob_, this.bytesProcessed_, this.bytesProcessed_ + size); if (!chunk || chunk.size != size) { - this.logger_.severe('Failed slicing the blob'); + goog.log.error(this.logger_, 'Failed slicing the blob'); this.onError_(); return; } @@ -232,7 +233,7 @@ goog.crypt.BlobHasher.prototype.processNextBlock_ = function() { } else if (this.fileReader_.readAsBinaryString) { this.fileReader_.readAsBinaryString(chunk); } else { - this.logger_.severe('Failed calling the chunk reader'); + goog.log.error(this.logger_, 'Failed calling the chunk reader'); this.onError_(); } } else { @@ -248,7 +249,7 @@ goog.crypt.BlobHasher.prototype.processNextBlock_ = function() { * @private */ goog.crypt.BlobHasher.prototype.onLoad_ = function() { - this.logger_.info('Successfully loaded a chunk'); + goog.log.info(this.logger_, 'Successfully loaded a chunk'); var array = null; if (this.fileReader_.result instanceof Array || @@ -259,7 +260,7 @@ goog.crypt.BlobHasher.prototype.onLoad_ = function() { array = new Uint8Array(this.fileReader_.result); } if (!array) { - this.logger_.severe('Failed reading the chunk'); + goog.log.error(this.logger_, 'Failed reading the chunk'); this.onError_(); return; } diff --git a/third_party/closure/goog/crypt/cbc.js b/third_party/closure/goog/crypt/cbc.js index 4c59c00d7102c..455f267551d29 100644 --- a/third_party/closure/goog/crypt/cbc.js +++ b/third_party/closure/goog/crypt/cbc.js @@ -23,6 +23,7 @@ goog.provide('goog.crypt.Cbc'); goog.require('goog.array'); +goog.require('goog.asserts'); goog.require('goog.crypt'); @@ -36,6 +37,8 @@ goog.require('goog.crypt'); * @param {number=} opt_blockSize The block size of the cipher in bytes. * Defaults to 16 bytes. * @constructor + * @final + * @struct */ goog.crypt.Cbc = function(cipher, opt_blockSize) { diff --git a/third_party/closure/goog/crypt/crypt.js b/third_party/closure/goog/crypt/crypt.js index 20b30694654d5..47943cadf7cd0 100644 --- a/third_party/closure/goog/crypt/crypt.js +++ b/third_party/closure/goog/crypt/crypt.js @@ -19,6 +19,7 @@ goog.provide('goog.crypt'); goog.require('goog.array'); +goog.require('goog.asserts'); /** @@ -45,18 +46,35 @@ goog.crypt.stringToByteArray = function(str) { /** * Turns an array of numbers into the string given by the concatenation of the * characters to which the numbers correspond. - * @param {Array} array Array of numbers representing characters. + * @param {Array} bytes Array of numbers representing characters. * @return {string} Stringification of the array. */ -goog.crypt.byteArrayToString = function(array) { - return String.fromCharCode.apply(null, array); +goog.crypt.byteArrayToString = function(bytes) { + var CHUNK_SIZE = 8192; + + // Special-case the simple case for speed's sake. + if (bytes.length < CHUNK_SIZE) { + return String.fromCharCode.apply(null, bytes); + } + + // The remaining logic splits conversion by chunks since + // Function#apply() has a maximum parameter count. + // See discussion: http://goo.gl/LrWmZ9 + + var str = ''; + for (var i = 0; i < bytes.length; i += CHUNK_SIZE) { + var chunk = goog.array.slice(bytes, i, i + CHUNK_SIZE); + str += String.fromCharCode.apply(null, chunk); + } + return str; }; /** * Turns an array of numbers into the hex string given by the concatenation of * the hex values to which the numbers correspond. - * @param {Array} array Array of numbers representing characters. + * @param {Uint8Array|Int8Array|Array.} array Array of numbers + * representing characters. * @return {string} Hex string. */ goog.crypt.byteArrayToHex = function(array) { @@ -87,7 +105,7 @@ goog.crypt.hexToByteArray = function(hexString) { /** * Converts a JS string to a UTF-8 "byte" array. * @param {string} str 16-bit unicode string. - * @return {Array.} UTF-8 byte array. + * @return {!Array.} UTF-8 byte array. */ goog.crypt.stringToUtf8ByteArray = function(str) { // TODO(user): Use native implementations if/when available @@ -112,7 +130,7 @@ goog.crypt.stringToUtf8ByteArray = function(str) { /** * Converts a UTF-8 byte array to JavaScript's 16-bit Unicode. - * @param {Array.} bytes UTF-8 byte array. + * @param {Uint8Array|Int8Array|Array.} bytes UTF-8 byte array. * @return {string} 16-bit Unicode string. */ goog.crypt.utf8ByteArrayToString = function(bytes) { @@ -138,8 +156,8 @@ goog.crypt.utf8ByteArrayToString = function(bytes) { /** * XOR two byte arrays. - * @param {!Array.} bytes1 Byte array 1. - * @param {!Array.} bytes2 Byte array 2. + * @param {!ArrayBufferView|!Array.} bytes1 Byte array 1. + * @param {!ArrayBufferView|!Array.} bytes2 Byte array 2. * @return {!Array.} Resulting XOR of the two byte arrays. */ goog.crypt.xorByteArray = function(bytes1, bytes2) { diff --git a/third_party/closure/goog/crypt/hash.js b/third_party/closure/goog/crypt/hash.js index 8ca6dafdac361..8a7d210b50798 100644 --- a/third_party/closure/goog/crypt/hash.js +++ b/third_party/closure/goog/crypt/hash.js @@ -27,8 +27,15 @@ goog.provide('goog.crypt.Hash'); * Create a cryptographic hash instance. * * @constructor + * @struct */ -goog.crypt.Hash = function() {}; +goog.crypt.Hash = function() { + /** + * The block size for the hasher. + * @type {number} + */ + this.blockSize = -1; +}; /** diff --git a/third_party/closure/goog/crypt/hmac.js b/third_party/closure/goog/crypt/hmac.js index 9d181dced4d78..2475c9ee9cfcb 100644 --- a/third_party/closure/goog/crypt/hmac.js +++ b/third_party/closure/goog/crypt/hmac.js @@ -24,7 +24,6 @@ goog.provide('goog.crypt.Hmac'); -goog.require('goog.asserts'); goog.require('goog.crypt.Hash'); @@ -36,11 +35,14 @@ goog.require('goog.crypt.Hash'); * Should be an array of not more than {@code blockSize} integers in {0, 255}. * @param {number=} opt_blockSize Optional. The block size {@code hasher} uses. - * If not specified, 16. + * If not specified, uses the block size from the hasher, or 16 if it is + * not specified. * @extends {goog.crypt.Hash} + * @final + * @struct */ goog.crypt.Hmac = function(hasher, key, opt_blockSize) { - goog.base(this); + goog.crypt.Hmac.base(this, 'constructor'); /** * The underlying hasher to calculate hash. @@ -50,13 +52,7 @@ goog.crypt.Hmac = function(hasher, key, opt_blockSize) { */ this.hasher_ = hasher; - /** - * The block size. - * - * @type {number} - * @private - */ - this.blockSize_ = opt_blockSize || 16; + this.blockSize = opt_blockSize || hasher.blockSize || 16; /** * The outer padding array of hmac @@ -64,7 +60,7 @@ goog.crypt.Hmac = function(hasher, key, opt_blockSize) { * @type {!Array.} * @private */ - this.keyO_ = new Array(this.blockSize_); + this.keyO_ = new Array(this.blockSize); /** * The inner padding array of hmac @@ -72,7 +68,7 @@ goog.crypt.Hmac = function(hasher, key, opt_blockSize) { * @type {!Array.} * @private */ - this.keyI_ = new Array(this.blockSize_); + this.keyI_ = new Array(this.blockSize); this.initialize_(key); }; @@ -106,13 +102,14 @@ goog.crypt.Hmac.IPAD_ = 0x36; * @private */ goog.crypt.Hmac.prototype.initialize_ = function(key) { - if (key.length > this.blockSize_) { + if (key.length > this.blockSize) { this.hasher_.update(key); key = this.hasher_.digest(); + this.hasher_.reset(); } // Precalculate padded and xor'd keys. var keyByte; - for (var i = 0; i < this.blockSize_; i++) { + for (var i = 0; i < this.blockSize; i++) { if (i < key.length) { keyByte = key[i]; } else { diff --git a/third_party/closure/goog/crypt/md5.js b/third_party/closure/goog/crypt/md5.js index 3b3bccd193d49..22c2eac1145bb 100644 --- a/third_party/closure/goog/crypt/md5.js +++ b/third_party/closure/goog/crypt/md5.js @@ -42,9 +42,13 @@ goog.require('goog.crypt.Hash'); * MD5 cryptographic hash constructor. * @constructor * @extends {goog.crypt.Hash} + * @final + * @struct */ goog.crypt.Md5 = function() { - goog.base(this); + goog.crypt.Md5.base(this, 'constructor'); + + this.blockSize = 512 / 8; /** * Holds the current values of accumulated A-D variables (MD buffer). @@ -58,7 +62,7 @@ goog.crypt.Md5 = function() { * @type {Array.} * @private */ - this.block_ = new Array(64); + this.block_ = new Array(this.blockSize); /** * The length of yet-unprocessed data as collected in the block. @@ -350,7 +354,7 @@ goog.crypt.Md5.prototype.update = function(bytes, opt_length) { if (!goog.isDef(opt_length)) { opt_length = bytes.length; } - var lengthMinusBlock = opt_length - 64; + var lengthMinusBlock = opt_length - this.blockSize; // Copy some object properties to local variables in order to save on access // time from inside the loop (~10% speedup was observed on Chrome 11). @@ -367,14 +371,14 @@ goog.crypt.Md5.prototype.update = function(bytes, opt_length) { if (blockLength == 0) { while (i <= lengthMinusBlock) { this.compress_(bytes, i); - i += 64; + i += this.blockSize; } } if (goog.isString(bytes)) { while (i < opt_length) { block[blockLength++] = bytes.charCodeAt(i++); - if (blockLength == 64) { + if (blockLength == this.blockSize) { this.compress_(block); blockLength = 0; // Jump to the outer loop so we use the full-block optimization. @@ -384,7 +388,7 @@ goog.crypt.Md5.prototype.update = function(bytes, opt_length) { } else { while (i < opt_length) { block[blockLength++] = bytes[i++]; - if (blockLength == 64) { + if (blockLength == this.blockSize) { this.compress_(block); blockLength = 0; // Jump to the outer loop so we use the full-block optimization. @@ -403,7 +407,9 @@ goog.crypt.Md5.prototype.update = function(bytes, opt_length) { goog.crypt.Md5.prototype.digest = function() { // This must accommodate at least 1 padding byte (0x80), 8 bytes of // total bitlength, and must end at a 64-byte boundary. - var pad = new Array((this.blockLength_ < 56 ? 64 : 128) - this.blockLength_); + var pad = new Array((this.blockLength_ < 56 ? + this.blockSize : + this.blockSize * 2) - this.blockLength_); // Add padding: 0x80 0x00* pad[0] = 0x80; diff --git a/third_party/closure/goog/crypt/sha1.js b/third_party/closure/goog/crypt/sha1.js index e65e2cb933d38..be726fc91029a 100644 --- a/third_party/closure/goog/crypt/sha1.js +++ b/third_party/closure/goog/crypt/sha1.js @@ -40,9 +40,13 @@ goog.require('goog.crypt.Hash'); * The properties declared here are discussed in the above algorithm document. * @constructor * @extends {goog.crypt.Hash} + * @final + * @struct */ goog.crypt.Sha1 = function() { - goog.base(this); + goog.crypt.Sha1.base(this, 'constructor'); + + this.blockSize = 512 / 8; /** * Holds the previous values of accumulated variables a-e in the compress_ @@ -75,10 +79,20 @@ goog.crypt.Sha1 = function() { this.pad_ = []; this.pad_[0] = 128; - for (var i = 1; i < 64; ++i) { + for (var i = 1; i < this.blockSize; ++i) { this.pad_[i] = 0; } + /** + * @private {number} + */ + this.inbuf_ = 0; + + /** + * @private {number} + */ + this.total_ = 0; + this.reset(); }; goog.inherits(goog.crypt.Sha1, goog.crypt.Hash); @@ -192,7 +206,7 @@ goog.crypt.Sha1.prototype.update = function(bytes, opt_length) { opt_length = bytes.length; } - var lengthMinusBlock = opt_length - 64; + var lengthMinusBlock = opt_length - this.blockSize; var n = 0; // Using local instead of member variables gives ~5% speedup on Firefox 16. var buf = this.buf_; @@ -207,7 +221,7 @@ goog.crypt.Sha1.prototype.update = function(bytes, opt_length) { if (inbuf == 0) { while (n <= lengthMinusBlock) { this.compress_(bytes, n); - n += 64; + n += this.blockSize; } } @@ -216,7 +230,7 @@ goog.crypt.Sha1.prototype.update = function(bytes, opt_length) { buf[inbuf] = bytes.charCodeAt(n); ++inbuf; ++n; - if (inbuf == 64) { + if (inbuf == this.blockSize) { this.compress_(buf); inbuf = 0; // Jump to the outer loop so we use the full-block optimization. @@ -228,7 +242,7 @@ goog.crypt.Sha1.prototype.update = function(bytes, opt_length) { buf[inbuf] = bytes[n]; ++inbuf; ++n; - if (inbuf == 64) { + if (inbuf == this.blockSize) { this.compress_(buf); inbuf = 0; // Jump to the outer loop so we use the full-block optimization. @@ -252,11 +266,11 @@ goog.crypt.Sha1.prototype.digest = function() { if (this.inbuf_ < 56) { this.update(this.pad_, 56 - this.inbuf_); } else { - this.update(this.pad_, 64 - (this.inbuf_ - 56)); + this.update(this.pad_, this.blockSize - (this.inbuf_ - 56)); } // Add # bits. - for (var i = 63; i >= 56; i--) { + for (var i = this.blockSize - 1; i >= 56; i--) { this.buf_[i] = totalBits & 255; totalBits /= 256; // Don't use bit-shifting here! } diff --git a/third_party/closure/goog/crypt/sha2.js b/third_party/closure/goog/crypt/sha2.js index 0bbd375ce7b09..b71fa89cb7e4b 100644 --- a/third_party/closure/goog/crypt/sha2.js +++ b/third_party/closure/goog/crypt/sha2.js @@ -21,9 +21,6 @@ * To implement specific SHA-2 such as SHA-256, create a sub-class with * overridded reset(). See sha256.js for an example. * - * TODO(user): SHA-512/384 are not currently implemented. Could be added - * if needed. - * * Some code similar to SHA1 are borrowed from sha1.js written by mschilder@. * */ @@ -42,9 +39,12 @@ goog.require('goog.crypt.Hash'); * one should use the constructor of the sub-classes. * @constructor * @extends {goog.crypt.Hash} + * @struct */ goog.crypt.Sha2 = function() { - goog.base(this); + goog.crypt.Sha2.base(this, 'constructor'); + + this.blockSize = 512 / 8; /** * A chunk holding the currently processed message bytes. Once the chunk has @@ -76,7 +76,7 @@ goog.crypt.Sha2 = function() { * @type {!Array.} * @private */ - this.pad_ = goog.array.repeat(0, 64); + this.pad_ = goog.array.repeat(0, this.blockSize); this.pad_[0] = 128; /** @@ -98,6 +98,16 @@ goog.crypt.Sha2 = function() { */ this.numHashBlocks = 0; + /** + * Temporary array used in chunk computation. Allocate here as a + * member rather than as a local within computeChunk_() as a + * performance optimization to reduce the number of allocations and + * reduce garbage collection. + * @type {!Uint32Array|!Array.} + * @private + */ + this.w_ = goog.global['Uint32Array'] ? new Uint32Array(64) : []; + this.reset(); }; goog.inherits(goog.crypt.Sha2, goog.crypt.Hash); @@ -113,10 +123,11 @@ goog.crypt.Sha2.prototype.reset = goog.abstractMethod; * @private */ goog.crypt.Sha2.prototype.computeChunk_ = function(chunk) { - goog.asserts.assert(chunk.length == 64); + goog.asserts.assert(chunk.length == this.blockSize); + var rounds = 64; // Divide the chunk into 16 32-bit-words. - var w = []; + var w = this.w_; var index = 0; var offset = 0; while (offset < chunk.length) { @@ -127,56 +138,70 @@ goog.crypt.Sha2.prototype.computeChunk_ = function(chunk) { offset = index * 4; } - // Expand to 64 32-bit-words - for (var i = 16; i < 64; i++) { - var s0 = ((w[i - 15] >>> 7) | (w[i - 15] << 25)) ^ - ((w[i - 15] >>> 18) | (w[i - 15] << 14)) ^ - (w[i - 15] >>> 3); - var s1 = ((w[i - 2] >>> 17) | (w[i - 2] << 15)) ^ - ((w[i - 2] >>> 19) | (w[i - 2] << 13)) ^ - (w[i - 2] >>> 10); - w[i] = (w[i - 16] + s0 + w[i - 7] + s1) & 0xffffffff; + // Extend the w[] array to be the number of rounds. + for (var i = 16; i < rounds; i++) { + var w_15 = w[i - 15] | 0; + var s0 = ((w_15 >>> 7) | (w_15 << 25)) ^ + ((w_15 >>> 18) | (w_15 << 14)) ^ + (w_15 >>> 3); + var w_2 = w[i - 2] | 0; + var s1 = ((w_2 >>> 17) | (w_2 << 15)) ^ + ((w_2 >>> 19) | (w_2 << 13)) ^ + (w_2 >>> 10); + + // As a performance optimization, construct the sum a pair at a time + // with casting to integer (bitwise OR) to eliminate unnecessary + // double<->integer conversions. + var partialSum1 = ((w[i - 16] | 0) + s0) | 0; + var partialSum2 = ((w[i - 7] | 0) + s1) | 0; + w[i] = (partialSum1 + partialSum2) | 0; } - var a = this.hash[0]; - var b = this.hash[1]; - var c = this.hash[2]; - var d = this.hash[3]; - var e = this.hash[4]; - var f = this.hash[5]; - var g = this.hash[6]; - var h = this.hash[7]; - - for (var i = 0; i < 64; i++) { + var a = this.hash[0] | 0; + var b = this.hash[1] | 0; + var c = this.hash[2] | 0; + var d = this.hash[3] | 0; + var e = this.hash[4] | 0; + var f = this.hash[5] | 0; + var g = this.hash[6] | 0; + var h = this.hash[7] | 0; + for (var i = 0; i < rounds; i++) { var S0 = ((a >>> 2) | (a << 30)) ^ ((a >>> 13) | (a << 19)) ^ ((a >>> 22) | (a << 10)); var maj = ((a & b) ^ (a & c) ^ (b & c)); - var t2 = (S0 + maj) & 0xffffffff; + var t2 = (S0 + maj) | 0; var S1 = ((e >>> 6) | (e << 26)) ^ ((e >>> 11) | (e << 21)) ^ ((e >>> 25) | (e << 7)); var ch = ((e & f) ^ ((~ e) & g)); - var t1 = (h + S1 + ch + this.K_[i] + w[i]) & 0xffffffff; + + // As a performance optimization, construct the sum a pair at a time + // with casting to integer (bitwise OR) to eliminate unnecessary + // double<->integer conversions. + var partialSum1 = (h + S1) | 0; + var partialSum2 = (ch + (goog.crypt.Sha2.K_[i] | 0)) | 0; + var partialSum3 = (partialSum2 + (w[i] | 0)) | 0; + var t1 = (partialSum1 + partialSum3) | 0; h = g; g = f; f = e; - e = (d + t1) & 0xffffffff; + e = (d + t1) | 0; d = c; c = b; b = a; - a = (t1 + t2) & 0xffffffff; + a = (t1 + t2) | 0; } - this.hash[0] = (this.hash[0] + a) & 0xffffffff; - this.hash[1] = (this.hash[1] + b) & 0xffffffff; - this.hash[2] = (this.hash[2] + c) & 0xffffffff; - this.hash[3] = (this.hash[3] + d) & 0xffffffff; - this.hash[4] = (this.hash[4] + e) & 0xffffffff; - this.hash[5] = (this.hash[5] + f) & 0xffffffff; - this.hash[6] = (this.hash[6] + g) & 0xffffffff; - this.hash[7] = (this.hash[7] + h) & 0xffffffff; + this.hash[0] = (this.hash[0] + a) | 0; + this.hash[1] = (this.hash[1] + b) | 0; + this.hash[2] = (this.hash[2] + c) | 0; + this.hash[3] = (this.hash[3] + d) | 0; + this.hash[4] = (this.hash[4] + e) | 0; + this.hash[5] = (this.hash[5] + f) | 0; + this.hash[6] = (this.hash[6] + g) | 0; + this.hash[7] = (this.hash[7] + h) | 0; }; @@ -198,19 +223,25 @@ goog.crypt.Sha2.prototype.update = function(message, opt_length) { if (goog.isString(message)) { while (n < opt_length) { this.chunk[inChunk++] = message.charCodeAt(n++); - if (inChunk == 64) { + if (inChunk == this.blockSize) { this.computeChunk_(this.chunk); inChunk = 0; } } - } else { + } else if (goog.isArray(message)) { while (n < opt_length) { - this.chunk[inChunk++] = message[n++]; - if (inChunk == 64) { + var b = message[n++]; + if (!('number' == typeof b && 0 <= b && 255 >= b && b == (b | 0))) { + throw Error('message must be a byte array'); + } + this.chunk[inChunk++] = b; + if (inChunk == this.blockSize) { this.computeChunk_(this.chunk); inChunk = 0; } } + } else { + throw Error('message must be string or array'); } // Record the current bytes in chunk to support partial update. @@ -230,7 +261,7 @@ goog.crypt.Sha2.prototype.digest = function() { if (this.inChunk < 56) { this.update(this.pad_, 56 - this.inChunk); } else { - this.update(this.pad_, 64 - (this.inChunk - 56)); + this.update(this.pad_, this.blockSize - (this.inChunk - 56)); } // Append # bits in the 64-bit big-endian format. @@ -254,22 +285,23 @@ goog.crypt.Sha2.prototype.digest = function() { /** * Constants used in SHA-2. * @const - * @private + * @private {!Array.} */ -goog.crypt.Sha2.prototype.K_ = [ - 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, - 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, - 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, - 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, - 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, - 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, - 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, - 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, - 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, - 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, - 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, - 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, - 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, - 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, - 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, - 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2]; +goog.crypt.Sha2.K_ = [ + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, + 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, + 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, + 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, + 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, + 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, + 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, + 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, + 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 +]; diff --git a/third_party/closure/goog/crypt/sha224.js b/third_party/closure/goog/crypt/sha224.js index 6bc2766cfd0c3..a4ae2f44ef172 100644 --- a/third_party/closure/goog/crypt/sha224.js +++ b/third_party/closure/goog/crypt/sha224.js @@ -33,9 +33,11 @@ goog.require('goog.crypt.Sha2'); * * @constructor * @extends {goog.crypt.Sha2} + * @final + * @struct */ goog.crypt.Sha224 = function() { - goog.base(this); + goog.crypt.Sha224.base(this, 'constructor'); }; goog.inherits(goog.crypt.Sha224, goog.crypt.Sha2); diff --git a/third_party/closure/goog/crypt/sha256.js b/third_party/closure/goog/crypt/sha256.js index 7e7d6fdf6ae86..ceb93d64f2fde 100644 --- a/third_party/closure/goog/crypt/sha256.js +++ b/third_party/closure/goog/crypt/sha256.js @@ -33,9 +33,11 @@ goog.require('goog.crypt.Sha2'); * * @constructor * @extends {goog.crypt.Sha2} + * @final + * @struct */ goog.crypt.Sha256 = function() { - goog.base(this); + goog.crypt.Sha256.base(this, 'constructor'); }; goog.inherits(goog.crypt.Sha256, goog.crypt.Sha2); diff --git a/third_party/closure/goog/crypt/sha2_64bit.js b/third_party/closure/goog/crypt/sha2_64bit.js new file mode 100644 index 0000000000000..0a7848d7bd77b --- /dev/null +++ b/third_party/closure/goog/crypt/sha2_64bit.js @@ -0,0 +1,500 @@ +// Copyright 2014 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 Base class for the 64-bit SHA-2 cryptographic hashes. + * + * Variable names follow the notation in FIPS PUB 180-3: + * http://csrc.nist.gov/publications/fips/fips180-3/fips180-3_final.pdf. + * + * This code borrows heavily from the 32-bit SHA2 implementation written by + * Yue Zhang (zysxqn@) + * + */ + +goog.provide('goog.crypt.Sha2_64bit'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.crypt.Hash'); +goog.require('goog.math.Long'); + + + +/** + * Constructs a SHA-2 64-bit cryptographic hash. + * This constructor should not be used directly to create the object. Rather, + * one should use the constructor of one of its subclasses. + * @constructor + * @param {number} numHashBlocks The size of the output in 16-byte blocks + * @param {!Array.} initHashBlocks The hash-specific initialization + * vector, as a sequence of 32-bit numbers. + * @extends {goog.crypt.Hash} + * @struct + */ +goog.crypt.Sha2_64bit = function(numHashBlocks, initHashBlocks) { + goog.crypt.Sha2_64bit.base(this, 'constructor'); + + /** + * The number of bytes that are digested in each pass of this hasher. + * @type {number} + */ + this.blockSize = 1024 / 8; + + /** + * A chunk holding the currently processed message bytes. Once the chunk has + * {@code this.blocksize} bytes, we feed it into [@code computeChunk_} + * and reset {@code this.chunk_}. + * @private {!Array.} + */ + this.chunk_ = []; + + /** + * Current number of bytes in {@code this.chunk_}. + * @private {number} + */ + this.inChunk_ = 0; + + /** + * Total number of bytes in currently processed message. + * @private {number} + */ + this.total_ = 0; + + /** + * Contains data needed to pad messages less than {@code blocksize} bytes. + * @private {!Array.} + */ + this.pad_ = goog.array.repeat(0, this.blockSize); + this.pad_[0] = 128; + + /** + * Holds the previous values of accumulated hash a-h in the + * {@code computeChunk_} function. + * @private {!Array.} + */ + this.hash_ = []; + + /** + * The number of blocks of output produced by this hash function, where each + * block is eight bytes long. + * @private {number} + */ + this.numHashBlocks_ = numHashBlocks; + + /** + * Temporary array used in chunk computation. Allocate here as a + * member rather than as a local within computeChunk_() as a + * performance optimization to reduce the number of allocations and + * reduce garbage collection. + * @type {!Array.} + * @private + */ + this.w_ = []; + + /** + * The value to which {@code this.hash_} should be reset when this + * Hasher is reset. + * @private {!Array.} + * @const + */ + this.initHashBlocks_ = []; + for (var i = 0; i < initHashBlocks.length; i += 2) { + this.initHashBlocks_.push(new goog.math.Long( + // NIST constants are in big-endian order. Long is little-endian + initHashBlocks[i + 1], initHashBlocks[i])); + } + + this.reset(); +}; +goog.inherits(goog.crypt.Sha2_64bit, goog.crypt.Hash); + + +/** + * Resets this hash function. + */ +goog.crypt.Sha2_64bit.prototype.reset = function() { + this.chunk_ = []; + this.inChunk_ = 0; + this.total_ = 0; + this.hash_ = goog.array.clone(this.initHashBlocks_); +}; + + +/** + * Updates this hash by processing a given 1024-bit message chunk. + * @param {!Array.} chunk A 1024-bit message chunk to be processed. + * @private + */ +goog.crypt.Sha2_64bit.prototype.computeChunk_ = function(chunk) { + goog.asserts.assert(chunk.length == this.blockSize); + var rounds = 80; + var k = goog.crypt.Sha2_64bit.K_; + + // Divide the chunk into 16 64-bit-words. + var w = this.w_; + var index = 0; + var offset = 0; + while (offset < chunk.length) { + w[index++] = new goog.math.Long( + (chunk[offset + 4] << 24) | (chunk[offset + 5] << 16) | + (chunk[offset + 6] << 8) | (chunk[offset + 7]), + (chunk[offset] << 24) | (chunk[offset + 1] << 16) | + (chunk[offset + 2] << 8) | (chunk[offset + 3])); + offset = index * 8; + } + + // Extend the w[] array to be the number of rounds. + for (var i = 16; i < rounds; i++) { + var s0 = this.sigma0_(w[i - 15]); + var s1 = this.sigma1_(w[i - 2]); + w[i] = this.sum_(w[i - 16], w[i - 7], s0, s1); + } + + var a = this.hash_[0]; + var b = this.hash_[1]; + var c = this.hash_[2]; + var d = this.hash_[3]; + var e = this.hash_[4]; + var f = this.hash_[5]; + var g = this.hash_[6]; + var h = this.hash_[7]; + for (var i = 0; i < rounds; i++) { + var S0 = this.Sigma0_(a); + var maj = this.majority_(a, b, c); + var t2 = S0.add(maj); + var S1 = this.Sigma1_(e); + var ch = this.choose_(e, f, g); + var t1 = this.sum_(h, S1, ch, k[i], w[i]); + h = g; + g = f; + f = e; + e = d.add(t1); + d = c; + c = b; + b = a; + a = t1.add(t2); + } + + this.hash_[0] = this.hash_[0].add(a); + this.hash_[1] = this.hash_[1].add(b); + this.hash_[2] = this.hash_[2].add(c); + this.hash_[3] = this.hash_[3].add(d); + this.hash_[4] = this.hash_[4].add(e); + this.hash_[5] = this.hash_[5].add(f); + this.hash_[6] = this.hash_[6].add(g); + this.hash_[7] = this.hash_[7].add(h); +}; + + +/** @override */ +goog.crypt.Sha2_64bit.prototype.update = function(message, opt_length) { + if (!goog.isDef(opt_length)) { + opt_length = message.length; + } + // Process the message from left to right up to |opt_length| bytes. + // When we get a 512-bit chunk, compute the hash of it and reset + // this.chunk_. The message might not be multiple of 512 bits so we + // might end up with a chunk that is less than 512 bits. We store + // such partial chunk in chunk_ and it will be filled up later + // in digest(). + var n = 0; + var inChunk = this.inChunk_; + + // The input message could be either byte array of string. + if (goog.isString(message)) { + while (n < opt_length) { + this.chunk_[inChunk++] = message.charCodeAt(n++); + if (inChunk == this.blockSize) { + this.computeChunk_(this.chunk_); + inChunk = 0; + } + } + } else if (goog.isArray(message)) { + while (n < opt_length) { + var b = message[n++]; + if (!('number' == typeof b && 0 <= b && 255 >= b && b == (b | 0))) { + throw Error('message must be a byte array'); + } + this.chunk_[inChunk++] = b; + if (inChunk == this.blockSize) { + this.computeChunk_(this.chunk_); + inChunk = 0; + } + } + } else { + throw Error('message must be string or array'); + } + + // Record the current bytes in chunk to support partial update. + this.inChunk_ = inChunk; + + // Record total message bytes we have processed so far. + this.total_ += opt_length; +}; + + +/** @override */ +goog.crypt.Sha2_64bit.prototype.digest = function() { + var digest = []; + var totalBits = this.total_ * 8; + + // Append pad 0x80 0x00*. + if (this.inChunk_ < 112) { + this.update(this.pad_, 112 - this.inChunk_); + } else { + this.update(this.pad_, this.blockSize - (this.inChunk_ - 112)); + } + + // Append # bits in the 64-bit big-endian format. + for (var i = 127; i >= 112; i--) { + this.chunk_[i] = totalBits & 255; + totalBits /= 256; // Don't use bit-shifting here! + } + this.computeChunk_(this.chunk_); + + // Finally, output the result digest. + var n = 0; + for (var i = 0; i < this.numHashBlocks_; i++) { + var block = this.hash_[i]; + var high = block.getHighBits(); + var low = block.getLowBits(); + for (var j = 24; j >= 0; j -= 8) { + digest[n++] = ((high >> j) & 255); + } + for (var j = 24; j >= 0; j -= 8) { + digest[n++] = ((low >> j) & 255); + } + } + return digest; +}; + + + +// I do not know why the authors of SHA2 chose to name their functions +// Σ and σ, i.e. the Greek letter sigma in uppercase and lowercase. +// The methods here are named sigma0, sigma1, Sigma0, and Sigma1 to be +// consistent with the NIST specification. Uggh. + + +/** + * Calculates the SHA2 64-bit sigma0 function. + * rotateRight(value, 1) ^ rotateRight(value, 8) ^ (value >>> 7) + * @private + * + * @param {!goog.math.Long} value + * @return {!goog.math.Long} + */ +goog.crypt.Sha2_64bit.prototype.sigma0_ = function(value) { + var valueLow = value.getLowBits(); + var valueHigh = value.getHighBits(); + var low = (valueLow >>> 1) ^ (valueHigh << 31) ^ + (valueLow >>> 8) ^ (valueHigh << 24) ^ + (valueLow >>> 7) ^ (valueHigh << 25); + var high = (valueHigh >>> 1) ^ (valueLow << 31) ^ + (valueHigh >>> 8) ^ (valueLow << 24) ^ + (valueHigh >>> 7); + return new goog.math.Long(low, high); +}; + + +/** + * Calculates the SHA2 64-bit sigma1 function. + * rotateRight(value, 19) ^ rotateRight(value, 61) ^ (value >>> 6) + * @private + * + * @param {!goog.math.Long} value + * @return {!goog.math.Long} + */ +goog.crypt.Sha2_64bit.prototype.sigma1_ = function(value) { + var valueLow = value.getLowBits(); + var valueHigh = value.getHighBits(); + var low = (valueLow >>> 19) ^ (valueHigh << 13) ^ + (valueHigh >>> 29) ^ (valueLow << 3) ^ + (valueLow >>> 6) ^ (valueHigh << 26); + var high = (valueHigh >>> 19) ^ (valueLow << 13) ^ + (valueLow >>> 29) ^ (valueHigh << 3) ^ + (valueHigh >>> 6); + return new goog.math.Long(low, high); +}; + + +/** + * Calculates the SHA2 64-bit Sigma0 function. + * rotateRight(value, 28) ^ rotateRight(value, 34) ^ rotateRight(value, 39) + * @private + * + * @param {!goog.math.Long} value + * @return {!goog.math.Long} + */ +goog.crypt.Sha2_64bit.prototype.Sigma0_ = function(value) { + var valueLow = value.getLowBits(); + var valueHigh = value.getHighBits(); + var low = (valueLow >>> 28) ^ (valueHigh << 4) ^ + (valueHigh >>> 2) ^ (valueLow << 30) ^ + (valueHigh >>> 7) ^ (valueLow << 25); + var high = (valueHigh >>> 28) ^ (valueLow << 4) ^ + (valueLow >>> 2) ^ (valueHigh << 30) ^ + (valueLow >>> 7) ^ (valueHigh << 25); + return new goog.math.Long(low, high); +}; + + +/** + * Calculates the SHA2 64-bit Sigma1 function. + * rotateRight(value, 14) ^ rotateRight(value, 18) ^ rotateRight(value, 41) + * @private + * + * @param {!goog.math.Long} value + * @return {!goog.math.Long} + */ +goog.crypt.Sha2_64bit.prototype.Sigma1_ = function(value) { + var valueLow = value.getLowBits(); + var valueHigh = value.getHighBits(); + var low = (valueLow >>> 14) ^ (valueHigh << 18) ^ + (valueLow >>> 18) ^ (valueHigh << 14) ^ + (valueHigh >>> 9) ^ (valueLow << 23); + var high = (valueHigh >>> 14) ^ (valueLow << 18) ^ + (valueHigh >>> 18) ^ (valueLow << 14) ^ + (valueLow >>> 9) ^ (valueHigh << 23); + return new goog.math.Long(low, high); +}; + + +/** + * Calculates the SHA-2 64-bit choose function. + * This function uses the first argument ("value") as a mask to choose bits + * from either the second ("one") arugment if the bit is set or the third + * argument ("two") if the bit is not set. + * @private + * + * @param {!goog.math.Long} value + * @param {!goog.math.Long} one + * @param {!goog.math.Long} two + * @return {!goog.math.Long} + */ +goog.crypt.Sha2_64bit.prototype.choose_ = function(value, one, two) { + var valueLow = value.getLowBits(); + var valueHigh = value.getHighBits(); + return new goog.math.Long( + (valueLow & one.getLowBits()) | (~valueLow & two.getLowBits()), + (valueHigh & one.getHighBits()) | (~valueHigh & two.getHighBits())); +}; + + +/** + * Calculates the SHA-2 64-bit majority function. + * This function returns, for each bit position, the bit held by the majority + * of its three arguments. + * @private + * + * @param {!goog.math.Long} one a voter + * @param {!goog.math.Long} two another voter + * @param {!goog.math.Long} three another voter + * @return {!goog.math.Long} + */ +goog.crypt.Sha2_64bit.prototype.majority_ = function(one, two, three) { + return new goog.math.Long( + (one.getLowBits() & two.getLowBits()) | + (two.getLowBits() & three.getLowBits()) | + (one.getLowBits() & three.getLowBits()), + (one.getHighBits() & two.getHighBits()) | + (two.getHighBits() & three.getHighBits()) | + (one.getHighBits() & three.getHighBits())); +}; + + +/** + * Adds two or more goog.math.Long values. + * @private + * + * @param {!goog.math.Long} one first summand + * @param {!goog.math.Long} two second summand + * @param {...goog.math.Long} var_args more arguments to sum + * @return {!goog.math.Long} The resulting sum. + */ +goog.crypt.Sha2_64bit.prototype.sum_ = function(one, two, var_args) { + // The low bits may be signed, but they represent a 32-bit unsigned quantity. + // We must be careful to normalize them. + // This doesn't matter for the high bits. + var low = (one.getLowBits() ^ 0x80000000) + (two.getLowBits() ^ 0x80000000); + var high = one.getHighBits() + two.getHighBits(); + for (var i = arguments.length - 1; i >= 2; --i) { + low += (arguments[i].getLowBits() ^ 0x80000000); + high += arguments[i].getHighBits(); + } + // Because of the ^0x80000000, each value we added is 0x80000000 too small + // Add arguments.length * 0x80000000 to the current sum + if (arguments.length & 1) { + low += 0x80000000; + } + high += (arguments.length >> 1); + high += Math.floor(low / 0x100000000); + return new goog.math.Long(low, high); +}; + + +/** + * Constants used in SHA-512 variants + * @const + * @private {!Array.} + */ +goog.crypt.Sha2_64bit.K_ = (function() { + var int64 = function(a, b) { + // NIST constants are big-endian. Need to reverse endianness. + return new goog.math.Long(b, a); + }; + return [ + int64(0x428a2f98, 0xd728ae22), int64(0x71374491, 0x23ef65cd), + int64(0xb5c0fbcf, 0xec4d3b2f), int64(0xe9b5dba5, 0x8189dbbc), + int64(0x3956c25b, 0xf348b538), int64(0x59f111f1, 0xb605d019), + int64(0x923f82a4, 0xaf194f9b), int64(0xab1c5ed5, 0xda6d8118), + int64(0xd807aa98, 0xa3030242), int64(0x12835b01, 0x45706fbe), + int64(0x243185be, 0x4ee4b28c), int64(0x550c7dc3, 0xd5ffb4e2), + int64(0x72be5d74, 0xf27b896f), int64(0x80deb1fe, 0x3b1696b1), + int64(0x9bdc06a7, 0x25c71235), int64(0xc19bf174, 0xcf692694), + int64(0xe49b69c1, 0x9ef14ad2), int64(0xefbe4786, 0x384f25e3), + int64(0x0fc19dc6, 0x8b8cd5b5), int64(0x240ca1cc, 0x77ac9c65), + int64(0x2de92c6f, 0x592b0275), int64(0x4a7484aa, 0x6ea6e483), + int64(0x5cb0a9dc, 0xbd41fbd4), int64(0x76f988da, 0x831153b5), + int64(0x983e5152, 0xee66dfab), int64(0xa831c66d, 0x2db43210), + int64(0xb00327c8, 0x98fb213f), int64(0xbf597fc7, 0xbeef0ee4), + int64(0xc6e00bf3, 0x3da88fc2), int64(0xd5a79147, 0x930aa725), + int64(0x06ca6351, 0xe003826f), int64(0x14292967, 0x0a0e6e70), + int64(0x27b70a85, 0x46d22ffc), int64(0x2e1b2138, 0x5c26c926), + int64(0x4d2c6dfc, 0x5ac42aed), int64(0x53380d13, 0x9d95b3df), + int64(0x650a7354, 0x8baf63de), int64(0x766a0abb, 0x3c77b2a8), + int64(0x81c2c92e, 0x47edaee6), int64(0x92722c85, 0x1482353b), + int64(0xa2bfe8a1, 0x4cf10364), int64(0xa81a664b, 0xbc423001), + int64(0xc24b8b70, 0xd0f89791), int64(0xc76c51a3, 0x0654be30), + int64(0xd192e819, 0xd6ef5218), int64(0xd6990624, 0x5565a910), + int64(0xf40e3585, 0x5771202a), int64(0x106aa070, 0x32bbd1b8), + int64(0x19a4c116, 0xb8d2d0c8), int64(0x1e376c08, 0x5141ab53), + int64(0x2748774c, 0xdf8eeb99), int64(0x34b0bcb5, 0xe19b48a8), + int64(0x391c0cb3, 0xc5c95a63), int64(0x4ed8aa4a, 0xe3418acb), + int64(0x5b9cca4f, 0x7763e373), int64(0x682e6ff3, 0xd6b2b8a3), + int64(0x748f82ee, 0x5defb2fc), int64(0x78a5636f, 0x43172f60), + int64(0x84c87814, 0xa1f0ab72), int64(0x8cc70208, 0x1a6439ec), + int64(0x90befffa, 0x23631e28), int64(0xa4506ceb, 0xde82bde9), + int64(0xbef9a3f7, 0xb2c67915), int64(0xc67178f2, 0xe372532b), + int64(0xca273ece, 0xea26619c), int64(0xd186b8c7, 0x21c0c207), + int64(0xeada7dd6, 0xcde0eb1e), int64(0xf57d4f7f, 0xee6ed178), + int64(0x06f067aa, 0x72176fba), int64(0x0a637dc5, 0xa2c898a6), + int64(0x113f9804, 0xbef90dae), int64(0x1b710b35, 0x131c471b), + int64(0x28db77f5, 0x23047d84), int64(0x32caab7b, 0x40c72493), + int64(0x3c9ebe0a, 0x15c9bebc), int64(0x431d67c4, 0x9c100d4c), + int64(0x4cc5d4be, 0xcb3e42b6), int64(0x597f299c, 0xfc657e2a), + int64(0x5fcb6fab, 0x3ad6faec), int64(0x6c44198c, 0x4a475817) + ]; +})(); diff --git a/third_party/closure/goog/crypt/sha384.js b/third_party/closure/goog/crypt/sha384.js new file mode 100644 index 0000000000000..65bbdbc8a66ec --- /dev/null +++ b/third_party/closure/goog/crypt/sha384.js @@ -0,0 +1,53 @@ +// Copyright 2014 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 SHA-384 cryptographic hash. + * + * Usage: + * var sha384 = new goog.crypt.Sha384(); + * sha384.update(bytes); + * var hash = sha384.digest(); + * + */ + +goog.provide('goog.crypt.Sha384'); + +goog.require('goog.crypt.Sha2_64bit'); + + + +/** + * Constructs a SHA-384 cryptographic hash. + * + * @constructor + * @extends {goog.crypt.Sha2_64bit} + * @final + * @struct + */ +goog.crypt.Sha384 = function() { + goog.crypt.Sha384.base(this, 'constructor', 6, + // Section 5.3.4 of + // csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf + [0xcbbb9d5d, 0xc1059ed8, // H0 + 0x629a292a, 0x367cd507, // H1 + 0x9159015a, 0x3070dd17, // H2 + 0x152fecd8, 0xf70e5939, // H3 + 0x67332667, 0xffc00b31, // H4 + 0x8eb44a87, 0x68581511, // H5 + 0xdb0c2e0d, 0x64f98fa7, // H6 + 0x47b5481d, 0xbefa4fa4 // H7 + ]); +}; +goog.inherits(goog.crypt.Sha384, goog.crypt.Sha2_64bit); diff --git a/third_party/closure/goog/crypt/sha512.js b/third_party/closure/goog/crypt/sha512.js new file mode 100644 index 0000000000000..48c98de349b31 --- /dev/null +++ b/third_party/closure/goog/crypt/sha512.js @@ -0,0 +1,53 @@ +// Copyright 2014 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 SHA-512 cryptographic hash. + * + * Usage: + * var sha512 = new goog.crypt.Sha512(); + * sha512.update(bytes); + * var hash = sha512.digest(); + * + */ + +goog.provide('goog.crypt.Sha512'); + +goog.require('goog.crypt.Sha2_64bit'); + + + +/** + * Constructs a SHA-512 cryptographic hash. + * + * @constructor + * @extends {goog.crypt.Sha2_64bit} + * @final + * @struct + */ +goog.crypt.Sha512 = function() { + goog.crypt.Sha512.base(this, 'constructor', 8, + // Section 5.3.5 of + // csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf + [0x6a09e667, 0xf3bcc908, // H0 + 0xbb67ae85, 0x84caa73b, // H1 + 0x3c6ef372, 0xfe94f82b, // H2 + 0xa54ff53a, 0x5f1d36f1, // H3 + 0x510e527f, 0xade682d1, // H4 + 0x9b05688c, 0x2b3e6c1f, // H5 + 0x1f83d9ab, 0xfb41bd6b, // H6 + 0x5be0cd19, 0x137e2179 // H7 + ]); +}; +goog.inherits(goog.crypt.Sha512, goog.crypt.Sha2_64bit); diff --git a/third_party/closure/goog/crypt/sha512_256.js b/third_party/closure/goog/crypt/sha512_256.js new file mode 100644 index 0000000000000..74d924e81d59a --- /dev/null +++ b/third_party/closure/goog/crypt/sha512_256.js @@ -0,0 +1,60 @@ +// Copyright 2014 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 SHA-512/256 cryptographic hash. + * + * WARNING: SHA-256 and SHA-512/256 are different members of the SHA-2 + * family of hashes. Although both give 32-byte results, the two results + * should bear no relationship to each other. + * + * Please be careful before using this hash function. + *

+ * Usage: + * var sha512_256 = new goog.crypt.Sha512_256(); + * sha512_256.update(bytes); + * var hash = sha512_256.digest(); + * + */ + +goog.provide('goog.crypt.Sha512_256'); + +goog.require('goog.crypt.Sha2_64bit'); + + + +/** + * Constructs a SHA-512/256 cryptographic hash. + * + * @constructor + * @extends {goog.crypt.Sha2_64bit} + * @final + * @struct + */ +goog.crypt.Sha512_256 = function() { + goog.crypt.Sha512_256.base(this, 'constructor', 4, + // Section 5.3.6.2 of + // csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf + [0x22312194, 0xFC2BF72C, // H0 + 0x9F555FA3, 0xC84C64C2, // H1 + 0x2393B86B, 0x6F53B151, // H2 + 0x96387719, 0x5940EABD, // H3 + 0x96283EE2, 0xA88EFFE3, // H4 + 0xBE5E1E25, 0x53863992, // H5 + 0x2B0199FC, 0x2C85B8AA, // H6 + 0x0EB72DDC, 0x81C52CA2 // H7 + ]); +}; +goog.inherits(goog.crypt.Sha512_256, goog.crypt.Sha2_64bit); + diff --git a/third_party/closure/goog/css/autocomplete.css b/third_party/closure/goog/css/autocomplete.css old mode 100755 new mode 100644 diff --git a/third_party/closure/goog/css/bubble.css b/third_party/closure/goog/css/bubble.css old mode 100755 new mode 100644 diff --git a/third_party/closure/goog/css/charpicker.css b/third_party/closure/goog/css/charpicker.css old mode 100755 new mode 100644 index 4ef19e4bf99c9..fb33447746c7e --- a/third_party/closure/goog/css/charpicker.css +++ b/third_party/closure/goog/css/charpicker.css @@ -49,7 +49,7 @@ } .goog-char-picker-grid { - overflow: hide; + overflow: hidden; height: 250px; width: 250px; position: relative; diff --git a/third_party/closure/goog/css/custombutton.css b/third_party/closure/goog/css/custombutton.css index c4ce856ad658f..1f17052708284 100644 --- a/third_party/closure/goog/css/custombutton.css +++ b/third_party/closure/goog/css/custombutton.css @@ -41,9 +41,6 @@ } .goog-custom-button-inner-box { - /* By default in FF2, block elements inside a moz-inline-box are stacked - * horizontally next to each other. This stops that weird behavior. */ - -moz-box-orient: vertical; margin: 0 -1px; border-width: 0 1px; padding: 3px 4px; diff --git a/third_party/closure/goog/css/datepicker.css b/third_party/closure/goog/css/datepicker.css index 5832585e0ed18..6d5b914d035b1 100644 --- a/third_party/closure/goog/css/datepicker.css +++ b/third_party/closure/goog/css/datepicker.css @@ -115,11 +115,17 @@ td.goog-date-picker-none-cont { } .goog-date-picker-month { - width: 11ex; + min-width: 11ex; + white-space: nowrap; } .goog-date-picker-year { - width: 6ex; + min-width: 6ex; + white-space: nowrap; +} + +.goog-date-picker-monthyear { + white-space: nowrap; } .goog-date-picker table { diff --git a/third_party/closure/goog/css/imagelessbutton.css b/third_party/closure/goog/css/imagelessbutton.css old mode 100755 new mode 100644 diff --git a/third_party/closure/goog/css/inputdatepicker.css b/third_party/closure/goog/css/inputdatepicker.css old mode 100755 new mode 100644 diff --git a/third_party/closure/goog/css/offline.css b/third_party/closure/goog/css/offline.css deleted file mode 100644 index 82d3a643d6472..0000000000000 --- a/third_party/closure/goog/css/offline.css +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright 2007 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: ssaviano@google.com (Steven Saviano) */ - -/* We need the dialog CSS from dialog.css. */ -@import url(dialog.css); - -/* Styles for goog.ui.OfflineStatusComponent */ -.goog-offlinestatus { - cursor: pointer; -} - -.goog-offlinestatus-installed, .goog-offlinestatus-notinstalled { - color: #c00000; - font-family: arial, sans-serif; - font-weight: bold; - text-decoration: underline; -} - -.goog-offlinestatus-offline { - background: url(//ssl.gstatic.com/closure/gears_offline.gif) no-repeat 50% 50%; - text-decoration: none; -} - -.goog-offlinestatus-online { - background: url(//ssl.gstatic.com/closure/gears_online.gif) no-repeat 50% 50%; - text-decoration: none; -} - -.goog-offlinestatus-paused { - background: url(//ssl.gstatic.com/closure/gears_paused.gif) no-repeat 50% 50%; - text-decoration: none; -} - -.goog-offlinestatus-syncing { - background: url(//ssl.gstatic.com/closure/gears_syncing.gif) no-repeat 50% 50%; - text-decoration: none; -} - -.goog-offlinestatus-error { - background: url(//ssl.gstatic.com/closure/gears_syncing.gif) no-repeat 50% 50%; - text-decoration: none; -} - - -/* Styles for goog.ui.OfflineStatusCard */ -.goog-offlinestatuscard { - position: absolute; - zoom: 1; -} - -.goog-offlinestatuscard-shadow { - float: left; - clear: left; - padding: 0; - background-color: #777; -} - -.goog-offlinestatuscard-content { - position: relative; - font-family: arial, sans-serif; - bottom: 3px; - right: 3px; - padding: .5em 3em .5em 1em; - margin: 0; - border: 1px solid #c3d9ff; - background-color: #fff; - font-size: 11px; -} - -.goog-offlinestatuscard-action { - margin: 0.2em 0 0; - cursor: pointer; - text-decoration: underline; - color: #0000cc; -} - -.goog-offlinestatuscard-message { - padding-top: 10px; -} - -.goog-offlinestatuscard-closecard { - position: absolute; - top: 3px; - right: 3px; - cursor: pointer; - width: 11px; - height: 11px; - background-image: url(//ssl.gstatic.com/closure/close_box.gif); -} - - -/* Styles for goog.ui.OfflineInstallDialog */ -.goog-offlinedialog-bold { - font-weight: bold; -} - -.goog-offlinedialog-steps { - padding-top: 15px; -} - -.goog-offlinedialog-step { - padding: 12px 0; -} - -.goog-offlinedialog-step-number { - color: #ffffff; - font-weight: bold; - padding: 10px; - background: url(//ssl.gstatic.com/closure/gears_bluedot.gif) no-repeat 50% 50%; -} - -.goog-offlinedialog-step-description { - padding-left: 5px; - font-weight: bold; -} - -.goog-offlinedialog-appurl { - color: #0066cc; -} - - -/* Styles for goog.ui.ProgressBar */ -.progress-bar-horizontal { - position: relative; - padding: 1px; - margin: 0; - overflow: hidden; - height: .4em; - width: 180px; - border: 1px solid #949dad; - background-color: #ffffff; -} - -.progress-bar-thumb { - position: relative; - margin: 0; - overflow: hidden; - height: 100%; - width: 100%; - background-color: #a4c5ff; -} diff --git a/third_party/closure/goog/cssom/cssom.js b/third_party/closure/goog/cssom/cssom.js index cee57c3f20eb0..df11232767d51 100644 --- a/third_party/closure/goog/cssom/cssom.js +++ b/third_party/closure/goog/cssom/cssom.js @@ -112,7 +112,7 @@ goog.cssom.getCssRulesFromStyleSheet = function(styleSheet) { * @param {(CSSStyleSheet|StyleSheetList)=} opt_styleSheet A CSSStyleSheet. * @param {boolean=} opt_includeDisabled If true, includes disabled stylesheets, * defaults to false. - * @return {Array.} A list of CSSStyleSheet objects. + * @return {!Array.} A list of CSSStyleSheet objects. */ goog.cssom.getAllCssStyleSheets = function(opt_styleSheet, opt_includeDisabled) { @@ -294,17 +294,24 @@ goog.cssom.addCssRule = function(cssStyleSheet, cssText, opt_index) { if (index < 0 || index == undefined) { // If no index specified, insert at the end of the current list // of rules. - // If on IE, use rules property, otherwise use cssRules property. - var rules = cssStyleSheet.rules || cssStyleSheet.cssRules; + + // Select cssRules unless it isn't present. For pre-IE9 IE, use the rules + // collection instead. + // It's important to be consistent in using only the W3C or IE apis on + // IE9+ where both are present to ensure that there is no indexing + // mismatches - the collections are subtly different in what the include or + // exclude which can lead to one collection being longer than the other + // depending on the page's construction. + var rules = cssStyleSheet.cssRules || cssStyleSheet.rules; index = rules.length; } if (cssStyleSheet.insertRule) { - // W3C. + // W3C (including IE9+). cssStyleSheet.insertRule(cssText, index); } else { - // IE: We have to parse the cssRule text to get the selector separated - // from the style text. + // IE, pre 9: We have to parse the cssRule text to get the selector + // separated from the style text. // aka Everything that isn't a colon, followed by a colon, then // the rest is the style part. var matches = /^([^\{]+)\{([^\{]+)\}/.exec(cssText); @@ -341,7 +348,7 @@ goog.cssom.removeCssRule = function(cssStyleSheet, index) { * @param {string} cssText CSS to add to the end of the document. * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper user for * document interactions. - * @return {Element} The newly created STYLE element. + * @return {!Element} The newly created STYLE element. */ goog.cssom.addCssText = function(cssText, opt_domHelper) { var document = opt_domHelper ? opt_domHelper.getDocument() : @@ -391,7 +398,7 @@ goog.cssom.getFileNameFromStyleSheet = function(styleSheet) { * Recursively gets all CSS text or rules. * @param {CSSStyleSheet|StyleSheetList} styleSheet The CSSStyleSheet. * @param {boolean} isTextOutput If true, output is cssText, otherwise cssRules. - * @return {string|Array.} cssText or cssRules. + * @return {string|!Array.} cssText or cssRules. * @private */ goog.cssom.getAllCss_ = function(styleSheet, isTextOutput) { diff --git a/third_party/closure/goog/cssom/iframe/style.js b/third_party/closure/goog/cssom/iframe/style.js index 3ecfd10a9c167..e4bb7aba94ab4 100644 --- a/third_party/closure/goog/cssom/iframe/style.js +++ b/third_party/closure/goog/cssom/iframe/style.js @@ -49,11 +49,12 @@ goog.provide('goog.cssom.iframe.style'); +goog.require('goog.asserts'); goog.require('goog.cssom'); goog.require('goog.dom'); goog.require('goog.dom.NodeType'); goog.require('goog.dom.TagName'); -goog.require('goog.dom.classes'); +goog.require('goog.dom.classlist'); goog.require('goog.string'); goog.require('goog.style'); goog.require('goog.userAgent'); @@ -138,7 +139,7 @@ goog.cssom.iframe.style.CssRuleSet_.prototype.initializeFromCssRule = return false; } var selector; - var declarations; + var declarations = ''; if (ruleStyle && (selector = cssRule.selectorText) && (declarations = ruleStyle.cssText)) { @@ -191,7 +192,7 @@ goog.cssom.iframe.style.CssRuleSet_.prototype.setSelectorsFromString = /** * Make a copy of this ruleset. - * @return {goog.cssom.iframe.style.CssRuleSet_} A new CssRuleSet containing + * @return {!goog.cssom.iframe.style.CssRuleSet_} A new CssRuleSet containing * the same data as this one. */ goog.cssom.iframe.style.CssRuleSet_.prototype.clone = function() { @@ -525,7 +526,7 @@ goog.cssom.iframe.style.NodeAncestry_ = function(el) { var className = node.className; var classNamesLookup = {}; if (className) { - var classNames = goog.dom.classes.get(node); + var classNames = goog.dom.classlist.get(goog.asserts.assertElement(node)); for (var i = 0; i < classNames.length; i++) { classNamesLookup[classNames[i]] = 1; } @@ -566,7 +567,7 @@ goog.cssom.iframe.style.resetDomCache = function() { /** * Inspects a document and returns all active rule sets * @param {Document} doc The document from which to read CSS rules. - * @return {Array.} An array of CssRuleSet + * @return {!Array.} An array of CssRuleSet * objects representing all the active rule sets in the document. * @private */ @@ -622,7 +623,7 @@ goog.cssom.iframe.style.ruleSetCache_.loadRuleSetsForDocument = function(doc) { * Retrieves the array of css rulesets for this document. A cached * version will be used when possible. * @param {Document} doc The document for which to get rulesets. - * @return {Array.} An array of CssRuleSet + * @return {!Array.} An array of CssRuleSet * objects representing the css rule sets in the supplied document. */ goog.cssom.iframe.style.ruleSetCache_.getRuleSetsForDocument = function(doc) { @@ -922,7 +923,7 @@ goog.cssom.iframe.style.getBackgroundXYValues_ = function(styleObject) { * has a transparent background what you're going to see through it is its * ancestors. * @param {Element} element The element from which to copy background styles. - * @return {Object} Object containing background* properties. + * @return {!Object} Object containing background* properties. */ goog.cssom.iframe.style.getBackgroundContext = function(element) { var propertyValues = { diff --git a/third_party/closure/goog/datasource/datamanager.js b/third_party/closure/goog/datasource/datamanager.js index 35a50865af26f..5eccd20a10dc1 100644 --- a/third_party/closure/goog/datasource/datamanager.js +++ b/third_party/closure/goog/datasource/datamanager.js @@ -30,6 +30,7 @@ goog.provide('goog.ds.DataManager'); goog.require('goog.ds.BasicNodeList'); goog.require('goog.ds.DataNode'); goog.require('goog.ds.Expr'); +goog.require('goog.object'); goog.require('goog.string'); goog.require('goog.structs'); goog.require('goog.structs.Map'); @@ -40,6 +41,7 @@ goog.require('goog.structs.Map'); * Create a DataManger * @extends {goog.ds.DataNode} * @constructor + * @final */ goog.ds.DataManager = function() { this.dataSources_ = new goog.ds.BasicNodeList(); @@ -62,7 +64,7 @@ goog.inherits(goog.ds.DataManager, goog.ds.DataNode); /** * Get the global instance - * @return {goog.ds.DataManager} The data manager singleton. + * @return {!goog.ds.DataManager} The data manager singleton. */ goog.ds.DataManager.getInstance = function() { if (!goog.ds.DataManager.instance_) { @@ -167,7 +169,7 @@ goog.ds.DataManager.prototype.getDataSource = function(name) { /** * Get the value of the node - * @return {Object} The value of the node, or null if no value. + * @return {!Object} The value of the node. * @override */ goog.ds.DataManager.prototype.get = function() { @@ -476,7 +478,7 @@ goog.ds.DataManager.prototype.removeListenersByFunction_ = function( */ goog.ds.DataManager.prototype.getListenerCount = function() { var count = 0; - goog.structs.forEach(this.listenerMap_, function(matchingListeners) { + goog.object.forEach(this.listenerMap_, function(matchingListeners) { count += goog.structs.getCount(matchingListeners); }); return count; diff --git a/third_party/closure/goog/datasource/datasource.js b/third_party/closure/goog/datasource/datasource.js index 066a52587bd91..11234b7b3d017 100644 --- a/third_party/closure/goog/datasource/datasource.js +++ b/third_party/closure/goog/datasource/datasource.js @@ -32,7 +32,7 @@ goog.provide('goog.ds.Util'); goog.provide('goog.ds.logger'); goog.require('goog.array'); -goog.require('goog.debug.Logger'); +goog.require('goog.log'); @@ -68,7 +68,7 @@ goog.ds.DataNode.prototype.set = goog.abstractMethod; * Gets all of the child nodes of the current node. * Should return an empty DataNode list if no child nodes. * @param {string=} opt_selector String selector to choose child nodes. - * @return {goog.ds.DataNodeList} The child nodes. + * @return {!goog.ds.DataNodeList} The child nodes. */ goog.ds.DataNode.prototype.getChildNodes = goog.abstractMethod; @@ -179,7 +179,7 @@ goog.ds.BaseDataNode.prototype.set = goog.abstractMethod; * Gets all of the child nodes of the current node. * Should return an empty DataNode list if no child nodes. * @param {string=} opt_selector String selector to choose child nodes. - * @return {goog.ds.DataNodeList} The child nodes. + * @return {!goog.ds.DataNodeList} The child nodes. */ goog.ds.BaseDataNode.prototype.getChildNodes = function(opt_selector) { return new goog.ds.EmptyNodeList(); @@ -460,6 +460,7 @@ goog.ds.BasicNodeList.prototype.indexOf = function(name) { * Immulatable empty node list * @extends {goog.ds.BasicNodeList} * @constructor + * @final */ goog.ds.EmptyNodeList = function() { @@ -627,9 +628,9 @@ goog.ds.STR_ARRAY_START = '['; /** * Shared logger instance for data package - * @type {goog.debug.Logger} + * @type {goog.log.Logger} */ -goog.ds.logger = goog.debug.Logger.getLogger('goog.ds'); +goog.ds.logger = goog.log.getLogger('goog.ds'); /** @@ -645,6 +646,7 @@ goog.ds.Util.makeReferenceNode = function(node, name) { /** * @constructor * @extends {goog.ds.DataNode} + * @final */ var nodeCreator = function() {}; nodeCreator.prototype = node; diff --git a/third_party/closure/goog/datasource/expr.js b/third_party/closure/goog/datasource/expr.js index 869c9e373df4e..804e9cec65b2b 100644 --- a/third_party/closure/goog/datasource/expr.js +++ b/third_party/closure/goog/datasource/expr.js @@ -47,6 +47,7 @@ goog.require('goog.string'); * * @param {string=} opt_expr The string expression. * @constructor + * @final */ goog.ds.Expr = function(opt_expr) { if (opt_expr) { diff --git a/third_party/closure/goog/datasource/fastdatanode.js b/third_party/closure/goog/datasource/fastdatanode.js index d745cffa7dee8..b8bf74372b094 100644 --- a/third_party/closure/goog/datasource/fastdatanode.js +++ b/third_party/closure/goog/datasource/fastdatanode.js @@ -119,7 +119,7 @@ goog.ds.AbstractFastDataNode.prototype.getDataPath = function() { */ goog.ds.FastDataNode = function(root, dataName, opt_parent) { goog.ds.AbstractFastDataNode.call(this, dataName, opt_parent); - this.extendWith_(root); + this.extendWith(root); }; goog.inherits(goog.ds.FastDataNode, goog.ds.AbstractFastDataNode); @@ -128,9 +128,8 @@ goog.inherits(goog.ds.FastDataNode, goog.ds.AbstractFastDataNode); * Add all attributes of object to this data node. * @param {Object} object Object to add attributes from. * @protected - * @suppress {underscore} */ -goog.ds.FastDataNode.prototype.extendWith_ = function(object) { +goog.ds.FastDataNode.prototype.extendWith = function(object) { for (var key in object) { this[key] = object[key]; } @@ -149,7 +148,7 @@ goog.ds.FastDataNode.prototype.extendWith_ = function(object) { * node from. * @param {string} dataName Name of data node. * @param {goog.ds.DataNode=} opt_parent Parent of data node. - * @return {goog.ds.AbstractFastDataNode} Data node representing object. + * @return {!goog.ds.AbstractFastDataNode} Data node representing object. */ goog.ds.FastDataNode.fromJs = function(object, dataName, opt_parent) { if (goog.isArray(object)) { @@ -166,7 +165,7 @@ goog.ds.FastDataNode.fromJs = function(object, dataName, opt_parent) { /** * Static instance of an empty list. - * @type {goog.ds.EmptyNodeList} + * @type {!goog.ds.EmptyNodeList} * @private */ goog.ds.FastDataNode.emptyList_ = new goog.ds.EmptyNodeList(); @@ -281,7 +280,7 @@ goog.ds.FastDataNode.prototype.isList = function() { /** * Returns a javascript object representation of this data node. You should * not modify the object returned by this function. - * @return {Object} Javascript object representation of this data node. + * @return {!Object} Javascript object representation of this data node. */ goog.ds.FastDataNode.prototype.getJsObject = function() { var result = {}; @@ -408,6 +407,7 @@ goog.ds.FastDataNode.prototype.removeNode = function(name) { * @param {goog.ds.DataNode=} opt_parent Parent of this data node. * @extends {goog.ds.AbstractFastDataNode} * @constructor + * @final */ goog.ds.PrimitiveFastDataNode = function(value, dataName, opt_parent) { this.value_ = value; @@ -443,7 +443,7 @@ goog.ds.PrimitiveFastDataNode.prototype.set = function(value) { /** * Returns child nodes of this data node. Always returns an unmodifiable, * empty list. - * @return {goog.ds.DataNodeList} (Empty) list of child nodes. + * @return {!goog.ds.DataNodeList} (Empty) list of child nodes. * @override */ goog.ds.PrimitiveFastDataNode.prototype.getChildNodes = function() { @@ -513,6 +513,7 @@ goog.ds.PrimitiveFastDataNode.prototype.getJsObject = function() { * @param {goog.ds.DataNode=} opt_parent parent of this node. * @extends {goog.ds.AbstractFastDataNode} * @constructor + * @final */ // TODO(arv): Use interfaces when available. This implements DataNodeList // as well. @@ -546,7 +547,7 @@ goog.ds.FastListNode.prototype.set = function(value) { /** * Returns child nodes of this data node. Currently, only supports * returning all children. - * @return {goog.ds.DataNodeList} List of child nodes. + * @return {!goog.ds.DataNodeList} List of child nodes. * @override */ goog.ds.FastListNode.prototype.getChildNodes = function() { @@ -675,7 +676,7 @@ goog.ds.FastListNode.prototype.isList = function() { /** * Returns a javascript object representation of this data node. You should * not modify the object returned by this function. - * @return {Object} Javascript object representation of this data node. + * @return {!Object} Javascript object representation of this data node. */ goog.ds.FastListNode.prototype.getJsObject = function() { var result = []; diff --git a/third_party/closure/goog/datasource/jsdatasource.js b/third_party/closure/goog/datasource/jsdatasource.js index 78d8e06bc69be..653dbbcf1f53d 100644 --- a/third_party/closure/goog/datasource/jsdatasource.js +++ b/third_party/closure/goog/datasource/jsdatasource.js @@ -55,7 +55,7 @@ goog.ds.JsDataSource = function(root, dataName, opt_parent) { * The root JS object. Can be null. * @type {*} * @protected - * @suppress {underscore} + * @suppress {underscore|visibility} */ goog.ds.JsDataSource.prototype.root_; @@ -410,6 +410,7 @@ goog.ds.JsDataSource.prototype.isList = function() { * * @constructor * @extends {goog.ds.BaseDataNode} + * @final */ goog.ds.JsPropertyDataSource = function(parent, dataName, opt_parentDataNode) { goog.ds.BaseDataNode.call(this); diff --git a/third_party/closure/goog/datasource/jsondatasource.js b/third_party/closure/goog/datasource/jsondatasource.js index 8e800001245f6..fb5dce40fccc5 100644 --- a/third_party/closure/goog/datasource/jsondatasource.js +++ b/third_party/closure/goog/datasource/jsondatasource.js @@ -54,6 +54,7 @@ goog.require('goog.ds.logger'); * * @extends {goog.ds.JsDataSource} * @constructor + * @final */ goog.ds.JsonDataSource = function(uri, name, opt_callbackParamName) { goog.ds.JsDataSource.call(this, null, name, null); @@ -99,7 +100,7 @@ goog.ds.JsonDataSource.prototype.load = function() { // renamed. It should therefore be accessed via array notation here so // that it also doesn't get renamed and stops the compiler from complaining goog.ds.JsonDataSource['dataSources'][this.dataName_] = this; - goog.ds.logger.info('Sending JS request for DataSource ' + + goog.log.info(goog.ds.logger, 'Sending JS request for DataSource ' + this.getDataName() + ' to ' + this.uri_); this.loadState_ = goog.ds.LoadState.LOADING; diff --git a/third_party/closure/goog/datasource/jsxmlhttpdatasource.js b/third_party/closure/goog/datasource/jsxmlhttpdatasource.js index 3a8445b176b6d..f04260852b088 100644 --- a/third_party/closure/goog/datasource/jsxmlhttpdatasource.js +++ b/third_party/closure/goog/datasource/jsxmlhttpdatasource.js @@ -32,6 +32,7 @@ goog.require('goog.ds.FastDataNode'); goog.require('goog.ds.LoadState'); goog.require('goog.ds.logger'); goog.require('goog.events'); +goog.require('goog.log'); goog.require('goog.net.EventType'); goog.require('goog.net.XhrIo'); @@ -50,6 +51,7 @@ goog.require('goog.net.XhrIo'); * * @extends {goog.ds.FastDataNode} * @constructor + * @final */ goog.ds.JsXmlHttpDataSource = function(uri, name, opt_startText, opt_endText, opt_usePost) { @@ -115,7 +117,7 @@ goog.ds.JsXmlHttpDataSource.prototype.setQueryData = function(data) { * @override */ goog.ds.JsXmlHttpDataSource.prototype.load = function() { - goog.ds.logger.info('Sending JS request for DataSource ' + + goog.log.info(goog.ds.logger, 'Sending JS request for DataSource ' + this.getDataName() + ' to ' + this.uri_); if (this.uri_) { @@ -157,7 +159,8 @@ goog.ds.JsXmlHttpDataSource.prototype.success_ = function() { */ goog.ds.JsXmlHttpDataSource.prototype.completed_ = function(e) { if (this.xhr_.isSuccess()) { - goog.ds.logger.info('Got data for DataSource ' + this.getDataName()); + goog.log.info(goog.ds.logger, + 'Got data for DataSource ' + this.getDataName()); var text = this.xhr_.getResponseText(); // Look for start and end token and trim text @@ -174,19 +177,19 @@ goog.ds.JsXmlHttpDataSource.prototype.completed_ = function(e) { /** @preserveTry */ try { var jsonObj = /** @type {Object} */ (eval('[' + text + '][0]')); - this.extendWith_(jsonObj); + this.extendWith(jsonObj); this.loadState_ = goog.ds.LoadState.LOADED; } catch (ex) { // Invalid JS this.loadState_ = goog.ds.LoadState.FAILED; - goog.ds.logger.severe('Failed to parse data: ' + ex.message); + goog.log.error(goog.ds.logger, 'Failed to parse data: ' + ex.message); } // Call on a timer to avoid threading issues on IE. goog.global.setTimeout(goog.bind(this.success_, this), 0); } else { - goog.ds.logger.info('Data retrieve failed for DataSource ' + + goog.log.info(goog.ds.logger, 'Data retrieve failed for DataSource ' + this.getDataName()); this.loadState_ = goog.ds.LoadState.FAILED; } diff --git a/third_party/closure/goog/datasource/xmldatasource.js b/third_party/closure/goog/datasource/xmldatasource.js index ed28952eb026d..50547cb1bf4ff 100644 --- a/third_party/closure/goog/datasource/xmldatasource.js +++ b/third_party/closure/goog/datasource/xmldatasource.js @@ -32,6 +32,7 @@ goog.require('goog.net.XhrIo'); goog.require('goog.string'); + /** * Data source whose backing is an xml node * @@ -299,6 +300,7 @@ goog.ds.XmlDataSource.createChildlessDocument_ = function() { * implements goog.ds.XmlHttpDataSource. * @constructor * @extends {goog.ds.XmlDataSource} + * @final */ goog.ds.XmlHttpDataSource = function(uri, name) { goog.ds.XmlDataSource.call(this, null, null, name); @@ -325,7 +327,7 @@ goog.ds.XmlHttpDataSource.prototype.loadState_ = goog.ds.LoadState.NOT_LOADED; */ goog.ds.XmlHttpDataSource.prototype.load = function() { if (this.uri_) { - goog.ds.logger.info('Sending XML request for DataSource ' + + goog.log.info(goog.ds.logger, 'Sending XML request for DataSource ' + this.getDataName() + ' to ' + this.uri_); this.loadState_ = goog.ds.LoadState.LOADING; @@ -371,7 +373,8 @@ goog.ds.XmlHttpDataSource.prototype.complete_ = function(e) { * @private */ goog.ds.XmlHttpDataSource.prototype.success_ = function(xhr) { - goog.ds.logger.info('Got data for DataSource ' + this.getDataName()); + goog.log.info(goog.ds.logger, + 'Got data for DataSource ' + this.getDataName()); var xml = xhr.getResponseXml(); // Fix for case where IE returns valid XML as text but @@ -401,7 +404,7 @@ goog.ds.XmlHttpDataSource.prototype.success_ = function(xhr) { * @private */ goog.ds.XmlHttpDataSource.prototype.failure_ = function() { - goog.ds.logger.info('Data retrieve failed for DataSource ' + + goog.log.info(goog.ds.logger, 'Data retrieve failed for DataSource ' + this.getDataName()); this.loadState_ = goog.ds.LoadState.FAILED; diff --git a/third_party/closure/goog/date/date.js b/third_party/closure/goog/date/date.js index d855ec587ae9b..1e8c1e1271a82 100644 --- a/third_party/closure/goog/date/date.js +++ b/third_party/closure/goog/date/date.js @@ -472,6 +472,7 @@ goog.date.setIso8601TimeOnly_ = function(d, formatted) { * @param {number=} opt_minutes Minutes. * @param {number=} opt_seconds Seconds. * @constructor + * @final */ goog.date.Interval = function(opt_years, opt_months, opt_days, opt_hours, opt_minutes, opt_seconds) { @@ -745,24 +746,47 @@ goog.date.Interval.prototype.add = function(interval) { * @see goog.date.DateTime */ goog.date.Date = function(opt_year, opt_month, opt_date) { - // goog.date.DateTime assumes that only this.date_ is added in this ctor. + /** @protected {!Date} The wrapped date or datetime. */ + this.date; + // goog.date.DateTime assumes that only this.date is added in this ctor. if (goog.isNumber(opt_year)) { - this.date_ = new Date(opt_year, opt_month || 0, opt_date || 1); + this.date = this.buildDate_(opt_year, opt_month || 0, opt_date || 1); this.maybeFixDst_(opt_date || 1); } else if (goog.isObject(opt_year)) { - this.date_ = new Date(opt_year.getFullYear(), opt_year.getMonth(), - opt_year.getDate()); + this.date = this.buildDate_(opt_year.getFullYear(), opt_year.getMonth(), + opt_year.getDate()); this.maybeFixDst_(opt_year.getDate()); } else { - this.date_ = new Date(goog.now()); - this.date_.setHours(0); - this.date_.setMinutes(0); - this.date_.setSeconds(0); - this.date_.setMilliseconds(0); + this.date = new Date(goog.now()); + this.date.setHours(0); + this.date.setMinutes(0); + this.date.setSeconds(0); + this.date.setMilliseconds(0); } }; +/** + * new Date(y, m, d) treats years in the interval [0, 100) as two digit years, + * adding 1900 to them. This method ensures that calling the date constructor + * as a copy constructor returns a value that is equal to the passed in + * date value by explicitly setting the full year. + * @private + * @param {number} fullYear The full year (including century). + * @param {number} month The month, from 0-11. + * @param {number} date The day of the month. + * @return {!Date} The constructed Date object. + */ +goog.date.Date.prototype.buildDate_ = function(fullYear, month, date) { + var d = new Date(fullYear, month, date); + if (fullYear >= 0 && fullYear < 100) { + // Can't just setFullYear as new Date() can flip over for e.g. month = 13. + d.setFullYear(d.getFullYear() - 1900); + } + return d; +}; + + /** * First day of week. 0 = Mon, 6 = Sun. * @type {number} @@ -785,7 +809,7 @@ goog.date.Date.prototype.firstWeekCutOffDay_ = * @return {!goog.date.Date} A clone of the date object. */ goog.date.Date.prototype.clone = function() { - var date = new goog.date.Date(this.date_); + var date = new goog.date.Date(this.date); date.firstDayOfWeek_ = this.firstDayOfWeek_; date.firstWeekCutOffDay_ = this.firstWeekCutOffDay_; @@ -797,7 +821,7 @@ goog.date.Date.prototype.clone = function() { * @return {number} The four digit year of date. */ goog.date.Date.prototype.getFullYear = function() { - return this.date_.getFullYear(); + return this.date.getFullYear(); }; @@ -816,7 +840,7 @@ goog.date.Date.prototype.getYear = function() { * @return {goog.date.month} The month of date, 0 = Jan, 11 = Dec. */ goog.date.Date.prototype.getMonth = function() { - return /** @type {goog.date.month} */ (this.date_.getMonth()); + return /** @type {goog.date.month} */ (this.date.getMonth()); }; @@ -824,7 +848,7 @@ goog.date.Date.prototype.getMonth = function() { * @return {number} The date of month. */ goog.date.Date.prototype.getDate = function() { - return this.date_.getDate(); + return this.date.getDate(); }; @@ -834,7 +858,7 @@ goog.date.Date.prototype.getDate = function() { * @return {number} The number of milliseconds since 1 January 1970 00:00:00. */ goog.date.Date.prototype.getTime = function() { - return this.date_.getTime(); + return this.date.getTime(); }; @@ -842,7 +866,7 @@ goog.date.Date.prototype.getTime = function() { * @return {goog.date.weekDay} The day of week, US style. 0 = Sun, 6 = Sat. */ goog.date.Date.prototype.getDay = function() { - return /** @type {goog.date.weekDay} */ (this.date_.getDay()); + return /** @type {goog.date.weekDay} */ (this.date.getDay()); }; @@ -866,7 +890,7 @@ goog.date.Date.prototype.getWeekday = function() { * @return {number} The four digit year of date according to universal time. */ goog.date.Date.prototype.getUTCFullYear = function() { - return this.date_.getUTCFullYear(); + return this.date.getUTCFullYear(); }; @@ -875,7 +899,7 @@ goog.date.Date.prototype.getUTCFullYear = function() { * 0 = Jan, 11 = Dec. */ goog.date.Date.prototype.getUTCMonth = function() { - return /** @type {goog.date.month} */ (this.date_.getUTCMonth()); + return /** @type {goog.date.month} */ (this.date.getUTCMonth()); }; @@ -883,7 +907,7 @@ goog.date.Date.prototype.getUTCMonth = function() { * @return {number} The date of month according to universal time. */ goog.date.Date.prototype.getUTCDate = function() { - return this.date_.getUTCDate(); + return this.date.getUTCDate(); }; @@ -892,7 +916,7 @@ goog.date.Date.prototype.getUTCDate = function() { * US style. 0 = Sun, 1 = Mon, 6 = Sat. */ goog.date.Date.prototype.getUTCDay = function() { - return /** @type {goog.date.weekDay} */ (this.date_.getDay()); + return /** @type {goog.date.weekDay} */ (this.date.getDay()); }; @@ -900,7 +924,7 @@ goog.date.Date.prototype.getUTCDay = function() { * @return {number} The hours value according to universal time. */ goog.date.Date.prototype.getUTCHours = function() { - return this.date_.getUTCHours(); + return this.date.getUTCHours(); }; @@ -908,7 +932,7 @@ goog.date.Date.prototype.getUTCHours = function() { * @return {number} The hours value according to universal time. */ goog.date.Date.prototype.getUTCMinutes = function() { - return this.date_.getUTCMinutes(); + return this.date.getUTCMinutes(); }; @@ -917,7 +941,7 @@ goog.date.Date.prototype.getUTCMinutes = function() { * 0 = Mon, 6 = Sun. */ goog.date.Date.prototype.getUTCIsoWeekday = function() { - return (this.date_.getUTCDay() + 6) % 7; + return (this.date.getUTCDay() + 6) % 7; }; @@ -987,7 +1011,7 @@ goog.date.Date.prototype.getDayOfYear = function() { * @return {number} The timezone offset. */ goog.date.Date.prototype.getTimezoneOffset = function() { - return this.date_.getTimezoneOffset(); + return this.date.getTimezoneOffset(); }; @@ -1022,7 +1046,7 @@ goog.date.Date.prototype.getTimezoneOffsetString = function() { * @param {goog.date.Date} date Date object to set date from. */ goog.date.Date.prototype.set = function(date) { - this.date_ = new Date(date.getFullYear(), date.getMonth(), date.getDate()); + this.date = new Date(date.getFullYear(), date.getMonth(), date.getDate()); }; @@ -1032,7 +1056,7 @@ goog.date.Date.prototype.set = function(date) { * @param {number} year Four digit year. */ goog.date.Date.prototype.setFullYear = function(year) { - this.date_.setFullYear(year); + this.date.setFullYear(year); }; @@ -1055,7 +1079,7 @@ goog.date.Date.prototype.setYear = function(year) { * @param {number} month The month, where 0 = Jan, 11 = Dec. */ goog.date.Date.prototype.setMonth = function(month) { - this.date_.setMonth(month); + this.date.setMonth(month); }; @@ -1065,7 +1089,7 @@ goog.date.Date.prototype.setMonth = function(month) { * @param {number} date The day part. */ goog.date.Date.prototype.setDate = function(date) { - this.date_.setDate(date); + this.date.setDate(date); }; @@ -1076,7 +1100,7 @@ goog.date.Date.prototype.setDate = function(date) { * @param {number} ms Number of milliseconds since 1 Jan 1970. */ goog.date.Date.prototype.setTime = function(ms) { - this.date_.setTime(ms); + this.date.setTime(ms); }; @@ -1086,7 +1110,7 @@ goog.date.Date.prototype.setTime = function(ms) { * @param {number} year Four digit year. */ goog.date.Date.prototype.setUTCFullYear = function(year) { - this.date_.setUTCFullYear(year); + this.date.setUTCFullYear(year); }; @@ -1096,7 +1120,7 @@ goog.date.Date.prototype.setUTCFullYear = function(year) { * @param {number} month The month, where 0 = Jan, 11 = Dec. */ goog.date.Date.prototype.setUTCMonth = function(month) { - this.date_.setUTCMonth(month); + this.date.setUTCMonth(month); }; @@ -1106,7 +1130,7 @@ goog.date.Date.prototype.setUTCMonth = function(month) { * @param {number} date The UTC date. */ goog.date.Date.prototype.setUTCDate = function(date) { - this.date_.setUTCDate(date); + this.date.setUTCDate(date); }; @@ -1254,7 +1278,7 @@ goog.date.Date.prototype.toString = function() { goog.date.Date.prototype.maybeFixDst_ = function(expected) { if (this.getDate() != expected) { var dir = this.getDate() < expected ? 1 : -1; - this.date_.setUTCHours(this.date_.getUTCHours() + dir); + this.date.setUTCHours(this.date.getUTCHours() + dir); } }; @@ -1264,7 +1288,7 @@ goog.date.Date.prototype.maybeFixDst_ = function(expected) { * @override */ goog.date.Date.prototype.valueOf = function() { - return this.date_.valueOf(); + return this.date.valueOf(); }; @@ -1304,16 +1328,27 @@ goog.date.Date.compare = function(date1, date2) { goog.date.DateTime = function(opt_year, opt_month, opt_date, opt_hours, opt_minutes, opt_seconds, opt_milliseconds) { if (goog.isNumber(opt_year)) { - this.date_ = new Date(opt_year, opt_month || 0, opt_date || 1, - opt_hours || 0, opt_minutes || 0, opt_seconds || 0, - opt_milliseconds || 0); + this.date = new Date(opt_year, opt_month || 0, opt_date || 1, + opt_hours || 0, opt_minutes || 0, opt_seconds || 0, + opt_milliseconds || 0); } else { - this.date_ = new Date(opt_year ? opt_year.getTime() : goog.now()); + this.date = new Date(opt_year ? opt_year.getTime() : goog.now()); } }; goog.inherits(goog.date.DateTime, goog.date.Date); +/** + * @param {number} timestamp Number of milliseconds since Epoch. + * @return {!goog.date.DateTime} + */ +goog.date.DateTime.fromTimestamp = function(timestamp) { + var date = new goog.date.DateTime(); + date.setTime(timestamp); + return date; +}; + + /** * Creates a DateTime from a datetime string expressed in RFC 822 format. * @@ -1332,7 +1367,7 @@ goog.date.DateTime.fromRfc822String = function(formatted) { * @return {number} An integer between 0 and 23, representing the hour. */ goog.date.DateTime.prototype.getHours = function() { - return this.date_.getHours(); + return this.date.getHours(); }; @@ -1342,7 +1377,7 @@ goog.date.DateTime.prototype.getHours = function() { * @return {number} An integer between 0 and 59, representing the minutes. */ goog.date.DateTime.prototype.getMinutes = function() { - return this.date_.getMinutes(); + return this.date.getMinutes(); }; @@ -1352,7 +1387,7 @@ goog.date.DateTime.prototype.getMinutes = function() { * @return {number} An integer between 0 and 59, representing the seconds. */ goog.date.DateTime.prototype.getSeconds = function() { - return this.date_.getSeconds(); + return this.date.getSeconds(); }; @@ -1362,7 +1397,7 @@ goog.date.DateTime.prototype.getSeconds = function() { * @return {number} An integer between 0 and 999, representing the milliseconds. */ goog.date.DateTime.prototype.getMilliseconds = function() { - return this.date_.getMilliseconds(); + return this.date.getMilliseconds(); }; @@ -1373,7 +1408,7 @@ goog.date.DateTime.prototype.getMilliseconds = function() { * @override */ goog.date.DateTime.prototype.getUTCDay = function() { - return /** @type {goog.date.weekDay} */ (this.date_.getUTCDay()); + return /** @type {goog.date.weekDay} */ (this.date.getUTCDay()); }; @@ -1384,7 +1419,7 @@ goog.date.DateTime.prototype.getUTCDay = function() { * @override */ goog.date.DateTime.prototype.getUTCHours = function() { - return this.date_.getUTCHours(); + return this.date.getUTCHours(); }; @@ -1395,7 +1430,7 @@ goog.date.DateTime.prototype.getUTCHours = function() { * @override */ goog.date.DateTime.prototype.getUTCMinutes = function() { - return this.date_.getUTCMinutes(); + return this.date.getUTCMinutes(); }; @@ -1405,7 +1440,7 @@ goog.date.DateTime.prototype.getUTCMinutes = function() { * @return {number} An integer between 0 and 59, representing the seconds. */ goog.date.DateTime.prototype.getUTCSeconds = function() { - return this.date_.getUTCSeconds(); + return this.date.getUTCSeconds(); }; @@ -1415,7 +1450,7 @@ goog.date.DateTime.prototype.getUTCSeconds = function() { * @return {number} An integer between 0 and 999, representing the milliseconds. */ goog.date.DateTime.prototype.getUTCMilliseconds = function() { - return this.date_.getUTCMilliseconds(); + return this.date.getUTCMilliseconds(); }; @@ -1425,7 +1460,7 @@ goog.date.DateTime.prototype.getUTCMilliseconds = function() { * @param {number} hours An integer between 0 and 23, representing the hour. */ goog.date.DateTime.prototype.setHours = function(hours) { - this.date_.setHours(hours); + this.date.setHours(hours); }; @@ -1435,7 +1470,7 @@ goog.date.DateTime.prototype.setHours = function(hours) { * @param {number} minutes Integer between 0 and 59, representing the minutes. */ goog.date.DateTime.prototype.setMinutes = function(minutes) { - this.date_.setMinutes(minutes); + this.date.setMinutes(minutes); }; @@ -1445,7 +1480,7 @@ goog.date.DateTime.prototype.setMinutes = function(minutes) { * @param {number} seconds Integer between 0 and 59, representing the seconds. */ goog.date.DateTime.prototype.setSeconds = function(seconds) { - this.date_.setSeconds(seconds); + this.date.setSeconds(seconds); }; @@ -1455,7 +1490,7 @@ goog.date.DateTime.prototype.setSeconds = function(seconds) { * @param {number} ms Integer between 0 and 999, representing the milliseconds. */ goog.date.DateTime.prototype.setMilliseconds = function(ms) { - this.date_.setMilliseconds(ms); + this.date.setMilliseconds(ms); }; @@ -1465,7 +1500,7 @@ goog.date.DateTime.prototype.setMilliseconds = function(ms) { * @param {number} hours An integer between 0 and 23, representing the hour. */ goog.date.DateTime.prototype.setUTCHours = function(hours) { - this.date_.setUTCHours(hours); + this.date.setUTCHours(hours); }; @@ -1475,7 +1510,7 @@ goog.date.DateTime.prototype.setUTCHours = function(hours) { * @param {number} minutes Integer between 0 and 59, representing the minutes. */ goog.date.DateTime.prototype.setUTCMinutes = function(minutes) { - this.date_.setUTCMinutes(minutes); + this.date.setUTCMinutes(minutes); }; @@ -1485,7 +1520,7 @@ goog.date.DateTime.prototype.setUTCMinutes = function(minutes) { * @param {number} seconds Integer between 0 and 59, representing the seconds. */ goog.date.DateTime.prototype.setUTCSeconds = function(seconds) { - this.date_.setUTCSeconds(seconds); + this.date.setUTCSeconds(seconds); }; @@ -1495,7 +1530,7 @@ goog.date.DateTime.prototype.setUTCSeconds = function(seconds) { * @param {number} ms Integer between 0 and 999, representing the milliseconds. */ goog.date.DateTime.prototype.setUTCMilliseconds = function(ms) { - this.date_.setUTCMilliseconds(ms); + this.date.setUTCMilliseconds(ms); }; @@ -1518,13 +1553,13 @@ goog.date.DateTime.prototype.add = function(interval) { goog.date.Date.prototype.add.call(this, interval); if (interval.hours) { - this.setHours(this.date_.getHours() + interval.hours); + this.setHours(this.date.getHours() + interval.hours); } if (interval.minutes) { - this.setMinutes(this.date_.getMinutes() + interval.minutes); + this.setMinutes(this.date.getMinutes() + interval.minutes); } if (interval.seconds) { - this.setSeconds(this.date_.getSeconds() + interval.seconds); + this.setSeconds(this.date.getSeconds() + interval.seconds); } }; @@ -1711,7 +1746,7 @@ goog.date.DateTime.prototype.toIsoTimeString = function(opt_showSeconds) { * @override */ goog.date.DateTime.prototype.clone = function() { - var date = new goog.date.DateTime(this.date_); + var date = new goog.date.DateTime(this.date); date.setFirstDayOfWeek(this.getFirstDayOfWeek()); date.setFirstWeekCutOffDay(this.getFirstWeekCutOffDay()); return date; diff --git a/third_party/closure/goog/date/daterange.js b/third_party/closure/goog/date/daterange.js index ac14c8e557b6e..5ab1bfc547bd4 100644 --- a/third_party/closure/goog/date/daterange.js +++ b/third_party/closure/goog/date/daterange.js @@ -34,6 +34,7 @@ goog.require('goog.iter.StopIteration'); * @constructor * @param {goog.date.Date} startDate The first date in the range. * @param {goog.date.Date} endDate The last date in the range. + * @final */ goog.date.DateRange = function(startDate, endDate) { /** @@ -56,7 +57,7 @@ goog.date.DateRange = function(startDate, endDate) { * The first possible day, as far as this class is concerned. * @type {goog.date.Date} */ -goog.date.DateRange.MINIMUM_DATE = new goog.date.Date(0000, 0, 1); +goog.date.DateRange.MINIMUM_DATE = new goog.date.Date(0, 0, 1); /** @@ -83,7 +84,19 @@ goog.date.DateRange.prototype.getEndDate = function() { /** - * @return {goog.iter.Iterator} An iterator over the date range. + * Tests if a date falls within this range. + * + * @param {goog.date.Date} date The date to test. + * @return {boolean} Whether the date is in the range. + */ +goog.date.DateRange.prototype.contains = function(date) { + return date.valueOf() >= this.startDate_.valueOf() && + date.valueOf() <= this.endDate_.valueOf(); +}; + + +/** + * @return {!goog.iter.Iterator} An iterator over the date range. */ goog.date.DateRange.prototype.iterator = function() { return new goog.date.DateRange.Iterator(this); @@ -115,7 +128,7 @@ goog.date.DateRange.equals = function(a, b) { * input. * @param {goog.date.Date} date The input date. * @param {number} offset Number of days. - * @return {goog.date.Date} The date that is |offset| days after |date|. + * @return {!goog.date.Date} The date that is |offset| days after |date|. * @private */ goog.date.DateRange.offsetInDays_ = function(date, offset) { @@ -129,7 +142,7 @@ goog.date.DateRange.offsetInDays_ = function(date, offset) { * Calculates the Monday before a date. If the input is a Monday, returns the * input. Does not modify its input. * @param {goog.date.Date} date The input date. - * @return {goog.date.Date} If |date| is a Monday, return |date|; otherwise + * @return {!goog.date.Date} If |date| is a Monday, return |date|; otherwise * return the Monday before |date|. * @private */ @@ -146,7 +159,7 @@ goog.date.DateRange.currentOrLastMonday_ = function(date) { * month that contains its input. Does not modify its input. * @param {goog.date.Date} date The input date. * @param {number} offset Number of months. - * @return {goog.date.Date} The date that is |offset| months after the first + * @return {!goog.date.Date} The date that is |offset| months after the first * day in the month that contains |date|. * @private */ @@ -162,7 +175,7 @@ goog.date.DateRange.offsetInMonths_ = function(date, offset) { * Returns the range from yesterday to yesterday. * @param {goog.date.Date=} opt_today The date to consider today. * Defaults to today. - * @return {goog.date.DateRange} The range that includes only yesterday. + * @return {!goog.date.DateRange} The range that includes only yesterday. */ goog.date.DateRange.yesterday = function(opt_today) { var today = goog.date.DateRange.cloneOrCreate_(opt_today); @@ -175,7 +188,7 @@ goog.date.DateRange.yesterday = function(opt_today) { * Returns the range from today to today. * @param {goog.date.Date=} opt_today The date to consider today. * Defaults to today. - * @return {goog.date.DateRange} The range that includes only today. + * @return {!goog.date.DateRange} The range that includes only today. */ goog.date.DateRange.today = function(opt_today) { var today = goog.date.DateRange.cloneOrCreate_(opt_today); @@ -187,7 +200,7 @@ goog.date.DateRange.today = function(opt_today) { * Returns the range that includes the seven days that end yesterday. * @param {goog.date.Date=} opt_today The date to consider today. * Defaults to today. - * @return {goog.date.DateRange} The range that includes the seven days that + * @return {!goog.date.DateRange} The range that includes the seven days that * end yesterday. */ goog.date.DateRange.last7Days = function(opt_today) { @@ -203,7 +216,7 @@ goog.date.DateRange.last7Days = function(opt_today) { * of this month. * @param {goog.date.Date=} opt_today The date to consider today. * Defaults to today. - * @return {goog.date.DateRange} The range that starts the first of this month + * @return {!goog.date.DateRange} The range that starts the first of this month * and ends the last day of this month. */ goog.date.DateRange.thisMonth = function(opt_today) { @@ -221,7 +234,7 @@ goog.date.DateRange.thisMonth = function(opt_today) { * of last month. * @param {goog.date.Date=} opt_today The date to consider today. * Defaults to today. - * @return {goog.date.DateRange} The range that starts the first of last month + * @return {!goog.date.DateRange} The range that starts the first of last month * and ends the last day of last month. */ goog.date.DateRange.lastMonth = function(opt_today) { @@ -239,7 +252,7 @@ goog.date.DateRange.lastMonth = function(opt_today) { * (see {@link goog.i18n.DateTimeSymbols.FIRSTDAYOFWEEK}) on or before today. * @param {goog.date.Date=} opt_today The date to consider today. * Defaults to today. - * @return {goog.date.DateRange} The range that starts the Monday on or before + * @return {!goog.date.DateRange} The range that starts the Monday on or before * today and ends the Sunday on or after today. */ goog.date.DateRange.thisWeek = function(opt_today) { @@ -259,7 +272,7 @@ goog.date.DateRange.thisWeek = function(opt_today) { * contains today. * @param {goog.date.Date=} opt_today The date to consider today. * Defaults to today. - * @return {goog.date.DateRange} The range that starts seven days before the + * @return {!goog.date.DateRange} The range that starts seven days before the * Monday on or before today and ends the Sunday on or before yesterday. */ goog.date.DateRange.lastWeek = function(opt_today) { @@ -275,7 +288,7 @@ goog.date.DateRange.lastWeek = function(opt_today) { * today and ends the Friday before today. * @param {goog.date.Date=} opt_today The date to consider today. * Defaults to today. - * @return {goog.date.DateRange} The range that starts seven days before the + * @return {!goog.date.DateRange} The range that starts seven days before the * Monday on or before today and ends the Friday before today. */ goog.date.DateRange.lastBusinessWeek = function(opt_today) { @@ -293,7 +306,7 @@ goog.date.DateRange.lastBusinessWeek = function(opt_today) { * December 31, 9999. * @param {goog.date.Date=} opt_today The date to consider today. * Defaults to today. - * @return {goog.date.DateRange} The range that includes all days between + * @return {!goog.date.DateRange} The range that includes all days between * January 1, 1900 and December 31, 9999. */ goog.date.DateRange.allTime = function(opt_today) { @@ -326,7 +339,7 @@ goog.date.DateRange.StandardDateRangeKeys = { * @param {string} dateRangeKey A standard date range key. * @param {goog.date.Date=} opt_today The date to consider today. * Defaults to today. - * @return {goog.date.DateRange} The date range that corresponds to that key. + * @return {!goog.date.DateRange} The date range that corresponds to that key. * @throws {Error} If no standard date range with that key exists. */ goog.date.DateRange.standardDateRange = function(dateRangeKey, opt_today) { @@ -382,6 +395,7 @@ goog.date.DateRange.cloneOrCreate_ = function(opt_today) { * @constructor * @extends {goog.iter.Iterator} * @param {goog.date.DateRange} dateRange The date range to iterate. + * @final */ goog.date.DateRange.Iterator = function(dateRange) { /** diff --git a/third_party/closure/goog/date/duration.js b/third_party/closure/goog/date/duration.js new file mode 100644 index 0000000000000..62ad584ab7457 --- /dev/null +++ b/third_party/closure/goog/date/duration.js @@ -0,0 +1,153 @@ +// Copyright 2013 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 Functions for formatting duration values. Such as "3 days" + * "3 hours", "14 minutes", "2 hours 45 minutes". + * + */ + +goog.provide('goog.date.duration'); + +goog.require('goog.i18n.DateTimeFormat'); +goog.require('goog.i18n.MessageFormat'); + + +/** + * Number of milliseconds in a minute. + * @type {number} + * @private + */ +goog.date.duration.MINUTE_MS_ = 60000; + + +/** + * Number of milliseconds in an hour. + * @type {number} + * @private + */ +goog.date.duration.HOUR_MS_ = 3600000; + + +/** + * Number of milliseconds in a day. + * @type {number} + * @private + */ +goog.date.duration.DAY_MS_ = 86400000; + + +/** + * Accepts a duration in milliseconds and outputs an absolute duration time in + * form of "1 day", "2 hours", "20 minutes", "2 days 1 hour 15 minutes" etc. + * @param {number} durationMs Duration in milliseconds. + * @return {string} The formatted duration. + */ +goog.date.duration.format = function(durationMs) { + var ms = Math.abs(durationMs); + + // Handle durations shorter than 1 minute. + if (ms < goog.date.duration.MINUTE_MS_) { + /** + * @desc Duration time of zero minutes. + */ + var MSG_ZERO_MINUTES = goog.getMsg('0 minutes'); + return MSG_ZERO_MINUTES; + } + + var days = Math.floor(ms / goog.date.duration.DAY_MS_); + ms %= goog.date.duration.DAY_MS_; + + var hours = Math.floor(ms / goog.date.duration.HOUR_MS_); + ms %= goog.date.duration.HOUR_MS_; + + var minutes = Math.floor(ms / goog.date.duration.MINUTE_MS_); + + // Localized number representations. + var daysText = goog.i18n.DateTimeFormat.localizeNumbers(days); + var hoursText = goog.i18n.DateTimeFormat.localizeNumbers(hours); + var minutesText = goog.i18n.DateTimeFormat.localizeNumbers(minutes); + + // We need a space after the days if there are hours or minutes to come. + var daysSeparator = days * (hours + minutes) ? ' ' : ''; + // We need a space after the hours if there are minutes to come. + var hoursSeparator = hours * minutes ? ' ' : ''; + + /** + * @desc The days part of the duration message: 1 day, 5 days. + */ + var MSG_DURATION_DAYS = goog.getMsg( + '{COUNT, plural, ' + + '=0 {}' + + '=1 {{TEXT} day}' + + 'other {{TEXT} days}}'); + /** + * @desc The hours part of the duration message: 1 hour, 5 hours. + */ + var MSG_DURATION_HOURS = goog.getMsg( + '{COUNT, plural, ' + + '=0 {}' + + '=1 {{TEXT} hour}' + + 'other {{TEXT} hours}}'); + /** + * @desc The minutes part of the duration message: 1 minute, 5 minutes. + */ + var MSG_DURATION_MINUTES = goog.getMsg( + '{COUNT, plural, ' + + '=0 {}' + + '=1 {{TEXT} minute}' + + 'other {{TEXT} minutes}}'); + + var daysPart = goog.date.duration.getDurationMessagePart_( + MSG_DURATION_DAYS, days, daysText); + var hoursPart = goog.date.duration.getDurationMessagePart_( + MSG_DURATION_HOURS, hours, hoursText); + var minutesPart = goog.date.duration.getDurationMessagePart_( + MSG_DURATION_MINUTES, minutes, minutesText); + + /** + * @desc Duration time text concatenated from the individual time unit message + * parts. The separator will be a space (e.g. '1 day 2 hours 24 minutes') or + * nothing in case one/two of the duration parts is empty ( + * e.g. '1 hour 30 minutes', '3 days 15 minutes', '2 hours'). + */ + var MSG_CONCATENATED_DURATION_TEXT = goog.getMsg( + '{$daysPart}{$daysSeparator}{$hoursPart}{$hoursSeparator}{$minutesPart}', + { + 'daysPart': daysPart, + 'daysSeparator': daysSeparator, + 'hoursPart': hoursPart, + 'hoursSeparator': hoursSeparator, + 'minutesPart': minutesPart + }); + + return MSG_CONCATENATED_DURATION_TEXT; +}; + + +/** + * Gets a duration message part for a time unit. + * @param {string} pattern The pattern to apply. + * @param {number} count The number of units. + * @param {string} text The string to use for amount of units in the message. + * @return {string} The formatted message part. + * @private + */ +goog.date.duration.getDurationMessagePart_ = function(pattern, count, text) { + var formatter = new goog.i18n.MessageFormat(pattern); + return formatter.format({ + 'COUNT': count, + 'TEXT': text + }); +}; diff --git a/third_party/closure/goog/date/relative.js b/third_party/closure/goog/date/relative.js index 27ca2cf669784..9485794b7d58a 100644 --- a/third_party/closure/goog/date/relative.js +++ b/third_party/closure/goog/date/relative.js @@ -16,9 +16,15 @@ * @fileoverview Functions for formatting relative dates. Such as "3 days ago" * "3 hours ago", "14 minutes ago", "12 days ago", "Today", "Yesterday". * + * For better quality localization of plurals ("hours"/"minutes"/"days") and + * to use local digits, goog.date.relativeWithPlurals can be loaded in addition + * to this namespace. + * */ goog.provide('goog.date.relative'); +goog.provide('goog.date.relative.TimeDeltaFormatter'); +goog.provide('goog.date.relative.Unit'); goog.require('goog.i18n.DateTimeFormat'); @@ -42,9 +48,8 @@ goog.date.relative.DAY_MS_ = 86400000; /** * Enumeration used to identify time units internally. * @enum {number} - * @private */ -goog.date.relative.Unit_ = { +goog.date.relative.Unit = { MINUTES: 0, HOURS: 1, DAYS: 2 @@ -75,6 +80,31 @@ goog.date.relative.shortTimeFormatter_; goog.date.relative.monthDateFormatter_; +/** + * @typedef {function(number, boolean, goog.date.relative.Unit): string} + */ +goog.date.relative.TimeDeltaFormatter; + + +/** + * Handles formatting of time deltas. + * @private {goog.date.relative.TimeDeltaFormatter} + */ +goog.date.relative.formatTimeDelta_; + + +/** + * Sets a different formatting function for time deltas ("3 days ago"). + * While its visibility is public, this function is Closure-internal and should + * not be used in application code. + * @param {goog.date.relative.TimeDeltaFormatter} formatter The function to use + * for formatting time deltas (i.e. relative times). + */ +goog.date.relative.setTimeDeltaFormatter = function(formatter) { + goog.date.relative.formatTimeDelta_ = formatter; +}; + + /** * Returns a date in month format, e.g. Mar 15. * @param {Date} date The date object. @@ -128,7 +158,6 @@ goog.date.relative.formatFullDate_ = function(date) { * @return {string} The formatted date. */ goog.date.relative.format = function(dateMs) { - var now = goog.now(); var delta = Math.floor((now - dateMs) / goog.date.relative.MINUTE_MS_); @@ -140,14 +169,14 @@ goog.date.relative.format = function(dateMs) { } if (delta < 60) { // Minutes. - return goog.date.relative.getMessage_( - delta, future, goog.date.relative.Unit_.MINUTES); + return goog.date.relative.formatTimeDelta_( + delta, future, goog.date.relative.Unit.MINUTES); } else { delta = Math.floor(delta / 60); if (delta < 24) { // Hours. - return goog.date.relative.getMessage_( - delta, future, goog.date.relative.Unit_.HOURS); + return goog.date.relative.formatTimeDelta_( + delta, future, goog.date.relative.Unit.HOURS); } else { // We can be more than 24 hours apart but still only 1 day apart, so we @@ -169,8 +198,8 @@ goog.date.relative.format = function(dateMs) { // Uses days for less than 2-weeks. if (delta < 14) { - return goog.date.relative.getMessage_( - delta, future, goog.date.relative.Unit_.DAYS); + return goog.date.relative.formatTimeDelta_( + delta, future, goog.date.relative.Unit.DAYS); } else { // For messages older than 2 weeks do not show anything. The client @@ -205,15 +234,14 @@ goog.date.relative.formatPast = function(dateMs) { /** * Accepts a timestamp in milliseconds and outputs a relative day. i.e. "Today", - * "Yesterday" or "Sept 15". + * "Yesterday", "Tomorrow", or "Sept 15". * * @param {number} dateMs Date in milliseconds. - * @param {!function(!Date):string=} opt_formatter Formatter for the date. + * @param {function(!Date):string=} opt_formatter Formatter for the date. * Defaults to form 'MMM dd'. * @return {string} The formatted date. */ goog.date.relative.formatDay = function(dateMs, opt_formatter) { - var message; var today = new Date(goog.now()); today.setHours(0); @@ -222,15 +250,26 @@ goog.date.relative.formatDay = function(dateMs, opt_formatter) { today.setMilliseconds(0); var yesterday = new Date(today.getTime() - goog.date.relative.DAY_MS_); - if (today.getTime() < dateMs) { + var tomorrow = new Date(today.getTime() + goog.date.relative.DAY_MS_); + var dayAfterTomorrow = new Date(today.getTime() + + 2 * goog.date.relative.DAY_MS_); + + var message; + if (dateMs >= tomorrow.getTime() && dateMs < dayAfterTomorrow.getTime()) { + /** @desc Tomorrow. */ + var MSG_TOMORROW = goog.getMsg('Tomorrow'); + message = MSG_TOMORROW; + } else if (dateMs >= today.getTime() && dateMs < tomorrow.getTime()) { /** @desc Today. */ var MSG_TODAY = goog.getMsg('Today'); message = MSG_TODAY; - } else if (yesterday.getTime() < dateMs) { + } else if (dateMs >= yesterday.getTime() && dateMs < today.getTime()) { /** @desc Yesterday. */ var MSG_YESTERDAY = goog.getMsg('Yesterday'); message = MSG_YESTERDAY; } else { + // If we don't have a special relative term for this date, then return the + // short date format (or a custom-formatted date). var formatFunction = opt_formatter || goog.date.relative.formatMonth_; message = formatFunction(new Date(dateMs)); } @@ -323,107 +362,122 @@ goog.date.relative.getDateString_ = function( }; +/* + * TODO(user): + * + * I think that this whole relative formatting should move to DateTimeFormat. + * But we would have to wait for the next version of CLDR, which is cleaning + * the data for relative dates (even ICU has incomplete support for this). + */ /** * Gets a localized relative date string for a given delta and unit. * @param {number} delta Number of minutes/hours/days. * @param {boolean} future Whether the delta is in the future. - * @param {goog.date.relative.Unit_} unit The units the delta is in. + * @param {goog.date.relative.Unit} unit The units the delta is in. * @return {string} The message. * @private */ goog.date.relative.getMessage_ = function(delta, future, unit) { - if (!future && unit == goog.date.relative.Unit_.MINUTES) { + var deltaFormatted = goog.i18n.DateTimeFormat.localizeNumbers(delta); + if (!future && unit == goog.date.relative.Unit.MINUTES) { /** * @desc Relative date indicating how many minutes ago something happened * (singular). */ var MSG_MINUTES_AGO_SINGULAR = - goog.getMsg('{$num} minute ago', {'num' : delta}); + goog.getMsg('{$num} minute ago', {'num' : deltaFormatted}); /** * @desc Relative date indicating how many minutes ago something happened * (plural). */ var MSG_MINUTES_AGO_PLURAL = - goog.getMsg('{$num} minutes ago', {'num' : delta}); + goog.getMsg('{$num} minutes ago', {'num' : deltaFormatted}); return delta == 1 ? MSG_MINUTES_AGO_SINGULAR : MSG_MINUTES_AGO_PLURAL; - } else if (future && unit == goog.date.relative.Unit_.MINUTES) { + } else if (future && unit == goog.date.relative.Unit.MINUTES) { /** * @desc Relative date indicating in how many minutes something happens * (singular). */ var MSG_IN_MINUTES_SINGULAR = - goog.getMsg('in {$num} minute', {'num' : delta}); + goog.getMsg('in {$num} minute', {'num' : deltaFormatted}); /** * @desc Relative date indicating in how many minutes something happens * (plural). */ var MSG_IN_MINUTES_PLURAL = - goog.getMsg('in {$num} minutes', {'num' : delta}); + goog.getMsg('in {$num} minutes', {'num' : deltaFormatted}); return delta == 1 ? MSG_IN_MINUTES_SINGULAR : MSG_IN_MINUTES_PLURAL; - } else if (!future && unit == goog.date.relative.Unit_.HOURS) { + } else if (!future && unit == goog.date.relative.Unit.HOURS) { /** * @desc Relative date indicating how many hours ago something happened * (singular). */ var MSG_HOURS_AGO_SINGULAR = - goog.getMsg('{$num} hour ago', {'num' : delta}); + goog.getMsg('{$num} hour ago', {'num' : deltaFormatted}); /** * @desc Relative date indicating how many hours ago something happened * (plural). */ - var MSG_HOURS_AGO_PLURAL = goog.getMsg('{$num} hours ago', {'num' : delta}); + var MSG_HOURS_AGO_PLURAL = + goog.getMsg('{$num} hours ago', {'num' : deltaFormatted}); return delta == 1 ? MSG_HOURS_AGO_SINGULAR : MSG_HOURS_AGO_PLURAL; - } else if (future && unit == goog.date.relative.Unit_.HOURS) { + } else if (future && unit == goog.date.relative.Unit.HOURS) { /** * @desc Relative date indicating in how many hours something happens * (singular). */ - var MSG_IN_HOURS_SINGULAR = goog.getMsg('in {$num} hour', {'num' : delta}); + var MSG_IN_HOURS_SINGULAR = + goog.getMsg('in {$num} hour', {'num' : deltaFormatted}); /** * @desc Relative date indicating in how many hours something happens * (plural). */ - var MSG_IN_HOURS_PLURAL = goog.getMsg('in {$num} hours', {'num' : delta}); + var MSG_IN_HOURS_PLURAL = + goog.getMsg('in {$num} hours', {'num' : deltaFormatted}); return delta == 1 ? MSG_IN_HOURS_SINGULAR : MSG_IN_HOURS_PLURAL; - } else if (!future && unit == goog.date.relative.Unit_.DAYS) { + } else if (!future && unit == goog.date.relative.Unit.DAYS) { /** * @desc Relative date indicating how many days ago something happened * (singular). */ - var MSG_DAYS_AGO_SINGULAR = goog.getMsg('{$num} day ago', {'num' : delta}); + var MSG_DAYS_AGO_SINGULAR = + goog.getMsg('{$num} day ago', {'num' : deltaFormatted}); /** * @desc Relative date indicating how many days ago something happened * (plural). */ - var MSG_DAYS_AGO_PLURAL = goog.getMsg('{$num} days ago', {'num' : delta}); + var MSG_DAYS_AGO_PLURAL = + goog.getMsg('{$num} days ago', {'num' : deltaFormatted}); return delta == 1 ? MSG_DAYS_AGO_SINGULAR : MSG_DAYS_AGO_PLURAL; - } else if (future && unit == goog.date.relative.Unit_.DAYS) { + } else if (future && unit == goog.date.relative.Unit.DAYS) { /** * @desc Relative date indicating in how many days something happens * (singular). */ - var MSG_IN_DAYS_SINGULAR = goog.getMsg('in {$num} day', {'num' : delta}); + var MSG_IN_DAYS_SINGULAR = + goog.getMsg('in {$num} day', {'num' : deltaFormatted}); /** * @desc Relative date indicating in how many days something happens * (plural). */ - var MSG_IN_DAYS_PLURAL = goog.getMsg('in {$num} days', {'num' : delta}); + var MSG_IN_DAYS_PLURAL = + goog.getMsg('in {$num} days', {'num' : deltaFormatted}); return delta == 1 ? MSG_IN_DAYS_SINGULAR : MSG_IN_DAYS_PLURAL; @@ -431,3 +485,5 @@ goog.date.relative.getMessage_ = function(delta, future, unit) { return ''; } }; + +goog.date.relative.setTimeDeltaFormatter(goog.date.relative.getMessage_); diff --git a/third_party/closure/goog/date/relativewithplurals.js b/third_party/closure/goog/date/relativewithplurals.js new file mode 100644 index 0000000000000..09a697eb5e53f --- /dev/null +++ b/third_party/closure/goog/date/relativewithplurals.js @@ -0,0 +1,120 @@ +// 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. + +/** + * @fileoverview Code to make goog.date.relative plurals-aware. + */ + +goog.provide('goog.date.relativeWithPlurals'); + +goog.require('goog.date.relative'); +goog.require('goog.date.relative.Unit'); +goog.require('goog.i18n.MessageFormat'); + + +/** + * Gets a localized relative date string for a given delta and unit. + * @param {number} delta Number of minutes/hours/days. + * @param {boolean} future Whether the delta is in the future. + * @param {goog.date.relative.Unit} unit The units the delta is in. + * @return {string} The message. + * @private + */ +goog.date.relativeWithPlurals.formatTimeDelta_ = + function(delta, future, unit) { + if (!future && unit == goog.date.relative.Unit.MINUTES) { + /** + * @desc Relative date indicating how many minutes ago something happened. + */ + var MSG_MINUTES_AGO_ICU = + goog.getMsg('{NUM, plural, ' + + '=0 {# minutes ago}' + + '=1 {# minute ago}' + + 'other {# minutes ago}}'); + + return new goog.i18n.MessageFormat(MSG_MINUTES_AGO_ICU). + format({'NUM': delta}); + + } else if (future && unit == goog.date.relative.Unit.MINUTES) { + /** + * @desc Relative date indicating in how many minutes something happens. + */ + var MSG_IN_MINUTES_ICU = + goog.getMsg('{NUM, plural, ' + + '=0 {in # minutes}' + + '=1 {in # minute}' + + 'other {in # minutes}}'); + + return new goog.i18n.MessageFormat(MSG_IN_MINUTES_ICU). + format({'NUM': delta}); + + } else if (!future && unit == goog.date.relative.Unit.HOURS) { + /** + * @desc Relative date indicating how many hours ago something happened. + */ + var MSG_HOURS_AGO_ICU = + goog.getMsg('{NUM, plural, ' + + '=0 {# hours ago}' + + '=1 {# hour ago}' + + 'other {# hours ago}}'); + + return new goog.i18n.MessageFormat(MSG_HOURS_AGO_ICU). + format({'NUM': delta}); + + } else if (future && unit == goog.date.relative.Unit.HOURS) { + /** + * @desc Relative date indicating in how many hours something happens. + */ + var MSG_IN_HOURS_ICU = + goog.getMsg('{NUM, plural, ' + + '=0 {in # hours}' + + '=1 {in # hour}' + + 'other {in # hours}}'); + + return new goog.i18n.MessageFormat(MSG_IN_HOURS_ICU). + format({'NUM': delta}); + + } else if (!future && unit == goog.date.relative.Unit.DAYS) { + /** + * @desc Relative date indicating how many days ago something happened. + */ + var MSG_DAYS_AGO_ICU = + goog.getMsg('{NUM, plural, ' + + '=0 {# days ago}' + + '=1 {# day ago}' + + 'other {# days ago}}'); + + return new goog.i18n.MessageFormat(MSG_DAYS_AGO_ICU). + format({'NUM': delta}); + + } else if (future && unit == goog.date.relative.Unit.DAYS) { + /** + * @desc Relative date indicating in how many days something happens. + */ + var MSG_IN_DAYS_ICU = + goog.getMsg('{NUM, plural, ' + + '=0 {in # days}' + + '=1 {in # day}' + + 'other {in # days}}'); + + return new goog.i18n.MessageFormat(MSG_IN_DAYS_ICU). + format({'NUM': delta}); + + } else { + return ''; + } +}; + +goog.date.relative.setTimeDeltaFormatter( + goog.date.relativeWithPlurals.formatTimeDelta_); diff --git a/third_party/closure/goog/date/utcdatetime.js b/third_party/closure/goog/date/utcdatetime.js index b17fe6354e90b..0c3ca39d1ce38 100644 --- a/third_party/closure/goog/date/utcdatetime.js +++ b/third_party/closure/goog/date/utcdatetime.js @@ -53,11 +53,22 @@ goog.date.UtcDateTime = function(opt_year, opt_month, opt_date, opt_hours, } else { timestamp = opt_year ? opt_year.getTime() : goog.now(); } - this.date_ = new Date(timestamp); + this.date = new Date(timestamp); }; goog.inherits(goog.date.UtcDateTime, goog.date.DateTime); +/** + * @param {number} timestamp Number of milliseconds since Epoch. + * @return {!goog.date.UtcDateTime} + */ +goog.date.UtcDateTime.fromTimestamp = function(timestamp) { + var date = new goog.date.UtcDateTime(); + date.setTime(timestamp); + return date; +}; + + /** * Creates a DateTime from a UTC datetime string expressed in ISO 8601 format. * @@ -77,7 +88,7 @@ goog.date.UtcDateTime.fromIsoString = function(formatted) { * @override */ goog.date.UtcDateTime.prototype.clone = function() { - var date = new goog.date.UtcDateTime(this.date_); + var date = new goog.date.UtcDateTime(this.date); date.setFirstDayOfWeek(this.getFirstDayOfWeek()); date.setFirstWeekCutOffDay(this.getFirstWeekCutOffDay()); return date; @@ -94,7 +105,7 @@ goog.date.UtcDateTime.prototype.add = function(interval) { interval.seconds + 60 * ( interval.minutes + 60 * ( interval.hours + 24 * interval.days))); - this.date_ = new Date(this.date_.getTime() + daysAndTimeMillis); + this.date = new Date(this.date.getTime() + daysAndTimeMillis); }; diff --git a/third_party/closure/goog/db/cursor.js b/third_party/closure/goog/db/cursor.js index 868f9d5923710..d8a4da78676a3 100644 --- a/third_party/closure/goog/db/cursor.js +++ b/third_party/closure/goog/db/cursor.js @@ -34,9 +34,10 @@ goog.require('goog.events.EventTarget'); * * @constructor * @extends {goog.events.EventTarget} + * @final */ goog.db.Cursor = function() { - goog.base(this); + goog.db.Cursor.base(this, 'constructor'); }; goog.inherits(goog.db.Cursor, goog.events.EventTarget); diff --git a/third_party/closure/goog/db/db.js b/third_party/closure/goog/db/db.js index 0077c56fdffce..5c8d983308dec 100644 --- a/third_party/closure/goog/db/db.js +++ b/third_party/closure/goog/db/db.js @@ -159,7 +159,7 @@ goog.db.openDatabase = function(name, opt_version, opt_onUpgradeNeeded, * @param {string} name The name of the database to delete. * @param {goog.db.BlockedCallback=} opt_onBlocked Called if there are active * connections to the database. - * @return {goog.async.Deferred} A deferred object that will fire once the + * @return {!goog.async.Deferred} A deferred object that will fire once the * database is deleted. */ goog.db.deleteDatabase = function(name, opt_onBlocked) { diff --git a/third_party/closure/goog/db/error.js b/third_party/closure/goog/db/error.js index a5c93166a3d55..62c480554c2e1 100644 --- a/third_party/closure/goog/db/error.js +++ b/third_party/closure/goog/db/error.js @@ -37,6 +37,7 @@ goog.require('goog.debug.Error'); * @param {string=} opt_message Additional message. * @constructor * @extends {goog.debug.Error} + * @final */ goog.db.Error = function(error, context, opt_message) { var errorCode = null; @@ -68,7 +69,7 @@ goog.db.Error = function(error, context, opt_message) { if (opt_message) { msg += ', ' + opt_message; } - goog.base(this, msg); + goog.db.Error.base(this, 'constructor', msg); }; goog.inherits(goog.db.Error, goog.debug.Error); @@ -89,9 +90,11 @@ goog.db.Error.prototype.getName = function() { * * @constructor * @extends {goog.debug.Error} + * @final */ goog.db.Error.VersionChangeBlockedError = function() { - goog.base(this, 'Version change blocked'); + goog.db.Error.VersionChangeBlockedError.base( + this, 'constructor', 'Version change blocked'); }; goog.inherits(goog.db.Error.VersionChangeBlockedError, goog.debug.Error); @@ -345,13 +348,15 @@ goog.db.Error.fromRequest = function(request, message) { */ goog.db.Error.fromException = function(ex, message) { if ('name' in ex) { - // Chrome 21 and before. - return new goog.db.Error(/** @type {!DOMError} */ (ex), message); - } else if ('code' in ex) { // Chrome 22+. + var errorMessage = message + ': ' + ex.message; + return new goog.db.Error(/** @type {!DOMError} */ (ex), errorMessage); + } else if ('code' in ex) { + // Chrome 21 and before. var errorName = goog.db.Error.getName(ex.code); + var errorMessage = message + ': ' + ex.message; return new goog.db.Error( - /** @type {!DOMError} */ ({name: errorName}), message); + /** @type {!DOMError} */ ({name: errorName}), errorMessage); } else { return new goog.db.Error(/** @type {!DOMError} */ ( {name: goog.db.Error.ErrorName.UNKNOWN_ERR}), message); diff --git a/third_party/closure/goog/db/index.js b/third_party/closure/goog/db/index.js index 59a688efb48b5..7951e2498e437 100644 --- a/third_party/closure/goog/db/index.js +++ b/third_party/closure/goog/db/index.js @@ -36,6 +36,7 @@ goog.require('goog.debug'); * * @param {!IDBIndex} index Underlying IDBIndex object. * @constructor + * @final */ goog.db.Index = function(index) { /** diff --git a/third_party/closure/goog/db/indexeddb.js b/third_party/closure/goog/db/indexeddb.js index 07aba3fe09018..967a682aefbf2 100644 --- a/third_party/closure/goog/db/indexeddb.js +++ b/third_party/closure/goog/db/indexeddb.js @@ -22,10 +22,8 @@ goog.provide('goog.db.IndexedDb'); goog.require('goog.async.Deferred'); goog.require('goog.db.Error'); -goog.require('goog.db.Error.VersionChangeBlockedError'); goog.require('goog.db.ObjectStore'); goog.require('goog.db.Transaction'); -goog.require('goog.db.Transaction.TransactionMode'); goog.require('goog.events.Event'); goog.require('goog.events.EventHandler'); goog.require('goog.events.EventTarget'); @@ -41,9 +39,10 @@ goog.require('goog.events.EventTarget'); * @param {!IDBDatabase} db Underlying IndexedDB database object. * @constructor * @extends {goog.events.EventTarget} + * @final */ goog.db.IndexedDb = function(db) { - goog.base(this); + goog.db.IndexedDb.base(this, 'constructor'); /** * Underlying IndexedDB database object. @@ -55,7 +54,7 @@ goog.db.IndexedDb = function(db) { /** * Internal event handler that listens to IDBDatabase events. - * @type {!goog.events.EventHandler} + * @type {!goog.events.EventHandler.} * @private */ this.eventHandler_ = new goog.events.EventHandler(this); @@ -75,6 +74,13 @@ goog.db.IndexedDb = function(db) { this.db_, goog.db.IndexedDb.EventType.VERSION_CHANGE, this.dispatchVersionChange_); + this.eventHandler_.listen( + this.db_, + goog.db.IndexedDb.EventType.CLOSE, + goog.bind( + this.dispatchEvent, + this, + goog.db.IndexedDb.EventType.CLOSE)); }; goog.inherits(goog.db.IndexedDb, goog.events.EventTarget); @@ -172,7 +178,7 @@ goog.db.IndexedDb.prototype.getObjectStoreNames = function() { * whether the object store should automatically generate keys for stored * objects. If keyPath is not provided and autoIncrement is false, then all * insert operations must provide a key as a parameter. - * @return {goog.db.ObjectStore} The newly created object store. + * @return {!goog.db.ObjectStore} The newly created object store. * @throws {goog.db.Error} If there's a problem creating the object store. */ goog.db.IndexedDb.prototype.createObjectStore = function(name, opt_params) { @@ -274,7 +280,7 @@ goog.db.IndexedDb.prototype.createTransaction = function(storeNames, opt_mode) { /** @override */ goog.db.IndexedDb.prototype.disposeInternal = function() { - goog.base(this, 'disposeInternal'); + goog.db.IndexedDb.base(this, 'disposeInternal'); this.eventHandler_.dispose(); }; @@ -291,6 +297,14 @@ goog.db.IndexedDb.EventType = { */ ABORT: 'abort', + /** + * Fired when the database connection is forcibly closed by the browser, + * without an explicit call to IDBDatabase#close. This behavior is not in the + * spec yet but will be added since it is necessary, see + * https://www.w3.org/Bugs/Public/show_bug.cgi?id=22540. + */ + CLOSE: 'close', + /** * Fired when a transaction has an error. */ @@ -318,9 +332,11 @@ goog.db.IndexedDb.EventType = { * updated to. * @constructor * @extends {goog.events.Event} + * @final */ goog.db.IndexedDb.VersionChangeEvent = function(oldVersion, newVersion) { - goog.base(this, goog.db.IndexedDb.EventType.VERSION_CHANGE); + goog.db.IndexedDb.VersionChangeEvent.base( + this, 'constructor', goog.db.IndexedDb.EventType.VERSION_CHANGE); /** * The previous version of the database. diff --git a/third_party/closure/goog/db/keyrange.js b/third_party/closure/goog/db/keyrange.js index 18c3995ad1be9..d1e40991a539c 100644 --- a/third_party/closure/goog/db/keyrange.js +++ b/third_party/closure/goog/db/keyrange.js @@ -30,6 +30,7 @@ goog.provide('goog.db.KeyRange'); * * @param {!IDBKeyRange} range Underlying IDBKeyRange object. * @constructor + * @final */ goog.db.KeyRange = function(range) { /** diff --git a/third_party/closure/goog/db/objectstore.js b/third_party/closure/goog/db/objectstore.js index 2e6277a8cb80d..5ff9695333a5b 100644 --- a/third_party/closure/goog/db/objectstore.js +++ b/third_party/closure/goog/db/objectstore.js @@ -45,6 +45,7 @@ goog.require('goog.events'); * TODO(user): revisit msg in exception and errors in this class. In newer * Chrome (v22+) the error/request come with a DOM error string that is * already very descriptive. + * @final */ goog.db.ObjectStore = function(store) { /** @@ -322,7 +323,7 @@ goog.db.ObjectStore.prototype.clear = function() { * available option is unique, which defaults to false. If unique is true, * the index will enforce that there is only ever one object in the object * store for each unique value it indexes on. - * @return {goog.db.Index} The newly created, wrapped index. + * @return {!goog.db.Index} The newly created, wrapped index. * @throws {goog.db.Error} In case of an error creating the index. */ goog.db.ObjectStore.prototype.createIndex = function( @@ -341,7 +342,7 @@ goog.db.ObjectStore.prototype.createIndex = function( * Gets an index. * * @param {string} name Name of the index to fetch. - * @return {goog.db.Index} The requested wrapped index. + * @return {!goog.db.Index} The requested wrapped index. * @throws {goog.db.Error} In case of an error getting the index. */ goog.db.ObjectStore.prototype.getIndex = function(name) { diff --git a/third_party/closure/goog/db/transaction.js b/third_party/closure/goog/db/transaction.js index 6e5e60ffc8e1a..d9a9d381e9bed 100644 --- a/third_party/closure/goog/db/transaction.js +++ b/third_party/closure/goog/db/transaction.js @@ -39,9 +39,10 @@ goog.require('goog.events.EventTarget'); * @param {!goog.db.IndexedDb} db The database that this transaction modifies. * @constructor * @extends {goog.events.EventTarget} + * @final */ goog.db.Transaction = function(tx, db) { - goog.base(this); + goog.db.Transaction.base(this, 'constructor'); /** * Underlying IndexedDB transaction object. @@ -62,7 +63,7 @@ goog.db.Transaction = function(tx, db) { /** * Event handler for this transaction. * - * @type {!goog.events.EventHandler} + * @type {!goog.events.EventHandler.} * @private */ this.eventHandler_ = new goog.events.EventHandler(this); @@ -200,7 +201,7 @@ goog.db.Transaction.prototype.abort = function() { /** @override */ goog.db.Transaction.prototype.disposeInternal = function() { - goog.base(this, 'disposeInternal'); + goog.db.Transaction.base(this, 'disposeInternal'); this.eventHandler_.dispose(); }; diff --git a/third_party/closure/goog/debug/debug.js b/third_party/closure/goog/debug/debug.js index d7325268ca5bc..e6e28e13c3871 100644 --- a/third_party/closure/goog/debug/debug.js +++ b/third_party/closure/goog/debug/debug.js @@ -52,14 +52,44 @@ goog.debug.catchErrors = function(logFunc, opt_cancel, opt_target) { !goog.userAgent.isVersionOrHigher('535.3')) { retVal = !retVal; } - target.onerror = function(message, url, line) { + + /** + * New onerror handler for this target. This onerror handler follows the spec + * according to + * http://www.whatwg.org/specs/web-apps/current-work/#runtime-script-errors + * The spec was changed in August 2013 to support receiving column information + * and an error object for all scripts on the same origin or cross origin + * scripts with the proper headers. See + * https://mikewest.org/2013/08/debugging-runtime-errors-with-window-onerror + * + * @param {string} message The error message. For cross-origin errors, this + * will be scrubbed to just "Script error.". For new browsers that have + * updated to follow the latest spec, errors that come from origins that + * have proper cross origin headers will not be scrubbed. + * @param {string} url The URL of the script that caused the error. The URL + * will be scrubbed to "" for cross origin scripts unless the script has + * proper cross origin headers and the browser has updated to the latest + * spec. + * @param {number} line The line number in the script that the error + * occurred on. + * @param {number=} opt_col The optional column number that the error + * occurred on. Only browsers that have updated to the latest spec will + * include this. + * @param {Error=} opt_error The optional actual error object for this + * error that should include the stack. Only browsers that have updated + * to the latest spec will inlude this parameter. + * @return {boolean} Whether to prevent the error from reaching the browser. + */ + target.onerror = function(message, url, line, opt_col, opt_error) { if (oldErrorHandler) { - oldErrorHandler(message, url, line); + oldErrorHandler(message, url, line, opt_col, opt_error); } logFunc({ message: message, fileName: url, - line: line + line: line, + col: opt_col, + error: opt_error }); return retVal; }; @@ -111,11 +141,11 @@ goog.debug.expose = function(obj, opt_showFn) { * @return {string} A string representation of {@code obj}. */ goog.debug.deepExpose = function(obj, opt_showFn) { - var previous = new goog.structs.Set(); var str = []; - var helper = function(obj, space) { + var helper = function(obj, space, parentSeen) { var nestspace = space + ' '; + var seen = new goog.structs.Set(parentSeen); var indentMultiline = function(str) { return str.replace(/\n/g, '\n' + space); @@ -132,12 +162,10 @@ goog.debug.deepExpose = function(obj, opt_showFn) { } else if (goog.isFunction(obj)) { str.push(indentMultiline(String(obj))); } else if (goog.isObject(obj)) { - if (previous.contains(obj)) { - // TODO(user): This is a bug; it falsely detects non-loops as loops - // when the reference tree contains two references to the same object. + if (seen.contains(obj)) { str.push('*** reference loop detected ***'); } else { - previous.add(obj); + seen.add(obj); str.push('{'); for (var x in obj) { if (!opt_showFn && goog.isFunction(obj[x])) { @@ -146,7 +174,7 @@ goog.debug.deepExpose = function(obj, opt_showFn) { str.push('\n'); str.push(nestspace); str.push(x + ' = '); - helper(obj[x], nestspace); + helper(obj[x], nestspace, seen); } str.push('\n' + space + '}'); } @@ -158,7 +186,7 @@ goog.debug.deepExpose = function(obj, opt_showFn) { } }; - helper(obj, ''); + helper(obj, '', new goog.structs.Set()); return str.join(''); }; @@ -210,7 +238,7 @@ goog.debug.exposeException = function(err, opt_fn) { /** * Normalizes the error/exception object between browsers. * @param {Object} err Raw error object. - * @return {Object} Normalized error object. + * @return {!Object} Normalized error object. */ goog.debug.normalizeErrorObject = function(err) { var href = goog.getObjectByName('window.location.href'); @@ -249,10 +277,11 @@ goog.debug.normalizeErrorObject = function(err) { // The IE Error object contains only the name and the message. // The Safari Error object uses the line and sourceURL fields. - if (threwError || !err.lineNumber || !err.fileName || !err.stack) { + if (threwError || !err.lineNumber || !err.fileName || !err.stack || + !err.message || !err.name) { return { - 'message': err.message, - 'name': err.name, + 'message': err.message || 'Not available', + 'name': err.name || 'UnknownError', 'lineNumber': lineNumber, 'fileName': fileName, 'stack': err.stack || 'Not available' @@ -271,14 +300,24 @@ goog.debug.normalizeErrorObject = function(err) { * @param {Error|string} err the original thrown object or string. * @param {string=} opt_message optional additional message to add to the * error. - * @return {Error} If err is a string, it is used to create a new Error, + * @return {!Error} If err is a string, it is used to create a new Error, * which is enhanced and returned. Otherwise err itself is enhanced * and returned. */ goog.debug.enhanceError = function(err, opt_message) { - var error = typeof err == 'string' ? Error(err) : err; + var error; + if (typeof err == 'string') { + error = Error(err); + if (Error.captureStackTrace) { + // Trim this function off the call stack, if we can. + Error.captureStackTrace(error, goog.debug.enhanceError); + } + } else { + error = err; + } + if (!error.stack) { - error.stack = goog.debug.getStacktrace(arguments.callee.caller); + error.stack = goog.debug.getStacktrace(goog.debug.enhanceError); } if (opt_message) { // find the first unoccupied 'messageX' property @@ -298,8 +337,18 @@ goog.debug.enhanceError = function(err, opt_message) { * @param {number=} opt_depth Optional maximum depth to trace back to. * @return {string} A string with the function names of all functions in the * stack, separated by \n. + * @suppress {es5Strict} */ goog.debug.getStacktraceSimple = function(opt_depth) { + if (goog.STRICT_MODE_COMPATIBLE) { + var stack = goog.debug.getNativeStackTrace_(goog.debug.getStacktraceSimple); + if (stack) { + return stack; + } + // NOTE: browsers that have strict mode support also have native "stack" + // properties. Fall-through for legacy browser support. + } + var sb = []; var fn = arguments.callee.caller; var depth = 0; @@ -337,15 +386,54 @@ goog.debug.getStacktraceSimple = function(opt_depth) { goog.debug.MAX_STACK_DEPTH = 50; +/** + * @param {Function} fn The function to start getting the trace from. + * @return {?string} + * @private + */ +goog.debug.getNativeStackTrace_ = function(fn) { + var tempErr = new Error(); + if (Error.captureStackTrace) { + Error.captureStackTrace(tempErr, fn); + return String(tempErr.stack); + } else { + // IE10, only adds stack traces when an exception is thrown. + try { + throw tempErr; + } catch (e) { + tempErr = e; + } + var stack = tempErr.stack; + if (stack) { + return String(stack); + } + } + return null; +}; + + /** * Gets the current stack trace, either starting from the caller or starting * from a specified function that's currently on the call stack. * @param {Function=} opt_fn Optional function to start getting the trace from. * If not provided, defaults to the function that called this. * @return {string} Stack trace. + * @suppress {es5Strict} */ goog.debug.getStacktrace = function(opt_fn) { - return goog.debug.getStacktraceHelper_(opt_fn || arguments.callee.caller, []); + var stack; + if (goog.STRICT_MODE_COMPATIBLE) { + // Try to get the stack trace from the environment if it is available. + var contextFn = opt_fn || goog.debug.getStacktrace; + stack = goog.debug.getNativeStackTrace_(contextFn); + } + if (!stack) { + // NOTE: browsers that have strict mode support also have native "stack" + // properties. This function will throw in strict mode. + stack = goog.debug.getStacktraceHelper_( + opt_fn || arguments.callee.caller, []); + } + return stack; }; @@ -354,6 +442,7 @@ goog.debug.getStacktrace = function(opt_fn) { * @param {Function} fn Function to start getting the trace from. * @param {Array} visited List of functions visited so far. * @return {string} Stack trace starting from function fn. + * @suppress {es5Strict} * @private */ goog.debug.getStacktraceHelper_ = function(fn, visited) { @@ -368,7 +457,8 @@ goog.debug.getStacktraceHelper_ = function(fn, visited) { } else if (fn && visited.length < goog.debug.MAX_STACK_DEPTH) { sb.push(goog.debug.getFunctionName(fn) + '('); var args = fn.arguments; - for (var i = 0; i < args.length; i++) { + // Args may be null for some special functions such as host objects or eval. + for (var i = 0; args && i < args.length; i++) { if (i > 0) { sb.push(', '); } diff --git a/third_party/closure/goog/debug/debugwindow.js b/third_party/closure/goog/debug/debugwindow.js index a7d454eca3d34..aa8b192fdefaf 100644 --- a/third_party/closure/goog/debug/debugwindow.js +++ b/third_party/closure/goog/debug/debugwindow.js @@ -136,9 +136,8 @@ goog.debug.DebugWindow.prototype.enableOnSevere_ = false; * Reference to debug window * @type {Window} * @protected - * @suppress {underscore} */ -goog.debug.DebugWindow.prototype.win_ = null; +goog.debug.DebugWindow.prototype.win = null; /** @@ -303,7 +302,7 @@ goog.debug.DebugWindow.prototype.addSeparator = function() { * @return {boolean} Whether there is an active window. */ goog.debug.DebugWindow.prototype.hasActiveWindow = function() { - return !!this.win_ && !this.win_.closed; + return !!this.win && !this.win.closed; }; @@ -381,15 +380,15 @@ goog.debug.DebugWindow.prototype.writeToLog_ = function(html) { goog.debug.DebugWindow.prototype.writeBufferToLog = function() { this.lastCall = goog.now(); if (this.hasActiveWindow()) { - var body = this.win_.document.body; + var body = this.win.document.body; var scroll = body && body.scrollHeight - (body.scrollTop + body.clientHeight) <= 100; - this.win_.document.write(this.outputBuffer.join('')); + this.win.document.write(this.outputBuffer.join('')); this.outputBuffer.length = 0; if (scroll) { - this.win_.scrollTo(0, 1000000); + this.win.scrollTo(0, 1000000); } } }; @@ -423,12 +422,12 @@ goog.debug.DebugWindow.prototype.openWindow_ = function() { var h = Number(winpos[3]); this.winOpening_ = true; - this.win_ = window.open('', this.getWindowName_(), 'width=' + w + + this.win = window.open('', this.getWindowName_(), 'width=' + w + ',height=' + h + ',toolbar=no,resizable=yes,' + 'scrollbars=yes,left=' + x + ',top=' + y + ',status=no,screenx=' + x + ',screeny=' + y); - if (!this.win_) { + if (!this.win) { if (!this.showedBlockedAlert_) { // only show this once alert('Logger popup was blocked'); @@ -438,7 +437,7 @@ goog.debug.DebugWindow.prototype.openWindow_ = function() { this.winOpening_ = false; - if (this.win_) { + if (this.win) { this.writeInitialDocument(); } }; @@ -480,7 +479,7 @@ goog.debug.DebugWindow.prototype.writeInitialDocument = function() { return; } - this.win_.document.open(); + this.win.document.open(); var html = '' + '


' + @@ -577,10 +576,10 @@ goog.debug.DebugWindow.prototype.saveWindowPositionSize_ = function() { if (!this.hasActiveWindow()) { return; } - var x = this.win_.screenX || this.win_.screenLeft || 0; - var y = this.win_.screenY || this.win_.screenTop || 0; - var w = this.win_.outerWidth || 800; - var h = this.win_.outerHeight || 500; + var x = this.win.screenX || this.win.screenLeft || 0; + var y = this.win.screenY || this.win.screenTop || 0; + var w = this.win.outerWidth || 800; + var h = this.win.outerHeight || 500; this.setCookie_('dbg', x + ',' + y + ',' + w + ',' + h); }; diff --git a/third_party/closure/goog/debug/devcss/devcss.js b/third_party/closure/goog/debug/devcss/devcss.js index 6fc206ad21862..715a6720426da 100644 --- a/third_party/closure/goog/debug/devcss/devcss.js +++ b/third_party/closure/goog/debug/devcss/devcss.js @@ -25,8 +25,9 @@ goog.provide('goog.debug.DevCss'); goog.provide('goog.debug.DevCss.UserAgent'); +goog.require('goog.asserts'); goog.require('goog.cssom'); -goog.require('goog.dom.classes'); +goog.require('goog.dom.classlist'); goog.require('goog.events'); goog.require('goog.events.EventType'); goog.require('goog.string'); @@ -42,6 +43,7 @@ goog.require('goog.userAgent'); * If not passed in, will be determined using goog.userAgent. * @throws {Error} When userAgent detection fails. * @constructor + * @final */ goog.debug.DevCss = function(opt_userAgent, opt_userAgentVersion) { if (!opt_userAgent) { @@ -78,6 +80,12 @@ goog.debug.DevCss = function(opt_userAgent, opt_userAgentVersion) { */ this.userAgent_ = opt_userAgent; + /** + * @type {Object} + * @private + */ + this.userAgentTokens_ = {}; + /** * @type {number|string} * @private @@ -138,13 +146,6 @@ goog.debug.DevCss.prototype.activateBrowserSpecificCssRules = function( }; -/** - * @type {Object} - * @private - */ -goog.debug.DevCss.prototype.userAgentTokens_ = {}; - - /** * A list of possible user agent strings. * @enum {string} @@ -227,8 +228,8 @@ goog.debug.DevCss.prototype.getVersionNumberFromSelectorText_ = function( * value needed to determine if we have a match or not. * @param {CSSRule} cssRule The rule to test against. * @param {string} token The match token to test against the rule. - * @return {Array|undefined} A tuple with the result of the compareVersions call - * and the matched ruleVersion. + * @return {!Array|undefined} A tuple with the result of the compareVersions + * call and the matched ruleVersion. * @private */ goog.debug.DevCss.prototype.getRuleVersionAndCompare_ = function(cssRule, @@ -424,7 +425,7 @@ goog.debug.DevCss.prototype.addIe6CombinedClassNames_ = function() { var classNamesLength = classNameEntry.classNames.length; for (var k = 0, className; className = classNameEntry.classNames[k]; k++) { - if (!goog.dom.classes.has(el, className)) { + if (!goog.dom.classlist.contains(goog.asserts.assert(el), className)) { break; } if (k == classNamesLength - 1) { @@ -435,8 +436,10 @@ goog.debug.DevCss.prototype.addIe6CombinedClassNames_ = function() { // Walks over our matching nodes and fixes them. if (classNameEntry.els.length) { for (var j = 0, el; el = classNameEntry.els[j]; j++) { - if (!goog.dom.classes.has(el, classNameEntry.combinedClassName)) { - goog.dom.classes.add(el, classNameEntry.combinedClassName); + goog.asserts.assert(el); + if (!goog.dom.classlist.contains(el, + classNameEntry.combinedClassName)) { + goog.dom.classlist.add(el, classNameEntry.combinedClassName); } } } diff --git a/third_party/closure/goog/debug/divconsole.js b/third_party/closure/goog/debug/divconsole.js index c5e0efa0578a7..3732a2f633055 100644 --- a/third_party/closure/goog/debug/divconsole.js +++ b/third_party/closure/goog/debug/divconsole.js @@ -107,7 +107,7 @@ goog.debug.DivConsole.prototype.addLogRecord = function(logRecord) { /** * Gets the formatter for outputting to the console. The default formatter * is an instance of goog.debug.HtmlFormatter - * @return {goog.debug.Formatter} The formatter in use. + * @return {!goog.debug.Formatter} The formatter in use. */ goog.debug.DivConsole.prototype.getFormatter = function() { return this.formatter_; diff --git a/third_party/closure/goog/debug/error.js b/third_party/closure/goog/debug/error.js index dd32fdba2d75f..6fed470018e21 100644 --- a/third_party/closure/goog/debug/error.js +++ b/third_party/closure/goog/debug/error.js @@ -33,11 +33,14 @@ goog.provide('goog.debug.Error'); */ goog.debug.Error = function(opt_msg) { - // Ensure there is a stack trace. + // Attempt to ensure there is a stack trace. if (Error.captureStackTrace) { Error.captureStackTrace(this, goog.debug.Error); } else { - this.stack = new Error().stack || ''; + var stack = new Error().stack; + if (stack) { + this.stack = stack; + } } if (opt_msg) { diff --git a/third_party/closure/goog/debug/errorhandler.js b/third_party/closure/goog/debug/errorhandler.js index 59b0144f5c53d..47f83415bf6e4 100644 --- a/third_party/closure/goog/debug/errorhandler.js +++ b/third_party/closure/goog/debug/errorhandler.js @@ -45,7 +45,7 @@ goog.require('goog.debug.Trace'); * @implements {goog.debug.EntryPointMonitor} */ goog.debug.ErrorHandler = function(handler) { - goog.base(this); + goog.debug.ErrorHandler.base(this, 'constructor'); /** * Handler for exceptions, which can do logging, reporting, etc. @@ -257,16 +257,16 @@ goog.debug.ErrorHandler.prototype.protectWindowRequestAnimationFrame = for (var i = 0; i < fnNames.length; i++) { var fnName = fnNames[i]; if (fnNames[i] in win) { - win[fnName] = this.protectEntryPoint(win[fnName]); + this.protectWindowFunctionsHelper_(fnName); } } }; /** - * Helper function for protecting setTimeout/setInterval. - * @param {string} fnName The name of the function we're protecting. Must - * be setTimeout or setInterval. + * Helper function for protecting a function that causes a function to be + * asynchronously called, for example setTimeout or requestAnimationFrame. + * @param {string} fnName The name of the function to protect. * @private */ goog.debug.ErrorHandler.prototype.protectWindowFunctionsHelper_ = @@ -324,7 +324,7 @@ goog.debug.ErrorHandler.prototype.disposeInternal = function() { win.setTimeout = this.unwrap(win.setTimeout); win.setInterval = this.unwrap(win.setInterval); - goog.base(this, 'disposeInternal'); + goog.debug.ErrorHandler.base(this, 'disposeInternal'); }; @@ -335,11 +335,13 @@ goog.debug.ErrorHandler.prototype.disposeInternal = function() { * @param {*} cause The error thrown by the entry point. * @constructor * @extends {goog.debug.Error} + * @final */ goog.debug.ErrorHandler.ProtectedFunctionError = function(cause) { var message = goog.debug.ErrorHandler.ProtectedFunctionError.MESSAGE_PREFIX + (cause && cause.message ? String(cause.message) : String(cause)); - goog.base(this, message); + goog.debug.ErrorHandler.ProtectedFunctionError.base( + this, 'constructor', message); /** * The error thrown by the entry point. diff --git a/third_party/closure/goog/debug/errorreporter.js b/third_party/closure/goog/debug/errorreporter.js index f0e3ac0c94e86..86ae88b2249a0 100644 --- a/third_party/closure/goog/debug/errorreporter.js +++ b/third_party/closure/goog/debug/errorreporter.js @@ -21,13 +21,14 @@ goog.provide('goog.debug.ErrorReporter'); goog.provide('goog.debug.ErrorReporter.ExceptionEvent'); +goog.require('goog.asserts'); goog.require('goog.debug'); goog.require('goog.debug.ErrorHandler'); -goog.require('goog.debug.Logger'); goog.require('goog.debug.entryPointRegistry'); goog.require('goog.events'); goog.require('goog.events.Event'); goog.require('goog.events.EventTarget'); +goog.require('goog.log'); goog.require('goog.net.XhrIo'); goog.require('goog.object'); goog.require('goog.string'); @@ -54,7 +55,7 @@ goog.require('goog.userAgent'); */ goog.debug.ErrorReporter = function( handlerUrl, opt_contextProvider, opt_noAutoProtect) { - goog.base(this); + goog.debug.ErrorReporter.base(this, 'constructor'); /** * Context provider, if one was provided. @@ -63,6 +64,25 @@ goog.debug.ErrorReporter = function( */ this.contextProvider_ = opt_contextProvider || null; + /** + * The string prefix of any optional context parameters logged with the error. + * @private {string} + */ + this.contextPrefix_ = 'context.'; + + /** + * The number of bytes after which the ErrorReporter truncates the POST body. + * If null, the ErrorReporter won't truncate the body. + * @private {?number} + */ + this.truncationLimit_ = null; + + /** + * Additional arguments to append to URL before sending XHR. + * @private {!Object.} + */ + this.additionalArguments_ = {}; + /** * XHR sender. * @type {function(string, string, string, (Object|goog.structs.Map)=)} @@ -78,13 +98,37 @@ goog.debug.ErrorReporter = function( */ this.handlerUrl_ = handlerUrl; - if (!opt_noAutoProtect) { - this.setup_(); + if (goog.debug.ErrorReporter.ALLOW_AUTO_PROTECT) { + if (!opt_noAutoProtect) { + /** + * The internal error handler used to catch all errors. + * + * @private {goog.debug.ErrorHandler} + */ + this.errorHandler_ = null; + + this.setup_(); + } + } else if (!opt_noAutoProtect) { + goog.asserts.fail( + 'opt_noAutoProtect cannot be false while ' + + 'goog.debug.ErrorReporter.ALLOW_AUTO_PROTECT is false. Setting ' + + 'ALLOW_AUTO_PROTECT to false removes the necessary auto-protect code ' + + 'in compiled/optimized mode.'); } }; goog.inherits(goog.debug.ErrorReporter, goog.events.EventTarget); +/** + * @define {boolean} If true, the code that provides additional entry point + * protection and setup is exposed in this file. Set to false to avoid + * bringing in a lot of code from ErrorHandler and entryPointRegistry in + * compiled mode. + */ +goog.define('goog.debug.ErrorReporter.ALLOW_AUTO_PROTECT', true); + + /** * Event broadcast when an exception is logged. @@ -93,6 +137,7 @@ goog.inherits(goog.debug.ErrorReporter, goog.events.EventTarget); * server alongside this error. * @constructor * @extends {goog.events.Event} + * @final */ goog.debug.ErrorReporter.ExceptionEvent = function(error, context) { goog.events.Event.call(this, goog.debug.ErrorReporter.ExceptionEvent.TYPE); @@ -120,15 +165,6 @@ goog.debug.ErrorReporter.ExceptionEvent.TYPE = goog.events.getUniqueId('exception'); -/** - * The internal error handler used to catch all errors. - * - * @type {goog.debug.ErrorHandler} - * @private - */ -goog.debug.ErrorReporter.prototype.errorHandler_ = null; - - /** * Extra headers for the error-reporting XHR. * @type {Object|goog.structs.Map|undefined} @@ -140,11 +176,11 @@ goog.debug.ErrorReporter.prototype.extraHeaders_; /** * Logging object. * - * @type {goog.debug.Logger} + * @type {goog.log.Logger} * @private */ goog.debug.ErrorReporter.logger_ = - goog.debug.Logger.getLogger('goog.debug.ErrorReporter'); + goog.log.getLogger('goog.debug.ErrorReporter'); /** @@ -160,7 +196,7 @@ goog.debug.ErrorReporter.logger_ = * onerror and to protect entry points. If apps have other error reporting * facilities, it may make sense for them to set these up themselves and use * the ErrorReporter just for transmission of reports. - * @return {goog.debug.ErrorReporter} The error reporter. + * @return {!goog.debug.ErrorReporter} The error reporter. */ goog.debug.ErrorReporter.install = function( loggingUrl, opt_contextProvider, opt_noAutoProtect) { @@ -171,7 +207,7 @@ goog.debug.ErrorReporter.install = function( /** - * Default implemntation of XHR sender interface. + * Default implementation of XHR sender interface. * * @param {string} uri URI to make request to. * @param {string} method Send method. @@ -191,16 +227,52 @@ goog.debug.ErrorReporter.defaultXhrSender = function(uri, method, content, * Has no effect in IE because window.onerror is used for reporting * exceptions in that case. * + * @this {goog.debug.ErrorReporter} * @param {Function} fn An entry point function to be protected. * @return {Function} A protected wrapper function that calls the entry point * function or null if the entry point could not be protected. */ -goog.debug.ErrorReporter.prototype.protectAdditionalEntryPoint = function(fn) { - if (this.errorHandler_) { - return this.errorHandler_.protectEntryPoint(fn); - } - return null; -}; +goog.debug.ErrorReporter.prototype.protectAdditionalEntryPoint = + goog.debug.ErrorReporter.ALLOW_AUTO_PROTECT ? + function(fn) { + if (this.errorHandler_) { + return this.errorHandler_.protectEntryPoint(fn); + } + return null; + } : + function(fn) { + goog.asserts.fail( + 'Cannot call protectAdditionalEntryPoint while ALLOW_AUTO_PROTECT ' + + 'is false. If ALLOW_AUTO_PROTECT is false, the necessary ' + + 'auto-protect code in compiled/optimized mode is removed.'); + return null; + }; + + +if (goog.debug.ErrorReporter.ALLOW_AUTO_PROTECT) { + /** + * Sets up the error reporter. + * + * @private + */ + goog.debug.ErrorReporter.prototype.setup_ = function() { + if (goog.userAgent.IE && !goog.userAgent.isVersionOrHigher('10')) { + // Use "onerror" because caught exceptions in IE don't provide line + // number. + goog.debug.catchErrors( + goog.bind(this.handleException, this), false, null); + } else { + // "onerror" doesn't work with FF2 or Chrome + this.errorHandler_ = new goog.debug.ErrorHandler( + goog.bind(this.handleException, this)); + + this.errorHandler_.protectWindowSetTimeout(); + this.errorHandler_.protectWindowSetInterval(); + this.errorHandler_.protectWindowRequestAnimationFrame(); + goog.debug.entryPointRegistry.monitorAll(this.errorHandler_); + } + }; +} /** @@ -227,28 +299,6 @@ goog.debug.ErrorReporter.prototype.setXhrSender = function(xhrSender) { }; -/** - * Sets up the error reporter. - * - * @private - */ -goog.debug.ErrorReporter.prototype.setup_ = function() { - if (goog.userAgent.IE) { - // Use "onerror" because caught exceptions in IE don't provide line number. - goog.debug.catchErrors( - goog.bind(this.handleException, this), false, null); - } else { - // "onerror" doesn't work with FF2 or Chrome - this.errorHandler_ = new goog.debug.ErrorHandler( - goog.bind(this.handleException, this)); - - this.errorHandler_.protectWindowSetTimeout(); - this.errorHandler_.protectWindowSetInterval(); - goog.debug.entryPointRegistry.monitorAll(this.errorHandler_); - } -}; - - /** * Handler for caught exceptions. Sends report to the LoggingServlet and * notifies any listeners. @@ -268,8 +318,8 @@ goog.debug.ErrorReporter.prototype.handleException = function(e, try { this.contextProvider_(error, context); } catch (err) { - goog.debug.ErrorReporter.logger_.severe('Context provider threw an ' + - 'exception: ' + err.message); + goog.log.error(goog.debug.ErrorReporter.logger_, + 'Context provider threw an exception: ' + err.message); } } // Truncate message to a reasonable length, since it will be sent in the URL. @@ -303,19 +353,30 @@ goog.debug.ErrorReporter.prototype.sendErrorReport = // Create the logging URL. var requestUrl = goog.uri.utils.appendParams(this.handlerUrl_, 'script', fileName, 'error', message, 'line', line); + + if (!goog.object.isEmpty(this.additionalArguments_)) { + requestUrl = goog.uri.utils.appendParamsFromMap(requestUrl, + this.additionalArguments_); + } + var queryMap = {}; queryMap['trace'] = opt_trace; // Copy context into query data map if (opt_context) { for (var entry in opt_context) { - queryMap['context.' + entry] = opt_context[entry]; + queryMap[this.contextPrefix_ + entry] = opt_context[entry]; } } // Copy query data map into request. var queryData = goog.uri.utils.buildQueryDataFromMap(queryMap); + // Truncate if truncationLimit set. + if (goog.isNumber(this.truncationLimit_)) { + queryData = queryData.substring(0, this.truncationLimit_); + } + // Send the request with the contents of the error. this.xhrSender_(requestUrl, 'POST', queryData, this.extraHeaders_); } catch (e) { @@ -325,13 +386,44 @@ goog.debug.ErrorReporter.prototype.sendErrorReport = 'line:', line, '\n', 'error:', message, '\n', 'trace:', opt_trace); - goog.debug.ErrorReporter.logger_.info(logMessage); + goog.log.info(goog.debug.ErrorReporter.logger_, logMessage); } }; +/** + * @param {string} prefix The prefix to appear prepended to all context + * variables in the error report body. + */ +goog.debug.ErrorReporter.prototype.setContextPrefix = function(prefix) { + this.contextPrefix_ = prefix; +}; + + +/** + * @param {?number} limit Size in bytes to begin truncating POST body. Set to + * null to prevent truncation. The limit must be >= 0. + */ +goog.debug.ErrorReporter.prototype.setTruncationLimit = function(limit) { + goog.asserts.assert(!goog.isNumber(limit) || limit >= 0, + 'Body limit must be valid number >= 0 or null'); + this.truncationLimit_ = limit; +}; + + +/** + * @param {!Object.} urlArgs Set of key-value pairs to append + * to handlerUrl_ before sending XHR. + */ +goog.debug.ErrorReporter.prototype.setAdditionalArguments = function(urlArgs) { + this.additionalArguments_ = urlArgs; +}; + + /** @override */ goog.debug.ErrorReporter.prototype.disposeInternal = function() { - goog.dispose(this.errorHandler_); - goog.base(this, 'disposeInternal'); + if (goog.debug.ErrorReporter.ALLOW_AUTO_PROTECT) { + goog.dispose(this.errorHandler_); + } + goog.debug.ErrorReporter.base(this, 'disposeInternal'); }; diff --git a/third_party/closure/goog/debug/fancywindow.js b/third_party/closure/goog/debug/fancywindow.js index 46e7a7c13a904..54d3324632e46 100644 --- a/third_party/closure/goog/debug/fancywindow.js +++ b/third_party/closure/goog/debug/fancywindow.js @@ -26,10 +26,13 @@ goog.provide('goog.debug.FancyWindow'); +goog.require('goog.array'); goog.require('goog.debug.DebugWindow'); goog.require('goog.debug.LogManager'); goog.require('goog.debug.Logger'); goog.require('goog.dom.DomHelper'); +goog.require('goog.dom.safe'); +goog.require('goog.html.SafeHtml'); goog.require('goog.object'); goog.require('goog.string'); goog.require('goog.userAgent'); @@ -47,7 +50,7 @@ goog.require('goog.userAgent'); */ goog.debug.FancyWindow = function(opt_identifier, opt_prefix) { this.readOptionsFromLocalStorage_(); - goog.base(this, opt_identifier, opt_prefix); + goog.debug.FancyWindow.base(this, 'constructor', opt_identifier, opt_prefix); }; goog.inherits(goog.debug.FancyWindow, goog.debug.DebugWindow); @@ -103,12 +106,12 @@ goog.debug.FancyWindow.prototype.writeInitialDocument = function() { return; } - var doc = this.win_.document; + var doc = this.win.document; doc.open(); doc.write(this.getHtml_()); doc.close(); - (goog.userAgent.IE ? doc.body : this.win_).onresize = + (goog.userAgent.IE ? doc.body : this.win).onresize = goog.bind(this.resizeStuff_, this); // Create a dom helper for the logging window @@ -135,16 +138,16 @@ goog.debug.FancyWindow.prototype.writeInitialDocument = function() { */ goog.debug.FancyWindow.prototype.openOptions_ = function() { var el = this.dh_.getElement('optionsarea'); - el.innerHTML = ''; + goog.dom.safe.setInnerHtml(el, goog.html.SafeHtml.EMPTY); var loggers = goog.debug.FancyWindow.getLoggers_(); var dh = this.dh_; for (var i = 0; i < loggers.length; i++) { - var logger = goog.debug.Logger.getLogger(loggers[i]); + var logger = loggers[i]; var curlevel = logger.getLevel() ? logger.getLevel().name : 'INHERIT'; var div = dh.createDom('div', {}, - this.getDropDown_('sel' + loggers[i], curlevel), - dh.createDom('span', {}, loggers[i] || '(root)')); + this.getDropDown_('sel' + logger.getName(), curlevel), + dh.createDom('span', {}, logger.getName() || '(root)')); el.appendChild(div); } @@ -188,8 +191,8 @@ goog.debug.FancyWindow.prototype.closeOptions_ = function() { var loggers = goog.debug.FancyWindow.getLoggers_(); var dh = this.dh_; for (var i = 0; i < loggers.length; i++) { - var logger = goog.debug.Logger.getLogger(loggers[i]); - var sel = dh.getElement('sel' + loggers[i]); + var logger = loggers[i]; + var sel = dh.getElement('sel' + logger.getName()); var level = sel.options[sel.selectedIndex].text; if (level == 'INHERIT') { logger.setLevel(null); @@ -203,7 +206,7 @@ goog.debug.FancyWindow.prototype.closeOptions_ = function() { /** - * Resize the lof elements + * Resizes the log elements * @private */ goog.debug.FancyWindow.prototype.resizeStuff_ = function() { @@ -224,15 +227,15 @@ goog.debug.FancyWindow.prototype.resizeStuff_ = function() { */ goog.debug.FancyWindow.prototype.exit_ = function(e) { this.setEnabled(false); - if (this.win_) { - this.win_.close(); + if (this.win) { + this.win.close(); } }; /** @override */ goog.debug.FancyWindow.prototype.getStyleRules = function() { - return goog.base(this, 'getStyleRules') + + return goog.debug.FancyWindow.base(this, 'getStyleRules') + 'html,body{height:100%;width:100%;margin:0px;padding:0px;' + 'background-color:#FFF;overflow:hidden}' + '*{}' + @@ -295,8 +298,8 @@ goog.debug.FancyWindow.prototype.writeOptionsToLocalStorage_ = function() { var loggers = goog.debug.FancyWindow.getLoggers_(); var storedKeys = goog.debug.FancyWindow.getStoredKeys_(); for (var i = 0; i < loggers.length; i++) { - var key = goog.debug.FancyWindow.LOCAL_STORE_PREFIX + loggers[i]; - var level = goog.debug.Logger.getLogger(loggers[i]).getLevel(); + var key = goog.debug.FancyWindow.LOCAL_STORE_PREFIX + loggers[i].getName(); + var level = loggers[i].getLevel(); if (key in storedKeys) { if (!level) { window.localStorage.removeItem(key); @@ -321,7 +324,7 @@ goog.debug.FancyWindow.prototype.readOptionsFromLocalStorage_ = function() { var storedKeys = goog.debug.FancyWindow.getStoredKeys_(); for (var key in storedKeys) { var loggerName = key.replace(goog.debug.FancyWindow.LOCAL_STORE_PREFIX, ''); - var logger = goog.debug.Logger.getLogger(loggerName); + var logger = goog.debug.LogManager.getLogger(loggerName); var curLevel = logger.getLevel(); var storedLevel = window.localStorage.getItem(key).toString(); if (!curLevel || curLevel.toString() != storedLevel) { @@ -334,7 +337,7 @@ goog.debug.FancyWindow.prototype.readOptionsFromLocalStorage_ = function() { /** * Helper function to create a list of locally stored keys. Used to avoid * expensive localStorage.getItem() calls. - * @return {Object} List of keys. + * @return {!Object} List of keys. * @private */ goog.debug.FancyWindow.getStoredKeys_ = function() { @@ -351,12 +354,21 @@ goog.debug.FancyWindow.getStoredKeys_ = function() { /** - * Gets a sorted array of all the loggers registered - * @return {Array} Array of logger idents, e.g. goog.net.XhrIo. + * Gets a sorted array of all the loggers registered. + * @return {!Array.} Array of logger instances. * @private */ goog.debug.FancyWindow.getLoggers_ = function() { - var loggers = goog.object.getKeys(goog.debug.LogManager.getLoggers()); - loggers.sort(); + var loggers = goog.object.getValues(goog.debug.LogManager.getLoggers()); + + /** + * @param {!goog.debug.Logger} a + * @param {!goog.debug.Logger} b + * @return {number} + */ + var loggerSort = function(a, b) { + return goog.array.defaultCompare(a.getName(), b.getName()); + }; + goog.array.sort(loggers, loggerSort); return loggers; }; diff --git a/third_party/closure/goog/debug/formatter.js b/third_party/closure/goog/debug/formatter.js index c2fc5eb4532a1..0744a630a5a92 100644 --- a/third_party/closure/goog/debug/formatter.js +++ b/third_party/closure/goog/debug/formatter.js @@ -48,6 +48,13 @@ goog.debug.Formatter = function(opt_prefix) { }; +/** + * Whether to append newlines to the end of formatted log records. + * @type {boolean} + */ +goog.debug.Formatter.prototype.appendNewline = true; + + /** * Whether to show absolute time in the DebugWindow. * @type {boolean} @@ -264,7 +271,10 @@ goog.debug.HtmlFormatter.prototype.formatRecord = function(logRecord) { goog.string.newLineToBr(goog.string.whitespaceEscape( logRecord.getExceptionText() || ''))); } - sb.push('
'); + sb.push(''); + if (this.appendNewline) { + sb.push('
'); + } return sb.join(''); }; @@ -277,6 +287,7 @@ goog.debug.HtmlFormatter.prototype.formatRecord = function(logRecord) { * @param {string=} opt_prefix The prefix to place before text records. * @constructor * @extends {goog.debug.Formatter} + * @final */ goog.debug.TextFormatter = function(opt_prefix) { goog.debug.Formatter.call(this, opt_prefix); @@ -308,9 +319,12 @@ goog.debug.TextFormatter.prototype.formatRecord = function(logRecord) { if (this.showSeverityLevel) { sb.push('[', logRecord.getLevel().name, '] '); } - sb.push(logRecord.getMessage(), '\n'); + sb.push(logRecord.getMessage()); if (this.showExceptionText && logRecord.getException()) { - sb.push(logRecord.getExceptionText(), '\n'); + sb.push('\n', logRecord.getExceptionText()); + } + if (this.appendNewline) { + sb.push('\n'); } return sb.join(''); }; diff --git a/third_party/closure/goog/debug/fpsdisplay.js b/third_party/closure/goog/debug/fpsdisplay.js index b5264c5584c33..f9fa6047c0edb 100644 --- a/third_party/closure/goog/debug/fpsdisplay.js +++ b/third_party/closure/goog/debug/fpsdisplay.js @@ -35,9 +35,10 @@ goog.require('goog.ui.Component'); * @param {goog.dom.DomHelper=} opt_domHelper An optional dom helper. * @constructor * @extends {goog.ui.Component} + * @final */ goog.debug.FpsDisplay = function(opt_domHelper) { - goog.base(this, opt_domHelper); + goog.debug.FpsDisplay.base(this, 'constructor', opt_domHelper); }; goog.inherits(goog.debug.FpsDisplay, goog.ui.Component); @@ -71,7 +72,7 @@ goog.debug.FpsDisplay.prototype.createDom = function() { /** @override */ goog.debug.FpsDisplay.prototype.enterDocument = function() { - goog.base(this, 'enterDocument'); + goog.debug.FpsDisplay.base(this, 'enterDocument'); this.animation_ = new goog.debug.FpsDisplay.FpsAnimation_(this.getElement()); this.delay_ = new goog.async.AnimationDelay( this.handleDelay_, this.getDomHelper().getWindow(), this); @@ -93,7 +94,7 @@ goog.debug.FpsDisplay.prototype.handleDelay_ = function(now) { /** @override */ goog.debug.FpsDisplay.prototype.exitDocument = function() { - goog.base(this, 'exitDocument'); + goog.debug.FpsDisplay.base(this, 'exitDocument'); this.animation_ = null; goog.dispose(this.delay_); }; diff --git a/third_party/closure/goog/debug/gcdiagnostics.js b/third_party/closure/goog/debug/gcdiagnostics.js index 9d46254764339..5e5ba9a9ed871 100644 --- a/third_party/closure/goog/debug/gcdiagnostics.js +++ b/third_party/closure/goog/debug/gcdiagnostics.js @@ -19,8 +19,8 @@ goog.provide('goog.debug.GcDiagnostics'); -goog.require('goog.debug.Logger'); goog.require('goog.debug.Trace'); +goog.require('goog.log'); goog.require('goog.userAgent'); @@ -65,9 +65,9 @@ goog.debug.GcDiagnostics_.prototype.install = function() { goog.debug.Trace.setGcTracer(this.gcTracer_); } } - this.logger_.info('Installed L2 native helper'); + goog.log.info(this.logger_, 'Installed L2 native helper'); } catch (e) { - this.logger_.info('Failed to install L2 native helper: ' + e); + goog.log.info(this.logger_, 'Failed to install L2 native helper: ' + e); } } }; @@ -75,11 +75,11 @@ goog.debug.GcDiagnostics_.prototype.install = function() { /** * Logger for the gcDiagnotics - * @type {goog.debug.Logger} + * @type {goog.log.Logger} * @private */ goog.debug.GcDiagnostics_.prototype.logger_ = - goog.debug.Logger.getLogger('goog.debug.GcDiagnostics'); + goog.log.getLogger('goog.debug.GcDiagnostics'); /** @@ -107,8 +107,8 @@ goog.debug.GcDiagnostics_.prototype.stop = function() { this.gcTracer_['endGcTracing'](); var numGCs = gcTracer['getNumTraces'](); - this.logger_.info('*********GC TRACE*********'); - this.logger_.info('GC ran ' + numGCs + ' times.'); + goog.log.info(this.logger_, '*********GC TRACE*********'); + goog.log.info(this.logger_, 'GC ran ' + numGCs + ' times.'); var totalTime = 0; for (var i = 0; i < numGCs; i++) { var trace = gcTracer['getTrace'](i); @@ -124,14 +124,14 @@ goog.debug.GcDiagnostics_.prototype.stop = function() { if (goog.debug.Trace) { goog.debug.Trace.addComment(s, null, msStart); } - this.logger_.info(s); + goog.log.info(this.logger_, s); totalTime += msElapsed; } if (goog.debug.Trace) { goog.debug.Trace.addComment('Total GC time was ' + totalTime + ' ms.'); } - this.logger_.info('Total GC time was ' + totalTime + ' ms.'); - this.logger_.info('*********GC TRACE*********'); + goog.log.info(this.logger_, 'Total GC time was ' + totalTime + ' ms.'); + goog.log.info(this.logger_, '*********GC TRACE*********'); } }; diff --git a/third_party/closure/goog/debug/logbuffer.js b/third_party/closure/goog/debug/logbuffer.js index 644b5d98f03d7..d2ded20df3718 100644 --- a/third_party/closure/goog/debug/logbuffer.js +++ b/third_party/closure/goog/debug/logbuffer.js @@ -32,6 +32,7 @@ goog.require('goog.debug.LogRecord'); /** * Creates the log buffer. * @constructor + * @final */ goog.debug.LogBuffer = function() { goog.asserts.assert(goog.debug.LogBuffer.isBufferingEnabled(), diff --git a/third_party/closure/goog/debug/logger.js b/third_party/closure/goog/debug/logger.js index 61aeb180e81a3..5e52443738546 100644 --- a/third_party/closure/goog/debug/logger.js +++ b/third_party/closure/goog/debug/logger.js @@ -21,6 +21,7 @@ */ goog.provide('goog.debug.LogManager'); +goog.provide('goog.debug.Loggable'); goog.provide('goog.debug.Logger'); goog.provide('goog.debug.Logger.Level'); @@ -31,6 +32,18 @@ goog.require('goog.debug.LogBuffer'); goog.require('goog.debug.LogRecord'); +/** + * A message value that can be handled by a Logger. + * + * Functions are treated like callbacks, but are only called when the event's + * log level is enabled. This is useful for logging messages that are expensive + * to construct. + * + * @typedef {string|function(): string} + */ +goog.debug.Loggable; + + /** * The Logger is an object used for logging debug messages. Loggers are @@ -47,49 +60,41 @@ goog.require('goog.debug.LogRecord'); * * @constructor * @param {string} name The name of the Logger. + * @final */ goog.debug.Logger = function(name) { /** * Name of the Logger. Generally a dot-separated namespace - * @type {string} - * @private + * @private {string} */ this.name_ = name; -}; - - -/** - * Parent Logger. - * @type {goog.debug.Logger} - * @private - */ -goog.debug.Logger.prototype.parent_ = null; - - -/** - * Level that this logger only filters above. Null indicates it should - * inherit from the parent. - * @type {goog.debug.Logger.Level} - * @private - */ -goog.debug.Logger.prototype.level_ = null; + /** + * Parent Logger. + * @private {goog.debug.Logger} + */ + this.parent_ = null; -/** - * Map of children loggers. The keys are the leaf names of the children and - * the values are the child loggers. - * @type {Object} - * @private - */ -goog.debug.Logger.prototype.children_ = null; + /** + * Level that this logger only filters above. Null indicates it should + * inherit from the parent. + * @private {goog.debug.Logger.Level} + */ + this.level_ = null; + /** + * Map of children loggers. The keys are the leaf names of the children and + * the values are the child loggers. + * @private {Object} + */ + this.children_ = null; -/** - * Handlers that are listening to this logger. - * @type {Array.} - * @private - */ -goog.debug.Logger.prototype.handlers_ = null; + /** + * Handlers that are listening to this logger. + * @private {Array.} + */ + this.handlers_ = null; +}; /** @@ -143,6 +148,7 @@ if (!goog.debug.Logger.ENABLE_HIERARCHY) { * @param {string} name The name of the level. * @param {number} value The numeric value of the level. * @constructor + * @final */ goog.debug.Logger.Level = function(name, value) { /** @@ -340,6 +346,7 @@ goog.debug.Logger.Level.getPredefinedLevelByValue = function(value) { * name and should normally be based on the package name or class name of the * subsystem, such as goog.net.BrowserChannel. * @return {!goog.debug.Logger} The named logger. + * @deprecated use goog.log instead. http://go/goog-debug-logger-deprecated */ goog.debug.Logger.getLogger = function(name) { return goog.debug.LogManager.getLogger(name); @@ -521,14 +528,20 @@ goog.debug.Logger.prototype.isLoggable = function(level) { * given message level then the given message is forwarded to all the * registered output Handler objects. * @param {goog.debug.Logger.Level} level One of the level identifiers. - * @param {string} msg The string message. + * @param {goog.debug.Loggable} msg The message to log. * @param {Error|Object=} opt_exception An exception associated with the * message. */ goog.debug.Logger.prototype.log = function(level, msg, opt_exception) { // java caches the effective level, not sure it's necessary here if (goog.debug.LOGGING_ENABLED && this.isLoggable(level)) { - this.doLogRecord_(this.getLogRecord(level, msg, opt_exception)); + // Message callbacks can be useful when a log message is expensive to build. + if (goog.isFunction(msg)) { + msg = msg(); + } + + this.doLogRecord_(this.getLogRecord( + level, msg, opt_exception, goog.debug.Logger.prototype.log)); } }; @@ -539,9 +552,13 @@ goog.debug.Logger.prototype.log = function(level, msg, opt_exception) { * @param {string} msg The string message. * @param {Error|Object=} opt_exception An exception associated with the * message. + * @param {Function=} opt_fnStackContext A function to use as the base + * of the stack trace used in the log record. * @return {!goog.debug.LogRecord} A log record. + * @suppress {es5Strict} */ -goog.debug.Logger.prototype.getLogRecord = function(level, msg, opt_exception) { +goog.debug.Logger.prototype.getLogRecord = function( + level, msg, opt_exception, opt_fnStackContext) { if (goog.debug.LogBuffer.isBufferingEnabled()) { var logRecord = goog.debug.LogBuffer.getInstance().addRecord(level, msg, this.name_); @@ -549,9 +566,17 @@ goog.debug.Logger.prototype.getLogRecord = function(level, msg, opt_exception) { logRecord = new goog.debug.LogRecord(level, String(msg), this.name_); } if (opt_exception) { + var context; + if (goog.STRICT_MODE_COMPATIBLE) { + context = opt_fnStackContext || goog.debug.Logger.prototype.getLogRecord; + } else { + context = opt_fnStackContext || arguments.callee.caller; + } + logRecord.setException(opt_exception); logRecord.setExceptionText( - goog.debug.exposeException(opt_exception, arguments.callee.caller)); + goog.debug.exposeException(opt_exception, + opt_fnStackContext || goog.debug.Logger.prototype.getLogRecord)); } return logRecord; }; @@ -561,7 +586,7 @@ goog.debug.Logger.prototype.getLogRecord = function(level, msg, opt_exception) { * Logs a message at the Logger.Level.SHOUT level. * If the logger is currently enabled for the given message level then the * given message is forwarded to all the registered output Handler objects. - * @param {string} msg The string message. + * @param {goog.debug.Loggable} msg The message to log. * @param {Error=} opt_exception An exception associated with the message. */ goog.debug.Logger.prototype.shout = function(msg, opt_exception) { @@ -575,7 +600,7 @@ goog.debug.Logger.prototype.shout = function(msg, opt_exception) { * Logs a message at the Logger.Level.SEVERE level. * If the logger is currently enabled for the given message level then the * given message is forwarded to all the registered output Handler objects. - * @param {string} msg The string message. + * @param {goog.debug.Loggable} msg The message to log. * @param {Error=} opt_exception An exception associated with the message. */ goog.debug.Logger.prototype.severe = function(msg, opt_exception) { @@ -589,7 +614,7 @@ goog.debug.Logger.prototype.severe = function(msg, opt_exception) { * Logs a message at the Logger.Level.WARNING level. * If the logger is currently enabled for the given message level then the * given message is forwarded to all the registered output Handler objects. - * @param {string} msg The string message. + * @param {goog.debug.Loggable} msg The message to log. * @param {Error=} opt_exception An exception associated with the message. */ goog.debug.Logger.prototype.warning = function(msg, opt_exception) { @@ -603,7 +628,7 @@ goog.debug.Logger.prototype.warning = function(msg, opt_exception) { * Logs a message at the Logger.Level.INFO level. * If the logger is currently enabled for the given message level then the * given message is forwarded to all the registered output Handler objects. - * @param {string} msg The string message. + * @param {goog.debug.Loggable} msg The message to log. * @param {Error=} opt_exception An exception associated with the message. */ goog.debug.Logger.prototype.info = function(msg, opt_exception) { @@ -617,7 +642,7 @@ goog.debug.Logger.prototype.info = function(msg, opt_exception) { * Logs a message at the Logger.Level.CONFIG level. * If the logger is currently enabled for the given message level then the * given message is forwarded to all the registered output Handler objects. - * @param {string} msg The string message. + * @param {goog.debug.Loggable} msg The message to log. * @param {Error=} opt_exception An exception associated with the message. */ goog.debug.Logger.prototype.config = function(msg, opt_exception) { @@ -631,7 +656,7 @@ goog.debug.Logger.prototype.config = function(msg, opt_exception) { * Logs a message at the Logger.Level.FINE level. * If the logger is currently enabled for the given message level then the * given message is forwarded to all the registered output Handler objects. - * @param {string} msg The string message. + * @param {goog.debug.Loggable} msg The message to log. * @param {Error=} opt_exception An exception associated with the message. */ goog.debug.Logger.prototype.fine = function(msg, opt_exception) { @@ -645,7 +670,7 @@ goog.debug.Logger.prototype.fine = function(msg, opt_exception) { * Logs a message at the Logger.Level.FINER level. * If the logger is currently enabled for the given message level then the * given message is forwarded to all the registered output Handler objects. - * @param {string} msg The string message. + * @param {goog.debug.Loggable} msg The message to log. * @param {Error=} opt_exception An exception associated with the message. */ goog.debug.Logger.prototype.finer = function(msg, opt_exception) { @@ -659,7 +684,7 @@ goog.debug.Logger.prototype.finer = function(msg, opt_exception) { * Logs a message at the Logger.Level.FINEST level. * If the logger is currently enabled for the given message level then the * given message is forwarded to all the registered output Handler objects. - * @param {string} msg The string message. + * @param {goog.debug.Loggable} msg The message to log. * @param {Error=} opt_exception An exception associated with the message. */ goog.debug.Logger.prototype.finest = function(msg, opt_exception) { @@ -749,7 +774,7 @@ goog.debug.LogManager = {}; /** * Map of logger names to logger objects. * - * @type {!Object} + * @type {!Object.} * @private */ goog.debug.LogManager.loggers_ = {}; @@ -777,7 +802,8 @@ goog.debug.LogManager.initialize = function() { /** * Returns all the loggers. - * @return {!Object} Map of logger names to logger objects. + * @return {!Object.} Map of logger names to logger + * objects. */ goog.debug.LogManager.getLoggers = function() { return goog.debug.LogManager.loggers_; diff --git a/third_party/closure/goog/debug/logrecordserializer.js b/third_party/closure/goog/debug/logrecordserializer.js index e387bed1abec8..161b5e7b6c56d 100644 --- a/third_party/closure/goog/debug/logrecordserializer.js +++ b/third_party/closure/goog/debug/logrecordserializer.js @@ -108,7 +108,7 @@ goog.debug.logRecordSerializer.reconstitute_ = function(o) { /** * @param {string} name The name of the log level to return. * @param {number} value The numeric value of the log level to return. - * @return {goog.debug.Logger.Level} Returns a goog.debug.Logger.Level with + * @return {!goog.debug.Logger.Level} Returns a goog.debug.Logger.Level with * the specified name and value. If the name and value match a predefined * log level, that instance will be returned, otherwise a new one will be * created. diff --git a/third_party/closure/goog/debug/relativetimeprovider.js b/third_party/closure/goog/debug/relativetimeprovider.js index 065a4c4fe2536..120114748170e 100644 --- a/third_party/closure/goog/debug/relativetimeprovider.js +++ b/third_party/closure/goog/debug/relativetimeprovider.js @@ -30,6 +30,7 @@ goog.provide('goog.debug.RelativeTimeProvider'); * behavior for most use cases is to share the same start time. * * @constructor + * @final */ goog.debug.RelativeTimeProvider = function() { /** diff --git a/third_party/closure/goog/debug/tracer.js b/third_party/closure/goog/debug/tracer.js index ca3e92d706e99..7f68b89d5b957 100644 --- a/third_party/closure/goog/debug/tracer.js +++ b/third_party/closure/goog/debug/tracer.js @@ -21,8 +21,8 @@ goog.provide('goog.debug.Trace'); goog.require('goog.array'); -goog.require('goog.debug.Logger'); goog.require('goog.iter'); +goog.require('goog.log'); goog.require('goog.structs.Map'); goog.require('goog.structs.SimplePool'); @@ -31,7 +31,7 @@ goog.require('goog.structs.SimplePool'); /** * Class used for singleton goog.debug.Trace. Used for timing slow points in * the code. Based on the java Tracer class but optimized for javascript. - * See com.google.common.base.Tracer. + * See com.google.common.tracing.Tracer. * @constructor * @private */ @@ -153,11 +153,11 @@ goog.debug.Trace_ = function() { /** * Logger for the tracer - * @type {goog.debug.Logger} + * @type {goog.log.Logger} * @private */ goog.debug.Trace_.prototype.logger_ = - goog.debug.Logger.getLogger('goog.debug.Trace'); + goog.log.getLogger('goog.debug.Trace'); /** @@ -394,8 +394,8 @@ goog.debug.Trace_.prototype.startTracer = function(comment, opt_type) { var varAlloc = this.getTotalVarAlloc(); var outstandingEventCount = this.outstandingEvents_.getCount(); if (this.events_.length + outstandingEventCount > this.MAX_TRACE_SIZE) { - this.logger_.warning('Giant thread trace. Clearing to ' + - 'avoid memory leak.'); + goog.log.warning(this.logger_, + 'Giant thread trace. Clearing to avoid memory leak.'); // This is the more likely case. This usually means that we // either forgot to clear the trace or else we are performing a // very large number of events diff --git a/third_party/closure/goog/demos/advancedtooltip.html b/third_party/closure/goog/demos/advancedtooltip.html deleted file mode 100644 index 290febd79a5d4..0000000000000 --- a/third_party/closure/goog/demos/advancedtooltip.html +++ /dev/null @@ -1,78 +0,0 @@ - - - - - goog.ui.AdvancedTooltip - - - - - - - -

goog.ui.AdvancedTooltip

- - -

- -

- - - - diff --git a/third_party/closure/goog/demos/animationqueue.html b/third_party/closure/goog/demos/animationqueue.html deleted file mode 100644 index 451836abbd027..0000000000000 --- a/third_party/closure/goog/demos/animationqueue.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - - - - - -
-
-
-
-
- - - - - - diff --git a/third_party/closure/goog/demos/autocomplete-basic.html b/third_party/closure/goog/demos/autocomplete-basic.html deleted file mode 100644 index c407185a555c1..0000000000000 --- a/third_party/closure/goog/demos/autocomplete-basic.html +++ /dev/null @@ -1,56 +0,0 @@ - - - - - goog.ui.ac - - - - - - - -

goog.ui.ac

-

- Tom Cruise Film Finder:
- -

-

- Multi-Tom Cruise Film Finder:
- -
- Data from Google Sets! Not my personal DVD collection!!! -

- - - diff --git a/third_party/closure/goog/demos/autocompleteremote.html b/third_party/closure/goog/demos/autocompleteremote.html deleted file mode 100644 index 710c208fe6b24..0000000000000 --- a/third_party/closure/goog/demos/autocompleteremote.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - goog.ui.ac.Remote - - - - - - -

goog.ui.ac.Remote

- - Google Buzzwords:
-
-

- This data is being pulled from the server at - autocompleteremotedata.js. -

-

- Ideally the server would perform a search on the query and would only - return relevant results; however, this response is static. -

- - - - diff --git a/third_party/closure/goog/demos/autocompleterichremote.html b/third_party/closure/goog/demos/autocompleterichremote.html deleted file mode 100644 index 2dd469bcfbe76..0000000000000 --- a/third_party/closure/goog/demos/autocompleterichremote.html +++ /dev/null @@ -1,137 +0,0 @@ - - - - - - goog.ui.ac.RichRemote - - - - - - - -

goog.ui.ac.RichRemote

-

- Fruit Selector:
- - - - - -

- This data is being pulled from the server at - autocompleterichremotedata.js. -

-

- Ideally the server would perform a search on the query and would only - return relevant results; however, this response is static. -

-

- - - - - - diff --git a/third_party/closure/goog/demos/bidiinput.html b/third_party/closure/goog/demos/bidiinput.html deleted file mode 100644 index 7cafe51de14a9..0000000000000 --- a/third_party/closure/goog/demos/bidiinput.html +++ /dev/null @@ -1,72 +0,0 @@ - - - - - goog.ui.BidiInput - - - - - -

goog.ui.BidiInput

- -

- The direction of the input field changes automatically to RTL (right to left) - if the contents is in an RTL language (e.g. Hebrew or Arabic). -

- -
- A decorated input:  - Text: - -
- -
- -
- An input created programmatically:  - Text: ! - - -
- - -
- -
- A decorated textarea:  - - -
- -
- -
-
- Right to left div:  - - -
-
- - - diff --git a/third_party/closure/goog/demos/blobhasher.html b/third_party/closure/goog/demos/blobhasher.html deleted file mode 100644 index 2403f82652edb..0000000000000 --- a/third_party/closure/goog/demos/blobhasher.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - -goog.crypt.BlobHasher - - - - - -

goog.crypt.BlobHasher

- - - -
File: - - -
MD5:
- - - diff --git a/third_party/closure/goog/demos/bubble.html b/third_party/closure/goog/demos/bubble.html deleted file mode 100644 index e10bb0e3fd883..0000000000000 --- a/third_party/closure/goog/demos/bubble.html +++ /dev/null @@ -1,250 +0,0 @@ - - - - - - goog.ui.Bubble - - - - - - -

goog.ui.Bubble

- - - - - - - - - - - - - - - - - - -
-
-
- - -
-
-
-
-
- - -
-
-
-
-
- - -
-
-
-
-
- - -
-
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - -
X:
Y:
Corner orientation(0-3):
Auto-hide (true or false):
Timeout (ms):
Decorated
- -
-
-
-
-
-
-
-
- - -
-
-
-
-
- - -
-
-
-
-
- - -
-
-
-
-
- - -
-
-
- - - - - - diff --git a/third_party/closure/goog/demos/button.html b/third_party/closure/goog/demos/button.html deleted file mode 100644 index 8cb1fd1906856..0000000000000 --- a/third_party/closure/goog/demos/button.html +++ /dev/null @@ -1,395 +0,0 @@ - - - - - goog.ui.Button and goog.ui.ToggleButton - - - - - - - - - - -

goog.ui.Button

-
- - The first Button was created programmatically, - the second by decorating an <input> element:  - -
- -
-
-
- -
-
-
- -

goog.ui.FlatButtonRenderer

-
- - Buttons made with <div>'s instead of - <input>'s or <button>'s - The first rendered, the second decorated:  - -
- -
-
-
My Flat Button

- -
-
-
- Combined -
- Buttons -
-
-
-
- -

goog.ui.LinkButtonRenderer

-
- - Like FlatButtonRenderer, except the style makes the button appear to be a - link. - -
- -
- -

goog.ui.CustomButton & goog.ui.ToggleButton

-
- - These buttons were rendered using goog.ui.CustomButton: -   - -
- These buttons were created programmatically:
-
-
- These buttons were created by decorating some DIVs, and they dispatch - state transition events (watch the event log):
-
- -
- Decorated Button, yay! -
-
Decorated Disabled
-
Another Button
-
- Archive -
- Delete -
- Report Spam -
-
-
- Use these ToggleButtons to hide/show and enable/disable - the middle button:
-
Enable
-   -
Show
-

- Combined toggle buttons:
-
- Bold -
- Italics -
- Underlined -
-
-
- These buttons have icons, and the second one has an extra CSS class:
-
-
- - The button with the orange - outline has keyboard focus. Hit Enter to activate focused buttons. - -
-
-
- -
- Event Log -
-
- - - diff --git a/third_party/closure/goog/demos/charcounter.html b/third_party/closure/goog/demos/charcounter.html deleted file mode 100644 index a37c32148f261..0000000000000 --- a/third_party/closure/goog/demos/charcounter.html +++ /dev/null @@ -1,57 +0,0 @@ - - - - - goog.ui.CharCounter - - - - - -

goog.ui.CharCounter

- -

- - character(s) remaining -

-

- - You have entered character(s) of a maximum 160. -

-

- - character(s) remaining - - -

-

- - character(s) remaining -

- - - - diff --git a/third_party/closure/goog/demos/charpicker.html b/third_party/closure/goog/demos/charpicker.html deleted file mode 100644 index 7c769c8d02d60..0000000000000 --- a/third_party/closure/goog/demos/charpicker.html +++ /dev/null @@ -1,66 +0,0 @@ - - - - - goog.ui.CharPicker - - - - - - - - - - - - - - - - - -

goog.ui.CharPicker

-

You have selected: none -

- - -

- -

- - diff --git a/third_party/closure/goog/demos/checkbox.html b/third_party/closure/goog/demos/checkbox.html deleted file mode 100644 index 56ce9c30c409e..0000000000000 --- a/third_party/closure/goog/demos/checkbox.html +++ /dev/null @@ -1,122 +0,0 @@ - - - - - goog.ui.Checkbox - - - - - - -

goog.ui.Checkbox

-

This is a tri-state checkbox.

-
- Enable/disable
-
-
root
-
-
leaf 1
-
leaf 2
-
-
-
- Created with render -
-
-
- Created with decorate - - - - -
-

- -
- Event Log for 'root', 'leaf1', 'leaf2' -
-
- - - diff --git a/third_party/closure/goog/demos/color-contrast.html b/third_party/closure/goog/demos/color-contrast.html deleted file mode 100644 index 58eeac78843e0..0000000000000 --- a/third_party/closure/goog/demos/color-contrast.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - Color Contrast Test - - - - - -

- # - - This text should be readable -

-

(Only choosing from black and white.)

- - - - - diff --git a/third_party/closure/goog/demos/colormenubutton.html b/third_party/closure/goog/demos/colormenubutton.html deleted file mode 100644 index 5b1f394fda849..0000000000000 --- a/third_party/closure/goog/demos/colormenubutton.html +++ /dev/null @@ -1,221 +0,0 @@ - - - - - goog.ui.ColorMenuButton - - - - - - - - - - - - - - - -

goog.ui.ColorMenuButton Demo

- - - - - - - -
-
- goog.ui.ColorMenuButton demo: -
This button was created programmatically: 
-
-
- This button decorates a DIV:  -
Color
-
-
-
This button has a custom color menu: 
-
-
-
-
- - goog.ui.ToolbarColorMenuButtonRenderer demo: - -
- This toolbar button was created programmatically:  -
-
-
- This toolbar button decorates a DIV:  -
Color
-
-
-
- This is what these would look like in an actual toolbar, with - icons instead of text captions: -
-
-
-
-
-
-
-
-
-
-
-
-
- BiDi is all the rage these days -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
- Event Log -
-
-
-
-
- - - diff --git a/third_party/closure/goog/demos/colorpicker.html b/third_party/closure/goog/demos/colorpicker.html deleted file mode 100644 index 0d3812eb2e385..0000000000000 --- a/third_party/closure/goog/demos/colorpicker.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - goog.ui.ColorPicker - - - - - - -

goog.ui.ColorPicker

- -

Simple Color Grid

-
-

- - - - diff --git a/third_party/closure/goog/demos/combobox.html b/third_party/closure/goog/demos/combobox.html deleted file mode 100644 index d336b6ee27c89..0000000000000 --- a/third_party/closure/goog/demos/combobox.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - goog.ui.ComboBox - - - - - - - - - - -

goog.ui.ComboBox

-
cb.value = ''
- -
- LTR -
-
- -
- LTR -
-
- -
-
- LTR -
-
-
- -
- -
- RTL -
-
- -
- RTL -
-
- -
-
- RTL -
-
-
- - -
- - Clear Log -
- - - - diff --git a/third_party/closure/goog/demos/container.html b/third_party/closure/goog/demos/container.html deleted file mode 100644 index d75bbe85ff3eb..0000000000000 --- a/third_party/closure/goog/demos/container.html +++ /dev/null @@ -1,670 +0,0 @@ - - - - - goog.ui.Container - - - - - - - - -

goog.ui.Container

-

goog.ui.Container is a base class for menus and toolbars.

-
- These containers were created programmatically: - - - - - - - - - - - -
- Vertical container example: - - Horizontal container example: -
- -   - -
- -   - -
- -
- -   - -
- -   - -
- -
- Try enabling and disabling containers with & without - state transition events, and compare performance! -
-
-
-
- Non-focusable container with focusable controls: - In this case, the container itself isn't focusable, but each control is:
-
-
-
-
-
- Another horizontal container: - -
-
-
-
-
- A decorated container: - -
-
- Select month -
-
January
-
February
-
March
-
April
-
May
-
June
-
July
-
August
-
September
-
October
-
November
-
December
-
-
-
- Year -
-
2001
-
2002
-
2003
-
2004
-
2005
-
2006
-
2007
-
2008
-
2009
-
2010
-
-
-
- Toggle Button -
-
-
Fancy Toggle Button
-
-
- Another Button -
-
-
-
-
-
- The same container, right-to-left: - - -
-
- Select month -
-
January
-
February
-
March
-
April
-
May
-
June
-
July
-
August
-
September
-
October
-
November
-
December
-
-
-
- Year -
-
2001
-
2002
-
2003
-
2004
-
2005
-
2006
-
2007
-
2008
-
2009
-
2010
-
-
-
- Toggle Button -
-
-
Fancy Toggle Button
-
-
- Another Button -
-
-
-
-
-
- A scrolling container: - -

- Put focus in the text box and use the arrow keys: - -

-

- Or quick jump to item: - - 0 1 2 3 - 4 5 6 7 - 8 9 10 11 - 12 13 14 15 - -

-
-
menuitem 0
-
menuitem 1
-
menuitem 2
-
menuitem 3
-
tog 4
-
tog 5
-
tog 6
-
toggley 7
-
toggley 8
-
toggley 9
-
toggley 10
-
toggley 11
-
toggley 12
-
toggley 13
-
menuitem 14
-
menuitem 15
-
-
-
-
- -
- Event Log -
-
-
- - - diff --git a/third_party/closure/goog/demos/control.html b/third_party/closure/goog/demos/control.html deleted file mode 100644 index 39b31a3c33804..0000000000000 --- a/third_party/closure/goog/demos/control.html +++ /dev/null @@ -1,477 +0,0 @@ - - - - - goog.ui.Control Demo - - - - - - -

goog.ui.Control

- - - - - - - -
- -
- This control was created programmatically:  -
-
- This control dispatches ENTER, LEAVE, and ACTION events on - mouseover, mouseout, and mouseup, respectively. It supports - keyboard focus. -
-
-
- This was created by decorating a SPAN:  - - Decorated Example - -
- - You need to enable this component first. - -
-
- This control is configured to dispatch state transition events in - addition to ENTER, LEAVE, and ACTION. It also supports keyboard - focus. Watch the event log as you interact with this component. -
-
- -
- -
-
-

Custom Renderers

-
- - This control was created using a custom renderer:  - -
-
-
-
- - This was created by decorating a DIV via a custom renderer:  - -
- -   - - - Insert Picture - -
-
-
-

Extra CSS Styling

-
- - These controls have extra CSS classes applied:  - -
-
-
- Use the addClassName API to add additional CSS class names - to controls, before or after they're rendered or decorated. -
-
-

Right-to-Left Rendering

-
- - These controls are rendered right-to-left:  - -

These right-to-left controls were progammatically created:

-
-

These right-to-left controls were decorated:

-
-
- Hello, world -
- Sample control -
-
-

- On pre-FF3 Gecko, margin-left and margin-right are - ignored, so controls render right next to each other. - A workaround is to include some &nbsp;s in between - controls. -

-
-
- -
- Event Log -
-
-
- - The control with the - orange outline - has keyboard focus. - -
-
- - - diff --git a/third_party/closure/goog/demos/css3button.html b/third_party/closure/goog/demos/css3button.html deleted file mode 100644 index e58bc60594f58..0000000000000 --- a/third_party/closure/goog/demos/css3button.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - goog.ui.Css3ButtonRenderer Demo - - - - - - - - -

Demo of goog.ui.Css3ButtonRenderer

-
- - These buttons were rendered using - goog.ui.Css3ButtonRenderer: - -
- These buttons were created programmatically:
-
-
- These buttons were created by decorating some DIVs, and they dispatch - state transition events (watch the event log):
-
-
- Decorated Button, yay! -
Decorated Disabled -
Another Button
- Archive -
- Delete -
- Report Spam -
-
-
- Use these ToggleButtons to hide/show and enable/disable - the middle button:
-
Enable
-
Show
-

- Combined toggle buttons
-
- Bold -
- Italics -
- Underlined -
-
-
-
- -
- Event Log -
-
- - - - diff --git a/third_party/closure/goog/demos/css3menubutton.html b/third_party/closure/goog/demos/css3menubutton.html deleted file mode 100644 index 0fd2c5863d17c..0000000000000 --- a/third_party/closure/goog/demos/css3menubutton.html +++ /dev/null @@ -1,285 +0,0 @@ - - - - - goog.ui.Css3MenuButtonRenderer Demo - - - - - - - - - - - - -

goog.ui.Css3MenuButtonRenderer

- - - - - - - -
-
- - These MenuButtons were created programmatically: -   - - - - - - - - -
- - - Enable first button: - -   - Show second button: - -   -
- -
-
-
- - This MenuButton decorates an element:  - - - - - - - - -
-
- -
- Format - -
-
Bold
-
Italic
-
Underline
-
-
- Strikethrough -
-
-
Font...
-
Color...
-
-
-
- Enable button: - -   - Show button: - -   -
- -
-
-
- -
- Event Log -
-
-
-
-
- - - diff --git a/third_party/closure/goog/demos/cssspriteanimation.html b/third_party/closure/goog/demos/cssspriteanimation.html deleted file mode 100644 index 5d46ab49242f3..0000000000000 --- a/third_party/closure/goog/demos/cssspriteanimation.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - -CssSpriteAnimation demo - - - - - - -

The following just runs and runs...

-
- -

The animation is just an ordinary animation so you can pause it etc. -

- -

- - -

- -

The animation can be played once by stopping it after it finishes for the -first time. - -

- - - - - diff --git a/third_party/closure/goog/demos/datepicker.html b/third_party/closure/goog/demos/datepicker.html deleted file mode 100644 index 6ed69a20d1586..0000000000000 --- a/third_party/closure/goog/demos/datepicker.html +++ /dev/null @@ -1,183 +0,0 @@ - - - - - - goog.ui.DatePicker - - - - - - -

goog.ui.DatePicker

- - -
-

Default: ISO 8601

-
-
 
- -

-

Custom

-
-
-
-
-
-
-
-
-
-
-
-
 
- -
- -

English (US)

-
-
 
- -

- -

German

-
-
 
- -

- -

Malayalam

-
-
 
- -

- -

Arabic (Yemen)

-
-
 
- -

-
- - - - diff --git a/third_party/closure/goog/demos/debug.html b/third_party/closure/goog/demos/debug.html deleted file mode 100644 index 82cdab8dc6785..0000000000000 --- a/third_party/closure/goog/demos/debug.html +++ /dev/null @@ -1,119 +0,0 @@ - - - - -Debug - - - - -Look in the log window for debugging examples. - - - diff --git a/third_party/closure/goog/demos/depsgraph.html b/third_party/closure/goog/demos/depsgraph.html deleted file mode 100644 index a1f596204c092..0000000000000 --- a/third_party/closure/goog/demos/depsgraph.html +++ /dev/null @@ -1,220 +0,0 @@ - - - - -Deps Tree - - - - - -

Closure Dependency Graph

- - - -
selected item
-
...is in same file as the selected item
-
...is a dependency of the selected item
-
the selected item is a dependency of...
- - diff --git a/third_party/closure/goog/demos/dialog.html b/third_party/closure/goog/demos/dialog.html deleted file mode 100644 index 47576c026f29a..0000000000000 --- a/third_party/closure/goog/demos/dialog.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - goog.ui.Dialog - - - - - - - - -

goog.ui.Dialog

-
- - (use "Space" to open dialog with no Iframe, "Enter" to open with Iframe - mask -
-
- -
- -
- - - -
- A sample web page -

- A World Beyond AJAX: Accessing Google's APIs from Flash and - Non-JavaScript Environments -

- Vadim Spivak (Google) - -

- AJAX isn't the only way to access Google APIs. Learn how to use Google's - services from Flash and other non-JavaScript programming environments. - We'll show you how easy it is to augment your site with dynamic search - and feed data from non-JavaScript environments. -

- -

- Participants should be familiar with general web application - development. -

- -

Select Element: - -

- -

- - - - - - -

-
- - - diff --git a/third_party/closure/goog/demos/dimensionpicker.html b/third_party/closure/goog/demos/dimensionpicker.html deleted file mode 100644 index baf013b52aeed..0000000000000 --- a/third_party/closure/goog/demos/dimensionpicker.html +++ /dev/null @@ -1,108 +0,0 @@ - - - - - goog.ui.DimensionPicker - - - - - - - -

goog.ui.DimensionPicker

- - - - - - - -
-
- Demo of the goog.ui.DimensionPicker - component: - -
- -
- -
-
-
-
-
- -
- Event Log -
-
-
-
-
- - - diff --git a/third_party/closure/goog/demos/dimensionpicker_rtl.html b/third_party/closure/goog/demos/dimensionpicker_rtl.html deleted file mode 100644 index c6e9718ecd7ad..0000000000000 --- a/third_party/closure/goog/demos/dimensionpicker_rtl.html +++ /dev/null @@ -1,123 +0,0 @@ - - - - - goog.ui.DimensionPicker - - - - - - - - - -

goog.ui.DimensionPicker

- - - - - - - -
- -
- Event Log -
-
-
-
- Demo of the goog.ui.DimensionPicker - component: - -
-

- -
- -
-
-
-
-
-
-
- - - diff --git a/third_party/closure/goog/demos/dom_selection.html b/third_party/closure/goog/demos/dom_selection.html deleted file mode 100644 index 51cdd7400d1b6..0000000000000 --- a/third_party/closure/goog/demos/dom_selection.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - - - - - - - - - - -
- - - - - - - -
- - - - - - diff --git a/third_party/closure/goog/demos/drag.html b/third_party/closure/goog/demos/drag.html deleted file mode 100644 index 8d4b5499ec4d9..0000000000000 --- a/third_party/closure/goog/demos/drag.html +++ /dev/null @@ -1,191 +0,0 @@ - - - - goog.fx.Dragger - - - - - - - -

goog.fx.Dragger

-

Demonstrations of the drag utiities.

- -
- -
Drag Me...
-
Drag Me...
-
Drag Me...
- -
-
0
- - - - - - diff --git a/third_party/closure/goog/demos/dragdrop.html b/third_party/closure/goog/demos/dragdrop.html deleted file mode 100644 index 725c8f1da4e33..0000000000000 --- a/third_party/closure/goog/demos/dragdrop.html +++ /dev/null @@ -1,263 +0,0 @@ - - - - - goog.fx.DragDrop - - - - - - - -

goog.fx.DragDrop

- -List 1 (combined source/target, can be dropped on list 1, list 2, button 1 or -button 2). -
    -
  • Item 1.1
  • -
  • Item 1.2
  • -
  • Item 1.3
  • -
  • Item 1.4
  • -
  • Item 1.5
  • -
  • Item 1.6
  • -
  • Item 1.7
  • -
  • Item 1.8
  • -
  • Item 1.9
  • -
  • Item 1.10
  • -
  • Item 1.11
  • -
  • Item 1.12
  • -
  • Item 1.13
  • -
  • Item 1.14
  • -
  • Item 1.15
  • -
- -List 2 (source only, can be dropped on list 1 or button 2) -
    -
  • Item 2.1
  • -
  • Item 2.2
  • -
  • Item 2.3
  • -
  • Item 2.4
  • -
  • Item 2.5
  • -
  • Item 2.6
  • -
  • Item 2.7
  • -
  • Item 2.8
  • -
  • Item 2.9
  • -
  • Item 2.10
  • -
  • Item 2.11
  • -
  • Item 2.12
  • -
  • Item 2.13
  • -
  • Item 2.14
  • -
  • Item 2.15
  • -
- -
- Button 1 (combined source/target, can be dropped on list 1) -
- -
- Button 2 (target only) -
- - - - - diff --git a/third_party/closure/goog/demos/dragdropdetector.html b/third_party/closure/goog/demos/dragdropdetector.html deleted file mode 100644 index 6787c0bc33999..0000000000000 --- a/third_party/closure/goog/demos/dragdropdetector.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - goog.ui.DragDropDetector - - - - - - - -

goog.ui.DragDropDetector

-

Try dropping images from other web pages on this page.

- - - diff --git a/third_party/closure/goog/demos/dragdropdetector_target.html b/third_party/closure/goog/demos/dragdropdetector_target.html deleted file mode 100644 index fe09b48ebeb0a..0000000000000 --- a/third_party/closure/goog/demos/dragdropdetector_target.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - diff --git a/third_party/closure/goog/demos/dragger.html b/third_party/closure/goog/demos/dragger.html deleted file mode 100644 index 90eb4d1819bcf..0000000000000 --- a/third_party/closure/goog/demos/dragger.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - -goog.fx.Dragger - - - - - - - -

goog.fx.Dragger

- -

This demo shows how to use a dragger to capture mouse move events. It tests -that you can drag things outside the window and that alerts ends the dragging. - -

Drag me

-
Status
- -
Drag over me to generate an -alert
- - - - diff --git a/third_party/closure/goog/demos/draglistgroup.html b/third_party/closure/goog/demos/draglistgroup.html deleted file mode 100644 index 7ac573378214b..0000000000000 --- a/third_party/closure/goog/demos/draglistgroup.html +++ /dev/null @@ -1,273 +0,0 @@ - - - - - goog.fx.DragListGroup - - - - - - - - -

goog.fx.DragListGroup

-

You can drag any squares into any of the first 4 lists.

-
- -

Horizontal list 1 (grows right):

-
-
1
-
2
-
3
-
4
-
-
- - - - - - - - - -
-

Vertical list 1:

-
-
1
-
2
-
3
-
4
-
-
-

Vertical list 2 (style changes on drag hover):

-
-
1
-
2
-
3
-
4
-
-
-
-

Horizontal list 3 (grows left):

-

Bug: drop position is off by one.

-
-
1
-
2
-
3
-
4
-
-
- -

Horizontal list 5 (grows right, has multiple rows, hysteresis is enabled):

-

Bug: can't drop into the last row.

-
-
11
-
22
-
33
-
44
-
55
-
66
-
77
-
88
-
99
-
-
- -

The items in this list can be moved around with shift-dragging:

-
-
1
-
2
-
3
-
4
-
-
- -

The items have different width:

-

- Bug: the drop positions are off. - For example try moving box 1 a bit to the left. -

-
-
1
-
2
-
3
-
4
-
-
- - - diff --git a/third_party/closure/goog/demos/dragscrollsupport.html b/third_party/closure/goog/demos/dragscrollsupport.html deleted file mode 100644 index 8d54a4da2225f..0000000000000 --- a/third_party/closure/goog/demos/dragscrollsupport.html +++ /dev/null @@ -1,133 +0,0 @@ - - - - - goog.fx.DragScrollSupport - - - - - - - -

goog.fx.DragScrollSupport

- -List 1 in a scrollable area. -
-
    -
  • Item 1.1 ----------
  • -
  • Item 1.2 ----------
  • -
  • Item 1.3 ----------
  • -
  • Item 1.4 ----------
  • -
  • Item 1.5 ----------
  • -
  • Item 1.6 ----------
  • -
  • Item 1.7 ----------
  • -
  • Item 1.8 ----------
  • -
  • Item 1.9 ----------
  • -
  • Item 1.10 ----------
  • -
  • Item 1.11 ----------
  • -
  • Item 1.12 ----------
  • -
  • Item 1.13 ----------
  • -
  • Item 1.14 ----------
  • -
  • Item 1.15 ----------
  • -
-
- - - - diff --git a/third_party/closure/goog/demos/drilldownrow.html b/third_party/closure/goog/demos/drilldownrow.html deleted file mode 100644 index cc8d87a1c9205..0000000000000 --- a/third_party/closure/goog/demos/drilldownrow.html +++ /dev/null @@ -1,78 +0,0 @@ - - - - -Demo of DrilldownRow - - - - - - - - - - - - - - - - -
Column HeadSecond Head
First rowSecond column
- - - - diff --git a/third_party/closure/goog/demos/editor/editor.html b/third_party/closure/goog/demos/editor/editor.html deleted file mode 100644 index 24aba99e12d5f..0000000000000 --- a/third_party/closure/goog/demos/editor/editor.html +++ /dev/null @@ -1,139 +0,0 @@ - - - - - - goog.editor Demo - - - - - - - - - - - - - - - - - - - - - - - - - - - -

goog.editor Demo

-

This is a demonstration of a editable field, with installed plugins, -hooked up to a toolbar.

-
-
-
-
-

Current field contents - (updates as contents of the editable field above change):
-
- - (Use to set contents of the editable field to the contents of this textarea) -

- - - - diff --git a/third_party/closure/goog/demos/editor/equationeditor.html b/third_party/closure/goog/demos/editor/equationeditor.html deleted file mode 100644 index 8b78f59e35545..0000000000000 --- a/third_party/closure/goog/demos/editor/equationeditor.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - -Equation Editor Test - - - - - - - - - - -Open Editor Dialog -   -Initial equation: - - - - - diff --git a/third_party/closure/goog/demos/editor/equationeditor.js b/third_party/closure/goog/demos/editor/equationeditor.js index 87ae7bd8c6c0f..5cde22facc52a 100644 --- a/third_party/closure/goog/demos/editor/equationeditor.js +++ b/third_party/closure/goog/demos/editor/equationeditor.js @@ -24,6 +24,7 @@ goog.require('goog.ui.equation.EquationEditorDialog'); /** * @constructor + * @final */ goog.demos.editor.EquationEditor = function() { }; diff --git a/third_party/closure/goog/demos/editor/field_basic.html b/third_party/closure/goog/demos/editor/field_basic.html deleted file mode 100644 index 69a46dc34354a..0000000000000 --- a/third_party/closure/goog/demos/editor/field_basic.html +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - goog.editor.Field - - - - - - -

goog.editor.Field

-

This is a very basic demonstration of how to make a region editable.

- - -

-
I am a regular div. Click "Make Editable" above to transform me into an editable region.
-
-

Current field contents - (updates as contents of the editable field above change):
-
- - (Use to set contents of the editable field to the contents of this textarea) -

- - - - diff --git a/third_party/closure/goog/demos/editor/helloworld.html b/third_party/closure/goog/demos/editor/helloworld.html deleted file mode 100644 index 6ce5d99b16f3e..0000000000000 --- a/third_party/closure/goog/demos/editor/helloworld.html +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - goog.editor Hello World plugins Demo - - - - - - - - -

goog.editor Hello World plugins Demo

-

This is a demonstration of an editable field with the two sample plugins - installed: goog.editor.plugins.HelloWorld and - goog.editor.plugins.HelloWorldDialogPlugin.

-
- -
-
    -
  • Click Hello World to insert "Hello World!".
  • -
  • Click Hello World Dialog to open a dialog where you can customize - your hello world message to be inserted.
  • -
The hello world message will be inserted at the cursor, or will replace - the selected text.
-
-

Current field contents - (updates as contents of the editable field above change):
-
- - (Use to set contents of the editable field to the contents of this textarea) -

- - - - diff --git a/third_party/closure/goog/demos/editor/helloworld.js b/third_party/closure/goog/demos/editor/helloworld.js index 63b265870e016..4b2f0c7a5ed11 100644 --- a/third_party/closure/goog/demos/editor/helloworld.js +++ b/third_party/closure/goog/demos/editor/helloworld.js @@ -33,6 +33,7 @@ goog.require('goog.editor.Plugin'); * Plugin to insert 'Hello World!' into an editable field. * @constructor * @extends {goog.editor.Plugin} + * @final */ goog.demos.editor.HelloWorld = function() { goog.editor.Plugin.call(this); diff --git a/third_party/closure/goog/demos/editor/helloworlddialog.js b/third_party/closure/goog/demos/editor/helloworlddialog.js index 5efb7a8f6bf20..5ab271e161426 100644 --- a/third_party/closure/goog/demos/editor/helloworlddialog.js +++ b/third_party/closure/goog/demos/editor/helloworlddialog.js @@ -36,6 +36,7 @@ goog.require('goog.ui.editor.AbstractDialog'); * dialog's dom structure. * @constructor * @extends {goog.ui.editor.AbstractDialog} + * @final */ goog.demos.editor.HelloWorldDialog = function(domHelper) { goog.ui.editor.AbstractDialog.call(this, domHelper); @@ -53,6 +54,7 @@ goog.inherits(goog.demos.editor.HelloWorldDialog, * @param {string} message Customized hello world message chosen by the user. * @constructor * @extends {goog.events.Event} + * @final */ goog.demos.editor.HelloWorldDialog.OkEvent = function(message) { this.message = message; diff --git a/third_party/closure/goog/demos/editor/helloworlddialogplugin.js b/third_party/closure/goog/demos/editor/helloworlddialogplugin.js index d7efc17b816d4..56a65b67ad045 100644 --- a/third_party/closure/goog/demos/editor/helloworlddialogplugin.js +++ b/third_party/closure/goog/demos/editor/helloworlddialogplugin.js @@ -36,6 +36,7 @@ goog.require('goog.ui.editor.AbstractDialog'); * A plugin that opens the hello world dialog. * @constructor * @extends {goog.editor.plugins.AbstractDialogPlugin} + * @final */ goog.demos.editor.HelloWorldDialogPlugin = function() { goog.editor.plugins.AbstractDialogPlugin.call(this, diff --git a/third_party/closure/goog/demos/editor/seamlessfield.html b/third_party/closure/goog/demos/editor/seamlessfield.html deleted file mode 100644 index 64265dfd142d5..0000000000000 --- a/third_party/closure/goog/demos/editor/seamlessfield.html +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - goog.editor.SeamlessField - - - - - - -

goog.editor.SeamlessField

-

This is a very basic demonstration of how to make a region editable, that - blends in with the surrounding page, even if the editable content is inside - an iframe.

- - -
-
-

-
I am a regular div. - Click "Make Editable" above to transform me into an editable region. - I'll grow and shrink with my content! - And I'll inherit styles from the parent document. - -

Heading styled by outer document.

-
    -
  1. And lists too! One!
  2. -
  3. Two!
  4. -
-

Paragraph 1

-
-

Inherited CSS works!

-
-
-

-
-
-

Current field contents - (updates as contents of the editable field above change):
-
- - (Use to set contents of the editable field to the contents of this textarea) -

- - - - diff --git a/third_party/closure/goog/demos/editor/tableeditor.html b/third_party/closure/goog/demos/editor/tableeditor.html deleted file mode 100644 index 517679155632c..0000000000000 --- a/third_party/closure/goog/demos/editor/tableeditor.html +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - goog.editor.plugins.TableEditor Demo - - - - - - - - - - - - - - - - - - - - -

goog.editor.plugins.TableEditor Demo

-

This is a demonstration of the table editor plugin for goog.editor.

-
-
-
-
-

Current field contents - (updates as contents of the editable field above change):
-
- - (Use to set contents of the editable field to the contents of this textarea) -

- - - - diff --git a/third_party/closure/goog/demos/effects.html b/third_party/closure/goog/demos/effects.html deleted file mode 100644 index a9de5fee6828f..0000000000000 --- a/third_party/closure/goog/demos/effects.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - goog.fx.dom - - - - - - -

goog.fx.dom

-

Demonstrations of the goog.fx.dom library

- -

-
-
-
- -

- -

-
-
-
-
- -

- -

-
- -

- -

-
-
-
- -

- -

- -

- - -

- - - - diff --git a/third_party/closure/goog/demos/event-propagation.html b/third_party/closure/goog/demos/event-propagation.html deleted file mode 100644 index 47eac153afad2..0000000000000 --- a/third_party/closure/goog/demos/event-propagation.html +++ /dev/null @@ -1,192 +0,0 @@ - - - - -goog.events - - - - - - - -

goog.events - Stop Propagation

-

Test the cancelling of capture and bubbling events. Click - one of the nodes to see the event trace, then use the check boxes to cancel the - capture or bubble at a given branch. - (Double click the text area to clear it)

- -
- -
- - - - - diff --git a/third_party/closure/goog/demos/events.html b/third_party/closure/goog/demos/events.html deleted file mode 100644 index 02f817365ab12..0000000000000 --- a/third_party/closure/goog/demos/events.html +++ /dev/null @@ -1,99 +0,0 @@ - - - - Event Test - - - - -

- Link 1
- Link 2
- Link 3
- Link 4 -

-

- Listen | - UnListen | - Remove All | - Remove One | - Remove Two | - Remove Three | -

-

-
-  
- Test 1 -
-     Test 2 -
-         Test 3 -
-     Test 2 -
- Test 1 -
- - - - diff --git a/third_party/closure/goog/demos/eventtarget.html b/third_party/closure/goog/demos/eventtarget.html deleted file mode 100644 index b26250e385a8f..0000000000000 --- a/third_party/closure/goog/demos/eventtarget.html +++ /dev/null @@ -1,70 +0,0 @@ - - - - Event Test - - - - - - - - diff --git a/third_party/closure/goog/demos/filedrophandler.html b/third_party/closure/goog/demos/filedrophandler.html deleted file mode 100644 index e6a330dc3eceb..0000000000000 --- a/third_party/closure/goog/demos/filedrophandler.html +++ /dev/null @@ -1,65 +0,0 @@ - - - - - goog.events.FileDropHandler Demo - - - - - -

Demo of goog.events.FileDropHandler

- -
- Demo of the goog.events.FileDropHandler: - - -
- -
- Event Log -
-
- - - - diff --git a/third_party/closure/goog/demos/filteredmenu.html b/third_party/closure/goog/demos/filteredmenu.html deleted file mode 100644 index b07a58b946a24..0000000000000 --- a/third_party/closure/goog/demos/filteredmenu.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - -goog.ui.FilteredMenu - - - - - - - - - - - - - - - - - - - diff --git a/third_party/closure/goog/demos/focushandler.html b/third_party/closure/goog/demos/focushandler.html deleted file mode 100644 index b29bc100bfc97..0000000000000 --- a/third_party/closure/goog/demos/focushandler.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - -goog.events.FocusHandler - - - - - -

goog.events.FocusHandler

-

i1: - - -

i2 - - -

i3: - -

- - - - diff --git a/third_party/closure/goog/demos/fpsdisplay.html b/third_party/closure/goog/demos/fpsdisplay.html deleted file mode 100644 index 65f9c5015ce27..0000000000000 --- a/third_party/closure/goog/demos/fpsdisplay.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - -FPS Display - - - - -

- - - -
- - - diff --git a/third_party/closure/goog/demos/fx/css3/transition.html b/third_party/closure/goog/demos/fx/css3/transition.html deleted file mode 100644 index ae4eb0a4c0d30..0000000000000 --- a/third_party/closure/goog/demos/fx/css3/transition.html +++ /dev/null @@ -1,222 +0,0 @@ - - - - - -Closure: CSS3 Transition Demo - - - - - - - - -
-
-
- CSS3 transition choices -
-
-
-
-
-
-
-
- -
- - -
-
-
-
-
-
Hi there!
-
- - -
- Event log for the transition object -
-
- - - - diff --git a/third_party/closure/goog/demos/gauge.html b/third_party/closure/goog/demos/gauge.html deleted file mode 100644 index cc7ac08fc3ea1..0000000000000 --- a/third_party/closure/goog/demos/gauge.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - goog.ui.Gauge - - - - - - - - - -

goog.ui.Gauge

-

Note: This component requires vector graphics support

- - - - - - - - - - - - - -
- Basic - - Background colors, title. custom ticks - - Value change, formatted value, tick labels - - Custom colors -
- - - - - -
- - -
-
- -
- - - diff --git a/third_party/closure/goog/demos/graphics/advancedcoordinates.html b/third_party/closure/goog/demos/graphics/advancedcoordinates.html deleted file mode 100644 index 6274fda217508..0000000000000 --- a/third_party/closure/goog/demos/graphics/advancedcoordinates.html +++ /dev/null @@ -1,141 +0,0 @@ - - - - - Graphics Advanced Coordinates Demo Page - - - - - - - -
-

- W: - H: - R: -

- -

The front ellipse is sized based on absolute units. The back ellipse is - sized based on percentage of the parent.

- -
- - - diff --git a/third_party/closure/goog/demos/graphics/advancedcoordinates2.html b/third_party/closure/goog/demos/graphics/advancedcoordinates2.html deleted file mode 100644 index f05323fe039d2..0000000000000 --- a/third_party/closure/goog/demos/graphics/advancedcoordinates2.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - Graphics Advanced Coordinates Demo Page - - Using Percentage Based Surface Size - - - - - - - - - - - diff --git a/third_party/closure/goog/demos/graphics/basicelements.html b/third_party/closure/goog/demos/graphics/basicelements.html deleted file mode 100644 index d55645af1c672..0000000000000 --- a/third_party/closure/goog/demos/graphics/basicelements.html +++ /dev/null @@ -1,264 +0,0 @@ - - - - - - Graphics Basic Elements Demo Page - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Text: fonts, alignment, vertical-alignment, direction - - Basic shapes: Rectangle, Circle, Ellipses, Path, Clip to canvas -
- - - -
- Paths: Lines, arcs, curves - - Colors: solid, gradients, transparency -
- - - -
- Coordinate scaling + stroke types -
- -
- - - diff --git a/third_party/closure/goog/demos/graphics/events.html b/third_party/closure/goog/demos/graphics/events.html deleted file mode 100644 index b3310fd2c5fe8..0000000000000 --- a/third_party/closure/goog/demos/graphics/events.html +++ /dev/null @@ -1,113 +0,0 @@ - - - - - Graphics Basic events Demo Page - - - - - - - - -
- -
- -
- -
- -

- Clear Log -

- -
- -

Try to mouse over, mouse out, or click the ellipse and the group of - circles. The ellipse will be disposed in 10 sec. -

- - - - diff --git a/third_party/closure/goog/demos/graphics/modifyelements.html b/third_party/closure/goog/demos/graphics/modifyelements.html deleted file mode 100644 index 1d21c583ba61e..0000000000000 --- a/third_party/closure/goog/demos/graphics/modifyelements.html +++ /dev/null @@ -1,195 +0,0 @@ - - - - - - Modifing Graphic Elements Demo - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Colors (stroke/fill): - - - - - -
Rectangle position: - - - -
Rectangle size: - - - -
Ellipse center: - - - -
Ellipse radius: - - - -
Path: - - -
Text: - -
- - -
- - - - diff --git a/third_party/closure/goog/demos/graphics/subpixel.html b/third_party/closure/goog/demos/graphics/subpixel.html deleted file mode 100644 index 947eae282049d..0000000000000 --- a/third_party/closure/goog/demos/graphics/subpixel.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - -Sub pixel rendering - - - - - - - - diff --git a/third_party/closure/goog/demos/graphics/tiger.html b/third_party/closure/goog/demos/graphics/tiger.html deleted file mode 100644 index 64deebcdde287..0000000000000 --- a/third_party/closure/goog/demos/graphics/tiger.html +++ /dev/null @@ -1,105 +0,0 @@ - - - - -The SVG tiger drawn with goog.graphics - - - - - - - -
-
-
- - - diff --git a/third_party/closure/goog/demos/history1.html b/third_party/closure/goog/demos/history1.html deleted file mode 100644 index f6e38d0b2fb7d..0000000000000 --- a/third_party/closure/goog/demos/history1.html +++ /dev/null @@ -1,132 +0,0 @@ - - - - - goog.History - - - - - - - -

goog.History

-

This page demonstrates the goog.History object which can create new browser - history entries without leaving the page. This version uses the hash portion of - the URL to make the history state available to the user. These URLs can be - bookmarked, edited, pasted in emails, etc., just like normal URLs. The browser's - back and forward buttons will navigate between the visited history states.

- -

Try following the hash links below, or updating the location with your own - tokens. Replacing the token will update the page address without appending a - new history entry.

- -

- Set #fragment
- first
- second
- third -

- -

- Set Token
- - - - - -

- -

- - - -

- -
-

The current history state:

-
-
- -

The state should be correctly restored after you - leave the page and hit the back button.

- -

The history object can also be created so that the history state is not - user-visible/modifiable. - See history2.html for a demo. - To see visible/modifiable history work when the goog.History code itself is - loaded inside a hidden iframe, - see history3.html. -

- -
- Event Log -
-
- - - - - diff --git a/third_party/closure/goog/demos/history2.html b/third_party/closure/goog/demos/history2.html deleted file mode 100644 index fd010d191e567..0000000000000 --- a/third_party/closure/goog/demos/history2.html +++ /dev/null @@ -1,119 +0,0 @@ - - - - - goog.History #2 - - - - - - -

goog.History #2

-

This page demonstrates the goog.History object which can create new browser - history entries without leaving the page. This version maintains the history - state internally, so that states are not visible or editable by the user, but - the back and forward buttons can still be used to move between history states. -

- -

Try setting a few history tokens using the buttons and box below, then hit - the back and forward buttons to test if the tokens are correctly restored.

- - - - -
- - - - - - - -

- - - -

- -
-

The current history state:

-
-
- -

The state should be correctly restored after you - leave the page and hit the back button.

- -

The history object can also be created so that the history state is visible - and modifiable by the user. See history1.html for a - demo.

- -
- Event Log -
-
- - - - - diff --git a/third_party/closure/goog/demos/history3.html b/third_party/closure/goog/demos/history3.html deleted file mode 100644 index d1466f80f9800..0000000000000 --- a/third_party/closure/goog/demos/history3.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - -History Demo 3 - - - - - - -

This page demonstrates a goog.History object used in an iframe. Loading JS -code in an iframe is useful for large apps because the JS code can be sent in -bite-sized script blocks that browsers can evaluate incrementally, as they are -received over the wire.

- -

For an introduction to the goog.History object, see history1.html and history2.html. This demo uses visible history, like -the first demo.

- -

Try following the hash links below, or updating the location with your own -tokens. Replacing the token will update the page address without appending a -new history entry.

- -

- Set #fragment
- first
- second
- third -

- -

- Set Token
- - - - - -

- -

- - - -

- -
-

The current history state:

-
-
- -

The state should be correctly restored after you -leave the page and hit the back button.

- -
- Event Log -
-
- - - - - - - - diff --git a/third_party/closure/goog/demos/history3js.html b/third_party/closure/goog/demos/history3js.html deleted file mode 100644 index a575a047306db..0000000000000 --- a/third_party/closure/goog/demos/history3js.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - -History Demo JavaScript Page - - - - - - - diff --git a/third_party/closure/goog/demos/history_blank.html b/third_party/closure/goog/demos/history_blank.html deleted file mode 100644 index 189d905626cf0..0000000000000 --- a/third_party/closure/goog/demos/history_blank.html +++ /dev/null @@ -1,26 +0,0 @@ - - - -Intentionally left blank - - -This is a blank helper page for the goog.History demos. See -demo 1 and -demo 2. - - diff --git a/third_party/closure/goog/demos/hovercard.html b/third_party/closure/goog/demos/hovercard.html deleted file mode 100644 index 8284921595c31..0000000000000 --- a/third_party/closure/goog/demos/hovercard.html +++ /dev/null @@ -1,177 +0,0 @@ - - - - - goog.ui.HoverCard - - - - - - - -

goog.ui.HoverCard

-

- Show by mouse position:


- Tom Smith - Dick Jones - Harry Brown - -


Show hovercard to the right:


- Tom Smith - Dick Jones - Harry Brown - -


Show hovercard below:


- Tom Smith - Dick Jones - Harry Brown - -


- -

- - - - -
- Event Log -
-
-
-
- - - - - - diff --git a/third_party/closure/goog/demos/hsvapalette.html b/third_party/closure/goog/demos/hsvapalette.html deleted file mode 100644 index ec60c75d568ad..0000000000000 --- a/third_party/closure/goog/demos/hsvapalette.html +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - goog.ui.HsvaPalette - - - - - - - -

goog.ui.HsvaPalette

- -

Normal Size

- - - -

Smaller Size

- - - - - diff --git a/third_party/closure/goog/demos/hsvpalette.html b/third_party/closure/goog/demos/hsvpalette.html deleted file mode 100644 index 2717ed18e57cf..0000000000000 --- a/third_party/closure/goog/demos/hsvpalette.html +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - goog.ui.HsvPalette - - - - - - - -

goog.ui.HsvPalette

- -

Normal Size

- - - -

Smaller Size

- - - - - diff --git a/third_party/closure/goog/demos/html5history.html b/third_party/closure/goog/demos/html5history.html deleted file mode 100644 index b88684620531b..0000000000000 --- a/third_party/closure/goog/demos/html5history.html +++ /dev/null @@ -1,87 +0,0 @@ - - - - - goog.history.Html5History Demo - - - - - - -

goog.history.Html5History

- - - -
- -
-
- -
-
- -
-
- -
- - - - diff --git a/third_party/closure/goog/demos/imagelessbutton.html b/third_party/closure/goog/demos/imagelessbutton.html deleted file mode 100644 index fc6d5a68d7f2d..0000000000000 --- a/third_party/closure/goog/demos/imagelessbutton.html +++ /dev/null @@ -1,221 +0,0 @@ - - - - - - goog.ui.ImagelessButtonRenderer Demo - - - - - - - - -

goog.ui.ImagelessButtonRenderer

-
- - These buttons were rendered using - goog.ui.ImagelessButtonRenderer: - -
- These buttons were created programmatically:
-
-
- These buttons were created by decorating some DIVs, and they dispatch - state transition events (watch the event log):
-
- -
- Decorated Button, yay! -
-
Decorated Disabled
-
Another Button
-
- Archive -
- Delete -
- Report Spam -
-
-
- Use these ToggleButtons to hide/show and enable/disable - the middle button:
-
Enable
- -
Show
- -

- Combined toggle buttons
-
- Bold -
- Italics -
- Underlined -
-

- These buttons have icons, and the second one has an extra CSS class:
-
-
-
-
-
- -
- Event Log -
-
- - - - diff --git a/third_party/closure/goog/demos/imagelessmenubutton.html b/third_party/closure/goog/demos/imagelessmenubutton.html deleted file mode 100644 index e47b3225783eb..0000000000000 --- a/third_party/closure/goog/demos/imagelessmenubutton.html +++ /dev/null @@ -1,285 +0,0 @@ - - - - - goog.ui.ImagelessMenuButtonRenderer Demo - - - - - - - - - - - - -

goog.ui.ImagelessMenuButtonRenderer

- - - - - - - -
-
- - These MenuButtons were created programmatically: -   - - - - - - - - -
- - - Enable first button: - -   - Show second button: - -   -
- -
-
-
- - This MenuButton decorates an element:  - - - - - - - - -
-
- -
- Format - -
-
Bold
-
Italic
-
Underline
-
-
- Strikethrough -
-
-
Font...
-
Color...
-
-
-
- Enable button: - -   - Show button: - -   -
- -
-
-
- -
- Event Log -
-
-
-
-
- - - diff --git a/third_party/closure/goog/demos/index.html b/third_party/closure/goog/demos/index.html deleted file mode 100644 index 056c893803949..0000000000000 --- a/third_party/closure/goog/demos/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - Closure Demos - - - - - - - Are you kidding me? No frames?!? - - - diff --git a/third_party/closure/goog/demos/index_nav.html b/third_party/closure/goog/demos/index_nav.html deleted file mode 100644 index 1002554e07054..0000000000000 --- a/third_party/closure/goog/demos/index_nav.html +++ /dev/null @@ -1,255 +0,0 @@ - - - - - Closure Demos - - - - - - - -

Index

-
- - - diff --git a/third_party/closure/goog/demos/index_splash.html b/third_party/closure/goog/demos/index_splash.html deleted file mode 100644 index 86397df9b828e..0000000000000 --- a/third_party/closure/goog/demos/index_splash.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - Closure Demos - - - - -

Welcome to Closure!

-

Use the tree in the navigation pane to view Closure demos.

-
-

New! Common UI Controls

-

Check out these widgets by clicking on the demo links on the left:

- Common UI controls - - diff --git a/third_party/closure/goog/demos/inline_block_quirks.html b/third_party/closure/goog/demos/inline_block_quirks.html deleted file mode 100644 index 75202b8148d47..0000000000000 --- a/third_party/closure/goog/demos/inline_block_quirks.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - goog.style.setInlineBlock in quirks mode - - - - - - - -

goog.style.setInlineBlock in quirks mode

-

- This is a demonstration of the goog-inline-block CSS style. - This page is in quirks mode. - Click here for standards mode. -

-
- Hey, are these really -
DIV
s - inlined in my text here? I mean, I thought -
DIV
s - were block-level elements, and you couldn't inline them... - Must be that new -
goog-inline-block
- style... (Hint: Try resizing the window to see the -
DIV
s - flow naturally.) - Arv asked for an inline-block DIV with more interesting contents, so here - goes: -
-
- blue dot - Lorem ipsum dolor sit amet, - consectetuer adipiscing elit. - Donec rhoncus neque ut - neque porta consequat. - In tincidunt tellus vehicula tellus. Etiam ornare nunc - vel lectus. Vivamus quis nibh. Sed nunc. - On FF1.5 and FF2.0, you need to wrap the contents of your - inline-block element in a DIV or P with fixed width to get line - wrapping. -
-
-
-
-

- These are - SPANs - with the - goog-inline-block - style applied, so you can style them like block-level elements. - For example, give them - 10px margin, a - 10px border, or - 10px padding. - I used - vertical-align: middle - to make them all line up reasonably well. - (Except on Safari 2. Go figure.) -

-

- This is what the same content looks like without goog-inline-block: -

-

- These are - SPANs - with the - goog-inline-block - style applied, so you can style them like block-level elements. - For example, give them - 10px margin, a - 10px border, or - 10px padding. - I used - vertical-align: middle - to make them all line up reasonably well. - (Except on Safari 2. Go figure.) -

-

- Click here to use goog.style.setInlineBlock() to apply the inline-block style to these SPANs. -

-
-

- Works on Internet Explorer 6 & 7, Firefox 1.5, 2.0 & 3.0 Beta, Safari 2 & 3, - Webkit nightlies, and Opera 9. - Note: DIVs nested in SPANs don't work on Opera. -

- - diff --git a/third_party/closure/goog/demos/inline_block_standards.html b/third_party/closure/goog/demos/inline_block_standards.html deleted file mode 100644 index 5f4304893fb84..0000000000000 --- a/third_party/closure/goog/demos/inline_block_standards.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - goog.style.setInlineBlock in standards mode - - - - - - - -

goog.style.setInlineBlock in standards mode

-

- This is a demonstration of the goog-inline-block CSS style. - This page is in standards mode. - Click here for quirks mode. -

-
- Hey, are these really -
DIV
s - inlined in my text here? I mean, I thought -
DIV
s - were block-level elements, and you couldn't inline them... - Must be that new -
goog-inline-block
- style... (Hint: Try resizing the window to see the -
DIV
s - flow naturally.) - Arv asked for an inline-block DIV with more interesting contents, so here - goes: -
-
- blue dot - Lorem ipsum dolor sit amet, - consectetuer adipiscing elit. - Donec rhoncus neque ut - neque porta consequat. - In tincidunt tellus vehicula tellus. Etiam ornare nunc - vel lectus. Vivamus quis nibh. Sed nunc. - On FF1.5 and FF2.0, you need to wrap the contents of your - inline-block element in a DIV or P with fixed width to get line - wrapping. -
-
-
-
-

- These are - SPANs - with the - goog-inline-block - style applied, so you can style them like block-level elements. - For example, give them - 10px margin, a - 10px border, or - 10px padding. - I used - vertical-align: middle - to make them all line up reasonably well. - (Except on Safari 2. Go figure.) -

-

- This is what the same content looks like without goog-inline-block: -

-

- These are - SPANs - with the - goog-inline-block - style applied, so you can style them like block-level elements. - For example, give them - 10px margin, a - 10px border, or - 10px padding. - I used - vertical-align: middle - to make them all line up reasonably well. - (Except on Safari 2. Go figure.) -

-

- Click here to use goog.style.setInlineBlock() to apply the inline-block style to these SPANs. -

-
-

- Works on Internet Explorer 6 & 7, Firefox 1.5, 2.0 & 3.0 Beta, Safari 2 & 3, - Webkit nightlies, and Opera 9. - Note: DIVs nested in SPANs don't work on Opera. -

- - diff --git a/third_party/closure/goog/demos/inputdatepicker.html b/third_party/closure/goog/demos/inputdatepicker.html deleted file mode 100644 index 1e6c25fe012e2..0000000000000 --- a/third_party/closure/goog/demos/inputdatepicker.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - goog.ui.InputDatePicker - - - - - - - - -

goog.ui.InputDatePicker

- -
- -
-
- -
-
- - -
- - - diff --git a/third_party/closure/goog/demos/inputhandler.html b/third_party/closure/goog/demos/inputhandler.html deleted file mode 100644 index dca7d2c4b623d..0000000000000 --- a/third_party/closure/goog/demos/inputhandler.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - -goog.events.InputHandler - - - - - -

goog.events.InputHandler

-

- - -

- - - -

- - -

-

- Event Log -
-
- - - - diff --git a/third_party/closure/goog/demos/jsonprettyprinter.html b/third_party/closure/goog/demos/jsonprettyprinter.html deleted file mode 100644 index 369d7483f3bb7..0000000000000 --- a/third_party/closure/goog/demos/jsonprettyprinter.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - -Demo - goog.format.JsonPrettyPrinter - - - - - - - -Pretty-printed JSON. -
-
- -Pretty-printed JSON (Formatted using CSS). -
-
- - - diff --git a/third_party/closure/goog/demos/keyboardshortcuts.html b/third_party/closure/goog/demos/keyboardshortcuts.html deleted file mode 100644 index 2baec7b813b1a..0000000000000 --- a/third_party/closure/goog/demos/keyboardshortcuts.html +++ /dev/null @@ -1,112 +0,0 @@ - - - - - goog.ui.KeyboardShortcutHandler - - - - - - -

goog.ui.KeyboardShortcutHandler

-
- - - - - - -
-    Shortcuts:
-      A
-      T E S T
-      Shift+F12
-      Shift+F11 C
-      Ctrl+A
-      G O O G
-      B C
-      B D
-      Alt+Q A
-      Alt+Q Shift+A
-      Alt+Q Shift+B
-      Space
-      Home
-      Enter
-      G S
-      S
-      Meta+y
-  
- - - - diff --git a/third_party/closure/goog/demos/keyhandler.html b/third_party/closure/goog/demos/keyhandler.html deleted file mode 100644 index 004bb9ece7583..0000000000000 --- a/third_party/closure/goog/demos/keyhandler.html +++ /dev/null @@ -1,119 +0,0 @@ - - - - -goog.events.KeyHandler - - - - - - -

goog.events.KeyHandler

-

- -
-
-
-
-
Focusable div
-
- -
- No Tab inside this

- -
-
-
-
Focusable div
-
- -
- - - - - diff --git a/third_party/closure/goog/demos/labelinput.html b/third_party/closure/goog/demos/labelinput.html deleted file mode 100644 index a760b667f1129..0000000000000 --- a/third_party/closure/goog/demos/labelinput.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - goog.ui.LabelInput - - - - - - -

goog.ui.LabelInput

-

This component decorates an input with default text which disappears upon focus.

-
- -
- - -
- - diff --git a/third_party/closure/goog/demos/menu.html b/third_party/closure/goog/demos/menu.html deleted file mode 100644 index 1fbc722c9ad45..0000000000000 --- a/third_party/closure/goog/demos/menu.html +++ /dev/null @@ -1,220 +0,0 @@ - - - - - goog.ui.Menu - - - - - - - - -

goog.ui.Menu

-
- This is a very basic menu class, it doesn't handle its display or - dismissal. It just exists, listens to keys and mouse events and can fire - events for selections or highlights. -
- -
-
- - - - - - - - - - - - - -
- - - - - -
- Here's a menu with checkbox items.
You checked:  - Bold
- -
- Here's a BiDi menu with checkbox items.
- -
- Here's a menu with an explicit content container.
- -
-
-
- -
- Event Log -
-
-
- - - diff --git a/third_party/closure/goog/demos/menubar.html b/third_party/closure/goog/demos/menubar.html deleted file mode 100644 index 369603258d737..0000000000000 --- a/third_party/closure/goog/demos/menubar.html +++ /dev/null @@ -1,211 +0,0 @@ - - - - - goog.ui.menuBar Demo - - - - - - - - - - - - -

goog.ui.menuBar example

- - - - - - - - - - - -
-
- - This menu bar was created programmatically: -   - - - - - - - -
- -
-
-
-
-
- - This menu bar is decorated: -   - - - -
- - -
-
-
-
- -
- Event Log -
-
-
-
-
- - - diff --git a/third_party/closure/goog/demos/menubutton.html b/third_party/closure/goog/demos/menubutton.html deleted file mode 100644 index bfb685da16ece..0000000000000 --- a/third_party/closure/goog/demos/menubutton.html +++ /dev/null @@ -1,380 +0,0 @@ - - - - - goog.ui.MenuButton Demo - - - - - - - - - - - -

goog.ui.MenuButton

- - - - - - - -
-
- - These MenuButtons were created programmatically: -   - - - - - - - - -
- - - Enable first button: - -   - Show second button: - -   -
- -
-
-
- - This MenuButton decorates an element:  - - - - - - - - -
-
- -
- Format - -
-
Bold
-
Italic
-
Underline
-
-
- Strikethrough -
-
-
Font...
-
Color...
-
-
-
- Enable button: - -   - Show button: - -   -
- -
-
-
- - This MenuButton accompanies a - CustomButton to form a combo button: -   - -
- -
-
-
- - These MenuButtons demonstrate - menu positioning options: -   - -
- - - - - -
-
-
- -
- Event Log -
-
-
-
-
- - - diff --git a/third_party/closure/goog/demos/menubutton_frame.html b/third_party/closure/goog/demos/menubutton_frame.html deleted file mode 100644 index 7f01363922abd..0000000000000 --- a/third_party/closure/goog/demos/menubutton_frame.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - goog.ui.MenuButton Positioning Frame Demo - - - - - - - - - - - - diff --git a/third_party/closure/goog/demos/menuitem.html b/third_party/closure/goog/demos/menuitem.html deleted file mode 100644 index 77c50fb624b8b..0000000000000 --- a/third_party/closure/goog/demos/menuitem.html +++ /dev/null @@ -1,164 +0,0 @@ - - - - - goog.ui.MenuItem Demo - - - - - - - - - - - -

goog.ui.MenuItem

- - - - - - -
-
- - Use the first letter of each menuitem to activate:   - - - - - - - -
- -
- -
-
-
- -
- Event Log -
-
-
-
-
- - - diff --git a/third_party/closure/goog/demos/mousewheelhandler.html b/third_party/closure/goog/demos/mousewheelhandler.html deleted file mode 100644 index ebbc6c42124e5..0000000000000 --- a/third_party/closure/goog/demos/mousewheelhandler.html +++ /dev/null @@ -1,109 +0,0 @@ - - - - -goog.events.MouseWheelHandler - - - - - - - -

goog.events.MouseWheelHandler

- -

Use your mousewheel on the gray box below to move the cross hair. - -

-
-
-
-
- - - - diff --git a/third_party/closure/goog/demos/offline.html b/third_party/closure/goog/demos/offline.html deleted file mode 100644 index 0420604e4293d..0000000000000 --- a/third_party/closure/goog/demos/offline.html +++ /dev/null @@ -1,268 +0,0 @@ - - - - - - goog.ui.OfflineInstallDialog, goog.ui.OfflineStatusCard, and - goog.ui.OfflineStatusComponent - - - - - - - - -

goog.ui.OfflineInstallDialog

-
- - These dialogs show the install flow for the user: -   - - - - - -
-

goog.ui.OfflineStatusCard

-
- - These cards show the various configurations: -   - -
-
-
-
-
-
-
-
-
-
-

goog.ui.OfflineStatusComponent

-
- - These components show the various configurations (hover for tooltip, click for details): -   - -
Offline: 
-
Online: 
-
Syncing: 
-
Paused: 
-
Error: 
-
Not Installed: 
-
Installed: 
-
-

-

- - - diff --git a/third_party/closure/goog/demos/onlinehandler.html b/third_party/closure/goog/demos/onlinehandler.html deleted file mode 100644 index 21bbcb5c6d11e..0000000000000 --- a/third_party/closure/goog/demos/onlinehandler.html +++ /dev/null @@ -1,79 +0,0 @@ - - - - - -goog.net.OnlineHandler - - - - - - -

This page reports whether your browser is online or offline. It will detect -changes to the reported state and fire events when this changes. The -OnlineHandler acts as a wrapper around the HTML5 events online and -offline and emulates these for older browsers.

- -

Try changing File -> Work Offline in your browser.

- -

- - - - diff --git a/third_party/closure/goog/demos/palette.html b/third_party/closure/goog/demos/palette.html deleted file mode 100644 index 44b3f086c82db..0000000000000 --- a/third_party/closure/goog/demos/palette.html +++ /dev/null @@ -1,302 +0,0 @@ - - - - - goog.ui.Palette & goog.ui.ColorPalette - - - - - - - -

goog.ui.Palette & goog.ui.ColorPalette

- - - - - - - -
-
- Demo of the goog.ui.Palette: -
- - -
- Note that if you don't specify any dimensions, the palette will auto-size - to fit your items in the smallest square.
-
-
-
-
- Demo of the goog.ui.ColorPalette: -
-

The color you selected was: - -   - - -

-
-
-
-
- Demo of the goog.ui.CustomColorPalette: -
-

The color you selected was: - -   - - -

-
-
- -
- Event Log -
-
-
-
-
- - - diff --git a/third_party/closure/goog/demos/pastehandler.html b/third_party/closure/goog/demos/pastehandler.html deleted file mode 100644 index 252ee314fb3e7..0000000000000 --- a/third_party/closure/goog/demos/pastehandler.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - PasteHandler Test - - - - - -

Demo of goog.events.PasteHandler

- -
- Demo of the goog.events.PasteHandler: - - -
- -
- Event Log -
-
- - - - diff --git a/third_party/closure/goog/demos/pixeldensitymonitor.html b/third_party/closure/goog/demos/pixeldensitymonitor.html deleted file mode 100644 index c0fb397b61b8b..0000000000000 --- a/third_party/closure/goog/demos/pixeldensitymonitor.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - - goog.labs.style.PixelDensityMonitor - - - - - -

goog.labs.style.PixelDensityMonitor

-
- Move between high dpi and normal screens to see density change events. -
-
- Event log -
-
- - - diff --git a/third_party/closure/goog/demos/plaintextspellchecker.html b/third_party/closure/goog/demos/plaintextspellchecker.html deleted file mode 100644 index 21ec0498c1291..0000000000000 --- a/third_party/closure/goog/demos/plaintextspellchecker.html +++ /dev/null @@ -1,106 +0,0 @@ - - - - -Plain Text Spell Checker - - - - - - -

Plain Text Spell Checker

-

- - - - -

- - - - - - - diff --git a/third_party/closure/goog/demos/popup.html b/third_party/closure/goog/demos/popup.html deleted file mode 100644 index 91d286cdd59a8..0000000000000 --- a/third_party/closure/goog/demos/popup.html +++ /dev/null @@ -1,206 +0,0 @@ - - - - - goog.ui.Popup - - - - - - - -

goog.ui.Popup

- - -

Positioning relative to an anchor element

-
- Button Corner - - - - -
- Popup Corner - - - - - -
- Margin - Top: - Right: - Bottom: - Left: - - -
-
-
-
- - - -
-
- -

Iframe to test cross frame dismissal

- - -
-
- -
-

Positioning at coordinates

-
- - - - diff --git a/third_party/closure/goog/demos/popupcolorpicker.html b/third_party/closure/goog/demos/popupcolorpicker.html deleted file mode 100644 index a52d8207e29f8..0000000000000 --- a/third_party/closure/goog/demos/popupcolorpicker.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - goog.ui.PopupColorPicker - - - - - - - -

goog.ui.PopupColorPicker

- Show 1 - Show 2 - - - diff --git a/third_party/closure/goog/demos/popupdatepicker.html b/third_party/closure/goog/demos/popupdatepicker.html deleted file mode 100644 index f83ea400b1cdc..0000000000000 --- a/third_party/closure/goog/demos/popupdatepicker.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - goog.ui.PopupDatePicker - - - - - - - - -

goog.ui.PopupDatePicker

- - Show 1 - Show 2 - - - - diff --git a/third_party/closure/goog/demos/popupemojipicker.html b/third_party/closure/goog/demos/popupemojipicker.html deleted file mode 100644 index 486fd5e9a0778..0000000000000 --- a/third_party/closure/goog/demos/popupemojipicker.html +++ /dev/null @@ -1,407 +0,0 @@ - - - - - Popup Emoji Picker - - - - - - - - - -

Popup Emoji Picker Demo

-This is a demo of popupemojipickers and docked emoji pickers. Selecting an -emoji inserts a pseudo image tag into the text area with the id of that emoji. - -

Sprited Emojipicker (contains a mix of sprites and non-sprites):

-
- -

Sprited Progressively-rendered Emojipicker (contains a mix of sprites and - non-sprites):

-
-

Popup Emoji:

-Gimme some emoji -
- -

Fast-load Progressive Sprited Emojipicker

-
- -

Fast-load Non-progressive Sprited Emojipicker

-
- -
- -

Docked emoji:

-
- -

Single Page of Emoji

-
- -

Delayed load popup picker:

-More emoji - -

Delayed load docked picker:

- - Click to load - -
- - - - - - diff --git a/third_party/closure/goog/demos/popupmenu.html b/third_party/closure/goog/demos/popupmenu.html deleted file mode 100644 index ca0064912b761..0000000000000 --- a/third_party/closure/goog/demos/popupmenu.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - goog.ui.PopupMenu - - - - - - - - - -

goog.ui.PopupMenu

-
- This shows a 2 popup menus, each menu has been attached to two targets. -

-
- -
- Event log -
-
-
-
- Hello there I'm italic! -
-
-
- - - - - - - - - diff --git a/third_party/closure/goog/demos/progressbar.html b/third_party/closure/goog/demos/progressbar.html deleted file mode 100644 index 246db3a379efc..0000000000000 --- a/third_party/closure/goog/demos/progressbar.html +++ /dev/null @@ -1,97 +0,0 @@ - - - - - goog.ui.ProgressBar - - - - - - -

goog.ui.ProgressBar

-
-
- -
-
-
- Decorated element -
-
- - - - diff --git a/third_party/closure/goog/demos/prompt.html b/third_party/closure/goog/demos/prompt.html deleted file mode 100644 index 700dccba0fe1a..0000000000000 --- a/third_party/closure/goog/demos/prompt.html +++ /dev/null @@ -1,92 +0,0 @@ - - - - - goog.ui.Prompt - - - - - - - -

goog.ui.Prompt

- -

The default text is selected when the prompt displays

- -

You can use 'Enter' or 'Esc' to click 'Ok' or 'Cancel' respectively

- -

- - Prompt - -

- - - diff --git a/third_party/closure/goog/demos/quadtree.html b/third_party/closure/goog/demos/quadtree.html deleted file mode 100644 index e17e6dcf0fa06..0000000000000 --- a/third_party/closure/goog/demos/quadtree.html +++ /dev/null @@ -1,107 +0,0 @@ - - - - -QuadTree Demo - - - - - -
-
-

Click on the area to the left to add a point to the quadtree, clicking on - a point will remove it from the tree.

-

-
- - - diff --git a/third_party/closure/goog/demos/ratings.html b/third_party/closure/goog/demos/ratings.html deleted file mode 100644 index d2970f089d2c2..0000000000000 --- a/third_party/closure/goog/demos/ratings.html +++ /dev/null @@ -1,121 +0,0 @@ - - - - -Ratings Widget - - - - - - -
- - -
-
-
- - - diff --git a/third_party/closure/goog/demos/richtextspellchecker.html b/third_party/closure/goog/demos/richtextspellchecker.html deleted file mode 100644 index 008d9fd891459..0000000000000 --- a/third_party/closure/goog/demos/richtextspellchecker.html +++ /dev/null @@ -1,92 +0,0 @@ - - - - - goog.ui.RichTextSpellChecker - - - - - - - -

goog.ui.RichTextSpellChecker

-

- The words "test", "words", "a", and "few" are set to be valid words, all others are considered spelling mistakes. -

-

- -

- - - - - - - diff --git a/third_party/closure/goog/demos/roundedpanel.html b/third_party/closure/goog/demos/roundedpanel.html deleted file mode 100644 index c11b111ee3b98..0000000000000 --- a/third_party/closure/goog/demos/roundedpanel.html +++ /dev/null @@ -1,139 +0,0 @@ - - - - - - goog.ui.RoundedPanel Demo - - - - - - - -
-
-
- Panel Width:
- -
-
- Panel Height:
- -
-
- Border Width:
- -
-
- Border Color:
- -
-
- Radius:
- -
-
- Background Color:
- -
-
- Corners:
- -
-
Rendering Time:
-
-
- - - diff --git a/third_party/closure/goog/demos/samplecomponent.html b/third_party/closure/goog/demos/samplecomponent.html deleted file mode 100644 index f5a8c51fa80ee..0000000000000 --- a/third_party/closure/goog/demos/samplecomponent.html +++ /dev/null @@ -1,75 +0,0 @@ - - - - - goog.ui.Component - - - - - - - - - - -

goog.ui.Component

- - -
-

Click on this big, colored box:

-
- -
- -
-

Or this box:

- -
Label from decorated DIV.
-
- -
-

This box's label keeps changing:

- -
- - - diff --git a/third_party/closure/goog/demos/samplecomponent.js b/third_party/closure/goog/demos/samplecomponent.js index 0bd093b1af234..d25d77deb84bf 100644 --- a/third_party/closure/goog/demos/samplecomponent.js +++ b/third_party/closure/goog/demos/samplecomponent.js @@ -19,12 +19,10 @@ goog.provide('goog.demos.SampleComponent'); goog.require('goog.dom'); -goog.require('goog.dom.classes'); -goog.require('goog.events.EventHandler'); +goog.require('goog.dom.classlist'); goog.require('goog.events.EventType'); goog.require('goog.events.KeyCodes'); goog.require('goog.events.KeyHandler'); -goog.require('goog.events.KeyHandler.EventType'); goog.require('goog.ui.Component'); @@ -40,9 +38,10 @@ goog.require('goog.ui.Component'); * * @extends {goog.ui.Component} * @constructor + * @final */ goog.demos.SampleComponent = function(opt_label, opt_domHelper) { - goog.ui.Component.call(this, opt_domHelper); + goog.base(this, opt_domHelper); /** * The label to display. @@ -58,13 +57,6 @@ goog.demos.SampleComponent = function(opt_label, opt_domHelper) { */ this.color_ = 'red'; - /** - * Event handler for this object. - * @type {goog.events.EventHandler} - * @private - */ - this.eh_ = new goog.events.EventHandler(this); - /** * Keyboard handler for this object. This object is created once the * component's DOM element is known. @@ -95,6 +87,7 @@ goog.demos.SampleComponent.prototype.changeColor_ = function() { /** * Creates an initial DOM representation for the component. + * @override */ goog.demos.SampleComponent.prototype.createDom = function() { this.decorateInternal(this.dom_.createElement('div')); @@ -106,27 +99,28 @@ goog.demos.SampleComponent.prototype.createDom = function() { * * @param {Element} element The DIV element to decorate. The element's * text, if any will be used as the component's label. + * @override */ goog.demos.SampleComponent.prototype.decorateInternal = function(element) { - goog.demos.SampleComponent.superClass_.decorateInternal.call(this, element); + goog.base(this, 'decorateInternal', element); if (!this.getLabelText()) { this.setLabelText(this.initialLabel_); } var elem = this.getElement(); - goog.dom.classes.add(elem, goog.getCssName('goog-sample-component')); + goog.dom.classlist.add(elem, goog.getCssName('goog-sample-component')); elem.style.backgroundColor = this.color_; elem.tabIndex = 0; this.kh_ = new goog.events.KeyHandler(elem); - this.eh_.listen(this.kh_, goog.events.KeyHandler.EventType.KEY, this.onKey_); + this.getHandler().listen(this.kh_, goog.events.KeyHandler.EventType.KEY, + this.onKey_); }; /** @override */ goog.demos.SampleComponent.prototype.disposeInternal = function() { - goog.demos.SampleComponent.superClass_.disposeInternal.call(this); - this.eh_.dispose(); + goog.base(this, 'disposeInternal'); if (this.kh_) { this.kh_.dispose(); } @@ -135,10 +129,11 @@ goog.demos.SampleComponent.prototype.disposeInternal = function() { /** * Called when component's element is known to be in the document. + * @override */ goog.demos.SampleComponent.prototype.enterDocument = function() { - goog.demos.SampleComponent.superClass_.enterDocument.call(this); - this.eh_.listen(this.getElement(), goog.events.EventType.CLICK, + goog.base(this, 'enterDocument'); + this.getHandler().listen(this.getElement(), goog.events.EventType.CLICK, this.onDivClicked_); }; @@ -146,11 +141,10 @@ goog.demos.SampleComponent.prototype.enterDocument = function() { /** * Called when component's element is known to have been removed from the * document. + * @override */ goog.demos.SampleComponent.prototype.exitDocument = function() { - goog.demos.SampleComponent.superClass_.exitDocument.call(this); - this.eh_.unlisten(this.getElement(), goog.events.EventType.CLICK, - this.onDivClicked_); + goog.base(this, 'exitDocument'); }; diff --git a/third_party/closure/goog/demos/scrollfloater.html b/third_party/closure/goog/demos/scrollfloater.html deleted file mode 100644 index 9dc1560d686ff..0000000000000 --- a/third_party/closure/goog/demos/scrollfloater.html +++ /dev/null @@ -1,113 +0,0 @@ - - - - - -ScrollFloater - - - - - - - -
- - - - - -
-
- This content does not float. -
-
- This content does not float. -
-
- This floater is constrainted within a container and has a top offset of 50px. -
-
-
- This content does not float. -
-
-
-
-
-

This is the bottom of the page.

-
- - - - diff --git a/third_party/closure/goog/demos/select.html b/third_party/closure/goog/demos/select.html deleted file mode 100644 index 7f2ddfcb807bc..0000000000000 --- a/third_party/closure/goog/demos/select.html +++ /dev/null @@ -1,324 +0,0 @@ - - - - - goog.ui.Select & goog.ui.Option - - - - - - - - - - - -

goog.ui.Select & goog.ui.Option

-
- Demo of the goog.ui.Select component: -
-   - -
-
-   - -
-
-  (This control doesn't auto-highlight; it only dispatches - ENTER and LEAVE events.) -
-
- Click here to add a new option for the best movie, - here - to hide/show the select component for the best movie, or - here - to set the worst movie of all time to "Catwoman." -
-
-
-
- This goog.ui.Select was decorated: -
-   - -
-
-
-
-
- -
- - Demo of goog.ui.Select using - goog.ui.FlatMenuButtonRenderer: - -
-   - -
-
-   - -
-
-  (This control doesn't auto-highlight; it only dispatches - ENTER and LEAVE events.) -
-
- Click here - to add a new option for the best Arnold movie, - here - to hide/show the select component for the best Arnold movie, or - here - to set the worst Arnold movie to "Jingle All the Way." -
-
-
-
- This Flat goog.ui.Select was decorated: -
-   - -
-
-
-
-
- - -
- Event Log -
-
-
-
- - - diff --git a/third_party/closure/goog/demos/selectionmenubutton.html b/third_party/closure/goog/demos/selectionmenubutton.html deleted file mode 100644 index 22c92dcff8297..0000000000000 --- a/third_party/closure/goog/demos/selectionmenubutton.html +++ /dev/null @@ -1,186 +0,0 @@ - - - - - goog.ui.SelectionMenuButton Demo - - - - - - - -

goog.ui.SelectionMenuButton

- - - - - - - -
-
- - This SelectionMenuButton was created programmatically: -   - - - - - - - - -
- - - Enable button: - -   -
- -
-
-
- - This SelectionMenuButton decorates an element:  - - - - - - - - -
-
- - - -
-
All
-
None
-
-
Starred
-
- Unstarred -
-
-
Read
-
Unread
-
-
-
- Enable button: - -   - Show button: - -   -
- -
-
-
- -
- Event Log -
-
-
-
-
- - - diff --git a/third_party/closure/goog/demos/serverchart.html b/third_party/closure/goog/demos/serverchart.html deleted file mode 100644 index 1684ec2dec7c5..0000000000000 --- a/third_party/closure/goog/demos/serverchart.html +++ /dev/null @@ -1,122 +0,0 @@ - - - - - goog.ui.ServerChart - - - - - - -

goog.ui.ServerChart

-
-

Line Chart:

-
-
-

Finance Chart: Add a Line -

-
-
-

Pie Chart:

-
-
-

Filled Line Chart:

-
-
-

Bar Chart:

-
-
-

Venn Diagram:

-
- - diff --git a/third_party/closure/goog/demos/silverlightclipboardbutton.html b/third_party/closure/goog/demos/silverlightclipboardbutton.html deleted file mode 100644 index ebe62800cbd96..0000000000000 --- a/third_party/closure/goog/demos/silverlightclipboardbutton.html +++ /dev/null @@ -1,71 +0,0 @@ - - - - - goog.silverlight.ClipboardButton - - - - - - - - -

goog.silverlight.ClipboardButton

- -
Click 'Paste' to alert the contents on your clipboard:
-
- -

-

Click 'Copy' to put the contents of - this textarea on your clipboard:
-
- - - - - diff --git a/third_party/closure/goog/demos/slider.html b/third_party/closure/goog/demos/slider.html deleted file mode 100644 index 1c85e67f765d2..0000000000000 --- a/third_party/closure/goog/demos/slider.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - goog.ui.Slider - - - - - - - -

goog.ui.Slider

- -
- Horizontal Slider -
- -
-
-
- - MoveToPointEnabled - - Enable -
- - -
- -
- Vertical Slider, inserted w/ script - - - Enable -
- - -
- - - diff --git a/third_party/closure/goog/demos/splitbehavior.html b/third_party/closure/goog/demos/splitbehavior.html deleted file mode 100644 index 24fa73aa6d5aa..0000000000000 --- a/third_party/closure/goog/demos/splitbehavior.html +++ /dev/null @@ -1,164 +0,0 @@ - - - - - goog.ui.SplitBehavior - - - - - - - - - - - - - - - - -

goog.ui.SplitBehavior

-
- - Split behavior - render - -
-
-
-
-
- -
- - Split behavior - decorate - -
-
- Bold -
-
-
-
- - Color Split behavior - -
-
-

goog.ui.ColorButton

-
- - These buttons were rendered using goog.ui.ColorButton: -   - -
- Rendered ColorButton: -
-
- Decorated ColorButton: -
-
Color2
-
-
- - -
- Event Log -
-
- - - diff --git a/third_party/closure/goog/demos/splitpane.html b/third_party/closure/goog/demos/splitpane.html deleted file mode 100644 index 366df638395f0..0000000000000 --- a/third_party/closure/goog/demos/splitpane.html +++ /dev/null @@ -1,243 +0,0 @@ - - - - - goog.ui.SplitPane - - - - - - - -

goog.ui.SplitPane

- Left Component Size: - Width: - Height: -
- First One - Second One - - -

-

-
- Left Frame -
-
- -
-
-
- First Component Width: - -
- -
-

- - -

-

- - - - - diff --git a/third_party/closure/goog/demos/stopevent.html b/third_party/closure/goog/demos/stopevent.html deleted file mode 100644 index 83cbd7c85bbb4..0000000000000 --- a/third_party/closure/goog/demos/stopevent.html +++ /dev/null @@ -1,171 +0,0 @@ - - - - Stop Event Propagation - - - - - - - - -

Stop Event

-

Test the cancelling of capture and bubbling events. Click - one of the nodes to see the event trace, then use the check boxes to cancel - the capture or bubble at a given branch. (Double click the text area to clear - it)

- -
- -
- - - - - diff --git a/third_party/closure/goog/demos/submenus.html b/third_party/closure/goog/demos/submenus.html deleted file mode 100644 index 7f710679fb730..0000000000000 --- a/third_party/closure/goog/demos/submenus.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - goog.ui.SubMenu - - - - - - - - - -

goog.ui.SubMenu

-

Demonstration of different of hierarchical menus.

-

- -

- Here's a menu (with submenus) defined in markup: -

-
-
Open...
-
Open Recent -
-
Annual Report.pdf
-
Quarterly Update.pdf
-
Enemies List.txt
-
More -
-
Foo.txt
-
Bar.txt
-
-
-
-
-
- - - - - - diff --git a/third_party/closure/goog/demos/submenus2.html b/third_party/closure/goog/demos/submenus2.html deleted file mode 100644 index fd41b20e8c6a0..0000000000000 --- a/third_party/closure/goog/demos/submenus2.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - goog.ui.SubMenu - - - - - - - - - -

goog.ui.SubMenu

-

Demonstration of different hierarchical menus which share its submenus. - A flyweight pattern demonstration for submenus.

-

- - -
-
Google
-
Yahoo
-
MSN
-
-
Bla...
-
- - - - - diff --git a/third_party/closure/goog/demos/tabbar.html b/third_party/closure/goog/demos/tabbar.html deleted file mode 100644 index 6c21f9b879388..0000000000000 --- a/third_party/closure/goog/demos/tabbar.html +++ /dev/null @@ -1,289 +0,0 @@ - - - - - goog.ui.TabBar - - - - - - - - - -

goog.ui.TabBar

-

- A goog.ui.TabBar is a subclass of goog.ui.Container, - designed to host one or more goog.ui.Tabs. The tabs in the - first four tab bars on this demo page were decorated using the default - tab renderer. Tabs in the last two tab bars were decorated using the - rounded tab renderer (goog.ui.RoundedTabRenderer). -

- - - - - - - - - - - - - - - - - - -
- Above tab content:

-
-
Hello
-
Settings
-
More
-
Advanced
-
- -
-
- Use the keyboard or the mouse to switch tabs. -
- - -
- Below tab content:

-
- Use the keyboard or the mouse to switch tabs. -
- -
-
-
Hello
-
Settings
-
More
-
Advanced
-
- -
- - -
- Before tab content:

-
-
Hello
-
Settings
-
More
-
Advanced
-
-
- Use the keyboard or the mouse to switch tabs. -
- -
- - -
- After tab content:

-
-
Hello
-
Settings
-
More
-
Advanced
-
-
- Use the keyboard or the mouse to switch tabs. -
- -
- - -
- Above tab content (rounded corners):

-
-
Hello
-
Settings -
-
More
-
Advanced -
-
- -
-
- Use the keyboard or the mouse to switch tabs. -
- - -
- Before tab content (rounded corners):

-
-
Hello
-
Settings
-
More
-
Advanced -
-
-
- Use the keyboard or the mouse to switch tabs. -
- -
- - -
- -
- Event Log -
-
-
-
-
- - - diff --git a/third_party/closure/goog/demos/tablesorter.html b/third_party/closure/goog/demos/tablesorter.html deleted file mode 100644 index dcbcbff14f843..0000000000000 --- a/third_party/closure/goog/demos/tablesorter.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - goog.ui.TableSorter - - - - - - - -

goog.ui.TableSorter

-

- Number sorts numerically, month sorts alphabetically, and days sorts - numerically in reverse. -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NumberMonthDays (non-leap year)
1January31
2Februrary28
3March31
4April30
5May31
6June30
7July31
8August31
9September30
10October31
11November30
12December31
-
- - - diff --git a/third_party/closure/goog/demos/tabpane.html b/third_party/closure/goog/demos/tabpane.html deleted file mode 100644 index 20aaf5d769cfd..0000000000000 --- a/third_party/closure/goog/demos/tabpane.html +++ /dev/null @@ -1,302 +0,0 @@ - - - - - goog.ui.TabPane - - - - - - - -

goog.ui.TabPane

- -
- selected in tab pane 1.

- -

Bottom tabs

-
-
-

Initial page

-

- Page created automatically from tab pane child node. -

-
-
- -

Left tabs

-
-
-

Front page!

-

- Page created automatically from tab pane child node. -

-
-
- -

Right tabs

-
-
-

Right 1

-

- Page created automatically from tab pane child node. -

-
-
-

Right 2

-

- So was this page. -

-
-
- -
-

Page 1

-

- Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Duis ac augue sed - massa placerat iaculis. Aliquam tempor dictum massa. Quisque vehicula justo - ut tellus. Integer urna. Aliquam libero justo, ornare at, pretium ac, - vulputate quis, ante. Sed arcu. Etiam sit amet turpis. Maecenas pede. Sed - turpis. Sed ultricies commodo nisl. Morbi eget magna quis nisi euismod - porttitor. Vivamus lacinia massa et sem. Donec consequat ligula sed tellus. - Suspendisse enim sapien, vestibulum nec, eleifend id, placerat sit amet, - risus. Mauris in pede ac lorem varius facilisis. Donec dui. Nam mollis nisi - eu neque. Cras luctus nisl at sapien. Ut eleifend, odio id luctus - pellentesque, lorem diam dictum velit, ac gravida lectus magna vel velit. -

-

- Etiam tempus, ante semper iaculis ultrices, ligula eros lobortis tellus, sit - amet luctus dolor nisl sit amet dolor. Donec in velit. Vivamus facilisis. - Proin nisi felis, commodo ut, porta dignissim, vestibulum quis, ligula. Ut - egestas porttitor tortor. Ut porttitor diam a est. Sed placerat. Aliquam - luctus est a risus. Aenean blandit nibh et justo. Phasellus vel lectus ut - leo dictum consequat. Nam tincidunt facilisis nulla. Nunc nonummy tempus - quam. Aliquam id enim. Sed rhoncus cursus lorem. Curabitur ultricies, enim - quis eleifend mattis, est velit dapibus dolor, quis laoreet arcu tortor - volutpat tortor. Pellentesque habitant morbi tristique senectus et netus et - malesuada fames ac turpis egestas. Curabitur nec mauris et purus aliquam - mattis. Cras rhoncus posuere sapien. Class aptent taciti sociosqu ad litora - torquent per conubia nostra, per inceptos hymenaeos. -

-

- Mauris lacinia ornare nunc. Donec molestie. Sed nulla libero, tincidunt vel, - porta sit amet, nonummy eget, augue. Class aptent taciti sociosqu ad litora - torquent per conubia nostra, per inceptos hymenaeos. Donec ac risus. Cras - euismod congue orci. Mauris mattis, ipsum at vestibulum bibendum, odio est - rhoncus nisi, vel aliquam ante velit quis neque. Duis nonummy tortor id - ante. Aenean auctor odio non nulla. Fusce hendrerit, mi et fringilla - venenatis, sem ipsum fermentum lorem, vel posuere urna eros eget massa. -

-

- Nulla nec sapien eget mauris pretium tempor. Phasellus scelerisque quam id - mauris. Cras erat ante, pretium ut, vestibulum ac, tincidunt ut, nunc. - Vivamus velit sapien, feugiat ac, elementum ac, viverra non, leo. Phasellus - imperdiet, magna at placerat consectetuer, enim urna aliquam augue, nec - tincidunt justo lectus nec lectus. Nam neque. Nullam ullamcorper euismod - augue. Maecenas arcu purus, sollicitudin nec, consequat a, gravida quis, - massa. Nullam bibendum viverra risus. Sed nibh. Morbi dapibus pellentesque - erat. -

-

- Cras non tellus. Maecenas nulla est, tincidunt sed, porta sit amet, placerat - sed, diam. Morbi pulvinar. Vestibulum ante ipsum primis in faucibus orci - luctus et ultrices posuere cubilia Curae; Praesent felis lacus, pretium at, - egestas sed, fermentum at, est. Pellentesque sagittis feugiat orci. Nam - augue. Sed eget dolor. Proin vitae metus scelerisque massa fermentum tempus. - Nulla facilisi. Pellentesque habitant morbi tristique senectus et netus et - malesuada fames ac turpis egestas. Aenean eleifend, leo gravida mollis - tempor, tellus ipsum porttitor leo, eget condimentum tellus neque sit amet - orci. Sed non lectus. Suspendisse nonummy purus ac massa. Sed quis elit - dapibus nunc semper porta. Maecenas risus eros, euismod quis, sagittis eget, - aliquet eget, dui. Donec vel nibh. Vivamus nunc purus, euismod in, feugiat - in, sodales vitae, nunc. Nulla lobortis. -

-
- -
-

- Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Cras et nisi id - lorem tempor semper. Suspendisse ante. Integer ligula urna, venenatis quis, - placerat vitae, commodo quis, sapien. Quisque nec lectus. Sed non dolor. Sed - congue, nisi in pharetra consequat, odio diam pulvinar arcu, in laoreet elit - risus id ipsum. Class aptent taciti sociosqu ad litora torquent per conubia - nostra, per inceptos hymenaeos. Praesent tellus enim, imperdiet a, sagittis - id, pulvinar vel, tortor. Integer nulla. Sed nulla augue, lacinia id, - vulputate eu, rhoncus non, ante. Integer lobortis eros vitae quam. Phasellus - sagittis, ipsum sollicitudin bibendum laoreet, arcu erat luctus lacus, vel - pharetra felis metus tincidunt diam. Cras ac augue in enim ultricies - aliquam. -

- - - -
- -
-

Page 5

-

- This is page 5. -

-
- - - - diff --git a/third_party/closure/goog/demos/textarea.html b/third_party/closure/goog/demos/textarea.html deleted file mode 100644 index a71a3c0368821..0000000000000 --- a/third_party/closure/goog/demos/textarea.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - goog.ui.Textarea - - - - - -

goog.ui.Textarea

-
- - The first Textarea was created programmatically, - the second by decorating a <textarea> - element:  - -
- -
-
- -
- -
-
- -
- - This is a textarea with a minHeight set to 200px. - - -
- -
-
- -
- - This is a textarea with a padding-bottom of 3em. - - -
- - -
- Event Log -
-
- - - - diff --git a/third_party/closure/goog/demos/timers.html b/third_party/closure/goog/demos/timers.html deleted file mode 100644 index 193817890bd74..0000000000000 --- a/third_party/closure/goog/demos/timers.html +++ /dev/null @@ -1,291 +0,0 @@ - - - - - goog.Timer, goog.async.Throttle goog.async.Delay - - - - - - - - -

A Collection of Time Based Utilities

-

goog.async.Delay

-

An action can be invoked after some delay.

- Delay (seconds): - - -
- Delay Status: Not Set - -

goog.async.Throttle

- A throttle prevents the action from being called more than once per time - interval. -
- 'Create' the Throttle, then hit the 'Do Throttle' button a lot - of times. Notice the number of 'Hits' increasing with each button press. -
- The action will be invoked no more than once per time interval. -

- Throttle interval (seconds): - - - -
- Throttle Hits: -
- Throttle Action Called: -

-

goog.Timer

- A timer can be set up to call a timeout function on every 'tick' of the timer. -

- Timer interval (seconds): - - - - -
- Timer Status: Not Set -

-

goog.Timer.callOnce

- Timer also has a useful utility function that can call an action after some - timeout. -
- This a shortcut/replacement for window.setTimeout, and has a - corresponding goog.Timer.clear as well, which stops the action. -

- Timeout (seconds): - - -
- Do Once Status: -

- - - diff --git a/third_party/closure/goog/demos/toolbar.html b/third_party/closure/goog/demos/toolbar.html deleted file mode 100644 index a76abcd82434e..0000000000000 --- a/third_party/closure/goog/demos/toolbar.html +++ /dev/null @@ -1,703 +0,0 @@ - - - - - goog.ui.Toolbar - - - - - - - - - - -

goog.ui.Toolbar

-
- These toolbars were created programmatically: - -   - -   - -
-
-
-
-
-
- -   - -   - -
-
-
-
-
-
-
-
-
- This toolbar was created by decorating a bunch of DIVs: - -   - -   - -
-
-
-
Button
-
- Fancy Button -
-
-
- Disabled Button -
- -
-
- Toggle Button -
-
-
-
-
-
-
-
- -   - -   - -
-
-
-
Button
-
-
Fancy Button
-
-
-
- Disabled Button -
-
- Menu Button -
-
Foo
-
Bar
-
????... - Ctrl+P
-
???? ?-HTML (????? ZIP)
-
-
Cake
-
-
-
-
- Toggle Button -
-
- -
 
-
-
-
-
-
-
-
-
- This is starting to look like an editor toolbar: - -   - -   - -   - -
-
-
-
- Select font -
-
Normal
-
Times
-
Courier New
-
Georgia
-
Trebuchet
-
Verdana
-
-
-
- Size -
-
7pt
-
10pt
-
14pt
-
18pt
-
24pt
-
36pt
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Red
-
Green
-
Blue
-
-
-
-
-
-
Red
-
Green
-
Blue
-
-
-
-
Style
-
-
Clear formatting
-
-
Normal paragraph text
-
Minor heading (H3)
-
Sub-heading (H2)
-
Heading (H1)
-
-
Indent more
-
Indent less
-
Blockquote
-
-
-
-
-
-   - Insert -
-
-
Picture
-
Drawing
-
Other...
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Check spelling
-
-
-
-
-
-
-
- -
- Event Log -
- Warning! On Gecko, the event log may cause - the page to flicker when mousing over toolbar items. This is a Gecko - issue triggered by scrolling in the event log; see - bug 756988.
-
- Enable logging: -
-
-
-
- - - diff --git a/third_party/closure/goog/demos/tooltip.html b/third_party/closure/goog/demos/tooltip.html deleted file mode 100644 index 7b6f743b4edcb..0000000000000 --- a/third_party/closure/goog/demos/tooltip.html +++ /dev/null @@ -1,91 +0,0 @@ - - - - - goog.ui.Tooltip - - - - - - - -

goog.ui.Tooltip

-

- - - - -

- -

- Demo tooltips in text and and of nested - tooltips, where an element triggers - one tooltip and an element inside the first element triggers another - one. -

- -
-
- -
-
- - - - - - diff --git a/third_party/closure/goog/demos/tracer.html b/third_party/closure/goog/demos/tracer.html deleted file mode 100644 index b145353417f44..0000000000000 --- a/third_party/closure/goog/demos/tracer.html +++ /dev/null @@ -1,92 +0,0 @@ - - - - -goog.debug.Tracer - - - - - - -
- -
- - - - - - - diff --git a/third_party/closure/goog/demos/tree/demo.html b/third_party/closure/goog/demos/tree/demo.html deleted file mode 100644 index 5562cf84fa8f1..0000000000000 --- a/third_party/closure/goog/demos/tree/demo.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - goog.ui.tree.TreeControl - - - - - - - - -

goog.ui.tree.TreeControl

-
- -

- - - - - -

- - -

- - - - diff --git a/third_party/closure/goog/demos/tweakui.html b/third_party/closure/goog/demos/tweakui.html deleted file mode 100644 index 6a88e9331a8bd..0000000000000 --- a/third_party/closure/goog/demos/tweakui.html +++ /dev/null @@ -1,121 +0,0 @@ - - - - - goog.tweak.TweakUi - - - - - -

goog.ui.TweakUi

-The goog.tweak package provides a convenient and flexible way to add -configurable settings to an app. These settings: -
    -
  • can be set at compile time -
  • can be set in code (using goog.tweak.overrideDefaultValue) -
  • can be set by query parameters -
  • can be set through the TweakUi interface -
-Tweaks IDs are checked by the compiler and tweaks can be fully removed when -tweakProcessing=STRIP. Tweaks are great for toggling debugging facilities. - -

A collapsible menu

-

An expanded menu

-
    -
  • When "Apply Tweaks" is clicked, all non-default values are encoded into - query parameters and the page is refreshed. -
  • Blue entries are ones where the value of the tweak will change without - clicking apply tweaks (the value of goog.tweak.get*() will change) -
- - - diff --git a/third_party/closure/goog/demos/twothumbslider.html b/third_party/closure/goog/demos/twothumbslider.html deleted file mode 100644 index 6c1d113eadecc..0000000000000 --- a/third_party/closure/goog/demos/twothumbslider.html +++ /dev/null @@ -1,121 +0,0 @@ - - - - - goog.ui.TwoThumbSlider - - - - - -

goog.ui.TwoThumbSlider

-
-
- -
-
-
-
- -
- -
- - -
- - - - diff --git a/third_party/closure/goog/demos/useragent.html b/third_party/closure/goog/demos/useragent.html deleted file mode 100644 index 2e992be946b9f..0000000000000 --- a/third_party/closure/goog/demos/useragent.html +++ /dev/null @@ -1,214 +0,0 @@ - - - - - goog.userAgent - - - - - - - - -

goog.userAgent

- -
- - - -
-
- -
- - - -
-
- - - - - - diff --git a/third_party/closure/goog/demos/viewportsizemonitor.html b/third_party/closure/goog/demos/viewportsizemonitor.html deleted file mode 100644 index f958f5dac54b0..0000000000000 --- a/third_party/closure/goog/demos/viewportsizemonitor.html +++ /dev/null @@ -1,71 +0,0 @@ - - - - - goog.dom.ViewportSizeMonitor - - - - - - -

goog.dom.ViewportSizeMonitor

-
- Current Size: Loading... -
- - - - diff --git a/third_party/closure/goog/demos/xpc/blank.html b/third_party/closure/goog/demos/xpc/blank.html deleted file mode 100644 index 5108baa3df5b4..0000000000000 --- a/third_party/closure/goog/demos/xpc/blank.html +++ /dev/null @@ -1,7 +0,0 @@ - - diff --git a/third_party/closure/goog/demos/xpc/index.html b/third_party/closure/goog/demos/xpc/index.html deleted file mode 100644 index e516ef26e6c4d..0000000000000 --- a/third_party/closure/goog/demos/xpc/index.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - - - - - - - -
- - -

-this page: -

- -

See CrossPageChannel and -CrossDomainCommunication for details

- -

-select transport:
-Auto | -Native messaging | -Frame element method | -Iframe relay | -Iframe polling | - -Fragment URL -

- -

-
-
- - - -

-Out [clear]:
-
- - - -
- - -
- - - - - diff --git a/third_party/closure/goog/demos/xpc/inner.html b/third_party/closure/goog/demos/xpc/inner.html deleted file mode 100644 index 02e17885c2f60..0000000000000 --- a/third_party/closure/goog/demos/xpc/inner.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - -

this page:

- - -
- -(n = )
- -mousemove-forwarding: - - -
Click me!
-
- - - -
-
- - - - -

-Out [clear]:
-
- - - - diff --git a/third_party/closure/goog/demos/xpc/minimal/blank.html b/third_party/closure/goog/demos/xpc/minimal/blank.html deleted file mode 100644 index 5108baa3df5b4..0000000000000 --- a/third_party/closure/goog/demos/xpc/minimal/blank.html +++ /dev/null @@ -1,7 +0,0 @@ - - diff --git a/third_party/closure/goog/demos/xpc/minimal/index.html b/third_party/closure/goog/demos/xpc/minimal/index.html deleted file mode 100644 index 75dfb36efd498..0000000000000 --- a/third_party/closure/goog/demos/xpc/minimal/index.html +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - - - - - - -
- -

- -

- - -

- -
-
- -
- - - diff --git a/third_party/closure/goog/demos/xpc/minimal/inner.html b/third_party/closure/goog/demos/xpc/minimal/inner.html deleted file mode 100644 index b35773ae92bb9..0000000000000 --- a/third_party/closure/goog/demos/xpc/minimal/inner.html +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - - - - - - - -

- -

- - -

- -
- - - - diff --git a/third_party/closure/goog/demos/xpc/minimal/relay.html b/third_party/closure/goog/demos/xpc/minimal/relay.html deleted file mode 100644 index 7cc700206a6a7..0000000000000 --- a/third_party/closure/goog/demos/xpc/minimal/relay.html +++ /dev/null @@ -1,7 +0,0 @@ - - diff --git a/third_party/closure/goog/demos/xpc/relay.html b/third_party/closure/goog/demos/xpc/relay.html deleted file mode 100644 index d2943357c0414..0000000000000 --- a/third_party/closure/goog/demos/xpc/relay.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - diff --git a/third_party/closure/goog/demos/xpc/xpcdemo.js b/third_party/closure/goog/demos/xpc/xpcdemo.js index fff1e1ca14a2f..e3f722f31b273 100644 --- a/third_party/closure/goog/demos/xpc/xpcdemo.js +++ b/third_party/closure/goog/demos/xpc/xpcdemo.js @@ -19,15 +19,16 @@ */ goog.require('goog.Uri'); -goog.require('goog.debug.Logger'); goog.require('goog.dom'); goog.require('goog.events'); goog.require('goog.events.EventType'); goog.require('goog.json'); +goog.require('goog.log'); goog.require('goog.net.xpc.CfgFields'); goog.require('goog.net.xpc.CrossPageChannel'); + /** * Namespace for the demo. We don't use goog.provide here because it's not a * real module (cannot be required). @@ -136,12 +137,12 @@ xpcdemo.initInner = function() { * @private */ xpcdemo.initCommon_ = function() { - var xpcLogger = goog.debug.Logger.getLogger('goog.net.xpc'); - xpcLogger.addHandler(function(logRecord) { + var xpcLogger = goog.log.getLogger('goog.net.xpc'); + goog.log.addHandler(xpcLogger, function(logRecord) { xpcdemo.log('[XPC] ' + logRecord.getMessage()); }); xpcLogger.setLevel(window.location.href.match(/verbose/) ? - goog.debug.Logger.Level.ALL : goog.debug.Logger.Level.INFO); + goog.log.Level.ALL : goog.log.Level.INFO); // Register services. xpcdemo.channel.registerService('log', xpcdemo.log); diff --git a/third_party/closure/goog/demos/zippy.html b/third_party/closure/goog/demos/zippy.html deleted file mode 100644 index fc8bf5f3a8526..0000000000000 --- a/third_party/closure/goog/demos/zippy.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - goog.ui.Zippy - - - - - - - -

goog.ui.Zippy

- -

Zippy 1

-

- Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Cras et nisi id - lorem tempor semper. Suspendisse ante. Integer ligula urna, venenatis quis, - placerat vitae, commodo quis, sapien. Quisque nec lectus. Sed non dolor. Sed - congue, nisi in pharetra consequat, odio diam pulvinar arcu, in laoreet elit - risus id ipsum. Class aptent taciti sociosqu ad litora torquent per conubia - nostra, per inceptos hymenaeos. Praesent tellus enim, imperdiet a, sagittis - id, pulvinar vel, tortor. Integer nulla. Sed nulla augue, lacinia id, - vulputate eu, rhoncus non, ante. Integer lobortis eros vitae quam. Phasellus - sagittis, ipsum sollicitudin bibendum laoreet, arcu erat luctus lacus, vel - pharetra felis metus tincidunt diam. Cras ac augue in enim ultricies aliquam. -

- -
-

Zippy 2

-

- Nunc et eros. Aliquam felis lectus, sagittis ac, sagittis eu, accumsan - vitae, leo. Maecenas suscipit, arcu eget elementum tincidunt, erat ligula - porttitor dui, quis ornare nisi turpis at ipsum. Vivamus magna tortor, - porttitor eu, cursus ut, vulputate in, nulla. Quisque nonummy feugiat - turpis. Cras lobortis lobortis elit. Aliquam congue, pede suscipit - condimentum convallis, diam purus dictum lacus, eu scelerisque mi est - molestie libero. Duis luctus dapibus nibh. Sed condimentum iaculis metus. - Pellentesque habitant morbi tristique senectus et netus et malesuada fames - ac turpis egestas. In pharetra dolor porta eros facilisis pellentesque. - Proin quam mi, sodales vel, tincidunt sit amet, convallis vel, eros. - Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere - cubilia Curae; Phasellus velit augue, rutrum sit amet, posuere nec, euismod - ac, elit. Etiam nisi. -

-
- -
-

Zippy 3

-

- Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas commodo - convallis nisi. Cras rhoncus elit non dolor. Vivamus gravida ultricies arcu. - Praesent ipsum erat, vehicula et, ultrices at, dignissim at, ipsum. Aenean - venenatis. Fusce blandit laoreet urna. Aliquam et pede condimentum lorem - posuere molestie. Pellentesque habitant morbi tristique senectus et netus et - malesuada fames ac turpis egestas. Fusce euismod, justo in feugiat feugiat, - urna metus sagittis felis, in varius neque mauris vitae dui. Nunc vel sapien - in diam laoreet euismod. Mauris quis felis ut ipsum auctor feugiat. Nulla - facilisi. Proin vitae urna. Quisque dignissim commodo nisl. Curabitur - bibendum. -

-
- -
- Zippy 2 sets the expanded state of zippy 3 to the inverted expanded state of - itself. Hence expanding zippy 2 collapses zippy 3 and vice verse. -
-
- Zippy 2 and 3 are animated, zippy 1 is not. -
- -
-
- - - diff --git a/third_party/closure/goog/deps.js b/third_party/closure/goog/deps.js index 3c0fa6daa05db..0e04dc2cb627d 100644 --- a/third_party/closure/goog/deps.js +++ b/third_party/closure/goog/deps.js @@ -1,4 +1,4 @@ -// Copyright 2013 The Closure Library Authors. All Rights Reserved. +// Copyright 2014 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. @@ -19,100 +19,171 @@ goog.addDependency('../../third_party/closure/goog/caja/string/html/htmlsanitize goog.addDependency('../../third_party/closure/goog/dojo/dom/query.js', ['goog.dom.query'], ['goog.array', 'goog.dom', 'goog.functions', 'goog.string', 'goog.userAgent']); goog.addDependency('../../third_party/closure/goog/jpeg_encoder/jpeg_encoder_basic.js', ['goog.crypt.JpegEncoder'], ['goog.crypt.base64']); goog.addDependency('../../third_party/closure/goog/loremipsum/text/loremipsum.js', ['goog.text.LoremIpsum'], ['goog.array', 'goog.math', 'goog.string', 'goog.structs.Map', 'goog.structs.Set']); -goog.addDependency('../../third_party/closure/goog/mochikit/async/deferred.js', ['goog.async.Deferred', 'goog.async.Deferred.AlreadyCalledError', 'goog.async.Deferred.CanceledError'], ['goog.array', 'goog.asserts', 'goog.debug.Error', 'goog.functions']); +goog.addDependency('../../third_party/closure/goog/mochikit/async/deferred.js', ['goog.async.Deferred', 'goog.async.Deferred.AlreadyCalledError', 'goog.async.Deferred.CanceledError'], ['goog.Promise', 'goog.Thenable', 'goog.array', 'goog.asserts', 'goog.debug.Error']); goog.addDependency('../../third_party/closure/goog/mochikit/async/deferredlist.js', ['goog.async.DeferredList'], ['goog.async.Deferred']); goog.addDependency('../../third_party/closure/goog/osapi/osapi.js', ['goog.osapi'], []); +goog.addDependency('../../third_party/closure/goog/svgpan/svgpan.js', ['svgpan.SvgPan'], ['goog.Disposable', 'goog.events', 'goog.events.EventType', 'goog.events.MouseWheelHandler']); goog.addDependency('a11y/aria/announcer.js', ['goog.a11y.aria.Announcer'], ['goog.Disposable', 'goog.a11y.aria', 'goog.a11y.aria.LivePriority', 'goog.a11y.aria.State', 'goog.dom', 'goog.object']); -goog.addDependency('a11y/aria/aria.js', ['goog.a11y.aria'], ['goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.a11y.aria.datatables', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.object', 'goog.string']); +goog.addDependency('a11y/aria/announcer_test.js', ['goog.a11y.aria.AnnouncerTest'], ['goog.a11y.aria', 'goog.a11y.aria.Announcer', 'goog.a11y.aria.LivePriority', 'goog.a11y.aria.State', 'goog.array', 'goog.dom', 'goog.dom.iframe', 'goog.testing.jsunit']); +goog.addDependency('a11y/aria/aria.js', ['goog.a11y.aria'], ['goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.a11y.aria.datatables', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.object']); +goog.addDependency('a11y/aria/aria_test.js', ['goog.a11y.ariaTest'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.TagName', 'goog.testing.jsunit']); goog.addDependency('a11y/aria/attributes.js', ['goog.a11y.aria.AutoCompleteValues', 'goog.a11y.aria.CheckedValues', 'goog.a11y.aria.DropEffectValues', 'goog.a11y.aria.ExpandedValues', 'goog.a11y.aria.GrabbedValues', 'goog.a11y.aria.InvalidValues', 'goog.a11y.aria.LivePriority', 'goog.a11y.aria.OrientationValues', 'goog.a11y.aria.PressedValues', 'goog.a11y.aria.RelevantValues', 'goog.a11y.aria.SelectedValues', 'goog.a11y.aria.SortValues', 'goog.a11y.aria.State'], []); goog.addDependency('a11y/aria/datatables.js', ['goog.a11y.aria.datatables'], ['goog.a11y.aria.State', 'goog.object']); goog.addDependency('a11y/aria/roles.js', ['goog.a11y.aria.Role'], []); goog.addDependency('array/array.js', ['goog.array', 'goog.array.ArrayLike'], ['goog.asserts']); -goog.addDependency('asserts/asserts.js', ['goog.asserts', 'goog.asserts.AssertionError'], ['goog.debug.Error', 'goog.string']); +goog.addDependency('array/array_test.js', ['goog.arrayTest'], ['goog.array', 'goog.dom', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.recordFunction']); +goog.addDependency('asserts/asserts.js', ['goog.asserts', 'goog.asserts.AssertionError'], ['goog.debug.Error', 'goog.dom.NodeType', 'goog.string']); +goog.addDependency('asserts/asserts_test.js', ['goog.assertsTest'], ['goog.asserts', 'goog.asserts.AssertionError', 'goog.dom', 'goog.string', 'goog.testing.jsunit']); goog.addDependency('async/animationdelay.js', ['goog.async.AnimationDelay'], ['goog.Disposable', 'goog.events', 'goog.functions']); +goog.addDependency('async/animationdelay_test.js', ['goog.async.AnimationDelayTest'], ['goog.async.AnimationDelay', 'goog.testing.AsyncTestCase', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.recordFunction']); goog.addDependency('async/conditionaldelay.js', ['goog.async.ConditionalDelay'], ['goog.Disposable', 'goog.async.Delay']); +goog.addDependency('async/conditionaldelay_test.js', ['goog.async.ConditionalDelayTest'], ['goog.async.ConditionalDelay', 'goog.testing.MockClock', 'goog.testing.jsunit']); goog.addDependency('async/delay.js', ['goog.Delay', 'goog.async.Delay'], ['goog.Disposable', 'goog.Timer']); -goog.addDependency('async/nexttick.js', ['goog.async.nextTick'], ['goog.debug.entryPointRegistry', 'goog.functions']); +goog.addDependency('async/delay_test.js', ['goog.async.DelayTest'], ['goog.async.Delay', 'goog.testing.MockClock', 'goog.testing.jsunit']); +goog.addDependency('async/nexttick.js', ['goog.async.nextTick', 'goog.async.throwException'], ['goog.debug.entryPointRegistry', 'goog.functions']); +goog.addDependency('async/nexttick_test.js', ['goog.async.nextTickTest'], ['goog.async.nextTick', 'goog.debug.ErrorHandler', 'goog.debug.entryPointRegistry', 'goog.testing.AsyncTestCase', 'goog.testing.MockClock', 'goog.testing.jsunit']); +goog.addDependency('async/run.js', ['goog.async.run'], ['goog.async.nextTick', 'goog.async.throwException', 'goog.testing.watchers']); +goog.addDependency('async/run_test.js', ['goog.async.runTest'], ['goog.async.run', 'goog.testing.MockClock', 'goog.testing.jsunit', 'goog.testing.recordFunction']); goog.addDependency('async/throttle.js', ['goog.Throttle', 'goog.async.Throttle'], ['goog.Disposable', 'goog.Timer']); +goog.addDependency('async/throttle_test.js', ['goog.async.ThrottleTest'], ['goog.async.Throttle', 'goog.testing.MockClock', 'goog.testing.jsunit']); goog.addDependency('base.js', ['goog'], []); +goog.addDependency('base_test.js', ['an.existing.path', 'dup.base', 'far.out', 'goog.baseTest', 'goog.explicit', 'goog.implicit.explicit', 'goog.test', 'goog.test.name', 'goog.test.name.space', 'goog.xy', 'goog.xy.z', 'ns', 'testDep.bar'], ['goog.Timer', 'goog.functions', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.userAgent']); goog.addDependency('color/alpha.js', ['goog.color.alpha'], ['goog.color']); -goog.addDependency('color/color.js', ['goog.color'], ['goog.color.names', 'goog.math']); +goog.addDependency('color/alpha_test.js', ['goog.color.alphaTest'], ['goog.array', 'goog.color', 'goog.color.alpha', 'goog.testing.jsunit']); +goog.addDependency('color/color.js', ['goog.color', 'goog.color.Hsl', 'goog.color.Hsv', 'goog.color.Rgb'], ['goog.color.names', 'goog.math']); +goog.addDependency('color/color_test.js', ['goog.colorTest'], ['goog.array', 'goog.color', 'goog.color.names', 'goog.testing.jsunit']); goog.addDependency('color/names.js', ['goog.color.names'], []); goog.addDependency('crypt/aes.js', ['goog.crypt.Aes'], ['goog.asserts', 'goog.crypt.BlockCipher']); +goog.addDependency('crypt/aes_test.js', ['goog.crypt.AesTest'], ['goog.crypt', 'goog.crypt.Aes', 'goog.testing.jsunit']); goog.addDependency('crypt/arc4.js', ['goog.crypt.Arc4'], ['goog.asserts']); +goog.addDependency('crypt/arc4_test.js', ['goog.crypt.Arc4Test'], ['goog.array', 'goog.crypt.Arc4', 'goog.testing.jsunit']); goog.addDependency('crypt/base64.js', ['goog.crypt.base64'], ['goog.crypt', 'goog.userAgent']); +goog.addDependency('crypt/base64_test.js', ['goog.crypt.base64Test'], ['goog.crypt', 'goog.crypt.base64', 'goog.testing.jsunit']); goog.addDependency('crypt/basen.js', ['goog.crypt.baseN'], []); -goog.addDependency('crypt/blobhasher.js', ['goog.crypt.BlobHasher', 'goog.crypt.BlobHasher.EventType'], ['goog.asserts', 'goog.crypt', 'goog.crypt.Hash', 'goog.debug.Logger', 'goog.events.EventTarget', 'goog.fs']); +goog.addDependency('crypt/basen_test.js', ['goog.crypt.baseNTest'], ['goog.crypt.baseN', 'goog.testing.jsunit']); +goog.addDependency('crypt/blobhasher.js', ['goog.crypt.BlobHasher', 'goog.crypt.BlobHasher.EventType'], ['goog.asserts', 'goog.crypt', 'goog.crypt.Hash', 'goog.events.EventTarget', 'goog.fs', 'goog.log']); +goog.addDependency('crypt/blobhasher_test.js', ['goog.crypt.BlobHasherTest'], ['goog.crypt', 'goog.crypt.BlobHasher', 'goog.crypt.Md5', 'goog.events', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit']); goog.addDependency('crypt/blockcipher.js', ['goog.crypt.BlockCipher'], []); -goog.addDependency('crypt/cbc.js', ['goog.crypt.Cbc'], ['goog.array', 'goog.crypt']); +goog.addDependency('crypt/bytestring_perf.js', ['goog.crypt.byteArrayToStringPerf'], ['goog.array', 'goog.dom', 'goog.testing.PerformanceTable']); +goog.addDependency('crypt/cbc.js', ['goog.crypt.Cbc'], ['goog.array', 'goog.asserts', 'goog.crypt']); goog.addDependency('crypt/cbc_test.js', ['goog.crypt.CbcTest'], ['goog.crypt', 'goog.crypt.Aes', 'goog.crypt.Cbc', 'goog.testing.jsunit']); -goog.addDependency('crypt/crypt.js', ['goog.crypt'], ['goog.array']); +goog.addDependency('crypt/crypt.js', ['goog.crypt'], ['goog.array', 'goog.asserts']); +goog.addDependency('crypt/crypt_test.js', ['goog.cryptTest'], ['goog.crypt', 'goog.string', 'goog.testing.jsunit']); goog.addDependency('crypt/hash.js', ['goog.crypt.Hash'], []); goog.addDependency('crypt/hash32.js', ['goog.crypt.hash32'], ['goog.crypt']); +goog.addDependency('crypt/hash32_test.js', ['goog.crypt.hash32Test'], ['goog.crypt.hash32', 'goog.testing.TestCase', 'goog.testing.jsunit']); goog.addDependency('crypt/hashtester.js', ['goog.crypt.hashTester'], ['goog.array', 'goog.crypt', 'goog.testing.PerformanceTable', 'goog.testing.PseudoRandom', 'goog.testing.asserts']); -goog.addDependency('crypt/hmac.js', ['goog.crypt.Hmac'], ['goog.asserts', 'goog.crypt.Hash']); +goog.addDependency('crypt/hmac.js', ['goog.crypt.Hmac'], ['goog.crypt.Hash']); +goog.addDependency('crypt/hmac_test.js', ['goog.crypt.HmacTest'], ['goog.crypt.Hmac', 'goog.crypt.Sha1', 'goog.crypt.hashTester', 'goog.testing.jsunit']); goog.addDependency('crypt/md5.js', ['goog.crypt.Md5'], ['goog.crypt.Hash']); +goog.addDependency('crypt/md5_test.js', ['goog.crypt.Md5Test'], ['goog.crypt', 'goog.crypt.Md5', 'goog.crypt.hashTester', 'goog.testing.jsunit']); goog.addDependency('crypt/pbkdf2.js', ['goog.crypt.pbkdf2'], ['goog.asserts', 'goog.crypt', 'goog.crypt.Hmac', 'goog.crypt.Sha1']); +goog.addDependency('crypt/pbkdf2_test.js', ['goog.crypt.pbkdf2Test'], ['goog.crypt', 'goog.crypt.pbkdf2', 'goog.testing.jsunit', 'goog.userAgent']); goog.addDependency('crypt/sha1.js', ['goog.crypt.Sha1'], ['goog.crypt.Hash']); +goog.addDependency('crypt/sha1_test.js', ['goog.crypt.Sha1Test'], ['goog.crypt', 'goog.crypt.Sha1', 'goog.crypt.hashTester', 'goog.testing.jsunit', 'goog.userAgent']); goog.addDependency('crypt/sha2.js', ['goog.crypt.Sha2'], ['goog.array', 'goog.asserts', 'goog.crypt.Hash']); goog.addDependency('crypt/sha224.js', ['goog.crypt.Sha224'], ['goog.crypt.Sha2']); +goog.addDependency('crypt/sha224_test.js', ['goog.crypt.Sha224Test'], ['goog.crypt', 'goog.crypt.Sha224', 'goog.crypt.hashTester', 'goog.testing.jsunit']); goog.addDependency('crypt/sha256.js', ['goog.crypt.Sha256'], ['goog.crypt.Sha2']); +goog.addDependency('crypt/sha256_test.js', ['goog.crypt.Sha256Test'], ['goog.crypt', 'goog.crypt.Sha256', 'goog.crypt.hashTester', 'goog.testing.jsunit']); +goog.addDependency('crypt/sha2_64bit.js', ['goog.crypt.Sha2_64bit'], ['goog.array', 'goog.asserts', 'goog.crypt.Hash', 'goog.math.Long']); +goog.addDependency('crypt/sha2_64bit_test.js', ['goog.crypt.Sha2_64bit_test'], ['goog.array', 'goog.crypt', 'goog.crypt.Sha384', 'goog.crypt.Sha512', 'goog.crypt.Sha512_256', 'goog.crypt.hashTester', 'goog.testing.jsunit', 'goog.userAgent']); +goog.addDependency('crypt/sha384.js', ['goog.crypt.Sha384'], ['goog.crypt.Sha2_64bit']); +goog.addDependency('crypt/sha512.js', ['goog.crypt.Sha512'], ['goog.crypt.Sha2_64bit']); +goog.addDependency('crypt/sha512_256.js', ['goog.crypt.Sha512_256'], ['goog.crypt.Sha2_64bit']); goog.addDependency('cssom/cssom.js', ['goog.cssom', 'goog.cssom.CssRuleType'], ['goog.array', 'goog.dom']); -goog.addDependency('cssom/iframe/style.js', ['goog.cssom.iframe.style'], ['goog.cssom', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classes', 'goog.string', 'goog.style', 'goog.userAgent']); -goog.addDependency('datasource/datamanager.js', ['goog.ds.DataManager'], ['goog.ds.BasicNodeList', 'goog.ds.DataNode', 'goog.ds.Expr', 'goog.string', 'goog.structs', 'goog.structs.Map']); -goog.addDependency('datasource/datasource.js', ['goog.ds.BaseDataNode', 'goog.ds.BasicNodeList', 'goog.ds.DataNode', 'goog.ds.DataNodeList', 'goog.ds.EmptyNodeList', 'goog.ds.LoadState', 'goog.ds.SortedNodeList', 'goog.ds.Util', 'goog.ds.logger'], ['goog.array', 'goog.debug.Logger']); +goog.addDependency('cssom/cssom_test.js', ['goog.cssomTest'], ['goog.array', 'goog.cssom', 'goog.cssom.CssRuleType', 'goog.testing.jsunit', 'goog.userAgent']); +goog.addDependency('cssom/iframe/style.js', ['goog.cssom.iframe.style'], ['goog.asserts', 'goog.cssom', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.string', 'goog.style', 'goog.userAgent']); +goog.addDependency('cssom/iframe/style_test.js', ['goog.cssom.iframe.styleTest'], ['goog.cssom', 'goog.cssom.iframe.style', 'goog.dom', 'goog.dom.DomHelper', 'goog.testing.jsunit', 'goog.userAgent']); +goog.addDependency('datasource/datamanager.js', ['goog.ds.DataManager'], ['goog.ds.BasicNodeList', 'goog.ds.DataNode', 'goog.ds.Expr', 'goog.object', 'goog.string', 'goog.structs', 'goog.structs.Map']); +goog.addDependency('datasource/datasource.js', ['goog.ds.BaseDataNode', 'goog.ds.BasicNodeList', 'goog.ds.DataNode', 'goog.ds.DataNodeList', 'goog.ds.EmptyNodeList', 'goog.ds.LoadState', 'goog.ds.SortedNodeList', 'goog.ds.Util', 'goog.ds.logger'], ['goog.array', 'goog.log']); +goog.addDependency('datasource/datasource_test.js', ['goog.ds.JsDataSourceTest'], ['goog.dom.xml', 'goog.ds.DataManager', 'goog.ds.JsDataSource', 'goog.ds.SortedNodeList', 'goog.ds.XmlDataSource', 'goog.testing.jsunit']); goog.addDependency('datasource/expr.js', ['goog.ds.Expr'], ['goog.ds.BasicNodeList', 'goog.ds.EmptyNodeList', 'goog.string']); +goog.addDependency('datasource/expr_test.js', ['goog.ds.ExprTest'], ['goog.ds.DataManager', 'goog.ds.Expr', 'goog.ds.JsDataSource', 'goog.testing.jsunit']); goog.addDependency('datasource/fastdatanode.js', ['goog.ds.AbstractFastDataNode', 'goog.ds.FastDataNode', 'goog.ds.FastListNode', 'goog.ds.PrimitiveFastDataNode'], ['goog.ds.DataManager', 'goog.ds.EmptyNodeList', 'goog.string']); +goog.addDependency('datasource/fastdatanode_test.js', ['goog.ds.FastDataNodeTest'], ['goog.array', 'goog.ds.DataManager', 'goog.ds.Expr', 'goog.ds.FastDataNode', 'goog.testing.jsunit']); goog.addDependency('datasource/jsdatasource.js', ['goog.ds.JsDataSource', 'goog.ds.JsPropertyDataSource'], ['goog.ds.BaseDataNode', 'goog.ds.BasicNodeList', 'goog.ds.DataManager', 'goog.ds.EmptyNodeList', 'goog.ds.LoadState']); goog.addDependency('datasource/jsondatasource.js', ['goog.ds.JsonDataSource'], ['goog.Uri', 'goog.dom', 'goog.ds.DataManager', 'goog.ds.JsDataSource', 'goog.ds.LoadState', 'goog.ds.logger']); -goog.addDependency('datasource/jsxmlhttpdatasource.js', ['goog.ds.JsXmlHttpDataSource'], ['goog.Uri', 'goog.ds.DataManager', 'goog.ds.FastDataNode', 'goog.ds.LoadState', 'goog.ds.logger', 'goog.events', 'goog.net.EventType', 'goog.net.XhrIo']); +goog.addDependency('datasource/jsxmlhttpdatasource.js', ['goog.ds.JsXmlHttpDataSource'], ['goog.Uri', 'goog.ds.DataManager', 'goog.ds.FastDataNode', 'goog.ds.LoadState', 'goog.ds.logger', 'goog.events', 'goog.log', 'goog.net.EventType', 'goog.net.XhrIo']); +goog.addDependency('datasource/jsxmlhttpdatasource_test.js', ['goog.ds.JsXmlHttpDataSourceTest'], ['goog.ds.JsXmlHttpDataSource', 'goog.testing.TestQueue', 'goog.testing.jsunit', 'goog.testing.net.XhrIo']); goog.addDependency('datasource/xmldatasource.js', ['goog.ds.XmlDataSource', 'goog.ds.XmlHttpDataSource'], ['goog.Uri', 'goog.dom.NodeType', 'goog.dom.xml', 'goog.ds.BasicNodeList', 'goog.ds.DataManager', 'goog.ds.LoadState', 'goog.ds.logger', 'goog.net.XhrIo', 'goog.string']); goog.addDependency('date/date.js', ['goog.date', 'goog.date.Date', 'goog.date.DateTime', 'goog.date.Interval', 'goog.date.month', 'goog.date.weekDay'], ['goog.asserts', 'goog.date.DateLike', 'goog.i18n.DateTimeSymbols', 'goog.string']); +goog.addDependency('date/date_test.js', ['goog.dateTest'], ['goog.array', 'goog.date', 'goog.date.Date', 'goog.date.DateTime', 'goog.date.Interval', 'goog.date.month', 'goog.date.weekDay', 'goog.i18n.DateTimeSymbols', 'goog.testing.ExpectedFailures', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgent.platform', 'goog.userAgent.product', 'goog.userAgent.product.isVersion']); goog.addDependency('date/datelike.js', ['goog.date.DateLike'], []); goog.addDependency('date/daterange.js', ['goog.date.DateRange', 'goog.date.DateRange.Iterator', 'goog.date.DateRange.StandardDateRangeKeys'], ['goog.date.Date', 'goog.date.Interval', 'goog.iter.Iterator', 'goog.iter.StopIteration']); -goog.addDependency('date/relative.js', ['goog.date.relative'], ['goog.i18n.DateTimeFormat']); +goog.addDependency('date/daterange_test.js', ['goog.date.DateRangeTest'], ['goog.date.Date', 'goog.date.DateRange', 'goog.date.Interval', 'goog.i18n.DateTimeSymbols', 'goog.testing.jsunit']); +goog.addDependency('date/duration.js', ['goog.date.duration'], ['goog.i18n.DateTimeFormat', 'goog.i18n.MessageFormat']); +goog.addDependency('date/duration_test.js', ['goog.date.durationTest'], ['goog.date.duration', 'goog.i18n.DateTimeFormat', 'goog.i18n.DateTimeSymbols', 'goog.i18n.DateTimeSymbols_bn', 'goog.i18n.DateTimeSymbols_en', 'goog.i18n.DateTimeSymbols_fa', 'goog.testing.jsunit']); +goog.addDependency('date/relative.js', ['goog.date.relative', 'goog.date.relative.TimeDeltaFormatter', 'goog.date.relative.Unit'], ['goog.i18n.DateTimeFormat']); +goog.addDependency('date/relative_test.js', ['goog.date.relativeTest'], ['goog.date.DateTime', 'goog.date.relative', 'goog.i18n.DateTimeFormat', 'goog.testing.jsunit']); +goog.addDependency('date/relativewithplurals.js', ['goog.date.relativeWithPlurals'], ['goog.date.relative', 'goog.date.relative.Unit', 'goog.i18n.MessageFormat']); +goog.addDependency('date/relativewithplurals_test.js', ['goog.date.relativeWithPluralsTest'], ['goog.date.relative', 'goog.date.relativeTest', 'goog.date.relativeWithPlurals', 'goog.i18n.DateTimeFormat', 'goog.i18n.DateTimeSymbols', 'goog.i18n.DateTimeSymbols_bn', 'goog.i18n.DateTimeSymbols_en', 'goog.i18n.DateTimeSymbols_fa', 'goog.i18n.NumberFormatSymbols', 'goog.i18n.NumberFormatSymbols_bn', 'goog.i18n.NumberFormatSymbols_en', 'goog.i18n.NumberFormatSymbols_fa']); goog.addDependency('date/utcdatetime.js', ['goog.date.UtcDateTime'], ['goog.date', 'goog.date.Date', 'goog.date.DateTime', 'goog.date.Interval']); +goog.addDependency('date/utcdatetime_test.js', ['goog.date.UtcDateTimeTest'], ['goog.date.Interval', 'goog.date.UtcDateTime', 'goog.date.month', 'goog.date.weekDay', 'goog.testing.jsunit']); goog.addDependency('db/cursor.js', ['goog.db.Cursor'], ['goog.async.Deferred', 'goog.db.Error', 'goog.debug', 'goog.events.EventTarget']); goog.addDependency('db/db.js', ['goog.db'], ['goog.async.Deferred', 'goog.db.Error', 'goog.db.IndexedDb', 'goog.db.Transaction']); +goog.addDependency('db/db_test.js', ['goog.dbTest'], ['goog.Disposable', 'goog.array', 'goog.async.Deferred', 'goog.async.DeferredList', 'goog.db', 'goog.db.Cursor', 'goog.db.Error', 'goog.db.IndexedDb', 'goog.db.KeyRange', 'goog.db.Transaction', 'goog.events', 'goog.object', 'goog.testing.AsyncTestCase', 'goog.testing.PropertyReplacer', 'goog.testing.asserts', 'goog.testing.jsunit', 'goog.userAgent.product', 'goog.userAgent.product.isVersion']); goog.addDependency('db/error.js', ['goog.db.Error', 'goog.db.Error.ErrorCode', 'goog.db.Error.ErrorName', 'goog.db.Error.VersionChangeBlockedError'], ['goog.debug.Error']); goog.addDependency('db/index.js', ['goog.db.Index'], ['goog.async.Deferred', 'goog.db.Cursor', 'goog.db.Error', 'goog.debug']); -goog.addDependency('db/indexeddb.js', ['goog.db.IndexedDb'], ['goog.async.Deferred', 'goog.db.Error', 'goog.db.Error.VersionChangeBlockedError', 'goog.db.ObjectStore', 'goog.db.Transaction', 'goog.db.Transaction.TransactionMode', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget']); +goog.addDependency('db/indexeddb.js', ['goog.db.IndexedDb'], ['goog.async.Deferred', 'goog.db.Error', 'goog.db.ObjectStore', 'goog.db.Transaction', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget']); goog.addDependency('db/keyrange.js', ['goog.db.KeyRange'], []); goog.addDependency('db/objectstore.js', ['goog.db.ObjectStore'], ['goog.async.Deferred', 'goog.db.Cursor', 'goog.db.Error', 'goog.db.Index', 'goog.debug', 'goog.events']); +goog.addDependency('db/old_db_test.js', ['goog.oldDbTest'], ['goog.async.Deferred', 'goog.db', 'goog.db.Cursor', 'goog.db.Error', 'goog.db.IndexedDb', 'goog.db.KeyRange', 'goog.db.Transaction', 'goog.events', 'goog.testing.AsyncTestCase', 'goog.testing.asserts', 'goog.testing.jsunit', 'goog.userAgent.product', 'goog.userAgent.product.isVersion']); goog.addDependency('db/transaction.js', ['goog.db.Transaction', 'goog.db.Transaction.TransactionMode'], ['goog.async.Deferred', 'goog.db.Error', 'goog.db.ObjectStore', 'goog.events.EventHandler', 'goog.events.EventTarget']); goog.addDependency('debug/console.js', ['goog.debug.Console'], ['goog.debug.LogManager', 'goog.debug.Logger.Level', 'goog.debug.TextFormatter']); +goog.addDependency('debug/console_test.js', ['goog.debug.ConsoleTest'], ['goog.debug.Console', 'goog.debug.LogRecord', 'goog.debug.Logger', 'goog.testing.jsunit', 'goog.testing.recordFunction']); goog.addDependency('debug/debug.js', ['goog.debug'], ['goog.array', 'goog.string', 'goog.structs.Set', 'goog.userAgent']); +goog.addDependency('debug/debug_test.js', ['goog.debugTest'], ['goog.debug', 'goog.structs.Set', 'goog.testing.jsunit']); goog.addDependency('debug/debugwindow.js', ['goog.debug.DebugWindow'], ['goog.debug.HtmlFormatter', 'goog.debug.LogManager', 'goog.debug.Logger', 'goog.structs.CircularBuffer', 'goog.userAgent']); -goog.addDependency('debug/devcss/devcss.js', ['goog.debug.DevCss', 'goog.debug.DevCss.UserAgent'], ['goog.cssom', 'goog.dom.classes', 'goog.events', 'goog.events.EventType', 'goog.string', 'goog.userAgent']); +goog.addDependency('debug/debugwindow_test.js', ['goog.debug.DebugWindowTest'], ['goog.debug.DebugWindow', 'goog.testing.jsunit']); +goog.addDependency('debug/devcss/devcss.js', ['goog.debug.DevCss', 'goog.debug.DevCss.UserAgent'], ['goog.asserts', 'goog.cssom', 'goog.dom.classlist', 'goog.events', 'goog.events.EventType', 'goog.string', 'goog.userAgent']); +goog.addDependency('debug/devcss/devcss_test.js', ['goog.debug.DevCssTest'], ['goog.debug.DevCss', 'goog.style', 'goog.testing.jsunit']); goog.addDependency('debug/devcss/devcssrunner.js', ['goog.debug.devCssRunner'], ['goog.debug.DevCss']); goog.addDependency('debug/divconsole.js', ['goog.debug.DivConsole'], ['goog.debug.HtmlFormatter', 'goog.debug.LogManager', 'goog.style']); +goog.addDependency('debug/enhanceerror_test.js', ['goog.debugEnhanceErrorTest'], ['goog.debug', 'goog.testing.jsunit']); goog.addDependency('debug/entrypointregistry.js', ['goog.debug.EntryPointMonitor', 'goog.debug.entryPointRegistry'], ['goog.asserts']); +goog.addDependency('debug/entrypointregistry_test.js', ['goog.debug.entryPointRegistryTest'], ['goog.debug.ErrorHandler', 'goog.debug.entryPointRegistry', 'goog.testing.jsunit']); goog.addDependency('debug/error.js', ['goog.debug.Error'], []); +goog.addDependency('debug/error_test.js', ['goog.debug.ErrorTest'], ['goog.debug.Error', 'goog.testing.ExpectedFailures', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgent.product']); goog.addDependency('debug/errorhandler.js', ['goog.debug.ErrorHandler', 'goog.debug.ErrorHandler.ProtectedFunctionError'], ['goog.asserts', 'goog.debug', 'goog.debug.EntryPointMonitor', 'goog.debug.Trace']); +goog.addDependency('debug/errorhandler_async_test.js', ['goog.debug.ErrorHandlerAsyncTest'], ['goog.debug.ErrorHandler', 'goog.testing.AsyncTestCase', 'goog.testing.jsunit', 'goog.userAgent']); +goog.addDependency('debug/errorhandler_test.js', ['goog.debug.ErrorHandlerTest'], ['goog.debug.ErrorHandler', 'goog.testing.MockControl', 'goog.testing.jsunit']); goog.addDependency('debug/errorhandlerweakdep.js', ['goog.debug.errorHandlerWeakDep'], []); -goog.addDependency('debug/errorreporter.js', ['goog.debug.ErrorReporter', 'goog.debug.ErrorReporter.ExceptionEvent'], ['goog.debug', 'goog.debug.ErrorHandler', 'goog.debug.Logger', 'goog.debug.entryPointRegistry', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.net.XhrIo', 'goog.object', 'goog.string', 'goog.uri.utils', 'goog.userAgent']); -goog.addDependency('debug/fancywindow.js', ['goog.debug.FancyWindow'], ['goog.debug.DebugWindow', 'goog.debug.LogManager', 'goog.debug.Logger', 'goog.dom.DomHelper', 'goog.object', 'goog.string', 'goog.userAgent']); +goog.addDependency('debug/errorreporter.js', ['goog.debug.ErrorReporter', 'goog.debug.ErrorReporter.ExceptionEvent'], ['goog.asserts', 'goog.debug', 'goog.debug.ErrorHandler', 'goog.debug.entryPointRegistry', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.log', 'goog.net.XhrIo', 'goog.object', 'goog.string', 'goog.uri.utils', 'goog.userAgent']); +goog.addDependency('debug/errorreporter_test.js', ['goog.debug.ErrorReporterTest'], ['goog.debug.ErrorReporter', 'goog.events', 'goog.functions', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.userAgent']); +goog.addDependency('debug/fancywindow.js', ['goog.debug.FancyWindow'], ['goog.array', 'goog.debug.DebugWindow', 'goog.debug.LogManager', 'goog.debug.Logger', 'goog.dom.DomHelper', 'goog.dom.safe', 'goog.html.SafeHtml', 'goog.object', 'goog.string', 'goog.userAgent']); goog.addDependency('debug/formatter.js', ['goog.debug.Formatter', 'goog.debug.HtmlFormatter', 'goog.debug.TextFormatter'], ['goog.debug.RelativeTimeProvider', 'goog.string']); goog.addDependency('debug/fpsdisplay.js', ['goog.debug.FpsDisplay'], ['goog.asserts', 'goog.async.AnimationDelay', 'goog.ui.Component']); -goog.addDependency('debug/gcdiagnostics.js', ['goog.debug.GcDiagnostics'], ['goog.debug.Logger', 'goog.debug.Trace', 'goog.userAgent']); +goog.addDependency('debug/fpsdisplay_test.js', ['goog.debug.FpsDisplayTest'], ['goog.debug.FpsDisplay', 'goog.testing.AsyncTestCase', 'goog.testing.jsunit']); +goog.addDependency('debug/gcdiagnostics.js', ['goog.debug.GcDiagnostics'], ['goog.debug.Trace', 'goog.log', 'goog.userAgent']); goog.addDependency('debug/logbuffer.js', ['goog.debug.LogBuffer'], ['goog.asserts', 'goog.debug.LogRecord']); -goog.addDependency('debug/logger.js', ['goog.debug.LogManager', 'goog.debug.Logger', 'goog.debug.Logger.Level'], ['goog.array', 'goog.asserts', 'goog.debug', 'goog.debug.LogBuffer', 'goog.debug.LogRecord']); +goog.addDependency('debug/logbuffer_test.js', ['goog.debug.LogBufferTest'], ['goog.debug.LogBuffer', 'goog.debug.Logger', 'goog.testing.jsunit']); +goog.addDependency('debug/logger.js', ['goog.debug.LogManager', 'goog.debug.Loggable', 'goog.debug.Logger', 'goog.debug.Logger.Level'], ['goog.array', 'goog.asserts', 'goog.debug', 'goog.debug.LogBuffer', 'goog.debug.LogRecord']); +goog.addDependency('debug/logger_test.js', ['goog.debug.LoggerTest'], ['goog.debug.LogManager', 'goog.debug.Logger', 'goog.testing.jsunit']); goog.addDependency('debug/logrecord.js', ['goog.debug.LogRecord'], []); goog.addDependency('debug/logrecordserializer.js', ['goog.debug.logRecordSerializer'], ['goog.debug.LogRecord', 'goog.debug.Logger.Level', 'goog.json', 'goog.object']); +goog.addDependency('debug/logrecordserializer_test.js', ['goog.debug.logRecordSerializerTest'], ['goog.debug.LogRecord', 'goog.debug.Logger', 'goog.debug.logRecordSerializer', 'goog.testing.jsunit']); goog.addDependency('debug/reflect.js', ['goog.debug.reflect'], []); +goog.addDependency('debug/reflect_test.js', ['goog.debug.reflectTest', 'x.a'], ['goog.debug.reflect', 'goog.testing.jsunit', 'goog.userAgent']); goog.addDependency('debug/relativetimeprovider.js', ['goog.debug.RelativeTimeProvider'], []); -goog.addDependency('debug/tracer.js', ['goog.debug.Trace'], ['goog.array', 'goog.debug.Logger', 'goog.iter', 'goog.structs.Map', 'goog.structs.SimplePool']); -goog.addDependency('disposable/disposable.js', ['goog.Disposable', 'goog.dispose'], ['goog.disposable.IDisposable']); +goog.addDependency('debug/tracer.js', ['goog.debug.Trace'], ['goog.array', 'goog.iter', 'goog.log', 'goog.structs.Map', 'goog.structs.SimplePool']); +goog.addDependency('debug/tracer_test.js', ['goog.debug.TraceTest'], ['goog.debug.Trace', 'goog.testing.jsunit']); +goog.addDependency('disposable/disposable.js', ['goog.Disposable', 'goog.dispose', 'goog.disposeAll'], ['goog.disposable.IDisposable']); +goog.addDependency('disposable/disposable_test.js', ['goog.DisposableTest'], ['goog.Disposable', 'goog.testing.jsunit', 'goog.testing.recordFunction']); goog.addDependency('disposable/idisposable.js', ['goog.disposable.IDisposable'], []); -goog.addDependency('dom/a11y.js', ['goog.dom.a11y', 'goog.dom.a11y.Announcer', 'goog.dom.a11y.LivePriority', 'goog.dom.a11y.Role', 'goog.dom.a11y.State'], ['goog.a11y.aria', 'goog.a11y.aria.Announcer', 'goog.a11y.aria.LivePriority', 'goog.a11y.aria.Role', 'goog.a11y.aria.State']); goog.addDependency('dom/abstractmultirange.js', ['goog.dom.AbstractMultiRange'], ['goog.array', 'goog.dom', 'goog.dom.AbstractRange']); goog.addDependency('dom/abstractrange.js', ['goog.dom.AbstractRange', 'goog.dom.RangeIterator', 'goog.dom.RangeType'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.SavedCaretRange', 'goog.dom.TagIterator', 'goog.userAgent']); +goog.addDependency('dom/abstractrange_test.js', ['goog.dom.AbstractRangeTest'], ['goog.dom', 'goog.dom.AbstractRange', 'goog.dom.Range', 'goog.testing.jsunit']); +goog.addDependency('dom/animationframe/animationframe.js', ['goog.dom.animationFrame', 'goog.dom.animationFrame.Spec', 'goog.dom.animationFrame.State'], ['goog.dom.animationFrame.polyfill']); +goog.addDependency('dom/animationframe/polyfill.js', ['goog.dom.animationFrame.polyfill'], []); goog.addDependency('dom/annotate.js', ['goog.dom.annotate'], ['goog.array', 'goog.dom', 'goog.dom.NodeType', 'goog.string']); +goog.addDependency('dom/annotate_test.js', ['goog.dom.annotateTest'], ['goog.dom', 'goog.dom.annotate', 'goog.testing.jsunit']); goog.addDependency('dom/browserfeature.js', ['goog.dom.BrowserFeature'], ['goog.userAgent']); goog.addDependency('dom/browserrange/abstractrange.js', ['goog.dom.browserrange.AbstractRange'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.RangeEndpoint', 'goog.dom.TagName', 'goog.dom.TextRangeIterator', 'goog.iter', 'goog.math.Coordinate', 'goog.string', 'goog.string.StringBuffer', 'goog.userAgent']); goog.addDependency('dom/browserrange/browserrange.js', ['goog.dom.browserrange', 'goog.dom.browserrange.Error'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.browserrange.GeckoRange', 'goog.dom.browserrange.IeRange', 'goog.dom.browserrange.OperaRange', 'goog.dom.browserrange.W3cRange', 'goog.dom.browserrange.WebKitRange', 'goog.userAgent']); +goog.addDependency('dom/browserrange/browserrange_test.js', ['goog.dom.browserrangeTest'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.RangeEndpoint', 'goog.dom.TagName', 'goog.dom.browserrange', 'goog.testing.dom', 'goog.testing.jsunit', 'goog.userAgent']); goog.addDependency('dom/browserrange/geckorange.js', ['goog.dom.browserrange.GeckoRange'], ['goog.dom.browserrange.W3cRange']); -goog.addDependency('dom/browserrange/ierange.js', ['goog.dom.browserrange.IeRange'], ['goog.array', 'goog.debug.Logger', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.RangeEndpoint', 'goog.dom.TagName', 'goog.dom.browserrange.AbstractRange', 'goog.string']); +goog.addDependency('dom/browserrange/ierange.js', ['goog.dom.browserrange.IeRange'], ['goog.array', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.RangeEndpoint', 'goog.dom.TagName', 'goog.dom.browserrange.AbstractRange', 'goog.log', 'goog.string']); goog.addDependency('dom/browserrange/operarange.js', ['goog.dom.browserrange.OperaRange'], ['goog.dom.browserrange.W3cRange']); goog.addDependency('dom/browserrange/w3crange.js', ['goog.dom.browserrange.W3cRange'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.RangeEndpoint', 'goog.dom.browserrange.AbstractRange', 'goog.string']); goog.addDependency('dom/browserrange/webkitrange.js', ['goog.dom.browserrange.WebKitRange'], ['goog.dom.RangeEndpoint', 'goog.dom.browserrange.W3cRange', 'goog.userAgent']); @@ -120,20 +191,30 @@ goog.addDependency('dom/bufferedviewportsizemonitor.js', ['goog.dom.BufferedView goog.addDependency('dom/bufferedviewportsizemonitor_test.js', ['goog.dom.BufferedViewportSizeMonitorTest'], ['goog.dom.BufferedViewportSizeMonitor', 'goog.dom.ViewportSizeMonitor', 'goog.events', 'goog.events.EventType', 'goog.math.Size', 'goog.testing.MockClock', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.jsunit']); goog.addDependency('dom/classes.js', ['goog.dom.classes'], ['goog.array']); goog.addDependency('dom/classes_test.js', ['goog.dom.classes_test'], ['goog.dom', 'goog.dom.classes', 'goog.testing.jsunit']); -goog.addDependency('dom/classlist.js', ['goog.dom.classlist'], ['goog.array', 'goog.asserts']); -goog.addDependency('dom/classlist_test.js', ['goog.dom.classlist_test'], ['goog.dom', 'goog.dom.classlist', 'goog.testing.jsunit']); +goog.addDependency('dom/classlist.js', ['goog.dom.classlist'], ['goog.array']); +goog.addDependency('dom/classlist_test.js', ['goog.dom.classlist_test'], ['goog.dom', 'goog.dom.classlist', 'goog.testing.ExpectedFailures', 'goog.testing.jsunit', 'goog.userAgent.product']); goog.addDependency('dom/controlrange.js', ['goog.dom.ControlRange', 'goog.dom.ControlRangeIterator'], ['goog.array', 'goog.dom', 'goog.dom.AbstractMultiRange', 'goog.dom.AbstractRange', 'goog.dom.RangeIterator', 'goog.dom.RangeType', 'goog.dom.SavedRange', 'goog.dom.TagWalkType', 'goog.dom.TextRange', 'goog.iter.StopIteration', 'goog.userAgent']); +goog.addDependency('dom/controlrange_test.js', ['goog.dom.ControlRangeTest'], ['goog.dom', 'goog.dom.ControlRange', 'goog.dom.RangeType', 'goog.dom.TagName', 'goog.dom.TextRange', 'goog.testing.dom', 'goog.testing.jsunit', 'goog.userAgent']); goog.addDependency('dom/dataset.js', ['goog.dom.dataset'], ['goog.string']); -goog.addDependency('dom/dom.js', ['goog.dom', 'goog.dom.Appendable', 'goog.dom.DomHelper', 'goog.dom.NodeType'], ['goog.array', 'goog.dom.BrowserFeature', 'goog.dom.TagName', 'goog.dom.classes', 'goog.math.Coordinate', 'goog.math.Size', 'goog.object', 'goog.string', 'goog.userAgent']); -goog.addDependency('dom/dom_test.js', ['goog.dom.dom_test'], ['goog.dom', 'goog.dom.BrowserFeature', 'goog.dom.DomHelper', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.object', 'goog.string.Unicode', 'goog.testing.asserts', 'goog.userAgent', 'goog.userAgent.product', 'goog.userAgent.product.isVersion']); +goog.addDependency('dom/dataset_test.js', ['goog.dom.datasetTest'], ['goog.dom', 'goog.dom.dataset', 'goog.testing.jsunit']); +goog.addDependency('dom/dom.js', ['goog.dom', 'goog.dom.Appendable', 'goog.dom.DomHelper'], ['goog.array', 'goog.asserts', 'goog.dom.BrowserFeature', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classes', 'goog.functions', 'goog.math.Coordinate', 'goog.math.Size', 'goog.object', 'goog.string', 'goog.userAgent']); +goog.addDependency('dom/dom_test.js', ['goog.dom.dom_test'], ['goog.dom', 'goog.dom.BrowserFeature', 'goog.dom.DomHelper', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.functions', 'goog.object', 'goog.string.Unicode', 'goog.testing.PropertyReplacer', 'goog.testing.asserts', 'goog.userAgent', 'goog.userAgent.product', 'goog.userAgent.product.isVersion']); goog.addDependency('dom/fontsizemonitor.js', ['goog.dom.FontSizeMonitor', 'goog.dom.FontSizeMonitor.EventType'], ['goog.dom', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.userAgent']); +goog.addDependency('dom/fontsizemonitor_test.js', ['goog.dom.FontSizeMonitorTest'], ['goog.dom', 'goog.dom.FontSizeMonitor', 'goog.events', 'goog.events.Event', 'goog.testing.PropertyReplacer', 'goog.testing.events', 'goog.testing.jsunit', 'goog.userAgent']); goog.addDependency('dom/forms.js', ['goog.dom.forms'], ['goog.structs.Map']); -goog.addDependency('dom/fullscreen.js', ['goog.dom.fullscreen', 'goog.dom.fullscreen.EventType'], ['goog.dom', 'goog.userAgent', 'goog.userAgent.product']); +goog.addDependency('dom/forms_test.js', ['goog.dom.formsTest'], ['goog.dom', 'goog.dom.forms', 'goog.testing.jsunit']); +goog.addDependency('dom/fullscreen.js', ['goog.dom.fullscreen', 'goog.dom.fullscreen.EventType'], ['goog.dom', 'goog.userAgent']); goog.addDependency('dom/iframe.js', ['goog.dom.iframe'], ['goog.dom', 'goog.userAgent']); +goog.addDependency('dom/iframe_test.js', ['goog.dom.iframeTest'], ['goog.dom', 'goog.dom.iframe', 'goog.testing.jsunit']); goog.addDependency('dom/iter.js', ['goog.dom.iter.AncestorIterator', 'goog.dom.iter.ChildIterator', 'goog.dom.iter.SiblingIterator'], ['goog.iter.Iterator', 'goog.iter.StopIteration']); -goog.addDependency('dom/multirange.js', ['goog.dom.MultiRange', 'goog.dom.MultiRangeIterator'], ['goog.array', 'goog.debug.Logger', 'goog.dom.AbstractMultiRange', 'goog.dom.AbstractRange', 'goog.dom.RangeIterator', 'goog.dom.RangeType', 'goog.dom.SavedRange', 'goog.dom.TextRange', 'goog.iter.StopIteration']); +goog.addDependency('dom/iter_test.js', ['goog.dom.iterTest'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.iter.AncestorIterator', 'goog.dom.iter.ChildIterator', 'goog.dom.iter.SiblingIterator', 'goog.testing.dom', 'goog.testing.jsunit']); +goog.addDependency('dom/multirange.js', ['goog.dom.MultiRange', 'goog.dom.MultiRangeIterator'], ['goog.array', 'goog.dom.AbstractMultiRange', 'goog.dom.AbstractRange', 'goog.dom.RangeIterator', 'goog.dom.RangeType', 'goog.dom.SavedRange', 'goog.dom.TextRange', 'goog.iter.StopIteration', 'goog.log']); +goog.addDependency('dom/multirange_test.js', ['goog.dom.MultiRangeTest'], ['goog.dom', 'goog.dom.MultiRange', 'goog.dom.Range', 'goog.iter', 'goog.testing.jsunit']); goog.addDependency('dom/nodeiterator.js', ['goog.dom.NodeIterator'], ['goog.dom.TagIterator']); +goog.addDependency('dom/nodeiterator_test.js', ['goog.dom.NodeIteratorTest'], ['goog.dom', 'goog.dom.NodeIterator', 'goog.testing.dom', 'goog.testing.jsunit']); goog.addDependency('dom/nodeoffset.js', ['goog.dom.NodeOffset'], ['goog.Disposable', 'goog.dom.TagName']); +goog.addDependency('dom/nodeoffset_test.js', ['goog.dom.NodeOffsetTest'], ['goog.dom', 'goog.dom.NodeOffset', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.testing.jsunit']); +goog.addDependency('dom/nodetype.js', ['goog.dom.NodeType'], []); goog.addDependency('dom/pattern/abstractpattern.js', ['goog.dom.pattern.AbstractPattern'], ['goog.dom.pattern.MatchType']); goog.addDependency('dom/pattern/allchildren.js', ['goog.dom.pattern.AllChildren'], ['goog.dom.pattern.AbstractPattern', 'goog.dom.pattern.MatchType']); goog.addDependency('dom/pattern/callback/callback.js', ['goog.dom.pattern.callback'], ['goog.dom', 'goog.dom.TagWalkType', 'goog.iter']); @@ -143,134 +224,209 @@ goog.addDependency('dom/pattern/childmatches.js', ['goog.dom.pattern.ChildMatche goog.addDependency('dom/pattern/endtag.js', ['goog.dom.pattern.EndTag'], ['goog.dom.TagWalkType', 'goog.dom.pattern.Tag']); goog.addDependency('dom/pattern/fulltag.js', ['goog.dom.pattern.FullTag'], ['goog.dom.pattern.MatchType', 'goog.dom.pattern.StartTag', 'goog.dom.pattern.Tag']); goog.addDependency('dom/pattern/matcher.js', ['goog.dom.pattern.Matcher'], ['goog.dom.TagIterator', 'goog.dom.pattern.MatchType', 'goog.iter']); +goog.addDependency('dom/pattern/matcher_test.js', ['goog.dom.pattern.matcherTest'], ['goog.dom', 'goog.dom.pattern.EndTag', 'goog.dom.pattern.FullTag', 'goog.dom.pattern.Matcher', 'goog.dom.pattern.Repeat', 'goog.dom.pattern.Sequence', 'goog.dom.pattern.StartTag', 'goog.dom.pattern.callback.Counter', 'goog.dom.pattern.callback.Test', 'goog.iter.StopIteration', 'goog.testing.jsunit']); goog.addDependency('dom/pattern/nodetype.js', ['goog.dom.pattern.NodeType'], ['goog.dom.pattern.AbstractPattern', 'goog.dom.pattern.MatchType']); goog.addDependency('dom/pattern/pattern.js', ['goog.dom.pattern', 'goog.dom.pattern.MatchType'], []); +goog.addDependency('dom/pattern/pattern_test.js', ['goog.dom.patternTest'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.TagWalkType', 'goog.dom.pattern.AllChildren', 'goog.dom.pattern.ChildMatches', 'goog.dom.pattern.EndTag', 'goog.dom.pattern.FullTag', 'goog.dom.pattern.MatchType', 'goog.dom.pattern.NodeType', 'goog.dom.pattern.Repeat', 'goog.dom.pattern.Sequence', 'goog.dom.pattern.StartTag', 'goog.dom.pattern.Text', 'goog.testing.jsunit']); goog.addDependency('dom/pattern/repeat.js', ['goog.dom.pattern.Repeat'], ['goog.dom.NodeType', 'goog.dom.pattern.AbstractPattern', 'goog.dom.pattern.MatchType']); goog.addDependency('dom/pattern/sequence.js', ['goog.dom.pattern.Sequence'], ['goog.dom.NodeType', 'goog.dom.pattern.AbstractPattern', 'goog.dom.pattern.MatchType']); goog.addDependency('dom/pattern/starttag.js', ['goog.dom.pattern.StartTag'], ['goog.dom.TagWalkType', 'goog.dom.pattern.Tag']); goog.addDependency('dom/pattern/tag.js', ['goog.dom.pattern.Tag'], ['goog.dom.pattern', 'goog.dom.pattern.AbstractPattern', 'goog.dom.pattern.MatchType', 'goog.object']); goog.addDependency('dom/pattern/text.js', ['goog.dom.pattern.Text'], ['goog.dom.NodeType', 'goog.dom.pattern', 'goog.dom.pattern.AbstractPattern', 'goog.dom.pattern.MatchType']); goog.addDependency('dom/range.js', ['goog.dom.Range'], ['goog.dom', 'goog.dom.AbstractRange', 'goog.dom.ControlRange', 'goog.dom.MultiRange', 'goog.dom.NodeType', 'goog.dom.TextRange', 'goog.userAgent']); +goog.addDependency('dom/range_test.js', ['goog.dom.RangeTest'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.RangeType', 'goog.dom.TagName', 'goog.dom.TextRange', 'goog.dom.browserrange', 'goog.testing.dom', 'goog.testing.jsunit', 'goog.userAgent']); goog.addDependency('dom/rangeendpoint.js', ['goog.dom.RangeEndpoint'], []); +goog.addDependency('dom/safe.js', ['goog.dom.safe'], ['goog.html.SafeHtml', 'goog.html.SafeUrl']); +goog.addDependency('dom/safe_test.js', ['goog.dom.safeTest'], ['goog.dom.safe', 'goog.html.SafeUrl', 'goog.html.testing', 'goog.string.Const', 'goog.testing.jsunit']); goog.addDependency('dom/savedcaretrange.js', ['goog.dom.SavedCaretRange'], ['goog.array', 'goog.dom', 'goog.dom.SavedRange', 'goog.dom.TagName', 'goog.string']); -goog.addDependency('dom/savedrange.js', ['goog.dom.SavedRange'], ['goog.Disposable', 'goog.debug.Logger']); +goog.addDependency('dom/savedcaretrange_test.js', ['goog.dom.SavedCaretRangeTest'], ['goog.dom', 'goog.dom.Range', 'goog.dom.SavedCaretRange', 'goog.testing.dom', 'goog.testing.jsunit', 'goog.userAgent']); +goog.addDependency('dom/savedrange.js', ['goog.dom.SavedRange'], ['goog.Disposable', 'goog.log']); +goog.addDependency('dom/savedrange_test.js', ['goog.dom.SavedRangeTest'], ['goog.dom', 'goog.dom.Range', 'goog.testing.jsunit', 'goog.userAgent']); goog.addDependency('dom/selection.js', ['goog.dom.selection'], ['goog.string', 'goog.userAgent']); -goog.addDependency('dom/tagiterator.js', ['goog.dom.TagIterator', 'goog.dom.TagWalkType'], ['goog.dom.NodeType', 'goog.iter.Iterator', 'goog.iter.StopIteration']); +goog.addDependency('dom/selection_test.js', ['goog.dom.selectionTest'], ['goog.dom', 'goog.dom.selection', 'goog.testing.jsunit', 'goog.userAgent']); +goog.addDependency('dom/tagiterator.js', ['goog.dom.TagIterator', 'goog.dom.TagWalkType'], ['goog.dom', 'goog.dom.NodeType', 'goog.iter.Iterator', 'goog.iter.StopIteration']); +goog.addDependency('dom/tagiterator_test.js', ['goog.dom.TagIteratorTest'], ['goog.dom', 'goog.dom.TagIterator', 'goog.dom.TagWalkType', 'goog.iter', 'goog.iter.StopIteration', 'goog.testing.dom', 'goog.testing.jsunit']); goog.addDependency('dom/tagname.js', ['goog.dom.TagName'], []); +goog.addDependency('dom/tagname_test.js', ['goog.dom.TagNameTest'], ['goog.dom.TagName', 'goog.object', 'goog.testing.jsunit']); +goog.addDependency('dom/tags.js', ['goog.dom.tags'], ['goog.object']); +goog.addDependency('dom/tags_test.js', ['goog.dom.tagsTest'], ['goog.dom.tags', 'goog.testing.jsunit']); goog.addDependency('dom/textrange.js', ['goog.dom.TextRange'], ['goog.array', 'goog.dom', 'goog.dom.AbstractRange', 'goog.dom.RangeType', 'goog.dom.SavedRange', 'goog.dom.TagName', 'goog.dom.TextRangeIterator', 'goog.dom.browserrange', 'goog.string', 'goog.userAgent']); +goog.addDependency('dom/textrange_test.js', ['goog.dom.TextRangeTest'], ['goog.dom', 'goog.dom.ControlRange', 'goog.dom.Range', 'goog.dom.TextRange', 'goog.math.Coordinate', 'goog.style', 'goog.testing.ExpectedFailures', 'goog.testing.jsunit', 'goog.userAgent']); goog.addDependency('dom/textrangeiterator.js', ['goog.dom.TextRangeIterator'], ['goog.array', 'goog.dom.NodeType', 'goog.dom.RangeIterator', 'goog.dom.TagName', 'goog.iter.StopIteration']); -goog.addDependency('dom/vendor.js', ['goog.dom.vendor'], ['goog.userAgent']); +goog.addDependency('dom/textrangeiterator_test.js', ['goog.dom.TextRangeIteratorTest'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.TextRangeIterator', 'goog.iter.StopIteration', 'goog.testing.dom', 'goog.testing.jsunit']); +goog.addDependency('dom/vendor.js', ['goog.dom.vendor'], ['goog.string', 'goog.userAgent']); +goog.addDependency('dom/vendor_test.js', ['goog.dom.vendorTest'], ['goog.array', 'goog.dom.vendor', 'goog.labs.userAgent.util', 'goog.testing.MockUserAgent', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgentTestUtil']); goog.addDependency('dom/viewportsizemonitor.js', ['goog.dom.ViewportSizeMonitor'], ['goog.dom', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.math.Size']); +goog.addDependency('dom/viewportsizemonitor_test.js', ['goog.dom.ViewportSizeMonitorTest'], ['goog.dom.ViewportSizeMonitor', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.math.Size', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit']); goog.addDependency('dom/xml.js', ['goog.dom.xml'], ['goog.dom', 'goog.dom.NodeType']); +goog.addDependency('dom/xml_test.js', ['goog.dom.xmlTest'], ['goog.dom.xml', 'goog.testing.jsunit', 'goog.userAgent']); goog.addDependency('editor/browserfeature.js', ['goog.editor.BrowserFeature'], ['goog.editor.defines', 'goog.userAgent', 'goog.userAgent.product', 'goog.userAgent.product.isVersion']); -goog.addDependency('editor/clicktoeditwrapper.js', ['goog.editor.ClickToEditWrapper'], ['goog.Disposable', 'goog.asserts', 'goog.debug.Logger', 'goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Command', 'goog.editor.Field.EventType', 'goog.editor.range', 'goog.events.BrowserEvent.MouseButton', 'goog.events.EventHandler', 'goog.events.EventType']); +goog.addDependency('editor/browserfeature_test.js', ['goog.editor.BrowserFeatureTest'], ['goog.dom', 'goog.dom.Range', 'goog.editor.BrowserFeature', 'goog.testing.ExpectedFailures', 'goog.testing.jsunit']); +goog.addDependency('editor/clicktoeditwrapper.js', ['goog.editor.ClickToEditWrapper'], ['goog.Disposable', 'goog.asserts', 'goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Command', 'goog.editor.Field.EventType', 'goog.editor.range', 'goog.events.BrowserEvent.MouseButton', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.log']); +goog.addDependency('editor/clicktoeditwrapper_test.js', ['goog.editor.ClickToEditWrapperTest'], ['goog.dom', 'goog.dom.Range', 'goog.editor.ClickToEditWrapper', 'goog.editor.SeamlessField', 'goog.testing.MockClock', 'goog.testing.events', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgent.product']); goog.addDependency('editor/command.js', ['goog.editor.Command'], []); -goog.addDependency('editor/contenteditablefield.js', ['goog.editor.ContentEditableField'], ['goog.asserts', 'goog.debug.Logger', 'goog.editor.Field']); +goog.addDependency('editor/contenteditablefield.js', ['goog.editor.ContentEditableField'], ['goog.asserts', 'goog.editor.Field', 'goog.log']); +goog.addDependency('editor/contenteditablefield_test.js', ['goog.editor.ContentEditableFieldTest'], ['goog.dom', 'goog.editor.ContentEditableField', 'goog.editor.field_test', 'goog.testing.jsunit']); goog.addDependency('editor/defines.js', ['goog.editor.defines'], []); -goog.addDependency('editor/field.js', ['goog.editor.Field', 'goog.editor.Field.EventType'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.array', 'goog.asserts', 'goog.async.Delay', 'goog.debug.Logger', 'goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Command', 'goog.editor.Plugin', 'goog.editor.icontent', 'goog.editor.icontent.FieldFormatInfo', 'goog.editor.icontent.FieldStyleInfo', 'goog.editor.node', 'goog.editor.range', 'goog.events', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.functions', 'goog.string', 'goog.string.Unicode', 'goog.style', 'goog.userAgent', 'goog.userAgent.product']); +goog.addDependency('editor/field.js', ['goog.editor.Field', 'goog.editor.Field.EventType'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.array', 'goog.asserts', 'goog.async.Delay', 'goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Command', 'goog.editor.Plugin', 'goog.editor.icontent', 'goog.editor.icontent.FieldFormatInfo', 'goog.editor.icontent.FieldStyleInfo', 'goog.editor.node', 'goog.editor.range', 'goog.events', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.functions', 'goog.log', 'goog.string', 'goog.string.Unicode', 'goog.style', 'goog.userAgent', 'goog.userAgent.product']); goog.addDependency('editor/field_test.js', ['goog.editor.field_test'], ['goog.dom', 'goog.dom.Range', 'goog.editor.BrowserFeature', 'goog.editor.Field', 'goog.editor.Plugin', 'goog.editor.range', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.KeyCodes', 'goog.functions', 'goog.testing.LooseMock', 'goog.testing.MockClock', 'goog.testing.dom', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.recordFunction', 'goog.userAgent']); goog.addDependency('editor/focus.js', ['goog.editor.focus'], ['goog.dom.selection']); +goog.addDependency('editor/focus_test.js', ['goog.editor.focusTest'], ['goog.dom.selection', 'goog.editor.BrowserFeature', 'goog.editor.focus', 'goog.testing.jsunit']); goog.addDependency('editor/icontent.js', ['goog.editor.icontent', 'goog.editor.icontent.FieldFormatInfo', 'goog.editor.icontent.FieldStyleInfo'], ['goog.editor.BrowserFeature', 'goog.style', 'goog.userAgent']); -goog.addDependency('editor/link.js', ['goog.editor.Link'], ['goog.array', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.editor.BrowserFeature', 'goog.editor.Command', 'goog.editor.node', 'goog.editor.range', 'goog.string', 'goog.string.Unicode', 'goog.uri.utils', 'goog.uri.utils.ComponentIndex']); +goog.addDependency('editor/icontent_test.js', ['goog.editor.icontentTest'], ['goog.dom', 'goog.editor.BrowserFeature', 'goog.editor.icontent', 'goog.editor.icontent.FieldFormatInfo', 'goog.editor.icontent.FieldStyleInfo', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.userAgent']); +goog.addDependency('editor/link.js', ['goog.editor.Link'], ['goog.array', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Command', 'goog.editor.node', 'goog.editor.range', 'goog.string', 'goog.string.Unicode', 'goog.uri.utils', 'goog.uri.utils.ComponentIndex']); +goog.addDependency('editor/link_test.js', ['goog.editor.LinkTest'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.Link', 'goog.testing.jsunit', 'goog.userAgent']); goog.addDependency('editor/node.js', ['goog.editor.node'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.iter.ChildIterator', 'goog.dom.iter.SiblingIterator', 'goog.iter', 'goog.object', 'goog.string', 'goog.string.Unicode', 'goog.userAgent']); -goog.addDependency('editor/plugin.js', ['goog.editor.Plugin'], ['goog.debug.Logger', 'goog.editor.Command', 'goog.events.EventTarget', 'goog.functions', 'goog.object', 'goog.reflect']); -goog.addDependency('editor/plugins/abstractbubbleplugin.js', ['goog.editor.plugins.AbstractBubblePlugin'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.Plugin', 'goog.editor.style', 'goog.events', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.actionEventWrapper', 'goog.functions', 'goog.string.Unicode', 'goog.ui.Component.EventType', 'goog.ui.editor.Bubble', 'goog.userAgent']); +goog.addDependency('editor/node_test.js', ['goog.editor.nodeTest'], ['goog.array', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.editor.node', 'goog.style', 'goog.testing.ExpectedFailures', 'goog.testing.dom', 'goog.testing.jsunit', 'goog.userAgent']); +goog.addDependency('editor/plugin.js', ['goog.editor.Plugin'], ['goog.editor.Command', 'goog.events.EventTarget', 'goog.functions', 'goog.log', 'goog.object', 'goog.reflect']); +goog.addDependency('editor/plugin_test.js', ['goog.editor.PluginTest'], ['goog.editor.Field', 'goog.editor.Plugin', 'goog.functions', 'goog.testing.StrictMock', 'goog.testing.jsunit', 'goog.userAgent']); +goog.addDependency('editor/plugins/abstractbubbleplugin.js', ['goog.editor.plugins.AbstractBubblePlugin'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.Plugin', 'goog.editor.style', 'goog.events', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.actionEventWrapper', 'goog.functions', 'goog.string.Unicode', 'goog.ui.Component', 'goog.ui.editor.Bubble', 'goog.userAgent']); +goog.addDependency('editor/plugins/abstractbubbleplugin_test.js', ['goog.editor.plugins.AbstractBubblePluginTest'], ['goog.dom', 'goog.editor.plugins.AbstractBubblePlugin', 'goog.events.BrowserEvent', 'goog.events.KeyCodes', 'goog.functions', 'goog.style', 'goog.testing.editor.FieldMock', 'goog.testing.editor.TestHelper', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.editor.Bubble']); goog.addDependency('editor/plugins/abstractdialogplugin.js', ['goog.editor.plugins.AbstractDialogPlugin', 'goog.editor.plugins.AbstractDialogPlugin.EventType'], ['goog.dom', 'goog.dom.Range', 'goog.editor.Field.EventType', 'goog.editor.Plugin', 'goog.editor.range', 'goog.events', 'goog.ui.editor.AbstractDialog.EventType']); +goog.addDependency('editor/plugins/abstractdialogplugin_test.js', ['goog.editor.plugins.AbstractDialogPluginTest'], ['goog.dom.SavedRange', 'goog.editor.Field', 'goog.editor.plugins.AbstractDialogPlugin', 'goog.events.Event', 'goog.events.EventHandler', 'goog.functions', 'goog.testing.MockClock', 'goog.testing.MockControl', 'goog.testing.PropertyReplacer', 'goog.testing.editor.FieldMock', 'goog.testing.editor.TestHelper', 'goog.testing.events', 'goog.testing.jsunit', 'goog.testing.mockmatchers.ArgumentMatcher', 'goog.ui.editor.AbstractDialog', 'goog.userAgent']); goog.addDependency('editor/plugins/abstracttabhandler.js', ['goog.editor.plugins.AbstractTabHandler'], ['goog.editor.Plugin', 'goog.events.KeyCodes']); -goog.addDependency('editor/plugins/basictextformatter.js', ['goog.editor.plugins.BasicTextFormatter', 'goog.editor.plugins.BasicTextFormatter.COMMAND'], ['goog.array', 'goog.debug.Logger', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Command', 'goog.editor.Link', 'goog.editor.Plugin', 'goog.editor.node', 'goog.editor.range', 'goog.editor.style', 'goog.iter', 'goog.iter.StopIteration', 'goog.object', 'goog.string', 'goog.string.Unicode', 'goog.style', 'goog.ui.editor.messages', 'goog.userAgent']); -goog.addDependency('editor/plugins/blockquote.js', ['goog.editor.plugins.Blockquote'], ['goog.debug.Logger', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classes', 'goog.editor.BrowserFeature', 'goog.editor.Command', 'goog.editor.Plugin', 'goog.editor.node', 'goog.functions']); +goog.addDependency('editor/plugins/abstracttabhandler_test.js', ['goog.editor.plugins.AbstractTabHandlerTest'], ['goog.editor.Field', 'goog.editor.plugins.AbstractTabHandler', 'goog.events.BrowserEvent', 'goog.events.KeyCodes', 'goog.testing.StrictMock', 'goog.testing.editor.FieldMock', 'goog.testing.jsunit', 'goog.userAgent']); +goog.addDependency('editor/plugins/basictextformatter.js', ['goog.editor.plugins.BasicTextFormatter', 'goog.editor.plugins.BasicTextFormatter.COMMAND'], ['goog.array', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Command', 'goog.editor.Link', 'goog.editor.Plugin', 'goog.editor.node', 'goog.editor.range', 'goog.editor.style', 'goog.iter', 'goog.iter.StopIteration', 'goog.log', 'goog.object', 'goog.string', 'goog.string.Unicode', 'goog.style', 'goog.ui.editor.messages', 'goog.userAgent']); +goog.addDependency('editor/plugins/basictextformatter_test.js', ['goog.editor.plugins.BasicTextFormatterTest'], ['goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Command', 'goog.editor.Field', 'goog.editor.Plugin', 'goog.editor.plugins.BasicTextFormatter', 'goog.object', 'goog.style', 'goog.testing.ExpectedFailures', 'goog.testing.LooseMock', 'goog.testing.PropertyReplacer', 'goog.testing.editor.FieldMock', 'goog.testing.editor.TestHelper', 'goog.testing.jsunit', 'goog.testing.mockmatchers', 'goog.userAgent']); +goog.addDependency('editor/plugins/blockquote.js', ['goog.editor.plugins.Blockquote'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.editor.BrowserFeature', 'goog.editor.Command', 'goog.editor.Plugin', 'goog.editor.node', 'goog.functions', 'goog.log']); +goog.addDependency('editor/plugins/blockquote_test.js', ['goog.editor.plugins.BlockquoteTest'], ['goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.plugins.Blockquote', 'goog.testing.editor.FieldMock', 'goog.testing.editor.TestHelper', 'goog.testing.jsunit', 'goog.userAgent']); goog.addDependency('editor/plugins/emoticons.js', ['goog.editor.plugins.Emoticons'], ['goog.dom.TagName', 'goog.editor.Plugin', 'goog.editor.range', 'goog.functions', 'goog.ui.emoji.Emoji', 'goog.userAgent']); +goog.addDependency('editor/plugins/emoticons_test.js', ['goog.editor.plugins.EmoticonsTest'], ['goog.Uri', 'goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.editor.Field', 'goog.editor.plugins.Emoticons', 'goog.testing.jsunit', 'goog.ui.emoji.Emoji', 'goog.userAgent']); goog.addDependency('editor/plugins/enterhandler.js', ['goog.editor.plugins.EnterHandler'], ['goog.dom', 'goog.dom.NodeOffset', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Plugin', 'goog.editor.node', 'goog.editor.plugins.Blockquote', 'goog.editor.range', 'goog.editor.style', 'goog.events.KeyCodes', 'goog.functions', 'goog.object', 'goog.string', 'goog.userAgent']); +goog.addDependency('editor/plugins/enterhandler_test.js', ['goog.editor.plugins.EnterHandlerTest'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Field', 'goog.editor.Plugin', 'goog.editor.plugins.Blockquote', 'goog.editor.plugins.EnterHandler', 'goog.editor.range', 'goog.events', 'goog.events.KeyCodes', 'goog.testing.ExpectedFailures', 'goog.testing.MockClock', 'goog.testing.dom', 'goog.testing.editor.TestHelper', 'goog.testing.events', 'goog.testing.jsunit', 'goog.userAgent']); goog.addDependency('editor/plugins/equationeditorbubble.js', ['goog.editor.plugins.equation.EquationBubble'], ['goog.dom', 'goog.dom.TagName', 'goog.editor.Command', 'goog.editor.plugins.AbstractBubblePlugin', 'goog.string.Unicode', 'goog.ui.editor.Bubble', 'goog.ui.equation.ImageRenderer']); -goog.addDependency('editor/plugins/equationeditorplugin.js', ['goog.editor.plugins.EquationEditorPlugin'], ['goog.debug.Logger', 'goog.dom', 'goog.editor.Command', 'goog.editor.plugins.AbstractDialogPlugin', 'goog.editor.range', 'goog.events', 'goog.events.EventType', 'goog.functions', 'goog.ui.editor.AbstractDialog', 'goog.ui.editor.EquationEditorDialog', 'goog.ui.equation.ImageRenderer', 'goog.ui.equation.PaletteManager']); +goog.addDependency('editor/plugins/equationeditorplugin.js', ['goog.editor.plugins.EquationEditorPlugin'], ['goog.dom', 'goog.editor.Command', 'goog.editor.plugins.AbstractDialogPlugin', 'goog.editor.range', 'goog.events', 'goog.events.EventType', 'goog.functions', 'goog.log', 'goog.ui.editor.AbstractDialog', 'goog.ui.editor.EquationEditorDialog', 'goog.ui.equation.ImageRenderer', 'goog.ui.equation.PaletteManager']); +goog.addDependency('editor/plugins/equationeditorplugin_test.js', ['goog.editor.plugins.EquationEditorPluginTest'], ['goog.dom', 'goog.dom.DomHelper', 'goog.dom.TagName', 'goog.editor.plugins.EquationEditorPlugin', 'goog.testing.MockControl', 'goog.testing.MockRange', 'goog.testing.PropertyReplacer', 'goog.testing.editor.FieldMock', 'goog.testing.jsunit', 'goog.testing.mockmatchers.ArgumentMatcher', 'goog.ui.editor.EquationEditorOkEvent']); goog.addDependency('editor/plugins/firststrong.js', ['goog.editor.plugins.FirstStrong'], ['goog.dom.NodeType', 'goog.dom.TagIterator', 'goog.dom.TagName', 'goog.editor.Command', 'goog.editor.Plugin', 'goog.editor.node', 'goog.editor.range', 'goog.i18n.bidi', 'goog.i18n.uChar', 'goog.iter', 'goog.userAgent']); +goog.addDependency('editor/plugins/firststrong_test.js', ['goog.editor.plugins.FirstStrongTest'], ['goog.dom.Range', 'goog.editor.Command', 'goog.editor.Field', 'goog.editor.plugins.FirstStrong', 'goog.editor.range', 'goog.events.KeyCodes', 'goog.testing.editor.TestHelper', 'goog.testing.events', 'goog.testing.jsunit', 'goog.userAgent']); goog.addDependency('editor/plugins/headerformatter.js', ['goog.editor.plugins.HeaderFormatter'], ['goog.editor.Command', 'goog.editor.Plugin', 'goog.userAgent']); -goog.addDependency('editor/plugins/linkbubble.js', ['goog.editor.plugins.LinkBubble', 'goog.editor.plugins.LinkBubble.Action'], ['goog.array', 'goog.dom', 'goog.editor.BrowserFeature', 'goog.editor.Command', 'goog.editor.Link', 'goog.editor.plugins.AbstractBubblePlugin', 'goog.editor.range', 'goog.string', 'goog.style', 'goog.ui.editor.messages', 'goog.uri.utils', 'goog.window']); +goog.addDependency('editor/plugins/headerformatter_test.js', ['goog.editor.plugins.HeaderFormatterTest'], ['goog.dom', 'goog.editor.Command', 'goog.editor.plugins.BasicTextFormatter', 'goog.editor.plugins.HeaderFormatter', 'goog.events.BrowserEvent', 'goog.testing.LooseMock', 'goog.testing.editor.FieldMock', 'goog.testing.editor.TestHelper', 'goog.testing.jsunit', 'goog.userAgent']); +goog.addDependency('editor/plugins/linkbubble.js', ['goog.editor.plugins.LinkBubble', 'goog.editor.plugins.LinkBubble.Action'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.editor.Command', 'goog.editor.Link', 'goog.editor.plugins.AbstractBubblePlugin', 'goog.editor.range', 'goog.functions', 'goog.string', 'goog.style', 'goog.ui.editor.messages', 'goog.uri.utils', 'goog.window']); +goog.addDependency('editor/plugins/linkbubble_test.js', ['goog.editor.plugins.LinkBubbleTest'], ['goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.Command', 'goog.editor.Link', 'goog.editor.plugins.LinkBubble', 'goog.events.BrowserEvent', 'goog.events.Event', 'goog.events.EventType', 'goog.string', 'goog.style', 'goog.testing.FunctionMock', 'goog.testing.PropertyReplacer', 'goog.testing.editor.FieldMock', 'goog.testing.editor.TestHelper', 'goog.testing.events', 'goog.testing.jsunit', 'goog.userAgent']); goog.addDependency('editor/plugins/linkdialogplugin.js', ['goog.editor.plugins.LinkDialogPlugin'], ['goog.array', 'goog.dom', 'goog.editor.Command', 'goog.editor.plugins.AbstractDialogPlugin', 'goog.events.EventHandler', 'goog.functions', 'goog.ui.editor.AbstractDialog.EventType', 'goog.ui.editor.LinkDialog', 'goog.ui.editor.LinkDialog.EventType', 'goog.ui.editor.LinkDialog.OkEvent', 'goog.uri.utils']); +goog.addDependency('editor/plugins/linkdialogplugin_test.js', ['goog.ui.editor.LinkDialogTest'], ['goog.dom', 'goog.dom.DomHelper', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Command', 'goog.editor.Field', 'goog.editor.Link', 'goog.editor.plugins.LinkDialogPlugin', 'goog.string', 'goog.string.Unicode', 'goog.testing.MockControl', 'goog.testing.editor.FieldMock', 'goog.testing.editor.TestHelper', 'goog.testing.editor.dom', 'goog.testing.events', 'goog.testing.jsunit', 'goog.testing.mockmatchers', 'goog.ui.editor.AbstractDialog', 'goog.ui.editor.LinkDialog', 'goog.userAgent']); goog.addDependency('editor/plugins/linkshortcutplugin.js', ['goog.editor.plugins.LinkShortcutPlugin'], ['goog.editor.Command', 'goog.editor.Link', 'goog.editor.Plugin', 'goog.string']); +goog.addDependency('editor/plugins/linkshortcutplugin_test.js', ['goog.editor.plugins.LinkShortcutPluginTest'], ['goog.dom', 'goog.editor.Field', 'goog.editor.plugins.BasicTextFormatter', 'goog.editor.plugins.LinkBubble', 'goog.editor.plugins.LinkShortcutPlugin', 'goog.events.KeyCodes', 'goog.testing.PropertyReplacer', 'goog.testing.dom', 'goog.testing.events', 'goog.testing.jsunit']); goog.addDependency('editor/plugins/listtabhandler.js', ['goog.editor.plugins.ListTabHandler'], ['goog.dom.TagName', 'goog.editor.Command', 'goog.editor.plugins.AbstractTabHandler']); +goog.addDependency('editor/plugins/listtabhandler_test.js', ['goog.editor.plugins.ListTabHandlerTest'], ['goog.dom', 'goog.editor.Command', 'goog.editor.plugins.ListTabHandler', 'goog.events.BrowserEvent', 'goog.events.KeyCodes', 'goog.functions', 'goog.testing.StrictMock', 'goog.testing.editor.FieldMock', 'goog.testing.editor.TestHelper', 'goog.testing.jsunit']); goog.addDependency('editor/plugins/loremipsum.js', ['goog.editor.plugins.LoremIpsum'], ['goog.asserts', 'goog.dom', 'goog.editor.Command', 'goog.editor.Plugin', 'goog.editor.node', 'goog.functions']); +goog.addDependency('editor/plugins/loremipsum_test.js', ['goog.editor.plugins.LoremIpsumTest'], ['goog.dom', 'goog.editor.Command', 'goog.editor.Field', 'goog.editor.plugins.LoremIpsum', 'goog.string.Unicode', 'goog.testing.jsunit', 'goog.userAgent']); goog.addDependency('editor/plugins/removeformatting.js', ['goog.editor.plugins.RemoveFormatting'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Plugin', 'goog.editor.node', 'goog.editor.range', 'goog.string', 'goog.userAgent']); +goog.addDependency('editor/plugins/removeformatting_test.js', ['goog.editor.plugins.RemoveFormattingTest'], ['goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.plugins.RemoveFormatting', 'goog.string', 'goog.testing.ExpectedFailures', 'goog.testing.dom', 'goog.testing.editor.FieldMock', 'goog.testing.editor.TestHelper', 'goog.testing.jsunit', 'goog.userAgent']); goog.addDependency('editor/plugins/spacestabhandler.js', ['goog.editor.plugins.SpacesTabHandler'], ['goog.dom', 'goog.dom.TagName', 'goog.editor.plugins.AbstractTabHandler', 'goog.editor.range']); +goog.addDependency('editor/plugins/spacestabhandler_test.js', ['goog.editor.plugins.SpacesTabHandlerTest'], ['goog.dom', 'goog.dom.Range', 'goog.editor.plugins.SpacesTabHandler', 'goog.events.BrowserEvent', 'goog.events.KeyCodes', 'goog.functions', 'goog.testing.StrictMock', 'goog.testing.editor.FieldMock', 'goog.testing.editor.TestHelper', 'goog.testing.jsunit']); goog.addDependency('editor/plugins/tableeditor.js', ['goog.editor.plugins.TableEditor'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.editor.Plugin', 'goog.editor.Table', 'goog.editor.node', 'goog.editor.range', 'goog.object']); +goog.addDependency('editor/plugins/tableeditor_test.js', ['goog.editor.plugins.TableEditorTest'], ['goog.dom', 'goog.dom.Range', 'goog.editor.plugins.TableEditor', 'goog.object', 'goog.string', 'goog.testing.ExpectedFailures', 'goog.testing.JsUnitException', 'goog.testing.editor.FieldMock', 'goog.testing.editor.TestHelper', 'goog.testing.jsunit', 'goog.userAgent']); goog.addDependency('editor/plugins/tagonenterhandler.js', ['goog.editor.plugins.TagOnEnterHandler'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.Command', 'goog.editor.node', 'goog.editor.plugins.EnterHandler', 'goog.editor.range', 'goog.editor.style', 'goog.events.KeyCodes', 'goog.string', 'goog.style', 'goog.userAgent']); -goog.addDependency('editor/plugins/undoredo.js', ['goog.editor.plugins.UndoRedo'], ['goog.debug.Logger', 'goog.dom', 'goog.dom.NodeOffset', 'goog.dom.Range', 'goog.editor.BrowserFeature', 'goog.editor.Command', 'goog.editor.Field.EventType', 'goog.editor.Plugin', 'goog.editor.node', 'goog.editor.plugins.UndoRedoManager', 'goog.editor.plugins.UndoRedoState', 'goog.events', 'goog.events.EventHandler']); +goog.addDependency('editor/plugins/tagonenterhandler_test.js', ['goog.editor.plugins.TagOnEnterHandlerTest'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Field', 'goog.editor.Plugin', 'goog.editor.plugins.TagOnEnterHandler', 'goog.events.KeyCodes', 'goog.string.Unicode', 'goog.testing.dom', 'goog.testing.editor.TestHelper', 'goog.testing.events', 'goog.testing.jsunit', 'goog.userAgent']); +goog.addDependency('editor/plugins/undoredo.js', ['goog.editor.plugins.UndoRedo'], ['goog.dom', 'goog.dom.NodeOffset', 'goog.dom.Range', 'goog.editor.BrowserFeature', 'goog.editor.Command', 'goog.editor.Field.EventType', 'goog.editor.Plugin', 'goog.editor.node', 'goog.editor.plugins.UndoRedoManager', 'goog.editor.plugins.UndoRedoState', 'goog.events', 'goog.events.EventHandler', 'goog.log']); +goog.addDependency('editor/plugins/undoredo_test.js', ['goog.editor.plugins.UndoRedoTest'], ['goog.array', 'goog.dom', 'goog.dom.browserrange', 'goog.editor.Field', 'goog.editor.plugins.LoremIpsum', 'goog.editor.plugins.UndoRedo', 'goog.events', 'goog.functions', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.StrictMock', 'goog.testing.jsunit']); goog.addDependency('editor/plugins/undoredomanager.js', ['goog.editor.plugins.UndoRedoManager', 'goog.editor.plugins.UndoRedoManager.EventType'], ['goog.editor.plugins.UndoRedoState', 'goog.events.EventTarget']); +goog.addDependency('editor/plugins/undoredomanager_test.js', ['goog.editor.plugins.UndoRedoManagerTest'], ['goog.editor.plugins.UndoRedoManager', 'goog.editor.plugins.UndoRedoState', 'goog.events', 'goog.testing.StrictMock', 'goog.testing.jsunit']); goog.addDependency('editor/plugins/undoredostate.js', ['goog.editor.plugins.UndoRedoState'], ['goog.events.EventTarget']); -goog.addDependency('editor/range.js', ['goog.editor.range', 'goog.editor.range.Point'], ['goog.array', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.RangeEndpoint', 'goog.dom.SavedCaretRange', 'goog.editor.BrowserFeature', 'goog.editor.node', 'goog.editor.style', 'goog.iter']); -goog.addDependency('editor/seamlessfield.js', ['goog.editor.SeamlessField'], ['goog.cssom.iframe.style', 'goog.debug.Logger', 'goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Field', 'goog.editor.icontent', 'goog.editor.icontent.FieldFormatInfo', 'goog.editor.icontent.FieldStyleInfo', 'goog.editor.node', 'goog.events', 'goog.events.EventType', 'goog.style']); +goog.addDependency('editor/plugins/undoredostate_test.js', ['goog.editor.plugins.UndoRedoStateTest'], ['goog.editor.plugins.UndoRedoState', 'goog.testing.jsunit']); +goog.addDependency('editor/range.js', ['goog.editor.range', 'goog.editor.range.Point'], ['goog.array', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.RangeEndpoint', 'goog.dom.SavedCaretRange', 'goog.editor.node', 'goog.editor.style', 'goog.iter', 'goog.userAgent']); +goog.addDependency('editor/range_test.js', ['goog.editor.rangeTest'], ['goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.range', 'goog.editor.range.Point', 'goog.string', 'goog.testing.dom', 'goog.testing.jsunit', 'goog.userAgent']); +goog.addDependency('editor/seamlessfield.js', ['goog.editor.SeamlessField'], ['goog.cssom.iframe.style', 'goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Field', 'goog.editor.icontent', 'goog.editor.icontent.FieldFormatInfo', 'goog.editor.icontent.FieldStyleInfo', 'goog.editor.node', 'goog.events', 'goog.events.EventType', 'goog.log', 'goog.style']); goog.addDependency('editor/seamlessfield_test.js', ['goog.editor.seamlessfield_test'], ['goog.dom', 'goog.dom.DomHelper', 'goog.dom.Range', 'goog.editor.BrowserFeature', 'goog.editor.Field', 'goog.editor.SeamlessField', 'goog.events', 'goog.functions', 'goog.style', 'goog.testing.MockClock', 'goog.testing.MockRange', 'goog.testing.jsunit']); goog.addDependency('editor/style.js', ['goog.editor.style'], ['goog.dom', 'goog.dom.NodeType', 'goog.editor.BrowserFeature', 'goog.events.EventType', 'goog.object', 'goog.style', 'goog.userAgent']); -goog.addDependency('editor/table.js', ['goog.editor.Table', 'goog.editor.TableCell', 'goog.editor.TableRow'], ['goog.debug.Logger', 'goog.dom', 'goog.dom.DomHelper', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.string.Unicode', 'goog.style']); -goog.addDependency('events/actioneventwrapper.js', ['goog.events.actionEventWrapper'], ['goog.events', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.EventWrapper', 'goog.events.KeyCodes']); +goog.addDependency('editor/style_test.js', ['goog.editor.styleTest'], ['goog.dom', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.style', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.style', 'goog.testing.LooseMock', 'goog.testing.jsunit', 'goog.testing.mockmatchers']); +goog.addDependency('editor/table.js', ['goog.editor.Table', 'goog.editor.TableCell', 'goog.editor.TableRow'], ['goog.dom', 'goog.dom.DomHelper', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.log', 'goog.string.Unicode', 'goog.style']); +goog.addDependency('editor/table_test.js', ['goog.editor.TableTest'], ['goog.dom', 'goog.editor.Table', 'goog.testing.jsunit', 'goog.userAgent']); +goog.addDependency('events/actioneventwrapper.js', ['goog.events.actionEventWrapper'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.events', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.EventWrapper', 'goog.events.KeyCodes', 'goog.userAgent']); +goog.addDependency('events/actioneventwrapper_test.js', ['goog.events.actionEventWrapperTest'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.events', 'goog.events.EventHandler', 'goog.events.KeyCodes', 'goog.events.actionEventWrapper', 'goog.testing.events', 'goog.testing.jsunit']); goog.addDependency('events/actionhandler.js', ['goog.events.ActionEvent', 'goog.events.ActionHandler', 'goog.events.ActionHandler.EventType', 'goog.events.BeforeActionEvent'], ['goog.events', 'goog.events.BrowserEvent', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.userAgent']); +goog.addDependency('events/actionhandler_test.js', ['goog.events.ActionHandlerTest'], ['goog.dom', 'goog.events', 'goog.events.ActionHandler', 'goog.testing.events', 'goog.testing.jsunit']); goog.addDependency('events/browserevent.js', ['goog.events.BrowserEvent', 'goog.events.BrowserEvent.MouseButton'], ['goog.events.BrowserFeature', 'goog.events.Event', 'goog.events.EventType', 'goog.reflect', 'goog.userAgent']); +goog.addDependency('events/browserevent_test.js', ['goog.events.BrowserEventTest'], ['goog.events.BrowserEvent', 'goog.events.BrowserFeature', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.userAgent']); goog.addDependency('events/browserfeature.js', ['goog.events.BrowserFeature'], ['goog.userAgent']); -goog.addDependency('events/event.js', ['goog.events.Event', 'goog.events.EventLike'], ['goog.Disposable']); +goog.addDependency('events/event.js', ['goog.events.Event', 'goog.events.EventLike'], ['goog.Disposable', 'goog.events.EventId']); +goog.addDependency('events/event_test.js', ['goog.events.EventTest'], ['goog.events.Event', 'goog.events.EventId', 'goog.events.EventTarget', 'goog.testing.jsunit']); goog.addDependency('events/eventhandler.js', ['goog.events.EventHandler'], ['goog.Disposable', 'goog.events', 'goog.object']); -goog.addDependency('events/events.js', ['goog.events', 'goog.events.Key', 'goog.events.ListenableType'], ['goog.array', 'goog.asserts', 'goog.debug.entryPointRegistry', 'goog.events.BrowserEvent', 'goog.events.BrowserFeature', 'goog.events.Listenable', 'goog.events.Listener', 'goog.object']); -goog.addDependency('events/eventtarget.js', ['goog.events.EventTarget'], ['goog.Disposable', 'goog.array', 'goog.asserts', 'goog.events', 'goog.events.Event', 'goog.events.Listenable', 'goog.events.Listener', 'goog.object']); +goog.addDependency('events/eventhandler_test.js', ['goog.events.EventHandlerTest'], ['goog.events', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.testing.jsunit', 'goog.testing.recordFunction']); +goog.addDependency('events/eventid.js', ['goog.events.EventId'], []); +goog.addDependency('events/events.js', ['goog.events', 'goog.events.CaptureSimulationMode', 'goog.events.Key', 'goog.events.ListenableType'], ['goog.asserts', 'goog.debug.entryPointRegistry', 'goog.events.BrowserEvent', 'goog.events.BrowserFeature', 'goog.events.Listenable', 'goog.events.ListenerMap']); +goog.addDependency('events/events_test.js', ['goog.eventsTest'], ['goog.asserts.AssertionError', 'goog.debug.EntryPointMonitor', 'goog.debug.ErrorHandler', 'goog.debug.entryPointRegistry', 'goog.dom', 'goog.events', 'goog.events.BrowserFeature', 'goog.events.CaptureSimulationMode', 'goog.events.Event', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.Listener', 'goog.functions', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.recordFunction']); +goog.addDependency('events/eventtarget.js', ['goog.events.EventTarget'], ['goog.Disposable', 'goog.array', 'goog.asserts', 'goog.events', 'goog.events.Event', 'goog.events.Listenable', 'goog.events.ListenerMap', 'goog.object']); +goog.addDependency('events/eventtarget_test.js', ['goog.events.EventTargetTest'], ['goog.events.EventTarget', 'goog.events.Listenable', 'goog.events.eventTargetTester', 'goog.events.eventTargetTester.KeyType', 'goog.events.eventTargetTester.UnlistenReturnType', 'goog.testing.jsunit']); +goog.addDependency('events/eventtarget_via_googevents_test.js', ['goog.events.EventTargetGoogEventsTest'], ['goog.events', 'goog.events.EventTarget', 'goog.events.eventTargetTester', 'goog.events.eventTargetTester.KeyType', 'goog.events.eventTargetTester.UnlistenReturnType', 'goog.object', 'goog.testing', 'goog.testing.jsunit']); +goog.addDependency('events/eventtarget_via_w3cinterface_test.js', ['goog.events.EventTargetW3CTest'], ['goog.events.EventTarget', 'goog.events.eventTargetTester', 'goog.events.eventTargetTester.KeyType', 'goog.events.eventTargetTester.UnlistenReturnType', 'goog.testing.jsunit']); goog.addDependency('events/eventtargettester.js', ['goog.events.eventTargetTester', 'goog.events.eventTargetTester.KeyType', 'goog.events.eventTargetTester.UnlistenReturnType'], ['goog.array', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.testing.asserts', 'goog.testing.recordFunction']); goog.addDependency('events/eventtype.js', ['goog.events.EventType'], ['goog.userAgent']); goog.addDependency('events/eventwrapper.js', ['goog.events.EventWrapper'], []); -goog.addDependency('events/filedrophandler.js', ['goog.events.FileDropHandler', 'goog.events.FileDropHandler.EventType'], ['goog.array', 'goog.debug.Logger', 'goog.dom', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType']); +goog.addDependency('events/filedrophandler.js', ['goog.events.FileDropHandler', 'goog.events.FileDropHandler.EventType'], ['goog.array', 'goog.dom', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.log']); +goog.addDependency('events/filedrophandler_test.js', ['goog.events.FileDropHandlerTest'], ['goog.events', 'goog.events.BrowserEvent', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.FileDropHandler', 'goog.testing.jsunit']); goog.addDependency('events/focushandler.js', ['goog.events.FocusHandler', 'goog.events.FocusHandler.EventType'], ['goog.events', 'goog.events.BrowserEvent', 'goog.events.EventTarget', 'goog.userAgent']); goog.addDependency('events/imehandler.js', ['goog.events.ImeHandler', 'goog.events.ImeHandler.Event', 'goog.events.ImeHandler.EventType'], ['goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.userAgent']); +goog.addDependency('events/imehandler_test.js', ['goog.events.ImeHandlerTest'], ['goog.array', 'goog.dom', 'goog.events', 'goog.events.ImeHandler', 'goog.events.KeyCodes', 'goog.object', 'goog.string', 'goog.testing.PropertyReplacer', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.jsunit', 'goog.userAgent']); goog.addDependency('events/inputhandler.js', ['goog.events.InputHandler', 'goog.events.InputHandler.EventType'], ['goog.Timer', 'goog.dom', 'goog.events.BrowserEvent', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.KeyCodes', 'goog.userAgent']); +goog.addDependency('events/inputhandler_test.js', ['goog.events.InputHandlerTest'], ['goog.dom', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.InputHandler', 'goog.events.KeyCodes', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.userAgent']); goog.addDependency('events/keycodes.js', ['goog.events.KeyCodes'], ['goog.userAgent']); +goog.addDependency('events/keycodes_test.js', ['goog.events.KeyCodesTest'], ['goog.events.BrowserEvent', 'goog.events.KeyCodes', 'goog.object', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.userAgent']); goog.addDependency('events/keyhandler.js', ['goog.events.KeyEvent', 'goog.events.KeyHandler', 'goog.events.KeyHandler.EventType'], ['goog.events', 'goog.events.BrowserEvent', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.userAgent']); +goog.addDependency('events/keyhandler_test.js', ['goog.events.KeyEventTest'], ['goog.dom', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.testing.events', 'goog.testing.jsunit', 'goog.userAgent']); goog.addDependency('events/keynames.js', ['goog.events.KeyNames'], []); -goog.addDependency('events/listenable.js', ['goog.events.Listenable', 'goog.events.ListenableKey'], []); +goog.addDependency('events/listenable.js', ['goog.events.Listenable', 'goog.events.ListenableKey'], ['goog.events.EventId']); +goog.addDependency('events/listenable_test.js', ['goog.events.ListenableTest'], ['goog.events.Listenable', 'goog.testing.jsunit']); goog.addDependency('events/listener.js', ['goog.events.Listener'], ['goog.events.ListenableKey']); +goog.addDependency('events/listenermap.js', ['goog.events.ListenerMap'], ['goog.array', 'goog.events.Listener', 'goog.object']); +goog.addDependency('events/listenermap_test.js', ['goog.events.ListenerMapTest'], ['goog.dispose', 'goog.events', 'goog.events.EventId', 'goog.events.EventTarget', 'goog.events.ListenerMap', 'goog.testing.jsunit']); goog.addDependency('events/mousewheelhandler.js', ['goog.events.MouseWheelEvent', 'goog.events.MouseWheelHandler', 'goog.events.MouseWheelHandler.EventType'], ['goog.dom', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.EventTarget', 'goog.math', 'goog.style', 'goog.userAgent']); +goog.addDependency('events/mousewheelhandler_test.js', ['goog.events.MouseWheelHandlerTest'], ['goog.dom', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.MouseWheelEvent', 'goog.events.MouseWheelHandler', 'goog.functions', 'goog.string', 'goog.testing.PropertyReplacer', 'goog.testing.events', 'goog.testing.jsunit', 'goog.userAgent']); goog.addDependency('events/onlinehandler.js', ['goog.events.OnlineHandler', 'goog.events.OnlineHandler.EventType'], ['goog.Timer', 'goog.events.BrowserFeature', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.net.NetworkStatusMonitor', 'goog.userAgent']); -goog.addDependency('events/pastehandler.js', ['goog.events.PasteHandler', 'goog.events.PasteHandler.EventType', 'goog.events.PasteHandler.State'], ['goog.Timer', 'goog.async.ConditionalDelay', 'goog.debug.Logger', 'goog.events.BrowserEvent', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.userAgent']); +goog.addDependency('events/onlinelistener_test.js', ['goog.events.OnlineHandlerTest'], ['goog.events', 'goog.events.BrowserFeature', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.OnlineHandler', 'goog.net.NetworkStatusMonitor', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.recordFunction']); +goog.addDependency('events/pastehandler.js', ['goog.events.PasteHandler', 'goog.events.PasteHandler.EventType', 'goog.events.PasteHandler.State'], ['goog.Timer', 'goog.async.ConditionalDelay', 'goog.events.BrowserEvent', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.log', 'goog.userAgent']); +goog.addDependency('events/pastehandler_test.js', ['goog.events.PasteHandlerTest'], ['goog.dom', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.PasteHandler', 'goog.testing.MockClock', 'goog.testing.MockUserAgent', 'goog.testing.jsunit', 'goog.userAgent']); goog.addDependency('format/emailaddress.js', ['goog.format.EmailAddress'], ['goog.string']); +goog.addDependency('format/emailaddress_test.js', ['goog.format.EmailAddressTest'], ['goog.array', 'goog.format.EmailAddress', 'goog.testing.jsunit']); goog.addDependency('format/format.js', ['goog.format'], ['goog.i18n.GraphemeBreak', 'goog.string', 'goog.userAgent']); +goog.addDependency('format/format_test.js', ['goog.formatTest'], ['goog.dom', 'goog.format', 'goog.string', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit']); goog.addDependency('format/htmlprettyprinter.js', ['goog.format.HtmlPrettyPrinter', 'goog.format.HtmlPrettyPrinter.Buffer'], ['goog.object', 'goog.string.StringBuffer']); +goog.addDependency('format/htmlprettyprinter_test.js', ['goog.format.HtmlPrettyPrinterTest'], ['goog.format.HtmlPrettyPrinter', 'goog.testing.MockClock', 'goog.testing.jsunit']); goog.addDependency('format/jsonprettyprinter.js', ['goog.format.JsonPrettyPrinter', 'goog.format.JsonPrettyPrinter.HtmlDelimiters', 'goog.format.JsonPrettyPrinter.TextDelimiters'], ['goog.json', 'goog.json.Serializer', 'goog.string', 'goog.string.StringBuffer', 'goog.string.format']); +goog.addDependency('format/jsonprettyprinter_test.js', ['goog.format.JsonPrettyPrinterTest'], ['goog.format.JsonPrettyPrinter', 'goog.testing.jsunit']); goog.addDependency('fs/entry.js', ['goog.fs.DirectoryEntry', 'goog.fs.DirectoryEntry.Behavior', 'goog.fs.Entry', 'goog.fs.FileEntry'], []); goog.addDependency('fs/entryimpl.js', ['goog.fs.DirectoryEntryImpl', 'goog.fs.EntryImpl', 'goog.fs.FileEntryImpl'], ['goog.array', 'goog.async.Deferred', 'goog.fs.DirectoryEntry', 'goog.fs.Entry', 'goog.fs.Error', 'goog.fs.FileEntry', 'goog.fs.FileWriter', 'goog.functions', 'goog.string']); -goog.addDependency('fs/error.js', ['goog.fs.Error', 'goog.fs.Error.ErrorCode'], ['goog.debug.Error', 'goog.string']); -goog.addDependency('fs/filereader.js', ['goog.fs.FileReader', 'goog.fs.FileReader.EventType', 'goog.fs.FileReader.ReadyState'], ['goog.async.Deferred', 'goog.events.Event', 'goog.events.EventTarget', 'goog.fs.Error', 'goog.fs.ProgressEvent']); -goog.addDependency('fs/filesaver.js', ['goog.fs.FileSaver', 'goog.fs.FileSaver.EventType', 'goog.fs.FileSaver.ProgressEvent', 'goog.fs.FileSaver.ReadyState'], ['goog.events.Event', 'goog.events.EventTarget', 'goog.fs.Error', 'goog.fs.ProgressEvent']); +goog.addDependency('fs/error.js', ['goog.fs.Error', 'goog.fs.Error.ErrorCode'], ['goog.debug.Error', 'goog.object', 'goog.string']); +goog.addDependency('fs/filereader.js', ['goog.fs.FileReader', 'goog.fs.FileReader.EventType', 'goog.fs.FileReader.ReadyState'], ['goog.async.Deferred', 'goog.events.EventTarget', 'goog.fs.Error', 'goog.fs.ProgressEvent']); +goog.addDependency('fs/filesaver.js', ['goog.fs.FileSaver', 'goog.fs.FileSaver.EventType', 'goog.fs.FileSaver.ProgressEvent', 'goog.fs.FileSaver.ReadyState'], ['goog.events.EventTarget', 'goog.fs.Error', 'goog.fs.ProgressEvent']); goog.addDependency('fs/filesystem.js', ['goog.fs.FileSystem'], []); goog.addDependency('fs/filesystemimpl.js', ['goog.fs.FileSystemImpl'], ['goog.fs.DirectoryEntryImpl', 'goog.fs.FileSystem']); goog.addDependency('fs/filewriter.js', ['goog.fs.FileWriter'], ['goog.fs.Error', 'goog.fs.FileSaver']); goog.addDependency('fs/fs.js', ['goog.fs'], ['goog.array', 'goog.async.Deferred', 'goog.fs.Error', 'goog.fs.FileReader', 'goog.fs.FileSystemImpl', 'goog.userAgent']); +goog.addDependency('fs/fs_test.js', ['goog.fsTest'], ['goog.array', 'goog.async.Deferred', 'goog.async.DeferredList', 'goog.dom', 'goog.events', 'goog.fs', 'goog.fs.DirectoryEntry', 'goog.fs.Error', 'goog.fs.FileReader', 'goog.fs.FileSaver', 'goog.string', 'goog.testing.AsyncTestCase', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit']); goog.addDependency('fs/progressevent.js', ['goog.fs.ProgressEvent'], ['goog.events.Event']); goog.addDependency('functions/functions.js', ['goog.functions'], []); -goog.addDependency('fx/abstractdragdrop.js', ['goog.fx.AbstractDragDrop', 'goog.fx.AbstractDragDrop.EventType', 'goog.fx.DragDropEvent', 'goog.fx.DragDropItem'], ['goog.dom', 'goog.dom.classes', 'goog.events', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.fx.Dragger', 'goog.fx.Dragger.EventType', 'goog.math.Box', 'goog.math.Coordinate', 'goog.style']); +goog.addDependency('functions/functions_test.js', ['goog.functionsTest'], ['goog.functions', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.recordFunction']); +goog.addDependency('fx/abstractdragdrop.js', ['goog.fx.AbstractDragDrop', 'goog.fx.AbstractDragDrop.EventType', 'goog.fx.DragDropEvent', 'goog.fx.DragDropItem'], ['goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.events', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.fx.Dragger', 'goog.math.Box', 'goog.math.Coordinate', 'goog.style']); +goog.addDependency('fx/abstractdragdrop_test.js', ['goog.fx.AbstractDragDropTest'], ['goog.array', 'goog.events.EventType', 'goog.functions', 'goog.fx.AbstractDragDrop', 'goog.fx.DragDropItem', 'goog.math.Box', 'goog.math.Coordinate', 'goog.style', 'goog.testing.events', 'goog.testing.jsunit']); goog.addDependency('fx/anim/anim.js', ['goog.fx.anim', 'goog.fx.anim.Animated'], ['goog.async.AnimationDelay', 'goog.async.Delay', 'goog.object']); +goog.addDependency('fx/anim/anim_test.js', ['goog.fx.animTest'], ['goog.async.AnimationDelay', 'goog.async.Delay', 'goog.events', 'goog.functions', 'goog.fx.Animation', 'goog.fx.anim', 'goog.object', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.userAgent']); goog.addDependency('fx/animation.js', ['goog.fx.Animation', 'goog.fx.Animation.EventType', 'goog.fx.Animation.State', 'goog.fx.AnimationEvent'], ['goog.array', 'goog.events.Event', 'goog.fx.Transition', 'goog.fx.Transition.EventType', 'goog.fx.TransitionBase.State', 'goog.fx.anim', 'goog.fx.anim.Animated']); +goog.addDependency('fx/animation_test.js', ['goog.fx.AnimationTest'], ['goog.events', 'goog.fx.Animation', 'goog.testing.MockClock', 'goog.testing.jsunit']); goog.addDependency('fx/animationqueue.js', ['goog.fx.AnimationParallelQueue', 'goog.fx.AnimationQueue', 'goog.fx.AnimationSerialQueue'], ['goog.array', 'goog.asserts', 'goog.events.EventHandler', 'goog.fx.Transition.EventType', 'goog.fx.TransitionBase', 'goog.fx.TransitionBase.State']); +goog.addDependency('fx/animationqueue_test.js', ['goog.fx.AnimationQueueTest'], ['goog.events', 'goog.fx.Animation', 'goog.fx.AnimationParallelQueue', 'goog.fx.AnimationSerialQueue', 'goog.fx.Transition', 'goog.fx.anim', 'goog.testing.MockClock', 'goog.testing.jsunit']); goog.addDependency('fx/css3/fx.js', ['goog.fx.css3'], ['goog.fx.css3.Transition']); goog.addDependency('fx/css3/transition.js', ['goog.fx.css3.Transition'], ['goog.Timer', 'goog.fx.TransitionBase', 'goog.style', 'goog.style.transition']); +goog.addDependency('fx/css3/transition_test.js', ['goog.fx.css3.TransitionTest'], ['goog.dispose', 'goog.dom', 'goog.events', 'goog.fx.Transition', 'goog.fx.css3.Transition', 'goog.style.transition', 'goog.testing.MockClock', 'goog.testing.jsunit', 'goog.testing.recordFunction']); goog.addDependency('fx/cssspriteanimation.js', ['goog.fx.CssSpriteAnimation'], ['goog.fx.Animation']); -goog.addDependency('fx/dom.js', ['goog.fx.dom', 'goog.fx.dom.BgColorTransform', 'goog.fx.dom.ColorTransform', 'goog.fx.dom.Fade', 'goog.fx.dom.FadeIn', 'goog.fx.dom.FadeInAndShow', 'goog.fx.dom.FadeOut', 'goog.fx.dom.FadeOutAndHide', 'goog.fx.dom.PredefinedEffect', 'goog.fx.dom.Resize', 'goog.fx.dom.ResizeHeight', 'goog.fx.dom.ResizeWidth', 'goog.fx.dom.Scroll', 'goog.fx.dom.Slide', 'goog.fx.dom.SlideFrom', 'goog.fx.dom.Swipe'], ['goog.color', 'goog.events', 'goog.fx.Animation', 'goog.fx.Transition.EventType', 'goog.style', 'goog.style.bidi']); +goog.addDependency('fx/cssspriteanimation_test.js', ['goog.fx.CssSpriteAnimationTest'], ['goog.fx.CssSpriteAnimation', 'goog.math.Box', 'goog.math.Size', 'goog.testing.MockClock', 'goog.testing.jsunit']); +goog.addDependency('fx/dom.js', ['goog.fx.dom', 'goog.fx.dom.BgColorTransform', 'goog.fx.dom.ColorTransform', 'goog.fx.dom.Fade', 'goog.fx.dom.FadeIn', 'goog.fx.dom.FadeInAndShow', 'goog.fx.dom.FadeOut', 'goog.fx.dom.FadeOutAndHide', 'goog.fx.dom.PredefinedEffect', 'goog.fx.dom.Resize', 'goog.fx.dom.ResizeHeight', 'goog.fx.dom.ResizeWidth', 'goog.fx.dom.Scroll', 'goog.fx.dom.Slide', 'goog.fx.dom.SlideFrom', 'goog.fx.dom.Swipe'], ['goog.color', 'goog.events', 'goog.fx.Animation', 'goog.fx.Transition', 'goog.style', 'goog.style.bidi']); goog.addDependency('fx/dragdrop.js', ['goog.fx.DragDrop'], ['goog.fx.AbstractDragDrop', 'goog.fx.DragDropItem']); goog.addDependency('fx/dragdropgroup.js', ['goog.fx.DragDropGroup'], ['goog.dom', 'goog.fx.AbstractDragDrop', 'goog.fx.DragDropItem']); +goog.addDependency('fx/dragdropgroup_test.js', ['goog.fx.DragDropGroupTest'], ['goog.events', 'goog.fx.DragDropGroup', 'goog.testing.jsunit']); goog.addDependency('fx/dragger.js', ['goog.fx.DragEvent', 'goog.fx.Dragger', 'goog.fx.Dragger.EventType'], ['goog.dom', 'goog.events', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.math.Coordinate', 'goog.math.Rect', 'goog.style', 'goog.style.bidi', 'goog.userAgent']); -goog.addDependency('fx/draglistgroup.js', ['goog.fx.DragListDirection', 'goog.fx.DragListGroup', 'goog.fx.DragListGroup.EventType', 'goog.fx.DragListGroupEvent'], ['goog.asserts', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.classes', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.fx.Dragger', 'goog.fx.Dragger.EventType', 'goog.math.Coordinate', 'goog.style']); +goog.addDependency('fx/dragger_test.js', ['goog.fx.DraggerTest'], ['goog.dom', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.Event', 'goog.events.EventType', 'goog.fx.Dragger', 'goog.math.Rect', 'goog.style.bidi', 'goog.testing.StrictMock', 'goog.testing.events', 'goog.testing.jsunit', 'goog.userAgent']); +goog.addDependency('fx/draglistgroup.js', ['goog.fx.DragListDirection', 'goog.fx.DragListGroup', 'goog.fx.DragListGroup.EventType', 'goog.fx.DragListGroupEvent'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.events', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.fx.Dragger', 'goog.math.Coordinate', 'goog.string', 'goog.style']); +goog.addDependency('fx/draglistgroup_test.js', ['goog.fx.DragListGroupTest'], ['goog.array', 'goog.dom', 'goog.dom.classlist', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.BrowserFeature', 'goog.events.Event', 'goog.events.EventType', 'goog.fx.DragEvent', 'goog.fx.DragListDirection', 'goog.fx.DragListGroup', 'goog.fx.Dragger', 'goog.math.Coordinate', 'goog.object', 'goog.testing.events', 'goog.testing.jsunit']); goog.addDependency('fx/dragscrollsupport.js', ['goog.fx.DragScrollSupport'], ['goog.Disposable', 'goog.Timer', 'goog.dom', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.math.Coordinate', 'goog.style']); +goog.addDependency('fx/dragscrollsupport_test.js', ['goog.fx.DragScrollSupportTest'], ['goog.fx.DragScrollSupport', 'goog.math.Coordinate', 'goog.testing.MockClock', 'goog.testing.events', 'goog.testing.jsunit']); goog.addDependency('fx/easing.js', ['goog.fx.easing'], []); +goog.addDependency('fx/easing_test.js', ['goog.fx.easingTest'], ['goog.fx.easing', 'goog.testing.jsunit']); goog.addDependency('fx/fx.js', ['goog.fx'], ['goog.asserts', 'goog.fx.Animation', 'goog.fx.Animation.EventType', 'goog.fx.Animation.State', 'goog.fx.AnimationEvent', 'goog.fx.Transition.EventType', 'goog.fx.easing']); +goog.addDependency('fx/fx_test.js', ['goog.fxTest'], ['goog.fx.Animation', 'goog.object', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit']); goog.addDependency('fx/transition.js', ['goog.fx.Transition', 'goog.fx.Transition.EventType'], []); goog.addDependency('fx/transitionbase.js', ['goog.fx.TransitionBase', 'goog.fx.TransitionBase.State'], ['goog.events.EventTarget', 'goog.fx.Transition', 'goog.fx.Transition.EventType']); -goog.addDependency('gears/basestore.js', ['goog.gears.BaseStore', 'goog.gears.BaseStore.SchemaType'], ['goog.Disposable']); -goog.addDependency('gears/database.js', ['goog.gears.Database', 'goog.gears.Database.EventType', 'goog.gears.Database.TransactionEvent'], ['goog.array', 'goog.debug', 'goog.debug.Logger', 'goog.events.Event', 'goog.events.EventTarget', 'goog.gears', 'goog.json']); -goog.addDependency('gears/gears.js', ['goog.gears'], ['goog.string']); -goog.addDependency('gears/httprequest.js', ['goog.gears.HttpRequest'], ['goog.Timer', 'goog.gears', 'goog.net.WrapperXmlHttpFactory', 'goog.net.XmlHttp']); -goog.addDependency('gears/loggerclient.js', ['goog.gears.LoggerClient'], ['goog.Disposable', 'goog.debug', 'goog.debug.Logger']); -goog.addDependency('gears/loggerserver.js', ['goog.gears.LoggerServer'], ['goog.Disposable', 'goog.debug.Logger', 'goog.debug.Logger.Level', 'goog.gears.Worker.EventType']); -goog.addDependency('gears/logstore.js', ['goog.gears.LogStore', 'goog.gears.LogStore.Query'], ['goog.async.Delay', 'goog.debug.LogManager', 'goog.debug.LogRecord', 'goog.debug.Logger', 'goog.debug.Logger.Level', 'goog.gears.BaseStore', 'goog.gears.BaseStore.SchemaType', 'goog.json']); -goog.addDependency('gears/managedresourcestore.js', ['goog.gears.ManagedResourceStore', 'goog.gears.ManagedResourceStore.EventType', 'goog.gears.ManagedResourceStore.UpdateStatus', 'goog.gears.ManagedResourceStoreEvent'], ['goog.debug.Logger', 'goog.events.Event', 'goog.events.EventTarget', 'goog.gears', 'goog.string']); -goog.addDependency('gears/multipartformdata.js', ['goog.gears.MultipartFormData'], ['goog.asserts', 'goog.gears', 'goog.string']); -goog.addDependency('gears/statustype.js', ['goog.gears.StatusType'], []); -goog.addDependency('gears/urlcapture.js', ['goog.gears.UrlCapture', 'goog.gears.UrlCapture.Event', 'goog.gears.UrlCapture.EventType'], ['goog.Uri', 'goog.debug.Logger', 'goog.events.Event', 'goog.events.EventTarget', 'goog.gears']); -goog.addDependency('gears/worker.js', ['goog.gears.Worker', 'goog.gears.Worker.EventType', 'goog.gears.WorkerEvent'], ['goog.events.Event', 'goog.events.EventTarget']); -goog.addDependency('gears/workerchannel.js', ['goog.gears.WorkerChannel'], ['goog.Disposable', 'goog.debug', 'goog.debug.Logger', 'goog.events', 'goog.gears.Worker', 'goog.gears.Worker.EventType', 'goog.gears.WorkerEvent', 'goog.json', 'goog.messaging.AbstractChannel']); -goog.addDependency('gears/workerpool.js', ['goog.gears.WorkerPool', 'goog.gears.WorkerPool.Event', 'goog.gears.WorkerPool.EventType'], ['goog.events.Event', 'goog.events.EventTarget', 'goog.gears', 'goog.gears.Worker']); goog.addDependency('graphics/abstractgraphics.js', ['goog.graphics.AbstractGraphics'], ['goog.dom', 'goog.graphics.Path', 'goog.math.Coordinate', 'goog.math.Size', 'goog.style', 'goog.ui.Component']); goog.addDependency('graphics/affinetransform.js', ['goog.graphics.AffineTransform'], ['goog.math']); goog.addDependency('graphics/canvaselement.js', ['goog.graphics.CanvasEllipseElement', 'goog.graphics.CanvasGroupElement', 'goog.graphics.CanvasImageElement', 'goog.graphics.CanvasPathElement', 'goog.graphics.CanvasRectElement', 'goog.graphics.CanvasTextElement'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.graphics.EllipseElement', 'goog.graphics.GroupElement', 'goog.graphics.ImageElement', 'goog.graphics.Path', 'goog.graphics.PathElement', 'goog.graphics.RectElement', 'goog.graphics.TextElement', 'goog.math', 'goog.string']); @@ -278,11 +434,11 @@ goog.addDependency('graphics/canvasgraphics.js', ['goog.graphics.CanvasGraphics' goog.addDependency('graphics/element.js', ['goog.graphics.Element'], ['goog.events', 'goog.events.EventTarget', 'goog.events.Listenable', 'goog.graphics.AffineTransform', 'goog.math']); goog.addDependency('graphics/ellipseelement.js', ['goog.graphics.EllipseElement'], ['goog.graphics.StrokeAndFillElement']); goog.addDependency('graphics/ext/coordinates.js', ['goog.graphics.ext.coordinates'], ['goog.string']); -goog.addDependency('graphics/ext/element.js', ['goog.graphics.ext.Element'], ['goog.events', 'goog.events.EventTarget', 'goog.functions', 'goog.graphics', 'goog.graphics.ext.coordinates']); +goog.addDependency('graphics/ext/element.js', ['goog.graphics.ext.Element'], ['goog.events.EventTarget', 'goog.functions', 'goog.graphics.ext.coordinates']); goog.addDependency('graphics/ext/ellipse.js', ['goog.graphics.ext.Ellipse'], ['goog.graphics.ext.StrokeAndFillElement']); goog.addDependency('graphics/ext/ext.js', ['goog.graphics.ext'], ['goog.graphics.ext.Ellipse', 'goog.graphics.ext.Graphics', 'goog.graphics.ext.Group', 'goog.graphics.ext.Image', 'goog.graphics.ext.Rectangle', 'goog.graphics.ext.Shape', 'goog.graphics.ext.coordinates']); goog.addDependency('graphics/ext/graphics.js', ['goog.graphics.ext.Graphics'], ['goog.events.EventType', 'goog.graphics.ext.Group']); -goog.addDependency('graphics/ext/group.js', ['goog.graphics.ext.Group'], ['goog.graphics.ext.Element']); +goog.addDependency('graphics/ext/group.js', ['goog.graphics.ext.Group'], ['goog.array', 'goog.graphics.ext.Element']); goog.addDependency('graphics/ext/image.js', ['goog.graphics.ext.Image'], ['goog.graphics.ext.Element']); goog.addDependency('graphics/ext/path.js', ['goog.graphics.ext.Path'], ['goog.graphics.AffineTransform', 'goog.graphics.Path', 'goog.math', 'goog.math.Rect']); goog.addDependency('graphics/ext/rectangle.js', ['goog.graphics.ext.Rectangle'], ['goog.graphics.ext.StrokeAndFillElement']); @@ -290,7 +446,7 @@ goog.addDependency('graphics/ext/shape.js', ['goog.graphics.ext.Shape'], ['goog. goog.addDependency('graphics/ext/strokeandfillelement.js', ['goog.graphics.ext.StrokeAndFillElement'], ['goog.graphics.ext.Element']); goog.addDependency('graphics/fill.js', ['goog.graphics.Fill'], []); goog.addDependency('graphics/font.js', ['goog.graphics.Font'], []); -goog.addDependency('graphics/graphics.js', ['goog.graphics'], ['goog.graphics.CanvasGraphics', 'goog.graphics.SvgGraphics', 'goog.graphics.VmlGraphics', 'goog.userAgent']); +goog.addDependency('graphics/graphics.js', ['goog.graphics'], ['goog.dom', 'goog.graphics.CanvasGraphics', 'goog.graphics.SvgGraphics', 'goog.graphics.VmlGraphics', 'goog.userAgent']); goog.addDependency('graphics/groupelement.js', ['goog.graphics.GroupElement'], ['goog.graphics.Element']); goog.addDependency('graphics/imageelement.js', ['goog.graphics.ImageElement'], ['goog.graphics.Element']); goog.addDependency('graphics/lineargradient.js', ['goog.graphics.LinearGradient'], ['goog.asserts', 'goog.graphics.Fill']); @@ -311,130 +467,251 @@ goog.addDependency('history/eventtype.js', ['goog.history.EventType'], []); goog.addDependency('history/history.js', ['goog.History', 'goog.History.Event', 'goog.History.EventType'], ['goog.Timer', 'goog.dom', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.history.Event', 'goog.history.EventType', 'goog.memoize', 'goog.string', 'goog.userAgent']); goog.addDependency('history/history_test.js', ['goog.HistoryTest'], ['goog.History', 'goog.testing.jsunit', 'goog.userAgent']); goog.addDependency('history/html5history.js', ['goog.history.Html5History', 'goog.history.Html5History.TokenTransformer'], ['goog.asserts', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.history.Event', 'goog.history.EventType']); -goog.addDependency('i18n/bidi.js', ['goog.i18n.bidi'], []); -goog.addDependency('i18n/bidiformatter.js', ['goog.i18n.BidiFormatter'], ['goog.i18n.bidi', 'goog.string']); +goog.addDependency('history/html5history_test.js', ['goog.history.Html5HistoryTest'], ['goog.history.Html5History', 'goog.testing.MockControl', 'goog.testing.jsunit', 'goog.testing.mockmatchers']); +goog.addDependency('html/legacyconversions.js', ['goog.html.legacyconversions'], ['goog.html.SafeHtml', 'goog.html.SafeUrl', 'goog.html.TrustedResourceUrl']); +goog.addDependency('html/legacyconversions_test.js', ['goog.html.legacyconversionsTest'], ['goog.html.SafeHtml', 'goog.html.SafeUrl', 'goog.html.TrustedResourceUrl', 'goog.html.legacyconversions', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit']); +goog.addDependency('html/safehtml.js', ['goog.html.SafeHtml'], ['goog.array', 'goog.asserts', 'goog.dom.tags', 'goog.html.SafeStyle', 'goog.html.SafeUrl', 'goog.i18n.bidi.Dir', 'goog.i18n.bidi.DirectionalString', 'goog.object', 'goog.string', 'goog.string.Const', 'goog.string.TypedString']); +goog.addDependency('html/safehtml_test.js', ['goog.html.safeHtmlTest'], ['goog.html.SafeHtml', 'goog.html.SafeUrl', 'goog.html.testing', 'goog.i18n.bidi.Dir', 'goog.string.Const', 'goog.testing.jsunit']); +goog.addDependency('html/safestyle.js', ['goog.html.SafeStyle'], ['goog.asserts', 'goog.string', 'goog.string.Const', 'goog.string.TypedString']); +goog.addDependency('html/safestyle_test.js', ['goog.html.safeStyleTest'], ['goog.html.SafeStyle', 'goog.string.Const', 'goog.testing.jsunit']); +goog.addDependency('html/safeurl.js', ['goog.html.SafeUrl'], ['goog.asserts', 'goog.i18n.bidi.Dir', 'goog.i18n.bidi.DirectionalString', 'goog.string.Const', 'goog.string.TypedString']); +goog.addDependency('html/safeurl_test.js', ['goog.html.safeUrlTest'], ['goog.html.SafeUrl', 'goog.i18n.bidi.Dir', 'goog.string.Const', 'goog.testing.jsunit']); +goog.addDependency('html/testing.js', ['goog.html.testing'], ['goog.html.SafeHtml', 'goog.html.SafeStyle', 'goog.html.SafeUrl', 'goog.html.TrustedResourceUrl']); +goog.addDependency('html/trustedresourceurl.js', ['goog.html.TrustedResourceUrl'], ['goog.asserts', 'goog.i18n.bidi.Dir', 'goog.i18n.bidi.DirectionalString', 'goog.string.Const', 'goog.string.TypedString']); +goog.addDependency('html/trustedresourceurl_test.js', ['goog.html.trustedResourceUrlTest'], ['goog.html.TrustedResourceUrl', 'goog.i18n.bidi.Dir', 'goog.string.Const', 'goog.testing.jsunit']); +goog.addDependency('html/uncheckedconversions.js', ['goog.html.uncheckedconversions'], ['goog.asserts', 'goog.html.SafeHtml', 'goog.html.SafeStyle', 'goog.html.SafeUrl', 'goog.html.TrustedResourceUrl', 'goog.string', 'goog.string.Const']); +goog.addDependency('html/uncheckedconversions_test.js', ['goog.html.uncheckedconversionsTest'], ['goog.html.SafeHtml', 'goog.html.SafeUrl', 'goog.html.TrustedResourceUrl', 'goog.html.uncheckedconversions', 'goog.i18n.bidi.Dir', 'goog.string.Const', 'goog.testing.jsunit']); +goog.addDependency('html/utils.js', ['goog.html.utils'], ['goog.string']); +goog.addDependency('html/utils_test.js', ['goog.html.UtilsTest'], ['goog.array', 'goog.dom.TagName', 'goog.html.utils', 'goog.object', 'goog.testing.jsunit']); +goog.addDependency('i18n/bidi.js', ['goog.i18n.bidi', 'goog.i18n.bidi.Dir', 'goog.i18n.bidi.DirectionalString', 'goog.i18n.bidi.Format'], []); +goog.addDependency('i18n/bidi_test.js', ['goog.i18n.bidiTest'], ['goog.i18n.bidi', 'goog.i18n.bidi.Dir', 'goog.testing.jsunit']); +goog.addDependency('i18n/bidiformatter.js', ['goog.i18n.BidiFormatter'], ['goog.i18n.bidi', 'goog.i18n.bidi.Dir', 'goog.i18n.bidi.Format', 'goog.string']); +goog.addDependency('i18n/bidiformatter_test.js', ['goog.i18n.BidiFormatterTest'], ['goog.i18n.BidiFormatter', 'goog.i18n.bidi.Dir', 'goog.i18n.bidi.Format', 'goog.testing.jsunit']); goog.addDependency('i18n/charlistdecompressor.js', ['goog.i18n.CharListDecompressor'], ['goog.array', 'goog.i18n.uChar']); +goog.addDependency('i18n/charlistdecompressor_test.js', ['goog.i18n.CharListDecompressorTest'], ['goog.i18n.CharListDecompressor', 'goog.testing.jsunit']); goog.addDependency('i18n/charpickerdata.js', ['goog.i18n.CharPickerData'], []); goog.addDependency('i18n/collation.js', ['goog.i18n.collation'], []); -goog.addDependency('i18n/compactnumberformatsymbols.js', ['goog.i18n.CompactNumberFormatSymbols', 'goog.i18n.CompactNumberFormatSymbols_af', 'goog.i18n.CompactNumberFormatSymbols_af_ZA', 'goog.i18n.CompactNumberFormatSymbols_am', 'goog.i18n.CompactNumberFormatSymbols_am_ET', 'goog.i18n.CompactNumberFormatSymbols_ar', 'goog.i18n.CompactNumberFormatSymbols_ar_001', 'goog.i18n.CompactNumberFormatSymbols_ar_EG', 'goog.i18n.CompactNumberFormatSymbols_bg', 'goog.i18n.CompactNumberFormatSymbols_bg_BG', 'goog.i18n.CompactNumberFormatSymbols_bn', 'goog.i18n.CompactNumberFormatSymbols_bn_BD', 'goog.i18n.CompactNumberFormatSymbols_br', 'goog.i18n.CompactNumberFormatSymbols_br_FR', 'goog.i18n.CompactNumberFormatSymbols_ca', 'goog.i18n.CompactNumberFormatSymbols_ca_AD', 'goog.i18n.CompactNumberFormatSymbols_ca_ES', 'goog.i18n.CompactNumberFormatSymbols_chr', 'goog.i18n.CompactNumberFormatSymbols_chr_US', 'goog.i18n.CompactNumberFormatSymbols_cs', 'goog.i18n.CompactNumberFormatSymbols_cs_CZ', 'goog.i18n.CompactNumberFormatSymbols_cy', 'goog.i18n.CompactNumberFormatSymbols_cy_GB', 'goog.i18n.CompactNumberFormatSymbols_da', 'goog.i18n.CompactNumberFormatSymbols_da_DK', 'goog.i18n.CompactNumberFormatSymbols_de', 'goog.i18n.CompactNumberFormatSymbols_de_AT', 'goog.i18n.CompactNumberFormatSymbols_de_BE', 'goog.i18n.CompactNumberFormatSymbols_de_CH', 'goog.i18n.CompactNumberFormatSymbols_de_DE', 'goog.i18n.CompactNumberFormatSymbols_de_LU', 'goog.i18n.CompactNumberFormatSymbols_el', 'goog.i18n.CompactNumberFormatSymbols_el_GR', 'goog.i18n.CompactNumberFormatSymbols_en', 'goog.i18n.CompactNumberFormatSymbols_en_AS', 'goog.i18n.CompactNumberFormatSymbols_en_AU', 'goog.i18n.CompactNumberFormatSymbols_en_Dsrt_US', 'goog.i18n.CompactNumberFormatSymbols_en_FM', 'goog.i18n.CompactNumberFormatSymbols_en_GB', 'goog.i18n.CompactNumberFormatSymbols_en_GU', 'goog.i18n.CompactNumberFormatSymbols_en_IE', 'goog.i18n.CompactNumberFormatSymbols_en_IN', 'goog.i18n.CompactNumberFormatSymbols_en_MH', 'goog.i18n.CompactNumberFormatSymbols_en_MP', 'goog.i18n.CompactNumberFormatSymbols_en_PR', 'goog.i18n.CompactNumberFormatSymbols_en_PW', 'goog.i18n.CompactNumberFormatSymbols_en_SG', 'goog.i18n.CompactNumberFormatSymbols_en_TC', 'goog.i18n.CompactNumberFormatSymbols_en_UM', 'goog.i18n.CompactNumberFormatSymbols_en_US', 'goog.i18n.CompactNumberFormatSymbols_en_VG', 'goog.i18n.CompactNumberFormatSymbols_en_VI', 'goog.i18n.CompactNumberFormatSymbols_en_ZA', 'goog.i18n.CompactNumberFormatSymbols_es', 'goog.i18n.CompactNumberFormatSymbols_es_419', 'goog.i18n.CompactNumberFormatSymbols_es_EA', 'goog.i18n.CompactNumberFormatSymbols_es_ES', 'goog.i18n.CompactNumberFormatSymbols_es_IC', 'goog.i18n.CompactNumberFormatSymbols_et', 'goog.i18n.CompactNumberFormatSymbols_et_EE', 'goog.i18n.CompactNumberFormatSymbols_eu', 'goog.i18n.CompactNumberFormatSymbols_eu_ES', 'goog.i18n.CompactNumberFormatSymbols_fa', 'goog.i18n.CompactNumberFormatSymbols_fa_IR', 'goog.i18n.CompactNumberFormatSymbols_fi', 'goog.i18n.CompactNumberFormatSymbols_fi_FI', 'goog.i18n.CompactNumberFormatSymbols_fil', 'goog.i18n.CompactNumberFormatSymbols_fil_PH', 'goog.i18n.CompactNumberFormatSymbols_fr', 'goog.i18n.CompactNumberFormatSymbols_fr_BL', 'goog.i18n.CompactNumberFormatSymbols_fr_CA', 'goog.i18n.CompactNumberFormatSymbols_fr_FR', 'goog.i18n.CompactNumberFormatSymbols_fr_GF', 'goog.i18n.CompactNumberFormatSymbols_fr_GP', 'goog.i18n.CompactNumberFormatSymbols_fr_MC', 'goog.i18n.CompactNumberFormatSymbols_fr_MF', 'goog.i18n.CompactNumberFormatSymbols_fr_MQ', 'goog.i18n.CompactNumberFormatSymbols_fr_RE', 'goog.i18n.CompactNumberFormatSymbols_fr_YT', 'goog.i18n.CompactNumberFormatSymbols_gl', 'goog.i18n.CompactNumberFormatSymbols_gl_ES', 'goog.i18n.CompactNumberFormatSymbols_gsw', 'goog.i18n.CompactNumberFormatSymbols_gsw_CH', 'goog.i18n.CompactNumberFormatSymbols_gu', 'goog.i18n.CompactNumberFormatSymbols_gu_IN', 'goog.i18n.CompactNumberFormatSymbols_haw', 'goog.i18n.CompactNumberFormatSymbols_haw_US', 'goog.i18n.CompactNumberFormatSymbols_he', 'goog.i18n.CompactNumberFormatSymbols_he_IL', 'goog.i18n.CompactNumberFormatSymbols_hi', 'goog.i18n.CompactNumberFormatSymbols_hi_IN', 'goog.i18n.CompactNumberFormatSymbols_hr', 'goog.i18n.CompactNumberFormatSymbols_hr_HR', 'goog.i18n.CompactNumberFormatSymbols_hu', 'goog.i18n.CompactNumberFormatSymbols_hu_HU', 'goog.i18n.CompactNumberFormatSymbols_id', 'goog.i18n.CompactNumberFormatSymbols_id_ID', 'goog.i18n.CompactNumberFormatSymbols_in', 'goog.i18n.CompactNumberFormatSymbols_is', 'goog.i18n.CompactNumberFormatSymbols_is_IS', 'goog.i18n.CompactNumberFormatSymbols_it', 'goog.i18n.CompactNumberFormatSymbols_it_IT', 'goog.i18n.CompactNumberFormatSymbols_it_SM', 'goog.i18n.CompactNumberFormatSymbols_iw', 'goog.i18n.CompactNumberFormatSymbols_ja', 'goog.i18n.CompactNumberFormatSymbols_ja_JP', 'goog.i18n.CompactNumberFormatSymbols_kn', 'goog.i18n.CompactNumberFormatSymbols_kn_IN', 'goog.i18n.CompactNumberFormatSymbols_ko', 'goog.i18n.CompactNumberFormatSymbols_ko_KR', 'goog.i18n.CompactNumberFormatSymbols_ln', 'goog.i18n.CompactNumberFormatSymbols_ln_CD', 'goog.i18n.CompactNumberFormatSymbols_lt', 'goog.i18n.CompactNumberFormatSymbols_lt_LT', 'goog.i18n.CompactNumberFormatSymbols_lv', 'goog.i18n.CompactNumberFormatSymbols_lv_LV', 'goog.i18n.CompactNumberFormatSymbols_ml', 'goog.i18n.CompactNumberFormatSymbols_ml_IN', 'goog.i18n.CompactNumberFormatSymbols_mr', 'goog.i18n.CompactNumberFormatSymbols_mr_IN', 'goog.i18n.CompactNumberFormatSymbols_ms', 'goog.i18n.CompactNumberFormatSymbols_ms_Latn_MY', 'goog.i18n.CompactNumberFormatSymbols_mt', 'goog.i18n.CompactNumberFormatSymbols_mt_MT', 'goog.i18n.CompactNumberFormatSymbols_nb', 'goog.i18n.CompactNumberFormatSymbols_nb_NO', 'goog.i18n.CompactNumberFormatSymbols_nl', 'goog.i18n.CompactNumberFormatSymbols_nl_NL', 'goog.i18n.CompactNumberFormatSymbols_no', 'goog.i18n.CompactNumberFormatSymbols_or', 'goog.i18n.CompactNumberFormatSymbols_or_IN', 'goog.i18n.CompactNumberFormatSymbols_pl', 'goog.i18n.CompactNumberFormatSymbols_pl_PL', 'goog.i18n.CompactNumberFormatSymbols_pt', 'goog.i18n.CompactNumberFormatSymbols_pt_BR', 'goog.i18n.CompactNumberFormatSymbols_pt_PT', 'goog.i18n.CompactNumberFormatSymbols_ro', 'goog.i18n.CompactNumberFormatSymbols_ro_RO', 'goog.i18n.CompactNumberFormatSymbols_ru', 'goog.i18n.CompactNumberFormatSymbols_ru_RU', 'goog.i18n.CompactNumberFormatSymbols_sk', 'goog.i18n.CompactNumberFormatSymbols_sk_SK', 'goog.i18n.CompactNumberFormatSymbols_sl', 'goog.i18n.CompactNumberFormatSymbols_sl_SI', 'goog.i18n.CompactNumberFormatSymbols_sq', 'goog.i18n.CompactNumberFormatSymbols_sq_AL', 'goog.i18n.CompactNumberFormatSymbols_sr', 'goog.i18n.CompactNumberFormatSymbols_sr_Cyrl_RS', 'goog.i18n.CompactNumberFormatSymbols_sv', 'goog.i18n.CompactNumberFormatSymbols_sv_SE', 'goog.i18n.CompactNumberFormatSymbols_sw', 'goog.i18n.CompactNumberFormatSymbols_sw_TZ', 'goog.i18n.CompactNumberFormatSymbols_ta', 'goog.i18n.CompactNumberFormatSymbols_ta_IN', 'goog.i18n.CompactNumberFormatSymbols_te', 'goog.i18n.CompactNumberFormatSymbols_te_IN', 'goog.i18n.CompactNumberFormatSymbols_th', 'goog.i18n.CompactNumberFormatSymbols_th_TH', 'goog.i18n.CompactNumberFormatSymbols_tl', 'goog.i18n.CompactNumberFormatSymbols_tr', 'goog.i18n.CompactNumberFormatSymbols_tr_TR', 'goog.i18n.CompactNumberFormatSymbols_uk', 'goog.i18n.CompactNumberFormatSymbols_uk_UA', 'goog.i18n.CompactNumberFormatSymbols_ur', 'goog.i18n.CompactNumberFormatSymbols_ur_PK', 'goog.i18n.CompactNumberFormatSymbols_vi', 'goog.i18n.CompactNumberFormatSymbols_vi_VN', 'goog.i18n.CompactNumberFormatSymbols_zh', 'goog.i18n.CompactNumberFormatSymbols_zh_CN', 'goog.i18n.CompactNumberFormatSymbols_zh_HK', 'goog.i18n.CompactNumberFormatSymbols_zh_Hans_CN', 'goog.i18n.CompactNumberFormatSymbols_zh_TW', 'goog.i18n.CompactNumberFormatSymbols_zu', 'goog.i18n.CompactNumberFormatSymbols_zu_ZA'], []); -goog.addDependency('i18n/compactnumberformatsymbols_ext.js', ['goog.i18n.CompactNumberFormatSymbolsExt', 'goog.i18n.CompactNumberFormatSymbols_aa', 'goog.i18n.CompactNumberFormatSymbols_aa_DJ', 'goog.i18n.CompactNumberFormatSymbols_aa_ER', 'goog.i18n.CompactNumberFormatSymbols_aa_ET', 'goog.i18n.CompactNumberFormatSymbols_af_NA', 'goog.i18n.CompactNumberFormatSymbols_agq', 'goog.i18n.CompactNumberFormatSymbols_agq_CM', 'goog.i18n.CompactNumberFormatSymbols_ak', 'goog.i18n.CompactNumberFormatSymbols_ak_GH', 'goog.i18n.CompactNumberFormatSymbols_ar_AE', 'goog.i18n.CompactNumberFormatSymbols_ar_BH', 'goog.i18n.CompactNumberFormatSymbols_ar_DJ', 'goog.i18n.CompactNumberFormatSymbols_ar_DZ', 'goog.i18n.CompactNumberFormatSymbols_ar_EH', 'goog.i18n.CompactNumberFormatSymbols_ar_ER', 'goog.i18n.CompactNumberFormatSymbols_ar_IL', 'goog.i18n.CompactNumberFormatSymbols_ar_IQ', 'goog.i18n.CompactNumberFormatSymbols_ar_JO', 'goog.i18n.CompactNumberFormatSymbols_ar_KM', 'goog.i18n.CompactNumberFormatSymbols_ar_KW', 'goog.i18n.CompactNumberFormatSymbols_ar_LB', 'goog.i18n.CompactNumberFormatSymbols_ar_LY', 'goog.i18n.CompactNumberFormatSymbols_ar_MA', 'goog.i18n.CompactNumberFormatSymbols_ar_MR', 'goog.i18n.CompactNumberFormatSymbols_ar_OM', 'goog.i18n.CompactNumberFormatSymbols_ar_PS', 'goog.i18n.CompactNumberFormatSymbols_ar_QA', 'goog.i18n.CompactNumberFormatSymbols_ar_SA', 'goog.i18n.CompactNumberFormatSymbols_ar_SD', 'goog.i18n.CompactNumberFormatSymbols_ar_SO', 'goog.i18n.CompactNumberFormatSymbols_ar_SY', 'goog.i18n.CompactNumberFormatSymbols_ar_TD', 'goog.i18n.CompactNumberFormatSymbols_ar_TN', 'goog.i18n.CompactNumberFormatSymbols_ar_YE', 'goog.i18n.CompactNumberFormatSymbols_as', 'goog.i18n.CompactNumberFormatSymbols_as_IN', 'goog.i18n.CompactNumberFormatSymbols_asa', 'goog.i18n.CompactNumberFormatSymbols_asa_TZ', 'goog.i18n.CompactNumberFormatSymbols_ast', 'goog.i18n.CompactNumberFormatSymbols_ast_ES', 'goog.i18n.CompactNumberFormatSymbols_az', 'goog.i18n.CompactNumberFormatSymbols_az_Cyrl', 'goog.i18n.CompactNumberFormatSymbols_az_Cyrl_AZ', 'goog.i18n.CompactNumberFormatSymbols_az_Latn', 'goog.i18n.CompactNumberFormatSymbols_az_Latn_AZ', 'goog.i18n.CompactNumberFormatSymbols_bas', 'goog.i18n.CompactNumberFormatSymbols_bas_CM', 'goog.i18n.CompactNumberFormatSymbols_be', 'goog.i18n.CompactNumberFormatSymbols_be_BY', 'goog.i18n.CompactNumberFormatSymbols_bem', 'goog.i18n.CompactNumberFormatSymbols_bem_ZM', 'goog.i18n.CompactNumberFormatSymbols_bez', 'goog.i18n.CompactNumberFormatSymbols_bez_TZ', 'goog.i18n.CompactNumberFormatSymbols_bm', 'goog.i18n.CompactNumberFormatSymbols_bm_ML', 'goog.i18n.CompactNumberFormatSymbols_bn_IN', 'goog.i18n.CompactNumberFormatSymbols_bo', 'goog.i18n.CompactNumberFormatSymbols_bo_CN', 'goog.i18n.CompactNumberFormatSymbols_bo_IN', 'goog.i18n.CompactNumberFormatSymbols_brx', 'goog.i18n.CompactNumberFormatSymbols_brx_IN', 'goog.i18n.CompactNumberFormatSymbols_bs', 'goog.i18n.CompactNumberFormatSymbols_bs_Cyrl', 'goog.i18n.CompactNumberFormatSymbols_bs_Cyrl_BA', 'goog.i18n.CompactNumberFormatSymbols_bs_Latn', 'goog.i18n.CompactNumberFormatSymbols_bs_Latn_BA', 'goog.i18n.CompactNumberFormatSymbols_byn', 'goog.i18n.CompactNumberFormatSymbols_byn_ER', 'goog.i18n.CompactNumberFormatSymbols_cgg', 'goog.i18n.CompactNumberFormatSymbols_cgg_UG', 'goog.i18n.CompactNumberFormatSymbols_ckb', 'goog.i18n.CompactNumberFormatSymbols_ckb_Arab', 'goog.i18n.CompactNumberFormatSymbols_ckb_Arab_IQ', 'goog.i18n.CompactNumberFormatSymbols_ckb_Arab_IR', 'goog.i18n.CompactNumberFormatSymbols_ckb_IQ', 'goog.i18n.CompactNumberFormatSymbols_ckb_IR', 'goog.i18n.CompactNumberFormatSymbols_ckb_Latn', 'goog.i18n.CompactNumberFormatSymbols_ckb_Latn_IQ', 'goog.i18n.CompactNumberFormatSymbols_dav', 'goog.i18n.CompactNumberFormatSymbols_dav_KE', 'goog.i18n.CompactNumberFormatSymbols_de_LI', 'goog.i18n.CompactNumberFormatSymbols_dje', 'goog.i18n.CompactNumberFormatSymbols_dje_NE', 'goog.i18n.CompactNumberFormatSymbols_dua', 'goog.i18n.CompactNumberFormatSymbols_dua_CM', 'goog.i18n.CompactNumberFormatSymbols_dyo', 'goog.i18n.CompactNumberFormatSymbols_dyo_SN', 'goog.i18n.CompactNumberFormatSymbols_dz', 'goog.i18n.CompactNumberFormatSymbols_dz_BT', 'goog.i18n.CompactNumberFormatSymbols_ebu', 'goog.i18n.CompactNumberFormatSymbols_ebu_KE', 'goog.i18n.CompactNumberFormatSymbols_ee', 'goog.i18n.CompactNumberFormatSymbols_ee_GH', 'goog.i18n.CompactNumberFormatSymbols_ee_TG', 'goog.i18n.CompactNumberFormatSymbols_el_CY', 'goog.i18n.CompactNumberFormatSymbols_en_150', 'goog.i18n.CompactNumberFormatSymbols_en_AG', 'goog.i18n.CompactNumberFormatSymbols_en_BB', 'goog.i18n.CompactNumberFormatSymbols_en_BE', 'goog.i18n.CompactNumberFormatSymbols_en_BM', 'goog.i18n.CompactNumberFormatSymbols_en_BS', 'goog.i18n.CompactNumberFormatSymbols_en_BW', 'goog.i18n.CompactNumberFormatSymbols_en_BZ', 'goog.i18n.CompactNumberFormatSymbols_en_CA', 'goog.i18n.CompactNumberFormatSymbols_en_CM', 'goog.i18n.CompactNumberFormatSymbols_en_DM', 'goog.i18n.CompactNumberFormatSymbols_en_Dsrt', 'goog.i18n.CompactNumberFormatSymbols_en_FJ', 'goog.i18n.CompactNumberFormatSymbols_en_GD', 'goog.i18n.CompactNumberFormatSymbols_en_GG', 'goog.i18n.CompactNumberFormatSymbols_en_GH', 'goog.i18n.CompactNumberFormatSymbols_en_GI', 'goog.i18n.CompactNumberFormatSymbols_en_GM', 'goog.i18n.CompactNumberFormatSymbols_en_GY', 'goog.i18n.CompactNumberFormatSymbols_en_HK', 'goog.i18n.CompactNumberFormatSymbols_en_IM', 'goog.i18n.CompactNumberFormatSymbols_en_JE', 'goog.i18n.CompactNumberFormatSymbols_en_JM', 'goog.i18n.CompactNumberFormatSymbols_en_KE', 'goog.i18n.CompactNumberFormatSymbols_en_KI', 'goog.i18n.CompactNumberFormatSymbols_en_KN', 'goog.i18n.CompactNumberFormatSymbols_en_KY', 'goog.i18n.CompactNumberFormatSymbols_en_LC', 'goog.i18n.CompactNumberFormatSymbols_en_LR', 'goog.i18n.CompactNumberFormatSymbols_en_LS', 'goog.i18n.CompactNumberFormatSymbols_en_MG', 'goog.i18n.CompactNumberFormatSymbols_en_MT', 'goog.i18n.CompactNumberFormatSymbols_en_MU', 'goog.i18n.CompactNumberFormatSymbols_en_MW', 'goog.i18n.CompactNumberFormatSymbols_en_NA', 'goog.i18n.CompactNumberFormatSymbols_en_NG', 'goog.i18n.CompactNumberFormatSymbols_en_NZ', 'goog.i18n.CompactNumberFormatSymbols_en_PG', 'goog.i18n.CompactNumberFormatSymbols_en_PH', 'goog.i18n.CompactNumberFormatSymbols_en_PK', 'goog.i18n.CompactNumberFormatSymbols_en_SB', 'goog.i18n.CompactNumberFormatSymbols_en_SC', 'goog.i18n.CompactNumberFormatSymbols_en_SL', 'goog.i18n.CompactNumberFormatSymbols_en_SS', 'goog.i18n.CompactNumberFormatSymbols_en_SZ', 'goog.i18n.CompactNumberFormatSymbols_en_TO', 'goog.i18n.CompactNumberFormatSymbols_en_TT', 'goog.i18n.CompactNumberFormatSymbols_en_TZ', 'goog.i18n.CompactNumberFormatSymbols_en_UG', 'goog.i18n.CompactNumberFormatSymbols_en_VC', 'goog.i18n.CompactNumberFormatSymbols_en_VU', 'goog.i18n.CompactNumberFormatSymbols_en_WS', 'goog.i18n.CompactNumberFormatSymbols_en_ZM', 'goog.i18n.CompactNumberFormatSymbols_en_ZW', 'goog.i18n.CompactNumberFormatSymbols_eo', 'goog.i18n.CompactNumberFormatSymbols_es_AR', 'goog.i18n.CompactNumberFormatSymbols_es_BO', 'goog.i18n.CompactNumberFormatSymbols_es_CL', 'goog.i18n.CompactNumberFormatSymbols_es_CO', 'goog.i18n.CompactNumberFormatSymbols_es_CR', 'goog.i18n.CompactNumberFormatSymbols_es_CU', 'goog.i18n.CompactNumberFormatSymbols_es_DO', 'goog.i18n.CompactNumberFormatSymbols_es_EC', 'goog.i18n.CompactNumberFormatSymbols_es_GQ', 'goog.i18n.CompactNumberFormatSymbols_es_GT', 'goog.i18n.CompactNumberFormatSymbols_es_HN', 'goog.i18n.CompactNumberFormatSymbols_es_MX', 'goog.i18n.CompactNumberFormatSymbols_es_NI', 'goog.i18n.CompactNumberFormatSymbols_es_PA', 'goog.i18n.CompactNumberFormatSymbols_es_PE', 'goog.i18n.CompactNumberFormatSymbols_es_PH', 'goog.i18n.CompactNumberFormatSymbols_es_PR', 'goog.i18n.CompactNumberFormatSymbols_es_PY', 'goog.i18n.CompactNumberFormatSymbols_es_SV', 'goog.i18n.CompactNumberFormatSymbols_es_US', 'goog.i18n.CompactNumberFormatSymbols_es_UY', 'goog.i18n.CompactNumberFormatSymbols_es_VE', 'goog.i18n.CompactNumberFormatSymbols_ewo', 'goog.i18n.CompactNumberFormatSymbols_ewo_CM', 'goog.i18n.CompactNumberFormatSymbols_fa_AF', 'goog.i18n.CompactNumberFormatSymbols_ff', 'goog.i18n.CompactNumberFormatSymbols_ff_SN', 'goog.i18n.CompactNumberFormatSymbols_fo', 'goog.i18n.CompactNumberFormatSymbols_fo_FO', 'goog.i18n.CompactNumberFormatSymbols_fr_BE', 'goog.i18n.CompactNumberFormatSymbols_fr_BF', 'goog.i18n.CompactNumberFormatSymbols_fr_BI', 'goog.i18n.CompactNumberFormatSymbols_fr_BJ', 'goog.i18n.CompactNumberFormatSymbols_fr_CD', 'goog.i18n.CompactNumberFormatSymbols_fr_CF', 'goog.i18n.CompactNumberFormatSymbols_fr_CG', 'goog.i18n.CompactNumberFormatSymbols_fr_CH', 'goog.i18n.CompactNumberFormatSymbols_fr_CI', 'goog.i18n.CompactNumberFormatSymbols_fr_CM', 'goog.i18n.CompactNumberFormatSymbols_fr_DJ', 'goog.i18n.CompactNumberFormatSymbols_fr_DZ', 'goog.i18n.CompactNumberFormatSymbols_fr_GA', 'goog.i18n.CompactNumberFormatSymbols_fr_GN', 'goog.i18n.CompactNumberFormatSymbols_fr_GQ', 'goog.i18n.CompactNumberFormatSymbols_fr_HT', 'goog.i18n.CompactNumberFormatSymbols_fr_KM', 'goog.i18n.CompactNumberFormatSymbols_fr_LU', 'goog.i18n.CompactNumberFormatSymbols_fr_MA', 'goog.i18n.CompactNumberFormatSymbols_fr_MG', 'goog.i18n.CompactNumberFormatSymbols_fr_ML', 'goog.i18n.CompactNumberFormatSymbols_fr_MR', 'goog.i18n.CompactNumberFormatSymbols_fr_MU', 'goog.i18n.CompactNumberFormatSymbols_fr_NC', 'goog.i18n.CompactNumberFormatSymbols_fr_NE', 'goog.i18n.CompactNumberFormatSymbols_fr_PF', 'goog.i18n.CompactNumberFormatSymbols_fr_RW', 'goog.i18n.CompactNumberFormatSymbols_fr_SC', 'goog.i18n.CompactNumberFormatSymbols_fr_SN', 'goog.i18n.CompactNumberFormatSymbols_fr_SY', 'goog.i18n.CompactNumberFormatSymbols_fr_TD', 'goog.i18n.CompactNumberFormatSymbols_fr_TG', 'goog.i18n.CompactNumberFormatSymbols_fr_TN', 'goog.i18n.CompactNumberFormatSymbols_fr_VU', 'goog.i18n.CompactNumberFormatSymbols_fur', 'goog.i18n.CompactNumberFormatSymbols_fur_IT', 'goog.i18n.CompactNumberFormatSymbols_ga', 'goog.i18n.CompactNumberFormatSymbols_ga_IE', 'goog.i18n.CompactNumberFormatSymbols_gd', 'goog.i18n.CompactNumberFormatSymbols_gd_GB', 'goog.i18n.CompactNumberFormatSymbols_guz', 'goog.i18n.CompactNumberFormatSymbols_guz_KE', 'goog.i18n.CompactNumberFormatSymbols_gv', 'goog.i18n.CompactNumberFormatSymbols_gv_GB', 'goog.i18n.CompactNumberFormatSymbols_ha', 'goog.i18n.CompactNumberFormatSymbols_ha_Latn', 'goog.i18n.CompactNumberFormatSymbols_ha_Latn_GH', 'goog.i18n.CompactNumberFormatSymbols_ha_Latn_NE', 'goog.i18n.CompactNumberFormatSymbols_ha_Latn_NG', 'goog.i18n.CompactNumberFormatSymbols_hr_BA', 'goog.i18n.CompactNumberFormatSymbols_hy', 'goog.i18n.CompactNumberFormatSymbols_hy_AM', 'goog.i18n.CompactNumberFormatSymbols_ia', 'goog.i18n.CompactNumberFormatSymbols_ia_FR', 'goog.i18n.CompactNumberFormatSymbols_ig', 'goog.i18n.CompactNumberFormatSymbols_ig_NG', 'goog.i18n.CompactNumberFormatSymbols_ii', 'goog.i18n.CompactNumberFormatSymbols_ii_CN', 'goog.i18n.CompactNumberFormatSymbols_it_CH', 'goog.i18n.CompactNumberFormatSymbols_jgo', 'goog.i18n.CompactNumberFormatSymbols_jgo_CM', 'goog.i18n.CompactNumberFormatSymbols_jmc', 'goog.i18n.CompactNumberFormatSymbols_jmc_TZ', 'goog.i18n.CompactNumberFormatSymbols_ka', 'goog.i18n.CompactNumberFormatSymbols_ka_GE', 'goog.i18n.CompactNumberFormatSymbols_kab', 'goog.i18n.CompactNumberFormatSymbols_kab_DZ', 'goog.i18n.CompactNumberFormatSymbols_kam', 'goog.i18n.CompactNumberFormatSymbols_kam_KE', 'goog.i18n.CompactNumberFormatSymbols_kde', 'goog.i18n.CompactNumberFormatSymbols_kde_TZ', 'goog.i18n.CompactNumberFormatSymbols_kea', 'goog.i18n.CompactNumberFormatSymbols_kea_CV', 'goog.i18n.CompactNumberFormatSymbols_khq', 'goog.i18n.CompactNumberFormatSymbols_khq_ML', 'goog.i18n.CompactNumberFormatSymbols_ki', 'goog.i18n.CompactNumberFormatSymbols_ki_KE', 'goog.i18n.CompactNumberFormatSymbols_kk', 'goog.i18n.CompactNumberFormatSymbols_kk_Cyrl', 'goog.i18n.CompactNumberFormatSymbols_kk_Cyrl_KZ', 'goog.i18n.CompactNumberFormatSymbols_kkj', 'goog.i18n.CompactNumberFormatSymbols_kkj_CM', 'goog.i18n.CompactNumberFormatSymbols_kl', 'goog.i18n.CompactNumberFormatSymbols_kl_GL', 'goog.i18n.CompactNumberFormatSymbols_kln', 'goog.i18n.CompactNumberFormatSymbols_kln_KE', 'goog.i18n.CompactNumberFormatSymbols_km', 'goog.i18n.CompactNumberFormatSymbols_km_KH', 'goog.i18n.CompactNumberFormatSymbols_ko_KP', 'goog.i18n.CompactNumberFormatSymbols_kok', 'goog.i18n.CompactNumberFormatSymbols_kok_IN', 'goog.i18n.CompactNumberFormatSymbols_ks', 'goog.i18n.CompactNumberFormatSymbols_ks_Arab', 'goog.i18n.CompactNumberFormatSymbols_ks_Arab_IN', 'goog.i18n.CompactNumberFormatSymbols_ksb', 'goog.i18n.CompactNumberFormatSymbols_ksb_TZ', 'goog.i18n.CompactNumberFormatSymbols_ksf', 'goog.i18n.CompactNumberFormatSymbols_ksf_CM', 'goog.i18n.CompactNumberFormatSymbols_ksh', 'goog.i18n.CompactNumberFormatSymbols_ksh_DE', 'goog.i18n.CompactNumberFormatSymbols_kw', 'goog.i18n.CompactNumberFormatSymbols_kw_GB', 'goog.i18n.CompactNumberFormatSymbols_ky', 'goog.i18n.CompactNumberFormatSymbols_ky_KG', 'goog.i18n.CompactNumberFormatSymbols_lag', 'goog.i18n.CompactNumberFormatSymbols_lag_TZ', 'goog.i18n.CompactNumberFormatSymbols_lg', 'goog.i18n.CompactNumberFormatSymbols_lg_UG', 'goog.i18n.CompactNumberFormatSymbols_ln_AO', 'goog.i18n.CompactNumberFormatSymbols_ln_CF', 'goog.i18n.CompactNumberFormatSymbols_ln_CG', 'goog.i18n.CompactNumberFormatSymbols_lo', 'goog.i18n.CompactNumberFormatSymbols_lo_LA', 'goog.i18n.CompactNumberFormatSymbols_lu', 'goog.i18n.CompactNumberFormatSymbols_lu_CD', 'goog.i18n.CompactNumberFormatSymbols_luo', 'goog.i18n.CompactNumberFormatSymbols_luo_KE', 'goog.i18n.CompactNumberFormatSymbols_luy', 'goog.i18n.CompactNumberFormatSymbols_luy_KE', 'goog.i18n.CompactNumberFormatSymbols_mas', 'goog.i18n.CompactNumberFormatSymbols_mas_KE', 'goog.i18n.CompactNumberFormatSymbols_mas_TZ', 'goog.i18n.CompactNumberFormatSymbols_mer', 'goog.i18n.CompactNumberFormatSymbols_mer_KE', 'goog.i18n.CompactNumberFormatSymbols_mfe', 'goog.i18n.CompactNumberFormatSymbols_mfe_MU', 'goog.i18n.CompactNumberFormatSymbols_mg', 'goog.i18n.CompactNumberFormatSymbols_mg_MG', 'goog.i18n.CompactNumberFormatSymbols_mgh', 'goog.i18n.CompactNumberFormatSymbols_mgh_MZ', 'goog.i18n.CompactNumberFormatSymbols_mgo', 'goog.i18n.CompactNumberFormatSymbols_mgo_CM', 'goog.i18n.CompactNumberFormatSymbols_mk', 'goog.i18n.CompactNumberFormatSymbols_mk_MK', 'goog.i18n.CompactNumberFormatSymbols_mn', 'goog.i18n.CompactNumberFormatSymbols_mn_Cyrl', 'goog.i18n.CompactNumberFormatSymbols_mn_Cyrl_MN', 'goog.i18n.CompactNumberFormatSymbols_ms_Latn', 'goog.i18n.CompactNumberFormatSymbols_ms_Latn_BN', 'goog.i18n.CompactNumberFormatSymbols_ms_Latn_SG', 'goog.i18n.CompactNumberFormatSymbols_mua', 'goog.i18n.CompactNumberFormatSymbols_mua_CM', 'goog.i18n.CompactNumberFormatSymbols_my', 'goog.i18n.CompactNumberFormatSymbols_my_MM', 'goog.i18n.CompactNumberFormatSymbols_naq', 'goog.i18n.CompactNumberFormatSymbols_naq_NA', 'goog.i18n.CompactNumberFormatSymbols_nd', 'goog.i18n.CompactNumberFormatSymbols_nd_ZW', 'goog.i18n.CompactNumberFormatSymbols_ne', 'goog.i18n.CompactNumberFormatSymbols_ne_IN', 'goog.i18n.CompactNumberFormatSymbols_ne_NP', 'goog.i18n.CompactNumberFormatSymbols_nl_AW', 'goog.i18n.CompactNumberFormatSymbols_nl_BE', 'goog.i18n.CompactNumberFormatSymbols_nl_CW', 'goog.i18n.CompactNumberFormatSymbols_nl_SR', 'goog.i18n.CompactNumberFormatSymbols_nl_SX', 'goog.i18n.CompactNumberFormatSymbols_nmg', 'goog.i18n.CompactNumberFormatSymbols_nmg_CM', 'goog.i18n.CompactNumberFormatSymbols_nn', 'goog.i18n.CompactNumberFormatSymbols_nn_NO', 'goog.i18n.CompactNumberFormatSymbols_nnh', 'goog.i18n.CompactNumberFormatSymbols_nnh_CM', 'goog.i18n.CompactNumberFormatSymbols_nr', 'goog.i18n.CompactNumberFormatSymbols_nr_ZA', 'goog.i18n.CompactNumberFormatSymbols_nso', 'goog.i18n.CompactNumberFormatSymbols_nso_ZA', 'goog.i18n.CompactNumberFormatSymbols_nus', 'goog.i18n.CompactNumberFormatSymbols_nus_SD', 'goog.i18n.CompactNumberFormatSymbols_nyn', 'goog.i18n.CompactNumberFormatSymbols_nyn_UG', 'goog.i18n.CompactNumberFormatSymbols_om', 'goog.i18n.CompactNumberFormatSymbols_om_ET', 'goog.i18n.CompactNumberFormatSymbols_om_KE', 'goog.i18n.CompactNumberFormatSymbols_os', 'goog.i18n.CompactNumberFormatSymbols_os_GE', 'goog.i18n.CompactNumberFormatSymbols_os_RU', 'goog.i18n.CompactNumberFormatSymbols_pa', 'goog.i18n.CompactNumberFormatSymbols_pa_Arab', 'goog.i18n.CompactNumberFormatSymbols_pa_Arab_PK', 'goog.i18n.CompactNumberFormatSymbols_pa_Guru', 'goog.i18n.CompactNumberFormatSymbols_pa_Guru_IN', 'goog.i18n.CompactNumberFormatSymbols_ps', 'goog.i18n.CompactNumberFormatSymbols_ps_AF', 'goog.i18n.CompactNumberFormatSymbols_pt_AO', 'goog.i18n.CompactNumberFormatSymbols_pt_CV', 'goog.i18n.CompactNumberFormatSymbols_pt_GW', 'goog.i18n.CompactNumberFormatSymbols_pt_MO', 'goog.i18n.CompactNumberFormatSymbols_pt_MZ', 'goog.i18n.CompactNumberFormatSymbols_pt_ST', 'goog.i18n.CompactNumberFormatSymbols_pt_TL', 'goog.i18n.CompactNumberFormatSymbols_rm', 'goog.i18n.CompactNumberFormatSymbols_rm_CH', 'goog.i18n.CompactNumberFormatSymbols_rn', 'goog.i18n.CompactNumberFormatSymbols_rn_BI', 'goog.i18n.CompactNumberFormatSymbols_ro_MD', 'goog.i18n.CompactNumberFormatSymbols_rof', 'goog.i18n.CompactNumberFormatSymbols_rof_TZ', 'goog.i18n.CompactNumberFormatSymbols_ru_BY', 'goog.i18n.CompactNumberFormatSymbols_ru_KG', 'goog.i18n.CompactNumberFormatSymbols_ru_KZ', 'goog.i18n.CompactNumberFormatSymbols_ru_MD', 'goog.i18n.CompactNumberFormatSymbols_ru_UA', 'goog.i18n.CompactNumberFormatSymbols_rw', 'goog.i18n.CompactNumberFormatSymbols_rw_RW', 'goog.i18n.CompactNumberFormatSymbols_rwk', 'goog.i18n.CompactNumberFormatSymbols_rwk_TZ', 'goog.i18n.CompactNumberFormatSymbols_sah', 'goog.i18n.CompactNumberFormatSymbols_sah_RU', 'goog.i18n.CompactNumberFormatSymbols_saq', 'goog.i18n.CompactNumberFormatSymbols_saq_KE', 'goog.i18n.CompactNumberFormatSymbols_sbp', 'goog.i18n.CompactNumberFormatSymbols_sbp_TZ', 'goog.i18n.CompactNumberFormatSymbols_se', 'goog.i18n.CompactNumberFormatSymbols_se_FI', 'goog.i18n.CompactNumberFormatSymbols_se_NO', 'goog.i18n.CompactNumberFormatSymbols_seh', 'goog.i18n.CompactNumberFormatSymbols_seh_MZ', 'goog.i18n.CompactNumberFormatSymbols_ses', 'goog.i18n.CompactNumberFormatSymbols_ses_ML', 'goog.i18n.CompactNumberFormatSymbols_sg', 'goog.i18n.CompactNumberFormatSymbols_sg_CF', 'goog.i18n.CompactNumberFormatSymbols_shi', 'goog.i18n.CompactNumberFormatSymbols_shi_Latn', 'goog.i18n.CompactNumberFormatSymbols_shi_Latn_MA', 'goog.i18n.CompactNumberFormatSymbols_shi_Tfng', 'goog.i18n.CompactNumberFormatSymbols_shi_Tfng_MA', 'goog.i18n.CompactNumberFormatSymbols_si', 'goog.i18n.CompactNumberFormatSymbols_si_LK', 'goog.i18n.CompactNumberFormatSymbols_sn', 'goog.i18n.CompactNumberFormatSymbols_sn_ZW', 'goog.i18n.CompactNumberFormatSymbols_so', 'goog.i18n.CompactNumberFormatSymbols_so_DJ', 'goog.i18n.CompactNumberFormatSymbols_so_ET', 'goog.i18n.CompactNumberFormatSymbols_so_KE', 'goog.i18n.CompactNumberFormatSymbols_so_SO', 'goog.i18n.CompactNumberFormatSymbols_sq_MK', 'goog.i18n.CompactNumberFormatSymbols_sq_XK', 'goog.i18n.CompactNumberFormatSymbols_sr_Cyrl', 'goog.i18n.CompactNumberFormatSymbols_sr_Cyrl_BA', 'goog.i18n.CompactNumberFormatSymbols_sr_Cyrl_ME', 'goog.i18n.CompactNumberFormatSymbols_sr_Cyrl_XK', 'goog.i18n.CompactNumberFormatSymbols_sr_Latn', 'goog.i18n.CompactNumberFormatSymbols_sr_Latn_BA', 'goog.i18n.CompactNumberFormatSymbols_sr_Latn_ME', 'goog.i18n.CompactNumberFormatSymbols_sr_Latn_RS', 'goog.i18n.CompactNumberFormatSymbols_sr_Latn_XK', 'goog.i18n.CompactNumberFormatSymbols_ss', 'goog.i18n.CompactNumberFormatSymbols_ss_SZ', 'goog.i18n.CompactNumberFormatSymbols_ss_ZA', 'goog.i18n.CompactNumberFormatSymbols_ssy', 'goog.i18n.CompactNumberFormatSymbols_ssy_ER', 'goog.i18n.CompactNumberFormatSymbols_st', 'goog.i18n.CompactNumberFormatSymbols_st_LS', 'goog.i18n.CompactNumberFormatSymbols_st_ZA', 'goog.i18n.CompactNumberFormatSymbols_sv_AX', 'goog.i18n.CompactNumberFormatSymbols_sv_FI', 'goog.i18n.CompactNumberFormatSymbols_sw_KE', 'goog.i18n.CompactNumberFormatSymbols_sw_UG', 'goog.i18n.CompactNumberFormatSymbols_swc', 'goog.i18n.CompactNumberFormatSymbols_swc_CD', 'goog.i18n.CompactNumberFormatSymbols_ta_LK', 'goog.i18n.CompactNumberFormatSymbols_ta_MY', 'goog.i18n.CompactNumberFormatSymbols_ta_SG', 'goog.i18n.CompactNumberFormatSymbols_teo', 'goog.i18n.CompactNumberFormatSymbols_teo_KE', 'goog.i18n.CompactNumberFormatSymbols_teo_UG', 'goog.i18n.CompactNumberFormatSymbols_tg', 'goog.i18n.CompactNumberFormatSymbols_tg_Cyrl', 'goog.i18n.CompactNumberFormatSymbols_tg_Cyrl_TJ', 'goog.i18n.CompactNumberFormatSymbols_ti', 'goog.i18n.CompactNumberFormatSymbols_ti_ER', 'goog.i18n.CompactNumberFormatSymbols_ti_ET', 'goog.i18n.CompactNumberFormatSymbols_tig', 'goog.i18n.CompactNumberFormatSymbols_tig_ER', 'goog.i18n.CompactNumberFormatSymbols_tn', 'goog.i18n.CompactNumberFormatSymbols_tn_BW', 'goog.i18n.CompactNumberFormatSymbols_tn_ZA', 'goog.i18n.CompactNumberFormatSymbols_to', 'goog.i18n.CompactNumberFormatSymbols_to_TO', 'goog.i18n.CompactNumberFormatSymbols_tr_CY', 'goog.i18n.CompactNumberFormatSymbols_ts', 'goog.i18n.CompactNumberFormatSymbols_ts_ZA', 'goog.i18n.CompactNumberFormatSymbols_twq', 'goog.i18n.CompactNumberFormatSymbols_twq_NE', 'goog.i18n.CompactNumberFormatSymbols_tzm', 'goog.i18n.CompactNumberFormatSymbols_tzm_Latn', 'goog.i18n.CompactNumberFormatSymbols_tzm_Latn_MA', 'goog.i18n.CompactNumberFormatSymbols_ur_IN', 'goog.i18n.CompactNumberFormatSymbols_uz', 'goog.i18n.CompactNumberFormatSymbols_uz_Arab', 'goog.i18n.CompactNumberFormatSymbols_uz_Arab_AF', 'goog.i18n.CompactNumberFormatSymbols_uz_Cyrl', 'goog.i18n.CompactNumberFormatSymbols_uz_Cyrl_UZ', 'goog.i18n.CompactNumberFormatSymbols_uz_Latn', 'goog.i18n.CompactNumberFormatSymbols_uz_Latn_UZ', 'goog.i18n.CompactNumberFormatSymbols_vai', 'goog.i18n.CompactNumberFormatSymbols_vai_Latn', 'goog.i18n.CompactNumberFormatSymbols_vai_Latn_LR', 'goog.i18n.CompactNumberFormatSymbols_vai_Vaii', 'goog.i18n.CompactNumberFormatSymbols_vai_Vaii_LR', 'goog.i18n.CompactNumberFormatSymbols_ve', 'goog.i18n.CompactNumberFormatSymbols_ve_ZA', 'goog.i18n.CompactNumberFormatSymbols_vo', 'goog.i18n.CompactNumberFormatSymbols_vun', 'goog.i18n.CompactNumberFormatSymbols_vun_TZ', 'goog.i18n.CompactNumberFormatSymbols_wae', 'goog.i18n.CompactNumberFormatSymbols_wae_CH', 'goog.i18n.CompactNumberFormatSymbols_wal', 'goog.i18n.CompactNumberFormatSymbols_wal_ET', 'goog.i18n.CompactNumberFormatSymbols_xh', 'goog.i18n.CompactNumberFormatSymbols_xh_ZA', 'goog.i18n.CompactNumberFormatSymbols_xog', 'goog.i18n.CompactNumberFormatSymbols_xog_UG', 'goog.i18n.CompactNumberFormatSymbols_yav', 'goog.i18n.CompactNumberFormatSymbols_yav_CM', 'goog.i18n.CompactNumberFormatSymbols_yo', 'goog.i18n.CompactNumberFormatSymbols_yo_NG', 'goog.i18n.CompactNumberFormatSymbols_zh_Hans', 'goog.i18n.CompactNumberFormatSymbols_zh_Hans_HK', 'goog.i18n.CompactNumberFormatSymbols_zh_Hans_MO', 'goog.i18n.CompactNumberFormatSymbols_zh_Hans_SG', 'goog.i18n.CompactNumberFormatSymbols_zh_Hant', 'goog.i18n.CompactNumberFormatSymbols_zh_Hant_HK', 'goog.i18n.CompactNumberFormatSymbols_zh_Hant_MO', 'goog.i18n.CompactNumberFormatSymbols_zh_Hant_TW'], []); +goog.addDependency('i18n/collation_test.js', ['goog.i18n.collationTest'], ['goog.i18n.collation', 'goog.testing.ExpectedFailures', 'goog.testing.jsunit', 'goog.userAgent']); +goog.addDependency('i18n/compactnumberformatsymbols.js', ['goog.i18n.CompactNumberFormatSymbols', 'goog.i18n.CompactNumberFormatSymbols_af', 'goog.i18n.CompactNumberFormatSymbols_af_ZA', 'goog.i18n.CompactNumberFormatSymbols_am', 'goog.i18n.CompactNumberFormatSymbols_am_ET', 'goog.i18n.CompactNumberFormatSymbols_ar', 'goog.i18n.CompactNumberFormatSymbols_ar_001', 'goog.i18n.CompactNumberFormatSymbols_az', 'goog.i18n.CompactNumberFormatSymbols_az_Cyrl_AZ', 'goog.i18n.CompactNumberFormatSymbols_az_Latn_AZ', 'goog.i18n.CompactNumberFormatSymbols_bg', 'goog.i18n.CompactNumberFormatSymbols_bg_BG', 'goog.i18n.CompactNumberFormatSymbols_bn', 'goog.i18n.CompactNumberFormatSymbols_bn_BD', 'goog.i18n.CompactNumberFormatSymbols_br', 'goog.i18n.CompactNumberFormatSymbols_br_FR', 'goog.i18n.CompactNumberFormatSymbols_ca', 'goog.i18n.CompactNumberFormatSymbols_ca_AD', 'goog.i18n.CompactNumberFormatSymbols_ca_ES', 'goog.i18n.CompactNumberFormatSymbols_ca_ES_VALENCIA', 'goog.i18n.CompactNumberFormatSymbols_ca_FR', 'goog.i18n.CompactNumberFormatSymbols_ca_IT', 'goog.i18n.CompactNumberFormatSymbols_chr', 'goog.i18n.CompactNumberFormatSymbols_chr_US', 'goog.i18n.CompactNumberFormatSymbols_cs', 'goog.i18n.CompactNumberFormatSymbols_cs_CZ', 'goog.i18n.CompactNumberFormatSymbols_cy', 'goog.i18n.CompactNumberFormatSymbols_cy_GB', 'goog.i18n.CompactNumberFormatSymbols_da', 'goog.i18n.CompactNumberFormatSymbols_da_DK', 'goog.i18n.CompactNumberFormatSymbols_da_GL', 'goog.i18n.CompactNumberFormatSymbols_de', 'goog.i18n.CompactNumberFormatSymbols_de_AT', 'goog.i18n.CompactNumberFormatSymbols_de_BE', 'goog.i18n.CompactNumberFormatSymbols_de_CH', 'goog.i18n.CompactNumberFormatSymbols_de_DE', 'goog.i18n.CompactNumberFormatSymbols_de_LU', 'goog.i18n.CompactNumberFormatSymbols_el', 'goog.i18n.CompactNumberFormatSymbols_el_GR', 'goog.i18n.CompactNumberFormatSymbols_en', 'goog.i18n.CompactNumberFormatSymbols_en_001', 'goog.i18n.CompactNumberFormatSymbols_en_AS', 'goog.i18n.CompactNumberFormatSymbols_en_AU', 'goog.i18n.CompactNumberFormatSymbols_en_DG', 'goog.i18n.CompactNumberFormatSymbols_en_FM', 'goog.i18n.CompactNumberFormatSymbols_en_GB', 'goog.i18n.CompactNumberFormatSymbols_en_GU', 'goog.i18n.CompactNumberFormatSymbols_en_IE', 'goog.i18n.CompactNumberFormatSymbols_en_IN', 'goog.i18n.CompactNumberFormatSymbols_en_IO', 'goog.i18n.CompactNumberFormatSymbols_en_MH', 'goog.i18n.CompactNumberFormatSymbols_en_MP', 'goog.i18n.CompactNumberFormatSymbols_en_PR', 'goog.i18n.CompactNumberFormatSymbols_en_PW', 'goog.i18n.CompactNumberFormatSymbols_en_SG', 'goog.i18n.CompactNumberFormatSymbols_en_TC', 'goog.i18n.CompactNumberFormatSymbols_en_UM', 'goog.i18n.CompactNumberFormatSymbols_en_US', 'goog.i18n.CompactNumberFormatSymbols_en_VG', 'goog.i18n.CompactNumberFormatSymbols_en_VI', 'goog.i18n.CompactNumberFormatSymbols_en_ZA', 'goog.i18n.CompactNumberFormatSymbols_en_ZW', 'goog.i18n.CompactNumberFormatSymbols_es', 'goog.i18n.CompactNumberFormatSymbols_es_419', 'goog.i18n.CompactNumberFormatSymbols_es_EA', 'goog.i18n.CompactNumberFormatSymbols_es_ES', 'goog.i18n.CompactNumberFormatSymbols_es_IC', 'goog.i18n.CompactNumberFormatSymbols_et', 'goog.i18n.CompactNumberFormatSymbols_et_EE', 'goog.i18n.CompactNumberFormatSymbols_eu', 'goog.i18n.CompactNumberFormatSymbols_eu_ES', 'goog.i18n.CompactNumberFormatSymbols_fa', 'goog.i18n.CompactNumberFormatSymbols_fa_IR', 'goog.i18n.CompactNumberFormatSymbols_fi', 'goog.i18n.CompactNumberFormatSymbols_fi_FI', 'goog.i18n.CompactNumberFormatSymbols_fil', 'goog.i18n.CompactNumberFormatSymbols_fil_PH', 'goog.i18n.CompactNumberFormatSymbols_fr', 'goog.i18n.CompactNumberFormatSymbols_fr_BL', 'goog.i18n.CompactNumberFormatSymbols_fr_CA', 'goog.i18n.CompactNumberFormatSymbols_fr_FR', 'goog.i18n.CompactNumberFormatSymbols_fr_GF', 'goog.i18n.CompactNumberFormatSymbols_fr_GP', 'goog.i18n.CompactNumberFormatSymbols_fr_MC', 'goog.i18n.CompactNumberFormatSymbols_fr_MF', 'goog.i18n.CompactNumberFormatSymbols_fr_MQ', 'goog.i18n.CompactNumberFormatSymbols_fr_PM', 'goog.i18n.CompactNumberFormatSymbols_fr_RE', 'goog.i18n.CompactNumberFormatSymbols_fr_YT', 'goog.i18n.CompactNumberFormatSymbols_gl', 'goog.i18n.CompactNumberFormatSymbols_gl_ES', 'goog.i18n.CompactNumberFormatSymbols_gsw', 'goog.i18n.CompactNumberFormatSymbols_gsw_CH', 'goog.i18n.CompactNumberFormatSymbols_gsw_LI', 'goog.i18n.CompactNumberFormatSymbols_gu', 'goog.i18n.CompactNumberFormatSymbols_gu_IN', 'goog.i18n.CompactNumberFormatSymbols_haw', 'goog.i18n.CompactNumberFormatSymbols_haw_US', 'goog.i18n.CompactNumberFormatSymbols_he', 'goog.i18n.CompactNumberFormatSymbols_he_IL', 'goog.i18n.CompactNumberFormatSymbols_hi', 'goog.i18n.CompactNumberFormatSymbols_hi_IN', 'goog.i18n.CompactNumberFormatSymbols_hr', 'goog.i18n.CompactNumberFormatSymbols_hr_HR', 'goog.i18n.CompactNumberFormatSymbols_hu', 'goog.i18n.CompactNumberFormatSymbols_hu_HU', 'goog.i18n.CompactNumberFormatSymbols_hy', 'goog.i18n.CompactNumberFormatSymbols_hy_AM', 'goog.i18n.CompactNumberFormatSymbols_id', 'goog.i18n.CompactNumberFormatSymbols_id_ID', 'goog.i18n.CompactNumberFormatSymbols_in', 'goog.i18n.CompactNumberFormatSymbols_is', 'goog.i18n.CompactNumberFormatSymbols_is_IS', 'goog.i18n.CompactNumberFormatSymbols_it', 'goog.i18n.CompactNumberFormatSymbols_it_IT', 'goog.i18n.CompactNumberFormatSymbols_it_SM', 'goog.i18n.CompactNumberFormatSymbols_iw', 'goog.i18n.CompactNumberFormatSymbols_ja', 'goog.i18n.CompactNumberFormatSymbols_ja_JP', 'goog.i18n.CompactNumberFormatSymbols_ka', 'goog.i18n.CompactNumberFormatSymbols_ka_GE', 'goog.i18n.CompactNumberFormatSymbols_kk', 'goog.i18n.CompactNumberFormatSymbols_kk_Cyrl_KZ', 'goog.i18n.CompactNumberFormatSymbols_km', 'goog.i18n.CompactNumberFormatSymbols_km_KH', 'goog.i18n.CompactNumberFormatSymbols_kn', 'goog.i18n.CompactNumberFormatSymbols_kn_IN', 'goog.i18n.CompactNumberFormatSymbols_ko', 'goog.i18n.CompactNumberFormatSymbols_ko_KR', 'goog.i18n.CompactNumberFormatSymbols_ky', 'goog.i18n.CompactNumberFormatSymbols_ky_Cyrl_KG', 'goog.i18n.CompactNumberFormatSymbols_ln', 'goog.i18n.CompactNumberFormatSymbols_ln_CD', 'goog.i18n.CompactNumberFormatSymbols_lo', 'goog.i18n.CompactNumberFormatSymbols_lo_LA', 'goog.i18n.CompactNumberFormatSymbols_lt', 'goog.i18n.CompactNumberFormatSymbols_lt_LT', 'goog.i18n.CompactNumberFormatSymbols_lv', 'goog.i18n.CompactNumberFormatSymbols_lv_LV', 'goog.i18n.CompactNumberFormatSymbols_mk', 'goog.i18n.CompactNumberFormatSymbols_mk_MK', 'goog.i18n.CompactNumberFormatSymbols_ml', 'goog.i18n.CompactNumberFormatSymbols_ml_IN', 'goog.i18n.CompactNumberFormatSymbols_mn', 'goog.i18n.CompactNumberFormatSymbols_mn_Cyrl_MN', 'goog.i18n.CompactNumberFormatSymbols_mr', 'goog.i18n.CompactNumberFormatSymbols_mr_IN', 'goog.i18n.CompactNumberFormatSymbols_ms', 'goog.i18n.CompactNumberFormatSymbols_ms_Latn_MY', 'goog.i18n.CompactNumberFormatSymbols_mt', 'goog.i18n.CompactNumberFormatSymbols_mt_MT', 'goog.i18n.CompactNumberFormatSymbols_my', 'goog.i18n.CompactNumberFormatSymbols_my_MM', 'goog.i18n.CompactNumberFormatSymbols_nb', 'goog.i18n.CompactNumberFormatSymbols_nb_NO', 'goog.i18n.CompactNumberFormatSymbols_nb_SJ', 'goog.i18n.CompactNumberFormatSymbols_ne', 'goog.i18n.CompactNumberFormatSymbols_ne_NP', 'goog.i18n.CompactNumberFormatSymbols_nl', 'goog.i18n.CompactNumberFormatSymbols_nl_NL', 'goog.i18n.CompactNumberFormatSymbols_no', 'goog.i18n.CompactNumberFormatSymbols_no_NO', 'goog.i18n.CompactNumberFormatSymbols_or', 'goog.i18n.CompactNumberFormatSymbols_or_IN', 'goog.i18n.CompactNumberFormatSymbols_pa', 'goog.i18n.CompactNumberFormatSymbols_pa_Guru_IN', 'goog.i18n.CompactNumberFormatSymbols_pl', 'goog.i18n.CompactNumberFormatSymbols_pl_PL', 'goog.i18n.CompactNumberFormatSymbols_pt', 'goog.i18n.CompactNumberFormatSymbols_pt_BR', 'goog.i18n.CompactNumberFormatSymbols_pt_PT', 'goog.i18n.CompactNumberFormatSymbols_ro', 'goog.i18n.CompactNumberFormatSymbols_ro_RO', 'goog.i18n.CompactNumberFormatSymbols_ru', 'goog.i18n.CompactNumberFormatSymbols_ru_RU', 'goog.i18n.CompactNumberFormatSymbols_si', 'goog.i18n.CompactNumberFormatSymbols_si_LK', 'goog.i18n.CompactNumberFormatSymbols_sk', 'goog.i18n.CompactNumberFormatSymbols_sk_SK', 'goog.i18n.CompactNumberFormatSymbols_sl', 'goog.i18n.CompactNumberFormatSymbols_sl_SI', 'goog.i18n.CompactNumberFormatSymbols_sq', 'goog.i18n.CompactNumberFormatSymbols_sq_AL', 'goog.i18n.CompactNumberFormatSymbols_sr', 'goog.i18n.CompactNumberFormatSymbols_sr_Cyrl_RS', 'goog.i18n.CompactNumberFormatSymbols_sv', 'goog.i18n.CompactNumberFormatSymbols_sv_SE', 'goog.i18n.CompactNumberFormatSymbols_sw', 'goog.i18n.CompactNumberFormatSymbols_sw_TZ', 'goog.i18n.CompactNumberFormatSymbols_ta', 'goog.i18n.CompactNumberFormatSymbols_ta_IN', 'goog.i18n.CompactNumberFormatSymbols_te', 'goog.i18n.CompactNumberFormatSymbols_te_IN', 'goog.i18n.CompactNumberFormatSymbols_th', 'goog.i18n.CompactNumberFormatSymbols_th_TH', 'goog.i18n.CompactNumberFormatSymbols_tl', 'goog.i18n.CompactNumberFormatSymbols_tr', 'goog.i18n.CompactNumberFormatSymbols_tr_TR', 'goog.i18n.CompactNumberFormatSymbols_uk', 'goog.i18n.CompactNumberFormatSymbols_uk_UA', 'goog.i18n.CompactNumberFormatSymbols_ur', 'goog.i18n.CompactNumberFormatSymbols_ur_PK', 'goog.i18n.CompactNumberFormatSymbols_uz', 'goog.i18n.CompactNumberFormatSymbols_uz_Latn_UZ', 'goog.i18n.CompactNumberFormatSymbols_vi', 'goog.i18n.CompactNumberFormatSymbols_vi_VN', 'goog.i18n.CompactNumberFormatSymbols_zh', 'goog.i18n.CompactNumberFormatSymbols_zh_CN', 'goog.i18n.CompactNumberFormatSymbols_zh_HK', 'goog.i18n.CompactNumberFormatSymbols_zh_Hans_CN', 'goog.i18n.CompactNumberFormatSymbols_zh_TW', 'goog.i18n.CompactNumberFormatSymbols_zu', 'goog.i18n.CompactNumberFormatSymbols_zu_ZA'], []); +goog.addDependency('i18n/compactnumberformatsymbols_ext.js', ['goog.i18n.CompactNumberFormatSymbolsExt', 'goog.i18n.CompactNumberFormatSymbols_aa', 'goog.i18n.CompactNumberFormatSymbols_aa_DJ', 'goog.i18n.CompactNumberFormatSymbols_aa_ER', 'goog.i18n.CompactNumberFormatSymbols_aa_ET', 'goog.i18n.CompactNumberFormatSymbols_af_NA', 'goog.i18n.CompactNumberFormatSymbols_agq', 'goog.i18n.CompactNumberFormatSymbols_agq_CM', 'goog.i18n.CompactNumberFormatSymbols_ak', 'goog.i18n.CompactNumberFormatSymbols_ak_GH', 'goog.i18n.CompactNumberFormatSymbols_ar_AE', 'goog.i18n.CompactNumberFormatSymbols_ar_BH', 'goog.i18n.CompactNumberFormatSymbols_ar_DJ', 'goog.i18n.CompactNumberFormatSymbols_ar_DZ', 'goog.i18n.CompactNumberFormatSymbols_ar_EG', 'goog.i18n.CompactNumberFormatSymbols_ar_EH', 'goog.i18n.CompactNumberFormatSymbols_ar_ER', 'goog.i18n.CompactNumberFormatSymbols_ar_IL', 'goog.i18n.CompactNumberFormatSymbols_ar_IQ', 'goog.i18n.CompactNumberFormatSymbols_ar_JO', 'goog.i18n.CompactNumberFormatSymbols_ar_KM', 'goog.i18n.CompactNumberFormatSymbols_ar_KW', 'goog.i18n.CompactNumberFormatSymbols_ar_LB', 'goog.i18n.CompactNumberFormatSymbols_ar_LY', 'goog.i18n.CompactNumberFormatSymbols_ar_MA', 'goog.i18n.CompactNumberFormatSymbols_ar_MR', 'goog.i18n.CompactNumberFormatSymbols_ar_OM', 'goog.i18n.CompactNumberFormatSymbols_ar_PS', 'goog.i18n.CompactNumberFormatSymbols_ar_QA', 'goog.i18n.CompactNumberFormatSymbols_ar_SA', 'goog.i18n.CompactNumberFormatSymbols_ar_SD', 'goog.i18n.CompactNumberFormatSymbols_ar_SO', 'goog.i18n.CompactNumberFormatSymbols_ar_SS', 'goog.i18n.CompactNumberFormatSymbols_ar_SY', 'goog.i18n.CompactNumberFormatSymbols_ar_TD', 'goog.i18n.CompactNumberFormatSymbols_ar_TN', 'goog.i18n.CompactNumberFormatSymbols_ar_YE', 'goog.i18n.CompactNumberFormatSymbols_as', 'goog.i18n.CompactNumberFormatSymbols_as_IN', 'goog.i18n.CompactNumberFormatSymbols_asa', 'goog.i18n.CompactNumberFormatSymbols_asa_TZ', 'goog.i18n.CompactNumberFormatSymbols_ast', 'goog.i18n.CompactNumberFormatSymbols_ast_ES', 'goog.i18n.CompactNumberFormatSymbols_az_Cyrl', 'goog.i18n.CompactNumberFormatSymbols_az_Latn', 'goog.i18n.CompactNumberFormatSymbols_bas', 'goog.i18n.CompactNumberFormatSymbols_bas_CM', 'goog.i18n.CompactNumberFormatSymbols_be', 'goog.i18n.CompactNumberFormatSymbols_be_BY', 'goog.i18n.CompactNumberFormatSymbols_bem', 'goog.i18n.CompactNumberFormatSymbols_bem_ZM', 'goog.i18n.CompactNumberFormatSymbols_bez', 'goog.i18n.CompactNumberFormatSymbols_bez_TZ', 'goog.i18n.CompactNumberFormatSymbols_bm', 'goog.i18n.CompactNumberFormatSymbols_bm_ML', 'goog.i18n.CompactNumberFormatSymbols_bn_IN', 'goog.i18n.CompactNumberFormatSymbols_bo', 'goog.i18n.CompactNumberFormatSymbols_bo_CN', 'goog.i18n.CompactNumberFormatSymbols_bo_IN', 'goog.i18n.CompactNumberFormatSymbols_brx', 'goog.i18n.CompactNumberFormatSymbols_brx_IN', 'goog.i18n.CompactNumberFormatSymbols_bs', 'goog.i18n.CompactNumberFormatSymbols_bs_Cyrl', 'goog.i18n.CompactNumberFormatSymbols_bs_Cyrl_BA', 'goog.i18n.CompactNumberFormatSymbols_bs_Latn', 'goog.i18n.CompactNumberFormatSymbols_bs_Latn_BA', 'goog.i18n.CompactNumberFormatSymbols_byn', 'goog.i18n.CompactNumberFormatSymbols_byn_ER', 'goog.i18n.CompactNumberFormatSymbols_cgg', 'goog.i18n.CompactNumberFormatSymbols_cgg_UG', 'goog.i18n.CompactNumberFormatSymbols_ckb', 'goog.i18n.CompactNumberFormatSymbols_ckb_Arab', 'goog.i18n.CompactNumberFormatSymbols_ckb_Arab_IQ', 'goog.i18n.CompactNumberFormatSymbols_ckb_Arab_IR', 'goog.i18n.CompactNumberFormatSymbols_ckb_IQ', 'goog.i18n.CompactNumberFormatSymbols_ckb_IR', 'goog.i18n.CompactNumberFormatSymbols_ckb_Latn', 'goog.i18n.CompactNumberFormatSymbols_ckb_Latn_IQ', 'goog.i18n.CompactNumberFormatSymbols_dav', 'goog.i18n.CompactNumberFormatSymbols_dav_KE', 'goog.i18n.CompactNumberFormatSymbols_de_LI', 'goog.i18n.CompactNumberFormatSymbols_dje', 'goog.i18n.CompactNumberFormatSymbols_dje_NE', 'goog.i18n.CompactNumberFormatSymbols_dua', 'goog.i18n.CompactNumberFormatSymbols_dua_CM', 'goog.i18n.CompactNumberFormatSymbols_dyo', 'goog.i18n.CompactNumberFormatSymbols_dyo_SN', 'goog.i18n.CompactNumberFormatSymbols_dz', 'goog.i18n.CompactNumberFormatSymbols_dz_BT', 'goog.i18n.CompactNumberFormatSymbols_ebu', 'goog.i18n.CompactNumberFormatSymbols_ebu_KE', 'goog.i18n.CompactNumberFormatSymbols_ee', 'goog.i18n.CompactNumberFormatSymbols_ee_GH', 'goog.i18n.CompactNumberFormatSymbols_ee_TG', 'goog.i18n.CompactNumberFormatSymbols_el_CY', 'goog.i18n.CompactNumberFormatSymbols_en_150', 'goog.i18n.CompactNumberFormatSymbols_en_AG', 'goog.i18n.CompactNumberFormatSymbols_en_AI', 'goog.i18n.CompactNumberFormatSymbols_en_BB', 'goog.i18n.CompactNumberFormatSymbols_en_BE', 'goog.i18n.CompactNumberFormatSymbols_en_BM', 'goog.i18n.CompactNumberFormatSymbols_en_BS', 'goog.i18n.CompactNumberFormatSymbols_en_BW', 'goog.i18n.CompactNumberFormatSymbols_en_BZ', 'goog.i18n.CompactNumberFormatSymbols_en_CA', 'goog.i18n.CompactNumberFormatSymbols_en_CC', 'goog.i18n.CompactNumberFormatSymbols_en_CK', 'goog.i18n.CompactNumberFormatSymbols_en_CM', 'goog.i18n.CompactNumberFormatSymbols_en_CX', 'goog.i18n.CompactNumberFormatSymbols_en_DM', 'goog.i18n.CompactNumberFormatSymbols_en_ER', 'goog.i18n.CompactNumberFormatSymbols_en_FJ', 'goog.i18n.CompactNumberFormatSymbols_en_FK', 'goog.i18n.CompactNumberFormatSymbols_en_GD', 'goog.i18n.CompactNumberFormatSymbols_en_GG', 'goog.i18n.CompactNumberFormatSymbols_en_GH', 'goog.i18n.CompactNumberFormatSymbols_en_GI', 'goog.i18n.CompactNumberFormatSymbols_en_GM', 'goog.i18n.CompactNumberFormatSymbols_en_GY', 'goog.i18n.CompactNumberFormatSymbols_en_HK', 'goog.i18n.CompactNumberFormatSymbols_en_IM', 'goog.i18n.CompactNumberFormatSymbols_en_JE', 'goog.i18n.CompactNumberFormatSymbols_en_JM', 'goog.i18n.CompactNumberFormatSymbols_en_KE', 'goog.i18n.CompactNumberFormatSymbols_en_KI', 'goog.i18n.CompactNumberFormatSymbols_en_KN', 'goog.i18n.CompactNumberFormatSymbols_en_KY', 'goog.i18n.CompactNumberFormatSymbols_en_LC', 'goog.i18n.CompactNumberFormatSymbols_en_LR', 'goog.i18n.CompactNumberFormatSymbols_en_LS', 'goog.i18n.CompactNumberFormatSymbols_en_MG', 'goog.i18n.CompactNumberFormatSymbols_en_MO', 'goog.i18n.CompactNumberFormatSymbols_en_MS', 'goog.i18n.CompactNumberFormatSymbols_en_MT', 'goog.i18n.CompactNumberFormatSymbols_en_MU', 'goog.i18n.CompactNumberFormatSymbols_en_MW', 'goog.i18n.CompactNumberFormatSymbols_en_NA', 'goog.i18n.CompactNumberFormatSymbols_en_NF', 'goog.i18n.CompactNumberFormatSymbols_en_NG', 'goog.i18n.CompactNumberFormatSymbols_en_NR', 'goog.i18n.CompactNumberFormatSymbols_en_NU', 'goog.i18n.CompactNumberFormatSymbols_en_NZ', 'goog.i18n.CompactNumberFormatSymbols_en_PG', 'goog.i18n.CompactNumberFormatSymbols_en_PH', 'goog.i18n.CompactNumberFormatSymbols_en_PK', 'goog.i18n.CompactNumberFormatSymbols_en_PN', 'goog.i18n.CompactNumberFormatSymbols_en_RW', 'goog.i18n.CompactNumberFormatSymbols_en_SB', 'goog.i18n.CompactNumberFormatSymbols_en_SC', 'goog.i18n.CompactNumberFormatSymbols_en_SD', 'goog.i18n.CompactNumberFormatSymbols_en_SH', 'goog.i18n.CompactNumberFormatSymbols_en_SL', 'goog.i18n.CompactNumberFormatSymbols_en_SS', 'goog.i18n.CompactNumberFormatSymbols_en_SX', 'goog.i18n.CompactNumberFormatSymbols_en_SZ', 'goog.i18n.CompactNumberFormatSymbols_en_TK', 'goog.i18n.CompactNumberFormatSymbols_en_TO', 'goog.i18n.CompactNumberFormatSymbols_en_TT', 'goog.i18n.CompactNumberFormatSymbols_en_TV', 'goog.i18n.CompactNumberFormatSymbols_en_TZ', 'goog.i18n.CompactNumberFormatSymbols_en_UG', 'goog.i18n.CompactNumberFormatSymbols_en_VC', 'goog.i18n.CompactNumberFormatSymbols_en_VU', 'goog.i18n.CompactNumberFormatSymbols_en_WS', 'goog.i18n.CompactNumberFormatSymbols_en_ZM', 'goog.i18n.CompactNumberFormatSymbols_eo', 'goog.i18n.CompactNumberFormatSymbols_eo_001', 'goog.i18n.CompactNumberFormatSymbols_es_AR', 'goog.i18n.CompactNumberFormatSymbols_es_BO', 'goog.i18n.CompactNumberFormatSymbols_es_CL', 'goog.i18n.CompactNumberFormatSymbols_es_CO', 'goog.i18n.CompactNumberFormatSymbols_es_CR', 'goog.i18n.CompactNumberFormatSymbols_es_CU', 'goog.i18n.CompactNumberFormatSymbols_es_DO', 'goog.i18n.CompactNumberFormatSymbols_es_EC', 'goog.i18n.CompactNumberFormatSymbols_es_GQ', 'goog.i18n.CompactNumberFormatSymbols_es_GT', 'goog.i18n.CompactNumberFormatSymbols_es_HN', 'goog.i18n.CompactNumberFormatSymbols_es_MX', 'goog.i18n.CompactNumberFormatSymbols_es_NI', 'goog.i18n.CompactNumberFormatSymbols_es_PA', 'goog.i18n.CompactNumberFormatSymbols_es_PE', 'goog.i18n.CompactNumberFormatSymbols_es_PH', 'goog.i18n.CompactNumberFormatSymbols_es_PR', 'goog.i18n.CompactNumberFormatSymbols_es_PY', 'goog.i18n.CompactNumberFormatSymbols_es_SV', 'goog.i18n.CompactNumberFormatSymbols_es_US', 'goog.i18n.CompactNumberFormatSymbols_es_UY', 'goog.i18n.CompactNumberFormatSymbols_es_VE', 'goog.i18n.CompactNumberFormatSymbols_ewo', 'goog.i18n.CompactNumberFormatSymbols_ewo_CM', 'goog.i18n.CompactNumberFormatSymbols_fa_AF', 'goog.i18n.CompactNumberFormatSymbols_ff', 'goog.i18n.CompactNumberFormatSymbols_ff_CM', 'goog.i18n.CompactNumberFormatSymbols_ff_GN', 'goog.i18n.CompactNumberFormatSymbols_ff_MR', 'goog.i18n.CompactNumberFormatSymbols_ff_SN', 'goog.i18n.CompactNumberFormatSymbols_fo', 'goog.i18n.CompactNumberFormatSymbols_fo_FO', 'goog.i18n.CompactNumberFormatSymbols_fr_BE', 'goog.i18n.CompactNumberFormatSymbols_fr_BF', 'goog.i18n.CompactNumberFormatSymbols_fr_BI', 'goog.i18n.CompactNumberFormatSymbols_fr_BJ', 'goog.i18n.CompactNumberFormatSymbols_fr_CD', 'goog.i18n.CompactNumberFormatSymbols_fr_CF', 'goog.i18n.CompactNumberFormatSymbols_fr_CG', 'goog.i18n.CompactNumberFormatSymbols_fr_CH', 'goog.i18n.CompactNumberFormatSymbols_fr_CI', 'goog.i18n.CompactNumberFormatSymbols_fr_CM', 'goog.i18n.CompactNumberFormatSymbols_fr_DJ', 'goog.i18n.CompactNumberFormatSymbols_fr_DZ', 'goog.i18n.CompactNumberFormatSymbols_fr_GA', 'goog.i18n.CompactNumberFormatSymbols_fr_GN', 'goog.i18n.CompactNumberFormatSymbols_fr_GQ', 'goog.i18n.CompactNumberFormatSymbols_fr_HT', 'goog.i18n.CompactNumberFormatSymbols_fr_KM', 'goog.i18n.CompactNumberFormatSymbols_fr_LU', 'goog.i18n.CompactNumberFormatSymbols_fr_MA', 'goog.i18n.CompactNumberFormatSymbols_fr_MG', 'goog.i18n.CompactNumberFormatSymbols_fr_ML', 'goog.i18n.CompactNumberFormatSymbols_fr_MR', 'goog.i18n.CompactNumberFormatSymbols_fr_MU', 'goog.i18n.CompactNumberFormatSymbols_fr_NC', 'goog.i18n.CompactNumberFormatSymbols_fr_NE', 'goog.i18n.CompactNumberFormatSymbols_fr_PF', 'goog.i18n.CompactNumberFormatSymbols_fr_RW', 'goog.i18n.CompactNumberFormatSymbols_fr_SC', 'goog.i18n.CompactNumberFormatSymbols_fr_SN', 'goog.i18n.CompactNumberFormatSymbols_fr_SY', 'goog.i18n.CompactNumberFormatSymbols_fr_TD', 'goog.i18n.CompactNumberFormatSymbols_fr_TG', 'goog.i18n.CompactNumberFormatSymbols_fr_TN', 'goog.i18n.CompactNumberFormatSymbols_fr_VU', 'goog.i18n.CompactNumberFormatSymbols_fr_WF', 'goog.i18n.CompactNumberFormatSymbols_fur', 'goog.i18n.CompactNumberFormatSymbols_fur_IT', 'goog.i18n.CompactNumberFormatSymbols_fy', 'goog.i18n.CompactNumberFormatSymbols_fy_NL', 'goog.i18n.CompactNumberFormatSymbols_ga', 'goog.i18n.CompactNumberFormatSymbols_ga_IE', 'goog.i18n.CompactNumberFormatSymbols_gd', 'goog.i18n.CompactNumberFormatSymbols_gd_GB', 'goog.i18n.CompactNumberFormatSymbols_guz', 'goog.i18n.CompactNumberFormatSymbols_guz_KE', 'goog.i18n.CompactNumberFormatSymbols_gv', 'goog.i18n.CompactNumberFormatSymbols_gv_IM', 'goog.i18n.CompactNumberFormatSymbols_ha', 'goog.i18n.CompactNumberFormatSymbols_ha_Latn', 'goog.i18n.CompactNumberFormatSymbols_ha_Latn_GH', 'goog.i18n.CompactNumberFormatSymbols_ha_Latn_NE', 'goog.i18n.CompactNumberFormatSymbols_ha_Latn_NG', 'goog.i18n.CompactNumberFormatSymbols_hr_BA', 'goog.i18n.CompactNumberFormatSymbols_ia', 'goog.i18n.CompactNumberFormatSymbols_ia_FR', 'goog.i18n.CompactNumberFormatSymbols_ig', 'goog.i18n.CompactNumberFormatSymbols_ig_NG', 'goog.i18n.CompactNumberFormatSymbols_ii', 'goog.i18n.CompactNumberFormatSymbols_ii_CN', 'goog.i18n.CompactNumberFormatSymbols_it_CH', 'goog.i18n.CompactNumberFormatSymbols_jgo', 'goog.i18n.CompactNumberFormatSymbols_jgo_CM', 'goog.i18n.CompactNumberFormatSymbols_jmc', 'goog.i18n.CompactNumberFormatSymbols_jmc_TZ', 'goog.i18n.CompactNumberFormatSymbols_kab', 'goog.i18n.CompactNumberFormatSymbols_kab_DZ', 'goog.i18n.CompactNumberFormatSymbols_kam', 'goog.i18n.CompactNumberFormatSymbols_kam_KE', 'goog.i18n.CompactNumberFormatSymbols_kde', 'goog.i18n.CompactNumberFormatSymbols_kde_TZ', 'goog.i18n.CompactNumberFormatSymbols_kea', 'goog.i18n.CompactNumberFormatSymbols_kea_CV', 'goog.i18n.CompactNumberFormatSymbols_khq', 'goog.i18n.CompactNumberFormatSymbols_khq_ML', 'goog.i18n.CompactNumberFormatSymbols_ki', 'goog.i18n.CompactNumberFormatSymbols_ki_KE', 'goog.i18n.CompactNumberFormatSymbols_kk_Cyrl', 'goog.i18n.CompactNumberFormatSymbols_kkj', 'goog.i18n.CompactNumberFormatSymbols_kkj_CM', 'goog.i18n.CompactNumberFormatSymbols_kl', 'goog.i18n.CompactNumberFormatSymbols_kl_GL', 'goog.i18n.CompactNumberFormatSymbols_kln', 'goog.i18n.CompactNumberFormatSymbols_kln_KE', 'goog.i18n.CompactNumberFormatSymbols_ko_KP', 'goog.i18n.CompactNumberFormatSymbols_kok', 'goog.i18n.CompactNumberFormatSymbols_kok_IN', 'goog.i18n.CompactNumberFormatSymbols_ks', 'goog.i18n.CompactNumberFormatSymbols_ks_Arab', 'goog.i18n.CompactNumberFormatSymbols_ks_Arab_IN', 'goog.i18n.CompactNumberFormatSymbols_ksb', 'goog.i18n.CompactNumberFormatSymbols_ksb_TZ', 'goog.i18n.CompactNumberFormatSymbols_ksf', 'goog.i18n.CompactNumberFormatSymbols_ksf_CM', 'goog.i18n.CompactNumberFormatSymbols_ksh', 'goog.i18n.CompactNumberFormatSymbols_ksh_DE', 'goog.i18n.CompactNumberFormatSymbols_kw', 'goog.i18n.CompactNumberFormatSymbols_kw_GB', 'goog.i18n.CompactNumberFormatSymbols_ky_Cyrl', 'goog.i18n.CompactNumberFormatSymbols_lag', 'goog.i18n.CompactNumberFormatSymbols_lag_TZ', 'goog.i18n.CompactNumberFormatSymbols_lg', 'goog.i18n.CompactNumberFormatSymbols_lg_UG', 'goog.i18n.CompactNumberFormatSymbols_lkt', 'goog.i18n.CompactNumberFormatSymbols_lkt_US', 'goog.i18n.CompactNumberFormatSymbols_ln_AO', 'goog.i18n.CompactNumberFormatSymbols_ln_CF', 'goog.i18n.CompactNumberFormatSymbols_ln_CG', 'goog.i18n.CompactNumberFormatSymbols_lu', 'goog.i18n.CompactNumberFormatSymbols_lu_CD', 'goog.i18n.CompactNumberFormatSymbols_luo', 'goog.i18n.CompactNumberFormatSymbols_luo_KE', 'goog.i18n.CompactNumberFormatSymbols_luy', 'goog.i18n.CompactNumberFormatSymbols_luy_KE', 'goog.i18n.CompactNumberFormatSymbols_mas', 'goog.i18n.CompactNumberFormatSymbols_mas_KE', 'goog.i18n.CompactNumberFormatSymbols_mas_TZ', 'goog.i18n.CompactNumberFormatSymbols_mer', 'goog.i18n.CompactNumberFormatSymbols_mer_KE', 'goog.i18n.CompactNumberFormatSymbols_mfe', 'goog.i18n.CompactNumberFormatSymbols_mfe_MU', 'goog.i18n.CompactNumberFormatSymbols_mg', 'goog.i18n.CompactNumberFormatSymbols_mg_MG', 'goog.i18n.CompactNumberFormatSymbols_mgh', 'goog.i18n.CompactNumberFormatSymbols_mgh_MZ', 'goog.i18n.CompactNumberFormatSymbols_mgo', 'goog.i18n.CompactNumberFormatSymbols_mgo_CM', 'goog.i18n.CompactNumberFormatSymbols_mn_Cyrl', 'goog.i18n.CompactNumberFormatSymbols_ms_Latn', 'goog.i18n.CompactNumberFormatSymbols_ms_Latn_BN', 'goog.i18n.CompactNumberFormatSymbols_ms_Latn_SG', 'goog.i18n.CompactNumberFormatSymbols_mua', 'goog.i18n.CompactNumberFormatSymbols_mua_CM', 'goog.i18n.CompactNumberFormatSymbols_naq', 'goog.i18n.CompactNumberFormatSymbols_naq_NA', 'goog.i18n.CompactNumberFormatSymbols_nd', 'goog.i18n.CompactNumberFormatSymbols_nd_ZW', 'goog.i18n.CompactNumberFormatSymbols_ne_IN', 'goog.i18n.CompactNumberFormatSymbols_nl_AW', 'goog.i18n.CompactNumberFormatSymbols_nl_BE', 'goog.i18n.CompactNumberFormatSymbols_nl_BQ', 'goog.i18n.CompactNumberFormatSymbols_nl_CW', 'goog.i18n.CompactNumberFormatSymbols_nl_SR', 'goog.i18n.CompactNumberFormatSymbols_nl_SX', 'goog.i18n.CompactNumberFormatSymbols_nmg', 'goog.i18n.CompactNumberFormatSymbols_nmg_CM', 'goog.i18n.CompactNumberFormatSymbols_nn', 'goog.i18n.CompactNumberFormatSymbols_nn_NO', 'goog.i18n.CompactNumberFormatSymbols_nnh', 'goog.i18n.CompactNumberFormatSymbols_nnh_CM', 'goog.i18n.CompactNumberFormatSymbols_nr', 'goog.i18n.CompactNumberFormatSymbols_nr_ZA', 'goog.i18n.CompactNumberFormatSymbols_nso', 'goog.i18n.CompactNumberFormatSymbols_nso_ZA', 'goog.i18n.CompactNumberFormatSymbols_nus', 'goog.i18n.CompactNumberFormatSymbols_nus_SD', 'goog.i18n.CompactNumberFormatSymbols_nyn', 'goog.i18n.CompactNumberFormatSymbols_nyn_UG', 'goog.i18n.CompactNumberFormatSymbols_om', 'goog.i18n.CompactNumberFormatSymbols_om_ET', 'goog.i18n.CompactNumberFormatSymbols_om_KE', 'goog.i18n.CompactNumberFormatSymbols_os', 'goog.i18n.CompactNumberFormatSymbols_os_GE', 'goog.i18n.CompactNumberFormatSymbols_os_RU', 'goog.i18n.CompactNumberFormatSymbols_pa_Arab', 'goog.i18n.CompactNumberFormatSymbols_pa_Arab_PK', 'goog.i18n.CompactNumberFormatSymbols_pa_Guru', 'goog.i18n.CompactNumberFormatSymbols_ps', 'goog.i18n.CompactNumberFormatSymbols_ps_AF', 'goog.i18n.CompactNumberFormatSymbols_pt_AO', 'goog.i18n.CompactNumberFormatSymbols_pt_CV', 'goog.i18n.CompactNumberFormatSymbols_pt_GW', 'goog.i18n.CompactNumberFormatSymbols_pt_MO', 'goog.i18n.CompactNumberFormatSymbols_pt_MZ', 'goog.i18n.CompactNumberFormatSymbols_pt_ST', 'goog.i18n.CompactNumberFormatSymbols_pt_TL', 'goog.i18n.CompactNumberFormatSymbols_rm', 'goog.i18n.CompactNumberFormatSymbols_rm_CH', 'goog.i18n.CompactNumberFormatSymbols_rn', 'goog.i18n.CompactNumberFormatSymbols_rn_BI', 'goog.i18n.CompactNumberFormatSymbols_ro_MD', 'goog.i18n.CompactNumberFormatSymbols_rof', 'goog.i18n.CompactNumberFormatSymbols_rof_TZ', 'goog.i18n.CompactNumberFormatSymbols_ru_BY', 'goog.i18n.CompactNumberFormatSymbols_ru_KG', 'goog.i18n.CompactNumberFormatSymbols_ru_KZ', 'goog.i18n.CompactNumberFormatSymbols_ru_MD', 'goog.i18n.CompactNumberFormatSymbols_ru_UA', 'goog.i18n.CompactNumberFormatSymbols_rw', 'goog.i18n.CompactNumberFormatSymbols_rw_RW', 'goog.i18n.CompactNumberFormatSymbols_rwk', 'goog.i18n.CompactNumberFormatSymbols_rwk_TZ', 'goog.i18n.CompactNumberFormatSymbols_sah', 'goog.i18n.CompactNumberFormatSymbols_sah_RU', 'goog.i18n.CompactNumberFormatSymbols_saq', 'goog.i18n.CompactNumberFormatSymbols_saq_KE', 'goog.i18n.CompactNumberFormatSymbols_sbp', 'goog.i18n.CompactNumberFormatSymbols_sbp_TZ', 'goog.i18n.CompactNumberFormatSymbols_se', 'goog.i18n.CompactNumberFormatSymbols_se_FI', 'goog.i18n.CompactNumberFormatSymbols_se_NO', 'goog.i18n.CompactNumberFormatSymbols_seh', 'goog.i18n.CompactNumberFormatSymbols_seh_MZ', 'goog.i18n.CompactNumberFormatSymbols_ses', 'goog.i18n.CompactNumberFormatSymbols_ses_ML', 'goog.i18n.CompactNumberFormatSymbols_sg', 'goog.i18n.CompactNumberFormatSymbols_sg_CF', 'goog.i18n.CompactNumberFormatSymbols_shi', 'goog.i18n.CompactNumberFormatSymbols_shi_Latn', 'goog.i18n.CompactNumberFormatSymbols_shi_Latn_MA', 'goog.i18n.CompactNumberFormatSymbols_shi_Tfng', 'goog.i18n.CompactNumberFormatSymbols_shi_Tfng_MA', 'goog.i18n.CompactNumberFormatSymbols_sn', 'goog.i18n.CompactNumberFormatSymbols_sn_ZW', 'goog.i18n.CompactNumberFormatSymbols_so', 'goog.i18n.CompactNumberFormatSymbols_so_DJ', 'goog.i18n.CompactNumberFormatSymbols_so_ET', 'goog.i18n.CompactNumberFormatSymbols_so_KE', 'goog.i18n.CompactNumberFormatSymbols_so_SO', 'goog.i18n.CompactNumberFormatSymbols_sq_MK', 'goog.i18n.CompactNumberFormatSymbols_sq_XK', 'goog.i18n.CompactNumberFormatSymbols_sr_Cyrl', 'goog.i18n.CompactNumberFormatSymbols_sr_Cyrl_BA', 'goog.i18n.CompactNumberFormatSymbols_sr_Cyrl_ME', 'goog.i18n.CompactNumberFormatSymbols_sr_Cyrl_XK', 'goog.i18n.CompactNumberFormatSymbols_sr_Latn', 'goog.i18n.CompactNumberFormatSymbols_sr_Latn_BA', 'goog.i18n.CompactNumberFormatSymbols_sr_Latn_ME', 'goog.i18n.CompactNumberFormatSymbols_sr_Latn_RS', 'goog.i18n.CompactNumberFormatSymbols_sr_Latn_XK', 'goog.i18n.CompactNumberFormatSymbols_ss', 'goog.i18n.CompactNumberFormatSymbols_ss_SZ', 'goog.i18n.CompactNumberFormatSymbols_ss_ZA', 'goog.i18n.CompactNumberFormatSymbols_ssy', 'goog.i18n.CompactNumberFormatSymbols_ssy_ER', 'goog.i18n.CompactNumberFormatSymbols_st', 'goog.i18n.CompactNumberFormatSymbols_st_LS', 'goog.i18n.CompactNumberFormatSymbols_st_ZA', 'goog.i18n.CompactNumberFormatSymbols_sv_AX', 'goog.i18n.CompactNumberFormatSymbols_sv_FI', 'goog.i18n.CompactNumberFormatSymbols_sw_KE', 'goog.i18n.CompactNumberFormatSymbols_sw_UG', 'goog.i18n.CompactNumberFormatSymbols_swc', 'goog.i18n.CompactNumberFormatSymbols_swc_CD', 'goog.i18n.CompactNumberFormatSymbols_ta_LK', 'goog.i18n.CompactNumberFormatSymbols_ta_MY', 'goog.i18n.CompactNumberFormatSymbols_ta_SG', 'goog.i18n.CompactNumberFormatSymbols_teo', 'goog.i18n.CompactNumberFormatSymbols_teo_KE', 'goog.i18n.CompactNumberFormatSymbols_teo_UG', 'goog.i18n.CompactNumberFormatSymbols_tg', 'goog.i18n.CompactNumberFormatSymbols_tg_Cyrl', 'goog.i18n.CompactNumberFormatSymbols_tg_Cyrl_TJ', 'goog.i18n.CompactNumberFormatSymbols_ti', 'goog.i18n.CompactNumberFormatSymbols_ti_ER', 'goog.i18n.CompactNumberFormatSymbols_ti_ET', 'goog.i18n.CompactNumberFormatSymbols_tig', 'goog.i18n.CompactNumberFormatSymbols_tig_ER', 'goog.i18n.CompactNumberFormatSymbols_tn', 'goog.i18n.CompactNumberFormatSymbols_tn_BW', 'goog.i18n.CompactNumberFormatSymbols_tn_ZA', 'goog.i18n.CompactNumberFormatSymbols_to', 'goog.i18n.CompactNumberFormatSymbols_to_TO', 'goog.i18n.CompactNumberFormatSymbols_tr_CY', 'goog.i18n.CompactNumberFormatSymbols_ts', 'goog.i18n.CompactNumberFormatSymbols_ts_ZA', 'goog.i18n.CompactNumberFormatSymbols_twq', 'goog.i18n.CompactNumberFormatSymbols_twq_NE', 'goog.i18n.CompactNumberFormatSymbols_tzm', 'goog.i18n.CompactNumberFormatSymbols_tzm_Latn', 'goog.i18n.CompactNumberFormatSymbols_tzm_Latn_MA', 'goog.i18n.CompactNumberFormatSymbols_ug', 'goog.i18n.CompactNumberFormatSymbols_ug_Arab', 'goog.i18n.CompactNumberFormatSymbols_ug_Arab_CN', 'goog.i18n.CompactNumberFormatSymbols_ur_IN', 'goog.i18n.CompactNumberFormatSymbols_uz_Arab', 'goog.i18n.CompactNumberFormatSymbols_uz_Arab_AF', 'goog.i18n.CompactNumberFormatSymbols_uz_Cyrl', 'goog.i18n.CompactNumberFormatSymbols_uz_Cyrl_UZ', 'goog.i18n.CompactNumberFormatSymbols_uz_Latn', 'goog.i18n.CompactNumberFormatSymbols_vai', 'goog.i18n.CompactNumberFormatSymbols_vai_Latn', 'goog.i18n.CompactNumberFormatSymbols_vai_Latn_LR', 'goog.i18n.CompactNumberFormatSymbols_vai_Vaii', 'goog.i18n.CompactNumberFormatSymbols_vai_Vaii_LR', 'goog.i18n.CompactNumberFormatSymbols_ve', 'goog.i18n.CompactNumberFormatSymbols_ve_ZA', 'goog.i18n.CompactNumberFormatSymbols_vo', 'goog.i18n.CompactNumberFormatSymbols_vo_001', 'goog.i18n.CompactNumberFormatSymbols_vun', 'goog.i18n.CompactNumberFormatSymbols_vun_TZ', 'goog.i18n.CompactNumberFormatSymbols_wae', 'goog.i18n.CompactNumberFormatSymbols_wae_CH', 'goog.i18n.CompactNumberFormatSymbols_wal', 'goog.i18n.CompactNumberFormatSymbols_wal_ET', 'goog.i18n.CompactNumberFormatSymbols_xh', 'goog.i18n.CompactNumberFormatSymbols_xh_ZA', 'goog.i18n.CompactNumberFormatSymbols_xog', 'goog.i18n.CompactNumberFormatSymbols_xog_UG', 'goog.i18n.CompactNumberFormatSymbols_yav', 'goog.i18n.CompactNumberFormatSymbols_yav_CM', 'goog.i18n.CompactNumberFormatSymbols_yo', 'goog.i18n.CompactNumberFormatSymbols_yo_BJ', 'goog.i18n.CompactNumberFormatSymbols_yo_NG', 'goog.i18n.CompactNumberFormatSymbols_zgh', 'goog.i18n.CompactNumberFormatSymbols_zgh_MA', 'goog.i18n.CompactNumberFormatSymbols_zh_Hans', 'goog.i18n.CompactNumberFormatSymbols_zh_Hans_HK', 'goog.i18n.CompactNumberFormatSymbols_zh_Hans_MO', 'goog.i18n.CompactNumberFormatSymbols_zh_Hans_SG', 'goog.i18n.CompactNumberFormatSymbols_zh_Hant', 'goog.i18n.CompactNumberFormatSymbols_zh_Hant_HK', 'goog.i18n.CompactNumberFormatSymbols_zh_Hant_MO', 'goog.i18n.CompactNumberFormatSymbols_zh_Hant_TW'], []); goog.addDependency('i18n/currency.js', ['goog.i18n.currency', 'goog.i18n.currency.CurrencyInfo', 'goog.i18n.currency.CurrencyInfoTier2'], []); +goog.addDependency('i18n/currency_test.js', ['goog.i18n.currencyTest'], ['goog.i18n.NumberFormat', 'goog.i18n.currency', 'goog.i18n.currency.CurrencyInfo', 'goog.object', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit']); goog.addDependency('i18n/currencycodemap.js', ['goog.i18n.currencyCodeMap', 'goog.i18n.currencyCodeMapTier2'], []); -goog.addDependency('i18n/datetimeformat.js', ['goog.i18n.DateTimeFormat', 'goog.i18n.DateTimeFormat.Format'], ['goog.asserts', 'goog.i18n.DateTimeSymbols', 'goog.i18n.TimeZone', 'goog.string']); -goog.addDependency('i18n/datetimeparse.js', ['goog.i18n.DateTimeParse'], ['goog.i18n.DateTimeFormat', 'goog.i18n.DateTimeSymbols']); -goog.addDependency('i18n/datetimepatterns.js', ['goog.i18n.DateTimePatterns', 'goog.i18n.DateTimePatterns_af', 'goog.i18n.DateTimePatterns_am', 'goog.i18n.DateTimePatterns_ar', 'goog.i18n.DateTimePatterns_bg', 'goog.i18n.DateTimePatterns_bn', 'goog.i18n.DateTimePatterns_br', 'goog.i18n.DateTimePatterns_ca', 'goog.i18n.DateTimePatterns_chr', 'goog.i18n.DateTimePatterns_cs', 'goog.i18n.DateTimePatterns_cy', 'goog.i18n.DateTimePatterns_da', 'goog.i18n.DateTimePatterns_de', 'goog.i18n.DateTimePatterns_de_AT', 'goog.i18n.DateTimePatterns_de_CH', 'goog.i18n.DateTimePatterns_el', 'goog.i18n.DateTimePatterns_en', 'goog.i18n.DateTimePatterns_en_AU', 'goog.i18n.DateTimePatterns_en_GB', 'goog.i18n.DateTimePatterns_en_IE', 'goog.i18n.DateTimePatterns_en_IN', 'goog.i18n.DateTimePatterns_en_SG', 'goog.i18n.DateTimePatterns_en_US', 'goog.i18n.DateTimePatterns_en_ZA', 'goog.i18n.DateTimePatterns_es', 'goog.i18n.DateTimePatterns_es_419', 'goog.i18n.DateTimePatterns_es_ES', 'goog.i18n.DateTimePatterns_et', 'goog.i18n.DateTimePatterns_eu', 'goog.i18n.DateTimePatterns_fa', 'goog.i18n.DateTimePatterns_fi', 'goog.i18n.DateTimePatterns_fil', 'goog.i18n.DateTimePatterns_fr', 'goog.i18n.DateTimePatterns_fr_CA', 'goog.i18n.DateTimePatterns_gl', 'goog.i18n.DateTimePatterns_gsw', 'goog.i18n.DateTimePatterns_gu', 'goog.i18n.DateTimePatterns_haw', 'goog.i18n.DateTimePatterns_he', 'goog.i18n.DateTimePatterns_hi', 'goog.i18n.DateTimePatterns_hr', 'goog.i18n.DateTimePatterns_hu', 'goog.i18n.DateTimePatterns_id', 'goog.i18n.DateTimePatterns_in', 'goog.i18n.DateTimePatterns_is', 'goog.i18n.DateTimePatterns_it', 'goog.i18n.DateTimePatterns_iw', 'goog.i18n.DateTimePatterns_ja', 'goog.i18n.DateTimePatterns_kn', 'goog.i18n.DateTimePatterns_ko', 'goog.i18n.DateTimePatterns_ln', 'goog.i18n.DateTimePatterns_lt', 'goog.i18n.DateTimePatterns_lv', 'goog.i18n.DateTimePatterns_ml', 'goog.i18n.DateTimePatterns_mo', 'goog.i18n.DateTimePatterns_mr', 'goog.i18n.DateTimePatterns_ms', 'goog.i18n.DateTimePatterns_mt', 'goog.i18n.DateTimePatterns_nb', 'goog.i18n.DateTimePatterns_nl', 'goog.i18n.DateTimePatterns_no', 'goog.i18n.DateTimePatterns_or', 'goog.i18n.DateTimePatterns_pl', 'goog.i18n.DateTimePatterns_pt', 'goog.i18n.DateTimePatterns_pt_BR', 'goog.i18n.DateTimePatterns_pt_PT', 'goog.i18n.DateTimePatterns_ro', 'goog.i18n.DateTimePatterns_ru', 'goog.i18n.DateTimePatterns_sk', 'goog.i18n.DateTimePatterns_sl', 'goog.i18n.DateTimePatterns_sq', 'goog.i18n.DateTimePatterns_sr', 'goog.i18n.DateTimePatterns_sv', 'goog.i18n.DateTimePatterns_sw', 'goog.i18n.DateTimePatterns_ta', 'goog.i18n.DateTimePatterns_te', 'goog.i18n.DateTimePatterns_th', 'goog.i18n.DateTimePatterns_tl', 'goog.i18n.DateTimePatterns_tr', 'goog.i18n.DateTimePatterns_uk', 'goog.i18n.DateTimePatterns_ur', 'goog.i18n.DateTimePatterns_vi', 'goog.i18n.DateTimePatterns_zh', 'goog.i18n.DateTimePatterns_zh_CN', 'goog.i18n.DateTimePatterns_zh_HK', 'goog.i18n.DateTimePatterns_zh_TW', 'goog.i18n.DateTimePatterns_zu'], []); -goog.addDependency('i18n/datetimepatternsext.js', ['goog.i18n.DateTimePatternsExt', 'goog.i18n.DateTimePatterns_af_NA', 'goog.i18n.DateTimePatterns_af_ZA', 'goog.i18n.DateTimePatterns_agq', 'goog.i18n.DateTimePatterns_agq_CM', 'goog.i18n.DateTimePatterns_ak', 'goog.i18n.DateTimePatterns_ak_GH', 'goog.i18n.DateTimePatterns_am_ET', 'goog.i18n.DateTimePatterns_ar_001', 'goog.i18n.DateTimePatterns_ar_AE', 'goog.i18n.DateTimePatterns_ar_BH', 'goog.i18n.DateTimePatterns_ar_DJ', 'goog.i18n.DateTimePatterns_ar_DZ', 'goog.i18n.DateTimePatterns_ar_EG', 'goog.i18n.DateTimePatterns_ar_EH', 'goog.i18n.DateTimePatterns_ar_ER', 'goog.i18n.DateTimePatterns_ar_IL', 'goog.i18n.DateTimePatterns_ar_IQ', 'goog.i18n.DateTimePatterns_ar_JO', 'goog.i18n.DateTimePatterns_ar_KM', 'goog.i18n.DateTimePatterns_ar_KW', 'goog.i18n.DateTimePatterns_ar_LB', 'goog.i18n.DateTimePatterns_ar_LY', 'goog.i18n.DateTimePatterns_ar_MA', 'goog.i18n.DateTimePatterns_ar_MR', 'goog.i18n.DateTimePatterns_ar_OM', 'goog.i18n.DateTimePatterns_ar_PS', 'goog.i18n.DateTimePatterns_ar_QA', 'goog.i18n.DateTimePatterns_ar_SA', 'goog.i18n.DateTimePatterns_ar_SD', 'goog.i18n.DateTimePatterns_ar_SO', 'goog.i18n.DateTimePatterns_ar_SY', 'goog.i18n.DateTimePatterns_ar_TD', 'goog.i18n.DateTimePatterns_ar_TN', 'goog.i18n.DateTimePatterns_ar_YE', 'goog.i18n.DateTimePatterns_as', 'goog.i18n.DateTimePatterns_as_IN', 'goog.i18n.DateTimePatterns_asa', 'goog.i18n.DateTimePatterns_asa_TZ', 'goog.i18n.DateTimePatterns_az', 'goog.i18n.DateTimePatterns_az_Cyrl', 'goog.i18n.DateTimePatterns_az_Cyrl_AZ', 'goog.i18n.DateTimePatterns_az_Latn', 'goog.i18n.DateTimePatterns_az_Latn_AZ', 'goog.i18n.DateTimePatterns_bas', 'goog.i18n.DateTimePatterns_bas_CM', 'goog.i18n.DateTimePatterns_be', 'goog.i18n.DateTimePatterns_be_BY', 'goog.i18n.DateTimePatterns_bem', 'goog.i18n.DateTimePatterns_bem_ZM', 'goog.i18n.DateTimePatterns_bez', 'goog.i18n.DateTimePatterns_bez_TZ', 'goog.i18n.DateTimePatterns_bg_BG', 'goog.i18n.DateTimePatterns_bm', 'goog.i18n.DateTimePatterns_bm_ML', 'goog.i18n.DateTimePatterns_bn_BD', 'goog.i18n.DateTimePatterns_bn_IN', 'goog.i18n.DateTimePatterns_bo', 'goog.i18n.DateTimePatterns_bo_CN', 'goog.i18n.DateTimePatterns_bo_IN', 'goog.i18n.DateTimePatterns_br_FR', 'goog.i18n.DateTimePatterns_brx', 'goog.i18n.DateTimePatterns_brx_IN', 'goog.i18n.DateTimePatterns_bs', 'goog.i18n.DateTimePatterns_bs_Cyrl', 'goog.i18n.DateTimePatterns_bs_Cyrl_BA', 'goog.i18n.DateTimePatterns_bs_Latn', 'goog.i18n.DateTimePatterns_bs_Latn_BA', 'goog.i18n.DateTimePatterns_ca_AD', 'goog.i18n.DateTimePatterns_ca_ES', 'goog.i18n.DateTimePatterns_cgg', 'goog.i18n.DateTimePatterns_cgg_UG', 'goog.i18n.DateTimePatterns_chr_US', 'goog.i18n.DateTimePatterns_cs_CZ', 'goog.i18n.DateTimePatterns_cy_GB', 'goog.i18n.DateTimePatterns_da_DK', 'goog.i18n.DateTimePatterns_dav', 'goog.i18n.DateTimePatterns_dav_KE', 'goog.i18n.DateTimePatterns_de_BE', 'goog.i18n.DateTimePatterns_de_DE', 'goog.i18n.DateTimePatterns_de_LI', 'goog.i18n.DateTimePatterns_de_LU', 'goog.i18n.DateTimePatterns_dje', 'goog.i18n.DateTimePatterns_dje_NE', 'goog.i18n.DateTimePatterns_dua', 'goog.i18n.DateTimePatterns_dua_CM', 'goog.i18n.DateTimePatterns_dyo', 'goog.i18n.DateTimePatterns_dyo_SN', 'goog.i18n.DateTimePatterns_dz', 'goog.i18n.DateTimePatterns_dz_BT', 'goog.i18n.DateTimePatterns_ebu', 'goog.i18n.DateTimePatterns_ebu_KE', 'goog.i18n.DateTimePatterns_ee', 'goog.i18n.DateTimePatterns_ee_GH', 'goog.i18n.DateTimePatterns_ee_TG', 'goog.i18n.DateTimePatterns_el_CY', 'goog.i18n.DateTimePatterns_el_GR', 'goog.i18n.DateTimePatterns_en_150', 'goog.i18n.DateTimePatterns_en_AG', 'goog.i18n.DateTimePatterns_en_AS', 'goog.i18n.DateTimePatterns_en_BB', 'goog.i18n.DateTimePatterns_en_BE', 'goog.i18n.DateTimePatterns_en_BM', 'goog.i18n.DateTimePatterns_en_BS', 'goog.i18n.DateTimePatterns_en_BW', 'goog.i18n.DateTimePatterns_en_BZ', 'goog.i18n.DateTimePatterns_en_CA', 'goog.i18n.DateTimePatterns_en_CM', 'goog.i18n.DateTimePatterns_en_DM', 'goog.i18n.DateTimePatterns_en_FJ', 'goog.i18n.DateTimePatterns_en_FM', 'goog.i18n.DateTimePatterns_en_GD', 'goog.i18n.DateTimePatterns_en_GG', 'goog.i18n.DateTimePatterns_en_GH', 'goog.i18n.DateTimePatterns_en_GI', 'goog.i18n.DateTimePatterns_en_GM', 'goog.i18n.DateTimePatterns_en_GU', 'goog.i18n.DateTimePatterns_en_GY', 'goog.i18n.DateTimePatterns_en_HK', 'goog.i18n.DateTimePatterns_en_IM', 'goog.i18n.DateTimePatterns_en_JE', 'goog.i18n.DateTimePatterns_en_JM', 'goog.i18n.DateTimePatterns_en_KE', 'goog.i18n.DateTimePatterns_en_KI', 'goog.i18n.DateTimePatterns_en_KN', 'goog.i18n.DateTimePatterns_en_KY', 'goog.i18n.DateTimePatterns_en_LC', 'goog.i18n.DateTimePatterns_en_LR', 'goog.i18n.DateTimePatterns_en_LS', 'goog.i18n.DateTimePatterns_en_MG', 'goog.i18n.DateTimePatterns_en_MH', 'goog.i18n.DateTimePatterns_en_MP', 'goog.i18n.DateTimePatterns_en_MT', 'goog.i18n.DateTimePatterns_en_MU', 'goog.i18n.DateTimePatterns_en_MW', 'goog.i18n.DateTimePatterns_en_NA', 'goog.i18n.DateTimePatterns_en_NG', 'goog.i18n.DateTimePatterns_en_NZ', 'goog.i18n.DateTimePatterns_en_PG', 'goog.i18n.DateTimePatterns_en_PH', 'goog.i18n.DateTimePatterns_en_PK', 'goog.i18n.DateTimePatterns_en_PR', 'goog.i18n.DateTimePatterns_en_PW', 'goog.i18n.DateTimePatterns_en_SB', 'goog.i18n.DateTimePatterns_en_SC', 'goog.i18n.DateTimePatterns_en_SL', 'goog.i18n.DateTimePatterns_en_SS', 'goog.i18n.DateTimePatterns_en_SZ', 'goog.i18n.DateTimePatterns_en_TC', 'goog.i18n.DateTimePatterns_en_TO', 'goog.i18n.DateTimePatterns_en_TT', 'goog.i18n.DateTimePatterns_en_TZ', 'goog.i18n.DateTimePatterns_en_UG', 'goog.i18n.DateTimePatterns_en_UM', 'goog.i18n.DateTimePatterns_en_US_POSIX', 'goog.i18n.DateTimePatterns_en_VC', 'goog.i18n.DateTimePatterns_en_VG', 'goog.i18n.DateTimePatterns_en_VI', 'goog.i18n.DateTimePatterns_en_VU', 'goog.i18n.DateTimePatterns_en_WS', 'goog.i18n.DateTimePatterns_en_ZM', 'goog.i18n.DateTimePatterns_en_ZW', 'goog.i18n.DateTimePatterns_eo', 'goog.i18n.DateTimePatterns_es_AR', 'goog.i18n.DateTimePatterns_es_BO', 'goog.i18n.DateTimePatterns_es_CL', 'goog.i18n.DateTimePatterns_es_CO', 'goog.i18n.DateTimePatterns_es_CR', 'goog.i18n.DateTimePatterns_es_CU', 'goog.i18n.DateTimePatterns_es_DO', 'goog.i18n.DateTimePatterns_es_EA', 'goog.i18n.DateTimePatterns_es_EC', 'goog.i18n.DateTimePatterns_es_GQ', 'goog.i18n.DateTimePatterns_es_GT', 'goog.i18n.DateTimePatterns_es_HN', 'goog.i18n.DateTimePatterns_es_IC', 'goog.i18n.DateTimePatterns_es_MX', 'goog.i18n.DateTimePatterns_es_NI', 'goog.i18n.DateTimePatterns_es_PA', 'goog.i18n.DateTimePatterns_es_PE', 'goog.i18n.DateTimePatterns_es_PH', 'goog.i18n.DateTimePatterns_es_PR', 'goog.i18n.DateTimePatterns_es_PY', 'goog.i18n.DateTimePatterns_es_SV', 'goog.i18n.DateTimePatterns_es_US', 'goog.i18n.DateTimePatterns_es_UY', 'goog.i18n.DateTimePatterns_es_VE', 'goog.i18n.DateTimePatterns_et_EE', 'goog.i18n.DateTimePatterns_eu_ES', 'goog.i18n.DateTimePatterns_ewo', 'goog.i18n.DateTimePatterns_ewo_CM', 'goog.i18n.DateTimePatterns_fa_AF', 'goog.i18n.DateTimePatterns_fa_IR', 'goog.i18n.DateTimePatterns_ff', 'goog.i18n.DateTimePatterns_ff_SN', 'goog.i18n.DateTimePatterns_fi_FI', 'goog.i18n.DateTimePatterns_fil_PH', 'goog.i18n.DateTimePatterns_fo', 'goog.i18n.DateTimePatterns_fo_FO', 'goog.i18n.DateTimePatterns_fr_BE', 'goog.i18n.DateTimePatterns_fr_BF', 'goog.i18n.DateTimePatterns_fr_BI', 'goog.i18n.DateTimePatterns_fr_BJ', 'goog.i18n.DateTimePatterns_fr_BL', 'goog.i18n.DateTimePatterns_fr_CD', 'goog.i18n.DateTimePatterns_fr_CF', 'goog.i18n.DateTimePatterns_fr_CG', 'goog.i18n.DateTimePatterns_fr_CH', 'goog.i18n.DateTimePatterns_fr_CI', 'goog.i18n.DateTimePatterns_fr_CM', 'goog.i18n.DateTimePatterns_fr_DJ', 'goog.i18n.DateTimePatterns_fr_DZ', 'goog.i18n.DateTimePatterns_fr_FR', 'goog.i18n.DateTimePatterns_fr_GA', 'goog.i18n.DateTimePatterns_fr_GF', 'goog.i18n.DateTimePatterns_fr_GN', 'goog.i18n.DateTimePatterns_fr_GP', 'goog.i18n.DateTimePatterns_fr_GQ', 'goog.i18n.DateTimePatterns_fr_HT', 'goog.i18n.DateTimePatterns_fr_KM', 'goog.i18n.DateTimePatterns_fr_LU', 'goog.i18n.DateTimePatterns_fr_MA', 'goog.i18n.DateTimePatterns_fr_MC', 'goog.i18n.DateTimePatterns_fr_MF', 'goog.i18n.DateTimePatterns_fr_MG', 'goog.i18n.DateTimePatterns_fr_ML', 'goog.i18n.DateTimePatterns_fr_MQ', 'goog.i18n.DateTimePatterns_fr_MR', 'goog.i18n.DateTimePatterns_fr_MU', 'goog.i18n.DateTimePatterns_fr_NC', 'goog.i18n.DateTimePatterns_fr_NE', 'goog.i18n.DateTimePatterns_fr_PF', 'goog.i18n.DateTimePatterns_fr_RE', 'goog.i18n.DateTimePatterns_fr_RW', 'goog.i18n.DateTimePatterns_fr_SC', 'goog.i18n.DateTimePatterns_fr_SN', 'goog.i18n.DateTimePatterns_fr_SY', 'goog.i18n.DateTimePatterns_fr_TD', 'goog.i18n.DateTimePatterns_fr_TG', 'goog.i18n.DateTimePatterns_fr_TN', 'goog.i18n.DateTimePatterns_fr_VU', 'goog.i18n.DateTimePatterns_fr_YT', 'goog.i18n.DateTimePatterns_ga', 'goog.i18n.DateTimePatterns_ga_IE', 'goog.i18n.DateTimePatterns_gl_ES', 'goog.i18n.DateTimePatterns_gsw_CH', 'goog.i18n.DateTimePatterns_gu_IN', 'goog.i18n.DateTimePatterns_guz', 'goog.i18n.DateTimePatterns_guz_KE', 'goog.i18n.DateTimePatterns_gv', 'goog.i18n.DateTimePatterns_gv_GB', 'goog.i18n.DateTimePatterns_ha', 'goog.i18n.DateTimePatterns_ha_Latn', 'goog.i18n.DateTimePatterns_ha_Latn_GH', 'goog.i18n.DateTimePatterns_ha_Latn_NE', 'goog.i18n.DateTimePatterns_ha_Latn_NG', 'goog.i18n.DateTimePatterns_haw_US', 'goog.i18n.DateTimePatterns_he_IL', 'goog.i18n.DateTimePatterns_hi_IN', 'goog.i18n.DateTimePatterns_hr_BA', 'goog.i18n.DateTimePatterns_hr_HR', 'goog.i18n.DateTimePatterns_hu_HU', 'goog.i18n.DateTimePatterns_hy', 'goog.i18n.DateTimePatterns_hy_AM', 'goog.i18n.DateTimePatterns_id_ID', 'goog.i18n.DateTimePatterns_ig', 'goog.i18n.DateTimePatterns_ig_NG', 'goog.i18n.DateTimePatterns_ii', 'goog.i18n.DateTimePatterns_ii_CN', 'goog.i18n.DateTimePatterns_is_IS', 'goog.i18n.DateTimePatterns_it_CH', 'goog.i18n.DateTimePatterns_it_IT', 'goog.i18n.DateTimePatterns_it_SM', 'goog.i18n.DateTimePatterns_ja_JP', 'goog.i18n.DateTimePatterns_jgo', 'goog.i18n.DateTimePatterns_jgo_CM', 'goog.i18n.DateTimePatterns_jmc', 'goog.i18n.DateTimePatterns_jmc_TZ', 'goog.i18n.DateTimePatterns_ka', 'goog.i18n.DateTimePatterns_ka_GE', 'goog.i18n.DateTimePatterns_kab', 'goog.i18n.DateTimePatterns_kab_DZ', 'goog.i18n.DateTimePatterns_kam', 'goog.i18n.DateTimePatterns_kam_KE', 'goog.i18n.DateTimePatterns_kde', 'goog.i18n.DateTimePatterns_kde_TZ', 'goog.i18n.DateTimePatterns_kea', 'goog.i18n.DateTimePatterns_kea_CV', 'goog.i18n.DateTimePatterns_khq', 'goog.i18n.DateTimePatterns_khq_ML', 'goog.i18n.DateTimePatterns_ki', 'goog.i18n.DateTimePatterns_ki_KE', 'goog.i18n.DateTimePatterns_kk', 'goog.i18n.DateTimePatterns_kk_Cyrl', 'goog.i18n.DateTimePatterns_kk_Cyrl_KZ', 'goog.i18n.DateTimePatterns_kl', 'goog.i18n.DateTimePatterns_kl_GL', 'goog.i18n.DateTimePatterns_kln', 'goog.i18n.DateTimePatterns_kln_KE', 'goog.i18n.DateTimePatterns_km', 'goog.i18n.DateTimePatterns_km_KH', 'goog.i18n.DateTimePatterns_kn_IN', 'goog.i18n.DateTimePatterns_ko_KP', 'goog.i18n.DateTimePatterns_ko_KR', 'goog.i18n.DateTimePatterns_kok', 'goog.i18n.DateTimePatterns_kok_IN', 'goog.i18n.DateTimePatterns_ks', 'goog.i18n.DateTimePatterns_ks_Arab', 'goog.i18n.DateTimePatterns_ks_Arab_IN', 'goog.i18n.DateTimePatterns_ksb', 'goog.i18n.DateTimePatterns_ksb_TZ', 'goog.i18n.DateTimePatterns_ksf', 'goog.i18n.DateTimePatterns_ksf_CM', 'goog.i18n.DateTimePatterns_kw', 'goog.i18n.DateTimePatterns_kw_GB', 'goog.i18n.DateTimePatterns_lag', 'goog.i18n.DateTimePatterns_lag_TZ', 'goog.i18n.DateTimePatterns_lg', 'goog.i18n.DateTimePatterns_lg_UG', 'goog.i18n.DateTimePatterns_ln_AO', 'goog.i18n.DateTimePatterns_ln_CD', 'goog.i18n.DateTimePatterns_ln_CF', 'goog.i18n.DateTimePatterns_ln_CG', 'goog.i18n.DateTimePatterns_lo', 'goog.i18n.DateTimePatterns_lo_LA', 'goog.i18n.DateTimePatterns_lt_LT', 'goog.i18n.DateTimePatterns_lu', 'goog.i18n.DateTimePatterns_lu_CD', 'goog.i18n.DateTimePatterns_luo', 'goog.i18n.DateTimePatterns_luo_KE', 'goog.i18n.DateTimePatterns_luy', 'goog.i18n.DateTimePatterns_luy_KE', 'goog.i18n.DateTimePatterns_lv_LV', 'goog.i18n.DateTimePatterns_mas', 'goog.i18n.DateTimePatterns_mas_KE', 'goog.i18n.DateTimePatterns_mas_TZ', 'goog.i18n.DateTimePatterns_mer', 'goog.i18n.DateTimePatterns_mer_KE', 'goog.i18n.DateTimePatterns_mfe', 'goog.i18n.DateTimePatterns_mfe_MU', 'goog.i18n.DateTimePatterns_mg', 'goog.i18n.DateTimePatterns_mg_MG', 'goog.i18n.DateTimePatterns_mgh', 'goog.i18n.DateTimePatterns_mgh_MZ', 'goog.i18n.DateTimePatterns_mgo', 'goog.i18n.DateTimePatterns_mgo_CM', 'goog.i18n.DateTimePatterns_mk', 'goog.i18n.DateTimePatterns_mk_MK', 'goog.i18n.DateTimePatterns_ml_IN', 'goog.i18n.DateTimePatterns_mn', 'goog.i18n.DateTimePatterns_mn_Cyrl', 'goog.i18n.DateTimePatterns_mn_Cyrl_MN', 'goog.i18n.DateTimePatterns_mr_IN', 'goog.i18n.DateTimePatterns_ms_Latn', 'goog.i18n.DateTimePatterns_ms_Latn_BN', 'goog.i18n.DateTimePatterns_ms_Latn_MY', 'goog.i18n.DateTimePatterns_ms_Latn_SG', 'goog.i18n.DateTimePatterns_mt_MT', 'goog.i18n.DateTimePatterns_mua', 'goog.i18n.DateTimePatterns_mua_CM', 'goog.i18n.DateTimePatterns_my', 'goog.i18n.DateTimePatterns_my_MM', 'goog.i18n.DateTimePatterns_naq', 'goog.i18n.DateTimePatterns_naq_NA', 'goog.i18n.DateTimePatterns_nb_NO', 'goog.i18n.DateTimePatterns_nd', 'goog.i18n.DateTimePatterns_nd_ZW', 'goog.i18n.DateTimePatterns_ne', 'goog.i18n.DateTimePatterns_ne_IN', 'goog.i18n.DateTimePatterns_ne_NP', 'goog.i18n.DateTimePatterns_nl_AW', 'goog.i18n.DateTimePatterns_nl_BE', 'goog.i18n.DateTimePatterns_nl_CW', 'goog.i18n.DateTimePatterns_nl_NL', 'goog.i18n.DateTimePatterns_nl_SR', 'goog.i18n.DateTimePatterns_nl_SX', 'goog.i18n.DateTimePatterns_nmg', 'goog.i18n.DateTimePatterns_nmg_CM', 'goog.i18n.DateTimePatterns_nn', 'goog.i18n.DateTimePatterns_nn_NO', 'goog.i18n.DateTimePatterns_nus', 'goog.i18n.DateTimePatterns_nus_SD', 'goog.i18n.DateTimePatterns_nyn', 'goog.i18n.DateTimePatterns_nyn_UG', 'goog.i18n.DateTimePatterns_om', 'goog.i18n.DateTimePatterns_om_ET', 'goog.i18n.DateTimePatterns_om_KE', 'goog.i18n.DateTimePatterns_or_IN', 'goog.i18n.DateTimePatterns_pa', 'goog.i18n.DateTimePatterns_pa_Arab', 'goog.i18n.DateTimePatterns_pa_Arab_PK', 'goog.i18n.DateTimePatterns_pa_Guru', 'goog.i18n.DateTimePatterns_pa_Guru_IN', 'goog.i18n.DateTimePatterns_pl_PL', 'goog.i18n.DateTimePatterns_ps', 'goog.i18n.DateTimePatterns_ps_AF', 'goog.i18n.DateTimePatterns_pt_AO', 'goog.i18n.DateTimePatterns_pt_CV', 'goog.i18n.DateTimePatterns_pt_GW', 'goog.i18n.DateTimePatterns_pt_MO', 'goog.i18n.DateTimePatterns_pt_MZ', 'goog.i18n.DateTimePatterns_pt_ST', 'goog.i18n.DateTimePatterns_pt_TL', 'goog.i18n.DateTimePatterns_rm', 'goog.i18n.DateTimePatterns_rm_CH', 'goog.i18n.DateTimePatterns_rn', 'goog.i18n.DateTimePatterns_rn_BI', 'goog.i18n.DateTimePatterns_ro_MD', 'goog.i18n.DateTimePatterns_ro_RO', 'goog.i18n.DateTimePatterns_rof', 'goog.i18n.DateTimePatterns_rof_TZ', 'goog.i18n.DateTimePatterns_ru_BY', 'goog.i18n.DateTimePatterns_ru_KG', 'goog.i18n.DateTimePatterns_ru_KZ', 'goog.i18n.DateTimePatterns_ru_MD', 'goog.i18n.DateTimePatterns_ru_RU', 'goog.i18n.DateTimePatterns_ru_UA', 'goog.i18n.DateTimePatterns_rw', 'goog.i18n.DateTimePatterns_rw_RW', 'goog.i18n.DateTimePatterns_rwk', 'goog.i18n.DateTimePatterns_rwk_TZ', 'goog.i18n.DateTimePatterns_saq', 'goog.i18n.DateTimePatterns_saq_KE', 'goog.i18n.DateTimePatterns_sbp', 'goog.i18n.DateTimePatterns_sbp_TZ', 'goog.i18n.DateTimePatterns_seh', 'goog.i18n.DateTimePatterns_seh_MZ', 'goog.i18n.DateTimePatterns_ses', 'goog.i18n.DateTimePatterns_ses_ML', 'goog.i18n.DateTimePatterns_sg', 'goog.i18n.DateTimePatterns_sg_CF', 'goog.i18n.DateTimePatterns_shi', 'goog.i18n.DateTimePatterns_shi_Latn', 'goog.i18n.DateTimePatterns_shi_Latn_MA', 'goog.i18n.DateTimePatterns_shi_Tfng', 'goog.i18n.DateTimePatterns_shi_Tfng_MA', 'goog.i18n.DateTimePatterns_si', 'goog.i18n.DateTimePatterns_si_LK', 'goog.i18n.DateTimePatterns_sk_SK', 'goog.i18n.DateTimePatterns_sl_SI', 'goog.i18n.DateTimePatterns_sn', 'goog.i18n.DateTimePatterns_sn_ZW', 'goog.i18n.DateTimePatterns_so', 'goog.i18n.DateTimePatterns_so_DJ', 'goog.i18n.DateTimePatterns_so_ET', 'goog.i18n.DateTimePatterns_so_KE', 'goog.i18n.DateTimePatterns_so_SO', 'goog.i18n.DateTimePatterns_sq_AL', 'goog.i18n.DateTimePatterns_sq_MK', 'goog.i18n.DateTimePatterns_sr_Cyrl', 'goog.i18n.DateTimePatterns_sr_Cyrl_BA', 'goog.i18n.DateTimePatterns_sr_Cyrl_ME', 'goog.i18n.DateTimePatterns_sr_Cyrl_RS', 'goog.i18n.DateTimePatterns_sr_Latn', 'goog.i18n.DateTimePatterns_sr_Latn_BA', 'goog.i18n.DateTimePatterns_sr_Latn_ME', 'goog.i18n.DateTimePatterns_sr_Latn_RS', 'goog.i18n.DateTimePatterns_sv_AX', 'goog.i18n.DateTimePatterns_sv_FI', 'goog.i18n.DateTimePatterns_sv_SE', 'goog.i18n.DateTimePatterns_sw_KE', 'goog.i18n.DateTimePatterns_sw_TZ', 'goog.i18n.DateTimePatterns_sw_UG', 'goog.i18n.DateTimePatterns_swc', 'goog.i18n.DateTimePatterns_swc_CD', 'goog.i18n.DateTimePatterns_ta_IN', 'goog.i18n.DateTimePatterns_ta_LK', 'goog.i18n.DateTimePatterns_ta_MY', 'goog.i18n.DateTimePatterns_ta_SG', 'goog.i18n.DateTimePatterns_te_IN', 'goog.i18n.DateTimePatterns_teo', 'goog.i18n.DateTimePatterns_teo_KE', 'goog.i18n.DateTimePatterns_teo_UG', 'goog.i18n.DateTimePatterns_th_TH', 'goog.i18n.DateTimePatterns_ti', 'goog.i18n.DateTimePatterns_ti_ER', 'goog.i18n.DateTimePatterns_ti_ET', 'goog.i18n.DateTimePatterns_to', 'goog.i18n.DateTimePatterns_to_TO', 'goog.i18n.DateTimePatterns_tr_CY', 'goog.i18n.DateTimePatterns_tr_TR', 'goog.i18n.DateTimePatterns_twq', 'goog.i18n.DateTimePatterns_twq_NE', 'goog.i18n.DateTimePatterns_tzm', 'goog.i18n.DateTimePatterns_tzm_Latn', 'goog.i18n.DateTimePatterns_tzm_Latn_MA', 'goog.i18n.DateTimePatterns_uk_UA', 'goog.i18n.DateTimePatterns_ur_IN', 'goog.i18n.DateTimePatterns_ur_PK', 'goog.i18n.DateTimePatterns_uz', 'goog.i18n.DateTimePatterns_uz_Arab', 'goog.i18n.DateTimePatterns_uz_Arab_AF', 'goog.i18n.DateTimePatterns_uz_Cyrl', 'goog.i18n.DateTimePatterns_uz_Cyrl_UZ', 'goog.i18n.DateTimePatterns_uz_Latn', 'goog.i18n.DateTimePatterns_uz_Latn_UZ', 'goog.i18n.DateTimePatterns_vai', 'goog.i18n.DateTimePatterns_vai_Latn', 'goog.i18n.DateTimePatterns_vai_Latn_LR', 'goog.i18n.DateTimePatterns_vai_Vaii', 'goog.i18n.DateTimePatterns_vai_Vaii_LR', 'goog.i18n.DateTimePatterns_vi_VN', 'goog.i18n.DateTimePatterns_vun', 'goog.i18n.DateTimePatterns_vun_TZ', 'goog.i18n.DateTimePatterns_xog', 'goog.i18n.DateTimePatterns_xog_UG', 'goog.i18n.DateTimePatterns_yav', 'goog.i18n.DateTimePatterns_yav_CM', 'goog.i18n.DateTimePatterns_yo', 'goog.i18n.DateTimePatterns_yo_NG', 'goog.i18n.DateTimePatterns_zh_Hans', 'goog.i18n.DateTimePatterns_zh_Hans_CN', 'goog.i18n.DateTimePatterns_zh_Hans_HK', 'goog.i18n.DateTimePatterns_zh_Hans_MO', 'goog.i18n.DateTimePatterns_zh_Hans_SG', 'goog.i18n.DateTimePatterns_zh_Hant', 'goog.i18n.DateTimePatterns_zh_Hant_HK', 'goog.i18n.DateTimePatterns_zh_Hant_MO', 'goog.i18n.DateTimePatterns_zh_Hant_TW', 'goog.i18n.DateTimePatterns_zu_ZA'], ['goog.i18n.DateTimePatterns']); -goog.addDependency('i18n/datetimesymbols.js', ['goog.i18n.DateTimeSymbols', 'goog.i18n.DateTimeSymbols_af', 'goog.i18n.DateTimeSymbols_am', 'goog.i18n.DateTimeSymbols_ar', 'goog.i18n.DateTimeSymbols_bg', 'goog.i18n.DateTimeSymbols_bn', 'goog.i18n.DateTimeSymbols_br', 'goog.i18n.DateTimeSymbols_ca', 'goog.i18n.DateTimeSymbols_chr', 'goog.i18n.DateTimeSymbols_cs', 'goog.i18n.DateTimeSymbols_cy', 'goog.i18n.DateTimeSymbols_da', 'goog.i18n.DateTimeSymbols_de', 'goog.i18n.DateTimeSymbols_de_AT', 'goog.i18n.DateTimeSymbols_de_CH', 'goog.i18n.DateTimeSymbols_el', 'goog.i18n.DateTimeSymbols_en', 'goog.i18n.DateTimeSymbols_en_AU', 'goog.i18n.DateTimeSymbols_en_GB', 'goog.i18n.DateTimeSymbols_en_IE', 'goog.i18n.DateTimeSymbols_en_IN', 'goog.i18n.DateTimeSymbols_en_ISO', 'goog.i18n.DateTimeSymbols_en_SG', 'goog.i18n.DateTimeSymbols_en_US', 'goog.i18n.DateTimeSymbols_en_ZA', 'goog.i18n.DateTimeSymbols_es', 'goog.i18n.DateTimeSymbols_es_419', 'goog.i18n.DateTimeSymbols_es_ES', 'goog.i18n.DateTimeSymbols_et', 'goog.i18n.DateTimeSymbols_eu', 'goog.i18n.DateTimeSymbols_fa', 'goog.i18n.DateTimeSymbols_fi', 'goog.i18n.DateTimeSymbols_fil', 'goog.i18n.DateTimeSymbols_fr', 'goog.i18n.DateTimeSymbols_fr_CA', 'goog.i18n.DateTimeSymbols_gl', 'goog.i18n.DateTimeSymbols_gsw', 'goog.i18n.DateTimeSymbols_gu', 'goog.i18n.DateTimeSymbols_haw', 'goog.i18n.DateTimeSymbols_he', 'goog.i18n.DateTimeSymbols_hi', 'goog.i18n.DateTimeSymbols_hr', 'goog.i18n.DateTimeSymbols_hu', 'goog.i18n.DateTimeSymbols_id', 'goog.i18n.DateTimeSymbols_in', 'goog.i18n.DateTimeSymbols_is', 'goog.i18n.DateTimeSymbols_it', 'goog.i18n.DateTimeSymbols_iw', 'goog.i18n.DateTimeSymbols_ja', 'goog.i18n.DateTimeSymbols_kn', 'goog.i18n.DateTimeSymbols_ko', 'goog.i18n.DateTimeSymbols_ln', 'goog.i18n.DateTimeSymbols_lt', 'goog.i18n.DateTimeSymbols_lv', 'goog.i18n.DateTimeSymbols_ml', 'goog.i18n.DateTimeSymbols_mr', 'goog.i18n.DateTimeSymbols_ms', 'goog.i18n.DateTimeSymbols_mt', 'goog.i18n.DateTimeSymbols_nb', 'goog.i18n.DateTimeSymbols_nl', 'goog.i18n.DateTimeSymbols_no', 'goog.i18n.DateTimeSymbols_or', 'goog.i18n.DateTimeSymbols_pl', 'goog.i18n.DateTimeSymbols_pt', 'goog.i18n.DateTimeSymbols_pt_BR', 'goog.i18n.DateTimeSymbols_pt_PT', 'goog.i18n.DateTimeSymbols_ro', 'goog.i18n.DateTimeSymbols_ru', 'goog.i18n.DateTimeSymbols_sk', 'goog.i18n.DateTimeSymbols_sl', 'goog.i18n.DateTimeSymbols_sq', 'goog.i18n.DateTimeSymbols_sr', 'goog.i18n.DateTimeSymbols_sv', 'goog.i18n.DateTimeSymbols_sw', 'goog.i18n.DateTimeSymbols_ta', 'goog.i18n.DateTimeSymbols_te', 'goog.i18n.DateTimeSymbols_th', 'goog.i18n.DateTimeSymbols_tl', 'goog.i18n.DateTimeSymbols_tr', 'goog.i18n.DateTimeSymbols_uk', 'goog.i18n.DateTimeSymbols_ur', 'goog.i18n.DateTimeSymbols_vi', 'goog.i18n.DateTimeSymbols_zh', 'goog.i18n.DateTimeSymbols_zh_CN', 'goog.i18n.DateTimeSymbols_zh_HK', 'goog.i18n.DateTimeSymbols_zh_TW', 'goog.i18n.DateTimeSymbols_zu'], []); -goog.addDependency('i18n/datetimesymbolsext.js', ['goog.i18n.DateTimeSymbolsExt', 'goog.i18n.DateTimeSymbols_aa', 'goog.i18n.DateTimeSymbols_aa_DJ', 'goog.i18n.DateTimeSymbols_aa_ER', 'goog.i18n.DateTimeSymbols_aa_ET', 'goog.i18n.DateTimeSymbols_af_NA', 'goog.i18n.DateTimeSymbols_af_ZA', 'goog.i18n.DateTimeSymbols_agq', 'goog.i18n.DateTimeSymbols_agq_CM', 'goog.i18n.DateTimeSymbols_ak', 'goog.i18n.DateTimeSymbols_ak_GH', 'goog.i18n.DateTimeSymbols_am_ET', 'goog.i18n.DateTimeSymbols_ar_001', 'goog.i18n.DateTimeSymbols_ar_AE', 'goog.i18n.DateTimeSymbols_ar_BH', 'goog.i18n.DateTimeSymbols_ar_DJ', 'goog.i18n.DateTimeSymbols_ar_DZ', 'goog.i18n.DateTimeSymbols_ar_EG', 'goog.i18n.DateTimeSymbols_ar_EH', 'goog.i18n.DateTimeSymbols_ar_ER', 'goog.i18n.DateTimeSymbols_ar_IL', 'goog.i18n.DateTimeSymbols_ar_IQ', 'goog.i18n.DateTimeSymbols_ar_JO', 'goog.i18n.DateTimeSymbols_ar_KM', 'goog.i18n.DateTimeSymbols_ar_KW', 'goog.i18n.DateTimeSymbols_ar_LB', 'goog.i18n.DateTimeSymbols_ar_LY', 'goog.i18n.DateTimeSymbols_ar_MA', 'goog.i18n.DateTimeSymbols_ar_MR', 'goog.i18n.DateTimeSymbols_ar_OM', 'goog.i18n.DateTimeSymbols_ar_PS', 'goog.i18n.DateTimeSymbols_ar_QA', 'goog.i18n.DateTimeSymbols_ar_SA', 'goog.i18n.DateTimeSymbols_ar_SD', 'goog.i18n.DateTimeSymbols_ar_SO', 'goog.i18n.DateTimeSymbols_ar_SY', 'goog.i18n.DateTimeSymbols_ar_TD', 'goog.i18n.DateTimeSymbols_ar_TN', 'goog.i18n.DateTimeSymbols_ar_YE', 'goog.i18n.DateTimeSymbols_as', 'goog.i18n.DateTimeSymbols_as_IN', 'goog.i18n.DateTimeSymbols_asa', 'goog.i18n.DateTimeSymbols_asa_TZ', 'goog.i18n.DateTimeSymbols_ast', 'goog.i18n.DateTimeSymbols_ast_ES', 'goog.i18n.DateTimeSymbols_az', 'goog.i18n.DateTimeSymbols_az_Cyrl', 'goog.i18n.DateTimeSymbols_az_Cyrl_AZ', 'goog.i18n.DateTimeSymbols_az_Latn', 'goog.i18n.DateTimeSymbols_az_Latn_AZ', 'goog.i18n.DateTimeSymbols_bas', 'goog.i18n.DateTimeSymbols_bas_CM', 'goog.i18n.DateTimeSymbols_be', 'goog.i18n.DateTimeSymbols_be_BY', 'goog.i18n.DateTimeSymbols_bem', 'goog.i18n.DateTimeSymbols_bem_ZM', 'goog.i18n.DateTimeSymbols_bez', 'goog.i18n.DateTimeSymbols_bez_TZ', 'goog.i18n.DateTimeSymbols_bg_BG', 'goog.i18n.DateTimeSymbols_bm', 'goog.i18n.DateTimeSymbols_bm_ML', 'goog.i18n.DateTimeSymbols_bn_BD', 'goog.i18n.DateTimeSymbols_bn_IN', 'goog.i18n.DateTimeSymbols_bo', 'goog.i18n.DateTimeSymbols_bo_CN', 'goog.i18n.DateTimeSymbols_bo_IN', 'goog.i18n.DateTimeSymbols_br_FR', 'goog.i18n.DateTimeSymbols_brx', 'goog.i18n.DateTimeSymbols_brx_IN', 'goog.i18n.DateTimeSymbols_bs', 'goog.i18n.DateTimeSymbols_bs_Cyrl', 'goog.i18n.DateTimeSymbols_bs_Cyrl_BA', 'goog.i18n.DateTimeSymbols_bs_Latn', 'goog.i18n.DateTimeSymbols_bs_Latn_BA', 'goog.i18n.DateTimeSymbols_byn', 'goog.i18n.DateTimeSymbols_byn_ER', 'goog.i18n.DateTimeSymbols_ca_AD', 'goog.i18n.DateTimeSymbols_ca_ES', 'goog.i18n.DateTimeSymbols_cgg', 'goog.i18n.DateTimeSymbols_cgg_UG', 'goog.i18n.DateTimeSymbols_chr_US', 'goog.i18n.DateTimeSymbols_ckb', 'goog.i18n.DateTimeSymbols_ckb_Arab', 'goog.i18n.DateTimeSymbols_ckb_Arab_IQ', 'goog.i18n.DateTimeSymbols_ckb_Arab_IR', 'goog.i18n.DateTimeSymbols_ckb_IQ', 'goog.i18n.DateTimeSymbols_ckb_IR', 'goog.i18n.DateTimeSymbols_ckb_Latn', 'goog.i18n.DateTimeSymbols_ckb_Latn_IQ', 'goog.i18n.DateTimeSymbols_cs_CZ', 'goog.i18n.DateTimeSymbols_cy_GB', 'goog.i18n.DateTimeSymbols_da_DK', 'goog.i18n.DateTimeSymbols_dav', 'goog.i18n.DateTimeSymbols_dav_KE', 'goog.i18n.DateTimeSymbols_de_BE', 'goog.i18n.DateTimeSymbols_de_DE', 'goog.i18n.DateTimeSymbols_de_LI', 'goog.i18n.DateTimeSymbols_de_LU', 'goog.i18n.DateTimeSymbols_dje', 'goog.i18n.DateTimeSymbols_dje_NE', 'goog.i18n.DateTimeSymbols_dua', 'goog.i18n.DateTimeSymbols_dua_CM', 'goog.i18n.DateTimeSymbols_dyo', 'goog.i18n.DateTimeSymbols_dyo_SN', 'goog.i18n.DateTimeSymbols_dz', 'goog.i18n.DateTimeSymbols_dz_BT', 'goog.i18n.DateTimeSymbols_ebu', 'goog.i18n.DateTimeSymbols_ebu_KE', 'goog.i18n.DateTimeSymbols_ee', 'goog.i18n.DateTimeSymbols_ee_GH', 'goog.i18n.DateTimeSymbols_ee_TG', 'goog.i18n.DateTimeSymbols_el_CY', 'goog.i18n.DateTimeSymbols_el_GR', 'goog.i18n.DateTimeSymbols_en_150', 'goog.i18n.DateTimeSymbols_en_AG', 'goog.i18n.DateTimeSymbols_en_AS', 'goog.i18n.DateTimeSymbols_en_BB', 'goog.i18n.DateTimeSymbols_en_BE', 'goog.i18n.DateTimeSymbols_en_BM', 'goog.i18n.DateTimeSymbols_en_BS', 'goog.i18n.DateTimeSymbols_en_BW', 'goog.i18n.DateTimeSymbols_en_BZ', 'goog.i18n.DateTimeSymbols_en_CA', 'goog.i18n.DateTimeSymbols_en_CM', 'goog.i18n.DateTimeSymbols_en_DM', 'goog.i18n.DateTimeSymbols_en_Dsrt', 'goog.i18n.DateTimeSymbols_en_Dsrt_US', 'goog.i18n.DateTimeSymbols_en_FJ', 'goog.i18n.DateTimeSymbols_en_FM', 'goog.i18n.DateTimeSymbols_en_GD', 'goog.i18n.DateTimeSymbols_en_GG', 'goog.i18n.DateTimeSymbols_en_GH', 'goog.i18n.DateTimeSymbols_en_GI', 'goog.i18n.DateTimeSymbols_en_GM', 'goog.i18n.DateTimeSymbols_en_GU', 'goog.i18n.DateTimeSymbols_en_GY', 'goog.i18n.DateTimeSymbols_en_HK', 'goog.i18n.DateTimeSymbols_en_IM', 'goog.i18n.DateTimeSymbols_en_JE', 'goog.i18n.DateTimeSymbols_en_JM', 'goog.i18n.DateTimeSymbols_en_KE', 'goog.i18n.DateTimeSymbols_en_KI', 'goog.i18n.DateTimeSymbols_en_KN', 'goog.i18n.DateTimeSymbols_en_KY', 'goog.i18n.DateTimeSymbols_en_LC', 'goog.i18n.DateTimeSymbols_en_LR', 'goog.i18n.DateTimeSymbols_en_LS', 'goog.i18n.DateTimeSymbols_en_MG', 'goog.i18n.DateTimeSymbols_en_MH', 'goog.i18n.DateTimeSymbols_en_MP', 'goog.i18n.DateTimeSymbols_en_MT', 'goog.i18n.DateTimeSymbols_en_MU', 'goog.i18n.DateTimeSymbols_en_MW', 'goog.i18n.DateTimeSymbols_en_NA', 'goog.i18n.DateTimeSymbols_en_NG', 'goog.i18n.DateTimeSymbols_en_NZ', 'goog.i18n.DateTimeSymbols_en_PG', 'goog.i18n.DateTimeSymbols_en_PH', 'goog.i18n.DateTimeSymbols_en_PK', 'goog.i18n.DateTimeSymbols_en_PR', 'goog.i18n.DateTimeSymbols_en_PW', 'goog.i18n.DateTimeSymbols_en_SB', 'goog.i18n.DateTimeSymbols_en_SC', 'goog.i18n.DateTimeSymbols_en_SL', 'goog.i18n.DateTimeSymbols_en_SS', 'goog.i18n.DateTimeSymbols_en_SZ', 'goog.i18n.DateTimeSymbols_en_TC', 'goog.i18n.DateTimeSymbols_en_TO', 'goog.i18n.DateTimeSymbols_en_TT', 'goog.i18n.DateTimeSymbols_en_TZ', 'goog.i18n.DateTimeSymbols_en_UG', 'goog.i18n.DateTimeSymbols_en_UM', 'goog.i18n.DateTimeSymbols_en_VC', 'goog.i18n.DateTimeSymbols_en_VG', 'goog.i18n.DateTimeSymbols_en_VI', 'goog.i18n.DateTimeSymbols_en_VU', 'goog.i18n.DateTimeSymbols_en_WS', 'goog.i18n.DateTimeSymbols_en_ZM', 'goog.i18n.DateTimeSymbols_en_ZW', 'goog.i18n.DateTimeSymbols_eo', 'goog.i18n.DateTimeSymbols_es_AR', 'goog.i18n.DateTimeSymbols_es_BO', 'goog.i18n.DateTimeSymbols_es_CL', 'goog.i18n.DateTimeSymbols_es_CO', 'goog.i18n.DateTimeSymbols_es_CR', 'goog.i18n.DateTimeSymbols_es_CU', 'goog.i18n.DateTimeSymbols_es_DO', 'goog.i18n.DateTimeSymbols_es_EA', 'goog.i18n.DateTimeSymbols_es_EC', 'goog.i18n.DateTimeSymbols_es_GQ', 'goog.i18n.DateTimeSymbols_es_GT', 'goog.i18n.DateTimeSymbols_es_HN', 'goog.i18n.DateTimeSymbols_es_IC', 'goog.i18n.DateTimeSymbols_es_MX', 'goog.i18n.DateTimeSymbols_es_NI', 'goog.i18n.DateTimeSymbols_es_PA', 'goog.i18n.DateTimeSymbols_es_PE', 'goog.i18n.DateTimeSymbols_es_PH', 'goog.i18n.DateTimeSymbols_es_PR', 'goog.i18n.DateTimeSymbols_es_PY', 'goog.i18n.DateTimeSymbols_es_SV', 'goog.i18n.DateTimeSymbols_es_US', 'goog.i18n.DateTimeSymbols_es_UY', 'goog.i18n.DateTimeSymbols_es_VE', 'goog.i18n.DateTimeSymbols_et_EE', 'goog.i18n.DateTimeSymbols_eu_ES', 'goog.i18n.DateTimeSymbols_ewo', 'goog.i18n.DateTimeSymbols_ewo_CM', 'goog.i18n.DateTimeSymbols_fa_AF', 'goog.i18n.DateTimeSymbols_fa_IR', 'goog.i18n.DateTimeSymbols_ff', 'goog.i18n.DateTimeSymbols_ff_SN', 'goog.i18n.DateTimeSymbols_fi_FI', 'goog.i18n.DateTimeSymbols_fil_PH', 'goog.i18n.DateTimeSymbols_fo', 'goog.i18n.DateTimeSymbols_fo_FO', 'goog.i18n.DateTimeSymbols_fr_BE', 'goog.i18n.DateTimeSymbols_fr_BF', 'goog.i18n.DateTimeSymbols_fr_BI', 'goog.i18n.DateTimeSymbols_fr_BJ', 'goog.i18n.DateTimeSymbols_fr_BL', 'goog.i18n.DateTimeSymbols_fr_CD', 'goog.i18n.DateTimeSymbols_fr_CF', 'goog.i18n.DateTimeSymbols_fr_CG', 'goog.i18n.DateTimeSymbols_fr_CH', 'goog.i18n.DateTimeSymbols_fr_CI', 'goog.i18n.DateTimeSymbols_fr_CM', 'goog.i18n.DateTimeSymbols_fr_DJ', 'goog.i18n.DateTimeSymbols_fr_DZ', 'goog.i18n.DateTimeSymbols_fr_FR', 'goog.i18n.DateTimeSymbols_fr_GA', 'goog.i18n.DateTimeSymbols_fr_GF', 'goog.i18n.DateTimeSymbols_fr_GN', 'goog.i18n.DateTimeSymbols_fr_GP', 'goog.i18n.DateTimeSymbols_fr_GQ', 'goog.i18n.DateTimeSymbols_fr_HT', 'goog.i18n.DateTimeSymbols_fr_KM', 'goog.i18n.DateTimeSymbols_fr_LU', 'goog.i18n.DateTimeSymbols_fr_MA', 'goog.i18n.DateTimeSymbols_fr_MC', 'goog.i18n.DateTimeSymbols_fr_MF', 'goog.i18n.DateTimeSymbols_fr_MG', 'goog.i18n.DateTimeSymbols_fr_ML', 'goog.i18n.DateTimeSymbols_fr_MQ', 'goog.i18n.DateTimeSymbols_fr_MR', 'goog.i18n.DateTimeSymbols_fr_MU', 'goog.i18n.DateTimeSymbols_fr_NC', 'goog.i18n.DateTimeSymbols_fr_NE', 'goog.i18n.DateTimeSymbols_fr_PF', 'goog.i18n.DateTimeSymbols_fr_RE', 'goog.i18n.DateTimeSymbols_fr_RW', 'goog.i18n.DateTimeSymbols_fr_SC', 'goog.i18n.DateTimeSymbols_fr_SN', 'goog.i18n.DateTimeSymbols_fr_SY', 'goog.i18n.DateTimeSymbols_fr_TD', 'goog.i18n.DateTimeSymbols_fr_TG', 'goog.i18n.DateTimeSymbols_fr_TN', 'goog.i18n.DateTimeSymbols_fr_VU', 'goog.i18n.DateTimeSymbols_fr_YT', 'goog.i18n.DateTimeSymbols_fur', 'goog.i18n.DateTimeSymbols_fur_IT', 'goog.i18n.DateTimeSymbols_ga', 'goog.i18n.DateTimeSymbols_ga_IE', 'goog.i18n.DateTimeSymbols_gd', 'goog.i18n.DateTimeSymbols_gd_GB', 'goog.i18n.DateTimeSymbols_gl_ES', 'goog.i18n.DateTimeSymbols_gsw_CH', 'goog.i18n.DateTimeSymbols_gu_IN', 'goog.i18n.DateTimeSymbols_guz', 'goog.i18n.DateTimeSymbols_guz_KE', 'goog.i18n.DateTimeSymbols_gv', 'goog.i18n.DateTimeSymbols_gv_GB', 'goog.i18n.DateTimeSymbols_ha', 'goog.i18n.DateTimeSymbols_ha_Latn', 'goog.i18n.DateTimeSymbols_ha_Latn_GH', 'goog.i18n.DateTimeSymbols_ha_Latn_NE', 'goog.i18n.DateTimeSymbols_ha_Latn_NG', 'goog.i18n.DateTimeSymbols_haw_US', 'goog.i18n.DateTimeSymbols_he_IL', 'goog.i18n.DateTimeSymbols_hi_IN', 'goog.i18n.DateTimeSymbols_hr_BA', 'goog.i18n.DateTimeSymbols_hr_HR', 'goog.i18n.DateTimeSymbols_hu_HU', 'goog.i18n.DateTimeSymbols_hy', 'goog.i18n.DateTimeSymbols_hy_AM', 'goog.i18n.DateTimeSymbols_ia', 'goog.i18n.DateTimeSymbols_ia_FR', 'goog.i18n.DateTimeSymbols_id_ID', 'goog.i18n.DateTimeSymbols_ig', 'goog.i18n.DateTimeSymbols_ig_NG', 'goog.i18n.DateTimeSymbols_ii', 'goog.i18n.DateTimeSymbols_ii_CN', 'goog.i18n.DateTimeSymbols_is_IS', 'goog.i18n.DateTimeSymbols_it_CH', 'goog.i18n.DateTimeSymbols_it_IT', 'goog.i18n.DateTimeSymbols_it_SM', 'goog.i18n.DateTimeSymbols_ja_JP', 'goog.i18n.DateTimeSymbols_jgo', 'goog.i18n.DateTimeSymbols_jgo_CM', 'goog.i18n.DateTimeSymbols_jmc', 'goog.i18n.DateTimeSymbols_jmc_TZ', 'goog.i18n.DateTimeSymbols_ka', 'goog.i18n.DateTimeSymbols_ka_GE', 'goog.i18n.DateTimeSymbols_kab', 'goog.i18n.DateTimeSymbols_kab_DZ', 'goog.i18n.DateTimeSymbols_kam', 'goog.i18n.DateTimeSymbols_kam_KE', 'goog.i18n.DateTimeSymbols_kde', 'goog.i18n.DateTimeSymbols_kde_TZ', 'goog.i18n.DateTimeSymbols_kea', 'goog.i18n.DateTimeSymbols_kea_CV', 'goog.i18n.DateTimeSymbols_khq', 'goog.i18n.DateTimeSymbols_khq_ML', 'goog.i18n.DateTimeSymbols_ki', 'goog.i18n.DateTimeSymbols_ki_KE', 'goog.i18n.DateTimeSymbols_kk', 'goog.i18n.DateTimeSymbols_kk_Cyrl', 'goog.i18n.DateTimeSymbols_kk_Cyrl_KZ', 'goog.i18n.DateTimeSymbols_kkj', 'goog.i18n.DateTimeSymbols_kkj_CM', 'goog.i18n.DateTimeSymbols_kl', 'goog.i18n.DateTimeSymbols_kl_GL', 'goog.i18n.DateTimeSymbols_kln', 'goog.i18n.DateTimeSymbols_kln_KE', 'goog.i18n.DateTimeSymbols_km', 'goog.i18n.DateTimeSymbols_km_KH', 'goog.i18n.DateTimeSymbols_kn_IN', 'goog.i18n.DateTimeSymbols_ko_KP', 'goog.i18n.DateTimeSymbols_ko_KR', 'goog.i18n.DateTimeSymbols_kok', 'goog.i18n.DateTimeSymbols_kok_IN', 'goog.i18n.DateTimeSymbols_ks', 'goog.i18n.DateTimeSymbols_ks_Arab', 'goog.i18n.DateTimeSymbols_ks_Arab_IN', 'goog.i18n.DateTimeSymbols_ksb', 'goog.i18n.DateTimeSymbols_ksb_TZ', 'goog.i18n.DateTimeSymbols_ksf', 'goog.i18n.DateTimeSymbols_ksf_CM', 'goog.i18n.DateTimeSymbols_ksh', 'goog.i18n.DateTimeSymbols_ksh_DE', 'goog.i18n.DateTimeSymbols_kw', 'goog.i18n.DateTimeSymbols_kw_GB', 'goog.i18n.DateTimeSymbols_ky', 'goog.i18n.DateTimeSymbols_ky_KG', 'goog.i18n.DateTimeSymbols_lag', 'goog.i18n.DateTimeSymbols_lag_TZ', 'goog.i18n.DateTimeSymbols_lg', 'goog.i18n.DateTimeSymbols_lg_UG', 'goog.i18n.DateTimeSymbols_ln_AO', 'goog.i18n.DateTimeSymbols_ln_CD', 'goog.i18n.DateTimeSymbols_ln_CF', 'goog.i18n.DateTimeSymbols_ln_CG', 'goog.i18n.DateTimeSymbols_lo', 'goog.i18n.DateTimeSymbols_lo_LA', 'goog.i18n.DateTimeSymbols_lt_LT', 'goog.i18n.DateTimeSymbols_lu', 'goog.i18n.DateTimeSymbols_lu_CD', 'goog.i18n.DateTimeSymbols_luo', 'goog.i18n.DateTimeSymbols_luo_KE', 'goog.i18n.DateTimeSymbols_luy', 'goog.i18n.DateTimeSymbols_luy_KE', 'goog.i18n.DateTimeSymbols_lv_LV', 'goog.i18n.DateTimeSymbols_mas', 'goog.i18n.DateTimeSymbols_mas_KE', 'goog.i18n.DateTimeSymbols_mas_TZ', 'goog.i18n.DateTimeSymbols_mer', 'goog.i18n.DateTimeSymbols_mer_KE', 'goog.i18n.DateTimeSymbols_mfe', 'goog.i18n.DateTimeSymbols_mfe_MU', 'goog.i18n.DateTimeSymbols_mg', 'goog.i18n.DateTimeSymbols_mg_MG', 'goog.i18n.DateTimeSymbols_mgh', 'goog.i18n.DateTimeSymbols_mgh_MZ', 'goog.i18n.DateTimeSymbols_mgo', 'goog.i18n.DateTimeSymbols_mgo_CM', 'goog.i18n.DateTimeSymbols_mk', 'goog.i18n.DateTimeSymbols_mk_MK', 'goog.i18n.DateTimeSymbols_ml_IN', 'goog.i18n.DateTimeSymbols_mn', 'goog.i18n.DateTimeSymbols_mn_Cyrl', 'goog.i18n.DateTimeSymbols_mn_Cyrl_MN', 'goog.i18n.DateTimeSymbols_mr_IN', 'goog.i18n.DateTimeSymbols_ms_Latn', 'goog.i18n.DateTimeSymbols_ms_Latn_BN', 'goog.i18n.DateTimeSymbols_ms_Latn_MY', 'goog.i18n.DateTimeSymbols_ms_Latn_SG', 'goog.i18n.DateTimeSymbols_mt_MT', 'goog.i18n.DateTimeSymbols_mua', 'goog.i18n.DateTimeSymbols_mua_CM', 'goog.i18n.DateTimeSymbols_my', 'goog.i18n.DateTimeSymbols_my_MM', 'goog.i18n.DateTimeSymbols_naq', 'goog.i18n.DateTimeSymbols_naq_NA', 'goog.i18n.DateTimeSymbols_nb_NO', 'goog.i18n.DateTimeSymbols_nd', 'goog.i18n.DateTimeSymbols_nd_ZW', 'goog.i18n.DateTimeSymbols_ne', 'goog.i18n.DateTimeSymbols_ne_IN', 'goog.i18n.DateTimeSymbols_ne_NP', 'goog.i18n.DateTimeSymbols_nl_AW', 'goog.i18n.DateTimeSymbols_nl_BE', 'goog.i18n.DateTimeSymbols_nl_CW', 'goog.i18n.DateTimeSymbols_nl_NL', 'goog.i18n.DateTimeSymbols_nl_SR', 'goog.i18n.DateTimeSymbols_nl_SX', 'goog.i18n.DateTimeSymbols_nmg', 'goog.i18n.DateTimeSymbols_nmg_CM', 'goog.i18n.DateTimeSymbols_nn', 'goog.i18n.DateTimeSymbols_nn_NO', 'goog.i18n.DateTimeSymbols_nnh', 'goog.i18n.DateTimeSymbols_nnh_CM', 'goog.i18n.DateTimeSymbols_nr', 'goog.i18n.DateTimeSymbols_nr_ZA', 'goog.i18n.DateTimeSymbols_nso', 'goog.i18n.DateTimeSymbols_nso_ZA', 'goog.i18n.DateTimeSymbols_nus', 'goog.i18n.DateTimeSymbols_nus_SD', 'goog.i18n.DateTimeSymbols_nyn', 'goog.i18n.DateTimeSymbols_nyn_UG', 'goog.i18n.DateTimeSymbols_om', 'goog.i18n.DateTimeSymbols_om_ET', 'goog.i18n.DateTimeSymbols_om_KE', 'goog.i18n.DateTimeSymbols_or_IN', 'goog.i18n.DateTimeSymbols_os', 'goog.i18n.DateTimeSymbols_os_GE', 'goog.i18n.DateTimeSymbols_os_RU', 'goog.i18n.DateTimeSymbols_pa', 'goog.i18n.DateTimeSymbols_pa_Arab', 'goog.i18n.DateTimeSymbols_pa_Arab_PK', 'goog.i18n.DateTimeSymbols_pa_Guru', 'goog.i18n.DateTimeSymbols_pa_Guru_IN', 'goog.i18n.DateTimeSymbols_pl_PL', 'goog.i18n.DateTimeSymbols_ps', 'goog.i18n.DateTimeSymbols_ps_AF', 'goog.i18n.DateTimeSymbols_pt_AO', 'goog.i18n.DateTimeSymbols_pt_CV', 'goog.i18n.DateTimeSymbols_pt_GW', 'goog.i18n.DateTimeSymbols_pt_MO', 'goog.i18n.DateTimeSymbols_pt_MZ', 'goog.i18n.DateTimeSymbols_pt_ST', 'goog.i18n.DateTimeSymbols_pt_TL', 'goog.i18n.DateTimeSymbols_rm', 'goog.i18n.DateTimeSymbols_rm_CH', 'goog.i18n.DateTimeSymbols_rn', 'goog.i18n.DateTimeSymbols_rn_BI', 'goog.i18n.DateTimeSymbols_ro_MD', 'goog.i18n.DateTimeSymbols_ro_RO', 'goog.i18n.DateTimeSymbols_rof', 'goog.i18n.DateTimeSymbols_rof_TZ', 'goog.i18n.DateTimeSymbols_ru_BY', 'goog.i18n.DateTimeSymbols_ru_KG', 'goog.i18n.DateTimeSymbols_ru_KZ', 'goog.i18n.DateTimeSymbols_ru_MD', 'goog.i18n.DateTimeSymbols_ru_RU', 'goog.i18n.DateTimeSymbols_ru_UA', 'goog.i18n.DateTimeSymbols_rw', 'goog.i18n.DateTimeSymbols_rw_RW', 'goog.i18n.DateTimeSymbols_rwk', 'goog.i18n.DateTimeSymbols_rwk_TZ', 'goog.i18n.DateTimeSymbols_sah', 'goog.i18n.DateTimeSymbols_sah_RU', 'goog.i18n.DateTimeSymbols_saq', 'goog.i18n.DateTimeSymbols_saq_KE', 'goog.i18n.DateTimeSymbols_sbp', 'goog.i18n.DateTimeSymbols_sbp_TZ', 'goog.i18n.DateTimeSymbols_se', 'goog.i18n.DateTimeSymbols_se_FI', 'goog.i18n.DateTimeSymbols_se_NO', 'goog.i18n.DateTimeSymbols_seh', 'goog.i18n.DateTimeSymbols_seh_MZ', 'goog.i18n.DateTimeSymbols_ses', 'goog.i18n.DateTimeSymbols_ses_ML', 'goog.i18n.DateTimeSymbols_sg', 'goog.i18n.DateTimeSymbols_sg_CF', 'goog.i18n.DateTimeSymbols_shi', 'goog.i18n.DateTimeSymbols_shi_Latn', 'goog.i18n.DateTimeSymbols_shi_Latn_MA', 'goog.i18n.DateTimeSymbols_shi_Tfng', 'goog.i18n.DateTimeSymbols_shi_Tfng_MA', 'goog.i18n.DateTimeSymbols_si', 'goog.i18n.DateTimeSymbols_si_LK', 'goog.i18n.DateTimeSymbols_sk_SK', 'goog.i18n.DateTimeSymbols_sl_SI', 'goog.i18n.DateTimeSymbols_sn', 'goog.i18n.DateTimeSymbols_sn_ZW', 'goog.i18n.DateTimeSymbols_so', 'goog.i18n.DateTimeSymbols_so_DJ', 'goog.i18n.DateTimeSymbols_so_ET', 'goog.i18n.DateTimeSymbols_so_KE', 'goog.i18n.DateTimeSymbols_so_SO', 'goog.i18n.DateTimeSymbols_sq_AL', 'goog.i18n.DateTimeSymbols_sq_MK', 'goog.i18n.DateTimeSymbols_sq_XK', 'goog.i18n.DateTimeSymbols_sr_Cyrl', 'goog.i18n.DateTimeSymbols_sr_Cyrl_BA', 'goog.i18n.DateTimeSymbols_sr_Cyrl_ME', 'goog.i18n.DateTimeSymbols_sr_Cyrl_RS', 'goog.i18n.DateTimeSymbols_sr_Cyrl_XK', 'goog.i18n.DateTimeSymbols_sr_Latn', 'goog.i18n.DateTimeSymbols_sr_Latn_BA', 'goog.i18n.DateTimeSymbols_sr_Latn_ME', 'goog.i18n.DateTimeSymbols_sr_Latn_RS', 'goog.i18n.DateTimeSymbols_sr_Latn_XK', 'goog.i18n.DateTimeSymbols_ss', 'goog.i18n.DateTimeSymbols_ss_SZ', 'goog.i18n.DateTimeSymbols_ss_ZA', 'goog.i18n.DateTimeSymbols_ssy', 'goog.i18n.DateTimeSymbols_ssy_ER', 'goog.i18n.DateTimeSymbols_st', 'goog.i18n.DateTimeSymbols_st_LS', 'goog.i18n.DateTimeSymbols_st_ZA', 'goog.i18n.DateTimeSymbols_sv_AX', 'goog.i18n.DateTimeSymbols_sv_FI', 'goog.i18n.DateTimeSymbols_sv_SE', 'goog.i18n.DateTimeSymbols_sw_KE', 'goog.i18n.DateTimeSymbols_sw_TZ', 'goog.i18n.DateTimeSymbols_sw_UG', 'goog.i18n.DateTimeSymbols_swc', 'goog.i18n.DateTimeSymbols_swc_CD', 'goog.i18n.DateTimeSymbols_ta_IN', 'goog.i18n.DateTimeSymbols_ta_LK', 'goog.i18n.DateTimeSymbols_ta_MY', 'goog.i18n.DateTimeSymbols_ta_SG', 'goog.i18n.DateTimeSymbols_te_IN', 'goog.i18n.DateTimeSymbols_teo', 'goog.i18n.DateTimeSymbols_teo_KE', 'goog.i18n.DateTimeSymbols_teo_UG', 'goog.i18n.DateTimeSymbols_tg', 'goog.i18n.DateTimeSymbols_tg_Cyrl', 'goog.i18n.DateTimeSymbols_tg_Cyrl_TJ', 'goog.i18n.DateTimeSymbols_th_TH', 'goog.i18n.DateTimeSymbols_ti', 'goog.i18n.DateTimeSymbols_ti_ER', 'goog.i18n.DateTimeSymbols_ti_ET', 'goog.i18n.DateTimeSymbols_tig', 'goog.i18n.DateTimeSymbols_tig_ER', 'goog.i18n.DateTimeSymbols_tn', 'goog.i18n.DateTimeSymbols_tn_BW', 'goog.i18n.DateTimeSymbols_tn_ZA', 'goog.i18n.DateTimeSymbols_to', 'goog.i18n.DateTimeSymbols_to_TO', 'goog.i18n.DateTimeSymbols_tr_CY', 'goog.i18n.DateTimeSymbols_tr_TR', 'goog.i18n.DateTimeSymbols_ts', 'goog.i18n.DateTimeSymbols_ts_ZA', 'goog.i18n.DateTimeSymbols_twq', 'goog.i18n.DateTimeSymbols_twq_NE', 'goog.i18n.DateTimeSymbols_tzm', 'goog.i18n.DateTimeSymbols_tzm_Latn', 'goog.i18n.DateTimeSymbols_tzm_Latn_MA', 'goog.i18n.DateTimeSymbols_uk_UA', 'goog.i18n.DateTimeSymbols_ur_IN', 'goog.i18n.DateTimeSymbols_ur_PK', 'goog.i18n.DateTimeSymbols_uz', 'goog.i18n.DateTimeSymbols_uz_Arab', 'goog.i18n.DateTimeSymbols_uz_Arab_AF', 'goog.i18n.DateTimeSymbols_uz_Cyrl', 'goog.i18n.DateTimeSymbols_uz_Cyrl_UZ', 'goog.i18n.DateTimeSymbols_uz_Latn', 'goog.i18n.DateTimeSymbols_uz_Latn_UZ', 'goog.i18n.DateTimeSymbols_vai', 'goog.i18n.DateTimeSymbols_vai_Latn', 'goog.i18n.DateTimeSymbols_vai_Latn_LR', 'goog.i18n.DateTimeSymbols_vai_Vaii', 'goog.i18n.DateTimeSymbols_vai_Vaii_LR', 'goog.i18n.DateTimeSymbols_ve', 'goog.i18n.DateTimeSymbols_ve_ZA', 'goog.i18n.DateTimeSymbols_vi_VN', 'goog.i18n.DateTimeSymbols_vo', 'goog.i18n.DateTimeSymbols_vun', 'goog.i18n.DateTimeSymbols_vun_TZ', 'goog.i18n.DateTimeSymbols_wae', 'goog.i18n.DateTimeSymbols_wae_CH', 'goog.i18n.DateTimeSymbols_wal', 'goog.i18n.DateTimeSymbols_wal_ET', 'goog.i18n.DateTimeSymbols_xh', 'goog.i18n.DateTimeSymbols_xh_ZA', 'goog.i18n.DateTimeSymbols_xog', 'goog.i18n.DateTimeSymbols_xog_UG', 'goog.i18n.DateTimeSymbols_yav', 'goog.i18n.DateTimeSymbols_yav_CM', 'goog.i18n.DateTimeSymbols_yo', 'goog.i18n.DateTimeSymbols_yo_NG', 'goog.i18n.DateTimeSymbols_zh_Hans', 'goog.i18n.DateTimeSymbols_zh_Hans_CN', 'goog.i18n.DateTimeSymbols_zh_Hans_HK', 'goog.i18n.DateTimeSymbols_zh_Hans_MO', 'goog.i18n.DateTimeSymbols_zh_Hans_SG', 'goog.i18n.DateTimeSymbols_zh_Hant', 'goog.i18n.DateTimeSymbols_zh_Hant_HK', 'goog.i18n.DateTimeSymbols_zh_Hant_MO', 'goog.i18n.DateTimeSymbols_zh_Hant_TW', 'goog.i18n.DateTimeSymbols_zu_ZA'], ['goog.i18n.DateTimeSymbols']); +goog.addDependency('i18n/datetimeformat.js', ['goog.i18n.DateTimeFormat', 'goog.i18n.DateTimeFormat.Format'], ['goog.asserts', 'goog.date', 'goog.i18n.DateTimeSymbols', 'goog.i18n.TimeZone', 'goog.string']); +goog.addDependency('i18n/datetimeformat_test.js', ['goog.i18n.DateTimeFormatTest'], ['goog.date.Date', 'goog.date.DateTime', 'goog.i18n.DateTimeFormat', 'goog.i18n.DateTimePatterns', 'goog.i18n.DateTimePatterns_de', 'goog.i18n.DateTimePatterns_en', 'goog.i18n.DateTimePatterns_fa', 'goog.i18n.DateTimePatterns_fr', 'goog.i18n.DateTimePatterns_ja', 'goog.i18n.DateTimePatterns_sv', 'goog.i18n.DateTimeSymbols', 'goog.i18n.DateTimeSymbols_ar_AE', 'goog.i18n.DateTimeSymbols_ar_SA', 'goog.i18n.DateTimeSymbols_bn_BD', 'goog.i18n.DateTimeSymbols_de', 'goog.i18n.DateTimeSymbols_en', 'goog.i18n.DateTimeSymbols_en_GB', 'goog.i18n.DateTimeSymbols_en_IE', 'goog.i18n.DateTimeSymbols_en_IN', 'goog.i18n.DateTimeSymbols_en_US', 'goog.i18n.DateTimeSymbols_fa', 'goog.i18n.DateTimeSymbols_fr', 'goog.i18n.DateTimeSymbols_fr_DJ', 'goog.i18n.DateTimeSymbols_he_IL', 'goog.i18n.DateTimeSymbols_ja', 'goog.i18n.DateTimeSymbols_ro_RO', 'goog.i18n.DateTimeSymbols_sv', 'goog.i18n.TimeZone', 'goog.testing.jsunit']); +goog.addDependency('i18n/datetimeparse.js', ['goog.i18n.DateTimeParse'], ['goog.date', 'goog.i18n.DateTimeFormat', 'goog.i18n.DateTimeSymbols']); +goog.addDependency('i18n/datetimeparse_test.js', ['goog.i18n.DateTimeParseTest'], ['goog.date.Date', 'goog.i18n.DateTimeFormat', 'goog.i18n.DateTimeParse', 'goog.i18n.DateTimeSymbols', 'goog.i18n.DateTimeSymbols_en', 'goog.i18n.DateTimeSymbols_fa', 'goog.i18n.DateTimeSymbols_fr', 'goog.i18n.DateTimeSymbols_pl', 'goog.i18n.DateTimeSymbols_zh', 'goog.testing.ExpectedFailures', 'goog.testing.jsunit', 'goog.userAgent']); +goog.addDependency('i18n/datetimepatterns.js', ['goog.i18n.DateTimePatterns', 'goog.i18n.DateTimePatterns_af', 'goog.i18n.DateTimePatterns_am', 'goog.i18n.DateTimePatterns_ar', 'goog.i18n.DateTimePatterns_az', 'goog.i18n.DateTimePatterns_bg', 'goog.i18n.DateTimePatterns_bn', 'goog.i18n.DateTimePatterns_br', 'goog.i18n.DateTimePatterns_ca', 'goog.i18n.DateTimePatterns_chr', 'goog.i18n.DateTimePatterns_cs', 'goog.i18n.DateTimePatterns_cy', 'goog.i18n.DateTimePatterns_da', 'goog.i18n.DateTimePatterns_de', 'goog.i18n.DateTimePatterns_de_AT', 'goog.i18n.DateTimePatterns_de_CH', 'goog.i18n.DateTimePatterns_el', 'goog.i18n.DateTimePatterns_en', 'goog.i18n.DateTimePatterns_en_AU', 'goog.i18n.DateTimePatterns_en_GB', 'goog.i18n.DateTimePatterns_en_IE', 'goog.i18n.DateTimePatterns_en_IN', 'goog.i18n.DateTimePatterns_en_SG', 'goog.i18n.DateTimePatterns_en_US', 'goog.i18n.DateTimePatterns_en_ZA', 'goog.i18n.DateTimePatterns_es', 'goog.i18n.DateTimePatterns_es_419', 'goog.i18n.DateTimePatterns_es_ES', 'goog.i18n.DateTimePatterns_et', 'goog.i18n.DateTimePatterns_eu', 'goog.i18n.DateTimePatterns_fa', 'goog.i18n.DateTimePatterns_fi', 'goog.i18n.DateTimePatterns_fil', 'goog.i18n.DateTimePatterns_fr', 'goog.i18n.DateTimePatterns_fr_CA', 'goog.i18n.DateTimePatterns_gl', 'goog.i18n.DateTimePatterns_gsw', 'goog.i18n.DateTimePatterns_gu', 'goog.i18n.DateTimePatterns_haw', 'goog.i18n.DateTimePatterns_he', 'goog.i18n.DateTimePatterns_hi', 'goog.i18n.DateTimePatterns_hr', 'goog.i18n.DateTimePatterns_hu', 'goog.i18n.DateTimePatterns_hy', 'goog.i18n.DateTimePatterns_id', 'goog.i18n.DateTimePatterns_in', 'goog.i18n.DateTimePatterns_is', 'goog.i18n.DateTimePatterns_it', 'goog.i18n.DateTimePatterns_iw', 'goog.i18n.DateTimePatterns_ja', 'goog.i18n.DateTimePatterns_ka', 'goog.i18n.DateTimePatterns_kk', 'goog.i18n.DateTimePatterns_km', 'goog.i18n.DateTimePatterns_kn', 'goog.i18n.DateTimePatterns_ko', 'goog.i18n.DateTimePatterns_ky', 'goog.i18n.DateTimePatterns_ln', 'goog.i18n.DateTimePatterns_lo', 'goog.i18n.DateTimePatterns_lt', 'goog.i18n.DateTimePatterns_lv', 'goog.i18n.DateTimePatterns_mk', 'goog.i18n.DateTimePatterns_ml', 'goog.i18n.DateTimePatterns_mn', 'goog.i18n.DateTimePatterns_mo', 'goog.i18n.DateTimePatterns_mr', 'goog.i18n.DateTimePatterns_ms', 'goog.i18n.DateTimePatterns_mt', 'goog.i18n.DateTimePatterns_my', 'goog.i18n.DateTimePatterns_nb', 'goog.i18n.DateTimePatterns_ne', 'goog.i18n.DateTimePatterns_nl', 'goog.i18n.DateTimePatterns_no', 'goog.i18n.DateTimePatterns_no_NO', 'goog.i18n.DateTimePatterns_or', 'goog.i18n.DateTimePatterns_pa', 'goog.i18n.DateTimePatterns_pl', 'goog.i18n.DateTimePatterns_pt', 'goog.i18n.DateTimePatterns_pt_BR', 'goog.i18n.DateTimePatterns_pt_PT', 'goog.i18n.DateTimePatterns_ro', 'goog.i18n.DateTimePatterns_ru', 'goog.i18n.DateTimePatterns_sh', 'goog.i18n.DateTimePatterns_si', 'goog.i18n.DateTimePatterns_sk', 'goog.i18n.DateTimePatterns_sl', 'goog.i18n.DateTimePatterns_sq', 'goog.i18n.DateTimePatterns_sr', 'goog.i18n.DateTimePatterns_sv', 'goog.i18n.DateTimePatterns_sw', 'goog.i18n.DateTimePatterns_ta', 'goog.i18n.DateTimePatterns_te', 'goog.i18n.DateTimePatterns_th', 'goog.i18n.DateTimePatterns_tl', 'goog.i18n.DateTimePatterns_tr', 'goog.i18n.DateTimePatterns_uk', 'goog.i18n.DateTimePatterns_ur', 'goog.i18n.DateTimePatterns_uz', 'goog.i18n.DateTimePatterns_vi', 'goog.i18n.DateTimePatterns_zh', 'goog.i18n.DateTimePatterns_zh_CN', 'goog.i18n.DateTimePatterns_zh_HK', 'goog.i18n.DateTimePatterns_zh_TW', 'goog.i18n.DateTimePatterns_zu'], []); +goog.addDependency('i18n/datetimepatternsext.js', ['goog.i18n.DateTimePatternsExt', 'goog.i18n.DateTimePatterns_af_NA', 'goog.i18n.DateTimePatterns_af_ZA', 'goog.i18n.DateTimePatterns_agq', 'goog.i18n.DateTimePatterns_agq_CM', 'goog.i18n.DateTimePatterns_ak', 'goog.i18n.DateTimePatterns_ak_GH', 'goog.i18n.DateTimePatterns_am_ET', 'goog.i18n.DateTimePatterns_ar_001', 'goog.i18n.DateTimePatterns_ar_AE', 'goog.i18n.DateTimePatterns_ar_BH', 'goog.i18n.DateTimePatterns_ar_DJ', 'goog.i18n.DateTimePatterns_ar_DZ', 'goog.i18n.DateTimePatterns_ar_EG', 'goog.i18n.DateTimePatterns_ar_EH', 'goog.i18n.DateTimePatterns_ar_ER', 'goog.i18n.DateTimePatterns_ar_IL', 'goog.i18n.DateTimePatterns_ar_IQ', 'goog.i18n.DateTimePatterns_ar_JO', 'goog.i18n.DateTimePatterns_ar_KM', 'goog.i18n.DateTimePatterns_ar_KW', 'goog.i18n.DateTimePatterns_ar_LB', 'goog.i18n.DateTimePatterns_ar_LY', 'goog.i18n.DateTimePatterns_ar_MA', 'goog.i18n.DateTimePatterns_ar_MR', 'goog.i18n.DateTimePatterns_ar_OM', 'goog.i18n.DateTimePatterns_ar_PS', 'goog.i18n.DateTimePatterns_ar_QA', 'goog.i18n.DateTimePatterns_ar_SA', 'goog.i18n.DateTimePatterns_ar_SD', 'goog.i18n.DateTimePatterns_ar_SO', 'goog.i18n.DateTimePatterns_ar_SS', 'goog.i18n.DateTimePatterns_ar_SY', 'goog.i18n.DateTimePatterns_ar_TD', 'goog.i18n.DateTimePatterns_ar_TN', 'goog.i18n.DateTimePatterns_ar_YE', 'goog.i18n.DateTimePatterns_as', 'goog.i18n.DateTimePatterns_as_IN', 'goog.i18n.DateTimePatterns_asa', 'goog.i18n.DateTimePatterns_asa_TZ', 'goog.i18n.DateTimePatterns_az_Cyrl', 'goog.i18n.DateTimePatterns_az_Cyrl_AZ', 'goog.i18n.DateTimePatterns_az_Latn', 'goog.i18n.DateTimePatterns_az_Latn_AZ', 'goog.i18n.DateTimePatterns_bas', 'goog.i18n.DateTimePatterns_bas_CM', 'goog.i18n.DateTimePatterns_be', 'goog.i18n.DateTimePatterns_be_BY', 'goog.i18n.DateTimePatterns_bem', 'goog.i18n.DateTimePatterns_bem_ZM', 'goog.i18n.DateTimePatterns_bez', 'goog.i18n.DateTimePatterns_bez_TZ', 'goog.i18n.DateTimePatterns_bg_BG', 'goog.i18n.DateTimePatterns_bm', 'goog.i18n.DateTimePatterns_bm_ML', 'goog.i18n.DateTimePatterns_bn_BD', 'goog.i18n.DateTimePatterns_bn_IN', 'goog.i18n.DateTimePatterns_bo', 'goog.i18n.DateTimePatterns_bo_CN', 'goog.i18n.DateTimePatterns_bo_IN', 'goog.i18n.DateTimePatterns_br_FR', 'goog.i18n.DateTimePatterns_brx', 'goog.i18n.DateTimePatterns_brx_IN', 'goog.i18n.DateTimePatterns_bs', 'goog.i18n.DateTimePatterns_bs_Cyrl', 'goog.i18n.DateTimePatterns_bs_Cyrl_BA', 'goog.i18n.DateTimePatterns_bs_Latn', 'goog.i18n.DateTimePatterns_bs_Latn_BA', 'goog.i18n.DateTimePatterns_ca_AD', 'goog.i18n.DateTimePatterns_ca_ES', 'goog.i18n.DateTimePatterns_ca_FR', 'goog.i18n.DateTimePatterns_ca_IT', 'goog.i18n.DateTimePatterns_cgg', 'goog.i18n.DateTimePatterns_cgg_UG', 'goog.i18n.DateTimePatterns_chr_US', 'goog.i18n.DateTimePatterns_cs_CZ', 'goog.i18n.DateTimePatterns_cy_GB', 'goog.i18n.DateTimePatterns_da_DK', 'goog.i18n.DateTimePatterns_da_GL', 'goog.i18n.DateTimePatterns_dav', 'goog.i18n.DateTimePatterns_dav_KE', 'goog.i18n.DateTimePatterns_de_BE', 'goog.i18n.DateTimePatterns_de_DE', 'goog.i18n.DateTimePatterns_de_LI', 'goog.i18n.DateTimePatterns_de_LU', 'goog.i18n.DateTimePatterns_dje', 'goog.i18n.DateTimePatterns_dje_NE', 'goog.i18n.DateTimePatterns_dua', 'goog.i18n.DateTimePatterns_dua_CM', 'goog.i18n.DateTimePatterns_dyo', 'goog.i18n.DateTimePatterns_dyo_SN', 'goog.i18n.DateTimePatterns_dz', 'goog.i18n.DateTimePatterns_dz_BT', 'goog.i18n.DateTimePatterns_ebu', 'goog.i18n.DateTimePatterns_ebu_KE', 'goog.i18n.DateTimePatterns_ee', 'goog.i18n.DateTimePatterns_ee_GH', 'goog.i18n.DateTimePatterns_ee_TG', 'goog.i18n.DateTimePatterns_el_CY', 'goog.i18n.DateTimePatterns_el_GR', 'goog.i18n.DateTimePatterns_en_001', 'goog.i18n.DateTimePatterns_en_150', 'goog.i18n.DateTimePatterns_en_AG', 'goog.i18n.DateTimePatterns_en_AI', 'goog.i18n.DateTimePatterns_en_AS', 'goog.i18n.DateTimePatterns_en_BB', 'goog.i18n.DateTimePatterns_en_BE', 'goog.i18n.DateTimePatterns_en_BM', 'goog.i18n.DateTimePatterns_en_BS', 'goog.i18n.DateTimePatterns_en_BW', 'goog.i18n.DateTimePatterns_en_BZ', 'goog.i18n.DateTimePatterns_en_CA', 'goog.i18n.DateTimePatterns_en_CC', 'goog.i18n.DateTimePatterns_en_CK', 'goog.i18n.DateTimePatterns_en_CM', 'goog.i18n.DateTimePatterns_en_CX', 'goog.i18n.DateTimePatterns_en_DG', 'goog.i18n.DateTimePatterns_en_DM', 'goog.i18n.DateTimePatterns_en_ER', 'goog.i18n.DateTimePatterns_en_FJ', 'goog.i18n.DateTimePatterns_en_FK', 'goog.i18n.DateTimePatterns_en_FM', 'goog.i18n.DateTimePatterns_en_GD', 'goog.i18n.DateTimePatterns_en_GG', 'goog.i18n.DateTimePatterns_en_GH', 'goog.i18n.DateTimePatterns_en_GI', 'goog.i18n.DateTimePatterns_en_GM', 'goog.i18n.DateTimePatterns_en_GU', 'goog.i18n.DateTimePatterns_en_GY', 'goog.i18n.DateTimePatterns_en_HK', 'goog.i18n.DateTimePatterns_en_IM', 'goog.i18n.DateTimePatterns_en_IO', 'goog.i18n.DateTimePatterns_en_JE', 'goog.i18n.DateTimePatterns_en_JM', 'goog.i18n.DateTimePatterns_en_KE', 'goog.i18n.DateTimePatterns_en_KI', 'goog.i18n.DateTimePatterns_en_KN', 'goog.i18n.DateTimePatterns_en_KY', 'goog.i18n.DateTimePatterns_en_LC', 'goog.i18n.DateTimePatterns_en_LR', 'goog.i18n.DateTimePatterns_en_LS', 'goog.i18n.DateTimePatterns_en_MG', 'goog.i18n.DateTimePatterns_en_MH', 'goog.i18n.DateTimePatterns_en_MO', 'goog.i18n.DateTimePatterns_en_MP', 'goog.i18n.DateTimePatterns_en_MS', 'goog.i18n.DateTimePatterns_en_MT', 'goog.i18n.DateTimePatterns_en_MU', 'goog.i18n.DateTimePatterns_en_MW', 'goog.i18n.DateTimePatterns_en_NA', 'goog.i18n.DateTimePatterns_en_NF', 'goog.i18n.DateTimePatterns_en_NG', 'goog.i18n.DateTimePatterns_en_NR', 'goog.i18n.DateTimePatterns_en_NU', 'goog.i18n.DateTimePatterns_en_NZ', 'goog.i18n.DateTimePatterns_en_PG', 'goog.i18n.DateTimePatterns_en_PH', 'goog.i18n.DateTimePatterns_en_PK', 'goog.i18n.DateTimePatterns_en_PN', 'goog.i18n.DateTimePatterns_en_PR', 'goog.i18n.DateTimePatterns_en_PW', 'goog.i18n.DateTimePatterns_en_RW', 'goog.i18n.DateTimePatterns_en_SB', 'goog.i18n.DateTimePatterns_en_SC', 'goog.i18n.DateTimePatterns_en_SD', 'goog.i18n.DateTimePatterns_en_SH', 'goog.i18n.DateTimePatterns_en_SL', 'goog.i18n.DateTimePatterns_en_SS', 'goog.i18n.DateTimePatterns_en_SX', 'goog.i18n.DateTimePatterns_en_SZ', 'goog.i18n.DateTimePatterns_en_TC', 'goog.i18n.DateTimePatterns_en_TK', 'goog.i18n.DateTimePatterns_en_TO', 'goog.i18n.DateTimePatterns_en_TT', 'goog.i18n.DateTimePatterns_en_TV', 'goog.i18n.DateTimePatterns_en_TZ', 'goog.i18n.DateTimePatterns_en_UG', 'goog.i18n.DateTimePatterns_en_UM', 'goog.i18n.DateTimePatterns_en_US_POSIX', 'goog.i18n.DateTimePatterns_en_VC', 'goog.i18n.DateTimePatterns_en_VG', 'goog.i18n.DateTimePatterns_en_VI', 'goog.i18n.DateTimePatterns_en_VU', 'goog.i18n.DateTimePatterns_en_WS', 'goog.i18n.DateTimePatterns_en_ZM', 'goog.i18n.DateTimePatterns_en_ZW', 'goog.i18n.DateTimePatterns_eo', 'goog.i18n.DateTimePatterns_es_AR', 'goog.i18n.DateTimePatterns_es_BO', 'goog.i18n.DateTimePatterns_es_CL', 'goog.i18n.DateTimePatterns_es_CO', 'goog.i18n.DateTimePatterns_es_CR', 'goog.i18n.DateTimePatterns_es_CU', 'goog.i18n.DateTimePatterns_es_DO', 'goog.i18n.DateTimePatterns_es_EA', 'goog.i18n.DateTimePatterns_es_EC', 'goog.i18n.DateTimePatterns_es_GQ', 'goog.i18n.DateTimePatterns_es_GT', 'goog.i18n.DateTimePatterns_es_HN', 'goog.i18n.DateTimePatterns_es_IC', 'goog.i18n.DateTimePatterns_es_MX', 'goog.i18n.DateTimePatterns_es_NI', 'goog.i18n.DateTimePatterns_es_PA', 'goog.i18n.DateTimePatterns_es_PE', 'goog.i18n.DateTimePatterns_es_PH', 'goog.i18n.DateTimePatterns_es_PR', 'goog.i18n.DateTimePatterns_es_PY', 'goog.i18n.DateTimePatterns_es_SV', 'goog.i18n.DateTimePatterns_es_US', 'goog.i18n.DateTimePatterns_es_UY', 'goog.i18n.DateTimePatterns_es_VE', 'goog.i18n.DateTimePatterns_et_EE', 'goog.i18n.DateTimePatterns_eu_ES', 'goog.i18n.DateTimePatterns_ewo', 'goog.i18n.DateTimePatterns_ewo_CM', 'goog.i18n.DateTimePatterns_fa_AF', 'goog.i18n.DateTimePatterns_fa_IR', 'goog.i18n.DateTimePatterns_ff', 'goog.i18n.DateTimePatterns_ff_SN', 'goog.i18n.DateTimePatterns_fi_FI', 'goog.i18n.DateTimePatterns_fil_PH', 'goog.i18n.DateTimePatterns_fo', 'goog.i18n.DateTimePatterns_fo_FO', 'goog.i18n.DateTimePatterns_fr_BE', 'goog.i18n.DateTimePatterns_fr_BF', 'goog.i18n.DateTimePatterns_fr_BI', 'goog.i18n.DateTimePatterns_fr_BJ', 'goog.i18n.DateTimePatterns_fr_BL', 'goog.i18n.DateTimePatterns_fr_CD', 'goog.i18n.DateTimePatterns_fr_CF', 'goog.i18n.DateTimePatterns_fr_CG', 'goog.i18n.DateTimePatterns_fr_CH', 'goog.i18n.DateTimePatterns_fr_CI', 'goog.i18n.DateTimePatterns_fr_CM', 'goog.i18n.DateTimePatterns_fr_DJ', 'goog.i18n.DateTimePatterns_fr_DZ', 'goog.i18n.DateTimePatterns_fr_FR', 'goog.i18n.DateTimePatterns_fr_GA', 'goog.i18n.DateTimePatterns_fr_GF', 'goog.i18n.DateTimePatterns_fr_GN', 'goog.i18n.DateTimePatterns_fr_GP', 'goog.i18n.DateTimePatterns_fr_GQ', 'goog.i18n.DateTimePatterns_fr_HT', 'goog.i18n.DateTimePatterns_fr_KM', 'goog.i18n.DateTimePatterns_fr_LU', 'goog.i18n.DateTimePatterns_fr_MA', 'goog.i18n.DateTimePatterns_fr_MC', 'goog.i18n.DateTimePatterns_fr_MF', 'goog.i18n.DateTimePatterns_fr_MG', 'goog.i18n.DateTimePatterns_fr_ML', 'goog.i18n.DateTimePatterns_fr_MQ', 'goog.i18n.DateTimePatterns_fr_MR', 'goog.i18n.DateTimePatterns_fr_MU', 'goog.i18n.DateTimePatterns_fr_NC', 'goog.i18n.DateTimePatterns_fr_NE', 'goog.i18n.DateTimePatterns_fr_PF', 'goog.i18n.DateTimePatterns_fr_PM', 'goog.i18n.DateTimePatterns_fr_RE', 'goog.i18n.DateTimePatterns_fr_RW', 'goog.i18n.DateTimePatterns_fr_SC', 'goog.i18n.DateTimePatterns_fr_SN', 'goog.i18n.DateTimePatterns_fr_SY', 'goog.i18n.DateTimePatterns_fr_TD', 'goog.i18n.DateTimePatterns_fr_TG', 'goog.i18n.DateTimePatterns_fr_TN', 'goog.i18n.DateTimePatterns_fr_VU', 'goog.i18n.DateTimePatterns_fr_WF', 'goog.i18n.DateTimePatterns_fr_YT', 'goog.i18n.DateTimePatterns_ga', 'goog.i18n.DateTimePatterns_ga_IE', 'goog.i18n.DateTimePatterns_gl_ES', 'goog.i18n.DateTimePatterns_gsw_CH', 'goog.i18n.DateTimePatterns_gsw_LI', 'goog.i18n.DateTimePatterns_gu_IN', 'goog.i18n.DateTimePatterns_guz', 'goog.i18n.DateTimePatterns_guz_KE', 'goog.i18n.DateTimePatterns_gv', 'goog.i18n.DateTimePatterns_gv_IM', 'goog.i18n.DateTimePatterns_ha', 'goog.i18n.DateTimePatterns_ha_Latn', 'goog.i18n.DateTimePatterns_ha_Latn_GH', 'goog.i18n.DateTimePatterns_ha_Latn_NE', 'goog.i18n.DateTimePatterns_ha_Latn_NG', 'goog.i18n.DateTimePatterns_haw_US', 'goog.i18n.DateTimePatterns_he_IL', 'goog.i18n.DateTimePatterns_hi_IN', 'goog.i18n.DateTimePatterns_hr_BA', 'goog.i18n.DateTimePatterns_hr_HR', 'goog.i18n.DateTimePatterns_hu_HU', 'goog.i18n.DateTimePatterns_hy_AM', 'goog.i18n.DateTimePatterns_id_ID', 'goog.i18n.DateTimePatterns_ig', 'goog.i18n.DateTimePatterns_ig_NG', 'goog.i18n.DateTimePatterns_ii', 'goog.i18n.DateTimePatterns_ii_CN', 'goog.i18n.DateTimePatterns_is_IS', 'goog.i18n.DateTimePatterns_it_CH', 'goog.i18n.DateTimePatterns_it_IT', 'goog.i18n.DateTimePatterns_it_SM', 'goog.i18n.DateTimePatterns_ja_JP', 'goog.i18n.DateTimePatterns_jgo', 'goog.i18n.DateTimePatterns_jgo_CM', 'goog.i18n.DateTimePatterns_jmc', 'goog.i18n.DateTimePatterns_jmc_TZ', 'goog.i18n.DateTimePatterns_ka_GE', 'goog.i18n.DateTimePatterns_kab', 'goog.i18n.DateTimePatterns_kab_DZ', 'goog.i18n.DateTimePatterns_kam', 'goog.i18n.DateTimePatterns_kam_KE', 'goog.i18n.DateTimePatterns_kde', 'goog.i18n.DateTimePatterns_kde_TZ', 'goog.i18n.DateTimePatterns_kea', 'goog.i18n.DateTimePatterns_kea_CV', 'goog.i18n.DateTimePatterns_khq', 'goog.i18n.DateTimePatterns_khq_ML', 'goog.i18n.DateTimePatterns_ki', 'goog.i18n.DateTimePatterns_ki_KE', 'goog.i18n.DateTimePatterns_kk_Cyrl', 'goog.i18n.DateTimePatterns_kk_Cyrl_KZ', 'goog.i18n.DateTimePatterns_kkj', 'goog.i18n.DateTimePatterns_kkj_CM', 'goog.i18n.DateTimePatterns_kl', 'goog.i18n.DateTimePatterns_kl_GL', 'goog.i18n.DateTimePatterns_kln', 'goog.i18n.DateTimePatterns_kln_KE', 'goog.i18n.DateTimePatterns_km_KH', 'goog.i18n.DateTimePatterns_kn_IN', 'goog.i18n.DateTimePatterns_ko_KP', 'goog.i18n.DateTimePatterns_ko_KR', 'goog.i18n.DateTimePatterns_kok', 'goog.i18n.DateTimePatterns_kok_IN', 'goog.i18n.DateTimePatterns_ks', 'goog.i18n.DateTimePatterns_ks_Arab', 'goog.i18n.DateTimePatterns_ks_Arab_IN', 'goog.i18n.DateTimePatterns_ksb', 'goog.i18n.DateTimePatterns_ksb_TZ', 'goog.i18n.DateTimePatterns_ksf', 'goog.i18n.DateTimePatterns_ksf_CM', 'goog.i18n.DateTimePatterns_kw', 'goog.i18n.DateTimePatterns_kw_GB', 'goog.i18n.DateTimePatterns_ky_Cyrl', 'goog.i18n.DateTimePatterns_ky_Cyrl_KG', 'goog.i18n.DateTimePatterns_lag', 'goog.i18n.DateTimePatterns_lag_TZ', 'goog.i18n.DateTimePatterns_lg', 'goog.i18n.DateTimePatterns_lg_UG', 'goog.i18n.DateTimePatterns_lkt', 'goog.i18n.DateTimePatterns_lkt_US', 'goog.i18n.DateTimePatterns_ln_AO', 'goog.i18n.DateTimePatterns_ln_CD', 'goog.i18n.DateTimePatterns_ln_CF', 'goog.i18n.DateTimePatterns_ln_CG', 'goog.i18n.DateTimePatterns_lo_LA', 'goog.i18n.DateTimePatterns_lt_LT', 'goog.i18n.DateTimePatterns_lu', 'goog.i18n.DateTimePatterns_lu_CD', 'goog.i18n.DateTimePatterns_luo', 'goog.i18n.DateTimePatterns_luo_KE', 'goog.i18n.DateTimePatterns_luy', 'goog.i18n.DateTimePatterns_luy_KE', 'goog.i18n.DateTimePatterns_lv_LV', 'goog.i18n.DateTimePatterns_mas', 'goog.i18n.DateTimePatterns_mas_KE', 'goog.i18n.DateTimePatterns_mas_TZ', 'goog.i18n.DateTimePatterns_mer', 'goog.i18n.DateTimePatterns_mer_KE', 'goog.i18n.DateTimePatterns_mfe', 'goog.i18n.DateTimePatterns_mfe_MU', 'goog.i18n.DateTimePatterns_mg', 'goog.i18n.DateTimePatterns_mg_MG', 'goog.i18n.DateTimePatterns_mgh', 'goog.i18n.DateTimePatterns_mgh_MZ', 'goog.i18n.DateTimePatterns_mgo', 'goog.i18n.DateTimePatterns_mgo_CM', 'goog.i18n.DateTimePatterns_mk_MK', 'goog.i18n.DateTimePatterns_ml_IN', 'goog.i18n.DateTimePatterns_mn_Cyrl', 'goog.i18n.DateTimePatterns_mn_Cyrl_MN', 'goog.i18n.DateTimePatterns_mr_IN', 'goog.i18n.DateTimePatterns_ms_Latn', 'goog.i18n.DateTimePatterns_ms_Latn_BN', 'goog.i18n.DateTimePatterns_ms_Latn_MY', 'goog.i18n.DateTimePatterns_ms_Latn_SG', 'goog.i18n.DateTimePatterns_mt_MT', 'goog.i18n.DateTimePatterns_mua', 'goog.i18n.DateTimePatterns_mua_CM', 'goog.i18n.DateTimePatterns_my_MM', 'goog.i18n.DateTimePatterns_naq', 'goog.i18n.DateTimePatterns_naq_NA', 'goog.i18n.DateTimePatterns_nb_NO', 'goog.i18n.DateTimePatterns_nb_SJ', 'goog.i18n.DateTimePatterns_nd', 'goog.i18n.DateTimePatterns_nd_ZW', 'goog.i18n.DateTimePatterns_ne_IN', 'goog.i18n.DateTimePatterns_ne_NP', 'goog.i18n.DateTimePatterns_nl_AW', 'goog.i18n.DateTimePatterns_nl_BE', 'goog.i18n.DateTimePatterns_nl_BQ', 'goog.i18n.DateTimePatterns_nl_CW', 'goog.i18n.DateTimePatterns_nl_NL', 'goog.i18n.DateTimePatterns_nl_SR', 'goog.i18n.DateTimePatterns_nl_SX', 'goog.i18n.DateTimePatterns_nmg', 'goog.i18n.DateTimePatterns_nmg_CM', 'goog.i18n.DateTimePatterns_nn', 'goog.i18n.DateTimePatterns_nn_NO', 'goog.i18n.DateTimePatterns_nnh', 'goog.i18n.DateTimePatterns_nnh_CM', 'goog.i18n.DateTimePatterns_nus', 'goog.i18n.DateTimePatterns_nus_SD', 'goog.i18n.DateTimePatterns_nyn', 'goog.i18n.DateTimePatterns_nyn_UG', 'goog.i18n.DateTimePatterns_om', 'goog.i18n.DateTimePatterns_om_ET', 'goog.i18n.DateTimePatterns_om_KE', 'goog.i18n.DateTimePatterns_or_IN', 'goog.i18n.DateTimePatterns_pa_Arab', 'goog.i18n.DateTimePatterns_pa_Arab_PK', 'goog.i18n.DateTimePatterns_pa_Guru', 'goog.i18n.DateTimePatterns_pa_Guru_IN', 'goog.i18n.DateTimePatterns_pl_PL', 'goog.i18n.DateTimePatterns_ps', 'goog.i18n.DateTimePatterns_ps_AF', 'goog.i18n.DateTimePatterns_pt_AO', 'goog.i18n.DateTimePatterns_pt_CV', 'goog.i18n.DateTimePatterns_pt_GW', 'goog.i18n.DateTimePatterns_pt_MO', 'goog.i18n.DateTimePatterns_pt_MZ', 'goog.i18n.DateTimePatterns_pt_ST', 'goog.i18n.DateTimePatterns_pt_TL', 'goog.i18n.DateTimePatterns_rm', 'goog.i18n.DateTimePatterns_rm_CH', 'goog.i18n.DateTimePatterns_rn', 'goog.i18n.DateTimePatterns_rn_BI', 'goog.i18n.DateTimePatterns_ro_MD', 'goog.i18n.DateTimePatterns_ro_RO', 'goog.i18n.DateTimePatterns_rof', 'goog.i18n.DateTimePatterns_rof_TZ', 'goog.i18n.DateTimePatterns_ru_BY', 'goog.i18n.DateTimePatterns_ru_KG', 'goog.i18n.DateTimePatterns_ru_KZ', 'goog.i18n.DateTimePatterns_ru_MD', 'goog.i18n.DateTimePatterns_ru_RU', 'goog.i18n.DateTimePatterns_ru_UA', 'goog.i18n.DateTimePatterns_rw', 'goog.i18n.DateTimePatterns_rw_RW', 'goog.i18n.DateTimePatterns_rwk', 'goog.i18n.DateTimePatterns_rwk_TZ', 'goog.i18n.DateTimePatterns_saq', 'goog.i18n.DateTimePatterns_saq_KE', 'goog.i18n.DateTimePatterns_sbp', 'goog.i18n.DateTimePatterns_sbp_TZ', 'goog.i18n.DateTimePatterns_seh', 'goog.i18n.DateTimePatterns_seh_MZ', 'goog.i18n.DateTimePatterns_ses', 'goog.i18n.DateTimePatterns_ses_ML', 'goog.i18n.DateTimePatterns_sg', 'goog.i18n.DateTimePatterns_sg_CF', 'goog.i18n.DateTimePatterns_shi', 'goog.i18n.DateTimePatterns_shi_Latn', 'goog.i18n.DateTimePatterns_shi_Latn_MA', 'goog.i18n.DateTimePatterns_shi_Tfng', 'goog.i18n.DateTimePatterns_shi_Tfng_MA', 'goog.i18n.DateTimePatterns_si_LK', 'goog.i18n.DateTimePatterns_sk_SK', 'goog.i18n.DateTimePatterns_sl_SI', 'goog.i18n.DateTimePatterns_sn', 'goog.i18n.DateTimePatterns_sn_ZW', 'goog.i18n.DateTimePatterns_so', 'goog.i18n.DateTimePatterns_so_DJ', 'goog.i18n.DateTimePatterns_so_ET', 'goog.i18n.DateTimePatterns_so_KE', 'goog.i18n.DateTimePatterns_so_SO', 'goog.i18n.DateTimePatterns_sq_AL', 'goog.i18n.DateTimePatterns_sq_MK', 'goog.i18n.DateTimePatterns_sq_XK', 'goog.i18n.DateTimePatterns_sr_Cyrl', 'goog.i18n.DateTimePatterns_sr_Cyrl_BA', 'goog.i18n.DateTimePatterns_sr_Cyrl_ME', 'goog.i18n.DateTimePatterns_sr_Cyrl_RS', 'goog.i18n.DateTimePatterns_sr_Cyrl_XK', 'goog.i18n.DateTimePatterns_sr_Latn', 'goog.i18n.DateTimePatterns_sr_Latn_BA', 'goog.i18n.DateTimePatterns_sr_Latn_ME', 'goog.i18n.DateTimePatterns_sr_Latn_RS', 'goog.i18n.DateTimePatterns_sr_Latn_XK', 'goog.i18n.DateTimePatterns_sv_AX', 'goog.i18n.DateTimePatterns_sv_FI', 'goog.i18n.DateTimePatterns_sv_SE', 'goog.i18n.DateTimePatterns_sw_KE', 'goog.i18n.DateTimePatterns_sw_TZ', 'goog.i18n.DateTimePatterns_sw_UG', 'goog.i18n.DateTimePatterns_swc', 'goog.i18n.DateTimePatterns_swc_CD', 'goog.i18n.DateTimePatterns_ta_IN', 'goog.i18n.DateTimePatterns_ta_LK', 'goog.i18n.DateTimePatterns_ta_MY', 'goog.i18n.DateTimePatterns_ta_SG', 'goog.i18n.DateTimePatterns_te_IN', 'goog.i18n.DateTimePatterns_teo', 'goog.i18n.DateTimePatterns_teo_KE', 'goog.i18n.DateTimePatterns_teo_UG', 'goog.i18n.DateTimePatterns_th_TH', 'goog.i18n.DateTimePatterns_ti', 'goog.i18n.DateTimePatterns_ti_ER', 'goog.i18n.DateTimePatterns_ti_ET', 'goog.i18n.DateTimePatterns_to', 'goog.i18n.DateTimePatterns_to_TO', 'goog.i18n.DateTimePatterns_tr_CY', 'goog.i18n.DateTimePatterns_tr_TR', 'goog.i18n.DateTimePatterns_twq', 'goog.i18n.DateTimePatterns_twq_NE', 'goog.i18n.DateTimePatterns_tzm', 'goog.i18n.DateTimePatterns_tzm_Latn', 'goog.i18n.DateTimePatterns_tzm_Latn_MA', 'goog.i18n.DateTimePatterns_ug', 'goog.i18n.DateTimePatterns_ug_Arab', 'goog.i18n.DateTimePatterns_ug_Arab_CN', 'goog.i18n.DateTimePatterns_uk_UA', 'goog.i18n.DateTimePatterns_ur_IN', 'goog.i18n.DateTimePatterns_ur_PK', 'goog.i18n.DateTimePatterns_uz_Arab', 'goog.i18n.DateTimePatterns_uz_Arab_AF', 'goog.i18n.DateTimePatterns_uz_Cyrl', 'goog.i18n.DateTimePatterns_uz_Cyrl_UZ', 'goog.i18n.DateTimePatterns_uz_Latn', 'goog.i18n.DateTimePatterns_uz_Latn_UZ', 'goog.i18n.DateTimePatterns_vai', 'goog.i18n.DateTimePatterns_vai_Latn', 'goog.i18n.DateTimePatterns_vai_Latn_LR', 'goog.i18n.DateTimePatterns_vai_Vaii', 'goog.i18n.DateTimePatterns_vai_Vaii_LR', 'goog.i18n.DateTimePatterns_vi_VN', 'goog.i18n.DateTimePatterns_vun', 'goog.i18n.DateTimePatterns_vun_TZ', 'goog.i18n.DateTimePatterns_xog', 'goog.i18n.DateTimePatterns_xog_UG', 'goog.i18n.DateTimePatterns_yav', 'goog.i18n.DateTimePatterns_yav_CM', 'goog.i18n.DateTimePatterns_yo', 'goog.i18n.DateTimePatterns_yo_BJ', 'goog.i18n.DateTimePatterns_yo_NG', 'goog.i18n.DateTimePatterns_zgh', 'goog.i18n.DateTimePatterns_zgh_MA', 'goog.i18n.DateTimePatterns_zh_Hans', 'goog.i18n.DateTimePatterns_zh_Hans_CN', 'goog.i18n.DateTimePatterns_zh_Hans_HK', 'goog.i18n.DateTimePatterns_zh_Hans_MO', 'goog.i18n.DateTimePatterns_zh_Hans_SG', 'goog.i18n.DateTimePatterns_zh_Hant', 'goog.i18n.DateTimePatterns_zh_Hant_HK', 'goog.i18n.DateTimePatterns_zh_Hant_MO', 'goog.i18n.DateTimePatterns_zh_Hant_TW', 'goog.i18n.DateTimePatterns_zu_ZA'], ['goog.i18n.DateTimePatterns']); +goog.addDependency('i18n/datetimesymbols.js', ['goog.i18n.DateTimeSymbols', 'goog.i18n.DateTimeSymbols_af', 'goog.i18n.DateTimeSymbols_am', 'goog.i18n.DateTimeSymbols_ar', 'goog.i18n.DateTimeSymbols_az', 'goog.i18n.DateTimeSymbols_bg', 'goog.i18n.DateTimeSymbols_bn', 'goog.i18n.DateTimeSymbols_br', 'goog.i18n.DateTimeSymbols_ca', 'goog.i18n.DateTimeSymbols_chr', 'goog.i18n.DateTimeSymbols_cs', 'goog.i18n.DateTimeSymbols_cy', 'goog.i18n.DateTimeSymbols_da', 'goog.i18n.DateTimeSymbols_de', 'goog.i18n.DateTimeSymbols_de_AT', 'goog.i18n.DateTimeSymbols_de_CH', 'goog.i18n.DateTimeSymbols_el', 'goog.i18n.DateTimeSymbols_en', 'goog.i18n.DateTimeSymbols_en_AU', 'goog.i18n.DateTimeSymbols_en_GB', 'goog.i18n.DateTimeSymbols_en_IE', 'goog.i18n.DateTimeSymbols_en_IN', 'goog.i18n.DateTimeSymbols_en_ISO', 'goog.i18n.DateTimeSymbols_en_SG', 'goog.i18n.DateTimeSymbols_en_US', 'goog.i18n.DateTimeSymbols_en_ZA', 'goog.i18n.DateTimeSymbols_es', 'goog.i18n.DateTimeSymbols_es_419', 'goog.i18n.DateTimeSymbols_es_ES', 'goog.i18n.DateTimeSymbols_et', 'goog.i18n.DateTimeSymbols_eu', 'goog.i18n.DateTimeSymbols_fa', 'goog.i18n.DateTimeSymbols_fi', 'goog.i18n.DateTimeSymbols_fil', 'goog.i18n.DateTimeSymbols_fr', 'goog.i18n.DateTimeSymbols_fr_CA', 'goog.i18n.DateTimeSymbols_gl', 'goog.i18n.DateTimeSymbols_gsw', 'goog.i18n.DateTimeSymbols_gu', 'goog.i18n.DateTimeSymbols_haw', 'goog.i18n.DateTimeSymbols_he', 'goog.i18n.DateTimeSymbols_hi', 'goog.i18n.DateTimeSymbols_hr', 'goog.i18n.DateTimeSymbols_hu', 'goog.i18n.DateTimeSymbols_hy', 'goog.i18n.DateTimeSymbols_id', 'goog.i18n.DateTimeSymbols_in', 'goog.i18n.DateTimeSymbols_is', 'goog.i18n.DateTimeSymbols_it', 'goog.i18n.DateTimeSymbols_iw', 'goog.i18n.DateTimeSymbols_ja', 'goog.i18n.DateTimeSymbols_ka', 'goog.i18n.DateTimeSymbols_kk', 'goog.i18n.DateTimeSymbols_km', 'goog.i18n.DateTimeSymbols_kn', 'goog.i18n.DateTimeSymbols_ko', 'goog.i18n.DateTimeSymbols_ky', 'goog.i18n.DateTimeSymbols_ln', 'goog.i18n.DateTimeSymbols_lo', 'goog.i18n.DateTimeSymbols_lt', 'goog.i18n.DateTimeSymbols_lv', 'goog.i18n.DateTimeSymbols_mk', 'goog.i18n.DateTimeSymbols_ml', 'goog.i18n.DateTimeSymbols_mn', 'goog.i18n.DateTimeSymbols_mr', 'goog.i18n.DateTimeSymbols_ms', 'goog.i18n.DateTimeSymbols_mt', 'goog.i18n.DateTimeSymbols_my', 'goog.i18n.DateTimeSymbols_nb', 'goog.i18n.DateTimeSymbols_ne', 'goog.i18n.DateTimeSymbols_nl', 'goog.i18n.DateTimeSymbols_no', 'goog.i18n.DateTimeSymbols_no_NO', 'goog.i18n.DateTimeSymbols_or', 'goog.i18n.DateTimeSymbols_pa', 'goog.i18n.DateTimeSymbols_pl', 'goog.i18n.DateTimeSymbols_pt', 'goog.i18n.DateTimeSymbols_pt_BR', 'goog.i18n.DateTimeSymbols_pt_PT', 'goog.i18n.DateTimeSymbols_ro', 'goog.i18n.DateTimeSymbols_ru', 'goog.i18n.DateTimeSymbols_si', 'goog.i18n.DateTimeSymbols_sk', 'goog.i18n.DateTimeSymbols_sl', 'goog.i18n.DateTimeSymbols_sq', 'goog.i18n.DateTimeSymbols_sr', 'goog.i18n.DateTimeSymbols_sv', 'goog.i18n.DateTimeSymbols_sw', 'goog.i18n.DateTimeSymbols_ta', 'goog.i18n.DateTimeSymbols_te', 'goog.i18n.DateTimeSymbols_th', 'goog.i18n.DateTimeSymbols_tl', 'goog.i18n.DateTimeSymbols_tr', 'goog.i18n.DateTimeSymbols_uk', 'goog.i18n.DateTimeSymbols_ur', 'goog.i18n.DateTimeSymbols_uz', 'goog.i18n.DateTimeSymbols_vi', 'goog.i18n.DateTimeSymbols_zh', 'goog.i18n.DateTimeSymbols_zh_CN', 'goog.i18n.DateTimeSymbols_zh_HK', 'goog.i18n.DateTimeSymbols_zh_TW', 'goog.i18n.DateTimeSymbols_zu'], []); +goog.addDependency('i18n/datetimesymbolsext.js', ['goog.i18n.DateTimeSymbolsExt', 'goog.i18n.DateTimeSymbols_aa', 'goog.i18n.DateTimeSymbols_aa_DJ', 'goog.i18n.DateTimeSymbols_aa_ER', 'goog.i18n.DateTimeSymbols_aa_ET', 'goog.i18n.DateTimeSymbols_af_NA', 'goog.i18n.DateTimeSymbols_af_ZA', 'goog.i18n.DateTimeSymbols_agq', 'goog.i18n.DateTimeSymbols_agq_CM', 'goog.i18n.DateTimeSymbols_ak', 'goog.i18n.DateTimeSymbols_ak_GH', 'goog.i18n.DateTimeSymbols_am_ET', 'goog.i18n.DateTimeSymbols_ar_001', 'goog.i18n.DateTimeSymbols_ar_AE', 'goog.i18n.DateTimeSymbols_ar_BH', 'goog.i18n.DateTimeSymbols_ar_DJ', 'goog.i18n.DateTimeSymbols_ar_DZ', 'goog.i18n.DateTimeSymbols_ar_EG', 'goog.i18n.DateTimeSymbols_ar_EH', 'goog.i18n.DateTimeSymbols_ar_ER', 'goog.i18n.DateTimeSymbols_ar_IL', 'goog.i18n.DateTimeSymbols_ar_IQ', 'goog.i18n.DateTimeSymbols_ar_JO', 'goog.i18n.DateTimeSymbols_ar_KM', 'goog.i18n.DateTimeSymbols_ar_KW', 'goog.i18n.DateTimeSymbols_ar_LB', 'goog.i18n.DateTimeSymbols_ar_LY', 'goog.i18n.DateTimeSymbols_ar_MA', 'goog.i18n.DateTimeSymbols_ar_MR', 'goog.i18n.DateTimeSymbols_ar_OM', 'goog.i18n.DateTimeSymbols_ar_PS', 'goog.i18n.DateTimeSymbols_ar_QA', 'goog.i18n.DateTimeSymbols_ar_SA', 'goog.i18n.DateTimeSymbols_ar_SD', 'goog.i18n.DateTimeSymbols_ar_SO', 'goog.i18n.DateTimeSymbols_ar_SS', 'goog.i18n.DateTimeSymbols_ar_SY', 'goog.i18n.DateTimeSymbols_ar_TD', 'goog.i18n.DateTimeSymbols_ar_TN', 'goog.i18n.DateTimeSymbols_ar_YE', 'goog.i18n.DateTimeSymbols_as', 'goog.i18n.DateTimeSymbols_as_IN', 'goog.i18n.DateTimeSymbols_asa', 'goog.i18n.DateTimeSymbols_asa_TZ', 'goog.i18n.DateTimeSymbols_ast', 'goog.i18n.DateTimeSymbols_ast_ES', 'goog.i18n.DateTimeSymbols_az_Cyrl', 'goog.i18n.DateTimeSymbols_az_Cyrl_AZ', 'goog.i18n.DateTimeSymbols_az_Latn', 'goog.i18n.DateTimeSymbols_az_Latn_AZ', 'goog.i18n.DateTimeSymbols_bas', 'goog.i18n.DateTimeSymbols_bas_CM', 'goog.i18n.DateTimeSymbols_be', 'goog.i18n.DateTimeSymbols_be_BY', 'goog.i18n.DateTimeSymbols_bem', 'goog.i18n.DateTimeSymbols_bem_ZM', 'goog.i18n.DateTimeSymbols_bez', 'goog.i18n.DateTimeSymbols_bez_TZ', 'goog.i18n.DateTimeSymbols_bg_BG', 'goog.i18n.DateTimeSymbols_bm', 'goog.i18n.DateTimeSymbols_bm_ML', 'goog.i18n.DateTimeSymbols_bn_BD', 'goog.i18n.DateTimeSymbols_bn_IN', 'goog.i18n.DateTimeSymbols_bo', 'goog.i18n.DateTimeSymbols_bo_CN', 'goog.i18n.DateTimeSymbols_bo_IN', 'goog.i18n.DateTimeSymbols_br_FR', 'goog.i18n.DateTimeSymbols_brx', 'goog.i18n.DateTimeSymbols_brx_IN', 'goog.i18n.DateTimeSymbols_bs', 'goog.i18n.DateTimeSymbols_bs_Cyrl', 'goog.i18n.DateTimeSymbols_bs_Cyrl_BA', 'goog.i18n.DateTimeSymbols_bs_Latn', 'goog.i18n.DateTimeSymbols_bs_Latn_BA', 'goog.i18n.DateTimeSymbols_byn', 'goog.i18n.DateTimeSymbols_byn_ER', 'goog.i18n.DateTimeSymbols_ca_AD', 'goog.i18n.DateTimeSymbols_ca_ES', 'goog.i18n.DateTimeSymbols_ca_ES_VALENCIA', 'goog.i18n.DateTimeSymbols_ca_FR', 'goog.i18n.DateTimeSymbols_ca_IT', 'goog.i18n.DateTimeSymbols_cgg', 'goog.i18n.DateTimeSymbols_cgg_UG', 'goog.i18n.DateTimeSymbols_chr_US', 'goog.i18n.DateTimeSymbols_ckb', 'goog.i18n.DateTimeSymbols_ckb_Arab', 'goog.i18n.DateTimeSymbols_ckb_Arab_IQ', 'goog.i18n.DateTimeSymbols_ckb_Arab_IR', 'goog.i18n.DateTimeSymbols_ckb_IQ', 'goog.i18n.DateTimeSymbols_ckb_IR', 'goog.i18n.DateTimeSymbols_ckb_Latn', 'goog.i18n.DateTimeSymbols_ckb_Latn_IQ', 'goog.i18n.DateTimeSymbols_cs_CZ', 'goog.i18n.DateTimeSymbols_cy_GB', 'goog.i18n.DateTimeSymbols_da_DK', 'goog.i18n.DateTimeSymbols_da_GL', 'goog.i18n.DateTimeSymbols_dav', 'goog.i18n.DateTimeSymbols_dav_KE', 'goog.i18n.DateTimeSymbols_de_BE', 'goog.i18n.DateTimeSymbols_de_DE', 'goog.i18n.DateTimeSymbols_de_LI', 'goog.i18n.DateTimeSymbols_de_LU', 'goog.i18n.DateTimeSymbols_dje', 'goog.i18n.DateTimeSymbols_dje_NE', 'goog.i18n.DateTimeSymbols_dua', 'goog.i18n.DateTimeSymbols_dua_CM', 'goog.i18n.DateTimeSymbols_dyo', 'goog.i18n.DateTimeSymbols_dyo_SN', 'goog.i18n.DateTimeSymbols_dz', 'goog.i18n.DateTimeSymbols_dz_BT', 'goog.i18n.DateTimeSymbols_ebu', 'goog.i18n.DateTimeSymbols_ebu_KE', 'goog.i18n.DateTimeSymbols_ee', 'goog.i18n.DateTimeSymbols_ee_GH', 'goog.i18n.DateTimeSymbols_ee_TG', 'goog.i18n.DateTimeSymbols_el_CY', 'goog.i18n.DateTimeSymbols_el_GR', 'goog.i18n.DateTimeSymbols_en_001', 'goog.i18n.DateTimeSymbols_en_150', 'goog.i18n.DateTimeSymbols_en_AG', 'goog.i18n.DateTimeSymbols_en_AI', 'goog.i18n.DateTimeSymbols_en_AS', 'goog.i18n.DateTimeSymbols_en_BB', 'goog.i18n.DateTimeSymbols_en_BE', 'goog.i18n.DateTimeSymbols_en_BM', 'goog.i18n.DateTimeSymbols_en_BS', 'goog.i18n.DateTimeSymbols_en_BW', 'goog.i18n.DateTimeSymbols_en_BZ', 'goog.i18n.DateTimeSymbols_en_CA', 'goog.i18n.DateTimeSymbols_en_CC', 'goog.i18n.DateTimeSymbols_en_CK', 'goog.i18n.DateTimeSymbols_en_CM', 'goog.i18n.DateTimeSymbols_en_CX', 'goog.i18n.DateTimeSymbols_en_DG', 'goog.i18n.DateTimeSymbols_en_DM', 'goog.i18n.DateTimeSymbols_en_ER', 'goog.i18n.DateTimeSymbols_en_FJ', 'goog.i18n.DateTimeSymbols_en_FK', 'goog.i18n.DateTimeSymbols_en_FM', 'goog.i18n.DateTimeSymbols_en_GD', 'goog.i18n.DateTimeSymbols_en_GG', 'goog.i18n.DateTimeSymbols_en_GH', 'goog.i18n.DateTimeSymbols_en_GI', 'goog.i18n.DateTimeSymbols_en_GM', 'goog.i18n.DateTimeSymbols_en_GU', 'goog.i18n.DateTimeSymbols_en_GY', 'goog.i18n.DateTimeSymbols_en_HK', 'goog.i18n.DateTimeSymbols_en_IM', 'goog.i18n.DateTimeSymbols_en_IO', 'goog.i18n.DateTimeSymbols_en_JE', 'goog.i18n.DateTimeSymbols_en_JM', 'goog.i18n.DateTimeSymbols_en_KE', 'goog.i18n.DateTimeSymbols_en_KI', 'goog.i18n.DateTimeSymbols_en_KN', 'goog.i18n.DateTimeSymbols_en_KY', 'goog.i18n.DateTimeSymbols_en_LC', 'goog.i18n.DateTimeSymbols_en_LR', 'goog.i18n.DateTimeSymbols_en_LS', 'goog.i18n.DateTimeSymbols_en_MG', 'goog.i18n.DateTimeSymbols_en_MH', 'goog.i18n.DateTimeSymbols_en_MO', 'goog.i18n.DateTimeSymbols_en_MP', 'goog.i18n.DateTimeSymbols_en_MS', 'goog.i18n.DateTimeSymbols_en_MT', 'goog.i18n.DateTimeSymbols_en_MU', 'goog.i18n.DateTimeSymbols_en_MW', 'goog.i18n.DateTimeSymbols_en_NA', 'goog.i18n.DateTimeSymbols_en_NF', 'goog.i18n.DateTimeSymbols_en_NG', 'goog.i18n.DateTimeSymbols_en_NR', 'goog.i18n.DateTimeSymbols_en_NU', 'goog.i18n.DateTimeSymbols_en_NZ', 'goog.i18n.DateTimeSymbols_en_PG', 'goog.i18n.DateTimeSymbols_en_PH', 'goog.i18n.DateTimeSymbols_en_PK', 'goog.i18n.DateTimeSymbols_en_PN', 'goog.i18n.DateTimeSymbols_en_PR', 'goog.i18n.DateTimeSymbols_en_PW', 'goog.i18n.DateTimeSymbols_en_RW', 'goog.i18n.DateTimeSymbols_en_SB', 'goog.i18n.DateTimeSymbols_en_SC', 'goog.i18n.DateTimeSymbols_en_SD', 'goog.i18n.DateTimeSymbols_en_SH', 'goog.i18n.DateTimeSymbols_en_SL', 'goog.i18n.DateTimeSymbols_en_SS', 'goog.i18n.DateTimeSymbols_en_SX', 'goog.i18n.DateTimeSymbols_en_SZ', 'goog.i18n.DateTimeSymbols_en_TC', 'goog.i18n.DateTimeSymbols_en_TK', 'goog.i18n.DateTimeSymbols_en_TO', 'goog.i18n.DateTimeSymbols_en_TT', 'goog.i18n.DateTimeSymbols_en_TV', 'goog.i18n.DateTimeSymbols_en_TZ', 'goog.i18n.DateTimeSymbols_en_UG', 'goog.i18n.DateTimeSymbols_en_UM', 'goog.i18n.DateTimeSymbols_en_VC', 'goog.i18n.DateTimeSymbols_en_VG', 'goog.i18n.DateTimeSymbols_en_VI', 'goog.i18n.DateTimeSymbols_en_VU', 'goog.i18n.DateTimeSymbols_en_WS', 'goog.i18n.DateTimeSymbols_en_ZM', 'goog.i18n.DateTimeSymbols_en_ZW', 'goog.i18n.DateTimeSymbols_eo', 'goog.i18n.DateTimeSymbols_eo_001', 'goog.i18n.DateTimeSymbols_es_AR', 'goog.i18n.DateTimeSymbols_es_BO', 'goog.i18n.DateTimeSymbols_es_CL', 'goog.i18n.DateTimeSymbols_es_CO', 'goog.i18n.DateTimeSymbols_es_CR', 'goog.i18n.DateTimeSymbols_es_CU', 'goog.i18n.DateTimeSymbols_es_DO', 'goog.i18n.DateTimeSymbols_es_EA', 'goog.i18n.DateTimeSymbols_es_EC', 'goog.i18n.DateTimeSymbols_es_GQ', 'goog.i18n.DateTimeSymbols_es_GT', 'goog.i18n.DateTimeSymbols_es_HN', 'goog.i18n.DateTimeSymbols_es_IC', 'goog.i18n.DateTimeSymbols_es_MX', 'goog.i18n.DateTimeSymbols_es_NI', 'goog.i18n.DateTimeSymbols_es_PA', 'goog.i18n.DateTimeSymbols_es_PE', 'goog.i18n.DateTimeSymbols_es_PH', 'goog.i18n.DateTimeSymbols_es_PR', 'goog.i18n.DateTimeSymbols_es_PY', 'goog.i18n.DateTimeSymbols_es_SV', 'goog.i18n.DateTimeSymbols_es_US', 'goog.i18n.DateTimeSymbols_es_UY', 'goog.i18n.DateTimeSymbols_es_VE', 'goog.i18n.DateTimeSymbols_et_EE', 'goog.i18n.DateTimeSymbols_eu_ES', 'goog.i18n.DateTimeSymbols_ewo', 'goog.i18n.DateTimeSymbols_ewo_CM', 'goog.i18n.DateTimeSymbols_fa_AF', 'goog.i18n.DateTimeSymbols_fa_IR', 'goog.i18n.DateTimeSymbols_ff', 'goog.i18n.DateTimeSymbols_ff_CM', 'goog.i18n.DateTimeSymbols_ff_GN', 'goog.i18n.DateTimeSymbols_ff_MR', 'goog.i18n.DateTimeSymbols_ff_SN', 'goog.i18n.DateTimeSymbols_fi_FI', 'goog.i18n.DateTimeSymbols_fil_PH', 'goog.i18n.DateTimeSymbols_fo', 'goog.i18n.DateTimeSymbols_fo_FO', 'goog.i18n.DateTimeSymbols_fr_BE', 'goog.i18n.DateTimeSymbols_fr_BF', 'goog.i18n.DateTimeSymbols_fr_BI', 'goog.i18n.DateTimeSymbols_fr_BJ', 'goog.i18n.DateTimeSymbols_fr_BL', 'goog.i18n.DateTimeSymbols_fr_CD', 'goog.i18n.DateTimeSymbols_fr_CF', 'goog.i18n.DateTimeSymbols_fr_CG', 'goog.i18n.DateTimeSymbols_fr_CH', 'goog.i18n.DateTimeSymbols_fr_CI', 'goog.i18n.DateTimeSymbols_fr_CM', 'goog.i18n.DateTimeSymbols_fr_DJ', 'goog.i18n.DateTimeSymbols_fr_DZ', 'goog.i18n.DateTimeSymbols_fr_FR', 'goog.i18n.DateTimeSymbols_fr_GA', 'goog.i18n.DateTimeSymbols_fr_GF', 'goog.i18n.DateTimeSymbols_fr_GN', 'goog.i18n.DateTimeSymbols_fr_GP', 'goog.i18n.DateTimeSymbols_fr_GQ', 'goog.i18n.DateTimeSymbols_fr_HT', 'goog.i18n.DateTimeSymbols_fr_KM', 'goog.i18n.DateTimeSymbols_fr_LU', 'goog.i18n.DateTimeSymbols_fr_MA', 'goog.i18n.DateTimeSymbols_fr_MC', 'goog.i18n.DateTimeSymbols_fr_MF', 'goog.i18n.DateTimeSymbols_fr_MG', 'goog.i18n.DateTimeSymbols_fr_ML', 'goog.i18n.DateTimeSymbols_fr_MQ', 'goog.i18n.DateTimeSymbols_fr_MR', 'goog.i18n.DateTimeSymbols_fr_MU', 'goog.i18n.DateTimeSymbols_fr_NC', 'goog.i18n.DateTimeSymbols_fr_NE', 'goog.i18n.DateTimeSymbols_fr_PF', 'goog.i18n.DateTimeSymbols_fr_PM', 'goog.i18n.DateTimeSymbols_fr_RE', 'goog.i18n.DateTimeSymbols_fr_RW', 'goog.i18n.DateTimeSymbols_fr_SC', 'goog.i18n.DateTimeSymbols_fr_SN', 'goog.i18n.DateTimeSymbols_fr_SY', 'goog.i18n.DateTimeSymbols_fr_TD', 'goog.i18n.DateTimeSymbols_fr_TG', 'goog.i18n.DateTimeSymbols_fr_TN', 'goog.i18n.DateTimeSymbols_fr_VU', 'goog.i18n.DateTimeSymbols_fr_WF', 'goog.i18n.DateTimeSymbols_fr_YT', 'goog.i18n.DateTimeSymbols_fur', 'goog.i18n.DateTimeSymbols_fur_IT', 'goog.i18n.DateTimeSymbols_fy', 'goog.i18n.DateTimeSymbols_fy_NL', 'goog.i18n.DateTimeSymbols_ga', 'goog.i18n.DateTimeSymbols_ga_IE', 'goog.i18n.DateTimeSymbols_gd', 'goog.i18n.DateTimeSymbols_gd_GB', 'goog.i18n.DateTimeSymbols_gl_ES', 'goog.i18n.DateTimeSymbols_gsw_CH', 'goog.i18n.DateTimeSymbols_gsw_LI', 'goog.i18n.DateTimeSymbols_gu_IN', 'goog.i18n.DateTimeSymbols_guz', 'goog.i18n.DateTimeSymbols_guz_KE', 'goog.i18n.DateTimeSymbols_gv', 'goog.i18n.DateTimeSymbols_gv_IM', 'goog.i18n.DateTimeSymbols_ha', 'goog.i18n.DateTimeSymbols_ha_Latn', 'goog.i18n.DateTimeSymbols_ha_Latn_GH', 'goog.i18n.DateTimeSymbols_ha_Latn_NE', 'goog.i18n.DateTimeSymbols_ha_Latn_NG', 'goog.i18n.DateTimeSymbols_haw_US', 'goog.i18n.DateTimeSymbols_he_IL', 'goog.i18n.DateTimeSymbols_hi_IN', 'goog.i18n.DateTimeSymbols_hr_BA', 'goog.i18n.DateTimeSymbols_hr_HR', 'goog.i18n.DateTimeSymbols_hu_HU', 'goog.i18n.DateTimeSymbols_hy_AM', 'goog.i18n.DateTimeSymbols_ia', 'goog.i18n.DateTimeSymbols_ia_FR', 'goog.i18n.DateTimeSymbols_id_ID', 'goog.i18n.DateTimeSymbols_ig', 'goog.i18n.DateTimeSymbols_ig_NG', 'goog.i18n.DateTimeSymbols_ii', 'goog.i18n.DateTimeSymbols_ii_CN', 'goog.i18n.DateTimeSymbols_is_IS', 'goog.i18n.DateTimeSymbols_it_CH', 'goog.i18n.DateTimeSymbols_it_IT', 'goog.i18n.DateTimeSymbols_it_SM', 'goog.i18n.DateTimeSymbols_ja_JP', 'goog.i18n.DateTimeSymbols_jgo', 'goog.i18n.DateTimeSymbols_jgo_CM', 'goog.i18n.DateTimeSymbols_jmc', 'goog.i18n.DateTimeSymbols_jmc_TZ', 'goog.i18n.DateTimeSymbols_ka_GE', 'goog.i18n.DateTimeSymbols_kab', 'goog.i18n.DateTimeSymbols_kab_DZ', 'goog.i18n.DateTimeSymbols_kam', 'goog.i18n.DateTimeSymbols_kam_KE', 'goog.i18n.DateTimeSymbols_kde', 'goog.i18n.DateTimeSymbols_kde_TZ', 'goog.i18n.DateTimeSymbols_kea', 'goog.i18n.DateTimeSymbols_kea_CV', 'goog.i18n.DateTimeSymbols_khq', 'goog.i18n.DateTimeSymbols_khq_ML', 'goog.i18n.DateTimeSymbols_ki', 'goog.i18n.DateTimeSymbols_ki_KE', 'goog.i18n.DateTimeSymbols_kk_Cyrl', 'goog.i18n.DateTimeSymbols_kk_Cyrl_KZ', 'goog.i18n.DateTimeSymbols_kkj', 'goog.i18n.DateTimeSymbols_kkj_CM', 'goog.i18n.DateTimeSymbols_kl', 'goog.i18n.DateTimeSymbols_kl_GL', 'goog.i18n.DateTimeSymbols_kln', 'goog.i18n.DateTimeSymbols_kln_KE', 'goog.i18n.DateTimeSymbols_km_KH', 'goog.i18n.DateTimeSymbols_kn_IN', 'goog.i18n.DateTimeSymbols_ko_KP', 'goog.i18n.DateTimeSymbols_ko_KR', 'goog.i18n.DateTimeSymbols_kok', 'goog.i18n.DateTimeSymbols_kok_IN', 'goog.i18n.DateTimeSymbols_ks', 'goog.i18n.DateTimeSymbols_ks_Arab', 'goog.i18n.DateTimeSymbols_ks_Arab_IN', 'goog.i18n.DateTimeSymbols_ksb', 'goog.i18n.DateTimeSymbols_ksb_TZ', 'goog.i18n.DateTimeSymbols_ksf', 'goog.i18n.DateTimeSymbols_ksf_CM', 'goog.i18n.DateTimeSymbols_ksh', 'goog.i18n.DateTimeSymbols_ksh_DE', 'goog.i18n.DateTimeSymbols_kw', 'goog.i18n.DateTimeSymbols_kw_GB', 'goog.i18n.DateTimeSymbols_ky_Cyrl', 'goog.i18n.DateTimeSymbols_ky_Cyrl_KG', 'goog.i18n.DateTimeSymbols_lag', 'goog.i18n.DateTimeSymbols_lag_TZ', 'goog.i18n.DateTimeSymbols_lg', 'goog.i18n.DateTimeSymbols_lg_UG', 'goog.i18n.DateTimeSymbols_lkt', 'goog.i18n.DateTimeSymbols_lkt_US', 'goog.i18n.DateTimeSymbols_ln_AO', 'goog.i18n.DateTimeSymbols_ln_CD', 'goog.i18n.DateTimeSymbols_ln_CF', 'goog.i18n.DateTimeSymbols_ln_CG', 'goog.i18n.DateTimeSymbols_lo_LA', 'goog.i18n.DateTimeSymbols_lt_LT', 'goog.i18n.DateTimeSymbols_lu', 'goog.i18n.DateTimeSymbols_lu_CD', 'goog.i18n.DateTimeSymbols_luo', 'goog.i18n.DateTimeSymbols_luo_KE', 'goog.i18n.DateTimeSymbols_luy', 'goog.i18n.DateTimeSymbols_luy_KE', 'goog.i18n.DateTimeSymbols_lv_LV', 'goog.i18n.DateTimeSymbols_mas', 'goog.i18n.DateTimeSymbols_mas_KE', 'goog.i18n.DateTimeSymbols_mas_TZ', 'goog.i18n.DateTimeSymbols_mer', 'goog.i18n.DateTimeSymbols_mer_KE', 'goog.i18n.DateTimeSymbols_mfe', 'goog.i18n.DateTimeSymbols_mfe_MU', 'goog.i18n.DateTimeSymbols_mg', 'goog.i18n.DateTimeSymbols_mg_MG', 'goog.i18n.DateTimeSymbols_mgh', 'goog.i18n.DateTimeSymbols_mgh_MZ', 'goog.i18n.DateTimeSymbols_mgo', 'goog.i18n.DateTimeSymbols_mgo_CM', 'goog.i18n.DateTimeSymbols_mk_MK', 'goog.i18n.DateTimeSymbols_ml_IN', 'goog.i18n.DateTimeSymbols_mn_Cyrl', 'goog.i18n.DateTimeSymbols_mn_Cyrl_MN', 'goog.i18n.DateTimeSymbols_mr_IN', 'goog.i18n.DateTimeSymbols_ms_Latn', 'goog.i18n.DateTimeSymbols_ms_Latn_BN', 'goog.i18n.DateTimeSymbols_ms_Latn_MY', 'goog.i18n.DateTimeSymbols_ms_Latn_SG', 'goog.i18n.DateTimeSymbols_mt_MT', 'goog.i18n.DateTimeSymbols_mua', 'goog.i18n.DateTimeSymbols_mua_CM', 'goog.i18n.DateTimeSymbols_my_MM', 'goog.i18n.DateTimeSymbols_naq', 'goog.i18n.DateTimeSymbols_naq_NA', 'goog.i18n.DateTimeSymbols_nb_NO', 'goog.i18n.DateTimeSymbols_nb_SJ', 'goog.i18n.DateTimeSymbols_nd', 'goog.i18n.DateTimeSymbols_nd_ZW', 'goog.i18n.DateTimeSymbols_ne_IN', 'goog.i18n.DateTimeSymbols_ne_NP', 'goog.i18n.DateTimeSymbols_nl_AW', 'goog.i18n.DateTimeSymbols_nl_BE', 'goog.i18n.DateTimeSymbols_nl_BQ', 'goog.i18n.DateTimeSymbols_nl_CW', 'goog.i18n.DateTimeSymbols_nl_NL', 'goog.i18n.DateTimeSymbols_nl_SR', 'goog.i18n.DateTimeSymbols_nl_SX', 'goog.i18n.DateTimeSymbols_nmg', 'goog.i18n.DateTimeSymbols_nmg_CM', 'goog.i18n.DateTimeSymbols_nn', 'goog.i18n.DateTimeSymbols_nn_NO', 'goog.i18n.DateTimeSymbols_nnh', 'goog.i18n.DateTimeSymbols_nnh_CM', 'goog.i18n.DateTimeSymbols_nr', 'goog.i18n.DateTimeSymbols_nr_ZA', 'goog.i18n.DateTimeSymbols_nso', 'goog.i18n.DateTimeSymbols_nso_ZA', 'goog.i18n.DateTimeSymbols_nus', 'goog.i18n.DateTimeSymbols_nus_SD', 'goog.i18n.DateTimeSymbols_nyn', 'goog.i18n.DateTimeSymbols_nyn_UG', 'goog.i18n.DateTimeSymbols_om', 'goog.i18n.DateTimeSymbols_om_ET', 'goog.i18n.DateTimeSymbols_om_KE', 'goog.i18n.DateTimeSymbols_or_IN', 'goog.i18n.DateTimeSymbols_os', 'goog.i18n.DateTimeSymbols_os_GE', 'goog.i18n.DateTimeSymbols_os_RU', 'goog.i18n.DateTimeSymbols_pa_Arab', 'goog.i18n.DateTimeSymbols_pa_Arab_PK', 'goog.i18n.DateTimeSymbols_pa_Guru', 'goog.i18n.DateTimeSymbols_pa_Guru_IN', 'goog.i18n.DateTimeSymbols_pl_PL', 'goog.i18n.DateTimeSymbols_ps', 'goog.i18n.DateTimeSymbols_ps_AF', 'goog.i18n.DateTimeSymbols_pt_AO', 'goog.i18n.DateTimeSymbols_pt_CV', 'goog.i18n.DateTimeSymbols_pt_GW', 'goog.i18n.DateTimeSymbols_pt_MO', 'goog.i18n.DateTimeSymbols_pt_MZ', 'goog.i18n.DateTimeSymbols_pt_ST', 'goog.i18n.DateTimeSymbols_pt_TL', 'goog.i18n.DateTimeSymbols_rm', 'goog.i18n.DateTimeSymbols_rm_CH', 'goog.i18n.DateTimeSymbols_rn', 'goog.i18n.DateTimeSymbols_rn_BI', 'goog.i18n.DateTimeSymbols_ro_MD', 'goog.i18n.DateTimeSymbols_ro_RO', 'goog.i18n.DateTimeSymbols_rof', 'goog.i18n.DateTimeSymbols_rof_TZ', 'goog.i18n.DateTimeSymbols_ru_BY', 'goog.i18n.DateTimeSymbols_ru_KG', 'goog.i18n.DateTimeSymbols_ru_KZ', 'goog.i18n.DateTimeSymbols_ru_MD', 'goog.i18n.DateTimeSymbols_ru_RU', 'goog.i18n.DateTimeSymbols_ru_UA', 'goog.i18n.DateTimeSymbols_rw', 'goog.i18n.DateTimeSymbols_rw_RW', 'goog.i18n.DateTimeSymbols_rwk', 'goog.i18n.DateTimeSymbols_rwk_TZ', 'goog.i18n.DateTimeSymbols_sah', 'goog.i18n.DateTimeSymbols_sah_RU', 'goog.i18n.DateTimeSymbols_saq', 'goog.i18n.DateTimeSymbols_saq_KE', 'goog.i18n.DateTimeSymbols_sbp', 'goog.i18n.DateTimeSymbols_sbp_TZ', 'goog.i18n.DateTimeSymbols_se', 'goog.i18n.DateTimeSymbols_se_FI', 'goog.i18n.DateTimeSymbols_se_NO', 'goog.i18n.DateTimeSymbols_seh', 'goog.i18n.DateTimeSymbols_seh_MZ', 'goog.i18n.DateTimeSymbols_ses', 'goog.i18n.DateTimeSymbols_ses_ML', 'goog.i18n.DateTimeSymbols_sg', 'goog.i18n.DateTimeSymbols_sg_CF', 'goog.i18n.DateTimeSymbols_shi', 'goog.i18n.DateTimeSymbols_shi_Latn', 'goog.i18n.DateTimeSymbols_shi_Latn_MA', 'goog.i18n.DateTimeSymbols_shi_Tfng', 'goog.i18n.DateTimeSymbols_shi_Tfng_MA', 'goog.i18n.DateTimeSymbols_si_LK', 'goog.i18n.DateTimeSymbols_sk_SK', 'goog.i18n.DateTimeSymbols_sl_SI', 'goog.i18n.DateTimeSymbols_sn', 'goog.i18n.DateTimeSymbols_sn_ZW', 'goog.i18n.DateTimeSymbols_so', 'goog.i18n.DateTimeSymbols_so_DJ', 'goog.i18n.DateTimeSymbols_so_ET', 'goog.i18n.DateTimeSymbols_so_KE', 'goog.i18n.DateTimeSymbols_so_SO', 'goog.i18n.DateTimeSymbols_sq_AL', 'goog.i18n.DateTimeSymbols_sq_MK', 'goog.i18n.DateTimeSymbols_sq_XK', 'goog.i18n.DateTimeSymbols_sr_Cyrl', 'goog.i18n.DateTimeSymbols_sr_Cyrl_BA', 'goog.i18n.DateTimeSymbols_sr_Cyrl_ME', 'goog.i18n.DateTimeSymbols_sr_Cyrl_RS', 'goog.i18n.DateTimeSymbols_sr_Cyrl_XK', 'goog.i18n.DateTimeSymbols_sr_Latn', 'goog.i18n.DateTimeSymbols_sr_Latn_BA', 'goog.i18n.DateTimeSymbols_sr_Latn_ME', 'goog.i18n.DateTimeSymbols_sr_Latn_RS', 'goog.i18n.DateTimeSymbols_sr_Latn_XK', 'goog.i18n.DateTimeSymbols_ss', 'goog.i18n.DateTimeSymbols_ss_SZ', 'goog.i18n.DateTimeSymbols_ss_ZA', 'goog.i18n.DateTimeSymbols_ssy', 'goog.i18n.DateTimeSymbols_ssy_ER', 'goog.i18n.DateTimeSymbols_st', 'goog.i18n.DateTimeSymbols_st_LS', 'goog.i18n.DateTimeSymbols_st_ZA', 'goog.i18n.DateTimeSymbols_sv_AX', 'goog.i18n.DateTimeSymbols_sv_FI', 'goog.i18n.DateTimeSymbols_sv_SE', 'goog.i18n.DateTimeSymbols_sw_KE', 'goog.i18n.DateTimeSymbols_sw_TZ', 'goog.i18n.DateTimeSymbols_sw_UG', 'goog.i18n.DateTimeSymbols_swc', 'goog.i18n.DateTimeSymbols_swc_CD', 'goog.i18n.DateTimeSymbols_ta_IN', 'goog.i18n.DateTimeSymbols_ta_LK', 'goog.i18n.DateTimeSymbols_ta_MY', 'goog.i18n.DateTimeSymbols_ta_SG', 'goog.i18n.DateTimeSymbols_te_IN', 'goog.i18n.DateTimeSymbols_teo', 'goog.i18n.DateTimeSymbols_teo_KE', 'goog.i18n.DateTimeSymbols_teo_UG', 'goog.i18n.DateTimeSymbols_tg', 'goog.i18n.DateTimeSymbols_tg_Cyrl', 'goog.i18n.DateTimeSymbols_tg_Cyrl_TJ', 'goog.i18n.DateTimeSymbols_th_TH', 'goog.i18n.DateTimeSymbols_ti', 'goog.i18n.DateTimeSymbols_ti_ER', 'goog.i18n.DateTimeSymbols_ti_ET', 'goog.i18n.DateTimeSymbols_tig', 'goog.i18n.DateTimeSymbols_tig_ER', 'goog.i18n.DateTimeSymbols_tn', 'goog.i18n.DateTimeSymbols_tn_BW', 'goog.i18n.DateTimeSymbols_tn_ZA', 'goog.i18n.DateTimeSymbols_to', 'goog.i18n.DateTimeSymbols_to_TO', 'goog.i18n.DateTimeSymbols_tr_CY', 'goog.i18n.DateTimeSymbols_tr_TR', 'goog.i18n.DateTimeSymbols_ts', 'goog.i18n.DateTimeSymbols_ts_ZA', 'goog.i18n.DateTimeSymbols_twq', 'goog.i18n.DateTimeSymbols_twq_NE', 'goog.i18n.DateTimeSymbols_tzm', 'goog.i18n.DateTimeSymbols_tzm_Latn', 'goog.i18n.DateTimeSymbols_tzm_Latn_MA', 'goog.i18n.DateTimeSymbols_ug', 'goog.i18n.DateTimeSymbols_ug_Arab', 'goog.i18n.DateTimeSymbols_ug_Arab_CN', 'goog.i18n.DateTimeSymbols_uk_UA', 'goog.i18n.DateTimeSymbols_ur_IN', 'goog.i18n.DateTimeSymbols_ur_PK', 'goog.i18n.DateTimeSymbols_uz_Arab', 'goog.i18n.DateTimeSymbols_uz_Arab_AF', 'goog.i18n.DateTimeSymbols_uz_Cyrl', 'goog.i18n.DateTimeSymbols_uz_Cyrl_UZ', 'goog.i18n.DateTimeSymbols_uz_Latn', 'goog.i18n.DateTimeSymbols_uz_Latn_UZ', 'goog.i18n.DateTimeSymbols_vai', 'goog.i18n.DateTimeSymbols_vai_Latn', 'goog.i18n.DateTimeSymbols_vai_Latn_LR', 'goog.i18n.DateTimeSymbols_vai_Vaii', 'goog.i18n.DateTimeSymbols_vai_Vaii_LR', 'goog.i18n.DateTimeSymbols_ve', 'goog.i18n.DateTimeSymbols_ve_ZA', 'goog.i18n.DateTimeSymbols_vi_VN', 'goog.i18n.DateTimeSymbols_vo', 'goog.i18n.DateTimeSymbols_vo_001', 'goog.i18n.DateTimeSymbols_vun', 'goog.i18n.DateTimeSymbols_vun_TZ', 'goog.i18n.DateTimeSymbols_wae', 'goog.i18n.DateTimeSymbols_wae_CH', 'goog.i18n.DateTimeSymbols_wal', 'goog.i18n.DateTimeSymbols_wal_ET', 'goog.i18n.DateTimeSymbols_xh', 'goog.i18n.DateTimeSymbols_xh_ZA', 'goog.i18n.DateTimeSymbols_xog', 'goog.i18n.DateTimeSymbols_xog_UG', 'goog.i18n.DateTimeSymbols_yav', 'goog.i18n.DateTimeSymbols_yav_CM', 'goog.i18n.DateTimeSymbols_yo', 'goog.i18n.DateTimeSymbols_yo_BJ', 'goog.i18n.DateTimeSymbols_yo_NG', 'goog.i18n.DateTimeSymbols_zgh', 'goog.i18n.DateTimeSymbols_zgh_MA', 'goog.i18n.DateTimeSymbols_zh_Hans', 'goog.i18n.DateTimeSymbols_zh_Hans_CN', 'goog.i18n.DateTimeSymbols_zh_Hans_HK', 'goog.i18n.DateTimeSymbols_zh_Hans_MO', 'goog.i18n.DateTimeSymbols_zh_Hans_SG', 'goog.i18n.DateTimeSymbols_zh_Hant', 'goog.i18n.DateTimeSymbols_zh_Hant_HK', 'goog.i18n.DateTimeSymbols_zh_Hant_MO', 'goog.i18n.DateTimeSymbols_zh_Hant_TW', 'goog.i18n.DateTimeSymbols_zu_ZA'], ['goog.i18n.DateTimeSymbols']); goog.addDependency('i18n/graphemebreak.js', ['goog.i18n.GraphemeBreak'], ['goog.structs.InversionMap']); +goog.addDependency('i18n/graphemebreak_test.js', ['goog.i18n.GraphemeBreakTest'], ['goog.i18n.GraphemeBreak', 'goog.testing.jsunit']); goog.addDependency('i18n/messageformat.js', ['goog.i18n.MessageFormat'], ['goog.asserts', 'goog.i18n.NumberFormat', 'goog.i18n.ordinalRules', 'goog.i18n.pluralRules']); +goog.addDependency('i18n/messageformat_test.js', ['goog.i18n.MessageFormatTest'], ['goog.i18n.MessageFormat', 'goog.i18n.NumberFormatSymbols_hr', 'goog.i18n.pluralRules', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit']); goog.addDependency('i18n/mime.js', ['goog.i18n.mime', 'goog.i18n.mime.encode'], ['goog.array']); +goog.addDependency('i18n/mime_test.js', ['goog.i18n.mime.encodeTest'], ['goog.i18n.mime.encode', 'goog.testing.jsunit']); goog.addDependency('i18n/numberformat.js', ['goog.i18n.NumberFormat', 'goog.i18n.NumberFormat.CurrencyStyle', 'goog.i18n.NumberFormat.Format'], ['goog.asserts', 'goog.i18n.CompactNumberFormatSymbols', 'goog.i18n.NumberFormatSymbols', 'goog.i18n.currency', 'goog.math']); -goog.addDependency('i18n/numberformatsymbols.js', ['goog.i18n.NumberFormatSymbols', 'goog.i18n.NumberFormatSymbols_af', 'goog.i18n.NumberFormatSymbols_af_ZA', 'goog.i18n.NumberFormatSymbols_am', 'goog.i18n.NumberFormatSymbols_am_ET', 'goog.i18n.NumberFormatSymbols_ar', 'goog.i18n.NumberFormatSymbols_ar_001', 'goog.i18n.NumberFormatSymbols_ar_EG', 'goog.i18n.NumberFormatSymbols_bg', 'goog.i18n.NumberFormatSymbols_bg_BG', 'goog.i18n.NumberFormatSymbols_bn', 'goog.i18n.NumberFormatSymbols_bn_BD', 'goog.i18n.NumberFormatSymbols_br', 'goog.i18n.NumberFormatSymbols_br_FR', 'goog.i18n.NumberFormatSymbols_ca', 'goog.i18n.NumberFormatSymbols_ca_AD', 'goog.i18n.NumberFormatSymbols_ca_ES', 'goog.i18n.NumberFormatSymbols_chr', 'goog.i18n.NumberFormatSymbols_chr_US', 'goog.i18n.NumberFormatSymbols_cs', 'goog.i18n.NumberFormatSymbols_cs_CZ', 'goog.i18n.NumberFormatSymbols_cy', 'goog.i18n.NumberFormatSymbols_cy_GB', 'goog.i18n.NumberFormatSymbols_da', 'goog.i18n.NumberFormatSymbols_da_DK', 'goog.i18n.NumberFormatSymbols_de', 'goog.i18n.NumberFormatSymbols_de_AT', 'goog.i18n.NumberFormatSymbols_de_BE', 'goog.i18n.NumberFormatSymbols_de_CH', 'goog.i18n.NumberFormatSymbols_de_DE', 'goog.i18n.NumberFormatSymbols_de_LU', 'goog.i18n.NumberFormatSymbols_el', 'goog.i18n.NumberFormatSymbols_el_GR', 'goog.i18n.NumberFormatSymbols_en', 'goog.i18n.NumberFormatSymbols_en_AS', 'goog.i18n.NumberFormatSymbols_en_AU', 'goog.i18n.NumberFormatSymbols_en_Dsrt_US', 'goog.i18n.NumberFormatSymbols_en_FM', 'goog.i18n.NumberFormatSymbols_en_GB', 'goog.i18n.NumberFormatSymbols_en_GU', 'goog.i18n.NumberFormatSymbols_en_IE', 'goog.i18n.NumberFormatSymbols_en_IN', 'goog.i18n.NumberFormatSymbols_en_MH', 'goog.i18n.NumberFormatSymbols_en_MP', 'goog.i18n.NumberFormatSymbols_en_PR', 'goog.i18n.NumberFormatSymbols_en_PW', 'goog.i18n.NumberFormatSymbols_en_SG', 'goog.i18n.NumberFormatSymbols_en_TC', 'goog.i18n.NumberFormatSymbols_en_UM', 'goog.i18n.NumberFormatSymbols_en_US', 'goog.i18n.NumberFormatSymbols_en_VG', 'goog.i18n.NumberFormatSymbols_en_VI', 'goog.i18n.NumberFormatSymbols_en_ZA', 'goog.i18n.NumberFormatSymbols_es', 'goog.i18n.NumberFormatSymbols_es_419', 'goog.i18n.NumberFormatSymbols_es_EA', 'goog.i18n.NumberFormatSymbols_es_ES', 'goog.i18n.NumberFormatSymbols_es_IC', 'goog.i18n.NumberFormatSymbols_et', 'goog.i18n.NumberFormatSymbols_et_EE', 'goog.i18n.NumberFormatSymbols_eu', 'goog.i18n.NumberFormatSymbols_eu_ES', 'goog.i18n.NumberFormatSymbols_fa', 'goog.i18n.NumberFormatSymbols_fa_IR', 'goog.i18n.NumberFormatSymbols_fi', 'goog.i18n.NumberFormatSymbols_fi_FI', 'goog.i18n.NumberFormatSymbols_fil', 'goog.i18n.NumberFormatSymbols_fil_PH', 'goog.i18n.NumberFormatSymbols_fr', 'goog.i18n.NumberFormatSymbols_fr_BL', 'goog.i18n.NumberFormatSymbols_fr_CA', 'goog.i18n.NumberFormatSymbols_fr_FR', 'goog.i18n.NumberFormatSymbols_fr_GF', 'goog.i18n.NumberFormatSymbols_fr_GP', 'goog.i18n.NumberFormatSymbols_fr_MC', 'goog.i18n.NumberFormatSymbols_fr_MF', 'goog.i18n.NumberFormatSymbols_fr_MQ', 'goog.i18n.NumberFormatSymbols_fr_RE', 'goog.i18n.NumberFormatSymbols_fr_YT', 'goog.i18n.NumberFormatSymbols_gl', 'goog.i18n.NumberFormatSymbols_gl_ES', 'goog.i18n.NumberFormatSymbols_gsw', 'goog.i18n.NumberFormatSymbols_gsw_CH', 'goog.i18n.NumberFormatSymbols_gu', 'goog.i18n.NumberFormatSymbols_gu_IN', 'goog.i18n.NumberFormatSymbols_haw', 'goog.i18n.NumberFormatSymbols_haw_US', 'goog.i18n.NumberFormatSymbols_he', 'goog.i18n.NumberFormatSymbols_he_IL', 'goog.i18n.NumberFormatSymbols_hi', 'goog.i18n.NumberFormatSymbols_hi_IN', 'goog.i18n.NumberFormatSymbols_hr', 'goog.i18n.NumberFormatSymbols_hr_HR', 'goog.i18n.NumberFormatSymbols_hu', 'goog.i18n.NumberFormatSymbols_hu_HU', 'goog.i18n.NumberFormatSymbols_id', 'goog.i18n.NumberFormatSymbols_id_ID', 'goog.i18n.NumberFormatSymbols_in', 'goog.i18n.NumberFormatSymbols_is', 'goog.i18n.NumberFormatSymbols_is_IS', 'goog.i18n.NumberFormatSymbols_it', 'goog.i18n.NumberFormatSymbols_it_IT', 'goog.i18n.NumberFormatSymbols_it_SM', 'goog.i18n.NumberFormatSymbols_iw', 'goog.i18n.NumberFormatSymbols_ja', 'goog.i18n.NumberFormatSymbols_ja_JP', 'goog.i18n.NumberFormatSymbols_kn', 'goog.i18n.NumberFormatSymbols_kn_IN', 'goog.i18n.NumberFormatSymbols_ko', 'goog.i18n.NumberFormatSymbols_ko_KR', 'goog.i18n.NumberFormatSymbols_ln', 'goog.i18n.NumberFormatSymbols_ln_CD', 'goog.i18n.NumberFormatSymbols_lt', 'goog.i18n.NumberFormatSymbols_lt_LT', 'goog.i18n.NumberFormatSymbols_lv', 'goog.i18n.NumberFormatSymbols_lv_LV', 'goog.i18n.NumberFormatSymbols_ml', 'goog.i18n.NumberFormatSymbols_ml_IN', 'goog.i18n.NumberFormatSymbols_mr', 'goog.i18n.NumberFormatSymbols_mr_IN', 'goog.i18n.NumberFormatSymbols_ms', 'goog.i18n.NumberFormatSymbols_ms_Latn_MY', 'goog.i18n.NumberFormatSymbols_mt', 'goog.i18n.NumberFormatSymbols_mt_MT', 'goog.i18n.NumberFormatSymbols_nb', 'goog.i18n.NumberFormatSymbols_nb_NO', 'goog.i18n.NumberFormatSymbols_nl', 'goog.i18n.NumberFormatSymbols_nl_NL', 'goog.i18n.NumberFormatSymbols_no', 'goog.i18n.NumberFormatSymbols_or', 'goog.i18n.NumberFormatSymbols_or_IN', 'goog.i18n.NumberFormatSymbols_pl', 'goog.i18n.NumberFormatSymbols_pl_PL', 'goog.i18n.NumberFormatSymbols_pt', 'goog.i18n.NumberFormatSymbols_pt_BR', 'goog.i18n.NumberFormatSymbols_pt_PT', 'goog.i18n.NumberFormatSymbols_ro', 'goog.i18n.NumberFormatSymbols_ro_RO', 'goog.i18n.NumberFormatSymbols_ru', 'goog.i18n.NumberFormatSymbols_ru_RU', 'goog.i18n.NumberFormatSymbols_sk', 'goog.i18n.NumberFormatSymbols_sk_SK', 'goog.i18n.NumberFormatSymbols_sl', 'goog.i18n.NumberFormatSymbols_sl_SI', 'goog.i18n.NumberFormatSymbols_sq', 'goog.i18n.NumberFormatSymbols_sq_AL', 'goog.i18n.NumberFormatSymbols_sr', 'goog.i18n.NumberFormatSymbols_sr_Cyrl_RS', 'goog.i18n.NumberFormatSymbols_sv', 'goog.i18n.NumberFormatSymbols_sv_SE', 'goog.i18n.NumberFormatSymbols_sw', 'goog.i18n.NumberFormatSymbols_sw_TZ', 'goog.i18n.NumberFormatSymbols_ta', 'goog.i18n.NumberFormatSymbols_ta_IN', 'goog.i18n.NumberFormatSymbols_te', 'goog.i18n.NumberFormatSymbols_te_IN', 'goog.i18n.NumberFormatSymbols_th', 'goog.i18n.NumberFormatSymbols_th_TH', 'goog.i18n.NumberFormatSymbols_tl', 'goog.i18n.NumberFormatSymbols_tr', 'goog.i18n.NumberFormatSymbols_tr_TR', 'goog.i18n.NumberFormatSymbols_uk', 'goog.i18n.NumberFormatSymbols_uk_UA', 'goog.i18n.NumberFormatSymbols_ur', 'goog.i18n.NumberFormatSymbols_ur_PK', 'goog.i18n.NumberFormatSymbols_vi', 'goog.i18n.NumberFormatSymbols_vi_VN', 'goog.i18n.NumberFormatSymbols_zh', 'goog.i18n.NumberFormatSymbols_zh_CN', 'goog.i18n.NumberFormatSymbols_zh_HK', 'goog.i18n.NumberFormatSymbols_zh_Hans_CN', 'goog.i18n.NumberFormatSymbols_zh_TW', 'goog.i18n.NumberFormatSymbols_zu', 'goog.i18n.NumberFormatSymbols_zu_ZA'], []); -goog.addDependency('i18n/numberformatsymbolsext.js', ['goog.i18n.NumberFormatSymbolsExt', 'goog.i18n.NumberFormatSymbols_aa', 'goog.i18n.NumberFormatSymbols_aa_DJ', 'goog.i18n.NumberFormatSymbols_aa_ER', 'goog.i18n.NumberFormatSymbols_aa_ET', 'goog.i18n.NumberFormatSymbols_af_NA', 'goog.i18n.NumberFormatSymbols_agq', 'goog.i18n.NumberFormatSymbols_agq_CM', 'goog.i18n.NumberFormatSymbols_ak', 'goog.i18n.NumberFormatSymbols_ak_GH', 'goog.i18n.NumberFormatSymbols_ar_AE', 'goog.i18n.NumberFormatSymbols_ar_BH', 'goog.i18n.NumberFormatSymbols_ar_DJ', 'goog.i18n.NumberFormatSymbols_ar_DZ', 'goog.i18n.NumberFormatSymbols_ar_EH', 'goog.i18n.NumberFormatSymbols_ar_ER', 'goog.i18n.NumberFormatSymbols_ar_IL', 'goog.i18n.NumberFormatSymbols_ar_IQ', 'goog.i18n.NumberFormatSymbols_ar_JO', 'goog.i18n.NumberFormatSymbols_ar_KM', 'goog.i18n.NumberFormatSymbols_ar_KW', 'goog.i18n.NumberFormatSymbols_ar_LB', 'goog.i18n.NumberFormatSymbols_ar_LY', 'goog.i18n.NumberFormatSymbols_ar_MA', 'goog.i18n.NumberFormatSymbols_ar_MR', 'goog.i18n.NumberFormatSymbols_ar_OM', 'goog.i18n.NumberFormatSymbols_ar_PS', 'goog.i18n.NumberFormatSymbols_ar_QA', 'goog.i18n.NumberFormatSymbols_ar_SA', 'goog.i18n.NumberFormatSymbols_ar_SD', 'goog.i18n.NumberFormatSymbols_ar_SO', 'goog.i18n.NumberFormatSymbols_ar_SY', 'goog.i18n.NumberFormatSymbols_ar_TD', 'goog.i18n.NumberFormatSymbols_ar_TN', 'goog.i18n.NumberFormatSymbols_ar_YE', 'goog.i18n.NumberFormatSymbols_as', 'goog.i18n.NumberFormatSymbols_as_IN', 'goog.i18n.NumberFormatSymbols_asa', 'goog.i18n.NumberFormatSymbols_asa_TZ', 'goog.i18n.NumberFormatSymbols_ast', 'goog.i18n.NumberFormatSymbols_ast_ES', 'goog.i18n.NumberFormatSymbols_az', 'goog.i18n.NumberFormatSymbols_az_Cyrl', 'goog.i18n.NumberFormatSymbols_az_Cyrl_AZ', 'goog.i18n.NumberFormatSymbols_az_Latn', 'goog.i18n.NumberFormatSymbols_az_Latn_AZ', 'goog.i18n.NumberFormatSymbols_bas', 'goog.i18n.NumberFormatSymbols_bas_CM', 'goog.i18n.NumberFormatSymbols_be', 'goog.i18n.NumberFormatSymbols_be_BY', 'goog.i18n.NumberFormatSymbols_bem', 'goog.i18n.NumberFormatSymbols_bem_ZM', 'goog.i18n.NumberFormatSymbols_bez', 'goog.i18n.NumberFormatSymbols_bez_TZ', 'goog.i18n.NumberFormatSymbols_bm', 'goog.i18n.NumberFormatSymbols_bm_ML', 'goog.i18n.NumberFormatSymbols_bn_IN', 'goog.i18n.NumberFormatSymbols_bo', 'goog.i18n.NumberFormatSymbols_bo_CN', 'goog.i18n.NumberFormatSymbols_bo_IN', 'goog.i18n.NumberFormatSymbols_brx', 'goog.i18n.NumberFormatSymbols_brx_IN', 'goog.i18n.NumberFormatSymbols_bs', 'goog.i18n.NumberFormatSymbols_bs_Cyrl', 'goog.i18n.NumberFormatSymbols_bs_Cyrl_BA', 'goog.i18n.NumberFormatSymbols_bs_Latn', 'goog.i18n.NumberFormatSymbols_bs_Latn_BA', 'goog.i18n.NumberFormatSymbols_byn', 'goog.i18n.NumberFormatSymbols_byn_ER', 'goog.i18n.NumberFormatSymbols_cgg', 'goog.i18n.NumberFormatSymbols_cgg_UG', 'goog.i18n.NumberFormatSymbols_ckb', 'goog.i18n.NumberFormatSymbols_ckb_Arab', 'goog.i18n.NumberFormatSymbols_ckb_Arab_IQ', 'goog.i18n.NumberFormatSymbols_ckb_Arab_IR', 'goog.i18n.NumberFormatSymbols_ckb_IQ', 'goog.i18n.NumberFormatSymbols_ckb_IR', 'goog.i18n.NumberFormatSymbols_ckb_Latn', 'goog.i18n.NumberFormatSymbols_ckb_Latn_IQ', 'goog.i18n.NumberFormatSymbols_dav', 'goog.i18n.NumberFormatSymbols_dav_KE', 'goog.i18n.NumberFormatSymbols_de_LI', 'goog.i18n.NumberFormatSymbols_dje', 'goog.i18n.NumberFormatSymbols_dje_NE', 'goog.i18n.NumberFormatSymbols_dua', 'goog.i18n.NumberFormatSymbols_dua_CM', 'goog.i18n.NumberFormatSymbols_dyo', 'goog.i18n.NumberFormatSymbols_dyo_SN', 'goog.i18n.NumberFormatSymbols_dz', 'goog.i18n.NumberFormatSymbols_dz_BT', 'goog.i18n.NumberFormatSymbols_ebu', 'goog.i18n.NumberFormatSymbols_ebu_KE', 'goog.i18n.NumberFormatSymbols_ee', 'goog.i18n.NumberFormatSymbols_ee_GH', 'goog.i18n.NumberFormatSymbols_ee_TG', 'goog.i18n.NumberFormatSymbols_el_CY', 'goog.i18n.NumberFormatSymbols_en_150', 'goog.i18n.NumberFormatSymbols_en_AG', 'goog.i18n.NumberFormatSymbols_en_BB', 'goog.i18n.NumberFormatSymbols_en_BE', 'goog.i18n.NumberFormatSymbols_en_BM', 'goog.i18n.NumberFormatSymbols_en_BS', 'goog.i18n.NumberFormatSymbols_en_BW', 'goog.i18n.NumberFormatSymbols_en_BZ', 'goog.i18n.NumberFormatSymbols_en_CA', 'goog.i18n.NumberFormatSymbols_en_CM', 'goog.i18n.NumberFormatSymbols_en_DM', 'goog.i18n.NumberFormatSymbols_en_Dsrt', 'goog.i18n.NumberFormatSymbols_en_FJ', 'goog.i18n.NumberFormatSymbols_en_GD', 'goog.i18n.NumberFormatSymbols_en_GG', 'goog.i18n.NumberFormatSymbols_en_GH', 'goog.i18n.NumberFormatSymbols_en_GI', 'goog.i18n.NumberFormatSymbols_en_GM', 'goog.i18n.NumberFormatSymbols_en_GY', 'goog.i18n.NumberFormatSymbols_en_HK', 'goog.i18n.NumberFormatSymbols_en_IM', 'goog.i18n.NumberFormatSymbols_en_JE', 'goog.i18n.NumberFormatSymbols_en_JM', 'goog.i18n.NumberFormatSymbols_en_KE', 'goog.i18n.NumberFormatSymbols_en_KI', 'goog.i18n.NumberFormatSymbols_en_KN', 'goog.i18n.NumberFormatSymbols_en_KY', 'goog.i18n.NumberFormatSymbols_en_LC', 'goog.i18n.NumberFormatSymbols_en_LR', 'goog.i18n.NumberFormatSymbols_en_LS', 'goog.i18n.NumberFormatSymbols_en_MG', 'goog.i18n.NumberFormatSymbols_en_MT', 'goog.i18n.NumberFormatSymbols_en_MU', 'goog.i18n.NumberFormatSymbols_en_MW', 'goog.i18n.NumberFormatSymbols_en_NA', 'goog.i18n.NumberFormatSymbols_en_NG', 'goog.i18n.NumberFormatSymbols_en_NZ', 'goog.i18n.NumberFormatSymbols_en_PG', 'goog.i18n.NumberFormatSymbols_en_PH', 'goog.i18n.NumberFormatSymbols_en_PK', 'goog.i18n.NumberFormatSymbols_en_SB', 'goog.i18n.NumberFormatSymbols_en_SC', 'goog.i18n.NumberFormatSymbols_en_SL', 'goog.i18n.NumberFormatSymbols_en_SS', 'goog.i18n.NumberFormatSymbols_en_SZ', 'goog.i18n.NumberFormatSymbols_en_TO', 'goog.i18n.NumberFormatSymbols_en_TT', 'goog.i18n.NumberFormatSymbols_en_TZ', 'goog.i18n.NumberFormatSymbols_en_UG', 'goog.i18n.NumberFormatSymbols_en_VC', 'goog.i18n.NumberFormatSymbols_en_VU', 'goog.i18n.NumberFormatSymbols_en_WS', 'goog.i18n.NumberFormatSymbols_en_ZM', 'goog.i18n.NumberFormatSymbols_en_ZW', 'goog.i18n.NumberFormatSymbols_eo', 'goog.i18n.NumberFormatSymbols_es_AR', 'goog.i18n.NumberFormatSymbols_es_BO', 'goog.i18n.NumberFormatSymbols_es_CL', 'goog.i18n.NumberFormatSymbols_es_CO', 'goog.i18n.NumberFormatSymbols_es_CR', 'goog.i18n.NumberFormatSymbols_es_CU', 'goog.i18n.NumberFormatSymbols_es_DO', 'goog.i18n.NumberFormatSymbols_es_EC', 'goog.i18n.NumberFormatSymbols_es_GQ', 'goog.i18n.NumberFormatSymbols_es_GT', 'goog.i18n.NumberFormatSymbols_es_HN', 'goog.i18n.NumberFormatSymbols_es_MX', 'goog.i18n.NumberFormatSymbols_es_NI', 'goog.i18n.NumberFormatSymbols_es_PA', 'goog.i18n.NumberFormatSymbols_es_PE', 'goog.i18n.NumberFormatSymbols_es_PH', 'goog.i18n.NumberFormatSymbols_es_PR', 'goog.i18n.NumberFormatSymbols_es_PY', 'goog.i18n.NumberFormatSymbols_es_SV', 'goog.i18n.NumberFormatSymbols_es_US', 'goog.i18n.NumberFormatSymbols_es_UY', 'goog.i18n.NumberFormatSymbols_es_VE', 'goog.i18n.NumberFormatSymbols_ewo', 'goog.i18n.NumberFormatSymbols_ewo_CM', 'goog.i18n.NumberFormatSymbols_fa_AF', 'goog.i18n.NumberFormatSymbols_ff', 'goog.i18n.NumberFormatSymbols_ff_SN', 'goog.i18n.NumberFormatSymbols_fo', 'goog.i18n.NumberFormatSymbols_fo_FO', 'goog.i18n.NumberFormatSymbols_fr_BE', 'goog.i18n.NumberFormatSymbols_fr_BF', 'goog.i18n.NumberFormatSymbols_fr_BI', 'goog.i18n.NumberFormatSymbols_fr_BJ', 'goog.i18n.NumberFormatSymbols_fr_CD', 'goog.i18n.NumberFormatSymbols_fr_CF', 'goog.i18n.NumberFormatSymbols_fr_CG', 'goog.i18n.NumberFormatSymbols_fr_CH', 'goog.i18n.NumberFormatSymbols_fr_CI', 'goog.i18n.NumberFormatSymbols_fr_CM', 'goog.i18n.NumberFormatSymbols_fr_DJ', 'goog.i18n.NumberFormatSymbols_fr_DZ', 'goog.i18n.NumberFormatSymbols_fr_GA', 'goog.i18n.NumberFormatSymbols_fr_GN', 'goog.i18n.NumberFormatSymbols_fr_GQ', 'goog.i18n.NumberFormatSymbols_fr_HT', 'goog.i18n.NumberFormatSymbols_fr_KM', 'goog.i18n.NumberFormatSymbols_fr_LU', 'goog.i18n.NumberFormatSymbols_fr_MA', 'goog.i18n.NumberFormatSymbols_fr_MG', 'goog.i18n.NumberFormatSymbols_fr_ML', 'goog.i18n.NumberFormatSymbols_fr_MR', 'goog.i18n.NumberFormatSymbols_fr_MU', 'goog.i18n.NumberFormatSymbols_fr_NC', 'goog.i18n.NumberFormatSymbols_fr_NE', 'goog.i18n.NumberFormatSymbols_fr_PF', 'goog.i18n.NumberFormatSymbols_fr_RW', 'goog.i18n.NumberFormatSymbols_fr_SC', 'goog.i18n.NumberFormatSymbols_fr_SN', 'goog.i18n.NumberFormatSymbols_fr_SY', 'goog.i18n.NumberFormatSymbols_fr_TD', 'goog.i18n.NumberFormatSymbols_fr_TG', 'goog.i18n.NumberFormatSymbols_fr_TN', 'goog.i18n.NumberFormatSymbols_fr_VU', 'goog.i18n.NumberFormatSymbols_fur', 'goog.i18n.NumberFormatSymbols_fur_IT', 'goog.i18n.NumberFormatSymbols_ga', 'goog.i18n.NumberFormatSymbols_ga_IE', 'goog.i18n.NumberFormatSymbols_gd', 'goog.i18n.NumberFormatSymbols_gd_GB', 'goog.i18n.NumberFormatSymbols_guz', 'goog.i18n.NumberFormatSymbols_guz_KE', 'goog.i18n.NumberFormatSymbols_gv', 'goog.i18n.NumberFormatSymbols_gv_GB', 'goog.i18n.NumberFormatSymbols_ha', 'goog.i18n.NumberFormatSymbols_ha_Latn', 'goog.i18n.NumberFormatSymbols_ha_Latn_GH', 'goog.i18n.NumberFormatSymbols_ha_Latn_NE', 'goog.i18n.NumberFormatSymbols_ha_Latn_NG', 'goog.i18n.NumberFormatSymbols_hr_BA', 'goog.i18n.NumberFormatSymbols_hy', 'goog.i18n.NumberFormatSymbols_hy_AM', 'goog.i18n.NumberFormatSymbols_ia', 'goog.i18n.NumberFormatSymbols_ia_FR', 'goog.i18n.NumberFormatSymbols_ig', 'goog.i18n.NumberFormatSymbols_ig_NG', 'goog.i18n.NumberFormatSymbols_ii', 'goog.i18n.NumberFormatSymbols_ii_CN', 'goog.i18n.NumberFormatSymbols_it_CH', 'goog.i18n.NumberFormatSymbols_jgo', 'goog.i18n.NumberFormatSymbols_jgo_CM', 'goog.i18n.NumberFormatSymbols_jmc', 'goog.i18n.NumberFormatSymbols_jmc_TZ', 'goog.i18n.NumberFormatSymbols_ka', 'goog.i18n.NumberFormatSymbols_ka_GE', 'goog.i18n.NumberFormatSymbols_kab', 'goog.i18n.NumberFormatSymbols_kab_DZ', 'goog.i18n.NumberFormatSymbols_kam', 'goog.i18n.NumberFormatSymbols_kam_KE', 'goog.i18n.NumberFormatSymbols_kde', 'goog.i18n.NumberFormatSymbols_kde_TZ', 'goog.i18n.NumberFormatSymbols_kea', 'goog.i18n.NumberFormatSymbols_kea_CV', 'goog.i18n.NumberFormatSymbols_khq', 'goog.i18n.NumberFormatSymbols_khq_ML', 'goog.i18n.NumberFormatSymbols_ki', 'goog.i18n.NumberFormatSymbols_ki_KE', 'goog.i18n.NumberFormatSymbols_kk', 'goog.i18n.NumberFormatSymbols_kk_Cyrl', 'goog.i18n.NumberFormatSymbols_kk_Cyrl_KZ', 'goog.i18n.NumberFormatSymbols_kkj', 'goog.i18n.NumberFormatSymbols_kkj_CM', 'goog.i18n.NumberFormatSymbols_kl', 'goog.i18n.NumberFormatSymbols_kl_GL', 'goog.i18n.NumberFormatSymbols_kln', 'goog.i18n.NumberFormatSymbols_kln_KE', 'goog.i18n.NumberFormatSymbols_km', 'goog.i18n.NumberFormatSymbols_km_KH', 'goog.i18n.NumberFormatSymbols_ko_KP', 'goog.i18n.NumberFormatSymbols_kok', 'goog.i18n.NumberFormatSymbols_kok_IN', 'goog.i18n.NumberFormatSymbols_ks', 'goog.i18n.NumberFormatSymbols_ks_Arab', 'goog.i18n.NumberFormatSymbols_ks_Arab_IN', 'goog.i18n.NumberFormatSymbols_ksb', 'goog.i18n.NumberFormatSymbols_ksb_TZ', 'goog.i18n.NumberFormatSymbols_ksf', 'goog.i18n.NumberFormatSymbols_ksf_CM', 'goog.i18n.NumberFormatSymbols_ksh', 'goog.i18n.NumberFormatSymbols_ksh_DE', 'goog.i18n.NumberFormatSymbols_kw', 'goog.i18n.NumberFormatSymbols_kw_GB', 'goog.i18n.NumberFormatSymbols_ky', 'goog.i18n.NumberFormatSymbols_ky_KG', 'goog.i18n.NumberFormatSymbols_lag', 'goog.i18n.NumberFormatSymbols_lag_TZ', 'goog.i18n.NumberFormatSymbols_lg', 'goog.i18n.NumberFormatSymbols_lg_UG', 'goog.i18n.NumberFormatSymbols_ln_AO', 'goog.i18n.NumberFormatSymbols_ln_CF', 'goog.i18n.NumberFormatSymbols_ln_CG', 'goog.i18n.NumberFormatSymbols_lo', 'goog.i18n.NumberFormatSymbols_lo_LA', 'goog.i18n.NumberFormatSymbols_lu', 'goog.i18n.NumberFormatSymbols_lu_CD', 'goog.i18n.NumberFormatSymbols_luo', 'goog.i18n.NumberFormatSymbols_luo_KE', 'goog.i18n.NumberFormatSymbols_luy', 'goog.i18n.NumberFormatSymbols_luy_KE', 'goog.i18n.NumberFormatSymbols_mas', 'goog.i18n.NumberFormatSymbols_mas_KE', 'goog.i18n.NumberFormatSymbols_mas_TZ', 'goog.i18n.NumberFormatSymbols_mer', 'goog.i18n.NumberFormatSymbols_mer_KE', 'goog.i18n.NumberFormatSymbols_mfe', 'goog.i18n.NumberFormatSymbols_mfe_MU', 'goog.i18n.NumberFormatSymbols_mg', 'goog.i18n.NumberFormatSymbols_mg_MG', 'goog.i18n.NumberFormatSymbols_mgh', 'goog.i18n.NumberFormatSymbols_mgh_MZ', 'goog.i18n.NumberFormatSymbols_mgo', 'goog.i18n.NumberFormatSymbols_mgo_CM', 'goog.i18n.NumberFormatSymbols_mk', 'goog.i18n.NumberFormatSymbols_mk_MK', 'goog.i18n.NumberFormatSymbols_mn', 'goog.i18n.NumberFormatSymbols_mn_Cyrl', 'goog.i18n.NumberFormatSymbols_mn_Cyrl_MN', 'goog.i18n.NumberFormatSymbols_ms_Latn', 'goog.i18n.NumberFormatSymbols_ms_Latn_BN', 'goog.i18n.NumberFormatSymbols_ms_Latn_SG', 'goog.i18n.NumberFormatSymbols_mua', 'goog.i18n.NumberFormatSymbols_mua_CM', 'goog.i18n.NumberFormatSymbols_my', 'goog.i18n.NumberFormatSymbols_my_MM', 'goog.i18n.NumberFormatSymbols_naq', 'goog.i18n.NumberFormatSymbols_naq_NA', 'goog.i18n.NumberFormatSymbols_nd', 'goog.i18n.NumberFormatSymbols_nd_ZW', 'goog.i18n.NumberFormatSymbols_ne', 'goog.i18n.NumberFormatSymbols_ne_IN', 'goog.i18n.NumberFormatSymbols_ne_NP', 'goog.i18n.NumberFormatSymbols_nl_AW', 'goog.i18n.NumberFormatSymbols_nl_BE', 'goog.i18n.NumberFormatSymbols_nl_CW', 'goog.i18n.NumberFormatSymbols_nl_SR', 'goog.i18n.NumberFormatSymbols_nl_SX', 'goog.i18n.NumberFormatSymbols_nmg', 'goog.i18n.NumberFormatSymbols_nmg_CM', 'goog.i18n.NumberFormatSymbols_nn', 'goog.i18n.NumberFormatSymbols_nn_NO', 'goog.i18n.NumberFormatSymbols_nnh', 'goog.i18n.NumberFormatSymbols_nnh_CM', 'goog.i18n.NumberFormatSymbols_nr', 'goog.i18n.NumberFormatSymbols_nr_ZA', 'goog.i18n.NumberFormatSymbols_nso', 'goog.i18n.NumberFormatSymbols_nso_ZA', 'goog.i18n.NumberFormatSymbols_nus', 'goog.i18n.NumberFormatSymbols_nus_SD', 'goog.i18n.NumberFormatSymbols_nyn', 'goog.i18n.NumberFormatSymbols_nyn_UG', 'goog.i18n.NumberFormatSymbols_om', 'goog.i18n.NumberFormatSymbols_om_ET', 'goog.i18n.NumberFormatSymbols_om_KE', 'goog.i18n.NumberFormatSymbols_os', 'goog.i18n.NumberFormatSymbols_os_GE', 'goog.i18n.NumberFormatSymbols_os_RU', 'goog.i18n.NumberFormatSymbols_pa', 'goog.i18n.NumberFormatSymbols_pa_Arab', 'goog.i18n.NumberFormatSymbols_pa_Arab_PK', 'goog.i18n.NumberFormatSymbols_pa_Guru', 'goog.i18n.NumberFormatSymbols_pa_Guru_IN', 'goog.i18n.NumberFormatSymbols_ps', 'goog.i18n.NumberFormatSymbols_ps_AF', 'goog.i18n.NumberFormatSymbols_pt_AO', 'goog.i18n.NumberFormatSymbols_pt_CV', 'goog.i18n.NumberFormatSymbols_pt_GW', 'goog.i18n.NumberFormatSymbols_pt_MO', 'goog.i18n.NumberFormatSymbols_pt_MZ', 'goog.i18n.NumberFormatSymbols_pt_ST', 'goog.i18n.NumberFormatSymbols_pt_TL', 'goog.i18n.NumberFormatSymbols_rm', 'goog.i18n.NumberFormatSymbols_rm_CH', 'goog.i18n.NumberFormatSymbols_rn', 'goog.i18n.NumberFormatSymbols_rn_BI', 'goog.i18n.NumberFormatSymbols_ro_MD', 'goog.i18n.NumberFormatSymbols_rof', 'goog.i18n.NumberFormatSymbols_rof_TZ', 'goog.i18n.NumberFormatSymbols_ru_BY', 'goog.i18n.NumberFormatSymbols_ru_KG', 'goog.i18n.NumberFormatSymbols_ru_KZ', 'goog.i18n.NumberFormatSymbols_ru_MD', 'goog.i18n.NumberFormatSymbols_ru_UA', 'goog.i18n.NumberFormatSymbols_rw', 'goog.i18n.NumberFormatSymbols_rw_RW', 'goog.i18n.NumberFormatSymbols_rwk', 'goog.i18n.NumberFormatSymbols_rwk_TZ', 'goog.i18n.NumberFormatSymbols_sah', 'goog.i18n.NumberFormatSymbols_sah_RU', 'goog.i18n.NumberFormatSymbols_saq', 'goog.i18n.NumberFormatSymbols_saq_KE', 'goog.i18n.NumberFormatSymbols_sbp', 'goog.i18n.NumberFormatSymbols_sbp_TZ', 'goog.i18n.NumberFormatSymbols_se', 'goog.i18n.NumberFormatSymbols_se_FI', 'goog.i18n.NumberFormatSymbols_se_NO', 'goog.i18n.NumberFormatSymbols_seh', 'goog.i18n.NumberFormatSymbols_seh_MZ', 'goog.i18n.NumberFormatSymbols_ses', 'goog.i18n.NumberFormatSymbols_ses_ML', 'goog.i18n.NumberFormatSymbols_sg', 'goog.i18n.NumberFormatSymbols_sg_CF', 'goog.i18n.NumberFormatSymbols_shi', 'goog.i18n.NumberFormatSymbols_shi_Latn', 'goog.i18n.NumberFormatSymbols_shi_Latn_MA', 'goog.i18n.NumberFormatSymbols_shi_Tfng', 'goog.i18n.NumberFormatSymbols_shi_Tfng_MA', 'goog.i18n.NumberFormatSymbols_si', 'goog.i18n.NumberFormatSymbols_si_LK', 'goog.i18n.NumberFormatSymbols_sn', 'goog.i18n.NumberFormatSymbols_sn_ZW', 'goog.i18n.NumberFormatSymbols_so', 'goog.i18n.NumberFormatSymbols_so_DJ', 'goog.i18n.NumberFormatSymbols_so_ET', 'goog.i18n.NumberFormatSymbols_so_KE', 'goog.i18n.NumberFormatSymbols_so_SO', 'goog.i18n.NumberFormatSymbols_sq_MK', 'goog.i18n.NumberFormatSymbols_sq_XK', 'goog.i18n.NumberFormatSymbols_sr_Cyrl', 'goog.i18n.NumberFormatSymbols_sr_Cyrl_BA', 'goog.i18n.NumberFormatSymbols_sr_Cyrl_ME', 'goog.i18n.NumberFormatSymbols_sr_Cyrl_XK', 'goog.i18n.NumberFormatSymbols_sr_Latn', 'goog.i18n.NumberFormatSymbols_sr_Latn_BA', 'goog.i18n.NumberFormatSymbols_sr_Latn_ME', 'goog.i18n.NumberFormatSymbols_sr_Latn_RS', 'goog.i18n.NumberFormatSymbols_sr_Latn_XK', 'goog.i18n.NumberFormatSymbols_ss', 'goog.i18n.NumberFormatSymbols_ss_SZ', 'goog.i18n.NumberFormatSymbols_ss_ZA', 'goog.i18n.NumberFormatSymbols_ssy', 'goog.i18n.NumberFormatSymbols_ssy_ER', 'goog.i18n.NumberFormatSymbols_st', 'goog.i18n.NumberFormatSymbols_st_LS', 'goog.i18n.NumberFormatSymbols_st_ZA', 'goog.i18n.NumberFormatSymbols_sv_AX', 'goog.i18n.NumberFormatSymbols_sv_FI', 'goog.i18n.NumberFormatSymbols_sw_KE', 'goog.i18n.NumberFormatSymbols_sw_UG', 'goog.i18n.NumberFormatSymbols_swc', 'goog.i18n.NumberFormatSymbols_swc_CD', 'goog.i18n.NumberFormatSymbols_ta_LK', 'goog.i18n.NumberFormatSymbols_ta_MY', 'goog.i18n.NumberFormatSymbols_ta_SG', 'goog.i18n.NumberFormatSymbols_teo', 'goog.i18n.NumberFormatSymbols_teo_KE', 'goog.i18n.NumberFormatSymbols_teo_UG', 'goog.i18n.NumberFormatSymbols_tg', 'goog.i18n.NumberFormatSymbols_tg_Cyrl', 'goog.i18n.NumberFormatSymbols_tg_Cyrl_TJ', 'goog.i18n.NumberFormatSymbols_ti', 'goog.i18n.NumberFormatSymbols_ti_ER', 'goog.i18n.NumberFormatSymbols_ti_ET', 'goog.i18n.NumberFormatSymbols_tig', 'goog.i18n.NumberFormatSymbols_tig_ER', 'goog.i18n.NumberFormatSymbols_tn', 'goog.i18n.NumberFormatSymbols_tn_BW', 'goog.i18n.NumberFormatSymbols_tn_ZA', 'goog.i18n.NumberFormatSymbols_to', 'goog.i18n.NumberFormatSymbols_to_TO', 'goog.i18n.NumberFormatSymbols_tr_CY', 'goog.i18n.NumberFormatSymbols_ts', 'goog.i18n.NumberFormatSymbols_ts_ZA', 'goog.i18n.NumberFormatSymbols_twq', 'goog.i18n.NumberFormatSymbols_twq_NE', 'goog.i18n.NumberFormatSymbols_tzm', 'goog.i18n.NumberFormatSymbols_tzm_Latn', 'goog.i18n.NumberFormatSymbols_tzm_Latn_MA', 'goog.i18n.NumberFormatSymbols_ur_IN', 'goog.i18n.NumberFormatSymbols_uz', 'goog.i18n.NumberFormatSymbols_uz_Arab', 'goog.i18n.NumberFormatSymbols_uz_Arab_AF', 'goog.i18n.NumberFormatSymbols_uz_Cyrl', 'goog.i18n.NumberFormatSymbols_uz_Cyrl_UZ', 'goog.i18n.NumberFormatSymbols_uz_Latn', 'goog.i18n.NumberFormatSymbols_uz_Latn_UZ', 'goog.i18n.NumberFormatSymbols_vai', 'goog.i18n.NumberFormatSymbols_vai_Latn', 'goog.i18n.NumberFormatSymbols_vai_Latn_LR', 'goog.i18n.NumberFormatSymbols_vai_Vaii', 'goog.i18n.NumberFormatSymbols_vai_Vaii_LR', 'goog.i18n.NumberFormatSymbols_ve', 'goog.i18n.NumberFormatSymbols_ve_ZA', 'goog.i18n.NumberFormatSymbols_vo', 'goog.i18n.NumberFormatSymbols_vun', 'goog.i18n.NumberFormatSymbols_vun_TZ', 'goog.i18n.NumberFormatSymbols_wae', 'goog.i18n.NumberFormatSymbols_wae_CH', 'goog.i18n.NumberFormatSymbols_wal', 'goog.i18n.NumberFormatSymbols_wal_ET', 'goog.i18n.NumberFormatSymbols_xh', 'goog.i18n.NumberFormatSymbols_xh_ZA', 'goog.i18n.NumberFormatSymbols_xog', 'goog.i18n.NumberFormatSymbols_xog_UG', 'goog.i18n.NumberFormatSymbols_yav', 'goog.i18n.NumberFormatSymbols_yav_CM', 'goog.i18n.NumberFormatSymbols_yo', 'goog.i18n.NumberFormatSymbols_yo_NG', 'goog.i18n.NumberFormatSymbols_zh_Hans', 'goog.i18n.NumberFormatSymbols_zh_Hans_HK', 'goog.i18n.NumberFormatSymbols_zh_Hans_MO', 'goog.i18n.NumberFormatSymbols_zh_Hans_SG', 'goog.i18n.NumberFormatSymbols_zh_Hant', 'goog.i18n.NumberFormatSymbols_zh_Hant_HK', 'goog.i18n.NumberFormatSymbols_zh_Hant_MO', 'goog.i18n.NumberFormatSymbols_zh_Hant_TW'], ['goog.i18n.NumberFormatSymbols']); +goog.addDependency('i18n/numberformat_test.js', ['goog.i18n.NumberFormatTest'], ['goog.i18n.CompactNumberFormatSymbols', 'goog.i18n.CompactNumberFormatSymbols_de', 'goog.i18n.CompactNumberFormatSymbols_en', 'goog.i18n.CompactNumberFormatSymbols_fr', 'goog.i18n.NumberFormat', 'goog.i18n.NumberFormatSymbols', 'goog.i18n.NumberFormatSymbols_de', 'goog.i18n.NumberFormatSymbols_en', 'goog.i18n.NumberFormatSymbols_fr', 'goog.i18n.NumberFormatSymbols_pl', 'goog.i18n.NumberFormatSymbols_ro', 'goog.testing.ExpectedFailures', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgent.product', 'goog.userAgent.product.isVersion']); +goog.addDependency('i18n/numberformatsymbols.js', ['goog.i18n.NumberFormatSymbols', 'goog.i18n.NumberFormatSymbols_af', 'goog.i18n.NumberFormatSymbols_af_ZA', 'goog.i18n.NumberFormatSymbols_am', 'goog.i18n.NumberFormatSymbols_am_ET', 'goog.i18n.NumberFormatSymbols_ar', 'goog.i18n.NumberFormatSymbols_ar_001', 'goog.i18n.NumberFormatSymbols_az', 'goog.i18n.NumberFormatSymbols_az_Cyrl_AZ', 'goog.i18n.NumberFormatSymbols_az_Latn_AZ', 'goog.i18n.NumberFormatSymbols_bg', 'goog.i18n.NumberFormatSymbols_bg_BG', 'goog.i18n.NumberFormatSymbols_bn', 'goog.i18n.NumberFormatSymbols_bn_BD', 'goog.i18n.NumberFormatSymbols_br', 'goog.i18n.NumberFormatSymbols_br_FR', 'goog.i18n.NumberFormatSymbols_ca', 'goog.i18n.NumberFormatSymbols_ca_AD', 'goog.i18n.NumberFormatSymbols_ca_ES', 'goog.i18n.NumberFormatSymbols_ca_ES_VALENCIA', 'goog.i18n.NumberFormatSymbols_ca_FR', 'goog.i18n.NumberFormatSymbols_ca_IT', 'goog.i18n.NumberFormatSymbols_chr', 'goog.i18n.NumberFormatSymbols_chr_US', 'goog.i18n.NumberFormatSymbols_cs', 'goog.i18n.NumberFormatSymbols_cs_CZ', 'goog.i18n.NumberFormatSymbols_cy', 'goog.i18n.NumberFormatSymbols_cy_GB', 'goog.i18n.NumberFormatSymbols_da', 'goog.i18n.NumberFormatSymbols_da_DK', 'goog.i18n.NumberFormatSymbols_da_GL', 'goog.i18n.NumberFormatSymbols_de', 'goog.i18n.NumberFormatSymbols_de_AT', 'goog.i18n.NumberFormatSymbols_de_BE', 'goog.i18n.NumberFormatSymbols_de_CH', 'goog.i18n.NumberFormatSymbols_de_DE', 'goog.i18n.NumberFormatSymbols_de_LU', 'goog.i18n.NumberFormatSymbols_el', 'goog.i18n.NumberFormatSymbols_el_GR', 'goog.i18n.NumberFormatSymbols_en', 'goog.i18n.NumberFormatSymbols_en_001', 'goog.i18n.NumberFormatSymbols_en_AS', 'goog.i18n.NumberFormatSymbols_en_AU', 'goog.i18n.NumberFormatSymbols_en_DG', 'goog.i18n.NumberFormatSymbols_en_FM', 'goog.i18n.NumberFormatSymbols_en_GB', 'goog.i18n.NumberFormatSymbols_en_GU', 'goog.i18n.NumberFormatSymbols_en_IE', 'goog.i18n.NumberFormatSymbols_en_IN', 'goog.i18n.NumberFormatSymbols_en_IO', 'goog.i18n.NumberFormatSymbols_en_MH', 'goog.i18n.NumberFormatSymbols_en_MP', 'goog.i18n.NumberFormatSymbols_en_PR', 'goog.i18n.NumberFormatSymbols_en_PW', 'goog.i18n.NumberFormatSymbols_en_SG', 'goog.i18n.NumberFormatSymbols_en_TC', 'goog.i18n.NumberFormatSymbols_en_UM', 'goog.i18n.NumberFormatSymbols_en_US', 'goog.i18n.NumberFormatSymbols_en_VG', 'goog.i18n.NumberFormatSymbols_en_VI', 'goog.i18n.NumberFormatSymbols_en_ZA', 'goog.i18n.NumberFormatSymbols_en_ZW', 'goog.i18n.NumberFormatSymbols_es', 'goog.i18n.NumberFormatSymbols_es_419', 'goog.i18n.NumberFormatSymbols_es_EA', 'goog.i18n.NumberFormatSymbols_es_ES', 'goog.i18n.NumberFormatSymbols_es_IC', 'goog.i18n.NumberFormatSymbols_et', 'goog.i18n.NumberFormatSymbols_et_EE', 'goog.i18n.NumberFormatSymbols_eu', 'goog.i18n.NumberFormatSymbols_eu_ES', 'goog.i18n.NumberFormatSymbols_fa', 'goog.i18n.NumberFormatSymbols_fa_IR', 'goog.i18n.NumberFormatSymbols_fi', 'goog.i18n.NumberFormatSymbols_fi_FI', 'goog.i18n.NumberFormatSymbols_fil', 'goog.i18n.NumberFormatSymbols_fil_PH', 'goog.i18n.NumberFormatSymbols_fr', 'goog.i18n.NumberFormatSymbols_fr_BL', 'goog.i18n.NumberFormatSymbols_fr_CA', 'goog.i18n.NumberFormatSymbols_fr_FR', 'goog.i18n.NumberFormatSymbols_fr_GF', 'goog.i18n.NumberFormatSymbols_fr_GP', 'goog.i18n.NumberFormatSymbols_fr_MC', 'goog.i18n.NumberFormatSymbols_fr_MF', 'goog.i18n.NumberFormatSymbols_fr_MQ', 'goog.i18n.NumberFormatSymbols_fr_PM', 'goog.i18n.NumberFormatSymbols_fr_RE', 'goog.i18n.NumberFormatSymbols_fr_YT', 'goog.i18n.NumberFormatSymbols_gl', 'goog.i18n.NumberFormatSymbols_gl_ES', 'goog.i18n.NumberFormatSymbols_gsw', 'goog.i18n.NumberFormatSymbols_gsw_CH', 'goog.i18n.NumberFormatSymbols_gsw_LI', 'goog.i18n.NumberFormatSymbols_gu', 'goog.i18n.NumberFormatSymbols_gu_IN', 'goog.i18n.NumberFormatSymbols_haw', 'goog.i18n.NumberFormatSymbols_haw_US', 'goog.i18n.NumberFormatSymbols_he', 'goog.i18n.NumberFormatSymbols_he_IL', 'goog.i18n.NumberFormatSymbols_hi', 'goog.i18n.NumberFormatSymbols_hi_IN', 'goog.i18n.NumberFormatSymbols_hr', 'goog.i18n.NumberFormatSymbols_hr_HR', 'goog.i18n.NumberFormatSymbols_hu', 'goog.i18n.NumberFormatSymbols_hu_HU', 'goog.i18n.NumberFormatSymbols_hy', 'goog.i18n.NumberFormatSymbols_hy_AM', 'goog.i18n.NumberFormatSymbols_id', 'goog.i18n.NumberFormatSymbols_id_ID', 'goog.i18n.NumberFormatSymbols_in', 'goog.i18n.NumberFormatSymbols_is', 'goog.i18n.NumberFormatSymbols_is_IS', 'goog.i18n.NumberFormatSymbols_it', 'goog.i18n.NumberFormatSymbols_it_IT', 'goog.i18n.NumberFormatSymbols_it_SM', 'goog.i18n.NumberFormatSymbols_iw', 'goog.i18n.NumberFormatSymbols_ja', 'goog.i18n.NumberFormatSymbols_ja_JP', 'goog.i18n.NumberFormatSymbols_ka', 'goog.i18n.NumberFormatSymbols_ka_GE', 'goog.i18n.NumberFormatSymbols_kk', 'goog.i18n.NumberFormatSymbols_kk_Cyrl_KZ', 'goog.i18n.NumberFormatSymbols_km', 'goog.i18n.NumberFormatSymbols_km_KH', 'goog.i18n.NumberFormatSymbols_kn', 'goog.i18n.NumberFormatSymbols_kn_IN', 'goog.i18n.NumberFormatSymbols_ko', 'goog.i18n.NumberFormatSymbols_ko_KR', 'goog.i18n.NumberFormatSymbols_ky', 'goog.i18n.NumberFormatSymbols_ky_Cyrl_KG', 'goog.i18n.NumberFormatSymbols_ln', 'goog.i18n.NumberFormatSymbols_ln_CD', 'goog.i18n.NumberFormatSymbols_lo', 'goog.i18n.NumberFormatSymbols_lo_LA', 'goog.i18n.NumberFormatSymbols_lt', 'goog.i18n.NumberFormatSymbols_lt_LT', 'goog.i18n.NumberFormatSymbols_lv', 'goog.i18n.NumberFormatSymbols_lv_LV', 'goog.i18n.NumberFormatSymbols_mk', 'goog.i18n.NumberFormatSymbols_mk_MK', 'goog.i18n.NumberFormatSymbols_ml', 'goog.i18n.NumberFormatSymbols_ml_IN', 'goog.i18n.NumberFormatSymbols_mn', 'goog.i18n.NumberFormatSymbols_mn_Cyrl_MN', 'goog.i18n.NumberFormatSymbols_mr', 'goog.i18n.NumberFormatSymbols_mr_IN', 'goog.i18n.NumberFormatSymbols_ms', 'goog.i18n.NumberFormatSymbols_ms_Latn_MY', 'goog.i18n.NumberFormatSymbols_mt', 'goog.i18n.NumberFormatSymbols_mt_MT', 'goog.i18n.NumberFormatSymbols_my', 'goog.i18n.NumberFormatSymbols_my_MM', 'goog.i18n.NumberFormatSymbols_nb', 'goog.i18n.NumberFormatSymbols_nb_NO', 'goog.i18n.NumberFormatSymbols_nb_SJ', 'goog.i18n.NumberFormatSymbols_ne', 'goog.i18n.NumberFormatSymbols_ne_NP', 'goog.i18n.NumberFormatSymbols_nl', 'goog.i18n.NumberFormatSymbols_nl_NL', 'goog.i18n.NumberFormatSymbols_no', 'goog.i18n.NumberFormatSymbols_no_NO', 'goog.i18n.NumberFormatSymbols_or', 'goog.i18n.NumberFormatSymbols_or_IN', 'goog.i18n.NumberFormatSymbols_pa', 'goog.i18n.NumberFormatSymbols_pa_Guru_IN', 'goog.i18n.NumberFormatSymbols_pl', 'goog.i18n.NumberFormatSymbols_pl_PL', 'goog.i18n.NumberFormatSymbols_pt', 'goog.i18n.NumberFormatSymbols_pt_BR', 'goog.i18n.NumberFormatSymbols_pt_PT', 'goog.i18n.NumberFormatSymbols_ro', 'goog.i18n.NumberFormatSymbols_ro_RO', 'goog.i18n.NumberFormatSymbols_ru', 'goog.i18n.NumberFormatSymbols_ru_RU', 'goog.i18n.NumberFormatSymbols_si', 'goog.i18n.NumberFormatSymbols_si_LK', 'goog.i18n.NumberFormatSymbols_sk', 'goog.i18n.NumberFormatSymbols_sk_SK', 'goog.i18n.NumberFormatSymbols_sl', 'goog.i18n.NumberFormatSymbols_sl_SI', 'goog.i18n.NumberFormatSymbols_sq', 'goog.i18n.NumberFormatSymbols_sq_AL', 'goog.i18n.NumberFormatSymbols_sr', 'goog.i18n.NumberFormatSymbols_sr_Cyrl_RS', 'goog.i18n.NumberFormatSymbols_sv', 'goog.i18n.NumberFormatSymbols_sv_SE', 'goog.i18n.NumberFormatSymbols_sw', 'goog.i18n.NumberFormatSymbols_sw_TZ', 'goog.i18n.NumberFormatSymbols_ta', 'goog.i18n.NumberFormatSymbols_ta_IN', 'goog.i18n.NumberFormatSymbols_te', 'goog.i18n.NumberFormatSymbols_te_IN', 'goog.i18n.NumberFormatSymbols_th', 'goog.i18n.NumberFormatSymbols_th_TH', 'goog.i18n.NumberFormatSymbols_tl', 'goog.i18n.NumberFormatSymbols_tr', 'goog.i18n.NumberFormatSymbols_tr_TR', 'goog.i18n.NumberFormatSymbols_uk', 'goog.i18n.NumberFormatSymbols_uk_UA', 'goog.i18n.NumberFormatSymbols_ur', 'goog.i18n.NumberFormatSymbols_ur_PK', 'goog.i18n.NumberFormatSymbols_uz', 'goog.i18n.NumberFormatSymbols_uz_Latn_UZ', 'goog.i18n.NumberFormatSymbols_vi', 'goog.i18n.NumberFormatSymbols_vi_VN', 'goog.i18n.NumberFormatSymbols_zh', 'goog.i18n.NumberFormatSymbols_zh_CN', 'goog.i18n.NumberFormatSymbols_zh_HK', 'goog.i18n.NumberFormatSymbols_zh_Hans_CN', 'goog.i18n.NumberFormatSymbols_zh_TW', 'goog.i18n.NumberFormatSymbols_zu', 'goog.i18n.NumberFormatSymbols_zu_ZA'], []); +goog.addDependency('i18n/numberformatsymbolsext.js', ['goog.i18n.NumberFormatSymbolsExt', 'goog.i18n.NumberFormatSymbols_aa', 'goog.i18n.NumberFormatSymbols_aa_DJ', 'goog.i18n.NumberFormatSymbols_aa_ER', 'goog.i18n.NumberFormatSymbols_aa_ET', 'goog.i18n.NumberFormatSymbols_af_NA', 'goog.i18n.NumberFormatSymbols_agq', 'goog.i18n.NumberFormatSymbols_agq_CM', 'goog.i18n.NumberFormatSymbols_ak', 'goog.i18n.NumberFormatSymbols_ak_GH', 'goog.i18n.NumberFormatSymbols_ar_AE', 'goog.i18n.NumberFormatSymbols_ar_BH', 'goog.i18n.NumberFormatSymbols_ar_DJ', 'goog.i18n.NumberFormatSymbols_ar_DZ', 'goog.i18n.NumberFormatSymbols_ar_EG', 'goog.i18n.NumberFormatSymbols_ar_EH', 'goog.i18n.NumberFormatSymbols_ar_ER', 'goog.i18n.NumberFormatSymbols_ar_IL', 'goog.i18n.NumberFormatSymbols_ar_IQ', 'goog.i18n.NumberFormatSymbols_ar_JO', 'goog.i18n.NumberFormatSymbols_ar_KM', 'goog.i18n.NumberFormatSymbols_ar_KW', 'goog.i18n.NumberFormatSymbols_ar_LB', 'goog.i18n.NumberFormatSymbols_ar_LY', 'goog.i18n.NumberFormatSymbols_ar_MA', 'goog.i18n.NumberFormatSymbols_ar_MR', 'goog.i18n.NumberFormatSymbols_ar_OM', 'goog.i18n.NumberFormatSymbols_ar_PS', 'goog.i18n.NumberFormatSymbols_ar_QA', 'goog.i18n.NumberFormatSymbols_ar_SA', 'goog.i18n.NumberFormatSymbols_ar_SD', 'goog.i18n.NumberFormatSymbols_ar_SO', 'goog.i18n.NumberFormatSymbols_ar_SS', 'goog.i18n.NumberFormatSymbols_ar_SY', 'goog.i18n.NumberFormatSymbols_ar_TD', 'goog.i18n.NumberFormatSymbols_ar_TN', 'goog.i18n.NumberFormatSymbols_ar_YE', 'goog.i18n.NumberFormatSymbols_as', 'goog.i18n.NumberFormatSymbols_as_IN', 'goog.i18n.NumberFormatSymbols_asa', 'goog.i18n.NumberFormatSymbols_asa_TZ', 'goog.i18n.NumberFormatSymbols_ast', 'goog.i18n.NumberFormatSymbols_ast_ES', 'goog.i18n.NumberFormatSymbols_az_Cyrl', 'goog.i18n.NumberFormatSymbols_az_Latn', 'goog.i18n.NumberFormatSymbols_bas', 'goog.i18n.NumberFormatSymbols_bas_CM', 'goog.i18n.NumberFormatSymbols_be', 'goog.i18n.NumberFormatSymbols_be_BY', 'goog.i18n.NumberFormatSymbols_bem', 'goog.i18n.NumberFormatSymbols_bem_ZM', 'goog.i18n.NumberFormatSymbols_bez', 'goog.i18n.NumberFormatSymbols_bez_TZ', 'goog.i18n.NumberFormatSymbols_bm', 'goog.i18n.NumberFormatSymbols_bm_ML', 'goog.i18n.NumberFormatSymbols_bn_IN', 'goog.i18n.NumberFormatSymbols_bo', 'goog.i18n.NumberFormatSymbols_bo_CN', 'goog.i18n.NumberFormatSymbols_bo_IN', 'goog.i18n.NumberFormatSymbols_brx', 'goog.i18n.NumberFormatSymbols_brx_IN', 'goog.i18n.NumberFormatSymbols_bs', 'goog.i18n.NumberFormatSymbols_bs_Cyrl', 'goog.i18n.NumberFormatSymbols_bs_Cyrl_BA', 'goog.i18n.NumberFormatSymbols_bs_Latn', 'goog.i18n.NumberFormatSymbols_bs_Latn_BA', 'goog.i18n.NumberFormatSymbols_byn', 'goog.i18n.NumberFormatSymbols_byn_ER', 'goog.i18n.NumberFormatSymbols_cgg', 'goog.i18n.NumberFormatSymbols_cgg_UG', 'goog.i18n.NumberFormatSymbols_ckb', 'goog.i18n.NumberFormatSymbols_ckb_Arab', 'goog.i18n.NumberFormatSymbols_ckb_Arab_IQ', 'goog.i18n.NumberFormatSymbols_ckb_Arab_IR', 'goog.i18n.NumberFormatSymbols_ckb_IQ', 'goog.i18n.NumberFormatSymbols_ckb_IR', 'goog.i18n.NumberFormatSymbols_ckb_Latn', 'goog.i18n.NumberFormatSymbols_ckb_Latn_IQ', 'goog.i18n.NumberFormatSymbols_dav', 'goog.i18n.NumberFormatSymbols_dav_KE', 'goog.i18n.NumberFormatSymbols_de_LI', 'goog.i18n.NumberFormatSymbols_dje', 'goog.i18n.NumberFormatSymbols_dje_NE', 'goog.i18n.NumberFormatSymbols_dua', 'goog.i18n.NumberFormatSymbols_dua_CM', 'goog.i18n.NumberFormatSymbols_dyo', 'goog.i18n.NumberFormatSymbols_dyo_SN', 'goog.i18n.NumberFormatSymbols_dz', 'goog.i18n.NumberFormatSymbols_dz_BT', 'goog.i18n.NumberFormatSymbols_ebu', 'goog.i18n.NumberFormatSymbols_ebu_KE', 'goog.i18n.NumberFormatSymbols_ee', 'goog.i18n.NumberFormatSymbols_ee_GH', 'goog.i18n.NumberFormatSymbols_ee_TG', 'goog.i18n.NumberFormatSymbols_el_CY', 'goog.i18n.NumberFormatSymbols_en_150', 'goog.i18n.NumberFormatSymbols_en_AG', 'goog.i18n.NumberFormatSymbols_en_AI', 'goog.i18n.NumberFormatSymbols_en_BB', 'goog.i18n.NumberFormatSymbols_en_BE', 'goog.i18n.NumberFormatSymbols_en_BM', 'goog.i18n.NumberFormatSymbols_en_BS', 'goog.i18n.NumberFormatSymbols_en_BW', 'goog.i18n.NumberFormatSymbols_en_BZ', 'goog.i18n.NumberFormatSymbols_en_CA', 'goog.i18n.NumberFormatSymbols_en_CC', 'goog.i18n.NumberFormatSymbols_en_CK', 'goog.i18n.NumberFormatSymbols_en_CM', 'goog.i18n.NumberFormatSymbols_en_CX', 'goog.i18n.NumberFormatSymbols_en_DM', 'goog.i18n.NumberFormatSymbols_en_ER', 'goog.i18n.NumberFormatSymbols_en_FJ', 'goog.i18n.NumberFormatSymbols_en_FK', 'goog.i18n.NumberFormatSymbols_en_GD', 'goog.i18n.NumberFormatSymbols_en_GG', 'goog.i18n.NumberFormatSymbols_en_GH', 'goog.i18n.NumberFormatSymbols_en_GI', 'goog.i18n.NumberFormatSymbols_en_GM', 'goog.i18n.NumberFormatSymbols_en_GY', 'goog.i18n.NumberFormatSymbols_en_HK', 'goog.i18n.NumberFormatSymbols_en_IM', 'goog.i18n.NumberFormatSymbols_en_JE', 'goog.i18n.NumberFormatSymbols_en_JM', 'goog.i18n.NumberFormatSymbols_en_KE', 'goog.i18n.NumberFormatSymbols_en_KI', 'goog.i18n.NumberFormatSymbols_en_KN', 'goog.i18n.NumberFormatSymbols_en_KY', 'goog.i18n.NumberFormatSymbols_en_LC', 'goog.i18n.NumberFormatSymbols_en_LR', 'goog.i18n.NumberFormatSymbols_en_LS', 'goog.i18n.NumberFormatSymbols_en_MG', 'goog.i18n.NumberFormatSymbols_en_MO', 'goog.i18n.NumberFormatSymbols_en_MS', 'goog.i18n.NumberFormatSymbols_en_MT', 'goog.i18n.NumberFormatSymbols_en_MU', 'goog.i18n.NumberFormatSymbols_en_MW', 'goog.i18n.NumberFormatSymbols_en_NA', 'goog.i18n.NumberFormatSymbols_en_NF', 'goog.i18n.NumberFormatSymbols_en_NG', 'goog.i18n.NumberFormatSymbols_en_NR', 'goog.i18n.NumberFormatSymbols_en_NU', 'goog.i18n.NumberFormatSymbols_en_NZ', 'goog.i18n.NumberFormatSymbols_en_PG', 'goog.i18n.NumberFormatSymbols_en_PH', 'goog.i18n.NumberFormatSymbols_en_PK', 'goog.i18n.NumberFormatSymbols_en_PN', 'goog.i18n.NumberFormatSymbols_en_RW', 'goog.i18n.NumberFormatSymbols_en_SB', 'goog.i18n.NumberFormatSymbols_en_SC', 'goog.i18n.NumberFormatSymbols_en_SD', 'goog.i18n.NumberFormatSymbols_en_SH', 'goog.i18n.NumberFormatSymbols_en_SL', 'goog.i18n.NumberFormatSymbols_en_SS', 'goog.i18n.NumberFormatSymbols_en_SX', 'goog.i18n.NumberFormatSymbols_en_SZ', 'goog.i18n.NumberFormatSymbols_en_TK', 'goog.i18n.NumberFormatSymbols_en_TO', 'goog.i18n.NumberFormatSymbols_en_TT', 'goog.i18n.NumberFormatSymbols_en_TV', 'goog.i18n.NumberFormatSymbols_en_TZ', 'goog.i18n.NumberFormatSymbols_en_UG', 'goog.i18n.NumberFormatSymbols_en_VC', 'goog.i18n.NumberFormatSymbols_en_VU', 'goog.i18n.NumberFormatSymbols_en_WS', 'goog.i18n.NumberFormatSymbols_en_ZM', 'goog.i18n.NumberFormatSymbols_eo', 'goog.i18n.NumberFormatSymbols_eo_001', 'goog.i18n.NumberFormatSymbols_es_AR', 'goog.i18n.NumberFormatSymbols_es_BO', 'goog.i18n.NumberFormatSymbols_es_CL', 'goog.i18n.NumberFormatSymbols_es_CO', 'goog.i18n.NumberFormatSymbols_es_CR', 'goog.i18n.NumberFormatSymbols_es_CU', 'goog.i18n.NumberFormatSymbols_es_DO', 'goog.i18n.NumberFormatSymbols_es_EC', 'goog.i18n.NumberFormatSymbols_es_GQ', 'goog.i18n.NumberFormatSymbols_es_GT', 'goog.i18n.NumberFormatSymbols_es_HN', 'goog.i18n.NumberFormatSymbols_es_MX', 'goog.i18n.NumberFormatSymbols_es_NI', 'goog.i18n.NumberFormatSymbols_es_PA', 'goog.i18n.NumberFormatSymbols_es_PE', 'goog.i18n.NumberFormatSymbols_es_PH', 'goog.i18n.NumberFormatSymbols_es_PR', 'goog.i18n.NumberFormatSymbols_es_PY', 'goog.i18n.NumberFormatSymbols_es_SV', 'goog.i18n.NumberFormatSymbols_es_US', 'goog.i18n.NumberFormatSymbols_es_UY', 'goog.i18n.NumberFormatSymbols_es_VE', 'goog.i18n.NumberFormatSymbols_ewo', 'goog.i18n.NumberFormatSymbols_ewo_CM', 'goog.i18n.NumberFormatSymbols_fa_AF', 'goog.i18n.NumberFormatSymbols_ff', 'goog.i18n.NumberFormatSymbols_ff_CM', 'goog.i18n.NumberFormatSymbols_ff_GN', 'goog.i18n.NumberFormatSymbols_ff_MR', 'goog.i18n.NumberFormatSymbols_ff_SN', 'goog.i18n.NumberFormatSymbols_fo', 'goog.i18n.NumberFormatSymbols_fo_FO', 'goog.i18n.NumberFormatSymbols_fr_BE', 'goog.i18n.NumberFormatSymbols_fr_BF', 'goog.i18n.NumberFormatSymbols_fr_BI', 'goog.i18n.NumberFormatSymbols_fr_BJ', 'goog.i18n.NumberFormatSymbols_fr_CD', 'goog.i18n.NumberFormatSymbols_fr_CF', 'goog.i18n.NumberFormatSymbols_fr_CG', 'goog.i18n.NumberFormatSymbols_fr_CH', 'goog.i18n.NumberFormatSymbols_fr_CI', 'goog.i18n.NumberFormatSymbols_fr_CM', 'goog.i18n.NumberFormatSymbols_fr_DJ', 'goog.i18n.NumberFormatSymbols_fr_DZ', 'goog.i18n.NumberFormatSymbols_fr_GA', 'goog.i18n.NumberFormatSymbols_fr_GN', 'goog.i18n.NumberFormatSymbols_fr_GQ', 'goog.i18n.NumberFormatSymbols_fr_HT', 'goog.i18n.NumberFormatSymbols_fr_KM', 'goog.i18n.NumberFormatSymbols_fr_LU', 'goog.i18n.NumberFormatSymbols_fr_MA', 'goog.i18n.NumberFormatSymbols_fr_MG', 'goog.i18n.NumberFormatSymbols_fr_ML', 'goog.i18n.NumberFormatSymbols_fr_MR', 'goog.i18n.NumberFormatSymbols_fr_MU', 'goog.i18n.NumberFormatSymbols_fr_NC', 'goog.i18n.NumberFormatSymbols_fr_NE', 'goog.i18n.NumberFormatSymbols_fr_PF', 'goog.i18n.NumberFormatSymbols_fr_RW', 'goog.i18n.NumberFormatSymbols_fr_SC', 'goog.i18n.NumberFormatSymbols_fr_SN', 'goog.i18n.NumberFormatSymbols_fr_SY', 'goog.i18n.NumberFormatSymbols_fr_TD', 'goog.i18n.NumberFormatSymbols_fr_TG', 'goog.i18n.NumberFormatSymbols_fr_TN', 'goog.i18n.NumberFormatSymbols_fr_VU', 'goog.i18n.NumberFormatSymbols_fr_WF', 'goog.i18n.NumberFormatSymbols_fur', 'goog.i18n.NumberFormatSymbols_fur_IT', 'goog.i18n.NumberFormatSymbols_fy', 'goog.i18n.NumberFormatSymbols_fy_NL', 'goog.i18n.NumberFormatSymbols_ga', 'goog.i18n.NumberFormatSymbols_ga_IE', 'goog.i18n.NumberFormatSymbols_gd', 'goog.i18n.NumberFormatSymbols_gd_GB', 'goog.i18n.NumberFormatSymbols_guz', 'goog.i18n.NumberFormatSymbols_guz_KE', 'goog.i18n.NumberFormatSymbols_gv', 'goog.i18n.NumberFormatSymbols_gv_IM', 'goog.i18n.NumberFormatSymbols_ha', 'goog.i18n.NumberFormatSymbols_ha_Latn', 'goog.i18n.NumberFormatSymbols_ha_Latn_GH', 'goog.i18n.NumberFormatSymbols_ha_Latn_NE', 'goog.i18n.NumberFormatSymbols_ha_Latn_NG', 'goog.i18n.NumberFormatSymbols_hr_BA', 'goog.i18n.NumberFormatSymbols_ia', 'goog.i18n.NumberFormatSymbols_ia_FR', 'goog.i18n.NumberFormatSymbols_ig', 'goog.i18n.NumberFormatSymbols_ig_NG', 'goog.i18n.NumberFormatSymbols_ii', 'goog.i18n.NumberFormatSymbols_ii_CN', 'goog.i18n.NumberFormatSymbols_it_CH', 'goog.i18n.NumberFormatSymbols_jgo', 'goog.i18n.NumberFormatSymbols_jgo_CM', 'goog.i18n.NumberFormatSymbols_jmc', 'goog.i18n.NumberFormatSymbols_jmc_TZ', 'goog.i18n.NumberFormatSymbols_kab', 'goog.i18n.NumberFormatSymbols_kab_DZ', 'goog.i18n.NumberFormatSymbols_kam', 'goog.i18n.NumberFormatSymbols_kam_KE', 'goog.i18n.NumberFormatSymbols_kde', 'goog.i18n.NumberFormatSymbols_kde_TZ', 'goog.i18n.NumberFormatSymbols_kea', 'goog.i18n.NumberFormatSymbols_kea_CV', 'goog.i18n.NumberFormatSymbols_khq', 'goog.i18n.NumberFormatSymbols_khq_ML', 'goog.i18n.NumberFormatSymbols_ki', 'goog.i18n.NumberFormatSymbols_ki_KE', 'goog.i18n.NumberFormatSymbols_kk_Cyrl', 'goog.i18n.NumberFormatSymbols_kkj', 'goog.i18n.NumberFormatSymbols_kkj_CM', 'goog.i18n.NumberFormatSymbols_kl', 'goog.i18n.NumberFormatSymbols_kl_GL', 'goog.i18n.NumberFormatSymbols_kln', 'goog.i18n.NumberFormatSymbols_kln_KE', 'goog.i18n.NumberFormatSymbols_ko_KP', 'goog.i18n.NumberFormatSymbols_kok', 'goog.i18n.NumberFormatSymbols_kok_IN', 'goog.i18n.NumberFormatSymbols_ks', 'goog.i18n.NumberFormatSymbols_ks_Arab', 'goog.i18n.NumberFormatSymbols_ks_Arab_IN', 'goog.i18n.NumberFormatSymbols_ksb', 'goog.i18n.NumberFormatSymbols_ksb_TZ', 'goog.i18n.NumberFormatSymbols_ksf', 'goog.i18n.NumberFormatSymbols_ksf_CM', 'goog.i18n.NumberFormatSymbols_ksh', 'goog.i18n.NumberFormatSymbols_ksh_DE', 'goog.i18n.NumberFormatSymbols_kw', 'goog.i18n.NumberFormatSymbols_kw_GB', 'goog.i18n.NumberFormatSymbols_ky_Cyrl', 'goog.i18n.NumberFormatSymbols_lag', 'goog.i18n.NumberFormatSymbols_lag_TZ', 'goog.i18n.NumberFormatSymbols_lg', 'goog.i18n.NumberFormatSymbols_lg_UG', 'goog.i18n.NumberFormatSymbols_lkt', 'goog.i18n.NumberFormatSymbols_lkt_US', 'goog.i18n.NumberFormatSymbols_ln_AO', 'goog.i18n.NumberFormatSymbols_ln_CF', 'goog.i18n.NumberFormatSymbols_ln_CG', 'goog.i18n.NumberFormatSymbols_lu', 'goog.i18n.NumberFormatSymbols_lu_CD', 'goog.i18n.NumberFormatSymbols_luo', 'goog.i18n.NumberFormatSymbols_luo_KE', 'goog.i18n.NumberFormatSymbols_luy', 'goog.i18n.NumberFormatSymbols_luy_KE', 'goog.i18n.NumberFormatSymbols_mas', 'goog.i18n.NumberFormatSymbols_mas_KE', 'goog.i18n.NumberFormatSymbols_mas_TZ', 'goog.i18n.NumberFormatSymbols_mer', 'goog.i18n.NumberFormatSymbols_mer_KE', 'goog.i18n.NumberFormatSymbols_mfe', 'goog.i18n.NumberFormatSymbols_mfe_MU', 'goog.i18n.NumberFormatSymbols_mg', 'goog.i18n.NumberFormatSymbols_mg_MG', 'goog.i18n.NumberFormatSymbols_mgh', 'goog.i18n.NumberFormatSymbols_mgh_MZ', 'goog.i18n.NumberFormatSymbols_mgo', 'goog.i18n.NumberFormatSymbols_mgo_CM', 'goog.i18n.NumberFormatSymbols_mn_Cyrl', 'goog.i18n.NumberFormatSymbols_ms_Latn', 'goog.i18n.NumberFormatSymbols_ms_Latn_BN', 'goog.i18n.NumberFormatSymbols_ms_Latn_SG', 'goog.i18n.NumberFormatSymbols_mua', 'goog.i18n.NumberFormatSymbols_mua_CM', 'goog.i18n.NumberFormatSymbols_naq', 'goog.i18n.NumberFormatSymbols_naq_NA', 'goog.i18n.NumberFormatSymbols_nd', 'goog.i18n.NumberFormatSymbols_nd_ZW', 'goog.i18n.NumberFormatSymbols_ne_IN', 'goog.i18n.NumberFormatSymbols_nl_AW', 'goog.i18n.NumberFormatSymbols_nl_BE', 'goog.i18n.NumberFormatSymbols_nl_BQ', 'goog.i18n.NumberFormatSymbols_nl_CW', 'goog.i18n.NumberFormatSymbols_nl_SR', 'goog.i18n.NumberFormatSymbols_nl_SX', 'goog.i18n.NumberFormatSymbols_nmg', 'goog.i18n.NumberFormatSymbols_nmg_CM', 'goog.i18n.NumberFormatSymbols_nn', 'goog.i18n.NumberFormatSymbols_nn_NO', 'goog.i18n.NumberFormatSymbols_nnh', 'goog.i18n.NumberFormatSymbols_nnh_CM', 'goog.i18n.NumberFormatSymbols_nr', 'goog.i18n.NumberFormatSymbols_nr_ZA', 'goog.i18n.NumberFormatSymbols_nso', 'goog.i18n.NumberFormatSymbols_nso_ZA', 'goog.i18n.NumberFormatSymbols_nus', 'goog.i18n.NumberFormatSymbols_nus_SD', 'goog.i18n.NumberFormatSymbols_nyn', 'goog.i18n.NumberFormatSymbols_nyn_UG', 'goog.i18n.NumberFormatSymbols_om', 'goog.i18n.NumberFormatSymbols_om_ET', 'goog.i18n.NumberFormatSymbols_om_KE', 'goog.i18n.NumberFormatSymbols_os', 'goog.i18n.NumberFormatSymbols_os_GE', 'goog.i18n.NumberFormatSymbols_os_RU', 'goog.i18n.NumberFormatSymbols_pa_Arab', 'goog.i18n.NumberFormatSymbols_pa_Arab_PK', 'goog.i18n.NumberFormatSymbols_pa_Guru', 'goog.i18n.NumberFormatSymbols_ps', 'goog.i18n.NumberFormatSymbols_ps_AF', 'goog.i18n.NumberFormatSymbols_pt_AO', 'goog.i18n.NumberFormatSymbols_pt_CV', 'goog.i18n.NumberFormatSymbols_pt_GW', 'goog.i18n.NumberFormatSymbols_pt_MO', 'goog.i18n.NumberFormatSymbols_pt_MZ', 'goog.i18n.NumberFormatSymbols_pt_ST', 'goog.i18n.NumberFormatSymbols_pt_TL', 'goog.i18n.NumberFormatSymbols_rm', 'goog.i18n.NumberFormatSymbols_rm_CH', 'goog.i18n.NumberFormatSymbols_rn', 'goog.i18n.NumberFormatSymbols_rn_BI', 'goog.i18n.NumberFormatSymbols_ro_MD', 'goog.i18n.NumberFormatSymbols_rof', 'goog.i18n.NumberFormatSymbols_rof_TZ', 'goog.i18n.NumberFormatSymbols_ru_BY', 'goog.i18n.NumberFormatSymbols_ru_KG', 'goog.i18n.NumberFormatSymbols_ru_KZ', 'goog.i18n.NumberFormatSymbols_ru_MD', 'goog.i18n.NumberFormatSymbols_ru_UA', 'goog.i18n.NumberFormatSymbols_rw', 'goog.i18n.NumberFormatSymbols_rw_RW', 'goog.i18n.NumberFormatSymbols_rwk', 'goog.i18n.NumberFormatSymbols_rwk_TZ', 'goog.i18n.NumberFormatSymbols_sah', 'goog.i18n.NumberFormatSymbols_sah_RU', 'goog.i18n.NumberFormatSymbols_saq', 'goog.i18n.NumberFormatSymbols_saq_KE', 'goog.i18n.NumberFormatSymbols_sbp', 'goog.i18n.NumberFormatSymbols_sbp_TZ', 'goog.i18n.NumberFormatSymbols_se', 'goog.i18n.NumberFormatSymbols_se_FI', 'goog.i18n.NumberFormatSymbols_se_NO', 'goog.i18n.NumberFormatSymbols_seh', 'goog.i18n.NumberFormatSymbols_seh_MZ', 'goog.i18n.NumberFormatSymbols_ses', 'goog.i18n.NumberFormatSymbols_ses_ML', 'goog.i18n.NumberFormatSymbols_sg', 'goog.i18n.NumberFormatSymbols_sg_CF', 'goog.i18n.NumberFormatSymbols_shi', 'goog.i18n.NumberFormatSymbols_shi_Latn', 'goog.i18n.NumberFormatSymbols_shi_Latn_MA', 'goog.i18n.NumberFormatSymbols_shi_Tfng', 'goog.i18n.NumberFormatSymbols_shi_Tfng_MA', 'goog.i18n.NumberFormatSymbols_sn', 'goog.i18n.NumberFormatSymbols_sn_ZW', 'goog.i18n.NumberFormatSymbols_so', 'goog.i18n.NumberFormatSymbols_so_DJ', 'goog.i18n.NumberFormatSymbols_so_ET', 'goog.i18n.NumberFormatSymbols_so_KE', 'goog.i18n.NumberFormatSymbols_so_SO', 'goog.i18n.NumberFormatSymbols_sq_MK', 'goog.i18n.NumberFormatSymbols_sq_XK', 'goog.i18n.NumberFormatSymbols_sr_Cyrl', 'goog.i18n.NumberFormatSymbols_sr_Cyrl_BA', 'goog.i18n.NumberFormatSymbols_sr_Cyrl_ME', 'goog.i18n.NumberFormatSymbols_sr_Cyrl_XK', 'goog.i18n.NumberFormatSymbols_sr_Latn', 'goog.i18n.NumberFormatSymbols_sr_Latn_BA', 'goog.i18n.NumberFormatSymbols_sr_Latn_ME', 'goog.i18n.NumberFormatSymbols_sr_Latn_RS', 'goog.i18n.NumberFormatSymbols_sr_Latn_XK', 'goog.i18n.NumberFormatSymbols_ss', 'goog.i18n.NumberFormatSymbols_ss_SZ', 'goog.i18n.NumberFormatSymbols_ss_ZA', 'goog.i18n.NumberFormatSymbols_ssy', 'goog.i18n.NumberFormatSymbols_ssy_ER', 'goog.i18n.NumberFormatSymbols_st', 'goog.i18n.NumberFormatSymbols_st_LS', 'goog.i18n.NumberFormatSymbols_st_ZA', 'goog.i18n.NumberFormatSymbols_sv_AX', 'goog.i18n.NumberFormatSymbols_sv_FI', 'goog.i18n.NumberFormatSymbols_sw_KE', 'goog.i18n.NumberFormatSymbols_sw_UG', 'goog.i18n.NumberFormatSymbols_swc', 'goog.i18n.NumberFormatSymbols_swc_CD', 'goog.i18n.NumberFormatSymbols_ta_LK', 'goog.i18n.NumberFormatSymbols_ta_MY', 'goog.i18n.NumberFormatSymbols_ta_SG', 'goog.i18n.NumberFormatSymbols_teo', 'goog.i18n.NumberFormatSymbols_teo_KE', 'goog.i18n.NumberFormatSymbols_teo_UG', 'goog.i18n.NumberFormatSymbols_tg', 'goog.i18n.NumberFormatSymbols_tg_Cyrl', 'goog.i18n.NumberFormatSymbols_tg_Cyrl_TJ', 'goog.i18n.NumberFormatSymbols_ti', 'goog.i18n.NumberFormatSymbols_ti_ER', 'goog.i18n.NumberFormatSymbols_ti_ET', 'goog.i18n.NumberFormatSymbols_tig', 'goog.i18n.NumberFormatSymbols_tig_ER', 'goog.i18n.NumberFormatSymbols_tn', 'goog.i18n.NumberFormatSymbols_tn_BW', 'goog.i18n.NumberFormatSymbols_tn_ZA', 'goog.i18n.NumberFormatSymbols_to', 'goog.i18n.NumberFormatSymbols_to_TO', 'goog.i18n.NumberFormatSymbols_tr_CY', 'goog.i18n.NumberFormatSymbols_ts', 'goog.i18n.NumberFormatSymbols_ts_ZA', 'goog.i18n.NumberFormatSymbols_twq', 'goog.i18n.NumberFormatSymbols_twq_NE', 'goog.i18n.NumberFormatSymbols_tzm', 'goog.i18n.NumberFormatSymbols_tzm_Latn', 'goog.i18n.NumberFormatSymbols_tzm_Latn_MA', 'goog.i18n.NumberFormatSymbols_ug', 'goog.i18n.NumberFormatSymbols_ug_Arab', 'goog.i18n.NumberFormatSymbols_ug_Arab_CN', 'goog.i18n.NumberFormatSymbols_ur_IN', 'goog.i18n.NumberFormatSymbols_uz_Arab', 'goog.i18n.NumberFormatSymbols_uz_Arab_AF', 'goog.i18n.NumberFormatSymbols_uz_Cyrl', 'goog.i18n.NumberFormatSymbols_uz_Cyrl_UZ', 'goog.i18n.NumberFormatSymbols_uz_Latn', 'goog.i18n.NumberFormatSymbols_vai', 'goog.i18n.NumberFormatSymbols_vai_Latn', 'goog.i18n.NumberFormatSymbols_vai_Latn_LR', 'goog.i18n.NumberFormatSymbols_vai_Vaii', 'goog.i18n.NumberFormatSymbols_vai_Vaii_LR', 'goog.i18n.NumberFormatSymbols_ve', 'goog.i18n.NumberFormatSymbols_ve_ZA', 'goog.i18n.NumberFormatSymbols_vo', 'goog.i18n.NumberFormatSymbols_vo_001', 'goog.i18n.NumberFormatSymbols_vun', 'goog.i18n.NumberFormatSymbols_vun_TZ', 'goog.i18n.NumberFormatSymbols_wae', 'goog.i18n.NumberFormatSymbols_wae_CH', 'goog.i18n.NumberFormatSymbols_wal', 'goog.i18n.NumberFormatSymbols_wal_ET', 'goog.i18n.NumberFormatSymbols_xh', 'goog.i18n.NumberFormatSymbols_xh_ZA', 'goog.i18n.NumberFormatSymbols_xog', 'goog.i18n.NumberFormatSymbols_xog_UG', 'goog.i18n.NumberFormatSymbols_yav', 'goog.i18n.NumberFormatSymbols_yav_CM', 'goog.i18n.NumberFormatSymbols_yo', 'goog.i18n.NumberFormatSymbols_yo_BJ', 'goog.i18n.NumberFormatSymbols_yo_NG', 'goog.i18n.NumberFormatSymbols_zgh', 'goog.i18n.NumberFormatSymbols_zgh_MA', 'goog.i18n.NumberFormatSymbols_zh_Hans', 'goog.i18n.NumberFormatSymbols_zh_Hans_HK', 'goog.i18n.NumberFormatSymbols_zh_Hans_MO', 'goog.i18n.NumberFormatSymbols_zh_Hans_SG', 'goog.i18n.NumberFormatSymbols_zh_Hant', 'goog.i18n.NumberFormatSymbols_zh_Hant_HK', 'goog.i18n.NumberFormatSymbols_zh_Hant_MO', 'goog.i18n.NumberFormatSymbols_zh_Hant_TW'], ['goog.i18n.NumberFormatSymbols']); goog.addDependency('i18n/ordinalrules.js', ['goog.i18n.ordinalRules'], []); goog.addDependency('i18n/pluralrules.js', ['goog.i18n.pluralRules'], []); +goog.addDependency('i18n/pluralrules_test.js', ['goog.i18n.pluralRulesTest'], ['goog.i18n.pluralRules', 'goog.testing.jsunit']); goog.addDependency('i18n/timezone.js', ['goog.i18n.TimeZone'], ['goog.array', 'goog.date.DateLike', 'goog.string']); +goog.addDependency('i18n/timezone_test.js', ['goog.i18n.TimeZoneTest'], ['goog.i18n.TimeZone', 'goog.testing.jsunit']); goog.addDependency('i18n/uchar.js', ['goog.i18n.uChar'], []); -goog.addDependency('i18n/uchar/localnamefetcher.js', ['goog.i18n.uChar.LocalNameFetcher'], ['goog.debug.Logger', 'goog.i18n.uChar', 'goog.i18n.uChar.NameFetcher']); +goog.addDependency('i18n/uchar/localnamefetcher.js', ['goog.i18n.uChar.LocalNameFetcher'], ['goog.i18n.uChar', 'goog.i18n.uChar.NameFetcher', 'goog.log']); +goog.addDependency('i18n/uchar/localnamefetcher_test.js', ['goog.i18n.uChar.LocalNameFetcherTest'], ['goog.i18n.uChar.LocalNameFetcher', 'goog.testing.jsunit', 'goog.testing.recordFunction']); goog.addDependency('i18n/uchar/namefetcher.js', ['goog.i18n.uChar.NameFetcher'], []); -goog.addDependency('i18n/uchar/remotenamefetcher.js', ['goog.i18n.uChar.RemoteNameFetcher'], ['goog.Disposable', 'goog.Uri', 'goog.debug.Logger', 'goog.i18n.uChar', 'goog.i18n.uChar.NameFetcher', 'goog.net.XhrIo', 'goog.structs.Map']); -goog.addDependency('iter/iter.js', ['goog.iter', 'goog.iter.Iterator', 'goog.iter.StopIteration'], ['goog.array', 'goog.asserts']); +goog.addDependency('i18n/uchar/remotenamefetcher.js', ['goog.i18n.uChar.RemoteNameFetcher'], ['goog.Disposable', 'goog.Uri', 'goog.i18n.uChar', 'goog.i18n.uChar.NameFetcher', 'goog.log', 'goog.net.XhrIo', 'goog.structs.Map']); +goog.addDependency('i18n/uchar/remotenamefetcher_test.js', ['goog.i18n.uChar.RemoteNameFetcherTest'], ['goog.i18n.uChar.RemoteNameFetcher', 'goog.net.XhrIo', 'goog.testing.jsunit', 'goog.testing.net.XhrIo', 'goog.testing.recordFunction']); +goog.addDependency('i18n/uchar_test.js', ['goog.i18n.uCharTest'], ['goog.i18n.uChar', 'goog.testing.jsunit']); +goog.addDependency('iter/iter.js', ['goog.iter', 'goog.iter.Iterable', 'goog.iter.Iterator', 'goog.iter.StopIteration'], ['goog.array', 'goog.asserts', 'goog.functions', 'goog.math']); +goog.addDependency('iter/iter_test.js', ['goog.iterTest'], ['goog.iter', 'goog.iter.Iterator', 'goog.iter.StopIteration', 'goog.testing.jsunit']); goog.addDependency('json/evaljsonprocessor.js', ['goog.json.EvalJsonProcessor'], ['goog.json', 'goog.json.Processor', 'goog.json.Serializer']); -goog.addDependency('json/json.js', ['goog.json', 'goog.json.Serializer'], []); +goog.addDependency('json/hybrid.js', ['goog.json.hybrid'], ['goog.asserts', 'goog.json']); +goog.addDependency('json/hybrid_test.js', ['goog.json.hybridTest'], ['goog.json', 'goog.json.hybrid', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.userAgent']); +goog.addDependency('json/hybridjsonprocessor.js', ['goog.json.HybridJsonProcessor'], ['goog.json.Processor', 'goog.json.hybrid']); +goog.addDependency('json/hybridjsonprocessor_test.js', ['goog.json.HybridJsonProcessorTest'], ['goog.json.HybridJsonProcessor', 'goog.json.hybrid', 'goog.testing.jsunit']); +goog.addDependency('json/json.js', ['goog.json', 'goog.json.Replacer', 'goog.json.Reviver', 'goog.json.Serializer'], []); +goog.addDependency('json/json_perf.js', ['goog.jsonPerf'], ['goog.dom', 'goog.json', 'goog.math', 'goog.string', 'goog.testing.PerformanceTable', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit']); +goog.addDependency('json/json_test.js', ['goog.jsonTest'], ['goog.functions', 'goog.json', 'goog.testing.jsunit', 'goog.userAgent']); goog.addDependency('json/nativejsonprocessor.js', ['goog.json.NativeJsonProcessor'], ['goog.asserts', 'goog.json', 'goog.json.Processor']); goog.addDependency('json/processor.js', ['goog.json.Processor'], ['goog.string.Parser', 'goog.string.Stringifier']); +goog.addDependency('json/processor_test.js', ['goog.json.processorTest'], ['goog.json.EvalJsonProcessor', 'goog.json.NativeJsonProcessor', 'goog.testing.jsunit', 'goog.userAgent']); goog.addDependency('labs/classdef/classdef.js', ['goog.labs.classdef'], []); -goog.addDependency('labs/mock/mock.js', ['goog.labs.mock'], ['goog.array', 'goog.debug', 'goog.debug.Error', 'goog.functions', 'goog.json']); -goog.addDependency('labs/net/image.js', ['goog.labs.net.image'], ['goog.events.EventHandler', 'goog.events.EventType', 'goog.net.EventType', 'goog.result.SimpleResult', 'goog.userAgent']); -goog.addDependency('labs/net/image_test.js', ['goog.labs.net.imageTest'], ['goog.events', 'goog.labs.net.image', 'goog.result', 'goog.result.Result', 'goog.string', 'goog.testing.AsyncTestCase', 'goog.testing.jsunit', 'goog.testing.recordFunction']); +goog.addDependency('labs/classdef/classdef_test.js', ['goog.labs.classdefTest'], ['goog.labs.classdef', 'goog.testing.jsunit']); +goog.addDependency('labs/dom/pagevisibilitymonitor.js', ['goog.labs.dom.PageVisibilityEvent', 'goog.labs.dom.PageVisibilityMonitor', 'goog.labs.dom.PageVisibilityState'], ['goog.dom', 'goog.dom.vendor', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.memoize']); +goog.addDependency('labs/dom/pagevisibilitymonitor_test.js', ['goog.labs.dom.PageVisibilityMonitorTest'], ['goog.events', 'goog.functions', 'goog.labs.dom.PageVisibilityMonitor', 'goog.testing.PropertyReplacer', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.jsunit', 'goog.testing.recordFunction']); +goog.addDependency('labs/events/nondisposableeventtarget.js', ['goog.labs.events.NonDisposableEventTarget'], ['goog.array', 'goog.asserts', 'goog.events.Event', 'goog.events.Listenable', 'goog.events.ListenerMap', 'goog.object']); +goog.addDependency('labs/events/nondisposableeventtarget_test.js', ['goog.labs.events.NonDisposableEventTargetTest'], ['goog.events.Listenable', 'goog.events.eventTargetTester', 'goog.events.eventTargetTester.KeyType', 'goog.events.eventTargetTester.UnlistenReturnType', 'goog.labs.events.NonDisposableEventTarget', 'goog.testing.jsunit']); +goog.addDependency('labs/events/nondisposableeventtarget_via_googevents_test.js', ['goog.labs.events.NonDisposableEventTargetGoogEventsTest'], ['goog.events', 'goog.events.eventTargetTester', 'goog.events.eventTargetTester.KeyType', 'goog.events.eventTargetTester.UnlistenReturnType', 'goog.labs.events.NonDisposableEventTarget', 'goog.object', 'goog.testing', 'goog.testing.jsunit']); +goog.addDependency('labs/events/touch.js', ['goog.labs.events.touch', 'goog.labs.events.touch.TouchData'], ['goog.array', 'goog.asserts', 'goog.events.EventType', 'goog.string']); +goog.addDependency('labs/events/touch_test.js', ['goog.labs.events.touchTest'], ['goog.labs.events.touch', 'goog.testing.jsunit']); +goog.addDependency('labs/format/csv.js', ['goog.labs.format.csv', 'goog.labs.format.csv.ParseError', 'goog.labs.format.csv.Token'], ['goog.array', 'goog.asserts', 'goog.debug.Error', 'goog.object', 'goog.string', 'goog.string.newlines']); +goog.addDependency('labs/format/csv_test.js', ['goog.labs.format.csvTest'], ['goog.labs.format.csv', 'goog.labs.format.csv.ParseError', 'goog.object', 'goog.testing.asserts', 'goog.testing.jsunit']); +goog.addDependency('labs/html/attribute_rewriter.js', ['goog.labs.html.AttributeRewriter', 'goog.labs.html.AttributeValue', 'goog.labs.html.attributeRewriterPresubmitWorkaround'], []); +goog.addDependency('labs/html/sanitizer.js', ['goog.labs.html.Sanitizer'], ['goog.asserts', 'goog.html.SafeUrl', 'goog.labs.html.attributeRewriterPresubmitWorkaround', 'goog.labs.html.scrubber', 'goog.object', 'goog.string']); +goog.addDependency('labs/html/sanitizer_test.js', ['goog.labs.html.SanitizerTest'], ['goog.html.SafeUrl', 'goog.labs.html.Sanitizer', 'goog.string', 'goog.string.Const', 'goog.testing.jsunit']); +goog.addDependency('labs/html/scrubber.js', ['goog.labs.html.scrubber'], ['goog.array', 'goog.dom.tags', 'goog.labs.html.attributeRewriterPresubmitWorkaround', 'goog.string']); +goog.addDependency('labs/html/scrubber_test.js', ['goog.html.ScrubberTest'], ['goog.labs.html.scrubber', 'goog.object', 'goog.string', 'goog.testing.jsunit']); +goog.addDependency('labs/i18n/listformat.js', ['goog.labs.i18n.GenderInfo', 'goog.labs.i18n.GenderInfo.Gender', 'goog.labs.i18n.ListFormat'], ['goog.asserts', 'goog.labs.i18n.ListFormatSymbols']); +goog.addDependency('labs/i18n/listformat_test.js', ['goog.labs.i18n.ListFormatTest'], ['goog.labs.i18n.GenderInfo', 'goog.labs.i18n.ListFormat', 'goog.labs.i18n.ListFormatSymbols', 'goog.labs.i18n.ListFormatSymbols_el', 'goog.labs.i18n.ListFormatSymbols_en', 'goog.labs.i18n.ListFormatSymbols_fr', 'goog.labs.i18n.ListFormatSymbols_ml', 'goog.labs.i18n.ListFormatSymbols_zu', 'goog.testing.jsunit']); +goog.addDependency('labs/i18n/listsymbols.js', ['goog.labs.i18n.ListFormatSymbols', 'goog.labs.i18n.ListFormatSymbols_af', 'goog.labs.i18n.ListFormatSymbols_am', 'goog.labs.i18n.ListFormatSymbols_ar', 'goog.labs.i18n.ListFormatSymbols_az', 'goog.labs.i18n.ListFormatSymbols_bg', 'goog.labs.i18n.ListFormatSymbols_bn', 'goog.labs.i18n.ListFormatSymbols_br', 'goog.labs.i18n.ListFormatSymbols_ca', 'goog.labs.i18n.ListFormatSymbols_chr', 'goog.labs.i18n.ListFormatSymbols_cs', 'goog.labs.i18n.ListFormatSymbols_cy', 'goog.labs.i18n.ListFormatSymbols_da', 'goog.labs.i18n.ListFormatSymbols_de', 'goog.labs.i18n.ListFormatSymbols_de_AT', 'goog.labs.i18n.ListFormatSymbols_de_CH', 'goog.labs.i18n.ListFormatSymbols_el', 'goog.labs.i18n.ListFormatSymbols_en', 'goog.labs.i18n.ListFormatSymbols_en_AU', 'goog.labs.i18n.ListFormatSymbols_en_GB', 'goog.labs.i18n.ListFormatSymbols_en_IE', 'goog.labs.i18n.ListFormatSymbols_en_IN', 'goog.labs.i18n.ListFormatSymbols_en_ISO', 'goog.labs.i18n.ListFormatSymbols_en_SG', 'goog.labs.i18n.ListFormatSymbols_en_US', 'goog.labs.i18n.ListFormatSymbols_en_ZA', 'goog.labs.i18n.ListFormatSymbols_es', 'goog.labs.i18n.ListFormatSymbols_es_419', 'goog.labs.i18n.ListFormatSymbols_es_ES', 'goog.labs.i18n.ListFormatSymbols_et', 'goog.labs.i18n.ListFormatSymbols_eu', 'goog.labs.i18n.ListFormatSymbols_fa', 'goog.labs.i18n.ListFormatSymbols_fi', 'goog.labs.i18n.ListFormatSymbols_fil', 'goog.labs.i18n.ListFormatSymbols_fr', 'goog.labs.i18n.ListFormatSymbols_fr_CA', 'goog.labs.i18n.ListFormatSymbols_gl', 'goog.labs.i18n.ListFormatSymbols_gsw', 'goog.labs.i18n.ListFormatSymbols_gu', 'goog.labs.i18n.ListFormatSymbols_haw', 'goog.labs.i18n.ListFormatSymbols_he', 'goog.labs.i18n.ListFormatSymbols_hi', 'goog.labs.i18n.ListFormatSymbols_hr', 'goog.labs.i18n.ListFormatSymbols_hu', 'goog.labs.i18n.ListFormatSymbols_hy', 'goog.labs.i18n.ListFormatSymbols_id', 'goog.labs.i18n.ListFormatSymbols_in', 'goog.labs.i18n.ListFormatSymbols_is', 'goog.labs.i18n.ListFormatSymbols_it', 'goog.labs.i18n.ListFormatSymbols_iw', 'goog.labs.i18n.ListFormatSymbols_ja', 'goog.labs.i18n.ListFormatSymbols_ka', 'goog.labs.i18n.ListFormatSymbols_kk', 'goog.labs.i18n.ListFormatSymbols_km', 'goog.labs.i18n.ListFormatSymbols_kn', 'goog.labs.i18n.ListFormatSymbols_ko', 'goog.labs.i18n.ListFormatSymbols_ky', 'goog.labs.i18n.ListFormatSymbols_ln', 'goog.labs.i18n.ListFormatSymbols_lo', 'goog.labs.i18n.ListFormatSymbols_lt', 'goog.labs.i18n.ListFormatSymbols_lv', 'goog.labs.i18n.ListFormatSymbols_mk', 'goog.labs.i18n.ListFormatSymbols_ml', 'goog.labs.i18n.ListFormatSymbols_mn', 'goog.labs.i18n.ListFormatSymbols_mo', 'goog.labs.i18n.ListFormatSymbols_mr', 'goog.labs.i18n.ListFormatSymbols_ms', 'goog.labs.i18n.ListFormatSymbols_mt', 'goog.labs.i18n.ListFormatSymbols_my', 'goog.labs.i18n.ListFormatSymbols_nb', 'goog.labs.i18n.ListFormatSymbols_ne', 'goog.labs.i18n.ListFormatSymbols_nl', 'goog.labs.i18n.ListFormatSymbols_no', 'goog.labs.i18n.ListFormatSymbols_no_NO', 'goog.labs.i18n.ListFormatSymbols_or', 'goog.labs.i18n.ListFormatSymbols_pa', 'goog.labs.i18n.ListFormatSymbols_pl', 'goog.labs.i18n.ListFormatSymbols_pt', 'goog.labs.i18n.ListFormatSymbols_pt_BR', 'goog.labs.i18n.ListFormatSymbols_pt_PT', 'goog.labs.i18n.ListFormatSymbols_ro', 'goog.labs.i18n.ListFormatSymbols_ru', 'goog.labs.i18n.ListFormatSymbols_sh', 'goog.labs.i18n.ListFormatSymbols_si', 'goog.labs.i18n.ListFormatSymbols_sk', 'goog.labs.i18n.ListFormatSymbols_sl', 'goog.labs.i18n.ListFormatSymbols_sq', 'goog.labs.i18n.ListFormatSymbols_sr', 'goog.labs.i18n.ListFormatSymbols_sv', 'goog.labs.i18n.ListFormatSymbols_sw', 'goog.labs.i18n.ListFormatSymbols_ta', 'goog.labs.i18n.ListFormatSymbols_te', 'goog.labs.i18n.ListFormatSymbols_th', 'goog.labs.i18n.ListFormatSymbols_tl', 'goog.labs.i18n.ListFormatSymbols_tr', 'goog.labs.i18n.ListFormatSymbols_uk', 'goog.labs.i18n.ListFormatSymbols_ur', 'goog.labs.i18n.ListFormatSymbols_uz', 'goog.labs.i18n.ListFormatSymbols_vi', 'goog.labs.i18n.ListFormatSymbols_zh', 'goog.labs.i18n.ListFormatSymbols_zh_CN', 'goog.labs.i18n.ListFormatSymbols_zh_HK', 'goog.labs.i18n.ListFormatSymbols_zh_TW', 'goog.labs.i18n.ListFormatSymbols_zu'], []); +goog.addDependency('labs/i18n/listsymbolsext.js', ['goog.labs.i18n.ListFormatSymbolsExt', 'goog.labs.i18n.ListFormatSymbols_af_NA', 'goog.labs.i18n.ListFormatSymbols_af_ZA', 'goog.labs.i18n.ListFormatSymbols_agq', 'goog.labs.i18n.ListFormatSymbols_agq_CM', 'goog.labs.i18n.ListFormatSymbols_ak', 'goog.labs.i18n.ListFormatSymbols_ak_GH', 'goog.labs.i18n.ListFormatSymbols_am_ET', 'goog.labs.i18n.ListFormatSymbols_ar_001', 'goog.labs.i18n.ListFormatSymbols_ar_AE', 'goog.labs.i18n.ListFormatSymbols_ar_BH', 'goog.labs.i18n.ListFormatSymbols_ar_DJ', 'goog.labs.i18n.ListFormatSymbols_ar_DZ', 'goog.labs.i18n.ListFormatSymbols_ar_EG', 'goog.labs.i18n.ListFormatSymbols_ar_EH', 'goog.labs.i18n.ListFormatSymbols_ar_ER', 'goog.labs.i18n.ListFormatSymbols_ar_IL', 'goog.labs.i18n.ListFormatSymbols_ar_IQ', 'goog.labs.i18n.ListFormatSymbols_ar_JO', 'goog.labs.i18n.ListFormatSymbols_ar_KM', 'goog.labs.i18n.ListFormatSymbols_ar_KW', 'goog.labs.i18n.ListFormatSymbols_ar_LB', 'goog.labs.i18n.ListFormatSymbols_ar_LY', 'goog.labs.i18n.ListFormatSymbols_ar_MA', 'goog.labs.i18n.ListFormatSymbols_ar_MR', 'goog.labs.i18n.ListFormatSymbols_ar_OM', 'goog.labs.i18n.ListFormatSymbols_ar_PS', 'goog.labs.i18n.ListFormatSymbols_ar_QA', 'goog.labs.i18n.ListFormatSymbols_ar_SA', 'goog.labs.i18n.ListFormatSymbols_ar_SD', 'goog.labs.i18n.ListFormatSymbols_ar_SO', 'goog.labs.i18n.ListFormatSymbols_ar_SS', 'goog.labs.i18n.ListFormatSymbols_ar_SY', 'goog.labs.i18n.ListFormatSymbols_ar_TD', 'goog.labs.i18n.ListFormatSymbols_ar_TN', 'goog.labs.i18n.ListFormatSymbols_ar_YE', 'goog.labs.i18n.ListFormatSymbols_as', 'goog.labs.i18n.ListFormatSymbols_as_IN', 'goog.labs.i18n.ListFormatSymbols_asa', 'goog.labs.i18n.ListFormatSymbols_asa_TZ', 'goog.labs.i18n.ListFormatSymbols_az_Cyrl', 'goog.labs.i18n.ListFormatSymbols_az_Cyrl_AZ', 'goog.labs.i18n.ListFormatSymbols_az_Latn', 'goog.labs.i18n.ListFormatSymbols_az_Latn_AZ', 'goog.labs.i18n.ListFormatSymbols_bas', 'goog.labs.i18n.ListFormatSymbols_bas_CM', 'goog.labs.i18n.ListFormatSymbols_be', 'goog.labs.i18n.ListFormatSymbols_be_BY', 'goog.labs.i18n.ListFormatSymbols_bem', 'goog.labs.i18n.ListFormatSymbols_bem_ZM', 'goog.labs.i18n.ListFormatSymbols_bez', 'goog.labs.i18n.ListFormatSymbols_bez_TZ', 'goog.labs.i18n.ListFormatSymbols_bg_BG', 'goog.labs.i18n.ListFormatSymbols_bm', 'goog.labs.i18n.ListFormatSymbols_bm_ML', 'goog.labs.i18n.ListFormatSymbols_bn_BD', 'goog.labs.i18n.ListFormatSymbols_bn_IN', 'goog.labs.i18n.ListFormatSymbols_bo', 'goog.labs.i18n.ListFormatSymbols_bo_CN', 'goog.labs.i18n.ListFormatSymbols_bo_IN', 'goog.labs.i18n.ListFormatSymbols_br_FR', 'goog.labs.i18n.ListFormatSymbols_brx', 'goog.labs.i18n.ListFormatSymbols_brx_IN', 'goog.labs.i18n.ListFormatSymbols_bs', 'goog.labs.i18n.ListFormatSymbols_bs_Cyrl', 'goog.labs.i18n.ListFormatSymbols_bs_Cyrl_BA', 'goog.labs.i18n.ListFormatSymbols_bs_Latn', 'goog.labs.i18n.ListFormatSymbols_bs_Latn_BA', 'goog.labs.i18n.ListFormatSymbols_ca_AD', 'goog.labs.i18n.ListFormatSymbols_ca_ES', 'goog.labs.i18n.ListFormatSymbols_ca_FR', 'goog.labs.i18n.ListFormatSymbols_ca_IT', 'goog.labs.i18n.ListFormatSymbols_cgg', 'goog.labs.i18n.ListFormatSymbols_cgg_UG', 'goog.labs.i18n.ListFormatSymbols_chr_US', 'goog.labs.i18n.ListFormatSymbols_cs_CZ', 'goog.labs.i18n.ListFormatSymbols_cy_GB', 'goog.labs.i18n.ListFormatSymbols_da_DK', 'goog.labs.i18n.ListFormatSymbols_da_GL', 'goog.labs.i18n.ListFormatSymbols_dav', 'goog.labs.i18n.ListFormatSymbols_dav_KE', 'goog.labs.i18n.ListFormatSymbols_de_BE', 'goog.labs.i18n.ListFormatSymbols_de_DE', 'goog.labs.i18n.ListFormatSymbols_de_LI', 'goog.labs.i18n.ListFormatSymbols_de_LU', 'goog.labs.i18n.ListFormatSymbols_dje', 'goog.labs.i18n.ListFormatSymbols_dje_NE', 'goog.labs.i18n.ListFormatSymbols_dua', 'goog.labs.i18n.ListFormatSymbols_dua_CM', 'goog.labs.i18n.ListFormatSymbols_dyo', 'goog.labs.i18n.ListFormatSymbols_dyo_SN', 'goog.labs.i18n.ListFormatSymbols_dz', 'goog.labs.i18n.ListFormatSymbols_dz_BT', 'goog.labs.i18n.ListFormatSymbols_ebu', 'goog.labs.i18n.ListFormatSymbols_ebu_KE', 'goog.labs.i18n.ListFormatSymbols_ee', 'goog.labs.i18n.ListFormatSymbols_ee_GH', 'goog.labs.i18n.ListFormatSymbols_ee_TG', 'goog.labs.i18n.ListFormatSymbols_el_CY', 'goog.labs.i18n.ListFormatSymbols_el_GR', 'goog.labs.i18n.ListFormatSymbols_en_001', 'goog.labs.i18n.ListFormatSymbols_en_150', 'goog.labs.i18n.ListFormatSymbols_en_AG', 'goog.labs.i18n.ListFormatSymbols_en_AI', 'goog.labs.i18n.ListFormatSymbols_en_AS', 'goog.labs.i18n.ListFormatSymbols_en_BB', 'goog.labs.i18n.ListFormatSymbols_en_BE', 'goog.labs.i18n.ListFormatSymbols_en_BM', 'goog.labs.i18n.ListFormatSymbols_en_BS', 'goog.labs.i18n.ListFormatSymbols_en_BW', 'goog.labs.i18n.ListFormatSymbols_en_BZ', 'goog.labs.i18n.ListFormatSymbols_en_CA', 'goog.labs.i18n.ListFormatSymbols_en_CC', 'goog.labs.i18n.ListFormatSymbols_en_CK', 'goog.labs.i18n.ListFormatSymbols_en_CM', 'goog.labs.i18n.ListFormatSymbols_en_CX', 'goog.labs.i18n.ListFormatSymbols_en_DG', 'goog.labs.i18n.ListFormatSymbols_en_DM', 'goog.labs.i18n.ListFormatSymbols_en_ER', 'goog.labs.i18n.ListFormatSymbols_en_FJ', 'goog.labs.i18n.ListFormatSymbols_en_FK', 'goog.labs.i18n.ListFormatSymbols_en_FM', 'goog.labs.i18n.ListFormatSymbols_en_GD', 'goog.labs.i18n.ListFormatSymbols_en_GG', 'goog.labs.i18n.ListFormatSymbols_en_GH', 'goog.labs.i18n.ListFormatSymbols_en_GI', 'goog.labs.i18n.ListFormatSymbols_en_GM', 'goog.labs.i18n.ListFormatSymbols_en_GU', 'goog.labs.i18n.ListFormatSymbols_en_GY', 'goog.labs.i18n.ListFormatSymbols_en_HK', 'goog.labs.i18n.ListFormatSymbols_en_IM', 'goog.labs.i18n.ListFormatSymbols_en_IO', 'goog.labs.i18n.ListFormatSymbols_en_JE', 'goog.labs.i18n.ListFormatSymbols_en_JM', 'goog.labs.i18n.ListFormatSymbols_en_KE', 'goog.labs.i18n.ListFormatSymbols_en_KI', 'goog.labs.i18n.ListFormatSymbols_en_KN', 'goog.labs.i18n.ListFormatSymbols_en_KY', 'goog.labs.i18n.ListFormatSymbols_en_LC', 'goog.labs.i18n.ListFormatSymbols_en_LR', 'goog.labs.i18n.ListFormatSymbols_en_LS', 'goog.labs.i18n.ListFormatSymbols_en_MG', 'goog.labs.i18n.ListFormatSymbols_en_MH', 'goog.labs.i18n.ListFormatSymbols_en_MO', 'goog.labs.i18n.ListFormatSymbols_en_MP', 'goog.labs.i18n.ListFormatSymbols_en_MS', 'goog.labs.i18n.ListFormatSymbols_en_MT', 'goog.labs.i18n.ListFormatSymbols_en_MU', 'goog.labs.i18n.ListFormatSymbols_en_MW', 'goog.labs.i18n.ListFormatSymbols_en_NA', 'goog.labs.i18n.ListFormatSymbols_en_NF', 'goog.labs.i18n.ListFormatSymbols_en_NG', 'goog.labs.i18n.ListFormatSymbols_en_NR', 'goog.labs.i18n.ListFormatSymbols_en_NU', 'goog.labs.i18n.ListFormatSymbols_en_NZ', 'goog.labs.i18n.ListFormatSymbols_en_PG', 'goog.labs.i18n.ListFormatSymbols_en_PH', 'goog.labs.i18n.ListFormatSymbols_en_PK', 'goog.labs.i18n.ListFormatSymbols_en_PN', 'goog.labs.i18n.ListFormatSymbols_en_PR', 'goog.labs.i18n.ListFormatSymbols_en_PW', 'goog.labs.i18n.ListFormatSymbols_en_RW', 'goog.labs.i18n.ListFormatSymbols_en_SB', 'goog.labs.i18n.ListFormatSymbols_en_SC', 'goog.labs.i18n.ListFormatSymbols_en_SD', 'goog.labs.i18n.ListFormatSymbols_en_SH', 'goog.labs.i18n.ListFormatSymbols_en_SL', 'goog.labs.i18n.ListFormatSymbols_en_SS', 'goog.labs.i18n.ListFormatSymbols_en_SX', 'goog.labs.i18n.ListFormatSymbols_en_SZ', 'goog.labs.i18n.ListFormatSymbols_en_TC', 'goog.labs.i18n.ListFormatSymbols_en_TK', 'goog.labs.i18n.ListFormatSymbols_en_TO', 'goog.labs.i18n.ListFormatSymbols_en_TT', 'goog.labs.i18n.ListFormatSymbols_en_TV', 'goog.labs.i18n.ListFormatSymbols_en_TZ', 'goog.labs.i18n.ListFormatSymbols_en_UG', 'goog.labs.i18n.ListFormatSymbols_en_UM', 'goog.labs.i18n.ListFormatSymbols_en_US_POSIX', 'goog.labs.i18n.ListFormatSymbols_en_VC', 'goog.labs.i18n.ListFormatSymbols_en_VG', 'goog.labs.i18n.ListFormatSymbols_en_VI', 'goog.labs.i18n.ListFormatSymbols_en_VU', 'goog.labs.i18n.ListFormatSymbols_en_WS', 'goog.labs.i18n.ListFormatSymbols_en_ZM', 'goog.labs.i18n.ListFormatSymbols_en_ZW', 'goog.labs.i18n.ListFormatSymbols_eo', 'goog.labs.i18n.ListFormatSymbols_es_AR', 'goog.labs.i18n.ListFormatSymbols_es_BO', 'goog.labs.i18n.ListFormatSymbols_es_CL', 'goog.labs.i18n.ListFormatSymbols_es_CO', 'goog.labs.i18n.ListFormatSymbols_es_CR', 'goog.labs.i18n.ListFormatSymbols_es_CU', 'goog.labs.i18n.ListFormatSymbols_es_DO', 'goog.labs.i18n.ListFormatSymbols_es_EA', 'goog.labs.i18n.ListFormatSymbols_es_EC', 'goog.labs.i18n.ListFormatSymbols_es_GQ', 'goog.labs.i18n.ListFormatSymbols_es_GT', 'goog.labs.i18n.ListFormatSymbols_es_HN', 'goog.labs.i18n.ListFormatSymbols_es_IC', 'goog.labs.i18n.ListFormatSymbols_es_MX', 'goog.labs.i18n.ListFormatSymbols_es_NI', 'goog.labs.i18n.ListFormatSymbols_es_PA', 'goog.labs.i18n.ListFormatSymbols_es_PE', 'goog.labs.i18n.ListFormatSymbols_es_PH', 'goog.labs.i18n.ListFormatSymbols_es_PR', 'goog.labs.i18n.ListFormatSymbols_es_PY', 'goog.labs.i18n.ListFormatSymbols_es_SV', 'goog.labs.i18n.ListFormatSymbols_es_US', 'goog.labs.i18n.ListFormatSymbols_es_UY', 'goog.labs.i18n.ListFormatSymbols_es_VE', 'goog.labs.i18n.ListFormatSymbols_et_EE', 'goog.labs.i18n.ListFormatSymbols_eu_ES', 'goog.labs.i18n.ListFormatSymbols_ewo', 'goog.labs.i18n.ListFormatSymbols_ewo_CM', 'goog.labs.i18n.ListFormatSymbols_fa_AF', 'goog.labs.i18n.ListFormatSymbols_fa_IR', 'goog.labs.i18n.ListFormatSymbols_ff', 'goog.labs.i18n.ListFormatSymbols_ff_SN', 'goog.labs.i18n.ListFormatSymbols_fi_FI', 'goog.labs.i18n.ListFormatSymbols_fil_PH', 'goog.labs.i18n.ListFormatSymbols_fo', 'goog.labs.i18n.ListFormatSymbols_fo_FO', 'goog.labs.i18n.ListFormatSymbols_fr_BE', 'goog.labs.i18n.ListFormatSymbols_fr_BF', 'goog.labs.i18n.ListFormatSymbols_fr_BI', 'goog.labs.i18n.ListFormatSymbols_fr_BJ', 'goog.labs.i18n.ListFormatSymbols_fr_BL', 'goog.labs.i18n.ListFormatSymbols_fr_CD', 'goog.labs.i18n.ListFormatSymbols_fr_CF', 'goog.labs.i18n.ListFormatSymbols_fr_CG', 'goog.labs.i18n.ListFormatSymbols_fr_CH', 'goog.labs.i18n.ListFormatSymbols_fr_CI', 'goog.labs.i18n.ListFormatSymbols_fr_CM', 'goog.labs.i18n.ListFormatSymbols_fr_DJ', 'goog.labs.i18n.ListFormatSymbols_fr_DZ', 'goog.labs.i18n.ListFormatSymbols_fr_FR', 'goog.labs.i18n.ListFormatSymbols_fr_GA', 'goog.labs.i18n.ListFormatSymbols_fr_GF', 'goog.labs.i18n.ListFormatSymbols_fr_GN', 'goog.labs.i18n.ListFormatSymbols_fr_GP', 'goog.labs.i18n.ListFormatSymbols_fr_GQ', 'goog.labs.i18n.ListFormatSymbols_fr_HT', 'goog.labs.i18n.ListFormatSymbols_fr_KM', 'goog.labs.i18n.ListFormatSymbols_fr_LU', 'goog.labs.i18n.ListFormatSymbols_fr_MA', 'goog.labs.i18n.ListFormatSymbols_fr_MC', 'goog.labs.i18n.ListFormatSymbols_fr_MF', 'goog.labs.i18n.ListFormatSymbols_fr_MG', 'goog.labs.i18n.ListFormatSymbols_fr_ML', 'goog.labs.i18n.ListFormatSymbols_fr_MQ', 'goog.labs.i18n.ListFormatSymbols_fr_MR', 'goog.labs.i18n.ListFormatSymbols_fr_MU', 'goog.labs.i18n.ListFormatSymbols_fr_NC', 'goog.labs.i18n.ListFormatSymbols_fr_NE', 'goog.labs.i18n.ListFormatSymbols_fr_PF', 'goog.labs.i18n.ListFormatSymbols_fr_PM', 'goog.labs.i18n.ListFormatSymbols_fr_RE', 'goog.labs.i18n.ListFormatSymbols_fr_RW', 'goog.labs.i18n.ListFormatSymbols_fr_SC', 'goog.labs.i18n.ListFormatSymbols_fr_SN', 'goog.labs.i18n.ListFormatSymbols_fr_SY', 'goog.labs.i18n.ListFormatSymbols_fr_TD', 'goog.labs.i18n.ListFormatSymbols_fr_TG', 'goog.labs.i18n.ListFormatSymbols_fr_TN', 'goog.labs.i18n.ListFormatSymbols_fr_VU', 'goog.labs.i18n.ListFormatSymbols_fr_WF', 'goog.labs.i18n.ListFormatSymbols_fr_YT', 'goog.labs.i18n.ListFormatSymbols_ga', 'goog.labs.i18n.ListFormatSymbols_ga_IE', 'goog.labs.i18n.ListFormatSymbols_gl_ES', 'goog.labs.i18n.ListFormatSymbols_gsw_CH', 'goog.labs.i18n.ListFormatSymbols_gsw_LI', 'goog.labs.i18n.ListFormatSymbols_gu_IN', 'goog.labs.i18n.ListFormatSymbols_guz', 'goog.labs.i18n.ListFormatSymbols_guz_KE', 'goog.labs.i18n.ListFormatSymbols_gv', 'goog.labs.i18n.ListFormatSymbols_gv_IM', 'goog.labs.i18n.ListFormatSymbols_ha', 'goog.labs.i18n.ListFormatSymbols_ha_Latn', 'goog.labs.i18n.ListFormatSymbols_ha_Latn_GH', 'goog.labs.i18n.ListFormatSymbols_ha_Latn_NE', 'goog.labs.i18n.ListFormatSymbols_ha_Latn_NG', 'goog.labs.i18n.ListFormatSymbols_haw_US', 'goog.labs.i18n.ListFormatSymbols_he_IL', 'goog.labs.i18n.ListFormatSymbols_hi_IN', 'goog.labs.i18n.ListFormatSymbols_hr_BA', 'goog.labs.i18n.ListFormatSymbols_hr_HR', 'goog.labs.i18n.ListFormatSymbols_hu_HU', 'goog.labs.i18n.ListFormatSymbols_hy_AM', 'goog.labs.i18n.ListFormatSymbols_id_ID', 'goog.labs.i18n.ListFormatSymbols_ig', 'goog.labs.i18n.ListFormatSymbols_ig_NG', 'goog.labs.i18n.ListFormatSymbols_ii', 'goog.labs.i18n.ListFormatSymbols_ii_CN', 'goog.labs.i18n.ListFormatSymbols_is_IS', 'goog.labs.i18n.ListFormatSymbols_it_CH', 'goog.labs.i18n.ListFormatSymbols_it_IT', 'goog.labs.i18n.ListFormatSymbols_it_SM', 'goog.labs.i18n.ListFormatSymbols_ja_JP', 'goog.labs.i18n.ListFormatSymbols_jgo', 'goog.labs.i18n.ListFormatSymbols_jgo_CM', 'goog.labs.i18n.ListFormatSymbols_jmc', 'goog.labs.i18n.ListFormatSymbols_jmc_TZ', 'goog.labs.i18n.ListFormatSymbols_ka_GE', 'goog.labs.i18n.ListFormatSymbols_kab', 'goog.labs.i18n.ListFormatSymbols_kab_DZ', 'goog.labs.i18n.ListFormatSymbols_kam', 'goog.labs.i18n.ListFormatSymbols_kam_KE', 'goog.labs.i18n.ListFormatSymbols_kde', 'goog.labs.i18n.ListFormatSymbols_kde_TZ', 'goog.labs.i18n.ListFormatSymbols_kea', 'goog.labs.i18n.ListFormatSymbols_kea_CV', 'goog.labs.i18n.ListFormatSymbols_khq', 'goog.labs.i18n.ListFormatSymbols_khq_ML', 'goog.labs.i18n.ListFormatSymbols_ki', 'goog.labs.i18n.ListFormatSymbols_ki_KE', 'goog.labs.i18n.ListFormatSymbols_kk_Cyrl', 'goog.labs.i18n.ListFormatSymbols_kk_Cyrl_KZ', 'goog.labs.i18n.ListFormatSymbols_kkj', 'goog.labs.i18n.ListFormatSymbols_kkj_CM', 'goog.labs.i18n.ListFormatSymbols_kl', 'goog.labs.i18n.ListFormatSymbols_kl_GL', 'goog.labs.i18n.ListFormatSymbols_kln', 'goog.labs.i18n.ListFormatSymbols_kln_KE', 'goog.labs.i18n.ListFormatSymbols_km_KH', 'goog.labs.i18n.ListFormatSymbols_kn_IN', 'goog.labs.i18n.ListFormatSymbols_ko_KP', 'goog.labs.i18n.ListFormatSymbols_ko_KR', 'goog.labs.i18n.ListFormatSymbols_kok', 'goog.labs.i18n.ListFormatSymbols_kok_IN', 'goog.labs.i18n.ListFormatSymbols_ks', 'goog.labs.i18n.ListFormatSymbols_ks_Arab', 'goog.labs.i18n.ListFormatSymbols_ks_Arab_IN', 'goog.labs.i18n.ListFormatSymbols_ksb', 'goog.labs.i18n.ListFormatSymbols_ksb_TZ', 'goog.labs.i18n.ListFormatSymbols_ksf', 'goog.labs.i18n.ListFormatSymbols_ksf_CM', 'goog.labs.i18n.ListFormatSymbols_kw', 'goog.labs.i18n.ListFormatSymbols_kw_GB', 'goog.labs.i18n.ListFormatSymbols_ky_Cyrl', 'goog.labs.i18n.ListFormatSymbols_ky_Cyrl_KG', 'goog.labs.i18n.ListFormatSymbols_lag', 'goog.labs.i18n.ListFormatSymbols_lag_TZ', 'goog.labs.i18n.ListFormatSymbols_lg', 'goog.labs.i18n.ListFormatSymbols_lg_UG', 'goog.labs.i18n.ListFormatSymbols_lkt', 'goog.labs.i18n.ListFormatSymbols_lkt_US', 'goog.labs.i18n.ListFormatSymbols_ln_AO', 'goog.labs.i18n.ListFormatSymbols_ln_CD', 'goog.labs.i18n.ListFormatSymbols_ln_CF', 'goog.labs.i18n.ListFormatSymbols_ln_CG', 'goog.labs.i18n.ListFormatSymbols_lo_LA', 'goog.labs.i18n.ListFormatSymbols_lt_LT', 'goog.labs.i18n.ListFormatSymbols_lu', 'goog.labs.i18n.ListFormatSymbols_lu_CD', 'goog.labs.i18n.ListFormatSymbols_luo', 'goog.labs.i18n.ListFormatSymbols_luo_KE', 'goog.labs.i18n.ListFormatSymbols_luy', 'goog.labs.i18n.ListFormatSymbols_luy_KE', 'goog.labs.i18n.ListFormatSymbols_lv_LV', 'goog.labs.i18n.ListFormatSymbols_mas', 'goog.labs.i18n.ListFormatSymbols_mas_KE', 'goog.labs.i18n.ListFormatSymbols_mas_TZ', 'goog.labs.i18n.ListFormatSymbols_mer', 'goog.labs.i18n.ListFormatSymbols_mer_KE', 'goog.labs.i18n.ListFormatSymbols_mfe', 'goog.labs.i18n.ListFormatSymbols_mfe_MU', 'goog.labs.i18n.ListFormatSymbols_mg', 'goog.labs.i18n.ListFormatSymbols_mg_MG', 'goog.labs.i18n.ListFormatSymbols_mgh', 'goog.labs.i18n.ListFormatSymbols_mgh_MZ', 'goog.labs.i18n.ListFormatSymbols_mgo', 'goog.labs.i18n.ListFormatSymbols_mgo_CM', 'goog.labs.i18n.ListFormatSymbols_mk_MK', 'goog.labs.i18n.ListFormatSymbols_ml_IN', 'goog.labs.i18n.ListFormatSymbols_mn_Cyrl', 'goog.labs.i18n.ListFormatSymbols_mn_Cyrl_MN', 'goog.labs.i18n.ListFormatSymbols_mr_IN', 'goog.labs.i18n.ListFormatSymbols_ms_Latn', 'goog.labs.i18n.ListFormatSymbols_ms_Latn_BN', 'goog.labs.i18n.ListFormatSymbols_ms_Latn_MY', 'goog.labs.i18n.ListFormatSymbols_ms_Latn_SG', 'goog.labs.i18n.ListFormatSymbols_mt_MT', 'goog.labs.i18n.ListFormatSymbols_mua', 'goog.labs.i18n.ListFormatSymbols_mua_CM', 'goog.labs.i18n.ListFormatSymbols_my_MM', 'goog.labs.i18n.ListFormatSymbols_naq', 'goog.labs.i18n.ListFormatSymbols_naq_NA', 'goog.labs.i18n.ListFormatSymbols_nb_NO', 'goog.labs.i18n.ListFormatSymbols_nb_SJ', 'goog.labs.i18n.ListFormatSymbols_nd', 'goog.labs.i18n.ListFormatSymbols_nd_ZW', 'goog.labs.i18n.ListFormatSymbols_ne_IN', 'goog.labs.i18n.ListFormatSymbols_ne_NP', 'goog.labs.i18n.ListFormatSymbols_nl_AW', 'goog.labs.i18n.ListFormatSymbols_nl_BE', 'goog.labs.i18n.ListFormatSymbols_nl_BQ', 'goog.labs.i18n.ListFormatSymbols_nl_CW', 'goog.labs.i18n.ListFormatSymbols_nl_NL', 'goog.labs.i18n.ListFormatSymbols_nl_SR', 'goog.labs.i18n.ListFormatSymbols_nl_SX', 'goog.labs.i18n.ListFormatSymbols_nmg', 'goog.labs.i18n.ListFormatSymbols_nmg_CM', 'goog.labs.i18n.ListFormatSymbols_nn', 'goog.labs.i18n.ListFormatSymbols_nn_NO', 'goog.labs.i18n.ListFormatSymbols_nnh', 'goog.labs.i18n.ListFormatSymbols_nnh_CM', 'goog.labs.i18n.ListFormatSymbols_nus', 'goog.labs.i18n.ListFormatSymbols_nus_SD', 'goog.labs.i18n.ListFormatSymbols_nyn', 'goog.labs.i18n.ListFormatSymbols_nyn_UG', 'goog.labs.i18n.ListFormatSymbols_om', 'goog.labs.i18n.ListFormatSymbols_om_ET', 'goog.labs.i18n.ListFormatSymbols_om_KE', 'goog.labs.i18n.ListFormatSymbols_or_IN', 'goog.labs.i18n.ListFormatSymbols_pa_Arab', 'goog.labs.i18n.ListFormatSymbols_pa_Arab_PK', 'goog.labs.i18n.ListFormatSymbols_pa_Guru', 'goog.labs.i18n.ListFormatSymbols_pa_Guru_IN', 'goog.labs.i18n.ListFormatSymbols_pl_PL', 'goog.labs.i18n.ListFormatSymbols_ps', 'goog.labs.i18n.ListFormatSymbols_ps_AF', 'goog.labs.i18n.ListFormatSymbols_pt_AO', 'goog.labs.i18n.ListFormatSymbols_pt_CV', 'goog.labs.i18n.ListFormatSymbols_pt_GW', 'goog.labs.i18n.ListFormatSymbols_pt_MO', 'goog.labs.i18n.ListFormatSymbols_pt_MZ', 'goog.labs.i18n.ListFormatSymbols_pt_ST', 'goog.labs.i18n.ListFormatSymbols_pt_TL', 'goog.labs.i18n.ListFormatSymbols_rm', 'goog.labs.i18n.ListFormatSymbols_rm_CH', 'goog.labs.i18n.ListFormatSymbols_rn', 'goog.labs.i18n.ListFormatSymbols_rn_BI', 'goog.labs.i18n.ListFormatSymbols_ro_MD', 'goog.labs.i18n.ListFormatSymbols_ro_RO', 'goog.labs.i18n.ListFormatSymbols_rof', 'goog.labs.i18n.ListFormatSymbols_rof_TZ', 'goog.labs.i18n.ListFormatSymbols_ru_BY', 'goog.labs.i18n.ListFormatSymbols_ru_KG', 'goog.labs.i18n.ListFormatSymbols_ru_KZ', 'goog.labs.i18n.ListFormatSymbols_ru_MD', 'goog.labs.i18n.ListFormatSymbols_ru_RU', 'goog.labs.i18n.ListFormatSymbols_ru_UA', 'goog.labs.i18n.ListFormatSymbols_rw', 'goog.labs.i18n.ListFormatSymbols_rw_RW', 'goog.labs.i18n.ListFormatSymbols_rwk', 'goog.labs.i18n.ListFormatSymbols_rwk_TZ', 'goog.labs.i18n.ListFormatSymbols_saq', 'goog.labs.i18n.ListFormatSymbols_saq_KE', 'goog.labs.i18n.ListFormatSymbols_sbp', 'goog.labs.i18n.ListFormatSymbols_sbp_TZ', 'goog.labs.i18n.ListFormatSymbols_seh', 'goog.labs.i18n.ListFormatSymbols_seh_MZ', 'goog.labs.i18n.ListFormatSymbols_ses', 'goog.labs.i18n.ListFormatSymbols_ses_ML', 'goog.labs.i18n.ListFormatSymbols_sg', 'goog.labs.i18n.ListFormatSymbols_sg_CF', 'goog.labs.i18n.ListFormatSymbols_shi', 'goog.labs.i18n.ListFormatSymbols_shi_Latn', 'goog.labs.i18n.ListFormatSymbols_shi_Latn_MA', 'goog.labs.i18n.ListFormatSymbols_shi_Tfng', 'goog.labs.i18n.ListFormatSymbols_shi_Tfng_MA', 'goog.labs.i18n.ListFormatSymbols_si_LK', 'goog.labs.i18n.ListFormatSymbols_sk_SK', 'goog.labs.i18n.ListFormatSymbols_sl_SI', 'goog.labs.i18n.ListFormatSymbols_sn', 'goog.labs.i18n.ListFormatSymbols_sn_ZW', 'goog.labs.i18n.ListFormatSymbols_so', 'goog.labs.i18n.ListFormatSymbols_so_DJ', 'goog.labs.i18n.ListFormatSymbols_so_ET', 'goog.labs.i18n.ListFormatSymbols_so_KE', 'goog.labs.i18n.ListFormatSymbols_so_SO', 'goog.labs.i18n.ListFormatSymbols_sq_AL', 'goog.labs.i18n.ListFormatSymbols_sq_MK', 'goog.labs.i18n.ListFormatSymbols_sq_XK', 'goog.labs.i18n.ListFormatSymbols_sr_Cyrl', 'goog.labs.i18n.ListFormatSymbols_sr_Cyrl_BA', 'goog.labs.i18n.ListFormatSymbols_sr_Cyrl_ME', 'goog.labs.i18n.ListFormatSymbols_sr_Cyrl_RS', 'goog.labs.i18n.ListFormatSymbols_sr_Cyrl_XK', 'goog.labs.i18n.ListFormatSymbols_sr_Latn', 'goog.labs.i18n.ListFormatSymbols_sr_Latn_BA', 'goog.labs.i18n.ListFormatSymbols_sr_Latn_ME', 'goog.labs.i18n.ListFormatSymbols_sr_Latn_RS', 'goog.labs.i18n.ListFormatSymbols_sr_Latn_XK', 'goog.labs.i18n.ListFormatSymbols_sv_AX', 'goog.labs.i18n.ListFormatSymbols_sv_FI', 'goog.labs.i18n.ListFormatSymbols_sv_SE', 'goog.labs.i18n.ListFormatSymbols_sw_KE', 'goog.labs.i18n.ListFormatSymbols_sw_TZ', 'goog.labs.i18n.ListFormatSymbols_sw_UG', 'goog.labs.i18n.ListFormatSymbols_swc', 'goog.labs.i18n.ListFormatSymbols_swc_CD', 'goog.labs.i18n.ListFormatSymbols_ta_IN', 'goog.labs.i18n.ListFormatSymbols_ta_LK', 'goog.labs.i18n.ListFormatSymbols_ta_MY', 'goog.labs.i18n.ListFormatSymbols_ta_SG', 'goog.labs.i18n.ListFormatSymbols_te_IN', 'goog.labs.i18n.ListFormatSymbols_teo', 'goog.labs.i18n.ListFormatSymbols_teo_KE', 'goog.labs.i18n.ListFormatSymbols_teo_UG', 'goog.labs.i18n.ListFormatSymbols_th_TH', 'goog.labs.i18n.ListFormatSymbols_ti', 'goog.labs.i18n.ListFormatSymbols_ti_ER', 'goog.labs.i18n.ListFormatSymbols_ti_ET', 'goog.labs.i18n.ListFormatSymbols_to', 'goog.labs.i18n.ListFormatSymbols_to_TO', 'goog.labs.i18n.ListFormatSymbols_tr_CY', 'goog.labs.i18n.ListFormatSymbols_tr_TR', 'goog.labs.i18n.ListFormatSymbols_twq', 'goog.labs.i18n.ListFormatSymbols_twq_NE', 'goog.labs.i18n.ListFormatSymbols_tzm', 'goog.labs.i18n.ListFormatSymbols_tzm_Latn', 'goog.labs.i18n.ListFormatSymbols_tzm_Latn_MA', 'goog.labs.i18n.ListFormatSymbols_ug', 'goog.labs.i18n.ListFormatSymbols_ug_Arab', 'goog.labs.i18n.ListFormatSymbols_ug_Arab_CN', 'goog.labs.i18n.ListFormatSymbols_uk_UA', 'goog.labs.i18n.ListFormatSymbols_ur_IN', 'goog.labs.i18n.ListFormatSymbols_ur_PK', 'goog.labs.i18n.ListFormatSymbols_uz_Arab', 'goog.labs.i18n.ListFormatSymbols_uz_Arab_AF', 'goog.labs.i18n.ListFormatSymbols_uz_Cyrl', 'goog.labs.i18n.ListFormatSymbols_uz_Cyrl_UZ', 'goog.labs.i18n.ListFormatSymbols_uz_Latn', 'goog.labs.i18n.ListFormatSymbols_uz_Latn_UZ', 'goog.labs.i18n.ListFormatSymbols_vai', 'goog.labs.i18n.ListFormatSymbols_vai_Latn', 'goog.labs.i18n.ListFormatSymbols_vai_Latn_LR', 'goog.labs.i18n.ListFormatSymbols_vai_Vaii', 'goog.labs.i18n.ListFormatSymbols_vai_Vaii_LR', 'goog.labs.i18n.ListFormatSymbols_vi_VN', 'goog.labs.i18n.ListFormatSymbols_vun', 'goog.labs.i18n.ListFormatSymbols_vun_TZ', 'goog.labs.i18n.ListFormatSymbols_xog', 'goog.labs.i18n.ListFormatSymbols_xog_UG', 'goog.labs.i18n.ListFormatSymbols_yav', 'goog.labs.i18n.ListFormatSymbols_yav_CM', 'goog.labs.i18n.ListFormatSymbols_yo', 'goog.labs.i18n.ListFormatSymbols_yo_BJ', 'goog.labs.i18n.ListFormatSymbols_yo_NG', 'goog.labs.i18n.ListFormatSymbols_zgh', 'goog.labs.i18n.ListFormatSymbols_zgh_MA', 'goog.labs.i18n.ListFormatSymbols_zh_Hans', 'goog.labs.i18n.ListFormatSymbols_zh_Hans_CN', 'goog.labs.i18n.ListFormatSymbols_zh_Hans_HK', 'goog.labs.i18n.ListFormatSymbols_zh_Hans_MO', 'goog.labs.i18n.ListFormatSymbols_zh_Hans_SG', 'goog.labs.i18n.ListFormatSymbols_zh_Hant', 'goog.labs.i18n.ListFormatSymbols_zh_Hant_HK', 'goog.labs.i18n.ListFormatSymbols_zh_Hant_MO', 'goog.labs.i18n.ListFormatSymbols_zh_Hant_TW', 'goog.labs.i18n.ListFormatSymbols_zu_ZA'], ['goog.labs.i18n.ListFormatSymbols']); +goog.addDependency('labs/mock/mock.js', ['goog.labs.mock', 'goog.labs.mock.VerificationError'], ['goog.array', 'goog.asserts', 'goog.debug', 'goog.debug.Error', 'goog.functions', 'goog.object']); +goog.addDependency('labs/mock/mock_test.js', ['goog.labs.mockTest'], ['goog.array', 'goog.labs.mock', 'goog.labs.mock.VerificationError', 'goog.labs.testing.AnythingMatcher', 'goog.labs.testing.GreaterThanMatcher', 'goog.string', 'goog.testing.jsunit']); +goog.addDependency('labs/net/image.js', ['goog.labs.net.image'], ['goog.Promise', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.net.EventType', 'goog.userAgent']); +goog.addDependency('labs/net/image_test.js', ['goog.labs.net.imageTest'], ['goog.events', 'goog.labs.net.image', 'goog.string', 'goog.testing.AsyncTestCase', 'goog.testing.jsunit', 'goog.testing.recordFunction']); goog.addDependency('labs/net/webchannel.js', ['goog.net.WebChannel'], ['goog.events', 'goog.events.Event']); -goog.addDependency('labs/net/webchannel/webchannelbase.js', ['goog.labs.net.webChannel.WebChannelBase', 'goog.labs.net.webChannel.WebChannelBaseTestChannel'], ['goog.Uri', 'goog.array', 'goog.asserts', 'goog.debug.Logger', 'goog.debug.TextFormatter', 'goog.json', 'goog.json.EvalJsonProcessor', 'goog.labs.net.webChannel.WebChannelDebug', 'goog.labs.net.webChannel.WebChannelRequest', 'goog.labs.net.webChannel.WebChannelRequestSupport', 'goog.labs.net.webChannel.webChannelRequestStats', 'goog.labs.net.webChannel.webChannelRequestStats.ServerReachability', 'goog.labs.net.webChannel.webChannelRequestStats.Stat', 'goog.net.XhrIo', 'goog.net.tmpnetwork', 'goog.string', 'goog.structs', 'goog.structs.CircularBuffer']); +goog.addDependency('labs/net/webchannel/basetestchannel.js', ['goog.labs.net.webChannel.BaseTestChannel'], ['goog.labs.net.webChannel.Channel', 'goog.labs.net.webChannel.ChannelRequest', 'goog.labs.net.webChannel.requestStats', 'goog.labs.net.webChannel.requestStats.Stat']); +goog.addDependency('labs/net/webchannel/channel.js', ['goog.labs.net.webChannel.Channel'], []); +goog.addDependency('labs/net/webchannel/channelrequest.js', ['goog.labs.net.webChannel.ChannelRequest'], ['goog.Timer', 'goog.async.Throttle', 'goog.events.EventHandler', 'goog.labs.net.webChannel.requestStats', 'goog.labs.net.webChannel.requestStats.ServerReachability', 'goog.labs.net.webChannel.requestStats.Stat', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.XmlHttp', 'goog.object', 'goog.uri.utils.StandardQueryParam', 'goog.userAgent']); +goog.addDependency('labs/net/webchannel/channelrequest_test.js', ['goog.labs.net.webChannel.channelRequestTest'], ['goog.Uri', 'goog.functions', 'goog.labs.net.webChannel.ChannelRequest', 'goog.labs.net.webChannel.WebChannelDebug', 'goog.labs.net.webChannel.requestStats', 'goog.labs.net.webChannel.requestStats.ServerReachability', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.net.XhrIo', 'goog.testing.recordFunction']); +goog.addDependency('labs/net/webchannel/connectionstate.js', ['goog.labs.net.webChannel.ConnectionState'], []); +goog.addDependency('labs/net/webchannel/forwardchannelrequestpool.js', ['goog.labs.net.webChannel.ForwardChannelRequestPool'], ['goog.array', 'goog.string', 'goog.structs.Set']); +goog.addDependency('labs/net/webchannel/forwardchannelrequestpool_test.js', ['goog.labs.net.webChannel.forwardChannelRequestPoolTest'], ['goog.labs.net.webChannel.ChannelRequest', 'goog.labs.net.webChannel.ForwardChannelRequestPool', 'goog.testing.PropertyReplacer', 'goog.testing.asserts', 'goog.testing.jsunit']); +goog.addDependency('labs/net/webchannel/netutils.js', ['goog.labs.net.webChannel.netUtils'], ['goog.Uri', 'goog.labs.net.webChannel.WebChannelDebug']); +goog.addDependency('labs/net/webchannel/requeststats.js', ['goog.labs.net.webChannel.requestStats', 'goog.labs.net.webChannel.requestStats.Event', 'goog.labs.net.webChannel.requestStats.ServerReachability', 'goog.labs.net.webChannel.requestStats.ServerReachabilityEvent', 'goog.labs.net.webChannel.requestStats.Stat', 'goog.labs.net.webChannel.requestStats.StatEvent', 'goog.labs.net.webChannel.requestStats.TimingEvent'], ['goog.events.Event', 'goog.events.EventTarget']); +goog.addDependency('labs/net/webchannel/webchannelbase.js', ['goog.labs.net.webChannel.WebChannelBase'], ['goog.Uri', 'goog.array', 'goog.asserts', 'goog.debug.TextFormatter', 'goog.json', 'goog.labs.net.webChannel.BaseTestChannel', 'goog.labs.net.webChannel.Channel', 'goog.labs.net.webChannel.ChannelRequest', 'goog.labs.net.webChannel.ConnectionState', 'goog.labs.net.webChannel.ForwardChannelRequestPool', 'goog.labs.net.webChannel.WebChannelDebug', 'goog.labs.net.webChannel.Wire', 'goog.labs.net.webChannel.WireV8', 'goog.labs.net.webChannel.netUtils', 'goog.labs.net.webChannel.requestStats', 'goog.labs.net.webChannel.requestStats.Stat', 'goog.log', 'goog.net.XhrIo', 'goog.object', 'goog.string', 'goog.structs', 'goog.structs.CircularBuffer']); +goog.addDependency('labs/net/webchannel/webchannelbase_test.js', ['goog.labs.net.webChannel.webChannelBaseTest'], ['goog.Timer', 'goog.array', 'goog.dom', 'goog.functions', 'goog.json', 'goog.labs.net.webChannel.ChannelRequest', 'goog.labs.net.webChannel.ForwardChannelRequestPool', 'goog.labs.net.webChannel.WebChannelBase', 'goog.labs.net.webChannel.WebChannelBaseTransport', 'goog.labs.net.webChannel.WebChannelDebug', 'goog.labs.net.webChannel.Wire', 'goog.labs.net.webChannel.netUtils', 'goog.labs.net.webChannel.requestStats', 'goog.labs.net.webChannel.requestStats.Stat', 'goog.structs.Map', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.asserts', 'goog.testing.jsunit']); +goog.addDependency('labs/net/webchannel/webchannelbasetransport.js', ['goog.labs.net.webChannel.WebChannelBaseTransport'], ['goog.asserts', 'goog.events.EventTarget', 'goog.labs.net.webChannel.WebChannelBase', 'goog.log', 'goog.net.WebChannel', 'goog.net.WebChannelTransport', 'goog.string.path']); +goog.addDependency('labs/net/webchannel/webchannelbasetransport_test.js', ['goog.labs.net.webChannel.webChannelBaseTransportTest'], ['goog.events', 'goog.labs.net.webChannel.WebChannelBaseTransport', 'goog.net.WebChannel', 'goog.testing.jsunit']); goog.addDependency('labs/net/webchannel/webchanneldebug.js', ['goog.labs.net.webChannel.WebChannelDebug'], ['goog.json', 'goog.log']); -goog.addDependency('labs/net/webchannel/webchannelrequest.js', ['goog.labs.net.webChannel.WebChannelRequest', 'goog.labs.net.webChannel.WebChannelRequestSupport'], ['goog.Timer', 'goog.async.Throttle', 'goog.events.EventHandler', 'goog.labs.net.webChannel.webChannelRequestStats', 'goog.labs.net.webChannel.webChannelRequestStats.ServerReachability', 'goog.labs.net.webChannel.webChannelRequestStats.Stat', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.XmlHttp', 'goog.object', 'goog.userAgent']); -goog.addDependency('labs/net/webchannel/webchannelrequeststats.js', ['goog.labs.net.webChannel.webChannelRequestStats', 'goog.labs.net.webChannel.webChannelRequestStats.Event', 'goog.labs.net.webChannel.webChannelRequestStats.ServerReachability', 'goog.labs.net.webChannel.webChannelRequestStats.ServerReachabilityEvent', 'goog.labs.net.webChannel.webChannelRequestStats.Stat', 'goog.labs.net.webChannel.webChannelRequestStats.StatEvent', 'goog.labs.net.webChannel.webChannelRequestStats.TimingEvent'], ['goog.events.Event', 'goog.events.EventTarget']); -goog.addDependency('labs/net/webchannelbasetransport.js', ['goog.net.WebChannelBaseTransport'], ['goog.asserts', 'goog.debug.Logger', 'goog.events.EventTarget', 'goog.labs.net.webChannel.WebChannelBase', 'goog.net.WebChannel', 'goog.net.WebChannelTransport', 'goog.string.path']); +goog.addDependency('labs/net/webchannel/wire.js', ['goog.labs.net.webChannel.Wire'], []); +goog.addDependency('labs/net/webchannel/wirev8.js', ['goog.labs.net.webChannel.WireV8'], ['goog.asserts', 'goog.json', 'goog.json.EvalJsonProcessor', 'goog.structs']); +goog.addDependency('labs/net/webchannel/wirev8_test.js', ['goog.labs.net.webChannel.WireV8Test'], ['goog.labs.net.webChannel.WireV8', 'goog.testing.jsunit']); goog.addDependency('labs/net/webchanneltransport.js', ['goog.net.WebChannelTransport'], []); -goog.addDependency('labs/net/webchanneltransportfactory.js', ['goog.net.createWebChannelTransport'], ['goog.functions', 'goog.net.WebChannelBaseTransport']); -goog.addDependency('labs/net/xhr.js', ['goog.labs.net.xhr', 'goog.labs.net.xhr.Error', 'goog.labs.net.xhr.HttpError', 'goog.labs.net.xhr.TimeoutError'], ['goog.debug.Error', 'goog.json', 'goog.net.HttpStatus', 'goog.net.XmlHttp', 'goog.result', 'goog.result.SimpleResult', 'goog.string', 'goog.uri.utils']); +goog.addDependency('labs/net/webchanneltransportfactory.js', ['goog.net.createWebChannelTransport'], ['goog.functions', 'goog.labs.net.webChannel.WebChannelBaseTransport']); +goog.addDependency('labs/net/xhr.js', ['goog.labs.net.xhr', 'goog.labs.net.xhr.Error', 'goog.labs.net.xhr.HttpError', 'goog.labs.net.xhr.Options', 'goog.labs.net.xhr.PostData', 'goog.labs.net.xhr.TimeoutError'], ['goog.Promise', 'goog.debug.Error', 'goog.json', 'goog.net.HttpStatus', 'goog.net.XmlHttp', 'goog.string', 'goog.uri.utils']); +goog.addDependency('labs/net/xhr_test.js', ['goog.labs.net.xhrTest'], ['goog.Promise', 'goog.labs.net.xhr', 'goog.net.XmlHttp', 'goog.string', 'goog.testing.AsyncTestCase', 'goog.testing.MockClock', 'goog.testing.jsunit', 'goog.userAgent']); goog.addDependency('labs/object/object.js', ['goog.labs.object'], []); -goog.addDependency('labs/observe/notice.js', ['goog.labs.observe.Notice'], []); -goog.addDependency('labs/observe/observable.js', ['goog.labs.observe.Observable'], ['goog.disposable.IDisposable']); -goog.addDependency('labs/observe/observableset.js', ['goog.labs.observe.ObservableSet'], ['goog.array', 'goog.labs.observe.Observer']); -goog.addDependency('labs/observe/observationset.js', ['goog.labs.observe.ObservationSet'], ['goog.array', 'goog.labs.observe.Observer']); -goog.addDependency('labs/observe/observer.js', ['goog.labs.observe.Observer'], []); -goog.addDependency('labs/observe/simpleobservable.js', ['goog.labs.observe.SimpleObservable'], ['goog.Disposable', 'goog.array', 'goog.asserts', 'goog.labs.observe.Notice', 'goog.labs.observe.Observable', 'goog.labs.observe.Observer', 'goog.object']); +goog.addDependency('labs/object/object_test.js', ['goog.labs.objectTest'], ['goog.labs.object', 'goog.testing.jsunit']); +goog.addDependency('labs/promise/promise.js', ['goog.labs.Promise', 'goog.labs.Resolver'], ['goog.Promise', 'goog.Thenable', 'goog.promise.Resolver']); +goog.addDependency('labs/storage/boundedcollectablestorage.js', ['goog.labs.storage.BoundedCollectableStorage'], ['goog.array', 'goog.asserts', 'goog.iter', 'goog.storage.CollectableStorage', 'goog.storage.ErrorCode', 'goog.storage.ExpiringStorage']); +goog.addDependency('labs/storage/boundedcollectablestorage_test.js', ['goog.labs.storage.BoundedCollectableStorageTest'], ['goog.labs.storage.BoundedCollectableStorage', 'goog.storage.collectableStorageTester', 'goog.storage.storage_test', 'goog.testing.MockClock', 'goog.testing.jsunit', 'goog.testing.storage.FakeMechanism']); goog.addDependency('labs/structs/map.js', ['goog.labs.structs.Map'], ['goog.array', 'goog.asserts', 'goog.labs.object', 'goog.object']); goog.addDependency('labs/structs/map_perf.js', ['goog.labs.structs.mapPerf'], ['goog.dom', 'goog.labs.structs.Map', 'goog.structs.Map', 'goog.testing.PerformanceTable', 'goog.testing.jsunit']); +goog.addDependency('labs/structs/map_test.js', ['goog.labs.structs.MapTest'], ['goog.labs.structs.Map', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit']); goog.addDependency('labs/structs/multimap.js', ['goog.labs.structs.Multimap'], ['goog.array', 'goog.labs.object', 'goog.labs.structs.Map']); +goog.addDependency('labs/structs/multimap_test.js', ['goog.labs.structs.MultimapTest'], ['goog.labs.structs.Map', 'goog.labs.structs.Multimap', 'goog.testing.jsunit']); goog.addDependency('labs/style/pixeldensitymonitor.js', ['goog.labs.style.PixelDensityMonitor', 'goog.labs.style.PixelDensityMonitor.Density', 'goog.labs.style.PixelDensityMonitor.EventType'], ['goog.events', 'goog.events.EventTarget']); goog.addDependency('labs/style/pixeldensitymonitor_test.js', ['goog.labs.style.PixelDensityMonitorTest'], ['goog.array', 'goog.dom.DomHelper', 'goog.events', 'goog.labs.style.PixelDensityMonitor', 'goog.testing.MockControl', 'goog.testing.jsunit', 'goog.testing.recordFunction']); goog.addDependency('labs/testing/assertthat.js', ['goog.labs.testing.MatcherError', 'goog.labs.testing.assertThat'], ['goog.asserts', 'goog.debug.Error', 'goog.labs.testing.Matcher']); +goog.addDependency('labs/testing/assertthat_test.js', ['goog.labs.testing.assertThatTest'], ['goog.labs.testing.MatcherError', 'goog.labs.testing.assertThat', 'goog.testing.jsunit', 'goog.testing.recordFunction']); goog.addDependency('labs/testing/decoratormatcher.js', ['goog.labs.testing.AnythingMatcher'], ['goog.labs.testing.Matcher']); +goog.addDependency('labs/testing/decoratormatcher_test.js', ['goog.labs.testing.decoratorMatcherTest'], ['goog.labs.testing.AnythingMatcher', 'goog.labs.testing.GreaterThanMatcher', 'goog.labs.testing.MatcherError', 'goog.labs.testing.assertThat', 'goog.testing.jsunit']); goog.addDependency('labs/testing/dictionarymatcher.js', ['goog.labs.testing.HasEntriesMatcher', 'goog.labs.testing.HasEntryMatcher', 'goog.labs.testing.HasKeyMatcher', 'goog.labs.testing.HasValueMatcher'], ['goog.array', 'goog.asserts', 'goog.labs.testing.Matcher', 'goog.string']); +goog.addDependency('labs/testing/dictionarymatcher_test.js', ['goog.labs.testing.dictionaryMatcherTest'], ['goog.labs.testing.HasEntryMatcher', 'goog.labs.testing.MatcherError', 'goog.labs.testing.assertThat', 'goog.testing.jsunit']); goog.addDependency('labs/testing/logicmatcher.js', ['goog.labs.testing.AllOfMatcher', 'goog.labs.testing.AnyOfMatcher', 'goog.labs.testing.IsNotMatcher'], ['goog.array', 'goog.labs.testing.Matcher']); +goog.addDependency('labs/testing/logicmatcher_test.js', ['goog.labs.testing.logicMatcherTest'], ['goog.labs.testing.AllOfMatcher', 'goog.labs.testing.GreaterThanMatcher', 'goog.labs.testing.MatcherError', 'goog.labs.testing.assertThat', 'goog.testing.jsunit']); goog.addDependency('labs/testing/matcher.js', ['goog.labs.testing.Matcher'], []); goog.addDependency('labs/testing/numbermatcher.js', ['goog.labs.testing.CloseToMatcher', 'goog.labs.testing.EqualToMatcher', 'goog.labs.testing.GreaterThanEqualToMatcher', 'goog.labs.testing.GreaterThanMatcher', 'goog.labs.testing.LessThanEqualToMatcher', 'goog.labs.testing.LessThanMatcher'], ['goog.asserts', 'goog.labs.testing.Matcher']); +goog.addDependency('labs/testing/numbermatcher_test.js', ['goog.labs.testing.numberMatcherTest'], ['goog.labs.testing.LessThanMatcher', 'goog.labs.testing.MatcherError', 'goog.labs.testing.assertThat', 'goog.testing.jsunit']); goog.addDependency('labs/testing/objectmatcher.js', ['goog.labs.testing.HasPropertyMatcher', 'goog.labs.testing.InstanceOfMatcher', 'goog.labs.testing.IsNullMatcher', 'goog.labs.testing.IsNullOrUndefinedMatcher', 'goog.labs.testing.IsUndefinedMatcher', 'goog.labs.testing.ObjectEqualsMatcher'], ['goog.labs.testing.Matcher', 'goog.string']); +goog.addDependency('labs/testing/objectmatcher_test.js', ['goog.labs.testing.objectMatcherTest'], ['goog.labs.testing.MatcherError', 'goog.labs.testing.ObjectEqualsMatcher', 'goog.labs.testing.assertThat', 'goog.testing.jsunit']); goog.addDependency('labs/testing/stringmatcher.js', ['goog.labs.testing.ContainsStringMatcher', 'goog.labs.testing.EndsWithMatcher', 'goog.labs.testing.EqualToIgnoringCaseMatcher', 'goog.labs.testing.EqualToIgnoringWhitespaceMatcher', 'goog.labs.testing.EqualsMatcher', 'goog.labs.testing.RegexMatcher', 'goog.labs.testing.StartsWithMatcher', 'goog.labs.testing.StringContainsInOrderMatcher'], ['goog.asserts', 'goog.labs.testing.Matcher', 'goog.string']); -goog.addDependency('labs/useragent/browser.js', ['goog.labs.userAgent.browser'], ['goog.asserts', 'goog.labs.userAgent.util', 'goog.memoize', 'goog.string']); -goog.addDependency('labs/useragent/browser_test.js', ['goog.labs.userAgent.browserTest'], ['goog.labs.userAgent.browser', 'goog.labs.userAgent.testAgents', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit']); +goog.addDependency('labs/testing/stringmatcher_test.js', ['goog.labs.testing.stringMatcherTest'], ['goog.labs.testing.MatcherError', 'goog.labs.testing.StringContainsInOrderMatcher', 'goog.labs.testing.assertThat', 'goog.testing.jsunit']); +goog.addDependency('labs/useragent/browser.js', ['goog.labs.userAgent.browser'], ['goog.array', 'goog.asserts', 'goog.labs.userAgent.util', 'goog.string']); +goog.addDependency('labs/useragent/browser_test.js', ['goog.labs.userAgent.browserTest'], ['goog.labs.userAgent.browser', 'goog.labs.userAgent.testAgents', 'goog.labs.userAgent.util', 'goog.testing.jsunit']); goog.addDependency('labs/useragent/device.js', ['goog.labs.userAgent.device'], ['goog.labs.userAgent.util']); -goog.addDependency('labs/useragent/device_test.js', ['goog.labs.userAgent.deviceTest'], ['goog.labs.userAgent.device', 'goog.labs.userAgent.testAgents', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit']); -goog.addDependency('labs/useragent/engine.js', ['goog.labs.userAgent.engine'], ['goog.array', 'goog.labs.userAgent.util', 'goog.memoize', 'goog.string']); -goog.addDependency('labs/useragent/engine_test.js', ['goog.labs.userAgent.engineTest'], ['goog.labs.userAgent.engine', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit']); -goog.addDependency('labs/useragent/platform.js', ['goog.labs.userAgent.platform'], ['goog.labs.userAgent.util', 'goog.memoize', 'goog.string']); -goog.addDependency('labs/useragent/platform_test.js', ['goog.labs.userAgent.platformTest'], ['goog.labs.userAgent.platform', 'goog.labs.userAgent.testAgents', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit']); +goog.addDependency('labs/useragent/device_test.js', ['goog.labs.userAgent.deviceTest'], ['goog.labs.userAgent.device', 'goog.labs.userAgent.testAgents', 'goog.labs.userAgent.util', 'goog.testing.jsunit']); +goog.addDependency('labs/useragent/engine.js', ['goog.labs.userAgent.engine'], ['goog.array', 'goog.labs.userAgent.util', 'goog.string']); +goog.addDependency('labs/useragent/engine_test.js', ['goog.labs.userAgent.engineTest'], ['goog.labs.userAgent.engine', 'goog.labs.userAgent.testAgents', 'goog.labs.userAgent.util', 'goog.testing.jsunit']); +goog.addDependency('labs/useragent/platform.js', ['goog.labs.userAgent.platform'], ['goog.labs.userAgent.util', 'goog.string']); +goog.addDependency('labs/useragent/platform_test.js', ['goog.labs.userAgent.platformTest'], ['goog.labs.userAgent.platform', 'goog.labs.userAgent.testAgents', 'goog.labs.userAgent.util', 'goog.testing.jsunit']); goog.addDependency('labs/useragent/test_agents.js', ['goog.labs.userAgent.testAgents'], []); -goog.addDependency('labs/useragent/util.js', ['goog.labs.userAgent.util'], ['goog.memoize', 'goog.string']); -goog.addDependency('labs/useragent/util_test.js', ['goog.labs.userAgent.utilTest'], ['goog.labs.userAgent.testAgents', 'goog.labs.userAgent.util', 'goog.testing.jsunit']); +goog.addDependency('labs/useragent/util.js', ['goog.labs.userAgent.util'], ['goog.string']); +goog.addDependency('labs/useragent/util_test.js', ['goog.labs.userAgent.utilTest'], ['goog.functions', 'goog.labs.userAgent.testAgents', 'goog.labs.userAgent.util', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit']); goog.addDependency('locale/countries.js', ['goog.locale.countries'], []); +goog.addDependency('locale/countrylanguagenames_test.js', ['goog.locale.countryLanguageNamesTest'], ['goog.locale', 'goog.testing.jsunit']); goog.addDependency('locale/defaultlocalenameconstants.js', ['goog.locale.defaultLocaleNameConstants'], []); goog.addDependency('locale/genericfontnames.js', ['goog.locale.genericFontNames'], []); +goog.addDependency('locale/genericfontnames_test.js', ['goog.locale.genericFontNamesTest'], ['goog.locale.genericFontNames', 'goog.testing.jsunit']); goog.addDependency('locale/genericfontnamesdata.js', ['goog.locale.genericFontNamesData'], []); goog.addDependency('locale/locale.js', ['goog.locale'], ['goog.locale.nativeNameConstants']); goog.addDependency('locale/nativenameconstants.js', ['goog.locale.nativeNameConstants'], []); goog.addDependency('locale/scriptToLanguages.js', ['goog.locale.scriptToLanguages'], ['goog.locale']); goog.addDependency('locale/timezonedetection.js', ['goog.locale.timeZoneDetection'], ['goog.locale', 'goog.locale.TimeZoneFingerprint']); +goog.addDependency('locale/timezonedetection_test.js', ['goog.locale.timeZoneDetectionTest'], ['goog.locale.timeZoneDetection', 'goog.testing.jsunit']); goog.addDependency('locale/timezonefingerprint.js', ['goog.locale.TimeZoneFingerprint'], []); goog.addDependency('locale/timezonelist.js', ['goog.locale.TimeZoneList'], ['goog.locale']); -goog.addDependency('log/log.js', ['goog.log', 'goog.log.Level', 'goog.log.LogRecord', 'goog.log.Logger'], ['goog.debug', 'goog.debug.LogRecord', 'goog.debug.Logger']); +goog.addDependency('locale/timezonelist_test.js', ['goog.locale.TimeZoneListTest'], ['goog.locale', 'goog.locale.TimeZoneList', 'goog.testing.jsunit']); +goog.addDependency('log/log.js', ['goog.log', 'goog.log.Level', 'goog.log.LogRecord', 'goog.log.Logger'], ['goog.debug', 'goog.debug.LogManager', 'goog.debug.LogRecord', 'goog.debug.Logger']); goog.addDependency('log/log_test.js', ['goog.logTest'], ['goog.debug.LogManager', 'goog.log', 'goog.log.Level', 'goog.testing.jsunit']); +goog.addDependency('math/affinetransform.js', ['goog.math.AffineTransform'], ['goog.math']); +goog.addDependency('math/affinetransform_test.js', ['goog.math.AffineTransformTest'], ['goog.array', 'goog.math', 'goog.math.AffineTransform', 'goog.testing.jsunit']); goog.addDependency('math/bezier.js', ['goog.math.Bezier'], ['goog.math', 'goog.math.Coordinate']); +goog.addDependency('math/bezier_test.js', ['goog.math.BezierTest'], ['goog.math', 'goog.math.Bezier', 'goog.math.Coordinate', 'goog.testing.jsunit']); goog.addDependency('math/box.js', ['goog.math.Box'], ['goog.math.Coordinate']); +goog.addDependency('math/box_test.js', ['goog.math.BoxTest'], ['goog.math.Box', 'goog.math.Coordinate', 'goog.testing.jsunit']); goog.addDependency('math/coordinate.js', ['goog.math.Coordinate'], ['goog.math']); goog.addDependency('math/coordinate3.js', ['goog.math.Coordinate3'], []); +goog.addDependency('math/coordinate3_test.js', ['goog.math.Coordinate3Test'], ['goog.math.Coordinate3', 'goog.testing.jsunit']); +goog.addDependency('math/coordinate_test.js', ['goog.math.CoordinateTest'], ['goog.math.Coordinate', 'goog.testing.jsunit']); goog.addDependency('math/exponentialbackoff.js', ['goog.math.ExponentialBackoff'], ['goog.asserts']); +goog.addDependency('math/exponentialbackoff_test.js', ['goog.math.ExponentialBackoffTest'], ['goog.math.ExponentialBackoff', 'goog.testing.jsunit']); goog.addDependency('math/integer.js', ['goog.math.Integer'], []); +goog.addDependency('math/integer_test.js', ['goog.math.IntegerTest'], ['goog.math.Integer', 'goog.testing.jsunit']); goog.addDependency('math/interpolator/interpolator1.js', ['goog.math.interpolator.Interpolator1'], []); goog.addDependency('math/interpolator/linear1.js', ['goog.math.interpolator.Linear1'], ['goog.array', 'goog.math', 'goog.math.interpolator.Interpolator1']); +goog.addDependency('math/interpolator/linear1_test.js', ['goog.math.interpolator.Linear1Test'], ['goog.math.interpolator.Linear1', 'goog.testing.jsunit']); goog.addDependency('math/interpolator/pchip1.js', ['goog.math.interpolator.Pchip1'], ['goog.math', 'goog.math.interpolator.Spline1']); +goog.addDependency('math/interpolator/pchip1_test.js', ['goog.math.interpolator.Pchip1Test'], ['goog.math.interpolator.Pchip1', 'goog.testing.jsunit']); goog.addDependency('math/interpolator/spline1.js', ['goog.math.interpolator.Spline1'], ['goog.array', 'goog.math', 'goog.math.interpolator.Interpolator1', 'goog.math.tdma']); +goog.addDependency('math/interpolator/spline1_test.js', ['goog.math.interpolator.Spline1Test'], ['goog.math.interpolator.Spline1', 'goog.testing.jsunit']); goog.addDependency('math/line.js', ['goog.math.Line'], ['goog.math', 'goog.math.Coordinate']); +goog.addDependency('math/line_test.js', ['goog.math.LineTest'], ['goog.math.Coordinate', 'goog.math.Line', 'goog.testing.jsunit']); goog.addDependency('math/long.js', ['goog.math.Long'], []); +goog.addDependency('math/long_test.js', ['goog.math.LongTest'], ['goog.math.Long', 'goog.testing.jsunit']); goog.addDependency('math/math.js', ['goog.math'], ['goog.array', 'goog.asserts']); +goog.addDependency('math/math_test.js', ['goog.mathTest'], ['goog.math', 'goog.testing.jsunit']); goog.addDependency('math/matrix.js', ['goog.math.Matrix'], ['goog.array', 'goog.math', 'goog.math.Size', 'goog.string']); -goog.addDependency('math/range.js', ['goog.math.Range'], []); +goog.addDependency('math/matrix_test.js', ['goog.math.MatrixTest'], ['goog.math.Matrix', 'goog.testing.jsunit']); +goog.addDependency('math/path.js', ['goog.math.Path', 'goog.math.Path.Segment'], ['goog.array', 'goog.math']); +goog.addDependency('math/path_test.js', ['goog.math.PathTest'], ['goog.array', 'goog.math.AffineTransform', 'goog.math.Path', 'goog.testing.jsunit']); +goog.addDependency('math/paths.js', ['goog.math.paths'], ['goog.math.Coordinate', 'goog.math.Path']); +goog.addDependency('math/paths_test.js', ['goog.math.pathsTest'], ['goog.math.Coordinate', 'goog.math.paths', 'goog.testing.jsunit']); +goog.addDependency('math/range.js', ['goog.math.Range'], ['goog.asserts']); +goog.addDependency('math/range_test.js', ['goog.math.RangeTest'], ['goog.math.Range', 'goog.testing.jsunit']); goog.addDependency('math/rangeset.js', ['goog.math.RangeSet'], ['goog.array', 'goog.iter.Iterator', 'goog.iter.StopIteration', 'goog.math.Range']); +goog.addDependency('math/rangeset_test.js', ['goog.math.RangeSetTest'], ['goog.iter', 'goog.math.Range', 'goog.math.RangeSet', 'goog.testing.jsunit']); goog.addDependency('math/rect.js', ['goog.math.Rect'], ['goog.math.Box', 'goog.math.Coordinate', 'goog.math.Size']); +goog.addDependency('math/rect_test.js', ['goog.math.RectTest'], ['goog.math.Box', 'goog.math.Coordinate', 'goog.math.Rect', 'goog.math.Size', 'goog.testing.jsunit']); goog.addDependency('math/size.js', ['goog.math.Size'], []); +goog.addDependency('math/size_test.js', ['goog.math.SizeTest'], ['goog.math.Size', 'goog.testing.jsunit']); goog.addDependency('math/tdma.js', ['goog.math.tdma'], []); +goog.addDependency('math/tdma_test.js', ['goog.math.tdmaTest'], ['goog.math.tdma', 'goog.testing.jsunit']); goog.addDependency('math/vec2.js', ['goog.math.Vec2'], ['goog.math', 'goog.math.Coordinate']); +goog.addDependency('math/vec2_test.js', ['goog.math.Vec2Test'], ['goog.math.Vec2', 'goog.testing.jsunit']); goog.addDependency('math/vec3.js', ['goog.math.Vec3'], ['goog.math', 'goog.math.Coordinate3']); +goog.addDependency('math/vec3_test.js', ['goog.math.Vec3Test'], ['goog.math.Coordinate3', 'goog.math.Vec3', 'goog.testing.jsunit']); goog.addDependency('memoize/memoize.js', ['goog.memoize'], []); -goog.addDependency('messaging/abstractchannel.js', ['goog.messaging.AbstractChannel'], ['goog.Disposable', 'goog.debug', 'goog.debug.Logger', 'goog.json', 'goog.messaging.MessageChannel']); -goog.addDependency('messaging/bufferedchannel.js', ['goog.messaging.BufferedChannel'], ['goog.Timer', 'goog.Uri', 'goog.debug.Error', 'goog.debug.Logger', 'goog.events', 'goog.messaging.MessageChannel', 'goog.messaging.MultiChannel']); +goog.addDependency('memoize/memoize_test.js', ['goog.memoizeTest'], ['goog.memoize', 'goog.testing.jsunit']); +goog.addDependency('messaging/abstractchannel.js', ['goog.messaging.AbstractChannel'], ['goog.Disposable', 'goog.debug', 'goog.json', 'goog.log', 'goog.messaging.MessageChannel']); +goog.addDependency('messaging/abstractchannel_test.js', ['goog.messaging.AbstractChannelTest'], ['goog.messaging.AbstractChannel', 'goog.testing.MockControl', 'goog.testing.async.MockControl', 'goog.testing.jsunit']); +goog.addDependency('messaging/bufferedchannel.js', ['goog.messaging.BufferedChannel'], ['goog.Timer', 'goog.Uri', 'goog.debug.Error', 'goog.events', 'goog.log', 'goog.messaging.MessageChannel', 'goog.messaging.MultiChannel']); +goog.addDependency('messaging/bufferedchannel_test.js', ['goog.messaging.BufferedChannelTest'], ['goog.debug.Console', 'goog.dom', 'goog.log', 'goog.log.Level', 'goog.messaging.BufferedChannel', 'goog.testing.MockClock', 'goog.testing.MockControl', 'goog.testing.async.MockControl', 'goog.testing.jsunit', 'goog.testing.messaging.MockMessageChannel']); goog.addDependency('messaging/deferredchannel.js', ['goog.messaging.DeferredChannel'], ['goog.Disposable', 'goog.async.Deferred', 'goog.messaging.MessageChannel']); +goog.addDependency('messaging/deferredchannel_test.js', ['goog.messaging.DeferredChannelTest'], ['goog.async.Deferred', 'goog.messaging.DeferredChannel', 'goog.testing.MockControl', 'goog.testing.async.MockControl', 'goog.testing.jsunit', 'goog.testing.messaging.MockMessageChannel']); goog.addDependency('messaging/loggerclient.js', ['goog.messaging.LoggerClient'], ['goog.Disposable', 'goog.debug', 'goog.debug.LogManager', 'goog.debug.Logger']); -goog.addDependency('messaging/loggerserver.js', ['goog.messaging.LoggerServer'], ['goog.Disposable', 'goog.debug.Logger']); +goog.addDependency('messaging/loggerclient_test.js', ['goog.messaging.LoggerClientTest'], ['goog.debug', 'goog.debug.Logger', 'goog.messaging.LoggerClient', 'goog.testing.MockControl', 'goog.testing.jsunit', 'goog.testing.messaging.MockMessageChannel']); +goog.addDependency('messaging/loggerserver.js', ['goog.messaging.LoggerServer'], ['goog.Disposable', 'goog.log']); +goog.addDependency('messaging/loggerserver_test.js', ['goog.messaging.LoggerServerTest'], ['goog.debug.LogManager', 'goog.debug.Logger', 'goog.log', 'goog.log.Level', 'goog.messaging.LoggerServer', 'goog.testing.MockControl', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.messaging.MockMessageChannel']); goog.addDependency('messaging/messagechannel.js', ['goog.messaging.MessageChannel'], []); goog.addDependency('messaging/messaging.js', ['goog.messaging'], ['goog.messaging.MessageChannel']); -goog.addDependency('messaging/multichannel.js', ['goog.messaging.MultiChannel', 'goog.messaging.MultiChannel.VirtualChannel'], ['goog.Disposable', 'goog.debug.Logger', 'goog.events.EventHandler', 'goog.messaging.MessageChannel', 'goog.object']); +goog.addDependency('messaging/messaging_test.js', ['goog.testing.messaging.MockMessageChannelTest'], ['goog.messaging', 'goog.testing.MockControl', 'goog.testing.jsunit', 'goog.testing.messaging.MockMessageChannel']); +goog.addDependency('messaging/multichannel.js', ['goog.messaging.MultiChannel', 'goog.messaging.MultiChannel.VirtualChannel'], ['goog.Disposable', 'goog.events.EventHandler', 'goog.log', 'goog.messaging.MessageChannel', 'goog.object']); +goog.addDependency('messaging/multichannel_test.js', ['goog.messaging.MultiChannelTest'], ['goog.messaging.MultiChannel', 'goog.testing.MockControl', 'goog.testing.jsunit', 'goog.testing.messaging.MockMessageChannel', 'goog.testing.mockmatchers.IgnoreArgument']); goog.addDependency('messaging/portcaller.js', ['goog.messaging.PortCaller'], ['goog.Disposable', 'goog.async.Deferred', 'goog.messaging.DeferredChannel', 'goog.messaging.PortChannel', 'goog.messaging.PortNetwork', 'goog.object']); -goog.addDependency('messaging/portchannel.js', ['goog.messaging.PortChannel'], ['goog.Timer', 'goog.array', 'goog.async.Deferred', 'goog.debug', 'goog.debug.Logger', 'goog.dom', 'goog.dom.DomHelper', 'goog.events', 'goog.events.EventType', 'goog.json', 'goog.messaging.AbstractChannel', 'goog.messaging.DeferredChannel', 'goog.object', 'goog.string']); +goog.addDependency('messaging/portcaller_test.js', ['goog.messaging.PortCallerTest'], ['goog.events.EventTarget', 'goog.messaging.PortCaller', 'goog.messaging.PortNetwork', 'goog.testing.MockControl', 'goog.testing.jsunit', 'goog.testing.messaging.MockMessageChannel']); +goog.addDependency('messaging/portchannel.js', ['goog.messaging.PortChannel'], ['goog.Timer', 'goog.array', 'goog.async.Deferred', 'goog.debug', 'goog.dom', 'goog.dom.DomHelper', 'goog.events', 'goog.events.EventType', 'goog.json', 'goog.log', 'goog.messaging.AbstractChannel', 'goog.messaging.DeferredChannel', 'goog.object', 'goog.string']); goog.addDependency('messaging/portnetwork.js', ['goog.messaging.PortNetwork'], []); -goog.addDependency('messaging/portoperator.js', ['goog.messaging.PortOperator'], ['goog.Disposable', 'goog.asserts', 'goog.debug.Logger', 'goog.messaging.PortChannel', 'goog.messaging.PortNetwork', 'goog.object']); -goog.addDependency('messaging/respondingchannel.js', ['goog.messaging.RespondingChannel'], ['goog.Disposable', 'goog.debug.Logger', 'goog.messaging.MessageChannel', 'goog.messaging.MultiChannel', 'goog.messaging.MultiChannel.VirtualChannel']); +goog.addDependency('messaging/portoperator.js', ['goog.messaging.PortOperator'], ['goog.Disposable', 'goog.asserts', 'goog.log', 'goog.messaging.PortChannel', 'goog.messaging.PortNetwork', 'goog.object']); +goog.addDependency('messaging/portoperator_test.js', ['goog.messaging.PortOperatorTest'], ['goog.messaging.PortNetwork', 'goog.messaging.PortOperator', 'goog.testing.MockControl', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.messaging.MockMessageChannel', 'goog.testing.messaging.MockMessagePort']); +goog.addDependency('messaging/respondingchannel.js', ['goog.messaging.RespondingChannel'], ['goog.Disposable', 'goog.log', 'goog.messaging.MessageChannel', 'goog.messaging.MultiChannel', 'goog.messaging.MultiChannel.VirtualChannel']); +goog.addDependency('messaging/respondingchannel_test.js', ['goog.messaging.RespondingChannelTest'], ['goog.messaging.RespondingChannel', 'goog.testing.MockControl', 'goog.testing.jsunit', 'goog.testing.messaging.MockMessageChannel']); goog.addDependency('messaging/testdata/portchannel_worker.js', ['goog.messaging.testdata.portchannel_worker'], ['goog.messaging.PortChannel']); goog.addDependency('messaging/testdata/portnetwork_worker1.js', ['goog.messaging.testdata.portnetwork_worker1'], ['goog.messaging.PortCaller', 'goog.messaging.PortChannel']); goog.addDependency('messaging/testdata/portnetwork_worker2.js', ['goog.messaging.testdata.portnetwork_worker2'], ['goog.messaging.PortCaller', 'goog.messaging.PortChannel']); @@ -443,434 +720,599 @@ goog.addDependency('module/basemodule.js', ['goog.module.BaseModule'], ['goog.Di goog.addDependency('module/loader.js', ['goog.module.Loader'], ['goog.Timer', 'goog.array', 'goog.dom', 'goog.object']); goog.addDependency('module/module.js', ['goog.module'], ['goog.array', 'goog.module.Loader']); goog.addDependency('module/moduleinfo.js', ['goog.module.ModuleInfo'], ['goog.Disposable', 'goog.functions', 'goog.module.BaseModule', 'goog.module.ModuleLoadCallback']); +goog.addDependency('module/moduleinfo_test.js', ['goog.module.ModuleInfoTest'], ['goog.module.BaseModule', 'goog.module.ModuleInfo', 'goog.testing.jsunit']); goog.addDependency('module/moduleloadcallback.js', ['goog.module.ModuleLoadCallback'], ['goog.debug.entryPointRegistry', 'goog.debug.errorHandlerWeakDep']); -goog.addDependency('module/moduleloader.js', ['goog.module.ModuleLoader'], ['goog.Timer', 'goog.array', 'goog.debug.Logger', 'goog.events', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.module.AbstractModuleLoader', 'goog.net.BulkLoader', 'goog.net.EventType', 'goog.net.jsloader', 'goog.userAgent.product']); +goog.addDependency('module/moduleloadcallback_test.js', ['goog.module.ModuleLoadCallbackTest'], ['goog.debug.ErrorHandler', 'goog.debug.entryPointRegistry', 'goog.functions', 'goog.module.ModuleLoadCallback', 'goog.testing.jsunit', 'goog.testing.recordFunction']); +goog.addDependency('module/moduleloader.js', ['goog.module.ModuleLoader'], ['goog.Timer', 'goog.array', 'goog.events', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.log', 'goog.module.AbstractModuleLoader', 'goog.net.BulkLoader', 'goog.net.EventType', 'goog.net.jsloader', 'goog.userAgent.product']); goog.addDependency('module/moduleloader_test.js', ['goog.module.ModuleLoaderTest'], ['goog.array', 'goog.dom', 'goog.functions', 'goog.module.ModuleLoader', 'goog.module.ModuleManager', 'goog.module.ModuleManager.CallbackType', 'goog.object', 'goog.testing.AsyncTestCase', 'goog.testing.PropertyReplacer', 'goog.testing.events.EventObserver', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.userAgent.product']); -goog.addDependency('module/modulemanager.js', ['goog.module.ModuleManager', 'goog.module.ModuleManager.CallbackType', 'goog.module.ModuleManager.FailureType'], ['goog.Disposable', 'goog.array', 'goog.asserts', 'goog.async.Deferred', 'goog.debug.Logger', 'goog.debug.Trace', 'goog.dispose', 'goog.module.ModuleInfo', 'goog.module.ModuleLoadCallback', 'goog.object']); +goog.addDependency('module/modulemanager.js', ['goog.module.ModuleManager', 'goog.module.ModuleManager.CallbackType', 'goog.module.ModuleManager.FailureType'], ['goog.Disposable', 'goog.array', 'goog.asserts', 'goog.async.Deferred', 'goog.debug.Trace', 'goog.dispose', 'goog.log', 'goog.module.ModuleInfo', 'goog.module.ModuleLoadCallback', 'goog.object']); +goog.addDependency('module/modulemanager_test.js', ['goog.module.ModuleManagerTest'], ['goog.array', 'goog.functions', 'goog.module.BaseModule', 'goog.module.ModuleManager', 'goog.testing', 'goog.testing.MockClock', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.userAgent']); goog.addDependency('module/testdata/modA_1.js', ['goog.module.testdata.modA_1'], []); goog.addDependency('module/testdata/modA_2.js', ['goog.module.testdata.modA_2'], ['goog.module.ModuleManager']); goog.addDependency('module/testdata/modB_1.js', ['goog.module.testdata.modB_1'], ['goog.module.ModuleManager']); -goog.addDependency('net/browserchannel.js', ['goog.net.BrowserChannel', 'goog.net.BrowserChannel.Error', 'goog.net.BrowserChannel.Event', 'goog.net.BrowserChannel.Handler', 'goog.net.BrowserChannel.LogSaver', 'goog.net.BrowserChannel.QueuedMap', 'goog.net.BrowserChannel.ServerReachability', 'goog.net.BrowserChannel.ServerReachabilityEvent', 'goog.net.BrowserChannel.Stat', 'goog.net.BrowserChannel.StatEvent', 'goog.net.BrowserChannel.State', 'goog.net.BrowserChannel.TimingEvent'], ['goog.Uri', 'goog.array', 'goog.asserts', 'goog.debug.Logger', 'goog.debug.TextFormatter', 'goog.events.Event', 'goog.events.EventTarget', 'goog.json', 'goog.json.EvalJsonProcessor', 'goog.net.BrowserTestChannel', 'goog.net.ChannelDebug', 'goog.net.ChannelRequest', 'goog.net.XhrIo', 'goog.net.tmpnetwork', 'goog.string', 'goog.structs', 'goog.structs.CircularBuffer']); +goog.addDependency('net/browserchannel.js', ['goog.net.BrowserChannel', 'goog.net.BrowserChannel.Error', 'goog.net.BrowserChannel.Event', 'goog.net.BrowserChannel.Handler', 'goog.net.BrowserChannel.LogSaver', 'goog.net.BrowserChannel.QueuedMap', 'goog.net.BrowserChannel.ServerReachability', 'goog.net.BrowserChannel.ServerReachabilityEvent', 'goog.net.BrowserChannel.Stat', 'goog.net.BrowserChannel.StatEvent', 'goog.net.BrowserChannel.State', 'goog.net.BrowserChannel.TimingEvent'], ['goog.Uri', 'goog.array', 'goog.asserts', 'goog.debug.TextFormatter', 'goog.events.Event', 'goog.events.EventTarget', 'goog.json', 'goog.json.EvalJsonProcessor', 'goog.log', 'goog.net.BrowserTestChannel', 'goog.net.ChannelDebug', 'goog.net.ChannelRequest', 'goog.net.XhrIo', 'goog.net.tmpnetwork', 'goog.object', 'goog.string', 'goog.structs', 'goog.structs.CircularBuffer']); +goog.addDependency('net/browserchannel_test.js', ['goog.net.BrowserChannelTest'], ['goog.Timer', 'goog.array', 'goog.dom', 'goog.functions', 'goog.json', 'goog.net.BrowserChannel', 'goog.net.ChannelDebug', 'goog.net.ChannelRequest', 'goog.net.tmpnetwork', 'goog.structs.Map', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.asserts', 'goog.testing.jsunit', 'goog.testing.recordFunction']); goog.addDependency('net/browsertestchannel.js', ['goog.net.BrowserTestChannel'], ['goog.json.EvalJsonProcessor', 'goog.net.ChannelRequest', 'goog.net.ChannelRequest.Error', 'goog.net.tmpnetwork', 'goog.string.Parser', 'goog.userAgent']); -goog.addDependency('net/bulkloader.js', ['goog.net.BulkLoader'], ['goog.debug.Logger', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.net.BulkLoaderHelper', 'goog.net.EventType', 'goog.net.XhrIo']); -goog.addDependency('net/bulkloaderhelper.js', ['goog.net.BulkLoaderHelper'], ['goog.Disposable', 'goog.debug.Logger']); +goog.addDependency('net/bulkloader.js', ['goog.net.BulkLoader'], ['goog.events.EventHandler', 'goog.events.EventTarget', 'goog.log', 'goog.net.BulkLoaderHelper', 'goog.net.EventType', 'goog.net.XhrIo']); +goog.addDependency('net/bulkloader_test.js', ['goog.net.BulkLoaderTest'], ['goog.events.Event', 'goog.events.EventHandler', 'goog.net.BulkLoader', 'goog.net.EventType', 'goog.testing.MockClock', 'goog.testing.jsunit']); +goog.addDependency('net/bulkloaderhelper.js', ['goog.net.BulkLoaderHelper'], ['goog.Disposable', 'goog.log']); goog.addDependency('net/channeldebug.js', ['goog.net.ChannelDebug'], ['goog.json', 'goog.log']); goog.addDependency('net/channelrequest.js', ['goog.net.ChannelRequest', 'goog.net.ChannelRequest.Error'], ['goog.Timer', 'goog.async.Throttle', 'goog.events.EventHandler', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.XmlHttp', 'goog.object', 'goog.userAgent']); +goog.addDependency('net/channelrequest_test.js', ['goog.net.ChannelRequestTest'], ['goog.Uri', 'goog.functions', 'goog.net.BrowserChannel', 'goog.net.ChannelDebug', 'goog.net.ChannelRequest', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.net.XhrIo', 'goog.testing.recordFunction']); goog.addDependency('net/cookies.js', ['goog.net.Cookies', 'goog.net.cookies'], []); -goog.addDependency('net/crossdomainrpc.js', ['goog.net.CrossDomainRpc'], ['goog.Uri', 'goog.debug.Logger', 'goog.dom', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.json', 'goog.net.EventType', 'goog.net.HttpStatus', 'goog.string', 'goog.userAgent']); +goog.addDependency('net/cookies_test.js', ['goog.net.cookiesTest'], ['goog.array', 'goog.net.cookies', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit']); +goog.addDependency('net/corsxmlhttpfactory.js', ['goog.net.CorsXmlHttpFactory', 'goog.net.IeCorsXhrAdapter'], ['goog.net.HttpStatus', 'goog.net.XhrLike', 'goog.net.XmlHttp', 'goog.net.XmlHttpFactory']); +goog.addDependency('net/corsxmlhttpfactory_test.js', ['goog.net.CorsXmlHttpFactoryTest'], ['goog.net.CorsXmlHttpFactory', 'goog.net.IeCorsXhrAdapter', 'goog.testing.jsunit', 'goog.userAgent']); +goog.addDependency('net/crossdomainrpc.js', ['goog.net.CrossDomainRpc'], ['goog.Uri', 'goog.dom', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.json', 'goog.log', 'goog.net.EventType', 'goog.net.HttpStatus', 'goog.string', 'goog.userAgent']); +goog.addDependency('net/crossdomainrpc_test.js', ['goog.net.CrossDomainRpcTest'], ['goog.log', 'goog.log.Level', 'goog.net.CrossDomainRpc', 'goog.testing.jsunit']); goog.addDependency('net/errorcode.js', ['goog.net.ErrorCode'], []); goog.addDependency('net/eventtype.js', ['goog.net.EventType'], []); goog.addDependency('net/filedownloader.js', ['goog.net.FileDownloader', 'goog.net.FileDownloader.Error'], ['goog.Disposable', 'goog.asserts', 'goog.async.Deferred', 'goog.crypt.hash32', 'goog.debug.Error', 'goog.events', 'goog.events.EventHandler', 'goog.fs', 'goog.fs.DirectoryEntry', 'goog.fs.Error', 'goog.fs.FileSaver', 'goog.net.EventType', 'goog.net.XhrIo', 'goog.net.XhrIoPool', 'goog.object']); +goog.addDependency('net/filedownloader_test.js', ['goog.net.FileDownloaderTest'], ['goog.fs.Error', 'goog.net.ErrorCode', 'goog.net.FileDownloader', 'goog.net.XhrIo', 'goog.testing.AsyncTestCase', 'goog.testing.PropertyReplacer', 'goog.testing.fs', 'goog.testing.fs.FileSystem', 'goog.testing.jsunit', 'goog.testing.net.XhrIoPool']); goog.addDependency('net/httpstatus.js', ['goog.net.HttpStatus'], []); -goog.addDependency('net/iframeio.js', ['goog.net.IframeIo', 'goog.net.IframeIo.IncrementalDataEvent'], ['goog.Timer', 'goog.Uri', 'goog.debug', 'goog.debug.Logger', 'goog.dom', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.json', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.reflect', 'goog.string', 'goog.structs', 'goog.userAgent']); +goog.addDependency('net/iframe_xhr_test.js', ['goog.net.iframeXhrTest'], ['goog.Timer', 'goog.debug.Console', 'goog.debug.LogManager', 'goog.debug.Logger', 'goog.events', 'goog.net.IframeIo', 'goog.net.XhrIo', 'goog.testing.AsyncTestCase', 'goog.testing.jsunit', 'goog.userAgent']); +goog.addDependency('net/iframeio.js', ['goog.net.IframeIo', 'goog.net.IframeIo.IncrementalDataEvent'], ['goog.Timer', 'goog.Uri', 'goog.debug', 'goog.dom', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.json', 'goog.log', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.reflect', 'goog.string', 'goog.structs', 'goog.userAgent']); +goog.addDependency('net/iframeio_different_base_test.js', ['goog.net.iframeIoDifferentBaseTest'], ['goog.events', 'goog.net.EventType', 'goog.net.IframeIo', 'goog.testing.AsyncTestCase', 'goog.testing.jsunit']); +goog.addDependency('net/iframeio_test.js', ['goog.net.IframeIoTest'], ['goog.debug', 'goog.debug.DivConsole', 'goog.debug.LogManager', 'goog.dom', 'goog.events', 'goog.events.EventType', 'goog.log', 'goog.log.Level', 'goog.net.IframeIo', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.jsunit', 'goog.userAgent']); goog.addDependency('net/iframeloadmonitor.js', ['goog.net.IframeLoadMonitor'], ['goog.dom', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.userAgent']); +goog.addDependency('net/iframeloadmonitor_test.js', ['goog.net.IframeLoadMonitorTest'], ['goog.dom', 'goog.events', 'goog.net.IframeLoadMonitor', 'goog.testing.AsyncTestCase', 'goog.testing.jsunit']); goog.addDependency('net/imageloader.js', ['goog.net.ImageLoader'], ['goog.array', 'goog.dom', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.net.EventType', 'goog.object', 'goog.userAgent']); +goog.addDependency('net/imageloader_test.js', ['goog.net.ImageLoaderTest'], ['goog.Timer', 'goog.array', 'goog.dispose', 'goog.events', 'goog.events.Event', 'goog.events.EventType', 'goog.net.EventType', 'goog.net.ImageLoader', 'goog.object', 'goog.string', 'goog.testing.AsyncTestCase', 'goog.testing.jsunit', 'goog.testing.recordFunction']); goog.addDependency('net/ipaddress.js', ['goog.net.IpAddress', 'goog.net.Ipv4Address', 'goog.net.Ipv6Address'], ['goog.array', 'goog.math.Integer', 'goog.object', 'goog.string']); +goog.addDependency('net/ipaddress_test.js', ['goog.net.IpAddressTest'], ['goog.math.Integer', 'goog.net.IpAddress', 'goog.net.Ipv4Address', 'goog.net.Ipv6Address', 'goog.testing.jsunit']); goog.addDependency('net/jsloader.js', ['goog.net.jsloader', 'goog.net.jsloader.Error', 'goog.net.jsloader.ErrorCode', 'goog.net.jsloader.Options'], ['goog.array', 'goog.async.Deferred', 'goog.debug.Error', 'goog.dom', 'goog.dom.TagName']); +goog.addDependency('net/jsloader_test.js', ['goog.net.jsloaderTest'], ['goog.array', 'goog.dom', 'goog.net.jsloader', 'goog.net.jsloader.ErrorCode', 'goog.testing.AsyncTestCase', 'goog.testing.jsunit']); goog.addDependency('net/jsonp.js', ['goog.net.Jsonp'], ['goog.Uri', 'goog.net.jsloader']); +goog.addDependency('net/jsonp_test.js', ['goog.net.JsonpTest'], ['goog.net.Jsonp', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.userAgent']); goog.addDependency('net/mockiframeio.js', ['goog.net.MockIFrameIo'], ['goog.events.EventTarget', 'goog.json', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.IframeIo']); goog.addDependency('net/multiiframeloadmonitor.js', ['goog.net.MultiIframeLoadMonitor'], ['goog.events', 'goog.net.IframeLoadMonitor']); +goog.addDependency('net/multiiframeloadmonitor_test.js', ['goog.net.MultiIframeLoadMonitorTest'], ['goog.dom', 'goog.net.IframeLoadMonitor', 'goog.net.MultiIframeLoadMonitor', 'goog.testing.AsyncTestCase', 'goog.testing.jsunit']); goog.addDependency('net/networkstatusmonitor.js', ['goog.net.NetworkStatusMonitor'], ['goog.events.Listenable']); -goog.addDependency('net/networktester.js', ['goog.net.NetworkTester'], ['goog.Timer', 'goog.Uri', 'goog.debug.Logger']); +goog.addDependency('net/networktester.js', ['goog.net.NetworkTester'], ['goog.Timer', 'goog.Uri', 'goog.log']); +goog.addDependency('net/networktester_test.js', ['goog.net.NetworkTesterTest'], ['goog.Uri', 'goog.net.NetworkTester', 'goog.testing.MockClock', 'goog.testing.jsunit']); goog.addDependency('net/testdata/jsloader_test1.js', ['goog.net.testdata.jsloader_test1'], []); goog.addDependency('net/testdata/jsloader_test2.js', ['goog.net.testdata.jsloader_test2'], []); goog.addDependency('net/testdata/jsloader_test3.js', ['goog.net.testdata.jsloader_test3'], []); goog.addDependency('net/testdata/jsloader_test4.js', ['goog.net.testdata.jsloader_test4'], []); goog.addDependency('net/tmpnetwork.js', ['goog.net.tmpnetwork'], ['goog.Uri', 'goog.net.ChannelDebug']); -goog.addDependency('net/websocket.js', ['goog.net.WebSocket', 'goog.net.WebSocket.ErrorEvent', 'goog.net.WebSocket.EventType', 'goog.net.WebSocket.MessageEvent'], ['goog.Timer', 'goog.asserts', 'goog.debug.Logger', 'goog.debug.entryPointRegistry', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget']); -goog.addDependency('net/wrapperxmlhttpfactory.js', ['goog.net.WrapperXmlHttpFactory'], ['goog.net.XmlHttpFactory']); -goog.addDependency('net/xhrio.js', ['goog.net.XhrIo', 'goog.net.XhrIo.ResponseType'], ['goog.Timer', 'goog.array', 'goog.debug.Logger', 'goog.debug.entryPointRegistry', 'goog.events.EventTarget', 'goog.json', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.HttpStatus', 'goog.net.XmlHttp', 'goog.object', 'goog.string', 'goog.structs', 'goog.structs.Map', 'goog.uri.utils', 'goog.userAgent']); -goog.addDependency('net/xhriopool.js', ['goog.net.XhrIoPool'], ['goog.net.XhrIo', 'goog.structs', 'goog.structs.PriorityPool']); -goog.addDependency('net/xhrmanager.js', ['goog.net.XhrManager', 'goog.net.XhrManager.Event', 'goog.net.XhrManager.Request'], ['goog.Disposable', 'goog.events', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.XhrIo', 'goog.net.XhrIoPool', 'goog.structs', 'goog.structs.Map']); -goog.addDependency('net/xmlhttp.js', ['goog.net.DefaultXmlHttpFactory', 'goog.net.XmlHttp', 'goog.net.XmlHttp.OptionType', 'goog.net.XmlHttp.ReadyState'], ['goog.net.WrapperXmlHttpFactory', 'goog.net.XmlHttpFactory']); -goog.addDependency('net/xmlhttpfactory.js', ['goog.net.XmlHttpFactory'], []); -goog.addDependency('net/xpc/crosspagechannel.js', ['goog.net.xpc.CrossPageChannel'], ['goog.Disposable', 'goog.Uri', 'goog.async.Deferred', 'goog.async.Delay', 'goog.dom', 'goog.events', 'goog.events.EventHandler', 'goog.json', 'goog.messaging.AbstractChannel', 'goog.net.xpc', 'goog.net.xpc.CrossPageChannelRole', 'goog.net.xpc.FrameElementMethodTransport', 'goog.net.xpc.IframePollingTransport', 'goog.net.xpc.IframeRelayTransport', 'goog.net.xpc.NativeMessagingTransport', 'goog.net.xpc.NixTransport', 'goog.net.xpc.Transport', 'goog.userAgent']); +goog.addDependency('net/websocket.js', ['goog.net.WebSocket', 'goog.net.WebSocket.ErrorEvent', 'goog.net.WebSocket.EventType', 'goog.net.WebSocket.MessageEvent'], ['goog.Timer', 'goog.asserts', 'goog.debug.entryPointRegistry', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.log']); +goog.addDependency('net/websocket_test.js', ['goog.net.WebSocketTest'], ['goog.debug.EntryPointMonitor', 'goog.debug.ErrorHandler', 'goog.debug.entryPointRegistry', 'goog.events', 'goog.functions', 'goog.net.WebSocket', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.recordFunction']); +goog.addDependency('net/wrapperxmlhttpfactory.js', ['goog.net.WrapperXmlHttpFactory'], ['goog.net.XhrLike', 'goog.net.XmlHttpFactory']); +goog.addDependency('net/xhrio.js', ['goog.net.XhrIo', 'goog.net.XhrIo.ResponseType'], ['goog.Timer', 'goog.array', 'goog.debug.entryPointRegistry', 'goog.events.EventTarget', 'goog.json', 'goog.log', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.HttpStatus', 'goog.net.XmlHttp', 'goog.object', 'goog.string', 'goog.structs', 'goog.structs.Map', 'goog.uri.utils', 'goog.userAgent']); +goog.addDependency('net/xhrio_test.js', ['goog.net.XhrIoTest'], ['goog.Uri', 'goog.debug.EntryPointMonitor', 'goog.debug.ErrorHandler', 'goog.debug.entryPointRegistry', 'goog.events', 'goog.functions', 'goog.net.EventType', 'goog.net.WrapperXmlHttpFactory', 'goog.net.XhrIo', 'goog.net.XmlHttp', 'goog.object', 'goog.string', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.net.XhrIo', 'goog.testing.recordFunction']); +goog.addDependency('net/xhriopool.js', ['goog.net.XhrIoPool'], ['goog.net.XhrIo', 'goog.structs.PriorityPool']); +goog.addDependency('net/xhrlike.js', ['goog.net.XhrLike'], []); +goog.addDependency('net/xhrmanager.js', ['goog.net.XhrManager', 'goog.net.XhrManager.Event', 'goog.net.XhrManager.Request'], ['goog.events', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.XhrIo', 'goog.net.XhrIoPool', 'goog.structs.Map']); +goog.addDependency('net/xhrmanager_test.js', ['goog.net.XhrManagerTest'], ['goog.events', 'goog.net.EventType', 'goog.net.XhrIo', 'goog.net.XhrManager', 'goog.testing.jsunit', 'goog.testing.net.XhrIoPool', 'goog.testing.recordFunction']); +goog.addDependency('net/xmlhttp.js', ['goog.net.DefaultXmlHttpFactory', 'goog.net.XmlHttp', 'goog.net.XmlHttp.OptionType', 'goog.net.XmlHttp.ReadyState', 'goog.net.XmlHttpDefines'], ['goog.asserts', 'goog.net.WrapperXmlHttpFactory', 'goog.net.XmlHttpFactory']); +goog.addDependency('net/xmlhttpfactory.js', ['goog.net.XmlHttpFactory'], ['goog.net.XhrLike']); +goog.addDependency('net/xpc/crosspagechannel.js', ['goog.net.xpc.CrossPageChannel'], ['goog.Uri', 'goog.async.Deferred', 'goog.async.Delay', 'goog.dispose', 'goog.dom', 'goog.events', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.json', 'goog.log', 'goog.messaging.AbstractChannel', 'goog.net.xpc', 'goog.net.xpc.CfgFields', 'goog.net.xpc.ChannelStates', 'goog.net.xpc.CrossPageChannelRole', 'goog.net.xpc.DirectTransport', 'goog.net.xpc.FrameElementMethodTransport', 'goog.net.xpc.IframePollingTransport', 'goog.net.xpc.IframeRelayTransport', 'goog.net.xpc.NativeMessagingTransport', 'goog.net.xpc.NixTransport', 'goog.net.xpc.TransportTypes', 'goog.net.xpc.UriCfgFields', 'goog.string', 'goog.uri.utils', 'goog.userAgent']); +goog.addDependency('net/xpc/crosspagechannel_test.js', ['goog.net.xpc.CrossPageChannelTest'], ['goog.Disposable', 'goog.Uri', 'goog.async.Deferred', 'goog.dom', 'goog.log', 'goog.log.Level', 'goog.net.xpc', 'goog.net.xpc.CfgFields', 'goog.net.xpc.CrossPageChannel', 'goog.net.xpc.CrossPageChannelRole', 'goog.net.xpc.TransportTypes', 'goog.object', 'goog.testing.AsyncTestCase', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit']); goog.addDependency('net/xpc/crosspagechannelrole.js', ['goog.net.xpc.CrossPageChannelRole'], []); -goog.addDependency('net/xpc/frameelementmethodtransport.js', ['goog.net.xpc.FrameElementMethodTransport'], ['goog.net.xpc', 'goog.net.xpc.CrossPageChannelRole', 'goog.net.xpc.Transport']); -goog.addDependency('net/xpc/iframepollingtransport.js', ['goog.net.xpc.IframePollingTransport', 'goog.net.xpc.IframePollingTransport.Receiver', 'goog.net.xpc.IframePollingTransport.Sender'], ['goog.array', 'goog.dom', 'goog.net.xpc', 'goog.net.xpc.CrossPageChannelRole', 'goog.net.xpc.Transport', 'goog.userAgent']); -goog.addDependency('net/xpc/iframerelaytransport.js', ['goog.net.xpc.IframeRelayTransport'], ['goog.dom', 'goog.events', 'goog.net.xpc', 'goog.net.xpc.Transport', 'goog.userAgent']); -goog.addDependency('net/xpc/nativemessagingtransport.js', ['goog.net.xpc.NativeMessagingTransport'], ['goog.Timer', 'goog.asserts', 'goog.async.Deferred', 'goog.events', 'goog.events.EventHandler', 'goog.net.xpc', 'goog.net.xpc.CrossPageChannelRole', 'goog.net.xpc.Transport']); -goog.addDependency('net/xpc/nixtransport.js', ['goog.net.xpc.NixTransport'], ['goog.net.xpc', 'goog.net.xpc.CrossPageChannelRole', 'goog.net.xpc.Transport', 'goog.reflect']); +goog.addDependency('net/xpc/directtransport.js', ['goog.net.xpc.DirectTransport'], ['goog.Timer', 'goog.async.Deferred', 'goog.events.EventHandler', 'goog.log', 'goog.net.xpc', 'goog.net.xpc.CfgFields', 'goog.net.xpc.CrossPageChannelRole', 'goog.net.xpc.Transport', 'goog.net.xpc.TransportTypes', 'goog.object']); +goog.addDependency('net/xpc/directtransport_test.js', ['goog.net.xpc.DirectTransportTest'], ['goog.dom', 'goog.log', 'goog.log.Level', 'goog.net.xpc', 'goog.net.xpc.CfgFields', 'goog.net.xpc.CrossPageChannel', 'goog.net.xpc.CrossPageChannelRole', 'goog.net.xpc.TransportTypes', 'goog.testing.AsyncTestCase', 'goog.testing.jsunit']); +goog.addDependency('net/xpc/frameelementmethodtransport.js', ['goog.net.xpc.FrameElementMethodTransport'], ['goog.log', 'goog.net.xpc', 'goog.net.xpc.CrossPageChannelRole', 'goog.net.xpc.Transport', 'goog.net.xpc.TransportTypes']); +goog.addDependency('net/xpc/iframepollingtransport.js', ['goog.net.xpc.IframePollingTransport', 'goog.net.xpc.IframePollingTransport.Receiver', 'goog.net.xpc.IframePollingTransport.Sender'], ['goog.array', 'goog.dom', 'goog.log', 'goog.log.Level', 'goog.net.xpc', 'goog.net.xpc.CfgFields', 'goog.net.xpc.CrossPageChannelRole', 'goog.net.xpc.Transport', 'goog.net.xpc.TransportTypes', 'goog.userAgent']); +goog.addDependency('net/xpc/iframepollingtransport_test.js', ['goog.net.xpc.IframePollingTransportTest'], ['goog.Timer', 'goog.dom', 'goog.dom.TagName', 'goog.functions', 'goog.net.xpc.CfgFields', 'goog.net.xpc.CrossPageChannel', 'goog.net.xpc.CrossPageChannelRole', 'goog.net.xpc.TransportTypes', 'goog.object', 'goog.testing.MockClock', 'goog.testing.jsunit', 'goog.testing.recordFunction']); +goog.addDependency('net/xpc/iframerelaytransport.js', ['goog.net.xpc.IframeRelayTransport'], ['goog.dom', 'goog.events', 'goog.log', 'goog.log.Level', 'goog.net.xpc', 'goog.net.xpc.CfgFields', 'goog.net.xpc.Transport', 'goog.net.xpc.TransportTypes', 'goog.string', 'goog.userAgent']); +goog.addDependency('net/xpc/nativemessagingtransport.js', ['goog.net.xpc.NativeMessagingTransport'], ['goog.Timer', 'goog.asserts', 'goog.async.Deferred', 'goog.events', 'goog.events.EventHandler', 'goog.log', 'goog.net.xpc', 'goog.net.xpc.CrossPageChannelRole', 'goog.net.xpc.Transport', 'goog.net.xpc.TransportTypes']); +goog.addDependency('net/xpc/nativemessagingtransport_test.js', ['goog.net.xpc.NativeMessagingTransportTest'], ['goog.dom', 'goog.events', 'goog.net.xpc', 'goog.net.xpc.CfgFields', 'goog.net.xpc.CrossPageChannel', 'goog.net.xpc.CrossPageChannelRole', 'goog.net.xpc.NativeMessagingTransport', 'goog.testing.jsunit']); +goog.addDependency('net/xpc/nixtransport.js', ['goog.net.xpc.NixTransport'], ['goog.log', 'goog.net.xpc', 'goog.net.xpc.CfgFields', 'goog.net.xpc.CrossPageChannelRole', 'goog.net.xpc.Transport', 'goog.net.xpc.TransportTypes', 'goog.reflect']); goog.addDependency('net/xpc/relay.js', ['goog.net.xpc.relay'], []); -goog.addDependency('net/xpc/transport.js', ['goog.net.xpc.Transport'], ['goog.Disposable', 'goog.dom', 'goog.net.xpc']); -goog.addDependency('net/xpc/xpc.js', ['goog.net.xpc', 'goog.net.xpc.CfgFields', 'goog.net.xpc.ChannelStates', 'goog.net.xpc.TransportNames', 'goog.net.xpc.TransportTypes', 'goog.net.xpc.UriCfgFields'], ['goog.debug.Logger']); +goog.addDependency('net/xpc/transport.js', ['goog.net.xpc.Transport'], ['goog.Disposable', 'goog.dom', 'goog.net.xpc.TransportNames']); +goog.addDependency('net/xpc/xpc.js', ['goog.net.xpc', 'goog.net.xpc.CfgFields', 'goog.net.xpc.ChannelStates', 'goog.net.xpc.TransportNames', 'goog.net.xpc.TransportTypes', 'goog.net.xpc.UriCfgFields'], ['goog.log']); goog.addDependency('object/object.js', ['goog.object'], []); +goog.addDependency('object/object_test.js', ['goog.objectTest'], ['goog.functions', 'goog.object', 'goog.testing.jsunit']); goog.addDependency('positioning/absoluteposition.js', ['goog.positioning.AbsolutePosition'], ['goog.math.Box', 'goog.math.Coordinate', 'goog.math.Size', 'goog.positioning', 'goog.positioning.AbstractPosition']); goog.addDependency('positioning/abstractposition.js', ['goog.positioning.AbstractPosition'], ['goog.math.Box', 'goog.math.Size', 'goog.positioning.Corner']); goog.addDependency('positioning/anchoredposition.js', ['goog.positioning.AnchoredPosition'], ['goog.math.Box', 'goog.positioning', 'goog.positioning.AbstractPosition']); +goog.addDependency('positioning/anchoredposition_test.js', ['goog.positioning.AnchoredPositionTest'], ['goog.dom', 'goog.positioning.AnchoredPosition', 'goog.positioning.Corner', 'goog.positioning.Overflow', 'goog.style', 'goog.testing.jsunit']); goog.addDependency('positioning/anchoredviewportposition.js', ['goog.positioning.AnchoredViewportPosition'], ['goog.math.Box', 'goog.positioning', 'goog.positioning.AnchoredPosition', 'goog.positioning.Corner', 'goog.positioning.Overflow', 'goog.positioning.OverflowStatus']); +goog.addDependency('positioning/anchoredviewportposition_test.js', ['goog.positioning.AnchoredViewportPositionTest'], ['goog.dom', 'goog.math.Box', 'goog.positioning.AnchoredViewportPosition', 'goog.positioning.Corner', 'goog.positioning.OverflowStatus', 'goog.style', 'goog.testing.jsunit']); goog.addDependency('positioning/clientposition.js', ['goog.positioning.ClientPosition'], ['goog.asserts', 'goog.math.Box', 'goog.math.Coordinate', 'goog.math.Size', 'goog.positioning', 'goog.positioning.AbstractPosition', 'goog.style']); goog.addDependency('positioning/clientposition_test.js', ['goog.positioning.clientPositionTest'], ['goog.dom', 'goog.positioning.ClientPosition', 'goog.style', 'goog.testing.jsunit']); goog.addDependency('positioning/menuanchoredposition.js', ['goog.positioning.MenuAnchoredPosition'], ['goog.math.Box', 'goog.math.Size', 'goog.positioning', 'goog.positioning.AnchoredViewportPosition', 'goog.positioning.Corner', 'goog.positioning.Overflow']); +goog.addDependency('positioning/menuanchoredposition_test.js', ['goog.positioning.MenuAnchoredPositionTest'], ['goog.dom', 'goog.positioning.Corner', 'goog.positioning.MenuAnchoredPosition', 'goog.testing.jsunit']); goog.addDependency('positioning/positioning.js', ['goog.positioning', 'goog.positioning.Corner', 'goog.positioning.CornerBit', 'goog.positioning.Overflow', 'goog.positioning.OverflowStatus'], ['goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.math.Box', 'goog.math.Coordinate', 'goog.math.Size', 'goog.style', 'goog.style.bidi']); goog.addDependency('positioning/positioning_test.js', ['goog.positioningTest'], ['goog.dom', 'goog.dom.DomHelper', 'goog.math.Box', 'goog.math.Coordinate', 'goog.math.Rect', 'goog.math.Size', 'goog.positioning', 'goog.positioning.Corner', 'goog.positioning.Overflow', 'goog.positioning.OverflowStatus', 'goog.style', 'goog.testing.ExpectedFailures', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgent.product']); goog.addDependency('positioning/viewportclientposition.js', ['goog.positioning.ViewportClientPosition'], ['goog.math.Box', 'goog.math.Coordinate', 'goog.math.Size', 'goog.positioning.ClientPosition']); +goog.addDependency('positioning/viewportclientposition_test.js', ['goog.positioning.ViewportClientPositionTest'], ['goog.dom', 'goog.positioning.Corner', 'goog.positioning.Overflow', 'goog.positioning.ViewportClientPosition', 'goog.style', 'goog.testing.jsunit', 'goog.userAgent']); goog.addDependency('positioning/viewportposition.js', ['goog.positioning.ViewportPosition'], ['goog.math.Box', 'goog.math.Coordinate', 'goog.math.Size', 'goog.positioning.AbstractPosition']); +goog.addDependency('promise/promise.js', ['goog.Promise'], ['goog.Thenable', 'goog.asserts', 'goog.async.run', 'goog.async.throwException', 'goog.debug.Error', 'goog.promise.Resolver']); +goog.addDependency('promise/promise_test.js', ['goog.PromiseTest'], ['goog.Promise', 'goog.Thenable', 'goog.functions', 'goog.testing.AsyncTestCase', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.recordFunction']); +goog.addDependency('promise/resolver.js', ['goog.promise.Resolver'], []); +goog.addDependency('promise/testsuiteadapter.js', ['goog.promise.testSuiteAdapter'], ['goog.Promise']); +goog.addDependency('promise/thenable.js', ['goog.Thenable'], []); goog.addDependency('proto/proto.js', ['goog.proto'], ['goog.proto.Serializer']); goog.addDependency('proto/serializer.js', ['goog.proto.Serializer'], ['goog.json.Serializer', 'goog.string']); -goog.addDependency('proto2/descriptor.js', ['goog.proto2.Descriptor', 'goog.proto2.Metadata'], ['goog.array', 'goog.object', 'goog.proto2.Util']); -goog.addDependency('proto2/fielddescriptor.js', ['goog.proto2.FieldDescriptor'], ['goog.proto2.Util', 'goog.string']); -goog.addDependency('proto2/lazydeserializer.js', ['goog.proto2.LazyDeserializer'], ['goog.proto2.Message', 'goog.proto2.Serializer', 'goog.proto2.Util']); -goog.addDependency('proto2/message.js', ['goog.proto2.Message'], ['goog.proto2.Descriptor', 'goog.proto2.FieldDescriptor', 'goog.proto2.Util', 'goog.string']); -goog.addDependency('proto2/objectserializer.js', ['goog.proto2.ObjectSerializer'], ['goog.proto2.Serializer', 'goog.proto2.Util', 'goog.string']); +goog.addDependency('proto/serializer_test.js', ['goog.protoTest'], ['goog.proto', 'goog.testing.jsunit']); +goog.addDependency('proto2/descriptor.js', ['goog.proto2.Descriptor', 'goog.proto2.Metadata'], ['goog.array', 'goog.asserts', 'goog.object', 'goog.string']); +goog.addDependency('proto2/descriptor_test.js', ['goog.proto2.DescriptorTest'], ['goog.proto2.Descriptor', 'goog.testing.jsunit']); +goog.addDependency('proto2/fielddescriptor.js', ['goog.proto2.FieldDescriptor'], ['goog.asserts', 'goog.string']); +goog.addDependency('proto2/fielddescriptor_test.js', ['goog.proto2.FieldDescriptorTest'], ['goog.proto2.FieldDescriptor', 'goog.proto2.Message', 'goog.testing.jsunit']); +goog.addDependency('proto2/lazydeserializer.js', ['goog.proto2.LazyDeserializer'], ['goog.asserts', 'goog.proto2.Message', 'goog.proto2.Serializer']); +goog.addDependency('proto2/message.js', ['goog.proto2.Message'], ['goog.asserts', 'goog.proto2.Descriptor', 'goog.proto2.FieldDescriptor']); +goog.addDependency('proto2/message_test.js', ['goog.proto2.MessageTest'], ['goog.testing.jsunit', 'proto2.TestAllTypes', 'proto2.TestAllTypes.NestedEnum', 'proto2.TestAllTypes.NestedMessage', 'proto2.TestAllTypes.OptionalGroup', 'proto2.TestAllTypes.RepeatedGroup']); +goog.addDependency('proto2/objectserializer.js', ['goog.proto2.ObjectSerializer'], ['goog.asserts', 'goog.proto2.Serializer', 'goog.string']); +goog.addDependency('proto2/objectserializer_test.js', ['goog.proto2.ObjectSerializerTest'], ['goog.proto2.ObjectSerializer', 'goog.proto2.Serializer', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'proto2.TestAllTypes']); goog.addDependency('proto2/package_test.pb.js', ['someprotopackage.TestPackageTypes'], ['goog.proto2.Message', 'proto2.TestAllTypes']); -goog.addDependency('proto2/pbliteserializer.js', ['goog.proto2.PbLiteSerializer'], ['goog.proto2.LazyDeserializer', 'goog.proto2.Util']); -goog.addDependency('proto2/serializer.js', ['goog.proto2.Serializer'], ['goog.proto2.Descriptor', 'goog.proto2.FieldDescriptor', 'goog.proto2.Message', 'goog.proto2.Util']); -goog.addDependency('proto2/test.pb.js', ['proto2.TestAllTypes', 'proto2.TestAllTypes.NestedEnum', 'proto2.TestAllTypes.NestedMessage', 'proto2.TestAllTypes.OptionalGroup', 'proto2.TestAllTypes.RepeatedGroup'], ['goog.proto2.Message']); -goog.addDependency('proto2/textformatserializer.js', ['goog.proto2.TextFormatSerializer', 'goog.proto2.TextFormatSerializer.Parser'], ['goog.array', 'goog.asserts', 'goog.json', 'goog.proto2.Serializer', 'goog.proto2.Util', 'goog.string']); -goog.addDependency('proto2/textformatserializer_test.js', ['goog.proto2.TextFormatSerializerTest'], ['goog.proto2.TextFormatSerializer', 'goog.testing.jsunit', 'proto2.TestAllTypes']); +goog.addDependency('proto2/pbliteserializer.js', ['goog.proto2.PbLiteSerializer'], ['goog.asserts', 'goog.proto2.FieldDescriptor', 'goog.proto2.LazyDeserializer', 'goog.proto2.Serializer']); +goog.addDependency('proto2/pbliteserializer_test.js', ['goog.proto2.PbLiteSerializerTest'], ['goog.proto2.PbLiteSerializer', 'goog.testing.jsunit', 'proto2.TestAllTypes']); +goog.addDependency('proto2/proto_test.js', ['goog.proto2.messageTest'], ['goog.proto2.FieldDescriptor', 'goog.testing.jsunit', 'proto2.TestAllTypes', 'someprotopackage.TestPackageTypes']); +goog.addDependency('proto2/serializer.js', ['goog.proto2.Serializer'], ['goog.asserts', 'goog.proto2.FieldDescriptor', 'goog.proto2.Message']); +goog.addDependency('proto2/test.pb.js', ['proto2.TestAllTypes', 'proto2.TestAllTypes.NestedEnum', 'proto2.TestAllTypes.NestedMessage', 'proto2.TestAllTypes.OptionalGroup', 'proto2.TestAllTypes.RepeatedGroup', 'proto2.TestDefaultChild', 'proto2.TestDefaultParent'], ['goog.proto2.Message']); +goog.addDependency('proto2/textformatserializer.js', ['goog.proto2.TextFormatSerializer'], ['goog.array', 'goog.asserts', 'goog.json', 'goog.math', 'goog.object', 'goog.proto2.FieldDescriptor', 'goog.proto2.Message', 'goog.proto2.Serializer', 'goog.string']); +goog.addDependency('proto2/textformatserializer_test.js', ['goog.proto2.TextFormatSerializerTest'], ['goog.proto2.ObjectSerializer', 'goog.proto2.TextFormatSerializer', 'goog.testing.jsunit', 'proto2.TestAllTypes']); goog.addDependency('proto2/util.js', ['goog.proto2.Util'], ['goog.asserts']); goog.addDependency('pubsub/pubsub.js', ['goog.pubsub.PubSub'], ['goog.Disposable', 'goog.array']); +goog.addDependency('pubsub/pubsub_test.js', ['goog.pubsub.PubSubTest'], ['goog.array', 'goog.pubsub.PubSub', 'goog.testing.jsunit']); +goog.addDependency('pubsub/topicid.js', ['goog.pubsub.TopicId'], []); +goog.addDependency('pubsub/typedpubsub.js', ['goog.pubsub.TypedPubSub'], ['goog.Disposable', 'goog.pubsub.PubSub']); +goog.addDependency('pubsub/typedpubsub_test.js', ['goog.pubsub.TypedPubSubTest'], ['goog.array', 'goog.pubsub.TopicId', 'goog.pubsub.TypedPubSub', 'goog.testing.jsunit']); goog.addDependency('reflect/reflect.js', ['goog.reflect'], []); goog.addDependency('result/deferredadaptor.js', ['goog.result.DeferredAdaptor'], ['goog.async.Deferred', 'goog.result', 'goog.result.Result']); goog.addDependency('result/dependentresult.js', ['goog.result.DependentResult'], ['goog.result.Result']); -goog.addDependency('result/result_interface.js', ['goog.result.Result'], []); +goog.addDependency('result/result_interface.js', ['goog.result.Result'], ['goog.Thenable']); goog.addDependency('result/resultutil.js', ['goog.result'], ['goog.array', 'goog.result.DependentResult', 'goog.result.Result', 'goog.result.SimpleResult']); -goog.addDependency('result/simpleresult.js', ['goog.result.SimpleResult', 'goog.result.SimpleResult.StateError'], ['goog.debug.Error', 'goog.result.Result']); -goog.addDependency('soy/data.js', ['goog.soy.data', 'goog.soy.data.SanitizedContent', 'goog.soy.data.SanitizedContentKind'], []); +goog.addDependency('result/simpleresult.js', ['goog.result.SimpleResult', 'goog.result.SimpleResult.StateError'], ['goog.Promise', 'goog.Thenable', 'goog.debug.Error', 'goog.result.Result']); +goog.addDependency('soy/data.js', ['goog.soy.data', 'goog.soy.data.SanitizedContent', 'goog.soy.data.SanitizedContentKind'], ['goog.html.SafeHtml', 'goog.html.uncheckedconversions', 'goog.string.Const']); +goog.addDependency('soy/data_test.js', ['goog.soy.dataTest'], ['goog.html.SafeHtml', 'goog.soy.testHelper', 'goog.testing.jsunit']); goog.addDependency('soy/renderer.js', ['goog.soy.InjectedDataSupplier', 'goog.soy.Renderer'], ['goog.asserts', 'goog.dom', 'goog.soy', 'goog.soy.data.SanitizedContent', 'goog.soy.data.SanitizedContentKind']); -goog.addDependency('soy/soy.js', ['goog.soy'], ['goog.asserts', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.soy.data', 'goog.string']); -goog.addDependency('soy/soy_test.js', ['goog.soy.testHelper'], ['goog.dom', 'goog.dom.TagName', 'goog.soy.data.SanitizedContent', 'goog.soy.data.SanitizedContentKind', 'goog.string', 'goog.userAgent']); +goog.addDependency('soy/renderer_test.js', ['goog.soy.RendererTest'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.html.SafeHtml', 'goog.i18n.bidi.Dir', 'goog.soy.Renderer', 'goog.soy.data.SanitizedContentKind', 'goog.soy.testHelper', 'goog.testing.jsunit', 'goog.testing.recordFunction']); +goog.addDependency('soy/soy.js', ['goog.soy'], ['goog.asserts', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.soy.data.SanitizedContent', 'goog.soy.data.SanitizedContentKind', 'goog.string']); +goog.addDependency('soy/soy_test.js', ['goog.soyTest'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.functions', 'goog.soy', 'goog.soy.testHelper', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit']); +goog.addDependency('soy/soy_testhelper.js', ['goog.soy.testHelper'], ['goog.dom', 'goog.dom.TagName', 'goog.i18n.bidi.Dir', 'goog.soy.data.SanitizedContent', 'goog.soy.data.SanitizedContentKind', 'goog.string', 'goog.userAgent']); goog.addDependency('spell/spellcheck.js', ['goog.spell.SpellCheck', 'goog.spell.SpellCheck.WordChangedEvent'], ['goog.Timer', 'goog.events.EventTarget', 'goog.structs.Set']); -goog.addDependency('stats/basicstat.js', ['goog.stats.BasicStat'], ['goog.array', 'goog.debug.Logger', 'goog.iter', 'goog.object', 'goog.string.format', 'goog.structs.CircularBuffer']); -goog.addDependency('storage/collectablestorage.js', ['goog.storage.CollectableStorage'], ['goog.array', 'goog.asserts', 'goog.iter', 'goog.storage.ErrorCode', 'goog.storage.ExpiringStorage', 'goog.storage.RichStorage.Wrapper', 'goog.storage.mechanism.IterableMechanism']); +goog.addDependency('spell/spellcheck_test.js', ['goog.spell.SpellCheckTest'], ['goog.spell.SpellCheck', 'goog.testing.jsunit']); +goog.addDependency('stats/basicstat.js', ['goog.stats.BasicStat'], ['goog.array', 'goog.iter', 'goog.log', 'goog.object', 'goog.string.format', 'goog.structs.CircularBuffer']); +goog.addDependency('stats/basicstat_test.js', ['goog.stats.BasicStatTest'], ['goog.array', 'goog.stats.BasicStat', 'goog.string.format', 'goog.testing.PseudoRandom', 'goog.testing.jsunit', 'goog.userAgent']); +goog.addDependency('storage/collectablestorage.js', ['goog.storage.CollectableStorage'], ['goog.array', 'goog.iter', 'goog.storage.ErrorCode', 'goog.storage.ExpiringStorage', 'goog.storage.RichStorage']); +goog.addDependency('storage/collectablestorage_test.js', ['goog.storage.CollectableStorageTest'], ['goog.storage.CollectableStorage', 'goog.storage.collectableStorageTester', 'goog.storage.storage_test', 'goog.testing.MockClock', 'goog.testing.jsunit', 'goog.testing.storage.FakeMechanism']); +goog.addDependency('storage/collectablestoragetester.js', ['goog.storage.collectableStorageTester'], ['goog.testing.asserts']); goog.addDependency('storage/encryptedstorage.js', ['goog.storage.EncryptedStorage'], ['goog.crypt', 'goog.crypt.Arc4', 'goog.crypt.Sha1', 'goog.crypt.base64', 'goog.json', 'goog.json.Serializer', 'goog.storage.CollectableStorage', 'goog.storage.ErrorCode', 'goog.storage.RichStorage', 'goog.storage.RichStorage.Wrapper', 'goog.storage.mechanism.IterableMechanism']); +goog.addDependency('storage/encryptedstorage_test.js', ['goog.storage.EncryptedStorageTest'], ['goog.json', 'goog.storage.EncryptedStorage', 'goog.storage.ErrorCode', 'goog.storage.RichStorage', 'goog.storage.collectableStorageTester', 'goog.storage.storage_test', 'goog.testing.MockClock', 'goog.testing.PseudoRandom', 'goog.testing.jsunit', 'goog.testing.storage.FakeMechanism']); goog.addDependency('storage/errorcode.js', ['goog.storage.ErrorCode'], []); goog.addDependency('storage/expiringstorage.js', ['goog.storage.ExpiringStorage'], ['goog.storage.RichStorage', 'goog.storage.RichStorage.Wrapper', 'goog.storage.mechanism.Mechanism']); +goog.addDependency('storage/expiringstorage_test.js', ['goog.storage.ExpiringStorageTest'], ['goog.storage.ExpiringStorage', 'goog.storage.storage_test', 'goog.testing.MockClock', 'goog.testing.jsunit', 'goog.testing.storage.FakeMechanism']); goog.addDependency('storage/mechanism/errorcode.js', ['goog.storage.mechanism.ErrorCode'], []); goog.addDependency('storage/mechanism/errorhandlingmechanism.js', ['goog.storage.mechanism.ErrorHandlingMechanism'], ['goog.storage.mechanism.Mechanism']); +goog.addDependency('storage/mechanism/errorhandlingmechanism_test.js', ['goog.storage.mechanism.ErrorHandlingMechanismTest'], ['goog.storage.mechanism.ErrorHandlingMechanism', 'goog.testing.jsunit', 'goog.testing.recordFunction']); goog.addDependency('storage/mechanism/html5localstorage.js', ['goog.storage.mechanism.HTML5LocalStorage'], ['goog.storage.mechanism.HTML5WebStorage']); +goog.addDependency('storage/mechanism/html5localstorage_test.js', ['goog.storage.mechanism.HTML5LocalStorageTest'], ['goog.storage.mechanism.HTML5LocalStorage', 'goog.storage.mechanism.mechanismSeparationTester', 'goog.storage.mechanism.mechanismSharingTester', 'goog.testing.jsunit', 'goog.userAgent']); goog.addDependency('storage/mechanism/html5sessionstorage.js', ['goog.storage.mechanism.HTML5SessionStorage'], ['goog.storage.mechanism.HTML5WebStorage']); +goog.addDependency('storage/mechanism/html5sessionstorage_test.js', ['goog.storage.mechanism.HTML5SessionStorageTest'], ['goog.storage.mechanism.HTML5SessionStorage', 'goog.storage.mechanism.mechanismSeparationTester', 'goog.storage.mechanism.mechanismSharingTester', 'goog.testing.jsunit', 'goog.userAgent']); goog.addDependency('storage/mechanism/html5webstorage.js', ['goog.storage.mechanism.HTML5WebStorage'], ['goog.asserts', 'goog.iter.Iterator', 'goog.iter.StopIteration', 'goog.storage.mechanism.ErrorCode', 'goog.storage.mechanism.IterableMechanism']); +goog.addDependency('storage/mechanism/html5webstorage_test.js', ['goog.storage.mechanism.HTML5MockStorage', 'goog.storage.mechanism.HTML5WebStorageTest', 'goog.storage.mechanism.MockThrowableStorage'], ['goog.storage.mechanism.ErrorCode', 'goog.storage.mechanism.HTML5WebStorage', 'goog.testing.jsunit']); goog.addDependency('storage/mechanism/ieuserdata.js', ['goog.storage.mechanism.IEUserData'], ['goog.asserts', 'goog.iter.Iterator', 'goog.iter.StopIteration', 'goog.storage.mechanism.ErrorCode', 'goog.storage.mechanism.IterableMechanism', 'goog.structs.Map', 'goog.userAgent']); +goog.addDependency('storage/mechanism/ieuserdata_test.js', ['goog.storage.mechanism.IEUserDataTest'], ['goog.storage.mechanism.IEUserData', 'goog.storage.mechanism.mechanismSeparationTester', 'goog.storage.mechanism.mechanismSharingTester', 'goog.testing.jsunit', 'goog.userAgent']); goog.addDependency('storage/mechanism/iterablemechanism.js', ['goog.storage.mechanism.IterableMechanism'], ['goog.array', 'goog.asserts', 'goog.iter', 'goog.iter.Iterator', 'goog.storage.mechanism.Mechanism']); goog.addDependency('storage/mechanism/iterablemechanismtester.js', ['goog.storage.mechanism.iterableMechanismTester'], ['goog.iter.Iterator', 'goog.storage.mechanism.IterableMechanism', 'goog.testing.asserts']); goog.addDependency('storage/mechanism/mechanism.js', ['goog.storage.mechanism.Mechanism'], []); goog.addDependency('storage/mechanism/mechanismfactory.js', ['goog.storage.mechanism.mechanismfactory'], ['goog.storage.mechanism.HTML5LocalStorage', 'goog.storage.mechanism.HTML5SessionStorage', 'goog.storage.mechanism.IEUserData', 'goog.storage.mechanism.IterableMechanism', 'goog.storage.mechanism.PrefixedMechanism']); +goog.addDependency('storage/mechanism/mechanismfactory_test.js', ['goog.storage.mechanism.mechanismfactoryTest'], ['goog.storage.mechanism.mechanismfactory', 'goog.testing.jsunit']); goog.addDependency('storage/mechanism/mechanismseparationtester.js', ['goog.storage.mechanism.mechanismSeparationTester'], ['goog.iter.Iterator', 'goog.storage.mechanism.IterableMechanism', 'goog.testing.asserts']); goog.addDependency('storage/mechanism/mechanismsharingtester.js', ['goog.storage.mechanism.mechanismSharingTester'], ['goog.iter.Iterator', 'goog.storage.mechanism.IterableMechanism', 'goog.testing.asserts']); goog.addDependency('storage/mechanism/mechanismtester.js', ['goog.storage.mechanism.mechanismTester'], ['goog.storage.mechanism.ErrorCode', 'goog.storage.mechanism.HTML5LocalStorage', 'goog.storage.mechanism.Mechanism', 'goog.testing.asserts', 'goog.userAgent.product', 'goog.userAgent.product.isVersion']); goog.addDependency('storage/mechanism/prefixedmechanism.js', ['goog.storage.mechanism.PrefixedMechanism'], ['goog.iter.Iterator', 'goog.storage.mechanism.IterableMechanism']); +goog.addDependency('storage/mechanism/prefixedmechanism_test.js', ['goog.storage.mechanism.PrefixedMechanismTest'], ['goog.storage.mechanism.HTML5LocalStorage', 'goog.storage.mechanism.PrefixedMechanism', 'goog.storage.mechanism.mechanismSeparationTester', 'goog.storage.mechanism.mechanismSharingTester', 'goog.testing.jsunit']); goog.addDependency('storage/richstorage.js', ['goog.storage.RichStorage', 'goog.storage.RichStorage.Wrapper'], ['goog.storage.ErrorCode', 'goog.storage.Storage', 'goog.storage.mechanism.Mechanism']); -goog.addDependency('storage/storage.js', ['goog.storage.Storage'], ['goog.json', 'goog.json.Serializer', 'goog.storage.ErrorCode']); +goog.addDependency('storage/richstorage_test.js', ['goog.storage.RichStorageTest'], ['goog.storage.ErrorCode', 'goog.storage.RichStorage', 'goog.storage.storage_test', 'goog.testing.jsunit', 'goog.testing.storage.FakeMechanism']); +goog.addDependency('storage/storage.js', ['goog.storage.Storage'], ['goog.json', 'goog.storage.ErrorCode']); goog.addDependency('storage/storage_test.js', ['goog.storage.storage_test'], ['goog.storage.Storage', 'goog.structs.Map', 'goog.testing.asserts']); +goog.addDependency('string/const.js', ['goog.string.Const'], ['goog.asserts', 'goog.string.TypedString']); +goog.addDependency('string/const_test.js', ['goog.string.constTest'], ['goog.string.Const', 'goog.testing.jsunit']); goog.addDependency('string/linkify.js', ['goog.string.linkify'], ['goog.string']); +goog.addDependency('string/linkify_test.js', ['goog.string.linkifyTest'], ['goog.string', 'goog.string.linkify', 'goog.testing.dom', 'goog.testing.jsunit']); goog.addDependency('string/newlines.js', ['goog.string.newlines', 'goog.string.newlines.Line'], ['goog.array']); goog.addDependency('string/newlines_test.js', ['goog.string.newlinesTest'], ['goog.string.newlines', 'goog.testing.jsunit']); goog.addDependency('string/parser.js', ['goog.string.Parser'], []); goog.addDependency('string/path.js', ['goog.string.path'], ['goog.array', 'goog.string']); +goog.addDependency('string/path_test.js', ['goog.string.pathTest'], ['goog.string.path', 'goog.testing.jsunit']); goog.addDependency('string/string.js', ['goog.string', 'goog.string.Unicode'], []); -goog.addDependency('string/string_test.js', ['goog.stringTest'], ['goog.functions', 'goog.object', 'goog.string', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit']); +goog.addDependency('string/string_test.js', ['goog.stringTest'], ['goog.functions', 'goog.object', 'goog.string', 'goog.string.Unicode', 'goog.testing.MockControl', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit']); goog.addDependency('string/stringbuffer.js', ['goog.string.StringBuffer'], []); +goog.addDependency('string/stringbuffer_test.js', ['goog.string.StringBufferTest'], ['goog.string.StringBuffer', 'goog.testing.jsunit']); goog.addDependency('string/stringformat.js', ['goog.string.format'], ['goog.string']); +goog.addDependency('string/stringformat_test.js', ['goog.string.formatTest'], ['goog.string.format', 'goog.testing.jsunit']); goog.addDependency('string/stringifier.js', ['goog.string.Stringifier'], []); +goog.addDependency('string/typedstring.js', ['goog.string.TypedString'], []); goog.addDependency('structs/avltree.js', ['goog.structs.AvlTree', 'goog.structs.AvlTree.Node'], ['goog.structs.Collection']); +goog.addDependency('structs/avltree_test.js', ['goog.structs.AvlTreeTest'], ['goog.array', 'goog.structs.AvlTree', 'goog.testing.jsunit']); goog.addDependency('structs/circularbuffer.js', ['goog.structs.CircularBuffer'], []); +goog.addDependency('structs/circularbuffer_test.js', ['goog.structs.CircularBufferTest'], ['goog.structs.CircularBuffer', 'goog.testing.jsunit']); goog.addDependency('structs/collection.js', ['goog.structs.Collection'], []); +goog.addDependency('structs/collection_test.js', ['goog.structs.CollectionTest'], ['goog.structs.AvlTree', 'goog.structs.Set', 'goog.testing.jsunit']); goog.addDependency('structs/heap.js', ['goog.structs.Heap'], ['goog.array', 'goog.object', 'goog.structs.Node']); +goog.addDependency('structs/heap_test.js', ['goog.structs.HeapTest'], ['goog.structs', 'goog.structs.Heap', 'goog.testing.jsunit']); goog.addDependency('structs/inversionmap.js', ['goog.structs.InversionMap'], ['goog.array']); +goog.addDependency('structs/inversionmap_test.js', ['goog.structs.InversionMapTest'], ['goog.structs.InversionMap', 'goog.testing.jsunit']); goog.addDependency('structs/linkedmap.js', ['goog.structs.LinkedMap'], ['goog.structs.Map']); +goog.addDependency('structs/linkedmap_test.js', ['goog.structs.LinkedMapTest'], ['goog.structs.LinkedMap', 'goog.testing.jsunit', 'goog.testing.recordFunction']); goog.addDependency('structs/map.js', ['goog.structs.Map'], ['goog.iter.Iterator', 'goog.iter.StopIteration', 'goog.object']); +goog.addDependency('structs/map_test.js', ['goog.structs.MapTest'], ['goog.iter', 'goog.structs', 'goog.structs.Map', 'goog.testing.jsunit']); goog.addDependency('structs/node.js', ['goog.structs.Node'], []); goog.addDependency('structs/pool.js', ['goog.structs.Pool'], ['goog.Disposable', 'goog.structs.Queue', 'goog.structs.Set']); +goog.addDependency('structs/pool_test.js', ['goog.structs.PoolTest'], ['goog.structs.Pool', 'goog.testing.MockClock', 'goog.testing.jsunit']); goog.addDependency('structs/prioritypool.js', ['goog.structs.PriorityPool'], ['goog.structs.Pool', 'goog.structs.PriorityQueue']); +goog.addDependency('structs/prioritypool_test.js', ['goog.structs.PriorityPoolTest'], ['goog.structs.PriorityPool', 'goog.testing.MockClock', 'goog.testing.jsunit']); goog.addDependency('structs/priorityqueue.js', ['goog.structs.PriorityQueue'], ['goog.structs.Heap']); +goog.addDependency('structs/priorityqueue_test.js', ['goog.structs.PriorityQueueTest'], ['goog.structs', 'goog.structs.PriorityQueue', 'goog.testing.jsunit']); goog.addDependency('structs/quadtree.js', ['goog.structs.QuadTree', 'goog.structs.QuadTree.Node', 'goog.structs.QuadTree.Point'], ['goog.math.Coordinate']); +goog.addDependency('structs/quadtree_test.js', ['goog.structs.QuadTreeTest'], ['goog.structs', 'goog.structs.QuadTree', 'goog.testing.jsunit']); goog.addDependency('structs/queue.js', ['goog.structs.Queue'], ['goog.array']); +goog.addDependency('structs/queue_test.js', ['goog.structs.QueueTest'], ['goog.structs.Queue', 'goog.testing.jsunit']); goog.addDependency('structs/set.js', ['goog.structs.Set'], ['goog.structs', 'goog.structs.Collection', 'goog.structs.Map']); +goog.addDependency('structs/set_test.js', ['goog.structs.SetTest'], ['goog.iter', 'goog.structs', 'goog.structs.Set', 'goog.testing.jsunit']); goog.addDependency('structs/simplepool.js', ['goog.structs.SimplePool'], ['goog.Disposable']); -goog.addDependency('structs/stringset.js', ['goog.structs.StringSet'], ['goog.iter']); +goog.addDependency('structs/stringset.js', ['goog.structs.StringSet'], ['goog.asserts', 'goog.iter']); +goog.addDependency('structs/stringset_test.js', ['goog.structs.StringSetTest'], ['goog.array', 'goog.iter', 'goog.structs.StringSet', 'goog.testing.asserts', 'goog.testing.jsunit']); goog.addDependency('structs/structs.js', ['goog.structs'], ['goog.array', 'goog.object']); +goog.addDependency('structs/structs_test.js', ['goog.structsTest'], ['goog.array', 'goog.structs', 'goog.structs.Map', 'goog.structs.Set', 'goog.testing.jsunit']); goog.addDependency('structs/treenode.js', ['goog.structs.TreeNode'], ['goog.array', 'goog.asserts', 'goog.structs.Node']); +goog.addDependency('structs/treenode_test.js', ['goog.structs.TreeNodeTest'], ['goog.structs.TreeNode', 'goog.testing.jsunit']); goog.addDependency('structs/trie.js', ['goog.structs.Trie'], ['goog.object', 'goog.structs']); +goog.addDependency('structs/trie_test.js', ['goog.structs.TrieTest'], ['goog.object', 'goog.structs', 'goog.structs.Trie', 'goog.testing.jsunit']); goog.addDependency('style/bidi.js', ['goog.style.bidi'], ['goog.dom', 'goog.style', 'goog.userAgent']); +goog.addDependency('style/bidi_test.js', ['goog.style.bidiTest'], ['goog.dom', 'goog.style', 'goog.style.bidi', 'goog.testing.jsunit', 'goog.userAgent']); goog.addDependency('style/cursor.js', ['goog.style.cursor'], ['goog.userAgent']); +goog.addDependency('style/cursor_test.js', ['goog.style.cursorTest'], ['goog.style.cursor', 'goog.testing.jsunit', 'goog.userAgent']); goog.addDependency('style/style.js', ['goog.style'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.vendor', 'goog.math.Box', 'goog.math.Coordinate', 'goog.math.Rect', 'goog.math.Size', 'goog.object', 'goog.string', 'goog.userAgent']); -goog.addDependency('style/style_test.js', ['goog.style_test'], ['goog.array', 'goog.color', 'goog.dom', 'goog.events.BrowserEvent', 'goog.math.Box', 'goog.math.Coordinate', 'goog.math.Rect', 'goog.math.Size', 'goog.object', 'goog.string', 'goog.style', 'goog.testing.ExpectedFailures', 'goog.testing.PropertyReplacer', 'goog.testing.asserts', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgent.product', 'goog.userAgent.product.isVersion']); +goog.addDependency('style/style_test.js', ['goog.style_test'], ['goog.array', 'goog.color', 'goog.dom', 'goog.events.BrowserEvent', 'goog.labs.userAgent.util', 'goog.math.Box', 'goog.math.Coordinate', 'goog.math.Rect', 'goog.math.Size', 'goog.object', 'goog.string', 'goog.style', 'goog.testing.ExpectedFailures', 'goog.testing.MockUserAgent', 'goog.testing.asserts', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgent.product', 'goog.userAgent.product.isVersion', 'goog.userAgentTestUtil', 'goog.userAgentTestUtil.UserAgents']); +goog.addDependency('style/style_webkit_scrollbars_test.js', ['goog.style.webkitScrollbarsTest'], ['goog.asserts', 'goog.style', 'goog.styleScrollbarTester', 'goog.testing.ExpectedFailures', 'goog.testing.jsunit', 'goog.userAgent']); goog.addDependency('style/stylescrollbartester.js', ['goog.styleScrollbarTester'], ['goog.dom', 'goog.style', 'goog.testing.asserts']); -goog.addDependency('style/transition.js', ['goog.style.transition', 'goog.style.transition.Css3Property'], ['goog.array', 'goog.asserts', 'goog.dom.vendor', 'goog.style', 'goog.userAgent']); +goog.addDependency('style/transform.js', ['goog.style.transform'], ['goog.functions', 'goog.math.Coordinate', 'goog.style', 'goog.userAgent', 'goog.userAgent.product.isVersion']); +goog.addDependency('style/transform_test.js', ['goog.style.transformTest'], ['goog.dom', 'goog.style.transform', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgent.product.isVersion']); +goog.addDependency('style/transition.js', ['goog.style.transition', 'goog.style.transition.Css3Property'], ['goog.array', 'goog.asserts', 'goog.dom.vendor', 'goog.functions', 'goog.style', 'goog.userAgent']); +goog.addDependency('style/transition_test.js', ['goog.style.transitionTest'], ['goog.style', 'goog.style.transition', 'goog.testing.jsunit', 'goog.userAgent']); goog.addDependency('testing/asserts.js', ['goog.testing.JsUnitException', 'goog.testing.asserts'], ['goog.testing.stacktrace']); +goog.addDependency('testing/asserts_test.js', ['goog.testing.assertsTest'], ['goog.array', 'goog.dom', 'goog.iter.Iterator', 'goog.iter.StopIteration', 'goog.structs.Map', 'goog.structs.Set', 'goog.testing.asserts', 'goog.testing.jsunit', 'goog.userAgent']); goog.addDependency('testing/async/mockcontrol.js', ['goog.testing.async.MockControl'], ['goog.asserts', 'goog.async.Deferred', 'goog.debug', 'goog.testing.asserts', 'goog.testing.mockmatchers.IgnoreArgument']); +goog.addDependency('testing/async/mockcontrol_test.js', ['goog.testing.async.MockControlTest'], ['goog.async.Deferred', 'goog.testing.MockControl', 'goog.testing.asserts', 'goog.testing.async.MockControl', 'goog.testing.jsunit']); goog.addDependency('testing/asynctestcase.js', ['goog.testing.AsyncTestCase', 'goog.testing.AsyncTestCase.ControlBreakingException'], ['goog.testing.TestCase', 'goog.testing.TestCase.Test', 'goog.testing.asserts']); +goog.addDependency('testing/asynctestcase_async_test.js', ['goog.testing.AsyncTestCaseAsyncTest'], ['goog.testing.AsyncTestCase', 'goog.testing.jsunit']); +goog.addDependency('testing/asynctestcase_noasync_test.js', ['goog.testing.AsyncTestCaseSyncTest'], ['goog.testing.AsyncTestCase', 'goog.testing.jsunit']); +goog.addDependency('testing/asynctestcase_test.js', ['goog.testing.AsyncTestCaseTest'], ['goog.debug.Error', 'goog.testing.AsyncTestCase', 'goog.testing.asserts', 'goog.testing.jsunit']); goog.addDependency('testing/benchmark.js', ['goog.testing.benchmark'], ['goog.dom', 'goog.dom.TagName', 'goog.testing.PerformanceTable', 'goog.testing.PerformanceTimer', 'goog.testing.TestCase']); goog.addDependency('testing/continuationtestcase.js', ['goog.testing.ContinuationTestCase', 'goog.testing.ContinuationTestCase.Step', 'goog.testing.ContinuationTestCase.Test'], ['goog.array', 'goog.events.EventHandler', 'goog.testing.TestCase', 'goog.testing.TestCase.Test', 'goog.testing.asserts']); +goog.addDependency('testing/continuationtestcase_test.js', ['goog.testing.ContinuationTestCaseTest'], ['goog.events', 'goog.events.EventTarget', 'goog.testing.ContinuationTestCase', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.TestCase', 'goog.testing.jsunit']); goog.addDependency('testing/deferredtestcase.js', ['goog.testing.DeferredTestCase'], ['goog.async.Deferred', 'goog.testing.AsyncTestCase', 'goog.testing.TestCase']); -goog.addDependency('testing/dom.js', ['goog.testing.dom'], ['goog.dom', 'goog.dom.NodeIterator', 'goog.dom.NodeType', 'goog.dom.TagIterator', 'goog.dom.TagName', 'goog.dom.classes', 'goog.iter', 'goog.object', 'goog.string', 'goog.style', 'goog.testing.asserts', 'goog.userAgent']); +goog.addDependency('testing/deferredtestcase_test.js', ['goog.testing.DeferredTestCaseTest'], ['goog.async.Deferred', 'goog.testing.DeferredTestCase', 'goog.testing.TestCase', 'goog.testing.TestRunner', 'goog.testing.jsunit', 'goog.testing.recordFunction']); +goog.addDependency('testing/dom.js', ['goog.testing.dom'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.NodeIterator', 'goog.dom.NodeType', 'goog.dom.TagIterator', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.iter', 'goog.object', 'goog.string', 'goog.style', 'goog.testing.asserts', 'goog.userAgent']); +goog.addDependency('testing/dom_test.js', ['goog.testing.domTest'], ['goog.dom', 'goog.dom.TagName', 'goog.testing.dom', 'goog.testing.jsunit', 'goog.userAgent']); goog.addDependency('testing/editor/dom.js', ['goog.testing.editor.dom'], ['goog.dom.NodeType', 'goog.dom.TagIterator', 'goog.dom.TagWalkType', 'goog.iter', 'goog.string', 'goog.testing.asserts']); +goog.addDependency('testing/editor/dom_test.js', ['goog.testing.editor.domTest'], ['goog.dom', 'goog.dom.TagName', 'goog.functions', 'goog.testing.editor.dom', 'goog.testing.jsunit']); goog.addDependency('testing/editor/fieldmock.js', ['goog.testing.editor.FieldMock'], ['goog.dom', 'goog.dom.Range', 'goog.editor.Field', 'goog.testing.LooseMock', 'goog.testing.mockmatchers']); goog.addDependency('testing/editor/testhelper.js', ['goog.testing.editor.TestHelper'], ['goog.Disposable', 'goog.dom', 'goog.dom.Range', 'goog.editor.BrowserFeature', 'goog.editor.node', 'goog.editor.plugins.AbstractBubblePlugin', 'goog.testing.dom']); +goog.addDependency('testing/editor/testhelper_test.js', ['goog.testing.editor.TestHelperTest'], ['goog.dom', 'goog.dom.TagName', 'goog.editor.node', 'goog.testing.editor.TestHelper', 'goog.testing.jsunit', 'goog.userAgent']); goog.addDependency('testing/events/eventobserver.js', ['goog.testing.events.EventObserver'], ['goog.array']); +goog.addDependency('testing/events/eventobserver_test.js', ['goog.testing.events.EventObserverTest'], ['goog.array', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.testing.events.EventObserver', 'goog.testing.jsunit']); goog.addDependency('testing/events/events.js', ['goog.testing.events', 'goog.testing.events.Event'], ['goog.Disposable', 'goog.asserts', 'goog.dom.NodeType', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.BrowserFeature', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.object', 'goog.style', 'goog.userAgent']); +goog.addDependency('testing/events/events_test.js', ['goog.testing.eventsTest'], ['goog.array', 'goog.dom', 'goog.events', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.math.Coordinate', 'goog.string', 'goog.style', 'goog.testing.PropertyReplacer', 'goog.testing.events', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.userAgent']); goog.addDependency('testing/events/matchers.js', ['goog.testing.events.EventMatcher'], ['goog.events.Event', 'goog.testing.mockmatchers.ArgumentMatcher']); +goog.addDependency('testing/events/matchers_test.js', ['goog.testing.events.EventMatcherTest'], ['goog.events.Event', 'goog.testing.events.EventMatcher', 'goog.testing.jsunit']); goog.addDependency('testing/events/onlinehandler.js', ['goog.testing.events.OnlineHandler'], ['goog.events.EventTarget', 'goog.net.NetworkStatusMonitor']); -goog.addDependency('testing/expectedfailures.js', ['goog.testing.ExpectedFailures'], ['goog.debug.DivConsole', 'goog.debug.Logger', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.EventType', 'goog.style', 'goog.testing.JsUnitException', 'goog.testing.TestCase', 'goog.testing.asserts']); +goog.addDependency('testing/events/onlinehandler_test.js', ['goog.testing.events.OnlineHandlerTest'], ['goog.events', 'goog.net.NetworkStatusMonitor', 'goog.testing.events.EventObserver', 'goog.testing.events.OnlineHandler', 'goog.testing.jsunit']); +goog.addDependency('testing/expectedfailures.js', ['goog.testing.ExpectedFailures'], ['goog.debug.DivConsole', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.EventType', 'goog.log', 'goog.style', 'goog.testing.JsUnitException', 'goog.testing.TestCase', 'goog.testing.asserts']); +goog.addDependency('testing/expectedfailures_test.js', ['goog.testing.ExpectedFailuresTest'], ['goog.debug.Logger', 'goog.testing.ExpectedFailures', 'goog.testing.JsUnitException', 'goog.testing.jsunit']); goog.addDependency('testing/fs/blob.js', ['goog.testing.fs.Blob'], ['goog.crypt.base64']); +goog.addDependency('testing/fs/blob_test.js', ['goog.testing.fs.BlobTest'], ['goog.testing.fs.Blob', 'goog.testing.jsunit']); +goog.addDependency('testing/fs/directoryentry_test.js', ['goog.testing.fs.DirectoryEntryTest'], ['goog.array', 'goog.fs.DirectoryEntry', 'goog.fs.Error', 'goog.testing.AsyncTestCase', 'goog.testing.MockClock', 'goog.testing.fs.FileSystem', 'goog.testing.jsunit']); goog.addDependency('testing/fs/entry.js', ['goog.testing.fs.DirectoryEntry', 'goog.testing.fs.Entry', 'goog.testing.fs.FileEntry'], ['goog.Timer', 'goog.array', 'goog.asserts', 'goog.async.Deferred', 'goog.fs.DirectoryEntry', 'goog.fs.DirectoryEntryImpl', 'goog.fs.Entry', 'goog.fs.Error', 'goog.fs.FileEntry', 'goog.functions', 'goog.object', 'goog.string', 'goog.testing.fs.File', 'goog.testing.fs.FileWriter']); +goog.addDependency('testing/fs/entry_test.js', ['goog.testing.fs.EntryTest'], ['goog.fs.DirectoryEntry', 'goog.fs.Error', 'goog.testing.AsyncTestCase', 'goog.testing.MockClock', 'goog.testing.fs.FileSystem', 'goog.testing.jsunit']); goog.addDependency('testing/fs/file.js', ['goog.testing.fs.File'], ['goog.testing.fs.Blob']); -goog.addDependency('testing/fs/filereader.js', ['goog.testing.fs.FileReader'], ['goog.Timer', 'goog.events.EventTarget', 'goog.fs.Error', 'goog.fs.FileReader.EventType', 'goog.fs.FileReader.ReadyState', 'goog.testing.fs.File', 'goog.testing.fs.ProgressEvent']); +goog.addDependency('testing/fs/fileentry_test.js', ['goog.testing.fs.FileEntryTest'], ['goog.testing.AsyncTestCase', 'goog.testing.MockClock', 'goog.testing.fs.FileEntry', 'goog.testing.fs.FileSystem', 'goog.testing.jsunit']); +goog.addDependency('testing/fs/filereader.js', ['goog.testing.fs.FileReader'], ['goog.Timer', 'goog.events.EventTarget', 'goog.fs.Error', 'goog.fs.FileReader', 'goog.testing.fs.ProgressEvent']); +goog.addDependency('testing/fs/filereader_test.js', ['goog.testing.fs.FileReaderTest'], ['goog.Timer', 'goog.async.Deferred', 'goog.events', 'goog.fs.Error', 'goog.fs.FileReader', 'goog.fs.FileSaver', 'goog.testing.AsyncTestCase', 'goog.testing.fs.FileReader', 'goog.testing.fs.FileSystem', 'goog.testing.jsunit']); goog.addDependency('testing/fs/filesystem.js', ['goog.testing.fs.FileSystem'], ['goog.fs.FileSystem', 'goog.testing.fs.DirectoryEntry']); -goog.addDependency('testing/fs/filewriter.js', ['goog.testing.fs.FileWriter'], ['goog.Timer', 'goog.events.Event', 'goog.events.EventTarget', 'goog.fs.Error', 'goog.fs.FileSaver.EventType', 'goog.fs.FileSaver.ReadyState', 'goog.string', 'goog.testing.fs.File', 'goog.testing.fs.ProgressEvent']); +goog.addDependency('testing/fs/filewriter.js', ['goog.testing.fs.FileWriter'], ['goog.Timer', 'goog.events.EventTarget', 'goog.fs.Error', 'goog.fs.FileSaver', 'goog.string', 'goog.testing.fs.ProgressEvent']); +goog.addDependency('testing/fs/filewriter_test.js', ['goog.testing.fs.FileWriterTest'], ['goog.async.Deferred', 'goog.events', 'goog.fs.Error', 'goog.fs.FileSaver', 'goog.testing.AsyncTestCase', 'goog.testing.MockClock', 'goog.testing.fs.Blob', 'goog.testing.fs.FileSystem', 'goog.testing.jsunit']); goog.addDependency('testing/fs/fs.js', ['goog.testing.fs'], ['goog.Timer', 'goog.array', 'goog.async.Deferred', 'goog.fs', 'goog.testing.fs.Blob', 'goog.testing.fs.FileSystem']); +goog.addDependency('testing/fs/fs_test.js', ['goog.testing.fsTest'], ['goog.testing.AsyncTestCase', 'goog.testing.fs', 'goog.testing.fs.Blob', 'goog.testing.jsunit']); +goog.addDependency('testing/fs/integration_test.js', ['goog.testing.fs.integrationTest'], ['goog.async.Deferred', 'goog.async.DeferredList', 'goog.events', 'goog.fs', 'goog.fs.DirectoryEntry', 'goog.fs.Error', 'goog.fs.FileSaver', 'goog.testing.AsyncTestCase', 'goog.testing.PropertyReplacer', 'goog.testing.fs', 'goog.testing.jsunit']); goog.addDependency('testing/fs/progressevent.js', ['goog.testing.fs.ProgressEvent'], ['goog.events.Event']); goog.addDependency('testing/functionmock.js', ['goog.testing', 'goog.testing.FunctionMock', 'goog.testing.GlobalFunctionMock', 'goog.testing.MethodMock'], ['goog.object', 'goog.testing.LooseMock', 'goog.testing.Mock', 'goog.testing.MockInterface', 'goog.testing.PropertyReplacer', 'goog.testing.StrictMock']); +goog.addDependency('testing/functionmock_test.js', ['goog.testing.FunctionMockTest'], ['goog.array', 'goog.string', 'goog.testing', 'goog.testing.FunctionMock', 'goog.testing.Mock', 'goog.testing.StrictMock', 'goog.testing.asserts', 'goog.testing.jsunit', 'goog.testing.mockmatchers']); goog.addDependency('testing/graphics.js', ['goog.testing.graphics'], ['goog.graphics.Path.Segment', 'goog.testing.asserts']); +goog.addDependency('testing/i18n/asserts.js', ['goog.testing.i18n.asserts'], ['goog.testing.jsunit']); +goog.addDependency('testing/i18n/asserts_test.js', ['goog.testing.i18n.assertsTest'], ['goog.testing.ExpectedFailures', 'goog.testing.i18n.asserts']); goog.addDependency('testing/jsunit.js', ['goog.testing.jsunit'], ['goog.testing.TestCase', 'goog.testing.TestRunner']); goog.addDependency('testing/loosemock.js', ['goog.testing.LooseExpectationCollection', 'goog.testing.LooseMock'], ['goog.array', 'goog.structs.Map', 'goog.testing.Mock']); +goog.addDependency('testing/loosemock_test.js', ['goog.testing.LooseMockTest'], ['goog.testing.LooseMock', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.mockmatchers']); goog.addDependency('testing/messaging/mockmessagechannel.js', ['goog.testing.messaging.MockMessageChannel'], ['goog.messaging.AbstractChannel', 'goog.testing.asserts']); goog.addDependency('testing/messaging/mockmessageevent.js', ['goog.testing.messaging.MockMessageEvent'], ['goog.events.BrowserEvent', 'goog.events.EventType', 'goog.testing.events']); goog.addDependency('testing/messaging/mockmessageport.js', ['goog.testing.messaging.MockMessagePort'], ['goog.events.EventTarget']); goog.addDependency('testing/messaging/mockportnetwork.js', ['goog.testing.messaging.MockPortNetwork'], ['goog.messaging.PortNetwork', 'goog.testing.messaging.MockMessageChannel']); goog.addDependency('testing/mock.js', ['goog.testing.Mock', 'goog.testing.MockExpectation'], ['goog.array', 'goog.object', 'goog.testing.JsUnitException', 'goog.testing.MockInterface', 'goog.testing.mockmatchers']); +goog.addDependency('testing/mock_test.js', ['goog.testing.MockTest'], ['goog.array', 'goog.testing', 'goog.testing.Mock', 'goog.testing.MockControl', 'goog.testing.MockExpectation', 'goog.testing.jsunit']); goog.addDependency('testing/mockclassfactory.js', ['goog.testing.MockClassFactory', 'goog.testing.MockClassRecord'], ['goog.array', 'goog.object', 'goog.testing.LooseMock', 'goog.testing.StrictMock', 'goog.testing.TestCase', 'goog.testing.mockmatchers']); -goog.addDependency('testing/mockclock.js', ['goog.testing.MockClock'], ['goog.Disposable', 'goog.testing.PropertyReplacer', 'goog.testing.events', 'goog.testing.events.Event']); -goog.addDependency('testing/mockcontrol.js', ['goog.testing.MockControl'], ['goog.array', 'goog.testing', 'goog.testing.LooseMock', 'goog.testing.MockInterface', 'goog.testing.StrictMock']); +goog.addDependency('testing/mockclassfactory_test.js', ['fake.BaseClass', 'fake.ChildClass', 'goog.testing.MockClassFactoryTest'], ['goog.testing', 'goog.testing.MockClassFactory', 'goog.testing.jsunit']); +goog.addDependency('testing/mockclock.js', ['goog.testing.MockClock'], ['goog.Disposable', 'goog.testing.PropertyReplacer', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.watchers']); +goog.addDependency('testing/mockclock_test.js', ['goog.testing.MockClockTest'], ['goog.events', 'goog.functions', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.recordFunction']); +goog.addDependency('testing/mockcontrol.js', ['goog.testing.MockControl'], ['goog.array', 'goog.testing', 'goog.testing.LooseMock', 'goog.testing.StrictMock']); +goog.addDependency('testing/mockcontrol_test.js', ['goog.testing.MockControlTest'], ['goog.testing.Mock', 'goog.testing.MockControl', 'goog.testing.jsunit']); goog.addDependency('testing/mockinterface.js', ['goog.testing.MockInterface'], []); goog.addDependency('testing/mockmatchers.js', ['goog.testing.mockmatchers', 'goog.testing.mockmatchers.ArgumentMatcher', 'goog.testing.mockmatchers.IgnoreArgument', 'goog.testing.mockmatchers.InstanceOf', 'goog.testing.mockmatchers.ObjectEquals', 'goog.testing.mockmatchers.RegexpMatch', 'goog.testing.mockmatchers.SaveArgument', 'goog.testing.mockmatchers.TypeOf'], ['goog.array', 'goog.dom', 'goog.testing.asserts']); +goog.addDependency('testing/mockmatchers_test.js', ['goog.testing.mockmatchersTest'], ['goog.dom', 'goog.testing.jsunit', 'goog.testing.mockmatchers', 'goog.testing.mockmatchers.ArgumentMatcher']); goog.addDependency('testing/mockrandom.js', ['goog.testing.MockRandom'], ['goog.Disposable']); +goog.addDependency('testing/mockrandom_test.js', ['goog.testing.MockRandomTest'], ['goog.testing.MockRandom', 'goog.testing.jsunit']); goog.addDependency('testing/mockrange.js', ['goog.testing.MockRange'], ['goog.dom.AbstractRange', 'goog.testing.LooseMock']); +goog.addDependency('testing/mockrange_test.js', ['goog.testing.MockRangeTest'], ['goog.testing.MockRange', 'goog.testing.jsunit']); goog.addDependency('testing/mockstorage.js', ['goog.testing.MockStorage'], ['goog.structs.Map']); -goog.addDependency('testing/mockuseragent.js', ['goog.testing.MockUserAgent'], ['goog.Disposable', 'goog.userAgent']); -goog.addDependency('testing/multitestrunner.js', ['goog.testing.MultiTestRunner', 'goog.testing.MultiTestRunner.TestFrame'], ['goog.Timer', 'goog.array', 'goog.dom', 'goog.dom.classes', 'goog.events.EventHandler', 'goog.functions', 'goog.string', 'goog.ui.Component', 'goog.ui.ServerChart', 'goog.ui.TableSorter']); +goog.addDependency('testing/mockstorage_test.js', ['goog.testing.MockStorageTest'], ['goog.testing.MockStorage', 'goog.testing.jsunit']); +goog.addDependency('testing/mockuseragent.js', ['goog.testing.MockUserAgent'], ['goog.Disposable', 'goog.labs.userAgent.util', 'goog.testing.PropertyReplacer', 'goog.userAgent']); +goog.addDependency('testing/mockuseragent_test.js', ['goog.testing.MockUserAgentTest'], ['goog.dispose', 'goog.testing.MockUserAgent', 'goog.testing.jsunit', 'goog.userAgent']); +goog.addDependency('testing/multitestrunner.js', ['goog.testing.MultiTestRunner', 'goog.testing.MultiTestRunner.TestFrame'], ['goog.Timer', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.events.EventHandler', 'goog.functions', 'goog.string', 'goog.ui.Component', 'goog.ui.ServerChart', 'goog.ui.TableSorter']); goog.addDependency('testing/net/xhrio.js', ['goog.testing.net.XhrIo'], ['goog.array', 'goog.dom.xml', 'goog.events', 'goog.events.EventTarget', 'goog.json', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.HttpStatus', 'goog.net.XhrIo', 'goog.net.XmlHttp', 'goog.object', 'goog.structs.Map']); +goog.addDependency('testing/net/xhrio_test.js', ['goog.testing.net.XhrIoTest'], ['goog.dom.xml', 'goog.events', 'goog.events.Event', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.XmlHttp', 'goog.object', 'goog.testing.MockControl', 'goog.testing.asserts', 'goog.testing.jsunit', 'goog.testing.mockmatchers.InstanceOf', 'goog.testing.net.XhrIo']); goog.addDependency('testing/net/xhriopool.js', ['goog.testing.net.XhrIoPool'], ['goog.net.XhrIoPool', 'goog.testing.net.XhrIo']); goog.addDependency('testing/objectpropertystring.js', ['goog.testing.ObjectPropertyString'], []); goog.addDependency('testing/performancetable.js', ['goog.testing.PerformanceTable'], ['goog.dom', 'goog.testing.PerformanceTimer']); goog.addDependency('testing/performancetimer.js', ['goog.testing.PerformanceTimer', 'goog.testing.PerformanceTimer.Task'], ['goog.array', 'goog.async.Deferred', 'goog.math']); -goog.addDependency('testing/propertyreplacer.js', ['goog.testing.PropertyReplacer'], ['goog.userAgent']); -goog.addDependency('testing/proto2/proto2.js', ['goog.testing.proto2'], ['goog.proto2.Message', 'goog.testing.asserts']); +goog.addDependency('testing/performancetimer_test.js', ['goog.testing.PerformanceTimerTest'], ['goog.async.Deferred', 'goog.dom', 'goog.math', 'goog.testing.MockClock', 'goog.testing.PerformanceTimer', 'goog.testing.jsunit']); +goog.addDependency('testing/propertyreplacer.js', ['goog.testing.PropertyReplacer'], ['goog.testing.ObjectPropertyString', 'goog.userAgent']); +goog.addDependency('testing/propertyreplacer_test.js', ['goog.testing.PropertyReplacerTest'], ['goog.testing.PropertyReplacer', 'goog.testing.asserts', 'goog.testing.jsunit']); +goog.addDependency('testing/proto2/proto2.js', ['goog.testing.proto2'], ['goog.proto2.Message', 'goog.proto2.ObjectSerializer', 'goog.testing.asserts']); +goog.addDependency('testing/proto2/proto2_test.js', ['goog.testing.proto2Test'], ['goog.testing.jsunit', 'goog.testing.proto2', 'proto2.TestAllTypes']); goog.addDependency('testing/pseudorandom.js', ['goog.testing.PseudoRandom'], ['goog.Disposable']); -goog.addDependency('testing/recordfunction.js', ['goog.testing.FunctionCall', 'goog.testing.recordConstructor', 'goog.testing.recordFunction'], []); +goog.addDependency('testing/pseudorandom_test.js', ['goog.testing.PseudoRandomTest'], ['goog.testing.PseudoRandom', 'goog.testing.jsunit']); +goog.addDependency('testing/recordfunction.js', ['goog.testing.FunctionCall', 'goog.testing.recordConstructor', 'goog.testing.recordFunction'], ['goog.testing.asserts']); +goog.addDependency('testing/recordfunction_test.js', ['goog.testing.recordFunctionTest'], ['goog.functions', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.recordConstructor', 'goog.testing.recordFunction']); goog.addDependency('testing/shardingtestcase.js', ['goog.testing.ShardingTestCase'], ['goog.asserts', 'goog.testing.TestCase']); +goog.addDependency('testing/shardingtestcase_test.js', ['goog.testing.ShardingTestCaseTest'], ['goog.testing.ShardingTestCase', 'goog.testing.TestCase', 'goog.testing.asserts', 'goog.testing.jsunit']); goog.addDependency('testing/singleton.js', ['goog.testing.singleton'], []); +goog.addDependency('testing/singleton_test.js', ['goog.testing.singletonTest'], ['goog.testing.asserts', 'goog.testing.jsunit', 'goog.testing.singleton']); goog.addDependency('testing/stacktrace.js', ['goog.testing.stacktrace', 'goog.testing.stacktrace.Frame'], []); +goog.addDependency('testing/stacktrace_test.js', ['goog.testing.stacktraceTest'], ['goog.functions', 'goog.string', 'goog.testing.ExpectedFailures', 'goog.testing.PropertyReplacer', 'goog.testing.StrictMock', 'goog.testing.asserts', 'goog.testing.jsunit', 'goog.testing.stacktrace', 'goog.testing.stacktrace.Frame', 'goog.userAgent']); goog.addDependency('testing/storage/fakemechanism.js', ['goog.testing.storage.FakeMechanism'], ['goog.storage.mechanism.IterableMechanism', 'goog.structs.Map']); goog.addDependency('testing/strictmock.js', ['goog.testing.StrictMock'], ['goog.array', 'goog.testing.Mock']); +goog.addDependency('testing/strictmock_test.js', ['goog.testing.StrictMockTest'], ['goog.testing.StrictMock', 'goog.testing.jsunit']); goog.addDependency('testing/style/layoutasserts.js', ['goog.testing.style.layoutasserts'], ['goog.style', 'goog.testing.asserts', 'goog.testing.style']); +goog.addDependency('testing/style/layoutasserts_test.js', ['goog.testing.style.layoutassertsTest'], ['goog.dom', 'goog.style', 'goog.testing.jsunit', 'goog.testing.style.layoutasserts']); goog.addDependency('testing/style/style.js', ['goog.testing.style'], ['goog.dom', 'goog.math.Rect', 'goog.style']); +goog.addDependency('testing/style/style_test.js', ['goog.testing.styleTest'], ['goog.dom', 'goog.style', 'goog.testing.jsunit', 'goog.testing.style']); goog.addDependency('testing/testcase.js', ['goog.testing.TestCase', 'goog.testing.TestCase.Error', 'goog.testing.TestCase.Order', 'goog.testing.TestCase.Result', 'goog.testing.TestCase.Test'], ['goog.object', 'goog.testing.asserts', 'goog.testing.stacktrace']); goog.addDependency('testing/testqueue.js', ['goog.testing.TestQueue'], []); goog.addDependency('testing/testrunner.js', ['goog.testing.TestRunner'], ['goog.testing.TestCase']); goog.addDependency('testing/ui/rendererasserts.js', ['goog.testing.ui.rendererasserts'], ['goog.testing.asserts']); +goog.addDependency('testing/ui/rendererasserts_test.js', ['goog.testing.ui.rendererassertsTest'], ['goog.testing.asserts', 'goog.testing.jsunit', 'goog.testing.ui.rendererasserts', 'goog.ui.ControlRenderer']); goog.addDependency('testing/ui/rendererharness.js', ['goog.testing.ui.RendererHarness'], ['goog.Disposable', 'goog.dom.NodeType', 'goog.testing.asserts', 'goog.testing.dom']); -goog.addDependency('testing/ui/style.js', ['goog.testing.ui.style'], ['goog.array', 'goog.dom', 'goog.dom.classes', 'goog.testing.asserts']); +goog.addDependency('testing/ui/style.js', ['goog.testing.ui.style'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.testing.asserts']); +goog.addDependency('testing/ui/style_test.js', ['goog.testing.ui.styleTest'], ['goog.dom', 'goog.testing.jsunit', 'goog.testing.ui.style']); +goog.addDependency('testing/watchers.js', ['goog.testing.watchers'], []); goog.addDependency('timer/timer.js', ['goog.Timer'], ['goog.events.EventTarget']); -goog.addDependency('tweak/entries.js', ['goog.tweak.BaseEntry', 'goog.tweak.BasePrimitiveSetting', 'goog.tweak.BaseSetting', 'goog.tweak.BooleanGroup', 'goog.tweak.BooleanInGroupSetting', 'goog.tweak.BooleanSetting', 'goog.tweak.ButtonAction', 'goog.tweak.NumericSetting', 'goog.tweak.StringSetting'], ['goog.array', 'goog.asserts', 'goog.debug.Logger', 'goog.object']); -goog.addDependency('tweak/registry.js', ['goog.tweak.Registry'], ['goog.asserts', 'goog.debug.Logger', 'goog.object', 'goog.string', 'goog.tweak.BaseEntry', 'goog.uri.utils']); +goog.addDependency('timer/timer_test.js', ['goog.TimerTest'], ['goog.Timer', 'goog.events', 'goog.testing.MockClock', 'goog.testing.jsunit']); +goog.addDependency('tweak/entries.js', ['goog.tweak.BaseEntry', 'goog.tweak.BasePrimitiveSetting', 'goog.tweak.BaseSetting', 'goog.tweak.BooleanGroup', 'goog.tweak.BooleanInGroupSetting', 'goog.tweak.BooleanSetting', 'goog.tweak.ButtonAction', 'goog.tweak.NumericSetting', 'goog.tweak.StringSetting'], ['goog.array', 'goog.asserts', 'goog.log', 'goog.object']); +goog.addDependency('tweak/entries_test.js', ['goog.tweak.BaseEntryTest'], ['goog.testing.MockControl', 'goog.testing.jsunit', 'goog.tweak.testhelpers']); +goog.addDependency('tweak/registry.js', ['goog.tweak.Registry'], ['goog.asserts', 'goog.log', 'goog.object', 'goog.string', 'goog.tweak.BaseEntry', 'goog.uri.utils']); +goog.addDependency('tweak/registry_test.js', ['goog.tweak.RegistryTest'], ['goog.asserts.AssertionError', 'goog.testing.jsunit', 'goog.tweak', 'goog.tweak.testhelpers']); goog.addDependency('tweak/testhelpers.js', ['goog.tweak.testhelpers'], ['goog.tweak', 'goog.tweak.BooleanGroup', 'goog.tweak.BooleanInGroupSetting', 'goog.tweak.BooleanSetting', 'goog.tweak.ButtonAction', 'goog.tweak.NumericSetting', 'goog.tweak.Registry', 'goog.tweak.StringSetting']); goog.addDependency('tweak/tweak.js', ['goog.tweak', 'goog.tweak.ConfigParams'], ['goog.asserts', 'goog.tweak.BaseSetting', 'goog.tweak.BooleanGroup', 'goog.tweak.BooleanInGroupSetting', 'goog.tweak.BooleanSetting', 'goog.tweak.ButtonAction', 'goog.tweak.NumericSetting', 'goog.tweak.Registry', 'goog.tweak.StringSetting']); goog.addDependency('tweak/tweakui.js', ['goog.tweak.EntriesPanel', 'goog.tweak.TweakUi'], ['goog.array', 'goog.asserts', 'goog.dom.DomHelper', 'goog.object', 'goog.style', 'goog.tweak', 'goog.ui.Zippy', 'goog.userAgent']); -goog.addDependency('ui/abstractspellchecker.js', ['goog.ui.AbstractSpellChecker', 'goog.ui.AbstractSpellChecker.AsyncResult'], ['goog.a11y.aria', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.classes', 'goog.dom.selection', 'goog.events', 'goog.events.Event', 'goog.events.EventType', 'goog.math.Coordinate', 'goog.spell.SpellCheck', 'goog.structs.Set', 'goog.style', 'goog.ui.Component', 'goog.ui.MenuItem', 'goog.ui.MenuSeparator', 'goog.ui.PopupMenu']); +goog.addDependency('tweak/tweakui_test.js', ['goog.tweak.TweakUiTest'], ['goog.dom', 'goog.string', 'goog.testing.jsunit', 'goog.tweak', 'goog.tweak.TweakUi', 'goog.tweak.testhelpers']); +goog.addDependency('ui/abstractspellchecker.js', ['goog.ui.AbstractSpellChecker', 'goog.ui.AbstractSpellChecker.AsyncResult'], ['goog.a11y.aria', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.classlist', 'goog.dom.selection', 'goog.events', 'goog.events.Event', 'goog.events.EventType', 'goog.math.Coordinate', 'goog.spell.SpellCheck', 'goog.structs.Set', 'goog.style', 'goog.ui.Component', 'goog.ui.MenuItem', 'goog.ui.MenuSeparator', 'goog.ui.PopupMenu']); goog.addDependency('ui/ac/ac.js', ['goog.ui.ac'], ['goog.ui.ac.ArrayMatcher', 'goog.ui.ac.AutoComplete', 'goog.ui.ac.InputHandler', 'goog.ui.ac.Renderer']); goog.addDependency('ui/ac/arraymatcher.js', ['goog.ui.ac.ArrayMatcher'], ['goog.string']); -goog.addDependency('ui/ac/autocomplete.js', ['goog.ui.ac.AutoComplete', 'goog.ui.ac.AutoComplete.EventType'], ['goog.asserts', 'goog.events', 'goog.events.EventTarget']); +goog.addDependency('ui/ac/autocomplete.js', ['goog.ui.ac.AutoComplete', 'goog.ui.ac.AutoComplete.EventType'], ['goog.array', 'goog.asserts', 'goog.events', 'goog.events.EventTarget', 'goog.object']); +goog.addDependency('ui/ac/cachingmatcher.js', ['goog.ui.ac.CachingMatcher'], ['goog.array', 'goog.async.Throttle', 'goog.ui.ac.ArrayMatcher', 'goog.ui.ac.RenderOptions']); goog.addDependency('ui/ac/inputhandler.js', ['goog.ui.ac.InputHandler'], ['goog.Disposable', 'goog.Timer', 'goog.a11y.aria', 'goog.dom', 'goog.dom.selection', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.string', 'goog.userAgent', 'goog.userAgent.product']); goog.addDependency('ui/ac/remote.js', ['goog.ui.ac.Remote'], ['goog.ui.ac.AutoComplete', 'goog.ui.ac.InputHandler', 'goog.ui.ac.RemoteArrayMatcher', 'goog.ui.ac.Renderer']); -goog.addDependency('ui/ac/remotearraymatcher.js', ['goog.ui.ac.RemoteArrayMatcher'], ['goog.Disposable', 'goog.Uri', 'goog.events', 'goog.json', 'goog.net.XhrIo']); -goog.addDependency('ui/ac/renderer.js', ['goog.ui.ac.Renderer', 'goog.ui.ac.Renderer.CustomRenderer'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.array', 'goog.dispose', 'goog.dom', 'goog.dom.classes', 'goog.events.Event', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.fx.dom.FadeInAndShow', 'goog.fx.dom.FadeOutAndHide', 'goog.positioning', 'goog.positioning.Corner', 'goog.positioning.Overflow', 'goog.string', 'goog.style', 'goog.ui.IdGenerator', 'goog.ui.ac.AutoComplete.EventType', 'goog.userAgent']); +goog.addDependency('ui/ac/remotearraymatcher.js', ['goog.ui.ac.RemoteArrayMatcher'], ['goog.Disposable', 'goog.Uri', 'goog.events', 'goog.json', 'goog.net.EventType', 'goog.net.XhrIo']); +goog.addDependency('ui/ac/renderer.js', ['goog.ui.ac.Renderer', 'goog.ui.ac.Renderer.CustomRenderer'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.array', 'goog.asserts', 'goog.dispose', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.classlist', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.fx.dom.FadeInAndShow', 'goog.fx.dom.FadeOutAndHide', 'goog.positioning', 'goog.positioning.Corner', 'goog.positioning.Overflow', 'goog.string', 'goog.style', 'goog.ui.IdGenerator', 'goog.ui.ac.AutoComplete']); goog.addDependency('ui/ac/renderoptions.js', ['goog.ui.ac.RenderOptions'], []); goog.addDependency('ui/ac/richinputhandler.js', ['goog.ui.ac.RichInputHandler'], ['goog.ui.ac.InputHandler']); goog.addDependency('ui/ac/richremote.js', ['goog.ui.ac.RichRemote'], ['goog.ui.ac.AutoComplete', 'goog.ui.ac.Remote', 'goog.ui.ac.Renderer', 'goog.ui.ac.RichInputHandler', 'goog.ui.ac.RichRemoteArrayMatcher']); -goog.addDependency('ui/ac/richremotearraymatcher.js', ['goog.ui.ac.RichRemoteArrayMatcher'], ['goog.ui.ac.RemoteArrayMatcher']); +goog.addDependency('ui/ac/richremotearraymatcher.js', ['goog.ui.ac.RichRemoteArrayMatcher'], ['goog.json', 'goog.ui.ac.RemoteArrayMatcher']); goog.addDependency('ui/activitymonitor.js', ['goog.ui.ActivityMonitor'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType']); -goog.addDependency('ui/advancedtooltip.js', ['goog.ui.AdvancedTooltip'], ['goog.events.EventType', 'goog.math.Coordinate', 'goog.ui.Tooltip', 'goog.userAgent']); -goog.addDependency('ui/animatedzippy.js', ['goog.ui.AnimatedZippy'], ['goog.dom', 'goog.events', 'goog.fx.Animation', 'goog.fx.Animation.EventType', 'goog.fx.Transition.EventType', 'goog.fx.easing', 'goog.ui.Zippy', 'goog.ui.ZippyEvent']); -goog.addDependency('ui/attachablemenu.js', ['goog.ui.AttachableMenu'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.classes', 'goog.events.Event', 'goog.events.KeyCodes', 'goog.string', 'goog.style', 'goog.ui.ItemEvent', 'goog.ui.MenuBase', 'goog.ui.PopupBase', 'goog.userAgent']); +goog.addDependency('ui/advancedtooltip.js', ['goog.ui.AdvancedTooltip'], ['goog.events', 'goog.events.EventType', 'goog.math.Box', 'goog.math.Coordinate', 'goog.style', 'goog.ui.Tooltip', 'goog.userAgent']); +goog.addDependency('ui/animatedzippy.js', ['goog.ui.AnimatedZippy'], ['goog.dom', 'goog.events', 'goog.fx.Animation', 'goog.fx.Transition', 'goog.fx.easing', 'goog.ui.Zippy', 'goog.ui.ZippyEvent']); +goog.addDependency('ui/attachablemenu.js', ['goog.ui.AttachableMenu'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.events.Event', 'goog.events.KeyCodes', 'goog.string', 'goog.style', 'goog.ui.ItemEvent', 'goog.ui.MenuBase', 'goog.ui.PopupBase', 'goog.userAgent']); goog.addDependency('ui/bidiinput.js', ['goog.ui.BidiInput'], ['goog.dom', 'goog.events', 'goog.events.InputHandler', 'goog.i18n.bidi', 'goog.ui.Component']); goog.addDependency('ui/bubble.js', ['goog.ui.Bubble'], ['goog.Timer', 'goog.events', 'goog.events.EventType', 'goog.math.Box', 'goog.positioning', 'goog.positioning.AbsolutePosition', 'goog.positioning.AnchoredPosition', 'goog.positioning.Corner', 'goog.positioning.CornerBit', 'goog.style', 'goog.ui.Component', 'goog.ui.Popup']); -goog.addDependency('ui/button.js', ['goog.ui.Button', 'goog.ui.Button.Side'], ['goog.events.KeyCodes', 'goog.ui.ButtonRenderer', 'goog.ui.ButtonSide', 'goog.ui.Control', 'goog.ui.ControlContent', 'goog.ui.NativeButtonRenderer']); -goog.addDependency('ui/buttonrenderer.js', ['goog.ui.ButtonRenderer'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.asserts', 'goog.string', 'goog.ui.ButtonSide', 'goog.ui.Component.State', 'goog.ui.ControlRenderer']); +goog.addDependency('ui/button.js', ['goog.ui.Button', 'goog.ui.Button.Side'], ['goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.ui.ButtonRenderer', 'goog.ui.ButtonSide', 'goog.ui.Component', 'goog.ui.Control', 'goog.ui.NativeButtonRenderer', 'goog.ui.registry']); +goog.addDependency('ui/buttonrenderer.js', ['goog.ui.ButtonRenderer'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.asserts', 'goog.ui.ButtonSide', 'goog.ui.Component', 'goog.ui.ControlRenderer']); goog.addDependency('ui/buttonside.js', ['goog.ui.ButtonSide'], []); goog.addDependency('ui/charcounter.js', ['goog.ui.CharCounter', 'goog.ui.CharCounter.Display'], ['goog.dom', 'goog.events', 'goog.events.EventTarget', 'goog.events.InputHandler']); -goog.addDependency('ui/charpicker.js', ['goog.ui.CharPicker'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.array', 'goog.asserts', 'goog.dom.classes', 'goog.events', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.InputHandler', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.i18n.CharListDecompressor', 'goog.i18n.uChar', 'goog.structs.Set', 'goog.style', 'goog.ui.Button', 'goog.ui.Component', 'goog.ui.ContainerScroller', 'goog.ui.FlatButtonRenderer', 'goog.ui.HoverCard', 'goog.ui.LabelInput', 'goog.ui.Menu', 'goog.ui.MenuButton', 'goog.ui.MenuItem', 'goog.ui.Tooltip']); +goog.addDependency('ui/charpicker.js', ['goog.ui.CharPicker'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.events', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.InputHandler', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.i18n.CharListDecompressor', 'goog.i18n.uChar', 'goog.structs.Set', 'goog.style', 'goog.ui.Button', 'goog.ui.Component', 'goog.ui.ContainerScroller', 'goog.ui.FlatButtonRenderer', 'goog.ui.HoverCard', 'goog.ui.LabelInput', 'goog.ui.Menu', 'goog.ui.MenuButton', 'goog.ui.MenuItem', 'goog.ui.Tooltip']); goog.addDependency('ui/checkbox.js', ['goog.ui.Checkbox', 'goog.ui.Checkbox.State'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.asserts', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.ui.CheckboxRenderer', 'goog.ui.Component.EventType', 'goog.ui.Component.State', 'goog.ui.Control', 'goog.ui.registry']); goog.addDependency('ui/checkboxmenuitem.js', ['goog.ui.CheckBoxMenuItem'], ['goog.ui.MenuItem', 'goog.ui.registry']); -goog.addDependency('ui/checkboxrenderer.js', ['goog.ui.CheckboxRenderer'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.array', 'goog.asserts', 'goog.dom.classes', 'goog.object', 'goog.ui.ControlRenderer']); +goog.addDependency('ui/checkboxrenderer.js', ['goog.ui.CheckboxRenderer'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.array', 'goog.asserts', 'goog.dom.classlist', 'goog.object', 'goog.ui.ControlRenderer']); goog.addDependency('ui/colorbutton.js', ['goog.ui.ColorButton'], ['goog.ui.Button', 'goog.ui.ColorButtonRenderer', 'goog.ui.registry']); -goog.addDependency('ui/colorbuttonrenderer.js', ['goog.ui.ColorButtonRenderer'], ['goog.dom.classes', 'goog.functions', 'goog.ui.ColorMenuButtonRenderer']); +goog.addDependency('ui/colorbuttonrenderer.js', ['goog.ui.ColorButtonRenderer'], ['goog.asserts', 'goog.dom.classlist', 'goog.functions', 'goog.ui.ColorMenuButtonRenderer']); goog.addDependency('ui/colormenubutton.js', ['goog.ui.ColorMenuButton'], ['goog.array', 'goog.object', 'goog.ui.ColorMenuButtonRenderer', 'goog.ui.ColorPalette', 'goog.ui.Component', 'goog.ui.Menu', 'goog.ui.MenuButton', 'goog.ui.registry']); -goog.addDependency('ui/colormenubuttonrenderer.js', ['goog.ui.ColorMenuButtonRenderer'], ['goog.color', 'goog.dom.classes', 'goog.ui.ControlContent', 'goog.ui.MenuButtonRenderer', 'goog.userAgent']); +goog.addDependency('ui/colormenubuttonrenderer.js', ['goog.ui.ColorMenuButtonRenderer'], ['goog.asserts', 'goog.color', 'goog.dom.classlist', 'goog.ui.MenuButtonRenderer', 'goog.userAgent']); goog.addDependency('ui/colorpalette.js', ['goog.ui.ColorPalette'], ['goog.array', 'goog.color', 'goog.style', 'goog.ui.Palette', 'goog.ui.PaletteRenderer']); -goog.addDependency('ui/colorpicker.js', ['goog.ui.ColorPicker', 'goog.ui.ColorPicker.EventType'], ['goog.ui.ColorPalette', 'goog.ui.Component', 'goog.ui.Component.State']); -goog.addDependency('ui/colorsplitbehavior.js', ['goog.ui.ColorSplitBehavior'], ['goog.ui.ColorButton', 'goog.ui.ColorMenuButton', 'goog.ui.SplitBehavior']); -goog.addDependency('ui/combobox.js', ['goog.ui.ComboBox', 'goog.ui.ComboBoxItem'], ['goog.Timer', 'goog.debug.Logger', 'goog.dom.classlist', 'goog.events', 'goog.events.InputHandler', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.positioning.Corner', 'goog.positioning.MenuAnchoredPosition', 'goog.string', 'goog.style', 'goog.ui.Component', 'goog.ui.ItemEvent', 'goog.ui.LabelInput', 'goog.ui.Menu', 'goog.ui.MenuItem', 'goog.ui.registry', 'goog.userAgent']); +goog.addDependency('ui/colorpicker.js', ['goog.ui.ColorPicker', 'goog.ui.ColorPicker.EventType'], ['goog.ui.ColorPalette', 'goog.ui.Component']); +goog.addDependency('ui/colorsplitbehavior.js', ['goog.ui.ColorSplitBehavior'], ['goog.ui.ColorMenuButton', 'goog.ui.SplitBehavior']); +goog.addDependency('ui/combobox.js', ['goog.ui.ComboBox', 'goog.ui.ComboBoxItem'], ['goog.Timer', 'goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.events.EventType', 'goog.events.InputHandler', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.log', 'goog.positioning.Corner', 'goog.positioning.MenuAnchoredPosition', 'goog.string', 'goog.style', 'goog.ui.Component', 'goog.ui.ItemEvent', 'goog.ui.LabelInput', 'goog.ui.Menu', 'goog.ui.MenuItem', 'goog.ui.MenuSeparator', 'goog.ui.registry', 'goog.userAgent']); goog.addDependency('ui/component.js', ['goog.ui.Component', 'goog.ui.Component.Error', 'goog.ui.Component.EventType', 'goog.ui.Component.State'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.NodeType', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.object', 'goog.style', 'goog.ui.IdGenerator']); goog.addDependency('ui/container.js', ['goog.ui.Container', 'goog.ui.Container.EventType', 'goog.ui.Container.Orientation'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.asserts', 'goog.dom', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.object', 'goog.style', 'goog.ui.Component', 'goog.ui.ContainerRenderer', 'goog.ui.Control']); -goog.addDependency('ui/containerrenderer.js', ['goog.ui.ContainerRenderer'], ['goog.a11y.aria', 'goog.array', 'goog.asserts', 'goog.dom.NodeType', 'goog.dom.classes', 'goog.string', 'goog.style', 'goog.ui.registry', 'goog.userAgent']); -goog.addDependency('ui/containerscroller.js', ['goog.ui.ContainerScroller'], ['goog.Timer', 'goog.events.EventHandler', 'goog.style', 'goog.ui.Component', 'goog.ui.Component.EventType', 'goog.ui.Container.EventType']); -goog.addDependency('ui/control.js', ['goog.ui.Control'], ['goog.array', 'goog.dom', 'goog.events.BrowserEvent', 'goog.events.Event', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.string', 'goog.ui.Component', 'goog.ui.ControlContent', 'goog.ui.ControlRenderer', 'goog.ui.decorate', 'goog.ui.registry', 'goog.userAgent']); +goog.addDependency('ui/containerrenderer.js', ['goog.ui.ContainerRenderer'], ['goog.a11y.aria', 'goog.array', 'goog.asserts', 'goog.dom.NodeType', 'goog.dom.classlist', 'goog.string', 'goog.style', 'goog.ui.registry', 'goog.userAgent']); +goog.addDependency('ui/containerscroller.js', ['goog.ui.ContainerScroller'], ['goog.Disposable', 'goog.Timer', 'goog.events.EventHandler', 'goog.style', 'goog.ui.Component', 'goog.ui.Container']); +goog.addDependency('ui/control.js', ['goog.ui.Control'], ['goog.array', 'goog.dom', 'goog.events.Event', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.string', 'goog.ui.Component', 'goog.ui.ControlContent', 'goog.ui.ControlRenderer', 'goog.ui.decorate', 'goog.ui.registry', 'goog.userAgent']); goog.addDependency('ui/controlcontent.js', ['goog.ui.ControlContent'], []); -goog.addDependency('ui/controlrenderer.js', ['goog.ui.ControlRenderer'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.classes', 'goog.object', 'goog.style', 'goog.ui.Component', 'goog.userAgent']); -goog.addDependency('ui/cookieeditor.js', ['goog.ui.CookieEditor'], ['goog.dom', 'goog.dom.TagName', 'goog.events.EventType', 'goog.net.cookies', 'goog.string', 'goog.style', 'goog.ui.Component']); -goog.addDependency('ui/css3buttonrenderer.js', ['goog.ui.Css3ButtonRenderer'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.classes', 'goog.ui.Button', 'goog.ui.ButtonRenderer', 'goog.ui.ControlContent', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.registry']); -goog.addDependency('ui/css3menubuttonrenderer.js', ['goog.ui.Css3MenuButtonRenderer'], ['goog.dom', 'goog.dom.TagName', 'goog.ui.ControlContent', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.MenuButton', 'goog.ui.MenuButtonRenderer', 'goog.ui.registry']); +goog.addDependency('ui/controlrenderer.js', ['goog.ui.ControlRenderer'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.object', 'goog.string', 'goog.style', 'goog.ui.Component', 'goog.userAgent']); +goog.addDependency('ui/cookieeditor.js', ['goog.ui.CookieEditor'], ['goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.events.EventType', 'goog.net.cookies', 'goog.string', 'goog.style', 'goog.ui.Component']); +goog.addDependency('ui/css3buttonrenderer.js', ['goog.ui.Css3ButtonRenderer'], ['goog.asserts', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.ui.Button', 'goog.ui.ButtonRenderer', 'goog.ui.Component', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.registry']); +goog.addDependency('ui/css3menubuttonrenderer.js', ['goog.ui.Css3MenuButtonRenderer'], ['goog.dom', 'goog.dom.TagName', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.MenuButton', 'goog.ui.MenuButtonRenderer', 'goog.ui.registry']); goog.addDependency('ui/cssnames.js', ['goog.ui.INLINE_BLOCK_CLASSNAME'], []); -goog.addDependency('ui/custombutton.js', ['goog.ui.CustomButton'], ['goog.ui.Button', 'goog.ui.ControlContent', 'goog.ui.CustomButtonRenderer', 'goog.ui.registry']); -goog.addDependency('ui/custombuttonrenderer.js', ['goog.ui.CustomButtonRenderer'], ['goog.a11y.aria.Role', 'goog.dom', 'goog.dom.classes', 'goog.string', 'goog.ui.ButtonRenderer', 'goog.ui.ControlContent', 'goog.ui.INLINE_BLOCK_CLASSNAME']); -goog.addDependency('ui/customcolorpalette.js', ['goog.ui.CustomColorPalette'], ['goog.color', 'goog.dom', 'goog.dom.classes', 'goog.ui.ColorPalette', 'goog.ui.Component']); -goog.addDependency('ui/datepicker.js', ['goog.ui.DatePicker', 'goog.ui.DatePicker.Events', 'goog.ui.DatePickerEvent'], ['goog.a11y.aria', 'goog.asserts', 'goog.date', 'goog.date.Date', 'goog.date.Interval', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.classes', 'goog.events.Event', 'goog.events.EventType', 'goog.events.KeyHandler', 'goog.i18n.DateTimeFormat', 'goog.i18n.DateTimeSymbols', 'goog.style', 'goog.ui.Component', 'goog.ui.IdGenerator']); +goog.addDependency('ui/custombutton.js', ['goog.ui.CustomButton'], ['goog.ui.Button', 'goog.ui.CustomButtonRenderer', 'goog.ui.registry']); +goog.addDependency('ui/custombuttonrenderer.js', ['goog.ui.CustomButtonRenderer'], ['goog.a11y.aria.Role', 'goog.asserts', 'goog.dom.NodeType', 'goog.dom.classlist', 'goog.string', 'goog.ui.ButtonRenderer', 'goog.ui.INLINE_BLOCK_CLASSNAME']); +goog.addDependency('ui/customcolorpalette.js', ['goog.ui.CustomColorPalette'], ['goog.color', 'goog.dom', 'goog.dom.classlist', 'goog.ui.ColorPalette', 'goog.ui.Component']); +goog.addDependency('ui/datepicker.js', ['goog.ui.DatePicker', 'goog.ui.DatePicker.Events', 'goog.ui.DatePickerEvent'], ['goog.a11y.aria', 'goog.asserts', 'goog.date.Date', 'goog.date.DateRange', 'goog.date.Interval', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.classlist', 'goog.events.Event', 'goog.events.EventType', 'goog.events.KeyHandler', 'goog.i18n.DateTimeFormat', 'goog.i18n.DateTimePatterns', 'goog.i18n.DateTimeSymbols', 'goog.style', 'goog.ui.Component', 'goog.ui.DefaultDatePickerRenderer', 'goog.ui.IdGenerator']); +goog.addDependency('ui/datepickerrenderer.js', ['goog.ui.DatePickerRenderer'], []); goog.addDependency('ui/decorate.js', ['goog.ui.decorate'], ['goog.ui.registry']); -goog.addDependency('ui/dialog.js', ['goog.ui.Dialog', 'goog.ui.Dialog.ButtonSet', 'goog.ui.Dialog.ButtonSet.DefaultButtons', 'goog.ui.Dialog.DefaultButtonCaptions', 'goog.ui.Dialog.DefaultButtonKeys', 'goog.ui.Dialog.Event', 'goog.ui.Dialog.EventType'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.asserts', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classes', 'goog.events', 'goog.events.Event', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.fx.Dragger', 'goog.math.Rect', 'goog.structs', 'goog.structs.Map', 'goog.style', 'goog.ui.ModalPopup', 'goog.userAgent']); -goog.addDependency('ui/dimensionpicker.js', ['goog.ui.DimensionPicker'], ['goog.events.EventType', 'goog.math.Size', 'goog.ui.Control', 'goog.ui.DimensionPickerRenderer', 'goog.ui.registry']); +goog.addDependency('ui/defaultdatepickerrenderer.js', ['goog.ui.DefaultDatePickerRenderer'], ['goog.dom', 'goog.dom.TagName', 'goog.ui.DatePickerRenderer']); +goog.addDependency('ui/dialog.js', ['goog.ui.Dialog', 'goog.ui.Dialog.ButtonSet', 'goog.ui.Dialog.ButtonSet.DefaultButtons', 'goog.ui.Dialog.DefaultButtonCaptions', 'goog.ui.Dialog.DefaultButtonKeys', 'goog.ui.Dialog.Event', 'goog.ui.Dialog.EventType'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.asserts', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.dom.safe', 'goog.events', 'goog.events.Event', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.fx.Dragger', 'goog.html.SafeHtml', 'goog.html.legacyconversions', 'goog.math.Rect', 'goog.string', 'goog.structs.Map', 'goog.style', 'goog.ui.ModalPopup']); +goog.addDependency('ui/dimensionpicker.js', ['goog.ui.DimensionPicker'], ['goog.events.EventType', 'goog.events.KeyCodes', 'goog.math.Size', 'goog.ui.Component', 'goog.ui.Control', 'goog.ui.DimensionPickerRenderer', 'goog.ui.registry']); goog.addDependency('ui/dimensionpickerrenderer.js', ['goog.ui.DimensionPickerRenderer'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.TagName', 'goog.i18n.bidi', 'goog.style', 'goog.ui.ControlRenderer', 'goog.userAgent']); goog.addDependency('ui/dragdropdetector.js', ['goog.ui.DragDropDetector', 'goog.ui.DragDropDetector.EventType', 'goog.ui.DragDropDetector.ImageDropEvent', 'goog.ui.DragDropDetector.LinkDropEvent'], ['goog.dom', 'goog.dom.TagName', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.math.Coordinate', 'goog.string', 'goog.style', 'goog.userAgent']); -goog.addDependency('ui/drilldownrow.js', ['goog.ui.DrilldownRow'], ['goog.dom', 'goog.dom.classes', 'goog.ui.Component']); -goog.addDependency('ui/editor/abstractdialog.js', ['goog.ui.editor.AbstractDialog', 'goog.ui.editor.AbstractDialog.Builder', 'goog.ui.editor.AbstractDialog.EventType'], ['goog.dom', 'goog.dom.classes', 'goog.events.EventTarget', 'goog.ui.Dialog', 'goog.ui.Dialog.ButtonSet', 'goog.ui.Dialog.DefaultButtonKeys', 'goog.ui.Dialog.Event', 'goog.ui.Dialog.EventType']); -goog.addDependency('ui/editor/bubble.js', ['goog.ui.editor.Bubble'], ['goog.debug.Logger', 'goog.dom', 'goog.dom.ViewportSizeMonitor', 'goog.editor.style', 'goog.events', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.math.Box', 'goog.positioning', 'goog.string', 'goog.style', 'goog.ui.Component.EventType', 'goog.ui.PopupBase', 'goog.ui.PopupBase.EventType', 'goog.userAgent']); -goog.addDependency('ui/editor/defaulttoolbar.js', ['goog.ui.editor.ButtonDescriptor', 'goog.ui.editor.DefaultToolbar'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.classes', 'goog.editor.Command', 'goog.style', 'goog.ui.editor.ToolbarFactory', 'goog.ui.editor.messages', 'goog.userAgent']); +goog.addDependency('ui/drilldownrow.js', ['goog.ui.DrilldownRow'], ['goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.ui.Component']); +goog.addDependency('ui/editor/abstractdialog.js', ['goog.ui.editor.AbstractDialog', 'goog.ui.editor.AbstractDialog.Builder', 'goog.ui.editor.AbstractDialog.EventType'], ['goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.events.EventTarget', 'goog.string', 'goog.ui.Dialog']); +goog.addDependency('ui/editor/bubble.js', ['goog.ui.editor.Bubble'], ['goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.ViewportSizeMonitor', 'goog.dom.classlist', 'goog.editor.style', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.functions', 'goog.log', 'goog.math.Box', 'goog.object', 'goog.positioning', 'goog.positioning.Corner', 'goog.positioning.Overflow', 'goog.positioning.OverflowStatus', 'goog.string', 'goog.style', 'goog.ui.Component', 'goog.ui.PopupBase', 'goog.userAgent']); +goog.addDependency('ui/editor/defaulttoolbar.js', ['goog.ui.editor.ButtonDescriptor', 'goog.ui.editor.DefaultToolbar'], ['goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.editor.Command', 'goog.style', 'goog.ui.editor.ToolbarFactory', 'goog.ui.editor.messages', 'goog.userAgent']); goog.addDependency('ui/editor/equationeditordialog.js', ['goog.ui.editor.EquationEditorDialog'], ['goog.editor.Command', 'goog.ui.Dialog', 'goog.ui.editor.AbstractDialog', 'goog.ui.editor.EquationEditorOkEvent', 'goog.ui.equation.TexEditor']); goog.addDependency('ui/editor/equationeditorokevent.js', ['goog.ui.editor.EquationEditorOkEvent'], ['goog.events.Event', 'goog.ui.editor.AbstractDialog']); goog.addDependency('ui/editor/linkdialog.js', ['goog.ui.editor.LinkDialog', 'goog.ui.editor.LinkDialog.BeforeTestLinkEvent', 'goog.ui.editor.LinkDialog.EventType', 'goog.ui.editor.LinkDialog.OkEvent'], ['goog.dom', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Link', 'goog.editor.focus', 'goog.editor.node', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.InputHandler', 'goog.string', 'goog.style', 'goog.ui.Button', 'goog.ui.Component', 'goog.ui.LinkButtonRenderer', 'goog.ui.editor.AbstractDialog', 'goog.ui.editor.TabPane', 'goog.ui.editor.messages', 'goog.userAgent', 'goog.window']); goog.addDependency('ui/editor/messages.js', ['goog.ui.editor.messages'], []); -goog.addDependency('ui/editor/tabpane.js', ['goog.ui.editor.TabPane'], ['goog.dom.TagName', 'goog.dom.classes', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.style', 'goog.ui.Component', 'goog.ui.Control', 'goog.ui.Tab', 'goog.ui.TabBar']); -goog.addDependency('ui/editor/toolbarcontroller.js', ['goog.ui.editor.ToolbarController'], ['goog.editor.Field.EventType', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.ui.Component.EventType']); +goog.addDependency('ui/editor/tabpane.js', ['goog.ui.editor.TabPane'], ['goog.asserts', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.style', 'goog.ui.Component', 'goog.ui.Control', 'goog.ui.Tab', 'goog.ui.TabBar']); +goog.addDependency('ui/editor/toolbarcontroller.js', ['goog.ui.editor.ToolbarController'], ['goog.editor.Field', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.ui.Component']); goog.addDependency('ui/editor/toolbarfactory.js', ['goog.ui.editor.ToolbarFactory'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.string', 'goog.string.Unicode', 'goog.style', 'goog.ui.Component', 'goog.ui.Container', 'goog.ui.Option', 'goog.ui.Toolbar', 'goog.ui.ToolbarButton', 'goog.ui.ToolbarColorMenuButton', 'goog.ui.ToolbarMenuButton', 'goog.ui.ToolbarRenderer', 'goog.ui.ToolbarSelect', 'goog.userAgent']); goog.addDependency('ui/emoji/emoji.js', ['goog.ui.emoji.Emoji'], []); -goog.addDependency('ui/emoji/emojipalette.js', ['goog.ui.emoji.EmojiPalette'], ['goog.events.Event', 'goog.events.EventType', 'goog.net.ImageLoader', 'goog.ui.Palette', 'goog.ui.emoji.Emoji', 'goog.ui.emoji.EmojiPaletteRenderer']); -goog.addDependency('ui/emoji/emojipaletterenderer.js', ['goog.ui.emoji.EmojiPaletteRenderer'], ['goog.a11y.aria', 'goog.dom', 'goog.ui.PaletteRenderer', 'goog.ui.emoji.Emoji', 'goog.ui.emoji.SpriteInfo']); -goog.addDependency('ui/emoji/emojipicker.js', ['goog.ui.emoji.EmojiPicker'], ['goog.debug.Logger', 'goog.dom', 'goog.ui.Component', 'goog.ui.TabPane', 'goog.ui.TabPane.TabPage', 'goog.ui.emoji.Emoji', 'goog.ui.emoji.EmojiPalette', 'goog.ui.emoji.EmojiPaletteRenderer', 'goog.ui.emoji.ProgressiveEmojiPaletteRenderer']); -goog.addDependency('ui/emoji/popupemojipicker.js', ['goog.ui.emoji.PopupEmojiPicker'], ['goog.dom', 'goog.events.EventType', 'goog.positioning.AnchoredPosition', 'goog.ui.Component', 'goog.ui.Popup', 'goog.ui.emoji.EmojiPicker']); -goog.addDependency('ui/emoji/progressiveemojipaletterenderer.js', ['goog.ui.emoji.ProgressiveEmojiPaletteRenderer'], ['goog.ui.emoji.EmojiPaletteRenderer']); +goog.addDependency('ui/emoji/emojipalette.js', ['goog.ui.emoji.EmojiPalette'], ['goog.events.EventType', 'goog.net.ImageLoader', 'goog.ui.Palette', 'goog.ui.emoji.Emoji', 'goog.ui.emoji.EmojiPaletteRenderer']); +goog.addDependency('ui/emoji/emojipaletterenderer.js', ['goog.ui.emoji.EmojiPaletteRenderer'], ['goog.a11y.aria', 'goog.asserts', 'goog.dom.NodeType', 'goog.dom.classlist', 'goog.style', 'goog.ui.PaletteRenderer', 'goog.ui.emoji.Emoji']); +goog.addDependency('ui/emoji/emojipicker.js', ['goog.ui.emoji.EmojiPicker'], ['goog.log', 'goog.style', 'goog.ui.Component', 'goog.ui.TabPane', 'goog.ui.emoji.Emoji', 'goog.ui.emoji.EmojiPalette', 'goog.ui.emoji.EmojiPaletteRenderer', 'goog.ui.emoji.ProgressiveEmojiPaletteRenderer']); +goog.addDependency('ui/emoji/popupemojipicker.js', ['goog.ui.emoji.PopupEmojiPicker'], ['goog.events.EventType', 'goog.positioning.AnchoredPosition', 'goog.positioning.Corner', 'goog.ui.Component', 'goog.ui.Popup', 'goog.ui.emoji.EmojiPicker']); +goog.addDependency('ui/emoji/progressiveemojipaletterenderer.js', ['goog.ui.emoji.ProgressiveEmojiPaletteRenderer'], ['goog.style', 'goog.ui.emoji.EmojiPaletteRenderer']); goog.addDependency('ui/emoji/spriteinfo.js', ['goog.ui.emoji.SpriteInfo'], []); goog.addDependency('ui/equation/arrowpalette.js', ['goog.ui.equation.ArrowPalette'], ['goog.math.Size', 'goog.ui.equation.Palette']); -goog.addDependency('ui/equation/changeevent.js', ['goog.ui.equation.ChangeEvent'], ['goog.events.Event', 'goog.events.EventType']); +goog.addDependency('ui/equation/changeevent.js', ['goog.ui.equation.ChangeEvent'], ['goog.events.Event']); goog.addDependency('ui/equation/comparisonpalette.js', ['goog.ui.equation.ComparisonPalette'], ['goog.math.Size', 'goog.ui.equation.Palette']); -goog.addDependency('ui/equation/editorpane.js', ['goog.ui.equation.EditorPane'], ['goog.dom', 'goog.style', 'goog.ui.Component']); -goog.addDependency('ui/equation/equationeditor.js', ['goog.ui.equation.EquationEditor'], ['goog.dom', 'goog.events', 'goog.ui.Component', 'goog.ui.Tab', 'goog.ui.TabBar', 'goog.ui.equation.EditorPane', 'goog.ui.equation.ImageRenderer', 'goog.ui.equation.TexPane']); -goog.addDependency('ui/equation/equationeditordialog.js', ['goog.ui.equation.EquationEditorDialog'], ['goog.dom', 'goog.dom.classes', 'goog.ui.Dialog', 'goog.ui.equation.EquationEditor', 'goog.ui.equation.PaletteManager', 'goog.ui.equation.TexEditor']); +goog.addDependency('ui/equation/editorpane.js', ['goog.ui.equation.EditorPane'], ['goog.style', 'goog.ui.Component']); +goog.addDependency('ui/equation/equationeditor.js', ['goog.ui.equation.EquationEditor'], ['goog.events', 'goog.ui.Component', 'goog.ui.TabBar', 'goog.ui.equation.ImageRenderer', 'goog.ui.equation.TexPane']); +goog.addDependency('ui/equation/equationeditordialog.js', ['goog.ui.equation.EquationEditorDialog'], ['goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.ui.Dialog', 'goog.ui.equation.EquationEditor', 'goog.ui.equation.PaletteManager', 'goog.ui.equation.TexEditor']); goog.addDependency('ui/equation/greekpalette.js', ['goog.ui.equation.GreekPalette'], ['goog.math.Size', 'goog.ui.equation.Palette']); -goog.addDependency('ui/equation/imagerenderer.js', ['goog.ui.equation.ImageRenderer'], ['goog.dom.TagName', 'goog.dom.classes', 'goog.string', 'goog.uri.utils']); +goog.addDependency('ui/equation/imagerenderer.js', ['goog.ui.equation.ImageRenderer'], ['goog.asserts', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.string', 'goog.uri.utils']); goog.addDependency('ui/equation/mathpalette.js', ['goog.ui.equation.MathPalette'], ['goog.math.Size', 'goog.ui.equation.Palette']); -goog.addDependency('ui/equation/menupalette.js', ['goog.ui.equation.MenuPalette', 'goog.ui.equation.MenuPaletteRenderer'], ['goog.math.Size', 'goog.style', 'goog.ui.equation.Palette', 'goog.ui.equation.PaletteRenderer']); +goog.addDependency('ui/equation/menupalette.js', ['goog.ui.equation.MenuPalette', 'goog.ui.equation.MenuPaletteRenderer'], ['goog.math.Size', 'goog.ui.PaletteRenderer', 'goog.ui.equation.Palette', 'goog.ui.equation.PaletteRenderer']); goog.addDependency('ui/equation/palette.js', ['goog.ui.equation.Palette', 'goog.ui.equation.PaletteEvent', 'goog.ui.equation.PaletteRenderer'], ['goog.dom', 'goog.dom.TagName', 'goog.events.Event', 'goog.ui.Palette', 'goog.ui.PaletteRenderer']); goog.addDependency('ui/equation/palettemanager.js', ['goog.ui.equation.PaletteManager'], ['goog.Timer', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.ui.equation.ArrowPalette', 'goog.ui.equation.ComparisonPalette', 'goog.ui.equation.GreekPalette', 'goog.ui.equation.MathPalette', 'goog.ui.equation.MenuPalette', 'goog.ui.equation.Palette', 'goog.ui.equation.SymbolPalette']); goog.addDependency('ui/equation/symbolpalette.js', ['goog.ui.equation.SymbolPalette'], ['goog.math.Size', 'goog.ui.equation.Palette']); -goog.addDependency('ui/equation/texeditor.js', ['goog.ui.equation.TexEditor'], ['goog.dom', 'goog.ui.Component', 'goog.ui.equation.ImageRenderer', 'goog.ui.equation.TexPane']); -goog.addDependency('ui/equation/texpane.js', ['goog.ui.equation.TexPane'], ['goog.Timer', 'goog.dom', 'goog.dom.TagName', 'goog.dom.selection', 'goog.events', 'goog.events.EventType', 'goog.events.InputHandler', 'goog.string', 'goog.style', 'goog.ui.Component', 'goog.ui.equation.ChangeEvent', 'goog.ui.equation.EditorPane', 'goog.ui.equation.ImageRenderer', 'goog.ui.equation.PaletteManager']); -goog.addDependency('ui/filteredmenu.js', ['goog.ui.FilteredMenu'], ['goog.dom', 'goog.events', 'goog.events.EventType', 'goog.events.InputHandler', 'goog.events.KeyCodes', 'goog.string', 'goog.style', 'goog.ui.Component', 'goog.ui.FilterObservingMenuItem', 'goog.ui.Menu', 'goog.userAgent']); -goog.addDependency('ui/filterobservingmenuitem.js', ['goog.ui.FilterObservingMenuItem'], ['goog.ui.ControlContent', 'goog.ui.FilterObservingMenuItemRenderer', 'goog.ui.MenuItem', 'goog.ui.registry']); +goog.addDependency('ui/equation/texeditor.js', ['goog.ui.equation.TexEditor'], ['goog.ui.Component', 'goog.ui.equation.ImageRenderer', 'goog.ui.equation.TexPane']); +goog.addDependency('ui/equation/texpane.js', ['goog.ui.equation.TexPane'], ['goog.Timer', 'goog.dom', 'goog.dom.TagName', 'goog.dom.selection', 'goog.events', 'goog.events.EventType', 'goog.events.InputHandler', 'goog.style', 'goog.ui.equation.ChangeEvent', 'goog.ui.equation.EditorPane', 'goog.ui.equation.ImageRenderer', 'goog.ui.equation.Palette', 'goog.ui.equation.PaletteEvent']); +goog.addDependency('ui/filteredmenu.js', ['goog.ui.FilteredMenu'], ['goog.a11y.aria', 'goog.a11y.aria.AutoCompleteValues', 'goog.a11y.aria.State', 'goog.dom', 'goog.events', 'goog.events.EventType', 'goog.events.InputHandler', 'goog.events.KeyCodes', 'goog.object', 'goog.string', 'goog.style', 'goog.ui.Component', 'goog.ui.FilterObservingMenuItem', 'goog.ui.Menu', 'goog.userAgent']); +goog.addDependency('ui/filterobservingmenuitem.js', ['goog.ui.FilterObservingMenuItem'], ['goog.ui.FilterObservingMenuItemRenderer', 'goog.ui.MenuItem', 'goog.ui.registry']); goog.addDependency('ui/filterobservingmenuitemrenderer.js', ['goog.ui.FilterObservingMenuItemRenderer'], ['goog.ui.MenuItemRenderer']); -goog.addDependency('ui/flatbuttonrenderer.js', ['goog.ui.FlatButtonRenderer'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.dom.classes', 'goog.ui.Button', 'goog.ui.ButtonRenderer', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.registry']); -goog.addDependency('ui/flatmenubuttonrenderer.js', ['goog.ui.FlatMenuButtonRenderer'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.asserts', 'goog.dom', 'goog.string', 'goog.style', 'goog.ui.FlatButtonRenderer', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.Menu', 'goog.ui.MenuButton', 'goog.ui.MenuRenderer', 'goog.ui.registry']); -goog.addDependency('ui/formpost.js', ['goog.ui.FormPost'], ['goog.array', 'goog.dom.TagName', 'goog.string', 'goog.string.StringBuffer', 'goog.ui.Component']); -goog.addDependency('ui/gauge.js', ['goog.ui.Gauge', 'goog.ui.GaugeColoredRange'], ['goog.a11y.aria', 'goog.asserts', 'goog.dom', 'goog.fx.Animation', 'goog.fx.Animation.EventType', 'goog.fx.Transition.EventType', 'goog.fx.easing', 'goog.graphics', 'goog.graphics.Font', 'goog.graphics.Path', 'goog.graphics.SolidFill', 'goog.ui.Component', 'goog.ui.GaugeTheme']); +goog.addDependency('ui/flatbuttonrenderer.js', ['goog.ui.FlatButtonRenderer'], ['goog.a11y.aria.Role', 'goog.asserts', 'goog.dom.classlist', 'goog.ui.Button', 'goog.ui.ButtonRenderer', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.registry']); +goog.addDependency('ui/flatmenubuttonrenderer.js', ['goog.ui.FlatMenuButtonRenderer'], ['goog.dom', 'goog.style', 'goog.ui.FlatButtonRenderer', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.Menu', 'goog.ui.MenuButton', 'goog.ui.MenuRenderer', 'goog.ui.registry']); +goog.addDependency('ui/formpost.js', ['goog.ui.FormPost'], ['goog.array', 'goog.dom.TagName', 'goog.dom.safe', 'goog.html.SafeHtml', 'goog.ui.Component']); +goog.addDependency('ui/gauge.js', ['goog.ui.Gauge', 'goog.ui.GaugeColoredRange'], ['goog.a11y.aria', 'goog.asserts', 'goog.events', 'goog.fx.Animation', 'goog.fx.Transition', 'goog.fx.easing', 'goog.graphics', 'goog.graphics.Font', 'goog.graphics.Path', 'goog.graphics.SolidFill', 'goog.math', 'goog.ui.Component', 'goog.ui.GaugeTheme']); goog.addDependency('ui/gaugetheme.js', ['goog.ui.GaugeTheme'], ['goog.graphics.LinearGradient', 'goog.graphics.SolidFill', 'goog.graphics.Stroke']); -goog.addDependency('ui/hovercard.js', ['goog.ui.HoverCard', 'goog.ui.HoverCard.EventType', 'goog.ui.HoverCard.TriggerEvent'], ['goog.dom', 'goog.events', 'goog.events.EventType', 'goog.ui.AdvancedTooltip']); -goog.addDependency('ui/hsvapalette.js', ['goog.ui.HsvaPalette'], ['goog.array', 'goog.color', 'goog.color.alpha', 'goog.events.EventType', 'goog.ui.Component.EventType', 'goog.ui.HsvPalette']); +goog.addDependency('ui/hovercard.js', ['goog.ui.HoverCard', 'goog.ui.HoverCard.EventType', 'goog.ui.HoverCard.TriggerEvent'], ['goog.array', 'goog.dom', 'goog.events', 'goog.events.Event', 'goog.events.EventType', 'goog.ui.AdvancedTooltip', 'goog.ui.PopupBase', 'goog.ui.Tooltip']); +goog.addDependency('ui/hsvapalette.js', ['goog.ui.HsvaPalette'], ['goog.array', 'goog.color.alpha', 'goog.dom.TagName', 'goog.events', 'goog.events.EventType', 'goog.style', 'goog.ui.Component', 'goog.ui.HsvPalette']); goog.addDependency('ui/hsvpalette.js', ['goog.ui.HsvPalette'], ['goog.color', 'goog.dom.TagName', 'goog.events', 'goog.events.EventType', 'goog.events.InputHandler', 'goog.style', 'goog.style.bidi', 'goog.ui.Component', 'goog.userAgent']); goog.addDependency('ui/idgenerator.js', ['goog.ui.IdGenerator'], []); goog.addDependency('ui/idletimer.js', ['goog.ui.IdleTimer'], ['goog.Timer', 'goog.events', 'goog.events.EventTarget', 'goog.structs.Set', 'goog.ui.ActivityMonitor']); -goog.addDependency('ui/iframemask.js', ['goog.ui.IframeMask'], ['goog.Disposable', 'goog.Timer', 'goog.dom', 'goog.dom.DomHelper', 'goog.dom.iframe', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.style']); -goog.addDependency('ui/imagelessbuttonrenderer.js', ['goog.ui.ImagelessButtonRenderer'], ['goog.dom.classes', 'goog.ui.Button', 'goog.ui.ControlContent', 'goog.ui.CustomButtonRenderer', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.registry']); -goog.addDependency('ui/imagelessmenubuttonrenderer.js', ['goog.ui.ImagelessMenuButtonRenderer'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.classes', 'goog.ui.ControlContent', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.MenuButton', 'goog.ui.MenuButtonRenderer', 'goog.ui.registry']); +goog.addDependency('ui/iframemask.js', ['goog.ui.IframeMask'], ['goog.Disposable', 'goog.Timer', 'goog.dom', 'goog.dom.iframe', 'goog.events.EventHandler', 'goog.style']); +goog.addDependency('ui/imagelessbuttonrenderer.js', ['goog.ui.ImagelessButtonRenderer'], ['goog.dom.classlist', 'goog.ui.Button', 'goog.ui.Component', 'goog.ui.CustomButtonRenderer', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.registry']); +goog.addDependency('ui/imagelessmenubuttonrenderer.js', ['goog.ui.ImagelessMenuButtonRenderer'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.MenuButton', 'goog.ui.MenuButtonRenderer', 'goog.ui.registry']); goog.addDependency('ui/inputdatepicker.js', ['goog.ui.InputDatePicker'], ['goog.date.DateTime', 'goog.dom', 'goog.string', 'goog.ui.Component', 'goog.ui.DatePicker', 'goog.ui.PopupBase', 'goog.ui.PopupDatePicker']); goog.addDependency('ui/itemevent.js', ['goog.ui.ItemEvent'], ['goog.events.Event']); goog.addDependency('ui/keyboardshortcuthandler.js', ['goog.ui.KeyboardShortcutEvent', 'goog.ui.KeyboardShortcutHandler', 'goog.ui.KeyboardShortcutHandler.EventType'], ['goog.Timer', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyNames', 'goog.object', 'goog.userAgent']); goog.addDependency('ui/labelinput.js', ['goog.ui.LabelInput'], ['goog.Timer', 'goog.a11y.aria', 'goog.a11y.aria.State', 'goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.ui.Component', 'goog.userAgent']); goog.addDependency('ui/linkbuttonrenderer.js', ['goog.ui.LinkButtonRenderer'], ['goog.ui.Button', 'goog.ui.FlatButtonRenderer', 'goog.ui.registry']); -goog.addDependency('ui/media/flashobject.js', ['goog.ui.media.FlashObject', 'goog.ui.media.FlashObject.ScriptAccessLevel', 'goog.ui.media.FlashObject.Wmodes'], ['goog.asserts', 'goog.debug.Logger', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.object', 'goog.string', 'goog.structs.Map', 'goog.style', 'goog.ui.Component', 'goog.userAgent', 'goog.userAgent.flash']); -goog.addDependency('ui/media/flickr.js', ['goog.ui.media.FlickrSet', 'goog.ui.media.FlickrSetModel'], ['goog.object', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.MediaModel', 'goog.ui.media.MediaModel.Player', 'goog.ui.media.MediaRenderer']); -goog.addDependency('ui/media/googlevideo.js', ['goog.ui.media.GoogleVideo', 'goog.ui.media.GoogleVideoModel'], ['goog.string', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.MediaModel', 'goog.ui.media.MediaModel.Player', 'goog.ui.media.MediaRenderer']); +goog.addDependency('ui/media/flashobject.js', ['goog.ui.media.FlashObject', 'goog.ui.media.FlashObject.ScriptAccessLevel', 'goog.ui.media.FlashObject.Wmodes'], ['goog.asserts', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.log', 'goog.object', 'goog.string', 'goog.structs.Map', 'goog.style', 'goog.ui.Component', 'goog.userAgent', 'goog.userAgent.flash']); +goog.addDependency('ui/media/flickr.js', ['goog.ui.media.FlickrSet', 'goog.ui.media.FlickrSetModel'], ['goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.MediaModel', 'goog.ui.media.MediaRenderer']); +goog.addDependency('ui/media/googlevideo.js', ['goog.ui.media.GoogleVideo', 'goog.ui.media.GoogleVideoModel'], ['goog.string', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.MediaModel', 'goog.ui.media.MediaRenderer']); goog.addDependency('ui/media/media.js', ['goog.ui.media.Media', 'goog.ui.media.MediaRenderer'], ['goog.style', 'goog.ui.Component', 'goog.ui.Control', 'goog.ui.ControlRenderer']); goog.addDependency('ui/media/mediamodel.js', ['goog.ui.media.MediaModel', 'goog.ui.media.MediaModel.Category', 'goog.ui.media.MediaModel.Credit', 'goog.ui.media.MediaModel.Credit.Role', 'goog.ui.media.MediaModel.Credit.Scheme', 'goog.ui.media.MediaModel.Medium', 'goog.ui.media.MediaModel.MimeType', 'goog.ui.media.MediaModel.Player', 'goog.ui.media.MediaModel.SubTitle', 'goog.ui.media.MediaModel.Thumbnail'], ['goog.array']); goog.addDependency('ui/media/mp3.js', ['goog.ui.media.Mp3'], ['goog.string', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.MediaRenderer']); goog.addDependency('ui/media/photo.js', ['goog.ui.media.Photo'], ['goog.ui.media.Media', 'goog.ui.media.MediaRenderer']); -goog.addDependency('ui/media/picasa.js', ['goog.ui.media.PicasaAlbum', 'goog.ui.media.PicasaAlbumModel'], ['goog.object', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.MediaModel', 'goog.ui.media.MediaModel.Player', 'goog.ui.media.MediaRenderer']); -goog.addDependency('ui/media/vimeo.js', ['goog.ui.media.Vimeo', 'goog.ui.media.VimeoModel'], ['goog.string', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.MediaModel', 'goog.ui.media.MediaModel.Player', 'goog.ui.media.MediaRenderer']); +goog.addDependency('ui/media/picasa.js', ['goog.ui.media.PicasaAlbum', 'goog.ui.media.PicasaAlbumModel'], ['goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.MediaModel', 'goog.ui.media.MediaRenderer']); +goog.addDependency('ui/media/vimeo.js', ['goog.ui.media.Vimeo', 'goog.ui.media.VimeoModel'], ['goog.string', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.MediaModel', 'goog.ui.media.MediaRenderer']); goog.addDependency('ui/media/youtube.js', ['goog.ui.media.Youtube', 'goog.ui.media.YoutubeModel'], ['goog.string', 'goog.ui.Component', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.MediaModel', 'goog.ui.media.MediaRenderer']); goog.addDependency('ui/menu.js', ['goog.ui.Menu', 'goog.ui.Menu.EventType'], ['goog.math.Coordinate', 'goog.string', 'goog.style', 'goog.ui.Component.EventType', 'goog.ui.Component.State', 'goog.ui.Container', 'goog.ui.Container.Orientation', 'goog.ui.MenuHeader', 'goog.ui.MenuItem', 'goog.ui.MenuRenderer', 'goog.ui.MenuSeparator']); goog.addDependency('ui/menubar.js', ['goog.ui.menuBar'], ['goog.ui.Container', 'goog.ui.MenuBarRenderer']); goog.addDependency('ui/menubardecorator.js', ['goog.ui.menuBarDecorator'], ['goog.ui.MenuBarRenderer', 'goog.ui.menuBar', 'goog.ui.registry']); -goog.addDependency('ui/menubarrenderer.js', ['goog.ui.MenuBarRenderer'], ['goog.a11y.aria.Role', 'goog.dom', 'goog.ui.ContainerRenderer']); +goog.addDependency('ui/menubarrenderer.js', ['goog.ui.MenuBarRenderer'], ['goog.a11y.aria.Role', 'goog.ui.Container', 'goog.ui.ContainerRenderer']); goog.addDependency('ui/menubase.js', ['goog.ui.MenuBase'], ['goog.events.EventHandler', 'goog.events.EventType', 'goog.events.KeyHandler', 'goog.ui.Popup']); -goog.addDependency('ui/menubutton.js', ['goog.ui.MenuButton'], ['goog.Timer', 'goog.a11y.aria', 'goog.a11y.aria.State', 'goog.asserts', 'goog.dom', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.math.Box', 'goog.math.Rect', 'goog.positioning', 'goog.positioning.Corner', 'goog.positioning.MenuAnchoredPosition', 'goog.positioning.Overflow', 'goog.style', 'goog.ui.Button', 'goog.ui.Component', 'goog.ui.Menu', 'goog.ui.MenuButtonRenderer', 'goog.ui.registry', 'goog.userAgent', 'goog.userAgent.product']); -goog.addDependency('ui/menubuttonrenderer.js', ['goog.ui.MenuButtonRenderer'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.asserts', 'goog.dom', 'goog.string', 'goog.style', 'goog.ui.CustomButtonRenderer', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.Menu', 'goog.ui.MenuRenderer', 'goog.userAgent']); -goog.addDependency('ui/menuheader.js', ['goog.ui.MenuHeader'], ['goog.ui.Component.State', 'goog.ui.Control', 'goog.ui.MenuHeaderRenderer', 'goog.ui.registry']); -goog.addDependency('ui/menuheaderrenderer.js', ['goog.ui.MenuHeaderRenderer'], ['goog.dom', 'goog.dom.classes', 'goog.ui.ControlRenderer']); -goog.addDependency('ui/menuitem.js', ['goog.ui.MenuItem'], ['goog.array', 'goog.dom', 'goog.dom.classes', 'goog.events.KeyCodes', 'goog.math.Coordinate', 'goog.string', 'goog.ui.Component.State', 'goog.ui.Control', 'goog.ui.ControlContent', 'goog.ui.MenuItemRenderer', 'goog.ui.registry']); -goog.addDependency('ui/menuitemrenderer.js', ['goog.ui.MenuItemRenderer'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.dom', 'goog.dom.classes', 'goog.ui.Component.State', 'goog.ui.ControlContent', 'goog.ui.ControlRenderer']); +goog.addDependency('ui/menubutton.js', ['goog.ui.MenuButton'], ['goog.Timer', 'goog.a11y.aria', 'goog.a11y.aria.State', 'goog.asserts', 'goog.dom', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.math.Box', 'goog.math.Rect', 'goog.positioning', 'goog.positioning.Corner', 'goog.positioning.MenuAnchoredPosition', 'goog.positioning.Overflow', 'goog.style', 'goog.ui.Button', 'goog.ui.Component', 'goog.ui.Menu', 'goog.ui.MenuButtonRenderer', 'goog.ui.MenuRenderer', 'goog.ui.registry', 'goog.userAgent', 'goog.userAgent.product']); +goog.addDependency('ui/menubuttonrenderer.js', ['goog.ui.MenuButtonRenderer'], ['goog.dom', 'goog.style', 'goog.ui.CustomButtonRenderer', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.Menu', 'goog.ui.MenuRenderer']); +goog.addDependency('ui/menuheader.js', ['goog.ui.MenuHeader'], ['goog.ui.Component', 'goog.ui.Control', 'goog.ui.MenuHeaderRenderer', 'goog.ui.registry']); +goog.addDependency('ui/menuheaderrenderer.js', ['goog.ui.MenuHeaderRenderer'], ['goog.ui.ControlRenderer']); +goog.addDependency('ui/menuitem.js', ['goog.ui.MenuItem'], ['goog.a11y.aria.Role', 'goog.array', 'goog.dom', 'goog.dom.classlist', 'goog.math.Coordinate', 'goog.string', 'goog.ui.Component', 'goog.ui.Control', 'goog.ui.MenuItemRenderer', 'goog.ui.registry']); +goog.addDependency('ui/menuitemrenderer.js', ['goog.ui.MenuItemRenderer'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.ui.Component', 'goog.ui.ControlRenderer']); goog.addDependency('ui/menurenderer.js', ['goog.ui.MenuRenderer'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.asserts', 'goog.dom', 'goog.ui.ContainerRenderer', 'goog.ui.Separator']); goog.addDependency('ui/menuseparator.js', ['goog.ui.MenuSeparator'], ['goog.ui.MenuSeparatorRenderer', 'goog.ui.Separator', 'goog.ui.registry']); -goog.addDependency('ui/menuseparatorrenderer.js', ['goog.ui.MenuSeparatorRenderer'], ['goog.dom', 'goog.dom.classes', 'goog.ui.ControlContent', 'goog.ui.ControlRenderer']); +goog.addDependency('ui/menuseparatorrenderer.js', ['goog.ui.MenuSeparatorRenderer'], ['goog.dom', 'goog.dom.classlist', 'goog.ui.ControlContent', 'goog.ui.ControlRenderer']); goog.addDependency('ui/mockactivitymonitor.js', ['goog.ui.MockActivityMonitor'], ['goog.events.EventType', 'goog.ui.ActivityMonitor']); goog.addDependency('ui/mockactivitymonitor_test.js', ['goog.ui.MockActivityMonitorTest'], ['goog.events', 'goog.functions', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.ui.ActivityMonitor', 'goog.ui.MockActivityMonitor']); -goog.addDependency('ui/modalpopup.js', ['goog.ui.ModalPopup'], ['goog.Timer', 'goog.a11y.aria', 'goog.a11y.aria.State', 'goog.asserts', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classes', 'goog.dom.iframe', 'goog.events', 'goog.events.EventType', 'goog.events.FocusHandler', 'goog.fx.Transition', 'goog.style', 'goog.ui.Component', 'goog.ui.PopupBase', 'goog.userAgent']); -goog.addDependency('ui/nativebuttonrenderer.js', ['goog.ui.NativeButtonRenderer'], ['goog.dom.classes', 'goog.events.EventType', 'goog.ui.ButtonRenderer', 'goog.ui.Component.State']); -goog.addDependency('ui/offlineinstalldialog.js', ['goog.ui.OfflineInstallDialog', 'goog.ui.OfflineInstallDialog.ButtonKeyType', 'goog.ui.OfflineInstallDialog.EnableScreen', 'goog.ui.OfflineInstallDialog.InstallScreen', 'goog.ui.OfflineInstallDialog.InstallingGearsScreen', 'goog.ui.OfflineInstallDialog.ScreenType', 'goog.ui.OfflineInstallDialog.UpgradeScreen', 'goog.ui.OfflineInstallDialogScreen'], ['goog.Disposable', 'goog.dom.classes', 'goog.gears', 'goog.string', 'goog.string.StringBuffer', 'goog.ui.Dialog', 'goog.ui.Dialog.ButtonSet', 'goog.ui.Dialog.EventType', 'goog.window']); -goog.addDependency('ui/offlinestatuscard.js', ['goog.ui.OfflineStatusCard', 'goog.ui.OfflineStatusCard.EventType'], ['goog.dom', 'goog.events.EventType', 'goog.gears.StatusType', 'goog.structs.Map', 'goog.style', 'goog.ui.Component', 'goog.ui.ProgressBar']); -goog.addDependency('ui/offlinestatuscomponent.js', ['goog.ui.OfflineStatusComponent', 'goog.ui.OfflineStatusComponent.StatusClassNames'], ['goog.dom.classes', 'goog.events.EventType', 'goog.gears.StatusType', 'goog.positioning', 'goog.positioning.AnchoredPosition', 'goog.positioning.Corner', 'goog.positioning.Overflow', 'goog.ui.Component', 'goog.ui.OfflineStatusCard.EventType', 'goog.ui.Popup']); +goog.addDependency('ui/modalpopup.js', ['goog.ui.ModalPopup'], ['goog.Timer', 'goog.a11y.aria', 'goog.a11y.aria.State', 'goog.asserts', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.dom.iframe', 'goog.events', 'goog.events.EventType', 'goog.events.FocusHandler', 'goog.fx.Transition', 'goog.string', 'goog.style', 'goog.ui.Component', 'goog.ui.PopupBase', 'goog.userAgent']); +goog.addDependency('ui/nativebuttonrenderer.js', ['goog.ui.NativeButtonRenderer'], ['goog.asserts', 'goog.dom.classlist', 'goog.events.EventType', 'goog.ui.ButtonRenderer', 'goog.ui.Component']); goog.addDependency('ui/option.js', ['goog.ui.Option'], ['goog.ui.Component', 'goog.ui.MenuItem', 'goog.ui.registry']); goog.addDependency('ui/palette.js', ['goog.ui.Palette'], ['goog.array', 'goog.dom', 'goog.events', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.math.Size', 'goog.ui.Component', 'goog.ui.Control', 'goog.ui.PaletteRenderer', 'goog.ui.SelectionModel']); -goog.addDependency('ui/paletterenderer.js', ['goog.ui.PaletteRenderer'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.array', 'goog.dom', 'goog.dom.NodeIterator', 'goog.dom.NodeType', 'goog.dom.classes', 'goog.iter', 'goog.style', 'goog.ui.ControlRenderer', 'goog.userAgent']); +goog.addDependency('ui/paletterenderer.js', ['goog.ui.PaletteRenderer'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.NodeIterator', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.iter', 'goog.style', 'goog.ui.ControlRenderer', 'goog.userAgent']); goog.addDependency('ui/plaintextspellchecker.js', ['goog.ui.PlainTextSpellChecker'], ['goog.Timer', 'goog.a11y.aria', 'goog.asserts', 'goog.dom', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.spell.SpellCheck', 'goog.style', 'goog.ui.AbstractSpellChecker', 'goog.ui.Component', 'goog.userAgent']); -goog.addDependency('ui/popup.js', ['goog.ui.Popup', 'goog.ui.Popup.AbsolutePosition', 'goog.ui.Popup.AnchoredPosition', 'goog.ui.Popup.AnchoredViewPortPosition', 'goog.ui.Popup.ClientPosition', 'goog.ui.Popup.Corner', 'goog.ui.Popup.Overflow', 'goog.ui.Popup.ViewPortClientPosition', 'goog.ui.Popup.ViewPortPosition'], ['goog.math.Box', 'goog.positioning', 'goog.positioning.AbsolutePosition', 'goog.positioning.AnchoredPosition', 'goog.positioning.AnchoredViewportPosition', 'goog.positioning.ClientPosition', 'goog.positioning.Corner', 'goog.positioning.Overflow', 'goog.positioning.OverflowStatus', 'goog.positioning.ViewportClientPosition', 'goog.positioning.ViewportPosition', 'goog.style', 'goog.ui.PopupBase']); -goog.addDependency('ui/popupbase.js', ['goog.ui.PopupBase', 'goog.ui.PopupBase.EventType', 'goog.ui.PopupBase.Type'], ['goog.Timer', 'goog.dom', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.fx.Transition', 'goog.fx.Transition.EventType', 'goog.style', 'goog.userAgent']); -goog.addDependency('ui/popupcolorpicker.js', ['goog.ui.PopupColorPicker'], ['goog.dom.classes', 'goog.events.EventType', 'goog.positioning.AnchoredPosition', 'goog.positioning.Corner', 'goog.ui.ColorPicker', 'goog.ui.ColorPicker.EventType', 'goog.ui.Component', 'goog.ui.Popup']); -goog.addDependency('ui/popupdatepicker.js', ['goog.ui.PopupDatePicker'], ['goog.events.EventType', 'goog.positioning.AnchoredPosition', 'goog.positioning.Corner', 'goog.style', 'goog.ui.Component', 'goog.ui.DatePicker', 'goog.ui.DatePicker.Events', 'goog.ui.Popup', 'goog.ui.PopupBase.EventType']); -goog.addDependency('ui/popupmenu.js', ['goog.ui.PopupMenu'], ['goog.events.EventType', 'goog.positioning.AnchoredViewportPosition', 'goog.positioning.Corner', 'goog.positioning.MenuAnchoredPosition', 'goog.positioning.ViewportClientPosition', 'goog.structs', 'goog.structs.Map', 'goog.style', 'goog.ui.Component.EventType', 'goog.ui.Menu', 'goog.ui.PopupBase', 'goog.userAgent']); -goog.addDependency('ui/progressbar.js', ['goog.ui.ProgressBar', 'goog.ui.ProgressBar.Orientation'], ['goog.a11y.aria', 'goog.asserts', 'goog.dom', 'goog.dom.classes', 'goog.events', 'goog.events.EventType', 'goog.ui.Component', 'goog.ui.RangeModel', 'goog.userAgent']); -goog.addDependency('ui/prompt.js', ['goog.ui.Prompt'], ['goog.Timer', 'goog.dom', 'goog.events', 'goog.events.EventType', 'goog.functions', 'goog.ui.Component.Error', 'goog.ui.Dialog', 'goog.ui.Dialog.ButtonSet', 'goog.ui.Dialog.DefaultButtonKeys', 'goog.ui.Dialog.EventType', 'goog.userAgent']); -goog.addDependency('ui/rangemodel.js', ['goog.ui.RangeModel'], ['goog.events.EventTarget', 'goog.ui.Component.EventType']); -goog.addDependency('ui/ratings.js', ['goog.ui.Ratings', 'goog.ui.Ratings.EventType'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.asserts', 'goog.dom.classes', 'goog.events.EventType', 'goog.ui.Component']); -goog.addDependency('ui/registry.js', ['goog.ui.registry'], ['goog.dom.classes']); +goog.addDependency('ui/popup.js', ['goog.ui.Popup', 'goog.ui.Popup.AbsolutePosition', 'goog.ui.Popup.AnchoredPosition', 'goog.ui.Popup.AnchoredViewPortPosition', 'goog.ui.Popup.ClientPosition', 'goog.ui.Popup.Corner', 'goog.ui.Popup.Overflow', 'goog.ui.Popup.ViewPortClientPosition', 'goog.ui.Popup.ViewPortPosition'], ['goog.math.Box', 'goog.positioning.AbsolutePosition', 'goog.positioning.AnchoredPosition', 'goog.positioning.AnchoredViewportPosition', 'goog.positioning.ClientPosition', 'goog.positioning.Corner', 'goog.positioning.Overflow', 'goog.positioning.ViewportClientPosition', 'goog.positioning.ViewportPosition', 'goog.style', 'goog.ui.PopupBase']); +goog.addDependency('ui/popupbase.js', ['goog.ui.PopupBase', 'goog.ui.PopupBase.EventType', 'goog.ui.PopupBase.Type'], ['goog.Timer', 'goog.array', 'goog.dom', 'goog.events', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.fx.Transition', 'goog.style', 'goog.userAgent']); +goog.addDependency('ui/popupcolorpicker.js', ['goog.ui.PopupColorPicker'], ['goog.asserts', 'goog.dom.classlist', 'goog.events.EventType', 'goog.positioning.AnchoredPosition', 'goog.positioning.Corner', 'goog.ui.ColorPicker', 'goog.ui.Component', 'goog.ui.Popup']); +goog.addDependency('ui/popupdatepicker.js', ['goog.ui.PopupDatePicker'], ['goog.events.EventType', 'goog.positioning.AnchoredPosition', 'goog.positioning.Corner', 'goog.positioning.Overflow', 'goog.style', 'goog.ui.Component', 'goog.ui.DatePicker', 'goog.ui.Popup', 'goog.ui.PopupBase']); +goog.addDependency('ui/popupmenu.js', ['goog.ui.PopupMenu'], ['goog.events.EventType', 'goog.positioning.AnchoredViewportPosition', 'goog.positioning.Corner', 'goog.positioning.MenuAnchoredPosition', 'goog.positioning.Overflow', 'goog.positioning.ViewportClientPosition', 'goog.structs.Map', 'goog.style', 'goog.ui.Component', 'goog.ui.Menu', 'goog.ui.PopupBase', 'goog.userAgent']); +goog.addDependency('ui/progressbar.js', ['goog.ui.ProgressBar', 'goog.ui.ProgressBar.Orientation'], ['goog.a11y.aria', 'goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.events', 'goog.events.EventType', 'goog.ui.Component', 'goog.ui.RangeModel', 'goog.userAgent']); +goog.addDependency('ui/prompt.js', ['goog.ui.Prompt'], ['goog.Timer', 'goog.dom', 'goog.events', 'goog.events.EventType', 'goog.functions', 'goog.html.SafeHtml', 'goog.html.legacyconversions', 'goog.ui.Component', 'goog.ui.Dialog', 'goog.userAgent']); +goog.addDependency('ui/rangemodel.js', ['goog.ui.RangeModel'], ['goog.events.EventTarget', 'goog.ui.Component']); +goog.addDependency('ui/ratings.js', ['goog.ui.Ratings', 'goog.ui.Ratings.EventType'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.asserts', 'goog.dom.classlist', 'goog.events.EventType', 'goog.ui.Component']); +goog.addDependency('ui/registry.js', ['goog.ui.registry'], ['goog.asserts', 'goog.dom.classlist']); goog.addDependency('ui/richtextspellchecker.js', ['goog.ui.RichTextSpellChecker'], ['goog.Timer', 'goog.dom', 'goog.dom.NodeType', 'goog.events', 'goog.events.EventType', 'goog.spell.SpellCheck', 'goog.string.StringBuffer', 'goog.ui.AbstractSpellChecker']); -goog.addDependency('ui/roundedpanel.js', ['goog.ui.BaseRoundedPanel', 'goog.ui.CssRoundedPanel', 'goog.ui.GraphicsRoundedPanel', 'goog.ui.RoundedPanel', 'goog.ui.RoundedPanel.Corner'], ['goog.dom', 'goog.dom.classes', 'goog.graphics', 'goog.graphics.Path', 'goog.graphics.SolidFill', 'goog.graphics.Stroke', 'goog.math', 'goog.math.Coordinate', 'goog.style', 'goog.ui.Component', 'goog.userAgent']); -goog.addDependency('ui/roundedtabrenderer.js', ['goog.ui.RoundedTabRenderer'], ['goog.dom', 'goog.ui.Tab', 'goog.ui.TabBar.Location', 'goog.ui.TabRenderer', 'goog.ui.registry']); -goog.addDependency('ui/scrollfloater.js', ['goog.ui.ScrollFloater', 'goog.ui.ScrollFloater.EventType'], ['goog.array', 'goog.dom', 'goog.dom.classes', 'goog.events.EventType', 'goog.style', 'goog.ui.Component', 'goog.userAgent']); -goog.addDependency('ui/select.js', ['goog.ui.Select'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.asserts', 'goog.events.EventType', 'goog.ui.Component.EventType', 'goog.ui.ControlContent', 'goog.ui.MenuButton', 'goog.ui.SelectionModel', 'goog.ui.registry']); -goog.addDependency('ui/selectionmenubutton.js', ['goog.ui.SelectionMenuButton', 'goog.ui.SelectionMenuButton.SelectionState'], ['goog.events.EventType', 'goog.ui.Component.EventType', 'goog.ui.Menu', 'goog.ui.MenuButton', 'goog.ui.MenuItem']); +goog.addDependency('ui/roundedpanel.js', ['goog.ui.BaseRoundedPanel', 'goog.ui.CssRoundedPanel', 'goog.ui.GraphicsRoundedPanel', 'goog.ui.RoundedPanel', 'goog.ui.RoundedPanel.Corner'], ['goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.graphics', 'goog.graphics.Path', 'goog.graphics.SolidFill', 'goog.graphics.Stroke', 'goog.math', 'goog.math.Coordinate', 'goog.style', 'goog.ui.Component', 'goog.userAgent']); +goog.addDependency('ui/roundedtabrenderer.js', ['goog.ui.RoundedTabRenderer'], ['goog.dom', 'goog.ui.Tab', 'goog.ui.TabBar', 'goog.ui.TabRenderer', 'goog.ui.registry']); +goog.addDependency('ui/scrollfloater.js', ['goog.ui.ScrollFloater', 'goog.ui.ScrollFloater.EventType'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.events.EventType', 'goog.style', 'goog.ui.Component', 'goog.userAgent']); +goog.addDependency('ui/select.js', ['goog.ui.Select'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.events.EventType', 'goog.ui.Component', 'goog.ui.MenuButton', 'goog.ui.MenuItem', 'goog.ui.MenuRenderer', 'goog.ui.SelectionModel', 'goog.ui.registry']); +goog.addDependency('ui/selectionmenubutton.js', ['goog.ui.SelectionMenuButton', 'goog.ui.SelectionMenuButton.SelectionState'], ['goog.events.EventType', 'goog.style', 'goog.ui.Component', 'goog.ui.MenuButton', 'goog.ui.MenuItem', 'goog.ui.registry']); goog.addDependency('ui/selectionmodel.js', ['goog.ui.SelectionModel'], ['goog.array', 'goog.events.EventTarget', 'goog.events.EventType']); -goog.addDependency('ui/separator.js', ['goog.ui.Separator'], ['goog.a11y.aria', 'goog.asserts', 'goog.ui.Component.State', 'goog.ui.Control', 'goog.ui.MenuSeparatorRenderer', 'goog.ui.registry']); +goog.addDependency('ui/separator.js', ['goog.ui.Separator'], ['goog.a11y.aria', 'goog.asserts', 'goog.ui.Component', 'goog.ui.Control', 'goog.ui.MenuSeparatorRenderer', 'goog.ui.registry']); goog.addDependency('ui/serverchart.js', ['goog.ui.ServerChart', 'goog.ui.ServerChart.AxisDisplayType', 'goog.ui.ServerChart.ChartType', 'goog.ui.ServerChart.EncodingType', 'goog.ui.ServerChart.Event', 'goog.ui.ServerChart.LegendPosition', 'goog.ui.ServerChart.MaximumValue', 'goog.ui.ServerChart.MultiAxisAlignment', 'goog.ui.ServerChart.MultiAxisType', 'goog.ui.ServerChart.UriParam', 'goog.ui.ServerChart.UriTooLongEvent'], ['goog.Uri', 'goog.array', 'goog.asserts', 'goog.events.Event', 'goog.string', 'goog.ui.Component']); -goog.addDependency('ui/slider.js', ['goog.ui.Slider', 'goog.ui.Slider.Orientation'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.dom', 'goog.ui.SliderBase', 'goog.ui.SliderBase.Orientation']); -goog.addDependency('ui/sliderbase.js', ['goog.ui.SliderBase', 'goog.ui.SliderBase.AnimationFactory', 'goog.ui.SliderBase.Orientation'], ['goog.Timer', 'goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.classes', 'goog.events', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.events.MouseWheelHandler', 'goog.fx.AnimationParallelQueue', 'goog.fx.Dragger', 'goog.fx.Transition', 'goog.fx.dom.ResizeHeight', 'goog.fx.dom.ResizeWidth', 'goog.fx.dom.Slide', 'goog.math', 'goog.math.Coordinate', 'goog.style', 'goog.style.bidi', 'goog.ui.Component', 'goog.ui.RangeModel']); -goog.addDependency('ui/splitbehavior.js', ['goog.ui.SplitBehavior', 'goog.ui.SplitBehavior.DefaultHandlers'], ['goog.Disposable', 'goog.array', 'goog.dispose', 'goog.dom', 'goog.dom.DomHelper', 'goog.dom.classes', 'goog.events', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.string', 'goog.ui.ButtonSide', 'goog.ui.Component', 'goog.ui.Component.Error', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.decorate', 'goog.ui.registry']); -goog.addDependency('ui/splitpane.js', ['goog.ui.SplitPane', 'goog.ui.SplitPane.Orientation'], ['goog.dom', 'goog.dom.classes', 'goog.events.EventType', 'goog.fx.Dragger', 'goog.fx.Dragger.EventType', 'goog.math.Rect', 'goog.math.Size', 'goog.style', 'goog.ui.Component', 'goog.ui.Component.EventType', 'goog.userAgent']); -goog.addDependency('ui/style/app/buttonrenderer.js', ['goog.ui.style.app.ButtonRenderer'], ['goog.dom.classes', 'goog.ui.Button', 'goog.ui.ControlContent', 'goog.ui.CustomButtonRenderer', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.registry']); -goog.addDependency('ui/style/app/menubuttonrenderer.js', ['goog.ui.style.app.MenuButtonRenderer'], ['goog.a11y.aria.Role', 'goog.array', 'goog.dom', 'goog.style', 'goog.ui.ControlContent', 'goog.ui.Menu', 'goog.ui.MenuRenderer', 'goog.ui.style.app.ButtonRenderer']); +goog.addDependency('ui/slider.js', ['goog.ui.Slider', 'goog.ui.Slider.Orientation'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.dom', 'goog.ui.SliderBase']); +goog.addDependency('ui/sliderbase.js', ['goog.ui.SliderBase', 'goog.ui.SliderBase.AnimationFactory', 'goog.ui.SliderBase.Orientation'], ['goog.Timer', 'goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.events', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.events.MouseWheelHandler', 'goog.functions', 'goog.fx.AnimationParallelQueue', 'goog.fx.Dragger', 'goog.fx.Transition', 'goog.fx.dom.ResizeHeight', 'goog.fx.dom.ResizeWidth', 'goog.fx.dom.Slide', 'goog.math', 'goog.math.Coordinate', 'goog.style', 'goog.style.bidi', 'goog.ui.Component', 'goog.ui.RangeModel']); +goog.addDependency('ui/splitbehavior.js', ['goog.ui.SplitBehavior', 'goog.ui.SplitBehavior.DefaultHandlers'], ['goog.Disposable', 'goog.asserts', 'goog.dispose', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.classlist', 'goog.events.EventHandler', 'goog.ui.ButtonSide', 'goog.ui.Component', 'goog.ui.decorate', 'goog.ui.registry']); +goog.addDependency('ui/splitpane.js', ['goog.ui.SplitPane', 'goog.ui.SplitPane.Orientation'], ['goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.events.EventType', 'goog.fx.Dragger', 'goog.math.Rect', 'goog.math.Size', 'goog.style', 'goog.ui.Component', 'goog.userAgent']); +goog.addDependency('ui/style/app/buttonrenderer.js', ['goog.ui.style.app.ButtonRenderer'], ['goog.dom.classlist', 'goog.ui.Button', 'goog.ui.CustomButtonRenderer', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.registry']); +goog.addDependency('ui/style/app/menubuttonrenderer.js', ['goog.ui.style.app.MenuButtonRenderer'], ['goog.a11y.aria.Role', 'goog.array', 'goog.dom', 'goog.style', 'goog.ui.Menu', 'goog.ui.MenuRenderer', 'goog.ui.style.app.ButtonRenderer']); goog.addDependency('ui/style/app/primaryactionbuttonrenderer.js', ['goog.ui.style.app.PrimaryActionButtonRenderer'], ['goog.ui.Button', 'goog.ui.registry', 'goog.ui.style.app.ButtonRenderer']); -goog.addDependency('ui/submenu.js', ['goog.ui.SubMenu'], ['goog.Timer', 'goog.dom', 'goog.dom.classes', 'goog.events.KeyCodes', 'goog.positioning.AnchoredViewportPosition', 'goog.positioning.Corner', 'goog.style', 'goog.ui.Component', 'goog.ui.Component.EventType', 'goog.ui.Component.State', 'goog.ui.ControlContent', 'goog.ui.Menu', 'goog.ui.MenuItem', 'goog.ui.SubMenuRenderer', 'goog.ui.registry']); -goog.addDependency('ui/submenurenderer.js', ['goog.ui.SubMenuRenderer'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.asserts', 'goog.dom', 'goog.dom.classes', 'goog.style', 'goog.ui.Menu', 'goog.ui.MenuItemRenderer']); -goog.addDependency('ui/tab.js', ['goog.ui.Tab'], ['goog.ui.Component.State', 'goog.ui.Control', 'goog.ui.ControlContent', 'goog.ui.TabRenderer', 'goog.ui.registry']); +goog.addDependency('ui/submenu.js', ['goog.ui.SubMenu'], ['goog.Timer', 'goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.events.KeyCodes', 'goog.positioning.AnchoredViewportPosition', 'goog.positioning.Corner', 'goog.style', 'goog.ui.Component', 'goog.ui.Menu', 'goog.ui.MenuItem', 'goog.ui.SubMenuRenderer', 'goog.ui.registry']); +goog.addDependency('ui/submenurenderer.js', ['goog.ui.SubMenuRenderer'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.style', 'goog.ui.Menu', 'goog.ui.MenuItemRenderer']); +goog.addDependency('ui/tab.js', ['goog.ui.Tab'], ['goog.ui.Component', 'goog.ui.Control', 'goog.ui.TabRenderer', 'goog.ui.registry']); goog.addDependency('ui/tabbar.js', ['goog.ui.TabBar', 'goog.ui.TabBar.Location'], ['goog.ui.Component.EventType', 'goog.ui.Container', 'goog.ui.Container.Orientation', 'goog.ui.Tab', 'goog.ui.TabBarRenderer', 'goog.ui.registry']); goog.addDependency('ui/tabbarrenderer.js', ['goog.ui.TabBarRenderer'], ['goog.a11y.aria.Role', 'goog.object', 'goog.ui.ContainerRenderer']); -goog.addDependency('ui/tablesorter.js', ['goog.ui.TableSorter', 'goog.ui.TableSorter.EventType'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classes', 'goog.events', 'goog.events.EventType', 'goog.functions', 'goog.ui.Component']); -goog.addDependency('ui/tabpane.js', ['goog.ui.TabPane', 'goog.ui.TabPane.Events', 'goog.ui.TabPane.TabLocation', 'goog.ui.TabPane.TabPage', 'goog.ui.TabPaneEvent'], ['goog.dom', 'goog.dom.classes', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.style']); -goog.addDependency('ui/tabrenderer.js', ['goog.ui.TabRenderer'], ['goog.a11y.aria.Role', 'goog.ui.Component.State', 'goog.ui.ControlRenderer']); -goog.addDependency('ui/textarea.js', ['goog.ui.Textarea', 'goog.ui.Textarea.EventType'], ['goog.Timer', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.style', 'goog.ui.Control', 'goog.ui.TextareaRenderer', 'goog.userAgent', 'goog.userAgent.product']); -goog.addDependency('ui/textarearenderer.js', ['goog.ui.TextareaRenderer'], ['goog.ui.Component.State', 'goog.ui.ControlRenderer']); +goog.addDependency('ui/tablesorter.js', ['goog.ui.TableSorter', 'goog.ui.TableSorter.EventType'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.EventType', 'goog.functions', 'goog.ui.Component']); +goog.addDependency('ui/tabpane.js', ['goog.ui.TabPane', 'goog.ui.TabPane.Events', 'goog.ui.TabPane.TabLocation', 'goog.ui.TabPane.TabPage', 'goog.ui.TabPaneEvent'], ['goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.style']); +goog.addDependency('ui/tabrenderer.js', ['goog.ui.TabRenderer'], ['goog.a11y.aria.Role', 'goog.ui.Component', 'goog.ui.ControlRenderer']); +goog.addDependency('ui/textarea.js', ['goog.ui.Textarea', 'goog.ui.Textarea.EventType'], ['goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.events.EventType', 'goog.style', 'goog.ui.Control', 'goog.ui.TextareaRenderer', 'goog.userAgent']); +goog.addDependency('ui/textarearenderer.js', ['goog.ui.TextareaRenderer'], ['goog.dom.TagName', 'goog.ui.Component', 'goog.ui.ControlRenderer']); goog.addDependency('ui/togglebutton.js', ['goog.ui.ToggleButton'], ['goog.ui.Button', 'goog.ui.Component', 'goog.ui.CustomButtonRenderer', 'goog.ui.registry']); goog.addDependency('ui/toolbar.js', ['goog.ui.Toolbar'], ['goog.ui.Container', 'goog.ui.ToolbarRenderer']); -goog.addDependency('ui/toolbarbutton.js', ['goog.ui.ToolbarButton'], ['goog.ui.Button', 'goog.ui.ControlContent', 'goog.ui.ToolbarButtonRenderer', 'goog.ui.registry']); +goog.addDependency('ui/toolbarbutton.js', ['goog.ui.ToolbarButton'], ['goog.ui.Button', 'goog.ui.ToolbarButtonRenderer', 'goog.ui.registry']); goog.addDependency('ui/toolbarbuttonrenderer.js', ['goog.ui.ToolbarButtonRenderer'], ['goog.ui.CustomButtonRenderer']); -goog.addDependency('ui/toolbarcolormenubutton.js', ['goog.ui.ToolbarColorMenuButton'], ['goog.ui.ColorMenuButton', 'goog.ui.ControlContent', 'goog.ui.ToolbarColorMenuButtonRenderer', 'goog.ui.registry']); -goog.addDependency('ui/toolbarcolormenubuttonrenderer.js', ['goog.ui.ToolbarColorMenuButtonRenderer'], ['goog.dom.classes', 'goog.ui.ColorMenuButtonRenderer', 'goog.ui.ControlContent', 'goog.ui.MenuButtonRenderer', 'goog.ui.ToolbarMenuButtonRenderer']); -goog.addDependency('ui/toolbarmenubutton.js', ['goog.ui.ToolbarMenuButton'], ['goog.ui.ControlContent', 'goog.ui.MenuButton', 'goog.ui.ToolbarMenuButtonRenderer', 'goog.ui.registry']); +goog.addDependency('ui/toolbarcolormenubutton.js', ['goog.ui.ToolbarColorMenuButton'], ['goog.ui.ColorMenuButton', 'goog.ui.ToolbarColorMenuButtonRenderer', 'goog.ui.registry']); +goog.addDependency('ui/toolbarcolormenubuttonrenderer.js', ['goog.ui.ToolbarColorMenuButtonRenderer'], ['goog.asserts', 'goog.dom.classlist', 'goog.ui.ColorMenuButtonRenderer', 'goog.ui.MenuButtonRenderer', 'goog.ui.ToolbarMenuButtonRenderer']); +goog.addDependency('ui/toolbarmenubutton.js', ['goog.ui.ToolbarMenuButton'], ['goog.ui.MenuButton', 'goog.ui.ToolbarMenuButtonRenderer', 'goog.ui.registry']); goog.addDependency('ui/toolbarmenubuttonrenderer.js', ['goog.ui.ToolbarMenuButtonRenderer'], ['goog.ui.MenuButtonRenderer']); -goog.addDependency('ui/toolbarrenderer.js', ['goog.ui.ToolbarRenderer'], ['goog.a11y.aria.Role', 'goog.ui.Container.Orientation', 'goog.ui.ContainerRenderer', 'goog.ui.Separator', 'goog.ui.ToolbarSeparatorRenderer']); -goog.addDependency('ui/toolbarselect.js', ['goog.ui.ToolbarSelect'], ['goog.ui.ControlContent', 'goog.ui.Select', 'goog.ui.ToolbarMenuButtonRenderer', 'goog.ui.registry']); +goog.addDependency('ui/toolbarrenderer.js', ['goog.ui.ToolbarRenderer'], ['goog.a11y.aria.Role', 'goog.ui.Container', 'goog.ui.ContainerRenderer', 'goog.ui.Separator', 'goog.ui.ToolbarSeparatorRenderer']); +goog.addDependency('ui/toolbarselect.js', ['goog.ui.ToolbarSelect'], ['goog.ui.Select', 'goog.ui.ToolbarMenuButtonRenderer', 'goog.ui.registry']); goog.addDependency('ui/toolbarseparator.js', ['goog.ui.ToolbarSeparator'], ['goog.ui.Separator', 'goog.ui.ToolbarSeparatorRenderer', 'goog.ui.registry']); -goog.addDependency('ui/toolbarseparatorrenderer.js', ['goog.ui.ToolbarSeparatorRenderer'], ['goog.dom.classes', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.MenuSeparatorRenderer']); -goog.addDependency('ui/toolbartogglebutton.js', ['goog.ui.ToolbarToggleButton'], ['goog.ui.ControlContent', 'goog.ui.ToggleButton', 'goog.ui.ToolbarButtonRenderer', 'goog.ui.registry']); -goog.addDependency('ui/tooltip.js', ['goog.ui.Tooltip', 'goog.ui.Tooltip.CursorTooltipPosition', 'goog.ui.Tooltip.ElementTooltipPosition', 'goog.ui.Tooltip.State'], ['goog.Timer', 'goog.array', 'goog.dom', 'goog.events', 'goog.events.EventType', 'goog.math.Box', 'goog.math.Coordinate', 'goog.positioning', 'goog.positioning.AnchoredPosition', 'goog.positioning.Corner', 'goog.positioning.Overflow', 'goog.positioning.OverflowStatus', 'goog.positioning.ViewportPosition', 'goog.structs.Set', 'goog.style', 'goog.ui.Popup', 'goog.ui.PopupBase']); -goog.addDependency('ui/tree/basenode.js', ['goog.ui.tree.BaseNode', 'goog.ui.tree.BaseNode.EventType'], ['goog.Timer', 'goog.a11y.aria', 'goog.asserts', 'goog.events.KeyCodes', 'goog.string', 'goog.string.StringBuffer', 'goog.style', 'goog.ui.Component', 'goog.userAgent']); -goog.addDependency('ui/tree/treecontrol.js', ['goog.ui.tree.TreeControl'], ['goog.a11y.aria', 'goog.asserts', 'goog.debug.Logger', 'goog.dom.classes', 'goog.events.EventType', 'goog.events.FocusHandler', 'goog.events.KeyHandler', 'goog.events.KeyHandler.EventType', 'goog.ui.tree.BaseNode', 'goog.ui.tree.TreeNode', 'goog.ui.tree.TypeAhead', 'goog.userAgent']); +goog.addDependency('ui/toolbarseparatorrenderer.js', ['goog.ui.ToolbarSeparatorRenderer'], ['goog.asserts', 'goog.dom.classlist', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.MenuSeparatorRenderer']); +goog.addDependency('ui/toolbartogglebutton.js', ['goog.ui.ToolbarToggleButton'], ['goog.ui.ToggleButton', 'goog.ui.ToolbarButtonRenderer', 'goog.ui.registry']); +goog.addDependency('ui/tooltip.js', ['goog.ui.Tooltip', 'goog.ui.Tooltip.CursorTooltipPosition', 'goog.ui.Tooltip.ElementTooltipPosition', 'goog.ui.Tooltip.State'], ['goog.Timer', 'goog.array', 'goog.dom', 'goog.dom.safe', 'goog.events', 'goog.events.EventType', 'goog.html.legacyconversions', 'goog.math.Box', 'goog.math.Coordinate', 'goog.positioning', 'goog.positioning.AnchoredPosition', 'goog.positioning.Corner', 'goog.positioning.Overflow', 'goog.positioning.OverflowStatus', 'goog.positioning.ViewportPosition', 'goog.structs.Set', 'goog.style', 'goog.ui.Popup', 'goog.ui.PopupBase']); +goog.addDependency('ui/tree/basenode.js', ['goog.ui.tree.BaseNode', 'goog.ui.tree.BaseNode.EventType'], ['goog.Timer', 'goog.a11y.aria', 'goog.asserts', 'goog.dom.safe', 'goog.events.Event', 'goog.events.KeyCodes', 'goog.html.SafeHtml', 'goog.html.legacyconversions', 'goog.string', 'goog.string.StringBuffer', 'goog.style', 'goog.ui.Component']); +goog.addDependency('ui/tree/treecontrol.js', ['goog.ui.tree.TreeControl'], ['goog.a11y.aria', 'goog.asserts', 'goog.dom.classlist', 'goog.events.EventType', 'goog.events.FocusHandler', 'goog.events.KeyHandler', 'goog.html.SafeHtml', 'goog.log', 'goog.ui.tree.BaseNode', 'goog.ui.tree.TreeNode', 'goog.ui.tree.TypeAhead', 'goog.userAgent']); goog.addDependency('ui/tree/treenode.js', ['goog.ui.tree.TreeNode'], ['goog.ui.tree.BaseNode']); goog.addDependency('ui/tree/typeahead.js', ['goog.ui.tree.TypeAhead', 'goog.ui.tree.TypeAhead.Offset'], ['goog.array', 'goog.events.KeyCodes', 'goog.string', 'goog.structs.Trie']); -goog.addDependency('ui/tristatemenuitem.js', ['goog.ui.TriStateMenuItem', 'goog.ui.TriStateMenuItem.State'], ['goog.dom.classes', 'goog.ui.Component', 'goog.ui.MenuItem', 'goog.ui.TriStateMenuItemRenderer', 'goog.ui.registry']); -goog.addDependency('ui/tristatemenuitemrenderer.js', ['goog.ui.TriStateMenuItemRenderer'], ['goog.dom.classes', 'goog.ui.MenuItemRenderer']); +goog.addDependency('ui/tristatemenuitem.js', ['goog.ui.TriStateMenuItem', 'goog.ui.TriStateMenuItem.State'], ['goog.dom.classlist', 'goog.ui.Component', 'goog.ui.MenuItem', 'goog.ui.TriStateMenuItemRenderer', 'goog.ui.registry']); +goog.addDependency('ui/tristatemenuitemrenderer.js', ['goog.ui.TriStateMenuItemRenderer'], ['goog.asserts', 'goog.dom.classlist', 'goog.ui.MenuItemRenderer']); goog.addDependency('ui/twothumbslider.js', ['goog.ui.TwoThumbSlider'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.dom', 'goog.ui.SliderBase']); -goog.addDependency('ui/zippy.js', ['goog.ui.Zippy', 'goog.ui.Zippy.Events', 'goog.ui.ZippyEvent'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.classes', 'goog.events', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.style']); +goog.addDependency('ui/zippy.js', ['goog.ui.Zippy', 'goog.ui.Zippy.Events', 'goog.ui.ZippyEvent'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.classlist', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.style']); goog.addDependency('uri/uri.js', ['goog.Uri', 'goog.Uri.QueryData'], ['goog.array', 'goog.string', 'goog.structs', 'goog.structs.Map', 'goog.uri.utils', 'goog.uri.utils.ComponentIndex', 'goog.uri.utils.StandardQueryParam']); +goog.addDependency('uri/uri_test.js', ['goog.UriTest'], ['goog.Uri', 'goog.testing.jsunit']); goog.addDependency('uri/utils.js', ['goog.uri.utils', 'goog.uri.utils.ComponentIndex', 'goog.uri.utils.QueryArray', 'goog.uri.utils.QueryValue', 'goog.uri.utils.StandardQueryParam'], ['goog.asserts', 'goog.string', 'goog.userAgent']); +goog.addDependency('uri/utils_test.js', ['goog.uri.utilsTest'], ['goog.functions', 'goog.string', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.uri.utils']); goog.addDependency('useragent/adobereader.js', ['goog.userAgent.adobeReader'], ['goog.string', 'goog.userAgent']); +goog.addDependency('useragent/adobereader_test.js', ['goog.userAgent.adobeReaderTest'], ['goog.testing.jsunit', 'goog.userAgent.adobeReader']); goog.addDependency('useragent/flash.js', ['goog.userAgent.flash'], ['goog.string']); +goog.addDependency('useragent/flash_test.js', ['goog.userAgent.flashTest'], ['goog.testing.jsunit', 'goog.userAgent.flash']); goog.addDependency('useragent/iphoto.js', ['goog.userAgent.iphoto'], ['goog.string', 'goog.userAgent']); goog.addDependency('useragent/jscript.js', ['goog.userAgent.jscript'], ['goog.string']); +goog.addDependency('useragent/jscript_test.js', ['goog.userAgent.jscriptTest'], ['goog.testing.jsunit', 'goog.userAgent.jscript']); +goog.addDependency('useragent/keyboard.js', ['goog.userAgent.keyboard'], ['goog.userAgent', 'goog.userAgent.product']); +goog.addDependency('useragent/keyboard_test.js', ['goog.userAgent.keyboardTest'], ['goog.labs.userAgent.testAgents', 'goog.labs.userAgent.util', 'goog.testing.MockUserAgent', 'goog.testing.jsunit', 'goog.userAgent.keyboard', 'goog.userAgentTestUtil']); goog.addDependency('useragent/picasa.js', ['goog.userAgent.picasa'], ['goog.string', 'goog.userAgent']); goog.addDependency('useragent/platform.js', ['goog.userAgent.platform'], ['goog.userAgent']); +goog.addDependency('useragent/platform_test.js', ['goog.userAgent.platformTest'], ['goog.testing.MockUserAgent', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgent.platform']); goog.addDependency('useragent/product.js', ['goog.userAgent.product'], ['goog.userAgent']); goog.addDependency('useragent/product_isversion.js', ['goog.userAgent.product.isVersion'], ['goog.userAgent.product']); -goog.addDependency('useragent/useragent.js', ['goog.userAgent'], ['goog.string']); +goog.addDependency('useragent/product_test.js', ['goog.userAgent.productTest'], ['goog.array', 'goog.labs.userAgent.util', 'goog.testing.MockUserAgent', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgent.product', 'goog.userAgent.product.isVersion', 'goog.userAgentTestUtil']); +goog.addDependency('useragent/useragent.js', ['goog.userAgent'], ['goog.labs.userAgent.browser', 'goog.labs.userAgent.engine', 'goog.labs.userAgent.util', 'goog.string']); +goog.addDependency('useragent/useragent_quirks_test.js', ['goog.userAgentQuirksTest'], ['goog.testing.jsunit', 'goog.userAgent']); +goog.addDependency('useragent/useragent_test.js', ['goog.userAgentTest'], ['goog.array', 'goog.labs.userAgent.testAgents', 'goog.labs.userAgent.util', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgentTestUtil']); +goog.addDependency('useragent/useragenttestutil.js', ['goog.userAgentTestUtil', 'goog.userAgentTestUtil.UserAgents'], ['goog.labs.userAgent.browser', 'goog.labs.userAgent.engine', 'goog.userAgent', 'goog.userAgent.keyboard', 'goog.userAgent.platform', 'goog.userAgent.product', 'goog.userAgent.product.isVersion']); goog.addDependency('vec/float32array.js', ['goog.vec.Float32Array'], []); goog.addDependency('vec/float64array.js', ['goog.vec.Float64Array'], []); goog.addDependency('vec/mat3.js', ['goog.vec.Mat3'], ['goog.vec']); @@ -895,3 +1337,4 @@ goog.addDependency('vec/vec4d.js', ['goog.vec.vec4d', 'goog.vec.vec4d.Type'], [' goog.addDependency('vec/vec4f.js', ['goog.vec.vec4f', 'goog.vec.vec4f.Type'], ['goog.vec']); goog.addDependency('webgl/webgl.js', ['goog.webgl'], []); goog.addDependency('window/window.js', ['goog.window'], ['goog.string', 'goog.userAgent']); +goog.addDependency('window/window_test.js', ['goog.windowTest'], ['goog.dom', 'goog.events', 'goog.string', 'goog.testing.AsyncTestCase', 'goog.testing.jsunit', 'goog.window']); diff --git a/third_party/closure/goog/disposable/disposable.js b/third_party/closure/goog/disposable/disposable.js index ac8e3c4a6b4eb..cdb29b2e29527 100644 --- a/third_party/closure/goog/disposable/disposable.js +++ b/third_party/closure/goog/disposable/disposable.js @@ -20,7 +20,10 @@ goog.provide('goog.Disposable'); +/** @suppress {extraProvide} */ goog.provide('goog.dispose'); +/** @suppress {extraProvide} */ +goog.provide('goog.disposeAll'); goog.require('goog.disposable.IDisposable'); @@ -36,7 +39,9 @@ goog.require('goog.disposable.IDisposable'); */ goog.Disposable = function() { if (goog.Disposable.MONITORING_MODE != goog.Disposable.MonitoringMode.OFF) { - this.creationStack = new Error().stack; + if (goog.Disposable.INCLUDE_STACK_ON_CREATION) { + this.creationStack = new Error().stack; + } goog.Disposable.instances_[goog.getUid(this)] = this; } }; @@ -53,7 +58,7 @@ goog.Disposable.MonitoringMode = { /** * Creating and disposing the goog.Disposable instances is monitored. All * disposable objects need to call the {@code goog.Disposable} base - * constructor. The PERMANENT mode must bet switched on before creating any + * constructor. The PERMANENT mode must be switched on before creating any * goog.Disposable instances. */ PERMANENT: 1, @@ -76,6 +81,13 @@ goog.Disposable.MonitoringMode = { goog.define('goog.Disposable.MONITORING_MODE', 0); +/** + * @define {boolean} Whether to attach creation stack to each created disposable + * instance; This is only relevant for when MonitoringMode != OFF. + */ +goog.define('goog.Disposable.INCLUDE_STACK_ON_CREATION', true); + + /** * Maps the unique ID of every undisposed {@code goog.Disposable} object to * the object itself. diff --git a/third_party/closure/goog/disposable/idisposable.js b/third_party/closure/goog/disposable/idisposable.js index e0c79ee905406..917d17ed39ff6 100644 --- a/third_party/closure/goog/disposable/idisposable.js +++ b/third_party/closure/goog/disposable/idisposable.js @@ -36,10 +36,10 @@ goog.disposable.IDisposable = function() {}; * Disposes of the object and its resources. * @return {void} Nothing. */ -goog.disposable.IDisposable.prototype.dispose; +goog.disposable.IDisposable.prototype.dispose = goog.abstractMethod; /** * @return {boolean} Whether the object has been disposed of. */ -goog.disposable.IDisposable.prototype.isDisposed; +goog.disposable.IDisposable.prototype.isDisposed = goog.abstractMethod; diff --git a/third_party/closure/goog/dom/a11y.js b/third_party/closure/goog/dom/a11y.js deleted file mode 100644 index d240d8c72d838..0000000000000 --- a/third_party/closure/goog/dom/a11y.js +++ /dev/null @@ -1,169 +0,0 @@ -// Copyright 2007 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 adding, removing and setting ARIA roles - * as defined by W3C ARIA Working Draft: - * http://www.w3.org/TR/2010/WD-wai-aria-20100916/ - * All modern browsers have some form of ARIA support, so no browser checks are - * performed when adding ARIA to components. - * - * - * @deprecated Use {@link goog.a11y.aria} instead. - * This file will be removed on 1 Apr 2013. - * - */ -goog.provide('goog.dom.a11y'); -goog.provide('goog.dom.a11y.Announcer'); -goog.provide('goog.dom.a11y.LivePriority'); -goog.provide('goog.dom.a11y.Role'); -goog.provide('goog.dom.a11y.State'); - -goog.require('goog.a11y.aria'); -goog.require('goog.a11y.aria.Announcer'); -goog.require('goog.a11y.aria.LivePriority'); -goog.require('goog.a11y.aria.Role'); -goog.require('goog.a11y.aria.State'); - - -/** - * Enumeration of ARIA states and properties. - * @enum {string} - * @deprecated Use {@link goog.a11y.aria.State} instead. - * This alias will be removed on 1 Apr 2013. - */ -goog.dom.a11y.State = goog.a11y.aria.State; - - -/** - * Enumeration of ARIA roles. - * @enum {string} - * @deprecated Use {@link goog.a11y.aria.Role} instead. - * This alias will be removed on 1 Apr 2013. - */ -goog.dom.a11y.Role = goog.a11y.aria.Role; - - -/** - * Enumeration of ARIA state values for live regions. - * - * See http://www.w3.org/TR/wai-aria/states_and_properties#aria-live - * for more information. - * @enum {string} - * @deprecated Use {@link goog.a11y.aria.LivePriority} instead. - * This alias will be removed on 1 Apr 2013. - */ -goog.dom.a11y.LivePriority = goog.a11y.aria.LivePriority; - - -/** - * Sets the role of an element. - * @param {Element} element DOM node to set role of. - * @param {goog.dom.a11y.Role|string} roleName role name(s). - * @deprecated Use {@link goog.a11y.aria.setRole} instead. - * This alias will be removed on 1 Apr 2013. - */ -goog.dom.a11y.setRole = function(element, roleName) { - goog.a11y.aria.setRole( - /** @type {!Element} */ (element), - /** @type {!goog.dom.a11y.Role} */ (roleName)); -}; - - -/** - * Gets role of an element. - * @param {Element} element DOM node to get role of. - * @return {?(goog.dom.a11y.Role|string)} rolename. - * @deprecated Use {@link goog.a11y.aria.getRole} instead. - * This alias will be removed on 1 Apr 2013. - */ -goog.dom.a11y.getRole = function(element) { - return /** @type {?(goog.dom.a11y.Role|string)} */ ( - goog.a11y.aria.getRole(/** @type {!Element} */ (element))); -}; - - -/** - * Sets the state or property of an element. - * @param {Element} element DOM node where we set state. - * @param {goog.dom.a11y.State|string} state State attribute being set. - * Automatically adds prefix 'aria-' to the state name. - * @param {boolean|number|string} value Value for the - * state attribute. - * @deprecated Use {@link goog.a11y.aria.setState} instead. - * This alias will be removed on 1 Apr 2013. - */ -goog.dom.a11y.setState = function(element, state, value) { - goog.a11y.aria.setState( - /** @type {!Element} */ (element), - /** @type {!goog.dom.a11y.State} */ (state), - /** @type {boolean|number|string} */ (value)); -}; - - -/** - * Gets value of specified state or property. - * @param {Element} element DOM node to get state from. - * @param {goog.dom.a11y.State|string} stateName State name. - * @return {string} Value of the state attribute. - * @deprecated Use {@link goog.a11y.aria.getState} instead. - * This alias will be removed on 1 Apr 2013. - */ -goog.dom.a11y.getState = function(element, stateName) { - return goog.a11y.aria.getState( - /** @type {!Element} */ (element), - /** @type {!goog.dom.a11y.State} */ (stateName)); -}; - - -/** - * Gets the activedescendant of the given element. - * @param {Element} element DOM node to get activedescendant from. - * @return {Element} DOM node of the activedescendant. - * @deprecated Use {@link goog.a11y.aria.getActiveDescendant} instead. - * This alias will be removed on 1 Apr 2013. - */ -goog.dom.a11y.getActiveDescendant = function(element) { - return goog.a11y.aria.getActiveDescendant( - /** @type {!Element} */ (element)); -}; - - -/** - * Sets the activedescendant value for an element. - * @param {Element} element DOM node to set activedescendant to. - * @param {Element} activeElement DOM node being set as activedescendant. - * @deprecated Use {@link goog.a11y.aria.setActiveDescendant} instead. - * This alias will be removed on 1 Apr 2013. - */ -goog.dom.a11y.setActiveDescendant = function(element, activeElement) { - goog.a11y.aria.setActiveDescendant( - /** @type {!Element} */ (element), - activeElement); -}; - - - -/** - * Class that allows messages to be spoken by assistive technologies that the - * user may have active. - * - * @param {goog.dom.DomHelper} domHelper DOM helper. - * @constructor - * @extends {goog.Disposable} - * @deprecated Use {@link goog.a11y.aria.Announcer} instead. - * This alias will be removed on 1 Apr 2013. - */ -goog.dom.a11y.Announcer = goog.a11y.aria.Announcer; - diff --git a/third_party/closure/goog/dom/abstractrange.js b/third_party/closure/goog/dom/abstractrange.js index 38a5aee061c09..ee4ed2dd7d0c5 100644 --- a/third_party/closure/goog/dom/abstractrange.js +++ b/third_party/closure/goog/dom/abstractrange.js @@ -109,7 +109,7 @@ goog.dom.AbstractRange.isNativeControlRange = function(range) { /** - * @return {goog.dom.AbstractRange} A clone of this range. + * @return {!goog.dom.AbstractRange} A clone of this range. */ goog.dom.AbstractRange.prototype.clone = goog.abstractMethod; @@ -157,7 +157,7 @@ goog.dom.AbstractRange.prototype.getTextRange = goog.abstractMethod; /** * Gets an array of all text ranges this range is comprised of. For non-multi * ranges, returns a single element array containing this. - * @return {Array.} Array of text ranges. + * @return {!Array.} Array of text ranges. */ goog.dom.AbstractRange.prototype.getTextRanges = function() { var output = []; @@ -276,7 +276,7 @@ goog.dom.AbstractRange.prototype.isReversed = function() { /** - * @return {Document} The document this selection is a part of. + * @return {!Document} The document this selection is a part of. */ goog.dom.AbstractRange.prototype.getDocument = function() { // Using start node in IE was crashing the browser in some cases so use @@ -289,7 +289,7 @@ goog.dom.AbstractRange.prototype.getDocument = function() { /** - * @return {Window} The window this selection is a part of. + * @return {!Window} The window this selection is a part of. */ goog.dom.AbstractRange.prototype.getWindow = function() { return goog.dom.getWindow(this.getDocument()); @@ -386,7 +386,7 @@ goog.dom.AbstractRange.prototype.getPastableHtml = goog.abstractMethod; * Returns a RangeIterator over the contents of the range. Regardless of the * direction of the range, the iterator will move in document order. * @param {boolean=} opt_keys Unused for this iterator. - * @return {goog.dom.RangeIterator} An iterator over tags in the range. + * @return {!goog.dom.RangeIterator} An iterator over tags in the range. */ goog.dom.AbstractRange.prototype.__iterator__ = goog.abstractMethod; @@ -448,7 +448,7 @@ goog.dom.AbstractRange.prototype.surroundWithNodes = goog.abstractMethod; /** * Saves the range so that if the start and end nodes are left alone, it can * be restored. - * @return {goog.dom.SavedRange} A range representation that can be restored + * @return {!goog.dom.SavedRange} A range representation that can be restored * as long as the endpoint nodes of the selection are not modified. */ goog.dom.AbstractRange.prototype.saveUsingDom = goog.abstractMethod; diff --git a/third_party/closure/goog/dom/animationframe/animationframe.js b/third_party/closure/goog/dom/animationframe/animationframe.js new file mode 100644 index 0000000000000..8698af3618fbd --- /dev/null +++ b/third_party/closure/goog/dom/animationframe/animationframe.js @@ -0,0 +1,269 @@ +// Copyright 2014 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 goog.dom.animationFrame permits work to be done in-sync with + * the render refresh rate of the browser and to divide work up globally based + * on whether the intent is not measure or to mutate the DOM. The latter avoids + * repeated style recalculation which can be really slow. + * + * Goals of the API: + *
    + *
  • Make it easy to schedule work for the next animation frame. + *
  • Make it easy to only do work once per animation frame, even if two + * events fire that trigger the same work. + *
  • Make it easy to do all work in two phases to avoid repeated style + * recalculation caused by interleaved reads and writes. + *
  • Avoid creating closures per schedule operation. + *
+ * + * + * Programmatic: + *
+ * var animationTask = goog.dom.animationFrame.createTask({
+ *     measure: function(state) {
+ *       state.width = goog.style.getSize(elem).width;
+ *       this.animationTask();
+ *     },
+ *     mutate: function(state) {
+ *       goog.style.setWidth(elem, Math.floor(state.width / 2));
+ *     }
+ *   }, this);
+ * });
+ * 
+ * + * See also + * https://developer.mozilla.org/en-US/docs/Web/API/window.requestAnimationFrame + */ + +goog.provide('goog.dom.animationFrame'); +goog.provide('goog.dom.animationFrame.Spec'); +goog.provide('goog.dom.animationFrame.State'); + +goog.require('goog.dom.animationFrame.polyfill'); + +// Install the polyfill. +goog.dom.animationFrame.polyfill.install(); + + +/** + * @typedef {{ + * id: number, + * fn: !Function, + * context: (!Object|undefined) + * }} + * @private + */ +goog.dom.animationFrame.Task_; + + +/** + * @typedef {{ + * measureTask: goog.dom.animationFrame.Task_, + * mutateTask: goog.dom.animationFrame.Task_, + * state: (!Object|undefined), + * args: (!Array|undefined), + * isScheduled: boolean + * }} + * @private + */ +goog.dom.animationFrame.TaskSet_; + + +/** + * @typedef {{ + * measure: (!Function|undefined), + * mutate: (!Function|undefined) + * }} + */ +goog.dom.animationFrame.Spec; + + + +/** + * A type to represent state. Users may add properties as desired. + * @constructor + * @final + */ +goog.dom.animationFrame.State = function() {}; + + +/** + * Saves a set of tasks to be executed in the next requestAnimationFrame phase. + * This list is initialized once before any event firing occurs. It is not + * affected by the fired events or the requestAnimationFrame processing (unless + * a new event is created during the processing). + * @private {!Array.>} + */ +goog.dom.animationFrame.tasks_ = [[], []]; + + +/** + * Values are 0 or 1, for whether the first or second array should be used to + * lookup or add tasks. + * @private {number} + */ +goog.dom.animationFrame.doubleBufferIndex_ = 0; + + +/** + * Whether we have already requested an animation frame that hasn't happened + * yet. + * @private {boolean} + */ +goog.dom.animationFrame.requestedFrame_ = false; + + +/** + * Counter to generate IDs for tasks. + * @private {number} + */ +goog.dom.animationFrame.taskId_ = 0; + + +/** + * Returns a function that schedules the two passed-in functions to be run upon + * the next animation frame. Calling the function again during the same + * animation frame does nothing. + * + * The function under the "measure" key will run first and together with all + * other functions scheduled under this key and the function under "mutate" will + * run after that. + * + * @param {!{ + * measure: (function(this:THIS, !goog.dom.animationFrame.State)|undefined), + * mutate: (function(this:THIS, !goog.dom.animationFrame.State)|undefined) + * }} spec + * @param {THIS=} opt_context Context in which to run the function. + * @return {function(...[?])} + * @template THIS + */ +goog.dom.animationFrame.createTask = function(spec, opt_context) { + var genericSpec = /** @type {!goog.dom.animationFrame.Spec} */ (spec); + var id = goog.dom.animationFrame.taskId_++; + var measureTask = { + id: id, + fn: spec.measure, + context: opt_context + }; + var mutateTask = { + id: id, + fn: spec.mutate, + context: opt_context + }; + + var taskSet = { + measureTask: measureTask, + mutateTask: mutateTask, + state: {}, + args: undefined, + isScheduled: false + }; + + return function() { + // Default the context to the one that was used to call the tasks scheduler + // (this function). + if (!opt_context) { + measureTask.context = this; + mutateTask.context = this; + } + + // Save args and state. + if (arguments.length > 0) { + // The state argument goes last. That is kinda horrible but compatible + // with {@see wiz.async.method}. + if (!taskSet.args) { + taskSet.args = []; + } + taskSet.args.length = 0; + taskSet.args.push.apply(taskSet.args, arguments); + taskSet.args.push(taskSet.state); + } else { + if (!taskSet.args || taskSet.args.length == 0) { + taskSet.args = [taskSet.state]; + } else { + taskSet.args[0] = taskSet.state; + taskSet.args.length = 1; + } + } + if (!taskSet.isScheduled) { + taskSet.isScheduled = true; + var tasksArray = goog.dom.animationFrame.tasks_[ + goog.dom.animationFrame.doubleBufferIndex_]; + tasksArray.push(taskSet); + } + goog.dom.animationFrame.requestAnimationFrame_(); + }; +}; + + +/** + * Run scheduled tasks. + * @private + */ +goog.dom.animationFrame.runTasks_ = function() { + goog.dom.animationFrame.requestedFrame_ = false; + var tasksArray = goog.dom.animationFrame + .tasks_[goog.dom.animationFrame.doubleBufferIndex_]; + var taskLength = tasksArray.length; + + // During the runTasks_, if there is a recursive call to queue up more + // task(s) for the next frame, we use double-buffering for that. + goog.dom.animationFrame.doubleBufferIndex_ = + (goog.dom.animationFrame.doubleBufferIndex_ + 1) % 2; + + var task; + + // Run all the measure tasks first. + for (var i = 0; i < taskLength; ++i) { + task = tasksArray[i]; + var measureTask = task.measureTask; + task.isScheduled = false; + if (measureTask.fn) { + // TODO (perumaal): Handle any exceptions thrown by the lambda. + measureTask.fn.apply(measureTask.context, task.args); + } + } + + // Run the mutate tasks next. + for (var i = 0; i < taskLength; ++i) { + task = tasksArray[i]; + var mutateTask = task.mutateTask; + task.isScheduled = false; + if (mutateTask.fn) { + // TODO (perumaal): Handle any exceptions thrown by the lambda. + mutateTask.fn.apply(mutateTask.context, task.args); + } + + // Clear state for next vsync. + task.state = {}; + } + + // Clear the tasks array as we have finished processing all the tasks. + tasksArray.length = 0; +}; + + +/** + * Request {@see goog.dom.animationFrame.runTasks_} to be called upon the + * next animation frame if we haven't done so already. + * @private + */ +goog.dom.animationFrame.requestAnimationFrame_ = function() { + if (goog.dom.animationFrame.requestedFrame_) { + return; + } + goog.dom.animationFrame.requestedFrame_ = true; + window.requestAnimationFrame(goog.dom.animationFrame.runTasks_); +}; diff --git a/third_party/closure/goog/dom/animationframe/polyfill.js b/third_party/closure/goog/dom/animationframe/polyfill.js new file mode 100644 index 0000000000000..19e88668a7d9c --- /dev/null +++ b/third_party/closure/goog/dom/animationframe/polyfill.js @@ -0,0 +1,61 @@ +// Copyright 2014 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 A polyfill for window.requestAnimationFrame and + * window.cancelAnimationFrame. + * Code based on https://gist.github.com/paulirish/1579671 + */ + +goog.provide('goog.dom.animationFrame.polyfill'); + + +/** + * @define {boolean} If true, will install the requestAnimationFrame polyfill. + */ +goog.define('goog.dom.animationFrame.polyfill.ENABLED', true); + + +/** + * Installs the requestAnimationFrame (and cancelAnimationFrame) polyfill. + */ +goog.dom.animationFrame.polyfill.install = + goog.dom.animationFrame.polyfill.ENABLED ? function() { + var vendors = ['ms', 'moz', 'webkit', 'o']; + for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) { + window.requestAnimationFrame = window[vendors[x] + + 'RequestAnimationFrame']; + window.cancelAnimationFrame = window[vendors[x] + + 'CancelAnimationFrame'] || + window[vendors[x] + 'CancelRequestAnimationFrame']; + } + + if (!window.requestAnimationFrame) { + var lastTime = 0; + window.requestAnimationFrame = function(callback, element) { + var currTime = new Date().getTime(); + var timeToCall = Math.max(0, 16 - (currTime - lastTime)); + lastTime = currTime + timeToCall; + return window.setTimeout(function() { + callback(currTime + timeToCall); + }, timeToCall); + }; + + if (!window.cancelAnimationFrame) { + window.cancelAnimationFrame = function(id) { + clearTimeout(id); + }; + } + } +} : goog.nullFunction; diff --git a/third_party/closure/goog/dom/annotate.js b/third_party/closure/goog/dom/annotate.js index df5ca82835415..69759b5dd712d 100644 --- a/third_party/closure/goog/dom/annotate.js +++ b/third_party/closure/goog/dom/annotate.js @@ -341,7 +341,7 @@ goog.dom.annotate.helpAnnotateText_ = function(text, terms, annotateFn, * * @param {Array} terms An array of * [{string} searchTerm, {boolean} matchWholeWordOnly] tuples. - * @return {Array} An array of + * @return {!Array} An array of * [{string} searchTerm, {boolean} matchWholeWordOnly] tuples. * @private */ diff --git a/third_party/closure/goog/dom/browserrange/abstractrange.js b/third_party/closure/goog/dom/browserrange/abstractrange.js index 606d2fd77fac2..eadbff8126353 100644 --- a/third_party/closure/goog/dom/browserrange/abstractrange.js +++ b/third_party/closure/goog/dom/browserrange/abstractrange.js @@ -172,7 +172,7 @@ goog.dom.browserrange.AbstractRange.prototype.containsRange = var range = abstractRange.getBrowserRange(); var start = goog.dom.RangeEndpoint.START, end = goog.dom.RangeEndpoint.END; - /** {@preserveTry} */ + /** @preserveTry */ try { if (checkPartial) { // There are two ways to not overlap. Being before, and being after. @@ -277,7 +277,7 @@ goog.dom.browserrange.AbstractRange.prototype.getValidHtml = * Returns a RangeIterator over the contents of the range. Regardless of the * direction of the range, the iterator will move in document order. * @param {boolean=} opt_keys Unused for this iterator. - * @return {goog.dom.RangeIterator} An iterator over tags in the range. + * @return {!goog.dom.RangeIterator} An iterator over tags in the range. */ goog.dom.browserrange.AbstractRange.prototype.__iterator__ = function( opt_keys) { diff --git a/third_party/closure/goog/dom/browserrange/browserrange.js b/third_party/closure/goog/dom/browserrange/browserrange.js index d3b44d48e36b8..9447b0b0bfe6c 100644 --- a/third_party/closure/goog/dom/browserrange/browserrange.js +++ b/third_party/closure/goog/dom/browserrange/browserrange.js @@ -56,7 +56,7 @@ goog.dom.browserrange.Error = { /** * Static method that returns the proper type of browser range. * @param {Range|TextRange} range A browser range object. - * @return {goog.dom.browserrange.AbstractRange} A wrapper object. + * @return {!goog.dom.browserrange.AbstractRange} A wrapper object. */ goog.dom.browserrange.createRange = function(range) { if (goog.userAgent.IE && !goog.userAgent.isDocumentModeOrHigher(9)) { @@ -83,7 +83,7 @@ goog.dom.browserrange.createRange = function(range) { /** * Static method that returns the proper type of browser range. * @param {Node} node The node to select. - * @return {goog.dom.browserrange.AbstractRange} A wrapper object. + * @return {!goog.dom.browserrange.AbstractRange} A wrapper object. */ goog.dom.browserrange.createRangeFromNodeContents = function(node) { if (goog.userAgent.IE && !goog.userAgent.isDocumentModeOrHigher(9)) { @@ -111,7 +111,7 @@ goog.dom.browserrange.createRangeFromNodeContents = function(node) { * @param {number} endOffset The offset within the node to end. This is * either the index into the childNodes array for element endNodes or * the index into the character array for text endNodes. - * @return {goog.dom.browserrange.AbstractRange} A wrapper object. + * @return {!goog.dom.browserrange.AbstractRange} A wrapper object. */ goog.dom.browserrange.createRangeFromNodes = function(startNode, startOffset, endNode, endOffset) { diff --git a/third_party/closure/goog/dom/browserrange/geckorange.js b/third_party/closure/goog/dom/browserrange/geckorange.js index c1d78d097da52..b01f2dd436866 100644 --- a/third_party/closure/goog/dom/browserrange/geckorange.js +++ b/third_party/closure/goog/dom/browserrange/geckorange.js @@ -33,6 +33,7 @@ goog.require('goog.dom.browserrange.W3cRange'); * @param {Range} range The range object. * @constructor * @extends {goog.dom.browserrange.W3cRange} + * @final */ goog.dom.browserrange.GeckoRange = function(range) { goog.dom.browserrange.W3cRange.call(this, range); @@ -43,7 +44,7 @@ goog.inherits(goog.dom.browserrange.GeckoRange, goog.dom.browserrange.W3cRange); /** * Creates a range object that selects the given node's text. * @param {Node} node The node to select. - * @return {goog.dom.browserrange.GeckoRange} A Gecko range wrapper object. + * @return {!goog.dom.browserrange.GeckoRange} A Gecko range wrapper object. */ goog.dom.browserrange.GeckoRange.createFromNodeContents = function(node) { return new goog.dom.browserrange.GeckoRange( @@ -57,7 +58,7 @@ goog.dom.browserrange.GeckoRange.createFromNodeContents = function(node) { * @param {number} startOffset The offset within the node to start. * @param {Node} endNode The node to end with. * @param {number} endOffset The offset within the node to end. - * @return {goog.dom.browserrange.GeckoRange} A wrapper object. + * @return {!goog.dom.browserrange.GeckoRange} A wrapper object. */ goog.dom.browserrange.GeckoRange.createFromNodes = function(startNode, startOffset, endNode, endOffset) { @@ -75,7 +76,8 @@ goog.dom.browserrange.GeckoRange.prototype.selectInternal = function( // collapsed and forward ranges. This works around // https://bugzilla.mozilla.org/show_bug.cgi?id=773137, and is tested by // range_test.html's testFocusedElementDisappears. - goog.base(this, 'selectInternal', selection, reversed); + goog.dom.browserrange.GeckoRange.base( + this, 'selectInternal', selection, reversed); } else { // Reversed selection -- start with a caret on the end node, and extend it // back to the start. Unfortunately, collapse() fails when focus is diff --git a/third_party/closure/goog/dom/browserrange/ierange.js b/third_party/closure/goog/dom/browserrange/ierange.js index 50a79efc5565a..2043980a16335 100644 --- a/third_party/closure/goog/dom/browserrange/ierange.js +++ b/third_party/closure/goog/dom/browserrange/ierange.js @@ -26,12 +26,12 @@ goog.provide('goog.dom.browserrange.IeRange'); goog.require('goog.array'); -goog.require('goog.debug.Logger'); goog.require('goog.dom'); goog.require('goog.dom.NodeType'); goog.require('goog.dom.RangeEndpoint'); goog.require('goog.dom.TagName'); goog.require('goog.dom.browserrange.AbstractRange'); +goog.require('goog.log'); goog.require('goog.string'); @@ -42,6 +42,7 @@ goog.require('goog.string'); * @param {Document} doc The document the range exists in. * @constructor * @extends {goog.dom.browserrange.AbstractRange} + * @final */ goog.dom.browserrange.IeRange = function(range, doc) { /** @@ -64,17 +65,17 @@ goog.inherits(goog.dom.browserrange.IeRange, /** * Logging object. - * @type {goog.debug.Logger} + * @type {goog.log.Logger} * @private */ goog.dom.browserrange.IeRange.logger_ = - goog.debug.Logger.getLogger('goog.dom.browserrange.IeRange'); + goog.log.getLogger('goog.dom.browserrange.IeRange'); /** * Returns a browser range spanning the given node's contents. * @param {Node} node The node to select. - * @return {TextRange} A browser range spanning the node's contents. + * @return {!TextRange} A browser range spanning the node's contents. * @private */ goog.dom.browserrange.IeRange.getBrowserRangeForNode_ = function(node) { @@ -130,7 +131,7 @@ goog.dom.browserrange.IeRange.getBrowserRangeForNode_ = function(node) { * @param {number} startOffset The offset within the start node. * @param {Node} endNode The node to end with. * @param {number} endOffset The offset within the end node. - * @return {TextRange} A browser range spanning the node's contents. + * @return {!TextRange} A browser range spanning the node's contents. * @private */ goog.dom.browserrange.IeRange.getBrowserRangeForNodes_ = function(startNode, @@ -139,7 +140,7 @@ goog.dom.browserrange.IeRange.getBrowserRangeForNodes_ = function(startNode, var child, collapse = false; if (startNode.nodeType == goog.dom.NodeType.ELEMENT) { if (startOffset > startNode.childNodes.length) { - goog.dom.browserrange.IeRange.logger_.severe( + goog.log.error(goog.dom.browserrange.IeRange.logger_, 'Cannot have startOffset > startNode child count'); } child = startNode.childNodes[startOffset]; @@ -175,7 +176,7 @@ goog.dom.browserrange.IeRange.getBrowserRangeForNodes_ = function(startNode, collapse = false; if (endNode.nodeType == goog.dom.NodeType.ELEMENT) { if (endOffset > endNode.childNodes.length) { - goog.dom.browserrange.IeRange.logger_.severe( + goog.log.error(goog.dom.browserrange.IeRange.logger_, 'Cannot have endOffset > endNode child count'); } child = endNode.childNodes[endOffset]; @@ -199,7 +200,7 @@ goog.dom.browserrange.IeRange.getBrowserRangeForNodes_ = function(startNode, /** * Create a range object that selects the given node's text. * @param {Node} node The node to select. - * @return {goog.dom.browserrange.IeRange} An IE range wrapper object. + * @return {!goog.dom.browserrange.IeRange} An IE range wrapper object. */ goog.dom.browserrange.IeRange.createFromNodeContents = function(node) { var range = new goog.dom.browserrange.IeRange( @@ -243,7 +244,7 @@ goog.dom.browserrange.IeRange.createFromNodeContents = function(node) { * @param {number} startOffset The offset within the start node. * @param {Node} endNode The node to end with. * @param {number} endOffset The offset within the end node. - * @return {goog.dom.browserrange.AbstractRange} A wrapper object. + * @return {!goog.dom.browserrange.AbstractRange} A wrapper object. */ goog.dom.browserrange.IeRange.createFromNodes = function(startNode, startOffset, endNode, endOffset) { @@ -304,7 +305,7 @@ goog.dom.browserrange.IeRange.prototype.endOffset_ = -1; /** - * @return {goog.dom.browserrange.IeRange} A clone of this range. + * @return {!goog.dom.browserrange.IeRange} A clone of this range. * @override */ goog.dom.browserrange.IeRange.prototype.clone = function() { @@ -806,7 +807,7 @@ goog.dom.browserrange.IeRange.prototype.removeContents = function() { /** * @param {TextRange} range The range to get a dom helper for. - * @return {goog.dom.DomHelper} A dom helper for the document the range + * @return {!goog.dom.DomHelper} A dom helper for the document the range * resides in. * @private */ diff --git a/third_party/closure/goog/dom/browserrange/operarange.js b/third_party/closure/goog/dom/browserrange/operarange.js index 321c9e2f43828..f277dc1b94ec0 100644 --- a/third_party/closure/goog/dom/browserrange/operarange.js +++ b/third_party/closure/goog/dom/browserrange/operarange.js @@ -32,6 +32,7 @@ goog.require('goog.dom.browserrange.W3cRange'); * @param {Range} range The range object. * @constructor * @extends {goog.dom.browserrange.W3cRange} + * @final */ goog.dom.browserrange.OperaRange = function(range) { goog.dom.browserrange.W3cRange.call(this, range); @@ -42,7 +43,7 @@ goog.inherits(goog.dom.browserrange.OperaRange, goog.dom.browserrange.W3cRange); /** * Creates a range object that selects the given node's text. * @param {Node} node The node to select. - * @return {goog.dom.browserrange.OperaRange} A Opera range wrapper object. + * @return {!goog.dom.browserrange.OperaRange} A Opera range wrapper object. */ goog.dom.browserrange.OperaRange.createFromNodeContents = function(node) { return new goog.dom.browserrange.OperaRange( @@ -56,7 +57,7 @@ goog.dom.browserrange.OperaRange.createFromNodeContents = function(node) { * @param {number} startOffset The offset within the node to start. * @param {Node} endNode The node to end with. * @param {number} endOffset The offset within the node to end. - * @return {goog.dom.browserrange.OperaRange} A wrapper object. + * @return {!goog.dom.browserrange.OperaRange} A wrapper object. */ goog.dom.browserrange.OperaRange.createFromNodes = function(startNode, startOffset, endNode, endOffset) { diff --git a/third_party/closure/goog/dom/browserrange/w3crange.js b/third_party/closure/goog/dom/browserrange/w3crange.js index dc20549114a1b..7874bc49aaf7c 100644 --- a/third_party/closure/goog/dom/browserrange/w3crange.js +++ b/third_party/closure/goog/dom/browserrange/w3crange.js @@ -49,7 +49,7 @@ goog.inherits(goog.dom.browserrange.W3cRange, /** * Returns a browser range spanning the given node's contents. * @param {Node} node The node to select. - * @return {Range} A browser range spanning the node's contents. + * @return {!Range} A browser range spanning the node's contents. * @protected */ goog.dom.browserrange.W3cRange.getBrowserRangeForNode = function(node) { @@ -92,7 +92,7 @@ goog.dom.browserrange.W3cRange.getBrowserRangeForNode = function(node) { * @param {number} startOffset The offset within the start node. * @param {Node} endNode The node to end with - should not be a BR. * @param {number} endOffset The offset within the end node. - * @return {Range} A browser range spanning the node's contents. + * @return {!Range} A browser range spanning the node's contents. * @protected */ goog.dom.browserrange.W3cRange.getBrowserRangeForNodes = function(startNode, @@ -108,7 +108,7 @@ goog.dom.browserrange.W3cRange.getBrowserRangeForNodes = function(startNode, /** * Creates a range object that selects the given node's text. * @param {Node} node The node to select. - * @return {goog.dom.browserrange.W3cRange} A Gecko range wrapper object. + * @return {!goog.dom.browserrange.W3cRange} A Gecko range wrapper object. */ goog.dom.browserrange.W3cRange.createFromNodeContents = function(node) { return new goog.dom.browserrange.W3cRange( @@ -122,7 +122,7 @@ goog.dom.browserrange.W3cRange.createFromNodeContents = function(node) { * @param {number} startOffset The offset within the start node. * @param {Node} endNode The node to end with. * @param {number} endOffset The offset within the end node. - * @return {goog.dom.browserrange.W3cRange} A wrapper object. + * @return {!goog.dom.browserrange.W3cRange} A wrapper object. */ goog.dom.browserrange.W3cRange.createFromNodes = function(startNode, startOffset, endNode, endOffset) { @@ -133,7 +133,7 @@ goog.dom.browserrange.W3cRange.createFromNodes = function(startNode, /** - * @return {goog.dom.browserrange.W3cRange} A clone of this range. + * @return {!goog.dom.browserrange.W3cRange} A clone of this range. * @override */ goog.dom.browserrange.W3cRange.prototype.clone = function() { diff --git a/third_party/closure/goog/dom/browserrange/webkitrange.js b/third_party/closure/goog/dom/browserrange/webkitrange.js index 620d03666b14d..e572dd85fc408 100644 --- a/third_party/closure/goog/dom/browserrange/webkitrange.js +++ b/third_party/closure/goog/dom/browserrange/webkitrange.js @@ -35,6 +35,7 @@ goog.require('goog.userAgent'); * @param {Range} range The range object. * @constructor * @extends {goog.dom.browserrange.W3cRange} + * @final */ goog.dom.browserrange.WebKitRange = function(range) { goog.dom.browserrange.W3cRange.call(this, range); @@ -46,7 +47,7 @@ goog.inherits(goog.dom.browserrange.WebKitRange, /** * Creates a range object that selects the given node's text. * @param {Node} node The node to select. - * @return {goog.dom.browserrange.WebKitRange} A WebKit range wrapper object. + * @return {!goog.dom.browserrange.WebKitRange} A WebKit range wrapper object. */ goog.dom.browserrange.WebKitRange.createFromNodeContents = function(node) { return new goog.dom.browserrange.WebKitRange( @@ -60,7 +61,7 @@ goog.dom.browserrange.WebKitRange.createFromNodeContents = function(node) { * @param {number} startOffset The offset within the start node. * @param {Node} endNode The node to end with. * @param {number} endOffset The offset within the end node. - * @return {goog.dom.browserrange.WebKitRange} A wrapper object. + * @return {!goog.dom.browserrange.WebKitRange} A wrapper object. */ goog.dom.browserrange.WebKitRange.createFromNodes = function(startNode, startOffset, endNode, endOffset) { diff --git a/third_party/closure/goog/dom/bufferedviewportsizemonitor.js b/third_party/closure/goog/dom/bufferedviewportsizemonitor.js index fb4b73b00c6d3..01ab526c1d4a3 100644 --- a/third_party/closure/goog/dom/bufferedviewportsizemonitor.js +++ b/third_party/closure/goog/dom/bufferedviewportsizemonitor.js @@ -44,10 +44,11 @@ goog.require('goog.events.EventType'); * value defaults to {@link #RESIZE_EVENT_DELAY_MS_}. * @constructor * @extends {goog.events.EventTarget} + * @final */ goog.dom.BufferedViewportSizeMonitor = function( viewportSizeMonitor, opt_bufferMs) { - goog.base(this); + goog.dom.BufferedViewportSizeMonitor.base(this, 'constructor'); /** * The underlying viewport size monitor. @@ -118,7 +119,7 @@ goog.dom.BufferedViewportSizeMonitor.RESIZE_EVENT_DELAY_MS_ = 100; goog.dom.BufferedViewportSizeMonitor.prototype.disposeInternal = function() { goog.events.unlistenByKey(this.listenerKey_); - goog.base(this, 'disposeInternal'); + goog.dom.BufferedViewportSizeMonitor.base(this, 'disposeInternal'); }; diff --git a/third_party/closure/goog/dom/classlist.js b/third_party/closure/goog/dom/classlist.js index 1b4c7cbed1e9d..bca8e6bf2ec96 100644 --- a/third_party/closure/goog/dom/classlist.js +++ b/third_party/closure/goog/dom/classlist.js @@ -18,15 +18,15 @@ * (DOMTokenList: http://dom.spec.whatwg.org/#domtokenlist) which is faster * and requires less code. * - * Note: these utilities are meant to operate on HTMLElements and - * will not work on elements with differing interfaces (such as SVGElements). + * Note: these utilities are meant to operate on HTMLElements + * and may have unexpected behavior on elements with differing interfaces + * (such as SVGElements). */ goog.provide('goog.dom.classlist'); goog.require('goog.array'); -goog.require('goog.asserts'); /** @@ -36,34 +36,22 @@ goog.require('goog.asserts'); goog.define('goog.dom.classlist.ALWAYS_USE_DOM_TOKEN_LIST', false); -/** - * Enables use of the native DOMTokenList methods. See the spec at - * {@link http://dom.spec.whatwg.org/#domtokenlist}. - * @type {boolean} - * @private - */ -goog.dom.classlist.NATIVE_DOM_TOKEN_LIST_ = - goog.dom.classlist.ALWAYS_USE_DOM_TOKEN_LIST || - // Whether DOMTokenList exists. - (!!goog.global['DOMTokenList']); - - /** * Gets an array-like object of class names on an element. * @param {Element} element DOM node to get the classes of. * @return {!goog.array.ArrayLike} Class names on {@code element}. */ -goog.dom.classlist.get = goog.dom.classlist.NATIVE_DOM_TOKEN_LIST_ ? - function(element) { - return element.classList; - } : - function(element) { - var className = element.className; - // Some types of elements don't have a className in IE (e.g. iframes). - // Furthermore, in Firefox, className is not a string when the element is - // an SVG element. - return goog.isString(className) && className.match(/\S+/g) || []; - }; +goog.dom.classlist.get = function(element) { + if (goog.dom.classlist.ALWAYS_USE_DOM_TOKEN_LIST || element.classList) { + return element.classList; + } + + var className = element.className; + // Some types of elements don't have a className in IE (e.g. iframes). + // Furthermore, in Firefox, className is not a string when the element is + // an SVG element. + return goog.isString(className) && className.match(/\S+/g) || []; +}; /** @@ -83,14 +71,12 @@ goog.dom.classlist.set = function(element, className) { * @param {string} className Class name to test for. * @return {boolean} Whether element has the class. */ -goog.dom.classlist.contains = goog.dom.classlist.NATIVE_DOM_TOKEN_LIST_ ? - function(element, className) { - goog.asserts.assert(!!element.classList); - return element.classList.contains(className); - } : - function(element, className) { - return goog.array.contains(goog.dom.classlist.get(element), className); - }; +goog.dom.classlist.contains = function(element, className) { + if (goog.dom.classlist.ALWAYS_USE_DOM_TOKEN_LIST || element.classList) { + return element.classList.contains(className); + } + return goog.array.contains(goog.dom.classlist.get(element), className); +}; /** @@ -100,17 +86,18 @@ goog.dom.classlist.contains = goog.dom.classlist.NATIVE_DOM_TOKEN_LIST_ ? * @param {Element} element DOM node to add class to. * @param {string} className Class name to add. */ -goog.dom.classlist.add = goog.dom.classlist.NATIVE_DOM_TOKEN_LIST_ ? - function(element, className) { - element.classList.add(className); - } : - function(element, className) { - if (!goog.dom.classlist.contains(element, className)) { - // Ensure we add a space if this is not the first class name added. - element.className += element.className.length > 0 ? - (' ' + className) : className; - } - }; +goog.dom.classlist.add = function(element, className) { + if (goog.dom.classlist.ALWAYS_USE_DOM_TOKEN_LIST || element.classList) { + element.classList.add(className); + return; + } + + if (!goog.dom.classlist.contains(element, className)) { + // Ensure we add a space if this is not the first class name added. + element.className += element.className.length > 0 ? + (' ' + className) : className; + } +}; /** @@ -121,34 +108,35 @@ goog.dom.classlist.add = goog.dom.classlist.NATIVE_DOM_TOKEN_LIST_ ? * This method may throw a DOM exception if classesToAdd contains invalid * or empty class names. */ -goog.dom.classlist.addAll = goog.dom.classlist.NATIVE_DOM_TOKEN_LIST_ ? - function(element, classesToAdd) { - goog.array.forEach(classesToAdd, function(className) { - goog.dom.classlist.add(element, className); +goog.dom.classlist.addAll = function(element, classesToAdd) { + if (goog.dom.classlist.ALWAYS_USE_DOM_TOKEN_LIST || element.classList) { + goog.array.forEach(classesToAdd, function(className) { + goog.dom.classlist.add(element, className); + }); + return; + } + + var classMap = {}; + + // Get all current class names into a map. + goog.array.forEach(goog.dom.classlist.get(element), + function(className) { + classMap[className] = true; + }); + + // Add new class names to the map. + goog.array.forEach(classesToAdd, + function(className) { + classMap[className] = true; }); - } : - function(element, classesToAdd) { - var classMap = {}; - - // Get all current class names into a map. - goog.array.forEach(goog.dom.classlist.get(element), - function(className) { - classMap[className] = true; - }); - - // Add new class names to the map. - goog.array.forEach(classesToAdd, - function(className) { - classMap[className] = true; - }); - - // Flatten the keys of the map into the className. - element.className = ''; - for (var className in classMap) { - element.className += element.className.length > 0 ? - (' ' + className) : className; - } - }; + + // Flatten the keys of the map into the className. + element.className = ''; + for (var className in classMap) { + element.className += element.className.length > 0 ? + (' ' + className) : className; + } +}; /** @@ -157,20 +145,21 @@ goog.dom.classlist.addAll = goog.dom.classlist.NATIVE_DOM_TOKEN_LIST_ ? * @param {Element} element DOM node to remove class from. * @param {string} className Class name to remove. */ -goog.dom.classlist.remove = goog.dom.classlist.NATIVE_DOM_TOKEN_LIST_ ? - function(element, className) { - element.classList.remove(className); - } : - function(element, className) { - if (goog.dom.classlist.contains(element, className)) { - // Filter out the class name. - element.className = goog.array.filter( - goog.dom.classlist.get(element), - function(c) { - return c != className; - }).join(' '); - } - }; +goog.dom.classlist.remove = function(element, className) { + if (goog.dom.classlist.ALWAYS_USE_DOM_TOKEN_LIST || element.classList) { + element.classList.remove(className); + return; + } + + if (goog.dom.classlist.contains(element, className)) { + // Filter out the class name. + element.className = goog.array.filter( + goog.dom.classlist.get(element), + function(c) { + return c != className; + }).join(' '); + } +}; /** @@ -183,22 +172,22 @@ goog.dom.classlist.remove = goog.dom.classlist.NATIVE_DOM_TOKEN_LIST_ ? * This method may throw a DOM exception if classesToRemove contains invalid * or empty class names. */ -goog.dom.classlist.removeAll = goog.dom.classlist.NATIVE_DOM_TOKEN_LIST_ ? - function(element, classesToRemove) { - goog.array.forEach(classesToRemove, function(className) { - goog.dom.classlist.remove(element, className); - }); - } : - function(element, classesToRemove) { - // Filter out those classes in classesToRemove. - element.className = goog.array.filter( - goog.dom.classlist.get(element), - function(className) { - // If this class is not one we are trying to remove, - // add it to the array of new class names. - return !goog.array.contains(classesToRemove, className); - }).join(' '); - }; +goog.dom.classlist.removeAll = function(element, classesToRemove) { + if (goog.dom.classlist.ALWAYS_USE_DOM_TOKEN_LIST || element.classList) { + goog.array.forEach(classesToRemove, function(className) { + goog.dom.classlist.remove(element, className); + }); + return; + } + // Filter out those classes in classesToRemove. + element.className = goog.array.filter( + goog.dom.classlist.get(element), + function(className) { + // If this class is not one we are trying to remove, + // add it to the array of new class names. + return !goog.array.contains(classesToRemove, className); + }).join(' '); +}; /** @@ -219,6 +208,23 @@ goog.dom.classlist.enable = function(element, className, enabled) { }; +/** + * Adds or removes a set of classes depending on the enabled argument. This + * method may throw a DOM exception for an invalid or empty class name if + * DOMTokenList is used. + * @param {!Element} element DOM node to add or remove the class on. + * @param {goog.array.ArrayLike.} classesToEnable An array-like object + * containing a collection of class names to add or remove from the element. + * @param {boolean} enabled Whether to add or remove the classes (true adds, + * false removes). + */ +goog.dom.classlist.enableAll = function(element, classesToEnable, enabled) { + var f = enabled ? goog.dom.classlist.addAll : + goog.dom.classlist.removeAll; + f(element, classesToEnable); +}; + + /** * Switches a class on an element from one to another without disturbing other * classes. If the fromClass isn't removed, the toClass won't be added. This diff --git a/third_party/closure/goog/dom/controlrange.js b/third_party/closure/goog/dom/controlrange.js index 71a7fbb43d803..0b3a6a91dc508 100644 --- a/third_party/closure/goog/dom/controlrange.js +++ b/third_party/closure/goog/dom/controlrange.js @@ -42,6 +42,7 @@ goog.require('goog.userAgent'); * constructor: use one of the goog.dom.Range.createFrom* methods instead. * @constructor * @extends {goog.dom.AbstractMultiRange} + * @final */ goog.dom.ControlRange = function() { }; @@ -52,7 +53,7 @@ goog.inherits(goog.dom.ControlRange, goog.dom.AbstractMultiRange); * Create a new range wrapper from the given browser range object. Do not use * this method directly - please use goog.dom.Range.createFrom* instead. * @param {Object} controlRange The browser range object. - * @return {goog.dom.ControlRange} A range wrapper object. + * @return {!goog.dom.ControlRange} A range wrapper object. */ goog.dom.ControlRange.createFromBrowserRange = function(controlRange) { var range = new goog.dom.ControlRange(); @@ -65,7 +66,7 @@ goog.dom.ControlRange.createFromBrowserRange = function(controlRange) { * Create a new range wrapper that selects the given element. Do not use * this method directly - please use goog.dom.Range.createFrom* instead. * @param {...Element} var_args The element(s) to select. - * @return {goog.dom.ControlRange} A range wrapper object. + * @return {!goog.dom.ControlRange} A range wrapper object. */ goog.dom.ControlRange.createFromElements = function(var_args) { var range = goog.dom.getOwnerDocument(arguments[0]).body.createControlRange(); @@ -190,7 +191,7 @@ goog.dom.ControlRange.prototype.getEndOffset = function() { // TODO(robbyw): Figure out how to unify getElements with TextRange API. /** - * @return {Array.} Array of elements in the control range. + * @return {!Array.} Array of elements in the control range. */ goog.dom.ControlRange.prototype.getElements = function() { if (!this.elements_) { @@ -207,7 +208,7 @@ goog.dom.ControlRange.prototype.getElements = function() { /** - * @return {Array.} Array of elements comprising the control range, + * @return {!Array.} Array of elements comprising the control range, * sorted by document order. */ goog.dom.ControlRange.prototype.getSortedElements = function() { @@ -393,6 +394,7 @@ goog.dom.DomSavedControlRange_.prototype.disposeInternal = function() { * @param {goog.dom.ControlRange?} range The range to traverse. * @constructor * @extends {goog.dom.RangeIterator} + * @final */ goog.dom.ControlRangeIterator = function(range) { if (range) { @@ -495,7 +497,7 @@ goog.dom.ControlRangeIterator.prototype.copyFrom = function(other) { /** - * @return {goog.dom.ControlRangeIterator} An identical iterator. + * @return {!goog.dom.ControlRangeIterator} An identical iterator. * @override */ goog.dom.ControlRangeIterator.prototype.clone = function() { diff --git a/third_party/closure/goog/dom/dataset.js b/third_party/closure/goog/dom/dataset.js index 430842503c885..9161e24f3f9c7 100644 --- a/third_party/closure/goog/dom/dataset.js +++ b/third_party/closure/goog/dom/dataset.js @@ -61,6 +61,11 @@ goog.dom.dataset.set = function(element, key, value) { */ goog.dom.dataset.get = function(element, key) { if (element.dataset) { + // Android browser (non-chrome) returns the empty string for + // element.dataset['doesNotExist']. + if (!(key in element.dataset)) { + return null; + } return element.dataset[key]; } else { return element.getAttribute(goog.dom.dataset.PREFIX_ + diff --git a/third_party/closure/goog/dom/dom.js b/third_party/closure/goog/dom/dom.js index 3945a3cf5d4cb..1fb0b33eb96cc 100644 --- a/third_party/closure/goog/dom/dom.js +++ b/third_party/closure/goog/dom/dom.js @@ -31,12 +31,14 @@ goog.provide('goog.dom'); goog.provide('goog.dom.Appendable'); goog.provide('goog.dom.DomHelper'); -goog.provide('goog.dom.NodeType'); goog.require('goog.array'); +goog.require('goog.asserts'); goog.require('goog.dom.BrowserFeature'); +goog.require('goog.dom.NodeType'); goog.require('goog.dom.TagName'); goog.require('goog.dom.classes'); +goog.require('goog.functions'); goog.require('goog.math.Coordinate'); goog.require('goog.math.Size'); goog.require('goog.object'); @@ -67,26 +69,6 @@ goog.dom.COMPAT_MODE_KNOWN_ = goog.dom.ASSUME_QUIRKS_MODE || goog.dom.ASSUME_STANDARDS_MODE; -/** - * Enumeration for DOM node types (for reference) - * @enum {number} - */ -goog.dom.NodeType = { - ELEMENT: 1, - ATTRIBUTE: 2, - TEXT: 3, - CDATA_SECTION: 4, - ENTITY_REFERENCE: 5, - ENTITY: 6, - PROCESSING_INSTRUCTION: 7, - COMMENT: 8, - DOCUMENT: 9, - DOCUMENT_TYPE: 10, - DOCUMENT_FRAGMENT: 11, - NOTATION: 12 -}; - - /** * Gets the DomHelper object for the document where the element resides. * @param {(Node|Window)=} opt_element If present, gets the DomHelper for this @@ -119,14 +101,62 @@ goog.dom.getDocument = function() { /** - * Alias for getElementById. If a DOM node is passed in then we just return - * that. + * Gets an element from the current document by element id. + * + * If an Element is passed in, it is returned. + * * @param {string|Element} element Element ID or a DOM node. * @return {Element} The element with the given ID, or the node passed in. */ goog.dom.getElement = function(element) { + return goog.dom.getElementHelper_(document, element); +}; + + +/** + * Gets an element by id from the given document (if present). + * If an element is given, it is returned. + * @param {!Document} doc + * @param {string|Element} element Element ID or a DOM node. + * @return {Element} The resulting element. + * @private + */ +goog.dom.getElementHelper_ = function(doc, element) { return goog.isString(element) ? - document.getElementById(element) : element; + doc.getElementById(element) : + element; +}; + + +/** + * Gets an element by id, asserting that the element is found. + * + * This is used when an element is expected to exist, and should fail with + * an assertion error if it does not (if assertions are enabled). + * + * @param {string} id Element ID. + * @return {!Element} The element with the given ID, if it exists. + */ +goog.dom.getRequiredElement = function(id) { + return goog.dom.getRequiredElementHelper_(document, id); +}; + + +/** + * Helper function for getRequiredElementHelper functions, both static and + * on DomHelper. Asserts the element with the given id exists. + * @param {!Document} doc + * @param {string} id + * @return {!Element} The element with the given ID, if it exists. + * @private + */ +goog.dom.getRequiredElementHelper_ = function(doc, id) { + // To prevent users passing in Elements as is permitted in getElement(). + goog.asserts.assertString(id); + var element = goog.dom.getElementHelper_(doc, id); + element = goog.asserts.assertElement(element, + 'No element found with id: ' + id); + return element; }; @@ -150,6 +180,12 @@ goog.dom.$ = goog.dom.getElement; * need is particular tags belonging to a single class, this function * is fast and sleek. * + * Note that tag names are case sensitive in the SVG namespace, and this + * function converts opt_tag to uppercase for comparisons. For queries in the + * SVG namespace you should use querySelector or querySelectorAll instead. + * https://bugzilla.mozilla.org/show_bug.cgi?id=963870 + * https://bugs.webkit.org/show_bug.cgi?id=83438 + * * @see {goog.dom.query} * * @param {?string=} opt_tag Element tag name. @@ -165,7 +201,8 @@ goog.dom.getElementsByTagNameAndClass = function(opt_tag, opt_class, opt_el) { /** - * Returns an array of all the elements with the provided className. + * Returns a static, array-like list of the elements with the provided + * className. * @see {goog.dom.query} * @param {string} className the name of the class to look for. * @param {(Document|Element)=} opt_el Optional element to look in. @@ -175,8 +212,6 @@ goog.dom.getElementsByClass = function(className, opt_el) { var parent = opt_el || document; if (goog.dom.canUseQuerySelector_(parent)) { return parent.querySelectorAll('.' + className); - } else if (parent.getElementsByClassName) { - return parent.getElementsByClassName(className); } return goog.dom.getElementsByTagNameAndClass_( document, '*', className, opt_el); @@ -196,12 +231,30 @@ goog.dom.getElementByClass = function(className, opt_el) { if (goog.dom.canUseQuerySelector_(parent)) { retVal = parent.querySelector('.' + className); } else { - retVal = goog.dom.getElementsByClass(className, opt_el)[0]; + retVal = goog.dom.getElementsByTagNameAndClass_( + document, '*', className, opt_el)[0]; } return retVal || null; }; +/** + * Ensures an element with the given className exists, and then returns the + * first element with the provided className. + * @see {goog.dom.query} + * @param {string} className the name of the class to look for. + * @param {!Element|!Document=} opt_root Optional element or document to look + * in. + * @return {!Element} The first item with the class name provided. + * @throws {goog.asserts.AssertionError} Thrown if no element is found. + */ +goog.dom.getRequiredElementByClass = function(className, opt_root) { + var retValue = goog.dom.getElementByClass(className, opt_root); + return goog.asserts.assert(retValue, + 'No element found with className: ' + className); +}; + + /** * Prefer the standardized (http://www.w3.org/TR/selectors-api/), native and * fast W3C Selectors API. @@ -555,7 +608,7 @@ goog.dom.getDocumentScroll_ = function(doc) { /** * Gets the document scroll element. - * @return {Element} Scrolling element. + * @return {!Element} Scrolling element. */ goog.dom.getDocumentScrollElement = function() { return goog.dom.getDocumentScrollElement_(document); @@ -565,7 +618,7 @@ goog.dom.getDocumentScrollElement = function() { /** * Helper for {@code getDocumentScrollElement}. * @param {!Document} doc The document to get the scroll element for. - * @return {Element} Scrolling element. + * @return {!Element} Scrolling element. * @private */ goog.dom.getDocumentScrollElement_ = function(doc) { @@ -839,16 +892,6 @@ goog.dom.htmlToDocumentFragment_ = function(doc, htmlString) { }; -/** - * Returns the compatMode of the document. - * @return {string} The result is either CSS1Compat or BackCompat. - * @deprecated use goog.dom.isCss1CompatMode instead. - */ -goog.dom.getCompatMode = function() { - return goog.dom.isCss1CompatMode() ? 'CSS1Compat' : 'BackCompat'; -}; - - /** * Returns true if the browser is in "CSS1-compatible" (standards-compliant) * mode, false otherwise. @@ -1208,7 +1251,7 @@ goog.dom.getPreviousNode = function(node) { /** * Whether the object looks like a DOM node. - * @param {*} obj The object being tested for node likeness. + * @param {?} obj The object being tested for node likeness. * @return {boolean} Whether the object looks like a DOM node. */ goog.dom.isNodeLike = function(obj) { @@ -1218,7 +1261,7 @@ goog.dom.isNodeLike = function(obj) { /** * Whether the object looks like an Element. - * @param {*} obj The object being tested for Element likeness. + * @param {?} obj The object being tested for Element likeness. * @return {boolean} Whether the object looks like an Element. */ goog.dom.isElement = function(obj) { @@ -1229,7 +1272,7 @@ goog.dom.isElement = function(obj) { /** * Returns true if the specified value is a Window object. This includes the * global window for HTML pages, and iframe windows. - * @param {*} obj Variable to test. + * @param {?} obj Variable to test. * @return {boolean} Whether the variable is a window. */ goog.dom.isWindow = function(obj) { @@ -1243,6 +1286,7 @@ goog.dom.isWindow = function(obj) { * @return {Element} The parent, or null if not an Element. */ goog.dom.getParentElement = function(element) { + var parent; if (goog.dom.BrowserFeature.CAN_USE_PARENT_ELEMENT_PROPERTY) { var isIe9 = goog.userAgent.IE && goog.userAgent.isVersionOrHigher('9') && @@ -1251,10 +1295,13 @@ goog.dom.getParentElement = function(element) { // goog.global['SVGElement'] is not defined in IE9 quirks mode. if (!(isIe9 && goog.global['SVGElement'] && element instanceof goog.global['SVGElement'])) { - return element.parentElement; + parent = element.parentElement; + if (parent) { + return parent; + } } } - var parent = element.parentNode; + parent = element.parentNode; return goog.dom.isElement(parent) ? /** @type {!Element} */ (parent) : null; }; @@ -1465,8 +1512,8 @@ goog.dom.findCommonAncestor = function(var_args) { * @return {!Document} The document owning the node. */ goog.dom.getOwnerDocument = function(node) { - // TODO(arv): Remove IE5 code. - // IE5 uses document instead of ownerDocument + // TODO(nnaze): Update param signature to be non-nullable. + goog.asserts.assert(node, 'Node cannot be null or undefined.'); return /** @type {!Document} */ ( node.nodeType == goog.dom.NodeType.DOCUMENT ? node : node.ownerDocument || node.document); @@ -1491,31 +1538,35 @@ goog.dom.getFrameContentDocument = function(frame) { */ goog.dom.getFrameContentWindow = function(frame) { return frame.contentWindow || - goog.dom.getWindow_(goog.dom.getFrameContentDocument(frame)); + goog.dom.getWindow(goog.dom.getFrameContentDocument(frame)); }; /** - * Cross-browser function for setting the text content of an element. - * @param {Element} element The element to change the text content of. - * @param {string|number} text The string that should replace the current - * element content. + * Sets the text content of a node, with cross-browser support. + * @param {Node} node The node to change the text content of. + * @param {string|number} text The value that should replace the node's content. */ -goog.dom.setTextContent = function(element, text) { - if ('textContent' in element) { - element.textContent = text; - } else if (element.firstChild && - element.firstChild.nodeType == goog.dom.NodeType.TEXT) { +goog.dom.setTextContent = function(node, text) { + goog.asserts.assert(node != null, + 'goog.dom.setTextContent expects a non-null value for node'); + + if ('textContent' in node) { + node.textContent = text; + } else if (node.nodeType == goog.dom.NodeType.TEXT) { + node.data = text; + } else if (node.firstChild && + node.firstChild.nodeType == goog.dom.NodeType.TEXT) { // If the first child is a text node we just change its data and remove the // rest of the children. - while (element.lastChild != element.firstChild) { - element.removeChild(element.lastChild); + while (node.lastChild != node.firstChild) { + node.removeChild(node.lastChild); } - element.firstChild.data = text; + node.firstChild.data = text; } else { - goog.dom.removeChildren(element); - var doc = goog.dom.getOwnerDocument(element); - element.appendChild(doc.createTextNode(String(text))); + goog.dom.removeChildren(node); + var doc = goog.dom.getOwnerDocument(node); + node.appendChild(doc.createTextNode(String(text))); } }; @@ -1633,7 +1684,7 @@ goog.dom.PREDEFINED_TAG_VALUES_ = {'IMG': ' ', 'BR': '\n'}; /** * Returns true if the element has a tab index that allows it to receive - * keyboard focus (tabIndex >= 0), false otherwise. Note that form elements + * keyboard focus (tabIndex >= 0), false otherwise. Note that some elements * natively support keyboard focus, even if they have no tab index. * @param {Element} element Element to check. * @return {boolean} Whether the element has a tab index that allows keyboard @@ -1641,16 +1692,8 @@ goog.dom.PREDEFINED_TAG_VALUES_ = {'IMG': ' ', 'BR': '\n'}; * @see http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ */ goog.dom.isFocusableTabIndex = function(element) { - // IE returns 0 for an unset tabIndex, so we must use getAttributeNode(), - // which returns an object with a 'specified' property if tabIndex is - // specified. This works on other browsers, too. - var attrNode = element.getAttributeNode('tabindex'); // Must be lowercase! - if (attrNode && attrNode.specified) { - var index = element.tabIndex; - // NOTE: IE9 puts tabIndex in 16-bit int, e.g. -2 is 65534. - return goog.isNumber(index) && index >= 0 && index < 32768; - } - return false; + return goog.dom.hasSpecifiedTabIndex_(element) && + goog.dom.isTabIndexFocusable_(element); }; @@ -1677,6 +1720,90 @@ goog.dom.setFocusableTabIndex = function(element, enable) { }; +/** + * Returns true if the element can be focused, i.e. it has a tab index that + * allows it to receive keyboard focus (tabIndex >= 0), or it is an element + * that natively supports keyboard focus. + * @param {Element} element Element to check. + * @return {boolean} Whether the element allows keyboard focus. + */ +goog.dom.isFocusable = function(element) { + var focusable; + // Some elements can have unspecified tab index and still receive focus. + if (goog.dom.nativelySupportsFocus_(element)) { + // Make sure the element is not disabled ... + focusable = !element.disabled && + // ... and if a tab index is specified, it allows focus. + (!goog.dom.hasSpecifiedTabIndex_(element) || + goog.dom.isTabIndexFocusable_(element)); + } else { + focusable = goog.dom.isFocusableTabIndex(element); + } + + // IE requires elements to be visible in order to focus them. + return focusable && goog.userAgent.IE ? + goog.dom.hasNonZeroBoundingRect_(element) : focusable; +}; + + +/** + * Returns true if the element has a specified tab index. + * @param {Element} element Element to check. + * @return {boolean} Whether the element has a specified tab index. + * @private + */ +goog.dom.hasSpecifiedTabIndex_ = function(element) { + // IE returns 0 for an unset tabIndex, so we must use getAttributeNode(), + // which returns an object with a 'specified' property if tabIndex is + // specified. This works on other browsers, too. + var attrNode = element.getAttributeNode('tabindex'); // Must be lowercase! + return goog.isDefAndNotNull(attrNode) && attrNode.specified; +}; + + +/** + * Returns true if the element's tab index allows the element to be focused. + * @param {Element} element Element to check. + * @return {boolean} Whether the element's tab index allows focus. + * @private + */ +goog.dom.isTabIndexFocusable_ = function(element) { + var index = element.tabIndex; + // NOTE: IE9 puts tabIndex in 16-bit int, e.g. -2 is 65534. + return goog.isNumber(index) && index >= 0 && index < 32768; +}; + + +/** + * Returns true if the element is focusable even when tabIndex is not set. + * @param {Element} element Element to check. + * @return {boolean} Whether the element natively supports focus. + * @private + */ +goog.dom.nativelySupportsFocus_ = function(element) { + return element.tagName == goog.dom.TagName.A || + element.tagName == goog.dom.TagName.INPUT || + element.tagName == goog.dom.TagName.TEXTAREA || + element.tagName == goog.dom.TagName.SELECT || + element.tagName == goog.dom.TagName.BUTTON; +}; + + +/** + * Returns true if the element has a bounding rectangle that would be visible + * (i.e. its width and height are greater than zero). + * @param {Element} element Element to check. + * @return {boolean} Whether the element has a non-zero bounding rectangle. + * @private + */ +goog.dom.hasNonZeroBoundingRect_ = function(element) { + var rect = goog.isFunction(element['getBoundingClientRect']) ? + element.getBoundingClientRect() : + {'height': element.offsetHeight, 'width': element.offsetWidth}; + return goog.isDefAndNotNull(rect) && rect.height > 0 && rect.width > 0; +}; + + /** * Returns the text content of the current node, without markup and invisible * symbols. New lines are stripped and whitespace is collapsed, @@ -1966,6 +2093,60 @@ goog.dom.getActiveElement = function(doc) { }; +/** + * @private {number} Cached version of the devicePixelRatio. + */ +goog.dom.devicePixelRatio_; + + +/** + * Gives the devicePixelRatio, or attempts to determine if not present. + * + * By default, this is the same value given by window.devicePixelRatio. If + * devicePixelRatio is not defined, the ratio is calculated with + * window.matchMedia, if present. Otherwise, gives 1.0. + * + * This function is cached so that the pixel ratio is calculated only once + * and only calculated when first requested. + * + * @return {number} The number of actual pixels per virtual pixel. + */ +goog.dom.getPixelRatio = goog.functions.cacheReturnValue(function() { + var win = goog.dom.getWindow(); + + // devicePixelRatio does not work on Mobile firefox. + // TODO(user): Enable this check on a known working mobile Gecko version. + // Filed a bug: https://bugzilla.mozilla.org/show_bug.cgi?id=896804 + var isFirefoxMobile = goog.userAgent.GECKO && goog.userAgent.MOBILE; + + if (goog.isDef(win.devicePixelRatio) && !isFirefoxMobile) { + return win.devicePixelRatio; + } else if (win.matchMedia) { + return goog.dom.matchesPixelRatio_(.75) || + goog.dom.matchesPixelRatio_(1.5) || + goog.dom.matchesPixelRatio_(2) || + goog.dom.matchesPixelRatio_(3) || 1; + } + return 1; +}); + + +/** + * Calculates a mediaQuery to check if the current device supports the + * given actual to virtual pixel ratio. + * @param {number} pixelRatio The ratio of actual pixels to virtual pixels. + * @return {number} pixelRatio if applicable, otherwise 0. + * @private + */ +goog.dom.matchesPixelRatio_ = function(pixelRatio) { + var win = goog.dom.getWindow(); + var query = ('(-webkit-min-device-pixel-ratio: ' + pixelRatio + '),' + + '(min--moz-device-pixel-ratio: ' + pixelRatio + '),' + + '(min-resolution: ' + pixelRatio + 'dppx)'); + return win.matchMedia(query).matches ? pixelRatio : 0; +}; + + /** * Create an instance of a DOM helper with a new document object. @@ -2016,11 +2197,21 @@ goog.dom.DomHelper.prototype.getDocument = function() { * @return {Element} The element with the given ID, or the node passed in. */ goog.dom.DomHelper.prototype.getElement = function(element) { - if (goog.isString(element)) { - return this.document_.getElementById(element); - } else { - return element; - } + return goog.dom.getElementHelper_(this.document_, element); +}; + + +/** + * Gets an element by id, asserting that the element is found. + * + * This is used when an element is expected to exist, and should fail with + * an assertion error if it does not (if assertions are enabled). + * + * @param {string} id Element ID. + * @return {!Element} The element with the given ID, if it exists. + */ +goog.dom.DomHelper.prototype.getRequiredElement = function(id) { + return goog.dom.getRequiredElementHelper_(this.document_, id); }; @@ -2081,6 +2272,23 @@ goog.dom.DomHelper.prototype.getElementByClass = function(className, opt_el) { }; +/** + * Ensures an element with the given className exists, and then returns the + * first element with the provided className. + * @see {goog.dom.query} + * @param {string} className the name of the class to look for. + * @param {(!Element|!Document)=} opt_root Optional element or document to look + * in. + * @return {!Element} The first item found with the class name provided. + * @throws {goog.asserts.AssertionError} Thrown if no element is found. + */ +goog.dom.DomHelper.prototype.getRequiredElementByClass = function(className, + opt_root) { + var root = opt_root || this.document_; + return goog.dom.getRequiredElementByClass(className, root); +}; + + /** * Alias for {@code getElementsByTagNameAndClass}. * @deprecated Use DomHelper getElementsByTagNameAndClass. @@ -2228,16 +2436,6 @@ goog.dom.DomHelper.prototype.htmlToDocumentFragment = function(htmlString) { }; -/** - * Returns the compatMode of the document. - * @return {string} The result is either CSS1Compat or BackCompat. - * @deprecated use goog.dom.DomHelper.prototype.isCss1CompatMode instead. - */ -goog.dom.DomHelper.prototype.getCompatMode = function() { - return this.isCss1CompatMode() ? 'CSS1Compat' : 'BackCompat'; -}; - - /** * Returns true if the browser is in "CSS1-compatible" (standards-compliant) * mode, false otherwise. @@ -2259,7 +2457,7 @@ goog.dom.DomHelper.prototype.getWindow = function() { /** * Gets the document scroll element. - * @return {Element} Scrolling element. + * @return {!Element} Scrolling element. */ goog.dom.DomHelper.prototype.getDocumentScrollElement = function() { return goog.dom.getDocumentScrollElement_(this.document_); @@ -2443,7 +2641,7 @@ goog.dom.DomHelper.prototype.getPreviousNode = goog.dom.getPreviousNode; /** * Whether the object looks like a DOM node. - * @param {*} obj The object being tested for node likeness. + * @param {?} obj The object being tested for node likeness. * @return {boolean} Whether the object looks like a DOM node. */ goog.dom.DomHelper.prototype.isNodeLike = goog.dom.isNodeLike; @@ -2451,7 +2649,7 @@ goog.dom.DomHelper.prototype.isNodeLike = goog.dom.isNodeLike; /** * Whether the object looks like an Element. - * @param {*} obj The object being tested for Element likeness. + * @param {?} obj The object being tested for Element likeness. * @return {boolean} Whether the object looks like an Element. */ goog.dom.DomHelper.prototype.isElement = goog.dom.isElement; @@ -2460,7 +2658,7 @@ goog.dom.DomHelper.prototype.isElement = goog.dom.isElement; /** * Returns true if the specified value is a Window object. This includes the * global window for HTML pages, and iframe windows. - * @param {*} obj Variable to test. + * @param {?} obj Variable to test. * @return {boolean} Whether the variable is a window. */ goog.dom.DomHelper.prototype.isWindow = goog.dom.isWindow; @@ -2535,10 +2733,9 @@ goog.dom.DomHelper.prototype.getFrameContentWindow = /** - * Cross browser function for setting the text content of an element. - * @param {Element} element The element to change the text content of. - * @param {string} text The string that should replace the current element - * content with. + * Sets the text content of a node, with cross-browser support. + * @param {Node} node The node to change the text content of. + * @param {string|number} text The value that should replace the node's content. */ goog.dom.DomHelper.prototype.setTextContent = goog.dom.setTextContent; @@ -2574,7 +2771,7 @@ goog.dom.DomHelper.prototype.findNodes = goog.dom.findNodes; /** * Returns true if the element has a tab index that allows it to receive - * keyboard focus (tabIndex >= 0), false otherwise. Note that form elements + * keyboard focus (tabIndex >= 0), false otherwise. Note that some elements * natively support keyboard focus, even if they have no tab index. * @param {Element} element Element to check. * @return {boolean} Whether the element has a tab index that allows keyboard @@ -2596,6 +2793,16 @@ goog.dom.DomHelper.prototype.setFocusableTabIndex = goog.dom.setFocusableTabIndex; +/** + * Returns true if the element can be focused, i.e. it has a tab index that + * allows it to receive keyboard focus (tabIndex >= 0), or it is an element + * that natively supports keyboard focus. + * @param {Element} element Element to check. + * @return {boolean} Whether the element allows keyboard focus. + */ +goog.dom.DomHelper.prototype.isFocusable = goog.dom.isFocusable; + + /** * Returns the text contents of the current node, without markup. New lines are * stripped and whitespace is collapsed, such that each character would be diff --git a/third_party/closure/goog/dom/fontsizemonitor.js b/third_party/closure/goog/dom/fontsizemonitor.js index 8bf4f675697dd..fce018a0c56fd 100644 --- a/third_party/closure/goog/dom/fontsizemonitor.js +++ b/third_party/closure/goog/dom/fontsizemonitor.js @@ -46,6 +46,7 @@ goog.require('goog.userAgent'); * size changes. * @constructor * @extends {goog.events.EventTarget} + * @final */ goog.dom.FontSizeMonitor = function(opt_domHelper) { goog.events.EventTarget.call(this); diff --git a/third_party/closure/goog/dom/fullscreen.js b/third_party/closure/goog/dom/fullscreen.js index d1f1297314e10..195421350edd3 100644 --- a/third_party/closure/goog/dom/fullscreen.js +++ b/third_party/closure/goog/dom/fullscreen.js @@ -22,7 +22,6 @@ goog.provide('goog.dom.fullscreen.EventType'); goog.require('goog.dom'); goog.require('goog.userAgent'); -goog.require('goog.userAgent.product'); /** @@ -31,9 +30,20 @@ goog.require('goog.userAgent.product'); */ goog.dom.fullscreen.EventType = { /** Dispatched by the Document when the fullscreen status changes. */ - CHANGE: goog.userAgent.WEBKIT ? - 'webkitfullscreenchange' : - 'mozfullscreenchange' + CHANGE: (function() { + if (goog.userAgent.WEBKIT) { + return 'webkitfullscreenchange'; + } + if (goog.userAgent.GECKO) { + return 'mozfullscreenchange'; + } + if (goog.userAgent.IE) { + return 'MSFullscreenChange'; + } + // Opera 12-14, and W3C standard (Draft): + // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html + return 'fullscreenchange'; + })() }; @@ -46,8 +56,10 @@ goog.dom.fullscreen.EventType = { goog.dom.fullscreen.isSupported = function(opt_domHelper) { var doc = goog.dom.fullscreen.getDocument_(opt_domHelper); var body = doc.body; - return !!body.webkitRequestFullScreen || - (!!body.mozRequestFullScreen && doc.mozFullScreenEnabled); + return !!(body.webkitRequestFullscreen || + (body.mozRequestFullScreen && doc.mozFullScreenEnabled) || + (body.msRequestFullscreen && doc.msFullscreenEnabled) || + (body.requestFullscreen && doc.fullscreenEnabled)); }; @@ -56,10 +68,14 @@ goog.dom.fullscreen.isSupported = function(opt_domHelper) { * @param {!Element} element The element to put full screen. */ goog.dom.fullscreen.requestFullScreen = function(element) { - if (element.webkitRequestFullScreen) { - element.webkitRequestFullScreen(); + if (element.webkitRequestFullscreen) { + element.webkitRequestFullscreen(); } else if (element.mozRequestFullScreen) { element.mozRequestFullScreen(); + } else if (element.msRequestFullscreen) { + element.msRequestFullscreen(); + } else if (element.requestFullscreen) { + element.requestFullscreen(); } }; @@ -72,11 +88,8 @@ goog.dom.fullscreen.requestFullScreenWithKeys = function( element) { if (element.mozRequestFullScreenWithKeys) { element.mozRequestFullScreenWithKeys(); - } else if (element.webkitRequestFullScreen && - element.ALLOW_KEYBOARD_INPUT && - goog.userAgent.product.CHROME) { - // Safari has the ALLOW_KEYBOARD_INPUT property but using it gives an error. - element.webkitRequestFullScreen(element.ALLOW_KEYBOARD_INPUT); + } else if (element.webkitRequestFullscreen) { + element.webkitRequestFullscreen(); } else { goog.dom.fullscreen.requestFullScreen(element); } @@ -94,6 +107,10 @@ goog.dom.fullscreen.exitFullScreen = function(opt_domHelper) { doc.webkitCancelFullScreen(); } else if (doc.mozCancelFullScreen) { doc.mozCancelFullScreen(); + } else if (doc.msExitFullscreen) { + doc.msExitFullscreen(); + } else if (doc.exitFullscreen) { + doc.exitFullscreen(); } }; @@ -106,7 +123,10 @@ goog.dom.fullscreen.exitFullScreen = function(opt_domHelper) { */ goog.dom.fullscreen.isFullScreen = function(opt_domHelper) { var doc = goog.dom.fullscreen.getDocument_(opt_domHelper); - return !!doc.webkitIsFullScreen || !!doc.mozFullScreen; + // IE 11 doesn't have similar boolean property, so check whether + // document.msFullscreenElement is null instead. + return !!(doc.webkitIsFullScreen || doc.mozFullScreen || + doc.msFullscreenElement || doc.fullscreenElement); }; diff --git a/third_party/closure/goog/dom/iframe.js b/third_party/closure/goog/dom/iframe.js index c23e795c314b9..8298e22e0aa93 100644 --- a/third_party/closure/goog/dom/iframe.js +++ b/third_party/closure/goog/dom/iframe.js @@ -139,7 +139,7 @@ goog.dom.iframe.writeContent = function(iframe, content) { * @param {string=} opt_styles CSS styles for the iframe itself, before adding * to the parent element. * @param {boolean=} opt_quirks Whether to use quirks mode (false by default). - * @return {HTMLIFrameElement} An iframe that has the specified contents. + * @return {!HTMLIFrameElement} An iframe that has the specified contents. */ goog.dom.iframe.createWithContent = function( parentElement, opt_headContents, opt_bodyContents, opt_styles, opt_quirks) { diff --git a/third_party/closure/goog/dom/iter.js b/third_party/closure/goog/dom/iter.js index 0224af3ec4a51..7516414500655 100644 --- a/third_party/closure/goog/dom/iter.js +++ b/third_party/closure/goog/dom/iter.js @@ -79,6 +79,7 @@ goog.dom.iter.SiblingIterator.prototype.next = function() { * @param {number=} opt_startIndex Optional starting index. * @constructor * @extends {goog.dom.iter.SiblingIterator} + * @final */ goog.dom.iter.ChildIterator = function(element, opt_reverse, opt_startIndex) { if (!goog.isDef(opt_startIndex)) { @@ -99,6 +100,7 @@ goog.inherits(goog.dom.iter.ChildIterator, goog.dom.iter.SiblingIterator); * first return value from next. * @constructor * @extends {goog.iter.Iterator} + * @final */ goog.dom.iter.AncestorIterator = function(node, opt_includeNode) { /** diff --git a/third_party/closure/goog/dom/multirange.js b/third_party/closure/goog/dom/multirange.js index 4e2526960d210..d024f66f564b5 100644 --- a/third_party/closure/goog/dom/multirange.js +++ b/third_party/closure/goog/dom/multirange.js @@ -23,7 +23,6 @@ goog.provide('goog.dom.MultiRange'); goog.provide('goog.dom.MultiRangeIterator'); goog.require('goog.array'); -goog.require('goog.debug.Logger'); goog.require('goog.dom.AbstractMultiRange'); goog.require('goog.dom.AbstractRange'); goog.require('goog.dom.RangeIterator'); @@ -31,6 +30,7 @@ goog.require('goog.dom.RangeType'); goog.require('goog.dom.SavedRange'); goog.require('goog.dom.TextRange'); goog.require('goog.iter.StopIteration'); +goog.require('goog.log'); @@ -39,6 +39,7 @@ goog.require('goog.iter.StopIteration'); * constructor: use one of the goog.dom.Range.createFrom* methods instead. * @constructor * @extends {goog.dom.AbstractMultiRange} + * @final */ goog.dom.MultiRange = function() { /** @@ -76,7 +77,7 @@ goog.inherits(goog.dom.MultiRange, goog.dom.AbstractMultiRange); * Creates a new range wrapper from the given browser selection object. Do not * use this method directly - please use goog.dom.Range.createFrom* instead. * @param {Selection} selection The browser selection object. - * @return {goog.dom.MultiRange} A range wrapper object. + * @return {!goog.dom.MultiRange} A range wrapper object. */ goog.dom.MultiRange.createFromBrowserSelection = function(selection) { var range = new goog.dom.MultiRange(); @@ -91,7 +92,7 @@ goog.dom.MultiRange.createFromBrowserSelection = function(selection) { * Creates a new range wrapper from the given browser ranges. Do not * use this method directly - please use goog.dom.Range.createFrom* instead. * @param {Array.} browserRanges The browser ranges. - * @return {goog.dom.MultiRange} A range wrapper object. + * @return {!goog.dom.MultiRange} A range wrapper object. */ goog.dom.MultiRange.createFromBrowserRanges = function(browserRanges) { var range = new goog.dom.MultiRange(); @@ -104,7 +105,7 @@ goog.dom.MultiRange.createFromBrowserRanges = function(browserRanges) { * Creates a new range wrapper from the given goog.dom.TextRange objects. Do * not use this method directly - please use goog.dom.Range.createFrom* instead. * @param {Array.} textRanges The text range objects. - * @return {goog.dom.MultiRange} A range wrapper object. + * @return {!goog.dom.MultiRange} A range wrapper object. */ goog.dom.MultiRange.createFromTextRanges = function(textRanges) { var range = new goog.dom.MultiRange(); @@ -118,11 +119,11 @@ goog.dom.MultiRange.createFromTextRanges = function(textRanges) { /** * Logging object. - * @type {goog.debug.Logger} + * @type {goog.log.Logger} * @private */ goog.dom.MultiRange.prototype.logger_ = - goog.debug.Logger.getLogger('goog.dom.MultiRange'); + goog.log.getLogger('goog.dom.MultiRange'); // Method implementations @@ -141,7 +142,7 @@ goog.dom.MultiRange.prototype.clearCachedValues_ = function() { /** - * @return {goog.dom.MultiRange} A clone of this range. + * @return {!goog.dom.MultiRange} A clone of this range. * @override */ goog.dom.MultiRange.prototype.clone = function() { @@ -159,7 +160,7 @@ goog.dom.MultiRange.prototype.getType = function() { goog.dom.MultiRange.prototype.getBrowserRangeObject = function() { // NOTE(robbyw): This method does not make sense for multi-ranges. if (this.browserRanges_.length > 1) { - this.logger_.warning( + goog.log.warning(this.logger_, 'getBrowserRangeObject called on MultiRange with more than 1 range'); } return this.browserRanges_[0]; @@ -203,7 +204,7 @@ goog.dom.MultiRange.prototype.getContainer = function() { /** - * @return {Array.} An array of sub-ranges, sorted by start + * @return {!Array.} An array of sub-ranges, sorted by start * point. */ goog.dom.MultiRange.prototype.getSortedRanges = function() { @@ -385,7 +386,7 @@ goog.inherits(goog.dom.DomSavedMultiRange_, goog.dom.SavedRange); /** - * @return {goog.dom.MultiRange} The restored range. + * @return {!goog.dom.MultiRange} The restored range. * @override */ goog.dom.DomSavedMultiRange_.prototype.restoreInternal = function() { @@ -418,6 +419,7 @@ goog.dom.DomSavedMultiRange_.prototype.disposeInternal = function() { * @param {goog.dom.MultiRange} range The range to traverse. * @constructor * @extends {goog.dom.RangeIterator} + * @final */ goog.dom.MultiRangeIterator = function(range) { if (range) { @@ -509,7 +511,7 @@ goog.dom.MultiRangeIterator.prototype.copyFrom = function(other) { /** - * @return {goog.dom.MultiRangeIterator} An identical iterator. + * @return {!goog.dom.MultiRangeIterator} An identical iterator. * @override */ goog.dom.MultiRangeIterator.prototype.clone = function() { diff --git a/third_party/closure/goog/dom/nodeiterator.js b/third_party/closure/goog/dom/nodeiterator.js index 22453a021eb92..bca563c3e33a6 100644 --- a/third_party/closure/goog/dom/nodeiterator.js +++ b/third_party/closure/goog/dom/nodeiterator.js @@ -62,6 +62,7 @@ goog.require('goog.dom.TagIterator'); * @param {number=} opt_depth The starting tree depth. * @constructor * @extends {goog.dom.TagIterator} + * @final */ goog.dom.NodeIterator = function(opt_node, opt_reversed, opt_unconstrained, opt_depth) { diff --git a/third_party/closure/goog/dom/nodeoffset.js b/third_party/closure/goog/dom/nodeoffset.js index 084d4b076681b..739749a1121f0 100644 --- a/third_party/closure/goog/dom/nodeoffset.js +++ b/third_party/closure/goog/dom/nodeoffset.js @@ -33,6 +33,7 @@ goog.require('goog.dom.TagName'); * @param {Node} baseNode The node to calculate the offset from. * @extends {goog.Disposable} * @constructor + * @final */ goog.dom.NodeOffset = function(node, baseNode) { goog.Disposable.call(this); diff --git a/third_party/closure/goog/dom/nodetype.js b/third_party/closure/goog/dom/nodetype.js new file mode 100644 index 0000000000000..cccb4706eca19 --- /dev/null +++ b/third_party/closure/goog/dom/nodetype.js @@ -0,0 +1,48 @@ +// 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 Definition of goog.dom.NodeType. + */ + +goog.provide('goog.dom.NodeType'); + + +/** + * Constants for the nodeType attribute in the Node interface. + * + * These constants match those specified in the Node interface. These are + * usually present on the Node object in recent browsers, but not in older + * browsers (specifically, early IEs) and thus are given here. + * + * In some browsers (early IEs), these are not defined on the Node object, + * so they are provided here. + * + * See http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-1950641247 + * @enum {number} + */ +goog.dom.NodeType = { + ELEMENT: 1, + ATTRIBUTE: 2, + TEXT: 3, + CDATA_SECTION: 4, + ENTITY_REFERENCE: 5, + ENTITY: 6, + PROCESSING_INSTRUCTION: 7, + COMMENT: 8, + DOCUMENT: 9, + DOCUMENT_TYPE: 10, + DOCUMENT_FRAGMENT: 11, + NOTATION: 12 +}; diff --git a/third_party/closure/goog/dom/pattern/callback/counter.js b/third_party/closure/goog/dom/pattern/callback/counter.js index a354de05f192e..003c71a0add46 100644 --- a/third_party/closure/goog/dom/pattern/callback/counter.js +++ b/third_party/closure/goog/dom/pattern/callback/counter.js @@ -25,6 +25,7 @@ goog.provide('goog.dom.pattern.callback.Counter'); /** * Callback class for counting matches. * @constructor + * @final */ goog.dom.pattern.callback.Counter = function() { }; @@ -51,7 +52,7 @@ goog.dom.pattern.callback.Counter.prototype.callback_ = null; * Get a bound callback function that is suitable as a callback for * {@link goog.dom.pattern.Matcher}. * - * @return {Function} A callback function. + * @return {!Function} A callback function. */ goog.dom.pattern.callback.Counter.prototype.getCallback = function() { if (!this.callback_) { diff --git a/third_party/closure/goog/dom/pattern/callback/test.js b/third_party/closure/goog/dom/pattern/callback/test.js index 30a58c1615b41..1bfc923bcb52f 100644 --- a/third_party/closure/goog/dom/pattern/callback/test.js +++ b/third_party/closure/goog/dom/pattern/callback/test.js @@ -27,6 +27,7 @@ goog.require('goog.iter.StopIteration'); /** * Callback class for testing for at least one match. * @constructor + * @final */ goog.dom.pattern.callback.Test = function() { }; @@ -53,7 +54,7 @@ goog.dom.pattern.callback.Test.prototype.callback_ = null; * Get a bound callback function that is suitable as a callback for * {@link goog.dom.pattern.Matcher}. * - * @return {Function} A callback function. + * @return {!Function} A callback function. */ goog.dom.pattern.callback.Test.prototype.getCallback = function() { if (!this.callback_) { diff --git a/third_party/closure/goog/dom/pattern/childmatches.js b/third_party/closure/goog/dom/pattern/childmatches.js index 72f1b51f33ca2..52a0a4dec5e94 100644 --- a/third_party/closure/goog/dom/pattern/childmatches.js +++ b/third_party/closure/goog/dom/pattern/childmatches.js @@ -35,6 +35,7 @@ goog.require('goog.dom.pattern.MatchType'); * Defaults to 0. * @constructor * @extends {goog.dom.pattern.AllChildren} + * @final */ goog.dom.pattern.ChildMatches = function(childPattern, opt_minimumMatches) { this.childPattern_ = childPattern; diff --git a/third_party/closure/goog/dom/pattern/endtag.js b/third_party/closure/goog/dom/pattern/endtag.js index 75f995266d43f..409f952dec2d6 100644 --- a/third_party/closure/goog/dom/pattern/endtag.js +++ b/third_party/closure/goog/dom/pattern/endtag.js @@ -40,6 +40,7 @@ goog.require('goog.dom.pattern.Tag'); * parameter and returns true if this pattern should match it. * @constructor * @extends {goog.dom.pattern.Tag} + * @final */ goog.dom.pattern.EndTag = function(tag, opt_attrs, opt_styles, opt_test) { goog.dom.pattern.Tag.call( diff --git a/third_party/closure/goog/dom/pattern/fulltag.js b/third_party/closure/goog/dom/pattern/fulltag.js index 1fa2230319ad4..16264e9ae90d9 100644 --- a/third_party/closure/goog/dom/pattern/fulltag.js +++ b/third_party/closure/goog/dom/pattern/fulltag.js @@ -41,6 +41,7 @@ goog.require('goog.dom.pattern.Tag'); * parameter and returns true if this pattern should match it. * @constructor * @extends {goog.dom.pattern.StartTag} + * @final */ goog.dom.pattern.FullTag = function(tag, opt_attrs, opt_styles, opt_test) { goog.dom.pattern.StartTag.call( diff --git a/third_party/closure/goog/dom/pattern/matcher.js b/third_party/closure/goog/dom/pattern/matcher.js index c0c87a3d276fb..9b7e8c691e284 100644 --- a/third_party/closure/goog/dom/pattern/matcher.js +++ b/third_party/closure/goog/dom/pattern/matcher.js @@ -45,6 +45,7 @@ goog.require('goog.iter'); * all matches eventually. * * @constructor + * @final */ goog.dom.pattern.Matcher = function() { this.patterns_ = []; diff --git a/third_party/closure/goog/dom/pattern/nodetype.js b/third_party/closure/goog/dom/pattern/nodetype.js index b13bbe18c8b02..a12c9a1cf373b 100644 --- a/third_party/closure/goog/dom/pattern/nodetype.js +++ b/third_party/closure/goog/dom/pattern/nodetype.js @@ -30,6 +30,7 @@ goog.require('goog.dom.pattern.MatchType'); * @param {goog.dom.NodeType} nodeType The node type to match. * @constructor * @extends {goog.dom.pattern.AbstractPattern} + * @final */ goog.dom.pattern.NodeType = function(nodeType) { /** diff --git a/third_party/closure/goog/dom/pattern/repeat.js b/third_party/closure/goog/dom/pattern/repeat.js index 5a47de0b085cb..9a04d6a34c4d2 100644 --- a/third_party/closure/goog/dom/pattern/repeat.js +++ b/third_party/closure/goog/dom/pattern/repeat.js @@ -36,6 +36,7 @@ goog.require('goog.dom.pattern.MatchType'); * to unlimited. * @constructor * @extends {goog.dom.pattern.AbstractPattern} + * @final */ goog.dom.pattern.Repeat = function(pattern, opt_minimum, diff --git a/third_party/closure/goog/dom/pattern/sequence.js b/third_party/closure/goog/dom/pattern/sequence.js index df40fd6f616fe..b26ed8db2afac 100644 --- a/third_party/closure/goog/dom/pattern/sequence.js +++ b/third_party/closure/goog/dom/pattern/sequence.js @@ -35,6 +35,7 @@ goog.require('goog.dom.pattern.MatchType'); * consisting entirely of whitespace. The default is to not ignore them. * @constructor * @extends {goog.dom.pattern.AbstractPattern} + * @final */ goog.dom.pattern.Sequence = function(patterns, opt_ignoreWhitespace) { this.patterns = patterns; diff --git a/third_party/closure/goog/dom/pattern/text.js b/third_party/closure/goog/dom/pattern/text.js index 5b625ab84e0aa..c4519608c55b1 100644 --- a/third_party/closure/goog/dom/pattern/text.js +++ b/third_party/closure/goog/dom/pattern/text.js @@ -33,6 +33,7 @@ goog.require('goog.dom.pattern.MatchType'); * @param {string|RegExp} match String or regular expression to match against. * @constructor * @extends {goog.dom.pattern.AbstractPattern} + * @final */ goog.dom.pattern.Text = function(match) { this.match_ = match; diff --git a/third_party/closure/goog/dom/range.js b/third_party/closure/goog/dom/range.js index 4df2a20874581..0d99062f53079 100644 --- a/third_party/closure/goog/dom/range.js +++ b/third_party/closure/goog/dom/range.js @@ -89,7 +89,7 @@ goog.dom.Range.createFromBrowserSelection = function(selection) { * @param {Range|TextRange} range The browser range object. * @param {boolean=} opt_isReversed Whether the focus node is before the anchor * node. - * @return {goog.dom.AbstractRange} A range wrapper object. + * @return {!goog.dom.AbstractRange} A range wrapper object. */ goog.dom.Range.createFromBrowserRange = function(range, opt_isReversed) { // Create an IE control range when appropriate. @@ -104,7 +104,7 @@ goog.dom.Range.createFromBrowserRange = function(range, opt_isReversed) { * @param {Node} node The node to select. * @param {boolean=} opt_isReversed Whether the focus node is before the anchor * node. - * @return {goog.dom.AbstractRange} A range wrapper object. + * @return {!goog.dom.AbstractRange} A range wrapper object. */ goog.dom.Range.createFromNodeContents = function(node, opt_isReversed) { return goog.dom.TextRange.createFromNodeContents(node, opt_isReversed); @@ -117,7 +117,7 @@ goog.dom.Range.createFromNodeContents = function(node, opt_isReversed) { * of whether node is an image node or other control range type node. * @param {Node} node The node to place a caret at. * @param {number} offset The offset within the node to place the caret at. - * @return {goog.dom.AbstractRange} A range wrapper object. + * @return {!goog.dom.AbstractRange} A range wrapper object. */ goog.dom.Range.createCaret = function(node, offset) { return goog.dom.TextRange.createFromNodes(node, offset, node, offset); @@ -127,16 +127,16 @@ goog.dom.Range.createCaret = function(node, offset) { /** * Create a new range wrapper that selects the area between the given nodes, * accounting for the given offsets. - * @param {Node} startNode The node to start with. - * @param {number} startOffset The offset within the node to start. - * @param {Node} endNode The node to end with. - * @param {number} endOffset The offset within the node to end. - * @return {goog.dom.AbstractRange} A range wrapper object. + * @param {Node} anchorNode The node to anchor on. + * @param {number} anchorOffset The offset within the node to anchor on. + * @param {Node} focusNode The node to focus on. + * @param {number} focusOffset The offset within the node to focus on. + * @return {!goog.dom.AbstractRange} A range wrapper object. */ -goog.dom.Range.createFromNodes = function(startNode, startOffset, endNode, - endOffset) { - return goog.dom.TextRange.createFromNodes(startNode, startOffset, endNode, - endOffset); +goog.dom.Range.createFromNodes = function(anchorNode, anchorOffset, focusNode, + focusOffset) { + return goog.dom.TextRange.createFromNodes(anchorNode, anchorOffset, focusNode, + focusOffset); }; @@ -186,10 +186,10 @@ goog.dom.Range.hasSelection = function(opt_win) { /** * Returns whether the focus position occurs before the anchor position. - * @param {Node} anchorNode The node to start with. - * @param {number} anchorOffset The offset within the node to start. - * @param {Node} focusNode The node to end with. - * @param {number} focusOffset The offset within the node to end. + * @param {Node} anchorNode The node to anchor on. + * @param {number} anchorOffset The offset within the node to anchor on. + * @param {Node} focusNode The node to focus on. + * @param {number} focusOffset The offset within the node to focus on. * @return {boolean} Whether the focus position occurs before the anchor * position. */ diff --git a/third_party/closure/goog/dom/safe.js b/third_party/closure/goog/dom/safe.js new file mode 100644 index 0000000000000..ad821257de9ec --- /dev/null +++ b/third_party/closure/goog/dom/safe.js @@ -0,0 +1,125 @@ +// Copyright 2013 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 Type-safe wrappers for unsafe DOM APIs. + * + * This file provides type-safe wrappers for DOM APIs that can result in + * cross-site scripting (XSS) vulnerabilities, if the API is supplied with + * untrusted (attacker-controlled) input. Instead of plain strings, the type + * safe wrappers consume values of types from the goog.html package whose + * contract promises that values are safe to use in the corresponding context. + * + * Hence, a program that exclusively uses the wrappers in this file (i.e., whose + * only reference to security-sensitive raw DOM APIs are in this file) is + * guaranteed to be free of XSS due to incorrect use of such DOM APIs (modulo + * correctness of code that produces values of the respective goog.html types, + * and absent code that violates type safety). + * + * For example, assigning to an element's .innerHTML property a string that is + * derived (even partially) from untrusted input typically results in an XSS + * vulnerability. The type-safe wrapper goog.html.setInnerHtml consumes a value + * of type goog.html.SafeHtml, whose contract states that using its values in a + * HTML context will not result in XSS. Hence a program that is free of direct + * assignments to any element's innerHTML property (with the exception of the + * assignment to .innerHTML in this file) is guaranteed to be free of XSS due to + * assignment of untrusted strings to the innerHTML property. + */ + +goog.provide('goog.dom.safe'); + +goog.require('goog.html.SafeHtml'); +goog.require('goog.html.SafeUrl'); + + +/** + * Assigns known-safe HTML to an element's innerHTML property. + * @param {!Element} elem The element whose innerHTML is to be assigned to. + * @param {!goog.html.SafeHtml} html The known-safe HTML to assign. + */ +goog.dom.safe.setInnerHtml = function(elem, html) { + elem.innerHTML = goog.html.SafeHtml.unwrap(html); +}; + + +/** + * Writes known-safe HTML to a document. + * @param {!Document} doc The document to be written to. + * @param {!goog.html.SafeHtml} html The known-safe HTML to assign. + */ +goog.dom.safe.documentWrite = function(doc, html) { + doc.write(goog.html.SafeHtml.unwrap(html)); +}; + + +/** + * Safely assigns a URL to an anchor element's href property. + * + * If url is of type goog.html.SafeUrl, its value is unwrapped and assigned to + * anchor's href property. If url is of type string however, it is first + * sanitized using goog.html.SafeUrl.sanitize. + * + * Example usage: + * goog.dom.safe.setAnchorHref(anchorEl, url); + * which is a safe alternative to + * anchorEl.href = url; + * The latter can result in XSS vulnerabilities if url is a + * user-/attacker-controlled value. + * + * @param {!HTMLAnchorElement} anchor The anchor element whose href property + * is to be assigned to. + * @param {string|!goog.html.SafeUrl} url The URL to assign. + * @see goog.html.SafeUrl#sanitize + */ +goog.dom.safe.setAnchorHref = function(anchor, url) { + /** @type {!goog.html.SafeUrl} */ + var safeUrl; + if (url instanceof goog.html.SafeUrl) { + safeUrl = url; + } else { + safeUrl = goog.html.SafeUrl.sanitize(url); + } + anchor.href = goog.html.SafeUrl.unwrap(safeUrl); +}; + + +/** + * Safely assigns a URL to a Location object's href property. + * + * If url is of type goog.html.SafeUrl, its value is unwrapped and assigned to + * loc's href property. If url is of type string however, it is first sanitized + * using goog.html.SafeUrl.sanitize. + * + * Example usage: + * goog.dom.safe.setLocationHref(document.location, redirectUrl); + * which is a safe alternative to + * document.location.href = redirectUrl; + * The latter can result in XSS vulnerabilities if redirectUrl is a + * user-/attacker-controlled value. + * + * @param {!Location} loc The Location object whose href property is to be + * assigned to. + * @param {string|!goog.html.SafeUrl} url The URL to assign. + * @see goog.html.SafeUrl#sanitize + */ +goog.dom.safe.setLocationHref = function(loc, url) { + /** @type {!goog.html.SafeUrl} */ + var safeUrl; + if (url instanceof goog.html.SafeUrl) { + safeUrl = url; + } else { + safeUrl = goog.html.SafeUrl.sanitize(url); + } + loc.href = goog.html.SafeUrl.unwrap(safeUrl); +}; diff --git a/third_party/closure/goog/dom/savedcaretrange.js b/third_party/closure/goog/dom/savedcaretrange.js index 31d313461f87d..ea610504c56a9 100644 --- a/third_party/closure/goog/dom/savedcaretrange.js +++ b/third_party/closure/goog/dom/savedcaretrange.js @@ -58,6 +58,12 @@ goog.dom.SavedCaretRange = function(range) { */ this.endCaretId_ = goog.string.createUniqueString(); + /** + * Whether the range is reversed (anchor at the end). + * @private {boolean} + */ + this.reversed_ = range.isReversed(); + /** * A DOM helper for storing the current document context. * @type {goog.dom.DomHelper} @@ -80,6 +86,7 @@ goog.dom.SavedCaretRange.prototype.toAbstractRange = function() { var startCaret = this.getCaret(true); var endCaret = this.getCaret(false); if (startCaret && endCaret) { + /** @suppress {missingRequire} circular dependency */ range = goog.dom.Range.createFromNodes(startCaret, 0, endCaret, 0); } return range; @@ -132,19 +139,24 @@ goog.dom.SavedCaretRange.prototype.setRestorationDocument = function(doc) { */ goog.dom.SavedCaretRange.prototype.restoreInternal = function() { var range = null; - var startCaret = this.getCaret(true); - var endCaret = this.getCaret(false); - if (startCaret && endCaret) { - var startNode = startCaret.parentNode; - var startOffset = goog.array.indexOf(startNode.childNodes, startCaret); - var endNode = endCaret.parentNode; - var endOffset = goog.array.indexOf(endNode.childNodes, endCaret); - if (endNode == startNode) { + var anchorCaret = this.getCaret(!this.reversed_); + var focusCaret = this.getCaret(this.reversed_); + if (anchorCaret && focusCaret) { + var anchorNode = anchorCaret.parentNode; + var anchorOffset = goog.array.indexOf(anchorNode.childNodes, anchorCaret); + var focusNode = focusCaret.parentNode; + var focusOffset = goog.array.indexOf(focusNode.childNodes, focusCaret); + if (focusNode == anchorNode) { // Compensate for the start caret being removed. - endOffset -= 1; + if (this.reversed_) { + anchorOffset--; + } else { + focusOffset--; + } } - range = goog.dom.Range.createFromNodes(startNode, startOffset, - endNode, endOffset); + /** @suppress {missingRequire} circular dependency */ + range = goog.dom.Range.createFromNodes(anchorNode, anchorOffset, + focusNode, focusOffset); range = this.removeCarets(range); range.select(); } else { @@ -170,7 +182,7 @@ goog.dom.SavedCaretRange.prototype.disposeInternal = function() { * Creates a caret element. * @param {boolean} start If true, creates the start caret. Otherwise, * creates the end caret. - * @return {Element} The new caret element. + * @return {!Element} The new caret element. * @private */ goog.dom.SavedCaretRange.prototype.createCaret_ = function(start) { diff --git a/third_party/closure/goog/dom/savedrange.js b/third_party/closure/goog/dom/savedrange.js index 4f356d3cf153d..5a7e951347291 100644 --- a/third_party/closure/goog/dom/savedrange.js +++ b/third_party/closure/goog/dom/savedrange.js @@ -22,7 +22,7 @@ goog.provide('goog.dom.SavedRange'); goog.require('goog.Disposable'); -goog.require('goog.debug.Logger'); +goog.require('goog.log'); @@ -39,11 +39,11 @@ goog.inherits(goog.dom.SavedRange, goog.Disposable); /** * Logging object. - * @type {goog.debug.Logger} + * @type {goog.log.Logger} * @private */ goog.dom.SavedRange.logger_ = - goog.debug.Logger.getLogger('goog.dom.SavedRange'); + goog.log.getLogger('goog.dom.SavedRange'); /** @@ -55,7 +55,7 @@ goog.dom.SavedRange.logger_ = */ goog.dom.SavedRange.prototype.restore = function(opt_stayAlive) { if (this.isDisposed()) { - goog.dom.SavedRange.logger_.severe( + goog.log.error(goog.dom.SavedRange.logger_, 'Disposed SavedRange objects cannot be restored.'); } diff --git a/third_party/closure/goog/dom/selection.js b/third_party/closure/goog/dom/selection.js index 6d6f69e14fad8..295f7d78d0f4f 100644 --- a/third_party/closure/goog/dom/selection.js +++ b/third_party/closure/goog/dom/selection.js @@ -77,7 +77,7 @@ goog.dom.selection.getStart = function(textfield) { * cursor position is to be returned. In IE, obtaining the end position * involves extra work, hence we have this parameter for calls which need * only start position. - * @return {Array.} An array with the start and end positions where the + * @return {!Array.} An array with the start and end positions where the * selection starts and ends or [0,0] if it was unable to find the * positions or no selection exists. Note that we can't reliably tell the * difference between an element that has no selection and one where @@ -168,7 +168,7 @@ goog.dom.selection.getEndPointsTextareaIe_ = function( * Returns the start and end points of the selection inside a textarea or a * text input. * @param {Element} textfield A textarea or text input. - * @return {Array.} An array with the start and end positions where the + * @return {!Array.} An array with the start and end positions where the * selection starts and ends or [0,0] if it was unable to find the * positions or no selection exists. Note that we can't reliably tell the * difference between an element that has no selection and one where @@ -187,7 +187,7 @@ goog.dom.selection.getEndPoints = function(textfield) { * cursor position is to be returned. In IE, obtaining the end position * involves extra work, hence we have this parameter. In FF, there is not * much extra effort involved. - * @return {Array.} An array with the start and end positions where the + * @return {!Array.} An array with the start and end positions where the * selection starts and ends or [0,0] if it was unable to find the * positions or no selection exists. Note that we can't reliably tell the * difference between an element that has no selection and one where @@ -408,7 +408,7 @@ goog.dom.selection.getSelectionRangeText_ = function(selRange) { * selection range * @private * @param {Element} el The element to get the range for. - * @return {Array.} Range of object and selection range in two + * @return {!Array.} Range of object and selection range in two * element array. */ goog.dom.selection.getRangeIe_ = function(el) { diff --git a/third_party/closure/goog/dom/tagiterator.js b/third_party/closure/goog/dom/tagiterator.js index cd7787d6d934b..404a18742b473 100644 --- a/third_party/closure/goog/dom/tagiterator.js +++ b/third_party/closure/goog/dom/tagiterator.js @@ -21,6 +21,7 @@ goog.provide('goog.dom.TagIterator'); goog.provide('goog.dom.TagWalkType'); +goog.require('goog.dom'); goog.require('goog.dom.NodeType'); goog.require('goog.iter.Iterator'); goog.require('goog.iter.StopIteration'); @@ -94,7 +95,7 @@ goog.dom.TagWalkType = { * the end of the node for reverse iterators. * @param {number=} opt_depth The starting tree depth. * @constructor - * @extends {goog.iter.Iterator} + * @extends {goog.iter.Iterator.} */ goog.dom.TagIterator = function(opt_node, opt_reversed, opt_unconstrained, opt_tagType, opt_depth) { @@ -206,7 +207,7 @@ goog.dom.TagIterator.prototype.copyFrom = function(other) { /** - * @return {goog.dom.TagIterator} A copy of this iterator. + * @return {!goog.dom.TagIterator} A copy of this iterator. */ goog.dom.TagIterator.prototype.clone = function() { return new goog.dom.TagIterator(this.node, this.reversed, diff --git a/third_party/closure/goog/dom/tags.js b/third_party/closure/goog/dom/tags.js new file mode 100644 index 0000000000000..159abe0ceeb07 --- /dev/null +++ b/third_party/closure/goog/dom/tags.js @@ -0,0 +1,42 @@ +// Copyright 2014 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 HTML element tag names. + */ +goog.provide('goog.dom.tags'); + +goog.require('goog.object'); + + +/** + * The void elements specified by + * http://www.w3.org/TR/html-markup/syntax.html#void-elements. + * @const + * @type {!Object} + * @private + */ +goog.dom.tags.VOID_TAGS_ = goog.object.createSet(('area,base,br,col,command,' + + 'embed,hr,img,input,keygen,link,meta,param,source,track,wbr').split(',')); + + +/** + * Checks whether the tag is void (with no contents allowed and no legal end + * tag), for example 'br'. + * @param {string} tagName The tag name in lower case. + * @return {boolean} + */ +goog.dom.tags.isVoidTag = function(tagName) { + return goog.dom.tags.VOID_TAGS_[tagName] === true; +}; diff --git a/third_party/closure/goog/dom/textrange.js b/third_party/closure/goog/dom/textrange.js index 73b82ac1ab8c9..c8e708e363707 100644 --- a/third_party/closure/goog/dom/textrange.js +++ b/third_party/closure/goog/dom/textrange.js @@ -41,6 +41,7 @@ goog.require('goog.userAgent'); * use one of the goog.dom.Range.createFrom* methods instead. * @constructor * @extends {goog.dom.AbstractRange} + * @final */ goog.dom.TextRange = function() { }; @@ -53,7 +54,7 @@ goog.inherits(goog.dom.TextRange, goog.dom.AbstractRange); * @param {Range|TextRange} range The browser range object. * @param {boolean=} opt_isReversed Whether the focus node is before the anchor * node. - * @return {goog.dom.TextRange} A range wrapper object. + * @return {!goog.dom.TextRange} A range wrapper object. */ goog.dom.TextRange.createFromBrowserRange = function(range, opt_isReversed) { return goog.dom.TextRange.createFromBrowserRangeWrapper_( @@ -67,7 +68,7 @@ goog.dom.TextRange.createFromBrowserRange = function(range, opt_isReversed) { * wrapper. * @param {boolean=} opt_isReversed Whether the focus node is before the anchor * node. - * @return {goog.dom.TextRange} A range wrapper object. + * @return {!goog.dom.TextRange} A range wrapper object. * @private */ goog.dom.TextRange.createFromBrowserRangeWrapper_ = function(browserRange, @@ -88,7 +89,7 @@ goog.dom.TextRange.createFromBrowserRangeWrapper_ = function(browserRange, * @param {Node} node The node to select. * @param {boolean=} opt_isReversed Whether the focus node is before the anchor * node. - * @return {goog.dom.TextRange} A range wrapper object. + * @return {!goog.dom.TextRange} A range wrapper object. */ goog.dom.TextRange.createFromNodeContents = function(node, opt_isReversed) { return goog.dom.TextRange.createFromBrowserRangeWrapper_( @@ -105,7 +106,7 @@ goog.dom.TextRange.createFromNodeContents = function(node, opt_isReversed) { * @param {number} anchorOffset The offset within the node to start. * @param {Node} focusNode The node to end with. * @param {number} focusOffset The offset within the node to end. - * @return {goog.dom.TextRange} A range wrapper object. + * @return {!goog.dom.TextRange} A range wrapper object. */ goog.dom.TextRange.createFromNodes = function(anchorNode, anchorOffset, focusNode, focusOffset) { @@ -206,7 +207,7 @@ goog.dom.TextRange.prototype.isReversed_ = false; /** - * @return {goog.dom.TextRange} A clone of this range. + * @return {!goog.dom.TextRange} A clone of this range. * @override */ goog.dom.TextRange.prototype.clone = function() { @@ -270,7 +271,7 @@ goog.dom.TextRange.prototype.getTextRange = function(i) { /** - * @return {goog.dom.browserrange.AbstractRange} The range wrapper object. + * @return {!goog.dom.browserrange.AbstractRange} The range wrapper object. * @private */ goog.dom.TextRange.prototype.getBrowserRangeWrapper_ = function() { @@ -478,7 +479,7 @@ goog.dom.TextRange.prototype.getPastableHtml = function() { * Returns a TextRangeIterator over the contents of the range. Regardless of * the direction of the range, the iterator will move in document order. * @param {boolean=} opt_keys Unused for this iterator. - * @return {goog.dom.TextRangeIterator} An iterator over tags in the range. + * @return {!goog.dom.TextRangeIterator} An iterator over tags in the range. * @override */ goog.dom.TextRange.prototype.__iterator__ = function(opt_keys) { @@ -612,7 +613,7 @@ goog.inherits(goog.dom.DomSavedTextRange_, goog.dom.SavedRange); /** - * @return {goog.dom.AbstractRange} The restored range. + * @return {!goog.dom.AbstractRange} The restored range. * @override */ goog.dom.DomSavedTextRange_.prototype.restoreInternal = function() { diff --git a/third_party/closure/goog/dom/textrangeiterator.js b/third_party/closure/goog/dom/textrangeiterator.js index b8d49b8565dfd..e54b1d41e4f00 100644 --- a/third_party/closure/goog/dom/textrangeiterator.js +++ b/third_party/closure/goog/dom/textrangeiterator.js @@ -43,6 +43,7 @@ goog.require('goog.iter.StopIteration'); * @param {boolean=} opt_reverse Whether to traverse nodes in reverse. * @constructor * @extends {goog.dom.RangeIterator} + * @final */ goog.dom.TextRangeIterator = function(startNode, startOffset, endNode, endOffset, opt_reverse) { @@ -233,7 +234,7 @@ goog.dom.TextRangeIterator.prototype.copyFrom = function(other) { /** - * @return {goog.dom.TextRangeIterator} An identical iterator. + * @return {!goog.dom.TextRangeIterator} An identical iterator. * @override */ goog.dom.TextRangeIterator.prototype.clone = function() { diff --git a/third_party/closure/goog/dom/vendor.js b/third_party/closure/goog/dom/vendor.js index 8787f66615a28..7c1123ec4aa4a 100644 --- a/third_party/closure/goog/dom/vendor.js +++ b/third_party/closure/goog/dom/vendor.js @@ -18,6 +18,7 @@ goog.provide('goog.dom.vendor'); +goog.require('goog.string'); goog.require('goog.userAgent'); @@ -60,3 +61,36 @@ goog.dom.vendor.getVendorPrefix = function() { return null; }; + + +/** + * @param {string} propertyName A property name. + * @param {!Object=} opt_object If provided, we verify if the property exists in + * the object. + * @return {?string} A vendor prefixed property name, or null if it does not + * exist. + */ +goog.dom.vendor.getPrefixedPropertyName = function(propertyName, opt_object) { + // We first check for a non-prefixed property, if available. + if (opt_object && propertyName in opt_object) { + return propertyName; + } + var prefix = goog.dom.vendor.getVendorJsPrefix(); + if (prefix) { + prefix = prefix.toLowerCase(); + var prefixedPropertyName = prefix + goog.string.toTitleCase(propertyName); + return (!goog.isDef(opt_object) || prefixedPropertyName in opt_object) ? + prefixedPropertyName : null; + } + return null; +}; + + +/** + * @param {string} eventType An event type. + * @return {string} A lower-cased vendor prefixed event type. + */ +goog.dom.vendor.getPrefixedEventType = function(eventType) { + var prefix = goog.dom.vendor.getVendorJsPrefix() || ''; + return (prefix + eventType).toLowerCase(); +}; diff --git a/third_party/closure/goog/dom/viewportsizemonitor.js b/third_party/closure/goog/dom/viewportsizemonitor.js index 692687000cce4..e03c0641ed2d8 100644 --- a/third_party/closure/goog/dom/viewportsizemonitor.js +++ b/third_party/closure/goog/dom/viewportsizemonitor.js @@ -79,7 +79,7 @@ goog.inherits(goog.dom.ViewportSizeMonitor, goog.events.EventTarget); * multiple spooling monitors for a window. * @param {Window=} opt_window The window to monitor; defaults to the window in * which this code is executing. - * @return {goog.dom.ViewportSizeMonitor} Monitor for the given window. + * @return {!goog.dom.ViewportSizeMonitor} Monitor for the given window. */ goog.dom.ViewportSizeMonitor.getInstanceForWindow = function(opt_window) { var currentWindow = opt_window || window; diff --git a/third_party/closure/goog/editor/clicktoeditwrapper.js b/third_party/closure/goog/editor/clicktoeditwrapper.js index d3d80985a9ff4..00bc203bb41c7 100644 --- a/third_party/closure/goog/editor/clicktoeditwrapper.js +++ b/third_party/closure/goog/editor/clicktoeditwrapper.js @@ -28,7 +28,6 @@ goog.provide('goog.editor.ClickToEditWrapper'); goog.require('goog.Disposable'); goog.require('goog.asserts'); -goog.require('goog.debug.Logger'); goog.require('goog.dom'); goog.require('goog.dom.Range'); goog.require('goog.dom.TagName'); @@ -39,6 +38,7 @@ goog.require('goog.editor.range'); goog.require('goog.events.BrowserEvent.MouseButton'); goog.require('goog.events.EventHandler'); goog.require('goog.events.EventType'); +goog.require('goog.log'); @@ -74,7 +74,7 @@ goog.editor.ClickToEditWrapper = function(fieldObj) { /** * Event handler for field related events. - * @type {!goog.events.EventHandler} + * @type {!goog.events.EventHandler.} * @private */ this.fieldEventHandler_ = new goog.events.EventHandler(this); @@ -88,7 +88,7 @@ goog.editor.ClickToEditWrapper = function(fieldObj) { /** * Event handler for mouse events. - * @type {!goog.events.EventHandler} + * @type {!goog.events.EventHandler.} * @private */ this.mouseEventHandler_ = new goog.events.EventHandler(this); @@ -115,11 +115,11 @@ goog.inherits(goog.editor.ClickToEditWrapper, goog.Disposable); /** * The logger for this class. - * @type {goog.debug.Logger} + * @type {goog.log.Logger} * @private */ goog.editor.ClickToEditWrapper.prototype.logger_ = - goog.debug.Logger.getLogger('goog.editor.ClickToEditWrapper'); + goog.log.getLogger('goog.editor.ClickToEditWrapper'); /** @return {goog.editor.Field} The field. */ @@ -136,7 +136,7 @@ goog.editor.ClickToEditWrapper.prototype.getOriginalDomHelper = function() { /** @override */ goog.editor.ClickToEditWrapper.prototype.disposeInternal = function() { - goog.base(this, 'disposeInternal'); + goog.editor.ClickToEditWrapper.base(this, 'disposeInternal'); this.exitDocument(); if (this.savedCaretRange_) { diff --git a/third_party/closure/goog/editor/contenteditablefield.js b/third_party/closure/goog/editor/contenteditablefield.js index df96b754429c3..b5fd6bbebcf1e 100644 --- a/third_party/closure/goog/editor/contenteditablefield.js +++ b/third_party/closure/goog/editor/contenteditablefield.js @@ -32,8 +32,8 @@ goog.provide('goog.editor.ContentEditableField'); goog.require('goog.asserts'); -goog.require('goog.debug.Logger'); goog.require('goog.editor.Field'); +goog.require('goog.log'); @@ -60,7 +60,7 @@ goog.inherits(goog.editor.ContentEditableField, goog.editor.Field); * @override */ goog.editor.ContentEditableField.prototype.logger = - goog.debug.Logger.getLogger('goog.editor.ContentEditableField'); + goog.log.getLogger('goog.editor.ContentEditableField'); /** @override */ diff --git a/third_party/closure/goog/editor/field.js b/third_party/closure/goog/editor/field.js index 042f466b69cca..09b51d1a31692 100644 --- a/third_party/closure/goog/editor/field.js +++ b/third_party/closure/goog/editor/field.js @@ -30,7 +30,6 @@ goog.require('goog.a11y.aria.Role'); goog.require('goog.array'); goog.require('goog.asserts'); goog.require('goog.async.Delay'); -goog.require('goog.debug.Logger'); goog.require('goog.dom'); goog.require('goog.dom.Range'); goog.require('goog.dom.TagName'); @@ -48,6 +47,7 @@ goog.require('goog.events.EventTarget'); goog.require('goog.events.EventType'); goog.require('goog.events.KeyCodes'); goog.require('goog.functions'); +goog.require('goog.log'); goog.require('goog.string'); goog.require('goog.string.Unicode'); goog.require('goog.style'); @@ -153,7 +153,7 @@ goog.editor.Field = function(id, opt_doc) { } /** - * @type {goog.events.EventHandler} + * @type {goog.events.EventHandler.} * @protected */ this.eventRegister = new goog.events.EventHandler(this); @@ -202,11 +202,11 @@ goog.editor.Field.prototype.originalElement = null; /** * Logging object. - * @type {goog.debug.Logger} + * @type {goog.log.Logger} * @protected */ goog.editor.Field.prototype.logger = - goog.debug.Logger.getLogger('goog.editor.Field'); + goog.log.getLogger('goog.editor.Field'); /** @@ -459,7 +459,12 @@ goog.editor.Field.prototype.addListener = function(type, listener, opt_capture, this.usesIframe()) { elem = elem.ownerDocument; } - this.eventRegister.listen(elem, type, listener, opt_capture, opt_handler); + if (opt_handler) { + this.eventRegister.listenWithScope( + elem, type, listener, opt_capture, opt_handler); + } else { + this.eventRegister.listen(elem, type, listener, opt_capture); + } }; @@ -480,7 +485,8 @@ goog.editor.Field.prototype.getPluginByClassId = function(classId) { goog.editor.Field.prototype.registerPlugin = function(plugin) { var classId = plugin.getTrogClassId(); if (this.plugins_[classId]) { - this.logger.severe('Cannot register the same class of plugin twice.'); + goog.log.error(this.logger, + 'Cannot register the same class of plugin twice.'); } this.plugins_[classId] = plugin; @@ -509,7 +515,8 @@ goog.editor.Field.prototype.registerPlugin = function(plugin) { goog.editor.Field.prototype.unregisterPlugin = function(plugin) { var classId = plugin.getTrogClassId(); if (!this.plugins_[classId]) { - this.logger.severe('Cannot unregister a plugin that isn\'t registered.'); + goog.log.error(this.logger, + 'Cannot unregister a plugin that isn\'t registered.'); } delete this.plugins_[classId]; @@ -947,7 +954,7 @@ goog.editor.Field.prototype.clearListeners = function() { /** @override */ goog.editor.Field.prototype.disposeInternal = function() { if (this.isLoading() || this.isLoaded()) { - this.logger.warning('Disposing a field that is in use.'); + goog.log.warning(this.logger, 'Disposing a field that is in use.'); } if (this.getOriginalElement()) { @@ -2046,7 +2053,8 @@ goog.editor.Field.prototype.getCleanContents = function() { // The field is uneditable, so it's ok to read contents directly. var elem = this.getOriginalElement(); if (!elem) { - this.logger.shout("Couldn't get the field element to read the contents"); + goog.log.log(this.logger, goog.log.Level.SHOUT, + "Couldn't get the field element to read the contents"); } return elem.innerHTML; } @@ -2063,7 +2071,7 @@ goog.editor.Field.prototype.getCleanContents = function() { /** * Get the copy of the editable field element, which has the innerHTML set * correctly. - * @return {Element} The copy of the editable field. + * @return {!Element} The copy of the editable field. * @protected */ goog.editor.Field.prototype.getFieldCopy = function() { @@ -2096,7 +2104,7 @@ goog.editor.Field.prototype.getFieldCopy = function() { goog.editor.Field.prototype.setHtml = function( addParas, html, opt_dontFireDelayedChange, opt_applyLorem) { if (this.isLoading()) { - this.logger.severe("Can't set html while loading Trogedit"); + goog.log.error(this.logger, "Can't set html while loading Trogedit"); return; } @@ -2217,7 +2225,7 @@ goog.editor.Field.prototype.dispatchLoadEvent_ = function() { this.installStyles(); this.startChangeEvents(); - this.logger.info('Dispatching load ' + this.id); + goog.log.info(this.logger, 'Dispatching load ' + this.id); this.dispatchEvent(goog.editor.Field.EventType.LOAD); }; @@ -2612,8 +2620,8 @@ goog.editor.Field.prototype.attachIframe = function(iframe) { /** * @param {Object} extraStyles A map of extra styles. - * @return {goog.editor.icontent.FieldFormatInfo} The FieldFormatInfo object for - * this field's configuration. + * @return {!goog.editor.icontent.FieldFormatInfo} The FieldFormatInfo + * object for this field's configuration. * @protected */ goog.editor.Field.prototype.getFieldFormatInfo = function(extraStyles) { @@ -2698,7 +2706,7 @@ goog.editor.Field.prototype.clearFieldLoadListener_ = function() { /** - * @return {Object} Get the HTML attributes for this field's iframe. + * @return {!Object} Get the HTML attributes for this field's iframe. * @protected */ goog.editor.Field.prototype.getIframeAttributes = function() { diff --git a/third_party/closure/goog/editor/icontent.js b/third_party/closure/goog/editor/icontent.js index 4316bd5e59758..f1c317c9d1de2 100644 --- a/third_party/closure/goog/editor/icontent.js +++ b/third_party/closure/goog/editor/icontent.js @@ -42,6 +42,7 @@ goog.require('goog.userAgent'); * @param {Object=} opt_extraStyles Other style attributes for the field, * represented as a map of strings. * @constructor + * @final */ goog.editor.icontent.FieldFormatInfo = function(fieldId, standards, blended, fixedHeight, opt_extraStyles) { @@ -60,6 +61,7 @@ goog.editor.icontent.FieldFormatInfo = function(fieldId, standards, blended, * @param {Element} wrapper The wrapper div around a field. * @param {string} css The css for a field. * @constructor + * @final */ goog.editor.icontent.FieldStyleInfo = function(wrapper, css) { this.wrapper_ = wrapper; diff --git a/third_party/closure/goog/editor/link.js b/third_party/closure/goog/editor/link.js index 8e70dfe8a46a2..52744ff7c5d08 100644 --- a/third_party/closure/goog/editor/link.js +++ b/third_party/closure/goog/editor/link.js @@ -24,6 +24,7 @@ goog.require('goog.array'); goog.require('goog.dom'); goog.require('goog.dom.NodeType'); goog.require('goog.dom.Range'); +goog.require('goog.dom.TagName'); goog.require('goog.editor.BrowserFeature'); goog.require('goog.editor.Command'); goog.require('goog.editor.node'); @@ -40,6 +41,7 @@ goog.require('goog.uri.utils.ComponentIndex'); * @param {HTMLAnchorElement} anchor The anchor element. * @param {boolean} isNew Whether this is a new link. * @constructor + * @final */ goog.editor.Link = function(anchor, isNew) { /** @@ -89,7 +91,14 @@ goog.editor.Link.prototype.getExtraAnchors = function() { */ goog.editor.Link.prototype.getCurrentText = function() { if (!this.currentText_) { - this.currentText_ = goog.dom.getRawTextContent(this.getAnchor()); + var anchor = this.getAnchor(); + + var leaf = goog.editor.node.getLeftMostLeaf(anchor); + if (leaf.tagName && leaf.tagName == goog.dom.TagName.IMG) { + this.currentText_ = leaf.getAttribute('alt'); + } else { + this.currentText_ = goog.dom.getRawTextContent(this.getAnchor()); + } } return this.currentText_; }; @@ -141,18 +150,22 @@ goog.editor.Link.prototype.setTextAndUrl = function(newText, newUrl) { var currentText = this.getCurrentText(); if (newText != currentText) { var leaf = goog.editor.node.getLeftMostLeaf(anchor); - if (leaf.nodeType == goog.dom.NodeType.TEXT) { - leaf = leaf.parentNode; - } - if (goog.dom.getRawTextContent(leaf) != currentText) { - leaf = anchor; - } + if (leaf.tagName && leaf.tagName == goog.dom.TagName.IMG) { + leaf.setAttribute('alt', newText ? newText : ''); + } else { + if (leaf.nodeType == goog.dom.NodeType.TEXT) { + leaf = leaf.parentNode; + } - goog.dom.removeChildren(leaf); + if (goog.dom.getRawTextContent(leaf) != currentText) { + leaf = anchor; + } - var domHelper = goog.dom.getDomHelper(leaf); - goog.dom.appendChild(leaf, domHelper.createTextNode(newText)); + goog.dom.removeChildren(leaf); + var domHelper = goog.dom.getDomHelper(leaf); + goog.dom.appendChild(leaf, domHelper.createTextNode(newText)); + } // The text changed, so force getCurrentText to recompute. this.currentText_ = null; @@ -254,7 +267,7 @@ goog.editor.Link.prototype.finishLinkCreation = function(field) { * @param {string=} opt_target The target. * @param {Array.=} opt_extraAnchors Extra anchors created * by the browser when parsing a selection. - * @return {goog.editor.Link} The link. + * @return {!goog.editor.Link} The link. */ goog.editor.Link.createNewLink = function(anchor, url, opt_target, opt_extraAnchors) { diff --git a/third_party/closure/goog/editor/plugin.js b/third_party/closure/goog/editor/plugin.js index 6f45a2e17361a..3550c4cde6b0a 100644 --- a/third_party/closure/goog/editor/plugin.js +++ b/third_party/closure/goog/editor/plugin.js @@ -21,12 +21,12 @@ goog.provide('goog.editor.Plugin'); -goog.require('goog.debug.Logger'); // TODO(user): Remove the dependency on goog.editor.Command asap. Currently only // needed for execCommand issues with links. goog.require('goog.editor.Command'); goog.require('goog.events.EventTarget'); goog.require('goog.functions'); +goog.require('goog.log'); goog.require('goog.object'); goog.require('goog.reflect'); @@ -81,11 +81,11 @@ goog.editor.Plugin.prototype.autoDispose_ = true; /** * The logger for this plugin. - * @type {goog.debug.Logger} + * @type {goog.log.Logger} * @protected */ goog.editor.Plugin.prototype.logger = - goog.debug.Logger.getLogger('goog.editor.Plugin'); + goog.log.getLogger('goog.editor.Plugin'); /** @@ -141,7 +141,7 @@ goog.editor.Plugin.prototype.enable = function(fieldObject) { if (this.getFieldObject() == fieldObject) { this.enabled_ = true; } else { - this.logger.severe('Trying to enable an unregistered field with ' + + goog.log.error(this.logger, 'Trying to enable an unregistered field with ' + 'this plugin.'); } }; @@ -155,7 +155,7 @@ goog.editor.Plugin.prototype.disable = function(fieldObject) { if (this.getFieldObject() == fieldObject) { this.enabled_ = false; } else { - this.logger.severe('Trying to disable an unregistered field ' + + goog.log.error(this.logger, 'Trying to disable an unregistered field ' + 'with this plugin.'); } }; diff --git a/third_party/closure/goog/editor/plugins/abstractbubbleplugin.js b/third_party/closure/goog/editor/plugins/abstractbubbleplugin.js index cc230eed272ea..4bc929abf1813 100644 --- a/third_party/closure/goog/editor/plugins/abstractbubbleplugin.js +++ b/third_party/closure/goog/editor/plugins/abstractbubbleplugin.js @@ -31,7 +31,7 @@ goog.require('goog.events.KeyCodes'); goog.require('goog.events.actionEventWrapper'); goog.require('goog.functions'); goog.require('goog.string.Unicode'); -goog.require('goog.ui.Component.EventType'); +goog.require('goog.ui.Component'); goog.require('goog.ui.editor.Bubble'); goog.require('goog.userAgent'); @@ -53,14 +53,25 @@ goog.require('goog.userAgent'); * @extends {goog.editor.Plugin} */ goog.editor.plugins.AbstractBubblePlugin = function() { - goog.base(this); + goog.editor.plugins.AbstractBubblePlugin.base(this, 'constructor'); /** * Place to register events the plugin listens to. - * @type {goog.events.EventHandler} + * @type {goog.events.EventHandler.< + * !goog.editor.plugins.AbstractBubblePlugin>} * @protected */ this.eventRegister = new goog.events.EventHandler(this); + + /** + * Instance factory function that creates a bubble UI component. If set to a + * non-null value, this function will be used to create a bubble instead of + * the global factory function. It takes as parameters the bubble parent + * element and the z index to draw the bubble at. + * @type {?function(!Element, number): !goog.ui.editor.Bubble} + * @private + */ + this.bubbleFactory_ = null; }; goog.inherits(goog.editor.plugins.AbstractBubblePlugin, goog.editor.Plugin); @@ -106,30 +117,30 @@ goog.editor.plugins.AbstractBubblePlugin.defaultBubbleFactory_ = function( /** - * Factory function that creates a bubble UI component. It takes as parameters - * the bubble parent element and the z index to draw the bubble at. + * Global factory function that creates a bubble UI component. It takes as + * parameters the bubble parent element and the z index to draw the bubble at. * @type {function(!Element, number): !goog.ui.editor.Bubble} * @private */ -goog.editor.plugins.AbstractBubblePlugin.bubbleFactory_ = +goog.editor.plugins.AbstractBubblePlugin.globalBubbleFactory_ = goog.editor.plugins.AbstractBubblePlugin.defaultBubbleFactory_; /** - * Sets the bubble factory function. + * Sets the global bubble factory function. * @param {function(!Element, number): !goog.ui.editor.Bubble} * bubbleFactory Function that creates a bubble for the given bubble parent * element and z index. */ goog.editor.plugins.AbstractBubblePlugin.setBubbleFactory = function( bubbleFactory) { - goog.editor.plugins.AbstractBubblePlugin.bubbleFactory_ = bubbleFactory; + goog.editor.plugins.AbstractBubblePlugin.globalBubbleFactory_ = bubbleFactory; }; /** * Map from field id to shared bubble object. - * @type {Object.} + * @type {!Object.} * @private */ goog.editor.plugins.AbstractBubblePlugin.bubbleMap_ = {}; @@ -164,6 +175,20 @@ goog.editor.plugins.AbstractBubblePlugin.prototype.keyboardNavigationEnabled_ = false; +/** + * Sets the instance bubble factory function. If set to a non-null value, this + * function will be used to create a bubble instead of the global factory + * function. + * @param {?function(!Element, number): !goog.ui.editor.Bubble} bubbleFactory + * Function that creates a bubble for the given bubble parent element and z + * index. Null to reset the factory function. + */ +goog.editor.plugins.AbstractBubblePlugin.prototype.setBubbleFactory = function( + bubbleFactory) { + this.bubbleFactory_ = bubbleFactory; +}; + + /** * Sets whether the bubble should support tabbing through the link elements. * @param {boolean} keyboardNavigationEnabled Whether the bubble should support @@ -187,6 +212,16 @@ goog.editor.plugins.AbstractBubblePlugin.prototype.setBubbleParent = function( }; +/** + * Returns the bubble map. Subclasses may override to use a separate map. + * @return {!Object.} + * @protected + */ +goog.editor.plugins.AbstractBubblePlugin.prototype.getBubbleMap = function() { + return goog.editor.plugins.AbstractBubblePlugin.bubbleMap_; +}; + + /** * @return {goog.dom.DomHelper} The dom helper for the bubble window. */ @@ -312,17 +347,18 @@ goog.editor.plugins.AbstractBubblePlugin.prototype.disable = function(field) { // because the next time the field is made editable again it may be in // a different document / iframe. if (field.isUneditable()) { - var bubble = goog.editor.plugins.AbstractBubblePlugin.bubbleMap_[field.id]; + var bubbleMap = this.getBubbleMap(); + var bubble = bubbleMap[field.id]; if (bubble) { bubble.dispose(); - delete goog.editor.plugins.AbstractBubblePlugin.bubbleMap_[field.id]; + delete bubbleMap[field.id]; } } }; /** - * @return {goog.ui.editor.Bubble} The shared bubble object for the field this + * @return {!goog.ui.editor.Bubble} The shared bubble object for the field this * plugin is registered on. Creates it if necessary. * @private */ @@ -332,14 +368,14 @@ goog.editor.plugins.AbstractBubblePlugin.prototype.getSharedBubble_ = this.getFieldObject().getAppWindow().document.body); this.dom_ = goog.dom.getDomHelper(bubbleParent); - var bubble = goog.editor.plugins.AbstractBubblePlugin.bubbleMap_[ - this.getFieldObject().id]; + var bubbleMap = this.getBubbleMap(); + var bubble = bubbleMap[this.getFieldObject().id]; if (!bubble) { - bubble = goog.editor.plugins.AbstractBubblePlugin.bubbleFactory_.call(null, - bubbleParent, + var factory = this.bubbleFactory_ || + goog.editor.plugins.AbstractBubblePlugin.globalBubbleFactory_; + bubble = factory.call(null, bubbleParent, this.getFieldObject().getBaseZindex()); - goog.editor.plugins.AbstractBubblePlugin.bubbleMap_[ - this.getFieldObject().id] = bubble; + bubbleMap[this.getFieldObject().id] = bubble; } return bubble; }; @@ -458,6 +494,15 @@ goog.editor.plugins.AbstractBubblePlugin.prototype.closeBubble = function() { goog.editor.plugins.AbstractBubblePlugin.prototype.onShow = goog.nullFunction; +/** + * Called when the bubble is closed or hidden. The default implementation does + * nothing. + * @protected + */ +goog.editor.plugins.AbstractBubblePlugin.prototype.cleanOnBubbleClose = + goog.nullFunction; + + /** * Handles when the bubble panel is closed. Invoked when the entire bubble is * hidden and also directly when the panel is closed manually. @@ -468,6 +513,7 @@ goog.editor.plugins.AbstractBubblePlugin.prototype.handlePanelClosed_ = this.targetElement_ = null; this.panelId_ = null; this.eventRegister.removeAll(); + this.cleanOnBubbleClose(); }; diff --git a/third_party/closure/goog/editor/plugins/abstractdialogplugin.js b/third_party/closure/goog/editor/plugins/abstractdialogplugin.js index 954e1e2b3dabb..7e65ec50c18f7 100644 --- a/third_party/closure/goog/editor/plugins/abstractdialogplugin.js +++ b/third_party/closure/goog/editor/plugins/abstractdialogplugin.js @@ -264,7 +264,7 @@ goog.editor.plugins.AbstractDialogPlugin.prototype.disposeOriginalSelection = goog.editor.plugins.AbstractDialogPlugin.prototype.disposeInternal = function() { this.disposeDialog_(); - goog.base(this, 'disposeInternal'); + goog.editor.plugins.AbstractDialogPlugin.base(this, 'disposeInternal'); }; diff --git a/third_party/closure/goog/editor/plugins/basictextformatter.js b/third_party/closure/goog/editor/plugins/basictextformatter.js index 4d32f349b9df6..a2f0df3d41eca 100644 --- a/third_party/closure/goog/editor/plugins/basictextformatter.js +++ b/third_party/closure/goog/editor/plugins/basictextformatter.js @@ -21,7 +21,6 @@ goog.provide('goog.editor.plugins.BasicTextFormatter'); goog.provide('goog.editor.plugins.BasicTextFormatter.COMMAND'); goog.require('goog.array'); -goog.require('goog.debug.Logger'); goog.require('goog.dom'); goog.require('goog.dom.NodeType'); goog.require('goog.dom.Range'); @@ -35,6 +34,7 @@ goog.require('goog.editor.range'); goog.require('goog.editor.style'); goog.require('goog.iter'); goog.require('goog.iter.StopIteration'); +goog.require('goog.log'); goog.require('goog.object'); goog.require('goog.string'); goog.require('goog.string.Unicode'); @@ -63,12 +63,12 @@ goog.editor.plugins.BasicTextFormatter.prototype.getTrogClassId = function() { /** * Logging object. - * @type {goog.debug.Logger} + * @type {goog.log.Logger} * @protected * @override */ goog.editor.plugins.BasicTextFormatter.prototype.logger = - goog.debug.Logger.getLogger('goog.editor.plugins.BasicTextFormatter'); + goog.log.getLogger('goog.editor.plugins.BasicTextFormatter'); /** @@ -138,7 +138,7 @@ goog.editor.plugins.BasicTextFormatter.prototype.getRange_ = function() { /** - * @return {Document} The document object associated with the currently active + * @return {!Document} The document object associated with the currently active * field. * @private */ @@ -809,7 +809,8 @@ goog.editor.plugins.BasicTextFormatter.prototype.execCommandHelper_ = function( // lie. Also, this runs for insertunorderedlist so that the the list // isn't made up of an
    for each
  • - even though it looks the same, // the markup is disgusting. - if (goog.userAgent.WEBKIT) { + if (goog.userAgent.WEBKIT && + !goog.userAgent.isVersionOrHigher(534)) { this.fixSafariLists_(); } if (goog.userAgent.IE) { @@ -959,7 +960,8 @@ goog.editor.plugins.BasicTextFormatter.prototype.toggleLink_ = function( * current selection. * @param {string} url The url to link to. * @param {string=} opt_target Target for the link. - * @return {goog.editor.Link?} The newly created link. + * @return {goog.editor.Link?} The newly created link, or null if the link + * couldn't be created. * @private */ goog.editor.plugins.BasicTextFormatter.prototype.createLink_ = function(range, @@ -973,7 +975,13 @@ goog.editor.plugins.BasicTextFormatter.prototype.createLink_ = function(range, if (parent && parent.tagName == goog.dom.TagName.IMG) { return null; } - if (range && range.isCollapsed()) { + // If range is not present, the editable field doesn't have focus, abort + // creating a link. + if (!range) { + return null; + } + + if (range.isCollapsed()) { var textRange = range.getTextRange(0).getBrowserRangeObject(); if (goog.editor.BrowserFeature.HAS_W3C_RANGES) { anchor = this.getFieldDomHelper().createElement(goog.dom.TagName.A); @@ -1126,7 +1134,7 @@ goog.editor.plugins.BasicTextFormatter.prototype.removeFontSizeFromStyleAttrs_ = /** * Apply pre-execCommand fixes for IE. * @param {string} command The command to execute. - * @return {Array.} Array of nodes to be removed after the execCommand. + * @return {!Array.} Array of nodes to be removed after the execCommand. * Will never be longer than 2 elements. * @private */ @@ -1264,7 +1272,7 @@ goog.editor.plugins.BasicTextFormatter.prototype.cleanUpSafariHeadings_ = /** * Prevent Safari from making each list item be "1" when converting from * unordered to ordered lists. - * (see https://bugs.webkit.org/show_bug.cgi?id=19539 ) + * (see https://bugs.webkit.org/show_bug.cgi?id=19539, fixed by 2010-04-21) * @private */ goog.editor.plugins.BasicTextFormatter.prototype.fixSafariLists_ = function() { @@ -1402,7 +1410,7 @@ goog.editor.plugins.BasicTextFormatter.hangingExecCommandWebkit_ = { /** * Apply pre-execCommand fixes for Safari. * @param {string} command The command to execute. - * @return {Element|undefined} The div added to the field. + * @return {!Element|undefined} The div added to the field. * @private */ goog.editor.plugins.BasicTextFormatter.prototype.applyExecCommandSafariFixes_ = @@ -1421,8 +1429,9 @@ goog.editor.plugins.BasicTextFormatter.prototype.applyExecCommandSafariFixes_ = goog.dom.appendChild(this.getFieldObject().getElement(), div); } - if (goog.editor.plugins.BasicTextFormatter. - hangingExecCommandWebkit_[command]) { + if (!goog.userAgent.isVersionOrHigher(534) && + goog.editor.plugins.BasicTextFormatter. + hangingExecCommandWebkit_[command]) { // Add a new div at the beginning of the field. var field = this.getFieldObject().getElement(); div = this.getFieldDomHelper().createDom( diff --git a/third_party/closure/goog/editor/plugins/blockquote.js b/third_party/closure/goog/editor/plugins/blockquote.js index cdaafd45fa1b4..00b0b884369cb 100644 --- a/third_party/closure/goog/editor/plugins/blockquote.js +++ b/third_party/closure/goog/editor/plugins/blockquote.js @@ -19,16 +19,16 @@ goog.provide('goog.editor.plugins.Blockquote'); -goog.require('goog.debug.Logger'); goog.require('goog.dom'); goog.require('goog.dom.NodeType'); goog.require('goog.dom.TagName'); -goog.require('goog.dom.classes'); +goog.require('goog.dom.classlist'); goog.require('goog.editor.BrowserFeature'); goog.require('goog.editor.Command'); goog.require('goog.editor.Plugin'); goog.require('goog.editor.node'); goog.require('goog.functions'); +goog.require('goog.log'); @@ -42,6 +42,7 @@ goog.require('goog.functions'); * blockquotes. Defaults to 'tr_bq'. * @constructor * @extends {goog.editor.Plugin} + * @final */ goog.editor.plugins.Blockquote = function(requiresClassNameToSplit, opt_className) { @@ -84,12 +85,12 @@ goog.editor.plugins.Blockquote.CLASS_ID = 'Blockquote'; /** * Logging object. - * @type {goog.debug.Logger} + * @type {goog.log.Logger} * @protected * @override */ goog.editor.plugins.Blockquote.prototype.logger = - goog.debug.Logger.getLogger('goog.editor.plugins.Blockquote'); + goog.log.getLogger('goog.editor.plugins.Blockquote'); /** @override */ @@ -131,8 +132,8 @@ goog.editor.plugins.Blockquote.isBlockquote = function(node, isAlreadySetup, if (!requiresClassNameToSplit) { return isAlreadySetup; } - var hasClassName = goog.dom.classes.has(/** @type {Element} */ (node), - className); + var hasClassName = goog.dom.classlist.contains( + /** @type {!Element} */ (node), className); return isAlreadySetup ? hasClassName : !hasClassName; }; @@ -159,7 +160,8 @@ goog.editor.plugins.Blockquote.prototype.isSplittableBlockquote = return true; } - return goog.dom.classes.has(node, this.className_); + return goog.dom.classlist.contains(/** @type {!Element} */ (node), + this.className_); }; @@ -172,7 +174,8 @@ goog.editor.plugins.Blockquote.prototype.isSplittableBlockquote = goog.editor.plugins.Blockquote.prototype.isSetupBlockquote = function(node) { return node.tagName == goog.dom.TagName.BLOCKQUOTE && - goog.dom.classes.has(node, this.className_); + goog.dom.classlist.contains(/** @type {!Element} */ (node), + this.className_); }; diff --git a/third_party/closure/goog/editor/plugins/emoticons.js b/third_party/closure/goog/editor/plugins/emoticons.js index 71fb7b0ec33d9..4d0c065812e64 100644 --- a/third_party/closure/goog/editor/plugins/emoticons.js +++ b/third_party/closure/goog/editor/plugins/emoticons.js @@ -35,9 +35,10 @@ goog.require('goog.userAgent'); * * @constructor * @extends {goog.editor.Plugin} + * @final */ goog.editor.plugins.Emoticons = function() { - goog.base(this); + goog.editor.plugins.Emoticons.base(this, 'constructor'); }; goog.inherits(goog.editor.plugins.Emoticons, goog.editor.Plugin); @@ -63,7 +64,7 @@ goog.editor.plugins.Emoticons.prototype.isSupportedCommand = function( * cursor to the right of the inserted emoticon. * @param {string} command Command to execute. * @param {*=} opt_arg Emoji to insert. - * @return {Object|undefined} The result of the command. + * @return {!Object|undefined} The result of the command. * @override */ goog.editor.plugins.Emoticons.prototype.execCommandInternal = function( diff --git a/third_party/closure/goog/editor/plugins/enterhandler.js b/third_party/closure/goog/editor/plugins/enterhandler.js index fcf13deefab4a..c3362b7ccc060 100644 --- a/third_party/closure/goog/editor/plugins/enterhandler.js +++ b/third_party/closure/goog/editor/plugins/enterhandler.js @@ -73,7 +73,7 @@ goog.editor.plugins.EnterHandler.prototype.getTrogClassId = function() { /** @override */ goog.editor.plugins.EnterHandler.prototype.enable = function(fieldObject) { - goog.base(this, 'enable', fieldObject); + goog.editor.plugins.EnterHandler.base(this, 'enable', fieldObject); if (goog.editor.BrowserFeature.SUPPORTS_OPERA_DEFAULTBLOCK_COMMAND && (this.tag == goog.dom.TagName.P || this.tag == goog.dom.TagName.DIV)) { @@ -526,7 +526,7 @@ goog.editor.plugins.EnterHandler.prototype.ensureBlockIeOpera = function(tag, /** * Deletes the content at the current cursor position. - * @return {Node|Object} Something representing the current cursor position. + * @return {!Node|!Object} Something representing the current cursor position. * See deleteCursorSelectionIE_ and deleteCursorSelectionW3C_ for details. * Should be passed to releasePositionObject_ when no longer in use. * @private @@ -553,7 +553,7 @@ goog.editor.plugins.EnterHandler.prototype.releasePositionObject_ = /** * Delete the selection at the current cursor position, then returns a temporary * node at the current position. - * @return {Node} A temporary node marking the current cursor position. This + * @return {!Node} A temporary node marking the current cursor position. This * node should eventually be removed from the DOM. * @private */ @@ -573,7 +573,7 @@ goog.editor.plugins.EnterHandler.prototype.deleteCursorSelectionIE_ = /** * Delete the selection at the current cursor position, then returns the node * at the current position. - * @return {goog.editor.range.Point} The current cursor position. Note that + * @return {!goog.editor.range.Point} The current cursor position. Note that * unlike simulateEnterIE_, this should not be removed from the DOM. * @private */ diff --git a/third_party/closure/goog/editor/plugins/equationeditorbubble.js b/third_party/closure/goog/editor/plugins/equationeditorbubble.js index d40d79ec0df17..e997fec228ba3 100644 --- a/third_party/closure/goog/editor/plugins/equationeditorbubble.js +++ b/third_party/closure/goog/editor/plugins/equationeditorbubble.js @@ -29,9 +29,10 @@ goog.require('goog.ui.equation.ImageRenderer'); * * @constructor * @extends {goog.editor.plugins.AbstractBubblePlugin} + * @final */ goog.editor.plugins.equation.EquationBubble = function() { - goog.base(this); + goog.editor.plugins.equation.EquationBubble.base(this, 'constructor'); }; goog.inherits(goog.editor.plugins.equation.EquationBubble, goog.editor.plugins.AbstractBubblePlugin); diff --git a/third_party/closure/goog/editor/plugins/equationeditorplugin.js b/third_party/closure/goog/editor/plugins/equationeditorplugin.js index 33164b06ce134..dc75d7b39a54c 100644 --- a/third_party/closure/goog/editor/plugins/equationeditorplugin.js +++ b/third_party/closure/goog/editor/plugins/equationeditorplugin.js @@ -14,7 +14,6 @@ goog.provide('goog.editor.plugins.EquationEditorPlugin'); -goog.require('goog.debug.Logger'); goog.require('goog.dom'); goog.require('goog.editor.Command'); goog.require('goog.editor.plugins.AbstractDialogPlugin'); @@ -22,6 +21,7 @@ goog.require('goog.editor.range'); goog.require('goog.events'); goog.require('goog.events.EventType'); goog.require('goog.functions'); +goog.require('goog.log'); goog.require('goog.ui.editor.AbstractDialog'); goog.require('goog.ui.editor.EquationEditorDialog'); goog.require('goog.ui.equation.ImageRenderer'); @@ -34,6 +34,7 @@ goog.require('goog.ui.equation.PaletteManager'); * @param {string=} opt_helpUrl A URL pointing to help documentation. * @constructor * @extends {goog.editor.plugins.AbstractDialogPlugin} + * @final */ goog.editor.plugins.EquationEditorPlugin = function(opt_helpUrl) { /** @@ -67,11 +68,11 @@ goog.inherits(goog.editor.plugins.EquationEditorPlugin, /** * The logger for the EquationEditorPlugin. - * @type {goog.debug.Logger} + * @type {goog.log.Logger} * @private */ goog.editor.plugins.EquationEditorPlugin.prototype.logger_ = - goog.debug.Logger.getLogger('goog.editor.plugins.EquationEditorPlugin'); + goog.log.getLogger('goog.editor.plugins.EquationEditorPlugin'); /** @override */ @@ -104,7 +105,7 @@ goog.editor.plugins.EquationEditorPlugin.prototype.createDialog = * Populates the context that this plugin runs in. * @param {!goog.dom.DomHelper} domHelper The dom helper to be used for the * palette manager. - * @return {Object} The context that this plugin runs in. + * @return {!Object} The context that this plugin runs in. * @private */ goog.editor.plugins.EquationEditorPlugin.prototype.populateContext_ = @@ -140,7 +141,7 @@ goog.editor.plugins.EquationEditorPlugin.prototype.getEquationFromSelection_ = /** @override */ goog.editor.plugins.EquationEditorPlugin.prototype.enable = function(fieldObject) { - goog.base(this, 'enable', fieldObject); + goog.editor.plugins.EquationEditorPlugin.base(this, 'enable', fieldObject); if (this.isEnabled(fieldObject)) { this.dblClickKey_ = goog.events.listen(fieldObject.getElement(), goog.events.EventType.DBLCLICK, @@ -152,7 +153,7 @@ goog.editor.plugins.EquationEditorPlugin.prototype.enable = /** @override */ goog.editor.plugins.EquationEditorPlugin.prototype.disable = function(fieldObject) { - goog.base(this, 'disable', fieldObject); + goog.editor.plugins.EquationEditorPlugin.base(this, 'disable', fieldObject); if (!this.isEnabled(fieldObject)) { goog.events.unlistenByKey(this.dblClickKey_); } diff --git a/third_party/closure/goog/editor/plugins/firststrong.js b/third_party/closure/goog/editor/plugins/firststrong.js index 554c0d63f7f7c..721ced37e5e87 100644 --- a/third_party/closure/goog/editor/plugins/firststrong.js +++ b/third_party/closure/goog/editor/plugins/firststrong.js @@ -59,9 +59,10 @@ goog.require('goog.userAgent'); * First Strong plugin. * @constructor * @extends {goog.editor.Plugin} + * @final */ goog.editor.plugins.FirstStrong = function() { - goog.base(this); + goog.editor.plugins.FirstStrong.base(this, 'constructor'); /** * Indicates whether or not the cursor is in a paragraph we have not yet diff --git a/third_party/closure/goog/editor/plugins/headerformatter.js b/third_party/closure/goog/editor/plugins/headerformatter.js index d1987882216c2..fa4bb1f76d7e7 100644 --- a/third_party/closure/goog/editor/plugins/headerformatter.js +++ b/third_party/closure/goog/editor/plugins/headerformatter.js @@ -29,6 +29,7 @@ goog.require('goog.userAgent'); * Applies header styles to text. * @constructor * @extends {goog.editor.Plugin} + * @final */ goog.editor.plugins.HeaderFormatter = function() { goog.editor.Plugin.call(this); diff --git a/third_party/closure/goog/editor/plugins/linkbubble.js b/third_party/closure/goog/editor/plugins/linkbubble.js index 472e28cbc54a1..725a735bd3b92 100644 --- a/third_party/closure/goog/editor/plugins/linkbubble.js +++ b/third_party/closure/goog/editor/plugins/linkbubble.js @@ -22,11 +22,12 @@ goog.provide('goog.editor.plugins.LinkBubble.Action'); goog.require('goog.array'); goog.require('goog.dom'); -goog.require('goog.editor.BrowserFeature'); +goog.require('goog.dom.TagName'); goog.require('goog.editor.Command'); goog.require('goog.editor.Link'); goog.require('goog.editor.plugins.AbstractBubblePlugin'); goog.require('goog.editor.range'); +goog.require('goog.functions'); goog.require('goog.string'); goog.require('goog.style'); goog.require('goog.ui.editor.messages'); @@ -43,7 +44,7 @@ goog.require('goog.window'); * @extends {goog.editor.plugins.AbstractBubblePlugin} */ goog.editor.plugins.LinkBubble = function(var_args) { - goog.base(this); + goog.editor.plugins.LinkBubble.base(this, 'constructor'); /** * List of extra actions supported by the bubble. @@ -314,6 +315,16 @@ goog.editor.plugins.LinkBubble.prototype.getBubbleTitle = function() { }; +/** + * Returns the message to display for testing a link. + * @return {string} The message for testing a link. + * @protected + */ +goog.editor.plugins.LinkBubble.prototype.getTestLinkMessage = function() { + return MSG_LINK_BUBBLE_TEST_LINK; +}; + + /** @override */ goog.editor.plugins.LinkBubble.prototype.createBubbleContents = function( bubbleContainer) { @@ -336,7 +347,7 @@ goog.editor.plugins.LinkBubble.prototype.createBubbleContents = function( } else { var testMsgSpan = this.dom_.createDom(goog.dom.TagName.SPAN, {id: goog.editor.plugins.LinkBubble.TEST_LINK_SPAN_ID_}, - MSG_LINK_BUBBLE_TEST_LINK); + this.getTestLinkMessage()); linkTextSpan = this.dom_.createDom(goog.dom.TagName.SPAN, { id: goog.editor.plugins.LinkBubble.LINK_TEXT_ID_, @@ -415,7 +426,7 @@ goog.editor.plugins.LinkBubble.prototype.isInvalidUrl = goog.functions.FALSE; /** * Gets the text to display for a link, based on the type of link - * @return {Object} Returns an object of the form: + * @return {!Object} Returns an object of the form: * {linkText: displayTextForLinkTarget, valid: ifTheLinkIsValid}. * @private */ @@ -551,6 +562,7 @@ goog.editor.plugins.LinkBubble.prototype.isSafeSchemeToOpen_ = * @param {function(string):void} actionFn Action function to run when the * action is clicked. Takes the current target URL as a parameter. * @constructor + * @final */ goog.editor.plugins.LinkBubble.Action = function(spanId, linkId, message, toShowFn, actionFn) { diff --git a/third_party/closure/goog/editor/plugins/linkdialogplugin.js b/third_party/closure/goog/editor/plugins/linkdialogplugin.js index beb7a87e7fb9a..ab6c6e5212ba8 100644 --- a/third_party/closure/goog/editor/plugins/linkdialogplugin.js +++ b/third_party/closure/goog/editor/plugins/linkdialogplugin.js @@ -42,11 +42,12 @@ goog.require('goog.uri.utils'); * @extends {goog.editor.plugins.AbstractDialogPlugin} */ goog.editor.plugins.LinkDialogPlugin = function() { - goog.base(this, goog.editor.Command.MODAL_LINK_EDITOR); + goog.editor.plugins.LinkDialogPlugin.base( + this, 'constructor', goog.editor.Command.MODAL_LINK_EDITOR); /** * Event handler for this object. - * @type {goog.events.EventHandler} + * @type {goog.events.EventHandler.} * @private */ this.eventHandler_ = new goog.events.EventHandler(this); @@ -233,7 +234,8 @@ goog.editor.plugins.LinkDialogPlugin.prototype.setEmailWarning = function( goog.editor.plugins.LinkDialogPlugin.prototype.execCommandInternal = function( command, opt_arg) { this.currentLink_ = /** @type {goog.editor.Link} */(opt_arg); - return goog.base(this, 'execCommandInternal', command, opt_arg); + return goog.editor.plugins.LinkDialogPlugin.base( + this, 'execCommandInternal', command, opt_arg); }; @@ -244,14 +246,16 @@ goog.editor.plugins.LinkDialogPlugin.prototype.execCommandInternal = function( * @protected */ goog.editor.plugins.LinkDialogPlugin.prototype.handleAfterHide = function(e) { - goog.base(this, 'handleAfterHide', e); + goog.editor.plugins.LinkDialogPlugin.base(this, 'handleAfterHide', e); this.currentLink_ = null; }; /** - * @return {goog.events.EventHandler} The event handler. + * @return {goog.events.EventHandler.} The event handler. * @protected + * @this T + * @template T */ goog.editor.plugins.LinkDialogPlugin.prototype.getEventHandler = function() { return this.eventHandler_; @@ -272,7 +276,7 @@ goog.editor.plugins.LinkDialogPlugin.prototype.getCurrentLink = function() { * @param {goog.dom.DomHelper} dialogDomHelper The dom helper to be used to * create the dialog. * @param {*=} opt_link The target link (should be a goog.editor.Link). - * @return {goog.ui.editor.LinkDialog} The dialog. + * @return {!goog.ui.editor.LinkDialog} The dialog. * @override * @protected */ @@ -303,7 +307,7 @@ goog.editor.plugins.LinkDialogPlugin.prototype.createDialog = function( /** @override */ goog.editor.plugins.LinkDialogPlugin.prototype.disposeInternal = function() { - goog.base(this, 'disposeInternal'); + goog.editor.plugins.LinkDialogPlugin.base(this, 'disposeInternal'); this.eventHandler_.dispose(); }; diff --git a/third_party/closure/goog/editor/plugins/linkshortcutplugin.js b/third_party/closure/goog/editor/plugins/linkshortcutplugin.js index 8703fcb0c1afa..c61f898996d76 100644 --- a/third_party/closure/goog/editor/plugins/linkshortcutplugin.js +++ b/third_party/closure/goog/editor/plugins/linkshortcutplugin.js @@ -30,9 +30,10 @@ goog.require('goog.string'); * Plugin to add a keyboard shortcut for the link command * @constructor * @extends {goog.editor.Plugin} + * @final */ goog.editor.plugins.LinkShortcutPlugin = function() { - goog.base(this); + goog.editor.plugins.LinkShortcutPlugin.base(this, 'constructor'); }; goog.inherits(goog.editor.plugins.LinkShortcutPlugin, goog.editor.Plugin); diff --git a/third_party/closure/goog/editor/plugins/listtabhandler.js b/third_party/closure/goog/editor/plugins/listtabhandler.js index d4132b3887dc5..3a5ba84fcfd90 100644 --- a/third_party/closure/goog/editor/plugins/listtabhandler.js +++ b/third_party/closure/goog/editor/plugins/listtabhandler.js @@ -32,6 +32,7 @@ goog.require('goog.editor.plugins.AbstractTabHandler'); * Plugin to handle tab keys in lists to indent and outdent. * @constructor * @extends {goog.editor.plugins.AbstractTabHandler} + * @final */ goog.editor.plugins.ListTabHandler = function() { goog.editor.plugins.AbstractTabHandler.call(this); diff --git a/third_party/closure/goog/editor/plugins/loremipsum.js b/third_party/closure/goog/editor/plugins/loremipsum.js index f8cfb1291bfc8..da6c71c08def3 100644 --- a/third_party/closure/goog/editor/plugins/loremipsum.js +++ b/third_party/closure/goog/editor/plugins/loremipsum.js @@ -35,6 +35,7 @@ goog.require('goog.functions'); * @param {string} message The lorem ipsum message. * @constructor * @extends {goog.editor.Plugin} + * @final */ goog.editor.plugins.LoremIpsum = function(message) { goog.editor.Plugin.call(this); diff --git a/third_party/closure/goog/editor/plugins/removeformatting.js b/third_party/closure/goog/editor/plugins/removeformatting.js index 54c997d0c6715..3b910b1b75da3 100644 --- a/third_party/closure/goog/editor/plugins/removeformatting.js +++ b/third_party/closure/goog/editor/plugins/removeformatting.js @@ -37,6 +37,7 @@ goog.require('goog.userAgent'); * A plugin to handle removing formatting from selected text. * @constructor * @extends {goog.editor.Plugin} + * @final */ goog.editor.plugins.RemoveFormatting = function() { goog.editor.Plugin.call(this); @@ -86,7 +87,7 @@ goog.editor.plugins.RemoveFormatting.appendNewline_ = function(sb) { * range as the beginning of the new range. * @param {goog.dom.AbstractRange} endRange Use the end point of this * range as the end of the new range. - * @return {goog.dom.AbstractRange} The new range. + * @return {!goog.dom.AbstractRange} The new range. * @private */ goog.editor.plugins.RemoveFormatting.createRangeDelimitedByRanges_ = function( @@ -379,7 +380,7 @@ goog.editor.plugins.RemoveFormatting.prototype.getHtmlText_ = function(range) { * @param {goog.dom.AbstractRange} range The range to adjust. * @param {Node} startInTable Table node that the range starts in. * @param {Node} endInTable Table node that the range ends in. - * @return {goog.dom.SavedCaretRange} Range to use to restore the + * @return {!goog.dom.SavedCaretRange} Range to use to restore the * selection after we run our custom remove formatting. * @private */ diff --git a/third_party/closure/goog/editor/plugins/spacestabhandler.js b/third_party/closure/goog/editor/plugins/spacestabhandler.js index 06b306f44404a..fa9a218bac45c 100644 --- a/third_party/closure/goog/editor/plugins/spacestabhandler.js +++ b/third_party/closure/goog/editor/plugins/spacestabhandler.js @@ -32,6 +32,7 @@ goog.require('goog.editor.range'); * Plugin to handle tab keys when not in lists to add 4 spaces. * @constructor * @extends {goog.editor.plugins.AbstractTabHandler} + * @final */ goog.editor.plugins.SpacesTabHandler = function() { goog.editor.plugins.AbstractTabHandler.call(this); diff --git a/third_party/closure/goog/editor/plugins/tableeditor.js b/third_party/closure/goog/editor/plugins/tableeditor.js index 927010c5ebf32..4dc8f8abf98f6 100644 --- a/third_party/closure/goog/editor/plugins/tableeditor.js +++ b/third_party/closure/goog/editor/plugins/tableeditor.js @@ -35,9 +35,10 @@ goog.require('goog.object'); * Plugin that adds support for table creation and editing commands. * @constructor * @extends {goog.editor.Plugin} + * @final */ goog.editor.plugins.TableEditor = function() { - goog.base(this); + goog.editor.plugins.TableEditor.base(this, 'constructor'); /** * The array of functions that decide whether a table element could be @@ -111,7 +112,7 @@ goog.editor.plugins.TableEditor.prototype.isSupportedCommand = /** @override */ goog.editor.plugins.TableEditor.prototype.enable = function(fieldObject) { - goog.base(this, 'enable', fieldObject); + goog.editor.plugins.TableEditor.base(this, 'enable', fieldObject); // enableObjectResizing is supported only for Gecko. // You can refer to http://qooxdoo.org/contrib/project/htmlarea/html_editing @@ -378,7 +379,7 @@ goog.editor.plugins.TableEditor.CellSelection_ = /** * Returns the EditableTable object of which this selection's cells are a * subset. - * @return {goog.editor.Table?} the table. + * @return {!goog.editor.Table} the table. */ goog.editor.plugins.TableEditor.CellSelection_.prototype.getTable = function() { @@ -428,7 +429,7 @@ goog.editor.plugins.TableEditor.CellSelection_.prototype.getLastColumnIndex = /** * Returns the cells in this selection. - * @return {Array.} Cells in this selection. + * @return {!Array.} Cells in this selection. */ goog.editor.plugins.TableEditor.CellSelection_.prototype.getCells = function() { return this.cells_; diff --git a/third_party/closure/goog/editor/plugins/tagonenterhandler.js b/third_party/closure/goog/editor/plugins/tagonenterhandler.js index c586894facbd8..4e85d6d635152 100644 --- a/third_party/closure/goog/editor/plugins/tagonenterhandler.js +++ b/third_party/closure/goog/editor/plugins/tagonenterhandler.js @@ -291,7 +291,7 @@ goog.editor.plugins.TagOnEnterHandler.prototype. /** * If The cursor is in an empty LI then break out of the list like in IE * @param {Node} li LI to break out of. - * @return {Element} Element to put the cursor after. + * @return {!Element} Element to put the cursor after. * @private */ goog.editor.plugins.TagOnEnterHandler.prototype.breakOutOfEmptyListItemGecko_ = @@ -347,7 +347,7 @@ goog.editor.plugins.TagOnEnterHandler.prototype.breakOutOfEmptyListItemGecko_ = * @param {Object} position The W3C cursor position object * (from getCursorPositionW3c). * @param {Node} container The field containing position. - * @return {Element} The container element that holds the contents from + * @return {!Element} The container element that holds the contents from * position. * @private */ @@ -584,7 +584,7 @@ goog.editor.plugins.TagOnEnterHandler.prototype.scrollCursorIntoViewGecko_ = * ending up in the second half. positionOffset must be 0 in this case. * @param {Node=} opt_root Node at which to stop splitting the dom (the root * is also split). - * @return {Node} The node containing the second half of the tree. + * @return {!Node} The node containing the second half of the tree. * @private */ goog.editor.plugins.TagOnEnterHandler.splitDom_ = function( @@ -659,7 +659,7 @@ goog.editor.plugins.TagOnEnterHandler.splitDom_ = function( * empty element, the dom will be split at that element, with positionNode * ending up in the second half. positionOffset must be 0 in this case. * @param {Node} node Node to split. - * @return {Node} The node containing the second half of the tree. + * @return {!Node} The node containing the second half of the tree. * @private */ goog.editor.plugins.TagOnEnterHandler.splitDomAndAppend_ = function( diff --git a/third_party/closure/goog/editor/plugins/undoredo.js b/third_party/closure/goog/editor/plugins/undoredo.js index 4222af964ce60..7b66530acc712 100644 --- a/third_party/closure/goog/editor/plugins/undoredo.js +++ b/third_party/closure/goog/editor/plugins/undoredo.js @@ -21,7 +21,6 @@ goog.provide('goog.editor.plugins.UndoRedo'); -goog.require('goog.debug.Logger'); goog.require('goog.dom'); goog.require('goog.dom.NodeOffset'); goog.require('goog.dom.Range'); @@ -34,6 +33,7 @@ goog.require('goog.editor.plugins.UndoRedoManager'); goog.require('goog.editor.plugins.UndoRedoState'); goog.require('goog.events'); goog.require('goog.events.EventHandler'); +goog.require('goog.log'); @@ -79,12 +79,12 @@ goog.inherits(goog.editor.plugins.UndoRedo, goog.editor.Plugin); /** * The logger for this class. - * @type {goog.debug.Logger} + * @type {goog.log.Logger} * @protected * @override */ goog.editor.plugins.UndoRedo.prototype.logger = - goog.debug.Logger.getLogger('goog.editor.plugins.UndoRedo'); + goog.log.getLogger('goog.editor.plugins.UndoRedo'); /** @@ -433,7 +433,7 @@ goog.editor.plugins.UndoRedo.prototype.restoreState = function( this.currentStates_[state.fieldHashCode].setUndoState( content, cursorPosition); } catch (e) { - this.logger.severe('Error while restoring undo state', e); + goog.log.error(this.logger, 'Error while restoring undo state', e); } finally { // Clear the delayed change event, set flag so we know not to act on it. this.inProgressUndo_ = state; diff --git a/third_party/closure/goog/editor/plugins/undoredostate.js b/third_party/closure/goog/editor/plugins/undoredostate.js index ded31d2c7bc0c..9a772dd4382e1 100644 --- a/third_party/closure/goog/editor/plugins/undoredostate.js +++ b/third_party/closure/goog/editor/plugins/undoredostate.js @@ -36,7 +36,7 @@ goog.require('goog.events.EventTarget'); * @extends {goog.events.EventTarget} */ goog.editor.plugins.UndoRedoState = function(asynchronous) { - goog.base(this); + goog.editor.plugins.UndoRedoState.base(this, 'constructor'); /** * Indicates if the undo or redo actions for this state complete diff --git a/third_party/closure/goog/editor/range.js b/third_party/closure/goog/editor/range.js index ff02ae6f25a61..34a493eb2069d 100644 --- a/third_party/closure/goog/editor/range.js +++ b/third_party/closure/goog/editor/range.js @@ -27,10 +27,10 @@ goog.require('goog.dom.NodeType'); goog.require('goog.dom.Range'); goog.require('goog.dom.RangeEndpoint'); goog.require('goog.dom.SavedCaretRange'); -goog.require('goog.editor.BrowserFeature'); goog.require('goog.editor.node'); goog.require('goog.editor.style'); goog.require('goog.iter'); +goog.require('goog.userAgent'); /** @@ -84,7 +84,7 @@ goog.editor.range.narrow = function(range, el) { * nodes as the foo text node, return the li. * @param {goog.dom.AbstractRange} range The range. * @param {Node=} opt_stopNode Optional node to stop expanding past. - * @return {goog.dom.AbstractRange} The expanded range. + * @return {!goog.dom.AbstractRange} The expanded range. */ goog.editor.range.expand = function(range, opt_stopNode) { // Expand the start out to the common container. @@ -126,7 +126,7 @@ goog.editor.range.expand = function(range, opt_stopNode) { * @param {goog.dom.AbstractRange} range The range to expand. * @param {goog.dom.RangeEndpoint} endpoint The endpoint to expand. * @param {Node=} opt_stopNode Optional node to stop expanding past. - * @return {goog.dom.AbstractRange} The expanded range. + * @return {!goog.dom.AbstractRange} The expanded range. * @private */ goog.editor.range.expandEndPointToContainer_ = function(range, endpoint, @@ -180,7 +180,7 @@ goog.editor.range.selectNodeStart = function(node) { * Bug: http://bugs.webkit.org/show_bug.cgi?id=17697 * @param {Node} node The node to position the cursor relative to. * @param {boolean} toLeft True to place it to the left, false to the right. - * @return {goog.dom.AbstractRange} The newly selected range. + * @return {!goog.dom.AbstractRange} The newly selected range. */ goog.editor.range.placeCursorNextTo = function(node, toLeft) { var parent = node.parentNode; @@ -296,7 +296,7 @@ goog.editor.range.rangePreservingNormalize = function(node, range) { * * @param {goog.dom.AbstractRange} range A range. * @param {boolean} atStart True for the start point, false for the end point. - * @return {goog.editor.range.Point} The end point, expressed as a node + * @return {!goog.editor.range.Point} The end point, expressed as a node * and an offset. */ goog.editor.range.getDeepEndPoint = function(range, atStart) { @@ -333,53 +333,54 @@ goog.editor.range.getDeepEndPoint = function(range, atStart) { * range. Should be called after body.normalize() is called. */ goog.editor.range.normalize = function(range) { - var startPoint = goog.editor.range.normalizePoint_( - goog.editor.range.getDeepEndPoint(range, true)); - var startParent = startPoint.getParentPoint(); - var startPreviousSibling = startPoint.node.previousSibling; - if (startPoint.node.nodeType == goog.dom.NodeType.TEXT) { - startPoint.node = null; + var isReversed = range.isReversed(); + var anchorPoint = goog.editor.range.normalizePoint_( + goog.editor.range.getDeepEndPoint(range, !isReversed)); + var anchorParent = anchorPoint.getParentPoint(); + var anchorPreviousSibling = anchorPoint.node.previousSibling; + if (anchorPoint.node.nodeType == goog.dom.NodeType.TEXT) { + anchorPoint.node = null; } - var endPoint = goog.editor.range.normalizePoint_( - goog.editor.range.getDeepEndPoint(range, false)); - var endParent = endPoint.getParentPoint(); - var endPreviousSibling = endPoint.node.previousSibling; - if (endPoint.node.nodeType == goog.dom.NodeType.TEXT) { - endPoint.node = null; + var focusPoint = goog.editor.range.normalizePoint_( + goog.editor.range.getDeepEndPoint(range, isReversed)); + var focusParent = focusPoint.getParentPoint(); + var focusPreviousSibling = focusPoint.node.previousSibling; + if (focusPoint.node.nodeType == goog.dom.NodeType.TEXT) { + focusPoint.node = null; } /** @return {goog.dom.AbstractRange} The normalized range. */ return function() { - if (!startPoint.node && startPreviousSibling) { - // If startPoint.node was previously an empty text node with no siblings, - // startPreviousSibling may not have a nextSibling since that node will no - // longer exist. Do our best and point to the end of the previous + if (!anchorPoint.node && anchorPreviousSibling) { + // If anchorPoint.node was previously an empty text node with no siblings, + // anchorPreviousSibling may not have a nextSibling since that node will + // no longer exist. Do our best and point to the end of the previous // element. - startPoint.node = startPreviousSibling.nextSibling; - if (!startPoint.node) { - startPoint = goog.editor.range.Point.getPointAtEndOfNode( - startPreviousSibling); + anchorPoint.node = anchorPreviousSibling.nextSibling; + if (!anchorPoint.node) { + anchorPoint = goog.editor.range.Point.getPointAtEndOfNode( + anchorPreviousSibling); } } - if (!endPoint.node && endPreviousSibling) { - // If endPoint.node was previously an empty text node with no siblings, - // endPreviousSibling may not have a nextSibling since that node will no + if (!focusPoint.node && focusPreviousSibling) { + // If focusPoint.node was previously an empty text node with no siblings, + // focusPreviousSibling may not have a nextSibling since that node will no // longer exist. Do our best and point to the end of the previous // element. - endPoint.node = endPreviousSibling.nextSibling; - if (!endPoint.node) { - endPoint = goog.editor.range.Point.getPointAtEndOfNode( - endPreviousSibling); + focusPoint.node = focusPreviousSibling.nextSibling; + if (!focusPoint.node) { + focusPoint = goog.editor.range.Point.getPointAtEndOfNode( + focusPreviousSibling); } } return goog.dom.Range.createFromNodes( - startPoint.node || startParent.node.firstChild || startParent.node, - startPoint.offset, - endPoint.node || endParent.node.firstChild || endParent.node, - endPoint.offset); + anchorPoint.node || anchorParent.node.firstChild || anchorParent.node, + anchorPoint.offset, + focusPoint.node || focusParent.node.firstChild || focusParent.node, + focusPoint.offset); }; }; @@ -391,7 +392,7 @@ goog.editor.range.normalize = function(range) { * See the comments on goog.editor.range.normalize for more context. * * @param {goog.editor.range.Point} point A point in the document. - * @return {goog.editor.range.Point} The same point, for easy chaining. + * @return {!goog.editor.range.Point} The same point, for easy chaining. * @private */ goog.editor.range.normalizePoint_ = function(point) { @@ -466,6 +467,7 @@ goog.editor.range.intersectsTag = function(range, tagName) { * @param {Node} node The node containing the point. * @param {number} offset The offset of the point into the node. * @constructor + * @final */ goog.editor.range.Point = function(node, offset) { /** @@ -484,7 +486,7 @@ goog.editor.range.Point = function(node, offset) { /** * Gets the point of this point's node in the DOM. - * @return {goog.editor.range.Point} The node's point. + * @return {!goog.editor.range.Point} The node's point. */ goog.editor.range.Point.prototype.getParentPoint = function() { var parent = this.node.parentNode; @@ -506,7 +508,7 @@ goog.editor.range.Point.prototype.getParentPoint = function() { * @param {boolean=} opt_stopOnChildlessElement If true, and we encounter * a Node which is an Element that cannot have children, we return a Point * based on its parent rather than that Node itself. - * @return {goog.editor.range.Point} A new point. + * @return {!goog.editor.range.Point} A new point. */ goog.editor.range.Point.createDeepestPoint = function(node, offset, opt_trendLeft, opt_stopOnChildlessElement) { @@ -563,7 +565,7 @@ goog.editor.range.Point.isTerminalElement_ = function(node) { /** * Construct a point at the very end of the given node. * @param {Node} node The node to create a point for. - * @return {goog.editor.range.Point} A new point. + * @return {!goog.editor.range.Point} A new point. */ goog.editor.range.Point.getPointAtEndOfNode = function(node) { return new goog.editor.range.Point(node, goog.editor.node.getLength(node)); @@ -578,7 +580,7 @@ goog.editor.range.Point.getPointAtEndOfNode = function(node) { * contentEditable regions right. * * @param {goog.dom.AbstractRange} range The abstract range object. - * @return {goog.dom.SavedCaretRange} A saved caret range that normalizes + * @return {!goog.dom.SavedCaretRange} A saved caret range that normalizes * text nodes. */ goog.editor.range.saveUsingNormalizedCarets = function(range) { diff --git a/third_party/closure/goog/editor/seamlessfield.js b/third_party/closure/goog/editor/seamlessfield.js index 8010013d0f2b8..e8f82df6646d4 100644 --- a/third_party/closure/goog/editor/seamlessfield.js +++ b/third_party/closure/goog/editor/seamlessfield.js @@ -26,7 +26,6 @@ goog.provide('goog.editor.SeamlessField'); goog.require('goog.cssom.iframe.style'); -goog.require('goog.debug.Logger'); goog.require('goog.dom'); goog.require('goog.dom.Range'); goog.require('goog.dom.TagName'); @@ -38,6 +37,7 @@ goog.require('goog.editor.icontent.FieldStyleInfo'); goog.require('goog.editor.node'); goog.require('goog.events'); goog.require('goog.events.EventType'); +goog.require('goog.log'); goog.require('goog.style'); @@ -64,7 +64,7 @@ goog.inherits(goog.editor.SeamlessField, goog.editor.Field); * @override */ goog.editor.SeamlessField.prototype.logger = - goog.debug.Logger.getLogger('goog.editor.SeamlessField'); + goog.log.getLogger('goog.editor.SeamlessField'); // Functions dealing with field sizing. @@ -734,5 +734,5 @@ goog.editor.SeamlessField.prototype.clearListeners = function() { goog.events.unlistenByKey(this.listenForDragOverEventKey_); goog.events.unlistenByKey(this.listenForIframeLoadEventKey_); - goog.base(this, 'clearListeners'); + goog.editor.SeamlessField.base(this, 'clearListeners'); }; diff --git a/third_party/closure/goog/editor/table.js b/third_party/closure/goog/editor/table.js index fbf7ab65f8ecf..1f58bb8f6c3f2 100644 --- a/third_party/closure/goog/editor/table.js +++ b/third_party/closure/goog/editor/table.js @@ -27,11 +27,11 @@ goog.provide('goog.editor.Table'); goog.provide('goog.editor.TableCell'); goog.provide('goog.editor.TableRow'); -goog.require('goog.debug.Logger'); goog.require('goog.dom'); goog.require('goog.dom.DomHelper'); goog.require('goog.dom.NodeType'); goog.require('goog.dom.TagName'); +goog.require('goog.log'); goog.require('goog.string.Unicode'); goog.require('goog.style'); @@ -41,12 +41,13 @@ goog.require('goog.style'); * Class providing high level table editing functions. * @param {Element} node Element that is a table or descendant of a table. * @constructor + * @final */ goog.editor.Table = function(node) { this.element = goog.dom.getAncestorByTagNameAndClass(node, goog.dom.TagName.TABLE); if (!this.element) { - this.logger_.severe( + goog.log.error(this.logger_, "Can't create Table based on a node " + "that isn't a table, or descended from a table."); } @@ -57,11 +58,11 @@ goog.editor.Table = function(node) { /** * Logger object for debugging and error messages. - * @type {goog.debug.Logger} + * @type {goog.log.Logger} * @private */ goog.editor.Table.prototype.logger_ = - goog.debug.Logger.getLogger('goog.editor.Table'); + goog.log.getLogger('goog.editor.Table'); /** @@ -129,7 +130,7 @@ goog.editor.Table.prototype.refresh = function() { /** * Returns all child elements of a TR element that are of type TD or TH. * @param {Element} tr TR element in which to find children. - * @return {Array.} array of child cell elements. + * @return {!Array.} array of child cell elements. */ goog.editor.Table.getChildCellElements = function(tr) { var cells = []; @@ -149,7 +150,7 @@ goog.editor.Table.getChildCellElements = function(tr) { * be extended. * @param {number=} opt_rowIndex Index at which to insert the row. If * this is omitted the row will be appended to the end of the table. - * @return {Element} The new row. + * @return {!Element} The new row. */ goog.editor.Table.prototype.insertRow = function(opt_rowIndex) { var rowIndex = goog.isDefAndNotNull(opt_rowIndex) ? @@ -195,7 +196,7 @@ goog.editor.Table.prototype.insertRow = function(opt_rowIndex) { * @param {number=} opt_colIndex Index at which to insert the column. If * this is omitted the column will be appended to the right side of * the table. - * @return {Array.} Array of new cell elements that were created + * @return {!Array.} Array of new cell elements that were created * to populate the new column. */ goog.editor.Table.prototype.insertColumn = function(opt_colIndex) { @@ -231,7 +232,7 @@ goog.editor.Table.prototype.insertColumn = function(opt_colIndex) { goog.editor.Table.prototype.removeRow = function(rowIndex) { var row = this.rows[rowIndex]; if (!row) { - this.logger_.warning( + goog.log.warning(this.logger_, "Can't remove row at position " + rowIndex + ': no such row.'); } for (var i = 0, cell; cell = row.columns[i]; i += cell.colSpan) { @@ -257,7 +258,7 @@ goog.editor.Table.prototype.removeColumn = function(colIndex) { for (var i = 0, row; row = this.rows[i]; i++) { var cell = row.columns[colIndex]; if (!cell) { - this.logger_.severe( + goog.log.error(this.logger_, "Can't remove cell at position " + i + ', ' + colIndex + ': no such cell.'); } @@ -289,7 +290,7 @@ goog.editor.Table.prototype.mergeCells = function( var cells = []; var cell; if (startRowIndex == endRowIndex && startColIndex == endColIndex) { - this.logger_.warning("Can't merge single cell"); + goog.log.warning(this.logger_, "Can't merge single cell"); return false; } // Gather cells and do sanity check. @@ -300,7 +301,7 @@ goog.editor.Table.prototype.mergeCells = function( cell.endRow > endRowIndex || cell.startCol < startColIndex || cell.endCol > endColIndex) { - this.logger_.warning( + goog.log.warning(this.logger_, "Can't merge cells: the cell in row " + i + ', column ' + j + 'extends outside the supplied rectangle.'); return false; @@ -353,7 +354,7 @@ goog.editor.Table.prototype.mergeCells = function( * Splits a cell with colspans or rowspans into multiple descrete cells. * @param {number} rowIndex y coordinate of the cell to split. * @param {number} colIndex x coordinate of the cell to split. - * @return {Array.} Array of new cell elements created by splitting + * @return {!Array.} Array of new cell elements created by splitting * the cell. */ // TODO(user): support splitting only horizontally or vertically, @@ -404,7 +405,7 @@ goog.editor.Table.prototype.insertCellElement = function( /** * Creates an empty TD element and fill it with some empty content so it will * show up with borders even in IE pre-7 or if empty-cells is set to 'hide' - * @return {Element} a new TD element. + * @return {!Element} a new TD element. */ goog.editor.Table.prototype.createEmptyTd = function() { // TODO(user): more cross-browser testing to determine best @@ -420,6 +421,7 @@ goog.editor.Table.prototype.createEmptyTd = function() { * @param {Element} trElement This rows's underlying TR element. * @param {number} rowIndex This row's index in its parent table. * @constructor + * @final */ goog.editor.TableRow = function(trElement, rowIndex) { this.index = rowIndex; @@ -436,6 +438,7 @@ goog.editor.TableRow = function(trElement, rowIndex) { * @param {number} startRow Index of the row where this cell begins. * @param {number} startCol Index of the column where this cell begins. * @constructor + * @final */ goog.editor.TableCell = function(td, startRow, startCol) { this.element = td; @@ -523,7 +526,7 @@ goog.editor.Table.DEFAULT_BORDER_COLOR = '#888'; * @param {number} rows Number of rows in the table. * @param {Object=} opt_tableStyle Object containing borderWidth and borderColor * properties, used to set the inital style of the table. - * @return {Element} a table element. + * @return {!Element} a table element. */ goog.editor.Table.createDomTable = function( doc, columns, rows, opt_tableStyle) { diff --git a/third_party/closure/goog/events/actioneventwrapper.js b/third_party/closure/goog/events/actioneventwrapper.js index 2995d538137cf..a92f395533b5d 100644 --- a/third_party/closure/goog/events/actioneventwrapper.js +++ b/third_party/closure/goog/events/actioneventwrapper.js @@ -19,11 +19,15 @@ goog.provide('goog.events.actionEventWrapper'); +goog.require('goog.a11y.aria'); +goog.require('goog.a11y.aria.Role'); goog.require('goog.events'); +/** @suppress {extraRequire} */ goog.require('goog.events.EventHandler'); goog.require('goog.events.EventType'); goog.require('goog.events.EventWrapper'); goog.require('goog.events.KeyCodes'); +goog.require('goog.userAgent'); @@ -55,8 +59,8 @@ goog.events.actionEventWrapper = new goog.events.ActionEventWrapper_(); goog.events.ActionEventWrapper_.EVENT_TYPES_ = [ goog.events.EventType.CLICK, goog.userAgent.GECKO ? - goog.events.EventType.KEYPRESS : - goog.events.EventType.KEYDOWN + goog.events.EventType.KEYPRESS : goog.events.EventType.KEYDOWN, + goog.events.EventType.KEYUP ]; @@ -66,8 +70,8 @@ goog.events.ActionEventWrapper_.EVENT_TYPES_ = [ * once to an object. * * @param {goog.events.ListenableType} target The target to listen to events on. - * @param {Function|Object} listener Callback method, or an object with a - * handleEvent function. + * @param {function(?):?|{handleEvent:function(?):?}|null} listener Callback + * method, or an object with a handleEvent function. * @param {boolean=} opt_capt Whether to fire in capture phase (defaults to * false). * @param {Object=} opt_scope Element in whose scope to call the listener. @@ -78,13 +82,21 @@ goog.events.ActionEventWrapper_.EVENT_TYPES_ = [ goog.events.ActionEventWrapper_.prototype.listen = function(target, listener, opt_capt, opt_scope, opt_eventHandler) { var callback = function(e) { + var listenerFn = goog.events.wrapListener(listener); if (e.type == goog.events.EventType.CLICK && e.isMouseActionButton()) { - listener.call(opt_scope, e); - } else if (e.keyCode == goog.events.KeyCodes.ENTER || - e.keyCode == goog.events.KeyCodes.MAC_ENTER) { + listenerFn.call(opt_scope, e); + } else if ((e.keyCode == goog.events.KeyCodes.ENTER || + e.keyCode == goog.events.KeyCodes.MAC_ENTER) && + e.type != goog.events.EventType.KEYUP) { // convert keydown to keypress for backward compatibility. e.type = goog.events.EventType.KEYPRESS; - listener.call(opt_scope, e); + listenerFn.call(opt_scope, e); + } else if (e.keyCode == goog.events.KeyCodes.SPACE && + e.type == goog.events.EventType.KEYUP && + goog.a11y.aria.getRole(/** @type {!Element} */ (e.target)) == + goog.a11y.aria.Role.BUTTON) { + listenerFn.call(opt_scope, e); + e.preventDefault(); } }; callback.listener_ = listener; @@ -106,8 +118,8 @@ goog.events.ActionEventWrapper_.prototype.listen = function(target, listener, * Removes an event listener added using goog.events.EventWrapper.listen. * * @param {goog.events.ListenableType} target The node to remove listener from. - * @param {Function|Object} listener Callback method, or an object with a - * handleEvent function. + * @param {function(?):?|{handleEvent:function(?):?}|null} listener Callback + * method, or an object with a handleEvent function. * @param {boolean=} opt_capt Whether to fire in capture phase (defaults to * false). * @param {Object=} opt_scope Element in whose scope to call the listener. diff --git a/third_party/closure/goog/events/actionhandler.js b/third_party/closure/goog/events/actionhandler.js index 764eeb856ed50..190cc26046c38 100644 --- a/third_party/closure/goog/events/actionhandler.js +++ b/third_party/closure/goog/events/actionhandler.js @@ -50,6 +50,7 @@ goog.require('goog.userAgent'); * @param {Element|Document} element The element or document to listen on. * @constructor * @extends {goog.events.EventTarget} + * @final */ goog.events.ActionHandler = function(element) { goog.events.EventTarget.call(this); @@ -157,6 +158,7 @@ goog.events.ActionHandler.prototype.disposeInternal = function() { * @param {!goog.events.BrowserEvent} browserEvent Browser event object. * @constructor * @extends {goog.events.BrowserEvent} + * @final */ goog.events.ActionEvent = function(browserEvent) { goog.events.BrowserEvent.call(this, browserEvent.getBrowserEvent()); @@ -173,6 +175,7 @@ goog.inherits(goog.events.ActionEvent, goog.events.BrowserEvent); * @param {!goog.events.BrowserEvent} browserEvent Browser event object. * @constructor * @extends {goog.events.BrowserEvent} + * @final */ goog.events.BeforeActionEvent = function(browserEvent) { goog.events.BrowserEvent.call(this, browserEvent.getBrowserEvent()); diff --git a/third_party/closure/goog/events/browserevent.js b/third_party/closure/goog/events/browserevent.js index 59df7fd496c91..82a076eb31242 100644 --- a/third_party/closure/goog/events/browserevent.js +++ b/third_party/closure/goog/events/browserevent.js @@ -65,6 +65,126 @@ goog.require('goog.userAgent'); * @extends {goog.events.Event} */ goog.events.BrowserEvent = function(opt_e, opt_currentTarget) { + goog.events.BrowserEvent.base(this, 'constructor', opt_e ? opt_e.type : ''); + + /** + * Target that fired the event. + * @override + * @type {Node} + */ + this.target = null; + + /** + * Node that had the listener attached. + * @override + * @type {Node|undefined} + */ + this.currentTarget = null; + + /** + * For mouseover and mouseout events, the related object for the event. + * @type {Node} + */ + this.relatedTarget = null; + + /** + * X-coordinate relative to target. + * @type {number} + */ + this.offsetX = 0; + + /** + * Y-coordinate relative to target. + * @type {number} + */ + this.offsetY = 0; + + /** + * X-coordinate relative to the window. + * @type {number} + */ + this.clientX = 0; + + /** + * Y-coordinate relative to the window. + * @type {number} + */ + this.clientY = 0; + + /** + * X-coordinate relative to the monitor. + * @type {number} + */ + this.screenX = 0; + + /** + * Y-coordinate relative to the monitor. + * @type {number} + */ + this.screenY = 0; + + /** + * Which mouse button was pressed. + * @type {number} + */ + this.button = 0; + + /** + * Keycode of key press. + * @type {number} + */ + this.keyCode = 0; + + /** + * Keycode of key press. + * @type {number} + */ + this.charCode = 0; + + /** + * Whether control was pressed at time of event. + * @type {boolean} + */ + this.ctrlKey = false; + + /** + * Whether alt was pressed at time of event. + * @type {boolean} + */ + this.altKey = false; + + /** + * Whether shift was pressed at time of event. + * @type {boolean} + */ + this.shiftKey = false; + + /** + * Whether the meta key was pressed at time of event. + * @type {boolean} + */ + this.metaKey = false; + + /** + * History state object, only set for PopState events where it's a copy of the + * state object provided to pushState or replaceState. + * @type {Object} + */ + this.state = null; + + /** + * Whether the default platform modifier key was pressed at time of event. + * (This is control for all platforms except Mac, where it's Meta.) + * @type {boolean} + */ + this.platformModifierKey = false; + + /** + * The browser event object. + * @private {Event} + */ + this.event_ = null; + if (opt_e) { this.init(opt_e, opt_currentTarget); } @@ -85,7 +205,7 @@ goog.events.BrowserEvent.MouseButton = { /** * Static data for mapping mouse buttons. - * @type {Array.} + * @type {!Array.} */ goog.events.BrowserEvent.IEButtonMap = [ 1, // LEFT @@ -94,144 +214,6 @@ goog.events.BrowserEvent.IEButtonMap = [ ]; -/** - * Target that fired the event. - * @override - * @type {Node} - */ -goog.events.BrowserEvent.prototype.target = null; - - -/** - * Node that had the listener attached. - * @override - * @type {Node|undefined} - */ -goog.events.BrowserEvent.prototype.currentTarget; - - -/** - * For mouseover and mouseout events, the related object for the event. - * @type {Node} - */ -goog.events.BrowserEvent.prototype.relatedTarget = null; - - -/** - * X-coordinate relative to target. - * @type {number} - */ -goog.events.BrowserEvent.prototype.offsetX = 0; - - -/** - * Y-coordinate relative to target. - * @type {number} - */ -goog.events.BrowserEvent.prototype.offsetY = 0; - - -/** - * X-coordinate relative to the window. - * @type {number} - */ -goog.events.BrowserEvent.prototype.clientX = 0; - - -/** - * Y-coordinate relative to the window. - * @type {number} - */ -goog.events.BrowserEvent.prototype.clientY = 0; - - -/** - * X-coordinate relative to the monitor. - * @type {number} - */ -goog.events.BrowserEvent.prototype.screenX = 0; - - -/** - * Y-coordinate relative to the monitor. - * @type {number} - */ -goog.events.BrowserEvent.prototype.screenY = 0; - - -/** - * Which mouse button was pressed. - * @type {number} - */ -goog.events.BrowserEvent.prototype.button = 0; - - -/** - * Keycode of key press. - * @type {number} - */ -goog.events.BrowserEvent.prototype.keyCode = 0; - - -/** - * Keycode of key press. - * @type {number} - */ -goog.events.BrowserEvent.prototype.charCode = 0; - - -/** - * Whether control was pressed at time of event. - * @type {boolean} - */ -goog.events.BrowserEvent.prototype.ctrlKey = false; - - -/** - * Whether alt was pressed at time of event. - * @type {boolean} - */ -goog.events.BrowserEvent.prototype.altKey = false; - - -/** - * Whether shift was pressed at time of event. - * @type {boolean} - */ -goog.events.BrowserEvent.prototype.shiftKey = false; - - -/** - * Whether the meta key was pressed at time of event. - * @type {boolean} - */ -goog.events.BrowserEvent.prototype.metaKey = false; - - -/** - * History state object, only set for PopState events where it's a copy of the - * state object provided to pushState or replaceState. - * @type {Object} - */ -goog.events.BrowserEvent.prototype.state; - - -/** - * Whether the default platform modifier key was pressed at time of event. - * (This is control for all platforms except Mac, where it's Meta. - * @type {boolean} - */ -goog.events.BrowserEvent.prototype.platformModifierKey = false; - - -/** - * The browser event object. - * @type {Event} - * @private - */ -goog.events.BrowserEvent.prototype.event_ = null; - - /** * Accepts a browser event object and creates a patched, cross browser event * object. @@ -240,7 +222,6 @@ goog.events.BrowserEvent.prototype.event_ = null; */ goog.events.BrowserEvent.prototype.init = function(e, opt_currentTarget) { var type = this.type = e.type; - goog.events.Event.call(this, type); // TODO(nicksantos): Change this.target to type EventTarget. this.target = /** @type {Node} */ (e.target) || e.srcElement; @@ -295,7 +276,6 @@ goog.events.BrowserEvent.prototype.init = function(e, opt_currentTarget) { if (e.defaultPrevented) { this.preventDefault(); } - delete this.propagationStopped_; }; diff --git a/third_party/closure/goog/events/event.js b/third_party/closure/goog/events/event.js index ba406d57e5dcf..c3d4317ae1ade 100644 --- a/third_party/closure/goog/events/event.js +++ b/third_party/closure/goog/events/event.js @@ -21,9 +21,13 @@ goog.provide('goog.events.Event'); goog.provide('goog.events.EventLike'); -// goog.events.Event no longer depends on goog.Disposable. Keep requiring -// goog.Disposable here to not break projects which assume this dependency. +/** + * goog.events.Event no longer depends on goog.Disposable. Keep requiring + * goog.Disposable here to not break projects which assume this dependency. + * @suppress {extraRequire} + */ goog.require('goog.Disposable'); +goog.require('goog.events.EventId'); /** @@ -32,7 +36,7 @@ goog.require('goog.Disposable'); * goog.events.Event. Objects are treated as an extension of a new * goog.events.Event with the type property of the object being used as the type * of the Event. - * @typedef {string|Object|goog.events.Event} + * @typedef {string|Object|goog.events.Event|goog.events.EventId} */ goog.events.EventLike; @@ -42,7 +46,7 @@ goog.events.EventLike; * A base class for event objects, so that they can support preventDefault and * stopPropagation. * - * @param {string} type Event Type. + * @param {string|!goog.events.EventId} type Event Type. * @param {Object=} opt_target Reference to the object that is the target of * this event. It has to implement the {@code EventTarget} interface * declared at {@link http://developer.mozilla.org/en/DOM/EventTarget}. @@ -53,7 +57,7 @@ goog.events.Event = function(type, opt_target) { * Event type. * @type {string} */ - this.type = type; + this.type = type instanceof goog.events.EventId ? String(type) : type; /** * Target of the event. @@ -66,6 +70,34 @@ goog.events.Event = function(type, opt_target) { * @type {Object|undefined} */ this.currentTarget = this.target; + + /** + * Whether to cancel the event in internal capture/bubble processing for IE. + * @type {boolean} + * @public + * @suppress {underscore|visibility} Technically public, but referencing this + * outside this package is strongly discouraged. + */ + this.propagationStopped_ = false; + + /** + * Whether the default action has been prevented. + * This is a property to match the W3C specification at + * {@link http://www.w3.org/TR/DOM-Level-3-Events/ + * #events-event-type-defaultPrevented}. + * Must be treated as read-only outside the class. + * @type {boolean} + */ + this.defaultPrevented = false; + + /** + * Return value for in internal capture/bubble processing for IE. + * @type {boolean} + * @public + * @suppress {underscore|visibility} Technically public, but referencing this + * outside this package is strongly discouraged. + */ + this.returnValue_ = true; }; @@ -87,34 +119,6 @@ goog.events.Event.prototype.dispose = function() { }; -/** - * Whether to cancel the event in internal capture/bubble processing for IE. - * @type {boolean} - * @suppress {underscore} Technically public, but referencing this outside - * this package is strongly discouraged. - */ -goog.events.Event.prototype.propagationStopped_ = false; - - -/** - * Whether the default action has been prevented. - * This is a property to match the W3C specification at {@link - * http://www.w3.org/TR/DOM-Level-3-Events/#events-event-type-defaultPrevented}. - * Must be treated as read-only outside the class. - * @type {boolean} - */ -goog.events.Event.prototype.defaultPrevented = false; - - -/** - * Return value for in internal capture/bubble processing for IE. - * @type {boolean} - * @suppress {underscore} Technically public, but referencing this outside - * this package is strongly discouraged. - */ -goog.events.Event.prototype.returnValue_ = true; - - /** * Stops event propagation. */ diff --git a/third_party/closure/goog/events/eventhandler.js b/third_party/closure/goog/events/eventhandler.js index b66defb9e2422..c45d031da8a23 100644 --- a/third_party/closure/goog/events/eventhandler.js +++ b/third_party/closure/goog/events/eventhandler.js @@ -19,7 +19,7 @@ * Example: *
      * function Something() {
    - *   goog.base(this);
    + *   Something.base(this);
      *
      *   ... set up object ...
      *
    @@ -33,7 +33,7 @@
      * goog.inherits(Something, goog.events.EventHandler);
      *
      * Something.prototype.disposeInternal = function() {
    - *   goog.base(this, 'disposeInternal');
    + *   Something.base(this, 'disposeInternal');
      *   goog.dom.removeNode(this.container);
      * };
      *
    @@ -67,13 +67,16 @@ goog.require('goog.object');
      * Super class for objects that want to easily manage a number of event
      * listeners.  It allows a short cut to listen and also provides a quick way
      * to remove all events listeners belonging to this object.
    - * @param {Object=} opt_handler Object in whose scope to call the listeners.
    + * @param {SCOPE=} opt_scope Object in whose scope to call the listeners.
      * @constructor
      * @extends {goog.Disposable}
    + * @template SCOPE
      */
    -goog.events.EventHandler = function(opt_handler) {
    +goog.events.EventHandler = function(opt_scope) {
       goog.Disposable.call(this);
    -  this.handler_ = opt_handler;
    +  // TODO(user): Rename this to this.scope_ and fix the classes in google3
    +  // that access this private variable. :(
    +  this.handler_ = opt_scope;
     
       /**
        * Keys for events that are being listened to.
    @@ -89,7 +92,8 @@ goog.inherits(goog.events.EventHandler, goog.Disposable);
      * Utility array used to unify the cases of listening for an array of types
      * and listening for a single event, without using recursion or allocating
      * an array each time.
    - * @type {Array.}
    + * @type {!Array.}
    + * @const
      * @private
      */
     goog.events.EventHandler.typeArray_ = [];
    @@ -99,32 +103,82 @@ goog.events.EventHandler.typeArray_ = [];
      * Listen to an event on a Listenable.  If the function is omitted then the
      * EventHandler's handleEvent method will be used.
      * @param {goog.events.ListenableType} src Event source.
    - * @param {string|Array.} type Event type to listen for or array of
    - *     event types.
    - * @param {Function|Object=} opt_fn Optional callback function to be used as the
    - *    listener or an object with handleEvent function.
    + * @param {string|Array.|
    + *     !goog.events.EventId.|!Array.>}
    + *     type Event type to listen for or array of event types.
    + * @param {function(this:SCOPE, EVENTOBJ):?|{handleEvent:function(?):?}|null=}
    + *     opt_fn Optional callback function to be used as the listener or an object
    + *     with handleEvent function.
      * @param {boolean=} opt_capture Optional whether to use capture phase.
    - * @param {Object=} opt_handler Object in whose scope to call the listener.
    - * @return {goog.events.EventHandler} This object, allowing for chaining of
    + * @return {!goog.events.EventHandler} This object, allowing for chaining of
      *     calls.
    + * @template EVENTOBJ
      */
    -goog.events.EventHandler.prototype.listen = function(src, type, opt_fn,
    -                                                     opt_capture,
    -                                                     opt_handler) {
    +goog.events.EventHandler.prototype.listen = function(
    +    src, type, opt_fn, opt_capture) {
    +  return this.listen_(src, type, opt_fn, opt_capture);
    +};
    +
    +
    +/**
    + * Listen to an event on a Listenable.  If the function is omitted then the
    + * EventHandler's handleEvent method will be used.
    + * @param {goog.events.ListenableType} src Event source.
    + * @param {string|Array.|
    + *     !goog.events.EventId.|!Array.>}
    + *     type Event type to listen for or array of event types.
    + * @param {function(this:T, EVENTOBJ):?|{handleEvent:function(this:T, ?):?}|
    + *     null|undefined} fn Optional callback function to be used as the
    + *     listener or an object with handleEvent function.
    + * @param {boolean|undefined} capture Optional whether to use capture phase.
    + * @param {T} scope Object in whose scope to call the listener.
    + * @return {!goog.events.EventHandler} This object, allowing for chaining of
    + *     calls.
    + * @template T,EVENTOBJ
    + */
    +goog.events.EventHandler.prototype.listenWithScope = function(
    +    src, type, fn, capture, scope) {
    +  // TODO(user): Deprecate this function.
    +  return this.listen_(src, type, fn, capture, scope);
    +};
    +
    +
    +/**
    + * Listen to an event on a Listenable.  If the function is omitted then the
    + * EventHandler's handleEvent method will be used.
    + * @param {goog.events.ListenableType} src Event source.
    + * @param {string|Array.|
    + *     !goog.events.EventId.|!Array.>}
    + *     type Event type to listen for or array of event types.
    + * @param {function(EVENTOBJ):?|{handleEvent:function(?):?}|null=} opt_fn
    + *     Optional callback function to be used as the listener or an object with
    + *     handleEvent function.
    + * @param {boolean=} opt_capture Optional whether to use capture phase.
    + * @param {Object=} opt_scope Object in whose scope to call the listener.
    + * @return {!goog.events.EventHandler} This object, allowing for chaining of
    + *     calls.
    + * @template EVENTOBJ
    + * @private
    + */
    +goog.events.EventHandler.prototype.listen_ = function(src, type, opt_fn,
    +                                                      opt_capture,
    +                                                      opt_scope) {
       if (!goog.isArray(type)) {
    -    goog.events.EventHandler.typeArray_[0] = /** @type {string} */(type);
    +    if (type) {
    +      goog.events.EventHandler.typeArray_[0] = type.toString();
    +    }
         type = goog.events.EventHandler.typeArray_;
       }
       for (var i = 0; i < type.length; i++) {
         var listenerObj = goog.events.listen(
    -        src, type[i], opt_fn || this,
    +        src, type[i], opt_fn || this.handleEvent,
             opt_capture || false,
    -        opt_handler || this.handler_ || this);
    +        opt_scope || this.handler_ || this);
     
    -    if (goog.DEBUG && !listenerObj) {
    -      // Some tests mock goog.events.listen, thus ensuring that
    -      // they are never testing the real thing anyway, hence this is safe
    -      // (except that #getListenerCount() will return the wrong value).
    +    if (!listenerObj) {
    +      // When goog.events.listen run on OFF_AND_FAIL or OFF_AND_SILENT
    +      // (goog.events.CaptureSimulationMode) in IE8-, it will return null
    +      // value.
           return this;
         }
     
    @@ -142,26 +196,86 @@ goog.events.EventHandler.prototype.listen = function(src, type, opt_fn,
      * event listener is removed from the target. If an array of event types is
      * provided, each event type will be listened to once.
      * @param {goog.events.ListenableType} src Event source.
    - * @param {string|Array.} type Event type to listen for or array of
    - *     event types.
    - * @param {Function|Object=} opt_fn Optional callback function to be used as the
    - *    listener or an object with handleEvent function.
    + * @param {string|Array.|
    + *     !goog.events.EventId.|!Array.>}
    + *     type Event type to listen for or array of event types.
    + * @param {function(this:SCOPE, EVENTOBJ):?|{handleEvent:function(?):?}|null=} opt_fn
    + *    Optional callback function to be used as the listener or an object with
    + *    handleEvent function.
    + * @param {boolean=} opt_capture Optional whether to use capture phase.
    + * @return {!goog.events.EventHandler} This object, allowing for chaining of
    + *     calls.
    + * @template EVENTOBJ
    + */
    +goog.events.EventHandler.prototype.listenOnce = function(
    +    src, type, opt_fn, opt_capture) {
    +  // TODO(user): Remove the opt_scope from this function and then
    +  // templatize it.
    +  return this.listenOnce_(src, type, opt_fn, opt_capture);
    +};
    +
    +
    +/**
    + * Listen to an event on a Listenable.  If the function is omitted, then the
    + * EventHandler's handleEvent method will be used. After the event has fired the
    + * event listener is removed from the target. If an array of event types is
    + * provided, each event type will be listened to once.
    + * @param {goog.events.ListenableType} src Event source.
    + * @param {string|Array.|
    + *     !goog.events.EventId.|!Array.>}
    + *     type Event type to listen for or array of event types.
    + * @param {function(this:T, EVENTOBJ):?|{handleEvent:function(this:T, ?):?}|
    + *     null|undefined} fn Optional callback function to be used as the
    + *     listener or an object with handleEvent function.
    + * @param {boolean|undefined} capture Optional whether to use capture phase.
    + * @param {T} scope Object in whose scope to call the listener.
    + * @return {!goog.events.EventHandler} This object, allowing for chaining of
    + *     calls.
    + * @template T,EVENTOBJ
    + */
    +goog.events.EventHandler.prototype.listenOnceWithScope = function(
    +    src, type, fn, capture, scope) {
    +  // TODO(user): Deprecate this function.
    +  return this.listenOnce_(src, type, fn, capture, scope);
    +};
    +
    +
    +/**
    + * Listen to an event on a Listenable.  If the function is omitted, then the
    + * EventHandler's handleEvent method will be used. After the event has fired
    + * the event listener is removed from the target. If an array of event types is
    + * provided, each event type will be listened to once.
    + * @param {goog.events.ListenableType} src Event source.
    + * @param {string|Array.|
    + *     !goog.events.EventId.|!Array.>}
    + *     type Event type to listen for or array of event types.
    + * @param {function(EVENTOBJ):?|{handleEvent:function(?):?}|null=} opt_fn
    + *    Optional callback function to be used as the listener or an object with
    + *    handleEvent function.
      * @param {boolean=} opt_capture Optional whether to use capture phase.
    - * @param {Object=} opt_handler Object in whose scope to call the listener.
    - * @return {goog.events.EventHandler} This object, allowing for chaining of
    + * @param {Object=} opt_scope Object in whose scope to call the listener.
    + * @return {!goog.events.EventHandler} This object, allowing for chaining of
      *     calls.
    + * @template EVENTOBJ
    + * @private
      */
    -goog.events.EventHandler.prototype.listenOnce = function(src, type, opt_fn,
    -                                                         opt_capture,
    -                                                         opt_handler) {
    +goog.events.EventHandler.prototype.listenOnce_ = function(
    +    src, type, opt_fn, opt_capture, opt_scope) {
       if (goog.isArray(type)) {
         for (var i = 0; i < type.length; i++) {
    -      this.listenOnce(src, type[i], opt_fn, opt_capture, opt_handler);
    +      this.listenOnce_(src, type[i], opt_fn, opt_capture, opt_scope);
         }
       } else {
         var listenerObj = goog.events.listenOnce(
    -        src, type, opt_fn || this, opt_capture,
    -        opt_handler || this.handler_ || this);
    +        src, type, opt_fn || this.handleEvent, opt_capture,
    +        opt_scope || this.handler_ || this);
    +    if (!listenerObj) {
    +      // When goog.events.listen run on OFF_AND_FAIL or OFF_AND_SILENT
    +      // (goog.events.CaptureSimulationMode) in IE8-, it will return null
    +      // value.
    +      return this;
    +    }
    +
         var key = listenerObj.key;
         this.keys_[key] = listenerObj;
       }
    @@ -178,17 +292,65 @@ goog.events.EventHandler.prototype.listenOnce = function(src, type, opt_fn,
      * @param {EventTarget|goog.events.EventTarget} src The node to listen to
      *     events on.
      * @param {goog.events.EventWrapper} wrapper Event wrapper to use.
    - * @param {Function|Object} listener Callback method, or an object with a
    - *     handleEvent function.
    + * @param {function(this:SCOPE, ?):?|{handleEvent:function(?):?}|null} listener
    + *     Callback method, or an object with a handleEvent function.
      * @param {boolean=} opt_capt Whether to fire in capture phase (defaults to
      *     false).
    - * @param {Object=} opt_handler Element in whose scope to call the listener.
    - * @return {goog.events.EventHandler} This object, allowing for chaining of
    + * @return {!goog.events.EventHandler} This object, allowing for chaining of
      *     calls.
      */
    -goog.events.EventHandler.prototype.listenWithWrapper = function(src, wrapper,
    -    listener, opt_capt, opt_handler) {
    -  wrapper.listen(src, listener, opt_capt, opt_handler || this.handler_ || this,
    +goog.events.EventHandler.prototype.listenWithWrapper = function(
    +    src, wrapper, listener, opt_capt) {
    +  // TODO(user): Remove the opt_scope from this function and then
    +  // templatize it.
    +  return this.listenWithWrapper_(src, wrapper, listener, opt_capt);
    +};
    +
    +
    +/**
    + * Adds an event listener with a specific event wrapper on a DOM Node or an
    + * object that has implemented {@link goog.events.EventTarget}. A listener can
    + * only be added once to an object.
    + *
    + * @param {EventTarget|goog.events.EventTarget} src The node to listen to
    + *     events on.
    + * @param {goog.events.EventWrapper} wrapper Event wrapper to use.
    + * @param {function(this:T, ?):?|{handleEvent:function(this:T, ?):?}|null}
    + *     listener Optional callback function to be used as the
    + *     listener or an object with handleEvent function.
    + * @param {boolean|undefined} capture Optional whether to use capture phase.
    + * @param {T} scope Object in whose scope to call the listener.
    + * @return {!goog.events.EventHandler} This object, allowing for chaining of
    + *     calls.
    + * @template T
    + */
    +goog.events.EventHandler.prototype.listenWithWrapperAndScope = function(
    +    src, wrapper, listener, capture, scope) {
    +  // TODO(user): Deprecate this function.
    +  return this.listenWithWrapper_(src, wrapper, listener, capture, scope);
    +};
    +
    +
    +/**
    + * Adds an event listener with a specific event wrapper on a DOM Node or an
    + * object that has implemented {@link goog.events.EventTarget}. A listener can
    + * only be added once to an object.
    + *
    + * @param {EventTarget|goog.events.EventTarget} src The node to listen to
    + *     events on.
    + * @param {goog.events.EventWrapper} wrapper Event wrapper to use.
    + * @param {function(?):?|{handleEvent:function(?):?}|null} listener Callback
    + *     method, or an object with a handleEvent function.
    + * @param {boolean=} opt_capt Whether to fire in capture phase (defaults to
    + *     false).
    + * @param {Object=} opt_scope Element in whose scope to call the listener.
    + * @return {!goog.events.EventHandler} This object, allowing for chaining of
    + *     calls.
    + * @private
    + */
    +goog.events.EventHandler.prototype.listenWithWrapper_ = function(
    +    src, wrapper, listener, opt_capt, opt_scope) {
    +  wrapper.listen(src, listener, opt_capt, opt_scope || this.handler_ || this,
                      this);
       return this;
     };
    @@ -211,24 +373,29 @@ goog.events.EventHandler.prototype.getListenerCount = function() {
     /**
      * Unlistens on an event.
      * @param {goog.events.ListenableType} src Event source.
    - * @param {string|Array.} type Event type to listen for.
    - * @param {Function|Object=} opt_fn Optional callback function to be used as the
    - *    listener or an object with handleEvent function.
    + * @param {string|Array.|
    + *     !goog.events.EventId.|!Array.>}
    + *     type Event type or array of event types to unlisten to.
    + * @param {function(EVENTOBJ):?|{handleEvent:function(?):?}|null=} opt_fn
    + *     Optional callback function to be used as the listener or an object with
    + *     handleEvent function.
      * @param {boolean=} opt_capture Optional whether to use capture phase.
    - * @param {Object=} opt_handler Object in whose scope to call the listener.
    - * @return {goog.events.EventHandler} This object, allowing for chaining of
    + * @param {Object=} opt_scope Object in whose scope to call the listener.
    + * @return {!goog.events.EventHandler} This object, allowing for chaining of
      *     calls.
    + * @template EVENTOBJ
      */
     goog.events.EventHandler.prototype.unlisten = function(src, type, opt_fn,
                                                            opt_capture,
    -                                                       opt_handler) {
    +                                                       opt_scope) {
       if (goog.isArray(type)) {
         for (var i = 0; i < type.length; i++) {
    -      this.unlisten(src, type[i], opt_fn, opt_capture, opt_handler);
    +      this.unlisten(src, type[i], opt_fn, opt_capture, opt_scope);
         }
       } else {
    -    var listener = goog.events.getListener(src, type, opt_fn || this,
    -        opt_capture, opt_handler || this.handler_ || this);
    +    var listener = goog.events.getListener(src, type,
    +        opt_fn || this.handleEvent,
    +        opt_capture, opt_scope || this.handler_ || this);
     
         if (listener) {
           goog.events.unlistenByKey(listener);
    @@ -246,18 +413,19 @@ goog.events.EventHandler.prototype.unlisten = function(src, type, opt_fn,
      * @param {EventTarget|goog.events.EventTarget} src The target to stop
      *     listening to events on.
      * @param {goog.events.EventWrapper} wrapper Event wrapper to use.
    - * @param {Function|Object} listener The listener function to remove.
    + * @param {function(?):?|{handleEvent:function(?):?}|null} listener The
    + *     listener function to remove.
      * @param {boolean=} opt_capt In DOM-compliant browsers, this determines
      *     whether the listener is fired during the capture or bubble phase of the
      *     event.
    - * @param {Object=} opt_handler Element in whose scope to call the listener.
    - * @return {goog.events.EventHandler} This object, allowing for chaining of
    + * @param {Object=} opt_scope Element in whose scope to call the listener.
    + * @return {!goog.events.EventHandler} This object, allowing for chaining of
      *     calls.
      */
     goog.events.EventHandler.prototype.unlistenWithWrapper = function(src, wrapper,
    -    listener, opt_capt, opt_handler) {
    +    listener, opt_capt, opt_scope) {
       wrapper.unlisten(src, listener, opt_capt,
    -                   opt_handler || this.handler_ || this, this);
    +                   opt_scope || this.handler_ || this, this);
       return this;
     };
     
    diff --git a/third_party/closure/goog/events/eventid.js b/third_party/closure/goog/events/eventid.js
    new file mode 100644
    index 0000000000000..f7ea4dd1b285a
    --- /dev/null
    +++ b/third_party/closure/goog/events/eventid.js
    @@ -0,0 +1,47 @@
    +// Copyright 2013 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.events.EventId');
    +
    +
    +
    +/**
    + * A templated class that is used when registering for events. Typical usage:
    + * 
    + *   /** @type {goog.events.EventId.}
    + *   var myEventId = new goog.events.EventId(
    + *       goog.events.getUniqueId(('someEvent'));
    + *
    + *   // No need to cast or declare here since the compiler knows the correct
    + *   // type of 'evt' (MyEventObj).
    + *   something.listen(myEventId, function(evt) {});
    + * 
    + *
    + * @param {string} eventId
    + * @template T
    + * @constructor
    + * @struct
    + * @final
    + */
    +goog.events.EventId = function(eventId) {
    +  /** @const */ this.id = eventId;
    +};
    +
    +
    +/**
    + * @override
    + */
    +goog.events.EventId.prototype.toString = function() {
    +  return this.id;
    +};
    diff --git a/third_party/closure/goog/events/events.js b/third_party/closure/goog/events/events.js
    index 9f3f7f9b58bd2..5434587149338 100644
    --- a/third_party/closure/goog/events/events.js
    +++ b/third_party/closure/goog/events/events.js
    @@ -13,17 +13,21 @@
     // limitations under the License.
     
     /**
    - * @fileoverview Event Manager.
    + * @fileoverview An event manager for both native browser event
    + * targets and custom JavaScript event targets
    + * ({@code goog.events.Listenable}). This provides an abstraction
    + * over browsers' event systems.
      *
    - * Provides an abstracted interface to the browsers' event
    - * systems. This uses an indirect lookup of listener functions to avoid circular
    - * references between DOM (in IE) or XPCOM (in Mozilla) objects which leak
    - * memory. This makes it easier to write OO Javascript/DOM code.
    + * It also provides a simulation of W3C event model's capture phase in
    + * Internet Explorer (IE 8 and below). Caveat: the simulation does not
    + * interact well with listeners registered directly on the elements
    + * (bypassing goog.events) or even with listeners registered via
    + * goog.events in a separate JS binary. In these cases, we provide
    + * no ordering guarantees.
      *
    - * It simulates capture & bubble in Internet Explorer.
    - *
    - * The listeners will also automagically have their event objects patched, so
    - * your handlers don't need to worry about the browser.
    + * The listeners will receive a "patched" event object. Such event object
    + * contains normalized values for certain event properties that differs in
    + * different browsers.
      *
      * Example usage:
      * 
    @@ -31,41 +35,32 @@
      * goog.events.listen(myNode, 'mouseover', mouseHandler, true);
      * goog.events.unlisten(myNode, 'mouseover', mouseHandler, true);
      * goog.events.removeAll(myNode);
    - * goog.events.removeAll();
      * 
    * * in IE and event object patching] * - * @supported IE6+, FF1.5+, WebKit, Opera. * @see ../demos/events.html * @see ../demos/event-propagation.html * @see ../demos/stopevent.html */ - -// This uses 3 lookup tables/trees. -// listenerTree_ is a tree of type -> capture -> src uid -> [Listener] -// listeners_ is a map of key -> [Listener] -// -// The key is a field of the Listener. The Listener class also has the type, -// capture and the src so one can always trace back in the tree -// -// sources_: src uid -> [Listener] - +// IMPLEMENTATION NOTES: +// goog.events stores an auxiliary data structure on each EventTarget +// source being listened on. This allows us to take advantage of GC, +// having the data structure GC'd when the EventTarget is GC'd. This +// GC behavior is equivalent to using W3C DOM Events directly. goog.provide('goog.events'); +goog.provide('goog.events.CaptureSimulationMode'); goog.provide('goog.events.Key'); goog.provide('goog.events.ListenableType'); -goog.require('goog.array'); goog.require('goog.asserts'); -/** @suppress {extraRequire} */ goog.require('goog.debug.entryPointRegistry'); goog.require('goog.events.BrowserEvent'); goog.require('goog.events.BrowserFeature'); goog.require('goog.events.Listenable'); -goog.require('goog.events.Listener'); -goog.require('goog.object'); +goog.require('goog.events.ListenerMap'); /** @@ -82,72 +77,103 @@ goog.events.ListenableType; /** * Container for storing event listeners and their proxies + * + * TODO(user): Remove this when all external usage is + * purged. goog.events no longer use goog.events.listeners_ for + * anything meaningful. + * * @private {!Object.} */ goog.events.listeners_ = {}; /** - * The root of the listener tree + * Property name on a native event target for the listener map + * associated with the event target. + * @const * @private - * @type {Object} */ -goog.events.listenerTree_ = {}; +goog.events.LISTENER_MAP_PROP_ = 'closure_lm_' + ((Math.random() * 1e6) | 0); /** - * Lookup for mapping source UIDs to listeners. + * String used to prepend to IE event types. + * @const * @private - * @type {Object} */ -goog.events.sources_ = {}; +goog.events.onString_ = 'on'; /** - * String used to prepend to IE event types. Not a constant so that it is not - * inlined. - * @type {string} + * Map of computed "on" strings for IE event types. Caching + * this removes an extra object allocation in goog.events.listen which + * improves IE6 performance. + * @const + * @dict * @private */ -goog.events.onString_ = 'on'; +goog.events.onStringMap_ = {}; /** - * Map of computed on strings for IE event types. Caching this removes an extra - * object allocation in goog.events.listen which improves IE6 performance. - * @type {Object} - * @private + * @enum {number} Different capture simulation mode for IE8-. */ -goog.events.onStringMap_ = {}; +goog.events.CaptureSimulationMode = { + /** + * Does not perform capture simulation. Will asserts in IE8- when you + * add capture listeners. + */ + OFF_AND_FAIL: 0, + + /** + * Does not perform capture simulation, silently ignore capture + * listeners. + */ + OFF_AND_SILENT: 1, + + /** + * Performs capture simulation. + */ + ON: 2 +}; /** - * Separator used to split up the various parts of an event key, to help avoid - * the possibilities of collisions. - * @type {string} - * @private + * @define {number} The capture simulation mode for IE8-. By default, + * this is ON. + */ +goog.define('goog.events.CAPTURE_SIMULATION_MODE', 2); + + +/** + * Estimated count of total native listeners. + * @private {number} */ -goog.events.keySeparator_ = '_'; +goog.events.listenerCountEstimate_ = 0; /** - * Adds an event listener for a specific event on a DOM Node or an - * object that has implemented {@link goog.events.Listenable}. A - * listener can only be added once to an object and if it is added - * again the key for the listener is returned. Note that if the - * existing listener is a one-off listener (registered via - * listenOnce), it will no longer be a one-off listener after a call - * to listen(). + * Adds an event listener for a specific event on a native event + * target (such as a DOM element) or an object that has implemented + * {@link goog.events.Listenable}. A listener can only be added once + * to an object and if it is added again the key for the listener is + * returned. Note that if the existing listener is a one-off listener + * (registered via listenOnce), it will no longer be a one-off + * listener after a call to listen(). * - * @param {goog.events.ListenableType} src The node to listen to - * events on. - * @param {string|Array.} type Event type or array of event types. - * @param {Function|Object} listener Callback method, or an object with a - * handleEvent function. + * @param {EventTarget|goog.events.Listenable} src The node to listen + * to events on. + * @param {string|Array.| + * !goog.events.EventId.|!Array.>} + * type Event type or array of event types. + * @param {function(this:T, EVENTOBJ):?|{handleEvent:function(?):?}|null} + * listener Callback method, or an object with a handleEvent function. + * WARNING: passing an Object is now softly deprecated. * @param {boolean=} opt_capt Whether to fire in capture phase (defaults to * false). - * @param {Object=} opt_handler Element in whose scope to call the listener. + * @param {T=} opt_handler Element in whose scope to call the listener. * @return {goog.events.Key} Unique key for the listener. + * @template T,EVENTOBJ */ goog.events.listen = function(src, type, listener, opt_capt, opt_handler) { if (goog.isArray(type)) { @@ -157,33 +183,31 @@ goog.events.listen = function(src, type, listener, opt_capt, opt_handler) { return null; } - var listenableKey; - listener = goog.events.wrapListener_(listener); + listener = goog.events.wrapListener(listener); if (goog.events.Listenable.isImplementedBy(src)) { - listenableKey = src.listen( - /** @type {string} */ (type), listener, opt_capt, opt_handler); + return src.listen( + /** @type {string|!goog.events.EventId} */ (type), + listener, opt_capt, opt_handler); } else { - listenableKey = goog.events.listen_( + return goog.events.listen_( /** @type {EventTarget} */ (src), - type, listener, /* callOnce */ false, opt_capt, opt_handler); + /** @type {string|!goog.events.EventId} */ (type), + listener, /* callOnce */ false, opt_capt, opt_handler); } - - return listenableKey; }; /** - * Adds an event listener for a specific event on a DOM Node or an object that - * has implemented {@link goog.events.Listenable}. A listener can only be - * added once to an object and if it is added again the key for the listener - * is returned. + * Adds an event listener for a specific event on a native event + * target. A listener can only be added once to an object and if it + * is added again the key for the listener is returned. * * Note that a one-off listener will not change an existing listener, * if any. On the other hand a normal listener will change existing * one-off listener to become a normal listener. * * @param {EventTarget} src The node to listen to events on. - * @param {?string} type Event type or array of event types. + * @param {string|!goog.events.EventId} type Event type. * @param {!Function} listener Callback function. * @param {boolean} callOnce Whether the listener is a one-off * listener or otherwise. @@ -200,99 +224,58 @@ goog.events.listen_ = function( } var capture = !!opt_capt; - var map = goog.events.listenerTree_; - - if (!(type in map)) { - map[type] = {count_: 0, remaining_: 0}; + if (capture && !goog.events.BrowserFeature.HAS_W3C_EVENT_SUPPORT) { + if (goog.events.CAPTURE_SIMULATION_MODE == + goog.events.CaptureSimulationMode.OFF_AND_FAIL) { + goog.asserts.fail('Can not register capture listener in IE8-.'); + return null; + } else if (goog.events.CAPTURE_SIMULATION_MODE == + goog.events.CaptureSimulationMode.OFF_AND_SILENT) { + return null; + } } - map = map[type]; - if (!(capture in map)) { - map[capture] = {count_: 0, remaining_: 0}; - map.count_++; + var listenerMap = goog.events.getListenerMap_(src); + if (!listenerMap) { + src[goog.events.LISTENER_MAP_PROP_] = listenerMap = + new goog.events.ListenerMap(src); } - map = map[capture]; - - var srcUid = goog.getUid(src); - var listenerArray, listenerObj; - - // The remaining_ property is used to be able to short circuit the iteration - // of the event listeners. - // - // Increment the remaining event listeners to call even if this event might - // already have been fired. At this point we do not know if the event has - // been fired and it is too expensive to find out. By incrementing it we are - // guaranteed that we will not skip any event listeners. - map.remaining_++; - - // Do not use srcUid in map here since that will cast the number to a - // string which will allocate one string object. - if (!map[srcUid]) { - listenerArray = map[srcUid] = []; - map.count_++; - } else { - listenerArray = map[srcUid]; - // Ensure that the listeners do not already contain the current listener - for (var i = 0; i < listenerArray.length; i++) { - listenerObj = listenerArray[i]; - if (listenerObj.listener == listener && - listenerObj.handler == opt_handler) { - - // If this listener has been removed we should not return its key. It - // is OK that we create new listenerObj below since the removed one - // will be cleaned up later. - if (listenerObj.removed) { - break; - } - if (!callOnce) { - // Ensure that, if there is an existing callOnce listener, it is no - // longer a callOnce listener. - listenerArray[i].callOnce = false; - } + var listenerObj = listenerMap.add( + type, listener, callOnce, opt_capt, opt_handler); - // We already have this listener. Return its key. - return listenerArray[i]; - } - } + // If the listenerObj already has a proxy, it has been set up + // previously. We simply return. + if (listenerObj.proxy) { + return listenerObj; } var proxy = goog.events.getProxy(); - listenerObj = new goog.events.Listener( - listener, proxy, src, type, capture, opt_handler); - listenerObj.callOnce = callOnce; + listenerObj.proxy = proxy; proxy.src = src; proxy.listener = listenerObj; - listenerArray.push(listenerObj); - - if (!goog.events.sources_[srcUid]) { - goog.events.sources_[srcUid] = []; - } - goog.events.sources_[srcUid].push(listenerObj); - // Attach the proxy through the browser's API if (src.addEventListener) { - src.addEventListener(type, proxy, capture); + src.addEventListener(type.toString(), proxy, capture); } else { // The else above used to be else if (src.attachEvent) and then there was // another else statement that threw an exception warning the developer // they made a mistake. This resulted in an extra object allocation in IE6 // due to a wrapper object that had to be implemented around the element // and so was removed. - src.attachEvent(goog.events.getOnString_(type), proxy); + src.attachEvent(goog.events.getOnString_(type.toString()), proxy); } - var key = listenerObj.key; - goog.events.listeners_[key] = listenerObj; + goog.events.listenerCountEstimate_++; return listenerObj; }; /** * Helper function for returning a proxy function. - * @return {Function} A new or reused function object. + * @return {!Function} A new or reused function object. */ goog.events.getProxy = function() { var proxyCallbackFunction = goog.events.handleBrowserEvent_; @@ -316,9 +299,10 @@ goog.events.getProxy = function() { /** - * Adds an event listener for a specific event on a DomNode or an object that - * has implemented {@link goog.events.Listenable}. After the event has fired - * the event listener is removed from the target. + * Adds an event listener for a specific event on a native event + * target (such as a DOM element) or an object that has implemented + * {@link goog.events.Listenable}. After the event has fired the event + * listener is removed from the target. * * If an existing listener already exists, listenOnce will do * nothing. In particular, if the listener was previously registered @@ -327,13 +311,17 @@ goog.events.getProxy = function() { * one-off listener, listenOnce does not modify the listeners (it is * still a once listener). * - * @param {goog.events.ListenableType} src The node to listen to - * events on. - * @param {string|Array.} type Event type or array of event types. - * @param {Function|Object} listener Callback method. + * @param {EventTarget|goog.events.Listenable} src The node to listen + * to events on. + * @param {string|Array.| + * !goog.events.EventId.|!Array.>} + * type Event type or array of event types. + * @param {function(this:T, EVENTOBJ):?|{handleEvent:function(?):?}|null} + * listener Callback method. * @param {boolean=} opt_capt Fire in capture phase?. - * @param {Object=} opt_handler Element in whose scope to call the listener. + * @param {T=} opt_handler Element in whose scope to call the listener. * @return {goog.events.Key} Unique key for the listener. + * @template T,EVENTOBJ */ goog.events.listenOnce = function(src, type, listener, opt_capt, opt_handler) { if (goog.isArray(type)) { @@ -343,18 +331,17 @@ goog.events.listenOnce = function(src, type, listener, opt_capt, opt_handler) { return null; } - var listenableKey; - listener = goog.events.wrapListener_(listener); + listener = goog.events.wrapListener(listener); if (goog.events.Listenable.isImplementedBy(src)) { - listenableKey = src.listenOnce( - /** @type {string} */ (type), listener, opt_capt, opt_handler); + return src.listenOnce( + /** @type {string|!goog.events.EventId} */ (type), + listener, opt_capt, opt_handler); } else { - listenableKey = goog.events.listen_( + return goog.events.listen_( /** @type {EventTarget} */ (src), - type, listener, /* callOnce */ true, opt_capt, opt_handler); + /** @type {string|!goog.events.EventId} */ (type), + listener, /* callOnce */ true, opt_capt, opt_handler); } - - return listenableKey; }; @@ -363,13 +350,15 @@ goog.events.listenOnce = function(src, type, listener, opt_capt, opt_handler) { * object that has implemented {@link goog.events.Listenable}. A listener can * only be added once to an object. * - * @param {goog.events.ListenableType} src The target to listen to events on. + * @param {EventTarget|goog.events.Listenable} src The target to + * listen to events on. * @param {goog.events.EventWrapper} wrapper Event wrapper to use. - * @param {Function|Object} listener Callback method, or an object with a - * handleEvent function. + * @param {function(this:T, ?):?|{handleEvent:function(?):?}|null} listener + * Callback method, or an object with a handleEvent function. * @param {boolean=} opt_capt Whether to fire in capture phase (defaults to * false). - * @param {Object=} opt_handler Element in whose scope to call the listener. + * @param {T=} opt_handler Element in whose scope to call the listener. + * @template T */ goog.events.listenWithWrapper = function(src, wrapper, listener, opt_capt, opt_handler) { @@ -380,16 +369,19 @@ goog.events.listenWithWrapper = function(src, wrapper, listener, opt_capt, /** * Removes an event listener which was added with listen(). * - * @param {goog.events.ListenableType} src The target to stop + * @param {EventTarget|goog.events.Listenable} src The target to stop * listening to events on. - * @param {string|Array.} type The name of the event without the 'on' - * prefix. - * @param {Function|Object} listener The listener function to remove. + * @param {string|Array.| + * !goog.events.EventId.|!Array.>} + * type Event type or array of event types to unlisten to. + * @param {function(?):?|{handleEvent:function(?):?}|null} listener The + * listener function to remove. * @param {boolean=} opt_capt In DOM-compliant browsers, this determines * whether the listener is fired during the capture or bubble phase of the * event. * @param {Object=} opt_handler Element in whose scope to call the listener. * @return {?boolean} indicating whether the listener was there to remove. + * @template EVENTOBJ */ goog.events.unlisten = function(src, type, listener, opt_capt, opt_handler) { if (goog.isArray(type)) { @@ -399,24 +391,28 @@ goog.events.unlisten = function(src, type, listener, opt_capt, opt_handler) { return null; } - listener = goog.events.wrapListener_(listener); + listener = goog.events.wrapListener(listener); if (goog.events.Listenable.isImplementedBy(src)) { return src.unlisten( - /** @type {string} */ (type), listener, opt_capt, opt_handler); + /** @type {string|!goog.events.EventId} */ (type), + listener, opt_capt, opt_handler); } - var capture = !!opt_capt; - - var listenerArray = goog.events.getListeners_(src, type, capture); - if (!listenerArray) { + if (!src) { + // TODO(user): We should tighten the API to only accept + // non-null objects, or add an assertion here. return false; } - for (var i = 0; i < listenerArray.length; i++) { - if (listenerArray[i].listener == listener && - listenerArray[i].capture == capture && - listenerArray[i].handler == opt_handler) { - return goog.events.unlistenByKey(listenerArray[i]); + var capture = !!opt_capt; + var listenerMap = goog.events.getListenerMap_( + /** @type {EventTarget} */ (src)); + if (listenerMap) { + var listenerObj = listenerMap.getListener( + /** @type {string|!goog.events.EventId} */ (type), + listener, capture, opt_handler); + if (listenerObj) { + return goog.events.unlistenByKey(listenerObj); } } @@ -440,10 +436,7 @@ goog.events.unlistenByKey = function(key) { } var listener = /** @type {goog.events.ListenableKey} */ (key); - if (!listener) { - return false; - } - if (listener.removed) { + if (!listener || listener.removed) { return false; } @@ -454,47 +447,31 @@ goog.events.unlistenByKey = function(key) { var type = listener.type; var proxy = listener.proxy; - var capture = listener.capture; - if (src.removeEventListener) { - src.removeEventListener(type, proxy, capture); + src.removeEventListener(type, proxy, listener.capture); } else if (src.detachEvent) { src.detachEvent(goog.events.getOnString_(type), proxy); } - - var srcUid = goog.getUid(src); - - // In a perfect implementation we would decrement the remaining_ field here - // but then we would need to know if the listener has already been fired or - // not. We therefore skip doing this and in this uncommon case the entire - // ancestor chain will need to be traversed as before. - - // Remove from sources_ - if (goog.events.sources_[srcUid]) { - var sourcesArray = goog.events.sources_[srcUid]; - goog.array.remove(sourcesArray, listener); - if (sourcesArray.length == 0) { - delete goog.events.sources_[srcUid]; + goog.events.listenerCountEstimate_--; + + var listenerMap = goog.events.getListenerMap_( + /** @type {EventTarget} */ (src)); + // TODO(user): Try to remove this conditional and execute the + // first branch always. This should be safe. + if (listenerMap) { + listenerMap.removeByKey(listener); + if (listenerMap.getTypeCount() == 0) { + // Null the src, just because this is simple to do (and useful + // for IE <= 7). + listenerMap.src = null; + // We don't use delete here because IE does not allow delete + // on a window object. + src[goog.events.LISTENER_MAP_PROP_] = null; } + } else { + listener.markAsRemoved(); } - listener.markAsRemoved(); - - // There are some esoteric situations where the hash code of an object - // can change, and we won't be able to find the listenerArray anymore. - // For example, if you're listening on a window, and the user navigates to - // a different window, the UID will disappear. - // - // It should be impossible to ever find the original listenerArray, so it - // doesn't really matter if we can't clean it up in this case. - var listenerArray = goog.events.listenerTree_[type][capture][srcUid]; - if (listenerArray) { - listenerArray.needsCleanup_ = true; - goog.events.cleanUp_(type, capture, srcUid, listenerArray); - } - - delete goog.events.listeners_[listener.key]; - return true; }; @@ -502,10 +479,11 @@ goog.events.unlistenByKey = function(key) { /** * Removes an event listener which was added with listenWithWrapper(). * - * @param {goog.events.ListenableType} src The target to stop listening to - * events on. + * @param {EventTarget|goog.events.Listenable} src The target to stop + * listening to events on. * @param {goog.events.EventWrapper} wrapper Event wrapper to use. - * @param {Function|Object} listener The listener function to remove. + * @param {function(?):?|{handleEvent:function(?):?}|null} listener The + * listener function to remove. * @param {boolean=} opt_capt In DOM-compliant browsers, this determines * whether the listener is fired during the capture or bubble phase of the * event. @@ -517,79 +495,6 @@ goog.events.unlistenWithWrapper = function(src, wrapper, listener, opt_capt, }; -/** - * Cleans up goog.events internal data structure. This should be - * called by all implementations of goog.events.Listenable when - * removing listeners. - * - * TODO(user): Once we remove numeric key support from - * goog.events.listen and friend, we will be able to remove this - * requirement. - * - * @param {goog.events.ListenableKey} listenableKey The key to clean up. - */ -goog.events.cleanUp = function(listenableKey) { - delete goog.events.listeners_[listenableKey.key]; -}; - - -/** - * Cleans up the listener array as well as the listener tree - * @param {string} type The type of the event. - * @param {boolean} capture Whether to clean up capture phase listeners instead - * bubble phase listeners. - * @param {number} srcUid The unique ID of the source. - * @param {Array.} listenerArray The array being cleaned. - * @private - */ -goog.events.cleanUp_ = function(type, capture, srcUid, listenerArray) { - // The listener array gets locked during the dispatch phase so that removals - // of listeners during this phase does not screw up the indeces. This method - // is called after we have removed a listener as well as after the dispatch - // phase in case any listeners were removed. - if (!listenerArray.locked_) { // catches both 0 and not set - if (listenerArray.needsCleanup_) { - // Loop over the listener array and remove listeners that have removed set - // to true. This could have been done with filter or something similar but - // we want to change the array in place and we want to minimize - // allocations. Adding a listener during this phase adds to the end of the - // array so that works fine as long as the length is rechecked every in - // iteration. - for (var oldIndex = 0, newIndex = 0; - oldIndex < listenerArray.length; - oldIndex++) { - if (listenerArray[oldIndex].removed) { - continue; - } - if (oldIndex != newIndex) { - listenerArray[newIndex] = listenerArray[oldIndex]; - } - newIndex++; - } - listenerArray.length = newIndex; - - listenerArray.needsCleanup_ = false; - - // In case the length is now zero we release the object. - if (newIndex == 0) { - delete goog.events.listenerTree_[type][capture][srcUid]; - goog.events.listenerTree_[type][capture].count_--; - - if (goog.events.listenerTree_[type][capture].count_ == 0) { - delete goog.events.listenerTree_[type][capture]; - goog.events.listenerTree_[type].count_--; - } - - if (goog.events.listenerTree_[type].count_ == 0) { - delete goog.events.listenerTree_[type]; - } - } - - } - } -}; - - /** * Removes all listeners from an object. You can also optionally * remove listeners of a particular type. @@ -597,38 +502,42 @@ goog.events.cleanUp_ = function(type, capture, srcUid, listenerArray) { * @param {Object=} opt_obj Object to remove listeners from. Not * specifying opt_obj is now DEPRECATED (it used to remove all * registered listeners). - * @param {string=} opt_type Type of event to, default is all types. + * @param {string|!goog.events.EventId=} opt_type Type of event to remove. + * Default is all types. * @return {number} Number of listeners removed. */ goog.events.removeAll = function(opt_obj, opt_type) { - var count = 0; + // TODO(user): Change the type of opt_obj from Object= to + // !EventTarget|goog.events.Listenable). And replace this with an + // assertion. + if (!opt_obj) { + return 0; + } - var noObj = opt_obj == null; - var noType = opt_type == null; + if (goog.events.Listenable.isImplementedBy(opt_obj)) { + return opt_obj.removeAllListeners(opt_type); + } - if (!noObj) { - if (opt_obj && goog.events.Listenable.isImplementedBy(opt_obj)) { - return opt_obj.removeAllListeners(opt_type); - } + var listenerMap = goog.events.getListenerMap_( + /** @type {EventTarget} */ (opt_obj)); + if (!listenerMap) { + return 0; + } - var srcUid = goog.getUid(/** @type {Object} */ (opt_obj)); - if (goog.events.sources_[srcUid]) { - var sourcesArray = goog.events.sources_[srcUid]; - for (var i = sourcesArray.length - 1; i >= 0; i--) { - var listener = sourcesArray[i]; - if (noType || opt_type == listener.type) { - goog.events.unlistenByKey(listener); - count++; + var count = 0; + var typeStr = opt_type && opt_type.toString(); + for (var type in listenerMap.listeners) { + if (!typeStr || type == typeStr) { + // Clone so that we don't need to worry about unlistenByKey + // changing the content of the ListenerMap. + var listeners = listenerMap.listeners[type].concat(); + for (var i = 0; i < listeners.length; ++i) { + if (goog.events.unlistenByKey(listeners[i])) { + ++count; } } } - } else { - goog.object.forEach(goog.events.listeners_, function(listener) { - goog.events.unlistenByKey(listener); - count++; - }); } - return count; }; @@ -639,18 +548,12 @@ goog.events.removeAll = function(opt_obj, opt_type) { * elements). In particular, goog.events.Listenable and * goog.events.EventTarget listeners will NOT be removed. * @return {number} Number of listeners removed. + * @deprecated This doesn't do anything, now that Closure no longer + * stores a central listener registry. */ goog.events.removeAllNativeListeners = function() { - var count = 0; - goog.object.forEach(goog.events.listeners_, function(listener) { - var src = listener.src; - // Only remove the listener if it is not on custom event target. - if (!goog.events.Listenable.isImplementedBy(src)) { - goog.events.unlistenByKey(listener); - count++; - } - }); - return count; + goog.events.listenerCountEstimate_ = 0; + return 0; }; @@ -658,7 +561,7 @@ goog.events.removeAllNativeListeners = function() { * Gets the listeners for a given object, type and capture phase. * * @param {Object} obj Object to get listeners for. - * @param {string} type Event type. + * @param {string|!goog.events.EventId} type Event type. * @param {boolean} capture Capture phase?. * @return {Array.} Array of listener objects. */ @@ -666,35 +569,16 @@ goog.events.getListeners = function(obj, type, capture) { if (goog.events.Listenable.isImplementedBy(obj)) { return obj.getListeners(type, capture); } else { - return goog.events.getListeners_(obj, type, capture) || []; - } -}; - - -/** - * Gets the listeners for a given object, type and capture phase. - * - * @param {Object} obj Object to get listeners for. - * @param {?string} type Event type. - * @param {boolean} capture Capture phase?. - * @return {Array.?} Array of listener objects. - * Returns null if object has no listeners of that type. - * @private - */ -goog.events.getListeners_ = function(obj, type, capture) { - var map = goog.events.listenerTree_; - if (type in map) { - map = map[type]; - if (capture in map) { - map = map[capture]; - var objUid = goog.getUid(obj); - if (map[objUid]) { - return map[objUid]; - } + if (!obj) { + // TODO(user): We should tighten the API to accept + // !EventTarget|goog.events.Listenable, and add an assertion here. + return []; } - } - return null; + var listenerMap = goog.events.getListenerMap_( + /** @type {EventTarget} */ (obj)); + return listenerMap ? listenerMap.getListeners(type, capture) : []; + } }; @@ -702,39 +586,37 @@ goog.events.getListeners_ = function(obj, type, capture) { * Gets the goog.events.Listener for the event or null if no such listener is * in use. * - * @param {goog.events.ListenableType} src The target from which to get - * listeners. - * @param {?string} type The name of the event without the 'on' prefix. - * @param {Function|Object} listener The listener function to get. + * @param {EventTarget|goog.events.Listenable} src The target from + * which to get listeners. + * @param {?string|!goog.events.EventId.} type The type of the event. + * @param {function(EVENTOBJ):?|{handleEvent:function(?):?}|null} listener The + * listener function to get. * @param {boolean=} opt_capt In DOM-compliant browsers, this determines * whether the listener is fired during the * capture or bubble phase of the event. * @param {Object=} opt_handler Element in whose scope to call the listener. * @return {goog.events.ListenableKey} the found listener or null if not found. + * @template EVENTOBJ */ goog.events.getListener = function(src, type, listener, opt_capt, opt_handler) { + // TODO(user): Change type from ?string to string, or add assertion. + type = /** @type {string} */ (type); + listener = goog.events.wrapListener(listener); var capture = !!opt_capt; - - listener = goog.events.wrapListener_(listener); if (goog.events.Listenable.isImplementedBy(src)) { - return src.getListener( - /** @type {string} */ (type), listener, capture, opt_handler); + return src.getListener(type, listener, capture, opt_handler); } - var listenerArray = goog.events.getListeners_(src, type, capture); - if (listenerArray) { - for (var i = 0; i < listenerArray.length; i++) { - // If goog.events.unlistenByKey is called during an event dispatch - // then the listener array won't get cleaned up and there might be - // 'removed' listeners in the list. Ignore those. - if (!listenerArray[i].removed && - listenerArray[i].listener == listener && - listenerArray[i].capture == capture && - listenerArray[i].handler == opt_handler) { - // We already have this listener. Return its key. - return listenerArray[i]; - } - } + if (!src) { + // TODO(user): We should tighten the API to only accept + // non-null objects, or add an assertion here. + return null; + } + + var listenerMap = goog.events.getListenerMap_( + /** @type {EventTarget} */ (src)); + if (listenerMap) { + return listenerMap.getListener(type, listener, capture, opt_handler); } return null; }; @@ -745,8 +627,9 @@ goog.events.getListener = function(src, type, listener, opt_capt, opt_handler) { * specified signature. If either the type or capture parameters are * unspecified, the function will match on the remaining criteria. * - * @param {goog.events.ListenableType} obj Target to get listeners for. - * @param {string=} opt_type Event type. + * @param {EventTarget|goog.events.Listenable} obj Target to get + * listeners for. + * @param {string|!goog.events.EventId=} opt_type Event type. * @param {boolean=} opt_capture Whether to check for capture or bubble-phase * listeners. * @return {boolean} Whether an event target has one or more listeners matching @@ -757,32 +640,9 @@ goog.events.hasListener = function(obj, opt_type, opt_capture) { return obj.hasListener(opt_type, opt_capture); } - var objUid = goog.getUid(obj); - var listeners = goog.events.sources_[objUid]; - - if (listeners) { - var hasType = goog.isDef(opt_type); - var hasCapture = goog.isDef(opt_capture); - - if (hasType && hasCapture) { - // Lookup in the listener tree whether the specified listener exists. - var map = goog.events.listenerTree_[opt_type]; - return !!map && !!map[opt_capture] && objUid in map[opt_capture]; - - } else if (!(hasType || hasCapture)) { - // Simple check for whether the event target has any listeners at all. - return true; - - } else { - // Iterate through the listeners for the event target to find a match. - return goog.array.some(listeners, function(listener) { - return (hasType && listener.type == opt_type) || - (hasCapture && listener.capture == opt_capture); - }); - } - } - - return false; + var listenerMap = goog.events.getListenerMap_( + /** @type {EventTarget} */ (obj)); + return !!listenerMap && listenerMap.hasListener(opt_type, opt_capture); }; @@ -805,10 +665,10 @@ goog.events.expose = function(e) { /** - * Returns a string wth on prepended to the specified type. This is used for IE + * Returns a string with on prepended to the specified type. This is used for IE * which expects "on" to be prepended. This function caches the string in order * to avoid extra allocations in steady state. - * @param {string} type Event type strng. + * @param {string} type Event type. * @return {string} The type string with 'on' prepended. * @private */ @@ -824,7 +684,7 @@ goog.events.getOnString_ = function(type) { * Fires an object's listeners of a particular type and phase * * @param {Object} obj Object whose listeners to call. - * @param {string} type Event type. + * @param {string|!goog.events.EventId} type Event type. * @param {boolean} capture Which event phase. * @param {Object} eventObject Event object to be passed to listener. * @return {boolean} True if all listeners returned true else false. @@ -834,68 +694,42 @@ goog.events.fireListeners = function(obj, type, capture, eventObject) { return obj.fireListeners(type, capture, eventObject); } - var map = goog.events.listenerTree_; - if (type in map) { - map = map[type]; - if (capture in map) { - return goog.events.fireListeners_(map[capture], obj, type, - capture, eventObject); - } - } - return true; + return goog.events.fireListeners_(obj, type, capture, eventObject); }; /** * Fires an object's listeners of a particular type and phase. - * - * @param {Object} map Object with listeners in it. * @param {Object} obj Object whose listeners to call. - * @param {string} type Event type. + * @param {string|!goog.events.EventId} type Event type. * @param {boolean} capture Which event phase. * @param {Object} eventObject Event object to be passed to listener. * @return {boolean} True if all listeners returned true else false. * @private */ -goog.events.fireListeners_ = function(map, obj, type, capture, eventObject) { +goog.events.fireListeners_ = function(obj, type, capture, eventObject) { var retval = 1; - var objUid = goog.getUid(obj); - if (map[objUid]) { - var remaining = --map.remaining_; - var listenerArray = map[objUid]; - - // If locked_ is not set (and if already 0) initialize it to 1. - if (!listenerArray.locked_) { - listenerArray.locked_ = 1; - } else { - listenerArray.locked_++; - } - - try { - // Events added in the dispatch phase should not be dispatched in - // the current dispatch phase. They will be included in the next - // dispatch phase though. - var length = listenerArray.length; - for (var i = 0; i < length; i++) { + var listenerMap = goog.events.getListenerMap_( + /** @type {EventTarget} */ (obj)); + if (listenerMap) { + // TODO(user): Original code avoids array creation when there + // is no listener, so we do the same. If this optimization turns + // out to be not required, we can replace this with + // listenerMap.getListeners(type, capture) instead, which is simpler. + var listenerArray = listenerMap.listeners[type.toString()]; + if (listenerArray) { + listenerArray = listenerArray.concat(); + for (var i = 0; i < listenerArray.length; i++) { var listener = listenerArray[i]; // We might not have a listener if the listener was removed. - if (listener && !listener.removed) { + if (listener && listener.capture == capture && !listener.removed) { retval &= goog.events.fireListener(listener, eventObject) !== false; } } - } finally { - // Allow the count of targets remaining to increase (if perhaps we have - // added listeners) but do not allow it to decrease if we have reentered - // this method through a listener dispatching the same event type, - // resetting and exhausted the remaining count. - map.remaining_ = Math.max(remaining, map.remaining_); - listenerArray.locked_--; - goog.events.cleanUp_(type, capture, objUid, listenerArray); } } - return Boolean(retval); }; @@ -921,9 +755,13 @@ goog.events.fireListener = function(listener, eventObject) { /** * Gets the total number of listeners currently in the system. * @return {number} Number of listeners. + * @deprecated This returns estimated count, now that Closure no longer + * stores a central listener registry. We still return an estimation + * to keep existing listener-related tests passing. In the near future, + * this function will be removed. */ goog.events.getTotalListenerCount = function() { - return goog.object.getCount(goog.events.listeners_); + return goog.events.listenerCountEstimate_; }; @@ -973,9 +811,7 @@ goog.events.protectBrowserEventEntryPoint = function(errorHandler) { * @param {Event=} opt_evt Optional event object that gets passed in via the * native event handlers. * @return {boolean} Result of the event handler. - * @this {goog.events.EventTarget|Object} The object or Element that - * fired the event. TODO(user): Figure out why the type is - * so weird? + * @this {EventTarget} The object or Element that fired the event. * @private */ goog.events.handleBrowserEvent_ = function(listener, opt_evt) { @@ -983,92 +819,58 @@ goog.events.handleBrowserEvent_ = function(listener, opt_evt) { return true; } - var type = listener.type; - var map = goog.events.listenerTree_; - - if (!(type in map)) { - return true; - } - map = map[type]; - var retval, targetsMap; // Synthesize event propagation if the browser does not support W3C // event model. if (!goog.events.BrowserFeature.HAS_W3C_EVENT_SUPPORT) { var ieEvent = opt_evt || /** @type {Event} */ (goog.getObjectByName('window.event')); + var evt = new goog.events.BrowserEvent(ieEvent, this); + var retval = true; - // Check if we have any capturing event listeners for this type. - var hasCapture = true in map; - var hasBubble = false in map; - - if (hasCapture) { - if (goog.events.isMarkedIeEvent_(ieEvent)) { - return true; - } - - goog.events.markIeEvent_(ieEvent); - } - - var evt = new goog.events.BrowserEvent(); - // TODO(user): update @this for this function - evt.init(ieEvent, /** @type {EventTarget} */ (this)); + if (goog.events.CAPTURE_SIMULATION_MODE == + goog.events.CaptureSimulationMode.ON) { + // If we have not marked this event yet, we should perform capture + // simulation. + if (!goog.events.isMarkedIeEvent_(ieEvent)) { + goog.events.markIeEvent_(ieEvent); - retval = true; - try { - if (hasCapture) { var ancestors = []; - - for (var parent = evt.currentTarget; - parent; + for (var parent = evt.currentTarget; parent; parent = parent.parentNode) { ancestors.push(parent); } - targetsMap = map[true]; - targetsMap.remaining_ = targetsMap.count_; - - // Call capture listeners - for (var i = ancestors.length - 1; - !evt.propagationStopped_ && i >= 0 && targetsMap.remaining_; + // Fire capture listeners. + var type = listener.type; + for (var i = ancestors.length - 1; !evt.propagationStopped_ && i >= 0; i--) { evt.currentTarget = ancestors[i]; - retval &= goog.events.fireListeners_(targetsMap, ancestors[i], type, - true, evt); + retval &= goog.events.fireListeners_(ancestors[i], type, true, evt); } - if (hasBubble) { - targetsMap = map[false]; - targetsMap.remaining_ = targetsMap.count_; - - // Call bubble listeners - for (var i = 0; - !evt.propagationStopped_ && i < ancestors.length && - targetsMap.remaining_; - i++) { - evt.currentTarget = ancestors[i]; - retval &= goog.events.fireListeners_(targetsMap, ancestors[i], type, - false, evt); - } + // Fire bubble listeners. + // + // We can technically rely on IE to perform bubble event + // propagation. However, it turns out that IE fires events in + // opposite order of attachEvent registration, which broke + // some code and tests that rely on the order. (While W3C DOM + // Level 2 Events TR leaves the event ordering unspecified, + // modern browsers and W3C DOM Level 3 Events Working Draft + // actually specify the order as the registration order.) + for (var i = 0; !evt.propagationStopped_ && i < ancestors.length; i++) { + evt.currentTarget = ancestors[i]; + retval &= goog.events.fireListeners_(ancestors[i], type, false, evt); } - - } else { - // Bubbling, let IE handle the propagation. - retval = goog.events.fireListener(listener, evt); - } - - } finally { - if (ancestors) { - ancestors.length = 0; } + } else { + retval = goog.events.fireListener(listener, evt); } return retval; - } // IE + } - // Caught a non-IE DOM event. 1 additional argument which is the event object - var be = new goog.events.BrowserEvent( - opt_evt, /** @type {EventTarget} */ (this)); - retval = goog.events.fireListener(listener, be); - return retval; + // Otherwise, simply fire the listener. + return goog.events.fireListener( + listener, new goog.events.BrowserEvent(opt_evt, this)); }; @@ -1124,8 +926,7 @@ goog.events.isMarkedIeEvent_ = function(e) { /** * Counter to create unique event ids. - * @type {number} - * @private + * @private {number} */ goog.events.uniqueIdCounter_ = 0; @@ -1142,10 +943,24 @@ goog.events.getUniqueId = function(identifier) { }; +/** + * @param {EventTarget} src The source object. + * @return {goog.events.ListenerMap} A listener map for the given + * source object, or null if none exists. + * @private + */ +goog.events.getListenerMap_ = function(src) { + var listenerMap = src[goog.events.LISTENER_MAP_PROP_]; + // IE serializes the property as well (e.g. when serializing outer + // HTML). So we must check that the value is of the correct type. + return listenerMap instanceof goog.events.ListenerMap ? listenerMap : null; +}; + + /** * Expando property for listener function wrapper for Object with * handleEvent. - * @type {string} + * @const * @private */ goog.events.LISTENER_WRAPPER_PROP_ = '__closure_events_fn_' + @@ -1159,9 +974,8 @@ goog.events.LISTENER_WRAPPER_PROP_ = '__closure_events_fn_' + * calls obj.handleEvent. If the same listener is passed to this * function more than once, the same function is guaranteed to be * returned. - * @private */ -goog.events.wrapListener_ = function(listener) { +goog.events.wrapListener = function(listener) { goog.asserts.assert(listener, 'Listener can not be null.'); if (goog.isFunction(listener)) { diff --git a/third_party/closure/goog/events/eventtarget.js b/third_party/closure/goog/events/eventtarget.js index e1426c0eb6aae..c4f77b8d9337f 100644 --- a/third_party/closure/goog/events/eventtarget.js +++ b/third_party/closure/goog/events/eventtarget.js @@ -13,11 +13,14 @@ // limitations under the License. /** - * @fileoverview Implementation of EventTarget as defined by W3C DOM 2/3. + * @fileoverview A disposable implementation of a custom + * listenable/event target. See also: documentation for + * {@code goog.events.Listenable}. * * @author arv@google.com (Erik Arvidsson) [Original implementation] * @author pupius@google.com (Daniel Pupius) [Port to use goog.events] * @see ../demos/eventtarget.html + * @see goog.events.Listenable */ goog.provide('goog.events.EventTarget'); @@ -28,53 +31,37 @@ goog.require('goog.asserts'); goog.require('goog.events'); goog.require('goog.events.Event'); goog.require('goog.events.Listenable'); -goog.require('goog.events.Listener'); +goog.require('goog.events.ListenerMap'); goog.require('goog.object'); /** - * Inherit from this class to give your object the ability to dispatch events. - * Note that this class provides event sending behaviour, not event - * receiving behaviour: your object will be able to broadcast events, and other - * objects will be able to listen for those events using goog.events.listen(). + * An implementation of {@code goog.events.Listenable} with full W3C + * EventTarget-like support (capture/bubble mechanism, stopping event + * propagation, preventing default actions). * - *

    The name "EventTarget" reflects the fact that this class implements the - * - * EventTarget interface as defined by W3C DOM 2/3, with a few differences: - *

      - *
    • Event objects do not have to implement the Event interface. An object - * is treated as an event object if it has a 'type' property. - *
    • You can use a plain string instead of an event object; an event-like - * object will be created with the 'type' set to the string value. - *
    + * You may subclass this class to turn your class into a Listenable. * - *

    Unless propagation is stopped, an event dispatched by an EventTarget - * will bubble to the parent returned by getParentEventTarget. - * To set the parent, call setParentEventTarget or override - * getParentEventTarget in a subclass. Subclasses that don't - * support changing the parent should override the setter to throw an error. + * Unless propagation is stopped, an event dispatched by an + * EventTarget will bubble to the parent returned by + * {@code getParentEventTarget}. To set the parent, call + * {@code setParentEventTarget}. Subclasses that don't support + * changing the parent can override the setter to throw an error. * - *

    Example usage: + * Example usage: *

      *   var source = new goog.events.EventTarget();
    - *   function handleEvent(event) {
    - *     alert('Type: ' + e.type + '\nTarget: ' + e.target);
    + *   function handleEvent(e) {
    + *     alert('Type: ' + e.type + '; Target: ' + e.target);
      *   }
    - *   goog.events.listen(source, 'foo', handleEvent);
    + *   source.listen('foo', handleEvent);
    + *   // Or: goog.events.listen(source, 'foo', handleEvent);
      *   ...
    - *   source.dispatchEvent({type: 'foo'}); // will call handleEvent
    - *   // or source.dispatchEvent('foo');
    + *   source.dispatchEvent('foo');  // will call handleEvent
      *   ...
    - *   goog.events.unlisten(source, 'foo', handleEvent);
    - *
    - *   // You can also use the Listener interface:
    - *   var listener = {
    - *     handleEvent: function(event) {
    - *       ...
    - *     }
    - *   };
    - *   goog.events.listen(source, 'bar', listener);
    + *   source.unlisten('foo', handleEvent);
    + *   // Or: goog.events.unlisten(source, 'foo', handleEvent);
      * 
    * * @constructor @@ -86,17 +73,14 @@ goog.events.EventTarget = function() { /** * Maps of event type to an array of listeners. - * - * @type {Object.>} - * @private + * @private {!goog.events.ListenerMap} */ - this.eventTargetListeners_ = {}; + this.eventTargetListeners_ = new goog.events.ListenerMap(this); /** * The object to use for event.target. Useful when mixing in an * EventTarget to another object. - * @type {!Object} - * @private + * @private {!Object} */ this.actualEventTarget_ = this; }; @@ -115,7 +99,12 @@ goog.events.EventTarget.MAX_ANCESTORS_ = 1000; /** * Parent event target, used during event bubbling. - * @type {goog.events.EventTarget?} + * + * TODO(user): Change this to goog.events.Listenable. This + * currently breaks people who expect getParentEventTarget to return + * goog.events.EventTarget. + * + * @type {goog.events.EventTarget} * @private */ goog.events.EventTarget.prototype.parentEventTarget_ = null; @@ -124,8 +113,9 @@ goog.events.EventTarget.prototype.parentEventTarget_ = null; /** * Returns the parent of this event target to use for bubbling. * - * @return {goog.events.EventTarget} The parent EventTarget or null if there - * is no parent. + * @return {goog.events.EventTarget} The parent EventTarget or null if + * there is no parent. + * @override */ goog.events.EventTarget.prototype.getParentEventTarget = function() { return this.parentEventTarget_; @@ -133,9 +123,9 @@ goog.events.EventTarget.prototype.getParentEventTarget = function() { /** - * Sets the parent of this event target to use for bubbling. - * - * @param {goog.events.EventTarget?} parent Parent EventTarget (null if none). + * Sets the parent of this event target to use for capture/bubble + * mechanism. + * @param {goog.events.EventTarget} parent Parent listenable (null if none). */ goog.events.EventTarget.prototype.setParentEventTarget = function(parent) { this.parentEventTarget_ = parent; @@ -148,19 +138,18 @@ goog.events.EventTarget.prototype.setParentEventTarget = function(parent) { * using the same type then it will only be called once when the event is * dispatched. * - * Supported for legacy but use goog.events.listen(src, type, handler) instead. - * - * TODO(user): Deprecate this. - * * @param {string} type The type of the event to listen for. - * @param {Function|Object} handler The function to handle the event. The - * handler can also be an object that implements the handleEvent method - * which takes the event object as argument. + * @param {function(?):?|{handleEvent:function(?):?}|null} handler The function + * to handle the event. The handler can also be an object that implements + * the handleEvent method which takes the event object as argument. * @param {boolean=} opt_capture In DOM-compliant browsers, this determines * whether the listener is fired during the capture or bubble phase * of the event. * @param {Object=} opt_handlerScope Object in whose scope to call * the listener. + * @deprecated Use {@code #listen} instead, when possible. Otherwise, use + * {@code goog.events.listen} if you are passing Object + * (instead of Function) as handler. */ goog.events.EventTarget.prototype.addEventListener = function( type, handler, opt_capture, opt_handlerScope) { @@ -173,17 +162,18 @@ goog.events.EventTarget.prototype.addEventListener = function( * same object as the one added. If the handler has not been added then * nothing is done. * - * TODO(user): Deprecate this. - * * @param {string} type The type of the event to listen for. - * @param {Function|Object} handler The function to handle the event. The - * handler can also be an object that implements the handleEvent method - * which takes the event object as argument. + * @param {function(?):?|{handleEvent:function(?):?}|null} handler The function + * to handle the event. The handler can also be an object that implements + * the handleEvent method which takes the event object as argument. * @param {boolean=} opt_capture In DOM-compliant browsers, this determines * whether the listener is fired during the capture or bubble phase * of the event. * @param {Object=} opt_handlerScope Object in whose scope to call * the listener. + * @deprecated Use {@code #unlisten} instead, when possible. Otherwise, use + * {@code goog.events.unlisten} if you are passing Object + * (instead of Function) as handler. */ goog.events.EventTarget.prototype.removeEventListener = function( type, handler, opt_capture, opt_handlerScope) { @@ -213,17 +203,10 @@ goog.events.EventTarget.prototype.dispatchEvent = function(e) { /** - * Unattach listeners from this object. Classes that extend EventTarget may + * Removes listeners from this object. Classes that extend EventTarget may * need to override this method in order to remove references to DOM Elements - * and additional listeners, it should be something like this: - *
    - * MyClass.prototype.disposeInternal = function() {
    - *   MyClass.superClass_.disposeInternal.call(this);
    - *   // Dispose logic for MyClass
    - * };
    - * 
    + * and additional listeners. * @override - * @protected */ goog.events.EventTarget.prototype.disposeInternal = function() { goog.events.EventTarget.superClass_.disposeInternal.call(this); @@ -233,147 +216,65 @@ goog.events.EventTarget.prototype.disposeInternal = function() { }; -/** - * Asserts that the event target instance is initialized properly. - * @private - */ -goog.events.EventTarget.prototype.assertInitialized_ = function() { - goog.asserts.assert( - this.eventTargetListeners_, - 'Event target is not initialized. Did you call superclass ' + - '(goog.events.EventTarget) constructor?'); -}; - - /** @override */ goog.events.EventTarget.prototype.listen = function( type, listener, opt_useCapture, opt_listenerScope) { - return this.listenInternal_( - type, listener, false /* callOnce */, opt_useCapture, opt_listenerScope); + this.assertInitialized_(); + return this.eventTargetListeners_.add( + String(type), listener, false /* callOnce */, opt_useCapture, + opt_listenerScope); }; /** @override */ goog.events.EventTarget.prototype.listenOnce = function( type, listener, opt_useCapture, opt_listenerScope) { - return this.listenInternal_( - type, listener, true /* callOnce */, opt_useCapture, opt_listenerScope); -}; - - -/** - * Adds an event listener. A listener can only be added once to an - * object and if it is added again the key for the listener is - * returned. - * - * Note that a one-off listener will not change an existing listener, - * if any. On the other hand a normal listener will change existing - * one-off listener to become a normal listener. - * - * @param {string} type Event type to listen to. - * @param {!Function} listener Callback method. - * @param {boolean} callOnce Whether the listener is a one-off - * listener or otherwise. - * @param {boolean=} opt_useCapture Whether to fire in capture phase - * (defaults to false). - * @param {Object=} opt_listenerScope Object in whose scope to call the - * listener. - * @return {goog.events.ListenableKey} Unique key for the listener. - * @private - */ -goog.events.EventTarget.prototype.listenInternal_ = function( - type, listener, callOnce, opt_useCapture, opt_listenerScope) { - this.assertInitialized_(); - - var listenerArray = this.eventTargetListeners_[type] || - (this.eventTargetListeners_[type] = []); - - var listenerObj; - var index = goog.events.EventTarget.findListenerIndex_( - listenerArray, listener, opt_useCapture, opt_listenerScope); - if (index > -1) { - listenerObj = listenerArray[index]; - if (!callOnce) { - // Ensure that, if there is an existing callOnce listener, it is no - // longer a callOnce listener. - listenerObj.callOnce = false; - } - return listenerObj; - } - - listenerObj = new goog.events.Listener( - listener, null, this, type, !!opt_useCapture, opt_listenerScope); - listenerObj.callOnce = callOnce; - listenerArray.push(listenerObj); - - return listenerObj; + return this.eventTargetListeners_.add( + String(type), listener, true /* callOnce */, opt_useCapture, + opt_listenerScope); }; /** @override */ goog.events.EventTarget.prototype.unlisten = function( type, listener, opt_useCapture, opt_listenerScope) { - if (!(type in this.eventTargetListeners_)) { - return false; - } - - var listenerArray = this.eventTargetListeners_[type]; - var index = goog.events.EventTarget.findListenerIndex_( - listenerArray, listener, opt_useCapture, opt_listenerScope); - if (index > -1) { - var listenerObj = listenerArray[index]; - goog.events.cleanUp(listenerObj); - listenerObj.removed = true; - return goog.array.removeAt(listenerArray, index); - } - return false; + return this.eventTargetListeners_.remove( + String(type), listener, opt_useCapture, opt_listenerScope); }; /** @override */ goog.events.EventTarget.prototype.unlistenByKey = function(key) { - var type = key.type; - if (!(type in this.eventTargetListeners_)) { - return false; - } - - var removed = goog.array.remove(this.eventTargetListeners_[type], key); - if (removed) { - goog.events.cleanUp(key); - key.removed = true; - } - return removed; + return this.eventTargetListeners_.removeByKey(key); }; /** @override */ -goog.events.EventTarget.prototype.removeAllListeners = function( - opt_type, opt_capture) { - var count = 0; - for (var type in this.eventTargetListeners_) { - if (!opt_type || type == opt_type) { - var listenerArray = this.eventTargetListeners_[type]; - for (var i = 0; i < listenerArray.length; i++) { - ++count; - goog.events.cleanUp(listenerArray[i]); - listenerArray[i].removed = true; - } - listenerArray.length = 0; - } +goog.events.EventTarget.prototype.removeAllListeners = function(opt_type) { + // TODO(user): Previously, removeAllListeners can be called on + // uninitialized EventTarget, so we preserve that behavior. We + // should remove this when usages that rely on that fact are purged. + if (!this.eventTargetListeners_) { + return 0; } - return count; + return this.eventTargetListeners_.removeAll(opt_type); }; /** @override */ goog.events.EventTarget.prototype.fireListeners = function( type, capture, eventObject) { - if (!(type in this.eventTargetListeners_)) { + // TODO(user): Original code avoids array creation when there + // is no listener, so we do the same. If this optimization turns + // out to be not required, we can replace this with + // getListeners(type, capture) instead, which is simpler. + var listenerArray = this.eventTargetListeners_.listeners[String(type)]; + if (!listenerArray) { return true; } + listenerArray = goog.array.clone(listenerArray); var rv = true; - var listenerArray = goog.array.clone(this.eventTargetListeners_[type]); for (var i = 0; i < listenerArray.length; ++i) { var listener = listenerArray[i]; // We might not have a listener if the listener was removed. @@ -394,50 +295,23 @@ goog.events.EventTarget.prototype.fireListeners = function( /** @override */ goog.events.EventTarget.prototype.getListeners = function(type, capture) { - var listenerArray = this.eventTargetListeners_[type]; - var rv = []; - if (listenerArray) { - for (var i = 0; i < listenerArray.length; ++i) { - var listenerObj = listenerArray[i]; - if (listenerObj.capture == capture) { - rv.push(listenerObj); - } - } - } - return rv; + return this.eventTargetListeners_.getListeners(String(type), capture); }; /** @override */ goog.events.EventTarget.prototype.getListener = function( type, listener, capture, opt_listenerScope) { - var listenerArray = this.eventTargetListeners_[type]; - var i = -1; - if (listenerArray) { - i = goog.events.EventTarget.findListenerIndex_( - listenerArray, listener, capture, opt_listenerScope); - } - return i > -1 ? listenerArray[i] : null; + return this.eventTargetListeners_.getListener( + String(type), listener, capture, opt_listenerScope); }; /** @override */ goog.events.EventTarget.prototype.hasListener = function( opt_type, opt_capture) { - var hasType = goog.isDef(opt_type); - var hasCapture = goog.isDef(opt_capture); - - return goog.object.some( - this.eventTargetListeners_, function(listenersArray, type) { - for (var i = 0; i < listenersArray.length; ++i) { - if ((!hasType || listenersArray[i].type == opt_type) && - (!hasCapture || listenersArray[i].capture == opt_capture)) { - return true; - } - } - - return false; - }); + var id = goog.isDef(opt_type) ? String(opt_type) : undefined; + return this.eventTargetListeners_.hasListener(id, opt_capture); }; @@ -452,12 +326,21 @@ goog.events.EventTarget.prototype.setTargetForTesting = function(target) { }; +/** + * Asserts that the event target instance is initialized properly. + * @private + */ +goog.events.EventTarget.prototype.assertInitialized_ = function() { + goog.asserts.assert( + this.eventTargetListeners_, + 'Event target is not initialized. Did you call the superclass ' + + '(goog.events.EventTarget) constructor?'); +}; + + /** * Dispatches the given event on the ancestorsTree. * - * TODO(user): Look for a way to reuse this logic in - * goog.events, if possible. - * * @param {!Object} target The target to dispatch on. * @param {goog.events.Event|Object|string} e The event object. * @param {Array.=} opt_ancestorsTree The ancestors @@ -513,28 +396,3 @@ goog.events.EventTarget.dispatchEventInternal_ = function( return rv; }; - - -/** - * Finds the index of a matching goog.events.Listener in the given - * listenerArray. - * @param {!Array.} listenerArray Array of listener. - * @param {!Function} listener The listener function. - * @param {boolean=} opt_useCapture The capture flag for the listener. - * @param {Object=} opt_listenerScope The listener scope. - * @return {number} The index of the matching listener within the - * listenerArray. - * @private - */ -goog.events.EventTarget.findListenerIndex_ = function( - listenerArray, listener, opt_useCapture, opt_listenerScope) { - for (var i = 0; i < listenerArray.length; ++i) { - var listenerObj = listenerArray[i]; - if (listenerObj.listener == listener && - listenerObj.capture == !!opt_useCapture && - listenerObj.handler == opt_listenerScope) { - return i; - } - } - return -1; -}; diff --git a/third_party/closure/goog/events/eventtargettester.js b/third_party/closure/goog/events/eventtargettester.js index 6243db905527f..4d9cec204d4b8 100644 --- a/third_party/closure/goog/events/eventtargettester.js +++ b/third_party/closure/goog/events/eventtargettester.js @@ -34,6 +34,8 @@ goog.require('goog.testing.recordFunction'); /** * Setup step for the test functions. This needs to be called from the * test setUp. + * @param {function():!goog.events.Listenable} listenableFactoryFn Function + * that will return a new Listenable instance each time it is called. * @param {Function} listenFn Function that, given the same signature * as goog.events.listen, will add listener to the given event * target. @@ -71,10 +73,12 @@ goog.require('goog.testing.recordFunction'); * Object is supported. */ goog.events.eventTargetTester.setUp = function( + listenableFactoryFn, listenFn, unlistenFn, unlistenByKeyFn, listenOnceFn, dispatchEventFn, removeAllFn, getListenersFn, getListenerFn, hasListenerFn, listenKeyType, unlistenFnReturnType, objectListenerSupported) { + listenableFactory = listenableFactoryFn; listen = listenFn; unlisten = unlistenFn; unlistenByKey = unlistenByKeyFn; @@ -95,7 +99,7 @@ goog.events.eventTargetTester.setUp = function( eventTargets = []; for (i = 0; i < goog.events.eventTargetTester.MAX_; i++) { - eventTargets[i] = new goog.events.EventTarget(); + eventTargets[i] = listenableFactory(); } }; @@ -193,6 +197,7 @@ var eventTargets, listeners; * Custom event object for testing. * @constructor * @extends {goog.events.Event} + * @final */ var TestEvent = function() { goog.base(this, EventType.A); @@ -383,6 +388,9 @@ function testDispatchEventWithCustomEventObject() { function testDisposingEventTargetRemovesListeners() { + if (!(listenableFactory() instanceof goog.events.EventTarget)) { + return; + } listen(eventTargets[0], EventType.A, listeners[0]); goog.dispose(eventTargets[0]); dispatchEvent(eventTargets[0], EventType.A); @@ -927,6 +935,31 @@ function testRemoveAll() { } +function testRemoveAllCallsMarkAsRemoved() { + if (!removeAll) { + return; + } + + var key0 = listen(eventTargets[0], EventType.A, listeners[0]); + var key1 = listen(eventTargets[1], EventType.A, listeners[1]); + + assertNotNullNorUndefined(key0.listener); + assertFalse(key0.removed); + assertNotNullNorUndefined(key1.listener); + assertFalse(key1.removed); + + assertEquals(1, removeAll(eventTargets[0])); + assertNull(key0.listener); + assertTrue(key0.removed); + assertNotNullNorUndefined(key1.listener); + assertFalse(key1.removed); + + assertEquals(1, removeAll(eventTargets[1])); + assertNull(key1.listener); + assertTrue(key1.removed); +} + + function testGetListeners() { if (!getListeners) { return; @@ -993,6 +1026,7 @@ function testFiringEventBeforeDisposeInternalWorks() { /** * @extends {goog.events.EventTarget} * @constructor + * @final */ var MockTarget = function() { goog.base(this); @@ -1016,7 +1050,7 @@ function testFiringEventBeforeDisposeInternalWorks() { function testLoopDetection() { - var target = new goog.events.EventTarget(); + var target = listenableFactory(); target.setParentEventTarget(target); try { diff --git a/third_party/closure/goog/events/eventtype.js b/third_party/closure/goog/events/eventtype.js index 06fcb41ad4e53..3f9e5fd57f231 100644 --- a/third_party/closure/goog/events/eventtype.js +++ b/third_party/closure/goog/events/eventtype.js @@ -25,6 +25,20 @@ goog.provide('goog.events.EventType'); goog.require('goog.userAgent'); +/** + * Returns a prefixed event name for the current browser. + * @param {string} eventName The name of the event. + * @return {string} The prefixed event name. + * @suppress {missingRequire|missingProvide} + * @private + */ +goog.events.getVendorPrefixedName_ = function(eventName) { + return goog.userAgent.WEBKIT ? 'webkit' + eventName : + (goog.userAgent.OPERA ? 'o' + eventName.toLowerCase() : + eventName.toLowerCase()); +}; + + /** * Constants for event names. * @enum {string} @@ -38,6 +52,10 @@ goog.events.EventType = { MOUSEOVER: 'mouseover', MOUSEOUT: 'mouseout', MOUSEMOVE: 'mousemove', + MOUSEENTER: 'mouseenter', + MOUSELEAVE: 'mouseleave', + // Select start is non-standard. + // See http://msdn.microsoft.com/en-us/library/ie/ms536969(v=vs.85).aspx. SELECTSTART: 'selectstart', // IE, Safari, Chrome // Key events @@ -84,12 +102,14 @@ goog.events.EventType = { // Misc BEFOREUNLOAD: 'beforeunload', + CONSOLEMESSAGE: 'consolemessage', CONTEXTMENU: 'contextmenu', DOMCONTENTLOADED: 'DOMContentLoaded', ERROR: 'error', HELP: 'help', LOAD: 'load', LOSECAPTURE: 'losecapture', + ORIENTATIONCHANGE: 'orientationchange', READYSTATECHANGE: 'readystatechange', RESIZE: 'resize', SCROLL: 'scroll', @@ -122,13 +142,35 @@ goog.events.EventType = { MESSAGE: 'message', CONNECT: 'connect', + // CSS animation events. + /** @suppress {missingRequire} */ + ANIMATIONSTART: goog.events.getVendorPrefixedName_('AnimationStart'), + /** @suppress {missingRequire} */ + ANIMATIONEND: goog.events.getVendorPrefixedName_('AnimationEnd'), + /** @suppress {missingRequire} */ + ANIMATIONITERATION: goog.events.getVendorPrefixedName_('AnimationIteration'), + // CSS transition events. Based on the browser support described at: // https://developer.mozilla.org/en/css/css_transitions#Browser_compatibility - TRANSITIONEND: goog.userAgent.WEBKIT ? 'webkitTransitionEnd' : - (goog.userAgent.OPERA ? 'oTransitionEnd' : 'transitionend'), + /** @suppress {missingRequire} */ + TRANSITIONEND: goog.events.getVendorPrefixedName_('TransitionEnd'), + + // W3C Pointer Events + // http://www.w3.org/TR/pointerevents/ + POINTERDOWN: 'pointerdown', + POINTERUP: 'pointerup', + POINTERCANCEL: 'pointercancel', + POINTERMOVE: 'pointermove', + POINTEROVER: 'pointerover', + POINTEROUT: 'pointerout', + POINTERENTER: 'pointerenter', + POINTERLEAVE: 'pointerleave', + GOTPOINTERCAPTURE: 'gotpointercapture', + LOSTPOINTERCAPTURE: 'lostpointercapture', // IE specific events. - // See http://msdn.microsoft.com/en-us/library/ie/hh673557(v=vs.85).aspx + // See http://msdn.microsoft.com/en-us/library/ie/hh772103(v=vs.85).aspx + // Note: these events will be supplanted in IE11. MSGESTURECHANGE: 'MSGestureChange', MSGESTUREEND: 'MSGestureEnd', MSGESTUREHOLD: 'MSGestureHold', @@ -139,14 +181,45 @@ goog.events.EventType = { MSLOSTPOINTERCAPTURE: 'MSLostPointerCapture', MSPOINTERCANCEL: 'MSPointerCancel', MSPOINTERDOWN: 'MSPointerDown', + MSPOINTERENTER: 'MSPointerEnter', + MSPOINTERHOVER: 'MSPointerHover', + MSPOINTERLEAVE: 'MSPointerLeave', MSPOINTERMOVE: 'MSPointerMove', - MSPOINTEROVER: 'MSPointerOver', MSPOINTEROUT: 'MSPointerOut', + MSPOINTEROVER: 'MSPointerOver', MSPOINTERUP: 'MSPointerUp', // Native IMEs/input tools events. TEXTINPUT: 'textinput', COMPOSITIONSTART: 'compositionstart', COMPOSITIONUPDATE: 'compositionupdate', - COMPOSITIONEND: 'compositionend' + COMPOSITIONEND: 'compositionend', + + // Webview tag events + // See http://developer.chrome.com/dev/apps/webview_tag.html + EXIT: 'exit', + LOADABORT: 'loadabort', + LOADCOMMIT: 'loadcommit', + LOADREDIRECT: 'loadredirect', + LOADSTART: 'loadstart', + LOADSTOP: 'loadstop', + RESPONSIVE: 'responsive', + SIZECHANGED: 'sizechanged', + UNRESPONSIVE: 'unresponsive', + + // HTML5 Page Visibility API. See details at + // {@code goog.labs.dom.PageVisibilityMonitor}. + VISIBILITYCHANGE: 'visibilitychange', + + // LocalStorage event. + STORAGE: 'storage', + + // DOM Level 2 mutation events (deprecated). + DOMSUBTREEMODIFIED: 'DOMSubtreeModified', + DOMNODEINSERTED: 'DOMNodeInserted', + DOMNODEREMOVED: 'DOMNodeRemoved', + DOMNODEREMOVEDFROMDOCUMENT: 'DOMNodeRemovedFromDocument', + DOMNODEINSERTEDINTODOCUMENT: 'DOMNodeInsertedIntoDocument', + DOMATTRMODIFIED: 'DOMAttrModified', + DOMCHARACTERDATAMODIFIED: 'DOMCharacterDataModified' }; diff --git a/third_party/closure/goog/events/eventwrapper.js b/third_party/closure/goog/events/eventwrapper.js index aedfeaa256662..158177425435c 100644 --- a/third_party/closure/goog/events/eventwrapper.js +++ b/third_party/closure/goog/events/eventwrapper.js @@ -36,8 +36,8 @@ goog.events.EventWrapper = function() { * once to an object. * * @param {goog.events.ListenableType} src The node to listen to events on. - * @param {Function|Object} listener Callback method, or an object with a - * handleEvent function. + * @param {function(?):?|{handleEvent:function(?):?}|null} listener Callback + * method, or an object with a handleEvent function. * @param {boolean=} opt_capt Whether to fire in capture phase (defaults to * false). * @param {Object=} opt_scope Element in whose scope to call the listener. @@ -53,8 +53,8 @@ goog.events.EventWrapper.prototype.listen = function(src, listener, opt_capt, * Removes an event listener added using goog.events.EventWrapper.listen. * * @param {goog.events.ListenableType} src The node to remove listener from. - * @param {Function|Object} listener Callback method, or an object with a - * handleEvent function. + * @param {function(?):?|{handleEvent:function(?):?}|null} listener Callback + * method, or an object with a handleEvent function. * @param {boolean=} opt_capt Whether to fire in capture phase (defaults to * false). * @param {Object=} opt_scope Element in whose scope to call the listener. diff --git a/third_party/closure/goog/events/filedrophandler.js b/third_party/closure/goog/events/filedrophandler.js index be6ea2c9c7469..5395a51c5669d 100644 --- a/third_party/closure/goog/events/filedrophandler.js +++ b/third_party/closure/goog/events/filedrophandler.js @@ -23,13 +23,13 @@ goog.provide('goog.events.FileDropHandler'); goog.provide('goog.events.FileDropHandler.EventType'); goog.require('goog.array'); -goog.require('goog.debug.Logger'); goog.require('goog.dom'); goog.require('goog.events'); goog.require('goog.events.BrowserEvent'); goog.require('goog.events.EventHandler'); goog.require('goog.events.EventTarget'); goog.require('goog.events.EventType'); +goog.require('goog.log'); @@ -43,13 +43,14 @@ goog.require('goog.events.EventType'); * area outside the {@code element}. Default false. * @constructor * @extends {goog.events.EventTarget} + * @final */ goog.events.FileDropHandler = function(element, opt_preventDropOutside) { goog.events.EventTarget.call(this); /** * Handler for drag/drop events. - * @type {!goog.events.EventHandler} + * @type {!goog.events.EventHandler.} * @private */ this.eventHandler_ = new goog.events.EventHandler(this); @@ -101,11 +102,11 @@ goog.events.FileDropHandler.prototype.dndContainsFiles_ = false; /** * A logger, used to help us debug the algorithm. - * @type {goog.debug.Logger} + * @type {goog.log.Logger} * @private */ goog.events.FileDropHandler.prototype.logger_ = - goog.debug.Logger.getLogger('goog.events.FileDropHandler'); + goog.log.getLogger('goog.events.FileDropHandler'); /** @@ -130,7 +131,7 @@ goog.events.FileDropHandler.prototype.disposeInternal = function() { * @private */ goog.events.FileDropHandler.prototype.dispatch_ = function(e) { - this.logger_.fine('Firing DROP event...'); + goog.log.fine(this.logger_, 'Firing DROP event...'); var event = new goog.events.BrowserEvent(e.getBrowserEvent()); event.type = goog.events.FileDropHandler.EventType.DROP; this.dispatchEvent(event); @@ -143,8 +144,8 @@ goog.events.FileDropHandler.prototype.dispatch_ = function(e) { * @private */ goog.events.FileDropHandler.prototype.onDocDragEnter_ = function(e) { - this.logger_.finer('"' + e.target.id + '" (' + e.target + ') dispatched: ' + - e.type); + goog.log.log(this.logger_, goog.log.Level.FINER, + '"' + e.target.id + '" (' + e.target + ') dispatched: ' + e.type); var dt = e.getBrowserEvent().dataTransfer; // Check whether the drag event contains files. this.dndContainsFiles_ = !!(dt && @@ -157,7 +158,8 @@ goog.events.FileDropHandler.prototype.onDocDragEnter_ = function(e) { // Prevent default actions. e.preventDefault(); } - this.logger_.finer('dndContainsFiles_: ' + this.dndContainsFiles_); + goog.log.log(this.logger_, goog.log.Level.FINER, + 'dndContainsFiles_: ' + this.dndContainsFiles_); }; @@ -167,8 +169,8 @@ goog.events.FileDropHandler.prototype.onDocDragEnter_ = function(e) { * @private */ goog.events.FileDropHandler.prototype.onDocDragOver_ = function(e) { - this.logger_.finest('"' + e.target.id + '" (' + e.target + ') dispatched: ' + - e.type); + goog.log.log(this.logger_, goog.log.Level.FINEST, + '"' + e.target.id + '" (' + e.target + ') dispatched: ' + e.type); if (this.dndContainsFiles_) { // Prevent default actions. e.preventDefault(); @@ -185,8 +187,8 @@ goog.events.FileDropHandler.prototype.onDocDragOver_ = function(e) { * @private */ goog.events.FileDropHandler.prototype.onElemDragOver_ = function(e) { - this.logger_.finest('"' + e.target.id + '" (' + e.target + ') dispatched: ' + - e.type); + goog.log.log(this.logger_, goog.log.Level.FINEST, + '"' + e.target.id + '" (' + e.target + ') dispatched: ' + e.type); if (this.dndContainsFiles_) { // Prevent default actions and stop the event from propagating further to // the document. Both lines are needed! (See comment above). @@ -206,8 +208,8 @@ goog.events.FileDropHandler.prototype.onElemDragOver_ = function(e) { * @private */ goog.events.FileDropHandler.prototype.onElemDrop_ = function(e) { - this.logger_.finer('"' + e.target.id + '" (' + e.target + ') dispatched: ' + - e.type); + goog.log.log(this.logger_, goog.log.Level.FINER, + '"' + e.target.id + '" (' + e.target + ') dispatched: ' + e.type); // If the drag and drop event contains files. if (this.dndContainsFiles_) { // Prevent default actions and stop the event from propagating further to diff --git a/third_party/closure/goog/events/focushandler.js b/third_party/closure/goog/events/focushandler.js index a4fc9332abfba..f4e1000b3c76e 100644 --- a/third_party/closure/goog/events/focushandler.js +++ b/third_party/closure/goog/events/focushandler.js @@ -38,6 +38,7 @@ goog.require('goog.userAgent'); * @param {Element|Document} element The node to listen on. * @constructor * @extends {goog.events.EventTarget} + * @final */ goog.events.FocusHandler = function(element) { goog.events.EventTarget.call(this); diff --git a/third_party/closure/goog/events/imehandler.js b/third_party/closure/goog/events/imehandler.js index 238b7903a5263..68b38a295b9e5 100644 --- a/third_party/closure/goog/events/imehandler.js +++ b/third_party/closure/goog/events/imehandler.js @@ -57,9 +57,10 @@ goog.require('goog.userAgent'); * @param {Element} el The element to listen on. * @extends {goog.events.EventTarget} * @constructor + * @final */ goog.events.ImeHandler = function(el) { - goog.base(this); + goog.events.ImeHandler.base(this, 'constructor'); /** * The element to listen on. @@ -71,14 +72,14 @@ goog.events.ImeHandler = function(el) { /** * Tracks the keyup event only, because it has a different life-cycle from * other events. - * @type {goog.events.EventHandler} + * @type {goog.events.EventHandler.} * @private */ this.keyUpHandler_ = new goog.events.EventHandler(this); /** * Tracks all the browser events. - * @type {goog.events.EventHandler} + * @type {goog.events.EventHandler.} * @private */ this.handler_ = new goog.events.EventHandler(this); @@ -123,9 +124,10 @@ goog.events.ImeHandler.EventType = { * @param {goog.events.BrowserEvent} reason The trigger for this event. * @constructor * @extends {goog.events.Event} + * @final */ goog.events.ImeHandler.Event = function(type, reason) { - goog.base(this, type); + goog.events.ImeHandler.Event.base(this, 'constructor', type); /** * The event that triggered this. @@ -359,5 +361,5 @@ goog.events.ImeHandler.prototype.disposeInternal = function() { this.handler_.dispose(); this.keyUpHandler_.dispose(); this.el_ = null; - goog.base(this, 'disposeInternal'); + goog.events.ImeHandler.base(this, 'disposeInternal'); }; diff --git a/third_party/closure/goog/events/inputhandler.js b/third_party/closure/goog/events/inputhandler.js index a910183e9d1c6..4e60ab8cb3f3c 100644 --- a/third_party/closure/goog/events/inputhandler.js +++ b/third_party/closure/goog/events/inputhandler.js @@ -57,7 +57,7 @@ goog.require('goog.userAgent'); * @extends {goog.events.EventTarget} */ goog.events.InputHandler = function(element) { - goog.base(this); + goog.events.InputHandler.base(this, 'constructor'); /** * The element that you want to listen for input events on. @@ -80,7 +80,7 @@ goog.events.InputHandler = function(element) { element.tagName == 'TEXTAREA'); /** - * @type {goog.events.EventHandler} + * @type {goog.events.EventHandler.} * @private */ this.eventHandler_ = new goog.events.EventHandler(this); @@ -125,6 +125,14 @@ goog.events.InputHandler.prototype.timer_ = null; */ goog.events.InputHandler.prototype.handleEvent = function(e) { if (e.type == 'input') { + // http://stackoverflow.com/questions/18389732/changing-placeholder-triggers-input-event-in-ie-10 + // IE 10+ fires an input event when there are inputs with placeholders. + // It fires the event with keycode 0, so if we detect it we don't + // propagate the input event. + if (goog.userAgent.IE && goog.userAgent.isVersionOrHigher(10) && + e.keyCode == 0 && e.charCode == 0) { + return; + } // This event happens after all the other events we listen to, so cancel // an asynchronous event dispatch if we have it queued up. Otherwise, we // will end up firing an extra event. @@ -194,7 +202,7 @@ goog.events.InputHandler.prototype.cancelTimerIfSet_ = function() { /** * Creates an input event from the browser event. * @param {goog.events.BrowserEvent} be A browser event. - * @return {goog.events.BrowserEvent} An input event. + * @return {!goog.events.BrowserEvent} An input event. * @private */ goog.events.InputHandler.prototype.createInputEvent_ = function(be) { @@ -206,7 +214,7 @@ goog.events.InputHandler.prototype.createInputEvent_ = function(be) { /** @override */ goog.events.InputHandler.prototype.disposeInternal = function() { - goog.base(this, 'disposeInternal'); + goog.events.InputHandler.base(this, 'disposeInternal'); this.eventHandler_.dispose(); this.cancelTimerIfSet_(); delete this.element_; diff --git a/third_party/closure/goog/events/keycodes.js b/third_party/closure/goog/events/keycodes.js index 53126a6b94329..14e69073978f4 100644 --- a/third_party/closure/goog/events/keycodes.js +++ b/third_party/closure/goog/events/keycodes.js @@ -69,6 +69,7 @@ goog.events.KeyCodes = { NINE: 57, FF_SEMICOLON: 59, // Firefox (Gecko) fires this for semicolon instead of 186 FF_EQUALS: 61, // Firefox (Gecko) fires this for equals instead of 187 + FF_DASH: 173, // Firefox (Gecko) fires this for dash instead of 189 QUESTION_MARK: 63, // needs localization A: 65, B: 66, @@ -147,6 +148,8 @@ goog.events.KeyCodes = { CLOSE_SQUARE_BRACKET: 221, // needs localization WIN_KEY: 224, MAC_FF_META: 224, // Firefox (Gecko) fires this for the meta key instead of 91 + MAC_WK_CMD_LEFT: 91, // WebKit Left Command key fired, same as META + MAC_WK_CMD_RIGHT: 93, // WebKit Right Command key fired, different from META WIN_IME: 229, // We've seen users whose machines fire this keycode at regular one @@ -256,6 +259,9 @@ goog.events.KeyCodes.firesKeyPressEvent = function(keyCode, opt_heldKeyCode, // Saves Ctrl or Alt + key for IE and WebKit 525+, which won't fire keypress. // Non-IE browsers and WebKit prior to 525 won't get this far so no need to // check the user agent. + if (goog.isNumber(opt_heldKeyCode)) { + opt_heldKeyCode = goog.events.KeyCodes.normalizeKeyCode(opt_heldKeyCode); + } if (!opt_shiftKey && (opt_heldKeyCode == goog.events.KeyCodes.CTRL || opt_heldKeyCode == goog.events.KeyCodes.ALT || @@ -356,6 +362,22 @@ goog.events.KeyCodes.isCharacterKey = function(keyCode) { }; +/** + * Normalizes key codes from OS/Browser-specific value to the general one. + * @param {number} keyCode The native key code. + * @return {number} The normalized key code. + */ +goog.events.KeyCodes.normalizeKeyCode = function(keyCode) { + if (goog.userAgent.GECKO) { + return goog.events.KeyCodes.normalizeGeckoKeyCode(keyCode); + } else if (goog.userAgent.MAC && goog.userAgent.WEBKIT) { + return goog.events.KeyCodes.normalizeMacWebKitKeyCode(keyCode); + } else { + return keyCode; + } +}; + + /** * Normalizes key codes from their Gecko-specific value to the general one. * @param {number} keyCode The native key code. @@ -367,6 +389,8 @@ goog.events.KeyCodes.normalizeGeckoKeyCode = function(keyCode) { return goog.events.KeyCodes.EQUALS; case goog.events.KeyCodes.FF_SEMICOLON: return goog.events.KeyCodes.SEMICOLON; + case goog.events.KeyCodes.FF_DASH: + return goog.events.KeyCodes.DASH; case goog.events.KeyCodes.MAC_FF_META: return goog.events.KeyCodes.META; case goog.events.KeyCodes.WIN_KEY_FF_LINUX: @@ -375,3 +399,18 @@ goog.events.KeyCodes.normalizeGeckoKeyCode = function(keyCode) { return keyCode; } }; + + +/** + * Normalizes key codes from their Mac WebKit-specific value to the general one. + * @param {number} keyCode The native key code. + * @return {number} The normalized key code. + */ +goog.events.KeyCodes.normalizeMacWebKitKeyCode = function(keyCode) { + switch (keyCode) { + case goog.events.KeyCodes.MAC_WK_CMD_RIGHT: // 93 + return goog.events.KeyCodes.META; // 91 + default: + return keyCode; + } +}; diff --git a/third_party/closure/goog/events/keyhandler.js b/third_party/closure/goog/events/keyhandler.js index df565fe640f0c..6a7662f539e47 100644 --- a/third_party/closure/goog/events/keyhandler.js +++ b/third_party/closure/goog/events/keyhandler.js @@ -124,6 +124,7 @@ goog.require('goog.userAgent'); * capture phase (defaults to false). * @constructor * @extends {goog.events.EventTarget} + * @final */ goog.events.KeyHandler = function(opt_element, opt_capture) { goog.events.EventTarget.call(this); @@ -304,7 +305,6 @@ goog.events.KeyHandler.prototype.handleKeyDown_ = function(e) { // Ctrl-Tab and Alt-Tab can cause the focus to be moved to another window // before we've caught a key-up event. If the last-key was one of these we // reset the state. - if (goog.userAgent.WEBKIT) { if (this.lastKey_ == goog.events.KeyCodes.CTRL && !e.ctrlKey || this.lastKey_ == goog.events.KeyCodes.ALT && !e.altKey || @@ -330,9 +330,7 @@ goog.events.KeyHandler.prototype.handleKeyDown_ = function(e) { this.lastKey_, e.shiftKey, e.ctrlKey, e.altKey)) { this.handleEvent(e); } else { - this.keyCode_ = goog.userAgent.GECKO ? - goog.events.KeyCodes.normalizeGeckoKeyCode(e.keyCode) : - e.keyCode; + this.keyCode_ = goog.events.KeyCodes.normalizeKeyCode(e.keyCode); if (goog.events.KeyHandler.SAVE_ALT_FOR_KEYPRESS_) { this.altKey_ = e.altKey; } @@ -413,6 +411,7 @@ goog.events.KeyHandler.prototype.handleEvent = function(e) { } } + keyCode = goog.events.KeyCodes.normalizeKeyCode(keyCode); var key = keyCode; var keyIdentifier = be.keyIdentifier; @@ -529,6 +528,7 @@ goog.events.KeyHandler.prototype.disposeInternal = function() { * @param {Event} browserEvent Browser event object. * @constructor * @extends {goog.events.BrowserEvent} + * @final */ goog.events.KeyEvent = function(keyCode, charCode, repeat, browserEvent) { goog.events.BrowserEvent.call(this, browserEvent); diff --git a/third_party/closure/goog/events/keynames.js b/third_party/closure/goog/events/keynames.js index 0dfea1d6c7019..b8e36af0ba636 100644 --- a/third_party/closure/goog/events/keynames.js +++ b/third_party/closure/goog/events/keynames.js @@ -22,7 +22,14 @@ goog.provide('goog.events.KeyNames'); /** - * Key names for common characters. + * Key names for common characters. These should be used with keyup/keydown + * events, since the .keyCode property on those is meant to indicate the + * *physical key* the user held down on the keyboard. Hence the mapping uses + * only the unshifted version of each key (e.g. no '#', since that's shift+3). + * Keypress events on the other hand generate (mostly) ASCII codes since they + * correspond to *characters* the user typed. + * + * For further reference: http://unixpapa.com/js/key.html * * This list is not localized and therefore some of the key codes are not * correct for non-US keyboard layouts. @@ -123,7 +130,7 @@ goog.events.KeyNames = { 188: ',', 190: '.', 191: '/', - 192: '~', + 192: '`', 219: 'open-square-bracket', 220: '\\', 221: 'close-square-bracket', diff --git a/third_party/closure/goog/events/listenable.js b/third_party/closure/goog/events/listenable.js index eaa458dbcc123..af3a688b657a5 100644 --- a/third_party/closure/goog/events/listenable.js +++ b/third_party/closure/goog/events/listenable.js @@ -19,11 +19,37 @@ goog.provide('goog.events.Listenable'); goog.provide('goog.events.ListenableKey'); +/** @suppress {extraRequire} */ +goog.require('goog.events.EventId'); + /** - * A listenable interface. Also see goog.events.EventTarget. + * A listenable interface. A listenable is an object with the ability + * to dispatch/broadcast events to "event listeners" registered via + * listen/listenOnce. + * + * The interface allows for an event propagation mechanism similar + * to one offered by native browser event targets, such as + * capture/bubble mechanism, stopping propagation, and preventing + * default actions. Capture/bubble mechanism depends on the ancestor + * tree constructed via {@code #getParentEventTarget}; this tree + * must be directed acyclic graph. The meaning of default action(s) + * in preventDefault is specific to a particular use case. + * + * Implementations that do not support capture/bubble or can not have + * a parent listenable can simply not implement any ability to set the + * parent listenable (and have {@code #getParentEventTarget} return + * null). + * + * Implementation of this class can be used with or independently from + * goog.events. + * + * Implementation must call {@code #addImplementation(implClass)}. + * * @interface + * @see goog.events + * @see http://www.w3.org/TR/DOM-Level-2-Events/events.html */ goog.events.Listenable = function() {}; @@ -60,7 +86,11 @@ goog.events.Listenable.addImplementation = function(cls) { * addImplementation. */ goog.events.Listenable.isImplementedBy = function(obj) { - return !!(obj && obj[goog.events.Listenable.IMPLEMENTED_BY_PROP]); + try { + return !!(obj && obj[goog.events.Listenable.IMPLEMENTED_BY_PROP]); + } catch (e) { + return false; + } }; @@ -71,14 +101,15 @@ goog.events.Listenable.isImplementedBy = function(obj) { * (registered via listenOnce), it will no longer be a one-off * listener after a call to listen(). * - * @param {string} type Event type or array of event types. - * @param {!Function} listener Callback method, or an object - * with a handleEvent function. + * @param {string|!goog.events.EventId.} type The event type id. + * @param {function(this:SCOPE, EVENTOBJ):(boolean|undefined)} listener Callback + * method. * @param {boolean=} opt_useCapture Whether to fire in capture phase * (defaults to false). - * @param {Object=} opt_listenerScope Object in whose scope to call the + * @param {SCOPE=} opt_listenerScope Object in whose scope to call the * listener. * @return {goog.events.ListenableKey} Unique key for the listener. + * @template SCOPE,EVENTOBJ */ goog.events.Listenable.prototype.listen; @@ -94,14 +125,15 @@ goog.events.Listenable.prototype.listen; * one-off listener, listenOnce does not modify the listeners (it is * still a once listener). * - * @param {string} type Event type or array of event types. - * @param {!Function} listener Callback method, or an object - * with a handleEvent function. + * @param {string|!goog.events.EventId.} type The event type id. + * @param {function(this:SCOPE, EVENTOBJ):(boolean|undefined)} listener Callback + * method. * @param {boolean=} opt_useCapture Whether to fire in capture phase * (defaults to false). - * @param {Object=} opt_listenerScope Object in whose scope to call the + * @param {SCOPE=} opt_listenerScope Object in whose scope to call the * listener. * @return {goog.events.ListenableKey} Unique key for the listener. + * @template SCOPE,EVENTOBJ */ goog.events.Listenable.prototype.listenOnce; @@ -109,17 +141,15 @@ goog.events.Listenable.prototype.listenOnce; /** * Removes an event listener which was added with listen() or listenOnce(). * - * Implementation needs to call goog.events.cleanUp. - * - * @param {string} type Event type or array of event types. - * @param {!Function} listener Callback method, or an object - * with a handleEvent function. TODO(user): Consider whether - * we can remove Object. + * @param {string|!goog.events.EventId.} type The event type id. + * @param {function(this:SCOPE, EVENTOBJ):(boolean|undefined)} listener Callback + * method. * @param {boolean=} opt_useCapture Whether to fire in capture phase * (defaults to false). - * @param {Object=} opt_listenerScope Object in whose scope to call + * @param {SCOPE=} opt_listenerScope Object in whose scope to call * the listener. * @return {boolean} Whether any listener was removed. + * @template SCOPE,EVENTOBJ */ goog.events.Listenable.prototype.unlisten; @@ -128,8 +158,6 @@ goog.events.Listenable.prototype.unlisten; * Removes an event listener which was added with listen() by the key * returned by listen(). * - * Implementation needs to call goog.events.cleanUp. - * * @param {goog.events.ListenableKey} key The key returned by * listen() or listenOnce(). * @return {boolean} Whether any listener was removed. @@ -158,9 +186,6 @@ goog.events.Listenable.prototype.dispatchEvent; * it will only remove listeners of the particular type. otherwise all * registered listeners will be removed. * - * Implementation needs to call goog.events.cleanUp for each removed - * listener. - * * @param {string=} opt_type Type of event to remove, default is to * remove all types. * @return {number} Number of listeners removed. @@ -168,19 +193,35 @@ goog.events.Listenable.prototype.dispatchEvent; goog.events.Listenable.prototype.removeAllListeners; +/** + * Returns the parent of this event target to use for capture/bubble + * mechanism. + * + * NOTE(user): The name reflects the original implementation of + * custom event target ({@code goog.events.EventTarget}). We decided + * that changing the name is not worth it. + * + * @return {goog.events.Listenable} The parent EventTarget or null if + * there is no parent. + */ +goog.events.Listenable.prototype.getParentEventTarget; + + /** * Fires all registered listeners in this listenable for the given * type and capture mode, passing them the given eventObject. This * does not perform actual capture/bubble. Only implementors of the * interface should be using this. * - * @param {string} type The type of the listeners to fire. + * @param {string|!goog.events.EventId.} type The type of the + * listeners to fire. * @param {boolean} capture The capture mode of the listeners to fire. - * @param {goog.events.Event} eventObject The event object to fire. + * @param {EVENTOBJ} eventObject The event object to fire. * @return {boolean} Whether all listeners succeeded without * attempting to prevent default behavior. If any listener returns * false or called goog.events.Event#preventDefault, this returns * false. + * @template EVENTOBJ */ goog.events.Listenable.prototype.fireListeners; @@ -189,10 +230,11 @@ goog.events.Listenable.prototype.fireListeners; * Gets all listeners in this listenable for the given type and * capture mode. * - * @param {string} type The type of the listeners to fire. + * @param {string|!goog.events.EventId} type The type of the listeners to fire. * @param {boolean} capture The capture mode of the listeners to fire. * @return {!Array.} An array of registered * listeners. + * @template EVENTOBJ */ goog.events.Listenable.prototype.getListeners; @@ -201,12 +243,15 @@ goog.events.Listenable.prototype.getListeners; * Gets the goog.events.ListenableKey for the event or null if no such * listener is in use. * - * @param {string} type The name of the event without the 'on' prefix. - * @param {!Function} listener The listener function to get. + * @param {string|!goog.events.EventId.} type The name of the event + * without the 'on' prefix. + * @param {function(this:SCOPE, EVENTOBJ):(boolean|undefined)} listener The + * listener function to get. * @param {boolean} capture Whether the listener is a capturing listener. - * @param {Object=} opt_listenerScope Object in whose scope to call the + * @param {SCOPE=} opt_listenerScope Object in whose scope to call the * listener. * @return {goog.events.ListenableKey} the found listener or null if not found. + * @template SCOPE,EVENTOBJ */ goog.events.Listenable.prototype.getListener; @@ -216,11 +261,12 @@ goog.events.Listenable.prototype.getListener; * signature. If either the type or capture parameters are * unspecified, the function will match on the remaining criteria. * - * @param {string=} opt_type Event type. + * @param {string|!goog.events.EventId.=} opt_type Event type. * @param {boolean=} opt_capture Whether to check for capture or bubble * listeners. * @return {boolean} Whether there is any active listeners matching * the requested type and/or capture phase. + * @template EVENTOBJ */ goog.events.Listenable.prototype.hasListener; @@ -267,8 +313,7 @@ goog.events.ListenableKey.prototype.type; /** * The listener function. - * TODO(user): Narrow the type if possible. - * @type {Function|Object} + * @type {function(?):?|{handleEvent:function(?):?}|null} */ goog.events.ListenableKey.prototype.listener; diff --git a/third_party/closure/goog/events/listener.js b/third_party/closure/goog/events/listener.js index a38274e057fd5..60c737021b665 100644 --- a/third_party/closure/goog/events/listener.js +++ b/third_party/closure/goog/events/listener.js @@ -48,7 +48,9 @@ goog.events.Listener = function( this.listener = listener; /** - * Proxy for callback that passes through {@link goog.events#HandleEvent_}. + * A wrapper over the original listener. This is used solely to + * handle native browser events (it is used to simulate the capture + * phase and to patch the event object). * @type {Function} */ this.proxy = proxy; diff --git a/third_party/closure/goog/events/listenermap.js b/third_party/closure/goog/events/listenermap.js new file mode 100644 index 0000000000000..8930eb6c8c188 --- /dev/null +++ b/third_party/closure/goog/events/listenermap.js @@ -0,0 +1,308 @@ +// Copyright 2013 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 A map of listeners that provides utility functions to + * deal with listeners on an event target. Used by + * {@code goog.events.EventTarget}. + * + * WARNING: Do not use this class from outside goog.events package. + * + * @visibility {//closure/goog/bin/sizetests:__pkg__} + * @visibility {//closure/goog/events:__pkg__} + * @visibility {//closure/goog/labs/events:__pkg__} + */ + +goog.provide('goog.events.ListenerMap'); + +goog.require('goog.array'); +goog.require('goog.events.Listener'); +goog.require('goog.object'); + + + +/** + * Creates a new listener map. + * @param {EventTarget|goog.events.Listenable} src The src object. + * @constructor + * @final + */ +goog.events.ListenerMap = function(src) { + /** @type {EventTarget|goog.events.Listenable} */ + this.src = src; + + /** + * Maps of event type to an array of listeners. + * @type {Object.>} + */ + this.listeners = {}; + + /** + * The count of types in this map that have registered listeners. + * @private {number} + */ + this.typeCount_ = 0; +}; + + +/** + * @return {number} The count of event types in this map that actually + * have registered listeners. + */ +goog.events.ListenerMap.prototype.getTypeCount = function() { + return this.typeCount_; +}; + + +/** + * @return {number} Total number of registered listeners. + */ +goog.events.ListenerMap.prototype.getListenerCount = function() { + var count = 0; + for (var type in this.listeners) { + count += this.listeners[type].length; + } + return count; +}; + + +/** + * Adds an event listener. A listener can only be added once to an + * object and if it is added again the key for the listener is + * returned. + * + * Note that a one-off listener will not change an existing listener, + * if any. On the other hand a normal listener will change existing + * one-off listener to become a normal listener. + * + * @param {string|!goog.events.EventId} type The listener event type. + * @param {!Function} listener This listener callback method. + * @param {boolean} callOnce Whether the listener is a one-off + * listener. + * @param {boolean=} opt_useCapture The capture mode of the listener. + * @param {Object=} opt_listenerScope Object in whose scope to call the + * listener. + * @return {goog.events.ListenableKey} Unique key for the listener. + */ +goog.events.ListenerMap.prototype.add = function( + type, listener, callOnce, opt_useCapture, opt_listenerScope) { + var typeStr = type.toString(); + var listenerArray = this.listeners[typeStr]; + if (!listenerArray) { + listenerArray = this.listeners[typeStr] = []; + this.typeCount_++; + } + + var listenerObj; + var index = goog.events.ListenerMap.findListenerIndex_( + listenerArray, listener, opt_useCapture, opt_listenerScope); + if (index > -1) { + listenerObj = listenerArray[index]; + if (!callOnce) { + // Ensure that, if there is an existing callOnce listener, it is no + // longer a callOnce listener. + listenerObj.callOnce = false; + } + } else { + listenerObj = new goog.events.Listener( + listener, null, this.src, typeStr, !!opt_useCapture, opt_listenerScope); + listenerObj.callOnce = callOnce; + listenerArray.push(listenerObj); + } + return listenerObj; +}; + + +/** + * Removes a matching listener. + * @param {string|!goog.events.EventId} type The listener event type. + * @param {!Function} listener This listener callback method. + * @param {boolean=} opt_useCapture The capture mode of the listener. + * @param {Object=} opt_listenerScope Object in whose scope to call the + * listener. + * @return {boolean} Whether any listener was removed. + */ +goog.events.ListenerMap.prototype.remove = function( + type, listener, opt_useCapture, opt_listenerScope) { + var typeStr = type.toString(); + if (!(typeStr in this.listeners)) { + return false; + } + + var listenerArray = this.listeners[typeStr]; + var index = goog.events.ListenerMap.findListenerIndex_( + listenerArray, listener, opt_useCapture, opt_listenerScope); + if (index > -1) { + var listenerObj = listenerArray[index]; + listenerObj.markAsRemoved(); + goog.array.removeAt(listenerArray, index); + if (listenerArray.length == 0) { + delete this.listeners[typeStr]; + this.typeCount_--; + } + return true; + } + return false; +}; + + +/** + * Removes the given listener object. + * @param {goog.events.ListenableKey} listener The listener to remove. + * @return {boolean} Whether the listener is removed. + */ +goog.events.ListenerMap.prototype.removeByKey = function(listener) { + var type = listener.type; + if (!(type in this.listeners)) { + return false; + } + + var removed = goog.array.remove(this.listeners[type], listener); + if (removed) { + listener.markAsRemoved(); + if (this.listeners[type].length == 0) { + delete this.listeners[type]; + this.typeCount_--; + } + } + return removed; +}; + + +/** + * Removes all listeners from this map. If opt_type is provided, only + * listeners that match the given type are removed. + * @param {string|!goog.events.EventId=} opt_type Type of event to remove. + * @return {number} Number of listeners removed. + */ +goog.events.ListenerMap.prototype.removeAll = function(opt_type) { + var typeStr = opt_type && opt_type.toString(); + var count = 0; + for (var type in this.listeners) { + if (!typeStr || type == typeStr) { + var listenerArray = this.listeners[type]; + for (var i = 0; i < listenerArray.length; i++) { + ++count; + listenerArray[i].markAsRemoved(); + } + delete this.listeners[type]; + this.typeCount_--; + } + } + return count; +}; + + +/** + * Gets all listeners that match the given type and capture mode. The + * returned array is a copy (but the listener objects are not). + * @param {string|!goog.events.EventId} type The type of the listeners + * to retrieve. + * @param {boolean} capture The capture mode of the listeners to retrieve. + * @return {!Array.} An array of matching + * listeners. + */ +goog.events.ListenerMap.prototype.getListeners = function(type, capture) { + var listenerArray = this.listeners[type.toString()]; + var rv = []; + if (listenerArray) { + for (var i = 0; i < listenerArray.length; ++i) { + var listenerObj = listenerArray[i]; + if (listenerObj.capture == capture) { + rv.push(listenerObj); + } + } + } + return rv; +}; + + +/** + * Gets the goog.events.ListenableKey for the event or null if no such + * listener is in use. + * + * @param {string|!goog.events.EventId} type The type of the listener + * to retrieve. + * @param {!Function} listener The listener function to get. + * @param {boolean} capture Whether the listener is a capturing listener. + * @param {Object=} opt_listenerScope Object in whose scope to call the + * listener. + * @return {goog.events.ListenableKey} the found listener or null if not found. + */ +goog.events.ListenerMap.prototype.getListener = function( + type, listener, capture, opt_listenerScope) { + var listenerArray = this.listeners[type.toString()]; + var i = -1; + if (listenerArray) { + i = goog.events.ListenerMap.findListenerIndex_( + listenerArray, listener, capture, opt_listenerScope); + } + return i > -1 ? listenerArray[i] : null; +}; + + +/** + * Whether there is a matching listener. If either the type or capture + * parameters are unspecified, the function will match on the + * remaining criteria. + * + * @param {string|!goog.events.EventId=} opt_type The type of the listener. + * @param {boolean=} opt_capture The capture mode of the listener. + * @return {boolean} Whether there is an active listener matching + * the requested type and/or capture phase. + */ +goog.events.ListenerMap.prototype.hasListener = function( + opt_type, opt_capture) { + var hasType = goog.isDef(opt_type); + var typeStr = hasType ? opt_type.toString() : ''; + var hasCapture = goog.isDef(opt_capture); + + return goog.object.some( + this.listeners, function(listenerArray, type) { + for (var i = 0; i < listenerArray.length; ++i) { + if ((!hasType || listenerArray[i].type == typeStr) && + (!hasCapture || listenerArray[i].capture == opt_capture)) { + return true; + } + } + + return false; + }); +}; + + +/** + * Finds the index of a matching goog.events.Listener in the given + * listenerArray. + * @param {!Array.} listenerArray Array of listener. + * @param {!Function} listener The listener function. + * @param {boolean=} opt_useCapture The capture flag for the listener. + * @param {Object=} opt_listenerScope The listener scope. + * @return {number} The index of the matching listener within the + * listenerArray. + * @private + */ +goog.events.ListenerMap.findListenerIndex_ = function( + listenerArray, listener, opt_useCapture, opt_listenerScope) { + for (var i = 0; i < listenerArray.length; ++i) { + var listenerObj = listenerArray[i]; + if (!listenerObj.removed && + listenerObj.listener == listener && + listenerObj.capture == !!opt_useCapture && + listenerObj.handler == opt_listenerScope) { + return i; + } + } + return -1; +}; diff --git a/third_party/closure/goog/events/mousewheelhandler.js b/third_party/closure/goog/events/mousewheelhandler.js index 55a3b3807cc22..6729064c83398 100644 --- a/third_party/closure/goog/events/mousewheelhandler.js +++ b/third_party/closure/goog/events/mousewheelhandler.js @@ -258,6 +258,7 @@ goog.events.MouseWheelHandler.prototype.disposeInternal = function() { * direction. * @constructor * @extends {goog.events.BrowserEvent} + * @final */ goog.events.MouseWheelEvent = function(detail, browserEvent, deltaX, deltaY) { goog.events.BrowserEvent.call(this, browserEvent); diff --git a/third_party/closure/goog/events/onlinehandler.js b/third_party/closure/goog/events/onlinehandler.js index 4efdc07edc752..d65b314ce313b 100644 --- a/third_party/closure/goog/events/onlinehandler.js +++ b/third_party/closure/goog/events/onlinehandler.js @@ -51,10 +51,10 @@ goog.require('goog.userAgent'); * @implements {goog.net.NetworkStatusMonitor} */ goog.events.OnlineHandler = function() { - goog.base(this); + goog.events.OnlineHandler.base(this, 'constructor'); /** - * @private {goog.events.EventHandler} + * @private {goog.events.EventHandler.} */ this.eventHandler_ = new goog.events.EventHandler(this); @@ -152,7 +152,7 @@ goog.events.OnlineHandler.prototype.handleChange_ = function(e) { /** @override */ goog.events.OnlineHandler.prototype.disposeInternal = function() { - goog.base(this, 'disposeInternal'); + goog.events.OnlineHandler.base(this, 'disposeInternal'); this.eventHandler_.dispose(); this.eventHandler_ = null; if (this.timer_) { diff --git a/third_party/closure/goog/events/pastehandler.js b/third_party/closure/goog/events/pastehandler.js index cbd66436e791f..8e1018d7e388e 100644 --- a/third_party/closure/goog/events/pastehandler.js +++ b/third_party/closure/goog/events/pastehandler.js @@ -38,12 +38,12 @@ goog.provide('goog.events.PasteHandler.State'); goog.require('goog.Timer'); goog.require('goog.async.ConditionalDelay'); -goog.require('goog.debug.Logger'); goog.require('goog.events.BrowserEvent'); goog.require('goog.events.EventHandler'); goog.require('goog.events.EventTarget'); goog.require('goog.events.EventType'); goog.require('goog.events.KeyCodes'); +goog.require('goog.log'); goog.require('goog.userAgent'); @@ -78,7 +78,7 @@ goog.events.PasteHandler = function(element) { /** * Handler for events. - * @type {goog.events.EventHandler} + * @type {goog.events.EventHandler.} * @private */ this.eventHandler_ = new goog.events.EventHandler(this); @@ -201,11 +201,11 @@ goog.events.PasteHandler.prototype.previousEvent_; /** * A logger, used to help us debug the algorithm. - * @type {goog.debug.Logger} + * @type {goog.log.Logger} * @private */ goog.events.PasteHandler.prototype.logger_ = - goog.debug.Logger.getLogger('goog.events.PasteHandler'); + goog.log.getLogger('goog.events.PasteHandler'); /** @override */ @@ -230,8 +230,10 @@ goog.events.PasteHandler.prototype.getState = function() { /** * Returns the event handler. - * @return {goog.events.EventHandler} The event handler. + * @return {goog.events.EventHandler.} The event handler. * @protected + * @this T + * @template T */ goog.events.PasteHandler.prototype.getEventHandler = function() { return this.eventHandler_; @@ -249,7 +251,7 @@ goog.events.PasteHandler.prototype.checkUpdatedText_ = function() { if (this.oldValue_ == this.element_.value) { return false; } - this.logger_.info('detected textchange after paste'); + goog.log.info(this.logger_, 'detected textchange after paste'); this.dispatchEvent(goog.events.PasteHandler.EventType.AFTER_PASTE); return true; }; @@ -346,12 +348,12 @@ goog.events.PasteHandler.prototype.handleEvent_ = function(e) { break; } default: { - this.logger_.severe('invalid ' + this.state_ + ' state'); + goog.log.error(this.logger_, 'invalid ' + this.state_ + ' state'); } } this.lastTime_ = goog.now(); this.oldValue_ = this.element_.value; - this.logger_.info(e.type + ' -> ' + this.state_); + goog.log.info(this.logger_, e.type + ' -> ' + this.state_); this.previousEvent_ = e.type; }; @@ -382,13 +384,14 @@ goog.events.PasteHandler.prototype.handleUnderInit_ = function(e) { case goog.events.EventType.MOUSEOVER: { this.state_ = goog.events.PasteHandler.State.INIT; if (this.element_.value != this.oldValue_) { - this.logger_.info('paste by dragdrop while on init!'); + goog.log.info(this.logger_, 'paste by dragdrop while on init!'); this.dispatch_(e); } break; } default: { - this.logger_.severe('unexpected event ' + e.type + 'during init'); + goog.log.error(this.logger_, + 'unexpected event ' + e.type + 'during init'); } } }; @@ -433,7 +436,7 @@ goog.events.PasteHandler.prototype.handleUnderFocused_ = function(e) { MANDATORY_MS_BETWEEN_INPUT_EVENTS_TIE_BREAKER; if (goog.now() > minimumMilisecondsBetweenInputEvents || this.previousEvent_ == goog.events.EventType.FOCUS) { - this.logger_.info('paste by textchange while focused!'); + goog.log.info(this.logger_, 'paste by textchange while focused!'); this.dispatch_(e); } break; @@ -443,7 +446,7 @@ goog.events.PasteHandler.prototype.handleUnderFocused_ = function(e) { break; } case goog.events.EventType.KEYDOWN: { - this.logger_.info('key down ... looking for ctrl+v'); + goog.log.info(this.logger_, 'key down ... looking for ctrl+v'); // Opera + MAC does not set e.ctrlKey. Instead, it gives me e.keyCode = 0. // http://www.quirksmode.org/js/keys.html if (goog.userAgent.MAC && goog.userAgent.OPERA && e.keyCode == 0 || @@ -455,13 +458,14 @@ goog.events.PasteHandler.prototype.handleUnderFocused_ = function(e) { } case goog.events.EventType.MOUSEOVER: { if (this.element_.value != this.oldValue_) { - this.logger_.info('paste by dragdrop while focused!'); + goog.log.info(this.logger_, 'paste by dragdrop while focused!'); this.dispatch_(e); } break; } default: { - this.logger_.severe('unexpected event ' + e.type + ' during focused'); + goog.log.error(this.logger_, + 'unexpected event ' + e.type + ' during focused'); } } }; @@ -493,20 +497,21 @@ goog.events.PasteHandler.prototype.handleUnderTyping_ = function(e) { if (e.ctrlKey && e.keyCode == goog.events.KeyCodes.V || e.shiftKey && e.keyCode == goog.events.KeyCodes.INSERT || e.metaKey && e.keyCode == goog.events.KeyCodes.V) { - this.logger_.info('paste by ctrl+v while keypressed!'); + goog.log.info(this.logger_, 'paste by ctrl+v while keypressed!'); this.dispatch_(e); } break; } case goog.events.EventType.MOUSEOVER: { if (this.element_.value != this.oldValue_) { - this.logger_.info('paste by dragdrop while keypressed!'); + goog.log.info(this.logger_, 'paste by dragdrop while keypressed!'); this.dispatch_(e); } break; } default: { - this.logger_.severe('unexpected event ' + e.type + ' during keypressed'); + goog.log.error(this.logger_, + 'unexpected event ' + e.type + ' during keypressed'); } } }; diff --git a/third_party/closure/goog/format/emailaddress.js b/third_party/closure/goog/format/emailaddress.js index e74bd3f487543..8f3cfa15a4e6d 100644 --- a/third_party/closure/goog/format/emailaddress.js +++ b/third_party/closure/goog/format/emailaddress.js @@ -29,6 +29,7 @@ goog.require('goog.string'); * @param {string=} opt_address The email address. * @param {string=} opt_name The name associated with the email address. * @constructor + * @final */ goog.format.EmailAddress = function(opt_address, opt_name) { /** @@ -103,6 +104,47 @@ goog.format.EmailAddress.ALL_BACKSLASHES_ = /\\/g; goog.format.EmailAddress.ESCAPED_BACKSLASHES_ = /\\\\/g; +/** + * A string representing the RegExp for the local part of an email address. + * @private {string} + */ +goog.format.EmailAddress.LOCAL_PART_REGEXP_STR_ = + '[+a-zA-Z0-9_.!#$%&\'*\\/=?^`{|}~-]+'; + + +/** + * A string representing the RegExp for the domain part of an email address. + * @private {string} + */ +goog.format.EmailAddress.DOMAIN_PART_REGEXP_STR_ = + '([a-zA-Z0-9-]+\\.)+[a-zA-Z0-9]{2,63}'; + + +/** + * A RegExp to match the local part of an email address. + * @private {RegExp} + */ +goog.format.EmailAddress.LOCAL_PART_ = + new RegExp('^' + goog.format.EmailAddress.LOCAL_PART_REGEXP_STR_ + '$'); + + +/** + * A RegExp to match the domain part of an email address. + * @private {RegExp} + */ +goog.format.EmailAddress.DOMAIN_PART_ = + new RegExp('^' + goog.format.EmailAddress.DOMAIN_PART_REGEXP_STR_ + '$'); + + +/** + * A RegExp to match an email address. + * @private {RegExp} + */ +goog.format.EmailAddress.EMAIL_ADDRESS_ = + new RegExp('^' + goog.format.EmailAddress.LOCAL_PART_REGEXP_STR_ + '@' + + goog.format.EmailAddress.DOMAIN_PART_REGEXP_STR_ + '$'); + + /** * Get the name associated with the email address. * @return {string} The name or personal portion of the address. @@ -201,9 +243,29 @@ goog.format.EmailAddress.isValidAddrSpec = function(str) { // For more details, see http://en.wikipedia.org/wiki/Email_address#Syntax // TODO(mariakhomenko): we should also be handling i18n domain names as per // http://en.wikipedia.org/wiki/Internationalized_domain_name - var filter = - /^[+a-zA-Z0-9_.!#$%&'*\/=?^`{|}~-]+@([a-zA-Z0-9-]+\.)+[a-zA-Z0-9]{2,6}$/; - return filter.test(str); + return goog.format.EmailAddress.EMAIL_ADDRESS_.test(str); +}; + + +/** + * Checks if the provided string is a valid local port (part before the '@') of + * an email address. + * @param {string} str The local part to check. + * @return {boolean} Whether the provided string is a valid local part. + */ +goog.format.EmailAddress.isValidLocalPartSpec = function(str) { + return goog.format.EmailAddress.LOCAL_PART_.test(str); +}; + + +/** + * Checks if the provided string is a valid domain port (part after the '@') of + * an email address. + * @param {string} str The domain part to check. + * @return {boolean} Whether the provided string is a valid domain part. + */ +goog.format.EmailAddress.isValidDomainPartSpec = function(str) { + return goog.format.EmailAddress.DOMAIN_PART_.test(str); }; @@ -211,7 +273,7 @@ goog.format.EmailAddress.isValidAddrSpec = function(str) { * Parse an email address of the form "name" <address> into * an email address. * @param {string} addr The address string. - * @return {goog.format.EmailAddress} The parsed address. + * @return {!goog.format.EmailAddress} The parsed address. */ goog.format.EmailAddress.parse = function(addr) { // TODO(ecattell): Strip bidi markers. @@ -249,13 +311,18 @@ goog.format.EmailAddress.parse = function(addr) { * Parse a string containing email addresses of the form * "name" <address> into an array of email addresses. * @param {string} str The address list. - * @return {Array.} The parsed emails. + * @return {!Array.} The parsed emails. */ goog.format.EmailAddress.parseList = function(str) { var result = []; var email = ''; var token; + // Remove non-UNIX-style newlines that would otherwise cause getToken_ to + // choke. Remove multiple consecutive whitespace characters for the same + // reason. + str = goog.string.collapseWhitespace(str); + for (var i = 0; i < str.length; ) { token = goog.format.EmailAddress.getToken_(str, i); if (token == ',' || token == ';' || diff --git a/third_party/closure/goog/format/format.js b/third_party/closure/goog/format/format.js index 2ac1327912f6a..3fe9dd4dddd1f 100644 --- a/third_party/closure/goog/format/format.js +++ b/third_party/closure/goog/format/format.js @@ -104,15 +104,19 @@ goog.format.numericValueToString = function(val, opt_decimals) { * @param {number=} opt_decimals The number of decimals to use. Defaults to 2. * @param {boolean=} opt_suffix If true, include trailing 'B' in returned * string. Default is true. + * @param {boolean=} opt_useSeparator If true, number and scale will be + * separated by a no break space. Default is false. * @return {string} String representation of number of bytes. */ -goog.format.numBytesToString = function(val, opt_decimals, opt_suffix) { +goog.format.numBytesToString = function(val, opt_decimals, opt_suffix, + opt_useSeparator) { var suffix = ''; if (!goog.isDef(opt_suffix) || opt_suffix) { suffix = 'B'; } return goog.format.numericValueToString_( - val, goog.format.NUMERIC_SCALES_BINARY_, opt_decimals, suffix); + val, goog.format.NUMERIC_SCALES_BINARY_, opt_decimals, suffix, + opt_useSeparator); }; @@ -141,14 +145,17 @@ goog.format.stringToNumericValue_ = function(stringValue, conversion) { * @param {Object} conversion Dictionary of scaling factors. * @param {number=} opt_decimals The number of decimals to use. Default is 2. * @param {string=} opt_suffix Optional suffix to append. + * @param {boolean=} opt_useSeparator If true, number and scale will be + * separated by a space. Default is false. * @return {string} The human readable form of the byte size. * @private */ goog.format.numericValueToString_ = function(val, conversion, - opt_decimals, opt_suffix) { + opt_decimals, opt_suffix, opt_useSeparator) { var prefixes = goog.format.NUMERIC_SCALE_PREFIXES_; var orig_val = val; var symbol = ''; + var separator = ''; var scale = 1; if (val < 0) { val = -val; @@ -165,11 +172,16 @@ goog.format.numericValueToString_ = function(val, conversion, } if (!symbol) { scale = 1; - } else if (opt_suffix) { - symbol += opt_suffix; + } else { + if (opt_suffix) { + symbol += opt_suffix; + } + if (opt_useSeparator) { + separator = ' '; + } } var ex = Math.pow(10, goog.isDef(opt_decimals) ? opt_decimals : 2); - return Math.round(orig_val / scale * ex) / ex + symbol; + return Math.round(orig_val / scale * ex) / ex + separator + symbol; }; diff --git a/third_party/closure/goog/format/htmlprettyprinter.js b/third_party/closure/goog/format/htmlprettyprinter.js deleted file mode 100644 index d50e6692d9741..0000000000000 --- a/third_party/closure/goog/format/htmlprettyprinter.js +++ /dev/null @@ -1,407 +0,0 @@ -// Copyright 2008 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 Provides functions to parse and pretty-print HTML strings. - * - */ - -goog.provide('goog.format.HtmlPrettyPrinter'); -goog.provide('goog.format.HtmlPrettyPrinter.Buffer'); - -goog.require('goog.object'); -goog.require('goog.string.StringBuffer'); - - - -/** - * This class formats HTML to be more human-readable. - * TODO(user): Add hierarchical indentation. - * @param {number=} opt_timeOutMillis Max # milliseconds to spend on #format. If - * this time is exceeded, return partially formatted. 0 or negative number - * indicates no timeout. - * @constructor - */ -goog.format.HtmlPrettyPrinter = function(opt_timeOutMillis) { - /** - * Max # milliseconds to spend on #format. - * @type {number} - * @private - */ - this.timeOutMillis_ = opt_timeOutMillis && opt_timeOutMillis > 0 ? - opt_timeOutMillis : 0; -}; - - -/** - * Singleton. - * @type {goog.format.HtmlPrettyPrinter?} - * @private - */ -goog.format.HtmlPrettyPrinter.instance_ = null; - - -/** - * Singleton lazy initializer. - * @return {goog.format.HtmlPrettyPrinter} Singleton. - * @private - */ -goog.format.HtmlPrettyPrinter.getInstance_ = function() { - if (!goog.format.HtmlPrettyPrinter.instance_) { - goog.format.HtmlPrettyPrinter.instance_ = - new goog.format.HtmlPrettyPrinter(); - } - return goog.format.HtmlPrettyPrinter.instance_; -}; - - -/** - * Static utility function. See prototype #format. - * @param {string} html The HTML text to pretty print. - * @return {string} Formatted result. - */ -goog.format.HtmlPrettyPrinter.format = function(html) { - return goog.format.HtmlPrettyPrinter.getInstance_().format(html); -}; - - -/** - * List of patterns used to tokenize HTML for pretty printing. Cache - * subexpression for tag name. - * comment|meta-tag|tag|text|other-less-than-characters - * @type {RegExp} - * @private - */ -goog.format.HtmlPrettyPrinter.TOKEN_REGEX_ = - /(?:||<(\/?)(\w+)[^>]*>|[^<]+|<)/g; - - -/** - * Tags whose contents we don't want pretty printed. - * @type {Object} - * @private - */ -goog.format.HtmlPrettyPrinter.NON_PRETTY_PRINTED_TAGS_ = goog.object.createSet( - 'script', - 'style', - 'pre', - 'xmp'); - - -/** - * 'Block' tags. We should add newlines before and after these tags during - * pretty printing. Tags drawn mostly from HTML4 definitions for block and other - * non-online tags, excepting the ones in - * #goog.format.HtmlPrettyPrinter.NON_PRETTY_PRINTED_TAGS_. - * - * @type {Object} - * @private - */ -goog.format.HtmlPrettyPrinter.BLOCK_TAGS_ = goog.object.createSet( - 'address', - 'applet', - 'area', - 'base', - 'basefont', - 'blockquote', - 'body', - 'caption', - 'center', - 'col', - 'colgroup', - 'dir', - 'div', - 'dl', - 'fieldset', - 'form', - 'frame', - 'frameset', - 'h1', - 'h2', - 'h3', - 'h4', - 'h5', - 'h6', - 'head', - 'hr', - 'html', - 'iframe', - 'isindex', - 'legend', - 'link', - 'menu', - 'meta', - 'noframes', - 'noscript', - 'ol', - 'optgroup', - 'option', - 'p', - 'param', - 'table', - 'tbody', - 'td', - 'tfoot', - 'th', - 'thead', - 'title', - 'tr', - 'ul'); - - -/** - * Non-block tags that break flow. We insert a line break after, but not before - * these. Tags drawn from HTML4 definitions. - * @type {Object} - * @private - */ -goog.format.HtmlPrettyPrinter.BREAKS_FLOW_TAGS_ = goog.object.createSet( - 'br', - 'dd', - 'dt', - 'br', - 'li', - 'noframes'); - - -/** - * Empty tags. These are treated as both start and end tags. - * @type {Object} - * @private - */ -goog.format.HtmlPrettyPrinter.EMPTY_TAGS_ = goog.object.createSet( - 'br', - 'hr', - 'isindex'); - - -/** - * Breaks up HTML so it's easily readable by the user. - * @param {string} html The HTML text to pretty print. - * @return {string} Formatted result. - * @throws {Error} Regex error, data loss, or endless loop detected. - */ -goog.format.HtmlPrettyPrinter.prototype.format = function(html) { - // Trim leading whitespace, but preserve first indent; in other words, keep - // any spaces immediately before the first non-whitespace character (that's - // what $1 is), but remove all other leading whitespace. This adjustment - // historically had been made in Docs. The motivation is that some - // browsers prepend several line breaks in designMode. - html = html.replace(/^\s*?( *\S)/, '$1'); - - // Trim trailing whitespace. - html = html.replace(/\s+$/, ''); - - // Keep track of how much time we've used. - var timeOutMillis = this.timeOutMillis_; - var startMillis = timeOutMillis ? goog.now() : 0; - - // Handles concatenation of the result and required line breaks. - var buffer = new goog.format.HtmlPrettyPrinter.Buffer(); - - // Declare these for efficiency since we access them in a loop. - var tokenRegex = goog.format.HtmlPrettyPrinter.TOKEN_REGEX_; - var nonPpTags = goog.format.HtmlPrettyPrinter.NON_PRETTY_PRINTED_TAGS_; - var blockTags = goog.format.HtmlPrettyPrinter.BLOCK_TAGS_; - var breaksFlowTags = goog.format.HtmlPrettyPrinter.BREAKS_FLOW_TAGS_; - var emptyTags = goog.format.HtmlPrettyPrinter.EMPTY_TAGS_; - - // Used to verify we're making progress through our regex tokenization. - var lastIndex = 0; - - // Use this to track non-pretty-printed tags and childen. - var nonPpTagStack = []; - - // Loop through each matched token. - var match; - while (match = tokenRegex.exec(html)) { - // Get token. - var token = match[0]; - - // Is this token a tag? match.length == 3 for tags, 1 for all others. - if (match.length == 3) { - var tagName = match[2]; - if (tagName) { - tagName = tagName.toLowerCase(); - } - - // Non-pretty-printed tags? - if (nonPpTags.hasOwnProperty(tagName)) { - // End tag? - if (match[1] == '/') { - // Do we have a matching start tag? - var stackSize = nonPpTagStack.length; - var startTagName = stackSize ? nonPpTagStack[stackSize - 1] : null; - if (startTagName == tagName) { - // End of non-pretty-printed block. Line break after. - nonPpTagStack.pop(); - buffer.pushToken(false, token, !nonPpTagStack.length); - } else { - // Malformed HTML. No line breaks. - buffer.pushToken(false, token, false); - } - } else { - // Start of non-pretty-printed block. Line break before. - buffer.pushToken(!nonPpTagStack.length, token, false); - nonPpTagStack.push(tagName); - } - } else if (nonPpTagStack.length) { - // Inside non-pretty-printed block, no new line breaks. - buffer.pushToken(false, token, false); - } else if (blockTags.hasOwnProperty(tagName)) { - // Put line break before start block and after end block tags. - var isEmpty = emptyTags.hasOwnProperty(tagName); - var isEndTag = match[1] == '/'; - buffer.pushToken(isEmpty || !isEndTag, token, isEmpty || isEndTag); - } else if (breaksFlowTags.hasOwnProperty(tagName)) { - var isEmpty = emptyTags.hasOwnProperty(tagName); - var isEndTag = match[1] == '/'; - // Put line break after end flow-breaking tags. - buffer.pushToken(false, token, isEndTag || isEmpty); - } else { - // All other tags, no line break. - buffer.pushToken(false, token, false); - } - } else { - // Non-tags, no line break. - buffer.pushToken(false, token, false); - } - - // Double check that we're making progress. - var newLastIndex = tokenRegex.lastIndex; - if (!token || newLastIndex <= lastIndex) { - throw Error('Regex failed to make progress through source html.'); - } - lastIndex = newLastIndex; - - // Out of time? - if (timeOutMillis) { - if (goog.now() - startMillis > timeOutMillis) { - // Push unprocessed data as one big token and reset regex object. - buffer.pushToken(false, html.substring(tokenRegex.lastIndex), false); - tokenRegex.lastIndex = 0; - break; - } - } - } - - // Ensure we end in a line break. - buffer.lineBreak(); - - // Construct result string. - var result = String(buffer); - - // Length should be original length plus # line breaks added. - var expectedLength = html.length + buffer.breakCount; - if (result.length != expectedLength) { - throw Error('Lost data pretty printing html.'); - } - - return result; -}; - - - -/** - * This class is a buffer to which we push our output. It tracks line breaks to - * make sure we don't add unnecessary ones. - * @constructor - */ -goog.format.HtmlPrettyPrinter.Buffer = function() { - /** - * Tokens to be output in #toString. - * @type {goog.string.StringBuffer} - * @private - */ - this.out_ = new goog.string.StringBuffer(); -}; - - -/** - * Tracks number of line breaks added. - * @type {number} - */ -goog.format.HtmlPrettyPrinter.Buffer.prototype.breakCount = 0; - - -/** - * Tracks if we are at the start of a new line. - * @type {boolean} - * @private - */ -goog.format.HtmlPrettyPrinter.Buffer.prototype.isBeginningOfNewLine_ = true; - - -/** - * Tracks if we need a new line before the next token. - * @type {boolean} - * @private - */ -goog.format.HtmlPrettyPrinter.Buffer.prototype.needsNewLine_ = false; - - -/** - * Adds token and necessary line breaks to output buffer. - * @param {boolean} breakBefore If true, add line break before token if - * necessary. - * @param {string} token Token to push. - * @param {boolean} breakAfter If true, add line break after token if - * necessary. - */ -goog.format.HtmlPrettyPrinter.Buffer.prototype.pushToken = function( - breakBefore, token, breakAfter) { - // If this token needs a preceeding line break, and - // we haven't already added a line break, and - // this token does not start with a line break, - // then add line break. - // Due to FF3.0 bug with lists, we don't insert a /n - // right before
. See bug 1520665. - if ((this.needsNewLine_ || breakBefore) && - !/^\r?\n/.test(token) && - !/\/ul/i.test(token)) { - this.lineBreak(); - } - - // Token. - this.out_.append(token); - - // Remember if this string ended with a line break so we know we don't have to - // insert another one before the next token. - this.isBeginningOfNewLine_ = /\r?\n$/.test(token); - - // Remember if this token requires a line break after it. We don't insert it - // here because we might not have to if the next token starts with a line - // break. - this.needsNewLine_ = breakAfter && !this.isBeginningOfNewLine_; -}; - - -/** - * Append line break if we need one. - */ -goog.format.HtmlPrettyPrinter.Buffer.prototype.lineBreak = function() { - if (!this.isBeginningOfNewLine_) { - this.out_.append('\n'); - ++this.breakCount; - } -}; - - -/** - * @return {string} String representation of tokens. - * @override - */ -goog.format.HtmlPrettyPrinter.Buffer.prototype.toString = function() { - return this.out_.toString(); -}; diff --git a/third_party/closure/goog/format/jsonprettyprinter.js b/third_party/closure/goog/format/jsonprettyprinter.js index 2f46a8bcd8802..32a07f26ca86a 100644 --- a/third_party/closure/goog/format/jsonprettyprinter.js +++ b/third_party/closure/goog/format/jsonprettyprinter.js @@ -362,6 +362,7 @@ goog.format.JsonPrettyPrinter.TextDelimiters.prototype.indent = 2; * to an HTML <pre> or <code> element. * @constructor * @extends {goog.format.JsonPrettyPrinter.TextDelimiters} + * @final */ goog.format.JsonPrettyPrinter.HtmlDelimiters = function() { goog.format.JsonPrettyPrinter.TextDelimiters.call(this); diff --git a/third_party/closure/goog/fs/entry.js b/third_party/closure/goog/fs/entry.js index eeec036360153..5ad90dca75896 100644 --- a/third_party/closure/goog/fs/entry.js +++ b/third_party/closure/goog/fs/entry.js @@ -257,8 +257,8 @@ goog.fs.FileEntry = function() {}; /** * Create a writer for writing to the file. * - * @return {!goog.async.Deferred} The deferred {@link goog.fs.FileWriter}. If an - * error occurs, the errback is called with a {@link goog.fs.Error}. + * @return {!goog.async.Deferred.} If an error occurs, the + * errback is called with a {@link goog.fs.Error}. */ goog.fs.FileEntry.prototype.createWriter = function() {}; @@ -266,7 +266,7 @@ goog.fs.FileEntry.prototype.createWriter = function() {}; /** * Get the file contents as a File blob. * - * @return {!goog.async.Deferred} The deferred File. If an error occurs, the - * errback is called with a {@link goog.fs.Error}. + * @return {!goog.async.Deferred.} If an error occurs, the errback is + * called with a {@link goog.fs.Error}. */ goog.fs.FileEntry.prototype.file = function() {}; diff --git a/third_party/closure/goog/fs/entryimpl.js b/third_party/closure/goog/fs/entryimpl.js index 4c38932dc3431..e0a9b36d3e796 100644 --- a/third_party/closure/goog/fs/entryimpl.js +++ b/third_party/closure/goog/fs/entryimpl.js @@ -104,7 +104,7 @@ goog.fs.EntryImpl.prototype.getMetadata = function() { function(metadata) { d.callback(metadata); }, goog.bind(function(err) { var msg = 'retrieving metadata for ' + this.getFullPath(); - d.errback(new goog.fs.Error(err.code, msg)); + d.errback(new goog.fs.Error(err, msg)); }, this)); return d; }; @@ -120,7 +120,7 @@ goog.fs.EntryImpl.prototype.moveTo = function(parent, opt_newName) { var msg = 'moving ' + this.getFullPath() + ' into ' + parent.getFullPath() + (opt_newName ? ', renaming to ' + opt_newName : ''); - d.errback(new goog.fs.Error(err.code, msg)); + d.errback(new goog.fs.Error(err, msg)); }, this)); return d; }; @@ -136,7 +136,7 @@ goog.fs.EntryImpl.prototype.copyTo = function(parent, opt_newName) { var msg = 'copying ' + this.getFullPath() + ' into ' + parent.getFullPath() + (opt_newName ? ', renaming to ' + opt_newName : ''); - d.errback(new goog.fs.Error(err.code, msg)); + d.errback(new goog.fs.Error(err, msg)); }, this)); return d; }; @@ -168,7 +168,7 @@ goog.fs.EntryImpl.prototype.remove = function() { goog.bind(d.callback, d, true /* result */), goog.bind(function(err) { var msg = 'removing ' + this.getFullPath(); - d.errback(new goog.fs.Error(err.code, msg)); + d.errback(new goog.fs.Error(err, msg)); }, this)); return d; }; @@ -183,7 +183,7 @@ goog.fs.EntryImpl.prototype.getParent = function() { }, this), goog.bind(function(err) { var msg = 'getting parent of ' + this.getFullPath(); - d.errback(new goog.fs.Error(err.code, msg)); + d.errback(new goog.fs.Error(err, msg)); }, this)); return d; }; @@ -202,9 +202,10 @@ goog.fs.EntryImpl.prototype.getParent = function() { * @constructor * @extends {goog.fs.EntryImpl} * @implements {goog.fs.DirectoryEntry} + * @final */ goog.fs.DirectoryEntryImpl = function(fs, dir) { - goog.base(this, fs, dir); + goog.fs.DirectoryEntryImpl.base(this, 'constructor', fs, dir); /** * The underlying DirectoryEntry object. @@ -227,7 +228,7 @@ goog.fs.DirectoryEntryImpl.prototype.getFile = function(path, opt_behavior) { }, this), goog.bind(function(err) { var msg = 'loading file ' + path + ' from ' + this.getFullPath(); - d.errback(new goog.fs.Error(err.code, msg)); + d.errback(new goog.fs.Error(err, msg)); }, this)); return d; }; @@ -244,7 +245,7 @@ goog.fs.DirectoryEntryImpl.prototype.getDirectory = }, this), goog.bind(function(err) { var msg = 'loading directory ' + path + ' from ' + this.getFullPath(); - d.errback(new goog.fs.Error(err.code, msg)); + d.errback(new goog.fs.Error(err, msg)); }, this)); return d; }; @@ -294,7 +295,7 @@ goog.fs.DirectoryEntryImpl.prototype.listDirectory = function() { var errorCallback = goog.bind(function(err) { var msg = 'listing directory ' + this.getFullPath(); - d.errback(new goog.fs.Error(err.code, msg)); + d.errback(new goog.fs.Error(err, msg)); }, this); var successCallback = goog.bind(function(entries) { @@ -320,7 +321,7 @@ goog.fs.DirectoryEntryImpl.prototype.removeRecursively = function() { goog.bind(d.callback, d, true /* result */), goog.bind(function(err) { var msg = 'removing ' + this.getFullPath() + ' recursively'; - d.errback(new goog.fs.Error(err.code, msg)); + d.errback(new goog.fs.Error(err, msg)); }, this)); return d; }; @@ -332,7 +333,7 @@ goog.fs.DirectoryEntryImpl.prototype.removeRecursively = function() { * * @param {goog.fs.DirectoryEntry.Behavior=} opt_behavior The behavior for * existing files. - * @return {Object.} The options object expected by the File API. + * @return {!Object.} The options object expected by the File API. * @private */ goog.fs.DirectoryEntryImpl.prototype.getOptions_ = function(opt_behavior) { @@ -358,9 +359,10 @@ goog.fs.DirectoryEntryImpl.prototype.getOptions_ = function(opt_behavior) { * @constructor * @extends {goog.fs.EntryImpl} * @implements {goog.fs.FileEntry} + * @final */ goog.fs.FileEntryImpl = function(fs, file) { - goog.base(this, fs, file); + goog.fs.FileEntryImpl.base(this, 'constructor', fs, file); /** * The underlying FileEntry object. @@ -380,7 +382,7 @@ goog.fs.FileEntryImpl.prototype.createWriter = function() { function(w) { d.callback(new goog.fs.FileWriter(w)); }, goog.bind(function(err) { var msg = 'creating writer for ' + this.getFullPath(); - d.errback(new goog.fs.Error(err.code, msg)); + d.errback(new goog.fs.Error(err, msg)); }, this)); return d; }; @@ -393,7 +395,7 @@ goog.fs.FileEntryImpl.prototype.file = function() { function(f) { d.callback(f); }, goog.bind(function(err) { var msg = 'getting file for ' + this.getFullPath(); - d.errback(new goog.fs.Error(err.code, msg)); + d.errback(new goog.fs.Error(err, msg)); }, this)); return d; }; diff --git a/third_party/closure/goog/fs/error.js b/third_party/closure/goog/fs/error.js index a4a8565bb97b0..d665d9eb25433 100644 --- a/third_party/closure/goog/fs/error.js +++ b/third_party/closure/goog/fs/error.js @@ -21,6 +21,7 @@ goog.provide('goog.fs.Error'); goog.provide('goog.fs.Error.ErrorCode'); goog.require('goog.debug.Error'); +goog.require('goog.object'); goog.require('goog.string'); @@ -30,24 +31,69 @@ goog.require('goog.string'); * are less useful for identifying where errors come from, so this includes a * large amount of metadata in the message. * - * @param {number} code The error code for the error. + * @param {!DOMError} error * @param {string} action The action being undertaken when the error was raised. * @constructor * @extends {goog.debug.Error} + * @final */ -goog.fs.Error = function(code, action) { - goog.base(this, goog.string.subs('Error %s: %s', action, - goog.fs.Error.getDebugMessage(code))); - this.code = /** @type {goog.fs.Error.ErrorCode} */ (code); +goog.fs.Error = function(error, action) { + /** @type {string} */ + this.name; + + /** + * @type {goog.fs.Error.ErrorCode} + * @deprecated Use the 'name' or 'message' field instead. + */ + this.code; + + if (goog.isDef(error.name)) { + this.name = error.name; + // TODO(user): Remove warning suppression after JSCompiler stops + // firing a spurious warning here. + /** @suppress {deprecated} */ + this.code = goog.fs.Error.getCodeFromName_(error.name); + } else { + this.code = error.code; + this.name = goog.fs.Error.getNameFromCode_(error.code); + } + goog.fs.Error.base(this, 'constructor', + goog.string.subs('%s %s', this.name, action)); }; goog.inherits(goog.fs.Error, goog.debug.Error); +/** + * Names of errors that may be thrown by the File API, the File System API, or + * the File Writer API. + * + * @see http://dev.w3.org/2006/webapi/FileAPI/#ErrorAndException + * @see http://www.w3.org/TR/file-system-api/#definitions + * @see http://dev.w3.org/2009/dap/file-system/file-writer.html#definitions + * @enum {string} + */ +goog.fs.Error.ErrorName = { + ABORT: 'AbortError', + ENCODING: 'EncodingError', + INVALID_MODIFICATION: 'InvalidModificationError', + INVALID_STATE: 'InvalidStateError', + NOT_FOUND: 'NotFoundError', + NOT_READABLE: 'NotReadableError', + NO_MODIFICATION_ALLOWED: 'NoModificationAllowedError', + PATH_EXISTS: 'PathExistsError', + QUOTA_EXCEEDED: 'QuotaExceededError', + SECURITY: 'SecurityError', + SYNTAX: 'SyntaxError', + TYPE_MISMATCH: 'TypeMismatchError' +}; + + /** * Error codes for file errors. * @see http://www.w3.org/TR/file-system-api/#idl-def-FileException * * @enum {number} + * @deprecated Use the 'name' or 'message' attribute instead. */ goog.fs.Error.ErrorCode = { NOT_FOUND: 1, @@ -66,37 +112,70 @@ goog.fs.Error.ErrorCode = { /** - * @param {number} errorCode The error code for the error. - * @return {string} A debug message for the given error code. These messages are - * for debugging only and are not localized. + * @param {goog.fs.Error.ErrorCode} code + * @return {string} name + * @private */ -goog.fs.Error.getDebugMessage = function(errorCode) { - switch (errorCode) { - case goog.fs.Error.ErrorCode.NOT_FOUND: - return 'File or directory not found'; - case goog.fs.Error.ErrorCode.SECURITY: - return 'Insecure or disallowed operation'; - case goog.fs.Error.ErrorCode.ABORT: - return 'Operation aborted'; - case goog.fs.Error.ErrorCode.NOT_READABLE: - return 'File or directory not readable'; - case goog.fs.Error.ErrorCode.ENCODING: - return 'Invalid encoding'; - case goog.fs.Error.ErrorCode.NO_MODIFICATION_ALLOWED: - return 'Cannot modify file or directory'; - case goog.fs.Error.ErrorCode.INVALID_STATE: - return 'Invalid state'; - case goog.fs.Error.ErrorCode.SYNTAX: - return 'Invalid line-ending specifier'; - case goog.fs.Error.ErrorCode.INVALID_MODIFICATION: - return 'Invalid modification'; - case goog.fs.Error.ErrorCode.QUOTA_EXCEEDED: - return 'Quota exceeded'; - case goog.fs.Error.ErrorCode.TYPE_MISMATCH: - return 'Invalid filetype'; - case goog.fs.Error.ErrorCode.PATH_EXISTS: - return 'File or directory already exists at specified path'; - default: - return 'Unrecognized error'; +goog.fs.Error.getNameFromCode_ = function(code) { + var name = goog.object.findKey(goog.fs.Error.NameToCodeMap_, function(c) { + return code == c; + }); + if (!goog.isDef(name)) { + throw new Error('Invalid code: ' + code); } + return name; }; + + +/** + * Returns the code that corresponds to the given name. + * @param {string} name + * @return {goog.fs.Error.ErrorCode} code + * @private + */ +goog.fs.Error.getCodeFromName_ = function(name) { + return goog.fs.Error.NameToCodeMap_[name]; +}; + + +/** + * Mapping from error names to values from the ErrorCode enum. + * @see http://www.w3.org/TR/file-system-api/#definitions. + * @private {!Object.} + */ +goog.fs.Error.NameToCodeMap_ = goog.object.create( + goog.fs.Error.ErrorName.ABORT, + goog.fs.Error.ErrorCode.ABORT, + + goog.fs.Error.ErrorName.ENCODING, + goog.fs.Error.ErrorCode.ENCODING, + + goog.fs.Error.ErrorName.INVALID_MODIFICATION, + goog.fs.Error.ErrorCode.INVALID_MODIFICATION, + + goog.fs.Error.ErrorName.INVALID_STATE, + goog.fs.Error.ErrorCode.INVALID_STATE, + + goog.fs.Error.ErrorName.NOT_FOUND, + goog.fs.Error.ErrorCode.NOT_FOUND, + + goog.fs.Error.ErrorName.NOT_READABLE, + goog.fs.Error.ErrorCode.NOT_READABLE, + + goog.fs.Error.ErrorName.NO_MODIFICATION_ALLOWED, + goog.fs.Error.ErrorCode.NO_MODIFICATION_ALLOWED, + + goog.fs.Error.ErrorName.PATH_EXISTS, + goog.fs.Error.ErrorCode.PATH_EXISTS, + + goog.fs.Error.ErrorName.QUOTA_EXCEEDED, + goog.fs.Error.ErrorCode.QUOTA_EXCEEDED, + + goog.fs.Error.ErrorName.SECURITY, + goog.fs.Error.ErrorCode.SECURITY, + + goog.fs.Error.ErrorName.SYNTAX, + goog.fs.Error.ErrorCode.SYNTAX, + + goog.fs.Error.ErrorName.TYPE_MISMATCH, + goog.fs.Error.ErrorCode.TYPE_MISMATCH); diff --git a/third_party/closure/goog/fs/filereader.js b/third_party/closure/goog/fs/filereader.js index 06e08298585bc..14d5245f35584 100644 --- a/third_party/closure/goog/fs/filereader.js +++ b/third_party/closure/goog/fs/filereader.js @@ -22,7 +22,6 @@ goog.provide('goog.fs.FileReader.EventType'); goog.provide('goog.fs.FileReader.ReadyState'); goog.require('goog.async.Deferred'); -goog.require('goog.events.Event'); goog.require('goog.events.EventTarget'); goog.require('goog.fs.Error'); goog.require('goog.fs.ProgressEvent'); @@ -35,9 +34,10 @@ goog.require('goog.fs.ProgressEvent'); * * @constructor * @extends {goog.events.EventTarget} + * @final */ goog.fs.FileReader = function() { - goog.base(this); + goog.fs.FileReader.base(this, 'constructor'); /** * The underlying FileReader object. @@ -123,7 +123,7 @@ goog.fs.FileReader.prototype.abort = function() { try { this.reader_.abort(); } catch (e) { - throw new goog.fs.Error(e.code, 'aborting read'); + throw new goog.fs.Error(e, 'aborting read'); } }; @@ -149,7 +149,7 @@ goog.fs.FileReader.prototype.getResult = function() { */ goog.fs.FileReader.prototype.getError = function() { return this.reader_.error && - new goog.fs.Error(this.reader_.error.code, 'reading file'); + new goog.fs.Error(this.reader_.error, 'reading file'); }; @@ -166,7 +166,7 @@ goog.fs.FileReader.prototype.dispatchProgressEvent_ = function(event) { /** @override */ goog.fs.FileReader.prototype.disposeInternal = function() { - goog.base(this, 'disposeInternal'); + goog.fs.FileReader.base(this, 'disposeInternal'); delete this.reader_; }; @@ -273,7 +273,7 @@ goog.fs.FileReader.readAsDataUrl = function(blob) { */ goog.fs.FileReader.createDeferred_ = function(reader) { var deferred = new goog.async.Deferred(); - reader.addEventListener(goog.fs.FileReader.EventType.LOAD_END, + reader.listen(goog.fs.FileReader.EventType.LOAD_END, goog.partial(function(d, r, e) { var result = r.getResult(); var error = r.getError(); diff --git a/third_party/closure/goog/fs/filesaver.js b/third_party/closure/goog/fs/filesaver.js index e6a3af3ebd1bf..6ee932ef8a838 100644 --- a/third_party/closure/goog/fs/filesaver.js +++ b/third_party/closure/goog/fs/filesaver.js @@ -22,7 +22,6 @@ goog.provide('goog.fs.FileSaver.EventType'); goog.provide('goog.fs.FileSaver.ProgressEvent'); goog.provide('goog.fs.FileSaver.ReadyState'); -goog.require('goog.events.Event'); goog.require('goog.events.EventTarget'); goog.require('goog.fs.Error'); goog.require('goog.fs.ProgressEvent'); @@ -42,7 +41,7 @@ goog.require('goog.fs.ProgressEvent'); * @extends {goog.events.EventTarget} */ goog.fs.FileSaver = function(fileSaver) { - goog.base(this); + goog.fs.FileSaver.base(this, 'constructor'); /** * The underlying FileSaver object. @@ -128,7 +127,7 @@ goog.fs.FileSaver.prototype.abort = function() { try { this.saver_.abort(); } catch (e) { - throw new goog.fs.Error(e.code, 'aborting save'); + throw new goog.fs.Error(e, 'aborting save'); } }; @@ -146,7 +145,7 @@ goog.fs.FileSaver.prototype.getReadyState = function() { */ goog.fs.FileSaver.prototype.getError = function() { return this.saver_.error && - new goog.fs.Error(this.saver_.error.code, 'saving file'); + new goog.fs.Error(this.saver_.error, 'saving file'); }; @@ -164,7 +163,7 @@ goog.fs.FileSaver.prototype.dispatchProgressEvent_ = function(event) { /** @override */ goog.fs.FileSaver.prototype.disposeInternal = function() { delete this.saver_; - goog.base(this, 'disposeInternal'); + goog.fs.FileSaver.base(this, 'disposeInternal'); }; @@ -172,5 +171,6 @@ goog.fs.FileSaver.prototype.disposeInternal = function() { * A wrapper for the progress events emitted by the FileSaver. * * @deprecated Use {goog.fs.ProgressEvent}. + * @final */ goog.fs.FileSaver.ProgressEvent = goog.fs.ProgressEvent; diff --git a/third_party/closure/goog/fs/filesystemimpl.js b/third_party/closure/goog/fs/filesystemimpl.js index 3f53c825dcd52..b5ebb33b00b5f 100644 --- a/third_party/closure/goog/fs/filesystemimpl.js +++ b/third_party/closure/goog/fs/filesystemimpl.js @@ -32,6 +32,7 @@ goog.require('goog.fs.FileSystem'); * @param {!FileSystem} fs The underlying FileSystem object. * @constructor * @implements {goog.fs.FileSystem} + * @final */ goog.fs.FileSystemImpl = function(fs) { /** diff --git a/third_party/closure/goog/fs/filewriter.js b/third_party/closure/goog/fs/filewriter.js index e4a0357b1a7aa..170984651d760 100644 --- a/third_party/closure/goog/fs/filewriter.js +++ b/third_party/closure/goog/fs/filewriter.js @@ -37,9 +37,10 @@ goog.require('goog.fs.FileSaver'); * @param {!FileWriter} writer The underlying FileWriter object. * @constructor * @extends {goog.fs.FileSaver} + * @final */ goog.fs.FileWriter = function(writer) { - goog.base(this, writer); + goog.fs.FileWriter.base(this, 'constructor', writer); /** * The underlying FileWriter object. @@ -77,7 +78,7 @@ goog.fs.FileWriter.prototype.write = function(blob) { try { this.writer_.write(blob); } catch (e) { - throw new goog.fs.Error(e.code, 'writing file'); + throw new goog.fs.Error(e, 'writing file'); } }; @@ -91,7 +92,7 @@ goog.fs.FileWriter.prototype.seek = function(offset) { try { this.writer_.seek(offset); } catch (e) { - throw new goog.fs.Error(e.code, 'seeking in file'); + throw new goog.fs.Error(e, 'seeking in file'); } }; @@ -105,6 +106,6 @@ goog.fs.FileWriter.prototype.truncate = function(size) { try { this.writer_.truncate(size); } catch (e) { - throw new goog.fs.Error(e.code, 'truncating file'); + throw new goog.fs.Error(e, 'truncating file'); } }; diff --git a/third_party/closure/goog/fs/fs.js b/third_party/closure/goog/fs/fs.js index 7ea8b00acd2ca..fa7ae542b2767 100644 --- a/third_party/closure/goog/fs/fs.js +++ b/third_party/closure/goog/fs/fs.js @@ -54,7 +54,7 @@ goog.fs.get_ = function(type, size) { requestFileSystem(type, size, function(fs) { d.callback(new goog.fs.FileSystemImpl(fs)); }, function(err) { - d.errback(new goog.fs.Error(err.code, 'requesting filesystem')); + d.errback(new goog.fs.Error(err, 'requesting filesystem')); }); return d; }; @@ -107,6 +107,7 @@ goog.fs.getPersistent = function(size) { /** * Creates a blob URL for a blob object. + * Throws an error if the browser does not support Object Urls. * * @param {!Blob} blob The object for which to create the URL. * @return {string} The URL for the object. @@ -118,6 +119,7 @@ goog.fs.createObjectUrl = function(blob) { /** * Revokes a URL created by {@link goog.fs.createObjectUrl}. + * Throws an error if the browser does not support Object Urls. * * @param {string} url The URL to revoke. */ @@ -128,7 +130,7 @@ goog.fs.revokeObjectUrl = function(url) { /** * @typedef {!{createObjectURL: (function(!Blob): string), - * revokeObjectURL: function(string): void}} + * revokeObjectURL: function(string): void}} */ goog.fs.UrlObject_; @@ -141,6 +143,24 @@ goog.fs.UrlObject_; * @private */ goog.fs.getUrlObject_ = function() { + var urlObject = goog.fs.findUrlObject_(); + if (urlObject != null) { + return urlObject; + } else { + throw Error('This browser doesn\'t seem to support blob URLs'); + } +}; + + +/** + * Finds the object that has the createObjectURL and revokeObjectURL functions + * for this browser. + * + * @return {?goog.fs.UrlObject_} The object for this browser or null if the + * browser does not support Object Urls. + * @private + */ +goog.fs.findUrlObject_ = function() { // This is what the spec says to do // http://dev.w3.org/2006/webapi/FileAPI/#dfn-createObjectURL if (goog.isDef(goog.global.URL) && @@ -154,11 +174,22 @@ goog.fs.getUrlObject_ = function() { } else if (goog.isDef(goog.global.createObjectURL)) { return /** @type {goog.fs.UrlObject_} */ (goog.global); } else { - throw Error('This browser doesn\'t seem to support blob URLs'); + return null; } }; +/** + * Checks whether this browser supports Object Urls. If not, calls to + * createObjectUrl and revokeObjectUrl will result in an error. + * + * @return {boolean} True if this browser supports Object Urls. + */ +goog.fs.browserSupportsObjectUrls = function() { + return goog.fs.findUrlObject_() != null; +}; + + /** * Concatenates one or more values together and converts them to a Blob. * @@ -176,7 +207,42 @@ goog.fs.getBlob = function(var_args) { } return bb.getBlob(); } else { - return new Blob(goog.array.toArray(arguments)); + return goog.fs.getBlobWithProperties(goog.array.toArray(arguments)); + } +}; + + +/** + * Creates a blob with the given properties. + * See https://developer.mozilla.org/en-US/docs/Web/API/Blob for more details. + * + * @param {Array.} parts The values that will make up the + * resulting blob. + * @param {string=} opt_type The MIME type of the Blob. + * @param {string=} opt_endings Specifies how strings containing newlines are to + * be written out. + * @return {!Blob} The blob. + */ +goog.fs.getBlobWithProperties = function(parts, opt_type, opt_endings) { + var BlobBuilder = goog.global.BlobBuilder || goog.global.WebKitBlobBuilder; + + if (goog.isDef(BlobBuilder)) { + var bb = new BlobBuilder(); + for (var i = 0; i < parts.length; i++) { + bb.append(parts[i], opt_endings); + } + return bb.getBlob(opt_type); + } else if (goog.isDef(goog.global.Blob)) { + var properties = {}; + if (opt_type) { + properties['type'] = opt_type; + } + if (opt_endings) { + properties['endings'] = opt_endings; + } + return new Blob(parts, properties); + } else { + throw Error('This browser doesn\'t seem to support creating Blobs'); } }; diff --git a/third_party/closure/goog/fs/progressevent.js b/third_party/closure/goog/fs/progressevent.js index 9d5c960f318ab..b0695bed9d397 100644 --- a/third_party/closure/goog/fs/progressevent.js +++ b/third_party/closure/goog/fs/progressevent.js @@ -29,9 +29,10 @@ goog.require('goog.events.Event'); * @param {!Object} target The file access object emitting the event. * @extends {goog.events.Event} * @constructor + * @final */ goog.fs.ProgressEvent = function(event, target) { - goog.base(this, event.type, target); + goog.fs.ProgressEvent.base(this, 'constructor', event.type, target); /** * The underlying event object. diff --git a/third_party/closure/goog/functions/functions.js b/third_party/closure/goog/functions/functions.js index 8e858899667f1..0c70f013834a3 100644 --- a/third_party/closure/goog/functions/functions.js +++ b/third_party/closure/goog/functions/functions.js @@ -14,7 +14,7 @@ /** * @fileoverview Utilities for creating functions. Loosely inspired by the - * java classes: http://go/functions.java and http://go/predicate.java. + * java classes: http://goo.gl/GM0Hmu and http://goo.gl/6k7nI8. * * @author nicksantos@google.com (Nick Santos) */ @@ -110,6 +110,18 @@ goog.functions.lock = function(f, opt_numArgs) { }; +/** + * Creates a function that returns its nth argument. + * @param {number} n The position of the return argument. + * @return {!Function} A new function. + */ +goog.functions.nth = function(n) { + return function() { + return arguments[n]; + }; +}; + + /** * Given a function, create a new function that swallows its return value * and replaces it with a new one. @@ -239,7 +251,10 @@ goog.functions.not = function(f) { * @return {!Object} A new instance of the class given in {@code constructor}. */ goog.functions.create = function(constructor, var_args) { - /** @constructor */ + /** + * @constructor + * @final + */ var temp = function() {}; temp.prototype = constructor.prototype; @@ -253,3 +268,44 @@ goog.functions.create = function(constructor, var_args) { constructor.apply(obj, Array.prototype.slice.call(arguments, 1)); return obj; }; + + +/** + * @define {boolean} Whether the return value cache should be used. + * This should only be used to disable caches when testing. + */ +goog.define('goog.functions.CACHE_RETURN_VALUE', true); + + +/** + * Gives a wrapper function that caches the return value of a parameterless + * function when first called. + * + * When called for the first time, the given function is called and its + * return value is cached (thus this is only appropriate for idempotent + * functions). Subsequent calls will return the cached return value. This + * allows the evaluation of expensive functions to be delayed until first used. + * + * To cache the return values of functions with parameters, see goog.memoize. + * + * @param {!function():T} fn A function to lazily evaluate. + * @return {!function():T} A wrapped version the function. + * @template T + */ +goog.functions.cacheReturnValue = function(fn) { + var called = false; + var value; + + return function() { + if (!goog.functions.CACHE_RETURN_VALUE) { + return fn(); + } + + if (!called) { + value = fn(); + called = true; + } + + return value; + } +}; diff --git a/third_party/closure/goog/fx/abstractdragdrop.js b/third_party/closure/goog/fx/abstractdragdrop.js index 288d9d08d9e57..8201756eef5bc 100644 --- a/third_party/closure/goog/fx/abstractdragdrop.js +++ b/third_party/closure/goog/fx/abstractdragdrop.js @@ -26,15 +26,15 @@ goog.provide('goog.fx.AbstractDragDrop.EventType'); goog.provide('goog.fx.DragDropEvent'); goog.provide('goog.fx.DragDropItem'); +goog.require('goog.asserts'); goog.require('goog.dom'); -goog.require('goog.dom.classes'); +goog.require('goog.dom.classlist'); goog.require('goog.events'); goog.require('goog.events.Event'); goog.require('goog.events.EventHandler'); goog.require('goog.events.EventTarget'); goog.require('goog.events.EventType'); goog.require('goog.fx.Dragger'); -goog.require('goog.fx.Dragger.EventType'); goog.require('goog.math.Box'); goog.require('goog.math.Coordinate'); goog.require('goog.style'); @@ -58,13 +58,13 @@ goog.require('goog.style'); * @constructor */ goog.fx.AbstractDragDrop = function() { - goog.base(this); + goog.fx.AbstractDragDrop.base(this, 'constructor'); /** * List of items that makes up the drag source or drop target. * @type {Array.} * @protected - * @suppress {underscore} + * @suppress {underscore|visibility} */ this.items_ = []; @@ -114,7 +114,7 @@ goog.fx.AbstractDragDrop.prototype.isTarget_ = false; /** * Subtargeting function accepting args: - * (Element, goog.math.Box, number, number) + * (goog.fx.DragDropItem, goog.math.Box, number, number) * @type {Function} * @private */ @@ -202,7 +202,8 @@ goog.fx.AbstractDragDrop.initDragDistanceThreshold = 5; /** * Set class to add to source elements being dragged. * - * @param {string} className Class to be added. + * @param {string} className Class to be added. Must be a single, valid + * classname. */ goog.fx.AbstractDragDrop.prototype.setDragClass = function(className) { this.dragClass_ = className; @@ -212,7 +213,8 @@ goog.fx.AbstractDragDrop.prototype.setDragClass = function(className) { /** * Set class to add to source elements. * - * @param {string} className Class to be added. + * @param {string} className Class to be added. Must be a single, valid + * classname. */ goog.fx.AbstractDragDrop.prototype.setSourceClass = function(className) { this.sourceClass_ = className; @@ -222,7 +224,8 @@ goog.fx.AbstractDragDrop.prototype.setSourceClass = function(className) { /** * Set class to add to target elements. * - * @param {string} className Class to be added. + * @param {string} className Class to be added. Must be a single, valid + * classname. */ goog.fx.AbstractDragDrop.prototype.setTargetClass = function(className) { this.targetClass_ = className; @@ -299,12 +302,14 @@ goog.fx.AbstractDragDrop.prototype.initItem = function(item) { goog.events.listen(item.element, goog.events.EventType.MOUSEDOWN, item.mouseDown_, false, item); if (this.sourceClass_) { - goog.dom.classes.add(item.element, this.sourceClass_); + goog.dom.classlist.add( + goog.asserts.assert(item.element), this.sourceClass_); } } if (this.isTarget_ && this.targetClass_) { - goog.dom.classes.add(item.element, this.targetClass_); + goog.dom.classlist.add( + goog.asserts.assert(item.element), this.targetClass_); } }; @@ -320,11 +325,13 @@ goog.fx.AbstractDragDrop.prototype.disposeItem = function(item) { goog.events.unlisten(item.element, goog.events.EventType.MOUSEDOWN, item.mouseDown_, false, item); if (this.sourceClass_) { - goog.dom.classes.remove(item.element, this.sourceClass_); + goog.dom.classlist.remove( + goog.asserts.assert(item.element), this.sourceClass_); } } if (this.isTarget_ && this.targetClass_) { - goog.dom.classes.remove(item.element, this.targetClass_); + goog.dom.classlist.remove( + goog.asserts.assert(item.element), this.targetClass_); } item.dispose(); }; @@ -465,7 +472,7 @@ goog.fx.AbstractDragDrop.prototype.recalculateScrollableContainers = * @param {Element} sourceEl Drag source element. * @param {Element} el the element created by createDragElement(). * @param {goog.events.BrowserEvent} event Mouse down event for start of drag. - * @return {goog.fx.Dragger} The new Dragger. + * @return {!goog.fx.Dragger} The new Dragger. * @protected */ goog.fx.AbstractDragDrop.prototype.createDraggerFor = @@ -781,9 +788,10 @@ goog.fx.AbstractDragDrop.prototype.setSubtargetFunction = function(f) { * @return {Element} The new drag element. */ goog.fx.AbstractDragDrop.prototype.createDragElement = function(sourceEl) { - var dragEl = this.cloneNode_(sourceEl); + var dragEl = this.createDragElementInternal(sourceEl); + goog.asserts.assert(dragEl); if (this.dragClass_) { - goog.dom.classes.add(dragEl, this.dragClass_); + goog.dom.classlist.add(dragEl, this.dragClass_); } return dragEl; @@ -796,7 +804,7 @@ goog.fx.AbstractDragDrop.prototype.createDragElement = function(sourceEl) { * @param {Element} el Drag source element. * @param {Element} dragEl The dragged element created by createDragElement(). * @param {goog.events.BrowserEvent} event Mouse down event for start of drag. - * @return {goog.math.Coordinate} The position for the drag element. + * @return {!goog.math.Coordinate} The position for the drag element. */ goog.fx.AbstractDragDrop.prototype.getDragElementPosition = function(el, dragEl, event) { @@ -827,23 +835,29 @@ goog.fx.AbstractDragDrop.prototype.getDragger = function() { * Creates copy of node being dragged. * * @param {Element} sourceEl Element to copy. - * @return {Element} The clone of {@code sourceEl}. + * @return {!Element} The clone of {@code sourceEl}. + * @deprecated Use goog.fx.Dragger.cloneNode(). * @private */ goog.fx.AbstractDragDrop.prototype.cloneNode_ = function(sourceEl) { - var clonedEl = /** @type {Element} */ (sourceEl.cloneNode(true)); - switch (sourceEl.tagName.toLowerCase()) { - case 'tr': - return goog.dom.createDom( - 'table', null, goog.dom.createDom('tbody', null, clonedEl)); - case 'td': - case 'th': - return goog.dom.createDom( - 'table', null, goog.dom.createDom('tbody', null, goog.dom.createDom( - 'tr', null, clonedEl))); - default: - return clonedEl; - } + return goog.fx.Dragger.cloneNode(sourceEl); +}; + + +/** + * Generates an element to follow the cursor during dragging, given a drag + * source element. The default behavior is simply to clone the source element, + * but this may be overridden in subclasses. This method is called by + * {@code createDragElement()} before the drag class is added. + * + * @param {Element} sourceEl Drag source element. + * @return {Element} The new drag element. + * @protected + * @suppress {deprecated} + */ +goog.fx.AbstractDragDrop.prototype.createDragElementInternal = + function(sourceEl) { + return this.cloneNode_(sourceEl); }; @@ -863,11 +877,7 @@ goog.fx.AbstractDragDrop.prototype.addDragTarget_ = function(target, item) { var draggableElement = draggableElements[i]; // Determine target position and dimension - var pos = goog.style.getPageOffset(draggableElement); - var size = goog.style.getSize(draggableElement); - - var box = new goog.math.Box(pos.y, pos.x + size.width, - pos.y + size.height, pos.x); + var box = this.getElementBox(item, draggableElement); targetList.push( new goog.fx.ActiveDropTarget_(box, target, item, draggableElement)); @@ -877,6 +887,24 @@ goog.fx.AbstractDragDrop.prototype.addDragTarget_ = function(target, item) { }; +/** + * Calculates the position and dimension of a draggable element. + * + * @param {goog.fx.DragDropItem} item Item that's being dragged. + * @param {Element} element The element to calculate the box. + * + * @return {!goog.math.Box} Box describing the position and dimension + * of element. + * @protected + */ +goog.fx.AbstractDragDrop.prototype.getElementBox = function(item, element) { + var pos = goog.style.getPageOffset(element); + var size = goog.style.getSize(element); + return new goog.math.Box(pos.y, pos.x + size.width, pos.y + size.height, + pos.x); +}; + + /** * Calculate the outer bounds (the region all targets are inside). * @@ -1096,7 +1124,7 @@ goog.fx.AbstractDragDrop.prototype.isInside = function(x, y, box) { /** * Gets the scroll distance as a coordinate object, using * the window of the current drag element's dom. - * @return {goog.math.Coordinate} Object with scroll offsets 'x' and 'y'. + * @return {!goog.math.Coordinate} Object with scroll offsets 'x' and 'y'. * @protected */ goog.fx.AbstractDragDrop.prototype.getScrollPos = function() { @@ -1107,7 +1135,7 @@ goog.fx.AbstractDragDrop.prototype.getScrollPos = function() { /** * Get the position of a drag event. * @param {goog.fx.DragEvent} event Drag event. - * @return {goog.math.Coordinate} Position of the event. + * @return {!goog.math.Coordinate} Position of the event. * @protected */ goog.fx.AbstractDragDrop.prototype.getEventPosition = function(event) { @@ -1119,7 +1147,7 @@ goog.fx.AbstractDragDrop.prototype.getEventPosition = function(event) { /** @override */ goog.fx.AbstractDragDrop.prototype.disposeInternal = function() { - goog.base(this, 'disposeInternal'); + goog.fx.AbstractDragDrop.base(this, 'disposeInternal'); this.removeItems(); }; @@ -1148,7 +1176,7 @@ goog.fx.DragDropEvent = function(type, source, sourceItem, opt_subtarget) { // TODO(eae): Get rid of all the optional parameters and have the caller set // the fields directly instead. - goog.base(this, type); + goog.fx.DragDropEvent.base(this, 'constructor', type); /** * Reference to the source goog.fx.AbstractDragDrop object. @@ -1231,7 +1259,7 @@ goog.fx.DragDropEvent.prototype.disposeInternal = function() { * @constructor */ goog.fx.DragDropItem = function(element, opt_data) { - goog.base(this); + goog.fx.DragDropItem.base(this, 'constructor'); /** * Reference to drag source/target element @@ -1254,7 +1282,7 @@ goog.fx.DragDropItem = function(element, opt_data) { /** * Event handler for listeners on events that can initiate a drag. - * @type {!goog.events.EventHandler} + * @type {!goog.events.EventHandler.} * @private */ this.eventHandler_ = new goog.events.EventHandler(this); @@ -1313,7 +1341,7 @@ goog.fx.DragDropItem.prototype.getCurrentDragElement = function() { /** * Gets all the elements of this item that are potentially draggable/ * - * @return {Array.} The draggable elements. + * @return {!Array.} The draggable elements. */ goog.fx.DragDropItem.prototype.getDraggableElements = function() { return [this.element]; diff --git a/third_party/closure/goog/fx/animation.js b/third_party/closure/goog/fx/animation.js index a8878375c19c2..c8fa0019578c1 100644 --- a/third_party/closure/goog/fx/animation.js +++ b/third_party/closure/goog/fx/animation.js @@ -46,7 +46,7 @@ goog.require('goog.fx.anim.Animated'); // Unreferenced: interface * @extends {goog.fx.TransitionBase} */ goog.fx.Animation = function(start, end, duration, opt_acc) { - goog.base(this); + goog.fx.Animation.base(this, 'constructor'); if (!goog.isArray(start) || !goog.isArray(end)) { throw Error('Start and end parameters must be arrays'); @@ -357,7 +357,7 @@ goog.fx.Animation.prototype.disposeInternal = function() { this.stop(false); } this.onDestroy(); - goog.base(this, 'disposeInternal'); + goog.fx.Animation.base(this, 'disposeInternal'); }; @@ -461,7 +461,7 @@ goog.fx.Animation.prototype.dispatchAnimationEvent = function(type) { * @extends {goog.events.Event} */ goog.fx.AnimationEvent = function(type, anim) { - goog.base(this, type); + goog.fx.AnimationEvent.base(this, 'constructor', type); /** * The current coordinates. @@ -522,7 +522,7 @@ goog.inherits(goog.fx.AnimationEvent, goog.events.Event); /** * Returns the coordinates as integers (rounded to nearest integer). - * @return {Array.} An array of the coordinates rounded to + * @return {!Array.} An array of the coordinates rounded to * the nearest integer. */ goog.fx.AnimationEvent.prototype.coordsAsInts = function() { diff --git a/third_party/closure/goog/fx/animationqueue.js b/third_party/closure/goog/fx/animationqueue.js index 7d3c3dad784ed..b0d817efe557c 100644 --- a/third_party/closure/goog/fx/animationqueue.js +++ b/third_party/closure/goog/fx/animationqueue.js @@ -40,7 +40,7 @@ goog.require('goog.fx.TransitionBase.State'); * @extends {goog.fx.TransitionBase} */ goog.fx.AnimationQueue = function() { - goog.base(this); + goog.fx.AnimationQueue.base(this, 'constructor'); /** * An array holding all animations in the queue. @@ -103,7 +103,7 @@ goog.fx.AnimationQueue.prototype.disposeInternal = function() { }); this.queue.length = 0; - goog.base(this, 'disposeInternal'); + goog.fx.AnimationQueue.base(this, 'disposeInternal'); }; @@ -114,7 +114,7 @@ goog.fx.AnimationQueue.prototype.disposeInternal = function() { * @extends {goog.fx.AnimationQueue} */ goog.fx.AnimationParallelQueue = function() { - goog.base(this); + goog.fx.AnimationParallelQueue.base(this, 'constructor'); /** * Number of finished animations. @@ -211,7 +211,7 @@ goog.fx.AnimationParallelQueue.prototype.onAnimationFinish = function(e) { * @extends {goog.fx.AnimationQueue} */ goog.fx.AnimationSerialQueue = function() { - goog.base(this); + goog.fx.AnimationSerialQueue.base(this, 'constructor'); /** * Current animation in queue currently active. diff --git a/third_party/closure/goog/fx/css3/transition.js b/third_party/closure/goog/fx/css3/transition.js index b0da78c77be91..75bfb21ac7142 100644 --- a/third_party/closure/goog/fx/css3/transition.js +++ b/third_party/closure/goog/fx/css3/transition.js @@ -66,7 +66,7 @@ goog.require('goog.style.transition'); */ goog.fx.css3.Transition = function( element, duration, initialStyle, finalStyle, transitions) { - goog.base(this); + goog.fx.css3.Transition.base(this, 'constructor'); /** * @type {Element} @@ -183,7 +183,7 @@ goog.fx.css3.Transition.prototype.stop_ = function(stopped) { /** @override */ goog.fx.css3.Transition.prototype.disposeInternal = function() { this.stop(); - goog.base(this, 'disposeInternal'); + goog.fx.css3.Transition.base(this, 'disposeInternal'); }; diff --git a/third_party/closure/goog/fx/cssspriteanimation.js b/third_party/closure/goog/fx/cssspriteanimation.js index 9d03576ff409e..83833e9b059ab 100644 --- a/third_party/closure/goog/fx/cssspriteanimation.js +++ b/third_party/closure/goog/fx/cssspriteanimation.js @@ -47,12 +47,14 @@ goog.require('goog.fx.Animation'); * * @constructor * @extends {goog.fx.Animation} + * @final */ goog.fx.CssSpriteAnimation = function(element, size, box, time, opt_acc) { var start = [box.left, box.top]; // We never draw for the end so we do not need to subtract for the size var end = [box.right, box.bottom]; - goog.base(this, start, end, time, opt_acc); + goog.fx.CssSpriteAnimation.base( + this, 'constructor', start, end, time, opt_acc); /** * HTML element that will be used in the animation. @@ -78,14 +80,14 @@ goog.fx.CssSpriteAnimation.prototype.onAnimate = function() { var y = -Math.floor(this.coords[1] / this.size_.height) * this.size_.height; this.element_.style.backgroundPosition = x + 'px ' + y + 'px'; - goog.base(this, 'onAnimate'); + goog.fx.CssSpriteAnimation.base(this, 'onAnimate'); }; /** @override */ goog.fx.CssSpriteAnimation.prototype.onFinish = function() { this.play(true); - goog.base(this, 'onFinish'); + goog.fx.CssSpriteAnimation.base(this, 'onFinish'); }; diff --git a/third_party/closure/goog/fx/dom.js b/third_party/closure/goog/fx/dom.js index 0d32cf1f4ac44..8f041a2e1492e 100644 --- a/third_party/closure/goog/fx/dom.js +++ b/third_party/closure/goog/fx/dom.js @@ -38,7 +38,7 @@ goog.provide('goog.fx.dom.Swipe'); goog.require('goog.color'); goog.require('goog.events'); goog.require('goog.fx.Animation'); -goog.require('goog.fx.Transition.EventType'); +goog.require('goog.fx.Transition'); goog.require('goog.style'); goog.require('goog.style.bidi'); @@ -206,14 +206,14 @@ goog.fx.dom.Swipe = function(element, start, end, time, opt_acc) { } goog.fx.dom.PredefinedEffect.apply(this, arguments); - /* + /** * Maximum width for element. * @type {number} * @private */ this.maxWidth_ = Math.max(this.endPoint[0], this.startPoint[0]); - /* + /** * Maximum height for element. * @type {number} * @private @@ -280,7 +280,7 @@ goog.inherits(goog.fx.dom.Scroll, goog.fx.dom.PredefinedEffect); /** - * Animation event handler that will set the scroll posiiton of an element + * Animation event handler that will set the scroll position of an element. * @protected * @override */ @@ -512,7 +512,7 @@ goog.fx.dom.FadeOutAndHide.prototype.onEnd = function() { /** * Sets an element's display to be visible and then fades an element in from - * completely transparent to fully opacity + * completely transparent to fully opaque. * * @param {Element} element Dom Node to be used in the animation. * @param {number} time Length of animation in milliseconds. diff --git a/third_party/closure/goog/fx/dragger.js b/third_party/closure/goog/fx/dragger.js index e2f13f7800071..106ce48dd7689 100644 --- a/third_party/closure/goog/fx/dragger.js +++ b/third_party/closure/goog/fx/dragger.js @@ -83,6 +83,40 @@ goog.fx.Dragger.HAS_SET_CAPTURE_ = goog.userAgent.GECKO && goog.userAgent.isVersionOrHigher('1.9.3'); +/** + * Creates copy of node being dragged. This is a utility function to be used + * wherever it is inappropriate for the original source to follow the mouse + * cursor itself. + * + * @param {Element} sourceEl Element to copy. + * @return {!Element} The clone of {@code sourceEl}. + */ +goog.fx.Dragger.cloneNode = function(sourceEl) { + var clonedEl = /** @type {Element} */ (sourceEl.cloneNode(true)), + origTexts = sourceEl.getElementsByTagName('textarea'), + dragTexts = clonedEl.getElementsByTagName('textarea'); + // Cloning does not copy the current value of textarea elements, so correct + // this manually. + for (var i = 0; i < origTexts.length; i++) { + dragTexts[i].value = origTexts[i].value; + } + switch (sourceEl.tagName.toLowerCase()) { + case 'tr': + return goog.dom.createDom( + 'table', null, goog.dom.createDom('tbody', null, clonedEl)); + case 'td': + case 'th': + return goog.dom.createDom( + 'table', null, goog.dom.createDom('tbody', null, goog.dom.createDom( + 'tr', null, clonedEl))); + case 'textarea': + clonedEl.value = sourceEl.value; + default: + return clonedEl; + } +}; + + /** * Constants for event names. * @enum {string} @@ -279,7 +313,9 @@ goog.fx.Dragger.prototype.enableRightPositioningForRtl = /** * Returns the event handler, intended for subclass use. - * @return {goog.events.EventHandler} The event handler. + * @return {goog.events.EventHandler.} The event handler. + * @this T + * @template T */ goog.fx.Dragger.prototype.getHandler = function() { return this.eventHandler_; @@ -418,9 +454,7 @@ goog.fx.Dragger.prototype.startDrag = function(e) { this.clientY = this.startY = e.clientY; this.screenX = e.screenX; this.screenY = e.screenY; - this.deltaX = this.useRightPositioningForRtl_ ? - goog.style.bidi.getOffsetStart(this.target) : this.target.offsetLeft; - this.deltaY = this.target.offsetTop; + this.computeInitialPosition(); this.pageScroll = goog.dom.getDomHelper(this.document_).getDocumentScroll(); this.mouseDownTime_ = goog.now(); @@ -616,7 +650,7 @@ goog.fx.Dragger.prototype.handleMove_ = function(e) { * * @param {number} dx The horizontal movement delta. * @param {number} dy The vertical movement delta. - * @return {goog.math.Coordinate} The newly calculated drag element position. + * @return {!goog.math.Coordinate} The newly calculated drag element position. * @private */ goog.fx.Dragger.prototype.calculatePosition_ = function(dx, dy) { @@ -696,6 +730,18 @@ goog.fx.Dragger.prototype.limitY = function(y) { }; +/** + * Overridable function for computing the initial position of the target + * before dragging begins. + * @protected + */ +goog.fx.Dragger.prototype.computeInitialPosition = function() { + this.deltaX = this.useRightPositioningForRtl_ ? + goog.style.bidi.getOffsetStart(this.target) : this.target.offsetLeft; + this.deltaY = this.target.offsetTop; +}; + + /** * Overridable function for handling the default action of the drag behaviour. * Normally this is simply moving the element to x,y though in some cases it diff --git a/third_party/closure/goog/fx/draglistgroup.js b/third_party/closure/goog/fx/draglistgroup.js index 6f36719afc02a..9e83ba6e6f2aa 100644 --- a/third_party/closure/goog/fx/draglistgroup.js +++ b/third_party/closure/goog/fx/draglistgroup.js @@ -25,17 +25,18 @@ goog.provide('goog.fx.DragListGroup'); goog.provide('goog.fx.DragListGroup.EventType'); goog.provide('goog.fx.DragListGroupEvent'); +goog.require('goog.array'); goog.require('goog.asserts'); goog.require('goog.dom'); -goog.require('goog.dom.NodeType'); -goog.require('goog.dom.classes'); +goog.require('goog.dom.classlist'); +goog.require('goog.events'); goog.require('goog.events.Event'); goog.require('goog.events.EventHandler'); goog.require('goog.events.EventTarget'); goog.require('goog.events.EventType'); goog.require('goog.fx.Dragger'); -goog.require('goog.fx.Dragger.EventType'); goog.require('goog.math.Coordinate'); +goog.require('goog.string'); goog.require('goog.style'); @@ -83,7 +84,7 @@ goog.fx.DragListGroup = function() { /** * The event handler for this instance. - * @type {goog.events.EventHandler} + * @type {goog.events.EventHandler.} * @private */ this.eventHandler_ = new goog.events.EventHandler(this); @@ -174,12 +175,12 @@ goog.fx.DragListGroup.prototype.currDragItemClasses_; /** - * The user-supplied CSS class to add to the clone of the current drag item + * The user-supplied CSS classes to add to the clone of the current drag item * that's actually being dragged around (during a drag action). - * @type {string|undefined} + * @type {Array.|undefined} * @private */ -goog.fx.DragListGroup.prototype.draggerElClass_; +goog.fx.DragListGroup.prototype.draggerElClasses_; // The next 5 are info applicable during a drag action. @@ -315,7 +316,8 @@ goog.fx.DragListGroup.prototype.getHysteresis = function() { * bounding box expands in this direction). * @param {boolean=} opt_unused Unused argument. * @param {string=} opt_dragHoverClass CSS class to apply to this drag list when - * the draggerEl hovers over it during a drag action. + * the draggerEl hovers over it during a drag action. If present, must be a + * single, valid classname (not a string of space-separated classnames). */ goog.fx.DragListGroup.prototype.addDragList = function( dragListElement, growthDirection, opt_unused, opt_dragHoverClass) { @@ -393,7 +395,8 @@ goog.fx.DragListGroup.prototype.setCurrDragItemClass = function(var_args) { */ goog.fx.DragListGroup.prototype.setDraggerElClass = function(draggerElClass) { goog.asserts.assert(!this.isInitialized_); - this.draggerElClass_ = draggerElClass; + // Split space-separated classes up into an array. + this.draggerElClasses_ = goog.string.trim(draggerElClass).split(' '); }; @@ -410,33 +413,7 @@ goog.fx.DragListGroup.prototype.init = function() { var dragItems = goog.dom.getChildren(dragList); for (var j = 0, numItems = dragItems.length; j < numItems; ++j) { - var dragItem = dragItems[j]; - var dragItemHandle = this.getHandleForDragItem_(dragItem); - - var uid = goog.getUid(dragItemHandle); - this.dragItemForHandle_[uid] = dragItem; - - if (this.dragItemHoverClasses_) { - this.eventHandler_.listen( - dragItem, goog.events.EventType.MOUSEOVER, - this.handleDragItemMouseover_); - this.eventHandler_.listen( - dragItem, goog.events.EventType.MOUSEOUT, - this.handleDragItemMouseout_); - } - if (this.dragItemHandleHoverClasses_) { - this.eventHandler_.listen( - dragItemHandle, goog.events.EventType.MOUSEOVER, - this.handleDragItemHandleMouseover_); - this.eventHandler_.listen( - dragItemHandle, goog.events.EventType.MOUSEOUT, - this.handleDragItemHandleMouseout_); - } - - this.dragItems_.push(dragItem); - this.eventHandler_.listen(dragItemHandle, - [goog.events.EventType.MOUSEDOWN, goog.events.EventType.TOUCHSTART], - this.handlePotentialDragStart_); + this.listenForDragEvents(dragItems[j]); } } @@ -444,6 +421,28 @@ goog.fx.DragListGroup.prototype.init = function() { }; +/** + * Adds a single item to the given drag list and sets up the drag listeners for + * it. + * If opt_index is specified the item is inserted at this index, otherwise the + * item is added as the last child of the list. + * + * @param {!Element} list The drag list where to add item to. + * @param {!Element} item The new element to add. + * @param {number=} opt_index Index where to insert the item in the list. If not + * specified item is inserted as the last child of list. + */ +goog.fx.DragListGroup.prototype.addItemToDragList = function(list, item, + opt_index) { + if (goog.isDef(opt_index)) { + goog.dom.insertChildAt(list, item, opt_index); + } else { + goog.dom.appendChild(list, item); + } + this.listenForDragEvents(item); +}; + + /** @override */ goog.fx.DragListGroup.prototype.disposeInternal = function() { this.eventHandler_.dispose(); @@ -491,6 +490,43 @@ goog.fx.DragListGroup.prototype.recacheListAndItemBounds_ = function( }; +/** + * Listens for drag events on the given drag item. This method is currently used + * to initialize drag items. + * + * @param {Element} dragItem the element to initialize. This element has to be + * in one of the drag lists. + * @protected + */ +goog.fx.DragListGroup.prototype.listenForDragEvents = function(dragItem) { + var dragItemHandle = this.getHandleForDragItem_(dragItem); + var uid = goog.getUid(dragItemHandle); + this.dragItemForHandle_[uid] = dragItem; + + if (this.dragItemHoverClasses_) { + this.eventHandler_.listen( + dragItem, goog.events.EventType.MOUSEOVER, + this.handleDragItemMouseover_); + this.eventHandler_.listen( + dragItem, goog.events.EventType.MOUSEOUT, + this.handleDragItemMouseout_); + } + if (this.dragItemHandleHoverClasses_) { + this.eventHandler_.listen( + dragItemHandle, goog.events.EventType.MOUSEOVER, + this.handleDragItemHandleMouseover_); + this.eventHandler_.listen( + dragItemHandle, goog.events.EventType.MOUSEOUT, + this.handleDragItemHandleMouseout_); + } + + this.dragItems_.push(dragItem); + this.eventHandler_.listen(dragItemHandle, + [goog.events.EventType.MOUSEDOWN, goog.events.EventType.TOUCHSTART], + this.handlePotentialDragStart_); +}; + + /** * Handles mouse and touch events which may start a drag action. * @param {!goog.events.BrowserEvent} e MOUSEDOWN or TOUCHSTART event. @@ -500,10 +536,11 @@ goog.fx.DragListGroup.prototype.handlePotentialDragStart_ = function(e) { var uid = goog.getUid(/** @type {Node} */ (e.currentTarget)); this.currDragItem_ = /** @type {Element} */ (this.dragItemForHandle_[uid]); - this.draggerEl_ = this.cloneNode_(this.currDragItem_); - if (this.draggerElClass_) { + this.draggerEl_ = this.createDragElementInternal(this.currDragItem_); + if (this.draggerElClasses_) { // Add CSS class for the clone, if any. - goog.dom.classes.add(this.draggerEl_, this.draggerElClass_); + goog.dom.classlist.addAll( + goog.asserts.assert(this.draggerEl_), this.draggerElClasses_ || []); } // Place the clone (i.e. draggerEl) at the same position as the actual @@ -541,6 +578,36 @@ goog.fx.DragListGroup.prototype.handlePotentialDragStart_ = function(e) { }; +/** + * Creates copy of node being dragged. + * + * @param {Element} sourceEl Element to copy. + * @return {!Element} The clone of {@code sourceEl}. + * @deprecated Use goog.fx.Dragger.cloneNode(). + * @private + */ +goog.fx.DragListGroup.prototype.cloneNode_ = function(sourceEl) { + return goog.fx.Dragger.cloneNode(sourceEl); +}; + + +/** + * Generates an element to follow the cursor during dragging, given a drag + * source element. The default behavior is simply to clone the source element, + * but this may be overridden in subclasses. This method is called by + * {@code createDragElement()} before the drag class is added. + * + * @param {Element} sourceEl Drag source element. + * @return {!Element} The new drag element. + * @protected + * @suppress {deprecated} + */ +goog.fx.DragListGroup.prototype.createDragElementInternal = + function(sourceEl) { + return this.cloneNode_(sourceEl); +}; + + /** * Handles the start of a drag action. * @param {!goog.fx.DragEvent} e goog.fx.Dragger.EventType.START event. @@ -565,8 +632,9 @@ goog.fx.DragListGroup.prototype.handleDragStart_ = function(e) { // If there's a CSS class specified for the current drag item, add it. // Otherwise, make the actual current drag item hidden (takes up space). if (this.currDragItemClasses_) { - goog.dom.classes.add.apply(null, - goog.array.concat(this.currDragItem_, this.currDragItemClasses_)); + goog.dom.classlist.addAll( + goog.asserts.assert(this.currDragItem_), + this.currDragItemClasses_ || []); } else { this.currDragItem_.style.visibility = 'hidden'; } @@ -642,7 +710,8 @@ goog.fx.DragListGroup.prototype.handleDragMove_ = function(dragEvent) { this.currDragItem_.style.display = ''; // Add drag list's hover class (if any). if (hoverList.dlgDragHoverClass_) { - goog.dom.classes.add(hoverList, hoverList.dlgDragHoverClass_); + goog.dom.classlist.add( + goog.asserts.assert(hoverList), hoverList.dlgDragHoverClass_); } } else { @@ -656,7 +725,8 @@ goog.fx.DragListGroup.prototype.handleDragMove_ = function(dragEvent) { for (var i = 0, n = this.dragLists_.length; i < n; i++) { var dragList = this.dragLists_[i]; if (dragList.dlgDragHoverClass_) { - goog.dom.classes.remove(dragList, dragList.dlgDragHoverClass_); + goog.dom.classlist.remove( + goog.asserts.assert(dragList), dragList.dlgDragHoverClass_); } } } @@ -770,8 +840,9 @@ goog.fx.DragListGroup.prototype.cleanupDragDom_ = function() { // If there's a CSS class specified for the current drag item, remove it. // Otherwise, make the current drag item visible (instead of empty space). if (this.currDragItemClasses_ && this.currDragItem_) { - goog.dom.classes.remove.apply(null, - goog.array.concat(this.currDragItem_, this.currDragItemClasses_)); + goog.dom.classlist.removeAll( + goog.asserts.assert(this.currDragItem_), + this.currDragItemClasses_ || []); } else if (this.currDragItem_) { this.currDragItem_.style.visibility = 'visible'; } @@ -780,7 +851,8 @@ goog.fx.DragListGroup.prototype.cleanupDragDom_ = function() { for (var i = 0, n = this.dragLists_.length; i < n; i++) { var dragList = this.dragLists_[i]; if (dragList.dlgDragHoverClass_) { - goog.dom.classes.remove(dragList, dragList.dlgDragHoverClass_); + goog.dom.classlist.remove( + goog.asserts.assert(dragList), dragList.dlgDragHoverClass_); } } }; @@ -806,9 +878,8 @@ goog.fx.DragListGroup.prototype.getHandleForDragItem_ = function(dragItem) { * @private */ goog.fx.DragListGroup.prototype.handleDragItemMouseover_ = function(e) { - goog.dom.classes.add.apply(null, - goog.array.concat(/** @type {Element} */ (e.currentTarget), - this.dragItemHoverClasses_)); + var targetEl = goog.asserts.assertElement(e.currentTarget); + goog.dom.classlist.addAll(targetEl, this.dragItemHoverClasses_ || []); }; @@ -818,9 +889,8 @@ goog.fx.DragListGroup.prototype.handleDragItemMouseover_ = function(e) { * @private */ goog.fx.DragListGroup.prototype.handleDragItemMouseout_ = function(e) { - goog.dom.classes.remove.apply(null, - goog.array.concat(/** @type {Element} */ (e.currentTarget), - this.dragItemHoverClasses_)); + var targetEl = goog.asserts.assertElement(e.currentTarget); + goog.dom.classlist.removeAll(targetEl, this.dragItemHoverClasses_ || []); }; @@ -830,9 +900,8 @@ goog.fx.DragListGroup.prototype.handleDragItemMouseout_ = function(e) { * @private */ goog.fx.DragListGroup.prototype.handleDragItemHandleMouseover_ = function(e) { - goog.dom.classes.add.apply(null, - goog.array.concat(/** @type {Element} */ (e.currentTarget), - this.dragItemHandleHoverClasses_)); + var targetEl = goog.asserts.assertElement(e.currentTarget); + goog.dom.classlist.addAll(targetEl, this.dragItemHandleHoverClasses_ || []); }; @@ -842,9 +911,9 @@ goog.fx.DragListGroup.prototype.handleDragItemHandleMouseover_ = function(e) { * @private */ goog.fx.DragListGroup.prototype.handleDragItemHandleMouseout_ = function(e) { - goog.dom.classes.remove.apply(null, - goog.array.concat(/** @type {Element} */ (e.currentTarget), - this.dragItemHandleHoverClasses_)); + var targetEl = goog.asserts.assertElement(e.currentTarget); + goog.dom.classlist.removeAll(targetEl, + this.dragItemHandleHoverClasses_ || []); }; @@ -1153,31 +1222,6 @@ goog.fx.DragListGroup.prototype.insertCurrDragItem_ = function( }; -/** - * Note: Copied from abstractdragdrop.js. TODO(user): consolidate. - * Creates copy of node being dragged. - * - * @param {Element} sourceEl Element to copy. - * @return {Element} The clone of {@code sourceEl}. - * @private - */ -goog.fx.DragListGroup.prototype.cloneNode_ = function(sourceEl) { - var clonedEl = /** @type {Element} */ (sourceEl.cloneNode(true)); - switch (sourceEl.tagName.toLowerCase()) { - case 'tr': - return goog.dom.createDom( - 'table', null, goog.dom.createDom('tbody', null, clonedEl)); - case 'td': - case 'th': - return goog.dom.createDom( - 'table', null, goog.dom.createDom('tbody', null, goog.dom.createDom( - 'tr', null, clonedEl))); - default: - return clonedEl; - } -}; - - /** * The event object dispatched by DragListGroup. diff --git a/third_party/closure/goog/fx/dragscrollsupport.js b/third_party/closure/goog/fx/dragscrollsupport.js index a1e20980290fa..f20db66214ac7 100644 --- a/third_party/closure/goog/fx/dragscrollsupport.js +++ b/third_party/closure/goog/fx/dragscrollsupport.js @@ -69,7 +69,7 @@ goog.fx.DragScrollSupport = function(containerNode, opt_margin, /** * EventHandler used to set up and tear down listeners. - * @type {goog.events.EventHandler} + * @type {goog.events.EventHandler.} * @private */ this.eventHandler_ = new goog.events.EventHandler(this); diff --git a/third_party/closure/goog/fx/easing.js b/third_party/closure/goog/fx/easing.js index dbbe77ead5bf1..78bdcd78f58c7 100644 --- a/third_party/closure/goog/fx/easing.js +++ b/third_party/closure/goog/fx/easing.js @@ -26,7 +26,19 @@ goog.provide('goog.fx.easing'); * @return {number} Output between 0 and 1. */ goog.fx.easing.easeIn = function(t) { - return t * t * t; + return goog.fx.easing.easeInInternal_(t, 3); +}; + + +/** + * Ease in with specifiable exponent. + * @param {number} t Input between 0 and 1. + * @param {number} exp Ease exponent. + * @return {number} Output between 0 and 1. + * @private + */ +goog.fx.easing.easeInInternal_ = function(t, exp) { + return Math.pow(t, exp); }; @@ -36,7 +48,29 @@ goog.fx.easing.easeIn = function(t) { * @return {number} Output between 0 and 1. */ goog.fx.easing.easeOut = function(t) { - return 1 - Math.pow(1 - t, 3); + return goog.fx.easing.easeOutInternal_(t, 3); +}; + + +/** + * Ease out with specifiable exponent. + * @param {number} t Input between 0 and 1. + * @param {number} exp Ease exponent. + * @return {number} Output between 0 and 1. + * @private + */ +goog.fx.easing.easeOutInternal_ = function(t, exp) { + return 1 - goog.fx.easing.easeInInternal_(1 - t, exp); +}; + + +/** + * Ease out long - Start fastest and slows to a stop with a long ease. + * @param {number} t Input between 0 and 1. + * @return {number} Output between 0 and 1. + */ +goog.fx.easing.easeOutLong = function(t) { + return goog.fx.easing.easeOutInternal_(t, 4); }; diff --git a/third_party/closure/goog/fx/transitionbase.js b/third_party/closure/goog/fx/transitionbase.js index 43f653cdeb731..590f03353a38f 100644 --- a/third_party/closure/goog/fx/transitionbase.js +++ b/third_party/closure/goog/fx/transitionbase.js @@ -34,7 +34,7 @@ goog.require('goog.fx.Transition.EventType'); * @extends {goog.events.EventTarget} */ goog.fx.TransitionBase = function() { - goog.base(this); + goog.fx.TransitionBase.base(this, 'constructor'); /** * The internal state of the animation. diff --git a/third_party/closure/goog/gears/basestore.js b/third_party/closure/goog/gears/basestore.js deleted file mode 100644 index 5db01fa1d76c2..0000000000000 --- a/third_party/closure/goog/gears/basestore.js +++ /dev/null @@ -1,521 +0,0 @@ -// 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 Definition of goog.gears.BaseStore which - * is a base class for the various database stores. It provides - * the basic structure for creating, updating and removing the store, as well - * as versioning. It also provides ways to interconnect stores. - * - */ - -goog.provide('goog.gears.BaseStore'); -goog.provide('goog.gears.BaseStore.SchemaType'); - -goog.require('goog.Disposable'); - - - -/** - * This class implements the common store functionality - * - * @param {goog.gears.Database} database The data base to store the data in. - * @constructor - * @extends {goog.Disposable} - */ -goog.gears.BaseStore = function(database) { - goog.Disposable.call(this); - - /** - * The underlying database that holds the message store. - * @private - * @type {goog.gears.Database} - */ - this.database_ = database; -}; -goog.inherits(goog.gears.BaseStore, goog.Disposable); - - -/** - * Schema definition types - * @enum {number} - */ -goog.gears.BaseStore.SchemaType = { - TABLE: 1, - VIRTUAL_TABLE: 2, - INDEX: 3, - BEFORE_INSERT_TRIGGER: 4, - AFTER_INSERT_TRIGGER: 5, - BEFORE_UPDATE_TRIGGER: 6, - AFTER_UPDATE_TRIGGER: 7, - BEFORE_DELETE_TRIGGER: 8, - AFTER_DELETE_TRIGGER: 9 -}; - - -/** - * The name of the store. Subclasses should override and choose their own - * name. That name is used for the maintaining the version string - * @protected - * @type {string} - */ -goog.gears.BaseStore.prototype.name = 'Base'; - - -/** - * The version number of the database schema. It is used to determine whether - * the store's portion of the database needs to be updated. Subclassses should - * override this value. - * @protected - * @type {number} - */ -goog.gears.BaseStore.prototype.version = 1; - - -/** - * The database schema for the store. This is an array of objects, where each - * object describes a database object (table, index, trigger). Documentation - * about the object's fields can be found in the #createSchema documentation. - * This is in the prototype so that it can be overriden by the subclass. This - * field is read only. - * @protected - * @type {Array.} - */ -goog.gears.BaseStore.prototype.schema = []; - - -/** - * Gets the underlying database. - * @return {goog.gears.Database} - * @protected - */ -goog.gears.BaseStore.prototype.getDatabaseInternal = function() { - return this.database_; -}; - - -/** - * Updates the tables for the message store in the case where - * they are out of date. - * - * @protected - * @param {number} persistedVersion the current version of the tables in the - * database. - */ -goog.gears.BaseStore.prototype.updateStore = function(persistedVersion) { - // TODO(user): Need to figure out how to handle updates - // where to store the version number and is it globale or per unit. -}; - - -/** - * Preloads any applicable data into the tables. - * - * @protected - */ -goog.gears.BaseStore.prototype.loadData = function() { -}; - - -/** - * Creates in memory cache of data that is stored in the tables. - * - * @protected - */ -goog.gears.BaseStore.prototype.getCachedData = function() { -}; - - -/** - * Informs other stores that this store exists . - * - * @protected - */ -goog.gears.BaseStore.prototype.informOtherStores = function() { -}; - - -/** - * Makes sure that tables needed for the store exist and are up to date. - */ -goog.gears.BaseStore.prototype.ensureStoreExists = function() { - var persistedVersion = this.getStoreVersion(); - - if (persistedVersion) { - if (persistedVersion != this.version) { - // update - this.database_.begin(); - try { - this.updateStore(persistedVersion); - this.setStoreVersion_(this.version); - this.database_.commit(); - } catch (ex) { - this.database_.rollback(ex); - throw Error('Could not update the ' + this.name + ' schema ' + - ' from version ' + persistedVersion + ' to ' + this.version + - ': ' + (ex.message || 'unknown exception')); - } - } - } else { - // create - this.database_.begin(); - try { - // This is rarely necessary, but it's possible if we rolled back a - // release and dropped the schema on version n-1 before installing - // again on version n. - this.dropSchema(this.schema); - - this.createSchema(this.schema); - - // Ensure that the version info schema exists. - this.createSchema([{ - type: goog.gears.BaseStore.SchemaType.TABLE, - name: 'StoreVersionInfo', - columns: [ - 'StoreName TEXT NOT NULL PRIMARY KEY', - 'Version INTEGER NOT NULL' - ]}], true); - this.loadData(); - this.setStoreVersion_(this.version); - this.database_.commit(); - } catch (ex) { - this.database_.rollback(ex); - throw Error('Could not create the ' + this.name + ' schema' + - ': ' + (ex.message || 'unknown exception')); - } - } - this.getCachedData(); - this.informOtherStores(); -}; - - -/** - * Removes the tables for the MessageStore - */ -goog.gears.BaseStore.prototype.removeStore = function() { - this.database_.begin(); - try { - this.removeStoreVersion(); - this.dropSchema(this.schema); - this.database_.commit(); - } catch (ex) { - this.database_.rollback(ex); - throw Error('Could not remove the ' + this.name + ' schema' + - ': ' + (ex.message || 'unknown exception')); - } -}; - - -/** - * Returns the name of the store. - * - * @return {string} The name of the store. - */ -goog.gears.BaseStore.prototype.getName = function() { - return this.name; -}; - - -/** - * Returns the version number for the specified store - * - * @return {number} The version number of the store. Returns 0 if the - * store does not exist. - */ -goog.gears.BaseStore.prototype.getStoreVersion = function() { - try { - return /** @type {number} */ (this.database_.queryValue( - 'SELECT Version FROM StoreVersionInfo WHERE StoreName=?', - this.name)) || 0; - } catch (ex) { - return 0; - } -}; - - -/** - * Sets the version number for the specified store - * - * @param {number} version The version number for the store. - * @private - */ -goog.gears.BaseStore.prototype.setStoreVersion_ = function(version) { - // TODO(user): Need to determine if we should enforce the fact - // that store versions are monotonically increasing. - this.database_.execute( - 'INSERT OR REPLACE INTO StoreVersionInfo ' + - '(StoreName, Version) VALUES(?,?)', - this.name, - version); -}; - - -/** - * Removes the version number for the specified store - */ -goog.gears.BaseStore.prototype.removeStoreVersion = function() { - try { - this.database_.execute( - 'DELETE FROM StoreVersionInfo WHERE StoreName=?', - this.name); - } catch (ex) { - // Ignore error - part of bootstrap process. - } -}; - - -/** - * Generates an SQLITE CREATE TRIGGER statement from a definition array. - * @param {string} onStr the type of trigger to create. - * @param {Object} def a schema statement definition. - * @param {string} notExistsStr string to be included in the create - * indicating what to do. - * @return {string} the statement. - * @private - */ -goog.gears.BaseStore.prototype.getCreateTriggerStatement_ = - function(onStr, def, notExistsStr) { - return 'CREATE TRIGGER ' + notExistsStr + def.name + ' ' + - onStr + ' ON ' + def.tableName + - (def.when ? (' WHEN ' + def.when) : '') + - ' BEGIN ' + def.actions.join('; ') + '; END'; -}; - - -/** - * Generates an SQLITE CREATE statement from a definition object. - * @param {Object} def a schema statement definition. - * @param {boolean=} opt_ifNotExists true if the table or index should be - * created only if it does not exist. Otherwise trying to create a table - * or index that already exists will result in an exception being thrown. - * @return {string} the statement. - * @private - */ -goog.gears.BaseStore.prototype.getCreateStatement_ = - function(def, opt_ifNotExists) { - var notExists = opt_ifNotExists ? 'IF NOT EXISTS ' : ''; - switch (def.type) { - case goog.gears.BaseStore.SchemaType.TABLE: - return 'CREATE TABLE ' + notExists + def.name + ' (\n' + - def.columns.join(',\n ') + - ')'; - case goog.gears.BaseStore.SchemaType.VIRTUAL_TABLE: - return 'CREATE VIRTUAL TABLE ' + notExists + def.name + - ' USING FTS2 (\n' + def.columns.join(',\n ') + ')'; - case goog.gears.BaseStore.SchemaType.INDEX: - return 'CREATE' + (def.isUnique ? ' UNIQUE' : '') + - ' INDEX ' + notExists + def.name + ' ON ' + - def.tableName + ' (\n' + def.columns.join(',\n ') + ')'; - case goog.gears.BaseStore.SchemaType.BEFORE_INSERT_TRIGGER: - return this.getCreateTriggerStatement_('BEFORE INSERT', def, notExists); - case goog.gears.BaseStore.SchemaType.AFTER_INSERT_TRIGGER: - return this.getCreateTriggerStatement_('AFTER INSERT', def, notExists); - case goog.gears.BaseStore.SchemaType.BEFORE_UPDATE_TRIGGER: - return this.getCreateTriggerStatement_('BEFORE UPDATE', def, notExists); - case goog.gears.BaseStore.SchemaType.AFTER_UPDATE_TRIGGER: - return this.getCreateTriggerStatement_('AFTER UPDATE', def, notExists); - case goog.gears.BaseStore.SchemaType.BEFORE_DELETE_TRIGGER: - return this.getCreateTriggerStatement_('BEFORE DELETE', def, notExists); - case goog.gears.BaseStore.SchemaType.AFTER_DELETE_TRIGGER: - return this.getCreateTriggerStatement_('AFTER DELETE', def, notExists); - } - return ''; -}; - - -/** - * Generates an SQLITE DROP statement from a definition array. - * @param {Object} def a schema statement definition. - * @return {string} the statement. - * @private - */ -goog.gears.BaseStore.prototype.getDropStatement_ = function(def) { - switch (def.type) { - case goog.gears.BaseStore.SchemaType.TABLE: - case goog.gears.BaseStore.SchemaType.VIRTUAL_TABLE: - return 'DROP TABLE IF EXISTS ' + def.name; - case goog.gears.BaseStore.SchemaType.INDEX: - return 'DROP INDEX IF EXISTS ' + def.name; - case goog.gears.BaseStore.SchemaType.BEFORE_INSERT_TRIGGER: - case goog.gears.BaseStore.SchemaType.AFTER_INSERT_TRIGGER: - case goog.gears.BaseStore.SchemaType.BEFORE_UPDATE_TRIGGER: - case goog.gears.BaseStore.SchemaType.AFTER_UPDATE_TRIGGER: - case goog.gears.BaseStore.SchemaType.BEFORE_DELETE_TRIGGER: - case goog.gears.BaseStore.SchemaType.AFTER_DELETE_TRIGGER: - return 'DROP TRIGGER IF EXISTS ' + def.name; - } - return ''; -}; - - -/** - * Creates tables and indicies in the target database. - * - * @param {Array} defs definition arrays. This is an array of objects - * where each object describes a database object to create and drop. - * each object contains a 'type' field which of type - * goog.gears.BaseStore.SchemaType. Each object also contains a - * 'name' which contains the name of the object to create. - * A table object contains a 'columns' field which is an array - * that contains the column definitions for the table. - * A virtual table object contains c 'columns' field which contains - * the name of the columns. They are assumed to be of type text. - * An index object contains a 'tableName' field which is the name - * of the table that the index is on. It contains an 'isUnique' - * field which is a boolean indicating whether the index is - * unqiue or not. It also contains a 'columns' field which is - * an array that contains the columns names (possibly along with the - * ordering) that form the index. - * The trigger objects contain a 'tableName' field indicating the - * table the trigger is on. The type indicates the type of trigger. - * The trigger object may include a 'when' field which contains - * the when clause for the trigger. The trigger object also contains - * an 'actions' field which is an array of strings containing - * the actions for this trigger. - * @param {boolean=} opt_ifNotExists true if the table or index should be - * created only if it does not exist. Otherwise trying to create a table - * or index that already exists will result in an exception being thrown. - */ -goog.gears.BaseStore.prototype.createSchema = function(defs, opt_ifNotExists) { - this.database_.begin(); - try { - for (var i = 0; i < defs.length; ++i) { - var sql = this.getCreateStatement_(defs[i], opt_ifNotExists); - this.database_.execute(sql); - } - this.database_.commit(); - } catch (ex) { - this.database_.rollback(ex); - } -}; - - -/** - * Drops tables and indicies in a target database. - * - * @param {Array} defs Definition arrays. - */ -goog.gears.BaseStore.prototype.dropSchema = function(defs) { - this.database_.begin(); - try { - for (var i = defs.length - 1; i >= 0; --i) { - this.database_.execute(this.getDropStatement_(defs[i])); - } - this.database_.commit(); - } catch (ex) { - this.database_.rollback(ex); - } -}; - - -/** - * Creates triggers specified in definitions. Will first attempt - * to drop the trigger with this name first. - * - * @param {Array} defs Definition arrays. - */ -goog.gears.BaseStore.prototype.createTriggers = function(defs) { - this.database_.begin(); - try { - for (var i = 0; i < defs.length; i++) { - var def = defs[i]; - switch (def.type) { - case goog.gears.BaseStore.SchemaType.BEFORE_INSERT_TRIGGER: - case goog.gears.BaseStore.SchemaType.AFTER_INSERT_TRIGGER: - case goog.gears.BaseStore.SchemaType.BEFORE_UPDATE_TRIGGER: - case goog.gears.BaseStore.SchemaType.AFTER_UPDATE_TRIGGER: - case goog.gears.BaseStore.SchemaType.BEFORE_DELETE_TRIGGER: - case goog.gears.BaseStore.SchemaType.AFTER_DELETE_TRIGGER: - this.database_.execute('DROP TRIGGER IF EXISTS ' + def.name); - this.database_.execute(this.getCreateStatement_(def)); - break; - } - } - this.database_.commit(); - } catch (ex) { - this.database_.rollback(ex); - } -}; - - -/** - * Returns true if the table exists in the database - * - * @param {string} name The table name. - * @return {boolean} Whether the table exists in the database. - */ -goog.gears.BaseStore.prototype.hasTable = function(name) { - return this.hasInSchema_('table', name); -}; - - -/** - * Returns true if the index exists in the database - * - * @param {string} name The index name. - * @return {boolean} Whether the index exists in the database. - */ -goog.gears.BaseStore.prototype.hasIndex = function(name) { - return this.hasInSchema_('index', name); -}; - - -/** - * @param {string} name The name of the trigger. - * @return {boolean} Whether the schema contains a trigger with the given name. - */ -goog.gears.BaseStore.prototype.hasTrigger = function(name) { - return this.hasInSchema_('trigger', name); -}; - - -/** - * Returns true if the database contains the index or table - * - * @private - * @param {string} type The type of object to test for, 'table' or 'index'. - * @param {string} name The table or index name. - * @return {boolean} Whether the database contains the index or table. - */ -goog.gears.BaseStore.prototype.hasInSchema_ = function(type, name) { - return this.database_.queryValue('SELECT 1 FROM SQLITE_MASTER ' + - 'WHERE TYPE=? AND NAME=?', - type, - name) != null; -}; - - -/** @override */ -goog.gears.BaseStore.prototype.disposeInternal = function() { - goog.gears.BaseStore.superClass_.disposeInternal.call(this); - this.database_ = null; -}; - - -/** - * HACK(arv): The JSCompiler check for undefined properties sees that these - * fields are never set and raises warnings. - * @type {Array.} - * @private - */ -goog.gears.schemaDefDummy_ = [ - { - type: '', - name: '', - when: '', - tableName: '', - actions: [], - isUnique: false - } -]; diff --git a/third_party/closure/goog/gears/database.js b/third_party/closure/goog/gears/database.js deleted file mode 100644 index c50ef6a7ede85..0000000000000 --- a/third_party/closure/goog/gears/database.js +++ /dev/null @@ -1,934 +0,0 @@ -// 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 This file contains functions for using the Gears database. - */ - -goog.provide('goog.gears.Database'); -goog.provide('goog.gears.Database.EventType'); -goog.provide('goog.gears.Database.TransactionEvent'); - -goog.require('goog.array'); -goog.require('goog.debug'); -goog.require('goog.debug.Logger'); -goog.require('goog.events.Event'); -goog.require('goog.events.EventTarget'); -goog.require('goog.gears'); -goog.require('goog.json'); - - - -/** - * Class that for accessing a Gears database - * - * @constructor - * @extends {goog.events.EventTarget} - * @param {string} userId the id token for this user. - * @param {string} appName the name of the application creating this database. - */ -goog.gears.Database = function(userId, appName) { - goog.events.EventTarget.call(this); - - var factory = goog.gears.getFactory(); - try { - /** - * The pointer to the Gears database object - * @private - */ - this.database_ = factory.create('beta.database', '1.0'); - } catch (ex) { - // We will fail here if we cannot get a version of the database that is - // compatible with the JS code. - throw Error('Could not create the database. ' + ex.message); - } - - if (this.database_ != null) { - var dbId = userId + '-' + appName; - var safeDbId = goog.gears.makeSafeFileName(dbId); - if (dbId != safeDbId) { - this.logger_.info('database name ' + dbId + '->' + safeDbId); - } - this.safeDbId_ = safeDbId; - this.database_.open(safeDbId); - } else { - throw Error('Could not create the database'); - } -}; -goog.inherits(goog.gears.Database, goog.events.EventTarget); - - -/** - * Constants for transaction event names. - * @enum {string} - */ -goog.gears.Database.EventType = { - BEFOREBEGIN: 'beforebegin', - BEGIN: 'begin', - BEFORECOMMIT: 'beforecommit', - COMMIT: 'commit', - BEFOREROLLBACK: 'beforerollback', - ROLLBACK: 'rollback' -}; - - - -/** - * Event info for transaction events. - * @extends {goog.events.Event} - * @constructor - * @param {goog.gears.Database.EventType} eventType The type of event. - */ -goog.gears.Database.TransactionEvent = function(eventType) { - goog.events.Event.call(this, eventType); -}; -goog.inherits(goog.gears.Database.TransactionEvent, goog.events.Event); - - -/** - * Logger object - * @type {goog.debug.Logger} - * @private - */ -goog.gears.Database.prototype.logger_ = - goog.debug.Logger.getLogger('goog.gears.Database'); - - -/** - * The safe name of the database. - * @type {string} - * @private - */ -goog.gears.Database.prototype.safeDbId_; - - -/** - * True if the database will be using transactions - * @private - * @type {boolean} - */ -goog.gears.Database.prototype.useTransactions_ = true; - - -/** - * Number of currently openned transactions. Use this to allow - * for nested Begin/Commit transactions. Will only do the real - * commit when this equals 0 - * @private - * @type {number} - */ -goog.gears.Database.prototype.openTransactions_ = 0; - - -/** - * True if the outstanding opened transactions need to be rolled back - * @private - * @type {boolean} - */ -goog.gears.Database.prototype.needsRollback_ = false; - - -/** - * The default type of begin statement to use. - * @type {string} - * @private - */ -goog.gears.Database.prototype.defaultBeginType_ = 'IMMEDIATE'; - - -/** - * Indicaton of the level of the begin. This is used to make sure - * nested begins do not elivate the level of the begin. - * @enum {number} - * @private - */ -goog.gears.Database.BeginLevels_ = { - 'DEFERRED': 0, - 'IMMEDIATE': 1, - 'EXCLUSIVE': 2 -}; - - -/** - * The begin level of the currently opened transaction - * @type {goog.gears.Database.BeginLevels_} - * @private - */ -goog.gears.Database.prototype.currentBeginLevel_ = - goog.gears.Database.BeginLevels_['DEFERRED']; - - -/** - * Returns an array of arrays, where each sub array contains the selected - * values for each row in the result set. - * result values - * - * @param {GearsResultSet} rs the result set returned by execute. - * @return {Array} An array of arrays. Returns an empty array if - * there are no matching rows. - */ -goog.gears.Database.resultSetToArrays = function(rs) { - var rv = []; - if (rs) { - var cols = rs['fieldCount'](); - while (rs['isValidRow']()) { - var row = new Array(cols); - for (var i = 0; i < cols; i++) { - row[i] = rs['field'](i); - } - rv.push(row); - rs['next'](); - } - } - return rv; -}; - - -/** - * Returns a array of hash objects, one per row in the result set, - * where the column names in the query are used as the members of - * the object. - * - * @param {GearsResultSet} rs the result set returned by execute. - * @return {Array.} An array containing hashes. Returns an empty - * array if there are no matching rows. - */ -goog.gears.Database.resultSetToObjectArray = function(rs) { - var rv = []; - if (rs) { - var cols = rs['fieldCount'](); - var colNames = []; - for (var i = 0; i < cols; i++) { - colNames.push(rs['fieldName'](i)); - } - - while (rs['isValidRow']()) { - var h = {}; - for (var i = 0; i < cols; i++) { - h[colNames[i]] = rs['field'](i); - } - rv.push(h); - rs['next'](); - } - } - return rv; -}; - - -/** - * Returns an array containing the first item of each row in a result set. - * This is useful for query that returns one column - * - * @param {GearsResultSet} rs the result set returned by execute. - * @return {Array.} An array containing the values in the first column - * Returns an empty array if there are no matching rows. - */ -goog.gears.Database.resultSetToValueArray = function(rs) { - var rv = []; - if (rs) { - while (rs['isValidRow']()) { - rv.push(rs['field'](0)); - rs['next'](); - } - } - return rv; -}; - - -/** - * Returns a single value from the results (first column in first row). - * - * @param {GearsResultSet} rs the result set returned by execute. - * @return {(number,string,null)} The first item in the first row of the - * result set. Returns null if there are no matching rows. - */ -goog.gears.Database.resultSetToValue = function(rs) { - if (rs && rs['isValidRow']()) { - return rs['field'](0); - } else { - return null; - } -}; - - -/** - * Returns a single hashed object from the result set (the first row), - * where the column names in the query are used as the members of - * the object. - * - * @param {GearsResultSet} rs the result set returned by execute. - * @return {Object} a hash map with the key-value-pairs from the first row. - * Returns null is there are no matching rows. - */ -goog.gears.Database.resultSetToObject = function(rs) { - if (rs && rs['isValidRow']()) { - var rv = {}; - var cols = rs['fieldCount'](); - for (var i = 0; i < cols; i++) { - rv[rs['fieldName'](i)] = rs['field'](i); - } - return rv; - } else { - return null; - } -}; - - -/** - * Returns an array of the first row in the result set - * - * @param {GearsResultSet} rs the result set returned by execute. - * @return {Array} An array containing the values in the - * first result set. Returns an empty array if there no - * matching rows. - */ -goog.gears.Database.resultSetToArray = function(rs) { - var rv = []; - if (rs && rs['isValidRow']()) { - var cols = rs['fieldCount'](); - for (var i = 0; i < cols; i++) { - rv[i] = rs['field'](i); - } - } - return rv; -}; - - -/** - * Execute a sql statement with a set of arguments - * - * @param {string} sql The sql statement to execute. - * @param {...*} var_args The arguments to execute, either as a single - * array argument or as var_args. - * @return {GearsResultSet} The results. - */ -goog.gears.Database.prototype.execute = function(sql, var_args) { - this.logger_.finer('Executing SQL: ' + sql); - - // TODO(user): Remove when Gears adds more rubust type handling. - // Safety measure since Gears behaves very badly if it gets an unexpected - // data type. - sql = String(sql); - - var args; - try { - if (arguments.length == 1) { - return this.database_.execute(sql); - } - - if (arguments.length == 2 && goog.isArray(arguments[1])) { - args = arguments[1]; - } else { - args = goog.array.slice(arguments, 1); - } - this.logger_.finest('SQL arguments: ' + args); - - // TODO(user): Type safety checking for args? - return this.database_.execute(sql, args); - } catch (e) { - if (args) { - sql += ': ' + goog.json.serialize(args); - } - - throw goog.debug.enhanceError(e, sql); - } -}; - - -/** - * This is useful to remove all the arguments juggling from inside the - * different helper functions. - * - * @private - * @param {string} sql The SQL statement. - * @param {Object} params An Array or arguments Object containing the query - * params. If the element at startIndex is an array, it will be used as - * the arguments passed to the execute method. - * @param {number} startIndex Where to start getting the query params from - * params. - * @return {GearsResultSet} The results of the command. - */ -goog.gears.Database.prototype.executeVarArgs_ = function(sql, params, - startIndex) { - if (params.length == 0 || startIndex >= params.length) { - return this.execute(sql); - } else { - if (goog.isArray(params[startIndex])) { - return this.execute(sql, params[startIndex]); - } - var args = Array.prototype.slice.call( - /** @type {{length:number}} */ (params), startIndex); - return this.execute(sql, args); - } -}; - - -/** - * Helper methods for queryArrays, queryObjectArray, queryValueArray, - * queryValue, queryObject. - * - * @private - * @param {string} sql The SQL statement. - * @param {Function} f The function to call on the result set. - * @param {Object} params query params as an Array or an arguments object. If - * the element at startIndex is an array, it will be used as the arguments - * passed to the execute method. - * @param {number} startIndex Where to start getting the query params from - * params. - * @return {(Object,number,string,boolean,undefined,null)} whatever 'f' - * returns, which could be any type. - */ -goog.gears.Database.prototype.queryObject_ = function(sql, - f, params, startIndex) { - var rs = this.executeVarArgs_(sql, params, startIndex); - try { - return f(rs); - } finally { - if (rs) { - rs.close(); - } - } -}; - - -/** - * This calls query on the database and builds a two dimensional array - * containing the result. - * - * @param {string} sql The SQL statement. - * @param {...*} var_args Query params. An array or multiple arguments. - * @return {Array} An array of arrays containing the results of the query. - */ -goog.gears.Database.prototype.queryArrays = function(sql, var_args) { - return /** @type {Array} */ (this.queryObject_(sql, - goog.gears.Database.resultSetToArrays, - arguments, - 1)); -}; - - -/** - * This calls query on the database and builds an array containing hashes - * - * @param {string} sql Ths SQL statement. - * @param {...*} var_args query params. An array or multiple arguments. - * @return {Array} An array of hashes containing the results of the query. - */ -goog.gears.Database.prototype.queryObjectArray = function(sql, var_args) { - return /** @type {Array} */ (this.queryObject_(sql, - goog.gears.Database.resultSetToObjectArray, - arguments, - 1)); -}; - - -/** - * This calls query on the database and returns an array containing the values - * in the first column. This is useful if the result set only contains one - * column. - * - * @param {string} sql SQL statement. - * @param {...*} var_args query params. An array or multiple arguments. - * @return {Array} The values in the first column. - */ -goog.gears.Database.prototype.queryValueArray = function(sql, var_args) { - return /** @type {Array} */ (this.queryObject_(sql, - goog.gears.Database.resultSetToValueArray, - arguments, - 1)); -}; - - -/** - * This calls query on the database and returns the first value in the first - * row. - * - * @param {string} sql SQL statement. - * @param {...*} var_args query params. An array or multiple arguments. - * @return {(number,string,null)} The first value in - * the first row. - */ -goog.gears.Database.prototype.queryValue = function(sql, var_args) { - return /** @type {(number,string,null)} */ (this.queryObject_(sql, - goog.gears.Database.resultSetToValue, - arguments, - 1)); -}; - - -/** - * This calls query on the database and returns the first row as a hash map - * where the keys are the column names. - * - * @param {string} sql SQL statement. - * @param {...*} var_args query params. An array or multiple arguments. - * @return {Object} The first row as a hash map. - */ -goog.gears.Database.prototype.queryObject = function(sql, var_args) { - return /** @type {Object} */ (this.queryObject_(sql, - goog.gears.Database.resultSetToObject, - arguments, - 1)); -}; - - -/** - * This calls query on the database and returns the first row as an array - * - * @param {string} sql SQL statement. - * @param {...*} var_args query params. An array or multiple arguments. - * @return {Array} The first row as an array. - */ -goog.gears.Database.prototype.queryArray = function(sql, var_args) { - return /** @type {Array} */ (this.queryObject_(sql, - goog.gears.Database.resultSetToArray, - arguments, - 1)); -}; - - -/** - * For each value in the result set f will be called with the following - * parameters; value, rowIndex, columnIndex, columnName. Values will continue - * being processed as long as f returns true. - * - * @param {string} sql The SQL statement to execute. - * @param {Function} f Function to call for each value. - * @param {Object=} opt_this If present f will be called using this object as - * 'this'. - * @param {...*} var_args query params. An array or multiple arguments. - */ -goog.gears.Database.prototype.forEachValue = function(sql, - f, opt_this, var_args) { - var rs = this.executeVarArgs_(sql, arguments, 3); - try { - var rowIndex = 0; - var cols = rs['fieldCount'](); - var colNames = []; - for (var i = 0; i < cols; i++) { - colNames.push(rs['fieldName'](i)); - } - - mainLoop: while (rs['isValidRow']()) { - for (var i = 0; i < cols; i++) { - if (!f.call(opt_this, rs['field'](i), rowIndex, i, colNames[i])) { - break mainLoop; - } - } - rs['next'](); - rowIndex++; - } - } finally { - rs.close(); - } -}; - - -/** - * For each row in the result set f will be called with the following - * parameters: row (array of values), rowIndex and columnNames. Rows will - * continue being processed as long as f returns true. - * - * @param {string} sql The SQL statement to execute. - * @param {Function} f Function to call for each row. - * @param {Object=} opt_this If present f will be called using this - * object as 'this'. - * @param {...*} var_args query params. An array or multiple arguments. - */ -goog.gears.Database.prototype.forEachRow = function(sql, - f, opt_this, var_args) { - var rs = this.executeVarArgs_(sql, arguments, 3); - try { - var rowIndex = 0; - var cols = rs['fieldCount'](); - var colNames = []; - for (var i = 0; i < cols; i++) { - colNames.push(rs['fieldName'](i)); - } - - var row; - while (rs['isValidRow']()) { - row = []; - for (var i = 0; i < cols; i++) { - row.push(rs['field'](i)); - } - if (!f.call(opt_this, row, rowIndex, colNames)) { - break; - } - rs['next'](); - rowIndex++; - } - } finally { - rs.close(); - } -}; - - -/** - * Executes a function transactionally. - * - * @param {Function} func the function to execute transactionally. - * Takes no params. - * @return {Object|number|boolean|string|null|undefined} the return value - * of 'func()'. - */ -goog.gears.Database.prototype.transact = function(func) { - this.begin(); - try { - var result = func(); - this.commit(); - } catch (e) { - this.rollback(e); - throw e; - } - return result; -}; - - -/** - * Helper that performs either a COMMIT or ROLLBACK command and dispatches - * pre/post commit/rollback events. - * - * @private - * - * @param {boolean} rollback Whether to rollback or commit. - * @return {boolean} True if the transaction was closed, false otherwise. - */ -goog.gears.Database.prototype.closeTransaction_ = function(rollback) { - // Send before rollback/commit event - var cmd; - var eventType; - cmd = rollback ? 'ROLLBACK' : 'COMMIT'; - eventType = rollback ? goog.gears.Database.EventType.BEFOREROLLBACK : - goog.gears.Database.EventType.BEFORECOMMIT; - var event = new goog.gears.Database.TransactionEvent(eventType); - var returnValue = this.dispatchEvent(event); - - // Only commit/rollback and send events if none of the event listeners - // called preventDefault(). - if (returnValue) { - this.database_.execute(cmd); - this.openTransactions_ = 0; - eventType = rollback ? goog.gears.Database.EventType.ROLLBACK : - goog.gears.Database.EventType.COMMIT; - this.dispatchEvent(new goog.gears.Database.TransactionEvent(eventType)); - } - - return returnValue; -}; - - -/** - * Whether transactions are used for the database - * - * @param {boolean} b Whether to use transactions or not. - */ -goog.gears.Database.prototype.setUseTransactions = function(b) { - this.useTransactions_ = b; -}; - - -/** - * Whether transactions are used for the database - * - * @return {boolean} true if transactions should be used. - */ -goog.gears.Database.prototype.getUseTransactions = function() { - return this.useTransactions_; -}; - - -/** - * Sets the default begin type. - * - * @param {string} beginType The default begin type. - */ -goog.gears.Database.prototype.setDefaultBeginType = function(beginType) { - if (beginType in goog.gears.Database.BeginLevels_) { - this.defaultBeginType_ = beginType; - } -}; - - -/** - * Marks the beginning of a database transaction. Does a real BEGIN operation - * if useTransactions is true for this database and the this is the first - * opened transaction - * @private - * - * @param {string} beginType the type of begin comand. - * @return {boolean} true if the BEGIN has been executed. - */ -goog.gears.Database.prototype.beginTransaction_ = function(beginType) { - if (this.useTransactions_) { - if (this.openTransactions_ == 0) { - this.needsRollback_ = false; - this.dispatchEvent( - new goog.gears.Database.TransactionEvent( - goog.gears.Database.EventType.BEFOREBEGIN)); - this.database_.execute('BEGIN ' + beginType); - this.currentBeginLevel_ = - goog.gears.Database.BeginLevels_[beginType]; - this.openTransactions_ = 1; - try { - this.dispatchEvent( - new goog.gears.Database.TransactionEvent( - goog.gears.Database.EventType.BEGIN)); - } catch (e) { - this.database_.execute('ROLLBACK'); - this.openTransactions_ = 0; - throw e; - } - return true; - } else if (this.needsRollback_) { - throw Error( - 'Cannot begin a transaction with a rollback pending'); - } else if (goog.gears.Database.BeginLevels_[beginType] > - this.currentBeginLevel_) { - throw Error( - 'Cannot elevate the level within a nested begin'); - } else { - this.openTransactions_++; - } - } - return false; -}; - - -/** - * Marks the beginning of a database transaction using the default begin - * type. Does a real BEGIN operation if useTransactions is true for this - * database and this is the first opened transaction. This will throw - * an exception if this is a nested begin and is trying to elevate the - * begin type from the original BEGIN that was processed. - * - * @return {boolean} true if the BEGIN has been executed. - */ -goog.gears.Database.prototype.begin = function() { - return this.beginTransaction_(this.defaultBeginType_); -}; - - -/** - * Marks the beginning of a deferred database transaction. - * Does a real BEGIN operation if useTransactions is true for this - * database and this is the first opened transaction. - * - * @return {boolean} true if the BEGIN has been executed. - */ -goog.gears.Database.prototype.beginDeferred = function() { - return this.beginTransaction_('DEFERRED'); -}; - - -/** - * Marks the beginning of an immediate database transaction. - * Does a real BEGIN operation if useTransactions is true for this - * database and this is the first opened transaction. This will throw - * an exception if this is a nested begin and is trying to elevate the - * begin type from the original BEGIN that was processed. - * - * @return {boolean} true if the BEGIN has been executed. - */ -goog.gears.Database.prototype.beginImmediate = function() { - return this.beginTransaction_('IMMEDIATE'); -}; - - -/** - * Marks the beginning of an exclusive database transaction. - * Does a real BEGIN operation if useTransactions is true for this - * database and this is the first opened transaction. This will throw - * an exception if this is a nested begin and is trying to elevate the - * begin type from the original BEGIN that was processed. - * - * @return {boolean} true if the BEGIN has been executed. - */ -goog.gears.Database.prototype.beginExclusive = function() { - return this.beginTransaction_('EXCLUSIVE'); -}; - - -/** - * Marks the end of a successful transaction. Will do a real COMMIT - * if this the last outstanding transaction unless a nested transaction - * was closed with a ROLLBACK in which case a real ROLLBACK will be performed. - * - * @return {boolean} true if the COMMIT has been executed. - */ -goog.gears.Database.prototype.commit = function() { - if (this.useTransactions_) { - if (this.openTransactions_ <= 0) { - throw Error('Unbalanced transaction'); - } - - // Only one left. - if (this.openTransactions_ == 1) { - var closed = this.closeTransaction_(this.needsRollback_); - return !this.needsRollback_ && closed; - } else { - this.openTransactions_--; - } - } - return false; -}; - - -/** - * Marks the end of an unsuccessful transaction. Will do a real ROLLBACK - * if this the last outstanding transaction, otherwise the real ROLLBACK will - * be deferred until the last outstanding transaction is closed. - * - * @param {Error=} opt_e the exception that caused this rollback. If it - * is provided then that exception is rethown if - * the rollback does not take place. - * @return {boolean} true if the ROLLBACK has been executed or if we are not - * using transactions. - */ -goog.gears.Database.prototype.rollback = function(opt_e) { - var closed = true; - if (this.useTransactions_) { - if (this.openTransactions_ <= 0) { - throw Error('Unbalanced transaction'); - } - // Only one left. - if (this.openTransactions_ == 1) { - closed = this.closeTransaction_(true); - } else { - this.openTransactions_--; - this.needsRollback_ = true; - if (opt_e) { - throw opt_e; - } - return false; - } - } - - return closed; -}; - - -/** - * Returns whether or not we're in a transaction. - * - * @return {boolean} true if a transaction has been started and is not yet - * complete. - */ -goog.gears.Database.prototype.isInTransaction = function() { - return this.useTransactions_ && this.openTransactions_ > 0; -}; - - -/** - * Ensures there is no open transaction upon return. An existing open - * transaction is rolled back. - * - * @param {string=} opt_logMsgPrefix a prefix to the message that is logged when - * an unexpected open transaction is found. - */ -goog.gears.Database.prototype.ensureNoTransaction = function(opt_logMsgPrefix) { - if (this.isInTransaction()) { - this.logger_.warning((opt_logMsgPrefix || 'ensureNoTransaction') + - ' - rolling back unexpected transaction'); - do { - this.rollback(); - } while (this.isInTransaction()); - } -}; - - -/** - * Returns whether or not the current transaction has a pending rollback. - * Returns false if there is no current transaction. - * - * @return {boolean} Whether a started transaction has a rollback pending. - */ -goog.gears.Database.prototype.needsRollback = function() { - return this.useTransactions_ && - this.openTransactions_ > 0 && - this.needsRollback_; -}; - - -/** - * Returns the time in Ms that database operations have currently - * consumed. This only exists in debug builds, but it still may be useful - * for goog.gears.Trace. - * - * @return {number} The time in Ms that database operations have currently - * consumed. - */ -goog.gears.Database.prototype.getExecutionTime = function() { - return this.database_['executeMsec'] || 0; -}; - - -/** - * @return {number} The id of the last inserted row. - */ -goog.gears.Database.prototype.getLastInsertRowId = function() { - return this.database_['lastInsertRowId']; -}; - - -/** - * Opens the database. - */ -goog.gears.Database.prototype.open = function() { - if (this.database_ && this.safeDbId_) { - this.database_.open(this.safeDbId_); - } else { - throw Error('Could not open the database'); - } -}; - - -/** - * Closes the database. - */ -goog.gears.Database.prototype.close = function() { - if (this.database_) { - this.database_.close(); - } -}; - - -/** @override */ -goog.gears.Database.prototype.disposeInternal = function() { - goog.gears.Database.superClass_.disposeInternal.call(this); - this.database_ = null; -}; - - -/** - * Determines if the exception is a locking error. - * @param {Error|string} ex The exception object or error string. - * @return {boolean} Whether this is a database locked exception. - */ -goog.gears.Database.isLockedException = function(ex) { - // TODO(user): change the test when gears provides a reasonable - // error code to check. - var message = goog.isString(ex) ? ex : ex.message; - return !!message && message.indexOf('database is locked') >= 0; -}; - - -/** - * Removes the database. - * @throws {Error} This requires Gears 0.5 or newer and will throw an error if - * called on a too old version of Gears. - */ -goog.gears.Database.prototype.remove = function() { - this.database_.remove(); -}; diff --git a/third_party/closure/goog/gears/gears.js b/third_party/closure/goog/gears/gears.js deleted file mode 100644 index 4d9b0e7d666ef..0000000000000 --- a/third_party/closure/goog/gears/gears.js +++ /dev/null @@ -1,228 +0,0 @@ -// 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 This file contains functions for using Gears. - */ - -// TODO(arv): The Gears team is planning to inject the Gears factory as -// google.gears.factory in the main thread as well. Currently it is only -// injected in the worker threads. - - -goog.provide('goog.gears'); - -goog.require('goog.string'); - - -/** - * Returns a new Gears factory object. - * @return {Object} the Gears factory object if available or null otherwise. - */ -goog.gears.getFactory = function() { - if (goog.gears.factory_ != undefined) { - return goog.gears.factory_; - } - - // In the worker threads Gears injects google.gears.factory. They also plan - // to do this in the main thread. - var factory = goog.getObjectByName('google.gears.factory'); - if (factory) { - return goog.gears.factory_ = factory; - } - - // Mozilla - /** @preserveTry */ - try { - var gearsFactory = /** @type {Function} */ - (goog.getObjectByName('GearsFactory')); - return goog.gears.factory_ = new gearsFactory; - } catch (ex) { - // fall through - } - - // MSIE - /** @preserveTry */ - try { - factory = new ActiveXObject('Gears.Factory'); - var buildInfo = factory.getBuildInfo(); - if (buildInfo.indexOf('ie_mobile') != -1) { - factory.privateSetGlobalObject(goog.global); - } - return goog.gears.factory_ = factory; - } catch (ex) { - // fall through - } - - return goog.gears.factory_ = goog.gears.tryGearsObject_(); -}; - - -/** - * Attempt to create a factory by adding an object element to the DOM. - * This covers the case for safari. - * @return {Function} The factory, or null. - * @private - */ -goog.gears.tryGearsObject_ = function() { - // HACK(arv): Use square bracket notation so this can compile in an - // environment without a DOM. - var win = goog.getObjectByName('window'); - // Safari - if (win && win['navigator']['mimeTypes']['application/x-googlegears']) { - /** @preserveTry */ - try { - var doc = win['document']; - var factory = doc['getElementById']('gears-factory'); - - // If missing, create a place for it - if (!factory) { - factory = doc['createElement']('object'); - factory['style']['display'] = 'none'; - factory['width'] = '0'; - factory['height'] = '0'; - factory['type'] = 'application/x-googlegears'; - factory['id'] = 'gears-factory'; - doc['documentElement']['appendChild'](factory); - } - - // Even if Gears failed to get created we get an object element. Make - // sure that it has a create method before assuming it is a Gears factory. - if (typeof factory.create != 'undefined') { - return factory; - } - } catch (ex) { - // fall through - } - } - return null; -}; - - -/** - * Cached result of getFactory - * @type {Object|undefined} - * @private - */ -goog.gears.factory_ = undefined; - - -/** - * Whether we can create a Gears factory object. This does not cache the - * result. - * @return {boolean} true if we can create a Gears factory object. - */ -goog.gears.hasFactory = function() { - if (goog.gears.hasFactory_ != undefined) return goog.gears.hasFactory_; - - // Use [] notation so we don't have to put this in externs - var factory = goog.getObjectByName('google.gears.factory'); - if (factory || goog.getObjectByName('GearsFactory')) { - return goog.gears.hasFactory_ = true; - } - - // Try ActiveXObject for IE - if (typeof ActiveXObject != 'undefined') { - /** @preserveTry */ - try { - new ActiveXObject('Gears.Factory'); - return goog.gears.hasFactory_ = true; - } catch (ex) { - return goog.gears.hasFactory_ = false; - } - } - - // NOTE(user): For safari we have to actually create an object element - // in the DOM. We have to do it in hasFactory so we can reliably know whether - // there actually is a factory, else we can get into a situation, e.g. in - // FF 3.5.3 where the Gears add-on is disabled because it's incompatible - // with FF but application/x-googlegears is still in the mimeTypes object. - // - // HACK(arv): Use object by name so this can compile in an environment without - // a DOM. - var mimeTypes = goog.getObjectByName('navigator.mimeTypes'); - if (mimeTypes && mimeTypes['application/x-googlegears']) { - factory = goog.gears.tryGearsObject_(); - - if (factory) { - // Might as well cache it while we have it. - goog.gears.factory_ = factory; - return goog.gears.hasFactory_ = true; - } - } - - return goog.gears.hasFactory_ = false; -}; - - -/** - * Cached result of hasFactory. - * @type {boolean|undefined} - * @private - */ -goog.gears.hasFactory_ = undefined; - - -/** - * Maximum file name length. - * @type {number} - * @private - */ -goog.gears.MAX_FILE_NAME_LENGTH_ = 64; - - -/** - * Allow 10 characters for hash (#goog.string.hashCode). - * @type {number} - * @private - */ -goog.gears.MAX_FILE_NAME_PREFIX_LENGTH_ = goog.gears.MAX_FILE_NAME_LENGTH_ - 10; - - -/** - * Gears only allows file names up to 64 characters, so this function shortens - * file names to fit in this limit. #goog.string.hashCode is used to compress - * the name. This also removes invalid characters. - * @param {string} originalFileName Original (potentially unsafe) file name. - * @return {string} Safe file name. If originalFileName null or empty, - * return originalFileName. - * @throws {Error} If originalFileName is null, empty or contains only - * invalid characters. - */ -goog.gears.makeSafeFileName = function(originalFileName) { - if (!originalFileName) { - throw Error('file name empty'); - } - - // Safety measure since Gears behaves very badly if it gets an unexpected - // data type. - originalFileName = String(originalFileName); - - // TODO(user): This should be removed when the Gears code - // gets fixed to allow for any id to be passed in. Right now - // it fails to create a user specific database if the characters - // sent in are non alphanumeric. - var sanitizedFileName = originalFileName.replace(/[^a-zA-Z0-9\.\-@_]/g, ''); - if (!sanitizedFileName) { - throw Error('file name invalid: ' + originalFileName); - } - if (sanitizedFileName.length <= goog.gears.MAX_FILE_NAME_LENGTH_) { - return sanitizedFileName; - } - - // Keep as many characters in original as we can, then hash the rest. - var prefix = sanitizedFileName.substring( - 0, goog.gears.MAX_FILE_NAME_PREFIX_LENGTH_); - return prefix + String(goog.string.hashCode(originalFileName)); -}; diff --git a/third_party/closure/goog/gears/httprequest.js b/third_party/closure/goog/gears/httprequest.js deleted file mode 100644 index 9b0b5420d3190..0000000000000 --- a/third_party/closure/goog/gears/httprequest.js +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright 2007 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 This file contains functions for setting up the standard - * goog.net.XmlHttp factory (and, therefore, goog.net.XhrIo) to work using - * the HttpRequest object Gears provides. - * - */ - - -goog.provide('goog.gears.HttpRequest'); - -goog.require('goog.Timer'); -goog.require('goog.gears'); -goog.require('goog.net.WrapperXmlHttpFactory'); -goog.require('goog.net.XmlHttp'); - - -/** - * Sets up the Gears HttpRequest's to be the default HttpRequest's used via - * the goog.net.XmlHttp factory. - */ -goog.gears.HttpRequest.setup = function() { - // Set the XmlHttp factory. - goog.net.XmlHttp.setGlobalFactory( - new goog.net.WrapperXmlHttpFactory( - goog.gears.HttpRequest.factory_, - goog.gears.HttpRequest.optionsFactory_)); - - // Use the Gears timer as the default timer object to ensure that the XhrIo - // timeouts function in the Workers. - goog.Timer.defaultTimerObject = goog.gears.getFactory().create( - 'beta.timer', '1.0'); -}; - - -/** - * The factory for creating Gears HttpRequest's. - * @return {!(GearsHttpRequest|XMLHttpRequest)} The request object. - * @private - */ -goog.gears.HttpRequest.factory_ = function() { - return goog.gears.getFactory().create('beta.httprequest', '1.0'); -}; - - -/** - * The options object for the Gears HttpRequest. - * @type {!Object} - * @private - */ -goog.gears.HttpRequest.options_ = {}; - - -// As of Gears API v.2 (build version 0.1.56.0), setting onreadystatechange to -// null in FF will cause the browser to crash. -goog.gears.HttpRequest.options_[goog.net.XmlHttp.OptionType.USE_NULL_FUNCTION] = - true; - - -/** - * The factory for creating the options object for Gears HttpRequest's. - * @return {!Object} The options. - * @private - */ -goog.gears.HttpRequest.optionsFactory_ = function() { - return goog.gears.HttpRequest.options_; -}; diff --git a/third_party/closure/goog/gears/loggerclient.js b/third_party/closure/goog/gears/loggerclient.js deleted file mode 100644 index f0d611c9ff5f3..0000000000000 --- a/third_party/closure/goog/gears/loggerclient.js +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright 2007 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 This class lives on a worker thread and it intercepts the - * goog.debug.Logger objects and sends a LOGGER command to the main thread - * instead. - * - * @author arv@google.com (Erik Arvidsson) - */ - -goog.provide('goog.gears.LoggerClient'); - -goog.require('goog.Disposable'); -goog.require('goog.debug'); -goog.require('goog.debug.Logger'); - - - -/** - * Singleton class that overrides the goog.debug.Logger to send log commands - * to the main thread. - * @param {goog.gears.Worker} mainThread The main thread that has the - * logger server running. - * @param {number} logCommandId The command id used for logging. - * @param {string=} opt_workerName This, if present, is added to the error - * object when serializing it. - * @constructor - * @extends {goog.Disposable} - */ -goog.gears.LoggerClient = function(mainThread, logCommandId, opt_workerName) { - if (goog.gears.LoggerClient.instance_) { - return goog.gears.LoggerClient.instance_; - } - - goog.Disposable.call(this); - - /** - * The main thread object. - * @type {goog.gears.Worker} - * @private - */ - this.mainThread_ = mainThread; - - /** - * The command id to use to send log commands to the main thread. - * @type {number} - * @private - */ - this.logCommandId_ = logCommandId; - - /** - * The name of the worker thread. - * @type {string} - * @private - */ - this.workerName_ = opt_workerName || ''; - - var loggerClient = this; - // Override the log method - goog.debug.Logger.prototype.doLogRecord_ = function(logRecord) { - var name = this.getName(); - loggerClient.sendLog_( - name, logRecord.getLevel(), logRecord.getMessage(), - logRecord.getException()); - }; - - goog.gears.LoggerClient.instance_ = this; -}; -goog.inherits(goog.gears.LoggerClient, goog.Disposable); - - -/** - * The singleton instance if any. - * @type {goog.gears.LoggerClient?} - * @private - */ -goog.gears.LoggerClient.instance_ = null; - - -/** - * Sends a log message to the main thread. - * @param {string} name The name of the logger. - * @param {goog.debug.Logger.Level} level One of the level identifiers. - * @param {string} msg The string message. - * @param {Object=} opt_exception An exception associated with the message. - * @private - */ -goog.gears.LoggerClient.prototype.sendLog_ = function(name, - level, - msg, - opt_exception) { - var exception; - if (opt_exception) { - var prefix = this.workerName_ ? this.workerName_ + ': ' : ''; - exception = { - message: prefix + opt_exception.message, - stack: opt_exception.stack || - goog.debug.getStacktrace(goog.debug.Logger.prototype.log) - }; - - // Add messageN to the exception in case it was added using - // goog.debug.enhanceError. - for (var i = 0; 'message' + i in opt_exception; i++) { - exception['message' + i] = String(opt_exception['message' + i]); - } - } - this.mainThread_.sendCommand( - this.logCommandId_, - [name, level.value, msg, exception]); -}; - - -/** @override */ -goog.gears.LoggerClient.prototype.disposeInternal = function() { - goog.gears.LoggerClient.superClass_.disposeInternal.call(this); - this.mainThread_ = null; - goog.gears.LoggerClient.instance_ = null; -}; diff --git a/third_party/closure/goog/gears/loggerserver.js b/third_party/closure/goog/gears/loggerserver.js deleted file mode 100644 index 56469f785e9a6..0000000000000 --- a/third_party/closure/goog/gears/loggerserver.js +++ /dev/null @@ -1,157 +0,0 @@ -// Copyright 2007 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 This class lives on the main thread and takes care of incoming - * logger commands from a worker thread. - * - * @author arv@google.com (Erik Arvidsson) - */ - -goog.provide('goog.gears.LoggerServer'); - -goog.require('goog.Disposable'); -goog.require('goog.debug.Logger'); -goog.require('goog.debug.Logger.Level'); -goog.require('goog.gears.Worker.EventType'); - - - -/** - * Creates an object that listens to incoming LOG commands and forwards them - * to a goog.debug.Logger - * @param {goog.gears.Worker} worker The worker thread that - * we are managing the loggers on. - * @param {number} logCommandId The command id used for logging. - * @param {string=} opt_workerName The name of the worker. If present then this - * is added to the log records and to exceptions as {@code workerName}. - * @constructor - * @extends {goog.Disposable} - */ -goog.gears.LoggerServer = function(worker, logCommandId, opt_workerName) { - goog.Disposable.call(this); - - /** - * The command id to use to receive log commands from the workers. - * @type {number} - * @private - */ - this.logCommandId_ = logCommandId; - - /** - * The worker thread object. - * @type {goog.gears.Worker} - * @private - */ - this.worker_ = worker; - - /** - * The name of the worker. - * @type {string} - * @private - */ - this.workerName_ = opt_workerName || ''; - - /** - * Message prefix containing worker ID. - * @type {string} - * @private - */ - this.msgPrefix_ = '[' + worker.getId() + '] '; - - // Listen for command's from the worker to handle the log command. - worker.addEventListener(goog.gears.Worker.EventType.COMMAND, - this.onCommand_, false, this); -}; -goog.inherits(goog.gears.LoggerServer, goog.Disposable); - - -/** - * Whether to show the ID of the worker as a prefix to the shown message. - * @type {boolean} - * @private - */ -goog.gears.LoggerServer.prototype.useMessagePrefix_ = true; - - -/** - * @return {boolean} * Whether to show the ID of the worker as a prefix to the - * shown message. - */ -goog.gears.LoggerServer.prototype.getUseMessagePrefix = function() { - return this.useMessagePrefix_; -}; - - -/** - * Whether to prefix the message text with the worker ID. - * @param {boolean} b True to prefix the messages. - */ -goog.gears.LoggerServer.prototype.setUseMessagePrefix = function(b) { - this.useMessagePrefix_ = b; -}; - - -/** - * Event handler for the command event of the thread. - * @param {goog.gears.WorkerEvent} e The command event sent by the the - * worker thread. - * @private - */ -goog.gears.LoggerServer.prototype.onCommand_ = function(e) { - var message = /** @type {Array} */ (e.message); - var commandId = message[0]; - if (commandId == this.logCommandId_) { - var params = message[1]; - var i = 0; - var name = params[i++]; - - // The old version sent the level name as well. We no longer need it so - // we just step over it. - if (params.length == 5) { - i++; - } - var levelValue = params[i++]; - var level = goog.debug.Logger.Level.getPredefinedLevelByValue(levelValue); - if (level) { - var msg = (this.useMessagePrefix_ ? this.msgPrefix_ : '') + params[i++]; - var exception = params[i++]; - var logger = goog.debug.Logger.getLogger(name); - var logRecord = logger.getLogRecord(level, msg, exception); - if (this.workerName_) { - logRecord.workerName = this.workerName_; - - // Note that we happen to know that getLogRecord just references the - // exception object so we can continue to modify it as needed. - if (exception) { - exception.workerName = this.workerName_; - } - } - logger.logRecord(logRecord); - } - // ignore others for now - } -}; - - -/** @override */ -goog.gears.LoggerServer.prototype.disposeInternal = function() { - goog.gears.LoggerServer.superClass_.disposeInternal.call(this); - - // Remove the event listener. - this.worker_.removeEventListener( - goog.gears.Worker.EventType.COMMAND, this.onCommand_, false, this); - - this.worker_ = null; -}; diff --git a/third_party/closure/goog/gears/logstore.js b/third_party/closure/goog/gears/logstore.js deleted file mode 100644 index 48f8e8f6db63e..0000000000000 --- a/third_party/closure/goog/gears/logstore.js +++ /dev/null @@ -1,477 +0,0 @@ -// Copyright 2008 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 This file implements a store for goog.debug.Logger data. - */ - -goog.provide('goog.gears.LogStore'); -goog.provide('goog.gears.LogStore.Query'); - -goog.require('goog.async.Delay'); -goog.require('goog.debug.LogManager'); -goog.require('goog.debug.LogRecord'); -goog.require('goog.debug.Logger'); -goog.require('goog.debug.Logger.Level'); -goog.require('goog.gears.BaseStore'); -goog.require('goog.gears.BaseStore.SchemaType'); -goog.require('goog.json'); - - - -/** - * Implements a store for goog.debug.Logger data. - * @param {goog.gears.Database} database Database. - * @param {?string=} opt_tableName Name of logging table to use. - * @extends {goog.gears.BaseStore} - * @constructor - */ -goog.gears.LogStore = function(database, opt_tableName) { - goog.gears.BaseStore.call(this, database); - - /** - * Name of log table. - * @type {string} - */ - var tableName = opt_tableName || goog.gears.LogStore.DEFAULT_TABLE_NAME_; - this.tableName_ = tableName; - - // Override BaseStore schema attribute. - this.schema = [ - { - type: goog.gears.BaseStore.SchemaType.TABLE, - name: tableName, - columns: [ - // Unique ID. - 'id INTEGER PRIMARY KEY AUTOINCREMENT', - // Timestamp. - 'millis BIGINT', - // #goog.debug.Logger.Level value. - 'level INTEGER', - // Message. - 'msg TEXT', - // Name of logger object. - 'logger TEXT', - // Serialized error object. - 'exception TEXT', - // Full exception text. - 'exceptionText TEXT' - ] - }, - { - type: goog.gears.BaseStore.SchemaType.INDEX, - name: tableName + 'MillisIndex', - isUnique: false, - tableName: tableName, - columns: ['millis'] - }, - { - type: goog.gears.BaseStore.SchemaType.INDEX, - name: tableName + 'LevelIndex', - isUnique: false, - tableName: tableName, - columns: ['level'] - } - ]; - - /** - * Buffered log records not yet flushed to DB. - * @type {Array.} - * @private - */ - this.records_ = []; - - /** - * Save the publish handler so it can be removed. - * @type {Function} - * @private - */ - this.publishHandler_ = goog.bind(this.addLogRecord, this); -}; -goog.inherits(goog.gears.LogStore, goog.gears.BaseStore); - - -/** @override */ -goog.gears.LogStore.prototype.version = 1; - - -/** - * Whether we are currently capturing logger output. - * @type {boolean} - * @private - */ -goog.gears.LogStore.prototype.isCapturing_ = false; - - -/** - * Size of buffered log data messages. - * @type {number} - * @private - */ -goog.gears.LogStore.prototype.bufferSize_ = 0; - - -/** - * Scheduler for pruning action. - * @type {goog.async.Delay?} - * @private - */ -goog.gears.LogStore.prototype.delay_ = null; - - -/** - * Use this to protect against recursive flushing. - * @type {boolean} - * @private - */ -goog.gears.LogStore.prototype.isFlushing_ = false; - - -/** - * Logger. - * @type {goog.debug.Logger} - * @private - */ -goog.gears.LogStore.prototype.logger_ = - goog.debug.Logger.getLogger('goog.gears.LogStore'); - - -/** - * Default value for how many records we keep when pruning. - * @type {number} - * @private - */ -goog.gears.LogStore.DEFAULT_PRUNE_KEEPER_COUNT_ = 1000; - - -/** - * Default value for how often to auto-prune (10 minutes). - * @type {number} - * @private - */ -goog.gears.LogStore.DEFAULT_AUTOPRUNE_INTERVAL_MILLIS_ = 10 * 60 * 1000; - - -/** - * The name for the log table. - * @type {string} - * @private - */ -goog.gears.LogStore.DEFAULT_TABLE_NAME_ = 'GoogGearsDebugLogStore'; - - -/** - * Max message bytes to buffer before flushing to database. - * @type {number} - * @private - */ -goog.gears.LogStore.MAX_BUFFER_BYTES_ = 200000; - - -/** - * Flush buffered log records. - */ -goog.gears.LogStore.prototype.flush = function() { - if (this.isFlushing_ || !this.getDatabaseInternal()) { - return; - } - this.isFlushing_ = true; - - // Grab local copy of records so database can log during this process. - this.logger_.info('flushing ' + this.records_.length + ' records'); - var records = this.records_; - this.records_ = []; - - for (var i = 0; i < records.length; i++) { - var record = records[i]; - var exception = record.getException(); - var serializedException = exception ? goog.json.serialize(exception) : ''; - var statement = 'INSERT INTO ' + this.tableName_ + - ' (millis, level, msg, logger, exception, exceptionText)' + - ' VALUES (?, ?, ?, ?, ?, ?)'; - this.getDatabaseInternal().execute(statement, - record.getMillis(), record.getLevel().value, record.getMessage(), - record.getLoggerName(), serializedException, - record.getExceptionText() || ''); - } - - this.isFlushing_ = false; -}; - - -/** - * Create new delay object for auto-pruning. Does not stop or - * start auto-pruning, call #startAutoPrune and #startAutoPrune for that. - * @param {?number=} opt_count Number of records of recent hitory to keep. - * @param {?number=} opt_interval Milliseconds to wait before next pruning. - */ -goog.gears.LogStore.prototype.createAutoPruneDelay = function( - opt_count, opt_interval) { - if (this.delay_) { - this.delay_.dispose(); - this.delay_ = null; - } - var interval = typeof opt_interval == 'number' ? - opt_interval : goog.gears.LogStore.DEFAULT_AUTOPRUNE_INTERVAL_MILLIS_; - var listener = goog.bind(this.autoPrune_, this, opt_count); - this.delay_ = new goog.async.Delay(listener, interval); -}; - - -/** - * Enable periodic pruning. As a side effect, this also flushes the memory - * buffer. - */ -goog.gears.LogStore.prototype.startAutoPrune = function() { - if (!this.delay_) { - this.createAutoPruneDelay( - goog.gears.LogStore.DEFAULT_PRUNE_KEEPER_COUNT_, - goog.gears.LogStore.DEFAULT_AUTOPRUNE_INTERVAL_MILLIS_); - } - this.delay_.fire(); -}; - - -/** - * Disable scheduled pruning. - */ -goog.gears.LogStore.prototype.stopAutoPrune = function() { - if (this.delay_) { - this.delay_.stop(); - } -}; - - -/** - * @return {boolean} True iff auto prune timer is active. - */ -goog.gears.LogStore.prototype.isAutoPruneActive = function() { - return !!this.delay_ && this.delay_.isActive(); -}; - - -/** - * Prune, and schedule next pruning. - * @param {?number=} opt_count Number of records of recent hitory to keep. - * @private - */ -goog.gears.LogStore.prototype.autoPrune_ = function(opt_count) { - this.pruneBeforeCount(opt_count); - this.delay_.start(); -}; - - -/** - * Keep some number of most recent log records and delete all older ones. - * @param {?number=} opt_count Number of records of recent history to keep. If - * unspecified, we use #goog.gears.LogStore.DEFAULT_PRUNE_KEEPER_COUNT_. - * Pass in 0 to delete all log records. - */ -goog.gears.LogStore.prototype.pruneBeforeCount = function(opt_count) { - if (!this.getDatabaseInternal()) { - return; - } - var count = typeof opt_count == 'number' ? - opt_count : goog.gears.LogStore.DEFAULT_PRUNE_KEEPER_COUNT_; - this.logger_.info('pruning before ' + count + ' records ago'); - this.flush(); - this.getDatabaseInternal().execute('DELETE FROM ' + this.tableName_ + - ' WHERE id <= ((SELECT MAX(id) FROM ' + this.tableName_ + ') - ?)', - count); -}; - - -/** - * Delete log record #id and all older records. - * @param {number} sequenceNumber ID before which we delete all records. - */ -goog.gears.LogStore.prototype.pruneBeforeSequenceNumber = - function(sequenceNumber) { - if (!this.getDatabaseInternal()) { - return; - } - this.logger_.info('pruning before sequence number ' + sequenceNumber); - this.flush(); - this.getDatabaseInternal().execute( - 'DELETE FROM ' + this.tableName_ + ' WHERE id <= ?', - sequenceNumber); -}; - - -/** - * Whether we are currently capturing logger output. - * @return {boolean} Whether we are currently capturing logger output. - */ -goog.gears.LogStore.prototype.isCapturing = function() { - return this.isCapturing_; -}; - - -/** - * Sets whether we are currently capturing logger output. - * @param {boolean} capturing Whether to capture logger output. - */ -goog.gears.LogStore.prototype.setCapturing = function(capturing) { - if (capturing != this.isCapturing_) { - this.isCapturing_ = capturing; - - // Attach or detach handler from the root logger. - var rootLogger = goog.debug.LogManager.getRoot(); - if (capturing) { - rootLogger.addHandler(this.publishHandler_); - this.logger_.info('enabled'); - } else { - this.logger_.info('disabling'); - rootLogger.removeHandler(this.publishHandler_); - } - } -}; - - -/** - * Adds a log record. - * @param {goog.debug.LogRecord} logRecord the LogRecord. - */ -goog.gears.LogStore.prototype.addLogRecord = function(logRecord) { - this.records_.push(logRecord); - this.bufferSize_ += logRecord.getMessage().length; - var exceptionText = logRecord.getExceptionText(); - if (exceptionText) { - this.bufferSize_ += exceptionText.length; - } - if (this.bufferSize_ >= goog.gears.LogStore.MAX_BUFFER_BYTES_) { - this.flush(); - } -}; - - -/** - * Select log records. - * @param {goog.gears.LogStore.Query} query Query object. - * @return {Array.} Selected logs in descending - * order of creation time. - */ -goog.gears.LogStore.prototype.select = function(query) { - if (!this.getDatabaseInternal()) { - // This should only occur if we've been disposed. - return []; - } - this.flush(); - - // TODO(user) Perhaps have Query object build this SQL string so we can - // omit unneeded WHERE clauses. - var statement = - 'SELECT id, millis, level, msg, logger, exception, exceptionText' + - ' FROM ' + this.tableName_ + - ' WHERE level >= ? AND millis >= ? AND millis <= ?' + - ' AND msg like ? and logger like ?' + - ' ORDER BY id DESC LIMIT ?'; - var rows = this.getDatabaseInternal().queryObjectArray(statement, - query.level.value, query.minMillis, query.maxMillis, - query.msgLike, query.loggerLike, query.limit); - - var result = Array(rows.length); - for (var i = rows.length - 1; i >= 0; i--) { - var row = rows[i]; - - // Parse fields, allowing for invalid values. - var sequenceNumber = Number(row['id']) || 0; - var level = goog.debug.Logger.Level.getPredefinedLevelByValue( - Number(row['level']) || 0); - var msg = row['msg'] || ''; - var loggerName = row['logger'] || ''; - var millis = Number(row['millis']) || 0; - var serializedException = row['exception']; - var exception = serializedException ? - goog.json.parse(serializedException) : null; - var exceptionText = row['exceptionText'] || ''; - - // Create record. - var record = new goog.debug.LogRecord(level, msg, loggerName, - millis, sequenceNumber); - if (exception) { - record.setException(exception); - record.setExceptionText(exceptionText); - } - - result[i] = record; - } - return result; -}; - - -/** @override */ -goog.gears.LogStore.prototype.disposeInternal = function() { - this.flush(); - - goog.gears.LogStore.superClass_.disposeInternal.call(this); - - if (this.delay_) { - this.delay_.dispose(); - this.delay_ = null; - } -}; - - - -/** - * Query to select log records. - * @constructor - */ -goog.gears.LogStore.Query = function() { -}; - - -/** - * Minimum logging level. - * @type {goog.debug.Logger.Level} - */ -goog.gears.LogStore.Query.prototype.level = goog.debug.Logger.Level.ALL; - - -/** - * Minimum timestamp, inclusive. - * @type {number} - */ -goog.gears.LogStore.Query.prototype.minMillis = -1; - - -/** - * Maximum timestamp, inclusive. - * @type {number} - */ -goog.gears.LogStore.Query.prototype.maxMillis = Infinity; - - -/** - * Message 'like' pattern. - * See http://www.sqlite.org/lang_expr.html#likeFunc for 'like' syntax. - * @type {string} - */ -goog.gears.LogStore.Query.prototype.msgLike = '%'; - - -/** - * Logger name 'like' pattern. - * See http://www.sqlite.org/lang_expr.html#likeFunc for 'like' syntax. - * @type {string} - */ -goog.gears.LogStore.Query.prototype.loggerLike = '%'; - - -/** - * Max # recent records to return. -1 means no limit. - * @type {number} - */ -goog.gears.LogStore.Query.prototype.limit = -1; diff --git a/third_party/closure/goog/gears/managedresourcestore.js b/third_party/closure/goog/gears/managedresourcestore.js deleted file mode 100644 index 464d0031eefdd..0000000000000 --- a/third_party/closure/goog/gears/managedresourcestore.js +++ /dev/null @@ -1,555 +0,0 @@ -// Copyright 2007 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 Simple wrapper around a Gears ManagedResourceStore. - * - */ - -goog.provide('goog.gears.ManagedResourceStore'); -goog.provide('goog.gears.ManagedResourceStore.EventType'); -goog.provide('goog.gears.ManagedResourceStore.UpdateStatus'); -goog.provide('goog.gears.ManagedResourceStoreEvent'); - -goog.require('goog.debug.Logger'); -goog.require('goog.events.Event'); -goog.require('goog.events.EventTarget'); -goog.require('goog.gears'); -goog.require('goog.string'); - - - -/** - * Creates a ManagedResourceStore with the specified name and update. This - * follows the Closure event model so the COMPLETE event will fire both for - * SUCCESS and for ERROR. You can use {@code isSuccess} in UPDATE to see if the - * capture was successful or you can just listen to the different events. - * - * This supports PROGRESS events, which are fired any time {@code filesComplete} - * or {@code filesTotal} changes. If the Gears version is 0.3.6 or newer this - * will reflect the numbers returned by the underlying Gears MRS but for older - * Gears versions this will just be {@code 0} or {@code 1}. - * - * NOTE: This relies on at least the 0.2 version of gears (for timer). - * - * @param {string} name The name of the managed store. - * @param {?string} requiredCookie A cookie that must be present for the - * managed store to be active. Should have the form "foo=bar". Can be null - * if not required. - * @param {GearsLocalServer=} opt_localServer Gears local server -- if not set, - * create a new one internally. - * - * @constructor - * @extends {goog.events.EventTarget} - */ -goog.gears.ManagedResourceStore = function(name, requiredCookie, - opt_localServer) { - goog.base(this); - - this.localServer_ = opt_localServer || - goog.gears.getFactory().create('beta.localserver', '1.0'); - - this.name_ = goog.gears.makeSafeFileName(name); - if (name != this.name_) { - this.logger_.info( - 'managed resource store name ' + name + '->' + this.name_); - } - - this.requiredCookie_ = requiredCookie ? String(requiredCookie) : null; - - // Whether Gears natively has "events" on the MRS. If it does not we treat - // the progress as 0 to 1 - this.supportsEvents_ = goog.string.compareVersions( - goog.gears.getFactory().version, '0.3.6') >= 0; -}; -goog.inherits(goog.gears.ManagedResourceStore, goog.events.EventTarget); - - -/** - * The amount of time between status checks during an update - * @type {number} - */ -goog.gears.ManagedResourceStore.UPDATE_INTERVAL_MS = 500; - - -/** - * Enum for possible values of Gears ManagedResourceStore.updatedStatus - * @enum - */ -goog.gears.ManagedResourceStore.UpdateStatus = { - OK: 0, - CHECKING: 1, - DOWNLOADING: 2, - FAILURE: 3 -}; - - -/** - * Logger. - * @type {goog.debug.Logger} - * @private - */ -goog.gears.ManagedResourceStore.prototype.logger_ = - goog.debug.Logger.getLogger('goog.gears.ManagedResourceStore'); - - -/** - * The Gears local server object. - * @type {GearsLocalServer} - * @private - */ -goog.gears.ManagedResourceStore.prototype.localServer_; - - -/** - * The name of the managed store. - * @type {?string} - * @private - */ -goog.gears.ManagedResourceStore.prototype.name_; - - -/** - * A cookie that must be present for the managed store to be active. - * Should have the form "foo=bar". String cast is a safety measure since - * Gears behaves very badly when it gets an unexpected data type. - * @type {?string} - * @private - */ -goog.gears.ManagedResourceStore.prototype.requiredCookie_; - - -/** - * The required cookie, if any, for the managed store. - * @type {boolean} - * @private - */ -goog.gears.ManagedResourceStore.prototype.supportsEvents_; - - -/** - * The Gears ManagedResourceStore instance we are wrapping. - * @type {GearsManagedResourceStore} - * @private - */ -goog.gears.ManagedResourceStore.prototype.gearsStore_; - - -/** - * The id of the check status timer. - * @type {?number} - * @private - */ -goog.gears.ManagedResourceStore.prototype.timerId_ = null; - - -/** - * The check status timer. - * @type {Object} - * @private - */ -goog.gears.ManagedResourceStore.prototype.timer_ = null; - - -/** - * Whether we already have an active update check. - * @type {boolean} - * @private - */ -goog.gears.ManagedResourceStore.prototype.active_ = false; - - -/** - * Number of files completed. This is 0 or 1 if the Gears version does not - * support progress events. If the Gears version supports progress events - * this will reflect the number of files that have been completed. - * @type {number} - * @private - */ -goog.gears.ManagedResourceStore.prototype.filesComplete_ = 0; - - -/** - * Number of total files to load. This is 1 if the Gears version does not - * support progress events. If the Gears version supports progress events - * this will reflect the number of files that needs to be loaded. - * @type {number} - * @private - */ -goog.gears.ManagedResourceStore.prototype.filesTotal_ = 0; - - -/** - * @return {boolean} Whether there is an active request. - */ -goog.gears.ManagedResourceStore.prototype.isActive = function() { - return this.active_; -}; - - -/** - * @return {boolean} Whether the update has completed. - */ -goog.gears.ManagedResourceStore.prototype.isComplete = function() { - return this.filesComplete_ == this.filesTotal_; -}; - - -/** - * @return {boolean} Whether the update completed with a success. - */ -goog.gears.ManagedResourceStore.prototype.isSuccess = function() { - return this.getStatus() == goog.gears.ManagedResourceStore.UpdateStatus.OK; -}; - - -/** - * Number of total files to load. This is always 1 if the Gears version does - * not support progress events. If the Gears version supports progress events - * this will reflect the number of files that needs to be loaded. - * @return {number} The number of files to load. - */ -goog.gears.ManagedResourceStore.prototype.getFilesTotal = function() { - return this.filesTotal_; -}; - - -/** - * Get the last error message. - * @return {string} Last error message. - */ -goog.gears.ManagedResourceStore.prototype.getLastError = function() { - return this.gearsStore_ ? this.gearsStore_.lastErrorMessage : ''; -}; - - -/** - * Number of files completed. This is 0 or 1 if the Gears version does not - * support progress events. If the Gears version supports progress events - * this will reflect the number of files that have been completed. - * @return {number} The number of completed files. - */ -goog.gears.ManagedResourceStore.prototype.getFilesComplete = function() { - return this.filesComplete_; -}; - - -/** - * Sets the filesComplete and the filesTotal and dispathces an event when - * either changes. - * @param {number} complete The count of the downloaded files. - * @param {number} total The total number of files. - * @private - */ -goog.gears.ManagedResourceStore.prototype.setFilesCounts_ = function(complete, - total) { - if (this.filesComplete_ != complete || this.filesTotal_ != total) { - this.filesComplete_ = complete; - this.filesTotal_ = total; - this.dispatchEvent(goog.gears.ManagedResourceStore.EventType.PROGRESS); - } -}; - - -/** - * Determine if the ManagedResourceStore has been created in Gears yet - * @return {boolean} true if it has been created. - */ -goog.gears.ManagedResourceStore.prototype.exists = function() { - if (!this.gearsStore_) { - this.gearsStore_ = this.localServer_.openManagedStore( - this.name_, this.requiredCookie_); - } - - return !!this.gearsStore_; -}; - - -/** - * Throws an error if the store has not yet been created via create(). - * @private - */ -goog.gears.ManagedResourceStore.prototype.assertExists_ = function() { - if (!this.exists()) { - throw Error('Store not yet created'); - } -}; - - -/** - * Throws an error if the store has already been created via create(). - * @private - */ -goog.gears.ManagedResourceStore.prototype.assertNotExists_ = function() { - if (this.exists()) { - throw Error('Store already created'); - } -}; - - -/** - * Create the ManagedResourceStore in gears - * @param {string=} opt_manifestUrl The url of the manifest to associate. - */ -goog.gears.ManagedResourceStore.prototype.create = function(opt_manifestUrl) { - if (!this.exists()) { - this.gearsStore_ = this.localServer_.createManagedStore( - this.name_, this.requiredCookie_); - this.assertExists_(); - } - - if (opt_manifestUrl) { - // String cast is a safety measure since Gears behaves very badly if it - // gets an unexpected data type (e.g., goog.Uri). - this.gearsStore_.manifestUrl = String(opt_manifestUrl); - } -}; - - -/** - * Starts an asynchronous process to update the ManagedResourcStore - */ -goog.gears.ManagedResourceStore.prototype.update = function() { - if (this.active_) { - // Update already in progress. - return; - } - - this.assertExists_(); - - - if (this.supportsEvents_) { - this.gearsStore_.onprogress = goog.bind(this.handleProgress_, this); - this.gearsStore_.oncomplete = goog.bind(this.handleComplete_, this); - this.gearsStore_.onerror = goog.bind(this.handleError_, this); - } else { - this.timer_ = goog.gears.getFactory().create('beta.timer', '1.0'); - this.timerId_ = this.timer_.setInterval( - goog.bind(this.checkUpdateStatus_, this), - goog.gears.ManagedResourceStore.UPDATE_INTERVAL_MS); - this.setFilesCounts_(0, 1); - } - - this.gearsStore_.checkForUpdate(); - - this.active_ = true; -}; - - -/** - * @return {string} Store's current manifest URL. - */ -goog.gears.ManagedResourceStore.prototype.getManifestUrl = function() { - this.assertExists_(); - return this.gearsStore_.manifestUrl; -}; - - -/** - * @param {string} url Store's new manifest URL. - */ -goog.gears.ManagedResourceStore.prototype.setManifestUrl = function(url) { - this.assertExists_(); - - // Safety measure since Gears behaves very badly if it gets an unexpected - // data type (e.g., goog.Uri). - this.gearsStore_.manifestUrl = String(url); -}; - - -/** - * @return {?string} The version of the managed store that is currently being - * served. - */ -goog.gears.ManagedResourceStore.prototype.getVersion = function() { - return this.exists() ? this.gearsStore_.currentVersion : null; -}; - - -/** - * @return {goog.gears.ManagedResourceStore.UpdateStatus} The current update - * status. - */ -goog.gears.ManagedResourceStore.prototype.getStatus = function() { - this.assertExists_(); - return /** @type {goog.gears.ManagedResourceStore.UpdateStatus} */ ( - this.gearsStore_.updateStatus); -}; - - -/** - * @return {boolean} Whether the store is currently enabled to serve local - * content. - */ -goog.gears.ManagedResourceStore.prototype.isEnabled = function() { - this.assertExists_(); - return this.gearsStore_.enabled; -}; - - -/** - * Sets whether the store is currently enabled to serve local content. - * @param {boolean} isEnabled True if the store is enabled and false otherwise. - */ -goog.gears.ManagedResourceStore.prototype.setEnabled = function(isEnabled) { - this.assertExists_(); - // !! is a safety measure since Gears behaves very badly if it gets an - // unexpected data type. - this.gearsStore_.enabled = !!isEnabled; -}; - - -/** - * Remove managed store. - */ -goog.gears.ManagedResourceStore.prototype.remove = function() { - this.assertExists_(); - this.localServer_.removeManagedStore(this.name_, this.requiredCookie_); - this.gearsStore_ = null; - this.assertNotExists_(); -}; - - -/** - * Called periodically as the update proceeds. If it has completed, fire an - * approproiate event and cancel further checks. - * @private - */ -goog.gears.ManagedResourceStore.prototype.checkUpdateStatus_ = function() { - var e; - - if (this.gearsStore_.updateStatus == - goog.gears.ManagedResourceStore.UpdateStatus.FAILURE) { - e = new goog.gears.ManagedResourceStoreEvent( - goog.gears.ManagedResourceStore.EventType.ERROR, - this.gearsStore_.lastErrorMessage); - this.setFilesCounts_(0, 1); - } else if (this.gearsStore_.updateStatus == - goog.gears.ManagedResourceStore.UpdateStatus.OK) { - e = new goog.gears.ManagedResourceStoreEvent( - goog.gears.ManagedResourceStore.EventType.SUCCESS); - this.setFilesCounts_(1, 1); - } - - if (e) { - this.cancelStatusCheck_(); - this.dispatchEvent(e); - // Fire complete after both error and success - this.dispatchEvent(goog.gears.ManagedResourceStore.EventType.COMPLETE); - this.active_ = false; - } -}; - - -/** - * Cancel periodic status checks. - * @private - */ -goog.gears.ManagedResourceStore.prototype.cancelStatusCheck_ = function() { - if (!this.supportsEvents_ && this.timerId_ != null) { - this.timer_.clearInterval(this.timerId_); - this.timerId_ = null; - this.timer_ = null; - } -}; - - -/** - * Callback for when the Gears managed resource store fires a progress event. - * @param {Object} details An object containg two fields, {@code filesComplete} - * and {@code filesTotal}. - * @private - */ -goog.gears.ManagedResourceStore.prototype.handleProgress_ = function(details) { - // setFilesCounts_ will dispatch the progress event as needed - this.setFilesCounts_(details['filesComplete'], details['filesTotal']); -}; - - -/** - * Callback for when the Gears managed resource store fires a complete event. - * @param {Object} details An object containg one field called - * {@code newVersion}. - * @private - */ -goog.gears.ManagedResourceStore.prototype.handleComplete_ = function(details) { - this.dispatchEvent(goog.gears.ManagedResourceStore.EventType.SUCCESS); - this.dispatchEvent(goog.gears.ManagedResourceStore.EventType.COMPLETE); - this.active_ = false; -}; - - -/** - * Callback for when the Gears managed resource store fires an error event. - * @param {Object} error An object containg one field called - * {@code message}. - * @private - */ -goog.gears.ManagedResourceStore.prototype.handleError_ = function(error) { - this.dispatchEvent(new goog.gears.ManagedResourceStoreEvent( - goog.gears.ManagedResourceStore.EventType.ERROR, error.message)); - this.dispatchEvent(goog.gears.ManagedResourceStore.EventType.COMPLETE); - this.active_ = false; -}; - - -/** @override */ -goog.gears.ManagedResourceStore.prototype.disposeInternal = function() { - goog.gears.ManagedResourceStore.superClass_.disposeInternal.call(this); - if (this.supportsEvents_ && this.gearsStore_) { - this.gearsStore_.onprogress = null; - this.gearsStore_.oncomplete = null; - this.gearsStore_.onerror = null; - } - this.cancelStatusCheck_(); - this.localServer_ = null; - this.gearsStore_ = null; -}; - - -/** - * Enum for event types fired by ManagedResourceStore. - * @enum {string} - */ -goog.gears.ManagedResourceStore.EventType = { - COMPLETE: 'complete', - ERROR: 'error', - PROGRESS: 'progress', - SUCCESS: 'success' -}; - - - -/** - * Event used when a ManagedResourceStore update is complete - * @param {string} type The type of the event. - * @param {string=} opt_errorMessage The error message if failure. - * @constructor - * @extends {goog.events.Event} - */ -goog.gears.ManagedResourceStoreEvent = function(type, opt_errorMessage) { - goog.events.Event.call(this, type); - - if (opt_errorMessage) { - this.errorMessage = opt_errorMessage; - } -}; -goog.inherits(goog.gears.ManagedResourceStoreEvent, goog.events.Event); - - -/** - * Error message in the case of a failure event. - * @type {?string} - */ -goog.gears.ManagedResourceStoreEvent.prototype.errorMessage = null; diff --git a/third_party/closure/goog/gears/multipartformdata.js b/third_party/closure/goog/gears/multipartformdata.js deleted file mode 100644 index 798b9488d8320..0000000000000 --- a/third_party/closure/goog/gears/multipartformdata.js +++ /dev/null @@ -1,204 +0,0 @@ -// 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. - -/** - * @fileoverview This class provides a builder for building multipart form data - * that is to be usef with Gears BlobBuilder and GearsHttpRequest. - * - * @author arv@google.com (Erik Arvidsson) - */ - -goog.provide('goog.gears.MultipartFormData'); - -goog.require('goog.asserts'); -goog.require('goog.gears'); -goog.require('goog.string'); - - - -/** - * Creates a new multipart form data builder. - * @constructor - */ -goog.gears.MultipartFormData = function() { - /** - * The blob builder used to build the blob. - * @type {GearsBlobBuilder} - * @private - */ - this.blobBuilder_ = goog.gears.getFactory().create('beta.blobbuilder'); - - /** - * The boundary. This should be something that does not occurr in the values. - * @type {string} - * @private - */ - this.boundary_ = '----' + goog.string.getRandomString(); -}; - - -/** - * Constant for a carriage return followed by a new line. - * @type {string} - * @private - */ -goog.gears.MultipartFormData.CRLF_ = '\r\n'; - - -/** - * Constant containing two dashes. - * @type {string} - * @private - */ -goog.gears.MultipartFormData.DASHES_ = '--'; - - -/** - * Whether the builder has been closed. - * @type {boolean} - * @private - */ -goog.gears.MultipartFormData.prototype.closed_; - - -/** - * Whether the builder has any content. - * @type {boolean} - * @private - */ -goog.gears.MultipartFormData.prototype.hasContent_; - - -/** - * Adds a Gears file to the multipart. - * @param {string} name The name of the value. - * @param {GearsFile} gearsFile The Gears file as returned from openFiles etc. - * @return {goog.gears.MultipartFormData} The form builder itself. - */ -goog.gears.MultipartFormData.prototype.addFile = function(name, gearsFile) { - return this.addBlob(name, gearsFile.name, gearsFile.blob); -}; - - -/** - * Adds some text to the multipart. - * @param {string} name The name of the value. - * @param {*} value The value. This will use toString on the value. - * @return {goog.gears.MultipartFormData} The form builder itself. - */ -goog.gears.MultipartFormData.prototype.addText = function(name, value) { - this.assertNotClosed_(); - - // Also assert that the value does not contain the boundary. - this.assertNoBoundary_(value); - - this.hasContent_ = true; - this.blobBuilder_.append( - goog.gears.MultipartFormData.DASHES_ + this.boundary_ + - goog.gears.MultipartFormData.CRLF_ + - 'Content-Disposition: form-data; name="' + name + '"' + - goog.gears.MultipartFormData.CRLF_ + - // The BlobBuilder uses UTF-8 so ensure that we use that at all times. - 'Content-Type: text/plain; charset=UTF-8' + - goog.gears.MultipartFormData.CRLF_ + - goog.gears.MultipartFormData.CRLF_ + - value + - goog.gears.MultipartFormData.CRLF_); - return this; -}; - - -/** - * Adds a Gears blob as a file to the multipart. - * @param {string} name The name of the value. - * @param {string} fileName The name of the file. - * @param {GearsBlob} blob The blob to add. - * @return {goog.gears.MultipartFormData} The form builder itself. - */ -goog.gears.MultipartFormData.prototype.addBlob = function(name, fileName, - blob) { - this.assertNotClosed_(); - - this.hasContent_ = true; - this.blobBuilder_.append( - goog.gears.MultipartFormData.DASHES_ + this.boundary_ + - goog.gears.MultipartFormData.CRLF_ + - 'Content-Disposition: form-data; name="' + name + '"' + - '; filename="' + fileName + '"' + - goog.gears.MultipartFormData.CRLF_ + - 'Content-Type: application/octet-stream' + - goog.gears.MultipartFormData.CRLF_ + - goog.gears.MultipartFormData.CRLF_); - this.blobBuilder_.append(blob); - this.blobBuilder_.append(goog.gears.MultipartFormData.CRLF_); - return this; -}; - - -/** - * The content type to set on the GearsHttpRequest. - * - * var builder = new MultipartFormData; - * ... - * ghr.setRequestHeader('Content-Type', builder.getContentType()); - * ghr.send(builder.getAsBlob()); - * - * @return {string} The content type string to be used when posting this with - * a GearsHttpRequest. - */ -goog.gears.MultipartFormData.prototype.getContentType = function() { - return 'multipart/form-data; boundary=' + this.boundary_; -}; - - -/** - * @return {GearsBlob} The blob to use in the send method of the - * GearsHttpRequest. - */ -goog.gears.MultipartFormData.prototype.getAsBlob = function() { - if (!this.closed_ && this.hasContent_) { - this.blobBuilder_.append( - goog.gears.MultipartFormData.DASHES_ + - this.boundary_ + - goog.gears.MultipartFormData.DASHES_ + - goog.gears.MultipartFormData.CRLF_); - this.closed_ = true; - } - return this.blobBuilder_.getAsBlob(); -}; - - -/** - * Asserts that we do not try to add any more data to a closed multipart form - * builder. - * @throws {Error} If the multipart form data has already been closed. - * @private - */ -goog.gears.MultipartFormData.prototype.assertNotClosed_ = function() { - goog.asserts.assert(!this.closed_, 'The multipart form builder has been ' + - 'closed and no more data can be added to it'); -}; - - -/** - * Asserts that the value does not contain the boundary. - * @param {*} v The value to ensure that the string representation does not - * contain the boundary token. - * @throws {Error} If the value contains the boundary. - * @private - */ -goog.gears.MultipartFormData.prototype.assertNoBoundary_ = function(v) { - goog.asserts.assert(String(v).indexOf(this.boundary_) == -1, - 'The value cannot contain the boundary'); -}; diff --git a/third_party/closure/goog/gears/urlcapture.js b/third_party/closure/goog/gears/urlcapture.js deleted file mode 100644 index a646847ebd219..0000000000000 --- a/third_party/closure/goog/gears/urlcapture.js +++ /dev/null @@ -1,370 +0,0 @@ -// Copyright 2007 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 Interface for capturing URLs to a ResourceStore on the - * LocalServer. - * - */ - - -goog.provide('goog.gears.UrlCapture'); -goog.provide('goog.gears.UrlCapture.Event'); -goog.provide('goog.gears.UrlCapture.EventType'); - -goog.require('goog.Uri'); -goog.require('goog.debug.Logger'); -goog.require('goog.events.Event'); -goog.require('goog.events.EventTarget'); -goog.require('goog.gears'); - - - -/** - * Class capture URLs to a ResourceStore on the LocalServer. - * @constructor - * @extends {goog.events.EventTarget} - * @param {string} name The name of the ResourceStore to capture the URLs to. - * @param {?string} requiredCookie A cookie that must be present for the - * managed store to be active. Should have the form "foo=bar". - * @param {GearsResourceStore=} opt_localServer The LocalServer for gears. - */ -goog.gears.UrlCapture = function(name, requiredCookie, opt_localServer) { - goog.events.EventTarget.call(this); - - /** - * Name of resource store. - * @type {string} - * @private - */ - this.storeName_ = goog.gears.makeSafeFileName(name); - if (name != this.storeName_) { - this.logger_.info( - 'local store name ' + name + '->' + this.storeName_); - } - - /** - * A cookie that must be present for the store to be active. - * Should have the form "foo=bar". String cast is a safety measure since - * Gears behaves very badly when it gets an unexpected data type. - * @type {?string} - * @private - */ - this.requiredCookie_ = requiredCookie ? String(requiredCookie) : null; - - /** - * The LocalServer for Gears. - * @type {GearsLocalServer} - * @private - */ - this.localServer_ = opt_localServer || - goog.gears.getFactory().create('beta.localserver', '1.0'); - - /** - * Object mapping list of URIs to capture to capture id. - * @type {Object} - * @private - */ - this.uris_ = {}; - - /** - * Object mapping list of URIs that had errors in the capture to capture id. - * @type {Object} - * @private - */ - this.errorUris_ = {}; - - /** - * Object mapping number of URLs completed to capture id. - * @type {Object} - * @private - */ - this.numCompleted_ = {}; -}; -goog.inherits(goog.gears.UrlCapture, goog.events.EventTarget); - - -/** - * Logger. - * @type {goog.debug.Logger} - * @private - */ -goog.gears.UrlCapture.prototype.logger_ = - goog.debug.Logger.getLogger('goog.gears.UrlCapture'); - - -/** - * The ResourceStore for gears, used to capture URLs. - * @type {GearsResourceStore} - * @private - */ -goog.gears.UrlCapture.prototype.resourceStore_ = null; - - -/** - * Events fired during URL capture - * @enum {string} - */ -goog.gears.UrlCapture.EventType = { - URL_SUCCESS: 'url_success', - URL_ERROR: 'url_error', - COMPLETE: 'complete', - ABORT: 'abort' -}; - - -/** - * Lazy initializer for resource store. - * @return {GearsResourceStore} Gears resource store. - * @private - */ -goog.gears.UrlCapture.prototype.getResourceStore_ = function() { - if (!this.resourceStore_) { - this.logger_.info('creating resource store: ' + this.storeName_); - this.resourceStore_ = this.localServer_['createStore']( - this.storeName_, this.requiredCookie_); - } - return this.resourceStore_; -}; - - -/** - * Determine if the UrlCapture has been created. - * @return {boolean} True if it has been created. - */ -goog.gears.UrlCapture.prototype.exists = function() { - if (!this.resourceStore_) { - this.logger_.info('opening resource store: ' + this.storeName_); - this.resourceStore_ = this.localServer_['openStore']( - this.storeName_, this.requiredCookie_); - } - return !!this.resourceStore_; -}; - - -/** - * Remove this resource store. - */ -goog.gears.UrlCapture.prototype.removeStore = function() { - this.logger_.info('removing resource store: ' + this.storeName_); - this.localServer_['removeStore'](this.storeName_, this.requiredCookie_); - this.resourceStore_ = null; -}; - - -/** - * Renames a Url that's been captured. - * @param {string|goog.Uri} srcUri The source Uri. - * @param {string|goog.Uri} dstUri The destination Uri. - */ -goog.gears.UrlCapture.prototype.rename = function(srcUri, dstUri) { - this.getResourceStore_()['rename'](srcUri.toString(), dstUri.toString()); -}; - - -/** - * Copies a Url that's been captured. - * @param {string|goog.Uri} srcUri The source Uri. - * @param {string|goog.Uri} dstUri The destination Uri. - */ -goog.gears.UrlCapture.prototype.copy = function(srcUri, dstUri) { - this.getResourceStore_()['copy'](srcUri.toString(), dstUri.toString()); -}; - - -/** - * Starts the capture of the given URLs. Returns immediately, and fires events - * on success and error. - * @param {Array.} uris URIs to capture. - * @return {number} The id of the ResourceStore capture. Can be used to - * abort, or identify events. - */ -goog.gears.UrlCapture.prototype.capture = function(uris) { - var count = uris.length; - this.logger_.fine('capture: count==' + count); - if (!count) { - throw Error('No URIs to capture'); - } - - // Convert goog.Uri objects to strings since Gears will throw an exception - // for non-strings. - var captureStrings = []; - for (var i = 0; i < count; i++) { - captureStrings.push(uris[i].toString()); - } - - var id = this.getResourceStore_()['capture']( - captureStrings, goog.bind(this.captureCallback_, this)); - this.logger_.fine('capture started: ' + id); - this.uris_[id] = uris; - this.errorUris_[id] = []; - this.numCompleted_[id] = 0; - return id; -}; - - -/** - * Aborts the capture with the given id. Dispatches abort event. - * @param {number} captureId The id of the capture to abort, from #capture. - */ -goog.gears.UrlCapture.prototype.abort = function(captureId) { - this.logger_.fine('abort: ' + captureId); - - // TODO(user) Remove when Gears adds more rubust type handling. - // Safety measure since Gears behaves very badly if it gets an unexpected - // data type. - if (typeof captureId != 'number') { - throw Error('bad capture ID: ' + captureId); - } - - // Only need to abort if the capture is still in progress. - if (this.uris_[captureId] || this.numCompleted_[captureId]) { - this.logger_.info('aborting capture: ' + captureId); - this.getResourceStore_()['abortCapture'](captureId); - this.cleanupCapture_(captureId); - this.dispatchEvent(new goog.gears.UrlCapture.Event( - goog.gears.UrlCapture.EventType.ABORT, captureId)); - } -}; - - -/** - * Checks if a URL is captured. - * @param {string|goog.Uri} uri The URL to check. - * @return {boolean} true if captured, false otherwise. - */ -goog.gears.UrlCapture.prototype.isCaptured = function(uri) { - this.logger_.fine('isCaptured: ' + uri); - return this.getResourceStore_()['isCaptured'](uri.toString()); -}; - - -/** - * Removes the given URI from the store. - * @param {string|goog.Uri} uri The URI to remove from the store. - */ -goog.gears.UrlCapture.prototype.remove = function(uri) { - this.logger_.fine('remove: ' + uri); - this.getResourceStore_()['remove'](uri.toString()); -}; - - -/** - * This is the callback passed into ResourceStore.capture. It gets called - * each time a URL is captured. - * @param {string} url The url from gears, always a string. - * @param {boolean} success True if capture succeeded, false otherwise. - * @param {number} captureId The id of the capture. - * @private - */ -goog.gears.UrlCapture.prototype.captureCallback_ = function( - url, success, captureId) { - this.logger_.fine('captureCallback_: ' + captureId); - - if (!this.uris_[captureId] && !this.numCompleted_[captureId]) { - // This probably means we were aborted and then a capture event came in. - this.cleanupCapture_(captureId); - return; - } - - // Dispatch success/error event for the URL - var eventUri = this.usesGoogUri_(captureId) ? new goog.Uri(url) : url; - var eventType = null; - if (success) { - eventType = goog.gears.UrlCapture.EventType.URL_SUCCESS; - } else { - eventType = goog.gears.UrlCapture.EventType.URL_ERROR; - this.errorUris_[captureId].push(eventUri); - } - this.dispatchEvent(new goog.gears.UrlCapture.Event( - eventType, captureId, eventUri)); - - // Dispatch complete event for the entire capture, if necessary - this.numCompleted_[captureId]++; - if (this.numCompleted_[captureId] == this.uris_[captureId].length) { - this.dispatchEvent(new goog.gears.UrlCapture.Event( - goog.gears.UrlCapture.EventType.COMPLETE, captureId, null, - this.errorUris_[captureId])); - this.cleanupCapture_(captureId); - } -}; - - -/** - * Helper function to cleanup after a capture completes or is aborted. - * @private - * @param {number} captureId The id of the capture to clean up. - */ -goog.gears.UrlCapture.prototype.cleanupCapture_ = function(captureId) { - this.logger_.fine('cleanupCapture_: ' + captureId); - delete this.uris_[captureId]; - delete this.numCompleted_[captureId]; - delete this.errorUris_[captureId]; -}; - - -/** - * Helper function to check whether a certain capture is using URIs of type - * String or type goog.Uri - * @private - * @param {number} captureId The id of the capture to check. - * @return {boolean} True if the capture uses goog.Uri, false if it uses string - * or there are no URIs associated with the capture. - */ -goog.gears.UrlCapture.prototype.usesGoogUri_ = function(captureId) { - if (this.uris_[captureId] && - this.uris_[captureId].length > 0 && - this.uris_[captureId][0] instanceof goog.Uri) { - return true; - } - return false; -}; - - - -/** - * An event dispatched by UrlCapture - * @constructor - * @extends {goog.events.Event} - * @param {goog.gears.UrlCapture.EventType} type Type of event to dispatch. - * @param {number} captureId The id of the capture that fired this event. - * @param {string|goog.Uri=} opt_uri The URI for the event. - * @param {Array.=} opt_errorUris The URIs that failed to load - * correctly. - */ -goog.gears.UrlCapture.Event = function(type, captureId, opt_uri, - opt_errorUris) { - goog.events.Event.call(this, type); - - /** - * The id of the capture to dispatch the event for. This id is returned from - * goog.gears.UrlCapture#capture - * @type {number} - */ - this.captureId = captureId; - - /** - * The URI the event concerns. Valid for URL_SUCCESS and URL_ERROR events. - * @type {string|goog.Uri|null} - */ - this.uri = opt_uri || null; - - /** - * A list of all the URIs that failed to load correctly. Valid for - * COMPLETE event. - * @type {Array.} - */ - this.errorUris = opt_errorUris || []; -}; -goog.inherits(goog.gears.UrlCapture.Event, goog.events.Event); diff --git a/third_party/closure/goog/gears/worker.js b/third_party/closure/goog/gears/worker.js deleted file mode 100644 index 4899191275cb9..0000000000000 --- a/third_party/closure/goog/gears/worker.js +++ /dev/null @@ -1,200 +0,0 @@ -// Copyright 2007 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 This represents a Gears worker (background process). - * - * @author arv@google.com (Erik Arvidsson) - */ - -goog.provide('goog.gears.Worker'); -goog.provide('goog.gears.Worker.EventType'); -goog.provide('goog.gears.WorkerEvent'); - -goog.require('goog.events.Event'); -goog.require('goog.events.EventTarget'); - - - -/** - * This is an absctraction of workers that can be used with Gears WorkerPool. - * @constructor - * @param {goog.gears.WorkerPool} workerPool WorkerPool object. - * @param {number=} opt_id The id of the worker this represents. - * - * @extends {goog.events.EventTarget} - */ -goog.gears.Worker = function(workerPool, opt_id) { - goog.events.EventTarget.call(this); - - /** - * Reference to the worker pool. - * @type {goog.gears.WorkerPool} - * @private - */ - this.workerPool_ = workerPool; - - if (opt_id != null) { - this.init(opt_id); - } -}; -goog.inherits(goog.gears.Worker, goog.events.EventTarget); - - -/** - * Called when we receive a message from this worker. The message will - * first be dispatched as a WorkerEvent with type {@code EventType.MESSAGE} and - * then a {@code EventType.COMMAND}. An EventTarget may call - * {@code WorkerEvent.preventDefault()} to stop further dispatches. - * @param {GearsMessageObject} messageObject An object containing all - * information about the message. - */ -goog.gears.Worker.prototype.handleMessage = function(messageObject) { - // First dispatch a message event. - var messageEvent = new goog.gears.WorkerEvent( - goog.gears.Worker.EventType.MESSAGE, - messageObject); - - // Allow the user to call prevent default to not process the COMMAND. - if (this.dispatchEvent(messageEvent)) { - if (goog.gears.Worker.isCommandLike(messageObject.body)) { - this.dispatchEvent(new goog.gears.WorkerEvent( - goog.gears.Worker.EventType.COMMAND, - messageObject)); - } - } -}; - - -/** - * The ID of the worker we are communicating with. - * @type {?number} - * @private - */ -goog.gears.Worker.prototype.id_ = null; - - -/** - * Initializes the worker object with a worker id. - * @param {number} id The id of the worker this represents. - */ -goog.gears.Worker.prototype.init = function(id) { - if (this.id_ != null) { - throw Error('Can only set the worker id once'); - } - - this.id_ = id; - this.workerPool_.registerWorker(this); -}; - - -/** - * Sends a command to the worker. - * @param {number} commandId The ID of the command to - * send. - * @param {Object} params An object to send as the parameters. This object - * must be something that Gears can serialize. This includes JSON as well - * as Gears blobs. - */ -goog.gears.Worker.prototype.sendCommand = function(commandId, params) { - this.sendMessage([commandId, params]); -}; - - -/** - * Sends a message to the worker. - * @param {*} message The message to send to the target worker. - */ -goog.gears.Worker.prototype.sendMessage = function(message) { - this.workerPool_.sendMessage(message, this); -}; - - -/** - * Gets an ID that uniquely identifies this worker. The ID is unique among all - * worker from the same WorkerPool. - * - * @return {number} The ID of the worker. This might be null if the - * worker has not been initialized yet. - */ -goog.gears.Worker.prototype.getId = function() { - if (this.id_ == null) { - throw Error('The worker has not yet been initialized'); - } - return this.id_; -}; - - -/** - * Whether an object looks like a command. A command is an array with length 2 - * where the first element is a number. - * @param {*} obj The object to test. - * @return {boolean} true if the object looks like a command. - */ -goog.gears.Worker.isCommandLike = function(obj) { - return goog.isArray(obj) && obj.length == 2 && - goog.isNumber(/** @type {Array} */ (obj)[0]); -}; - - -/** @override */ -goog.gears.Worker.prototype.disposeInternal = function() { - goog.gears.Worker.superClass_.disposeInternal.call(this); - this.workerPool_.unregisterWorker(this); - this.workerPool_ = null; -}; - - -/** - * Enum for event types fired by the worker. - * @enum {string} - */ -goog.gears.Worker.EventType = { - MESSAGE: 'message', - COMMAND: 'command' -}; - - - -/** - * Event used when the worker recieves a message - * @param {string} type The type of event. - * @param {GearsMessageObject} messageObject The message object. - * - * @constructor - * @extends {goog.events.Event} - */ -goog.gears.WorkerEvent = function(type, messageObject) { - goog.events.Event.call(this, type); - - /** - * The message sent from the worker. - * @type {*} - */ - this.message = messageObject.body; - - /** - * The JSON object sent from the worker. - * @type {*} - * @deprecated Use message instead. - */ - this.json = this.message; - - /** - * The object containing all information about the message. - * @type {GearsMessageObject} - */ - this.messageObject = messageObject; -}; -goog.inherits(goog.gears.WorkerEvent, goog.events.Event); diff --git a/third_party/closure/goog/gears/workerchannel.js b/third_party/closure/goog/gears/workerchannel.js deleted file mode 100644 index 750584c19819b..0000000000000 --- a/third_party/closure/goog/gears/workerchannel.js +++ /dev/null @@ -1,204 +0,0 @@ -// Copyright 2010 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 A message channel between Gears workers. This is meant to work - * even when the Gears worker has other message listeners. GearsWorkerChannel - * adds a specific prefix to its messages, and handles messages with that - * prefix. - * - */ - - -goog.provide('goog.gears.WorkerChannel'); - -goog.require('goog.Disposable'); -goog.require('goog.debug'); -goog.require('goog.debug.Logger'); -goog.require('goog.events'); -goog.require('goog.gears.Worker'); -goog.require('goog.gears.Worker.EventType'); -goog.require('goog.gears.WorkerEvent'); -goog.require('goog.json'); -goog.require('goog.messaging.AbstractChannel'); - - - -/** - * Creates a message channel for the given Gears worker. - * - * @param {goog.gears.Worker} worker The Gears worker to communicate with. This - * should already be initialized. - * @constructor - * @extends {goog.messaging.AbstractChannel} - */ -goog.gears.WorkerChannel = function(worker) { - goog.base(this); - - /** - * The Gears worker to communicate with. - * @type {goog.gears.Worker} - * @private - */ - this.worker_ = worker; - - goog.events.listen(this.worker_, goog.gears.Worker.EventType.MESSAGE, - this.deliver_, false, this); -}; -goog.inherits(goog.gears.WorkerChannel, goog.messaging.AbstractChannel); - - -/** - * The flag added to messages that are sent by a GearsWorkerChannel, and are - * meant to be handled by one on the other side. - * @type {string} - */ -goog.gears.WorkerChannel.FLAG = '--goog.gears.WorkerChannel'; - - -/** - * The expected origin of the other end of the worker channel, represented as a - * string of the form SCHEME://DOMAIN[:PORT]. The port may be omitted for - * standard ports (http port 80, https port 443). - * - * If this is set, all GearsWorkerChannel messages are validated to come from - * this origin, and ignored (with a warning) if they don't. Messages that aren't - * in the GearsWorkerChannel format are not validated. - * - * If more complex origin validation is required, the checkMessageOrigin method - * can be overridden. - * - * @type {?string} - */ -goog.gears.WorkerChannel.prototype.peerOrigin; - - -/** - * Logger for this class. - * @type {goog.debug.Logger} - * @protected - * @override - */ -goog.gears.WorkerChannel.prototype.logger = - goog.debug.Logger.getLogger('goog.gears.WorkerChannel'); - - -/** - * @override - */ -goog.gears.WorkerChannel.prototype.send = - function(serviceName, payload) { - var message = {'serviceName': serviceName, 'payload': payload}; - message[goog.gears.WorkerChannel.FLAG] = true; - this.worker_.sendMessage(message); -}; - - -/** @override */ -goog.gears.WorkerChannel.prototype.disposeInternal = function() { - goog.base(this, 'disposeInternal'); - this.worker_.dispose(); -}; - - -/** - * Delivers a message to the appropriate service handler. If this message isn't - * a GearsWorkerChannel message, it's ignored and passed on to other handlers. - * - * @param {goog.gears.WorkerEvent} e The event. - * @private - */ -goog.gears.WorkerChannel.prototype.deliver_ = function(e) { - var messageObject = e.messageObject || {}; - var body = messageObject.body; - if (!goog.isObject(body) || !body[goog.gears.WorkerChannel.FLAG]) { - return; - } - - if (!this.checkMessageOrigin(messageObject.origin)) { - return; - } - - if (this.validateMessage_(body)) { - this.deliver(body['serviceName'], body['payload']); - } - - e.preventDefault(); - e.stopPropagation(); -}; - - -/** - * Checks whether the message is invalid in some way. - * - * @param {Object} body The contents of the message. - * @return {boolean} True if the message is valid, false otherwise. - * @private - */ -goog.gears.WorkerChannel.prototype.validateMessage_ = function(body) { - if (!('serviceName' in body)) { - this.logger.warning('GearsWorkerChannel::deliver_(): ' + - 'Message object doesn\'t contain service name: ' + - goog.debug.deepExpose(body)); - return false; - } - - if (!('payload' in body)) { - this.logger.warning('GearsWorkerChannel::deliver_(): ' + - 'Message object doesn\'t contain payload: ' + - goog.debug.deepExpose(body)); - return false; - } - - return true; -}; - - -/** - * Checks whether the origin for a given message is the expected origin. If it's - * not, a warning is logged and the message is ignored. - * - * This checks that the origin matches the peerOrigin property. It can be - * overridden if more complex origin detection is necessary. - * - * @param {string} messageOrigin The origin of the message, of the form - * SCHEME://HOST[:PORT]. The port is omitted for standard ports (http port - * 80, https port 443). - * @return {boolean} True if the origin is acceptable, false otherwise. - * @protected - */ -goog.gears.WorkerChannel.prototype.checkMessageOrigin = function( - messageOrigin) { - if (!this.peerOrigin) { - return true; - } - - // Gears doesn't include standard port numbers, but we want to let the user - // include them, so we'll just edit them out. - var peerOrigin = this.peerOrigin; - if (/^http:/.test(peerOrigin)) { - peerOrigin = peerOrigin.replace(/\:80$/, ''); - } else if (/^https:/.test(peerOrigin)) { - peerOrigin = peerOrigin.replace(/\:443$/, ''); - } - - if (messageOrigin === peerOrigin) { - return true; - } - - this.logger.warning('Message from unexpected origin "' + messageOrigin + - '"; expected only messages from origin "' + peerOrigin + - '"'); - return false; -}; diff --git a/third_party/closure/goog/gears/workerpool.js b/third_party/closure/goog/gears/workerpool.js deleted file mode 100644 index f1263ed2709c4..0000000000000 --- a/third_party/closure/goog/gears/workerpool.js +++ /dev/null @@ -1,240 +0,0 @@ -// Copyright 2007 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 This file implements a wrapper around the Gears WorkerPool - * with some extra features. - * - * @author arv@google.com (Erik Arvidsson) - */ - -goog.provide('goog.gears.WorkerPool'); -goog.provide('goog.gears.WorkerPool.Event'); -goog.provide('goog.gears.WorkerPool.EventType'); - -goog.require('goog.events.Event'); -goog.require('goog.events.EventTarget'); -goog.require('goog.gears'); -goog.require('goog.gears.Worker'); - - - -/** - * This class implements a wrapper around the Gears Worker Pool. - * - * @constructor - * @extends {goog.events.EventTarget} - */ -goog.gears.WorkerPool = function() { - goog.events.EventTarget.call(this); - - /** - * Map from thread id to worker object - * @type {Object} - * @private - */ - this.workers_ = {}; - - // If we are in a worker thread we get the global google.gears.workerPool, - // otherwise we create a new Gears WorkerPool using the factory - var workerPool = /** @type {GearsWorkerPool} */ - (goog.getObjectByName('google.gears.workerPool')); - if (workerPool) { - this.workerPool_ = workerPool; - } else { - // use a protected method to let the sub class override - this.workerPool_ = this.getGearsWorkerPool(); - } - - this.workerPool_.onmessage = goog.bind(this.handleMessage_, this); -}; -goog.inherits(goog.gears.WorkerPool, goog.events.EventTarget); - - -/** - * Enum for event types fired by the WorkerPool. - * @enum {string} - */ -goog.gears.WorkerPool.EventType = { - UNKNOWN_WORKER: 'uknown_worker' -}; - - -/** - * The Gears WorkerPool object. - * @type {GearsWorkerPool} - * @private - */ -goog.gears.WorkerPool.prototype.workerPool_ = null; - - -/** - * @return {GearsWorkerPool} A Gears WorkerPool object. - * @protected - */ -goog.gears.WorkerPool.prototype.getGearsWorkerPool = function() { - var factory = goog.gears.getFactory(); - return factory.create('beta.workerpool'); -}; - - -/** - * Sets a last-chance error handler for a worker pool. - * WARNING: This will only succeed from inside a worker thread. In main thread, - * use window.onerror handler. - * @param {function(!GearsErrorObject):boolean} fn An error handler function - * that gets passed an error object with message and line number attributes. - * Returns whether the error was handled. If true stops propagation. - * @param {Object=} opt_handler This object for the function. - */ -goog.gears.WorkerPool.prototype.setErrorHandler = function(fn, opt_handler) { - this.workerPool_.onerror = goog.bind(fn, opt_handler); -}; - - -/** - * Creates a new worker. - * @param {string} code The code to execute inside the worker. - * @return {goog.gears.Worker} The worker that was just created. - */ -goog.gears.WorkerPool.prototype.createWorker = function(code) { - var workerId = this.workerPool_.createWorker(code); - var worker = new goog.gears.Worker(this, workerId); - this.registerWorker(worker); - return worker; -}; - - -/** - * Creates a new worker from a URL. - * @param {string} url URL from which to get the code to execute inside the - * worker. - * @return {goog.gears.Worker} The worker that was just created. - */ -goog.gears.WorkerPool.prototype.createWorkerFromUrl = function(url) { - var workerId = this.workerPool_.createWorkerFromUrl(url); - var worker = new goog.gears.Worker(this, workerId); - this.registerWorker(worker); - return worker; -}; - - -/** - * Allows the worker who calls this to be used cross origin. - */ -goog.gears.WorkerPool.prototype.allowCrossOrigin = function() { - this.workerPool_.allowCrossOrigin(); -}; - - -/** - * Sends a message to a given worker. - * @param {*} message The message to send to the worker. - * @param {goog.gears.Worker} worker The worker to send the message to. - */ -goog.gears.WorkerPool.prototype.sendMessage = function(message, worker) { - this.workerPool_.sendMessage(message, worker.getId()); -}; - - -/** - * Callback when this worker recieves a message. - * @param {string} message The message that was sent. - * @param {number} senderId The ID of the worker that sent the message. - * @param {GearsMessageObject} messageObject An object containing all - * information about the message. - * @private - */ -goog.gears.WorkerPool.prototype.handleMessage_ = function(message, - senderId, - messageObject) { - if (!this.isDisposed()) { - var workers = this.workers_; - if (!workers[senderId]) { - // If the worker is unknown, dispatch an event giving users of the class - // the change to register the worker. - this.dispatchEvent(new goog.gears.WorkerPool.Event( - goog.gears.WorkerPool.EventType.UNKNOWN_WORKER, - senderId, - messageObject)); - } - - var worker = workers[senderId]; - if (worker) { - worker.handleMessage(messageObject); - } - } -}; - - -/** - * Registers a worker object. - * @param {goog.gears.Worker} worker The worker to register. - */ -goog.gears.WorkerPool.prototype.registerWorker = function(worker) { - this.workers_[worker.getId()] = worker; -}; - - -/** - * Unregisters a worker object. - * @param {goog.gears.Worker} worker The worker to unregister. - */ -goog.gears.WorkerPool.prototype.unregisterWorker = function(worker) { - delete this.workers_[worker.getId()]; -}; - - -/** @override */ -goog.gears.WorkerPool.prototype.disposeInternal = function() { - goog.gears.WorkerPool.superClass_.disposeInternal.call(this); - this.workerPool_ = null; - delete this.workers_; -}; - - - -/** - * Event used when the workerpool recieves a message - * @param {string} type The type of event. - * @param {number} senderId The id of the sender of the message. - * @param {GearsMessageObject} messageObject The message object. - * - * @constructor - * @extends {goog.events.Event} - */ -goog.gears.WorkerPool.Event = function( - type, senderId, messageObject) { - goog.events.Event.call(this, type); - - /** - * The id of the sender of the message. - * @type {number} - */ - this.senderId = senderId; - - /** - * The message sent from the worker. This is the same as the - * messageObject.body field and is here for convenience. - * @type {*} - */ - this.message = messageObject.body; - - /** - * The object containing all information about the message. - * @type {GearsMessageObject} - */ - this.messageObject = messageObject; -}; -goog.inherits(goog.gears.WorkerPool.Event, goog.events.Event); diff --git a/third_party/closure/goog/graphics/abstractgraphics.js b/third_party/closure/goog/graphics/abstractgraphics.js index 811c87d8b403c..35d6387b9e597 100644 --- a/third_party/closure/goog/graphics/abstractgraphics.js +++ b/third_party/closure/goog/graphics/abstractgraphics.js @@ -146,7 +146,7 @@ goog.graphics.AbstractGraphics.prototype.setCoordOrigin = goog.abstractMethod; /** - * @return {goog.math.Coordinate} The coordinate system position. + * @return {!goog.math.Coordinate} The coordinate system position. */ goog.graphics.AbstractGraphics.prototype.getCoordOrigin = function() { return new goog.math.Coordinate(this.coordLeft, this.coordTop); @@ -392,7 +392,7 @@ goog.graphics.AbstractGraphics.prototype.createGroup = goog.abstractMethod; /** * Create an empty path. * - * @return {goog.graphics.Path} The path. + * @return {!goog.graphics.Path} The path. * @deprecated Use {@code new goog.graphics.Path()}. */ goog.graphics.AbstractGraphics.prototype.createPath = function() { diff --git a/third_party/closure/goog/graphics/affinetransform.js b/third_party/closure/goog/graphics/affinetransform.js index 07175272c6690..62a15f4caa41e 100644 --- a/third_party/closure/goog/graphics/affinetransform.js +++ b/third_party/closure/goog/graphics/affinetransform.js @@ -52,9 +52,7 @@ goog.require('goog.math'); * @param {number=} opt_m02 The m02 coordinate of the transform. * @param {number=} opt_m12 The m12 coordinate of the transform. * @constructor - * @deprecated goog.graphics is deprecated. It existed to abstract over browser - * differences before the canvas tag was widely supported. See - * http://en.wikipedia.org/wiki/Canvas_element for details. + * @final */ goog.graphics.AffineTransform = function(opt_m00, opt_m10, opt_m01, opt_m11, opt_m02, opt_m12) { diff --git a/third_party/closure/goog/graphics/canvaselement.js b/third_party/closure/goog/graphics/canvaselement.js index c566860663ae0..8a13b862ec833 100644 --- a/third_party/closure/goog/graphics/canvaselement.js +++ b/third_party/closure/goog/graphics/canvaselement.js @@ -54,6 +54,7 @@ goog.require('goog.string'); * @deprecated goog.graphics is deprecated. It existed to abstract over browser * differences before the canvas tag was widely supported. See * http://en.wikipedia.org/wiki/Canvas_element for details. + * @final */ goog.graphics.CanvasGroupElement = function(graphics) { goog.graphics.GroupElement.call(this, null, graphics); @@ -129,6 +130,7 @@ goog.graphics.CanvasGroupElement.prototype.draw = function(ctx) { * @param {goog.graphics.Fill} fill The fill to use for this element. * @constructor * @extends {goog.graphics.EllipseElement} + * @final */ goog.graphics.CanvasEllipseElement = function(element, graphics, cx, cy, rx, ry, stroke, fill) { @@ -252,6 +254,7 @@ goog.graphics.CanvasEllipseElement.prototype.draw = function(ctx) { * @param {goog.graphics.Fill} fill The fill to use for this element. * @constructor * @extends {goog.graphics.RectElement} + * @final */ goog.graphics.CanvasRectElement = function(element, graphics, x, y, w, h, stroke, fill) { @@ -358,6 +361,7 @@ goog.graphics.CanvasRectElement.prototype.draw = function(ctx) { * @param {goog.graphics.Fill} fill The fill to use for this element. * @constructor * @extends {goog.graphics.PathElement} + * @final */ goog.graphics.CanvasPathElement = function(element, graphics, path, stroke, fill) { @@ -452,6 +456,7 @@ goog.graphics.CanvasPathElement.prototype.draw = function(ctx) { * @param {goog.graphics.Fill} fill The fill to use for this element. * @constructor * @extends {goog.graphics.TextElement} + * @final */ goog.graphics.CanvasTextElement = function(graphics, text, x1, y1, x2, y2, align, font, stroke, fill) { @@ -658,6 +663,7 @@ goog.graphics.CanvasTextElement.prototype.updateText_ = function() { * @param {string} src Source of the image. * @constructor * @extends {goog.graphics.ImageElement} + * @final */ goog.graphics.CanvasImageElement = function(element, graphics, x, y, w, h, src) { diff --git a/third_party/closure/goog/graphics/canvasgraphics.js b/third_party/closure/goog/graphics/canvasgraphics.js index 3cd6e18d96834..47557d15c2381 100644 --- a/third_party/closure/goog/graphics/canvasgraphics.js +++ b/third_party/closure/goog/graphics/canvasgraphics.js @@ -447,7 +447,7 @@ goog.graphics.CanvasGraphics.prototype.append = function(element, group) { * @param {goog.graphics.GroupElement=} opt_group The group wrapper * element to append to. If not specified, appends to the main canvas. * - * @return {goog.graphics.EllipseElement} The newly created element. + * @return {!goog.graphics.EllipseElement} The newly created element. * @override */ goog.graphics.CanvasGraphics.prototype.drawEllipse = function(cx, cy, rx, ry, @@ -472,7 +472,7 @@ goog.graphics.CanvasGraphics.prototype.drawEllipse = function(cx, cy, rx, ry, * @param {goog.graphics.GroupElement=} opt_group The group wrapper * element to append to. If not specified, appends to the main canvas. * - * @return {goog.graphics.RectElement} The newly created element. + * @return {!goog.graphics.RectElement} The newly created element. * @override */ goog.graphics.CanvasGraphics.prototype.drawRect = function(x, y, width, height, @@ -495,7 +495,7 @@ goog.graphics.CanvasGraphics.prototype.drawRect = function(x, y, width, height, * @param {goog.graphics.GroupElement=} opt_group The group wrapper * element to append to. If not specified, appends to the main canvas. * - * @return {goog.graphics.ImageElement} The newly created element. + * @return {!goog.graphics.ImageElement} The newly created element. */ goog.graphics.CanvasGraphics.prototype.drawImage = function(x, y, width, height, src, opt_group) { @@ -521,7 +521,7 @@ goog.graphics.CanvasGraphics.prototype.drawImage = function(x, y, width, height, * @param {goog.graphics.GroupElement=} opt_group The group wrapper * element to append to. If not specified, appends to the main canvas. * - * @return {goog.graphics.TextElement} The newly created element. + * @return {!goog.graphics.TextElement} The newly created element. * @override */ goog.graphics.CanvasGraphics.prototype.drawTextOnLine = function( @@ -542,7 +542,7 @@ goog.graphics.CanvasGraphics.prototype.drawTextOnLine = function( * @param {goog.graphics.GroupElement=} opt_group The group wrapper * element to append to. If not specified, appends to the main canvas. * - * @return {goog.graphics.PathElement} The newly created element. + * @return {!goog.graphics.PathElement} The newly created element. * @override */ goog.graphics.CanvasGraphics.prototype.drawPath = function(path, stroke, fill, @@ -582,7 +582,7 @@ goog.graphics.CanvasGraphics.prototype.isRedrawRequired = function(group) { * @param {goog.graphics.GroupElement=} opt_group The group wrapper * element to append to. If not specified, appends to the main canvas. * - * @return {goog.graphics.CanvasGroupElement} The newly created group. + * @return {!goog.graphics.CanvasGroupElement} The newly created group. * @override */ goog.graphics.CanvasGraphics.prototype.createGroup = function(opt_group) { diff --git a/third_party/closure/goog/graphics/element.js b/third_party/closure/goog/graphics/element.js index 6f93ce726040b..45e29308d979d 100644 --- a/third_party/closure/goog/graphics/element.js +++ b/third_party/closure/goog/graphics/element.js @@ -119,7 +119,7 @@ goog.graphics.Element.prototype.setTransformation = function(x, y, rotate, /** - * @return {goog.graphics.AffineTransform} The transformation applied to + * @return {!goog.graphics.AffineTransform} The transformation applied to * this element. */ goog.graphics.Element.prototype.getTransform = function() { diff --git a/third_party/closure/goog/graphics/ext/element.js b/third_party/closure/goog/graphics/ext/element.js index 21ded29cd2d1d..546c8c34a392c 100644 --- a/third_party/closure/goog/graphics/ext/element.js +++ b/third_party/closure/goog/graphics/ext/element.js @@ -21,10 +21,8 @@ goog.provide('goog.graphics.ext.Element'); -goog.require('goog.events'); goog.require('goog.events.EventTarget'); goog.require('goog.functions'); -goog.require('goog.graphics'); goog.require('goog.graphics.ext.coordinates'); @@ -119,10 +117,7 @@ goog.graphics.ext.Element.prototype.xPosition_; goog.graphics.ext.Element.prototype.yPosition_; -/** - * @return {goog.graphics.Element} The underlying thin wrapper. - * @protected - */ +/** @return {goog.graphics.Element} The underlying thin wrapper. */ goog.graphics.ext.Element.prototype.getWrapper = function() { return this.wrapper_; }; @@ -725,7 +720,7 @@ goog.graphics.ext.Element.Position_ = function(element, horizontal) { /** - * @return {Object} The coordinate value computation cache. + * @return {!Object} The coordinate value computation cache. * @private */ goog.graphics.ext.Element.Position_.prototype.getCoordinateCache_ = function() { diff --git a/third_party/closure/goog/graphics/ext/ellipse.js b/third_party/closure/goog/graphics/ext/ellipse.js index 6bc7938f772a8..db77524a025ec 100644 --- a/third_party/closure/goog/graphics/ext/ellipse.js +++ b/third_party/closure/goog/graphics/ext/ellipse.js @@ -30,6 +30,7 @@ goog.require('goog.graphics.ext.StrokeAndFillElement'); * @param {goog.graphics.ext.Group} group Parent for this element. * @constructor * @extends {goog.graphics.ext.StrokeAndFillElement} + * @final */ goog.graphics.ext.Ellipse = function(group) { // Initialize with some stock values. diff --git a/third_party/closure/goog/graphics/ext/graphics.js b/third_party/closure/goog/graphics/ext/graphics.js index d999414934817..50f38fea535f2 100644 --- a/third_party/closure/goog/graphics/ext/graphics.js +++ b/third_party/closure/goog/graphics/ext/graphics.js @@ -44,6 +44,7 @@ goog.require('goog.graphics.ext.Group'); * degradation of text support. * @constructor * @extends {goog.graphics.ext.Group} + * @final */ goog.graphics.ext.Graphics = function(width, height, opt_coordWidth, opt_coordHeight, opt_domHelper, opt_isSimple) { @@ -110,7 +111,7 @@ goog.graphics.ext.Graphics.prototype.setCoordOrigin = function(left, top) { /** - * @return {goog.math.Coordinate} The coordinate system position. + * @return {!goog.math.Coordinate} The coordinate system position. */ goog.graphics.ext.Graphics.prototype.getCoordOrigin = function() { return this.implementation_.getCoordOrigin(); diff --git a/third_party/closure/goog/graphics/ext/group.js b/third_party/closure/goog/graphics/ext/group.js index cc65a34e284be..8e8e8cbe8b4bd 100644 --- a/third_party/closure/goog/graphics/ext/group.js +++ b/third_party/closure/goog/graphics/ext/group.js @@ -21,6 +21,7 @@ goog.provide('goog.graphics.ext.Group'); +goog.require('goog.array'); goog.require('goog.graphics.ext.Element'); @@ -109,7 +110,7 @@ goog.graphics.ext.Group.prototype.forEachChild = function(f, opt_obj) { /** * @return {goog.graphics.GroupElement} The underlying thin wrapper. - * @protected + * @override */ goog.graphics.ext.Group.prototype.getWrapper; diff --git a/third_party/closure/goog/graphics/ext/image.js b/third_party/closure/goog/graphics/ext/image.js index 451a9da41d44f..ec24e1d85ee65 100644 --- a/third_party/closure/goog/graphics/ext/image.js +++ b/third_party/closure/goog/graphics/ext/image.js @@ -31,6 +31,7 @@ goog.require('goog.graphics.ext.Element'); * @param {string} src The path to the image to display. * @constructor * @extends {goog.graphics.ext.Element} + * @final */ goog.graphics.ext.Image = function(group, src) { // Initialize with some stock values. diff --git a/third_party/closure/goog/graphics/ext/path.js b/third_party/closure/goog/graphics/ext/path.js index c2edffd32d1f2..e8c2e35b936dc 100644 --- a/third_party/closure/goog/graphics/ext/path.js +++ b/third_party/closure/goog/graphics/ext/path.js @@ -32,6 +32,7 @@ goog.require('goog.math.Rect'); * Creates a path object * @constructor * @extends {goog.graphics.Path} + * @final */ goog.graphics.ext.Path = function() { goog.graphics.Path.call(this); @@ -88,7 +89,7 @@ goog.graphics.ext.Path.prototype.transform = function(tx) { * by this number. * @param {number} yFactor After translation, all y coordinates are multiplied * by this number. - * @return {goog.graphics.ext.Path} The path itself. + * @return {!goog.graphics.ext.Path} The path itself. */ goog.graphics.ext.Path.prototype.modifyBounds = function(deltaX, deltaY, xFactor, yFactor) { diff --git a/third_party/closure/goog/graphics/ext/rectangle.js b/third_party/closure/goog/graphics/ext/rectangle.js index 428f5e4cd3fb1..d05c8b1bda0c7 100644 --- a/third_party/closure/goog/graphics/ext/rectangle.js +++ b/third_party/closure/goog/graphics/ext/rectangle.js @@ -30,6 +30,7 @@ goog.require('goog.graphics.ext.StrokeAndFillElement'); * @param {goog.graphics.ext.Group} group Parent for this element. * @constructor * @extends {goog.graphics.ext.StrokeAndFillElement} + * @final */ goog.graphics.ext.Rectangle = function(group) { // Initialize with some stock values. diff --git a/third_party/closure/goog/graphics/ext/shape.js b/third_party/closure/goog/graphics/ext/shape.js index 3531bc0054bcc..4d47893b66537 100644 --- a/third_party/closure/goog/graphics/ext/shape.js +++ b/third_party/closure/goog/graphics/ext/shape.js @@ -35,6 +35,7 @@ goog.require('goog.math.Rect'); * automatically resize to fit the element. Defaults to false. * @constructor * @extends {goog.graphics.ext.StrokeAndFillElement} + * @final */ goog.graphics.ext.Shape = function(group, path, opt_autoSize) { this.autoSize_ = !!opt_autoSize; diff --git a/third_party/closure/goog/graphics/font.js b/third_party/closure/goog/graphics/font.js index 045ee6b1a6fe2..f58bf41ad0e26 100644 --- a/third_party/closure/goog/graphics/font.js +++ b/third_party/closure/goog/graphics/font.js @@ -32,6 +32,7 @@ goog.provide('goog.graphics.Font'); * @deprecated goog.graphics is deprecated. It existed to abstract over browser * differences before the canvas tag was widely supported. See * http://en.wikipedia.org/wiki/Canvas_element for details. + * @final */ goog.graphics.Font = function(size, family) { /** diff --git a/third_party/closure/goog/graphics/graphics.js b/third_party/closure/goog/graphics/graphics.js index d94f166cf8aaa..0bde5b5b3d51f 100644 --- a/third_party/closure/goog/graphics/graphics.js +++ b/third_party/closure/goog/graphics/graphics.js @@ -27,6 +27,7 @@ goog.provide('goog.graphics'); +goog.require('goog.dom'); goog.require('goog.graphics.CanvasGraphics'); goog.require('goog.graphics.SvgGraphics'); goog.require('goog.graphics.VmlGraphics'); @@ -46,7 +47,7 @@ goog.require('goog.userAgent'); * omitted or null, defaults to same as height. * @param {goog.dom.DomHelper=} opt_domHelper The DOM helper object for the * document we want to render in. - * @return {goog.graphics.AbstractGraphics} The created instance. + * @return {!goog.graphics.AbstractGraphics} The created instance. * @deprecated goog.graphics is deprecated. It existed to abstract over browser * differences before the canvas tag was widely supported. See * http://en.wikipedia.org/wiki/Canvas_element for details. @@ -54,7 +55,13 @@ goog.require('goog.userAgent'); goog.graphics.createGraphics = function(width, height, opt_coordWidth, opt_coordHeight, opt_domHelper) { var graphics; - if (goog.userAgent.IE && !goog.userAgent.isVersionOrHigher('9')) { + // On IE9 and above, SVG is available, except in compatibility mode. + // We check createElementNS on document object that is not exist in + // compatibility mode. + if (goog.userAgent.IE && + (!goog.userAgent.isVersionOrHigher('9') || + !(opt_domHelper || goog.dom.getDomHelper()). + getDocument().createElementNS)) { graphics = new goog.graphics.VmlGraphics(width, height, opt_coordWidth, opt_coordHeight, opt_domHelper); } else if (goog.userAgent.WEBKIT && @@ -88,7 +95,7 @@ goog.graphics.createGraphics = function(width, height, opt_coordWidth, * same as height. * @param {goog.dom.DomHelper=} opt_domHelper The DOM helper object for the * document we want to render in. - * @return {goog.graphics.AbstractGraphics} The created instance. + * @return {!goog.graphics.AbstractGraphics} The created instance. * @deprecated goog.graphics is deprecated. It existed to abstract over browser * differences before the canvas tag was widely supported. See * http://en.wikipedia.org/wiki/Canvas_element for details. diff --git a/third_party/closure/goog/graphics/lineargradient.js b/third_party/closure/goog/graphics/lineargradient.js index c63cac017ef17..df59cbfe89eef 100644 --- a/third_party/closure/goog/graphics/lineargradient.js +++ b/third_party/closure/goog/graphics/lineargradient.js @@ -44,6 +44,7 @@ goog.require('goog.graphics.Fill'); * @deprecated goog.graphics is deprecated. It existed to abstract over browser * differences before the canvas tag was widely supported. See * http://en.wikipedia.org/wiki/Canvas_element for details. + * @final */ goog.graphics.LinearGradient = function(x1, y1, x2, y2, color1, color2, opt_opacity1, opt_opacity2) { diff --git a/third_party/closure/goog/graphics/path.js b/third_party/closure/goog/graphics/path.js index 9b134eee9e25f..08bf03e6fe75f 100644 --- a/third_party/closure/goog/graphics/path.js +++ b/third_party/closure/goog/graphics/path.js @@ -36,9 +36,6 @@ goog.require('goog.math'); * the {@code transform} method. * * @constructor - * @deprecated goog.graphics is deprecated. It existed to abstract over browser - * differences before the canvas tag was widely supported. See - * http://en.wikipedia.org/wiki/Canvas_element for details. */ goog.graphics.Path = function() { /** @@ -106,7 +103,6 @@ goog.graphics.Path.Segment = { * The number of points for each segment type. * @type {!Array.} * @private - * @suppress {deprecated} goog.graphics.Path is deprecated. */ goog.graphics.Path.segmentArgCounts_ = (function() { var counts = []; diff --git a/third_party/closure/goog/graphics/paths.js b/third_party/closure/goog/graphics/paths.js index 2a630ed9ddb48..37b53d92caf5f 100644 --- a/third_party/closure/goog/graphics/paths.js +++ b/third_party/closure/goog/graphics/paths.js @@ -33,9 +33,6 @@ goog.require('goog.math.Coordinate'); * a radius as well. * @param {number} n The number of vertices. * @return {!goog.graphics.Path} The path. - * @deprecated goog.graphics is deprecated. It existed to abstract over browser - * differences before the canvas tag was widely supported. See - * http://en.wikipedia.org/wiki/Canvas_element for details. */ goog.graphics.paths.createRegularNGon = function(center, vertex, n) { var path = new goog.graphics.Path(); @@ -62,9 +59,6 @@ goog.graphics.paths.createRegularNGon = function(center, vertex, n) { * @param {?number} bHead The size of the arrow head at point B. * 0 omits the head. * @return {!goog.graphics.Path} The path. - * @deprecated goog.graphics is deprecated. It existed to abstract over browser - * differences before the canvas tag was widely supported. See - * http://en.wikipedia.org/wiki/Canvas_element for details. */ goog.graphics.paths.createArrow = function(a, b, aHead, bHead) { var path = new goog.graphics.Path(); diff --git a/third_party/closure/goog/graphics/svgelement.js b/third_party/closure/goog/graphics/svgelement.js index cf76bfa3aa97b..6f1c5ce0fa3d0 100644 --- a/third_party/closure/goog/graphics/svgelement.js +++ b/third_party/closure/goog/graphics/svgelement.js @@ -50,6 +50,7 @@ goog.require('goog.graphics.TextElement'); * @deprecated goog.graphics is deprecated. It existed to abstract over browser * differences before the canvas tag was widely supported. See * http://en.wikipedia.org/wiki/Canvas_element for details. + * @final */ goog.graphics.SvgGroupElement = function(element, graphics) { goog.graphics.GroupElement.call(this, element, graphics); @@ -91,6 +92,7 @@ goog.graphics.SvgGroupElement.prototype.setSize = function(width, height) { * @param {goog.graphics.Fill?} fill The fill to use for this element. * @constructor * @extends {goog.graphics.EllipseElement} + * @final */ goog.graphics.SvgEllipseElement = function(element, graphics, stroke, fill) { goog.graphics.EllipseElement.call(this, element, graphics, stroke, fill); @@ -135,6 +137,7 @@ goog.graphics.SvgEllipseElement.prototype.setRadius = function(rx, ry) { * @param {goog.graphics.Fill?} fill The fill to use for this element. * @constructor * @extends {goog.graphics.RectElement} + * @final */ goog.graphics.SvgRectElement = function(element, graphics, stroke, fill) { goog.graphics.RectElement.call(this, element, graphics, stroke, fill); @@ -178,6 +181,7 @@ goog.graphics.SvgRectElement.prototype.setSize = function(width, height) { * @param {goog.graphics.Fill?} fill The fill to use for this element. * @constructor * @extends {goog.graphics.PathElement} + * @final */ goog.graphics.SvgPathElement = function(element, graphics, stroke, fill) { goog.graphics.PathElement.call(this, element, graphics, stroke, fill); @@ -210,6 +214,7 @@ goog.graphics.SvgPathElement.prototype.setPath = function(path) { * @param {goog.graphics.Fill?} fill The fill to use for this element. * @constructor * @extends {goog.graphics.TextElement} + * @final */ goog.graphics.SvgTextElement = function(element, graphics, stroke, fill) { goog.graphics.TextElement.call(this, element, graphics, stroke, fill); @@ -238,6 +243,7 @@ goog.graphics.SvgTextElement.prototype.setText = function(text) { * this element. * @constructor * @extends {goog.graphics.ImageElement} + * @final */ goog.graphics.SvgImageElement = function(element, graphics) { goog.graphics.ImageElement.call(this, element, graphics); diff --git a/third_party/closure/goog/graphics/svggraphics.js b/third_party/closure/goog/graphics/svggraphics.js index 1f717828a0aee..f1c49c7de81d9 100644 --- a/third_party/closure/goog/graphics/svggraphics.js +++ b/third_party/closure/goog/graphics/svggraphics.js @@ -60,6 +60,7 @@ goog.require('goog.userAgent'); * @deprecated goog.graphics is deprecated. It existed to abstract over browser * differences before the canvas tag was widely supported. See * http://en.wikipedia.org/wiki/Canvas_element for details. + * @final */ goog.graphics.SvgGraphics = function(width, height, opt_coordWidth, opt_coordHeight, @@ -90,7 +91,7 @@ goog.graphics.SvgGraphics = function(width, height, /** * Event handler. - * @type {goog.events.EventHandler} + * @type {goog.events.EventHandler.} * @private */ this.handler_ = new goog.events.EventHandler(this); @@ -136,7 +137,7 @@ goog.graphics.SvgGraphics.prototype.defsElement_; * Creates an SVG element. Used internally and by different SVG classes. * @param {string} tagName The type of element to create. * @param {Object=} opt_attributes Map of name-value pairs for attributes. - * @return {Element} The created element. + * @return {!Element} The created element. * @private */ goog.graphics.SvgGraphics.prototype.createSvgElement_ = function(tagName, @@ -423,7 +424,7 @@ goog.graphics.SvgGraphics.prototype.getPixelSize = function() { if (!goog.userAgent.GECKO) { return this.isInDocument() ? goog.style.getSize(this.getElement()) : - goog.base(this, 'getPixelSize'); + goog.graphics.SvgGraphics.base(this, 'getPixelSize'); } // In Gecko, goog.style.getSize does not work for SVG elements. We have to @@ -482,7 +483,7 @@ goog.graphics.SvgGraphics.prototype.clear = function() { * @param {goog.graphics.GroupElement=} opt_group The group wrapper element * to append to. If not specified, appends to the main canvas. * - * @return {goog.graphics.EllipseElement} The newly created element. + * @return {!goog.graphics.EllipseElement} The newly created element. * @override */ goog.graphics.SvgGraphics.prototype.drawEllipse = function( @@ -509,7 +510,7 @@ goog.graphics.SvgGraphics.prototype.drawEllipse = function( * @param {goog.graphics.GroupElement=} opt_group The group wrapper element * to append to. If not specified, appends to the main canvas. * - * @return {goog.graphics.RectElement} The newly created element. + * @return {!goog.graphics.RectElement} The newly created element. * @override */ goog.graphics.SvgGraphics.prototype.drawRect = function(x, y, width, height, @@ -533,7 +534,7 @@ goog.graphics.SvgGraphics.prototype.drawRect = function(x, y, width, height, * @param {goog.graphics.GroupElement=} opt_group The group wrapper element * to append to. If not specified, appends to the main canvas. * - * @return {goog.graphics.ImageElement} The newly created image wrapped in a + * @return {!goog.graphics.ImageElement} The newly created image wrapped in a * rectangle element. */ goog.graphics.SvgGraphics.prototype.drawImage = function(x, y, width, height, @@ -569,7 +570,7 @@ goog.graphics.SvgGraphics.prototype.drawImage = function(x, y, width, height, * @param {goog.graphics.GroupElement=} opt_group The group wrapper element * to append to. If not specified, appends to the main canvas. * - * @return {goog.graphics.TextElement} The newly created element. + * @return {!goog.graphics.TextElement} The newly created element. * @override */ goog.graphics.SvgGraphics.prototype.drawTextOnLine = function( @@ -635,7 +636,7 @@ goog.graphics.SvgGraphics.prototype.drawTextOnLine = function( * @param {goog.graphics.GroupElement=} opt_group The group wrapper element * to append to. If not specified, appends to the main canvas. * - * @return {goog.graphics.PathElement} The newly created element. + * @return {!goog.graphics.PathElement} The newly created element. * @override */ goog.graphics.SvgGraphics.prototype.drawPath = function( @@ -695,7 +696,7 @@ goog.graphics.SvgGraphics.getSvgPath = function(path) { * @param {goog.graphics.GroupElement=} opt_group The group wrapper element * to append to. If not specified, appends to the main canvas. * - * @return {goog.graphics.GroupElement} The newly created group. + * @return {!goog.graphics.GroupElement} The newly created group. * @override */ goog.graphics.SvgGraphics.prototype.createGroup = function(opt_group) { diff --git a/third_party/closure/goog/graphics/vmlelement.js b/third_party/closure/goog/graphics/vmlelement.js index 1a8ed71fe330f..02acbb3fae908 100644 --- a/third_party/closure/goog/graphics/vmlelement.js +++ b/third_party/closure/goog/graphics/vmlelement.js @@ -67,6 +67,7 @@ goog.graphics.vmlGetElement_ = function() { * @deprecated goog.graphics is deprecated. It existed to abstract over browser * differences before the canvas tag was widely supported. See * http://en.wikipedia.org/wiki/Canvas_element for details. + * @final */ goog.graphics.VmlGroupElement = function(element, graphics) { this.id_ = element.id; @@ -146,6 +147,7 @@ goog.graphics.VmlGroupElement.prototype.setSize = function(width, height) { * @deprecated goog.graphics is deprecated. It existed to abstract over browser * differences before the canvas tag was widely supported. See * http://en.wikipedia.org/wiki/Canvas_element for details. + * @final */ goog.graphics.VmlEllipseElement = function(element, graphics, cx, cy, rx, ry, stroke, fill) { @@ -236,6 +238,7 @@ goog.graphics.VmlEllipseElement.prototype.setRadius = function(rx, ry) { * @deprecated goog.graphics is deprecated. It existed to abstract over browser * differences before the canvas tag was widely supported. See * http://en.wikipedia.org/wiki/Canvas_element for details. + * @final */ goog.graphics.VmlRectElement = function(element, graphics, stroke, fill) { this.id_ = element.id; @@ -296,6 +299,7 @@ goog.graphics.VmlRectElement.prototype.setSize = function(width, height) { * @deprecated goog.graphics is deprecated. It existed to abstract over browser * differences before the canvas tag was widely supported. See * http://en.wikipedia.org/wiki/Canvas_element for details. + * @final */ goog.graphics.VmlPathElement = function(element, graphics, stroke, fill) { this.id_ = element.id; @@ -339,6 +343,7 @@ goog.graphics.VmlPathElement.prototype.setPath = function(path) { * @deprecated goog.graphics is deprecated. It existed to abstract over browser * differences before the canvas tag was widely supported. See * http://en.wikipedia.org/wiki/Canvas_element for details. + * @final */ goog.graphics.VmlTextElement = function(element, graphics, stroke, fill) { this.id_ = element.id; @@ -378,6 +383,7 @@ goog.graphics.VmlTextElement.prototype.setText = function(text) { * @deprecated goog.graphics is deprecated. It existed to abstract over browser * differences before the canvas tag was widely supported. See * http://en.wikipedia.org/wiki/Canvas_element for details. + * @final */ goog.graphics.VmlImageElement = function(element, graphics) { this.id_ = element.id; diff --git a/third_party/closure/goog/graphics/vmlgraphics.js b/third_party/closure/goog/graphics/vmlgraphics.js index 58f407f9af9bb..ac445dd7c9d59 100644 --- a/third_party/closure/goog/graphics/vmlgraphics.js +++ b/third_party/closure/goog/graphics/vmlgraphics.js @@ -61,6 +61,7 @@ goog.require('goog.style'); * @deprecated goog.graphics is deprecated. It existed to abstract over browser * differences before the canvas tag was widely supported. See * http://en.wikipedia.org/wiki/Canvas_element for details. + * @final */ goog.graphics.VmlGraphics = function(width, height, opt_coordWidth, opt_coordHeight, @@ -216,7 +217,7 @@ goog.graphics.VmlGraphics.prototype.handler_; /** * Creates a VML element. Used internally and by different VML classes. * @param {string} tagName The type of element to create. - * @return {Element} The created element. + * @return {!Element} The created element. */ goog.graphics.VmlGraphics.prototype.createVmlElement = function(tagName) { var element = @@ -429,7 +430,7 @@ goog.graphics.VmlGraphics.setPositionAndSize = function( * Creates an element spanning the surface. * * @param {string} type The type of element to create. - * @return {Element} The created, positioned, and sized element. + * @return {!Element} The created, positioned, and sized element. * @private */ goog.graphics.VmlGraphics.prototype.createFullSizeElement_ = function(type) { @@ -611,7 +612,8 @@ goog.graphics.VmlGraphics.prototype.setSize = function(pixelWidth, /** - * @return {goog.math.Size} Returns the number of pixels spanned by the surface. + * @return {!goog.math.Size} Returns the number of pixels spanned by the + * surface. * @override */ goog.graphics.VmlGraphics.prototype.getPixelSize = function() { @@ -644,7 +646,7 @@ goog.graphics.VmlGraphics.prototype.clear = function() { * @param {goog.graphics.GroupElement=} opt_group The group wrapper element * to append to. If not specified, appends to the main canvas. * - * @return {goog.graphics.EllipseElement} The newly created element. + * @return {!goog.graphics.EllipseElement} The newly created element. * @override */ goog.graphics.VmlGraphics.prototype.drawEllipse = function(cx, cy, rx, ry, @@ -672,7 +674,7 @@ goog.graphics.VmlGraphics.prototype.drawEllipse = function(cx, cy, rx, ry, * @param {goog.graphics.GroupElement=} opt_group The group wrapper element * to append to. If not specified, appends to the main canvas. * - * @return {goog.graphics.RectElement} The newly created element. + * @return {!goog.graphics.RectElement} The newly created element. * @override */ goog.graphics.VmlGraphics.prototype.drawRect = function(x, y, width, height, @@ -696,7 +698,7 @@ goog.graphics.VmlGraphics.prototype.drawRect = function(x, y, width, height, * @param {goog.graphics.GroupElement=} opt_group The group wrapper element * to append to. If not specified, appends to the main canvas. * - * @return {goog.graphics.ImageElement} The newly created element. + * @return {!goog.graphics.ImageElement} The newly created element. */ goog.graphics.VmlGraphics.prototype.drawImage = function(x, y, width, height, src, opt_group) { @@ -724,7 +726,7 @@ goog.graphics.VmlGraphics.prototype.drawImage = function(x, y, width, height, * @param {goog.graphics.GroupElement=} opt_group The group wrapper element * to append to. If not specified, appends to the main canvas. * - * @return {goog.graphics.TextElement} The newly created element. + * @return {!goog.graphics.TextElement} The newly created element. * @override */ goog.graphics.VmlGraphics.prototype.drawTextOnLine = function( @@ -772,7 +774,7 @@ goog.graphics.VmlGraphics.prototype.drawTextOnLine = function( * @param {goog.graphics.GroupElement=} opt_group The group wrapper element * to append to. If not specified, appends to the main canvas. * - * @return {goog.graphics.PathElement} The newly created element. + * @return {!goog.graphics.PathElement} The newly created element. * @override */ goog.graphics.VmlGraphics.prototype.drawPath = function(path, stroke, fill, @@ -843,7 +845,7 @@ goog.graphics.VmlGraphics.getVmlPath = function(path) { * @param {goog.graphics.GroupElement=} opt_group The group wrapper element * to append to. If not specified, appends to the main canvas. * - * @return {goog.graphics.GroupElement} The newly created group. + * @return {!goog.graphics.GroupElement} The newly created group. * @override */ goog.graphics.VmlGraphics.prototype.createGroup = function(opt_group) { diff --git a/third_party/closure/goog/history/event.js b/third_party/closure/goog/history/event.js index d7ee019567ee2..19250df4c3fdf 100644 --- a/third_party/closure/goog/history/event.js +++ b/third_party/closure/goog/history/event.js @@ -35,6 +35,7 @@ goog.require('goog.history.EventType'); * {@code replaceToken} call. * @constructor * @extends {goog.events.Event} + * @final */ goog.history.Event = function(token, isNavigation) { goog.events.Event.call(this, goog.history.EventType.NAVIGATE); diff --git a/third_party/closure/goog/history/history.js b/third_party/closure/goog/history/history.js index 772ad963a78a0..b195fcc2fd9e4 100644 --- a/third_party/closure/goog/history/history.js +++ b/third_party/closure/goog/history/history.js @@ -256,15 +256,6 @@ goog.History = function(opt_invisible, opt_blankPageUrl, opt_input, this.window_ = opt_input ? goog.dom.getWindow(goog.dom.getOwnerDocument(opt_input)) : window; - /** - * The initial page location with an empty hash component. If the page uses - * a BASE element, setting location.hash directly will navigate away from the - * current document. To prevent this, the full path is always specified. - * @type {string} - * @private - */ - this.baseUrl_ = this.window_.location.href.split('#')[0]; - /** * The base URL for the hidden iframe. Must refer to a document in the * same domain as the main page. @@ -296,7 +287,7 @@ goog.History = function(opt_invisible, opt_blankPageUrl, opt_input, /** * An object to keep track of the history event listeners. - * @type {goog.events.EventHandler} + * @type {goog.events.EventHandler.} * @private */ this.eventHandler_ = new goog.events.EventHandler(this); @@ -702,8 +693,12 @@ goog.History.prototype.setHistoryState_ = function(token, replace, opt_title) { * @private */ goog.History.prototype.setHash_ = function(token, opt_replace) { + // If the page uses a BASE element, setting location.hash directly will + // navigate away from the current document. Also, the original URL path may + // possibly change from HTML5 history pushState. To account for these, the + // full path is always specified. var loc = this.window_.location; - var url = this.baseUrl_; + var url = loc.href.split('#')[0]; // If a hash has already been set, then removing it programmatically will // reload the page. Once there is a hash, we won't remove it. @@ -999,5 +994,6 @@ goog.History.EventType = goog.history.EventType; * @extends {goog.events.Event} * @constructor * @deprecated Use goog.history.Event. + * @final */ goog.History.Event = goog.history.Event; diff --git a/third_party/closure/goog/history/html5history.js b/third_party/closure/goog/history/html5history.js deleted file mode 100644 index 36cbbe5edb2d5..0000000000000 --- a/third_party/closure/goog/history/html5history.js +++ /dev/null @@ -1,303 +0,0 @@ -// Copyright 2010 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 HTML5 based history implementation, compatible with - * goog.History. - * - * TODO(user): There should really be a history interface and multiple - * implementations. - * - */ - - -goog.provide('goog.history.Html5History'); -goog.provide('goog.history.Html5History.TokenTransformer'); - -goog.require('goog.asserts'); -goog.require('goog.events'); -goog.require('goog.events.EventTarget'); -goog.require('goog.events.EventType'); -goog.require('goog.history.Event'); -goog.require('goog.history.EventType'); - - - -/** - * An implementation compatible with goog.History that uses the HTML5 - * history APIs. - * - * @param {Window=} opt_win The window to listen/dispatch history events on. - * @param {goog.history.Html5History.TokenTransformer=} opt_transformer - * The token transformer that is used to create URL from the token - * when storing token without using hash fragment. - * @constructor - * @extends {goog.events.EventTarget} - */ -goog.history.Html5History = function(opt_win, opt_transformer) { - goog.events.EventTarget.call(this); - goog.asserts.assert(goog.history.Html5History.isSupported(opt_win), - 'HTML5 history is not supported.'); - - /** - * The window object to use for history tokens. Typically the top window. - * @type {Window} - * @private - */ - this.window_ = opt_win || window; - - /** - * The token transformer that is used to create URL from the token - * when storing token without using hash fragment. - * @type {goog.history.Html5History.TokenTransformer} - * @private - */ - this.transformer_ = opt_transformer || null; - - goog.events.listen(this.window_, goog.events.EventType.POPSTATE, - this.onHistoryEvent_, false, this); - goog.events.listen(this.window_, goog.events.EventType.HASHCHANGE, - this.onHistoryEvent_, false, this); -}; -goog.inherits(goog.history.Html5History, goog.events.EventTarget); - - -/** - * Returns whether Html5History is supported. - * @param {Window=} opt_win Optional window to check. - * @return {boolean} Whether html5 history is supported. - */ -goog.history.Html5History.isSupported = function(opt_win) { - var win = opt_win || window; - return !!(win.history && win.history.pushState); -}; - - -/** - * Status of when the object is active and dispatching events. - * @type {boolean} - * @private - */ -goog.history.Html5History.prototype.enabled_ = false; - - -/** - * Whether to use the fragment to store the token, defaults to true. - * @type {boolean} - * @private - */ -goog.history.Html5History.prototype.useFragment_ = true; - - -/** - * If useFragment is false the path will be used, the path prefix will be - * prepended to all tokens. Defaults to '/'. - * @type {string} - * @private - */ -goog.history.Html5History.prototype.pathPrefix_ = '/'; - - -/** - * Starts or stops the History. When enabled, the History object - * will immediately fire an event for the current location. The caller can set - * up event listeners between the call to the constructor and the call to - * setEnabled. - * - * @param {boolean} enable Whether to enable history. - */ -goog.history.Html5History.prototype.setEnabled = function(enable) { - if (enable == this.enabled_) { - return; - } - - this.enabled_ = enable; - - if (enable) { - this.dispatchEvent(new goog.history.Event(this.getToken(), false)); - } -}; - - -/** - * Returns the current token. - * @return {string} The current token. - */ -goog.history.Html5History.prototype.getToken = function() { - if (this.useFragment_) { - var loc = this.window_.location.href; - var index = loc.indexOf('#'); - return index < 0 ? '' : loc.substring(index + 1); - } else { - return this.transformer_ ? - this.transformer_.retrieveToken( - this.pathPrefix_, this.window_.location) : - this.window_.location.pathname.substr(this.pathPrefix_.length); - } -}; - - -/** - * Sets the history state. - * @param {string} token The history state identifier. - * @param {string=} opt_title Optional title to associate with history entry. - */ -goog.history.Html5History.prototype.setToken = function(token, opt_title) { - if (token == this.getToken()) { - return; - } - - // Per externs/gecko_dom.js document.title can be null. - this.window_.history.pushState(null, - opt_title || this.window_.document.title || '', this.getUrl_(token)); - this.dispatchEvent(new goog.history.Event(token, false)); -}; - - -/** - * Replaces the current history state without affecting the rest of the history - * stack. - * @param {string} token The history state identifier. - * @param {string=} opt_title Optional title to associate with history entry. - */ -goog.history.Html5History.prototype.replaceToken = function(token, opt_title) { - // Per externs/gecko_dom.js document.title can be null. - this.window_.history.replaceState(null, - opt_title || this.window_.document.title || '', this.getUrl_(token)); - this.dispatchEvent(new goog.history.Event(token, false)); -}; - - -/** @override */ -goog.history.Html5History.prototype.disposeInternal = function() { - goog.events.unlisten(this.window_, goog.events.EventType.POPSTATE, - this.onHistoryEvent_, false, this); - if (this.useFragment_) { - goog.events.unlisten(this.window_, goog.events.EventType.HASHCHANGE, - this.onHistoryEvent_, false, this); - } -}; - - -/** - * Sets whether to use the fragment to store tokens. - * @param {boolean} useFragment Whether to use the fragment. - */ -goog.history.Html5History.prototype.setUseFragment = function(useFragment) { - if (this.useFragment_ != useFragment) { - if (useFragment) { - goog.events.listen(this.window_, goog.events.EventType.HASHCHANGE, - this.onHistoryEvent_, false, this); - } else { - goog.events.unlisten(this.window_, goog.events.EventType.HASHCHANGE, - this.onHistoryEvent_, false, this); - } - this.useFragment_ = useFragment; - } -}; - - -/** - * Sets the path prefix to use if storing tokens in the path. The path - * prefix should start and end with slash. - * @param {string} pathPrefix Sets the path prefix. - */ -goog.history.Html5History.prototype.setPathPrefix = function(pathPrefix) { - this.pathPrefix_ = pathPrefix; -}; - - -/** - * Gets the path prefix. - * @return {string} The path prefix. - */ -goog.history.Html5History.prototype.getPathPrefix = function() { - return this.pathPrefix_; -}; - - -/** - * Gets the URL to set when calling history.pushState - * @param {string} token The history token. - * @return {string} The URL. - * @private - */ -goog.history.Html5History.prototype.getUrl_ = function(token) { - if (this.useFragment_) { - return '#' + token; - } else { - return this.transformer_ ? - this.transformer_.createUrl( - token, this.pathPrefix_, this.window_.location) : - this.pathPrefix_ + token + this.window_.location.search; - } -}; - - -/** - * Handles history events dispatched by the browser. - * @param {goog.events.BrowserEvent} e The browser event object. - * @private - */ -goog.history.Html5History.prototype.onHistoryEvent_ = function(e) { - if (this.enabled_) { - this.dispatchEvent(new goog.history.Event(this.getToken(), true)); - } -}; - - - -/** - * A token transformer that can create a URL from a history - * token. This is used by {@code goog.history.Html5History} to create - * URL when storing token without the hash fragment. - * - * Given a {@code window.location} object containing the location - * created by {@code createUrl}, the token transformer allows - * retrieval of the token back via {@code retrieveToken}. - * - * @interface - */ -goog.history.Html5History.TokenTransformer = function() {}; - - -/** - * Retrieves a history token given the path prefix and - * {@code window.location} object. - * - * @param {string} pathPrefix The path prefix to use when storing token - * in a path; always begin with a slash. - * @param {Location} location The {@code window.location} object. - * Treat this object as read-only. - * @return {string} token The history token. - */ -goog.history.Html5History.TokenTransformer.prototype.retrieveToken = function( - pathPrefix, location) {}; - - -/** - * Creates a URL to be pushed into HTML5 history stack when storing - * token without using hash fragment. - * - * @param {string} token The history token. - * @param {string} pathPrefix The path prefix to use when storing token - * in a path; always begin with a slash. - * @param {Location} location The {@code window.location} object. - * Treat this object as read-only. - * @return {string} url The complete URL string from path onwards - * (without {@code protocol://host:port} part); must begin with a - * slash. - */ -goog.history.Html5History.TokenTransformer.prototype.createUrl = function( - token, pathPrefix, location) {}; diff --git a/third_party/closure/goog/html/legacyconversions.js b/third_party/closure/goog/html/legacyconversions.js new file mode 100644 index 0000000000000..6f526953f7bf2 --- /dev/null +++ b/third_party/closure/goog/html/legacyconversions.js @@ -0,0 +1,235 @@ +// Copyright 2013 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 Conversions from plain string to goog.html types for use in + * legacy APIs that do not use goog.html types. + * + * This file provides conversions to create values of goog.html types from plain + * strings. These conversions are intended for use in legacy APIs that consume + * HTML in the form of plain string types, but whose implementations use + * goog.html types internally (and expose such types in an augmented, HTML-type- + * safe API). + * + * IMPORTANT: No new code should use the conversion functions in this file. + * + * The conversion functions in this file are guarded with global flag + * (goog.html.legacyconversions.ALLOW_LEGACY_CONVERSIONS). If set to false, it + * effectively "locks in" an entire application to only use HTML-type-safe APIs. + * + * Intended use of the functions in this file are as follows: + * + * Many Closure and application-specific classes expose methods that consume + * values that in the class' implementation are forwarded to DOM APIs that can + * result in security vulnerabilities. For example, goog.ui.Dialog's setContent + * method consumes a string that is assigned to an element's innerHTML property; + * if this string contains untrusted (attacker-controlled) data, this can result + * in a cross-site-scripting vulnerability. + * + * Widgets such as goog.ui.Dialog are being augmented to expose safe APIs + * expressed in terms of goog.html types. For instance, goog.ui.Dialog has a + * method setSafeHtmlContent that consumes an object of type goog.html.SafeHtml, + * a type whose contract guarantees that its value is safe to use in HTML + * context, i.e. can be safely assigned to .innerHTML. An application that only + * uses this API is forced to only supply values of this type, i.e. values that + * are safe. + * + * However, the legacy method setContent cannot (for the time being) be removed + * from goog.ui.Dialog, due to a large number of existing callers. The + * implementation of goog.ui.Dialog has been refactored to use + * goog.html.SafeHtml throughout. This in turn requires that the value consumed + * by its setContent method is converted to goog.html.SafeHtml in an unchecked + * conversion. The conversion function is provided by this file: + * goog.html.legacyconversions.safeHtmlFromString. + * + * Note that the semantics of the conversions in goog.html.legacyconversions are + * very different from the ones provided by goog.html.uncheckedconversions: The + * latter are for use in code where it has been established through manual + * security review that the value produced by a piece of code must always + * satisfy the SafeHtml contract (e.g., the output of a secure HTML sanitizer). + * In uses of goog.html.legacyconversions, this guarantee is not given -- the + * value in question originates in unreviewed legacy code and there is no + * guarantee that it satisfies the SafeHtml contract. + * + * To establish correctness with confidence, application code should be + * refactored to use SafeHtml instead of plain string to represent HTML markup, + * and to use goog.html-typed APIs (e.g., goog.ui.Dialog#setSafeHtmlContent + * instead of goog.ui.Dialog#setContent). + * + * To prevent introduction of new vulnerabilities, application owners can + * effectively disable unsafe legacy APIs by compiling with the define + * goog.html.legacyconversions.ALLOW_LEGACY_CONVERSIONS set to false. When + * set, this define causes the conversion methods in this file to + * unconditionally throw an exception. + * + * Note that new code should always be compiled with + * ALLOW_LEGACY_CONVERSIONS=false. At some future point, the default for this + * define may change to false. + */ + + +goog.provide('goog.html.legacyconversions'); + +goog.require('goog.html.SafeHtml'); +goog.require('goog.html.SafeUrl'); +goog.require('goog.html.TrustedResourceUrl'); + + +/** + * @define {boolean} Whether conversion from string to goog.html types for + * legacy API purposes is permitted. + * + * If false, the conversion functions in this file unconditionally throw an + * exception. + */ +goog.define('goog.html.legacyconversions.ALLOW_LEGACY_CONVERSIONS', true); + + +/** + * Performs an "unchecked conversion" from string to SafeHtml for legacy API + * purposes. + * + * Unchecked conversion will not proceed if ALLOW_LEGACY_CONVERSIONS is false, + * and instead this function unconditionally throws an exception. + * + * @param {string} html A string to be converted to SafeHtml. + * @return {!goog.html.SafeHtml} The value of html, wrapped in a SafeHtml + * object. + */ +goog.html.legacyconversions.safeHtmlFromString = function(html) { + goog.html.legacyconversions.throwIfConversionDisallowed_(); + return goog.html.legacyconversions. + createSafeHtmlSecurityPrivateDoNotAccessOrElse_(html); +}; + + +/** + * Performs an "unchecked conversion" from string to TrustedResourceUrl for + * legacy API purposes. + * + * Unchecked conversion will not proceed if ALLOW_LEGACY_CONVERSIONS is false, + * and instead this function unconditionally throws an exception. + * + * @param {string} url A string to be converted to TrustedResourceUrl. + * @return {!goog.html.TrustedResourceUrl} The value of url, wrapped in a + * TrustedResourceUrl object. + */ +goog.html.legacyconversions.trustedResourceUrlFromString = function(url) { + goog.html.legacyconversions.throwIfConversionDisallowed_(); + return goog.html.legacyconversions. + createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse_(url); +}; + + +/** + * Performs an "unchecked conversion" from string to SafeUrl for legacy API + * purposes. + * + * Unchecked conversion will not proceed if ALLOW_LEGACY_CONVERSIONS is false, + * and instead this function unconditionally throws an exception. + * + * @param {string} url A string to be converted to SafeUrl. + * @return {!goog.html.SafeUrl} The value of url, wrapped in a SafeUrl + * object. + */ +goog.html.legacyconversions.safeUrlFromString = function(url) { + goog.html.legacyconversions.throwIfConversionDisallowed_(); + return goog.html.legacyconversions. + createSafeUrlSecurityPrivateDoNotAccessOrElse_(url); +}; + + +/** + * @private {function(): undefined} + */ +goog.html.legacyconversions.reportCallback_ = goog.nullFunction; + + +/** + * Sets a function that will be called every time a legacy conversion is + * performed. The function is called with no parameters but it can use + * goog.debug.getStacktrace to get a stacktrace. + * + * @param {function(): undefined} callback Error callback as defined above. + */ +goog.html.legacyconversions.setReportCallback = function(callback) { + goog.html.legacyconversions.reportCallback_ = callback; +}; + + +/** + * Internal wrapper for the package-private + * goog.html.SafeHtml.createSafeHtml... function. + * @param {string} html A string to be converted to SafeHtml. + * @return {!goog.html.SafeHtml} + * @private + * @suppress {visibility} For access to SafeHtml.create... Note that this + * use is appropriate since this method is intended to be "package private" + * within goog.html. DO NOT call SafeHtml.create... from outside this + * package; use appropriate wrappers instead. + */ +goog.html.legacyconversions.createSafeHtmlSecurityPrivateDoNotAccessOrElse_ = + function(html) { + return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse_( + html, null); +}; + + +/** + * Internal wrapper for the package-private + * goog.html.TrustedResourceUrl.createTrustedResourceUrl... function. + * @param {string} url A string to be converted to TrustedResourceUrl. + * @return {!goog.html.TrustedResourceUrl} + * @private + * @suppress {visibility} For access to TrustedResourceUrl.create... Note that + * this use is appropriate since this method is intended to be + * "package private" within goog.html. DO NOT call + * TrustedResourceUrl.create... from outside this package; use appropriate + * wrappers instead. + */ +goog.html.legacyconversions. + createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse_ = function(url) { + return goog.html.TrustedResourceUrl + .createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse_(url); +}; + + +/** + * Internal wrapper for the package-private goog.html.SafeUrl.createSafeUrl... + * function. + * @param {string} url A string to be converted to TrustedResourceUrl. + * @return {!goog.html.SafeUrl} + * @private + * @suppress {visibility} For access to SafeUrl.create... Note that this use + * is appropriate since this method is intended to be "package private" + * within goog.html. DO NOT call SafeUrl.create... from outside this + * package; use appropriate wrappers instead. + */ +goog.html.legacyconversions.createSafeUrlSecurityPrivateDoNotAccessOrElse_ = + function(url) { + return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse_(url); +}; + + +/** + * Checks whether legacy conversion is allowed. Throws an exception if not. + * @private + */ +goog.html.legacyconversions.throwIfConversionDisallowed_ = function() { + if (!goog.html.legacyconversions.ALLOW_LEGACY_CONVERSIONS) { + throw Error( + 'Error: Legacy conversion from string to goog.html types is disabled'); + } + goog.html.legacyconversions.reportCallback_(); +}; diff --git a/third_party/closure/goog/html/safehtml.js b/third_party/closure/goog/html/safehtml.js new file mode 100644 index 0000000000000..57b90d2b70e21 --- /dev/null +++ b/third_party/closure/goog/html/safehtml.js @@ -0,0 +1,508 @@ +// Copyright 2013 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 The SafeHtml type and its builders. + * + * TODO(user): Link to document stating type contract. + */ + +goog.provide('goog.html.SafeHtml'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.dom.tags'); +goog.require('goog.html.SafeStyle'); +goog.require('goog.html.SafeUrl'); +goog.require('goog.i18n.bidi.Dir'); +goog.require('goog.i18n.bidi.DirectionalString'); +goog.require('goog.object'); +goog.require('goog.string'); +goog.require('goog.string.Const'); +goog.require('goog.string.TypedString'); + + + +/** + * A string that is safe to use in HTML context in DOM APIs and HTML documents. + * + * A SafeHtml is a string-like object that carries the security type contract + * that its value as a string will not cause untrusted script execution when + * evaluated as HTML in a browser. + * + * Values of this type are guaranteed to be safe to use in HTML contexts, + * such as, assignment to the innerHTML DOM property, or interpolation into + * a HTML template in HTML PC_DATA context, in the sense that the use will not + * result in a Cross-Site-Scripting vulnerability. + * + * Instances of this type must be created via the factory methods + * ({@code goog.html.SafeHtml.from}, {@code goog.html.SafeHtml.htmlEscape}), etc + * and not by invoking its constructor. The constructor intentionally takes no + * parameters and the type is immutable; hence only a default instance + * corresponding to the empty string can be obtained via constructor invocation. + * + * @see goog.html.SafeHtml#from + * @see goog.html.SafeHtml#htmlEscape + * @constructor + * @final + * @struct + * @implements {goog.i18n.bidi.DirectionalString} + * @implements {goog.string.TypedString} + */ +goog.html.SafeHtml = function() { + /** + * The contained value of this SafeHtml. The field has a purposely ugly + * name to make (non-compiled) code that attempts to directly access this + * field stand out. + * @private {string} + */ + this.privateDoNotAccessOrElseSafeHtmlWrappedValue_ = ''; + + /** + * A type marker used to implement additional run-time type checking. + * @see goog.html.SafeHtml#unwrap + * @const + * @private + */ + this.SAFE_HTML_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ = + goog.html.SafeHtml.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_; + + /** + * This SafeHtml's directionality, or null if unknown. + * @private {?goog.i18n.bidi.Dir} + */ + this.dir_ = null; +}; + + +/** + * @override + * @const + */ +goog.html.SafeHtml.prototype.implementsGoogI18nBidiDirectionalString = true; + + +/** @override */ +goog.html.SafeHtml.prototype.getDirection = function() { + return this.dir_; +}; + + +/** + * @override + * @const + */ +goog.html.SafeHtml.prototype.implementsGoogStringTypedString = true; + + +/** + * Returns this SafeHtml's value a string. + * + * IMPORTANT: In code where it is security relevant that an object's type is + * indeed {@code SafeHtml}, use {@code goog.html.SafeHtml.unwrap} instead of + * this method. If in doubt, assume that it's security relevant. In particular, + * note that goog.html functions which return a goog.html type do not guarantee + * that the returned instance is of the right type. For example: + * + *
+ * var fakeSafeHtml = new String('fake');
+ * fakeSafeHtml.__proto__ = goog.html.SafeHtml.prototype;
+ * var newSafeHtml = goog.html.SafeHtml.from(fakeSafeHtml);
+ * // newSafeHtml is just an alias for fakeSafeHtml, it's passed through by
+ * // goog.html.SafeHtml.from() as fakeSafeHtml instanceof goog.html.SafeHtml.
+ * 
+ * + * @see goog.html.SafeHtml#unwrap + * @override + */ +goog.html.SafeHtml.prototype.getTypedStringValue = function() { + return this.privateDoNotAccessOrElseSafeHtmlWrappedValue_; +}; + + +if (goog.DEBUG) { + /** + * Returns a debug string-representation of this value. + * + * To obtain the actual string value wrapped in a SafeHtml, use + * {@code goog.html.SafeHtml.unwrap}. + * + * @see goog.html.SafeHtml#unwrap + * @override + */ + goog.html.SafeHtml.prototype.toString = function() { + return 'SafeHtml{' + this.privateDoNotAccessOrElseSafeHtmlWrappedValue_ + + '}'; + }; +} + + +/** + * Performs a runtime check that the provided object is indeed a SafeHtml + * object, and returns its value. + * @param {!goog.html.SafeHtml} safeHtml The object to extract from. + * @return {string} The SafeHtml object's contained string, unless the run-time + * type check fails. In that case, {@code unwrap} returns an innocuous + * string, or, if assertions are enabled, throws + * {@code goog.asserts.AssertionError}. + */ +goog.html.SafeHtml.unwrap = function(safeHtml) { + // Perform additional run-time type-checking to ensure that safeHtml is indeed + // an instance of the expected type. This provides some additional protection + // against security bugs due to application code that disables type checks. + // Specifically, the following checks are performed: + // 1. The object is an instance of the expected type. + // 2. The object is not an instance of a subclass. + // 3. The object carries a type marker for the expected type. "Faking" an + // object requires a reference to the type marker, which has names intended + // to stand out in code reviews. + if (safeHtml instanceof goog.html.SafeHtml && + safeHtml.constructor === goog.html.SafeHtml && + safeHtml.SAFE_HTML_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ === + goog.html.SafeHtml.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_) { + return safeHtml.privateDoNotAccessOrElseSafeHtmlWrappedValue_; + } else { + goog.asserts.fail('expected object of type SafeHtml, got \'' + + safeHtml + '\''); + return 'type_error:SafeHtml'; + } +}; + + +/** + * Shorthand for union of types that can be sensibly converted to strings. + * @private + * @typedef {string|number|boolean|!goog.string.TypedString| + * !goog.i18n.bidi.DirectionalString} + */ +goog.html.SafeHtml.StringLike_; + + +/** + * Shorthand for union of types that can be sensibly converted to SafeHtml. + * @private + * @typedef {!goog.html.SafeHtml.StringLike_|!goog.html.SafeHtml} + */ +goog.html.SafeHtml.TextOrHtml_; + + +/** + * Returns HTML-escaped text as a SafeHtml object. + * + * If text is of a type that implements + * {@code goog.i18n.bidi.DirectionalString}, the directionality of the new + * {@code SafeHtml} object is set to {@code text}'s directionality, if known. + * Otherwise, the directionality of the resulting SafeHtml is unknown (i.e., + * {@code null}). + * + * @param {!goog.html.SafeHtml.StringLike_} text The string to escape. + * @return {!goog.html.SafeHtml} The escaped string, wrapped as a SafeHtml. + */ +goog.html.SafeHtml.htmlEscape = function(text) { + var dir = null; + if (text.implementsGoogI18nBidiDirectionalString) { + dir = text.getDirection(); + } + var textAsString; + if (text.implementsGoogStringTypedString) { + textAsString = text.getTypedStringValue(); + } else { + textAsString = String(text); + } + return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse_( + goog.string.htmlEscape(textAsString), dir); +}; + + +/** + * Returns HTML-escaped text as a SafeHtml object with newlines changed to
. + * @param {!goog.html.SafeHtml.StringLike_} text The string to escape. + * @return {!goog.html.SafeHtml} The escaped string, wrapped as a SafeHtml. + */ +goog.html.SafeHtml.htmlEscapePreservingNewlines = function(text) { + var html = goog.html.SafeHtml.htmlEscape(text); + return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse_( + goog.string.newLineToBr(goog.html.SafeHtml.unwrap(html)), + html.getDirection()); +}; + + +/** + * Coerces an arbitrary object into a SafeHtml object. + * + * If {@code textOrHtml} is already of type {@code goog.html.SafeHtml}, the same + * object is returned. Otherwise, {@code textOrHtml} is coerced to string, and + * HTML-escaped. If {@code textOrHtml} is of a type that implements + * {@code goog.i18n.bidi.DirectionalString}, its directionality, if known, is + * preserved. + * + * @param {!goog.html.SafeHtml.TextOrHtml_} textOrHtml The text or SafeHtml to + * coerce. + * @return {!goog.html.SafeHtml} The resulting SafeHtml object. + */ +goog.html.SafeHtml.from = function(textOrHtml) { + if (textOrHtml instanceof goog.html.SafeHtml) { + return textOrHtml; + } else if (textOrHtml.implementsGoogI18nBidiDirectionalString) { + // Do not coerce to string, to preserve directionality. + return goog.html.SafeHtml.htmlEscape(textOrHtml); + } else if (textOrHtml.implementsGoogStringTypedString) { + return goog.html.SafeHtml.htmlEscape(textOrHtml.getTypedStringValue()); + } else { + return goog.html.SafeHtml.htmlEscape(String(textOrHtml)); + } +}; + + +/** + * @const + * @private + */ +goog.html.SafeHtml.VALID_NAMES_IN_TAG_ = /^[a-zA-Z0-9-]+$/; + + +/** + * Set of attributes containing URL as defined at + * http://www.w3.org/TR/html5/index.html#attributes-1. + * @const + * @private + */ +goog.html.SafeHtml.URL_ATTRIBUTES_ = goog.object.createSet('action', 'cite', + 'data', 'formaction', 'href', 'manifest', 'poster', 'src'); + + +// TODO(user): Perhaps add