| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| base.exportTo('ui', function() { |
| |
| /** |
| * Helper function for creating new element for define. |
| */ |
| function createElementHelper(tagName, opt_bag) { |
| // Allow passing in ownerDocument to create in a different document. |
| var doc; |
| if (opt_bag && opt_bag.ownerDocument) |
| doc = opt_bag.ownerDocument; |
| |
| return doc.createElement(tagName); |
| } |
| |
| /** |
| * Creates the constructor for a UI element class. |
| * |
| * Usage: |
| * <pre> |
| * var List = base.ui.define('list'); |
| * List.prototype = { |
| * __proto__: HTMLUListElement.prototype, |
| * decorate: function() { |
| * ... |
| * }, |
| * ... |
| * }; |
| * </pre> |
| * |
| * @param {string|Function} tagNameOrFunction The tagName or |
| * function to use for newly created elements. If this is a function it |
| * needs to return a new element when called. |
| * @return {function(Object=):Element} The constructor function which takes |
| * an optional property bag. The function also has a static |
| * {@code decorate} method added to it. |
| */ |
| function define(tagNameOrFunction) { |
| var createFunction, tagName; |
| if (typeof tagNameOrFunction == 'function') { |
| createFunction = tagNameOrFunction; |
| tagName = ''; |
| } else { |
| createFunction = createElementHelper; |
| tagName = tagNameOrFunction; |
| } |
| |
| /** |
| * Creates a new UI element constructor. |
| * @param {Object=} opt_propertyBag Optional bag of properties to set on the |
| * object after created. The property {@code ownerDocument} is special |
| * cased and it allows you to create the element in a different |
| * document than the default. |
| * @constructor |
| */ |
| function f(opt_propertyBag) { |
| var el = createFunction(tagName, opt_propertyBag); |
| f.decorate(el); |
| for (var propertyName in opt_propertyBag) { |
| el[propertyName] = opt_propertyBag[propertyName]; |
| } |
| return el; |
| } |
| |
| /** |
| * Decorates an element as a UI element class. |
| * @param {!Element} el The element to decorate. |
| */ |
| f.decorate = function(el) { |
| el.__proto__ = f.prototype; |
| el.decorate(); |
| }; |
| |
| return f; |
| } |
| |
| return { |
| define: define |
| }; |
| }); |