1// Copyright (c) 2011 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/**
6 * @fileoverview Implements a shim so that the CFInstall scripts can be compiled
7 * with or without Closure. In particular, chromeframe.js is used by the stub,
8 * the implementation, and the download site, so we need to provide an
9 * implementation of goog.provide.
10 **/
11
12var goog = {};
13goog.global = this;
14
15/**
16 * From closure/base.js:goog.exportPath_ .
17 * @param {string} name
18 * @param {Object=} opt_object
19 */
20goog.provide = function(name, opt_object) {
21  var parts = name.split('.');
22  var cur = goog.global;
23
24  // Internet Explorer exhibits strange behavior when throwing errors from
25  // methods externed in this manner.  See the testExportSymbolExceptions in
26  // base_test.html for an example.
27  if (!(parts[0] in cur) && cur.execScript)
28    cur.execScript('var ' + parts[0]);
29
30  // Certain browsers cannot parse code in the form for((a in b); c;);
31  // This pattern is produced by the JSCompiler when it collapses the
32  // statement above into the conditional loop below. To prevent this from
33  // happening, use a for-loop and reserve the init logic as below.
34
35  // Parentheses added to eliminate strict JS warning in Firefox.
36  for (var part; parts.length && (part = parts.shift());) {
37    if (!parts.length && opt_object !== undefined) {
38      // last part and we have an object; use it
39      cur[part] = opt_object;
40    } else if (cur[part]) {
41      cur = cur[part];
42    } else {
43      cur = cur[part] = {};
44    }
45  }
46};
47
48// The following line causes the closureBuilder script to recognize this as
49// base.js .
50goog.provide('goog');
51
52/**
53 * From closure/base.js:goog.exportPath_ .
54 * @param {string} name
55 * @param {Object=} opt_object
56 */
57goog.exportSymbol = goog.provide;
58
59/**
60 * NO-OP
61 * @param {string} name
62 */
63goog.require = function(name) {};
64
65/**
66 * A simple form that supports only bound 'this', not arguments.
67 * @param {Function} fn A function to partially apply.
68 * @param {Object|undefined} selfObj Specifies the object which |this| should
69 *     point to when the function is run.
70 * @return {!Function} A partially-applied form of the function bind() was
71 *     invoked as a method of.
72 */
73goog.bind = function(fn, selfObj) {
74  return function() {
75    return fn.apply(selfObj, arguments);
76  };
77};
78