| /* | |
| * 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); |