// 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: *
   * var List = base.ui.define('list');
   * List.prototype = {
   *   __proto__: HTMLUListElement.prototype,
   *   decorate: function() {
   *     ...
   *   },
   *   ...
   * };
   * 
* * @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 }; });