// 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; })();