|  | /* | 
|  | * Licensed to the Apache Software Foundation (ASF) under one | 
|  | * or more contributor license agreements.  See the NOTICE file | 
|  | * distributed with this work for additional information | 
|  | * regarding copyright ownership.  The ASF licenses this file | 
|  | * to you under the Apache License, Version 2.0 (the | 
|  | * "License"); you may not use this file except in compliance | 
|  | * with the License.  You may obtain a copy of the License at | 
|  | * | 
|  | *   http://www.apache.org/licenses/LICENSE-2.0 | 
|  | * | 
|  | * Unless required by applicable law or agreed to in writing, | 
|  | * software distributed under the License is distributed on an | 
|  | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
|  | * KIND, either express or implied.  See the License for the | 
|  | * specific language governing permissions and limitations | 
|  | * under the License. | 
|  | */ | 
|  |  | 
|  | // A very simple require implentation that for echarts test usage. | 
|  | // Which have some special design that is needed in visual regression test. | 
|  | //  1. Can load JSON, text and script | 
|  | //  2. Require callback will be batched and invoked in one frame. | 
|  | //  3. Will throw error immediately if resource not exists. | 
|  | // | 
|  | // Limitations: | 
|  | //  1. Not support ancient browsers. | 
|  | //  2. Only `paths` can be configured | 
|  | (function (global) { | 
|  |  | 
|  | if (typeof __VRT_INIT__ !== 'undefined') { | 
|  | // In the visual regression test environment. | 
|  | __VRT_INIT__(); | 
|  |  | 
|  | var vstRunContextStr = localStorage.getItem('vstRunContext'); | 
|  | if (vstRunContextStr) { | 
|  | window.__VRT_RUN_CONTEXT__ = JSON.parse(vstRunContextStr); | 
|  | localStorage.removeItem('vstRunContext'); | 
|  | } | 
|  | else { | 
|  | // Clear localStorage to make sure clean run. | 
|  | localStorage.clear(); | 
|  | } | 
|  | } | 
|  |  | 
|  |  | 
|  | var requireCfg = { paths: {} } | 
|  |  | 
|  | var currentDefinedFactory; | 
|  | var currentDefinedDeps; | 
|  | var exportsPlaceholder = {}; | 
|  |  | 
|  | var ALLOWED_EXTS = [ | 
|  | 'gexf', 'txt', 'csv', 'svg',    // text | 
|  | 'js', 'json' | 
|  | ]; | 
|  |  | 
|  | // Promise to get modules exports. | 
|  | var mods = {}; | 
|  |  | 
|  | function handleLoadError(url, resolve, reject) { | 
|  | var errMsg = 'require: failed to load ' + url; | 
|  | if (typeof __VRT_LOAD_ERROR__ !== 'undefined') { | 
|  | // Not block the visual regression testing. | 
|  | __VRT_LOAD_ERROR__(errMsg); | 
|  | resolve(); | 
|  | } | 
|  | else { | 
|  | reject(errMsg); | 
|  | } | 
|  | } | 
|  |  | 
|  | function loadText(url) { | 
|  | return new Promise(function (resolve, reject) { | 
|  | var xhr = new XMLHttpRequest(); | 
|  | xhr.onload = function (e) { | 
|  | if (xhr.status === 200) { | 
|  | resolve(xhr.responseText); | 
|  | } | 
|  | else { | 
|  | handleLoadError(url, resolve, reject); | 
|  | } | 
|  | } | 
|  | xhr.onerror = function (e) { | 
|  | handleLoadError(url, resolve, reject); | 
|  | } | 
|  | xhr.open('GET', url); | 
|  | xhr.send(); | 
|  | }); | 
|  | } | 
|  |  | 
|  | function loadJSON(url) { | 
|  | return loadText(url).then(function (text) { | 
|  | return JSON.parse(text); | 
|  | }); | 
|  | } | 
|  |  | 
|  | function loadScript(url) { | 
|  | return new Promise(function (resolve, reject) { | 
|  | var script = document.createElement('script'); | 
|  | script.async = true; | 
|  | script.onload = function () { | 
|  | resolve(); | 
|  | } | 
|  | script.onerror = function () { | 
|  | handleLoadError(url, resolve, reject); | 
|  | } | 
|  | script.src = url; | 
|  | document.head.appendChild(script); | 
|  | }); | 
|  | } | 
|  |  | 
|  | function resolvePath(p) { | 
|  | var paths = requireCfg.paths || {}; | 
|  |  | 
|  | for (var key in paths) { | 
|  | if (paths.hasOwnProperty(key)) { | 
|  | if (p.indexOf(key) === 0) { | 
|  | p = p.replace(key, paths[key]); | 
|  | break; | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | var ext = getExt(p); | 
|  | // Add .js ext automatically | 
|  | if (ALLOWED_EXTS.indexOf(ext) < 0) { | 
|  | p = p + '.js'; | 
|  | } | 
|  |  | 
|  | return p; | 
|  | } | 
|  |  | 
|  | function getExt(str) { | 
|  | return str.split('.').pop(); | 
|  | } | 
|  |  | 
|  | function invokeFactory(factory, depsPromise) { | 
|  | if (typeof factory === 'function') { | 
|  | return depsPromise.then(function (deps) { | 
|  | var modExports = {}; | 
|  | var factoryRet = factory.apply(null, deps.map(function (dep) { | 
|  | return dep === exportsPlaceholder ? modExports : dep; | 
|  | })); | 
|  | return factoryRet || modExports; | 
|  | }); | 
|  | } | 
|  | else { | 
|  | // define(JSONObject) | 
|  | return factory; | 
|  | } | 
|  | } | 
|  |  | 
|  | // Simplify the logic. don't support id. | 
|  | function define(modId, depsIds, factory) { | 
|  | if (factory == null) { | 
|  | // define(function () {}); | 
|  | if (depsIds == null) { | 
|  | factory = modId; | 
|  | modId = null; | 
|  | } | 
|  | else { | 
|  | // define('modId', function () {}); | 
|  | factory = depsIds; | 
|  | depsIds = null; | 
|  | // define(['depsId'], function () {}); | 
|  | if (modId instanceof Array) { | 
|  | depsIds = modId; | 
|  | modId = null; | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | if (modId) { | 
|  | mods[modId] = invokeFactory(factory, loadDeps(depsIds)); | 
|  | } | 
|  | else { | 
|  | currentDefinedFactory = factory; | 
|  | currentDefinedDeps = loadDeps(depsIds || []); | 
|  | } | 
|  | } | 
|  |  | 
|  | function loadMod(modId) { | 
|  | if (!mods[modId]) { | 
|  | mods[modId] = {}; | 
|  |  | 
|  | function loaded(exports) { | 
|  | var ret; | 
|  | if (currentDefinedDeps) { | 
|  | ret = invokeFactory(currentDefinedFactory, currentDefinedDeps); | 
|  | } | 
|  | else { | 
|  | ret = exports; | 
|  | } | 
|  | // Clear. | 
|  | currentDefinedFactory = null; | 
|  | currentDefinedDeps = null; | 
|  | return ret; | 
|  | } | 
|  |  | 
|  | var url = resolvePath(modId); | 
|  | var ext = getExt(url); | 
|  | if (ext === 'js') { | 
|  | mods[modId].exports = loadScript(url).then(loaded); | 
|  | } | 
|  | else if (ext === 'json' || ext === 'geojson') { | 
|  | mods[modId].exports = loadJSON(url).then(loaded); | 
|  | } | 
|  | else { | 
|  | mods[modId].exports = loadText(url).then(loaded); | 
|  | } | 
|  | } | 
|  | return mods[modId].exports; | 
|  | } | 
|  |  | 
|  | function loadDeps(depsIds) { | 
|  | return Promise.all(depsIds.map(function (depId) { | 
|  | if (depId === 'exports') { | 
|  | return Promise.resolve(exportsPlaceholder); | 
|  | } | 
|  | else { | 
|  | return loadMod(depId); | 
|  | } | 
|  | })); | 
|  | } | 
|  |  | 
|  | var pendingRequireCallbacks = []; | 
|  | var pendingRequireCallbackParams = []; | 
|  | var requireCount = 0; | 
|  | function require(depsIds, cb) { | 
|  | if (typeof depsIds === 'string') { | 
|  | depsIds = [depsIds]; | 
|  | } | 
|  | // Batch multiple requires callback theme in one frame. | 
|  | // Ensure all instances are started at one time and avoid time difference in visual regression test | 
|  | var cbIdx = requireCount; | 
|  | pendingRequireCallbacks.push(cb); | 
|  | requireCount++; | 
|  |  | 
|  | loadDeps(depsIds).then(function (deps) { | 
|  | pendingRequireCallbackParams[cbIdx] = deps; | 
|  | requireCount--; | 
|  |  | 
|  | if (requireCount === 0) {   // Flush | 
|  | var requireCallbackToFlush = pendingRequireCallbacks; | 
|  | var requireCallbackParamsToFlush = pendingRequireCallbackParams; | 
|  | // Clear before flush. Avoid more require in the callback. | 
|  | pendingRequireCallbacks = []; | 
|  | pendingRequireCallbackParams = []; | 
|  |  | 
|  | // Start visual regression test before callback | 
|  | if (typeof __VRT_START__ !== 'undefined') { | 
|  | __VRT_START__(); | 
|  | } | 
|  |  | 
|  | for (var i = 0; i < requireCallbackToFlush.length; i++) { | 
|  | requireCallbackToFlush[i] && requireCallbackToFlush[i].apply(null, requireCallbackParamsToFlush[i]); | 
|  | } | 
|  | } | 
|  | }); | 
|  | } | 
|  |  | 
|  | require.config = function (cfg) { | 
|  | requireCfg = cfg || {}; | 
|  | } | 
|  |  | 
|  | global.require = require; | 
|  | global.define = define; | 
|  | global.define.amd = {}; | 
|  | })(window); |