1a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Copyright 2006 The Closure Library Authors. All Rights Reserved. 2a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// 3a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Licensed under the Apache License, Version 2.0 (the "License"); 4a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// you may not use this file except in compliance with the License. 5a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// You may obtain a copy of the License at 6a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// 7a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// http://www.apache.org/licenses/LICENSE-2.0 8a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// 9a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Unless required by applicable law or agreed to in writing, software 10a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// distributed under the License is distributed on an "AS-IS" BASIS, 11a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// See the License for the specific language governing permissions and 13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// limitations under the License. 14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 16a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @fileoverview Bootstrap for the Google JS Library (Closure). 17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * In uncompiled mode base.js will write out Closure's deps file, unless the 19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * global <code>CLOSURE_NO_DEPS</code> is set to true. This allows projects to 20a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * include their own deps file(s) from different locations. 21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 22a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @author pupius@google.com (Dan Pupius) 23a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @author arv@google.com (Erik Arvidsson) 24a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 25a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @provideGoog 26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @define {boolean} Overridden to true by the compiler when --closure_pass 31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * or --mark_as_compiled is specified. 32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)var COMPILED = false; 34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Base namespace for the Closure library. Checks to see goog is 38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * already defined in the current scope before assigning to prevent 39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * clobbering if base.js is loaded more than once. 40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @const 42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)var goog = goog || {}; 44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Reference to the global context. In most cases this will be 'window'. 48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.global = this; 50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * A hook for overriding the define values in uncompiled mode. 54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * In uncompiled mode, {@code CLOSURE_DEFINES} may be defined before loading 56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * base.js. If a key is defined in {@code CLOSURE_DEFINES}, {@code goog.define} 57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * will use the value instead of the default value. This allows flags to be 58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * overwritten without compilation (this is normally accomplished with the 59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * compiler's "define" flag). 60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Example: 62a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * <pre> 63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * var CLOSURE_DEFINES = {'goog.DEBUG', false}; 64a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * </pre> 65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @type {Object.<string, (string|number|boolean)>|undefined} 67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.global.CLOSURE_DEFINES; 69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 71a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Builds an object structure for the provided namespace path, 73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * ensuring that names that already exist are not overwritten. For 74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * example: 75a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * "a.b.c" -> a = {};a.b={};a.b.c={}; 76a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Used by goog.provide and goog.exportSymbol. 77a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {string} name name of the object that this file defines. 78a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {*=} opt_object the object to expose at the end of the path. 79a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {Object=} opt_objectToExportTo The object to add the path to; default 80a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * is |goog.global|. 81a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @private 82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.exportPath_ = function(name, opt_object, opt_objectToExportTo) { 84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var parts = name.split('.'); 85a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var cur = opt_objectToExportTo || goog.global; 86a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 87a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Internet Explorer exhibits strange behavior when throwing errors from 88a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // methods externed in this manner. See the testExportSymbolExceptions in 89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // base_test.html for an example. 90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!(parts[0] in cur) && cur.execScript) { 91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cur.execScript('var ' + parts[0]); 92a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Certain browsers cannot parse code in the form for((a in b); c;); 95a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // This pattern is produced by the JSCompiler when it collapses the 96a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // statement above into the conditional loop below. To prevent this from 97a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // happening, use a for-loop and reserve the init logic as below. 98a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 99a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Parentheses added to eliminate strict JS warning in Firefox. 100a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (var part; parts.length && (part = parts.shift());) { 101a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!parts.length && opt_object !== undefined) { 102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // last part and we have an object; use it 103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cur[part] = opt_object; 104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else if (cur[part]) { 105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cur = cur[part]; 106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else { 107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cur = cur[part] = {}; 108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 111a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 112a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 113a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 114a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Defines a named value. In uncompiled mode, the value is retreived from 115a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * CLOSURE_DEFINES if the object is defined and has the property specified, 116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * and otherwise used the defined defaultValue. When compiled, the default 117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * can be overridden using compiler command-line options. 118a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 119a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {string} name The distinguished name to provide. 120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {string|number|boolean} defaultValue 121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.define = function(name, defaultValue) { 123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var value = defaultValue; 124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!COMPILED) { 125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (goog.global.CLOSURE_DEFINES && Object.prototype.hasOwnProperty.call( 126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) goog.global.CLOSURE_DEFINES, name)) { 127a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) value = goog.global.CLOSURE_DEFINES[name]; 128a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 130a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) goog.exportPath_(name, value); 131a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @define {boolean} DEBUG is provided as a convenience so that debugging code 136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * that should not be included in a production js_binary can be easily stripped 137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * by specifying --define goog.DEBUG=false to the JSCompiler. For example, most 138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * toString() methods should be declared inside an "if (goog.DEBUG)" conditional 139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * because they are generally used for debugging purposes and it is difficult 140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * for the JSCompiler to statically determine whether they are used. 141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.DEBUG = true; 143a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 146a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @define {string} LOCALE defines the locale being used for compilation. It is 147a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * used to select locale specific data to be compiled in js binary. BUILD rule 148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * can specify this value by "--define goog.LOCALE=<locale_name>" as JSCompiler 149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * option. 150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Take into account that the locale code format is important. You should use 152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * the canonical Unicode format with hyphen as a delimiter. Language must be 153a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * lowercase, Language Script - Capitalized, Region - UPPERCASE. 154a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * There are few examples: pt-BR, en, en-US, sr-Latin-BO, zh-Hans-CN. 155a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 156a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * See more info about locale codes here: 157a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * http://www.unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers 158a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 159a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * For language codes you should use values defined by ISO 693-1. See it here 160a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * http://www.w3.org/WAI/ER/IG/ert/iso639.htm. There is only one exception from 161a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * this rule: the Hebrew language. For legacy reasons the old code (iw) should 162a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * be used instead of the new code (he), see http://wiki/Main/IIISynonyms. 163a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 164a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.define('goog.LOCALE', 'en'); // default to en 165a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 166a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 168a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @define {boolean} Whether this code is running on trusted sites. 169a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * On untrusted sites, several native functions can be defined or overridden by 171a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * external libraries like Prototype, Datejs, and JQuery and setting this flag 172a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * to false forces closure to use its own implementations when possible. 173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * If your javascript can be loaded by a third party site and you are wary about 175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * relying on non-standard implementations, specify 176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * "--define goog.TRUSTED_SITE=false" to the JSCompiler. 177a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 178a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.define('goog.TRUSTED_SITE', true); 179a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 180a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 181a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 182a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Creates object stubs for a namespace. The presence of one or more 183a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * goog.provide() calls indicate that the file defines the given 184a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * objects/namespaces. Build tools also scan for provide/require statements 185a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * to discern dependencies, build dependency files (see deps.js), etc. 186a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @see goog.require 187a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {string} name Namespace provided by this file in the form 188a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * "goog.package.part". 189a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 190a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.provide = function(name) { 191a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!COMPILED) { 192a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Ensure that the same namespace isn't provided twice. This is intended 193a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // to teach new developers that 'goog.provide' is effectively a variable 194a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // declaration. And when JSCompiler transforms goog.provide into a real 195a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // variable declaration, the compiled JS should work the same as the raw 196a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // JS--even when the raw JS uses goog.provide incorrectly. 197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (goog.isProvided_(name)) { 198a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) throw Error('Namespace "' + name + '" already declared.'); 199a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 200a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) delete goog.implicitNamespaces_[name]; 201a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var namespace = name; 203a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) while ((namespace = namespace.substring(0, namespace.lastIndexOf('.')))) { 204a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (goog.getObjectByName(namespace)) { 205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 206a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 207a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) goog.implicitNamespaces_[namespace] = true; 208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 209a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 210a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 211a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) goog.exportPath_(name); 212a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 213a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 214a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 215a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 216a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Marks that the current file should only be used for testing, and never for 217a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * live code in production. 218a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 219a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * In the case of unit tests, the message may optionally be an exact 220a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * namespace for the test (e.g. 'goog.stringTest'). The linter will then 221a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * ignore the extra provide (if not explicitly defined in the code). 222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {string=} opt_message Optional message to add to the error that's 224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * raised when used in production code. 225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 226a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.setTestOnly = function(opt_message) { 227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (COMPILED && !goog.DEBUG) { 228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) opt_message = opt_message || ''; 229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) throw Error('Importing test-only code into non-debug environment' + 230a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) opt_message ? ': ' + opt_message : '.'); 231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 235a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)if (!COMPILED) { 236a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 237a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) /** 238a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Check if the given name has been goog.provided. This will return false for 239a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * names that are available only as implicit namespaces. 240a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {string} name name of the object to look for. 241a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {boolean} Whether the name has been provided. 242a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @private 243a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 244a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) goog.isProvided_ = function(name) { 245a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return !goog.implicitNamespaces_[name] && !!goog.getObjectByName(name); 246a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) }; 247a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 248a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) /** 249a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Namespaces implicitly defined by goog.provide. For example, 250a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * goog.provide('goog.events.Event') implicitly declares 251a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * that 'goog' and 'goog.events' must be namespaces. 252a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 253a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @type {Object} 254a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @private 255a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 256a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) goog.implicitNamespaces_ = {}; 257a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 258a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 259a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 260a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 261a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Returns an object based on its fully qualified external name. If you are 262a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * using a compilation pass that renames property names beware that using this 263a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * function will not find renamed properties. 264a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 265a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {string} name The fully qualified name. 266a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {Object=} opt_obj The object within which to look; default is 267a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * |goog.global|. 268a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {?} The value (object or primitive) or, if not found, null. 269a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 270a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.getObjectByName = function(name, opt_obj) { 271a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var parts = name.split('.'); 272a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var cur = opt_obj || goog.global; 273a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (var part; part = parts.shift(); ) { 274a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (goog.isDefAndNotNull(cur[part])) { 275a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cur = cur[part]; 276a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else { 277a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return null; 278a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 279a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 280a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return cur; 281a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 282a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 283a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 284a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 285a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Globalizes a whole namespace, such as goog or goog.lang. 286a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 287a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {Object} obj The namespace to globalize. 288a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {Object=} opt_global The object to add the properties to. 289a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @deprecated Properties may be explicitly exported to the global scope, but 290a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * this should no longer be done in bulk. 291a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 292a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.globalize = function(obj, opt_global) { 293a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var global = opt_global || goog.global; 294a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (var x in obj) { 295a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) global[x] = obj[x]; 296a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 297a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 298a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 299a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 300a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 301a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Adds a dependency from a file to the files it requires. 302a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {string} relPath The path to the js file. 303a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {Array} provides An array of strings with the names of the objects 304a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * this file provides. 305a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {Array} requires An array of strings with the names of the objects 306a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * this file requires. 307a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 308a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.addDependency = function(relPath, provides, requires) { 309a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (goog.DEPENDENCIES_ENABLED) { 310a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var provide, require; 311a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var path = relPath.replace(/\\/g, '/'); 312a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var deps = goog.dependencies_; 313a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (var i = 0; provide = provides[i]; i++) { 314a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) deps.nameToPath[provide] = path; 315a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!(path in deps.pathToNames)) { 316a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) deps.pathToNames[path] = {}; 317a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 318a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) deps.pathToNames[path][provide] = true; 319a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 320a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (var j = 0; require = requires[j]; j++) { 321a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!(path in deps.requires)) { 322a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) deps.requires[path] = {}; 323a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 324a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) deps.requires[path][require] = true; 325a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 326a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 327a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 328a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 329a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 330a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// MOE:begin_strip 331a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 332a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Whether goog.require should throw an exception if it fails. 333a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @type {boolean} 334a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 335a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.useStrictRequires = false; 336a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 337a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 338a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// MOE:end_strip 339a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 340a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 341a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// NOTE(nnaze): The debug DOM loader was included in base.js as an orignal 342a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// way to do "debug-mode" development. The dependency system can sometimes 343a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// be confusing, as can the debug DOM loader's asyncronous nature. 344a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// 345a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// With the DOM loader, a call to goog.require() is not blocking -- the 346a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// script will not load until some point after the current script. If a 347a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// namespace is needed at runtime, it needs to be defined in a previous 348a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// script, or loaded via require() with its registered dependencies. 349a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// User-defined namespaces may need their own deps file. See http://go/js_deps, 350a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// http://go/genjsdeps, or, externally, DepsWriter. 351a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// http://code.google.com/closure/library/docs/depswriter.html 352a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// 353a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Because of legacy clients, the DOM loader can't be easily removed from 354a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// base.js. Work is being done to make it disableable or replaceable for 355a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// different environments (DOM-less JavaScript interpreters like Rhino or V8, 356a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// for example). See bootstrap/ for more information. 357a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 358a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 359a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 360a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @define {boolean} Whether to enable the debug loader. 361a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 362a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * If enabled, a call to goog.require() will attempt to load the namespace by 363a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * appending a script tag to the DOM (if the namespace has been registered). 364a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 365a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * If disabled, goog.require() will simply assert that the namespace has been 366a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * provided (and depend on the fact that some outside tool correctly ordered 367a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * the script). 368a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 369a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.define('goog.ENABLE_DEBUG_LOADER', true); 370a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 371a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 372a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 373a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Implements a system for the dynamic resolution of dependencies 374a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * that works in parallel with the BUILD system. Note that all calls 375a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * to goog.require will be stripped by the JSCompiler when the 376a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * --closure_pass option is used. 377a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @see goog.provide 378a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {string} name Namespace to include (as was given in goog.provide()) 379a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * in the form "goog.package.part". 380a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 381a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.require = function(name) { 382a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 383a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // if the object already exists we do not need do do anything 384a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(arv): If we start to support require based on file name this has 385a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // to change 386a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(arv): If we allow goog.foo.* this has to change 387a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(arv): If we implement dynamic load after page load we should probably 388a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // not remove this code for the compiled output 389a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!COMPILED) { 390a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (goog.isProvided_(name)) { 391a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 392a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 393a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 394a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (goog.ENABLE_DEBUG_LOADER) { 395a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var path = goog.getPathFromDeps_(name); 396a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (path) { 397a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) goog.included_[path] = true; 398a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) goog.writeScripts_(); 399a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 400a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 401a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 402a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 403a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var errorMessage = 'goog.require could not find: ' + name; 404a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (goog.global.console) { 405a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) goog.global.console['error'](errorMessage); 406a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 407a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 408a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // MOE:begin_strip 409a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 410a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // NOTE(nicksantos): We could always throw an error, but this would break 411a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // legacy users that depended on this failing silently. Instead, the 412a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // compiler should warn us when there are invalid goog.require calls. 413a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // For now, we simply give clients a way to turn strict mode on. 414a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (goog.useStrictRequires) { 415a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // MOE:end_strip 416a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 417a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) throw Error(errorMessage); 418a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 419a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // MOE:begin_strip 420a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 421a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // MOE:end_strip 422a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 423a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 424a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 425a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 426a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 427a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Path for included scripts 428a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @type {string} 429a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 430a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.basePath = ''; 431a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 432a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 433a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 434a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * A hook for overriding the base path. 435a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @type {string|undefined} 436a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 437a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.global.CLOSURE_BASE_PATH; 438a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 439a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 440a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 441a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Whether to write out Closure's deps file. By default, 442a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * the deps are written. 443a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @type {boolean|undefined} 444a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 445a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.global.CLOSURE_NO_DEPS; 446a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 447a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 448a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 449a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * A function to import a single script. This is meant to be overridden when 450a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Closure is being run in non-HTML contexts, such as web workers. It's defined 451a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * in the global scope so that it can be set before base.js is loaded, which 452a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * allows deps.js to be imported properly. 453a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 454a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * The function is passed the script source, which is a relative URI. It should 455a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * return true if the script was imported, false otherwise. 456a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 457a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.global.CLOSURE_IMPORT_SCRIPT; 458a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 459a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 460a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 461a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Null function used for default values of callbacks, etc. 462a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {void} Nothing. 463a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 464a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.nullFunction = function() {}; 465a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 466a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 467a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 468a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * The identity function. Returns its first argument. 469a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 470a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {*=} opt_returnValue The single value that will be returned. 471a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {...*} var_args Optional trailing arguments. These are ignored. 472a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {?} The first argument. We can't know the type -- just pass it along 473a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * without type. 474a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @deprecated Use goog.functions.identity instead. 475a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 476a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.identityFunction = function(opt_returnValue, var_args) { 477a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return opt_returnValue; 478a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 479a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 480a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 481a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 482a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * When defining a class Foo with an abstract method bar(), you can do: 483a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 484a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Foo.prototype.bar = goog.abstractMethod 485a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 486a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Now if a subclass of Foo fails to override bar(), an error 487a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * will be thrown when bar() is invoked. 488a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 489a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Note: This does not take the name of the function to override as 490a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * an argument because that would make it more difficult to obfuscate 491a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * our JavaScript code. 492a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 493a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @type {!Function} 494a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @throws {Error} when invoked to indicate the method should be 495a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * overridden. 496a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 497a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.abstractMethod = function() { 498a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) throw Error('unimplemented abstract method'); 499a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 500a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 501a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 502a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 503a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Adds a {@code getInstance} static method that always return the same instance 504a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * object. 505a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {!Function} ctor The constructor for the class to add the static 506a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * method to. 507a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 508a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.addSingletonGetter = function(ctor) { 509a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ctor.getInstance = function() { 510a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (ctor.instance_) { 511a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return ctor.instance_; 512a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 513a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (goog.DEBUG) { 514a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // NOTE: JSCompiler can't optimize away Array#push. 515a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) goog.instantiatedSingletons_[goog.instantiatedSingletons_.length] = ctor; 516a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 517a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return ctor.instance_ = new ctor; 518a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) }; 519a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 520a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 521a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 522a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 523a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * All singleton classes that have been instantiated, for testing. Don't read 524a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * it directly, use the {@code goog.testing.singleton} module. The compiler 525a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * removes this variable if unused. 526a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @type {!Array.<!Function>} 527a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @private 528a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 529a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.instantiatedSingletons_ = []; 530a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 531a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 532a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 533a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * True if goog.dependencies_ is available. 534a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @const {boolean} 535a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 536a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.DEPENDENCIES_ENABLED = !COMPILED && goog.ENABLE_DEBUG_LOADER; 537a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 538a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 539a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)if (goog.DEPENDENCIES_ENABLED) { 540a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) /** 541a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Object used to keep track of urls that have already been added. This 542a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * record allows the prevention of circular dependencies. 543a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @type {Object} 544a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @private 545a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 546a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) goog.included_ = {}; 547a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 548a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 549a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) /** 550a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * This object is used to keep track of dependencies and other data that is 551a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * used for loading scripts 552a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @private 553a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @type {Object} 554a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 555a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) goog.dependencies_ = { 556a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pathToNames: {}, // 1 to many 557a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) nameToPath: {}, // 1 to 1 558a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) requires: {}, // 1 to many 559a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // used when resolving dependencies to prevent us from 560a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // visiting the file twice 561a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) visited: {}, 562a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) written: {} // used to keep track of script files we have written 563a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) }; 564a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 565a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 566a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) /** 567a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Tries to detect whether is in the context of an HTML document. 568a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {boolean} True if it looks like HTML document. 569a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @private 570a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 571a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) goog.inHtmlDocument_ = function() { 572a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var doc = goog.global.document; 573a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return typeof doc != 'undefined' && 574a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 'write' in doc; // XULDocument misses write. 575a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) }; 576a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 577a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 578a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) /** 579a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Tries to detect the base path of the base.js script that bootstraps Closure 580a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @private 581a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 582a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) goog.findBasePath_ = function() { 583a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (goog.global.CLOSURE_BASE_PATH) { 584a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) goog.basePath = goog.global.CLOSURE_BASE_PATH; 585a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 586a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else if (!goog.inHtmlDocument_()) { 587a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 588a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 589a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var doc = goog.global.document; 590a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var scripts = doc.getElementsByTagName('script'); 591a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Search backwards since the current script is in almost all cases the one 592a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // that has base.js. 593a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (var i = scripts.length - 1; i >= 0; --i) { 594a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var src = scripts[i].src; 595a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var qmark = src.lastIndexOf('?'); 596a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var l = qmark == -1 ? src.length : qmark; 597a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (src.substr(l - 7, 7) == 'base.js') { 598a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) goog.basePath = src.substr(0, l - 7); 599a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 600a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 601a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 602a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) }; 603a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 604a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 605a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) /** 606a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Imports a script if, and only if, that script hasn't already been imported. 607a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * (Must be called at execution time) 608a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {string} src Script source. 609a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @private 610a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 611a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) goog.importScript_ = function(src) { 612a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var importScript = goog.global.CLOSURE_IMPORT_SCRIPT || 613a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) goog.writeScriptTag_; 614a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!goog.dependencies_.written[src] && importScript(src)) { 615a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) goog.dependencies_.written[src] = true; 616a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 617a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) }; 618a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 619a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 620a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) /** 621a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * The default implementation of the import function. Writes a script tag to 622a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * import the script. 623a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 624a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {string} src The script source. 625a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {boolean} True if the script was imported, false otherwise. 626a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @private 627a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 628a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) goog.writeScriptTag_ = function(src) { 629a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (goog.inHtmlDocument_()) { 630a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var doc = goog.global.document; 631a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 632a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // If the user tries to require a new symbol after document load, 633a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // something has gone terribly wrong. Doing a document.write would 634a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // wipe out the page. 635a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (doc.readyState == 'complete') { 636a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Certain test frameworks load base.js multiple times, which tries 637a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // to write deps.js each time. If that happens, just fail silently. 638a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // These frameworks wipe the page between each load of base.js, so this 639a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // is OK. 640a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var isDeps = /\bdeps.js$/.test(src); 641a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (isDeps) { 642a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 643a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else { 644a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) throw Error('Cannot write "' + src + '" after document load'); 645a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 646a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 647a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 648a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) doc.write( 649a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) '<script type="text/javascript" src="' + src + '"></' + 'script>'); 650a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 651a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else { 652a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 653a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 654a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) }; 655a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 656a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 657a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) /** 658a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Resolves dependencies based on the dependencies added using addDependency 659a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * and calls importScript_ in the correct order. 660a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @private 661a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 662a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) goog.writeScripts_ = function() { 663a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // the scripts we need to write this time 664a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var scripts = []; 665a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var seenScript = {}; 666a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var deps = goog.dependencies_; 667a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 668a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) function visitNode(path) { 669a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (path in deps.written) { 670a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 671a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 672a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 673a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // we have already visited this one. We can get here if we have cyclic 674a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // dependencies 675a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (path in deps.visited) { 676a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!(path in seenScript)) { 677a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) seenScript[path] = true; 678a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scripts.push(path); 679a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 680a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 681a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 682a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 683a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) deps.visited[path] = true; 684a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 685a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (path in deps.requires) { 686a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (var requireName in deps.requires[path]) { 687a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // If the required name is defined, we assume that it was already 688a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // bootstrapped by other means. 689a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!goog.isProvided_(requireName)) { 690a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (requireName in deps.nameToPath) { 691a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) visitNode(deps.nameToPath[requireName]); 692a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else { 693a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) throw Error('Undefined nameToPath for ' + requireName); 694a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 695a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 696a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 697a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 698a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 699a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!(path in seenScript)) { 700a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) seenScript[path] = true; 701a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scripts.push(path); 702a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 703a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 704a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 705a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (var path in goog.included_) { 706a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!deps.written[path]) { 707a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) visitNode(path); 708a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 709a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 710a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 711a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (var i = 0; i < scripts.length; i++) { 712a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (scripts[i]) { 713a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) goog.importScript_(goog.basePath + scripts[i]); 714a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else { 715a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) throw Error('Undefined script input'); 716a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 717a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 718a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) }; 719a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 720a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 721a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) /** 722a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Looks at the dependency rules and tries to determine the script file that 723a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * fulfills a particular rule. 724a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {string} rule In the form goog.namespace.Class or project.script. 725a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {?string} Url corresponding to the rule, or null. 726a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @private 727a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 728a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) goog.getPathFromDeps_ = function(rule) { 729a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (rule in goog.dependencies_.nameToPath) { 730a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return goog.dependencies_.nameToPath[rule]; 731a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else { 732a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return null; 733a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 734a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) }; 735a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 736a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) goog.findBasePath_(); 737a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 738a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Allow projects to manage the deps files themselves. 739a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!goog.global.CLOSURE_NO_DEPS) { 740a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) goog.importScript_(goog.basePath + 'deps.js'); 741a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 742a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 743a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 744a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 745a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 746a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)//============================================================================== 747a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Language Enhancements 748a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)//============================================================================== 749a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 750a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 751a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 752a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * This is a "fixed" version of the typeof operator. It differs from the typeof 753a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * operator in such a way that null returns 'null' and arrays return 'array'. 754a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {*} value The value to get the type of. 755a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {string} The name of the type. 756a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 757a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.typeOf = function(value) { 758a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var s = typeof value; 759a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (s == 'object') { 760a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (value) { 761a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Check these first, so we can avoid calling Object.prototype.toString if 762a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // possible. 763a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // 764a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // IE improperly marshals tyepof across execution contexts, but a 765a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // cross-context object will still return false for "instanceof Object". 766a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (value instanceof Array) { 767a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return 'array'; 768a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else if (value instanceof Object) { 769a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return s; 770a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 771a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 772a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // HACK: In order to use an Object prototype method on the arbitrary 773a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // value, the compiler requires the value be cast to type Object, 774a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // even though the ECMA spec explicitly allows it. 775a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var className = Object.prototype.toString.call( 776a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) /** @type {Object} */ (value)); 777a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // In Firefox 3.6, attempting to access iframe window objects' length 778a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // property throws an NS_ERROR_FAILURE, so we need to special-case it 779a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // here. 780a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (className == '[object Window]') { 781a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return 'object'; 782a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 783a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 784a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // We cannot always use constructor == Array or instanceof Array because 785a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // different frames have different Array objects. In IE6, if the iframe 786a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // where the array was created is destroyed, the array loses its 787a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // prototype. Then dereferencing val.splice here throws an exception, so 788a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // we can't use goog.isFunction. Calling typeof directly returns 'unknown' 789a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // so that will work. In this case, this function will return false and 790a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // most array functions will still work because the array is still 791a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // array-like (supports length and []) even though it has lost its 792a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // prototype. 793a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Mark Miller noticed that Object.prototype.toString 794a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // allows access to the unforgeable [[Class]] property. 795a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // 15.2.4.2 Object.prototype.toString ( ) 796a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // When the toString method is called, the following steps are taken: 797a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // 1. Get the [[Class]] property of this object. 798a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // 2. Compute a string value by concatenating the three strings 799a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // "[object ", Result(1), and "]". 800a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // 3. Return Result(2). 801a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // and this behavior survives the destruction of the execution context. 802a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if ((className == '[object Array]' || 803a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // In IE all non value types are wrapped as objects across window 804a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // boundaries (not iframe though) so we have to do object detection 805a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // for this edge case 806a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) typeof value.length == 'number' && 807a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) typeof value.splice != 'undefined' && 808a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) typeof value.propertyIsEnumerable != 'undefined' && 809a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) !value.propertyIsEnumerable('splice') 810a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 811a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) )) { 812a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return 'array'; 813a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 814a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // HACK: There is still an array case that fails. 815a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // function ArrayImpostor() {} 816a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // ArrayImpostor.prototype = []; 817a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // var impostor = new ArrayImpostor; 818a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // this can be fixed by getting rid of the fast path 819a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // (value instanceof Array) and solely relying on 820a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // (value && Object.prototype.toString.vall(value) === '[object Array]') 821a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // but that would require many more function calls and is not warranted 822a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // unless closure code is receiving objects from untrusted sources. 823a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 824a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // IE in cross-window calls does not correctly marshal the function type 825a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // (it appears just as an object) so we cannot use just typeof val == 826a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // 'function'. However, if the object has a call property, it is a 827a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // function. 828a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if ((className == '[object Function]' || 829a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) typeof value.call != 'undefined' && 830a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) typeof value.propertyIsEnumerable != 'undefined' && 831a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) !value.propertyIsEnumerable('call'))) { 832a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return 'function'; 833a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 834a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 835a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 836a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else { 837a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return 'null'; 838a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 839a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 840a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else if (s == 'function' && typeof value.call == 'undefined') { 841a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // In Safari typeof nodeList returns 'function', and on Firefox 842a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // typeof behaves similarly for HTML{Applet,Embed,Object}Elements 843a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // and RegExps. We would like to return object for those and we can 844a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // detect an invalid function by making sure that the function 845a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // object has a call method. 846a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return 'object'; 847a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 848a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return s; 849a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 850a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 851a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 852a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 853a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Returns true if the specified value is not |undefined|. 854a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * WARNING: Do not use this to test if an object has a property. Use the in 855a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * operator instead. Additionally, this function assumes that the global 856a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * undefined variable has not been redefined. 857a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {*} val Variable to test. 858a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {boolean} Whether variable is defined. 859a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 860a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.isDef = function(val) { 861a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return val !== undefined; 862a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 863a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 864a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 865a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 866a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Returns true if the specified value is |null| 867a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {*} val Variable to test. 868a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {boolean} Whether variable is null. 869a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 870a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.isNull = function(val) { 871a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return val === null; 872a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 873a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 874a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 875a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 876a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Returns true if the specified value is defined and not null 877a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {*} val Variable to test. 878a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {boolean} Whether variable is defined and not null. 879a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 880a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.isDefAndNotNull = function(val) { 881a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Note that undefined == null. 882a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return val != null; 883a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 884a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 885a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 886a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 887a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Returns true if the specified value is an array 888a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {*} val Variable to test. 889a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {boolean} Whether variable is an array. 890a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 891a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.isArray = function(val) { 892a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return goog.typeOf(val) == 'array'; 893a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 894a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 895a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 896a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 897a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Returns true if the object looks like an array. To qualify as array like 898a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * the value needs to be either a NodeList or an object with a Number length 899a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * property. 900a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {*} val Variable to test. 901a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {boolean} Whether variable is an array. 902a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 903a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.isArrayLike = function(val) { 904a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var type = goog.typeOf(val); 905a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return type == 'array' || type == 'object' && typeof val.length == 'number'; 906a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 907a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 908a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 909a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 910a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Returns true if the object looks like a Date. To qualify as Date-like 911a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * the value needs to be an object and have a getFullYear() function. 912a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {*} val Variable to test. 913a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {boolean} Whether variable is a like a Date. 914a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 915a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.isDateLike = function(val) { 916a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return goog.isObject(val) && typeof val.getFullYear == 'function'; 917a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 918a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 919a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 920a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 921a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Returns true if the specified value is a string 922a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {*} val Variable to test. 923a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {boolean} Whether variable is a string. 924a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 925a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.isString = function(val) { 926a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return typeof val == 'string'; 927a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 928a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 929a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 930a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 931a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Returns true if the specified value is a boolean 932a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {*} val Variable to test. 933a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {boolean} Whether variable is boolean. 934a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 935a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.isBoolean = function(val) { 936a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return typeof val == 'boolean'; 937a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 938a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 939a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 940a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 941a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Returns true if the specified value is a number 942a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {*} val Variable to test. 943a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {boolean} Whether variable is a number. 944a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 945a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.isNumber = function(val) { 946a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return typeof val == 'number'; 947a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 948a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 949a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 950a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 951a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Returns true if the specified value is a function 952a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {*} val Variable to test. 953a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {boolean} Whether variable is a function. 954a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 955a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.isFunction = function(val) { 956a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return goog.typeOf(val) == 'function'; 957a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 958a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 959a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 960a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 961a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Returns true if the specified value is an object. This includes arrays 962a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * and functions. 963a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {*} val Variable to test. 964a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {boolean} Whether variable is an object. 965a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 966a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.isObject = function(val) { 967a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var type = typeof val; 968a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return type == 'object' && val != null || type == 'function'; 969a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // return Object(val) === val also works, but is slower, especially if val is 970a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // not an object. 971a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 972a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 973a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 974a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 975a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Gets a unique ID for an object. This mutates the object so that further 976a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * calls with the same object as a parameter returns the same value. The unique 977a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * ID is guaranteed to be unique across the current session amongst objects that 978a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * are passed into {@code getUid}. There is no guarantee that the ID is unique 979a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * or consistent across sessions. It is unsafe to generate unique ID for 980a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * function prototypes. 981a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 982a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {Object} obj The object to get the unique ID for. 983a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {number} The unique ID for the object. 984a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 985a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.getUid = function(obj) { 986a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(arv): Make the type stricter, do not accept null. 987a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 988a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // In Opera window.hasOwnProperty exists but always returns false so we avoid 989a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // using it. As a consequence the unique ID generated for BaseClass.prototype 990a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // and SubClass.prototype will be the same. 991a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return obj[goog.UID_PROPERTY_] || 992a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) (obj[goog.UID_PROPERTY_] = ++goog.uidCounter_); 993a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 994a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 995a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 996a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 997a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Removes the unique ID from an object. This is useful if the object was 998a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * previously mutated using {@code goog.getUid} in which case the mutation is 999a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * undone. 1000a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {Object} obj The object to remove the unique ID field from. 1001a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 1002a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.removeUid = function(obj) { 1003a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(arv): Make the type stricter, do not accept null. 1004a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1005a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // DOM nodes in IE are not instance of Object and throws exception 1006a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // for delete. Instead we try to use removeAttribute 1007a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if ('removeAttribute' in obj) { 1008a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) obj.removeAttribute(goog.UID_PROPERTY_); 1009a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1010a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) /** @preserveTry */ 1011a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) try { 1012a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) delete obj[goog.UID_PROPERTY_]; 1013a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } catch (ex) { 1014a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1015a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 1016a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1017a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1018a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 1019a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Name for unique ID property. Initialized in a way to help avoid collisions 1020a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * with other closure javascript on the same page. 1021a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @type {string} 1022a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @private 1023a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 1024a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.UID_PROPERTY_ = 'closure_uid_' + ((Math.random() * 1e9) >>> 0); 1025a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1026a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1027a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 1028a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Counter for UID. 1029a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @type {number} 1030a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @private 1031a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 1032a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.uidCounter_ = 0; 1033a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1034a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1035a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 1036a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Adds a hash code field to an object. The hash code is unique for the 1037a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * given object. 1038a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {Object} obj The object to get the hash code for. 1039a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {number} The hash code for the object. 1040a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @deprecated Use goog.getUid instead. 1041a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 1042a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.getHashCode = goog.getUid; 1043a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1044a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1045a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 1046a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Removes the hash code field from an object. 1047a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {Object} obj The object to remove the field from. 1048a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @deprecated Use goog.removeUid instead. 1049a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 1050a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.removeHashCode = goog.removeUid; 1051a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1052a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1053a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 1054a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Clones a value. The input may be an Object, Array, or basic type. Objects and 1055a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * arrays will be cloned recursively. 1056a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1057a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * WARNINGS: 1058a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * <code>goog.cloneObject</code> does not detect reference loops. Objects that 1059a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * refer to themselves will cause infinite recursion. 1060a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1061a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * <code>goog.cloneObject</code> is unaware of unique identifiers, and copies 1062a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * UIDs created by <code>getUid</code> into cloned results. 1063a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1064a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {*} obj The value to clone. 1065a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {*} A clone of the input value. 1066a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @deprecated goog.cloneObject is unsafe. Prefer the goog.object methods. 1067a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 1068a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.cloneObject = function(obj) { 1069a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var type = goog.typeOf(obj); 1070a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (type == 'object' || type == 'array') { 1071a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (obj.clone) { 1072a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return obj.clone(); 1073a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1074a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var clone = type == 'array' ? [] : {}; 1075a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (var key in obj) { 1076a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) clone[key] = goog.cloneObject(obj[key]); 1077a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1078a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return clone; 1079a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1080a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1081a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return obj; 1082a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 1083a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1084a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1085a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 1086a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * A native implementation of goog.bind. 1087a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {Function} fn A function to partially apply. 1088a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {Object|undefined} selfObj Specifies the object which |this| should 1089a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * point to when the function is run. 1090a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {...*} var_args Additional arguments that are partially 1091a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * applied to the function. 1092a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {!Function} A partially-applied form of the function bind() was 1093a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * invoked as a method of. 1094a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @private 1095a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @suppress {deprecated} The compiler thinks that Function.prototype.bind 1096a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * is deprecated because some people have declared a pure-JS version. 1097a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Only the pure-JS version is truly deprecated. 1098a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 1099a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.bindNative_ = function(fn, selfObj, var_args) { 1100a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return /** @type {!Function} */ (fn.call.apply(fn.bind, arguments)); 1101a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 1102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 1105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * A pure-JS implementation of goog.bind. 1106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {Function} fn A function to partially apply. 1107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {Object|undefined} selfObj Specifies the object which |this| should 1108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * point to when the function is run. 1109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {...*} var_args Additional arguments that are partially 1110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * applied to the function. 1111a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {!Function} A partially-applied form of the function bind() was 1112a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * invoked as a method of. 1113a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @private 1114a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 1115a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.bindJs_ = function(fn, selfObj, var_args) { 1116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!fn) { 1117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) throw new Error(); 1118a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1119a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (arguments.length > 2) { 1121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var boundArgs = Array.prototype.slice.call(arguments, 2); 1122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return function() { 1123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Prepend the bound arguments to the current arguments. 1124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var newArgs = Array.prototype.slice.call(arguments); 1125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Array.prototype.unshift.apply(newArgs, boundArgs); 1126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return fn.apply(selfObj, newArgs); 1127a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) }; 1128a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else { 1130a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return function() { 1131a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return fn.apply(selfObj, arguments); 1132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) }; 1133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 1135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 1138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Partially applies this function to a particular 'this object' and zero or 1139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * more arguments. The result is a new function with some arguments of the first 1140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * function pre-filled and the value of |this| 'pre-specified'.<br><br> 1141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Remaining arguments specified at call-time are appended to the pre- 1143a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * specified ones.<br><br> 1144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Also see: {@link #partial}.<br><br> 1146a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1147a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Usage: 1148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * <pre>var barMethBound = bind(myFunction, myObj, 'arg1', 'arg2'); 1149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * barMethBound('arg3', 'arg4');</pre> 1150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {?function(this:T, ...)} fn A function to partially apply. 1152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {T} selfObj Specifies the object which |this| should 1153a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * point to when the function is run. 1154a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {...*} var_args Additional arguments that are partially 1155a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * applied to the function. 1156a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {!Function} A partially-applied form of the function bind() was 1157a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * invoked as a method of. 1158a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @template T 1159a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @suppress {deprecated} See above. 1160a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 1161a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.bind = function(fn, selfObj, var_args) { 1162a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(nicksantos): narrow the type signature. 1163a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (Function.prototype.bind && 1164a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // NOTE(nicksantos): Somebody pulled base.js into the default 1165a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Chrome extension environment. This means that for Chrome extensions, 1166a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // they get the implementation of Function.prototype.bind that 1167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // calls goog.bind instead of the native one. Even worse, we don't want 1168a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // to introduce a circular dependency between goog.bind and 1169a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Function.prototype.bind, so we have to hack this to make sure it 1170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // works correctly. 1171a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Function.prototype.bind.toString().indexOf('native code') != -1) { 1172a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) goog.bind = goog.bindNative_; 1173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else { 1174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) goog.bind = goog.bindJs_; 1175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return goog.bind.apply(null, arguments); 1177a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 1178a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1179a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1180a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 1181a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Like bind(), except that a 'this object' is not required. Useful when the 1182a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * target function is already bound. 1183a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1184a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Usage: 1185a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * var g = partial(f, arg1, arg2); 1186a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * g(arg3, arg4); 1187a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1188a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {Function} fn A function to partially apply. 1189a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {...*} var_args Additional arguments that are partially 1190a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * applied to fn. 1191a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {!Function} A partially-applied form of the function bind() was 1192a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * invoked as a method of. 1193a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 1194a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.partial = function(fn, var_args) { 1195a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var args = Array.prototype.slice.call(arguments, 1); 1196a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return function() { 1197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Prepend the bound arguments to the current arguments. 1198a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var newArgs = Array.prototype.slice.call(arguments); 1199a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) newArgs.unshift.apply(newArgs, args); 1200a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return fn.apply(this, newArgs); 1201a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) }; 1202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 1203a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1204a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 1206a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Copies all the members of a source object to a target object. This method 1207a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * does not work on all browsers for all objects that contain keys such as 1208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * toString or hasOwnProperty. Use goog.object.extend for this purpose. 1209a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {Object} target Target. 1210a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {Object} source Source. 1211a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 1212a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.mixin = function(target, source) { 1213a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (var x in source) { 1214a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) target[x] = source[x]; 1215a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1216a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1217a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // For IE7 or lower, the for-in-loop does not contain any properties that are 1218a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // not enumerable on the prototype object (for example, isPrototypeOf from 1219a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Object.prototype) but also it will not include 'replace' on objects that 1220a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // extend String and change 'replace' (not that it is common for anyone to 1221a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // extend anything except Object). 1222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 1223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 1226a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {number} An integer value representing the number of milliseconds 1227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * between midnight, January 1, 1970 and the current time. 1228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 1229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.now = (goog.TRUSTED_SITE && Date.now) || (function() { 1230a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Unary plus operator converts its operand to a number which in the case of 1231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // a date is done by calling getTime(). 1232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return +new Date(); 1233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}); 1234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1235a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1236a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 1237a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Evals javascript in the global scope. In IE this uses execScript, other 1238a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * browsers use goog.global.eval. If goog.global.eval does not evaluate in the 1239a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * global scope (for example, in Safari), appends a script tag instead. 1240a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Throws an exception if neither execScript or eval is defined. 1241a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {string} script JavaScript string. 1242a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 1243a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.globalEval = function(script) { 1244a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (goog.global.execScript) { 1245a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) goog.global.execScript(script, 'JavaScript'); 1246a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else if (goog.global.eval) { 1247a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Test to see if eval works 1248a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (goog.evalWorksForGlobals_ == null) { 1249a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) goog.global.eval('var _et_ = 1;'); 1250a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (typeof goog.global['_et_'] != 'undefined') { 1251a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) delete goog.global['_et_']; 1252a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) goog.evalWorksForGlobals_ = true; 1253a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else { 1254a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) goog.evalWorksForGlobals_ = false; 1255a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1256a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1257a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1258a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (goog.evalWorksForGlobals_) { 1259a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) goog.global.eval(script); 1260a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else { 1261a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var doc = goog.global.document; 1262a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var scriptElt = doc.createElement('script'); 1263a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scriptElt.type = 'text/javascript'; 1264a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scriptElt.defer = false; 1265a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Note(pupius): can't use .innerHTML since "t('<test>')" will fail and 1266a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // .text doesn't work in Safari 2. Therefore we append a text node. 1267a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scriptElt.appendChild(doc.createTextNode(script)); 1268a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) doc.body.appendChild(scriptElt); 1269a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) doc.body.removeChild(scriptElt); 1270a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1271a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else { 1272a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) throw Error('goog.globalEval not available'); 1273a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1274a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 1275a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1276a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1277a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 1278a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Indicates whether or not we can call 'eval' directly to eval code in the 1279a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * global scope. Set to a Boolean by the first call to goog.globalEval (which 1280a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * empirically tests whether eval works for globals). @see goog.globalEval 1281a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @type {?boolean} 1282a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @private 1283a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 1284a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.evalWorksForGlobals_ = null; 1285a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1286a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1287a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 1288a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Optional map of CSS class names to obfuscated names used with 1289a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * goog.getCssName(). 1290a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @type {Object|undefined} 1291a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @private 1292a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @see goog.setCssNameMapping 1293a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 1294a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.cssNameMapping_; 1295a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1296a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1297a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 1298a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Optional obfuscation style for CSS class names. Should be set to either 1299a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 'BY_WHOLE' or 'BY_PART' if defined. 1300a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @type {string|undefined} 1301a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @private 1302a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @see goog.setCssNameMapping 1303a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 1304a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.cssNameMappingStyle_; 1305a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1306a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1307a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 1308a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Handles strings that are intended to be used as CSS class names. 1309a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1310a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * This function works in tandem with @see goog.setCssNameMapping. 1311a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1312a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Without any mapping set, the arguments are simple joined with a 1313a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * hyphen and passed through unaltered. 1314a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1315a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * When there is a mapping, there are two possible styles in which 1316a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * these mappings are used. In the BY_PART style, each part (i.e. in 1317a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * between hyphens) of the passed in css name is rewritten according 1318a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * to the map. In the BY_WHOLE style, the full css name is looked up in 1319a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * the map directly. If a rewrite is not specified by the map, the 1320a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * compiler will output a warning. 1321a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1322a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * When the mapping is passed to the compiler, it will replace calls 1323a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * to goog.getCssName with the strings from the mapping, e.g. 1324a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * var x = goog.getCssName('foo'); 1325a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * var y = goog.getCssName(this.baseClass, 'active'); 1326a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * becomes: 1327a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * var x= 'foo'; 1328a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * var y = this.baseClass + '-active'; 1329a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1330a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * If one argument is passed it will be processed, if two are passed 1331a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * only the modifier will be processed, as it is assumed the first 1332a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * argument was generated as a result of calling goog.getCssName. 1333a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1334a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {string} className The class name. 1335a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {string=} opt_modifier A modifier to be appended to the class name. 1336a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {string} The class name or the concatenation of the class name and 1337a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * the modifier. 1338a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 1339a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.getCssName = function(className, opt_modifier) { 1340a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var getMapping = function(cssName) { 1341a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return goog.cssNameMapping_[cssName] || cssName; 1342a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) }; 1343a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1344a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var renameByParts = function(cssName) { 1345a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Remap all the parts individually. 1346a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var parts = cssName.split('-'); 1347a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var mapped = []; 1348a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (var i = 0; i < parts.length; i++) { 1349a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) mapped.push(getMapping(parts[i])); 1350a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1351a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return mapped.join('-'); 1352a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) }; 1353a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1354a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var rename; 1355a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (goog.cssNameMapping_) { 1356a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) rename = goog.cssNameMappingStyle_ == 'BY_WHOLE' ? 1357a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) getMapping : renameByParts; 1358a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else { 1359a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) rename = function(a) { 1360a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return a; 1361a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) }; 1362a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1363a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1364a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (opt_modifier) { 1365a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return className + '-' + rename(opt_modifier); 1366a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else { 1367a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return rename(className); 1368a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1369a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 1370a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1371a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1372a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 1373a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Sets the map to check when returning a value from goog.getCssName(). Example: 1374a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * <pre> 1375a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * goog.setCssNameMapping({ 1376a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * "goog": "a", 1377a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * "disabled": "b", 1378a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * }); 1379a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1380a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * var x = goog.getCssName('goog'); 1381a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * // The following evaluates to: "a a-b". 1382a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * goog.getCssName('goog') + ' ' + goog.getCssName(x, 'disabled') 1383a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * </pre> 1384a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * When declared as a map of string literals to string literals, the JSCompiler 1385a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * will replace all calls to goog.getCssName() using the supplied map if the 1386a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * --closure_pass flag is set. 1387a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1388a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {!Object} mapping A map of strings to strings where keys are possible 1389a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * arguments to goog.getCssName() and values are the corresponding values 1390a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * that should be returned. 1391a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {string=} opt_style The style of css name mapping. There are two valid 1392a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * options: 'BY_PART', and 'BY_WHOLE'. 1393a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @see goog.getCssName for a description. 1394a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 1395a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.setCssNameMapping = function(mapping, opt_style) { 1396a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) goog.cssNameMapping_ = mapping; 1397a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) goog.cssNameMappingStyle_ = opt_style; 1398a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 1399a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1400a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1401a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 1402a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * To use CSS renaming in compiled mode, one of the input files should have a 1403a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * call to goog.setCssNameMapping() with an object literal that the JSCompiler 1404a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * can extract and use to replace all calls to goog.getCssName(). In uncompiled 1405a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * mode, JavaScript code should be loaded before this base.js file that declares 1406a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * a global variable, CLOSURE_CSS_NAME_MAPPING, which is used below. This is 1407a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * to ensure that the mapping is loaded before any calls to goog.getCssName() 1408a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * are made in uncompiled mode. 1409a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1410a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * A hook for overriding the CSS name mapping. 1411a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @type {Object|undefined} 1412a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 1413a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.global.CLOSURE_CSS_NAME_MAPPING; 1414a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1415a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1416a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)if (!COMPILED && goog.global.CLOSURE_CSS_NAME_MAPPING) { 1417a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // This does not call goog.setCssNameMapping() because the JSCompiler 1418a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // requires that goog.setCssNameMapping() be called with an object literal. 1419a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) goog.cssNameMapping_ = goog.global.CLOSURE_CSS_NAME_MAPPING; 1420a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1421a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1422a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1423a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 1424a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Gets a localized message. 1425a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1426a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * This function is a compiler primitive. If you give the compiler a localized 1427a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * message bundle, it will replace the string at compile-time with a localized 1428a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * version, and expand goog.getMsg call to a concatenated string. 1429a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1430a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Messages must be initialized in the form: 1431a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * <code> 1432a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * var MSG_NAME = goog.getMsg('Hello {$placeholder}', {'placeholder': 'world'}); 1433a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * </code> 1434a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1435a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {string} str Translatable string, places holders in the form {$foo}. 1436a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {Object=} opt_values Map of place holder name to value. 1437a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {string} message with placeholders filled. 1438a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 1439a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.getMsg = function(str, opt_values) { 1440a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var values = opt_values || {}; 1441a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (var key in values) { 1442a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var value = ('' + values[key]).replace(/\$/g, '$$$$'); 1443a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) str = str.replace(new RegExp('\\{\\$' + key + '\\}', 'gi'), value); 1444a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1445a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return str; 1446a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 1447a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1448a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1449a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 1450a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Gets a localized message. If the message does not have a translation, gives a 1451a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * fallback message. 1452a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1453a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * This is useful when introducing a new message that has not yet been 1454a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * translated into all languages. 1455a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1456a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * This function is a compiler primtive. Must be used in the form: 1457a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * <code>var x = goog.getMsgWithFallback(MSG_A, MSG_B);</code> 1458a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * where MSG_A and MSG_B were initialized with goog.getMsg. 1459a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1460a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {string} a The preferred message. 1461a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {string} b The fallback message. 1462a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {string} The best translated message. 1463a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 1464a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.getMsgWithFallback = function(a, b) { 1465a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return a; 1466a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 1467a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1468a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1469a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 1470a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Exposes an unobfuscated global namespace path for the given object. 1471a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Note that fields of the exported object *will* be obfuscated, 1472a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * unless they are exported in turn via this function or 1473a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * goog.exportProperty 1474a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1475a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * <p>Also handy for making public items that are defined in anonymous 1476a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * closures. 1477a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1478a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * ex. goog.exportSymbol('public.path.Foo', Foo); 1479a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1480a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * ex. goog.exportSymbol('public.path.Foo.staticFunction', 1481a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Foo.staticFunction); 1482a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * public.path.Foo.staticFunction(); 1483a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1484a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * ex. goog.exportSymbol('public.path.Foo.prototype.myMethod', 1485a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Foo.prototype.myMethod); 1486a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * new public.path.Foo().myMethod(); 1487a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1488a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {string} publicPath Unobfuscated name to export. 1489a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {*} object Object the name should point to. 1490a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {Object=} opt_objectToExportTo The object to add the path to; default 1491a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * is |goog.global|. 1492a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 1493a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.exportSymbol = function(publicPath, object, opt_objectToExportTo) { 1494a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) goog.exportPath_(publicPath, object, opt_objectToExportTo); 1495a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 1496a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1497a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1498a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 1499a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Exports a property unobfuscated into the object's namespace. 1500a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * ex. goog.exportProperty(Foo, 'staticFunction', Foo.staticFunction); 1501a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * ex. goog.exportProperty(Foo.prototype, 'myMethod', Foo.prototype.myMethod); 1502a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {Object} object Object whose static property is being exported. 1503a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {string} publicName Unobfuscated name to export. 1504a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {*} symbol Object the name should point to. 1505a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 1506a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.exportProperty = function(object, publicName, symbol) { 1507a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) object[publicName] = symbol; 1508a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 1509a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1510a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1511a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 1512a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Inherit the prototype methods from one constructor into another. 1513a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1514a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Usage: 1515a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * <pre> 1516a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * function ParentClass(a, b) { } 1517a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * ParentClass.prototype.foo = function(a) { } 1518a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1519a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * function ChildClass(a, b, c) { 1520a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * goog.base(this, a, b); 1521a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * } 1522a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * goog.inherits(ChildClass, ParentClass); 1523a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1524a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * var child = new ChildClass('a', 'b', 'see'); 1525a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * child.foo(); // works 1526a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * </pre> 1527a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1528a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * In addition, a superclass' implementation of a method can be invoked 1529a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * as follows: 1530a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1531a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * <pre> 1532a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * ChildClass.prototype.foo = function(a) { 1533a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * ChildClass.superClass_.foo.call(this, a); 1534a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * // other code 1535a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * }; 1536a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * </pre> 1537a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1538a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {Function} childCtor Child class. 1539a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {Function} parentCtor Parent class. 1540a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 1541a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.inherits = function(childCtor, parentCtor) { 1542a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) /** @constructor */ 1543a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) function tempCtor() {}; 1544a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) tempCtor.prototype = parentCtor.prototype; 1545a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) childCtor.superClass_ = parentCtor.prototype; 1546a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) childCtor.prototype = new tempCtor(); 1547a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) /** @override */ 1548a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) childCtor.prototype.constructor = childCtor; 1549a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 1550a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1551a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1552a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 1553a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Call up to the superclass. 1554a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1555a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * If this is called from a constructor, then this calls the superclass 1556a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * contructor with arguments 1-N. 1557a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1558a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * If this is called from a prototype method, then you must pass 1559a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * the name of the method as the second argument to this function. If 1560a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * you do not, you will get a runtime error. This calls the superclass' 1561a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * method with arguments 2-N. 1562a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1563a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * This function only works if you use goog.inherits to express 1564a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * inheritance relationships between your classes. 1565a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1566a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * This function is a compiler primitive. At compile-time, the 1567a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * compiler will do macro expansion to remove a lot of 1568a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * the extra overhead that this function introduces. The compiler 1569a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * will also enforce a lot of the assumptions that this function 1570a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * makes, and treat it as a compiler error if you break them. 1571a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1572a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {!Object} me Should always be "this". 1573a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {*=} opt_methodName The method name if calling a super method. 1574a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {...*} var_args The rest of the arguments. 1575a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {*} The return value of the superclass method. 1576a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 1577a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.base = function(me, opt_methodName, var_args) { 1578a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var caller = arguments.callee.caller; 1579a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1580a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (goog.DEBUG) { 1581a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!caller) { 1582a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) throw Error('arguments.caller not defined. goog.base() expects not ' + 1583a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 'to be running in strict mode. See ' + 1584a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 'http://www.ecma-international.org/ecma-262/5.1/#sec-C'); 1585a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1586a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1587a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1588a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (caller.superClass_) { 1589a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // This is a constructor. Call the superclass constructor. 1590a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return caller.superClass_.constructor.apply( 1591a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) me, Array.prototype.slice.call(arguments, 1)); 1592a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1593a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1594a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var args = Array.prototype.slice.call(arguments, 2); 1595a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var foundCaller = false; 1596a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (var ctor = me.constructor; 1597a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ctor; ctor = ctor.superClass_ && ctor.superClass_.constructor) { 1598a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (ctor.prototype[opt_methodName] === caller) { 1599a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) foundCaller = true; 1600a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else if (foundCaller) { 1601a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return ctor.prototype[opt_methodName].apply(me, args); 1602a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1603a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1604a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1605a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // If we did not find the caller in the prototype chain, 1606a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // then one of two things happened: 1607a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // 1) The caller is an instance method. 1608a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // 2) This method was not called by the right caller. 1609a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (me[opt_methodName] === caller) { 1610a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return me.constructor.prototype[opt_methodName].apply(me, args); 1611a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else { 1612a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) throw Error( 1613a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 'goog.base called from a method of one name ' + 1614a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 'to a method of a different name'); 1615a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1616a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 1617a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1618a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1619a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 1620a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Allow for aliasing within scope functions. This function exists for 1621a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * uncompiled code - in compiled code the calls will be inlined and the 1622a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * aliases applied. In uncompiled code the function is simply run since the 1623a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * aliases as written are valid JavaScript. 1624a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {function()} fn Function to call. This function can contain aliases 1625a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * to namespaces (e.g. "var dom = goog.dom") or classes 1626a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * (e.g. "var Timer = goog.Timer"). 1627a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 1628a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.scope = function(fn) { 1629a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) fn.call(goog.global); 1630a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 1631a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1632a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1633a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// MOE:begin_strip 1634a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1635a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// The section between this token and the end token below will be stripped 1636a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// automatically by the open source release scripts. Please leave in place. 1637a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1638a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)//============================================================================== 1639a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Extending Function 1640a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)//============================================================================== 1641a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1642a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1643a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 1644a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @define {boolean} Whether to extend Function.prototype. 1645a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Use --define='goog.MODIFY_FUNCTION_PROTOTYPES=false' to change. 1646a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 1647a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)goog.define('goog.MODIFY_FUNCTION_PROTOTYPES', true); 1648a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1649a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)if (goog.MODIFY_FUNCTION_PROTOTYPES) { 1650a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) /** 1651a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * An alias to the {@link goog.bind()} global function. 1652a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1653a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Usage: 1654a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * var g = f.bind(obj, arg1, arg2); 1655a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * g(arg3, arg4); 1656a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1657a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {Object} selfObj Specifies the object to which |this| should point 1658a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * when the function is run. If the value is null or undefined, it will 1659a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * default to the global object. 1660a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {...*} var_args Additional arguments that are partially 1661a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * applied to fn. 1662a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {!Function} A partially-applied form of the Function on which 1663a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * bind() was invoked as a method. 1664a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @deprecated Use the static function goog.bind instead. 1665a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @suppress {duplicate} 1666a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 1667a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Function.prototype.bind = 1668a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Function.prototype.bind || function(selfObj, var_args) { 1669a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (arguments.length > 1) { 1670a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var args = Array.prototype.slice.call(arguments, 1); 1671a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) args.unshift(this, selfObj); 1672a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return goog.bind.apply(null, args); 1673a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else { 1674a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return goog.bind(this, selfObj); 1675a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1676a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) }; 1677a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1678a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1679a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) /** 1680a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * An alias to the {@link goog.partial()} static function. 1681a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1682a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Usage: 1683a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * var g = f.partial(arg1, arg2); 1684a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * g(arg3, arg4); 1685a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1686a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {...*} var_args Additional arguments that are partially 1687a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * applied to fn. 1688a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {!Function} A partially-applied form of the function partial() was 1689a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * invoked as a method of. 1690a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @deprecated Use the static function goog.partial instead. 1691a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 1692a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Function.prototype.partial = function(var_args) { 1693a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var args = Array.prototype.slice.call(arguments); 1694a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) args.unshift(this, null); 1695a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return goog.bind.apply(null, args); 1696a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) }; 1697a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1698a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1699a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) /** 1700a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Inherit the prototype methods from one constructor into another. 1701a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {Function} parentCtor Parent class. 1702a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @see goog.inherits 1703a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @deprecated Use the static function goog.inherits instead. 1704a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 1705a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Function.prototype.inherits = function(parentCtor) { 1706a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) goog.inherits(this, parentCtor); 1707a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) }; 1708a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1709a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1710a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) /** 1711a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Mixes in an object's properties and methods into the callee's prototype. 1712a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Basically mixin based inheritance, thus providing an alternative method for 1713a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * adding properties and methods to a class' prototype. 1714a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1715a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * <pre> 1716a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * function X() {} 1717a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * X.mixin({ 1718a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * one: 1, 1719a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * two: 2, 1720a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * three: 3, 1721a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * doit: function() { return this.one + this.two + this.three; } 1722a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * }); 1723a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1724a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * function Y() { } 1725a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Y.mixin(X.prototype); 1726a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Y.prototype.four = 15; 1727a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Y.prototype.doit2 = function() { return this.doit() + this.four; } 1728a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * }); 1729a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1730a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * // or 1731a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1732a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * function Y() { } 1733a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Y.inherits(X); 1734a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Y.mixin({ 1735a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * one: 10, 1736a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * four: 15, 1737a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * doit2: function() { return this.doit() + this.four; } 1738a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * }); 1739a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * </pre> 1740a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * 1741a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {Object} source from which to copy properties. 1742a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @see goog.mixin 1743a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @deprecated Use the static function goog.object.extend instead. 1744a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 1745a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Function.prototype.mixin = function(source) { 1746a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) goog.mixin(this.prototype, source); 1747a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) }; 1748a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1749a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1750a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// MOE:end_strip 1751