Index: third_party/google_input_tools/third_party/closure_library/closure/goog/base.js |
diff --git a/chrome/third_party/chromevox/third_party/closure-library/closure/goog/base.js b/third_party/google_input_tools/third_party/closure_library/closure/goog/base.js |
similarity index 89% |
copy from chrome/third_party/chromevox/third_party/closure-library/closure/goog/base.js |
copy to third_party/google_input_tools/third_party/closure_library/closure/goog/base.js |
index 68f871b163b98d1eaf9d9f9f920f8b840d1995f9..ead806b43e93996dc9199e893c2f5c4abec71c5f 100644 |
--- a/chrome/third_party/chromevox/third_party/closure-library/closure/goog/base.js |
+++ b/third_party/google_input_tools/third_party/closure_library/closure/goog/base.js |
@@ -277,7 +277,7 @@ goog.setTestOnly = function(opt_message) { |
if (COMPILED && !goog.DEBUG) { |
opt_message = opt_message || ''; |
throw Error('Importing test-only code into non-debug environment' + |
- opt_message ? ': ' + opt_message : '.'); |
+ (opt_message ? ': ' + opt_message : '.')); |
} |
}; |
@@ -410,7 +410,7 @@ goog.addDependency = function(relPath, provides, requires) { |
// require() with its registered dependencies. |
// User-defined namespaces may need their own deps file. See http://go/js_deps, |
// http://go/genjsdeps, or, externally, DepsWriter. |
-// http://code.google.com/closure/library/docs/depswriter.html |
+// https://developers.google.com/closure/library/docs/depswriter |
// |
// Because of legacy clients, the DOM loader can't be easily removed from |
// base.js. Work is being done to make it disableable or replaceable for |
@@ -1479,10 +1479,10 @@ if (!COMPILED && goog.global.CLOSURE_CSS_NAME_MAPPING) { |
* @return {string} message with placeholders filled. |
*/ |
goog.getMsg = function(str, opt_values) { |
- var values = opt_values || {}; |
- for (var key in values) { |
- var value = ('' + values[key]).replace(/\$/g, '$$$$'); |
- str = str.replace(new RegExp('\\{\\$' + key + '\\}', 'gi'), value); |
+ if (opt_values) { |
+ str = str.replace(/\{\$([^}]+)}/g, function(match, key) { |
+ return key in opt_values ? opt_values[key] : match; |
+ }); |
} |
return str; |
}; |
@@ -1553,10 +1553,10 @@ goog.exportProperty = function(object, publicName, symbol) { |
* Usage: |
* <pre> |
* function ParentClass(a, b) { } |
- * ParentClass.prototype.foo = function(a) { } |
+ * ParentClass.prototype.foo = function(a) { }; |
* |
* function ChildClass(a, b, c) { |
- * goog.base(this, a, b); |
+ * ChildClass.base(this, 'constructor', a, b); |
* } |
* goog.inherits(ChildClass, ParentClass); |
* |
@@ -1564,16 +1564,6 @@ goog.exportProperty = function(object, publicName, symbol) { |
* child.foo(); // This works. |
* </pre> |
* |
- * In addition, a superclass' implementation of a method can be invoked as |
- * follows: |
- * |
- * <pre> |
- * ChildClass.prototype.foo = function(a) { |
- * ChildClass.superClass_.foo.call(this, a); |
- * // Other code here. |
- * }; |
- * </pre> |
- * |
* @param {Function} childCtor Child class. |
* @param {Function} parentCtor Parent class. |
*/ |
@@ -1680,6 +1670,8 @@ goog.base = function(me, opt_methodName, var_args) { |
* uncompiled code - in compiled code the calls will be inlined and the aliases |
* applied. In uncompiled code the function is simply run since the aliases as |
* written are valid JavaScript. |
+ * |
+ * |
* @param {function()} fn Function to call. This function can contain aliases |
* to namespaces (e.g. "var dom = goog.dom") or classes |
* (e.g. "var Timer = goog.Timer"). |
@@ -1704,3 +1696,180 @@ if (!COMPILED) { |
} |
+ |
+//============================================================================== |
+// goog.defineClass implementation |
+//============================================================================== |
+ |
+/** |
+ * Creates a restricted form of a Closure "class": |
+ * - from the compiler's perspective, the instance returned from the |
+ * constructor is sealed (no new properties may be added). This enables |
+ * better checks. |
+ * - the compiler will rewrite this definition to a form that is optimal |
+ * for type checking and optimization (initially this will be a more |
+ * traditional form). |
+ * |
+ * @param {Function} superClass The superclass, Object or null. |
+ * @param {goog.defineClass.ClassDescriptor} def |
+ * An object literal describing the |
+ * the class. It may have the following properties: |
+ * "constructor": the constructor function |
+ * "statics": an object literal containing methods to add to the constructor |
+ * as "static" methods or a function that will receive the constructor |
+ * function as its only parameter to which static properties can |
+ * be added. |
+ * all other properties are added to the prototype. |
+ * @return {!Function} The class constructor. |
+ */ |
+goog.defineClass = function(superClass, def) { |
+ // TODO(johnlenz): consider making the superClass an optional parameter. |
+ var constructor = def.constructor; |
+ var statics = def.statics; |
+ // Wrap the constructor prior to setting up the prototype and static methods. |
+ if (!constructor || constructor == Object.prototype.constructor) { |
+ constructor = function() { |
+ throw Error('cannot instantiate an interface (no constructor defined).'); |
+ }; |
+ } |
+ |
+ var cls = goog.defineClass.createSealingConstructor_(constructor, superClass); |
+ if (superClass) { |
+ goog.inherits(cls, superClass); |
+ } |
+ |
+ // Remove all the properties that should not be copied to the prototype. |
+ delete def.constructor; |
+ delete def.statics; |
+ |
+ goog.defineClass.applyProperties_(cls.prototype, def); |
+ if (statics != null) { |
+ if (statics instanceof Function) { |
+ statics(cls); |
+ } else { |
+ goog.defineClass.applyProperties_(cls, statics); |
+ } |
+ } |
+ |
+ return cls; |
+}; |
+ |
+ |
+/** |
+ * @typedef { |
+ * !Object| |
+ * {constructor:!Function}| |
+ * {constructor:!Function, statics:(Object|function(Function):void)}} |
+ */ |
+goog.defineClass.ClassDescriptor; |
+ |
+ |
+/** |
+ * @define {boolean} Whether the instances returned by |
+ * goog.defineClass should be sealed when possible. |
+ */ |
+goog.define('goog.defineClass.SEAL_CLASS_INSTANCES', goog.DEBUG); |
+ |
+ |
+/** |
+ * If goog.defineClass.SEAL_CLASS_INSTANCES is enabled and Object.seal is |
+ * defined, this function will wrap the constructor in a function that seals the |
+ * results of the provided constructor function. |
+ * |
+ * @param {!Function} ctr The constructor whose results maybe be sealed. |
+ * @param {Function} superClass The superclass constructor. |
+ * @return {!Function} The replacement constructor. |
+ * @private |
+ */ |
+goog.defineClass.createSealingConstructor_ = function(ctr, superClass) { |
+ if (goog.defineClass.SEAL_CLASS_INSTANCES && |
+ Object.seal instanceof Function) { |
+ // Don't seal subclasses of unsealable-tagged legacy classes. |
+ if (superClass && superClass.prototype && |
+ superClass.prototype[goog.UNSEALABLE_CONSTRUCTOR_PROPERTY_]) { |
+ return ctr; |
+ } |
+ /** @this {*} */ |
+ var wrappedCtr = function() { |
+ // Don't seal an instance of a subclass when it calls the constructor of |
+ // its super class as there is most likely still setup to do. |
+ var instance = ctr.apply(this, arguments) || this; |
+ if (this.constructor === wrappedCtr) { |
+ Object.seal(instance); |
+ } |
+ return instance; |
+ }; |
+ return wrappedCtr; |
+ } |
+ return ctr; |
+}; |
+ |
+ |
+// TODO(johnlenz): share these values with the goog.object |
+/** |
+ * The names of the fields that are defined on Object.prototype. |
+ * @type {!Array.<string>} |
+ * @private |
+ * @const |
+ */ |
+goog.defineClass.OBJECT_PROTOTYPE_FIELDS_ = [ |
+ 'constructor', |
+ 'hasOwnProperty', |
+ 'isPrototypeOf', |
+ 'propertyIsEnumerable', |
+ 'toLocaleString', |
+ 'toString', |
+ 'valueOf' |
+]; |
+ |
+ |
+// TODO(johnlenz): share this function with the goog.object |
+/** |
+ * @param {!Object} target The object to add properties to. |
+ * @param {!Object} source The object to copy properites from. |
+ * @private |
+ */ |
+goog.defineClass.applyProperties_ = function(target, source) { |
+ // TODO(johnlenz): update this to support ES5 getters/setters |
+ |
+ var key; |
+ for (key in source) { |
+ if (Object.prototype.hasOwnProperty.call(source, key)) { |
+ target[key] = source[key]; |
+ } |
+ } |
+ |
+ // For IE the for-in-loop does not contain any properties that are not |
+ // enumerable on the prototype object (for example isPrototypeOf from |
+ // Object.prototype) and it will also not include 'replace' on objects that |
+ // extend String and change 'replace' (not that it is common for anyone to |
+ // extend anything except Object). |
+ for (var i = 0; i < goog.defineClass.OBJECT_PROTOTYPE_FIELDS_.length; i++) { |
+ key = goog.defineClass.OBJECT_PROTOTYPE_FIELDS_[i]; |
+ if (Object.prototype.hasOwnProperty.call(source, key)) { |
+ target[key] = source[key]; |
+ } |
+ } |
+}; |
+ |
+ |
+/** |
+ * Sealing classes breaks the older idiom of assigning properties on the |
+ * prototype rather than in the constructor. As such, goog.defineClass |
+ * must not seal subclasses of these old-style classes until they are fixed. |
+ * Until then, this marks a class as "broken", instructing defineClass |
+ * not to seal subclasses. |
+ * @param {!Function} ctr The legacy constructor to tag as unsealable. |
+ */ |
+goog.tagUnsealableClass = function(ctr) { |
+ if (!COMPILED && goog.defineClass.SEAL_CLASS_INSTANCES) { |
+ ctr.prototype[goog.UNSEALABLE_CONSTRUCTOR_PROPERTY_] = true; |
+ } |
+}; |
+ |
+ |
+/** |
+ * Name for unsealable tag property. |
+ * @const @private {string} |
+ */ |
+goog.UNSEALABLE_CONSTRUCTOR_PROPERTY_ = 'goog_defineClass_legacy_unsealable'; |