in asdoc/library/closure/goog/base.js [3561:3727]
goog.TransformedDependency.prototype.load = function(controller) {
var dep = this;
function fetch() {
dep.contents_ = goog.loadFileSync_(dep.path);
if (dep.contents_) {
dep.contents_ = dep.transform(dep.contents_);
if (dep.contents_) {
dep.contents_ += '\n//# sourceURL=' + dep.path;
}
}
}
if (goog.global.CLOSURE_IMPORT_SCRIPT) {
fetch();
if (this.contents_ &&
goog.global.CLOSURE_IMPORT_SCRIPT('', this.contents_)) {
this.contents_ = null;
controller.loaded();
} else {
controller.pause();
}
return;
}
var isEs6 = this.loadFlags['module'] == goog.ModuleType.ES6;
if (!this.lazyFetch_) {
fetch();
}
function load() {
if (dep.lazyFetch_) {
fetch();
}
if (!dep.contents_) {
// loadFileSync_ or transform are responsible. Assume they logged an
// error.
return;
}
if (isEs6) {
controller.setModuleState(goog.ModuleType.ES6);
}
var namespace;
try {
var contents = dep.contents_;
dep.contents_ = null;
goog.globalEval(contents);
if (isEs6) {
namespace = goog.moduleLoaderState_.moduleName;
}
} finally {
if (isEs6) {
controller.clearModuleState();
}
}
if (isEs6) {
// Due to circular dependencies this may not be available for require
// right now.
goog.global['$jscomp']['require']['ensure'](
[dep.getPathName()], function() {
controller.registerEs6ModuleExports(
dep.path,
goog.global['$jscomp']['require'](dep.getPathName()),
namespace);
});
}
controller.loaded();
}
// Do not fetch now; in FireFox 47 the synchronous XHR doesn't block all
// events. If we fetched now and then document.write'd the contents the
// document.write would be an eval and would execute too soon! Instead write
// a script tag to fetch and eval synchronously at the correct time.
function fetchInOwnScriptThenLoad() {
/** @type {!HTMLDocument} */
var doc = goog.global.document;
var key = goog.Dependency.registerCallback_(function() {
goog.Dependency.unregisterCallback_(key);
load();
});
doc.write(
'<script type="text/javascript">' +
goog.protectScriptTag_('goog.Dependency.callback_("' + key + '");') +
'</' +
'script>');
}
// If one thing is pending it is this.
var anythingElsePending = controller.pending().length > 1;
// If anything else is loading we need to lazy load due to bugs in old IE.
// Specifically script tags with src and script tags with contents could
// execute out of order if document.write is used, so we cannot use
// document.write. Do not pause here; it breaks old IE as well.
var useOldIeWorkAround =
anythingElsePending && goog.DebugLoader_.IS_OLD_IE_;
// Additionally if we are meant to defer scripts but the page is still
// loading (e.g. an ES6 module is loading) then also defer. Or if we are
// meant to defer and anything else is pending then defer (those may be
// scripts that did not need transformation and are just script tags with
// defer set to true, and we need to evaluate after that deferred script).
var needsAsyncLoading = goog.Dependency.defer_ &&
(anythingElsePending || goog.isDocumentLoading_());
if (useOldIeWorkAround || needsAsyncLoading) {
// Note that we only defer when we have to rather than 100% of the time.
// Always defering would work, but then in theory the order of
// goog.require calls would then matter. We want to enforce that most of
// the time the order of the require calls does not matter.
controller.defer(function() {
load();
});
return;
}
// TODO(johnplaisted): Externs are missing onreadystatechange for
// HTMLDocument.
/** @type {?} */
var doc = goog.global.document;
var isInternetExplorer =
goog.inHtmlDocument_() && 'ActiveXObject' in goog.global;
// Don't delay in any version of IE. There's bug around this that will
// cause out of order script execution. This means that on older IE ES6
// modules will load too early (while the document is still loading + the
// dom is not available). The other option is to load too late (when the
// document is complete and the onload even will never fire). This seems
// to be the lesser of two evils as scripts already act like the former.
if (isEs6 && goog.inHtmlDocument_() && goog.isDocumentLoading_() &&
!isInternetExplorer) {
goog.Dependency.defer_ = true;
// Transpiled ES6 modules still need to load like regular ES6 modules,
// aka only after the document is interactive.
controller.pause();
var oldCallback = doc.onreadystatechange;
doc.onreadystatechange = function() {
if (doc.readyState == 'interactive') {
doc.onreadystatechange = oldCallback;
load();
controller.resume();
}
if (goog.isFunction(oldCallback)) {
oldCallback.apply(undefined, arguments);
}
};
} else {
// Always eval on old IE.
if (goog.DebugLoader_.IS_OLD_IE_ || !goog.inHtmlDocument_() ||
!goog.isDocumentLoading_()) {
load();
} else {
fetchInOwnScriptThenLoad();
}
}
};