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