blob: db72d489db6ec016817ec1557a11812f33836b31 [file] [log] [blame]
// 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 (mojo && mojo.internal) {
throw new Error('The Mojo bindings library has been initialized.');
}
var mojo = mojo || {};
mojo.internal = {};
mojo.internal.global = this;
mojo.config = {
// 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:
// <!-- 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>
autoLoadMojomDeps: true
};
(function() {
var internal = mojo.internal;
var LoadState = {
PENDING_LOAD: 1,
LOADED: 2
};
var mojomRegistry = new Map();
function exposeNamespace(namespace) {
var current = internal.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, url) {
if (mojomRegistry.has(id)) {
return;
}
markMojomPendingLoad(id);
internal.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;
})();