You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
4.2 KiB
135 lines
4.2 KiB
4 months ago
|
// Copyright 2017 The Chromium Authors. All rights reserved.
|
||
|
// Use of this source code is governed by a BSD-style license that can be
|
||
|
// found in the LICENSE file.
|
||
|
|
||
|
'use strict';
|
||
|
|
||
|
if ((typeof mojo !== 'undefined') && mojo.bindingsLibraryInitialized) {
|
||
|
throw new Error('The Mojo bindings library has been initialized.');
|
||
|
}
|
||
|
|
||
|
var mojo = mojo || {};
|
||
|
mojo.bindingsLibraryInitialized = true;
|
||
|
|
||
|
mojo.internal = mojo.internal || {};
|
||
|
|
||
|
mojo.config = mojo.config || {};
|
||
|
if (typeof mojo.config.global === 'undefined') {
|
||
|
mojo.config.global = this;
|
||
|
}
|
||
|
|
||
|
if (typeof mojo.config.autoLoadMojomDeps === 'undefined') {
|
||
|
// Whether to automatically load mojom dependencies.
|
||
|
// For example, if foo.mojom imports bar.mojom, |autoLoadMojomDeps| set to
|
||
|
// true means that loading foo.mojom.js will insert a <script> tag to load
|
||
|
// bar.mojom.js, if it hasn't been loaded.
|
||
|
//
|
||
|
// The URL of bar.mojom.js is determined by the relative path of bar.mojom
|
||
|
// (relative to the position of foo.mojom at build time) and the URL of
|
||
|
// foo.mojom.js. For exmple, if at build time the two mojom files are
|
||
|
// located at:
|
||
|
// a/b/c/foo.mojom
|
||
|
// a/b/d/bar.mojom
|
||
|
// and the URL of foo.mojom.js is:
|
||
|
// http://example.org/scripts/b/c/foo.mojom.js
|
||
|
// then the URL of bar.mojom.js will be:
|
||
|
// http://example.org/scripts/b/d/bar.mojom.js
|
||
|
//
|
||
|
// If you would like bar.mojom.js to live at a different location, you need
|
||
|
// to turn off |autoLoadMojomDeps| before loading foo.mojom.js, and manually
|
||
|
// load bar.mojom.js yourself. Similarly, you need to turn off the option if
|
||
|
// you merge bar.mojom.js and foo.mojom.js into a single file.
|
||
|
//
|
||
|
// Performance tip: Avoid loading the same mojom.js file multiple times.
|
||
|
// Assume that |autoLoadMojomDeps| is set to true,
|
||
|
//
|
||
|
// <!--
|
||
|
// (This comment tag is necessary on IOS to avoid interpreting the closing
|
||
|
// script tags in the example.)
|
||
|
//
|
||
|
// No duplicate loading; recommended:
|
||
|
// <script src="http://example.org/scripts/b/c/foo.mojom.js"></script>
|
||
|
//
|
||
|
// No duplicate loading, although unnecessary:
|
||
|
// <script src="http://example.org/scripts/b/d/bar.mojom.js"></script>
|
||
|
// <script src="http://example.org/scripts/b/c/foo.mojom.js"></script>
|
||
|
//
|
||
|
// Load bar.mojom.js twice; should be avoided:
|
||
|
// <script src="http://example.org/scripts/b/c/foo.mojom.js"></script>
|
||
|
// <script src="http://example.org/scripts/b/d/bar.mojom.js"></script>
|
||
|
//
|
||
|
// -->
|
||
|
mojo.config.autoLoadMojomDeps = true;
|
||
|
}
|
||
|
|
||
|
(function() {
|
||
|
var internal = mojo.internal;
|
||
|
var config = mojo.config;
|
||
|
|
||
|
var LoadState = {
|
||
|
PENDING_LOAD: 1,
|
||
|
LOADED: 2
|
||
|
};
|
||
|
|
||
|
var mojomRegistry = new Map();
|
||
|
|
||
|
function exposeNamespace(namespace) {
|
||
|
var current = config.global;
|
||
|
var parts = namespace.split('.');
|
||
|
|
||
|
for (var part; parts.length && (part = parts.shift());) {
|
||
|
if (!current[part]) {
|
||
|
current[part] = {};
|
||
|
}
|
||
|
current = current[part];
|
||
|
}
|
||
|
|
||
|
return current;
|
||
|
}
|
||
|
|
||
|
function isMojomPendingLoad(id) {
|
||
|
return mojomRegistry.get(id) === LoadState.PENDING_LOAD;
|
||
|
}
|
||
|
|
||
|
function isMojomLoaded(id) {
|
||
|
return mojomRegistry.get(id) === LoadState.LOADED;
|
||
|
}
|
||
|
|
||
|
function markMojomPendingLoad(id) {
|
||
|
if (isMojomLoaded(id)) {
|
||
|
throw new Error('The following mojom file has been loaded: ' + id);
|
||
|
}
|
||
|
|
||
|
mojomRegistry.set(id, LoadState.PENDING_LOAD);
|
||
|
}
|
||
|
|
||
|
function markMojomLoaded(id) {
|
||
|
mojomRegistry.set(id, LoadState.LOADED);
|
||
|
}
|
||
|
|
||
|
function loadMojomIfNecessary(id, relativePath) {
|
||
|
if (mojomRegistry.has(id)) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (config.global.document === undefined) {
|
||
|
throw new Error(
|
||
|
'Mojom dependency autoloading is not implemented in workers. ' +
|
||
|
'Please see config variable mojo.config.autoLoadMojomDeps for more ' +
|
||
|
'details.');
|
||
|
}
|
||
|
|
||
|
markMojomPendingLoad(id);
|
||
|
var url = new URL(relativePath, document.currentScript.src).href;
|
||
|
config.global.document.write('<script type="text/javascript" src="' +
|
||
|
url + '"><' + '/script>');
|
||
|
}
|
||
|
|
||
|
internal.exposeNamespace = exposeNamespace;
|
||
|
internal.isMojomPendingLoad = isMojomPendingLoad;
|
||
|
internal.isMojomLoaded = isMojomLoaded;
|
||
|
internal.markMojomPendingLoad = markMojomPendingLoad;
|
||
|
internal.markMojomLoaded = markMojomLoaded;
|
||
|
internal.loadMojomIfNecessary = loadMojomIfNecessary;
|
||
|
})();
|