271 lines
8.2 KiB
JavaScript
Generated
271 lines
8.2 KiB
JavaScript
Generated
/*
|
|
* 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);
|