in asdoc/library/closure/goog/base.js [3283:3387]
goog.Dependency.prototype.load = function(controller) {
if (goog.global.CLOSURE_IMPORT_SCRIPT) {
if (goog.global.CLOSURE_IMPORT_SCRIPT(this.path)) {
controller.loaded();
} else {
controller.pause();
}
return;
}
if (!goog.inHtmlDocument_()) {
goog.logToConsole_(
'Cannot use default debug loader outside of HTML documents.');
if (this.relativePath == 'deps.js') {
// Some old code is relying on base.js auto loading deps.js failing with
// no error before later setting CLOSURE_IMPORT_SCRIPT.
// CLOSURE_IMPORT_SCRIPT should be set *before* base.js is loaded, or
// CLOSURE_NO_DEPS set to true.
goog.logToConsole_(
'Consider setting CLOSURE_IMPORT_SCRIPT before loading base.js, ' +
'or setting CLOSURE_NO_DEPS to true.');
controller.loaded();
} else {
controller.pause();
}
return;
}
/** @type {!HTMLDocument} */
var doc = goog.global.document;
// If the user tries to require a new symbol after document load,
// something has gone terribly wrong. Doing a document.write would
// wipe out the page. This does not apply to the CSP-compliant method
// of writing script tags.
if (doc.readyState == 'complete' &&
!goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING) {
// Certain test frameworks load base.js multiple times, which tries
// to write deps.js each time. If that happens, just fail silently.
// These frameworks wipe the page between each load of base.js, so this
// is OK.
var isDeps = /\bdeps.js$/.test(this.path);
if (isDeps) {
controller.loaded();
return;
} else {
throw Error('Cannot write "' + this.path + '" after document load');
}
}
if (!goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING &&
goog.isDocumentLoading_()) {
var key = goog.Dependency.registerCallback_(function(script) {
if (!goog.DebugLoader_.IS_OLD_IE_ || script.readyState == 'complete') {
goog.Dependency.unregisterCallback_(key);
controller.loaded();
}
});
var nonceAttr = !goog.DebugLoader_.IS_OLD_IE_ && goog.getScriptNonce() ?
' nonce="' + goog.getScriptNonce() + '"' :
'';
var event =
goog.DebugLoader_.IS_OLD_IE_ ? 'onreadystatechange' : 'onload';
var defer = goog.Dependency.defer_ ? 'defer' : '';
doc.write(
'<script src="' + this.path + '" ' + event +
'="goog.Dependency.callback_(\'' + key +
'\', this)" type="text/javascript" ' + defer + nonceAttr + '><' +
'/script>');
} else {
var scriptEl =
/** @type {!HTMLScriptElement} */ (doc.createElement('script'));
scriptEl.defer = goog.Dependency.defer_;
scriptEl.async = false;
scriptEl.type = 'text/javascript';
// If CSP nonces are used, propagate them to dynamically created scripts.
// This is necessary to allow nonce-based CSPs without 'strict-dynamic'.
var nonce = goog.getScriptNonce();
if (nonce) {
scriptEl.setAttribute('nonce', nonce);
}
if (goog.DebugLoader_.IS_OLD_IE_) {
// Execution order is not guaranteed on old IE, halt loading and write
// these scripts one at a time, after each loads.
controller.pause();
scriptEl.onreadystatechange = function() {
if (scriptEl.readyState == 'loaded' ||
scriptEl.readyState == 'complete') {
controller.loaded();
controller.resume();
}
};
} else {
scriptEl.onload = function() {
scriptEl.onload = null;
controller.loaded();
};
}
scriptEl.src = this.path;
doc.head.appendChild(scriptEl);
}
};