diff --git a/javascript/remote/ui/client.js b/javascript/remote/ui/client.js index 9695da9fafdfb..bc5daedd5abba 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.log.Logger} */ - this.log_ = goog.log.getLogger('remote.ui.Client'); + /** @private {!goog.debug.Logger} */ + this.log_ = goog.debug.Logger.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) { - goog.log.error(this.log_, msg + '\n' + e); + this.log_.severe(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() { - goog.log.info(this.log_, 'Retrieving server status...'); + this.log_.info('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() { - goog.log.info(this.log_, 'Refreshing sessions...'); + this.log_.info('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) { - goog.log.info(this.log_, 'Creating new session for ' + e.data['browserName']); + this.log_.info('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) { - goog.log.warning(this.log_, 'Cannot delete session; no session selected!'); + this.log_.warning('Cannot delete session; no session selected!'); return; } - goog.log.info(this.log_, 'Deleting session: ' + session.getId()); + this.log_.info('Deleting session: ' + session.getId()); var command = new webdriver.Command(webdriver.CommandName.QUIT). setParameter('sessionId', session.getId()); var self = this; @@ -292,8 +292,7 @@ remote.ui.Client.prototype.onDelete_ = function() { remote.ui.Client.prototype.onLoad_ = function(e) { var session = this.sessionContainer_.getSelectedSession(); if (!session) { - goog.log.warning(this.log_, - 'Cannot load url: ' + e.data + '; no session selected!'); + this.log_.warning('Cannot load url: ' + e.data + '; no session selected!'); return; } @@ -304,8 +303,7 @@ remote.ui.Client.prototype.onLoad_ = function(e) { var command = new webdriver.Command(webdriver.CommandName.GET). setParameter('sessionId', session.getId()). setParameter('url', url.toString()); - goog.log.info(this.log_, - 'In session(' + session.getId() + '), loading ' + url); + this.log_.info('In session(' + session.getId() + '), loading ' + url); this.execute_(command).thenCatch(goog.bind(function(e) { this.logError_('Unable to load URL', e); }, this)); @@ -319,12 +317,11 @@ remote.ui.Client.prototype.onLoad_ = function(e) { remote.ui.Client.prototype.onScreenshot_ = function() { var session = this.sessionContainer_.getSelectedSession(); if (!session) { - goog.log.warning(this.log_, - 'Cannot take screenshot; no session selected!'); + this.log_.warning('Cannot take screenshot; no session selected!'); return; } - goog.log.info(this.log_, 'Taking screenshot: ' + session.getId()); + this.log_.info('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 0edab1462c616..47b3890a992b9 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.log'); +goog.require('goog.debug.Logger'); goog.require('safaridriver.message.Connect'); @@ -25,20 +25,19 @@ safaridriver.client.init = function() { var divConsole = new goog.debug.DivConsole(div); divConsole.setCapturing(true); - var log = goog.log.getLogger('safaridriver.client'); + var log = goog.debug.Logger.getLogger('safaridriver.client'); var url = new goog.Uri(window.location).getQueryData().get('url'); if (!url) { - goog.log.error(log, + log.severe( 'No url specified. Please reload this page with the url parameter set'); return; } url = new goog.Uri(url); - 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'); + log.info('Connecting to SafariDriver browser extension...'); + log.info('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(); @@ -47,13 +46,13 @@ safaridriver.client.init = function() { numAttempts += 1; var acknowledged = message.sendSync(window); if (acknowledged) { - goog.log.info(log, 'Connected to extension'); - goog.log.info(log, 'Requesting extension connect to client at ' + url); + log.info('Connected to extension'); + log.info('Requesting extension connect to client at ' + url); } else if (numAttempts < 5) { var timeout = 250 * numAttempts; setTimeout(connect, timeout); } else { - goog.log.error(log, + log.severe( '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 39d0ce9697a8b..a61e717be9faf 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.log'); +goog.require('goog.debug.Logger'); goog.require('safaridriver.dom'); @@ -43,10 +43,11 @@ safaridriver.message.ORIGIN = 'webdriver'; /** - * @private {goog.log.Logger} + * @private {!goog.debug.Logger} * @const */ -safaridriver.message.LOG_ = goog.log.getLogger('safaridriver.message'); +safaridriver.message.LOG_ = goog.debug.Logger.getLogger( + 'safaridriver.message'); /** @@ -110,7 +111,7 @@ safaridriver.message.fromEvent = function(event) { var type = data[safaridriver.message.Message.Field.TYPE]; var factory = safaridriver.message.factoryRegistry_[type]; if (!factory) { - goog.log.fine(safaridriver.message.LOG_, + safaridriver.message.LOG_.fine( '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 b348faf4fb7b2..4a64b4f7486c5 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-20140407.jar " + "-c third_party/closure/bin/compiler-20130603.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-20140407.jar" + pathelement :path => "third_party/closure/bin/compiler-20130603.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-20140407.jar" + pathelement :path => "third_party/closure/bin/compiler-20130603.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-20140407.jar" + pathelement :path => "third_party/closure/bin/compiler-20130603.jar" end arg :line => cmd end diff --git a/third_party/closure/bin/compiler-20140407.jar b/third_party/closure/bin/compiler-20130603.jar similarity index 52% rename from third_party/closure/bin/compiler-20140407.jar rename to third_party/closure/bin/compiler-20130603.jar index 67aa45afcffd2..0b0e68c3dd165 100644 Binary files a/third_party/closure/bin/compiler-20140407.jar and b/third_party/closure/bin/compiler-20130603.jar differ diff --git a/third_party/closure/bin/compiler.jar b/third_party/closure/bin/compiler.jar deleted file mode 100644 index 67aa45afcffd2..0000000000000 Binary files a/third_party/closure/bin/compiler.jar and /dev/null differ diff --git a/third_party/closure/goog/a11y/aria/announcer.js b/third_party/closure/goog/a11y/aria/announcer.js index ee87199bc9991..0ffaf33f331c2 100644 --- a/third_party/closure/goog/a11y/aria/announcer.js +++ b/third_party/closure/goog/a11y/aria/announcer.js @@ -36,10 +36,9 @@ 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.a11y.aria.Announcer.base(this, 'constructor'); + goog.base(this); /** * @type {goog.dom.DomHelper} @@ -50,7 +49,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_ = {}; @@ -64,7 +63,7 @@ goog.a11y.aria.Announcer.prototype.disposeInternal = function() { this.liveRegions_, this.domHelper_.removeNode, this.domHelper_); this.liveRegions_ = null; this.domHelper_ = null; - goog.a11y.aria.Announcer.base(this, 'disposeInternal'); + goog.base(this, 'disposeInternal'); }; @@ -84,16 +83,14 @@ 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) { - 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; + if (this.liveRegions_[priority]) { + return this.liveRegions_[priority]; } + 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 2774529b95aa3..abc261f6bfa2f 100644 --- a/third_party/closure/goog/a11y/aria/aria.js +++ b/third_party/closure/goog/a11y/aria/aria.js @@ -31,6 +31,7 @@ goog.require('goog.asserts'); goog.require('goog.dom'); goog.require('goog.dom.TagName'); goog.require('goog.object'); +goog.require('goog.string'); /** @@ -103,7 +104,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_); @@ -266,55 +267,38 @@ 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', not 'false', or not set. + * the state value is not 'true' or '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; +goog.a11y.aria.getBooleanStateInternalUtil = function(element, stateName) { + var stringValue = goog.a11y.aria.getState(element, stateName); + if (stringValue == 'true') { + return true; } - return goog.isBoolean(attr) ? attr : attr == 'true'; + if (stringValue == 'false') { + return false; + } + return null; }; /** * 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 or not set. - */ -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. + * the state value is not a number. */ -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; +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; }; @@ -334,6 +318,20 @@ 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 05e2fb9e5e2df..c97df20856524 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 2d8c23f0d1d69..5eea925d73cfc 100644 --- a/third_party/closure/goog/array/array.js +++ b/third_party/closure/goog/array/array.js @@ -42,14 +42,6 @@ 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}} */ @@ -58,26 +50,14 @@ goog.array.ArrayLike; /** * Returns the last element in an array without removing it. - * Same as goog.array.last. - * @param {Array.|goog.array.ArrayLike} array The array. - * @return {T} Last item in array. - * @template T + * @param {goog.array.ArrayLike} array The array. + * @return {*} Last item in array. */ 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 @@ -93,21 +73,19 @@ 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 {Array.|goog.array.ArrayLike} arr The array to be searched. - * @param {T} obj The object for which we are searching. + * @param {goog.array.ArrayLike} arr The array to be searched. + * @param {*} 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.ASSUME_NATIVE_FUNCTIONS || - goog.array.ARRAY_PROTOTYPE_.indexOf) ? + goog.array.ARRAY_PROTOTYPE_.indexOf ? function(arr, obj, opt_fromIndex) { goog.asserts.assert(arr.length != null); @@ -140,16 +118,14 @@ goog.array.indexOf = goog.NATIVE_ARRAY_PROTOTYPES && * * See {@link http://tinyurl.com/developer-mozilla-org-array-lastindexof} * - * @param {!Array.|!goog.array.ArrayLike} arr The array to be searched. - * @param {T} obj The object for which we are searching. + * @param {goog.array.ArrayLike} arr The array to be searched. + * @param {*} 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.ASSUME_NATIVE_FUNCTIONS || - goog.array.ARRAY_PROTOTYPE_.lastIndexOf) ? + goog.array.ARRAY_PROTOTYPE_.lastIndexOf ? function(arr, obj, opt_fromIndex) { goog.asserts.assert(arr.length != null); @@ -194,8 +170,7 @@ goog.array.lastIndexOf = goog.NATIVE_ARRAY_PROTOTYPES && * @template T,S */ goog.array.forEach = goog.NATIVE_ARRAY_PROTOTYPES && - (goog.array.ASSUME_NATIVE_FUNCTIONS || - goog.array.ARRAY_PROTOTYPE_.forEach) ? + goog.array.ARRAY_PROTOTYPE_.forEach ? function(arr, f, opt_obj) { goog.asserts.assert(arr.length != null); @@ -252,13 +227,12 @@ 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.ASSUME_NATIVE_FUNCTIONS || - goog.array.ARRAY_PROTOTYPE_.filter) ? + goog.array.ARRAY_PROTOTYPE_.filter ? function(arr, f, opt_obj) { goog.asserts.assert(arr.length != null); @@ -287,19 +261,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: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 + * @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 */ goog.array.map = goog.NATIVE_ARRAY_PROTOTYPES && - (goog.array.ASSUME_NATIVE_FUNCTIONS || - goog.array.ARRAY_PROTOTYPE_.map) ? + goog.array.ARRAY_PROTOTYPE_.map ? function(arr, f, opt_obj) { goog.asserts.assert(arr.length != null); @@ -342,23 +316,20 @@ 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 = 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; - }; +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; +}; /** @@ -387,23 +358,20 @@ goog.array.reduce = goog.NATIVE_ARRAY_PROTOTYPES && * values of the array. * @template T,S,R */ -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; - }; +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; +}; /** @@ -424,8 +392,7 @@ goog.array.reduceRight = goog.NATIVE_ARRAY_PROTOTYPES && * @template T,S */ goog.array.some = goog.NATIVE_ARRAY_PROTOTYPES && - (goog.array.ASSUME_NATIVE_FUNCTIONS || - goog.array.ARRAY_PROTOTYPE_.some) ? + goog.array.ARRAY_PROTOTYPE_.some ? function(arr, f, opt_obj) { goog.asserts.assert(arr.length != null); @@ -461,8 +428,7 @@ goog.array.some = goog.NATIVE_ARRAY_PROTOTYPES && * @template T,S */ goog.array.every = goog.NATIVE_ARRAY_PROTOTYPES && - (goog.array.ASSUME_NATIVE_FUNCTIONS || - goog.array.ARRAY_PROTOTYPE_.every) ? + goog.array.ARRAY_PROTOTYPE_.every ? function(arr, f, opt_obj) { goog.asserts.assert(arr.length != null); @@ -512,7 +478,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 */ @@ -558,7 +524,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 */ @@ -689,11 +655,9 @@ goog.array.insertBefore = function(arr, obj, opt_obj2) { /** * Removes the first occurrence of a particular value from an array. - * @param {Array.|goog.array.ArrayLike} arr Array from which to remove - * value. - * @param {T} obj Object to remove. + * @param {goog.array.ArrayLike} arr Array from which to remove value. + * @param {*} 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); @@ -777,27 +741,13 @@ 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 {Array.|goog.array.ArrayLike} object The object to convert to an - * array. - * @return {!Array.} The object converted into an array. If object has a + * @param {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; @@ -818,10 +768,8 @@ goog.array.toArray = function(object) { /** * Does a shallow copy of an array. - * @param {Array.|goog.array.ArrayLike} arr Array or array-like object to - * clone. - * @return {!Array.} Clone of the input array. - * @template T + * @param {goog.array.ArrayLike} arr Array or array-like object to clone. + * @return {!Array} Clone of the input array. */ goog.array.clone = goog.array.toArray; @@ -837,10 +785,8 @@ goog.array.clone = goog.array.toArray; * goog.array.extend(a, 2); * a; // [0, 1, 2] * - * @param {Array.} arr1 The array to modify. - * @param {...(Array.|VALUE)} var_args The elements or arrays of elements - * to add to arr1. - * @template VALUE + * @param {Array} arr1 The array to modify. + * @param {...*} var_args The elements or arrays of elements to add to arr1. */ goog.array.extend = function(arr1, var_args) { for (var i = 1; i < arguments.length; i++) { @@ -876,16 +822,15 @@ 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 {Array.|goog.array.ArrayLike} arr The array to modify. + * @param {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 {...T} var_args Optional, additional elements to insert into the + * @param {...*} var_args Optional, additional elements to insert into the * array. - * @return {!Array.} the removed elements. - * @template T + * @return {!Array} the removed elements. */ goog.array.splice = function(arr, index, howMany, var_args) { goog.asserts.assert(arr.length != null); @@ -931,36 +876,27 @@ 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 {Array.|goog.array.ArrayLike} arr The array from which to remove - * duplicates. + * @param {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, opt_hashFn) { +goog.array.removeDuplicates = function(arr, opt_rv) { var returnArray = opt_rv || arr; - var defaultHashFn = function(item) { - // Prefix each type with a single character representing the type to - // prevent conflicting keys (e.g. true and 'true'). - 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); + + // 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) : + (typeof current).charAt(0) + current; + if (!Object.prototype.hasOwnProperty.call(seen, key)) { seen[key] = true; returnArray[cursorInsert++] = current; @@ -983,18 +919,16 @@ goog.array.removeDuplicates = function(arr, opt_rv, opt_hashFn) { * * Runtime: O(log n) * - * @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. + * @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. * @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, @@ -1012,20 +946,18 @@ goog.array.binarySearch = function(arr, target, opt_compareFn) { * * Runtime: O(log n) * - * @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' + * @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' * 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 */, @@ -1045,22 +977,19 @@ goog.array.binarySelect = function(arr, evaluator, opt_obj) { * * Runtime: O(log n) * - * @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 {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 {boolean} isEvaluator Whether the function is an evaluator or a * comparison function. - * @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 + * @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 * 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, @@ -1113,7 +1042,10 @@ 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. - arr.sort(opt_compareFn || goog.array.defaultCompare); + goog.asserts.assert(arr.length != null); + + goog.array.ARRAY_PROTOTYPE_.sort.call( + arr, opt_compareFn || goog.array.defaultCompare); }; @@ -1222,21 +1154,30 @@ 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 {!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. + * @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. * @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; @@ -1254,11 +1195,10 @@ goog.array.compare3 = function(arr1, arr2, opt_compareFn) { /** * Compares its two arguments for order, using the built in < and > * operators. - * @param {VALUE} a The first object to be compared. - * @param {VALUE} b The second object to be compared. + * @param {*} a The first object to be compared. + * @param {*} 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; @@ -1279,15 +1219,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.|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. + * @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. * @return {boolean} True if an element was inserted. - * @template VALUE + * @template T */ goog.array.binaryInsert = function(array, value, opt_compareFn) { var index = goog.array.binarySearch(array, value, opt_compareFn); @@ -1301,15 +1241,13 @@ goog.array.binaryInsert = function(array, value, opt_compareFn) { /** * Removes a value from a sorted array. - * @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. + * @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. * @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); @@ -1424,10 +1362,9 @@ goog.array.range = function(startOrEnd, opt_end, opt_step) { /** * Returns an array consisting of the given value repeated N times. * - * @param {VALUE} value The value to repeat. + * @param {*} value The value to repeat. * @param {number} n The repeat count. - * @return {!Array.} An array with the repeated value. - * @template VALUE + * @return {!Array} An array with the repeated value. */ goog.array.repeat = function(value, n) { var array = []; @@ -1488,28 +1425,6 @@ 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 4afdac38b6427..905cd58d2f6d0 100644 --- a/third_party/closure/goog/asserts/asserts.js +++ b/third_party/closure/goog/asserts/asserts.js @@ -37,7 +37,6 @@ goog.provide('goog.asserts'); goog.provide('goog.asserts.AssertionError'); goog.require('goog.debug.Error'); -goog.require('goog.dom.NodeType'); goog.require('goog.string'); @@ -54,7 +53,6 @@ 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); @@ -108,11 +106,10 @@ goog.asserts.doAssertFailure_ = /** * Checks if the condition evaluates to true if goog.asserts.ENABLE_ASSERTS is * true. - * @template T - * @param {T} condition The condition to check. + * @param {*} 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 {T} The value of the condition. + * @return {*} The value of the condition. * @throws {goog.asserts.AssertionError} When the condition evaluates to false. */ goog.asserts.assert = function(condition, opt_message, var_args) { @@ -261,26 +258,6 @@ 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. @@ -304,13 +281,3 @@ 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 48e156c003749..e617eb0daf49c 100644 --- a/third_party/closure/goog/async/animationdelay.js +++ b/third_party/closure/goog/async/animationdelay.js @@ -52,10 +52,9 @@ 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.async.AnimationDelay.base(this, 'constructor'); + goog.base(this); /** * The function that will be invoked after a delay. @@ -235,7 +234,7 @@ goog.async.AnimationDelay.prototype.doAction_ = function() { /** @override */ goog.async.AnimationDelay.prototype.disposeInternal = function() { this.stop(); - goog.async.AnimationDelay.base(this, 'disposeInternal'); + goog.base(this, 'disposeInternal'); }; diff --git a/third_party/closure/goog/async/delay.js b/third_party/closure/goog/async/delay.js index 1c5916a216e38..3f3b262aeff85 100644 --- a/third_party/closure/goog/async/delay.js +++ b/third_party/closure/goog/async/delay.js @@ -42,7 +42,6 @@ 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); @@ -84,7 +83,6 @@ 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 29ba7d7aa1619..5f8b895e69b6e 100644 --- a/third_party/closure/goog/async/nexttick.js +++ b/third_party/closure/goog/async/nexttick.js @@ -20,33 +20,17 @@ */ 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(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 + * @param {function()} callback Callback function to fire as soon as possible. + * @param {Object=} opt_context Object in whose scope to call the listener. */ goog.async.nextTick = function(callback, opt_context) { var cb = callback; @@ -83,24 +67,6 @@ 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']; @@ -116,7 +82,7 @@ goog.async.nextTick.getSetImmediateEmulator_ = function() { var iframe = document.createElement('iframe'); iframe.style.display = 'none'; iframe.src = ''; - document.documentElement.appendChild(iframe); + document.body.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 deleted file mode 100644 index d281c246fd397..0000000000000 --- a/third_party/closure/goog/async/run.js +++ /dev/null @@ -1,105 +0,0 @@ -// 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 939738eea415b..c8ece971bd7c5 100644 --- a/third_party/closure/goog/async/throttle.js +++ b/third_party/closure/goog/async/throttle.js @@ -31,22 +31,19 @@ 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(this: T)} listener Function to callback when the action is - * triggered. - * @param {number} interval Interval over which to throttle. The listener can + * @param {Function} listener Function to callback when the action is triggered. + * @param {number} interval Interval over which to throttle. The handler can * only be called once per interval. - * @param {T=} opt_handler Object in whose scope to call the listener. + * @param {Object=} 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(this: T)} + * @type {Function} * @private */ this.listener_ = listener; @@ -80,7 +77,6 @@ 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 68f871b163b98..39bd73a66726f 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,36 +50,15 @@ goog.global = this; /** * A hook for overriding the define values in uncompiled mode. * - * 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). + * 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). * * Example: *
- *   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};
+ *   var CLOSURE_DEFINES = {'goog.DEBUG', false};
  * 
* * @type {Object.|undefined} @@ -88,23 +67,9 @@ goog.global.CLOSURE_DEFINES; /** - * 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: + * 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. @@ -131,7 +96,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 && goog.isDef(opt_object)) { + if (!parts.length && opt_object !== undefined) { // last part and we have an object; use it cur[part] = opt_object; } else if (cur[part]) { @@ -145,10 +110,9 @@ goog.exportPath_ = function(name, opt_object, opt_objectToExportTo) { /** * Defines a named value. In uncompiled mode, the value is retreived from - * 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. + * 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. * * @param {string} name The distinguished name to provide. * @param {string|number|boolean} defaultValue @@ -156,13 +120,8 @@ goog.exportPath_ = function(name, opt_object, opt_objectToExportTo) { goog.define = function(name, defaultValue) { var value = defaultValue; if (!COMPILED) { - 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)) { + if (goog.global.CLOSURE_DEFINES && Object.prototype.hasOwnProperty.call( + goog.global.CLOSURE_DEFINES, name)) { value = goog.global.CLOSURE_DEFINES[name]; } } @@ -210,28 +169,17 @@ 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. Provided objects must not be null or undefined. - * Build tools also scan for provide/require statements + * objects/namespaces. 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 @@ -266,9 +214,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. @@ -282,25 +230,6 @@ 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) { /** @@ -311,14 +240,13 @@ if (!COMPILED) { * @private */ goog.isProvided_ = function(name) { - return !goog.implicitNamespaces_[name] && - goog.isDefAndNotNull(goog.getObjectByName(name)); + return !goog.implicitNamespaces_[name] && !!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 @@ -328,10 +256,9 @@ if (!COMPILED) { /** - * 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. + * 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. * * @param {string} name The fully qualified name. * @param {Object=} opt_obj The object within which to look; default is @@ -400,14 +327,14 @@ goog.addDependency = function(relPath, provides, requires) { -// 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. +// 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. // -// 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 @@ -432,21 +359,22 @@ 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; @@ -474,7 +402,7 @@ goog.require = function(name) { /** - * Path for included scripts. + * Path for included scripts * @type {string} */ goog.basePath = ''; @@ -488,7 +416,8 @@ 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; @@ -502,7 +431,6 @@ 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; @@ -530,16 +458,19 @@ 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'); @@ -547,8 +478,8 @@ goog.abstractMethod = function() { /** - * Adds a {@code getInstance} static method that always returns the same - * instance object. + * Adds a {@code getInstance} static method that always return the same instance + * object. * @param {!Function} ctor The constructor for the class to add the static * method to. */ @@ -585,8 +516,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 */ @@ -595,7 +526,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} */ @@ -603,9 +534,10 @@ 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 file twice. + // used when resolving dependencies to prevent us from + // visiting the 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 }; @@ -622,7 +554,7 @@ if (goog.DEPENDENCIES_ENABLED) { /** - * Tries to detect the base path of base.js script that bootstraps Closure. + * Tries to detect the base path of the base.js script that bootstraps Closure * @private */ goog.findBasePath_ = function() { @@ -706,7 +638,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_; @@ -716,8 +648,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; @@ -848,7 +780,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' && @@ -878,15 +810,17 @@ 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; @@ -894,8 +828,21 @@ goog.typeOf = function(value) { /** - * Returns true if the specified value is null. - * @param {?} val Variable to test. + * 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. * @return {boolean} Whether variable is null. */ goog.isNull = function(val) { @@ -904,8 +851,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) { @@ -915,8 +862,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) { @@ -928,7 +875,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) { @@ -938,9 +885,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) { @@ -949,8 +896,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) { @@ -959,8 +906,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) { @@ -969,8 +916,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) { @@ -979,8 +926,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) { @@ -989,9 +936,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) { @@ -1003,12 +950,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. @@ -1024,19 +971,6 @@ 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 @@ -1046,8 +980,8 @@ goog.hasUid = function(obj) { goog.removeUid = function(obj) { // TODO(arv): Make the type stricter, do not accept null. - // In IE, DOM nodes are not instances of Object and throw an exception if we - // try to delete. Instead we try to use removeAttribute. + // DOM nodes in IE are not instance of Object and throws exception + // for delete. Instead we try to use removeAttribute if ('removeAttribute' in obj) { obj.removeAttribute(goog.UID_PROPERTY_); } @@ -1061,7 +995,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 */ @@ -1129,15 +1063,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) { @@ -1148,10 +1082,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 @@ -1181,22 +1115,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 @@ -1205,12 +1139,13 @@ 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 { @@ -1229,17 +1164,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() { - // Clone the array (with slice()) and append additional arguments - // to the existing arguments. - var newArgs = args.slice(); - newArgs.push.apply(newArgs, arguments); + // Prepend the bound arguments to the current arguments. + var newArgs = Array.prototype.slice.call(arguments); + newArgs.unshift.apply(newArgs, args); return fn.apply(this, newArgs); }; }; @@ -1277,7 +1212,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. @@ -1352,26 +1287,27 @@ 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. @@ -1495,7 +1431,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 primitive. Must be used in the form: + * This function is a compiler primtive. 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. * @@ -1510,14 +1446,17 @@ 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', @@ -1527,7 +1466,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); @@ -1561,16 +1500,16 @@ goog.exportProperty = function(object, publicName, symbol) { * goog.inherits(ChildClass, ParentClass); * * var child = new ChildClass('a', 'b', 'see'); - * child.foo(); // This works. + * child.foo(); // 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 here.
+ *   // other code
  * };
  * 
* @@ -1585,28 +1524,6 @@ 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); - }; }; @@ -1614,34 +1531,36 @@ goog.inherits = function(childCtor, parentCtor) { * Call up to the superclass. * * If this is called from a constructor, then this calls the superclass - * constructor with arguments 1-N. + * contructor 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.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 (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 (caller.superClass_) { @@ -1661,8 +1580,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) { @@ -1677,30 +1596,15 @@ 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 deleted file mode 100644 index 076203791d8d4..0000000000000 --- a/third_party/closure/goog/bootstrap/nodejs.js +++ /dev/null @@ -1,91 +0,0 @@ -// 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 705379f83767f..cfac60bfdee71 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 {{hex: string, type: string}} 'hex' is a string containing - * a hex representation of the color, and 'type' is a string + * @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'). */ goog.color.alpha.parse = function(str) { @@ -132,8 +132,7 @@ 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, a]. r, g, b are ints between 0 - * and 255, and a is a value between 0 and 1. + * @return {Array} array containing [r, g, b] as ints in [0, 255]. */ goog.color.alpha.hexToRgba = function(hexColor) { // TODO(user): Enhance code sharing with goog.color, for example by @@ -272,7 +271,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) { @@ -287,7 +286,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) { @@ -299,7 +298,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) { @@ -374,7 +373,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 */ @@ -404,7 +403,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 */ @@ -431,17 +430,14 @@ goog.color.alpha.isValidHslaColor_ = function(str) { /** * Takes an array of [r, g, b, a] and converts it into a string appropriate for - * CSS styles. The alpha channel value is rounded to 3 decimal places to make - * sure the produced string is not too long. + * CSS styles. * @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) { - var roundedRgba = rgba.slice(0); - roundedRgba[3] = Math.round(rgba[3] * 1000) / 1000; - return 'rgba(' + roundedRgba.join(',') + ')'; + return 'rgba(' + rgba.join(',') + ')'; }; diff --git a/third_party/closure/goog/color/color.js b/third_party/closure/goog/color/color.js index 8e139a3572f86..61ca8d9510cc8 100644 --- a/third_party/closure/goog/color/color.js +++ b/third_party/closure/goog/color/color.js @@ -17,9 +17,6 @@ */ 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'); @@ -57,9 +54,9 @@ goog.color.Hsl; /** * Parses a color out of a string. * @param {string} str Color in some format. - * @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'). + * @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'). */ 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 46a84025afa2f..977906574723e 100644 --- a/third_party/closure/goog/crypt/aes.js +++ b/third_party/closure/goog/crypt/aes.js @@ -42,8 +42,6 @@ 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 09e84bbddfb77..30e82ca48a219 100644 --- a/third_party/closure/goog/crypt/arc4.js +++ b/third_party/closure/goog/crypt/arc4.js @@ -39,8 +39,6 @@ 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 30b9bddb84ad9..b7a24581cf76e 100644 --- a/third_party/closure/goog/crypt/base64.js +++ b/third_party/closure/goog/crypt/base64.js @@ -194,17 +194,10 @@ goog.crypt.base64.decodeString = function(input, opt_webSafe) { /** * Base64-decode a string. * - * 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. + * @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. */ goog.crypt.base64.decodeStringToByteArray = function(input, opt_webSafe) { goog.crypt.base64.init_(); @@ -223,11 +216,11 @@ goog.crypt.base64.decodeStringToByteArray = function(input, opt_webSafe) { ++i; var haveByte3 = i < input.length; - var byte3 = haveByte3 ? charToByteMap[input.charAt(i)] : 64; + var byte3 = haveByte3 ? charToByteMap[input.charAt(i)] : 0; ++i; var haveByte4 = i < input.length; - var byte4 = haveByte4 ? charToByteMap[input.charAt(i)] : 64; + var byte4 = haveByte4 ? charToByteMap[input.charAt(i)] : 0; ++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 cd8a10ee1d9fb..db60dcdc90663 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 3d04a4d9173bf..cb3c1a0f97744 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,10 +46,9 @@ goog.require('goog.log'); * @param {number=} opt_blockSize Processing block size. * @constructor * @extends {goog.events.EventTarget} - * @final */ goog.crypt.BlobHasher = function(hashFn, opt_blockSize) { - goog.crypt.BlobHasher.base(this, 'constructor'); + goog.base(this); /** * The actual hash function. @@ -102,10 +101,10 @@ goog.crypt.BlobHasher = function(hashFn, opt_blockSize) { /** * The logger used by this object. - * @type {goog.log.Logger} + * @type {!goog.debug.Logger} * @private */ - this.logger_ = goog.log.getLogger('goog.crypt.BlobHasher'); + this.logger_ = goog.debug.Logger.getLogger('goog.crypt.BlobHasher'); }; goog.inherits(goog.crypt.BlobHasher, goog.events.EventTarget); @@ -223,7 +222,7 @@ goog.crypt.BlobHasher.prototype.processNextBlock_ = function() { var chunk = goog.fs.sliceBlob(this.blob_, this.bytesProcessed_, this.bytesProcessed_ + size); if (!chunk || chunk.size != size) { - goog.log.error(this.logger_, 'Failed slicing the blob'); + this.logger_.severe('Failed slicing the blob'); this.onError_(); return; } @@ -233,7 +232,7 @@ goog.crypt.BlobHasher.prototype.processNextBlock_ = function() { } else if (this.fileReader_.readAsBinaryString) { this.fileReader_.readAsBinaryString(chunk); } else { - goog.log.error(this.logger_, 'Failed calling the chunk reader'); + this.logger_.severe('Failed calling the chunk reader'); this.onError_(); } } else { @@ -249,7 +248,7 @@ goog.crypt.BlobHasher.prototype.processNextBlock_ = function() { * @private */ goog.crypt.BlobHasher.prototype.onLoad_ = function() { - goog.log.info(this.logger_, 'Successfully loaded a chunk'); + this.logger_.info('Successfully loaded a chunk'); var array = null; if (this.fileReader_.result instanceof Array || @@ -260,7 +259,7 @@ goog.crypt.BlobHasher.prototype.onLoad_ = function() { array = new Uint8Array(this.fileReader_.result); } if (!array) { - goog.log.error(this.logger_, 'Failed reading the chunk'); + this.logger_.severe('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 455f267551d29..4c59c00d7102c 100644 --- a/third_party/closure/goog/crypt/cbc.js +++ b/third_party/closure/goog/crypt/cbc.js @@ -23,7 +23,6 @@ goog.provide('goog.crypt.Cbc'); goog.require('goog.array'); -goog.require('goog.asserts'); goog.require('goog.crypt'); @@ -37,8 +36,6 @@ 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 47943cadf7cd0..20b30694654d5 100644 --- a/third_party/closure/goog/crypt/crypt.js +++ b/third_party/closure/goog/crypt/crypt.js @@ -19,7 +19,6 @@ goog.provide('goog.crypt'); goog.require('goog.array'); -goog.require('goog.asserts'); /** @@ -46,35 +45,18 @@ 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} bytes Array of numbers representing characters. + * @param {Array} array Array of numbers representing characters. * @return {string} Stringification of the 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; +goog.crypt.byteArrayToString = function(array) { + return String.fromCharCode.apply(null, array); }; /** * Turns an array of numbers into the hex string given by the concatenation of * the hex values to which the numbers correspond. - * @param {Uint8Array|Int8Array|Array.} array Array of numbers - * representing characters. + * @param {Array} array Array of numbers representing characters. * @return {string} Hex string. */ goog.crypt.byteArrayToHex = function(array) { @@ -105,7 +87,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 @@ -130,7 +112,7 @@ goog.crypt.stringToUtf8ByteArray = function(str) { /** * Converts a UTF-8 byte array to JavaScript's 16-bit Unicode. - * @param {Uint8Array|Int8Array|Array.} bytes UTF-8 byte array. + * @param {Array.} bytes UTF-8 byte array. * @return {string} 16-bit Unicode string. */ goog.crypt.utf8ByteArrayToString = function(bytes) { @@ -156,8 +138,8 @@ goog.crypt.utf8ByteArrayToString = function(bytes) { /** * XOR two byte arrays. - * @param {!ArrayBufferView|!Array.} bytes1 Byte array 1. - * @param {!ArrayBufferView|!Array.} bytes2 Byte array 2. + * @param {!Array.} bytes1 Byte array 1. + * @param {!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 8a7d210b50798..8ca6dafdac361 100644 --- a/third_party/closure/goog/crypt/hash.js +++ b/third_party/closure/goog/crypt/hash.js @@ -27,15 +27,8 @@ goog.provide('goog.crypt.Hash'); * Create a cryptographic hash instance. * * @constructor - * @struct */ -goog.crypt.Hash = function() { - /** - * The block size for the hasher. - * @type {number} - */ - this.blockSize = -1; -}; +goog.crypt.Hash = function() {}; /** diff --git a/third_party/closure/goog/crypt/hmac.js b/third_party/closure/goog/crypt/hmac.js index 2475c9ee9cfcb..9d181dced4d78 100644 --- a/third_party/closure/goog/crypt/hmac.js +++ b/third_party/closure/goog/crypt/hmac.js @@ -24,6 +24,7 @@ goog.provide('goog.crypt.Hmac'); +goog.require('goog.asserts'); goog.require('goog.crypt.Hash'); @@ -35,14 +36,11 @@ 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, uses the block size from the hasher, or 16 if it is - * not specified. + * If not specified, 16. * @extends {goog.crypt.Hash} - * @final - * @struct */ goog.crypt.Hmac = function(hasher, key, opt_blockSize) { - goog.crypt.Hmac.base(this, 'constructor'); + goog.base(this); /** * The underlying hasher to calculate hash. @@ -52,7 +50,13 @@ goog.crypt.Hmac = function(hasher, key, opt_blockSize) { */ this.hasher_ = hasher; - this.blockSize = opt_blockSize || hasher.blockSize || 16; + /** + * The block size. + * + * @type {number} + * @private + */ + this.blockSize_ = opt_blockSize || 16; /** * The outer padding array of hmac @@ -60,7 +64,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 @@ -68,7 +72,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); }; @@ -102,14 +106,13 @@ 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 22c2eac1145bb..3b3bccd193d49 100644 --- a/third_party/closure/goog/crypt/md5.js +++ b/third_party/closure/goog/crypt/md5.js @@ -42,13 +42,9 @@ goog.require('goog.crypt.Hash'); * MD5 cryptographic hash constructor. * @constructor * @extends {goog.crypt.Hash} - * @final - * @struct */ goog.crypt.Md5 = function() { - goog.crypt.Md5.base(this, 'constructor'); - - this.blockSize = 512 / 8; + goog.base(this); /** * Holds the current values of accumulated A-D variables (MD buffer). @@ -62,7 +58,7 @@ goog.crypt.Md5 = function() { * @type {Array.} * @private */ - this.block_ = new Array(this.blockSize); + this.block_ = new Array(64); /** * The length of yet-unprocessed data as collected in the block. @@ -354,7 +350,7 @@ goog.crypt.Md5.prototype.update = function(bytes, opt_length) { if (!goog.isDef(opt_length)) { opt_length = bytes.length; } - var lengthMinusBlock = opt_length - this.blockSize; + var lengthMinusBlock = opt_length - 64; // 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). @@ -371,14 +367,14 @@ goog.crypt.Md5.prototype.update = function(bytes, opt_length) { if (blockLength == 0) { while (i <= lengthMinusBlock) { this.compress_(bytes, i); - i += this.blockSize; + i += 64; } } if (goog.isString(bytes)) { while (i < opt_length) { block[blockLength++] = bytes.charCodeAt(i++); - if (blockLength == this.blockSize) { + if (blockLength == 64) { this.compress_(block); blockLength = 0; // Jump to the outer loop so we use the full-block optimization. @@ -388,7 +384,7 @@ goog.crypt.Md5.prototype.update = function(bytes, opt_length) { } else { while (i < opt_length) { block[blockLength++] = bytes[i++]; - if (blockLength == this.blockSize) { + if (blockLength == 64) { this.compress_(block); blockLength = 0; // Jump to the outer loop so we use the full-block optimization. @@ -407,9 +403,7 @@ 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 ? - this.blockSize : - this.blockSize * 2) - this.blockLength_); + var pad = new Array((this.blockLength_ < 56 ? 64 : 128) - 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 be726fc91029a..e65e2cb933d38 100644 --- a/third_party/closure/goog/crypt/sha1.js +++ b/third_party/closure/goog/crypt/sha1.js @@ -40,13 +40,9 @@ 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.crypt.Sha1.base(this, 'constructor'); - - this.blockSize = 512 / 8; + goog.base(this); /** * Holds the previous values of accumulated variables a-e in the compress_ @@ -79,20 +75,10 @@ goog.crypt.Sha1 = function() { this.pad_ = []; this.pad_[0] = 128; - for (var i = 1; i < this.blockSize; ++i) { + for (var i = 1; i < 64; ++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); @@ -206,7 +192,7 @@ goog.crypt.Sha1.prototype.update = function(bytes, opt_length) { opt_length = bytes.length; } - var lengthMinusBlock = opt_length - this.blockSize; + var lengthMinusBlock = opt_length - 64; var n = 0; // Using local instead of member variables gives ~5% speedup on Firefox 16. var buf = this.buf_; @@ -221,7 +207,7 @@ goog.crypt.Sha1.prototype.update = function(bytes, opt_length) { if (inbuf == 0) { while (n <= lengthMinusBlock) { this.compress_(bytes, n); - n += this.blockSize; + n += 64; } } @@ -230,7 +216,7 @@ goog.crypt.Sha1.prototype.update = function(bytes, opt_length) { buf[inbuf] = bytes.charCodeAt(n); ++inbuf; ++n; - if (inbuf == this.blockSize) { + if (inbuf == 64) { this.compress_(buf); inbuf = 0; // Jump to the outer loop so we use the full-block optimization. @@ -242,7 +228,7 @@ goog.crypt.Sha1.prototype.update = function(bytes, opt_length) { buf[inbuf] = bytes[n]; ++inbuf; ++n; - if (inbuf == this.blockSize) { + if (inbuf == 64) { this.compress_(buf); inbuf = 0; // Jump to the outer loop so we use the full-block optimization. @@ -266,11 +252,11 @@ goog.crypt.Sha1.prototype.digest = function() { if (this.inbuf_ < 56) { this.update(this.pad_, 56 - this.inbuf_); } else { - this.update(this.pad_, this.blockSize - (this.inbuf_ - 56)); + this.update(this.pad_, 64 - (this.inbuf_ - 56)); } // Add # bits. - for (var i = this.blockSize - 1; i >= 56; i--) { + for (var i = 63; 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 b71fa89cb7e4b..0bbd375ce7b09 100644 --- a/third_party/closure/goog/crypt/sha2.js +++ b/third_party/closure/goog/crypt/sha2.js @@ -21,6 +21,9 @@ * 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@. * */ @@ -39,12 +42,9 @@ 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.crypt.Sha2.base(this, 'constructor'); - - this.blockSize = 512 / 8; + goog.base(this); /** * 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, this.blockSize); + this.pad_ = goog.array.repeat(0, 64); this.pad_[0] = 128; /** @@ -98,16 +98,6 @@ 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); @@ -123,11 +113,10 @@ goog.crypt.Sha2.prototype.reset = goog.abstractMethod; * @private */ goog.crypt.Sha2.prototype.computeChunk_ = function(chunk) { - goog.asserts.assert(chunk.length == this.blockSize); - var rounds = 64; + goog.asserts.assert(chunk.length == 64); // Divide the chunk into 16 32-bit-words. - var w = this.w_; + var w = []; var index = 0; var offset = 0; while (offset < chunk.length) { @@ -138,70 +127,56 @@ goog.crypt.Sha2.prototype.computeChunk_ = function(chunk) { offset = index * 4; } - // 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; + // 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; } - 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 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 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) | 0; + var t2 = (S0 + maj) & 0xffffffff; var S1 = ((e >>> 6) | (e << 26)) ^ ((e >>> 11) | (e << 21)) ^ ((e >>> 25) | (e << 7)); var ch = ((e & f) ^ ((~ e) & g)); - - // 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; + var t1 = (h + S1 + ch + this.K_[i] + w[i]) & 0xffffffff; h = g; g = f; f = e; - e = (d + t1) | 0; + e = (d + t1) & 0xffffffff; d = c; c = b; b = a; - a = (t1 + t2) | 0; + a = (t1 + t2) & 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; + 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; }; @@ -223,25 +198,19 @@ 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 == this.blockSize) { + if (inChunk == 64) { this.computeChunk_(this.chunk); inChunk = 0; } } - } else if (goog.isArray(message)) { + } else { 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.chunk[inChunk++] = message[n++]; + if (inChunk == 64) { 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. @@ -261,7 +230,7 @@ goog.crypt.Sha2.prototype.digest = function() { if (this.inChunk < 56) { this.update(this.pad_, 56 - this.inChunk); } else { - this.update(this.pad_, this.blockSize - (this.inChunk - 56)); + this.update(this.pad_, 64 - (this.inChunk - 56)); } // Append # bits in the 64-bit big-endian format. @@ -285,23 +254,22 @@ goog.crypt.Sha2.prototype.digest = function() { /** * Constants used in SHA-2. * @const - * @private {!Array.} + * @private */ -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 -]; +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]; diff --git a/third_party/closure/goog/crypt/sha224.js b/third_party/closure/goog/crypt/sha224.js index a4ae2f44ef172..6bc2766cfd0c3 100644 --- a/third_party/closure/goog/crypt/sha224.js +++ b/third_party/closure/goog/crypt/sha224.js @@ -33,11 +33,9 @@ goog.require('goog.crypt.Sha2'); * * @constructor * @extends {goog.crypt.Sha2} - * @final - * @struct */ goog.crypt.Sha224 = function() { - goog.crypt.Sha224.base(this, 'constructor'); + goog.base(this); }; 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 ceb93d64f2fde..7e7d6fdf6ae86 100644 --- a/third_party/closure/goog/crypt/sha256.js +++ b/third_party/closure/goog/crypt/sha256.js @@ -33,11 +33,9 @@ goog.require('goog.crypt.Sha2'); * * @constructor * @extends {goog.crypt.Sha2} - * @final - * @struct */ goog.crypt.Sha256 = function() { - goog.crypt.Sha256.base(this, 'constructor'); + goog.base(this); }; 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 deleted file mode 100644 index 0a7848d7bd77b..0000000000000 --- a/third_party/closure/goog/crypt/sha2_64bit.js +++ /dev/null @@ -1,500 +0,0 @@ -// 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 deleted file mode 100644 index 65bbdbc8a66ec..0000000000000 --- a/third_party/closure/goog/crypt/sha384.js +++ /dev/null @@ -1,53 +0,0 @@ -// 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 deleted file mode 100644 index 48c98de349b31..0000000000000 --- a/third_party/closure/goog/crypt/sha512.js +++ /dev/null @@ -1,53 +0,0 @@ -// 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 deleted file mode 100644 index 74d924e81d59a..0000000000000 --- a/third_party/closure/goog/crypt/sha512_256.js +++ /dev/null @@ -1,60 +0,0 @@ -// 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 100644 new mode 100755 diff --git a/third_party/closure/goog/css/bubble.css b/third_party/closure/goog/css/bubble.css old mode 100644 new mode 100755 diff --git a/third_party/closure/goog/css/charpicker.css b/third_party/closure/goog/css/charpicker.css old mode 100644 new mode 100755 index fb33447746c7e..4ef19e4bf99c9 --- 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: hidden; + overflow: hide; 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 1f17052708284..c4ce856ad658f 100644 --- a/third_party/closure/goog/css/custombutton.css +++ b/third_party/closure/goog/css/custombutton.css @@ -41,6 +41,9 @@ } .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 6d5b914d035b1..5832585e0ed18 100644 --- a/third_party/closure/goog/css/datepicker.css +++ b/third_party/closure/goog/css/datepicker.css @@ -115,17 +115,11 @@ td.goog-date-picker-none-cont { } .goog-date-picker-month { - min-width: 11ex; - white-space: nowrap; + width: 11ex; } .goog-date-picker-year { - min-width: 6ex; - white-space: nowrap; -} - -.goog-date-picker-monthyear { - white-space: nowrap; + width: 6ex; } .goog-date-picker table { diff --git a/third_party/closure/goog/css/imagelessbutton.css b/third_party/closure/goog/css/imagelessbutton.css old mode 100644 new mode 100755 diff --git a/third_party/closure/goog/css/inputdatepicker.css b/third_party/closure/goog/css/inputdatepicker.css old mode 100644 new mode 100755 diff --git a/third_party/closure/goog/css/offline.css b/third_party/closure/goog/css/offline.css new file mode 100644 index 0000000000000..82d3a643d6472 --- /dev/null +++ b/third_party/closure/goog/css/offline.css @@ -0,0 +1,147 @@ +/* + * 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 df11232767d51..cee57c3f20eb0 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,24 +294,17 @@ 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. - - // 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; + // If on IE, use rules property, otherwise use cssRules property. + var rules = cssStyleSheet.rules || cssStyleSheet.cssRules; index = rules.length; } if (cssStyleSheet.insertRule) { - // W3C (including IE9+). + // W3C. cssStyleSheet.insertRule(cssText, index); } else { - // IE, pre 9: We have to parse the cssRule text to get the selector - // separated from the style text. + // IE: 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); @@ -348,7 +341,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() : @@ -398,7 +391,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 e4bb7aba94ab4..3ecfd10a9c167 100644 --- a/third_party/closure/goog/cssom/iframe/style.js +++ b/third_party/closure/goog/cssom/iframe/style.js @@ -49,12 +49,11 @@ 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.classlist'); +goog.require('goog.dom.classes'); goog.require('goog.string'); goog.require('goog.style'); goog.require('goog.userAgent'); @@ -139,7 +138,7 @@ goog.cssom.iframe.style.CssRuleSet_.prototype.initializeFromCssRule = return false; } var selector; - var declarations = ''; + var declarations; if (ruleStyle && (selector = cssRule.selectorText) && (declarations = ruleStyle.cssText)) { @@ -192,7 +191,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() { @@ -526,7 +525,7 @@ goog.cssom.iframe.style.NodeAncestry_ = function(el) { var className = node.className; var classNamesLookup = {}; if (className) { - var classNames = goog.dom.classlist.get(goog.asserts.assertElement(node)); + var classNames = goog.dom.classes.get(node); for (var i = 0; i < classNames.length; i++) { classNamesLookup[classNames[i]] = 1; } @@ -567,7 +566,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 */ @@ -623,7 +622,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) { @@ -923,7 +922,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 5eccd20a10dc1..35a50865af26f 100644 --- a/third_party/closure/goog/datasource/datamanager.js +++ b/third_party/closure/goog/datasource/datamanager.js @@ -30,7 +30,6 @@ 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'); @@ -41,7 +40,6 @@ goog.require('goog.structs.Map'); * Create a DataManger * @extends {goog.ds.DataNode} * @constructor - * @final */ goog.ds.DataManager = function() { this.dataSources_ = new goog.ds.BasicNodeList(); @@ -64,7 +62,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_) { @@ -169,7 +167,7 @@ goog.ds.DataManager.prototype.getDataSource = function(name) { /** * Get the value of the node - * @return {!Object} The value of the node. + * @return {Object} The value of the node, or null if no value. * @override */ goog.ds.DataManager.prototype.get = function() { @@ -478,7 +476,7 @@ goog.ds.DataManager.prototype.removeListenersByFunction_ = function( */ goog.ds.DataManager.prototype.getListenerCount = function() { var count = 0; - goog.object.forEach(this.listenerMap_, function(matchingListeners) { + goog.structs.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 11234b7b3d017..066a52587bd91 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.log'); +goog.require('goog.debug.Logger'); @@ -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,7 +460,6 @@ goog.ds.BasicNodeList.prototype.indexOf = function(name) { * Immulatable empty node list * @extends {goog.ds.BasicNodeList} * @constructor - * @final */ goog.ds.EmptyNodeList = function() { @@ -628,9 +627,9 @@ goog.ds.STR_ARRAY_START = '['; /** * Shared logger instance for data package - * @type {goog.log.Logger} + * @type {goog.debug.Logger} */ -goog.ds.logger = goog.log.getLogger('goog.ds'); +goog.ds.logger = goog.debug.Logger.getLogger('goog.ds'); /** @@ -646,7 +645,6 @@ 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 804e9cec65b2b..869c9e373df4e 100644 --- a/third_party/closure/goog/datasource/expr.js +++ b/third_party/closure/goog/datasource/expr.js @@ -47,7 +47,6 @@ 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 b8bf74372b094..d745cffa7dee8 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,8 +128,9 @@ 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]; } @@ -148,7 +149,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)) { @@ -165,7 +166,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(); @@ -280,7 +281,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 = {}; @@ -407,7 +408,6 @@ 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,7 +513,6 @@ 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. @@ -547,7 +546,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() { @@ -676,7 +675,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 653dbbcf1f53d..78d8e06bc69be 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|visibility} + * @suppress {underscore} */ goog.ds.JsDataSource.prototype.root_; @@ -410,7 +410,6 @@ 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 fb5dce40fccc5..8e800001245f6 100644 --- a/third_party/closure/goog/datasource/jsondatasource.js +++ b/third_party/closure/goog/datasource/jsondatasource.js @@ -54,7 +54,6 @@ 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); @@ -100,7 +99,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.log.info(goog.ds.logger, 'Sending JS request for DataSource ' + + goog.ds.logger.info('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 f04260852b088..3a8445b176b6d 100644 --- a/third_party/closure/goog/datasource/jsxmlhttpdatasource.js +++ b/third_party/closure/goog/datasource/jsxmlhttpdatasource.js @@ -32,7 +32,6 @@ 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'); @@ -51,7 +50,6 @@ goog.require('goog.net.XhrIo'); * * @extends {goog.ds.FastDataNode} * @constructor - * @final */ goog.ds.JsXmlHttpDataSource = function(uri, name, opt_startText, opt_endText, opt_usePost) { @@ -117,7 +115,7 @@ goog.ds.JsXmlHttpDataSource.prototype.setQueryData = function(data) { * @override */ goog.ds.JsXmlHttpDataSource.prototype.load = function() { - goog.log.info(goog.ds.logger, 'Sending JS request for DataSource ' + + goog.ds.logger.info('Sending JS request for DataSource ' + this.getDataName() + ' to ' + this.uri_); if (this.uri_) { @@ -159,8 +157,7 @@ goog.ds.JsXmlHttpDataSource.prototype.success_ = function() { */ goog.ds.JsXmlHttpDataSource.prototype.completed_ = function(e) { if (this.xhr_.isSuccess()) { - goog.log.info(goog.ds.logger, - 'Got data for DataSource ' + this.getDataName()); + goog.ds.logger.info('Got data for DataSource ' + this.getDataName()); var text = this.xhr_.getResponseText(); // Look for start and end token and trim text @@ -177,19 +174,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.log.error(goog.ds.logger, 'Failed to parse data: ' + ex.message); + goog.ds.logger.severe('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.log.info(goog.ds.logger, 'Data retrieve failed for DataSource ' + + goog.ds.logger.info('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 50547cb1bf4ff..ed28952eb026d 100644 --- a/third_party/closure/goog/datasource/xmldatasource.js +++ b/third_party/closure/goog/datasource/xmldatasource.js @@ -32,7 +32,6 @@ goog.require('goog.net.XhrIo'); goog.require('goog.string'); - /** * Data source whose backing is an xml node * @@ -300,7 +299,6 @@ 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); @@ -327,7 +325,7 @@ goog.ds.XmlHttpDataSource.prototype.loadState_ = goog.ds.LoadState.NOT_LOADED; */ goog.ds.XmlHttpDataSource.prototype.load = function() { if (this.uri_) { - goog.log.info(goog.ds.logger, 'Sending XML request for DataSource ' + + goog.ds.logger.info('Sending XML request for DataSource ' + this.getDataName() + ' to ' + this.uri_); this.loadState_ = goog.ds.LoadState.LOADING; @@ -373,8 +371,7 @@ goog.ds.XmlHttpDataSource.prototype.complete_ = function(e) { * @private */ goog.ds.XmlHttpDataSource.prototype.success_ = function(xhr) { - goog.log.info(goog.ds.logger, - 'Got data for DataSource ' + this.getDataName()); + goog.ds.logger.info('Got data for DataSource ' + this.getDataName()); var xml = xhr.getResponseXml(); // Fix for case where IE returns valid XML as text but @@ -404,7 +401,7 @@ goog.ds.XmlHttpDataSource.prototype.success_ = function(xhr) { * @private */ goog.ds.XmlHttpDataSource.prototype.failure_ = function() { - goog.log.info(goog.ds.logger, 'Data retrieve failed for DataSource ' + + goog.ds.logger.info('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 1e8c1e1271a82..d855ec587ae9b 100644 --- a/third_party/closure/goog/date/date.js +++ b/third_party/closure/goog/date/date.js @@ -472,7 +472,6 @@ 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) { @@ -746,47 +745,24 @@ goog.date.Interval.prototype.add = function(interval) { * @see goog.date.DateTime */ goog.date.Date = function(opt_year, opt_month, opt_date) { - /** @protected {!Date} The wrapped date or datetime. */ - this.date; - // goog.date.DateTime assumes that only this.date is added in this ctor. + // goog.date.DateTime assumes that only this.date_ is added in this ctor. if (goog.isNumber(opt_year)) { - this.date = this.buildDate_(opt_year, opt_month || 0, opt_date || 1); + this.date_ = new Date(opt_year, opt_month || 0, opt_date || 1); this.maybeFixDst_(opt_date || 1); } else if (goog.isObject(opt_year)) { - this.date = this.buildDate_(opt_year.getFullYear(), opt_year.getMonth(), - opt_year.getDate()); + this.date_ = new Date(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} @@ -809,7 +785,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_; @@ -821,7 +797,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(); }; @@ -840,7 +816,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()); }; @@ -848,7 +824,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(); }; @@ -858,7 +834,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(); }; @@ -866,7 +842,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()); }; @@ -890,7 +866,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(); }; @@ -899,7 +875,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()); }; @@ -907,7 +883,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(); }; @@ -916,7 +892,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()); }; @@ -924,7 +900,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(); }; @@ -932,7 +908,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(); }; @@ -941,7 +917,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; }; @@ -1011,7 +987,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(); }; @@ -1046,7 +1022,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()); }; @@ -1056,7 +1032,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); }; @@ -1079,7 +1055,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); }; @@ -1089,7 +1065,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); }; @@ -1100,7 +1076,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); }; @@ -1110,7 +1086,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); }; @@ -1120,7 +1096,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); }; @@ -1130,7 +1106,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); }; @@ -1278,7 +1254,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); } }; @@ -1288,7 +1264,7 @@ goog.date.Date.prototype.maybeFixDst_ = function(expected) { * @override */ goog.date.Date.prototype.valueOf = function() { - return this.date.valueOf(); + return this.date_.valueOf(); }; @@ -1328,27 +1304,16 @@ 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. * @@ -1367,7 +1332,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(); }; @@ -1377,7 +1342,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(); }; @@ -1387,7 +1352,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(); }; @@ -1397,7 +1362,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(); }; @@ -1408,7 +1373,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()); }; @@ -1419,7 +1384,7 @@ goog.date.DateTime.prototype.getUTCDay = function() { * @override */ goog.date.DateTime.prototype.getUTCHours = function() { - return this.date.getUTCHours(); + return this.date_.getUTCHours(); }; @@ -1430,7 +1395,7 @@ goog.date.DateTime.prototype.getUTCHours = function() { * @override */ goog.date.DateTime.prototype.getUTCMinutes = function() { - return this.date.getUTCMinutes(); + return this.date_.getUTCMinutes(); }; @@ -1440,7 +1405,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(); }; @@ -1450,7 +1415,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(); }; @@ -1460,7 +1425,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); }; @@ -1470,7 +1435,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); }; @@ -1480,7 +1445,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); }; @@ -1490,7 +1455,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); }; @@ -1500,7 +1465,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); }; @@ -1510,7 +1475,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); }; @@ -1520,7 +1485,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); }; @@ -1530,7 +1495,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); }; @@ -1553,13 +1518,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); } }; @@ -1746,7 +1711,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 5ab1bfc547bd4..ac14c8e557b6e 100644 --- a/third_party/closure/goog/date/daterange.js +++ b/third_party/closure/goog/date/daterange.js @@ -34,7 +34,6 @@ 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) { /** @@ -57,7 +56,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(0, 0, 1); +goog.date.DateRange.MINIMUM_DATE = new goog.date.Date(0000, 0, 1); /** @@ -84,19 +83,7 @@ goog.date.DateRange.prototype.getEndDate = function() { /** - * 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. + * @return {goog.iter.Iterator} An iterator over the date range. */ goog.date.DateRange.prototype.iterator = function() { return new goog.date.DateRange.Iterator(this); @@ -128,7 +115,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) { @@ -142,7 +129,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 */ @@ -159,7 +146,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 */ @@ -175,7 +162,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); @@ -188,7 +175,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); @@ -200,7 +187,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) { @@ -216,7 +203,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) { @@ -234,7 +221,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) { @@ -252,7 +239,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) { @@ -272,7 +259,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) { @@ -288,7 +275,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) { @@ -306,7 +293,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) { @@ -339,7 +326,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) { @@ -395,7 +382,6 @@ 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 deleted file mode 100644 index 62ad584ab7457..0000000000000 --- a/third_party/closure/goog/date/duration.js +++ /dev/null @@ -1,153 +0,0 @@ -// 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 9485794b7d58a..27ca2cf669784 100644 --- a/third_party/closure/goog/date/relative.js +++ b/third_party/closure/goog/date/relative.js @@ -16,15 +16,9 @@ * @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'); @@ -48,8 +42,9 @@ 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 @@ -80,31 +75,6 @@ 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. @@ -158,6 +128,7 @@ 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_); @@ -169,14 +140,14 @@ goog.date.relative.format = function(dateMs) { } if (delta < 60) { // Minutes. - return goog.date.relative.formatTimeDelta_( - delta, future, goog.date.relative.Unit.MINUTES); + return goog.date.relative.getMessage_( + delta, future, goog.date.relative.Unit_.MINUTES); } else { delta = Math.floor(delta / 60); if (delta < 24) { // Hours. - return goog.date.relative.formatTimeDelta_( - delta, future, goog.date.relative.Unit.HOURS); + return goog.date.relative.getMessage_( + delta, future, goog.date.relative.Unit_.HOURS); } else { // We can be more than 24 hours apart but still only 1 day apart, so we @@ -198,8 +169,8 @@ goog.date.relative.format = function(dateMs) { // Uses days for less than 2-weeks. if (delta < 14) { - return goog.date.relative.formatTimeDelta_( - delta, future, goog.date.relative.Unit.DAYS); + return goog.date.relative.getMessage_( + delta, future, goog.date.relative.Unit_.DAYS); } else { // For messages older than 2 weeks do not show anything. The client @@ -234,14 +205,15 @@ goog.date.relative.formatPast = function(dateMs) { /** * Accepts a timestamp in milliseconds and outputs a relative day. i.e. "Today", - * "Yesterday", "Tomorrow", or "Sept 15". + * "Yesterday" 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); @@ -250,26 +222,15 @@ goog.date.relative.formatDay = function(dateMs, opt_formatter) { today.setMilliseconds(0); var yesterday = new Date(today.getTime() - goog.date.relative.DAY_MS_); - 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()) { + if (today.getTime() < dateMs) { /** @desc Today. */ var MSG_TODAY = goog.getMsg('Today'); message = MSG_TODAY; - } else if (dateMs >= yesterday.getTime() && dateMs < today.getTime()) { + } else if (yesterday.getTime() < dateMs) { /** @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)); } @@ -362,122 +323,107 @@ 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) { - var deltaFormatted = goog.i18n.DateTimeFormat.localizeNumbers(delta); - if (!future && unit == goog.date.relative.Unit.MINUTES) { + 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' : deltaFormatted}); + goog.getMsg('{$num} minute ago', {'num' : delta}); /** * @desc Relative date indicating how many minutes ago something happened * (plural). */ var MSG_MINUTES_AGO_PLURAL = - goog.getMsg('{$num} minutes ago', {'num' : deltaFormatted}); + goog.getMsg('{$num} minutes ago', {'num' : delta}); 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' : deltaFormatted}); + goog.getMsg('in {$num} minute', {'num' : delta}); /** * @desc Relative date indicating in how many minutes something happens * (plural). */ var MSG_IN_MINUTES_PLURAL = - goog.getMsg('in {$num} minutes', {'num' : deltaFormatted}); + goog.getMsg('in {$num} minutes', {'num' : delta}); 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' : deltaFormatted}); + goog.getMsg('{$num} hour ago', {'num' : delta}); /** * @desc Relative date indicating how many hours ago something happened * (plural). */ - var MSG_HOURS_AGO_PLURAL = - goog.getMsg('{$num} hours ago', {'num' : deltaFormatted}); + var MSG_HOURS_AGO_PLURAL = goog.getMsg('{$num} hours ago', {'num' : delta}); 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' : deltaFormatted}); + var MSG_IN_HOURS_SINGULAR = goog.getMsg('in {$num} hour', {'num' : delta}); /** * @desc Relative date indicating in how many hours something happens * (plural). */ - var MSG_IN_HOURS_PLURAL = - goog.getMsg('in {$num} hours', {'num' : deltaFormatted}); + var MSG_IN_HOURS_PLURAL = goog.getMsg('in {$num} hours', {'num' : delta}); 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' : deltaFormatted}); + var MSG_DAYS_AGO_SINGULAR = goog.getMsg('{$num} day ago', {'num' : delta}); /** * @desc Relative date indicating how many days ago something happened * (plural). */ - var MSG_DAYS_AGO_PLURAL = - goog.getMsg('{$num} days ago', {'num' : deltaFormatted}); + var MSG_DAYS_AGO_PLURAL = goog.getMsg('{$num} days ago', {'num' : delta}); 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' : deltaFormatted}); + var MSG_IN_DAYS_SINGULAR = goog.getMsg('in {$num} day', {'num' : delta}); /** * @desc Relative date indicating in how many days something happens * (plural). */ - var MSG_IN_DAYS_PLURAL = - goog.getMsg('in {$num} days', {'num' : deltaFormatted}); + var MSG_IN_DAYS_PLURAL = goog.getMsg('in {$num} days', {'num' : delta}); return delta == 1 ? MSG_IN_DAYS_SINGULAR : MSG_IN_DAYS_PLURAL; @@ -485,5 +431,3 @@ 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 deleted file mode 100644 index 09a697eb5e53f..0000000000000 --- a/third_party/closure/goog/date/relativewithplurals.js +++ /dev/null @@ -1,120 +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 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 0c3ca39d1ce38..b17fe6354e90b 100644 --- a/third_party/closure/goog/date/utcdatetime.js +++ b/third_party/closure/goog/date/utcdatetime.js @@ -53,22 +53,11 @@ 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. * @@ -88,7 +77,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; @@ -105,7 +94,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 d8a4da78676a3..868f9d5923710 100644 --- a/third_party/closure/goog/db/cursor.js +++ b/third_party/closure/goog/db/cursor.js @@ -34,10 +34,9 @@ goog.require('goog.events.EventTarget'); * * @constructor * @extends {goog.events.EventTarget} - * @final */ goog.db.Cursor = function() { - goog.db.Cursor.base(this, 'constructor'); + goog.base(this); }; 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 5c8d983308dec..0077c56fdffce 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 62c480554c2e1..a5c93166a3d55 100644 --- a/third_party/closure/goog/db/error.js +++ b/third_party/closure/goog/db/error.js @@ -37,7 +37,6 @@ 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; @@ -69,7 +68,7 @@ goog.db.Error = function(error, context, opt_message) { if (opt_message) { msg += ', ' + opt_message; } - goog.db.Error.base(this, 'constructor', msg); + goog.base(this, msg); }; goog.inherits(goog.db.Error, goog.debug.Error); @@ -90,11 +89,9 @@ goog.db.Error.prototype.getName = function() { * * @constructor * @extends {goog.debug.Error} - * @final */ goog.db.Error.VersionChangeBlockedError = function() { - goog.db.Error.VersionChangeBlockedError.base( - this, 'constructor', 'Version change blocked'); + goog.base(this, 'Version change blocked'); }; goog.inherits(goog.db.Error.VersionChangeBlockedError, goog.debug.Error); @@ -348,15 +345,13 @@ goog.db.Error.fromRequest = function(request, message) { */ goog.db.Error.fromException = function(ex, message) { if ('name' 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. + return new goog.db.Error(/** @type {!DOMError} */ (ex), message); + } else if ('code' in ex) { + // Chrome 22+. var errorName = goog.db.Error.getName(ex.code); - var errorMessage = message + ': ' + ex.message; return new goog.db.Error( - /** @type {!DOMError} */ ({name: errorName}), errorMessage); + /** @type {!DOMError} */ ({name: errorName}), message); } 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 7951e2498e437..59a688efb48b5 100644 --- a/third_party/closure/goog/db/index.js +++ b/third_party/closure/goog/db/index.js @@ -36,7 +36,6 @@ 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 967a682aefbf2..07aba3fe09018 100644 --- a/third_party/closure/goog/db/indexeddb.js +++ b/third_party/closure/goog/db/indexeddb.js @@ -22,8 +22,10 @@ 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'); @@ -39,10 +41,9 @@ goog.require('goog.events.EventTarget'); * @param {!IDBDatabase} db Underlying IndexedDB database object. * @constructor * @extends {goog.events.EventTarget} - * @final */ goog.db.IndexedDb = function(db) { - goog.db.IndexedDb.base(this, 'constructor'); + goog.base(this); /** * Underlying IndexedDB database object. @@ -54,7 +55,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); @@ -74,13 +75,6 @@ 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); @@ -178,7 +172,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) { @@ -280,7 +274,7 @@ goog.db.IndexedDb.prototype.createTransaction = function(storeNames, opt_mode) { /** @override */ goog.db.IndexedDb.prototype.disposeInternal = function() { - goog.db.IndexedDb.base(this, 'disposeInternal'); + goog.base(this, 'disposeInternal'); this.eventHandler_.dispose(); }; @@ -297,14 +291,6 @@ 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. */ @@ -332,11 +318,9 @@ goog.db.IndexedDb.EventType = { * updated to. * @constructor * @extends {goog.events.Event} - * @final */ goog.db.IndexedDb.VersionChangeEvent = function(oldVersion, newVersion) { - goog.db.IndexedDb.VersionChangeEvent.base( - this, 'constructor', goog.db.IndexedDb.EventType.VERSION_CHANGE); + goog.base(this, 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 d1e40991a539c..18c3995ad1be9 100644 --- a/third_party/closure/goog/db/keyrange.js +++ b/third_party/closure/goog/db/keyrange.js @@ -30,7 +30,6 @@ 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 5ff9695333a5b..2e6277a8cb80d 100644 --- a/third_party/closure/goog/db/objectstore.js +++ b/third_party/closure/goog/db/objectstore.js @@ -45,7 +45,6 @@ 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) { /** @@ -323,7 +322,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( @@ -342,7 +341,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 d9a9d381e9bed..6e5e60ffc8e1a 100644 --- a/third_party/closure/goog/db/transaction.js +++ b/third_party/closure/goog/db/transaction.js @@ -39,10 +39,9 @@ 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.db.Transaction.base(this, 'constructor'); + goog.base(this); /** * Underlying IndexedDB transaction object. @@ -63,7 +62,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); @@ -201,7 +200,7 @@ goog.db.Transaction.prototype.abort = function() { /** @override */ goog.db.Transaction.prototype.disposeInternal = function() { - goog.db.Transaction.base(this, 'disposeInternal'); + goog.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 e6e28e13c3871..d7325268ca5bc 100644 --- a/third_party/closure/goog/debug/debug.js +++ b/third_party/closure/goog/debug/debug.js @@ -52,44 +52,14 @@ goog.debug.catchErrors = function(logFunc, opt_cancel, opt_target) { !goog.userAgent.isVersionOrHigher('535.3')) { retVal = !retVal; } - - /** - * 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) { + target.onerror = function(message, url, line) { if (oldErrorHandler) { - oldErrorHandler(message, url, line, opt_col, opt_error); + oldErrorHandler(message, url, line); } logFunc({ message: message, fileName: url, - line: line, - col: opt_col, - error: opt_error + line: line }); return retVal; }; @@ -141,11 +111,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, parentSeen) { + var helper = function(obj, space) { var nestspace = space + ' '; - var seen = new goog.structs.Set(parentSeen); var indentMultiline = function(str) { return str.replace(/\n/g, '\n' + space); @@ -162,10 +132,12 @@ goog.debug.deepExpose = function(obj, opt_showFn) { } else if (goog.isFunction(obj)) { str.push(indentMultiline(String(obj))); } else if (goog.isObject(obj)) { - if (seen.contains(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. str.push('*** reference loop detected ***'); } else { - seen.add(obj); + previous.add(obj); str.push('{'); for (var x in obj) { if (!opt_showFn && goog.isFunction(obj[x])) { @@ -174,7 +146,7 @@ goog.debug.deepExpose = function(obj, opt_showFn) { str.push('\n'); str.push(nestspace); str.push(x + ' = '); - helper(obj[x], nestspace, seen); + helper(obj[x], nestspace); } str.push('\n' + space + '}'); } @@ -186,7 +158,7 @@ goog.debug.deepExpose = function(obj, opt_showFn) { } }; - helper(obj, '', new goog.structs.Set()); + helper(obj, ''); return str.join(''); }; @@ -238,7 +210,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'); @@ -277,11 +249,10 @@ 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 || - !err.message || !err.name) { + if (threwError || !err.lineNumber || !err.fileName || !err.stack) { return { - 'message': err.message || 'Not available', - 'name': err.name || 'UnknownError', + 'message': err.message, + 'name': err.name, 'lineNumber': lineNumber, 'fileName': fileName, 'stack': err.stack || 'Not available' @@ -300,24 +271,14 @@ 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; - 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; - } - + var error = typeof err == 'string' ? Error(err) : err; if (!error.stack) { - error.stack = goog.debug.getStacktrace(goog.debug.enhanceError); + error.stack = goog.debug.getStacktrace(arguments.callee.caller); } if (opt_message) { // find the first unoccupied 'messageX' property @@ -337,18 +298,8 @@ 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; @@ -386,54 +337,15 @@ 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) { - 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; + return goog.debug.getStacktraceHelper_(opt_fn || arguments.callee.caller, []); }; @@ -442,7 +354,6 @@ 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) { @@ -457,8 +368,7 @@ 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; - // Args may be null for some special functions such as host objects or eval. - for (var i = 0; args && i < args.length; i++) { + for (var i = 0; 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 aa8b192fdefaf..a7d454eca3d34 100644 --- a/third_party/closure/goog/debug/debugwindow.js +++ b/third_party/closure/goog/debug/debugwindow.js @@ -136,8 +136,9 @@ 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; /** @@ -302,7 +303,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; }; @@ -380,15 +381,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); } } }; @@ -422,12 +423,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'); @@ -437,7 +438,7 @@ goog.debug.DebugWindow.prototype.openWindow_ = function() { this.winOpening_ = false; - if (this.win) { + if (this.win_) { this.writeInitialDocument(); } }; @@ -479,7 +480,7 @@ goog.debug.DebugWindow.prototype.writeInitialDocument = function() { return; } - this.win.document.open(); + this.win_.document.open(); var html = '' + '


' + @@ -576,10 +577,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 715a6720426da..6fc206ad21862 100644 --- a/third_party/closure/goog/debug/devcss/devcss.js +++ b/third_party/closure/goog/debug/devcss/devcss.js @@ -25,9 +25,8 @@ goog.provide('goog.debug.DevCss'); goog.provide('goog.debug.DevCss.UserAgent'); -goog.require('goog.asserts'); goog.require('goog.cssom'); -goog.require('goog.dom.classlist'); +goog.require('goog.dom.classes'); goog.require('goog.events'); goog.require('goog.events.EventType'); goog.require('goog.string'); @@ -43,7 +42,6 @@ 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) { @@ -80,12 +78,6 @@ goog.debug.DevCss = function(opt_userAgent, opt_userAgentVersion) { */ this.userAgent_ = opt_userAgent; - /** - * @type {Object} - * @private - */ - this.userAgentTokens_ = {}; - /** * @type {number|string} * @private @@ -146,6 +138,13 @@ goog.debug.DevCss.prototype.activateBrowserSpecificCssRules = function( }; +/** + * @type {Object} + * @private + */ +goog.debug.DevCss.prototype.userAgentTokens_ = {}; + + /** * A list of possible user agent strings. * @enum {string} @@ -228,8 +227,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, @@ -425,7 +424,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.classlist.contains(goog.asserts.assert(el), className)) { + if (!goog.dom.classes.has(el, className)) { break; } if (k == classNamesLength - 1) { @@ -436,10 +435,8 @@ 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++) { - goog.asserts.assert(el); - if (!goog.dom.classlist.contains(el, - classNameEntry.combinedClassName)) { - goog.dom.classlist.add(el, classNameEntry.combinedClassName); + if (!goog.dom.classes.has(el, classNameEntry.combinedClassName)) { + goog.dom.classes.add(el, classNameEntry.combinedClassName); } } } diff --git a/third_party/closure/goog/debug/divconsole.js b/third_party/closure/goog/debug/divconsole.js index 3732a2f633055..c5e0efa0578a7 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 6fed470018e21..dd32fdba2d75f 100644 --- a/third_party/closure/goog/debug/error.js +++ b/third_party/closure/goog/debug/error.js @@ -33,14 +33,11 @@ goog.provide('goog.debug.Error'); */ goog.debug.Error = function(opt_msg) { - // Attempt to ensure there is a stack trace. + // Ensure there is a stack trace. if (Error.captureStackTrace) { Error.captureStackTrace(this, goog.debug.Error); } else { - var stack = new Error().stack; - if (stack) { - this.stack = stack; - } + this.stack = new Error().stack || ''; } if (opt_msg) { diff --git a/third_party/closure/goog/debug/errorhandler.js b/third_party/closure/goog/debug/errorhandler.js index 47f83415bf6e4..59b0144f5c53d 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.debug.ErrorHandler.base(this, 'constructor'); + goog.base(this); /** * 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) { - this.protectWindowFunctionsHelper_(fnName); + win[fnName] = this.protectEntryPoint(win[fnName]); } } }; /** - * 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. + * Helper function for protecting setTimeout/setInterval. + * @param {string} fnName The name of the function we're protecting. Must + * be setTimeout or setInterval. * @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.debug.ErrorHandler.base(this, 'disposeInternal'); + goog.base(this, 'disposeInternal'); }; @@ -335,13 +335,11 @@ 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.debug.ErrorHandler.ProtectedFunctionError.base( - this, 'constructor', message); + goog.base(this, 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 86ae88b2249a0..f0e3ac0c94e86 100644 --- a/third_party/closure/goog/debug/errorreporter.js +++ b/third_party/closure/goog/debug/errorreporter.js @@ -21,14 +21,13 @@ 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'); @@ -55,7 +54,7 @@ goog.require('goog.userAgent'); */ goog.debug.ErrorReporter = function( handlerUrl, opt_contextProvider, opt_noAutoProtect) { - goog.debug.ErrorReporter.base(this, 'constructor'); + goog.base(this); /** * Context provider, if one was provided. @@ -64,25 +63,6 @@ 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)=)} @@ -98,37 +78,13 @@ goog.debug.ErrorReporter = function( */ this.handlerUrl_ = handlerUrl; - 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.'); + if (!opt_noAutoProtect) { + this.setup_(); } }; 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. @@ -137,7 +93,6 @@ goog.define('goog.debug.ErrorReporter.ALLOW_AUTO_PROTECT', true); * 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); @@ -165,6 +120,15 @@ 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} @@ -176,11 +140,11 @@ goog.debug.ErrorReporter.prototype.extraHeaders_; /** * Logging object. * - * @type {goog.log.Logger} + * @type {goog.debug.Logger} * @private */ goog.debug.ErrorReporter.logger_ = - goog.log.getLogger('goog.debug.ErrorReporter'); + goog.debug.Logger.getLogger('goog.debug.ErrorReporter'); /** @@ -196,7 +160,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) { @@ -207,7 +171,7 @@ goog.debug.ErrorReporter.install = function( /** - * Default implementation of XHR sender interface. + * Default implemntation of XHR sender interface. * * @param {string} uri URI to make request to. * @param {string} method Send method. @@ -227,52 +191,16 @@ 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 = - 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_); - } - }; -} +goog.debug.ErrorReporter.prototype.protectAdditionalEntryPoint = function(fn) { + if (this.errorHandler_) { + return this.errorHandler_.protectEntryPoint(fn); + } + return null; +}; /** @@ -299,6 +227,28 @@ 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. @@ -318,8 +268,8 @@ goog.debug.ErrorReporter.prototype.handleException = function(e, try { this.contextProvider_(error, context); } catch (err) { - goog.log.error(goog.debug.ErrorReporter.logger_, - 'Context provider threw an exception: ' + err.message); + goog.debug.ErrorReporter.logger_.severe('Context provider threw an ' + + 'exception: ' + err.message); } } // Truncate message to a reasonable length, since it will be sent in the URL. @@ -353,30 +303,19 @@ 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[this.contextPrefix_ + entry] = opt_context[entry]; + queryMap['context.' + 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) { @@ -386,44 +325,13 @@ goog.debug.ErrorReporter.prototype.sendErrorReport = 'line:', line, '\n', 'error:', message, '\n', 'trace:', opt_trace); - goog.log.info(goog.debug.ErrorReporter.logger_, logMessage); + goog.debug.ErrorReporter.logger_.info(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() { - if (goog.debug.ErrorReporter.ALLOW_AUTO_PROTECT) { - goog.dispose(this.errorHandler_); - } - goog.debug.ErrorReporter.base(this, 'disposeInternal'); + goog.dispose(this.errorHandler_); + goog.base(this, 'disposeInternal'); }; diff --git a/third_party/closure/goog/debug/fancywindow.js b/third_party/closure/goog/debug/fancywindow.js index 54d3324632e46..46e7a7c13a904 100644 --- a/third_party/closure/goog/debug/fancywindow.js +++ b/third_party/closure/goog/debug/fancywindow.js @@ -26,13 +26,10 @@ 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'); @@ -50,7 +47,7 @@ goog.require('goog.userAgent'); */ goog.debug.FancyWindow = function(opt_identifier, opt_prefix) { this.readOptionsFromLocalStorage_(); - goog.debug.FancyWindow.base(this, 'constructor', opt_identifier, opt_prefix); + goog.base(this, opt_identifier, opt_prefix); }; goog.inherits(goog.debug.FancyWindow, goog.debug.DebugWindow); @@ -106,12 +103,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 @@ -138,16 +135,16 @@ goog.debug.FancyWindow.prototype.writeInitialDocument = function() { */ goog.debug.FancyWindow.prototype.openOptions_ = function() { var el = this.dh_.getElement('optionsarea'); - goog.dom.safe.setInnerHtml(el, goog.html.SafeHtml.EMPTY); + el.innerHTML = ''; var loggers = goog.debug.FancyWindow.getLoggers_(); var dh = this.dh_; for (var i = 0; i < loggers.length; i++) { - var logger = loggers[i]; + var logger = goog.debug.Logger.getLogger(loggers[i]); var curlevel = logger.getLevel() ? logger.getLevel().name : 'INHERIT'; var div = dh.createDom('div', {}, - this.getDropDown_('sel' + logger.getName(), curlevel), - dh.createDom('span', {}, logger.getName() || '(root)')); + this.getDropDown_('sel' + loggers[i], curlevel), + dh.createDom('span', {}, loggers[i] || '(root)')); el.appendChild(div); } @@ -191,8 +188,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 = loggers[i]; - var sel = dh.getElement('sel' + logger.getName()); + var logger = goog.debug.Logger.getLogger(loggers[i]); + var sel = dh.getElement('sel' + loggers[i]); var level = sel.options[sel.selectedIndex].text; if (level == 'INHERIT') { logger.setLevel(null); @@ -206,7 +203,7 @@ goog.debug.FancyWindow.prototype.closeOptions_ = function() { /** - * Resizes the log elements + * Resize the lof elements * @private */ goog.debug.FancyWindow.prototype.resizeStuff_ = function() { @@ -227,15 +224,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.debug.FancyWindow.base(this, 'getStyleRules') + + return goog.base(this, 'getStyleRules') + 'html,body{height:100%;width:100%;margin:0px;padding:0px;' + 'background-color:#FFF;overflow:hidden}' + '*{}' + @@ -298,8 +295,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].getName(); - var level = loggers[i].getLevel(); + var key = goog.debug.FancyWindow.LOCAL_STORE_PREFIX + loggers[i]; + var level = goog.debug.Logger.getLogger(loggers[i]).getLevel(); if (key in storedKeys) { if (!level) { window.localStorage.removeItem(key); @@ -324,7 +321,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.LogManager.getLogger(loggerName); + var logger = goog.debug.Logger.getLogger(loggerName); var curLevel = logger.getLevel(); var storedLevel = window.localStorage.getItem(key).toString(); if (!curLevel || curLevel.toString() != storedLevel) { @@ -337,7 +334,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() { @@ -354,21 +351,12 @@ goog.debug.FancyWindow.getStoredKeys_ = function() { /** - * Gets a sorted array of all the loggers registered. - * @return {!Array.} Array of logger instances. + * Gets a sorted array of all the loggers registered + * @return {Array} Array of logger idents, e.g. goog.net.XhrIo. * @private */ goog.debug.FancyWindow.getLoggers_ = function() { - 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); + var loggers = goog.object.getKeys(goog.debug.LogManager.getLoggers()); + loggers.sort(); return loggers; }; diff --git a/third_party/closure/goog/debug/formatter.js b/third_party/closure/goog/debug/formatter.js index 0744a630a5a92..c2fc5eb4532a1 100644 --- a/third_party/closure/goog/debug/formatter.js +++ b/third_party/closure/goog/debug/formatter.js @@ -48,13 +48,6 @@ 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} @@ -271,10 +264,7 @@ goog.debug.HtmlFormatter.prototype.formatRecord = function(logRecord) { goog.string.newLineToBr(goog.string.whitespaceEscape( logRecord.getExceptionText() || ''))); } - sb.push(''); - if (this.appendNewline) { - sb.push('
'); - } + sb.push('
'); return sb.join(''); }; @@ -287,7 +277,6 @@ 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); @@ -319,12 +308,9 @@ goog.debug.TextFormatter.prototype.formatRecord = function(logRecord) { if (this.showSeverityLevel) { sb.push('[', logRecord.getLevel().name, '] '); } - sb.push(logRecord.getMessage()); + sb.push(logRecord.getMessage(), '\n'); if (this.showExceptionText && logRecord.getException()) { - sb.push('\n', logRecord.getExceptionText()); - } - if (this.appendNewline) { - sb.push('\n'); + sb.push(logRecord.getExceptionText(), '\n'); } return sb.join(''); }; diff --git a/third_party/closure/goog/debug/fpsdisplay.js b/third_party/closure/goog/debug/fpsdisplay.js index f9fa6047c0edb..b5264c5584c33 100644 --- a/third_party/closure/goog/debug/fpsdisplay.js +++ b/third_party/closure/goog/debug/fpsdisplay.js @@ -35,10 +35,9 @@ 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.debug.FpsDisplay.base(this, 'constructor', opt_domHelper); + goog.base(this, opt_domHelper); }; goog.inherits(goog.debug.FpsDisplay, goog.ui.Component); @@ -72,7 +71,7 @@ goog.debug.FpsDisplay.prototype.createDom = function() { /** @override */ goog.debug.FpsDisplay.prototype.enterDocument = function() { - goog.debug.FpsDisplay.base(this, 'enterDocument'); + goog.base(this, 'enterDocument'); this.animation_ = new goog.debug.FpsDisplay.FpsAnimation_(this.getElement()); this.delay_ = new goog.async.AnimationDelay( this.handleDelay_, this.getDomHelper().getWindow(), this); @@ -94,7 +93,7 @@ goog.debug.FpsDisplay.prototype.handleDelay_ = function(now) { /** @override */ goog.debug.FpsDisplay.prototype.exitDocument = function() { - goog.debug.FpsDisplay.base(this, 'exitDocument'); + goog.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 5e5ba9a9ed871..9d46254764339 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_); } } - goog.log.info(this.logger_, 'Installed L2 native helper'); + this.logger_.info('Installed L2 native helper'); } catch (e) { - goog.log.info(this.logger_, 'Failed to install L2 native helper: ' + e); + this.logger_.info('Failed to install L2 native helper: ' + e); } } }; @@ -75,11 +75,11 @@ goog.debug.GcDiagnostics_.prototype.install = function() { /** * Logger for the gcDiagnotics - * @type {goog.log.Logger} + * @type {goog.debug.Logger} * @private */ goog.debug.GcDiagnostics_.prototype.logger_ = - goog.log.getLogger('goog.debug.GcDiagnostics'); + goog.debug.Logger.getLogger('goog.debug.GcDiagnostics'); /** @@ -107,8 +107,8 @@ goog.debug.GcDiagnostics_.prototype.stop = function() { this.gcTracer_['endGcTracing'](); var numGCs = gcTracer['getNumTraces'](); - goog.log.info(this.logger_, '*********GC TRACE*********'); - goog.log.info(this.logger_, 'GC ran ' + numGCs + ' times.'); + this.logger_.info('*********GC TRACE*********'); + this.logger_.info('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); } - goog.log.info(this.logger_, s); + this.logger_.info(s); totalTime += msElapsed; } if (goog.debug.Trace) { goog.debug.Trace.addComment('Total GC time was ' + totalTime + ' ms.'); } - goog.log.info(this.logger_, 'Total GC time was ' + totalTime + ' ms.'); - goog.log.info(this.logger_, '*********GC TRACE*********'); + this.logger_.info('Total GC time was ' + totalTime + ' ms.'); + this.logger_.info('*********GC TRACE*********'); } }; diff --git a/third_party/closure/goog/debug/logbuffer.js b/third_party/closure/goog/debug/logbuffer.js index d2ded20df3718..644b5d98f03d7 100644 --- a/third_party/closure/goog/debug/logbuffer.js +++ b/third_party/closure/goog/debug/logbuffer.js @@ -32,7 +32,6 @@ 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 5e52443738546..61aeb180e81a3 100644 --- a/third_party/closure/goog/debug/logger.js +++ b/third_party/closure/goog/debug/logger.js @@ -21,7 +21,6 @@ */ goog.provide('goog.debug.LogManager'); -goog.provide('goog.debug.Loggable'); goog.provide('goog.debug.Logger'); goog.provide('goog.debug.Logger.Level'); @@ -32,18 +31,6 @@ 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 @@ -60,41 +47,49 @@ goog.debug.Loggable; * * @constructor * @param {string} name The name of the Logger. - * @final */ goog.debug.Logger = function(name) { /** * Name of the Logger. Generally a dot-separated namespace - * @private {string} + * @type {string} + * @private */ this.name_ = name; +}; - /** - * Parent Logger. - * @private {goog.debug.Logger} - */ - this.parent_ = null; - /** - * Level that this logger only filters above. Null indicates it should - * inherit from the parent. - * @private {goog.debug.Logger.Level} - */ - this.level_ = null; +/** + * Parent Logger. + * @type {goog.debug.Logger} + * @private + */ +goog.debug.Logger.prototype.parent_ = 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. - * @private {Array.} - */ - this.handlers_ = 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; + + +/** + * 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; + + +/** + * Handlers that are listening to this logger. + * @type {Array.} + * @private + */ +goog.debug.Logger.prototype.handlers_ = null; /** @@ -148,7 +143,6 @@ 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) { /** @@ -346,7 +340,6 @@ 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); @@ -528,20 +521,14 @@ 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 {goog.debug.Loggable} msg The message to log. + * @param {string} msg The string message. * @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)) { - // 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)); + this.doLogRecord_(this.getLogRecord(level, msg, opt_exception)); } }; @@ -552,13 +539,9 @@ 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, opt_fnStackContext) { +goog.debug.Logger.prototype.getLogRecord = function(level, msg, opt_exception) { if (goog.debug.LogBuffer.isBufferingEnabled()) { var logRecord = goog.debug.LogBuffer.getInstance().addRecord(level, msg, this.name_); @@ -566,17 +549,9 @@ goog.debug.Logger.prototype.getLogRecord = function( 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, - opt_fnStackContext || goog.debug.Logger.prototype.getLogRecord)); + goog.debug.exposeException(opt_exception, arguments.callee.caller)); } return logRecord; }; @@ -586,7 +561,7 @@ goog.debug.Logger.prototype.getLogRecord = function( * 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 {goog.debug.Loggable} msg The message to log. + * @param {string} msg The string message. * @param {Error=} opt_exception An exception associated with the message. */ goog.debug.Logger.prototype.shout = function(msg, opt_exception) { @@ -600,7 +575,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 {goog.debug.Loggable} msg The message to log. + * @param {string} msg The string message. * @param {Error=} opt_exception An exception associated with the message. */ goog.debug.Logger.prototype.severe = function(msg, opt_exception) { @@ -614,7 +589,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 {goog.debug.Loggable} msg The message to log. + * @param {string} msg The string message. * @param {Error=} opt_exception An exception associated with the message. */ goog.debug.Logger.prototype.warning = function(msg, opt_exception) { @@ -628,7 +603,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 {goog.debug.Loggable} msg The message to log. + * @param {string} msg The string message. * @param {Error=} opt_exception An exception associated with the message. */ goog.debug.Logger.prototype.info = function(msg, opt_exception) { @@ -642,7 +617,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 {goog.debug.Loggable} msg The message to log. + * @param {string} msg The string message. * @param {Error=} opt_exception An exception associated with the message. */ goog.debug.Logger.prototype.config = function(msg, opt_exception) { @@ -656,7 +631,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 {goog.debug.Loggable} msg The message to log. + * @param {string} msg The string message. * @param {Error=} opt_exception An exception associated with the message. */ goog.debug.Logger.prototype.fine = function(msg, opt_exception) { @@ -670,7 +645,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 {goog.debug.Loggable} msg The message to log. + * @param {string} msg The string message. * @param {Error=} opt_exception An exception associated with the message. */ goog.debug.Logger.prototype.finer = function(msg, opt_exception) { @@ -684,7 +659,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 {goog.debug.Loggable} msg The message to log. + * @param {string} msg The string message. * @param {Error=} opt_exception An exception associated with the message. */ goog.debug.Logger.prototype.finest = function(msg, opt_exception) { @@ -774,7 +749,7 @@ goog.debug.LogManager = {}; /** * Map of logger names to logger objects. * - * @type {!Object.} + * @type {!Object} * @private */ goog.debug.LogManager.loggers_ = {}; @@ -802,8 +777,7 @@ 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 161b5e7b6c56d..e387bed1abec8 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 120114748170e..065a4c4fe2536 100644 --- a/third_party/closure/goog/debug/relativetimeprovider.js +++ b/third_party/closure/goog/debug/relativetimeprovider.js @@ -30,7 +30,6 @@ 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 7f68b89d5b957..ca3e92d706e99 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.tracing.Tracer. + * See com.google.common.base.Tracer. * @constructor * @private */ @@ -153,11 +153,11 @@ goog.debug.Trace_ = function() { /** * Logger for the tracer - * @type {goog.log.Logger} + * @type {goog.debug.Logger} * @private */ goog.debug.Trace_.prototype.logger_ = - goog.log.getLogger('goog.debug.Trace'); + goog.debug.Logger.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) { - goog.log.warning(this.logger_, - 'Giant thread trace. Clearing to avoid memory leak.'); + this.logger_.warning('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 new file mode 100644 index 0000000000000..290febd79a5d4 --- /dev/null +++ b/third_party/closure/goog/demos/advancedtooltip.html @@ -0,0 +1,78 @@ + + + + + goog.ui.AdvancedTooltip + + + + + + + +

goog.ui.AdvancedTooltip

+ + +

+ +

+ + + + diff --git a/third_party/closure/goog/demos/animationqueue.html b/third_party/closure/goog/demos/animationqueue.html new file mode 100644 index 0000000000000..451836abbd027 --- /dev/null +++ b/third_party/closure/goog/demos/animationqueue.html @@ -0,0 +1,149 @@ + + + + + + + + + + + + +
+
+
+
+
+ + + + + + diff --git a/third_party/closure/goog/demos/autocomplete-basic.html b/third_party/closure/goog/demos/autocomplete-basic.html new file mode 100644 index 0000000000000..c407185a555c1 --- /dev/null +++ b/third_party/closure/goog/demos/autocomplete-basic.html @@ -0,0 +1,56 @@ + + + + + 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 new file mode 100644 index 0000000000000..710c208fe6b24 --- /dev/null +++ b/third_party/closure/goog/demos/autocompleteremote.html @@ -0,0 +1,40 @@ + + + + + + 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 new file mode 100644 index 0000000000000..2dd469bcfbe76 --- /dev/null +++ b/third_party/closure/goog/demos/autocompleterichremote.html @@ -0,0 +1,137 @@ + + + + + + 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 new file mode 100644 index 0000000000000..7cafe51de14a9 --- /dev/null +++ b/third_party/closure/goog/demos/bidiinput.html @@ -0,0 +1,72 @@ + + + + + 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 new file mode 100644 index 0000000000000..2403f82652edb --- /dev/null +++ b/third_party/closure/goog/demos/blobhasher.html @@ -0,0 +1,61 @@ + + + + +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 new file mode 100644 index 0000000000000..e10bb0e3fd883 --- /dev/null +++ b/third_party/closure/goog/demos/bubble.html @@ -0,0 +1,250 @@ + + + + + + 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 new file mode 100644 index 0000000000000..8cb1fd1906856 --- /dev/null +++ b/third_party/closure/goog/demos/button.html @@ -0,0 +1,395 @@ + + + + + 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 new file mode 100644 index 0000000000000..a37c32148f261 --- /dev/null +++ b/third_party/closure/goog/demos/charcounter.html @@ -0,0 +1,57 @@ + + + + + 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 new file mode 100644 index 0000000000000..7c769c8d02d60 --- /dev/null +++ b/third_party/closure/goog/demos/charpicker.html @@ -0,0 +1,66 @@ + + + + + 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 new file mode 100644 index 0000000000000..56ce9c30c409e --- /dev/null +++ b/third_party/closure/goog/demos/checkbox.html @@ -0,0 +1,122 @@ + + + + + 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 new file mode 100644 index 0000000000000..58eeac78843e0 --- /dev/null +++ b/third_party/closure/goog/demos/color-contrast.html @@ -0,0 +1,60 @@ + + + + + + + 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 new file mode 100644 index 0000000000000..5b1f394fda849 --- /dev/null +++ b/third_party/closure/goog/demos/colormenubutton.html @@ -0,0 +1,221 @@ + + + + + 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 new file mode 100644 index 0000000000000..0d3812eb2e385 --- /dev/null +++ b/third_party/closure/goog/demos/colorpicker.html @@ -0,0 +1,43 @@ + + + + + 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 new file mode 100644 index 0000000000000..d336b6ee27c89 --- /dev/null +++ b/third_party/closure/goog/demos/combobox.html @@ -0,0 +1,160 @@ + + + + + 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 new file mode 100644 index 0000000000000..d75bbe85ff3eb --- /dev/null +++ b/third_party/closure/goog/demos/container.html @@ -0,0 +1,670 @@ + + + + + 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 new file mode 100644 index 0000000000000..39b31a3c33804 --- /dev/null +++ b/third_party/closure/goog/demos/control.html @@ -0,0 +1,477 @@ + + + + + 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 new file mode 100644 index 0000000000000..e58bc60594f58 --- /dev/null +++ b/third_party/closure/goog/demos/css3button.html @@ -0,0 +1,166 @@ + + + + + + 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 new file mode 100644 index 0000000000000..0fd2c5863d17c --- /dev/null +++ b/third_party/closure/goog/demos/css3menubutton.html @@ -0,0 +1,285 @@ + + + + + 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 new file mode 100644 index 0000000000000..5d46ab49242f3 --- /dev/null +++ b/third_party/closure/goog/demos/cssspriteanimation.html @@ -0,0 +1,80 @@ + + + + +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 new file mode 100644 index 0000000000000..6ed69a20d1586 --- /dev/null +++ b/third_party/closure/goog/demos/datepicker.html @@ -0,0 +1,183 @@ + + + + + + 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 new file mode 100644 index 0000000000000..82cdab8dc6785 --- /dev/null +++ b/third_party/closure/goog/demos/debug.html @@ -0,0 +1,119 @@ + + + + +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 new file mode 100644 index 0000000000000..a1f596204c092 --- /dev/null +++ b/third_party/closure/goog/demos/depsgraph.html @@ -0,0 +1,220 @@ + + + + +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 new file mode 100644 index 0000000000000..47576c026f29a --- /dev/null +++ b/third_party/closure/goog/demos/dialog.html @@ -0,0 +1,156 @@ + + + + + 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 new file mode 100644 index 0000000000000..baf013b52aeed --- /dev/null +++ b/third_party/closure/goog/demos/dimensionpicker.html @@ -0,0 +1,108 @@ + + + + + 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 new file mode 100644 index 0000000000000..c6e9718ecd7ad --- /dev/null +++ b/third_party/closure/goog/demos/dimensionpicker_rtl.html @@ -0,0 +1,123 @@ + + + + + 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 new file mode 100644 index 0000000000000..51cdd7400d1b6 --- /dev/null +++ b/third_party/closure/goog/demos/dom_selection.html @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ + + + + + diff --git a/third_party/closure/goog/demos/drag.html b/third_party/closure/goog/demos/drag.html new file mode 100644 index 0000000000000..8d4b5499ec4d9 --- /dev/null +++ b/third_party/closure/goog/demos/drag.html @@ -0,0 +1,191 @@ + + + + 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 new file mode 100644 index 0000000000000..725c8f1da4e33 --- /dev/null +++ b/third_party/closure/goog/demos/dragdrop.html @@ -0,0 +1,263 @@ + + + + + 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 new file mode 100644 index 0000000000000..6787c0bc33999 --- /dev/null +++ b/third_party/closure/goog/demos/dragdropdetector.html @@ -0,0 +1,46 @@ + + + + + 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 new file mode 100644 index 0000000000000..fe09b48ebeb0a --- /dev/null +++ b/third_party/closure/goog/demos/dragdropdetector_target.html @@ -0,0 +1,17 @@ + + + + + + + diff --git a/third_party/closure/goog/demos/dragger.html b/third_party/closure/goog/demos/dragger.html new file mode 100644 index 0000000000000..90eb4d1819bcf --- /dev/null +++ b/third_party/closure/goog/demos/dragger.html @@ -0,0 +1,83 @@ + + + + +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 new file mode 100644 index 0000000000000..7ac573378214b --- /dev/null +++ b/third_party/closure/goog/demos/draglistgroup.html @@ -0,0 +1,273 @@ + + + + + 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 new file mode 100644 index 0000000000000..8d54a4da2225f --- /dev/null +++ b/third_party/closure/goog/demos/dragscrollsupport.html @@ -0,0 +1,133 @@ + + + + + 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 new file mode 100644 index 0000000000000..cc8d87a1c9205 --- /dev/null +++ b/third_party/closure/goog/demos/drilldownrow.html @@ -0,0 +1,78 @@ + + + + +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 new file mode 100644 index 0000000000000..24aba99e12d5f --- /dev/null +++ b/third_party/closure/goog/demos/editor/editor.html @@ -0,0 +1,139 @@ + + + + + + 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 new file mode 100644 index 0000000000000..8b78f59e35545 --- /dev/null +++ b/third_party/closure/goog/demos/editor/equationeditor.html @@ -0,0 +1,36 @@ + + + + +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 5cde22facc52a..87ae7bd8c6c0f 100644 --- a/third_party/closure/goog/demos/editor/equationeditor.js +++ b/third_party/closure/goog/demos/editor/equationeditor.js @@ -24,7 +24,6 @@ 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 new file mode 100644 index 0000000000000..69a46dc34354a --- /dev/null +++ b/third_party/closure/goog/demos/editor/field_basic.html @@ -0,0 +1,74 @@ + + + + + + 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 new file mode 100644 index 0000000000000..6ce5d99b16f3e --- /dev/null +++ b/third_party/closure/goog/demos/editor/helloworld.html @@ -0,0 +1,91 @@ + + + + + + + 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 4b2f0c7a5ed11..63b265870e016 100644 --- a/third_party/closure/goog/demos/editor/helloworld.js +++ b/third_party/closure/goog/demos/editor/helloworld.js @@ -33,7 +33,6 @@ 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 5ab271e161426..5efb7a8f6bf20 100644 --- a/third_party/closure/goog/demos/editor/helloworlddialog.js +++ b/third_party/closure/goog/demos/editor/helloworlddialog.js @@ -36,7 +36,6 @@ 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); @@ -54,7 +53,6 @@ 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 56a65b67ad045..d7efc17b816d4 100644 --- a/third_party/closure/goog/demos/editor/helloworlddialogplugin.js +++ b/third_party/closure/goog/demos/editor/helloworlddialogplugin.js @@ -36,7 +36,6 @@ 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 new file mode 100644 index 0000000000000..64265dfd142d5 --- /dev/null +++ b/third_party/closure/goog/demos/editor/seamlessfield.html @@ -0,0 +1,106 @@ + + + + + + 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 new file mode 100644 index 0000000000000..517679155632c --- /dev/null +++ b/third_party/closure/goog/demos/editor/tableeditor.html @@ -0,0 +1,93 @@ + + + + + + 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 new file mode 100644 index 0000000000000..a9de5fee6828f --- /dev/null +++ b/third_party/closure/goog/demos/effects.html @@ -0,0 +1,162 @@ + + + + + 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 new file mode 100644 index 0000000000000..47eac153afad2 --- /dev/null +++ b/third_party/closure/goog/demos/event-propagation.html @@ -0,0 +1,192 @@ + + + + +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 new file mode 100644 index 0000000000000..02f817365ab12 --- /dev/null +++ b/third_party/closure/goog/demos/events.html @@ -0,0 +1,99 @@ + + + + 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 new file mode 100644 index 0000000000000..b26250e385a8f --- /dev/null +++ b/third_party/closure/goog/demos/eventtarget.html @@ -0,0 +1,70 @@ + + + + Event Test + + + + + + + + diff --git a/third_party/closure/goog/demos/filedrophandler.html b/third_party/closure/goog/demos/filedrophandler.html new file mode 100644 index 0000000000000..e6a330dc3eceb --- /dev/null +++ b/third_party/closure/goog/demos/filedrophandler.html @@ -0,0 +1,65 @@ + + + + + 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 new file mode 100644 index 0000000000000..b07a58b946a24 --- /dev/null +++ b/third_party/closure/goog/demos/filteredmenu.html @@ -0,0 +1,118 @@ + + + + +goog.ui.FilteredMenu + + + + + + + + + + + + + + + + + + + diff --git a/third_party/closure/goog/demos/focushandler.html b/third_party/closure/goog/demos/focushandler.html new file mode 100644 index 0000000000000..b29bc100bfc97 --- /dev/null +++ b/third_party/closure/goog/demos/focushandler.html @@ -0,0 +1,58 @@ + + + + +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 new file mode 100644 index 0000000000000..65f9c5015ce27 --- /dev/null +++ b/third_party/closure/goog/demos/fpsdisplay.html @@ -0,0 +1,50 @@ + + + + +FPS Display + + + + +

+ + + +
+ + + diff --git a/third_party/closure/goog/demos/fx/css3/transition.html b/third_party/closure/goog/demos/fx/css3/transition.html new file mode 100644 index 0000000000000..ae4eb0a4c0d30 --- /dev/null +++ b/third_party/closure/goog/demos/fx/css3/transition.html @@ -0,0 +1,222 @@ + + + + + +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 new file mode 100644 index 0000000000000..cc7ac08fc3ea1 --- /dev/null +++ b/third_party/closure/goog/demos/gauge.html @@ -0,0 +1,158 @@ + + + + + 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 new file mode 100644 index 0000000000000..6274fda217508 --- /dev/null +++ b/third_party/closure/goog/demos/graphics/advancedcoordinates.html @@ -0,0 +1,141 @@ + + + + + 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 new file mode 100644 index 0000000000000..f05323fe039d2 --- /dev/null +++ b/third_party/closure/goog/demos/graphics/advancedcoordinates2.html @@ -0,0 +1,130 @@ + + + + + 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 new file mode 100644 index 0000000000000..d55645af1c672 --- /dev/null +++ b/third_party/closure/goog/demos/graphics/basicelements.html @@ -0,0 +1,264 @@ + + + + + + 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 new file mode 100644 index 0000000000000..b3310fd2c5fe8 --- /dev/null +++ b/third_party/closure/goog/demos/graphics/events.html @@ -0,0 +1,113 @@ + + + + + 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 new file mode 100644 index 0000000000000..1d21c583ba61e --- /dev/null +++ b/third_party/closure/goog/demos/graphics/modifyelements.html @@ -0,0 +1,195 @@ + + + + + + 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 new file mode 100644 index 0000000000000..947eae282049d --- /dev/null +++ b/third_party/closure/goog/demos/graphics/subpixel.html @@ -0,0 +1,80 @@ + + + + +Sub pixel rendering + + + + + + + + diff --git a/third_party/closure/goog/demos/graphics/tiger.html b/third_party/closure/goog/demos/graphics/tiger.html new file mode 100644 index 0000000000000..64deebcdde287 --- /dev/null +++ b/third_party/closure/goog/demos/graphics/tiger.html @@ -0,0 +1,105 @@ + + + + +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 new file mode 100644 index 0000000000000..f6e38d0b2fb7d --- /dev/null +++ b/third_party/closure/goog/demos/history1.html @@ -0,0 +1,132 @@ + + + + + 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 new file mode 100644 index 0000000000000..fd010d191e567 --- /dev/null +++ b/third_party/closure/goog/demos/history2.html @@ -0,0 +1,119 @@ + + + + + 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 new file mode 100644 index 0000000000000..d1466f80f9800 --- /dev/null +++ b/third_party/closure/goog/demos/history3.html @@ -0,0 +1,116 @@ + + + + +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 new file mode 100644 index 0000000000000..a575a047306db --- /dev/null +++ b/third_party/closure/goog/demos/history3js.html @@ -0,0 +1,48 @@ + + + + +History Demo JavaScript Page + + + + + + + diff --git a/third_party/closure/goog/demos/history_blank.html b/third_party/closure/goog/demos/history_blank.html new file mode 100644 index 0000000000000..189d905626cf0 --- /dev/null +++ b/third_party/closure/goog/demos/history_blank.html @@ -0,0 +1,26 @@ + + + +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 new file mode 100644 index 0000000000000..8284921595c31 --- /dev/null +++ b/third_party/closure/goog/demos/hovercard.html @@ -0,0 +1,177 @@ + + + + + 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 new file mode 100644 index 0000000000000..ec60c75d568ad --- /dev/null +++ b/third_party/closure/goog/demos/hsvapalette.html @@ -0,0 +1,55 @@ + + + + + + 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 new file mode 100644 index 0000000000000..2717ed18e57cf --- /dev/null +++ b/third_party/closure/goog/demos/hsvpalette.html @@ -0,0 +1,56 @@ + + + + + + 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 new file mode 100644 index 0000000000000..b88684620531b --- /dev/null +++ b/third_party/closure/goog/demos/html5history.html @@ -0,0 +1,87 @@ + + + + + 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 new file mode 100644 index 0000000000000..fc6d5a68d7f2d --- /dev/null +++ b/third_party/closure/goog/demos/imagelessbutton.html @@ -0,0 +1,221 @@ + + + + + + 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 new file mode 100644 index 0000000000000..e47b3225783eb --- /dev/null +++ b/third_party/closure/goog/demos/imagelessmenubutton.html @@ -0,0 +1,285 @@ + + + + + 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 new file mode 100644 index 0000000000000..056c893803949 --- /dev/null +++ b/third_party/closure/goog/demos/index.html @@ -0,0 +1,20 @@ + + + + + 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 new file mode 100644 index 0000000000000..1002554e07054 --- /dev/null +++ b/third_party/closure/goog/demos/index_nav.html @@ -0,0 +1,255 @@ + + + + + Closure Demos + + + + + + + +

Index

+
+ + + diff --git a/third_party/closure/goog/demos/index_splash.html b/third_party/closure/goog/demos/index_splash.html new file mode 100644 index 0000000000000..86397df9b828e --- /dev/null +++ b/third_party/closure/goog/demos/index_splash.html @@ -0,0 +1,27 @@ + + + + + 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 new file mode 100644 index 0000000000000..75202b8148d47 --- /dev/null +++ b/third_party/closure/goog/demos/inline_block_quirks.html @@ -0,0 +1,125 @@ + + + + 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 new file mode 100644 index 0000000000000..5f4304893fb84 --- /dev/null +++ b/third_party/closure/goog/demos/inline_block_standards.html @@ -0,0 +1,126 @@ + + + + + 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 new file mode 100644 index 0000000000000..1e6c25fe012e2 --- /dev/null +++ b/third_party/closure/goog/demos/inputdatepicker.html @@ -0,0 +1,60 @@ + + + + + goog.ui.InputDatePicker + + + + + + + + +

goog.ui.InputDatePicker

+ +
+ +
+
+ +
+
+ + +
+ + + diff --git a/third_party/closure/goog/demos/inputhandler.html b/third_party/closure/goog/demos/inputhandler.html new file mode 100644 index 0000000000000..dca7d2c4b623d --- /dev/null +++ b/third_party/closure/goog/demos/inputhandler.html @@ -0,0 +1,88 @@ + + + + +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 new file mode 100644 index 0000000000000..369d7483f3bb7 --- /dev/null +++ b/third_party/closure/goog/demos/jsonprettyprinter.html @@ -0,0 +1,80 @@ + + + + +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 new file mode 100644 index 0000000000000..2baec7b813b1a --- /dev/null +++ b/third_party/closure/goog/demos/keyboardshortcuts.html @@ -0,0 +1,112 @@ + + + + + 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 new file mode 100644 index 0000000000000..004bb9ece7583 --- /dev/null +++ b/third_party/closure/goog/demos/keyhandler.html @@ -0,0 +1,119 @@ + + + + +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 new file mode 100644 index 0000000000000..a760b667f1129 --- /dev/null +++ b/third_party/closure/goog/demos/labelinput.html @@ -0,0 +1,42 @@ + + + + + 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 new file mode 100644 index 0000000000000..1fbc722c9ad45 --- /dev/null +++ b/third_party/closure/goog/demos/menu.html @@ -0,0 +1,220 @@ + + + + + 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 new file mode 100644 index 0000000000000..369603258d737 --- /dev/null +++ b/third_party/closure/goog/demos/menubar.html @@ -0,0 +1,211 @@ + + + + + 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 new file mode 100644 index 0000000000000..bfb685da16ece --- /dev/null +++ b/third_party/closure/goog/demos/menubutton.html @@ -0,0 +1,380 @@ + + + + + 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 new file mode 100644 index 0000000000000..7f01363922abd --- /dev/null +++ b/third_party/closure/goog/demos/menubutton_frame.html @@ -0,0 +1,27 @@ + + + + + goog.ui.MenuButton Positioning Frame Demo + + + + + + + + + + + + diff --git a/third_party/closure/goog/demos/menuitem.html b/third_party/closure/goog/demos/menuitem.html new file mode 100644 index 0000000000000..77c50fb624b8b --- /dev/null +++ b/third_party/closure/goog/demos/menuitem.html @@ -0,0 +1,164 @@ + + + + + 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 new file mode 100644 index 0000000000000..ebbc6c42124e5 --- /dev/null +++ b/third_party/closure/goog/demos/mousewheelhandler.html @@ -0,0 +1,109 @@ + + + + +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 new file mode 100644 index 0000000000000..0420604e4293d --- /dev/null +++ b/third_party/closure/goog/demos/offline.html @@ -0,0 +1,268 @@ + + + + + + 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 new file mode 100644 index 0000000000000..21bbcb5c6d11e --- /dev/null +++ b/third_party/closure/goog/demos/onlinehandler.html @@ -0,0 +1,79 @@ + + + + + +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 new file mode 100644 index 0000000000000..44b3f086c82db --- /dev/null +++ b/third_party/closure/goog/demos/palette.html @@ -0,0 +1,302 @@ + + + + + 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 new file mode 100644 index 0000000000000..252ee314fb3e7 --- /dev/null +++ b/third_party/closure/goog/demos/pastehandler.html @@ -0,0 +1,54 @@ + + + + + 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 new file mode 100644 index 0000000000000..c0fb397b61b8b --- /dev/null +++ b/third_party/closure/goog/demos/pixeldensitymonitor.html @@ -0,0 +1,51 @@ + + + + + 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 new file mode 100644 index 0000000000000..21ec0498c1291 --- /dev/null +++ b/third_party/closure/goog/demos/plaintextspellchecker.html @@ -0,0 +1,106 @@ + + + + +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 new file mode 100644 index 0000000000000..91d286cdd59a8 --- /dev/null +++ b/third_party/closure/goog/demos/popup.html @@ -0,0 +1,206 @@ + + + + + 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 new file mode 100644 index 0000000000000..a52d8207e29f8 --- /dev/null +++ b/third_party/closure/goog/demos/popupcolorpicker.html @@ -0,0 +1,49 @@ + + + + + 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 new file mode 100644 index 0000000000000..f83ea400b1cdc --- /dev/null +++ b/third_party/closure/goog/demos/popupdatepicker.html @@ -0,0 +1,53 @@ + + + + + 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 new file mode 100644 index 0000000000000..486fd5e9a0778 --- /dev/null +++ b/third_party/closure/goog/demos/popupemojipicker.html @@ -0,0 +1,407 @@ + + + + + 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 new file mode 100644 index 0000000000000..ca0064912b761 --- /dev/null +++ b/third_party/closure/goog/demos/popupmenu.html @@ -0,0 +1,116 @@ + + + + + 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 new file mode 100644 index 0000000000000..246db3a379efc --- /dev/null +++ b/third_party/closure/goog/demos/progressbar.html @@ -0,0 +1,97 @@ + + + + + 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 new file mode 100644 index 0000000000000..700dccba0fe1a --- /dev/null +++ b/third_party/closure/goog/demos/prompt.html @@ -0,0 +1,92 @@ + + + + + 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 new file mode 100644 index 0000000000000..e17e6dcf0fa06 --- /dev/null +++ b/third_party/closure/goog/demos/quadtree.html @@ -0,0 +1,107 @@ + + + + +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 new file mode 100644 index 0000000000000..d2970f089d2c2 --- /dev/null +++ b/third_party/closure/goog/demos/ratings.html @@ -0,0 +1,121 @@ + + + + +Ratings Widget + + + + + + +
+ + +
+
+
+ + + diff --git a/third_party/closure/goog/demos/richtextspellchecker.html b/third_party/closure/goog/demos/richtextspellchecker.html new file mode 100644 index 0000000000000..008d9fd891459 --- /dev/null +++ b/third_party/closure/goog/demos/richtextspellchecker.html @@ -0,0 +1,92 @@ + + + + + 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 new file mode 100644 index 0000000000000..c11b111ee3b98 --- /dev/null +++ b/third_party/closure/goog/demos/roundedpanel.html @@ -0,0 +1,139 @@ + + + + + + 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 new file mode 100644 index 0000000000000..f5a8c51fa80ee --- /dev/null +++ b/third_party/closure/goog/demos/samplecomponent.html @@ -0,0 +1,75 @@ + + + + + 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 d25d77deb84bf..0bd093b1af234 100644 --- a/third_party/closure/goog/demos/samplecomponent.js +++ b/third_party/closure/goog/demos/samplecomponent.js @@ -19,10 +19,12 @@ goog.provide('goog.demos.SampleComponent'); goog.require('goog.dom'); -goog.require('goog.dom.classlist'); +goog.require('goog.dom.classes'); +goog.require('goog.events.EventHandler'); 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'); @@ -38,10 +40,9 @@ goog.require('goog.ui.Component'); * * @extends {goog.ui.Component} * @constructor - * @final */ goog.demos.SampleComponent = function(opt_label, opt_domHelper) { - goog.base(this, opt_domHelper); + goog.ui.Component.call(this, opt_domHelper); /** * The label to display. @@ -57,6 +58,13 @@ 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. @@ -87,7 +95,6 @@ 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')); @@ -99,28 +106,27 @@ 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.base(this, 'decorateInternal', element); + goog.demos.SampleComponent.superClass_.decorateInternal.call(this, element); if (!this.getLabelText()) { this.setLabelText(this.initialLabel_); } var elem = this.getElement(); - goog.dom.classlist.add(elem, goog.getCssName('goog-sample-component')); + goog.dom.classes.add(elem, goog.getCssName('goog-sample-component')); elem.style.backgroundColor = this.color_; elem.tabIndex = 0; this.kh_ = new goog.events.KeyHandler(elem); - this.getHandler().listen(this.kh_, goog.events.KeyHandler.EventType.KEY, - this.onKey_); + this.eh_.listen(this.kh_, goog.events.KeyHandler.EventType.KEY, this.onKey_); }; /** @override */ goog.demos.SampleComponent.prototype.disposeInternal = function() { - goog.base(this, 'disposeInternal'); + goog.demos.SampleComponent.superClass_.disposeInternal.call(this); + this.eh_.dispose(); if (this.kh_) { this.kh_.dispose(); } @@ -129,11 +135,10 @@ 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.base(this, 'enterDocument'); - this.getHandler().listen(this.getElement(), goog.events.EventType.CLICK, + goog.demos.SampleComponent.superClass_.enterDocument.call(this); + this.eh_.listen(this.getElement(), goog.events.EventType.CLICK, this.onDivClicked_); }; @@ -141,10 +146,11 @@ 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.base(this, 'exitDocument'); + goog.demos.SampleComponent.superClass_.exitDocument.call(this); + this.eh_.unlisten(this.getElement(), goog.events.EventType.CLICK, + this.onDivClicked_); }; diff --git a/third_party/closure/goog/demos/scrollfloater.html b/third_party/closure/goog/demos/scrollfloater.html new file mode 100644 index 0000000000000..9dc1560d686ff --- /dev/null +++ b/third_party/closure/goog/demos/scrollfloater.html @@ -0,0 +1,113 @@ + + + + + +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 new file mode 100644 index 0000000000000..7f2ddfcb807bc --- /dev/null +++ b/third_party/closure/goog/demos/select.html @@ -0,0 +1,324 @@ + + + + + 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 new file mode 100644 index 0000000000000..22c92dcff8297 --- /dev/null +++ b/third_party/closure/goog/demos/selectionmenubutton.html @@ -0,0 +1,186 @@ + + + + + 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 new file mode 100644 index 0000000000000..1684ec2dec7c5 --- /dev/null +++ b/third_party/closure/goog/demos/serverchart.html @@ -0,0 +1,122 @@ + + + + + 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 new file mode 100644 index 0000000000000..ebe62800cbd96 --- /dev/null +++ b/third_party/closure/goog/demos/silverlightclipboardbutton.html @@ -0,0 +1,71 @@ + + + + + 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 new file mode 100644 index 0000000000000..1c85e67f765d2 --- /dev/null +++ b/third_party/closure/goog/demos/slider.html @@ -0,0 +1,128 @@ + + + + + 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 new file mode 100644 index 0000000000000..24fa73aa6d5aa --- /dev/null +++ b/third_party/closure/goog/demos/splitbehavior.html @@ -0,0 +1,164 @@ + + + + + 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 new file mode 100644 index 0000000000000..366df638395f0 --- /dev/null +++ b/third_party/closure/goog/demos/splitpane.html @@ -0,0 +1,243 @@ + + + + + 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 new file mode 100644 index 0000000000000..83cbd7c85bbb4 --- /dev/null +++ b/third_party/closure/goog/demos/stopevent.html @@ -0,0 +1,171 @@ + + + + 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 new file mode 100644 index 0000000000000..7f710679fb730 --- /dev/null +++ b/third_party/closure/goog/demos/submenus.html @@ -0,0 +1,130 @@ + + + + + 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 new file mode 100644 index 0000000000000..fd41b20e8c6a0 --- /dev/null +++ b/third_party/closure/goog/demos/submenus2.html @@ -0,0 +1,150 @@ + + + + + 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 new file mode 100644 index 0000000000000..6c21f9b879388 --- /dev/null +++ b/third_party/closure/goog/demos/tabbar.html @@ -0,0 +1,289 @@ + + + + + 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 new file mode 100644 index 0000000000000..dcbcbff14f843 --- /dev/null +++ b/third_party/closure/goog/demos/tablesorter.html @@ -0,0 +1,116 @@ + + + + + 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 new file mode 100644 index 0000000000000..20aaf5d769cfd --- /dev/null +++ b/third_party/closure/goog/demos/tabpane.html @@ -0,0 +1,302 @@ + + + + + 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 new file mode 100644 index 0000000000000..a71a3c0368821 --- /dev/null +++ b/third_party/closure/goog/demos/textarea.html @@ -0,0 +1,128 @@ + + + + + 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 new file mode 100644 index 0000000000000..193817890bd74 --- /dev/null +++ b/third_party/closure/goog/demos/timers.html @@ -0,0 +1,291 @@ + + + + + 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 new file mode 100644 index 0000000000000..a76abcd82434e --- /dev/null +++ b/third_party/closure/goog/demos/toolbar.html @@ -0,0 +1,703 @@ + + + + + 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 new file mode 100644 index 0000000000000..7b6f743b4edcb --- /dev/null +++ b/third_party/closure/goog/demos/tooltip.html @@ -0,0 +1,91 @@ + + + + + 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 new file mode 100644 index 0000000000000..b145353417f44 --- /dev/null +++ b/third_party/closure/goog/demos/tracer.html @@ -0,0 +1,92 @@ + + + + +goog.debug.Tracer + + + + + + +
+ +
+ + + + + + + diff --git a/third_party/closure/goog/demos/tree/demo.html b/third_party/closure/goog/demos/tree/demo.html new file mode 100644 index 0000000000000..5562cf84fa8f1 --- /dev/null +++ b/third_party/closure/goog/demos/tree/demo.html @@ -0,0 +1,126 @@ + + + + + + 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 new file mode 100644 index 0000000000000..6a88e9331a8bd --- /dev/null +++ b/third_party/closure/goog/demos/tweakui.html @@ -0,0 +1,121 @@ + + + + + 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 new file mode 100644 index 0000000000000..6c1d113eadecc --- /dev/null +++ b/third_party/closure/goog/demos/twothumbslider.html @@ -0,0 +1,121 @@ + + + + + goog.ui.TwoThumbSlider + + + + + +

goog.ui.TwoThumbSlider

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

goog.userAgent

+ +
+ + + +
+
+ +
+ + + +
+
+ + + + + + diff --git a/third_party/closure/goog/demos/viewportsizemonitor.html b/third_party/closure/goog/demos/viewportsizemonitor.html new file mode 100644 index 0000000000000..f958f5dac54b0 --- /dev/null +++ b/third_party/closure/goog/demos/viewportsizemonitor.html @@ -0,0 +1,71 @@ + + + + + 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 new file mode 100644 index 0000000000000..5108baa3df5b4 --- /dev/null +++ b/third_party/closure/goog/demos/xpc/blank.html @@ -0,0 +1,7 @@ + + diff --git a/third_party/closure/goog/demos/xpc/index.html b/third_party/closure/goog/demos/xpc/index.html new file mode 100644 index 0000000000000..e516ef26e6c4d --- /dev/null +++ b/third_party/closure/goog/demos/xpc/index.html @@ -0,0 +1,89 @@ + + + + + + + + + + + + + +
+ + +

+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 new file mode 100644 index 0000000000000..02e17885c2f60 --- /dev/null +++ b/third_party/closure/goog/demos/xpc/inner.html @@ -0,0 +1,58 @@ + + + + + + + + + + + +

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 new file mode 100644 index 0000000000000..5108baa3df5b4 --- /dev/null +++ b/third_party/closure/goog/demos/xpc/minimal/blank.html @@ -0,0 +1,7 @@ + + diff --git a/third_party/closure/goog/demos/xpc/minimal/index.html b/third_party/closure/goog/demos/xpc/minimal/index.html new file mode 100644 index 0000000000000..75dfb36efd498 --- /dev/null +++ b/third_party/closure/goog/demos/xpc/minimal/index.html @@ -0,0 +1,105 @@ + + + + + + + + + + + +
+ +

+ +

+ + +

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

+ +

+ + +

+ +
+ + + + diff --git a/third_party/closure/goog/demos/xpc/minimal/relay.html b/third_party/closure/goog/demos/xpc/minimal/relay.html new file mode 100644 index 0000000000000..7cc700206a6a7 --- /dev/null +++ b/third_party/closure/goog/demos/xpc/minimal/relay.html @@ -0,0 +1,7 @@ + + diff --git a/third_party/closure/goog/demos/xpc/relay.html b/third_party/closure/goog/demos/xpc/relay.html new file mode 100644 index 0000000000000..d2943357c0414 --- /dev/null +++ b/third_party/closure/goog/demos/xpc/relay.html @@ -0,0 +1,16 @@ + + + + + + + + + diff --git a/third_party/closure/goog/demos/xpc/xpcdemo.js b/third_party/closure/goog/demos/xpc/xpcdemo.js index e3f722f31b273..fff1e1ca14a2f 100644 --- a/third_party/closure/goog/demos/xpc/xpcdemo.js +++ b/third_party/closure/goog/demos/xpc/xpcdemo.js @@ -19,16 +19,15 @@ */ 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). @@ -137,12 +136,12 @@ xpcdemo.initInner = function() { * @private */ xpcdemo.initCommon_ = function() { - var xpcLogger = goog.log.getLogger('goog.net.xpc'); - goog.log.addHandler(xpcLogger, function(logRecord) { + var xpcLogger = goog.debug.Logger.getLogger('goog.net.xpc'); + xpcLogger.addHandler(function(logRecord) { xpcdemo.log('[XPC] ' + logRecord.getMessage()); }); xpcLogger.setLevel(window.location.href.match(/verbose/) ? - goog.log.Level.ALL : goog.log.Level.INFO); + goog.debug.Logger.Level.ALL : goog.debug.Logger.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 new file mode 100644 index 0000000000000..fc8bf5f3a8526 --- /dev/null +++ b/third_party/closure/goog/demos/zippy.html @@ -0,0 +1,149 @@ + + + + + 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 0e04dc2cb627d..3c0fa6daa05db 100644 --- a/third_party/closure/goog/deps.js +++ b/third_party/closure/goog/deps.js @@ -1,4 +1,4 @@ -// Copyright 2014 The Closure Library Authors. All Rights Reserved. +// 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. @@ -19,171 +19,100 @@ 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.Promise', 'goog.Thenable', 'goog.array', 'goog.asserts', 'goog.debug.Error']); +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/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/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/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/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('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('asserts/asserts.js', ['goog.asserts', 'goog.asserts.AssertionError'], ['goog.debug.Error', 'goog.string']); 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/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/nexttick.js', ['goog.async.nextTick'], ['goog.debug.entryPointRegistry', 'goog.functions']); 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/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/color.js', ['goog.color'], ['goog.color.names', 'goog.math']); 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/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/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/blockcipher.js', ['goog.crypt.BlockCipher'], []); -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.js', ['goog.crypt.Cbc'], ['goog.array', '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.asserts']); -goog.addDependency('crypt/crypt_test.js', ['goog.cryptTest'], ['goog.crypt', 'goog.string', 'goog.testing.jsunit']); +goog.addDependency('crypt/crypt.js', ['goog.crypt'], ['goog.array']); 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.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/hmac.js', ['goog.crypt.Hmac'], ['goog.asserts', 'goog.crypt.Hash']); 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/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('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('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.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/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/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/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/relative.js', ['goog.date.relative'], ['goog.i18n.DateTimeFormat']); 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.ObjectStore', 'goog.db.Transaction', '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.Error.VersionChangeBlockedError', 'goog.db.ObjectStore', 'goog.db.Transaction', 'goog.db.Transaction.TransactionMode', '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/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/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/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.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/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/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/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/gcdiagnostics.js', ['goog.debug.GcDiagnostics'], ['goog.debug.Logger', 'goog.debug.Trace', 'goog.userAgent']); goog.addDependency('debug/logbuffer.js', ['goog.debug.LogBuffer'], ['goog.asserts', '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/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/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.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('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('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.dom', 'goog.dom.NodeType', 'goog.dom.RangeEndpoint', 'goog.dom.TagName', 'goog.dom.browserrange.AbstractRange', 'goog.log', 'goog.string']); +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/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']); @@ -191,30 +120,20 @@ 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.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/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/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/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/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/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/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/fullscreen.js', ['goog.dom.fullscreen', 'goog.dom.fullscreen.EventType'], ['goog.dom', 'goog.userAgent', 'goog.userAgent.product']); 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/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/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/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']); @@ -224,209 +143,134 @@ 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/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/savedrange.js', ['goog.dom.SavedRange'], ['goog.Disposable', 'goog.debug.Logger']); goog.addDependency('dom/selection.js', ['goog.dom.selection'], ['goog.string', 'goog.userAgent']); -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/tagiterator.js', ['goog.dom.TagIterator', 'goog.dom.TagWalkType'], ['goog.dom.NodeType', 'goog.iter.Iterator', 'goog.iter.StopIteration']); 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/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/vendor.js', ['goog.dom.vendor'], ['goog.userAgent']); 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/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/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/command.js', ['goog.editor.Command'], []); -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/contenteditablefield.js', ['goog.editor.ContentEditableField'], ['goog.asserts', 'goog.debug.Logger', 'goog.editor.Field']); 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.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.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_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/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/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/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/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/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/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/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/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/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.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/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/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/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/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/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/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/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/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/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/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/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/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('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('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.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/event.js', ['goog.events.Event', 'goog.events.EventLike'], ['goog.Disposable']); goog.addDependency('events/eventhandler.js', ['goog.events.EventHandler'], ['goog.Disposable', 'goog.events', '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/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/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.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/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/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.events.EventId']); -goog.addDependency('events/listenable_test.js', ['goog.events.ListenableTest'], ['goog.events.Listenable', 'goog.testing.jsunit']); +goog.addDependency('events/listenable.js', ['goog.events.Listenable', 'goog.events.ListenableKey'], []); 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/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('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('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.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/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/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('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/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('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/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/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/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/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/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/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']); @@ -434,11 +278,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.EventTarget', 'goog.functions', 'goog.graphics.ext.coordinates']); +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/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.array', 'goog.graphics.ext.Element']); +goog.addDependency('graphics/ext/group.js', ['goog.graphics.ext.Group'], ['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']); @@ -446,7 +290,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.dom', 'goog.graphics.CanvasGraphics', 'goog.graphics.SvgGraphics', 'goog.graphics.VmlGraphics', 'goog.userAgent']); +goog.addDependency('graphics/graphics.js', ['goog.graphics'], ['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']); @@ -467,251 +311,130 @@ 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('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/bidi.js', ['goog.i18n.bidi'], []); +goog.addDependency('i18n/bidiformatter.js', ['goog.i18n.BidiFormatter'], ['goog.i18n.bidi', 'goog.string']); 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/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/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/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.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/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/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/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/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/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.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/localnamefetcher.js', ['goog.i18n.uChar.LocalNameFetcher'], ['goog.debug.Logger', 'goog.i18n.uChar', 'goog.i18n.uChar.NameFetcher']); 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.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('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('json/evaljsonprocessor.js', ['goog.json.EvalJsonProcessor'], ['goog.json', 'goog.json.Processor', '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/json.js', ['goog.json', 'goog.json.Serializer'], []); 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/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/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/net/webchannel.js', ['goog.net.WebChannel'], ['goog.events', 'goog.events.Event']); -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/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/webchanneldebug.js', ['goog.labs.net.webChannel.WebChannelDebug'], ['goog.json', 'goog.log']); -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/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/webchanneltransport.js', ['goog.net.WebChannelTransport'], []); -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/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/object/object.js', ['goog.labs.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/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/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/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/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/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.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/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/test_agents.js', ['goog.labs.userAgent.testAgents'], []); -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('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('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('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.js', ['goog.log', 'goog.log.Level', 'goog.log.LogRecord', 'goog.log.Logger'], ['goog.debug', '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/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/range.js', ['goog.math.Range'], []); 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('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/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('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/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/loggerserver.js', ['goog.messaging.LoggerServer'], ['goog.Disposable', 'goog.debug.Logger']); goog.addDependency('messaging/messagechannel.js', ['goog.messaging.MessageChannel'], []); goog.addDependency('messaging/messaging.js', ['goog.messaging'], ['goog.messaging.MessageChannel']); -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/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/portcaller.js', ['goog.messaging.PortCaller'], ['goog.Disposable', 'goog.async.Deferred', 'goog.messaging.DeferredChannel', 'goog.messaging.PortChannel', 'goog.messaging.PortNetwork', 'goog.object']); -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/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/portnetwork.js', ['goog.messaging.PortNetwork'], []); -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/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/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']); @@ -720,599 +443,434 @@ 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/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.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/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.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/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/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.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/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/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.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/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/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/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/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/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/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/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/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.log']); -goog.addDependency('net/networktester_test.js', ['goog.net.NetworkTesterTest'], ['goog.Uri', 'goog.net.NetworkTester', 'goog.testing.MockClock', 'goog.testing.jsunit']); +goog.addDependency('net/networktester.js', ['goog.net.NetworkTester'], ['goog.Timer', 'goog.Uri', 'goog.debug.Logger']); 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.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/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/xpc/crosspagechannelrole.js', ['goog.net.xpc.CrossPageChannelRole'], []); -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/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/relay.js', ['goog.net.xpc.relay'], []); -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('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('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('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/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('proto2/package_test.pb.js', ['someprotopackage.TestPackageTypes'], ['goog.proto2.Message', '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/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/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.Thenable']); +goog.addDependency('result/result_interface.js', ['goog.result.Result'], []); 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.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('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('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/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('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('spell/spellcheck.js', ['goog.spell.SpellCheck', 'goog.spell.SpellCheck.WordChangedEvent'], ['goog.Timer', 'goog.events.EventTarget', 'goog.structs.Set']); -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('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('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/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.js', ['goog.storage.Storage'], ['goog.json', 'goog.json.Serializer', '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.string.Unicode', 'goog.testing.MockControl', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit']); +goog.addDependency('string/string_test.js', ['goog.stringTest'], ['goog.functions', 'goog.object', 'goog.string', '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.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/stringset.js', ['goog.structs.StringSet'], ['goog.iter']); 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.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/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/stylescrollbartester.js', ['goog.styleScrollbarTester'], ['goog.dom', 'goog.style', 'goog.testing.asserts']); -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('style/transition.js', ['goog.style.transition', 'goog.style.transition.Css3Property'], ['goog.array', 'goog.asserts', 'goog.dom.vendor', 'goog.style', '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/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/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/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/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/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/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/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/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/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.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/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/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/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/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/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/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/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/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/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/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/pseudorandom.js', ['goog.testing.PseudoRandom'], ['goog.Disposable']); -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/recordfunction.js', ['goog.testing.FunctionCall', '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.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('testing/ui/style.js', ['goog.testing.ui.style'], ['goog.array', 'goog.dom', 'goog.dom.classes', 'goog.testing.asserts']); goog.addDependency('timer/timer.js', ['goog.Timer'], ['goog.events.EventTarget']); -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/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('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('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/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('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.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/autocomplete.js', ['goog.ui.ac.AutoComplete', 'goog.ui.ac.AutoComplete.EventType'], ['goog.asserts', 'goog.events', 'goog.events.EventTarget']); 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.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/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/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.json', 'goog.ui.ac.RemoteArrayMatcher']); +goog.addDependency('ui/ac/richremotearraymatcher.js', ['goog.ui.ac.RichRemoteArrayMatcher'], ['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', '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/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/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.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/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/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', '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/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/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.classlist', '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.classes', '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.asserts', 'goog.dom.classlist', 'goog.functions', 'goog.ui.ColorMenuButtonRenderer']); +goog.addDependency('ui/colorbuttonrenderer.js', ['goog.ui.ColorButtonRenderer'], ['goog.dom.classes', '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.asserts', 'goog.color', 'goog.dom.classlist', 'goog.ui.MenuButtonRenderer', 'goog.userAgent']); +goog.addDependency('ui/colormenubuttonrenderer.js', ['goog.ui.ColorMenuButtonRenderer'], ['goog.color', 'goog.dom.classes', 'goog.ui.ControlContent', '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.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/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/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.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/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/controlcontent.js', ['goog.ui.ControlContent'], []); -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/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/cssnames.js', ['goog.ui.INLINE_BLOCK_CLASSNAME'], []); -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/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/decorate.js', ['goog.ui.decorate'], ['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/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/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.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/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/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.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/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/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.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/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/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.addDependency('ui/equation/changeevent.js', ['goog.ui.equation.ChangeEvent'], ['goog.events.Event', 'goog.events.EventType']); 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.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/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/greekpalette.js', ['goog.ui.equation.GreekPalette'], ['goog.math.Size', 'goog.ui.equation.Palette']); -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/imagerenderer.js', ['goog.ui.equation.ImageRenderer'], ['goog.dom.TagName', 'goog.dom.classes', '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.ui.PaletteRenderer', '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.style', '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.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/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/filterobservingmenuitemrenderer.js', ['goog.ui.FilterObservingMenuItemRenderer'], ['goog.ui.MenuItemRenderer']); -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/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/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.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/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/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.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/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/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.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/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/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.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/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/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.ui.Container', 'goog.ui.ContainerRenderer']); +goog.addDependency('ui/menubarrenderer.js', ['goog.ui.MenuBarRenderer'], ['goog.a11y.aria.Role', 'goog.dom', '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.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/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/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.classlist', 'goog.ui.ControlContent', 'goog.ui.ControlRenderer']); +goog.addDependency('ui/menuseparatorrenderer.js', ['goog.ui.MenuSeparatorRenderer'], ['goog.dom', 'goog.dom.classes', '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.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/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/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.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/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/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.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/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/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.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/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/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', '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.State', '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.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/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/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.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/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/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.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/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/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.ToolbarButtonRenderer', 'goog.ui.registry']); +goog.addDependency('ui/toolbarbutton.js', ['goog.ui.ToolbarButton'], ['goog.ui.Button', 'goog.ui.ControlContent', '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.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/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/toolbarmenubuttonrenderer.js', ['goog.ui.ToolbarMenuButtonRenderer'], ['goog.ui.MenuButtonRenderer']); -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/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/toolbarseparator.js', ['goog.ui.ToolbarSeparator'], ['goog.ui.Separator', 'goog.ui.ToolbarSeparatorRenderer', 'goog.ui.registry']); -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/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/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.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/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/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.classlist', '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.classes', 'goog.events', '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/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('useragent/useragent.js', ['goog.userAgent'], ['goog.string']); 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']); @@ -1337,4 +895,3 @@ 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 cdb29b2e29527..ac8e3c4a6b4eb 100644 --- a/third_party/closure/goog/disposable/disposable.js +++ b/third_party/closure/goog/disposable/disposable.js @@ -20,10 +20,7 @@ goog.provide('goog.Disposable'); -/** @suppress {extraProvide} */ goog.provide('goog.dispose'); -/** @suppress {extraProvide} */ -goog.provide('goog.disposeAll'); goog.require('goog.disposable.IDisposable'); @@ -39,9 +36,7 @@ goog.require('goog.disposable.IDisposable'); */ goog.Disposable = function() { if (goog.Disposable.MONITORING_MODE != goog.Disposable.MonitoringMode.OFF) { - if (goog.Disposable.INCLUDE_STACK_ON_CREATION) { - this.creationStack = new Error().stack; - } + this.creationStack = new Error().stack; goog.Disposable.instances_[goog.getUid(this)] = this; } }; @@ -58,7 +53,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 be switched on before creating any + * constructor. The PERMANENT mode must bet switched on before creating any * goog.Disposable instances. */ PERMANENT: 1, @@ -81,13 +76,6 @@ 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 917d17ed39ff6..e0c79ee905406 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.abstractMethod; +goog.disposable.IDisposable.prototype.dispose; /** * @return {boolean} Whether the object has been disposed of. */ -goog.disposable.IDisposable.prototype.isDisposed = goog.abstractMethod; +goog.disposable.IDisposable.prototype.isDisposed; diff --git a/third_party/closure/goog/dom/a11y.js b/third_party/closure/goog/dom/a11y.js new file mode 100644 index 0000000000000..d240d8c72d838 --- /dev/null +++ b/third_party/closure/goog/dom/a11y.js @@ -0,0 +1,169 @@ +// 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 ee4ed2dd7d0c5..38a5aee061c09 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 deleted file mode 100644 index 8698af3618fbd..0000000000000 --- a/third_party/closure/goog/dom/animationframe/animationframe.js +++ /dev/null @@ -1,269 +0,0 @@ -// 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 deleted file mode 100644 index 19e88668a7d9c..0000000000000 --- a/third_party/closure/goog/dom/animationframe/polyfill.js +++ /dev/null @@ -1,61 +0,0 @@ -// 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 69759b5dd712d..df5ca82835415 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 eadbff8126353..606d2fd77fac2 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 9447b0b0bfe6c..d3b44d48e36b8 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 b01f2dd436866..c1d78d097da52 100644 --- a/third_party/closure/goog/dom/browserrange/geckorange.js +++ b/third_party/closure/goog/dom/browserrange/geckorange.js @@ -33,7 +33,6 @@ 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); @@ -44,7 +43,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( @@ -58,7 +57,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) { @@ -76,8 +75,7 @@ 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.dom.browserrange.GeckoRange.base( - this, 'selectInternal', selection, reversed); + goog.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 2043980a16335..50a79efc5565a 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,7 +42,6 @@ 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) { /** @@ -65,17 +64,17 @@ goog.inherits(goog.dom.browserrange.IeRange, /** * Logging object. - * @type {goog.log.Logger} + * @type {goog.debug.Logger} * @private */ goog.dom.browserrange.IeRange.logger_ = - goog.log.getLogger('goog.dom.browserrange.IeRange'); + goog.debug.Logger.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) { @@ -131,7 +130,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, @@ -140,7 +139,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.log.error(goog.dom.browserrange.IeRange.logger_, + goog.dom.browserrange.IeRange.logger_.severe( 'Cannot have startOffset > startNode child count'); } child = startNode.childNodes[startOffset]; @@ -176,7 +175,7 @@ goog.dom.browserrange.IeRange.getBrowserRangeForNodes_ = function(startNode, collapse = false; if (endNode.nodeType == goog.dom.NodeType.ELEMENT) { if (endOffset > endNode.childNodes.length) { - goog.log.error(goog.dom.browserrange.IeRange.logger_, + goog.dom.browserrange.IeRange.logger_.severe( 'Cannot have endOffset > endNode child count'); } child = endNode.childNodes[endOffset]; @@ -200,7 +199,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( @@ -244,7 +243,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) { @@ -305,7 +304,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() { @@ -807,7 +806,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 f277dc1b94ec0..321c9e2f43828 100644 --- a/third_party/closure/goog/dom/browserrange/operarange.js +++ b/third_party/closure/goog/dom/browserrange/operarange.js @@ -32,7 +32,6 @@ 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); @@ -43,7 +42,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( @@ -57,7 +56,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 7874bc49aaf7c..dc20549114a1b 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 e572dd85fc408..620d03666b14d 100644 --- a/third_party/closure/goog/dom/browserrange/webkitrange.js +++ b/third_party/closure/goog/dom/browserrange/webkitrange.js @@ -35,7 +35,6 @@ 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); @@ -47,7 +46,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( @@ -61,7 +60,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 01ab526c1d4a3..fb4b73b00c6d3 100644 --- a/third_party/closure/goog/dom/bufferedviewportsizemonitor.js +++ b/third_party/closure/goog/dom/bufferedviewportsizemonitor.js @@ -44,11 +44,10 @@ 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.dom.BufferedViewportSizeMonitor.base(this, 'constructor'); + goog.base(this); /** * The underlying viewport size monitor. @@ -119,7 +118,7 @@ goog.dom.BufferedViewportSizeMonitor.RESIZE_EVENT_DELAY_MS_ = 100; goog.dom.BufferedViewportSizeMonitor.prototype.disposeInternal = function() { goog.events.unlistenByKey(this.listenerKey_); - goog.dom.BufferedViewportSizeMonitor.base(this, 'disposeInternal'); + goog.base(this, 'disposeInternal'); }; diff --git a/third_party/closure/goog/dom/classlist.js b/third_party/closure/goog/dom/classlist.js index bca8e6bf2ec96..1b4c7cbed1e9d 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 may have unexpected behavior on elements with differing interfaces - * (such as SVGElements). + * Note: these utilities are meant to operate on HTMLElements and + * will not work on elements with differing interfaces (such as SVGElements). */ goog.provide('goog.dom.classlist'); goog.require('goog.array'); +goog.require('goog.asserts'); /** @@ -36,22 +36,34 @@ goog.require('goog.array'); 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 = 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) || []; -}; +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) || []; + }; /** @@ -71,12 +83,14 @@ 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 = 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); -}; +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); + }; /** @@ -86,18 +100,17 @@ goog.dom.classlist.contains = function(element, className) { * @param {Element} element DOM node to add class to. * @param {string} className Class name to add. */ -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; - } -}; +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; + } + }; /** @@ -108,35 +121,34 @@ goog.dom.classlist.add = function(element, className) { * This method may throw a DOM exception if classesToAdd contains invalid * or empty class names. */ -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; +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); }); - - // Flatten the keys of the map into the className. - element.className = ''; - for (var className in classMap) { - element.className += element.className.length > 0 ? - (' ' + className) : className; - } -}; + } : + 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; + } + }; /** @@ -145,21 +157,20 @@ goog.dom.classlist.addAll = function(element, classesToAdd) { * @param {Element} element DOM node to remove class from. * @param {string} className Class name to remove. */ -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(' '); - } -}; +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(' '); + } + }; /** @@ -172,22 +183,22 @@ goog.dom.classlist.remove = function(element, className) { * This method may throw a DOM exception if classesToRemove contains invalid * or empty class names. */ -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(' '); -}; +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(' '); + }; /** @@ -208,23 +219,6 @@ 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 0b3a6a91dc508..71a7fbb43d803 100644 --- a/third_party/closure/goog/dom/controlrange.js +++ b/third_party/closure/goog/dom/controlrange.js @@ -42,7 +42,6 @@ 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() { }; @@ -53,7 +52,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(); @@ -66,7 +65,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(); @@ -191,7 +190,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_) { @@ -208,7 +207,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() { @@ -394,7 +393,6 @@ 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) { @@ -497,7 +495,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 9161e24f3f9c7..430842503c885 100644 --- a/third_party/closure/goog/dom/dataset.js +++ b/third_party/closure/goog/dom/dataset.js @@ -61,11 +61,6 @@ 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 1fb0b33eb96cc..3945a3cf5d4cb 100644 --- a/third_party/closure/goog/dom/dom.js +++ b/third_party/closure/goog/dom/dom.js @@ -31,14 +31,12 @@ 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'); @@ -69,6 +67,26 @@ 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 @@ -101,62 +119,14 @@ goog.dom.getDocument = function() { /** - * Gets an element from the current document by element id. - * - * If an Element is passed in, it is returned. - * + * Alias for getElementById. If a DOM node is passed in then we just return + * that. * @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) ? - 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; + document.getElementById(element) : element; }; @@ -180,12 +150,6 @@ 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. @@ -201,8 +165,7 @@ goog.dom.getElementsByTagNameAndClass = function(opt_tag, opt_class, opt_el) { /** - * Returns a static, array-like list of the elements with the provided - * className. + * Returns an array of all 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. @@ -212,6 +175,8 @@ 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); @@ -231,30 +196,12 @@ goog.dom.getElementByClass = function(className, opt_el) { if (goog.dom.canUseQuerySelector_(parent)) { retVal = parent.querySelector('.' + className); } else { - retVal = goog.dom.getElementsByTagNameAndClass_( - document, '*', className, opt_el)[0]; + retVal = goog.dom.getElementsByClass(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. @@ -608,7 +555,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); @@ -618,7 +565,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) { @@ -892,6 +839,16 @@ 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. @@ -1251,7 +1208,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) { @@ -1261,7 +1218,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) { @@ -1272,7 +1229,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) { @@ -1286,7 +1243,6 @@ 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') && @@ -1295,13 +1251,10 @@ 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'])) { - parent = element.parentElement; - if (parent) { - return parent; - } + return element.parentElement; } } - parent = element.parentNode; + var parent = element.parentNode; return goog.dom.isElement(parent) ? /** @type {!Element} */ (parent) : null; }; @@ -1512,8 +1465,8 @@ goog.dom.findCommonAncestor = function(var_args) { * @return {!Document} The document owning the node. */ goog.dom.getOwnerDocument = function(node) { - // TODO(nnaze): Update param signature to be non-nullable. - goog.asserts.assert(node, 'Node cannot be null or undefined.'); + // TODO(arv): Remove IE5 code. + // IE5 uses document instead of ownerDocument return /** @type {!Document} */ ( node.nodeType == goog.dom.NodeType.DOCUMENT ? node : node.ownerDocument || node.document); @@ -1538,35 +1491,31 @@ 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)); }; /** - * 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. + * 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. */ -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) { +goog.dom.setTextContent = function(element, text) { + if ('textContent' in element) { + element.textContent = text; + } else if (element.firstChild && + element.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 (node.lastChild != node.firstChild) { - node.removeChild(node.lastChild); + while (element.lastChild != element.firstChild) { + element.removeChild(element.lastChild); } - node.firstChild.data = text; + element.firstChild.data = text; } else { - goog.dom.removeChildren(node); - var doc = goog.dom.getOwnerDocument(node); - node.appendChild(doc.createTextNode(String(text))); + goog.dom.removeChildren(element); + var doc = goog.dom.getOwnerDocument(element); + element.appendChild(doc.createTextNode(String(text))); } }; @@ -1684,7 +1633,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 some elements + * keyboard focus (tabIndex >= 0), false otherwise. Note that form 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 @@ -1692,8 +1641,16 @@ 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) { - return goog.dom.hasSpecifiedTabIndex_(element) && - goog.dom.isTabIndexFocusable_(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; }; @@ -1720,90 +1677,6 @@ 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, @@ -2093,60 +1966,6 @@ 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. @@ -2197,21 +2016,11 @@ 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) { - 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); + if (goog.isString(element)) { + return this.document_.getElementById(element); + } else { + return element; + } }; @@ -2272,23 +2081,6 @@ 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. @@ -2436,6 +2228,16 @@ 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. @@ -2457,7 +2259,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_); @@ -2641,7 +2443,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; @@ -2649,7 +2451,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; @@ -2658,7 +2460,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; @@ -2733,9 +2535,10 @@ goog.dom.DomHelper.prototype.getFrameContentWindow = /** - * 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. + * 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. */ goog.dom.DomHelper.prototype.setTextContent = goog.dom.setTextContent; @@ -2771,7 +2574,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 some elements + * keyboard focus (tabIndex >= 0), false otherwise. Note that form 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 @@ -2793,16 +2596,6 @@ 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 fce018a0c56fd..8bf4f675697dd 100644 --- a/third_party/closure/goog/dom/fontsizemonitor.js +++ b/third_party/closure/goog/dom/fontsizemonitor.js @@ -46,7 +46,6 @@ 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 195421350edd3..d1f1297314e10 100644 --- a/third_party/closure/goog/dom/fullscreen.js +++ b/third_party/closure/goog/dom/fullscreen.js @@ -22,6 +22,7 @@ goog.provide('goog.dom.fullscreen.EventType'); goog.require('goog.dom'); goog.require('goog.userAgent'); +goog.require('goog.userAgent.product'); /** @@ -30,20 +31,9 @@ goog.require('goog.userAgent'); */ goog.dom.fullscreen.EventType = { /** Dispatched by the Document when the fullscreen status changes. */ - 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'; - })() + CHANGE: goog.userAgent.WEBKIT ? + 'webkitfullscreenchange' : + 'mozfullscreenchange' }; @@ -56,10 +46,8 @@ 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) || - (body.msRequestFullscreen && doc.msFullscreenEnabled) || - (body.requestFullscreen && doc.fullscreenEnabled)); + return !!body.webkitRequestFullScreen || + (!!body.mozRequestFullScreen && doc.mozFullScreenEnabled); }; @@ -68,14 +56,10 @@ 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(); } }; @@ -88,8 +72,11 @@ goog.dom.fullscreen.requestFullScreenWithKeys = function( element) { if (element.mozRequestFullScreenWithKeys) { element.mozRequestFullScreenWithKeys(); - } else if (element.webkitRequestFullscreen) { - element.webkitRequestFullscreen(); + } 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 { goog.dom.fullscreen.requestFullScreen(element); } @@ -107,10 +94,6 @@ 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(); } }; @@ -123,10 +106,7 @@ goog.dom.fullscreen.exitFullScreen = function(opt_domHelper) { */ goog.dom.fullscreen.isFullScreen = function(opt_domHelper) { var doc = goog.dom.fullscreen.getDocument_(opt_domHelper); - // 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); + return !!doc.webkitIsFullScreen || !!doc.mozFullScreen; }; diff --git a/third_party/closure/goog/dom/iframe.js b/third_party/closure/goog/dom/iframe.js index 8298e22e0aa93..c23e795c314b9 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 7516414500655..0224af3ec4a51 100644 --- a/third_party/closure/goog/dom/iter.js +++ b/third_party/closure/goog/dom/iter.js @@ -79,7 +79,6 @@ 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)) { @@ -100,7 +99,6 @@ 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 d024f66f564b5..4e2526960d210 100644 --- a/third_party/closure/goog/dom/multirange.js +++ b/third_party/closure/goog/dom/multirange.js @@ -23,6 +23,7 @@ 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'); @@ -30,7 +31,6 @@ 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,7 +39,6 @@ goog.require('goog.log'); * constructor: use one of the goog.dom.Range.createFrom* methods instead. * @constructor * @extends {goog.dom.AbstractMultiRange} - * @final */ goog.dom.MultiRange = function() { /** @@ -77,7 +76,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(); @@ -92,7 +91,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(); @@ -105,7 +104,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(); @@ -119,11 +118,11 @@ goog.dom.MultiRange.createFromTextRanges = function(textRanges) { /** * Logging object. - * @type {goog.log.Logger} + * @type {goog.debug.Logger} * @private */ goog.dom.MultiRange.prototype.logger_ = - goog.log.getLogger('goog.dom.MultiRange'); + goog.debug.Logger.getLogger('goog.dom.MultiRange'); // Method implementations @@ -142,7 +141,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() { @@ -160,7 +159,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) { - goog.log.warning(this.logger_, + this.logger_.warning( 'getBrowserRangeObject called on MultiRange with more than 1 range'); } return this.browserRanges_[0]; @@ -204,7 +203,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() { @@ -386,7 +385,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() { @@ -419,7 +418,6 @@ 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) { @@ -511,7 +509,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 bca563c3e33a6..22453a021eb92 100644 --- a/third_party/closure/goog/dom/nodeiterator.js +++ b/third_party/closure/goog/dom/nodeiterator.js @@ -62,7 +62,6 @@ 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 739749a1121f0..084d4b076681b 100644 --- a/third_party/closure/goog/dom/nodeoffset.js +++ b/third_party/closure/goog/dom/nodeoffset.js @@ -33,7 +33,6 @@ 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 deleted file mode 100644 index cccb4706eca19..0000000000000 --- a/third_party/closure/goog/dom/nodetype.js +++ /dev/null @@ -1,48 +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.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 003c71a0add46..a354de05f192e 100644 --- a/third_party/closure/goog/dom/pattern/callback/counter.js +++ b/third_party/closure/goog/dom/pattern/callback/counter.js @@ -25,7 +25,6 @@ goog.provide('goog.dom.pattern.callback.Counter'); /** * Callback class for counting matches. * @constructor - * @final */ goog.dom.pattern.callback.Counter = function() { }; @@ -52,7 +51,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 1bfc923bcb52f..30a58c1615b41 100644 --- a/third_party/closure/goog/dom/pattern/callback/test.js +++ b/third_party/closure/goog/dom/pattern/callback/test.js @@ -27,7 +27,6 @@ goog.require('goog.iter.StopIteration'); /** * Callback class for testing for at least one match. * @constructor - * @final */ goog.dom.pattern.callback.Test = function() { }; @@ -54,7 +53,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 52a0a4dec5e94..72f1b51f33ca2 100644 --- a/third_party/closure/goog/dom/pattern/childmatches.js +++ b/third_party/closure/goog/dom/pattern/childmatches.js @@ -35,7 +35,6 @@ 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 409f952dec2d6..75f995266d43f 100644 --- a/third_party/closure/goog/dom/pattern/endtag.js +++ b/third_party/closure/goog/dom/pattern/endtag.js @@ -40,7 +40,6 @@ 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 16264e9ae90d9..1fa2230319ad4 100644 --- a/third_party/closure/goog/dom/pattern/fulltag.js +++ b/third_party/closure/goog/dom/pattern/fulltag.js @@ -41,7 +41,6 @@ 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 9b7e8c691e284..c0c87a3d276fb 100644 --- a/third_party/closure/goog/dom/pattern/matcher.js +++ b/third_party/closure/goog/dom/pattern/matcher.js @@ -45,7 +45,6 @@ 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 a12c9a1cf373b..b13bbe18c8b02 100644 --- a/third_party/closure/goog/dom/pattern/nodetype.js +++ b/third_party/closure/goog/dom/pattern/nodetype.js @@ -30,7 +30,6 @@ 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 9a04d6a34c4d2..5a47de0b085cb 100644 --- a/third_party/closure/goog/dom/pattern/repeat.js +++ b/third_party/closure/goog/dom/pattern/repeat.js @@ -36,7 +36,6 @@ 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 b26ed8db2afac..df40fd6f616fe 100644 --- a/third_party/closure/goog/dom/pattern/sequence.js +++ b/third_party/closure/goog/dom/pattern/sequence.js @@ -35,7 +35,6 @@ 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 c4519608c55b1..5b625ab84e0aa 100644 --- a/third_party/closure/goog/dom/pattern/text.js +++ b/third_party/closure/goog/dom/pattern/text.js @@ -33,7 +33,6 @@ 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 0d99062f53079..4df2a20874581 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} 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. + * @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. */ -goog.dom.Range.createFromNodes = function(anchorNode, anchorOffset, focusNode, - focusOffset) { - return goog.dom.TextRange.createFromNodes(anchorNode, anchorOffset, focusNode, - focusOffset); +goog.dom.Range.createFromNodes = function(startNode, startOffset, endNode, + endOffset) { + return goog.dom.TextRange.createFromNodes(startNode, startOffset, endNode, + endOffset); }; @@ -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 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. + * @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. * @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 deleted file mode 100644 index ad821257de9ec..0000000000000 --- a/third_party/closure/goog/dom/safe.js +++ /dev/null @@ -1,125 +0,0 @@ -// 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 ea610504c56a9..31d313461f87d 100644 --- a/third_party/closure/goog/dom/savedcaretrange.js +++ b/third_party/closure/goog/dom/savedcaretrange.js @@ -58,12 +58,6 @@ 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} @@ -86,7 +80,6 @@ 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; @@ -139,24 +132,19 @@ goog.dom.SavedCaretRange.prototype.setRestorationDocument = function(doc) { */ goog.dom.SavedCaretRange.prototype.restoreInternal = function() { var range = null; - 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) { + 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) { // Compensate for the start caret being removed. - if (this.reversed_) { - anchorOffset--; - } else { - focusOffset--; - } + endOffset -= 1; } - /** @suppress {missingRequire} circular dependency */ - range = goog.dom.Range.createFromNodes(anchorNode, anchorOffset, - focusNode, focusOffset); + range = goog.dom.Range.createFromNodes(startNode, startOffset, + endNode, endOffset); range = this.removeCarets(range); range.select(); } else { @@ -182,7 +170,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 5a7e951347291..4f356d3cf153d 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.log'); +goog.require('goog.debug.Logger'); @@ -39,11 +39,11 @@ goog.inherits(goog.dom.SavedRange, goog.Disposable); /** * Logging object. - * @type {goog.log.Logger} + * @type {goog.debug.Logger} * @private */ goog.dom.SavedRange.logger_ = - goog.log.getLogger('goog.dom.SavedRange'); + goog.debug.Logger.getLogger('goog.dom.SavedRange'); /** @@ -55,7 +55,7 @@ goog.dom.SavedRange.logger_ = */ goog.dom.SavedRange.prototype.restore = function(opt_stayAlive) { if (this.isDisposed()) { - goog.log.error(goog.dom.SavedRange.logger_, + goog.dom.SavedRange.logger_.severe( '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 295f7d78d0f4f..6d6f69e14fad8 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 404a18742b473..cd7787d6d934b 100644 --- a/third_party/closure/goog/dom/tagiterator.js +++ b/third_party/closure/goog/dom/tagiterator.js @@ -21,7 +21,6 @@ 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'); @@ -95,7 +94,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) { @@ -207,7 +206,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 deleted file mode 100644 index 159abe0ceeb07..0000000000000 --- a/third_party/closure/goog/dom/tags.js +++ /dev/null @@ -1,42 +0,0 @@ -// 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 c8e708e363707..73b82ac1ab8c9 100644 --- a/third_party/closure/goog/dom/textrange.js +++ b/third_party/closure/goog/dom/textrange.js @@ -41,7 +41,6 @@ goog.require('goog.userAgent'); * use one of the goog.dom.Range.createFrom* methods instead. * @constructor * @extends {goog.dom.AbstractRange} - * @final */ goog.dom.TextRange = function() { }; @@ -54,7 +53,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_( @@ -68,7 +67,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, @@ -89,7 +88,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_( @@ -106,7 +105,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) { @@ -207,7 +206,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() { @@ -271,7 +270,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() { @@ -479,7 +478,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) { @@ -613,7 +612,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 e54b1d41e4f00..b8d49b8565dfd 100644 --- a/third_party/closure/goog/dom/textrangeiterator.js +++ b/third_party/closure/goog/dom/textrangeiterator.js @@ -43,7 +43,6 @@ 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) { @@ -234,7 +233,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 7c1123ec4aa4a..8787f66615a28 100644 --- a/third_party/closure/goog/dom/vendor.js +++ b/third_party/closure/goog/dom/vendor.js @@ -18,7 +18,6 @@ goog.provide('goog.dom.vendor'); -goog.require('goog.string'); goog.require('goog.userAgent'); @@ -61,36 +60,3 @@ 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 e03c0641ed2d8..692687000cce4 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 00bc203bb41c7..d3d80985a9ff4 100644 --- a/third_party/closure/goog/editor/clicktoeditwrapper.js +++ b/third_party/closure/goog/editor/clicktoeditwrapper.js @@ -28,6 +28,7 @@ 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'); @@ -38,7 +39,6 @@ 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.log.Logger} + * @type {goog.debug.Logger} * @private */ goog.editor.ClickToEditWrapper.prototype.logger_ = - goog.log.getLogger('goog.editor.ClickToEditWrapper'); + goog.debug.Logger.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.editor.ClickToEditWrapper.base(this, 'disposeInternal'); + goog.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 b5fd6bbebcf1e..df96b754429c3 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.log.getLogger('goog.editor.ContentEditableField'); + goog.debug.Logger.getLogger('goog.editor.ContentEditableField'); /** @override */ diff --git a/third_party/closure/goog/editor/field.js b/third_party/closure/goog/editor/field.js index 09b51d1a31692..042f466b69cca 100644 --- a/third_party/closure/goog/editor/field.js +++ b/third_party/closure/goog/editor/field.js @@ -30,6 +30,7 @@ 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'); @@ -47,7 +48,6 @@ 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.log.Logger} + * @type {goog.debug.Logger} * @protected */ goog.editor.Field.prototype.logger = - goog.log.getLogger('goog.editor.Field'); + goog.debug.Logger.getLogger('goog.editor.Field'); /** @@ -459,12 +459,7 @@ goog.editor.Field.prototype.addListener = function(type, listener, opt_capture, this.usesIframe()) { elem = elem.ownerDocument; } - if (opt_handler) { - this.eventRegister.listenWithScope( - elem, type, listener, opt_capture, opt_handler); - } else { - this.eventRegister.listen(elem, type, listener, opt_capture); - } + this.eventRegister.listen(elem, type, listener, opt_capture, opt_handler); }; @@ -485,8 +480,7 @@ goog.editor.Field.prototype.getPluginByClassId = function(classId) { goog.editor.Field.prototype.registerPlugin = function(plugin) { var classId = plugin.getTrogClassId(); if (this.plugins_[classId]) { - goog.log.error(this.logger, - 'Cannot register the same class of plugin twice.'); + this.logger.severe('Cannot register the same class of plugin twice.'); } this.plugins_[classId] = plugin; @@ -515,8 +509,7 @@ goog.editor.Field.prototype.registerPlugin = function(plugin) { goog.editor.Field.prototype.unregisterPlugin = function(plugin) { var classId = plugin.getTrogClassId(); if (!this.plugins_[classId]) { - goog.log.error(this.logger, - 'Cannot unregister a plugin that isn\'t registered.'); + this.logger.severe('Cannot unregister a plugin that isn\'t registered.'); } delete this.plugins_[classId]; @@ -954,7 +947,7 @@ goog.editor.Field.prototype.clearListeners = function() { /** @override */ goog.editor.Field.prototype.disposeInternal = function() { if (this.isLoading() || this.isLoaded()) { - goog.log.warning(this.logger, 'Disposing a field that is in use.'); + this.logger.warning('Disposing a field that is in use.'); } if (this.getOriginalElement()) { @@ -2053,8 +2046,7 @@ goog.editor.Field.prototype.getCleanContents = function() { // The field is uneditable, so it's ok to read contents directly. var elem = this.getOriginalElement(); if (!elem) { - goog.log.log(this.logger, goog.log.Level.SHOUT, - "Couldn't get the field element to read the contents"); + this.logger.shout("Couldn't get the field element to read the contents"); } return elem.innerHTML; } @@ -2071,7 +2063,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() { @@ -2104,7 +2096,7 @@ goog.editor.Field.prototype.getFieldCopy = function() { goog.editor.Field.prototype.setHtml = function( addParas, html, opt_dontFireDelayedChange, opt_applyLorem) { if (this.isLoading()) { - goog.log.error(this.logger, "Can't set html while loading Trogedit"); + this.logger.severe("Can't set html while loading Trogedit"); return; } @@ -2225,7 +2217,7 @@ goog.editor.Field.prototype.dispatchLoadEvent_ = function() { this.installStyles(); this.startChangeEvents(); - goog.log.info(this.logger, 'Dispatching load ' + this.id); + this.logger.info('Dispatching load ' + this.id); this.dispatchEvent(goog.editor.Field.EventType.LOAD); }; @@ -2620,8 +2612,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) { @@ -2706,7 +2698,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 f1c317c9d1de2..4316bd5e59758 100644 --- a/third_party/closure/goog/editor/icontent.js +++ b/third_party/closure/goog/editor/icontent.js @@ -42,7 +42,6 @@ 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) { @@ -61,7 +60,6 @@ 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 52744ff7c5d08..8e70dfe8a46a2 100644 --- a/third_party/closure/goog/editor/link.js +++ b/third_party/closure/goog/editor/link.js @@ -24,7 +24,6 @@ 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'); @@ -41,7 +40,6 @@ 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) { /** @@ -91,14 +89,7 @@ goog.editor.Link.prototype.getExtraAnchors = function() { */ goog.editor.Link.prototype.getCurrentText = function() { if (!this.currentText_) { - 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()); - } + this.currentText_ = goog.dom.getRawTextContent(this.getAnchor()); } return this.currentText_; }; @@ -150,22 +141,18 @@ 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 (leaf.tagName && leaf.tagName == goog.dom.TagName.IMG) { - leaf.setAttribute('alt', newText ? newText : ''); - } else { - if (leaf.nodeType == goog.dom.NodeType.TEXT) { - leaf = leaf.parentNode; - } + if (goog.dom.getRawTextContent(leaf) != currentText) { + leaf = anchor; + } - if (goog.dom.getRawTextContent(leaf) != currentText) { - leaf = anchor; - } + goog.dom.removeChildren(leaf); - goog.dom.removeChildren(leaf); - var domHelper = goog.dom.getDomHelper(leaf); - goog.dom.appendChild(leaf, domHelper.createTextNode(newText)); - } + var domHelper = goog.dom.getDomHelper(leaf); + goog.dom.appendChild(leaf, domHelper.createTextNode(newText)); // The text changed, so force getCurrentText to recompute. this.currentText_ = null; @@ -267,7 +254,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 3550c4cde6b0a..6f45a2e17361a 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.log.Logger} + * @type {goog.debug.Logger} * @protected */ goog.editor.Plugin.prototype.logger = - goog.log.getLogger('goog.editor.Plugin'); + goog.debug.Logger.getLogger('goog.editor.Plugin'); /** @@ -141,7 +141,7 @@ goog.editor.Plugin.prototype.enable = function(fieldObject) { if (this.getFieldObject() == fieldObject) { this.enabled_ = true; } else { - goog.log.error(this.logger, 'Trying to enable an unregistered field with ' + + this.logger.severe('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 { - goog.log.error(this.logger, 'Trying to disable an unregistered field ' + + this.logger.severe('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 4bc929abf1813..cc230eed272ea 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'); +goog.require('goog.ui.Component.EventType'); goog.require('goog.ui.editor.Bubble'); goog.require('goog.userAgent'); @@ -53,25 +53,14 @@ goog.require('goog.userAgent'); * @extends {goog.editor.Plugin} */ goog.editor.plugins.AbstractBubblePlugin = function() { - goog.editor.plugins.AbstractBubblePlugin.base(this, 'constructor'); + goog.base(this); /** * Place to register events the plugin listens to. - * @type {goog.events.EventHandler.< - * !goog.editor.plugins.AbstractBubblePlugin>} + * @type {goog.events.EventHandler} * @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); @@ -117,30 +106,30 @@ goog.editor.plugins.AbstractBubblePlugin.defaultBubbleFactory_ = function( /** - * 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. + * 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.globalBubbleFactory_ = +goog.editor.plugins.AbstractBubblePlugin.bubbleFactory_ = goog.editor.plugins.AbstractBubblePlugin.defaultBubbleFactory_; /** - * Sets the global bubble factory function. + * Sets the 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.globalBubbleFactory_ = bubbleFactory; + goog.editor.plugins.AbstractBubblePlugin.bubbleFactory_ = bubbleFactory; }; /** * Map from field id to shared bubble object. - * @type {!Object.} + * @type {Object.} * @private */ goog.editor.plugins.AbstractBubblePlugin.bubbleMap_ = {}; @@ -175,20 +164,6 @@ 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 @@ -212,16 +187,6 @@ 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. */ @@ -347,18 +312,17 @@ 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 bubbleMap = this.getBubbleMap(); - var bubble = bubbleMap[field.id]; + var bubble = goog.editor.plugins.AbstractBubblePlugin.bubbleMap_[field.id]; if (bubble) { bubble.dispose(); - delete bubbleMap[field.id]; + delete goog.editor.plugins.AbstractBubblePlugin.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 */ @@ -368,14 +332,14 @@ goog.editor.plugins.AbstractBubblePlugin.prototype.getSharedBubble_ = this.getFieldObject().getAppWindow().document.body); this.dom_ = goog.dom.getDomHelper(bubbleParent); - var bubbleMap = this.getBubbleMap(); - var bubble = bubbleMap[this.getFieldObject().id]; + var bubble = goog.editor.plugins.AbstractBubblePlugin.bubbleMap_[ + this.getFieldObject().id]; if (!bubble) { - var factory = this.bubbleFactory_ || - goog.editor.plugins.AbstractBubblePlugin.globalBubbleFactory_; - bubble = factory.call(null, bubbleParent, + bubble = goog.editor.plugins.AbstractBubblePlugin.bubbleFactory_.call(null, + bubbleParent, this.getFieldObject().getBaseZindex()); - bubbleMap[this.getFieldObject().id] = bubble; + goog.editor.plugins.AbstractBubblePlugin.bubbleMap_[ + this.getFieldObject().id] = bubble; } return bubble; }; @@ -494,15 +458,6 @@ 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. @@ -513,7 +468,6 @@ 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 7e65ec50c18f7..954e1e2b3dabb 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.editor.plugins.AbstractDialogPlugin.base(this, 'disposeInternal'); + goog.base(this, 'disposeInternal'); }; diff --git a/third_party/closure/goog/editor/plugins/basictextformatter.js b/third_party/closure/goog/editor/plugins/basictextformatter.js index a2f0df3d41eca..4d32f349b9df6 100644 --- a/third_party/closure/goog/editor/plugins/basictextformatter.js +++ b/third_party/closure/goog/editor/plugins/basictextformatter.js @@ -21,6 +21,7 @@ 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'); @@ -34,7 +35,6 @@ 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.log.Logger} + * @type {goog.debug.Logger} * @protected * @override */ goog.editor.plugins.BasicTextFormatter.prototype.logger = - goog.log.getLogger('goog.editor.plugins.BasicTextFormatter'); + goog.debug.Logger.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,8 +809,7 @@ 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 && - !goog.userAgent.isVersionOrHigher(534)) { + if (goog.userAgent.WEBKIT) { this.fixSafariLists_(); } if (goog.userAgent.IE) { @@ -960,8 +959,7 @@ 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, or null if the link - * couldn't be created. + * @return {goog.editor.Link?} The newly created link. * @private */ goog.editor.plugins.BasicTextFormatter.prototype.createLink_ = function(range, @@ -975,13 +973,7 @@ goog.editor.plugins.BasicTextFormatter.prototype.createLink_ = function(range, if (parent && parent.tagName == goog.dom.TagName.IMG) { return null; } - // If range is not present, the editable field doesn't have focus, abort - // creating a link. - if (!range) { - return null; - } - - if (range.isCollapsed()) { + if (range && range.isCollapsed()) { var textRange = range.getTextRange(0).getBrowserRangeObject(); if (goog.editor.BrowserFeature.HAS_W3C_RANGES) { anchor = this.getFieldDomHelper().createElement(goog.dom.TagName.A); @@ -1134,7 +1126,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 */ @@ -1272,7 +1264,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, fixed by 2010-04-21) + * (see https://bugs.webkit.org/show_bug.cgi?id=19539 ) * @private */ goog.editor.plugins.BasicTextFormatter.prototype.fixSafariLists_ = function() { @@ -1410,7 +1402,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_ = @@ -1429,9 +1421,8 @@ goog.editor.plugins.BasicTextFormatter.prototype.applyExecCommandSafariFixes_ = goog.dom.appendChild(this.getFieldObject().getElement(), div); } - if (!goog.userAgent.isVersionOrHigher(534) && - goog.editor.plugins.BasicTextFormatter. - hangingExecCommandWebkit_[command]) { + if (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 00b0b884369cb..cdaafd45fa1b4 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.classlist'); +goog.require('goog.dom.classes'); 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,7 +42,6 @@ goog.require('goog.log'); * blockquotes. Defaults to 'tr_bq'. * @constructor * @extends {goog.editor.Plugin} - * @final */ goog.editor.plugins.Blockquote = function(requiresClassNameToSplit, opt_className) { @@ -85,12 +84,12 @@ goog.editor.plugins.Blockquote.CLASS_ID = 'Blockquote'; /** * Logging object. - * @type {goog.log.Logger} + * @type {goog.debug.Logger} * @protected * @override */ goog.editor.plugins.Blockquote.prototype.logger = - goog.log.getLogger('goog.editor.plugins.Blockquote'); + goog.debug.Logger.getLogger('goog.editor.plugins.Blockquote'); /** @override */ @@ -132,8 +131,8 @@ goog.editor.plugins.Blockquote.isBlockquote = function(node, isAlreadySetup, if (!requiresClassNameToSplit) { return isAlreadySetup; } - var hasClassName = goog.dom.classlist.contains( - /** @type {!Element} */ (node), className); + var hasClassName = goog.dom.classes.has(/** @type {Element} */ (node), + className); return isAlreadySetup ? hasClassName : !hasClassName; }; @@ -160,8 +159,7 @@ goog.editor.plugins.Blockquote.prototype.isSplittableBlockquote = return true; } - return goog.dom.classlist.contains(/** @type {!Element} */ (node), - this.className_); + return goog.dom.classes.has(node, this.className_); }; @@ -174,8 +172,7 @@ goog.editor.plugins.Blockquote.prototype.isSplittableBlockquote = goog.editor.plugins.Blockquote.prototype.isSetupBlockquote = function(node) { return node.tagName == goog.dom.TagName.BLOCKQUOTE && - goog.dom.classlist.contains(/** @type {!Element} */ (node), - this.className_); + goog.dom.classes.has(node, this.className_); }; diff --git a/third_party/closure/goog/editor/plugins/emoticons.js b/third_party/closure/goog/editor/plugins/emoticons.js index 4d0c065812e64..71fb7b0ec33d9 100644 --- a/third_party/closure/goog/editor/plugins/emoticons.js +++ b/third_party/closure/goog/editor/plugins/emoticons.js @@ -35,10 +35,9 @@ goog.require('goog.userAgent'); * * @constructor * @extends {goog.editor.Plugin} - * @final */ goog.editor.plugins.Emoticons = function() { - goog.editor.plugins.Emoticons.base(this, 'constructor'); + goog.base(this); }; goog.inherits(goog.editor.plugins.Emoticons, goog.editor.Plugin); @@ -64,7 +63,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 c3362b7ccc060..fcf13deefab4a 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.editor.plugins.EnterHandler.base(this, 'enable', fieldObject); + goog.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 e997fec228ba3..d40d79ec0df17 100644 --- a/third_party/closure/goog/editor/plugins/equationeditorbubble.js +++ b/third_party/closure/goog/editor/plugins/equationeditorbubble.js @@ -29,10 +29,9 @@ goog.require('goog.ui.equation.ImageRenderer'); * * @constructor * @extends {goog.editor.plugins.AbstractBubblePlugin} - * @final */ goog.editor.plugins.equation.EquationBubble = function() { - goog.editor.plugins.equation.EquationBubble.base(this, 'constructor'); + goog.base(this); }; 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 dc75d7b39a54c..33164b06ce134 100644 --- a/third_party/closure/goog/editor/plugins/equationeditorplugin.js +++ b/third_party/closure/goog/editor/plugins/equationeditorplugin.js @@ -14,6 +14,7 @@ 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'); @@ -21,7 +22,6 @@ 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,7 +34,6 @@ 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) { /** @@ -68,11 +67,11 @@ goog.inherits(goog.editor.plugins.EquationEditorPlugin, /** * The logger for the EquationEditorPlugin. - * @type {goog.log.Logger} + * @type {goog.debug.Logger} * @private */ goog.editor.plugins.EquationEditorPlugin.prototype.logger_ = - goog.log.getLogger('goog.editor.plugins.EquationEditorPlugin'); + goog.debug.Logger.getLogger('goog.editor.plugins.EquationEditorPlugin'); /** @override */ @@ -105,7 +104,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_ = @@ -141,7 +140,7 @@ goog.editor.plugins.EquationEditorPlugin.prototype.getEquationFromSelection_ = /** @override */ goog.editor.plugins.EquationEditorPlugin.prototype.enable = function(fieldObject) { - goog.editor.plugins.EquationEditorPlugin.base(this, 'enable', fieldObject); + goog.base(this, 'enable', fieldObject); if (this.isEnabled(fieldObject)) { this.dblClickKey_ = goog.events.listen(fieldObject.getElement(), goog.events.EventType.DBLCLICK, @@ -153,7 +152,7 @@ goog.editor.plugins.EquationEditorPlugin.prototype.enable = /** @override */ goog.editor.plugins.EquationEditorPlugin.prototype.disable = function(fieldObject) { - goog.editor.plugins.EquationEditorPlugin.base(this, 'disable', fieldObject); + goog.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 721ced37e5e87..554c0d63f7f7c 100644 --- a/third_party/closure/goog/editor/plugins/firststrong.js +++ b/third_party/closure/goog/editor/plugins/firststrong.js @@ -59,10 +59,9 @@ goog.require('goog.userAgent'); * First Strong plugin. * @constructor * @extends {goog.editor.Plugin} - * @final */ goog.editor.plugins.FirstStrong = function() { - goog.editor.plugins.FirstStrong.base(this, 'constructor'); + goog.base(this); /** * 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 fa4bb1f76d7e7..d1987882216c2 100644 --- a/third_party/closure/goog/editor/plugins/headerformatter.js +++ b/third_party/closure/goog/editor/plugins/headerformatter.js @@ -29,7 +29,6 @@ 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 725a735bd3b92..472e28cbc54a1 100644 --- a/third_party/closure/goog/editor/plugins/linkbubble.js +++ b/third_party/closure/goog/editor/plugins/linkbubble.js @@ -22,12 +22,11 @@ goog.provide('goog.editor.plugins.LinkBubble.Action'); goog.require('goog.array'); goog.require('goog.dom'); -goog.require('goog.dom.TagName'); +goog.require('goog.editor.BrowserFeature'); 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'); @@ -44,7 +43,7 @@ goog.require('goog.window'); * @extends {goog.editor.plugins.AbstractBubblePlugin} */ goog.editor.plugins.LinkBubble = function(var_args) { - goog.editor.plugins.LinkBubble.base(this, 'constructor'); + goog.base(this); /** * List of extra actions supported by the bubble. @@ -315,16 +314,6 @@ 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) { @@ -347,7 +336,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_}, - this.getTestLinkMessage()); + MSG_LINK_BUBBLE_TEST_LINK); linkTextSpan = this.dom_.createDom(goog.dom.TagName.SPAN, { id: goog.editor.plugins.LinkBubble.LINK_TEXT_ID_, @@ -426,7 +415,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 */ @@ -562,7 +551,6 @@ 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 ab6c6e5212ba8..beb7a87e7fb9a 100644 --- a/third_party/closure/goog/editor/plugins/linkdialogplugin.js +++ b/third_party/closure/goog/editor/plugins/linkdialogplugin.js @@ -42,12 +42,11 @@ goog.require('goog.uri.utils'); * @extends {goog.editor.plugins.AbstractDialogPlugin} */ goog.editor.plugins.LinkDialogPlugin = function() { - goog.editor.plugins.LinkDialogPlugin.base( - this, 'constructor', goog.editor.Command.MODAL_LINK_EDITOR); + goog.base(this, 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); @@ -234,8 +233,7 @@ 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.editor.plugins.LinkDialogPlugin.base( - this, 'execCommandInternal', command, opt_arg); + return goog.base(this, 'execCommandInternal', command, opt_arg); }; @@ -246,16 +244,14 @@ goog.editor.plugins.LinkDialogPlugin.prototype.execCommandInternal = function( * @protected */ goog.editor.plugins.LinkDialogPlugin.prototype.handleAfterHide = function(e) { - goog.editor.plugins.LinkDialogPlugin.base(this, 'handleAfterHide', e); + goog.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_; @@ -276,7 +272,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 */ @@ -307,7 +303,7 @@ goog.editor.plugins.LinkDialogPlugin.prototype.createDialog = function( /** @override */ goog.editor.plugins.LinkDialogPlugin.prototype.disposeInternal = function() { - goog.editor.plugins.LinkDialogPlugin.base(this, 'disposeInternal'); + goog.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 c61f898996d76..8703fcb0c1afa 100644 --- a/third_party/closure/goog/editor/plugins/linkshortcutplugin.js +++ b/third_party/closure/goog/editor/plugins/linkshortcutplugin.js @@ -30,10 +30,9 @@ 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.editor.plugins.LinkShortcutPlugin.base(this, 'constructor'); + goog.base(this); }; 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 3a5ba84fcfd90..d4132b3887dc5 100644 --- a/third_party/closure/goog/editor/plugins/listtabhandler.js +++ b/third_party/closure/goog/editor/plugins/listtabhandler.js @@ -32,7 +32,6 @@ 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 da6c71c08def3..f8cfb1291bfc8 100644 --- a/third_party/closure/goog/editor/plugins/loremipsum.js +++ b/third_party/closure/goog/editor/plugins/loremipsum.js @@ -35,7 +35,6 @@ 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 3b910b1b75da3..54c997d0c6715 100644 --- a/third_party/closure/goog/editor/plugins/removeformatting.js +++ b/third_party/closure/goog/editor/plugins/removeformatting.js @@ -37,7 +37,6 @@ 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); @@ -87,7 +86,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( @@ -380,7 +379,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 fa9a218bac45c..06b306f44404a 100644 --- a/third_party/closure/goog/editor/plugins/spacestabhandler.js +++ b/third_party/closure/goog/editor/plugins/spacestabhandler.js @@ -32,7 +32,6 @@ 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 4dc8f8abf98f6..927010c5ebf32 100644 --- a/third_party/closure/goog/editor/plugins/tableeditor.js +++ b/third_party/closure/goog/editor/plugins/tableeditor.js @@ -35,10 +35,9 @@ 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.editor.plugins.TableEditor.base(this, 'constructor'); + goog.base(this); /** * The array of functions that decide whether a table element could be @@ -112,7 +111,7 @@ goog.editor.plugins.TableEditor.prototype.isSupportedCommand = /** @override */ goog.editor.plugins.TableEditor.prototype.enable = function(fieldObject) { - goog.editor.plugins.TableEditor.base(this, 'enable', fieldObject); + goog.base(this, 'enable', fieldObject); // enableObjectResizing is supported only for Gecko. // You can refer to http://qooxdoo.org/contrib/project/htmlarea/html_editing @@ -379,7 +378,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() { @@ -429,7 +428,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 4e85d6d635152..c586894facbd8 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 7b66530acc712..4222af964ce60 100644 --- a/third_party/closure/goog/editor/plugins/undoredo.js +++ b/third_party/closure/goog/editor/plugins/undoredo.js @@ -21,6 +21,7 @@ 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'); @@ -33,7 +34,6 @@ 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.log.Logger} + * @type {goog.debug.Logger} * @protected * @override */ goog.editor.plugins.UndoRedo.prototype.logger = - goog.log.getLogger('goog.editor.plugins.UndoRedo'); + goog.debug.Logger.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) { - goog.log.error(this.logger, 'Error while restoring undo state', e); + this.logger.severe('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 9a772dd4382e1..ded31d2c7bc0c 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.editor.plugins.UndoRedoState.base(this, 'constructor'); + goog.base(this); /** * 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 34a493eb2069d..ff02ae6f25a61 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,54 +333,53 @@ goog.editor.range.getDeepEndPoint = function(range, atStart) { * range. Should be called after body.normalize() is called. */ goog.editor.range.normalize = function(range) { - 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 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 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; + 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; } /** @return {goog.dom.AbstractRange} The normalized range. */ return function() { - 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 + 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 // element. - anchorPoint.node = anchorPreviousSibling.nextSibling; - if (!anchorPoint.node) { - anchorPoint = goog.editor.range.Point.getPointAtEndOfNode( - anchorPreviousSibling); + startPoint.node = startPreviousSibling.nextSibling; + if (!startPoint.node) { + startPoint = goog.editor.range.Point.getPointAtEndOfNode( + startPreviousSibling); } } - 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 + 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 // longer exist. Do our best and point to the end of the previous // element. - focusPoint.node = focusPreviousSibling.nextSibling; - if (!focusPoint.node) { - focusPoint = goog.editor.range.Point.getPointAtEndOfNode( - focusPreviousSibling); + endPoint.node = endPreviousSibling.nextSibling; + if (!endPoint.node) { + endPoint = goog.editor.range.Point.getPointAtEndOfNode( + endPreviousSibling); } } return goog.dom.Range.createFromNodes( - anchorPoint.node || anchorParent.node.firstChild || anchorParent.node, - anchorPoint.offset, - focusPoint.node || focusParent.node.firstChild || focusParent.node, - focusPoint.offset); + startPoint.node || startParent.node.firstChild || startParent.node, + startPoint.offset, + endPoint.node || endParent.node.firstChild || endParent.node, + endPoint.offset); }; }; @@ -392,7 +391,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) { @@ -467,7 +466,6 @@ 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) { /** @@ -486,7 +484,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; @@ -508,7 +506,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) { @@ -565,7 +563,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)); @@ -580,7 +578,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 e8f82df6646d4..8010013d0f2b8 100644 --- a/third_party/closure/goog/editor/seamlessfield.js +++ b/third_party/closure/goog/editor/seamlessfield.js @@ -26,6 +26,7 @@ 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'); @@ -37,7 +38,6 @@ 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.log.getLogger('goog.editor.SeamlessField'); + goog.debug.Logger.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.editor.SeamlessField.base(this, 'clearListeners'); + goog.base(this, 'clearListeners'); }; diff --git a/third_party/closure/goog/editor/table.js b/third_party/closure/goog/editor/table.js index 1f58bb8f6c3f2..fbf7ab65f8ecf 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,13 +41,12 @@ 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) { - goog.log.error(this.logger_, + this.logger_.severe( "Can't create Table based on a node " + "that isn't a table, or descended from a table."); } @@ -58,11 +57,11 @@ goog.editor.Table = function(node) { /** * Logger object for debugging and error messages. - * @type {goog.log.Logger} + * @type {goog.debug.Logger} * @private */ goog.editor.Table.prototype.logger_ = - goog.log.getLogger('goog.editor.Table'); + goog.debug.Logger.getLogger('goog.editor.Table'); /** @@ -130,7 +129,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 = []; @@ -150,7 +149,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) ? @@ -196,7 +195,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) { @@ -232,7 +231,7 @@ goog.editor.Table.prototype.insertColumn = function(opt_colIndex) { goog.editor.Table.prototype.removeRow = function(rowIndex) { var row = this.rows[rowIndex]; if (!row) { - goog.log.warning(this.logger_, + this.logger_.warning( "Can't remove row at position " + rowIndex + ': no such row.'); } for (var i = 0, cell; cell = row.columns[i]; i += cell.colSpan) { @@ -258,7 +257,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) { - goog.log.error(this.logger_, + this.logger_.severe( "Can't remove cell at position " + i + ', ' + colIndex + ': no such cell.'); } @@ -290,7 +289,7 @@ goog.editor.Table.prototype.mergeCells = function( var cells = []; var cell; if (startRowIndex == endRowIndex && startColIndex == endColIndex) { - goog.log.warning(this.logger_, "Can't merge single cell"); + this.logger_.warning("Can't merge single cell"); return false; } // Gather cells and do sanity check. @@ -301,7 +300,7 @@ goog.editor.Table.prototype.mergeCells = function( cell.endRow > endRowIndex || cell.startCol < startColIndex || cell.endCol > endColIndex) { - goog.log.warning(this.logger_, + this.logger_.warning( "Can't merge cells: the cell in row " + i + ', column ' + j + 'extends outside the supplied rectangle.'); return false; @@ -354,7 +353,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, @@ -405,7 +404,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 @@ -421,7 +420,6 @@ 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; @@ -438,7 +436,6 @@ 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; @@ -526,7 +523,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 a92f395533b5d..2995d538137cf 100644 --- a/third_party/closure/goog/events/actioneventwrapper.js +++ b/third_party/closure/goog/events/actioneventwrapper.js @@ -19,15 +19,11 @@ 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'); @@ -59,8 +55,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.KEYUP + goog.events.EventType.KEYPRESS : + goog.events.EventType.KEYDOWN ]; @@ -70,8 +66,8 @@ goog.events.ActionEventWrapper_.EVENT_TYPES_ = [ * once to an object. * * @param {goog.events.ListenableType} target The target to listen to events on. - * @param {function(?):?|{handleEvent:function(?):?}|null} listener Callback - * method, or an object with a handleEvent function. + * @param {Function|Object} 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. @@ -82,21 +78,13 @@ 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()) { - 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) { + listener.call(opt_scope, e); + } else if (e.keyCode == goog.events.KeyCodes.ENTER || + e.keyCode == goog.events.KeyCodes.MAC_ENTER) { // convert keydown to keypress for backward compatibility. e.type = goog.events.EventType.KEYPRESS; - 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(); + listener.call(opt_scope, e); } }; callback.listener_ = listener; @@ -118,8 +106,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(?):?|{handleEvent:function(?):?}|null} listener Callback - * method, or an object with a handleEvent function. + * @param {Function|Object} 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 190cc26046c38..764eeb856ed50 100644 --- a/third_party/closure/goog/events/actionhandler.js +++ b/third_party/closure/goog/events/actionhandler.js @@ -50,7 +50,6 @@ 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); @@ -158,7 +157,6 @@ 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()); @@ -175,7 +173,6 @@ 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 82a076eb31242..59df7fd496c91 100644 --- a/third_party/closure/goog/events/browserevent.js +++ b/third_party/closure/goog/events/browserevent.js @@ -65,126 +65,6 @@ 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); } @@ -205,7 +85,7 @@ goog.events.BrowserEvent.MouseButton = { /** * Static data for mapping mouse buttons. - * @type {!Array.} + * @type {Array.} */ goog.events.BrowserEvent.IEButtonMap = [ 1, // LEFT @@ -214,6 +94,144 @@ 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. @@ -222,6 +240,7 @@ goog.events.BrowserEvent.IEButtonMap = [ */ 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; @@ -276,6 +295,7 @@ 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 c3d4317ae1ade..ba406d57e5dcf 100644 --- a/third_party/closure/goog/events/event.js +++ b/third_party/closure/goog/events/event.js @@ -21,13 +21,9 @@ 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. - * @suppress {extraRequire} - */ +// goog.events.Event no longer depends on goog.Disposable. Keep requiring +// goog.Disposable here to not break projects which assume this dependency. goog.require('goog.Disposable'); -goog.require('goog.events.EventId'); /** @@ -36,7 +32,7 @@ goog.require('goog.events.EventId'); * 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|goog.events.EventId} + * @typedef {string|Object|goog.events.Event} */ goog.events.EventLike; @@ -46,7 +42,7 @@ goog.events.EventLike; * A base class for event objects, so that they can support preventDefault and * stopPropagation. * - * @param {string|!goog.events.EventId} type Event Type. + * @param {string} 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}. @@ -57,7 +53,7 @@ goog.events.Event = function(type, opt_target) { * Event type. * @type {string} */ - this.type = type instanceof goog.events.EventId ? String(type) : type; + this.type = type; /** * Target of the event. @@ -70,34 +66,6 @@ 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; }; @@ -119,6 +87,34 @@ 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 c45d031da8a23..b66defb9e2422 100644 --- a/third_party/closure/goog/events/eventhandler.js +++ b/third_party/closure/goog/events/eventhandler.js @@ -19,7 +19,7 @@ * Example: *
      * function Something() {
    - *   Something.base(this);
    + *   goog.base(this);
      *
      *   ... set up object ...
      *
    @@ -33,7 +33,7 @@
      * goog.inherits(Something, goog.events.EventHandler);
      *
      * Something.prototype.disposeInternal = function() {
    - *   Something.base(this, 'disposeInternal');
    + *   goog.base(this, 'disposeInternal');
      *   goog.dom.removeNode(this.container);
      * };
      *
    @@ -67,16 +67,13 @@ 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 {SCOPE=} opt_scope Object in whose scope to call the listeners.
    + * @param {Object=} opt_handler Object in whose scope to call the listeners.
      * @constructor
      * @extends {goog.Disposable}
    - * @template SCOPE
      */
    -goog.events.EventHandler = function(opt_scope) {
    +goog.events.EventHandler = function(opt_handler) {
       goog.Disposable.call(this);
    -  // TODO(user): Rename this to this.scope_ and fix the classes in google3
    -  // that access this private variable. :(
    -  this.handler_ = opt_scope;
    +  this.handler_ = opt_handler;
     
       /**
        * Keys for events that are being listened to.
    @@ -92,8 +89,7 @@ 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.}
    - * @const
    + * @type {Array.}
      * @private
      */
     goog.events.EventHandler.typeArray_ = [];
    @@ -103,82 +99,32 @@ 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.|
    - *     !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 {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 {boolean=} opt_capture Optional whether to use capture phase.
    - * @return {!goog.events.EventHandler} This object, allowing for chaining of
    + * @param {Object=} opt_handler 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.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) {
    +goog.events.EventHandler.prototype.listen = function(src, type, opt_fn,
    +                                                     opt_capture,
    +                                                     opt_handler) {
       if (!goog.isArray(type)) {
    -    if (type) {
    -      goog.events.EventHandler.typeArray_[0] = type.toString();
    -    }
    +    goog.events.EventHandler.typeArray_[0] = /** @type {string} */(type);
         type = goog.events.EventHandler.typeArray_;
       }
       for (var i = 0; i < type.length; i++) {
         var listenerObj = goog.events.listen(
    -        src, type[i], opt_fn || this.handleEvent,
    +        src, type[i], opt_fn || this,
             opt_capture || false,
    -        opt_scope || this.handler_ || this);
    +        opt_handler || 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.
    +    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).
           return this;
         }
     
    @@ -196,86 +142,26 @@ 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.|
    - *     !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 {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 {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
    + * @param {Object=} opt_handler 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_scope) {
    +goog.events.EventHandler.prototype.listenOnce = function(src, type, opt_fn,
    +                                                         opt_capture,
    +                                                         opt_handler) {
       if (goog.isArray(type)) {
         for (var i = 0; i < type.length; i++) {
    -      this.listenOnce_(src, type[i], opt_fn, opt_capture, opt_scope);
    +      this.listenOnce(src, type[i], opt_fn, opt_capture, opt_handler);
         }
       } else {
         var listenerObj = goog.events.listenOnce(
    -        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;
    -    }
    -
    +        src, type, opt_fn || this, opt_capture,
    +        opt_handler || this.handler_ || this);
         var key = listenerObj.key;
         this.keys_[key] = listenerObj;
       }
    @@ -292,65 +178,17 @@ goog.events.EventHandler.prototype.listenOnce_ = function(
      * @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: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).
    - * @return {!goog.events.EventHandler} This object, allowing for chaining of
    - *     calls.
    - */
    -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 {Function|Object} 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
    + * @param {Object=} opt_handler 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,
    +goog.events.EventHandler.prototype.listenWithWrapper = function(src, wrapper,
    +    listener, opt_capt, opt_handler) {
    +  wrapper.listen(src, listener, opt_capt, opt_handler || this.handler_ || this,
                      this);
       return this;
     };
    @@ -373,29 +211,24 @@ goog.events.EventHandler.prototype.getListenerCount = function() {
     /**
      * Unlistens on an event.
      * @param {goog.events.ListenableType} src Event source.
    - * @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 {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 {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
    + * @param {Object=} opt_handler 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_scope) {
    +                                                       opt_handler) {
       if (goog.isArray(type)) {
         for (var i = 0; i < type.length; i++) {
    -      this.unlisten(src, type[i], opt_fn, opt_capture, opt_scope);
    +      this.unlisten(src, type[i], opt_fn, opt_capture, opt_handler);
         }
       } else {
    -    var listener = goog.events.getListener(src, type,
    -        opt_fn || this.handleEvent,
    -        opt_capture, opt_scope || this.handler_ || this);
    +    var listener = goog.events.getListener(src, type, opt_fn || this,
    +        opt_capture, opt_handler || this.handler_ || this);
     
         if (listener) {
           goog.events.unlistenByKey(listener);
    @@ -413,19 +246,18 @@ 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(?):?|{handleEvent:function(?):?}|null} listener The
    - *     listener function to remove.
    + * @param {Function|Object} 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_scope Element in whose scope to call the listener.
    - * @return {!goog.events.EventHandler} This object, allowing for chaining of
    + * @param {Object=} opt_handler 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_scope) {
    +    listener, opt_capt, opt_handler) {
       wrapper.unlisten(src, listener, opt_capt,
    -                   opt_scope || this.handler_ || this, this);
    +                   opt_handler || this.handler_ || this, this);
       return this;
     };
     
    diff --git a/third_party/closure/goog/events/eventid.js b/third_party/closure/goog/events/eventid.js
    deleted file mode 100644
    index f7ea4dd1b285a..0000000000000
    --- a/third_party/closure/goog/events/eventid.js
    +++ /dev/null
    @@ -1,47 +0,0 @@
    -// 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 5434587149338..9f3f7f9b58bd2 100644
    --- a/third_party/closure/goog/events/events.js
    +++ b/third_party/closure/goog/events/events.js
    @@ -13,21 +13,17 @@
     // limitations under the License.
     
     /**
    - * @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.
    + * @fileoverview Event Manager.
      *
    - * 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.
    + * 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.
      *
    - * The listeners will receive a "patched" event object. Such event object
    - * contains normalized values for certain event properties that differs in
    - * different browsers.
    + * 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.
      *
      * Example usage:
      * 
    @@ -35,32 +31,41 @@
      * 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 */ -// 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. + +// 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] + 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.ListenerMap'); +goog.require('goog.events.Listener'); +goog.require('goog.object'); /** @@ -77,103 +82,72 @@ 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_ = {}; /** - * Property name on a native event target for the listener map - * associated with the event target. - * @const + * The root of the listener tree * @private + * @type {Object} */ -goog.events.LISTENER_MAP_PROP_ = 'closure_lm_' + ((Math.random() * 1e6) | 0); +goog.events.listenerTree_ = {}; /** - * String used to prepend to IE event types. - * @const + * Lookup for mapping source UIDs to listeners. * @private + * @type {Object} */ -goog.events.onString_ = 'on'; +goog.events.sources_ = {}; /** - * 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 + * String used to prepend to IE event types. Not a constant so that it is not + * inlined. + * @type {string} * @private */ -goog.events.onStringMap_ = {}; - - -/** - * @enum {number} Different capture simulation mode for IE8-. - */ -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 -}; +goog.events.onString_ = 'on'; /** - * @define {number} The capture simulation mode for IE8-. By default, - * this is ON. + * 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 */ -goog.define('goog.events.CAPTURE_SIMULATION_MODE', 2); +goog.events.onStringMap_ = {}; /** - * Estimated count of total native listeners. - * @private {number} + * Separator used to split up the various parts of an event key, to help avoid + * the possibilities of collisions. + * @type {string} + * @private */ -goog.events.listenerCountEstimate_ = 0; +goog.events.keySeparator_ = '_'; /** - * 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(). + * 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(). * - * @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 {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 {boolean=} opt_capt Whether to fire in capture phase (defaults to * false). - * @param {T=} opt_handler Element in whose scope to call the listener. + * @param {Object=} 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)) { @@ -183,31 +157,33 @@ goog.events.listen = function(src, type, listener, opt_capt, opt_handler) { return null; } - listener = goog.events.wrapListener(listener); + var listenableKey; + listener = goog.events.wrapListener_(listener); if (goog.events.Listenable.isImplementedBy(src)) { - return src.listen( - /** @type {string|!goog.events.EventId} */ (type), - listener, opt_capt, opt_handler); + listenableKey = src.listen( + /** @type {string} */ (type), listener, opt_capt, opt_handler); } else { - return goog.events.listen_( + listenableKey = goog.events.listen_( /** @type {EventTarget} */ (src), - /** @type {string|!goog.events.EventId} */ (type), - listener, /* callOnce */ false, opt_capt, opt_handler); + type, listener, /* callOnce */ false, opt_capt, opt_handler); } + + return listenableKey; }; /** - * 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. + * 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 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|!goog.events.EventId} type Event type. + * @param {?string} type Event type or array of event types. * @param {!Function} listener Callback function. * @param {boolean} callOnce Whether the listener is a one-off * listener or otherwise. @@ -224,58 +200,99 @@ goog.events.listen_ = function( } var capture = !!opt_capt; - 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; - } + var map = goog.events.listenerTree_; + + if (!(type in map)) { + map[type] = {count_: 0, remaining_: 0}; } + map = map[type]; - var listenerMap = goog.events.getListenerMap_(src); - if (!listenerMap) { - src[goog.events.LISTENER_MAP_PROP_] = listenerMap = - new goog.events.ListenerMap(src); + if (!(capture in map)) { + map[capture] = {count_: 0, remaining_: 0}; + map.count_++; } + 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; + } - var listenerObj = listenerMap.add( - type, listener, callOnce, opt_capt, opt_handler); + if (!callOnce) { + // Ensure that, if there is an existing callOnce listener, it is no + // longer a callOnce listener. + listenerArray[i].callOnce = false; + } - // If the listenerObj already has a proxy, it has been set up - // previously. We simply return. - if (listenerObj.proxy) { - return listenerObj; + // We already have this listener. Return its key. + return listenerArray[i]; + } + } } var proxy = goog.events.getProxy(); - listenerObj.proxy = proxy; + listenerObj = new goog.events.Listener( + listener, proxy, src, type, capture, opt_handler); + listenerObj.callOnce = callOnce; 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.toString(), proxy, capture); + src.addEventListener(type, 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.toString()), proxy); + src.attachEvent(goog.events.getOnString_(type), proxy); } - goog.events.listenerCountEstimate_++; + var key = listenerObj.key; + goog.events.listeners_[key] = listenerObj; 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_; @@ -299,10 +316,9 @@ goog.events.getProxy = function() { /** - * 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. + * 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. * * If an existing listener already exists, listenOnce will do * nothing. In particular, if the listener was previously registered @@ -311,17 +327,13 @@ goog.events.getProxy = function() { * one-off listener, listenOnce does not modify the listeners (it is * still a once listener). * - * @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 {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 {boolean=} opt_capt Fire in capture phase?. - * @param {T=} opt_handler Element in whose scope to call the listener. + * @param {Object=} 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)) { @@ -331,17 +343,18 @@ goog.events.listenOnce = function(src, type, listener, opt_capt, opt_handler) { return null; } - listener = goog.events.wrapListener(listener); + var listenableKey; + listener = goog.events.wrapListener_(listener); if (goog.events.Listenable.isImplementedBy(src)) { - return src.listenOnce( - /** @type {string|!goog.events.EventId} */ (type), - listener, opt_capt, opt_handler); + listenableKey = src.listenOnce( + /** @type {string} */ (type), listener, opt_capt, opt_handler); } else { - return goog.events.listen_( + listenableKey = goog.events.listen_( /** @type {EventTarget} */ (src), - /** @type {string|!goog.events.EventId} */ (type), - listener, /* callOnce */ true, opt_capt, opt_handler); + type, listener, /* callOnce */ true, opt_capt, opt_handler); } + + return listenableKey; }; @@ -350,15 +363,13 @@ 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 {EventTarget|goog.events.Listenable} src The target to - * listen to events on. + * @param {goog.events.ListenableType} src The target to listen to events on. * @param {goog.events.EventWrapper} wrapper Event wrapper to use. - * @param {function(this:T, ?):?|{handleEvent:function(?):?}|null} listener - * Callback method, or an object with a handleEvent function. + * @param {Function|Object} listener Callback method, or an object with a + * handleEvent function. * @param {boolean=} opt_capt Whether to fire in capture phase (defaults to * false). - * @param {T=} opt_handler Element in whose scope to call the listener. - * @template T + * @param {Object=} opt_handler Element in whose scope to call the listener. */ goog.events.listenWithWrapper = function(src, wrapper, listener, opt_capt, opt_handler) { @@ -369,19 +380,16 @@ goog.events.listenWithWrapper = function(src, wrapper, listener, opt_capt, /** * Removes an event listener which was added with listen(). * - * @param {EventTarget|goog.events.Listenable} src The target to stop + * @param {goog.events.ListenableType} src The target to stop * listening to events on. - * @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 {string|Array.} type The name of the event without the 'on' + * prefix. + * @param {Function|Object} 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)) { @@ -391,28 +399,24 @@ 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|!goog.events.EventId} */ (type), - listener, opt_capt, opt_handler); + /** @type {string} */ (type), listener, opt_capt, opt_handler); } - if (!src) { - // TODO(user): We should tighten the API to only accept - // non-null objects, or add an assertion here. + var capture = !!opt_capt; + + var listenerArray = goog.events.getListeners_(src, type, capture); + if (!listenerArray) { return false; } - 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); + 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]); } } @@ -436,7 +440,10 @@ goog.events.unlistenByKey = function(key) { } var listener = /** @type {goog.events.ListenableKey} */ (key); - if (!listener || listener.removed) { + if (!listener) { + return false; + } + if (listener.removed) { return false; } @@ -447,31 +454,47 @@ goog.events.unlistenByKey = function(key) { var type = listener.type; var proxy = listener.proxy; + var capture = listener.capture; + if (src.removeEventListener) { - src.removeEventListener(type, proxy, listener.capture); + src.removeEventListener(type, proxy, capture); } else if (src.detachEvent) { src.detachEvent(goog.events.getOnString_(type), proxy); } - 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; + + 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]; } - } 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; }; @@ -479,11 +502,10 @@ goog.events.unlistenByKey = function(key) { /** * Removes an event listener which was added with listenWithWrapper(). * - * @param {EventTarget|goog.events.Listenable} src The target to stop - * listening to events on. + * @param {goog.events.ListenableType} src The target to stop listening to + * events on. * @param {goog.events.EventWrapper} wrapper Event wrapper to use. - * @param {function(?):?|{handleEvent:function(?):?}|null} listener The - * listener function to remove. + * @param {Function|Object} 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. @@ -495,6 +517,79 @@ 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. @@ -502,42 +597,38 @@ goog.events.unlistenWithWrapper = function(src, wrapper, listener, opt_capt, * @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|!goog.events.EventId=} opt_type Type of event to remove. - * Default is all types. + * @param {string=} opt_type Type of event to, default is all types. * @return {number} Number of listeners removed. */ goog.events.removeAll = function(opt_obj, opt_type) { - // 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 count = 0; - if (goog.events.Listenable.isImplementedBy(opt_obj)) { - return opt_obj.removeAllListeners(opt_type); - } + var noObj = opt_obj == null; + var noType = opt_type == null; - var listenerMap = goog.events.getListenerMap_( - /** @type {EventTarget} */ (opt_obj)); - if (!listenerMap) { - return 0; - } + if (!noObj) { + if (opt_obj && goog.events.Listenable.isImplementedBy(opt_obj)) { + return opt_obj.removeAllListeners(opt_type); + } - 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; + 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++; } } } + } else { + goog.object.forEach(goog.events.listeners_, function(listener) { + goog.events.unlistenByKey(listener); + count++; + }); } + return count; }; @@ -548,12 +639,18 @@ 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() { - goog.events.listenerCountEstimate_ = 0; - return 0; + 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; }; @@ -561,7 +658,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|!goog.events.EventId} type Event type. + * @param {string} type Event type. * @param {boolean} capture Capture phase?. * @return {Array.} Array of listener objects. */ @@ -569,16 +666,35 @@ goog.events.getListeners = function(obj, type, capture) { if (goog.events.Listenable.isImplementedBy(obj)) { return obj.getListeners(type, capture); } else { - if (!obj) { - // TODO(user): We should tighten the API to accept - // !EventTarget|goog.events.Listenable, and add an assertion here. - return []; - } + return goog.events.getListeners_(obj, type, capture) || []; + } +}; + - var listenerMap = goog.events.getListenerMap_( - /** @type {EventTarget} */ (obj)); - return listenerMap ? listenerMap.getListeners(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]; + } + } } + + return null; }; @@ -586,37 +702,39 @@ 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 {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 {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 {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; - if (goog.events.Listenable.isImplementedBy(src)) { - return src.getListener(type, listener, capture, opt_handler); - } - if (!src) { - // TODO(user): We should tighten the API to only accept - // non-null objects, or add an assertion here. - return null; + listener = goog.events.wrapListener_(listener); + if (goog.events.Listenable.isImplementedBy(src)) { + return src.getListener( + /** @type {string} */ (type), listener, capture, opt_handler); } - var listenerMap = goog.events.getListenerMap_( - /** @type {EventTarget} */ (src)); - if (listenerMap) { - return listenerMap.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]; + } + } } return null; }; @@ -627,9 +745,8 @@ 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 {EventTarget|goog.events.Listenable} obj Target to get - * listeners for. - * @param {string|!goog.events.EventId=} opt_type Event type. + * @param {goog.events.ListenableType} obj Target to get listeners for. + * @param {string=} 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 @@ -640,9 +757,32 @@ goog.events.hasListener = function(obj, opt_type, opt_capture) { return obj.hasListener(opt_type, opt_capture); } - var listenerMap = goog.events.getListenerMap_( - /** @type {EventTarget} */ (obj)); - return !!listenerMap && listenerMap.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; }; @@ -665,10 +805,10 @@ goog.events.expose = function(e) { /** - * Returns a string with on prepended to the specified type. This is used for IE + * Returns a string wth 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. + * @param {string} type Event type strng. * @return {string} The type string with 'on' prepended. * @private */ @@ -684,7 +824,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|!goog.events.EventId} type Event type. + * @param {string} 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. @@ -694,42 +834,68 @@ goog.events.fireListeners = function(obj, type, capture, eventObject) { return obj.fireListeners(type, capture, eventObject); } - return goog.events.fireListeners_(obj, 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; }; /** * 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|!goog.events.EventId} type Event type. + * @param {string} 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(obj, type, capture, eventObject) { +goog.events.fireListeners_ = function(map, obj, type, capture, eventObject) { var retval = 1; - 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 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 listener = listenerArray[i]; // We might not have a listener if the listener was removed. - if (listener && listener.capture == capture && !listener.removed) { + if (listener && !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); }; @@ -755,13 +921,9 @@ 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.events.listenerCountEstimate_; + return goog.object.getCount(goog.events.listeners_); }; @@ -811,7 +973,9 @@ 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 {EventTarget} The object or Element that fired the event. + * @this {goog.events.EventTarget|Object} The object or Element that + * fired the event. TODO(user): Figure out why the type is + * so weird? * @private */ goog.events.handleBrowserEvent_ = function(listener, opt_evt) { @@ -819,58 +983,92 @@ 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; - 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); + // 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)); + 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); } - // Fire capture listeners. - var type = listener.type; - for (var i = ancestors.length - 1; !evt.propagationStopped_ && i >= 0; + targetsMap = map[true]; + targetsMap.remaining_ = targetsMap.count_; + + // Call capture listeners + for (var i = ancestors.length - 1; + !evt.propagationStopped_ && i >= 0 && targetsMap.remaining_; i--) { evt.currentTarget = ancestors[i]; - retval &= goog.events.fireListeners_(ancestors[i], type, true, evt); + retval &= goog.events.fireListeners_(targetsMap, ancestors[i], type, + true, 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); + 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); + } } + + } 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 - // Otherwise, simply fire the listener. - return goog.events.fireListener( - listener, new goog.events.BrowserEvent(opt_evt, this)); + // 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; }; @@ -926,7 +1124,8 @@ goog.events.isMarkedIeEvent_ = function(e) { /** * Counter to create unique event ids. - * @private {number} + * @type {number} + * @private */ goog.events.uniqueIdCounter_ = 0; @@ -943,24 +1142,10 @@ 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. - * @const + * @type {string} * @private */ goog.events.LISTENER_WRAPPER_PROP_ = '__closure_events_fn_' + @@ -974,8 +1159,9 @@ 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 c4f77b8d9337f..e1426c0eb6aae 100644 --- a/third_party/closure/goog/events/eventtarget.js +++ b/third_party/closure/goog/events/eventtarget.js @@ -13,14 +13,11 @@ // limitations under the License. /** - * @fileoverview A disposable implementation of a custom - * listenable/event target. See also: documentation for - * {@code goog.events.Listenable}. + * @fileoverview Implementation of EventTarget as defined by W3C DOM 2/3. * * @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'); @@ -31,37 +28,53 @@ goog.require('goog.asserts'); goog.require('goog.events'); goog.require('goog.events.Event'); goog.require('goog.events.Listenable'); -goog.require('goog.events.ListenerMap'); +goog.require('goog.events.Listener'); goog.require('goog.object'); /** - * An implementation of {@code goog.events.Listenable} with full W3C - * EventTarget-like support (capture/bubble mechanism, stopping event - * propagation, preventing default actions). + * 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(). * - * You may subclass this class to turn your class into a Listenable. + *

    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. + *
    * - * 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. + *

    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. * - * Example usage: + *

    Example usage: *

      *   var source = new goog.events.EventTarget();
    - *   function handleEvent(e) {
    - *     alert('Type: ' + e.type + '; Target: ' + e.target);
    + *   function handleEvent(event) {
    + *     alert('Type: ' + e.type + '\nTarget: ' + e.target);
      *   }
    - *   source.listen('foo', handleEvent);
    - *   // Or: goog.events.listen(source, 'foo', handleEvent);
    + *   goog.events.listen(source, 'foo', handleEvent);
      *   ...
    - *   source.dispatchEvent('foo');  // will call handleEvent
    + *   source.dispatchEvent({type: 'foo'}); // will call handleEvent
    + *   // or source.dispatchEvent('foo');
      *   ...
    - *   source.unlisten('foo', handleEvent);
    - *   // Or: goog.events.unlisten(source, 'foo', 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);
      * 
    * * @constructor @@ -73,14 +86,17 @@ goog.events.EventTarget = function() { /** * Maps of event type to an array of listeners. - * @private {!goog.events.ListenerMap} + * + * @type {Object.>} + * @private */ - this.eventTargetListeners_ = new goog.events.ListenerMap(this); + this.eventTargetListeners_ = {}; /** * The object to use for event.target. Useful when mixing in an * EventTarget to another object. - * @private {!Object} + * @type {!Object} + * @private */ this.actualEventTarget_ = this; }; @@ -99,12 +115,7 @@ goog.events.EventTarget.MAX_ANCESTORS_ = 1000; /** * Parent event target, used during event bubbling. - * - * TODO(user): Change this to goog.events.Listenable. This - * currently breaks people who expect getParentEventTarget to return - * goog.events.EventTarget. - * - * @type {goog.events.EventTarget} + * @type {goog.events.EventTarget?} * @private */ goog.events.EventTarget.prototype.parentEventTarget_ = null; @@ -113,9 +124,8 @@ 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. - * @override + * @return {goog.events.EventTarget} The parent EventTarget or null if there + * is no parent. */ goog.events.EventTarget.prototype.getParentEventTarget = function() { return this.parentEventTarget_; @@ -123,9 +133,9 @@ goog.events.EventTarget.prototype.getParentEventTarget = function() { /** - * Sets the parent of this event target to use for capture/bubble - * mechanism. - * @param {goog.events.EventTarget} parent Parent listenable (null if none). + * Sets the parent of this event target to use for bubbling. + * + * @param {goog.events.EventTarget?} parent Parent EventTarget (null if none). */ goog.events.EventTarget.prototype.setParentEventTarget = function(parent) { this.parentEventTarget_ = parent; @@ -138,18 +148,19 @@ 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(?):?|{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 {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 {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) { @@ -162,18 +173,17 @@ 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(?):?|{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 {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 {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) { @@ -203,10 +213,17 @@ goog.events.EventTarget.prototype.dispatchEvent = function(e) { /** - * Removes listeners from this object. Classes that extend EventTarget may + * Unattach 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. + * and additional listeners, it should be something like this: + *
    + * MyClass.prototype.disposeInternal = function() {
    + *   MyClass.superClass_.disposeInternal.call(this);
    + *   // Dispose logic for MyClass
    + * };
    + * 
    * @override + * @protected */ goog.events.EventTarget.prototype.disposeInternal = function() { goog.events.EventTarget.superClass_.disposeInternal.call(this); @@ -216,65 +233,147 @@ 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) { - this.assertInitialized_(); - return this.eventTargetListeners_.add( - String(type), listener, false /* callOnce */, opt_useCapture, - opt_listenerScope); + return this.listenInternal_( + type, listener, false /* callOnce */, opt_useCapture, opt_listenerScope); }; /** @override */ goog.events.EventTarget.prototype.listenOnce = function( type, listener, opt_useCapture, opt_listenerScope) { - return this.eventTargetListeners_.add( - String(type), listener, true /* callOnce */, 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; }; /** @override */ goog.events.EventTarget.prototype.unlisten = function( type, listener, opt_useCapture, opt_listenerScope) { - return this.eventTargetListeners_.remove( - String(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; }; /** @override */ goog.events.EventTarget.prototype.unlistenByKey = function(key) { - return this.eventTargetListeners_.removeByKey(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; }; /** @override */ -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; +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; + } } - return this.eventTargetListeners_.removeAll(opt_type); + return count; }; /** @override */ goog.events.EventTarget.prototype.fireListeners = function( type, capture, eventObject) { - // 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) { + if (!(type in this.eventTargetListeners_)) { 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. @@ -295,23 +394,50 @@ goog.events.EventTarget.prototype.fireListeners = function( /** @override */ goog.events.EventTarget.prototype.getListeners = function(type, capture) { - return this.eventTargetListeners_.getListeners(String(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; }; /** @override */ goog.events.EventTarget.prototype.getListener = function( type, listener, capture, opt_listenerScope) { - return this.eventTargetListeners_.getListener( - String(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; }; /** @override */ goog.events.EventTarget.prototype.hasListener = function( opt_type, opt_capture) { - var id = goog.isDef(opt_type) ? String(opt_type) : undefined; - return this.eventTargetListeners_.hasListener(id, 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; + }); }; @@ -326,21 +452,12 @@ 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 @@ -396,3 +513,28 @@ 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 4d9cec204d4b8..6243db905527f 100644 --- a/third_party/closure/goog/events/eventtargettester.js +++ b/third_party/closure/goog/events/eventtargettester.js @@ -34,8 +34,6 @@ 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. @@ -73,12 +71,10 @@ 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; @@ -99,7 +95,7 @@ goog.events.eventTargetTester.setUp = function( eventTargets = []; for (i = 0; i < goog.events.eventTargetTester.MAX_; i++) { - eventTargets[i] = listenableFactory(); + eventTargets[i] = new goog.events.EventTarget(); } }; @@ -197,7 +193,6 @@ var eventTargets, listeners; * Custom event object for testing. * @constructor * @extends {goog.events.Event} - * @final */ var TestEvent = function() { goog.base(this, EventType.A); @@ -388,9 +383,6 @@ 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); @@ -935,31 +927,6 @@ 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; @@ -1026,7 +993,6 @@ function testFiringEventBeforeDisposeInternalWorks() { /** * @extends {goog.events.EventTarget} * @constructor - * @final */ var MockTarget = function() { goog.base(this); @@ -1050,7 +1016,7 @@ function testFiringEventBeforeDisposeInternalWorks() { function testLoopDetection() { - var target = listenableFactory(); + var target = new goog.events.EventTarget(); target.setParentEventTarget(target); try { diff --git a/third_party/closure/goog/events/eventtype.js b/third_party/closure/goog/events/eventtype.js index 3f9e5fd57f231..06fcb41ad4e53 100644 --- a/third_party/closure/goog/events/eventtype.js +++ b/third_party/closure/goog/events/eventtype.js @@ -25,20 +25,6 @@ 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} @@ -52,10 +38,6 @@ 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 @@ -102,14 +84,12 @@ 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', @@ -142,35 +122,13 @@ 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 - /** @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', + TRANSITIONEND: goog.userAgent.WEBKIT ? 'webkitTransitionEnd' : + (goog.userAgent.OPERA ? 'oTransitionEnd' : 'transitionend'), // IE specific events. - // See http://msdn.microsoft.com/en-us/library/ie/hh772103(v=vs.85).aspx - // Note: these events will be supplanted in IE11. + // See http://msdn.microsoft.com/en-us/library/ie/hh673557(v=vs.85).aspx MSGESTURECHANGE: 'MSGestureChange', MSGESTUREEND: 'MSGestureEnd', MSGESTUREHOLD: 'MSGestureHold', @@ -181,45 +139,14 @@ goog.events.EventType = { MSLOSTPOINTERCAPTURE: 'MSLostPointerCapture', MSPOINTERCANCEL: 'MSPointerCancel', MSPOINTERDOWN: 'MSPointerDown', - MSPOINTERENTER: 'MSPointerEnter', - MSPOINTERHOVER: 'MSPointerHover', - MSPOINTERLEAVE: 'MSPointerLeave', MSPOINTERMOVE: 'MSPointerMove', - MSPOINTEROUT: 'MSPointerOut', MSPOINTEROVER: 'MSPointerOver', + MSPOINTEROUT: 'MSPointerOut', MSPOINTERUP: 'MSPointerUp', // Native IMEs/input tools events. TEXTINPUT: 'textinput', COMPOSITIONSTART: 'compositionstart', COMPOSITIONUPDATE: 'compositionupdate', - 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' + COMPOSITIONEND: 'compositionend' }; diff --git a/third_party/closure/goog/events/eventwrapper.js b/third_party/closure/goog/events/eventwrapper.js index 158177425435c..aedfeaa256662 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(?):?|{handleEvent:function(?):?}|null} listener Callback - * method, or an object with a handleEvent function. + * @param {Function|Object} 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(?):?|{handleEvent:function(?):?}|null} listener Callback - * method, or an object with a handleEvent function. + * @param {Function|Object} 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 5395a51c5669d..be6ea2c9c7469 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,14 +43,13 @@ goog.require('goog.log'); * 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); @@ -102,11 +101,11 @@ goog.events.FileDropHandler.prototype.dndContainsFiles_ = false; /** * A logger, used to help us debug the algorithm. - * @type {goog.log.Logger} + * @type {goog.debug.Logger} * @private */ goog.events.FileDropHandler.prototype.logger_ = - goog.log.getLogger('goog.events.FileDropHandler'); + goog.debug.Logger.getLogger('goog.events.FileDropHandler'); /** @@ -131,7 +130,7 @@ goog.events.FileDropHandler.prototype.disposeInternal = function() { * @private */ goog.events.FileDropHandler.prototype.dispatch_ = function(e) { - goog.log.fine(this.logger_, 'Firing DROP event...'); + this.logger_.fine('Firing DROP event...'); var event = new goog.events.BrowserEvent(e.getBrowserEvent()); event.type = goog.events.FileDropHandler.EventType.DROP; this.dispatchEvent(event); @@ -144,8 +143,8 @@ goog.events.FileDropHandler.prototype.dispatch_ = function(e) { * @private */ goog.events.FileDropHandler.prototype.onDocDragEnter_ = function(e) { - goog.log.log(this.logger_, goog.log.Level.FINER, - '"' + e.target.id + '" (' + e.target + ') dispatched: ' + e.type); + this.logger_.finer('"' + e.target.id + '" (' + e.target + ') dispatched: ' + + e.type); var dt = e.getBrowserEvent().dataTransfer; // Check whether the drag event contains files. this.dndContainsFiles_ = !!(dt && @@ -158,8 +157,7 @@ goog.events.FileDropHandler.prototype.onDocDragEnter_ = function(e) { // Prevent default actions. e.preventDefault(); } - goog.log.log(this.logger_, goog.log.Level.FINER, - 'dndContainsFiles_: ' + this.dndContainsFiles_); + this.logger_.finer('dndContainsFiles_: ' + this.dndContainsFiles_); }; @@ -169,8 +167,8 @@ goog.events.FileDropHandler.prototype.onDocDragEnter_ = function(e) { * @private */ goog.events.FileDropHandler.prototype.onDocDragOver_ = function(e) { - goog.log.log(this.logger_, goog.log.Level.FINEST, - '"' + e.target.id + '" (' + e.target + ') dispatched: ' + e.type); + this.logger_.finest('"' + e.target.id + '" (' + e.target + ') dispatched: ' + + e.type); if (this.dndContainsFiles_) { // Prevent default actions. e.preventDefault(); @@ -187,8 +185,8 @@ goog.events.FileDropHandler.prototype.onDocDragOver_ = function(e) { * @private */ goog.events.FileDropHandler.prototype.onElemDragOver_ = function(e) { - goog.log.log(this.logger_, goog.log.Level.FINEST, - '"' + e.target.id + '" (' + e.target + ') dispatched: ' + e.type); + this.logger_.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). @@ -208,8 +206,8 @@ goog.events.FileDropHandler.prototype.onElemDragOver_ = function(e) { * @private */ goog.events.FileDropHandler.prototype.onElemDrop_ = function(e) { - goog.log.log(this.logger_, goog.log.Level.FINER, - '"' + e.target.id + '" (' + e.target + ') dispatched: ' + e.type); + this.logger_.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 f4e1000b3c76e..a4fc9332abfba 100644 --- a/third_party/closure/goog/events/focushandler.js +++ b/third_party/closure/goog/events/focushandler.js @@ -38,7 +38,6 @@ 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 68b38a295b9e5..238b7903a5263 100644 --- a/third_party/closure/goog/events/imehandler.js +++ b/third_party/closure/goog/events/imehandler.js @@ -57,10 +57,9 @@ goog.require('goog.userAgent'); * @param {Element} el The element to listen on. * @extends {goog.events.EventTarget} * @constructor - * @final */ goog.events.ImeHandler = function(el) { - goog.events.ImeHandler.base(this, 'constructor'); + goog.base(this); /** * The element to listen on. @@ -72,14 +71,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); @@ -124,10 +123,9 @@ 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.events.ImeHandler.Event.base(this, 'constructor', type); + goog.base(this, type); /** * The event that triggered this. @@ -361,5 +359,5 @@ goog.events.ImeHandler.prototype.disposeInternal = function() { this.handler_.dispose(); this.keyUpHandler_.dispose(); this.el_ = null; - goog.events.ImeHandler.base(this, 'disposeInternal'); + goog.base(this, 'disposeInternal'); }; diff --git a/third_party/closure/goog/events/inputhandler.js b/third_party/closure/goog/events/inputhandler.js index 4e60ab8cb3f3c..a910183e9d1c6 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.events.InputHandler.base(this, 'constructor'); + goog.base(this); /** * 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,14 +125,6 @@ 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. @@ -202,7 +194,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) { @@ -214,7 +206,7 @@ goog.events.InputHandler.prototype.createInputEvent_ = function(be) { /** @override */ goog.events.InputHandler.prototype.disposeInternal = function() { - goog.events.InputHandler.base(this, 'disposeInternal'); + goog.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 14e69073978f4..53126a6b94329 100644 --- a/third_party/closure/goog/events/keycodes.js +++ b/third_party/closure/goog/events/keycodes.js @@ -69,7 +69,6 @@ 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, @@ -148,8 +147,6 @@ 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 @@ -259,9 +256,6 @@ 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 || @@ -362,22 +356,6 @@ 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. @@ -389,8 +367,6 @@ 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: @@ -399,18 +375,3 @@ 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 6a7662f539e47..df565fe640f0c 100644 --- a/third_party/closure/goog/events/keyhandler.js +++ b/third_party/closure/goog/events/keyhandler.js @@ -124,7 +124,6 @@ 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); @@ -305,6 +304,7 @@ 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,7 +330,9 @@ goog.events.KeyHandler.prototype.handleKeyDown_ = function(e) { this.lastKey_, e.shiftKey, e.ctrlKey, e.altKey)) { this.handleEvent(e); } else { - this.keyCode_ = goog.events.KeyCodes.normalizeKeyCode(e.keyCode); + this.keyCode_ = goog.userAgent.GECKO ? + goog.events.KeyCodes.normalizeGeckoKeyCode(e.keyCode) : + e.keyCode; if (goog.events.KeyHandler.SAVE_ALT_FOR_KEYPRESS_) { this.altKey_ = e.altKey; } @@ -411,7 +413,6 @@ goog.events.KeyHandler.prototype.handleEvent = function(e) { } } - keyCode = goog.events.KeyCodes.normalizeKeyCode(keyCode); var key = keyCode; var keyIdentifier = be.keyIdentifier; @@ -528,7 +529,6 @@ 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 b8e36af0ba636..0dfea1d6c7019 100644 --- a/third_party/closure/goog/events/keynames.js +++ b/third_party/closure/goog/events/keynames.js @@ -22,14 +22,7 @@ goog.provide('goog.events.KeyNames'); /** - * 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 + * Key names for common characters. * * This list is not localized and therefore some of the key codes are not * correct for non-US keyboard layouts. @@ -130,7 +123,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 af3a688b657a5..eaa458dbcc123 100644 --- a/third_party/closure/goog/events/listenable.js +++ b/third_party/closure/goog/events/listenable.js @@ -19,37 +19,11 @@ goog.provide('goog.events.Listenable'); goog.provide('goog.events.ListenableKey'); -/** @suppress {extraRequire} */ -goog.require('goog.events.EventId'); - /** - * 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)}. - * + * A listenable interface. Also see goog.events.EventTarget. * @interface - * @see goog.events - * @see http://www.w3.org/TR/DOM-Level-2-Events/events.html */ goog.events.Listenable = function() {}; @@ -86,11 +60,7 @@ goog.events.Listenable.addImplementation = function(cls) { * addImplementation. */ goog.events.Listenable.isImplementedBy = function(obj) { - try { - return !!(obj && obj[goog.events.Listenable.IMPLEMENTED_BY_PROP]); - } catch (e) { - return false; - } + return !!(obj && obj[goog.events.Listenable.IMPLEMENTED_BY_PROP]); }; @@ -101,15 +71,14 @@ 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|!goog.events.EventId.} type The event type id. - * @param {function(this:SCOPE, EVENTOBJ):(boolean|undefined)} listener Callback - * method. + * @param {string} type Event type or array of event types. + * @param {!Function} listener Callback method, or an object + * with a handleEvent function. * @param {boolean=} opt_useCapture Whether to fire in capture phase * (defaults to false). - * @param {SCOPE=} opt_listenerScope Object in whose scope to call the + * @param {Object=} 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; @@ -125,15 +94,14 @@ goog.events.Listenable.prototype.listen; * one-off listener, listenOnce does not modify the listeners (it is * still a once listener). * - * @param {string|!goog.events.EventId.} type The event type id. - * @param {function(this:SCOPE, EVENTOBJ):(boolean|undefined)} listener Callback - * method. + * @param {string} type Event type or array of event types. + * @param {!Function} listener Callback method, or an object + * with a handleEvent function. * @param {boolean=} opt_useCapture Whether to fire in capture phase * (defaults to false). - * @param {SCOPE=} opt_listenerScope Object in whose scope to call the + * @param {Object=} 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; @@ -141,15 +109,17 @@ goog.events.Listenable.prototype.listenOnce; /** * Removes an event listener which was added with listen() or listenOnce(). * - * @param {string|!goog.events.EventId.} type The event type id. - * @param {function(this:SCOPE, EVENTOBJ):(boolean|undefined)} listener Callback - * method. + * 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 {boolean=} opt_useCapture Whether to fire in capture phase * (defaults to false). - * @param {SCOPE=} opt_listenerScope Object in whose scope to call + * @param {Object=} 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; @@ -158,6 +128,8 @@ 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. @@ -186,6 +158,9 @@ 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. @@ -193,35 +168,19 @@ 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|!goog.events.EventId.} type The type of the - * listeners to fire. + * @param {string} type The type of the listeners to fire. * @param {boolean} capture The capture mode of the listeners to fire. - * @param {EVENTOBJ} eventObject The event object to fire. + * @param {goog.events.Event} 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; @@ -230,11 +189,10 @@ goog.events.Listenable.prototype.fireListeners; * Gets all listeners in this listenable for the given type and * capture mode. * - * @param {string|!goog.events.EventId} type The type of the listeners to fire. + * @param {string} 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; @@ -243,15 +201,12 @@ goog.events.Listenable.prototype.getListeners; * Gets the goog.events.ListenableKey for the event or null if no such * listener is in use. * - * @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 {string} type The name of the event without the 'on' prefix. + * @param {!Function} listener The listener function to get. * @param {boolean} capture Whether the listener is a capturing listener. - * @param {SCOPE=} opt_listenerScope Object in whose scope to call the + * @param {Object=} 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; @@ -261,12 +216,11 @@ 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|!goog.events.EventId.=} opt_type Event type. + * @param {string=} 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; @@ -313,7 +267,8 @@ goog.events.ListenableKey.prototype.type; /** * The listener function. - * @type {function(?):?|{handleEvent:function(?):?}|null} + * TODO(user): Narrow the type if possible. + * @type {Function|Object} */ goog.events.ListenableKey.prototype.listener; diff --git a/third_party/closure/goog/events/listener.js b/third_party/closure/goog/events/listener.js index 60c737021b665..a38274e057fd5 100644 --- a/third_party/closure/goog/events/listener.js +++ b/third_party/closure/goog/events/listener.js @@ -48,9 +48,7 @@ goog.events.Listener = function( this.listener = listener; /** - * 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). + * Proxy for callback that passes through {@link goog.events#HandleEvent_}. * @type {Function} */ this.proxy = proxy; diff --git a/third_party/closure/goog/events/listenermap.js b/third_party/closure/goog/events/listenermap.js deleted file mode 100644 index 8930eb6c8c188..0000000000000 --- a/third_party/closure/goog/events/listenermap.js +++ /dev/null @@ -1,308 +0,0 @@ -// 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 6729064c83398..55a3b3807cc22 100644 --- a/third_party/closure/goog/events/mousewheelhandler.js +++ b/third_party/closure/goog/events/mousewheelhandler.js @@ -258,7 +258,6 @@ 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 d65b314ce313b..4efdc07edc752 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.events.OnlineHandler.base(this, 'constructor'); + goog.base(this); /** - * @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.events.OnlineHandler.base(this, 'disposeInternal'); + goog.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 8e1018d7e388e..cbd66436e791f 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.log.Logger} + * @type {goog.debug.Logger} * @private */ goog.events.PasteHandler.prototype.logger_ = - goog.log.getLogger('goog.events.PasteHandler'); + goog.debug.Logger.getLogger('goog.events.PasteHandler'); /** @override */ @@ -230,10 +230,8 @@ 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_; @@ -251,7 +249,7 @@ goog.events.PasteHandler.prototype.checkUpdatedText_ = function() { if (this.oldValue_ == this.element_.value) { return false; } - goog.log.info(this.logger_, 'detected textchange after paste'); + this.logger_.info('detected textchange after paste'); this.dispatchEvent(goog.events.PasteHandler.EventType.AFTER_PASTE); return true; }; @@ -348,12 +346,12 @@ goog.events.PasteHandler.prototype.handleEvent_ = function(e) { break; } default: { - goog.log.error(this.logger_, 'invalid ' + this.state_ + ' state'); + this.logger_.severe('invalid ' + this.state_ + ' state'); } } this.lastTime_ = goog.now(); this.oldValue_ = this.element_.value; - goog.log.info(this.logger_, e.type + ' -> ' + this.state_); + this.logger_.info(e.type + ' -> ' + this.state_); this.previousEvent_ = e.type; }; @@ -384,14 +382,13 @@ 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_) { - goog.log.info(this.logger_, 'paste by dragdrop while on init!'); + this.logger_.info('paste by dragdrop while on init!'); this.dispatch_(e); } break; } default: { - goog.log.error(this.logger_, - 'unexpected event ' + e.type + 'during init'); + this.logger_.severe('unexpected event ' + e.type + 'during init'); } } }; @@ -436,7 +433,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) { - goog.log.info(this.logger_, 'paste by textchange while focused!'); + this.logger_.info('paste by textchange while focused!'); this.dispatch_(e); } break; @@ -446,7 +443,7 @@ goog.events.PasteHandler.prototype.handleUnderFocused_ = function(e) { break; } case goog.events.EventType.KEYDOWN: { - goog.log.info(this.logger_, 'key down ... looking for ctrl+v'); + this.logger_.info('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 || @@ -458,14 +455,13 @@ goog.events.PasteHandler.prototype.handleUnderFocused_ = function(e) { } case goog.events.EventType.MOUSEOVER: { if (this.element_.value != this.oldValue_) { - goog.log.info(this.logger_, 'paste by dragdrop while focused!'); + this.logger_.info('paste by dragdrop while focused!'); this.dispatch_(e); } break; } default: { - goog.log.error(this.logger_, - 'unexpected event ' + e.type + ' during focused'); + this.logger_.severe('unexpected event ' + e.type + ' during focused'); } } }; @@ -497,21 +493,20 @@ 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) { - goog.log.info(this.logger_, 'paste by ctrl+v while keypressed!'); + this.logger_.info('paste by ctrl+v while keypressed!'); this.dispatch_(e); } break; } case goog.events.EventType.MOUSEOVER: { if (this.element_.value != this.oldValue_) { - goog.log.info(this.logger_, 'paste by dragdrop while keypressed!'); + this.logger_.info('paste by dragdrop while keypressed!'); this.dispatch_(e); } break; } default: { - goog.log.error(this.logger_, - 'unexpected event ' + e.type + ' during keypressed'); + this.logger_.severe('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 8f3cfa15a4e6d..e74bd3f487543 100644 --- a/third_party/closure/goog/format/emailaddress.js +++ b/third_party/closure/goog/format/emailaddress.js @@ -29,7 +29,6 @@ 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) { /** @@ -104,47 +103,6 @@ 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. @@ -243,29 +201,9 @@ 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 - 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); + var filter = + /^[+a-zA-Z0-9_.!#$%&'*\/=?^`{|}~-]+@([a-zA-Z0-9-]+\.)+[a-zA-Z0-9]{2,6}$/; + return filter.test(str); }; @@ -273,7 +211,7 @@ goog.format.EmailAddress.isValidDomainPartSpec = 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. @@ -311,18 +249,13 @@ 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 3fe9dd4dddd1f..2ac1327912f6a 100644 --- a/third_party/closure/goog/format/format.js +++ b/third_party/closure/goog/format/format.js @@ -104,19 +104,15 @@ 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, - opt_useSeparator) { +goog.format.numBytesToString = function(val, opt_decimals, opt_suffix) { var suffix = ''; if (!goog.isDef(opt_suffix) || opt_suffix) { suffix = 'B'; } return goog.format.numericValueToString_( - val, goog.format.NUMERIC_SCALES_BINARY_, opt_decimals, suffix, - opt_useSeparator); + val, goog.format.NUMERIC_SCALES_BINARY_, opt_decimals, suffix); }; @@ -145,17 +141,14 @@ 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_useSeparator) { + opt_decimals, opt_suffix) { var prefixes = goog.format.NUMERIC_SCALE_PREFIXES_; var orig_val = val; var symbol = ''; - var separator = ''; var scale = 1; if (val < 0) { val = -val; @@ -172,16 +165,11 @@ goog.format.numericValueToString_ = function(val, conversion, } if (!symbol) { scale = 1; - } else { - if (opt_suffix) { - symbol += opt_suffix; - } - if (opt_useSeparator) { - separator = ' '; - } + } else if (opt_suffix) { + symbol += opt_suffix; } var ex = Math.pow(10, goog.isDef(opt_decimals) ? opt_decimals : 2); - return Math.round(orig_val / scale * ex) / ex + separator + symbol; + return Math.round(orig_val / scale * ex) / ex + symbol; }; diff --git a/third_party/closure/goog/format/htmlprettyprinter.js b/third_party/closure/goog/format/htmlprettyprinter.js new file mode 100644 index 0000000000000..d50e6692d9741 --- /dev/null +++ b/third_party/closure/goog/format/htmlprettyprinter.js @@ -0,0 +1,407 @@ +// 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 32a07f26ca86a..2f46a8bcd8802 100644 --- a/third_party/closure/goog/format/jsonprettyprinter.js +++ b/third_party/closure/goog/format/jsonprettyprinter.js @@ -362,7 +362,6 @@ 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 5ad90dca75896..eeec036360153 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.} If an error occurs, the - * errback is called with a {@link goog.fs.Error}. + * @return {!goog.async.Deferred} The deferred {@link goog.fs.FileWriter}. 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.} If an error occurs, the errback is - * called with a {@link goog.fs.Error}. + * @return {!goog.async.Deferred} The deferred File. 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 e0a9b36d3e796..4c38932dc3431 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, msg)); + d.errback(new goog.fs.Error(err.code, 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, msg)); + d.errback(new goog.fs.Error(err.code, 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, msg)); + d.errback(new goog.fs.Error(err.code, 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, msg)); + d.errback(new goog.fs.Error(err.code, 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, msg)); + d.errback(new goog.fs.Error(err.code, msg)); }, this)); return d; }; @@ -202,10 +202,9 @@ goog.fs.EntryImpl.prototype.getParent = function() { * @constructor * @extends {goog.fs.EntryImpl} * @implements {goog.fs.DirectoryEntry} - * @final */ goog.fs.DirectoryEntryImpl = function(fs, dir) { - goog.fs.DirectoryEntryImpl.base(this, 'constructor', fs, dir); + goog.base(this, fs, dir); /** * The underlying DirectoryEntry object. @@ -228,7 +227,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, msg)); + d.errback(new goog.fs.Error(err.code, msg)); }, this)); return d; }; @@ -245,7 +244,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, msg)); + d.errback(new goog.fs.Error(err.code, msg)); }, this)); return d; }; @@ -295,7 +294,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, msg)); + d.errback(new goog.fs.Error(err.code, msg)); }, this); var successCallback = goog.bind(function(entries) { @@ -321,7 +320,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, msg)); + d.errback(new goog.fs.Error(err.code, msg)); }, this)); return d; }; @@ -333,7 +332,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) { @@ -359,10 +358,9 @@ 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.fs.FileEntryImpl.base(this, 'constructor', fs, file); + goog.base(this, fs, file); /** * The underlying FileEntry object. @@ -382,7 +380,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, msg)); + d.errback(new goog.fs.Error(err.code, msg)); }, this)); return d; }; @@ -395,7 +393,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, msg)); + d.errback(new goog.fs.Error(err.code, msg)); }, this)); return d; }; diff --git a/third_party/closure/goog/fs/error.js b/third_party/closure/goog/fs/error.js index d665d9eb25433..a4a8565bb97b0 100644 --- a/third_party/closure/goog/fs/error.js +++ b/third_party/closure/goog/fs/error.js @@ -21,7 +21,6 @@ goog.provide('goog.fs.Error'); goog.provide('goog.fs.Error.ErrorCode'); goog.require('goog.debug.Error'); -goog.require('goog.object'); goog.require('goog.string'); @@ -31,69 +30,24 @@ 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 {!DOMError} error + * @param {number} code The error code for the error. * @param {string} action The action being undertaken when the error was raised. * @constructor * @extends {goog.debug.Error} - * @final */ -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.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.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, @@ -112,70 +66,37 @@ goog.fs.Error.ErrorCode = { /** - * @param {goog.fs.Error.ErrorCode} code - * @return {string} name - * @private + * @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. */ -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); +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'; } - 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 14d5245f35584..06e08298585bc 100644 --- a/third_party/closure/goog/fs/filereader.js +++ b/third_party/closure/goog/fs/filereader.js @@ -22,6 +22,7 @@ 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'); @@ -34,10 +35,9 @@ goog.require('goog.fs.ProgressEvent'); * * @constructor * @extends {goog.events.EventTarget} - * @final */ goog.fs.FileReader = function() { - goog.fs.FileReader.base(this, 'constructor'); + goog.base(this); /** * 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, 'aborting read'); + throw new goog.fs.Error(e.code, '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, 'reading file'); + new goog.fs.Error(this.reader_.error.code, 'reading file'); }; @@ -166,7 +166,7 @@ goog.fs.FileReader.prototype.dispatchProgressEvent_ = function(event) { /** @override */ goog.fs.FileReader.prototype.disposeInternal = function() { - goog.fs.FileReader.base(this, 'disposeInternal'); + goog.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.listen(goog.fs.FileReader.EventType.LOAD_END, + reader.addEventListener(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 6ee932ef8a838..e6a3af3ebd1bf 100644 --- a/third_party/closure/goog/fs/filesaver.js +++ b/third_party/closure/goog/fs/filesaver.js @@ -22,6 +22,7 @@ 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'); @@ -41,7 +42,7 @@ goog.require('goog.fs.ProgressEvent'); * @extends {goog.events.EventTarget} */ goog.fs.FileSaver = function(fileSaver) { - goog.fs.FileSaver.base(this, 'constructor'); + goog.base(this); /** * The underlying FileSaver object. @@ -127,7 +128,7 @@ goog.fs.FileSaver.prototype.abort = function() { try { this.saver_.abort(); } catch (e) { - throw new goog.fs.Error(e, 'aborting save'); + throw new goog.fs.Error(e.code, 'aborting save'); } }; @@ -145,7 +146,7 @@ goog.fs.FileSaver.prototype.getReadyState = function() { */ goog.fs.FileSaver.prototype.getError = function() { return this.saver_.error && - new goog.fs.Error(this.saver_.error, 'saving file'); + new goog.fs.Error(this.saver_.error.code, 'saving file'); }; @@ -163,7 +164,7 @@ goog.fs.FileSaver.prototype.dispatchProgressEvent_ = function(event) { /** @override */ goog.fs.FileSaver.prototype.disposeInternal = function() { delete this.saver_; - goog.fs.FileSaver.base(this, 'disposeInternal'); + goog.base(this, 'disposeInternal'); }; @@ -171,6 +172,5 @@ 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 b5ebb33b00b5f..3f53c825dcd52 100644 --- a/third_party/closure/goog/fs/filesystemimpl.js +++ b/third_party/closure/goog/fs/filesystemimpl.js @@ -32,7 +32,6 @@ 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 170984651d760..e4a0357b1a7aa 100644 --- a/third_party/closure/goog/fs/filewriter.js +++ b/third_party/closure/goog/fs/filewriter.js @@ -37,10 +37,9 @@ goog.require('goog.fs.FileSaver'); * @param {!FileWriter} writer The underlying FileWriter object. * @constructor * @extends {goog.fs.FileSaver} - * @final */ goog.fs.FileWriter = function(writer) { - goog.fs.FileWriter.base(this, 'constructor', writer); + goog.base(this, writer); /** * The underlying FileWriter object. @@ -78,7 +77,7 @@ goog.fs.FileWriter.prototype.write = function(blob) { try { this.writer_.write(blob); } catch (e) { - throw new goog.fs.Error(e, 'writing file'); + throw new goog.fs.Error(e.code, 'writing file'); } }; @@ -92,7 +91,7 @@ goog.fs.FileWriter.prototype.seek = function(offset) { try { this.writer_.seek(offset); } catch (e) { - throw new goog.fs.Error(e, 'seeking in file'); + throw new goog.fs.Error(e.code, 'seeking in file'); } }; @@ -106,6 +105,6 @@ goog.fs.FileWriter.prototype.truncate = function(size) { try { this.writer_.truncate(size); } catch (e) { - throw new goog.fs.Error(e, 'truncating file'); + throw new goog.fs.Error(e.code, 'truncating file'); } }; diff --git a/third_party/closure/goog/fs/fs.js b/third_party/closure/goog/fs/fs.js index fa7ae542b2767..7ea8b00acd2ca 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, 'requesting filesystem')); + d.errback(new goog.fs.Error(err.code, 'requesting filesystem')); }); return d; }; @@ -107,7 +107,6 @@ 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. @@ -119,7 +118,6 @@ 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. */ @@ -130,7 +128,7 @@ goog.fs.revokeObjectUrl = function(url) { /** * @typedef {!{createObjectURL: (function(!Blob): string), - * revokeObjectURL: function(string): void}} + * revokeObjectURL: function(string): void}} */ goog.fs.UrlObject_; @@ -143,24 +141,6 @@ 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) && @@ -174,22 +154,11 @@ goog.fs.findUrlObject_ = function() { } else if (goog.isDef(goog.global.createObjectURL)) { return /** @type {goog.fs.UrlObject_} */ (goog.global); } else { - return null; + throw Error('This browser doesn\'t seem to support blob URLs'); } }; -/** - * 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. * @@ -207,42 +176,7 @@ goog.fs.getBlob = function(var_args) { } return bb.getBlob(); } else { - 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'); + return new Blob(goog.array.toArray(arguments)); } }; diff --git a/third_party/closure/goog/fs/progressevent.js b/third_party/closure/goog/fs/progressevent.js index b0695bed9d397..9d5c960f318ab 100644 --- a/third_party/closure/goog/fs/progressevent.js +++ b/third_party/closure/goog/fs/progressevent.js @@ -29,10 +29,9 @@ 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.fs.ProgressEvent.base(this, 'constructor', event.type, target); + goog.base(this, 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 0c70f013834a3..8e858899667f1 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://goo.gl/GM0Hmu and http://goo.gl/6k7nI8. + * java classes: http://go/functions.java and http://go/predicate.java. * * @author nicksantos@google.com (Nick Santos) */ @@ -110,18 +110,6 @@ 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. @@ -251,10 +239,7 @@ 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 - * @final - */ + /** @constructor */ var temp = function() {}; temp.prototype = constructor.prototype; @@ -268,44 +253,3 @@ 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 8201756eef5bc..288d9d08d9e57 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.classlist'); +goog.require('goog.dom.classes'); 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.fx.AbstractDragDrop.base(this, 'constructor'); + goog.base(this); /** * List of items that makes up the drag source or drop target. * @type {Array.} * @protected - * @suppress {underscore|visibility} + * @suppress {underscore} */ this.items_ = []; @@ -114,7 +114,7 @@ goog.fx.AbstractDragDrop.prototype.isTarget_ = false; /** * Subtargeting function accepting args: - * (goog.fx.DragDropItem, goog.math.Box, number, number) + * (Element, goog.math.Box, number, number) * @type {Function} * @private */ @@ -202,8 +202,7 @@ goog.fx.AbstractDragDrop.initDragDistanceThreshold = 5; /** * Set class to add to source elements being dragged. * - * @param {string} className Class to be added. Must be a single, valid - * classname. + * @param {string} className Class to be added. */ goog.fx.AbstractDragDrop.prototype.setDragClass = function(className) { this.dragClass_ = className; @@ -213,8 +212,7 @@ goog.fx.AbstractDragDrop.prototype.setDragClass = function(className) { /** * Set class to add to source elements. * - * @param {string} className Class to be added. Must be a single, valid - * classname. + * @param {string} className Class to be added. */ goog.fx.AbstractDragDrop.prototype.setSourceClass = function(className) { this.sourceClass_ = className; @@ -224,8 +222,7 @@ goog.fx.AbstractDragDrop.prototype.setSourceClass = function(className) { /** * Set class to add to target elements. * - * @param {string} className Class to be added. Must be a single, valid - * classname. + * @param {string} className Class to be added. */ goog.fx.AbstractDragDrop.prototype.setTargetClass = function(className) { this.targetClass_ = className; @@ -302,14 +299,12 @@ 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.classlist.add( - goog.asserts.assert(item.element), this.sourceClass_); + goog.dom.classes.add(item.element, this.sourceClass_); } } if (this.isTarget_ && this.targetClass_) { - goog.dom.classlist.add( - goog.asserts.assert(item.element), this.targetClass_); + goog.dom.classes.add(item.element, this.targetClass_); } }; @@ -325,13 +320,11 @@ 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.classlist.remove( - goog.asserts.assert(item.element), this.sourceClass_); + goog.dom.classes.remove(item.element, this.sourceClass_); } } if (this.isTarget_ && this.targetClass_) { - goog.dom.classlist.remove( - goog.asserts.assert(item.element), this.targetClass_); + goog.dom.classes.remove(item.element, this.targetClass_); } item.dispose(); }; @@ -472,7 +465,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 = @@ -788,10 +781,9 @@ goog.fx.AbstractDragDrop.prototype.setSubtargetFunction = function(f) { * @return {Element} The new drag element. */ goog.fx.AbstractDragDrop.prototype.createDragElement = function(sourceEl) { - var dragEl = this.createDragElementInternal(sourceEl); - goog.asserts.assert(dragEl); + var dragEl = this.cloneNode_(sourceEl); if (this.dragClass_) { - goog.dom.classlist.add(dragEl, this.dragClass_); + goog.dom.classes.add(dragEl, this.dragClass_); } return dragEl; @@ -804,7 +796,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) { @@ -835,29 +827,23 @@ 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}. - * @deprecated Use goog.fx.Dragger.cloneNode(). + * @return {Element} The clone of {@code sourceEl}. * @private */ goog.fx.AbstractDragDrop.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.AbstractDragDrop.prototype.createDragElementInternal = - function(sourceEl) { - return this.cloneNode_(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; + } }; @@ -877,7 +863,11 @@ goog.fx.AbstractDragDrop.prototype.addDragTarget_ = function(target, item) { var draggableElement = draggableElements[i]; // Determine target position and dimension - var box = this.getElementBox(item, draggableElement); + 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); targetList.push( new goog.fx.ActiveDropTarget_(box, target, item, draggableElement)); @@ -887,24 +877,6 @@ 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). * @@ -1124,7 +1096,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() { @@ -1135,7 +1107,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) { @@ -1147,7 +1119,7 @@ goog.fx.AbstractDragDrop.prototype.getEventPosition = function(event) { /** @override */ goog.fx.AbstractDragDrop.prototype.disposeInternal = function() { - goog.fx.AbstractDragDrop.base(this, 'disposeInternal'); + goog.base(this, 'disposeInternal'); this.removeItems(); }; @@ -1176,7 +1148,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.fx.DragDropEvent.base(this, 'constructor', type); + goog.base(this, type); /** * Reference to the source goog.fx.AbstractDragDrop object. @@ -1259,7 +1231,7 @@ goog.fx.DragDropEvent.prototype.disposeInternal = function() { * @constructor */ goog.fx.DragDropItem = function(element, opt_data) { - goog.fx.DragDropItem.base(this, 'constructor'); + goog.base(this); /** * Reference to drag source/target element @@ -1282,7 +1254,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); @@ -1341,7 +1313,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 c8fa0019578c1..a8878375c19c2 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.fx.Animation.base(this, 'constructor'); + goog.base(this); 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.fx.Animation.base(this, 'disposeInternal'); + goog.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.fx.AnimationEvent.base(this, 'constructor', type); + goog.base(this, 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 b0d817efe557c..7d3c3dad784ed 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.fx.AnimationQueue.base(this, 'constructor'); + goog.base(this); /** * An array holding all animations in the queue. @@ -103,7 +103,7 @@ goog.fx.AnimationQueue.prototype.disposeInternal = function() { }); this.queue.length = 0; - goog.fx.AnimationQueue.base(this, 'disposeInternal'); + goog.base(this, 'disposeInternal'); }; @@ -114,7 +114,7 @@ goog.fx.AnimationQueue.prototype.disposeInternal = function() { * @extends {goog.fx.AnimationQueue} */ goog.fx.AnimationParallelQueue = function() { - goog.fx.AnimationParallelQueue.base(this, 'constructor'); + goog.base(this); /** * Number of finished animations. @@ -211,7 +211,7 @@ goog.fx.AnimationParallelQueue.prototype.onAnimationFinish = function(e) { * @extends {goog.fx.AnimationQueue} */ goog.fx.AnimationSerialQueue = function() { - goog.fx.AnimationSerialQueue.base(this, 'constructor'); + goog.base(this); /** * 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 75bfb21ac7142..b0da78c77be91 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.fx.css3.Transition.base(this, 'constructor'); + goog.base(this); /** * @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.fx.css3.Transition.base(this, 'disposeInternal'); + goog.base(this, 'disposeInternal'); }; diff --git a/third_party/closure/goog/fx/cssspriteanimation.js b/third_party/closure/goog/fx/cssspriteanimation.js index 83833e9b059ab..9d03576ff409e 100644 --- a/third_party/closure/goog/fx/cssspriteanimation.js +++ b/third_party/closure/goog/fx/cssspriteanimation.js @@ -47,14 +47,12 @@ 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.fx.CssSpriteAnimation.base( - this, 'constructor', start, end, time, opt_acc); + goog.base(this, start, end, time, opt_acc); /** * HTML element that will be used in the animation. @@ -80,14 +78,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.fx.CssSpriteAnimation.base(this, 'onAnimate'); + goog.base(this, 'onAnimate'); }; /** @override */ goog.fx.CssSpriteAnimation.prototype.onFinish = function() { this.play(true); - goog.fx.CssSpriteAnimation.base(this, 'onFinish'); + goog.base(this, 'onFinish'); }; diff --git a/third_party/closure/goog/fx/dom.js b/third_party/closure/goog/fx/dom.js index 8f041a2e1492e..0d32cf1f4ac44 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'); +goog.require('goog.fx.Transition.EventType'); 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 position of an element. + * Animation event handler that will set the scroll posiiton 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 opaque. + * completely transparent to fully opacity * * @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 106ce48dd7689..e2f13f7800071 100644 --- a/third_party/closure/goog/fx/dragger.js +++ b/third_party/closure/goog/fx/dragger.js @@ -83,40 +83,6 @@ 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} @@ -313,9 +279,7 @@ goog.fx.Dragger.prototype.enableRightPositioningForRtl = /** * Returns the event handler, intended for subclass use. - * @return {goog.events.EventHandler.} The event handler. - * @this T - * @template T + * @return {goog.events.EventHandler} The event handler. */ goog.fx.Dragger.prototype.getHandler = function() { return this.eventHandler_; @@ -454,7 +418,9 @@ goog.fx.Dragger.prototype.startDrag = function(e) { this.clientY = this.startY = e.clientY; this.screenX = e.screenX; this.screenY = e.screenY; - this.computeInitialPosition(); + this.deltaX = this.useRightPositioningForRtl_ ? + goog.style.bidi.getOffsetStart(this.target) : this.target.offsetLeft; + this.deltaY = this.target.offsetTop; this.pageScroll = goog.dom.getDomHelper(this.document_).getDocumentScroll(); this.mouseDownTime_ = goog.now(); @@ -650,7 +616,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) { @@ -730,18 +696,6 @@ 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 9e83ba6e6f2aa..6f36719afc02a 100644 --- a/third_party/closure/goog/fx/draglistgroup.js +++ b/third_party/closure/goog/fx/draglistgroup.js @@ -25,18 +25,17 @@ 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.classlist'); -goog.require('goog.events'); +goog.require('goog.dom.NodeType'); +goog.require('goog.dom.classes'); 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'); @@ -84,7 +83,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); @@ -175,12 +174,12 @@ goog.fx.DragListGroup.prototype.currDragItemClasses_; /** - * The user-supplied CSS classes to add to the clone of the current drag item + * The user-supplied CSS class to add to the clone of the current drag item * that's actually being dragged around (during a drag action). - * @type {Array.|undefined} + * @type {string|undefined} * @private */ -goog.fx.DragListGroup.prototype.draggerElClasses_; +goog.fx.DragListGroup.prototype.draggerElClass_; // The next 5 are info applicable during a drag action. @@ -316,8 +315,7 @@ 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. If present, must be a - * single, valid classname (not a string of space-separated classnames). + * the draggerEl hovers over it during a drag action. */ goog.fx.DragListGroup.prototype.addDragList = function( dragListElement, growthDirection, opt_unused, opt_dragHoverClass) { @@ -395,8 +393,7 @@ goog.fx.DragListGroup.prototype.setCurrDragItemClass = function(var_args) { */ goog.fx.DragListGroup.prototype.setDraggerElClass = function(draggerElClass) { goog.asserts.assert(!this.isInitialized_); - // Split space-separated classes up into an array. - this.draggerElClasses_ = goog.string.trim(draggerElClass).split(' '); + this.draggerElClass_ = draggerElClass; }; @@ -413,7 +410,33 @@ goog.fx.DragListGroup.prototype.init = function() { var dragItems = goog.dom.getChildren(dragList); for (var j = 0, numItems = dragItems.length; j < numItems; ++j) { - this.listenForDragEvents(dragItems[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_); } } @@ -421,28 +444,6 @@ 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(); @@ -490,43 +491,6 @@ 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. @@ -536,11 +500,10 @@ 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.createDragElementInternal(this.currDragItem_); - if (this.draggerElClasses_) { + this.draggerEl_ = this.cloneNode_(this.currDragItem_); + if (this.draggerElClass_) { // Add CSS class for the clone, if any. - goog.dom.classlist.addAll( - goog.asserts.assert(this.draggerEl_), this.draggerElClasses_ || []); + goog.dom.classes.add(this.draggerEl_, this.draggerElClass_); } // Place the clone (i.e. draggerEl) at the same position as the actual @@ -578,36 +541,6 @@ 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. @@ -632,9 +565,8 @@ 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.classlist.addAll( - goog.asserts.assert(this.currDragItem_), - this.currDragItemClasses_ || []); + goog.dom.classes.add.apply(null, + goog.array.concat(this.currDragItem_, this.currDragItemClasses_)); } else { this.currDragItem_.style.visibility = 'hidden'; } @@ -710,8 +642,7 @@ goog.fx.DragListGroup.prototype.handleDragMove_ = function(dragEvent) { this.currDragItem_.style.display = ''; // Add drag list's hover class (if any). if (hoverList.dlgDragHoverClass_) { - goog.dom.classlist.add( - goog.asserts.assert(hoverList), hoverList.dlgDragHoverClass_); + goog.dom.classes.add(hoverList, hoverList.dlgDragHoverClass_); } } else { @@ -725,8 +656,7 @@ 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.classlist.remove( - goog.asserts.assert(dragList), dragList.dlgDragHoverClass_); + goog.dom.classes.remove(dragList, dragList.dlgDragHoverClass_); } } } @@ -840,9 +770,8 @@ 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.classlist.removeAll( - goog.asserts.assert(this.currDragItem_), - this.currDragItemClasses_ || []); + goog.dom.classes.remove.apply(null, + goog.array.concat(this.currDragItem_, this.currDragItemClasses_)); } else if (this.currDragItem_) { this.currDragItem_.style.visibility = 'visible'; } @@ -851,8 +780,7 @@ 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.classlist.remove( - goog.asserts.assert(dragList), dragList.dlgDragHoverClass_); + goog.dom.classes.remove(dragList, dragList.dlgDragHoverClass_); } } }; @@ -878,8 +806,9 @@ goog.fx.DragListGroup.prototype.getHandleForDragItem_ = function(dragItem) { * @private */ goog.fx.DragListGroup.prototype.handleDragItemMouseover_ = function(e) { - var targetEl = goog.asserts.assertElement(e.currentTarget); - goog.dom.classlist.addAll(targetEl, this.dragItemHoverClasses_ || []); + goog.dom.classes.add.apply(null, + goog.array.concat(/** @type {Element} */ (e.currentTarget), + this.dragItemHoverClasses_)); }; @@ -889,8 +818,9 @@ goog.fx.DragListGroup.prototype.handleDragItemMouseover_ = function(e) { * @private */ goog.fx.DragListGroup.prototype.handleDragItemMouseout_ = function(e) { - var targetEl = goog.asserts.assertElement(e.currentTarget); - goog.dom.classlist.removeAll(targetEl, this.dragItemHoverClasses_ || []); + goog.dom.classes.remove.apply(null, + goog.array.concat(/** @type {Element} */ (e.currentTarget), + this.dragItemHoverClasses_)); }; @@ -900,8 +830,9 @@ goog.fx.DragListGroup.prototype.handleDragItemMouseout_ = function(e) { * @private */ goog.fx.DragListGroup.prototype.handleDragItemHandleMouseover_ = function(e) { - var targetEl = goog.asserts.assertElement(e.currentTarget); - goog.dom.classlist.addAll(targetEl, this.dragItemHandleHoverClasses_ || []); + goog.dom.classes.add.apply(null, + goog.array.concat(/** @type {Element} */ (e.currentTarget), + this.dragItemHandleHoverClasses_)); }; @@ -911,9 +842,9 @@ goog.fx.DragListGroup.prototype.handleDragItemHandleMouseover_ = function(e) { * @private */ goog.fx.DragListGroup.prototype.handleDragItemHandleMouseout_ = function(e) { - var targetEl = goog.asserts.assertElement(e.currentTarget); - goog.dom.classlist.removeAll(targetEl, - this.dragItemHandleHoverClasses_ || []); + goog.dom.classes.remove.apply(null, + goog.array.concat(/** @type {Element} */ (e.currentTarget), + this.dragItemHandleHoverClasses_)); }; @@ -1222,6 +1153,31 @@ 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 f20db66214ac7..a1e20980290fa 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 78bdcd78f58c7..dbbe77ead5bf1 100644 --- a/third_party/closure/goog/fx/easing.js +++ b/third_party/closure/goog/fx/easing.js @@ -26,19 +26,7 @@ goog.provide('goog.fx.easing'); * @return {number} Output between 0 and 1. */ goog.fx.easing.easeIn = function(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); + return t * t * t; }; @@ -48,29 +36,7 @@ goog.fx.easing.easeInInternal_ = function(t, exp) { * @return {number} Output between 0 and 1. */ goog.fx.easing.easeOut = function(t) { - 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); + return 1 - Math.pow(1 - t, 3); }; diff --git a/third_party/closure/goog/fx/transitionbase.js b/third_party/closure/goog/fx/transitionbase.js index 590f03353a38f..43f653cdeb731 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.fx.TransitionBase.base(this, 'constructor'); + goog.base(this); /** * The internal state of the animation. diff --git a/third_party/closure/goog/gears/basestore.js b/third_party/closure/goog/gears/basestore.js new file mode 100644 index 0000000000000..5db01fa1d76c2 --- /dev/null +++ b/third_party/closure/goog/gears/basestore.js @@ -0,0 +1,521 @@ +// 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 new file mode 100644 index 0000000000000..c50ef6a7ede85 --- /dev/null +++ b/third_party/closure/goog/gears/database.js @@ -0,0 +1,934 @@ +// 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 new file mode 100644 index 0000000000000..4d9b0e7d666ef --- /dev/null +++ b/third_party/closure/goog/gears/gears.js @@ -0,0 +1,228 @@ +// 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 new file mode 100644 index 0000000000000..9b0b5420d3190 --- /dev/null +++ b/third_party/closure/goog/gears/httprequest.js @@ -0,0 +1,80 @@ +// 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 new file mode 100644 index 0000000000000..f0d611c9ff5f3 --- /dev/null +++ b/third_party/closure/goog/gears/loggerclient.js @@ -0,0 +1,130 @@ +// 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 new file mode 100644 index 0000000000000..56469f785e9a6 --- /dev/null +++ b/third_party/closure/goog/gears/loggerserver.js @@ -0,0 +1,157 @@ +// 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 new file mode 100644 index 0000000000000..48f8e8f6db63e --- /dev/null +++ b/third_party/closure/goog/gears/logstore.js @@ -0,0 +1,477 @@ +// 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 new file mode 100644 index 0000000000000..464d0031eefdd --- /dev/null +++ b/third_party/closure/goog/gears/managedresourcestore.js @@ -0,0 +1,555 @@ +// 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 new file mode 100644 index 0000000000000..798b9488d8320 --- /dev/null +++ b/third_party/closure/goog/gears/multipartformdata.js @@ -0,0 +1,204 @@ +// 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/net/testdata/jsloader_test4.js b/third_party/closure/goog/gears/statustype.js similarity index 56% rename from third_party/closure/goog/net/testdata/jsloader_test4.js rename to third_party/closure/goog/gears/statustype.js index 591209c2bb80d..f3b12a8a92682 100644 --- a/third_party/closure/goog/net/testdata/jsloader_test4.js +++ b/third_party/closure/goog/gears/statustype.js @@ -1,4 +1,4 @@ -// Copyright 2011 The Closure Library Authors. All Rights Reserved. +// 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. @@ -11,13 +11,27 @@ // 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. -// All Rights Reserved /** - * @fileoverview Test #4 of jsloader. + * @fileoverview An enum that contains the possible status type's of the Gears + * feature of an application. + * */ -goog.provide('goog.net.testdata.jsloader_test4'); -goog.setTestOnly('jsloader_test4'); +goog.provide('goog.gears.StatusType'); -window['test4Callback']('Test #4 loaded'); + +/** + * The possible status type's for Gears. + * @enum {string} + */ +goog.gears.StatusType = { + NOT_INSTALLED: 'ni', + INSTALLED: 'i', + PAUSED: 'p', + OFFLINE: 'off', + ONLINE: 'on', + SYNCING: 's', + CAPTURING: 'c', + ERROR: 'e' +}; diff --git a/third_party/closure/goog/gears/urlcapture.js b/third_party/closure/goog/gears/urlcapture.js new file mode 100644 index 0000000000000..a646847ebd219 --- /dev/null +++ b/third_party/closure/goog/gears/urlcapture.js @@ -0,0 +1,370 @@ +// 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 new file mode 100644 index 0000000000000..4899191275cb9 --- /dev/null +++ b/third_party/closure/goog/gears/worker.js @@ -0,0 +1,200 @@ +// 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 new file mode 100644 index 0000000000000..750584c19819b --- /dev/null +++ b/third_party/closure/goog/gears/workerchannel.js @@ -0,0 +1,204 @@ +// 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 new file mode 100644 index 0000000000000..f1263ed2709c4 --- /dev/null +++ b/third_party/closure/goog/gears/workerpool.js @@ -0,0 +1,240 @@ +// 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 35d6387b9e597..811c87d8b403c 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 62a15f4caa41e..07175272c6690 100644 --- a/third_party/closure/goog/graphics/affinetransform.js +++ b/third_party/closure/goog/graphics/affinetransform.js @@ -52,7 +52,9 @@ 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 - * @final + * @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.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 8a13b862ec833..c566860663ae0 100644 --- a/third_party/closure/goog/graphics/canvaselement.js +++ b/third_party/closure/goog/graphics/canvaselement.js @@ -54,7 +54,6 @@ 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); @@ -130,7 +129,6 @@ 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) { @@ -254,7 +252,6 @@ 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) { @@ -361,7 +358,6 @@ 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) { @@ -456,7 +452,6 @@ 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) { @@ -663,7 +658,6 @@ 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 47557d15c2381..3cd6e18d96834 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 45e29308d979d..6f93ce726040b 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 546c8c34a392c..21ded29cd2d1d 100644 --- a/third_party/closure/goog/graphics/ext/element.js +++ b/third_party/closure/goog/graphics/ext/element.js @@ -21,8 +21,10 @@ 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'); @@ -117,7 +119,10 @@ goog.graphics.ext.Element.prototype.xPosition_; goog.graphics.ext.Element.prototype.yPosition_; -/** @return {goog.graphics.Element} The underlying thin wrapper. */ +/** + * @return {goog.graphics.Element} The underlying thin wrapper. + * @protected + */ goog.graphics.ext.Element.prototype.getWrapper = function() { return this.wrapper_; }; @@ -720,7 +725,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 db77524a025ec..6bc7938f772a8 100644 --- a/third_party/closure/goog/graphics/ext/ellipse.js +++ b/third_party/closure/goog/graphics/ext/ellipse.js @@ -30,7 +30,6 @@ 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 50f38fea535f2..d999414934817 100644 --- a/third_party/closure/goog/graphics/ext/graphics.js +++ b/third_party/closure/goog/graphics/ext/graphics.js @@ -44,7 +44,6 @@ 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) { @@ -111,7 +110,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 8e8e8cbe8b4bd..cc65a34e284be 100644 --- a/third_party/closure/goog/graphics/ext/group.js +++ b/third_party/closure/goog/graphics/ext/group.js @@ -21,7 +21,6 @@ goog.provide('goog.graphics.ext.Group'); -goog.require('goog.array'); goog.require('goog.graphics.ext.Element'); @@ -110,7 +109,7 @@ goog.graphics.ext.Group.prototype.forEachChild = function(f, opt_obj) { /** * @return {goog.graphics.GroupElement} The underlying thin wrapper. - * @override + * @protected */ 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 ec24e1d85ee65..451a9da41d44f 100644 --- a/third_party/closure/goog/graphics/ext/image.js +++ b/third_party/closure/goog/graphics/ext/image.js @@ -31,7 +31,6 @@ 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 e8c2e35b936dc..c2edffd32d1f2 100644 --- a/third_party/closure/goog/graphics/ext/path.js +++ b/third_party/closure/goog/graphics/ext/path.js @@ -32,7 +32,6 @@ 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); @@ -89,7 +88,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 d05c8b1bda0c7..428f5e4cd3fb1 100644 --- a/third_party/closure/goog/graphics/ext/rectangle.js +++ b/third_party/closure/goog/graphics/ext/rectangle.js @@ -30,7 +30,6 @@ 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 4d47893b66537..3531bc0054bcc 100644 --- a/third_party/closure/goog/graphics/ext/shape.js +++ b/third_party/closure/goog/graphics/ext/shape.js @@ -35,7 +35,6 @@ 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 f58bf41ad0e26..045ee6b1a6fe2 100644 --- a/third_party/closure/goog/graphics/font.js +++ b/third_party/closure/goog/graphics/font.js @@ -32,7 +32,6 @@ 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 0bde5b5b3d51f..d94f166cf8aaa 100644 --- a/third_party/closure/goog/graphics/graphics.js +++ b/third_party/closure/goog/graphics/graphics.js @@ -27,7 +27,6 @@ goog.provide('goog.graphics'); -goog.require('goog.dom'); goog.require('goog.graphics.CanvasGraphics'); goog.require('goog.graphics.SvgGraphics'); goog.require('goog.graphics.VmlGraphics'); @@ -47,7 +46,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. @@ -55,13 +54,7 @@ goog.require('goog.userAgent'); goog.graphics.createGraphics = function(width, height, opt_coordWidth, opt_coordHeight, opt_domHelper) { var graphics; - // 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)) { + if (goog.userAgent.IE && !goog.userAgent.isVersionOrHigher('9')) { graphics = new goog.graphics.VmlGraphics(width, height, opt_coordWidth, opt_coordHeight, opt_domHelper); } else if (goog.userAgent.WEBKIT && @@ -95,7 +88,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 df59cbfe89eef..c63cac017ef17 100644 --- a/third_party/closure/goog/graphics/lineargradient.js +++ b/third_party/closure/goog/graphics/lineargradient.js @@ -44,7 +44,6 @@ 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 08bf03e6fe75f..9b134eee9e25f 100644 --- a/third_party/closure/goog/graphics/path.js +++ b/third_party/closure/goog/graphics/path.js @@ -36,6 +36,9 @@ 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() { /** @@ -103,6 +106,7 @@ 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 37b53d92caf5f..2a630ed9ddb48 100644 --- a/third_party/closure/goog/graphics/paths.js +++ b/third_party/closure/goog/graphics/paths.js @@ -33,6 +33,9 @@ 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(); @@ -59,6 +62,9 @@ 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 6f1c5ce0fa3d0..cf76bfa3aa97b 100644 --- a/third_party/closure/goog/graphics/svgelement.js +++ b/third_party/closure/goog/graphics/svgelement.js @@ -50,7 +50,6 @@ 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); @@ -92,7 +91,6 @@ 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); @@ -137,7 +135,6 @@ 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); @@ -181,7 +178,6 @@ 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); @@ -214,7 +210,6 @@ 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); @@ -243,7 +238,6 @@ 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 f1c49c7de81d9..1f717828a0aee 100644 --- a/third_party/closure/goog/graphics/svggraphics.js +++ b/third_party/closure/goog/graphics/svggraphics.js @@ -60,7 +60,6 @@ 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, @@ -91,7 +90,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); @@ -137,7 +136,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, @@ -424,7 +423,7 @@ goog.graphics.SvgGraphics.prototype.getPixelSize = function() { if (!goog.userAgent.GECKO) { return this.isInDocument() ? goog.style.getSize(this.getElement()) : - goog.graphics.SvgGraphics.base(this, 'getPixelSize'); + goog.base(this, 'getPixelSize'); } // In Gecko, goog.style.getSize does not work for SVG elements. We have to @@ -483,7 +482,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( @@ -510,7 +509,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, @@ -534,7 +533,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, @@ -570,7 +569,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( @@ -636,7 +635,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( @@ -696,7 +695,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 02acbb3fae908..1a8ed71fe330f 100644 --- a/third_party/closure/goog/graphics/vmlelement.js +++ b/third_party/closure/goog/graphics/vmlelement.js @@ -67,7 +67,6 @@ 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; @@ -147,7 +146,6 @@ 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) { @@ -238,7 +236,6 @@ 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; @@ -299,7 +296,6 @@ 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; @@ -343,7 +339,6 @@ 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; @@ -383,7 +378,6 @@ 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 ac445dd7c9d59..58f407f9af9bb 100644 --- a/third_party/closure/goog/graphics/vmlgraphics.js +++ b/third_party/closure/goog/graphics/vmlgraphics.js @@ -61,7 +61,6 @@ 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, @@ -217,7 +216,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 = @@ -430,7 +429,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) { @@ -612,8 +611,7 @@ 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() { @@ -646,7 +644,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, @@ -674,7 +672,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, @@ -698,7 +696,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) { @@ -726,7 +724,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( @@ -774,7 +772,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, @@ -845,7 +843,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 19250df4c3fdf..d7ee019567ee2 100644 --- a/third_party/closure/goog/history/event.js +++ b/third_party/closure/goog/history/event.js @@ -35,7 +35,6 @@ 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 b195fcc2fd9e4..772ad963a78a0 100644 --- a/third_party/closure/goog/history/history.js +++ b/third_party/closure/goog/history/history.js @@ -256,6 +256,15 @@ 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. @@ -287,7 +296,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); @@ -693,12 +702,8 @@ 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 = loc.href.split('#')[0]; + var url = this.baseUrl_; // 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. @@ -994,6 +999,5 @@ 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 new file mode 100644 index 0000000000000..36cbbe5edb2d5 --- /dev/null +++ b/third_party/closure/goog/history/html5history.js @@ -0,0 +1,303 @@ +// 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 deleted file mode 100644 index 6f526953f7bf2..0000000000000 --- a/third_party/closure/goog/html/legacyconversions.js +++ /dev/null @@ -1,235 +0,0 @@ -// 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 deleted file mode 100644 index 57b90d2b70e21..0000000000000 --- a/third_party/closure/goog/html/safehtml.js +++ /dev/null @@ -1,508 +0,0 @@ -// 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