15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @fileoverview Implements a shim so that the CFInstall scripts can be compiled
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * with or without Closure. In particular, chromeframe.js is used by the stub,
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the implementation, and the download site, so we need to provide an
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * implementation of goog.provide.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) **/
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var goog = {};
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)goog.global = this;
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * From closure/base.js:goog.exportPath_ .
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {string} name
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {Object=} opt_object
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)goog.provide = function(name, opt_object) {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var parts = name.split('.');
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var cur = goog.global;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Internet Explorer exhibits strange behavior when throwing errors from
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // methods externed in this manner.  See the testExportSymbolExceptions in
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // base_test.html for an example.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!(parts[0] in cur) && cur.execScript)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur.execScript('var ' + parts[0]);
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Certain browsers cannot parse code in the form for((a in b); c;);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This pattern is produced by the JSCompiler when it collapses the
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // statement above into the conditional loop below. To prevent this from
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // happening, use a for-loop and reserve the init logic as below.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Parentheses added to eliminate strict JS warning in Firefox.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (var part; parts.length && (part = parts.shift());) {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!parts.length && opt_object !== undefined) {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // last part and we have an object; use it
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cur[part] = opt_object;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (cur[part]) {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cur = cur[part];
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cur = cur[part] = {};
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following line causes the closureBuilder script to recognize this as
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// base.js .
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)goog.provide('goog');
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * From closure/base.js:goog.exportPath_ .
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {string} name
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {Object=} opt_object
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)goog.exportSymbol = goog.provide;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NO-OP
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {string} name
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)goog.require = function(name) {};
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * A simple form that supports only bound 'this', not arguments.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {Function} fn A function to partially apply.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {Object|undefined} selfObj Specifies the object which |this| should
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     point to when the function is run.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return {!Function} A partially-applied form of the function bind() was
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     invoked as a method of.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)goog.bind = function(fn, selfObj) {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return function() {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return fn.apply(selfObj, arguments);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
78