Skip to content

Commit

Permalink
update goog.js using base.js from google-closure-library@20161201.0.0
Browse files Browse the repository at this point in the history
  • Loading branch information
flyover committed Dec 22, 2016
1 parent b51ca2d commit c3eb2a7
Showing 1 changed file with 130 additions and 39 deletions.
169 changes: 130 additions & 39 deletions demo/goog.js
Original file line number Diff line number Diff line change
Expand Up @@ -1031,8 +1031,9 @@ if (goog.DEPENDENCIES_ENABLED) {
goog.isDeferredModule_ = function(name) {
var path = goog.getPathFromDeps_(name);
var loadFlags = path && goog.dependencies_.loadFlags[path] || {};
var languageLevel = loadFlags['lang'] || 'es3';
if (path && (loadFlags['module'] == 'goog' ||
goog.needsTranspile_(loadFlags['lang']))) {
goog.needsTranspile_(languageLevel))) {
var abspath = goog.basePath + path;
return (abspath) in goog.dependencies_.deferred;
}
Expand Down Expand Up @@ -1187,16 +1188,17 @@ if (goog.DEPENDENCIES_ENABLED) {
goog.writeScriptSrcNode_(src);
}
} else {
var state = " onreadystatechange='goog.onScriptLoad_(this, " +
++goog.lastNonModuleScriptIndex_ + ")' ";
var state = ' onreadystatechange=\'goog.onScriptLoad_(this, ' +
++goog.lastNonModuleScriptIndex_ + ')\' ';
doc.write(
'<script type="text/javascript" src="' + src + '"' + state +
'></' +
'script>');
}
} else {
doc.write(
'<script type="text/javascript">' + opt_sourceText + '</' +
'<script type="text/javascript">' +
goog.protectScriptTag_(opt_sourceText) + '</' +
'script>');
}
return true;
Expand All @@ -1205,6 +1207,17 @@ if (goog.DEPENDENCIES_ENABLED) {
}
};

/**
* Rewrites closing script tags in input to avoid ending an enclosing script
* tag.
*
* @param {string} str
* @return {string}
* @private
*/
goog.protectScriptTag_ = function(str) {
return str.replace(/<\/(SCRIPT)/ig, '\\x3c\\$1');
};

/**
* Determines whether the given language needs to be transpiled.
Expand All @@ -1217,41 +1230,18 @@ if (goog.DEPENDENCIES_ENABLED) {
return true;
} else if (goog.TRANSPILE == 'never') {
return false;
} else if (!goog.transpiledLanguages_) {
goog.transpiledLanguages_ = {'es5': true, 'es6': true, 'es6-impl': true};
/** @preserveTry */
try {
// Perform some quick conformance checks, to distinguish
// between browsers that support es5, or es6.

// Identify ES3-only browsers by their incorrect treatment of commas.
goog.transpiledLanguages_['es5'] = eval('[1,].length!=1');

// Test es6: [FF50 (?), Edge 14 (?), Chrome 50]
// (a) default params (specifically shadowing locals),
// (b) destructuring, (c) block-scoped functions,
// (d) for-of (const), (e) new.target/Reflect.construct
var es6fullTest =
'class X{constructor(){if(new.target!=String)throw 1;this.x=42}}' +
'let q=Reflect.construct(X,[],String);if(q.x!=42||!(q instanceof ' +
'String))throw 1;for(const a of[2,3]){if(a==2)continue;function ' +
'f(z={a}){let a=0;return z.a}{function f(){return 0;}}return f()' +
'==3}';

if (eval('(()=>{"use strict";' + es6fullTest + '})()')) {
goog.transpiledLanguages_['es6'] = false;
// TODO(joeltine): Remove es6-impl references for http://31340605.
goog.transpiledLanguages_['es6-impl'] = false;
}
} catch (err) {
}
} else if (!goog.requiresTranspilation_) {
goog.requiresTranspilation_ = goog.createRequiresTranspilation_();
}
if (lang in goog.requiresTranspilation_) {
return goog.requiresTranspilation_[lang];
} else {
throw new Error('Unknown language mode: ' + lang);
}
return !!goog.transpiledLanguages_[lang];
};


/** @private {?Object<string, boolean>} */
goog.transpiledLanguages_ = null;
goog.requiresTranspilation_ = null;


