1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5'use strict';
6
7
8/**
9 * The global object.
10 * @type {!Object}
11 * @const
12 */
13var global = this;
14
15
16/** Platform, package, object property, and Event support. */
17this.base = (function() {
18
19  function mLog(text, opt_indentLevel) {
20    if (true)
21      return;
22
23    var spacing = '';
24    var indentLevel = opt_indentLevel || 0;
25    for (var i = 0; i < indentLevel; i++)
26      spacing += ' ';
27    console.log(spacing + text);
28  }
29
30  /**
31   * Builds an object structure for the provided namespace path,
32   * ensuring that names that already exist are not overwritten. For
33   * example:
34   * 'a.b.c' -> a = {};a.b={};a.b.c={};
35   * @param {string} name Name of the object that this file defines.
36   * @param {*=} opt_object The object to expose at the end of the path.
37   * @param {Object=} opt_objectToExportTo The object to add the path to;
38   *     default is {@code global}.
39   * @private
40   */
41  function exportPath(name, opt_object, opt_objectToExportTo) {
42    var parts = name.split('.');
43    var cur = opt_objectToExportTo || global;
44
45    for (var part; parts.length && (part = parts.shift());) {
46      if (!parts.length && opt_object !== undefined) {
47        // last part and we have an object; use it
48        cur[part] = opt_object;
49      } else if (part in cur) {
50        cur = cur[part];
51      } else {
52        cur = cur[part] = {};
53      }
54    }
55    return cur;
56  }
57
58  function exportTo(namespace, fn) {
59    var obj = exportPath(namespace);
60    try {
61      var exports = fn();
62    } catch (e) {
63      console.log('While running exports for ', name, ':');
64      console.log(e.stack || e);
65      return;
66    }
67
68    for (var propertyName in exports) {
69      // Maybe we should check the prototype chain here? The current usage
70      // pattern is always using an object literal so we only care about own
71      // properties.
72      var propertyDescriptor = Object.getOwnPropertyDescriptor(exports,
73                                                               propertyName);
74      if (propertyDescriptor) {
75        Object.defineProperty(obj, propertyName, propertyDescriptor);
76        mLog('  +' + propertyName);
77      }
78    }
79  }
80
81  return {
82    exportTo: exportTo
83  };
84})();