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