/** @private {number} */
Expand Down Expand Up @@ -1340,7 +1330,8 @@ if (goog.DEPENDENCIES_ENABLED) {
var path = scripts[i];
if (path) {
var loadFlags = deps.loadFlags[path] || {};
var needsTranspile = goog.needsTranspile_(loadFlags['lang']);
var languageLevel = loadFlags['lang'] || 'es3';
var needsTranspile = goog.needsTranspile_(languageLevel);
if (loadFlags['module'] == 'goog' || needsTranspile) {
goog.importProcessedScript_(
goog.basePath + path, loadFlags['module'] == 'goog',
Expand Down Expand Up @@ -1563,7 +1554,20 @@ goog.transpile_ = function(code, path) {
// need it, we're about to load and write the ES6 code synchronously,
// so a normal script-tag load will be too slow.
eval(transpilerCode + '\n//# sourceURL=' + transpilerPath);
// Note: transpile.js reassigns goog.global['$jscomp'] so pull it again.
// Even though the transpiler is optional, if $gwtExport is found, it's
// a sign the transpiler was loaded and the $jscomp.transpile *should*
// be there.
if (goog.global['$gwtExport'] && goog.global['$gwtExport']['$jscomp'] &&
!goog.global['$gwtExport']['$jscomp']['transpile']) {
throw new Error(
'The transpiler did not properly export the "transpile" ' +
'method. $gwtExport: ' + JSON.stringify(goog.global['$gwtExport']));
}
// transpile.js only exports a single $jscomp function, transpile. We
// grab just that and add it to the existing definition of $jscomp which
// contains the polyfills.
goog.global['$jscomp'].transpile =
goog.global['$gwtExport']['$jscomp']['transpile'];
jscomp = goog.global['$jscomp'];
transpile = jscomp.transpile;
}
Expand Down Expand Up @@ -1970,7 +1974,9 @@ goog.bindJs_ = function(fn, selfObj, var_args) {
};

} else {
return function() { return fn.apply(selfObj, arguments); };
return function() {
return fn.apply(selfObj, arguments);
};
}
};

Expand Down Expand Up @@ -2210,7 +2216,9 @@ goog.getCssName = function(className, opt_modifier) {
rename =
goog.cssNameMappingStyle_ == 'BY_WHOLE' ? getMapping : renameByParts;
} else {
rename = function(a) { return a; };
rename = function(a) {
return a;
};
}

var result =
Expand Down Expand Up @@ -2730,3 +2738,86 @@ goog.tagUnsealableClass = function(ctr) {
* @const @private {string}
*/
goog.UNSEALABLE_CONSTRUCTOR_PROPERTY_ = 'goog_defineClass_legacy_unsealable';


/**
* Returns a newly created map from language mode string to a boolean
* indicating whether transpilation should be done for that mode.
*
* Guaranteed invariant:
* For any two modes, l1 and l2 where l2 is a newer mode than l1,
* `map[l1] == true` implies that `map[l2] == true`.
* @private
* @return {!Object<string, boolean>}
*/
goog.createRequiresTranspilation_ = function() {
var /** !Object<string, boolean> */ requiresTranspilation = {'es3': false};
var transpilationRequiredForAllLaterModes = false;

/**
* Adds an entry to requiresTranspliation for the given language mode.
*
* IMPORTANT: Calls must be made in order from oldest to newest language
* mode.
* @param {string} modeName
* @param {function(): boolean} isSupported Returns true if the JS engine
* supports the given mode.
*/
function addNewerLanguageTranspilationCheck(modeName, isSupported) {
if (transpilationRequiredForAllLaterModes) {
requiresTranspilation[modeName] = true;
} else if (isSupported()) {
requiresTranspilation[modeName] = false;
} else {
requiresTranspilation[modeName] = true;
transpilationRequiredForAllLaterModes = true;
}
}

/**
* Does the given code evaluate without syntax errors and return a truthy
* result?
*/
function /** boolean */ evalCheck(/** string */ code) {
try {
return !!eval(code);
} catch (ignored) {
return false;
}
}

// Identify ES3-only browsers by their incorrect treatment of commas.
addNewerLanguageTranspilationCheck('es5', function() {
return evalCheck('[1,].length==1');
});
addNewerLanguageTranspilationCheck('es6', function() {
// Test es6: [FF50 (?), Edge 14 (?), Chrome 50]
// (a) default params (specifically shadowing locals),
// (b) destructuring, (c) block-scoped functions,
// (d) for-of (const), (e) new.target/Reflect.construct
var es6fullTest =
'class X{constructor(){if(new.target!=String)throw 1;this.x=42}}' +
'let q=Reflect.construct(X,[],String);if(q.x!=42||!(q instanceof ' +
'String))throw 1;for(const a of[2,3]){if(a==2)continue;function ' +
'f(z={a}){let a=0;return z.a}{function f(){return 0;}}return f()' +
'==3}';

return evalCheck('(()=>{"use strict";' + es6fullTest + '})()');
});
// TODO(joeltine): Remove es6-impl references for b/31340605.
// Consider es6-impl (widely-implemented es6 features) to be supported
// whenever es6 is supported. Technically es6-impl is a lower level of
// support than es6, but we don't have tests specifically for it.
addNewerLanguageTranspilationCheck('es6-impl', function() {
return true;
});
// ** and **= are the only new features in 'es7'
addNewerLanguageTranspilationCheck('es7', function() {
return evalCheck('2 ** 2 == 4');
});
// async functions are the only new features in 'es8'
addNewerLanguageTranspilationCheck('es8', function() {
return evalCheck('async () => 1, true');
});
return requiresTranspilation;
};

0 comments on commit c3eb2a7

Please sign in to comment.