Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(180)

Unified Diff: chrome/test/data/third_party/spaceport/js/unrequire.js

Issue 10134041: Add test data for spaceport benchmark. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/test/data/third_party/spaceport/js/unrequire.js
diff --git a/chrome/test/data/third_party/spaceport/js/unrequire.js b/chrome/test/data/third_party/spaceport/js/unrequire.js
new file mode 100644
index 0000000000000000000000000000000000000000..a0bb83cbf66c8118c0e0a25757afec7582b82054
--- /dev/null
+++ b/chrome/test/data/third_party/spaceport/js/unrequire.js
@@ -0,0 +1,993 @@
+/** @preserve
+ * unrequire.js
+ *
+ * Copyright 2011 Sibblingz, Inc.
+ *
+ * Licensed under MIT
+ */
+
+// XXX Lines between comments with @{{{ and @}}} are removed when building
+
+//@{{{
+(function () {
+//@}}}
+
+ // MIT: http://trac.webkit.org/wiki/DetectingWebKit
+ var IS_WEBKIT = typeof navigator !== 'undefined' && navigator && / AppleWebKit\//.test(navigator.userAgent);
+
+ var HAS_SETTIMEOUT = typeof setTimeout === 'function';
+
+ //@{{{
+
+ // Logging support
+ var LOGGING = false;
+
+ // Show debug warnings
+ var WARNINGS = true;
+
+ // Aliases support
+ var ENABLE_ALIASES = true;
+
+ // Packages support
+ var ENABLE_PACKAGES = true;
+
+ // Web browser support
+ var ENABLE_BROWSER = true;
+
+ // Web browser should try to make synchronous requests
+ var BROWSER_SYNC = false;
+
+ // Node.JS support
+ var ENABLE_NODEJS = true;
+
+ // Spaceport support
+ var ENABLE_SPACEPORT = true;
+
+ // CommonJS compatibility
+ var COMMONJS_COMPAT = true;
+
+ // Check for circular dependencies
+ var CHECK_CYCLES = true;
+
+ //@}}}
+
+ // Utility functions {{{
+ var hasOwnProperty = ({ }).hasOwnProperty;
+ var toString = ({ }).toString;
+
+ // For minification
+ var dot = '.';
+ var dotdot = '..';
+
+ function hasOwn(obj, name) {
+ return obj && hasOwnProperty.call(obj, name);
+ }
+
+ function isArray(x) {
+ return toString.call(x) === '[object Array]';
+ }
+
+ function isPlainOldObject(x) {
+ return toString.call(x) === '[object Object]';
+ }
+
+ function map(array, fn, context) {
+ // TODO Fallback if Function.prototype.map is missing
+ return array.map(fn, context);
+ }
+
+ var forEach = map;
+
+ function extend(base, extension) {
+ var key;
+
+ for (key in extension) {
+ if (hasOwn(extension, key)) {
+ base[key] = extension[key];
+ }
+ }
+
+ return base;
+ }
+
+ function clone(object, extension) {
+ return extend(extend({ }, object), extension || { });
+ }
+ // Utility functions }}}
+
+ // Path functions {{{
+ function stringToPath(parts) {
+ parts = isArray(parts) ? parts : [ parts ];
+
+ var splitParts = [ ];
+ var i;
+
+ for (i = 0; i < parts.length; ++i) {
+ splitParts = splitParts.concat(parts[i].split(/\//g));
+ }
+
+ return splitParts;
+ }
+
+ function pathToString(path) {
+ var s = path
+ .join('/')
+ .replace(/\/+/g, '/');
+
+ if (path.length === 0 && path[0] === '') {
+ s = '/' + s;
+ }
+
+ return s;
+ }
+
+ function normalizePath(path) {
+ var newPath = [ ];
+ var i;
+
+ for (i = 0; i < path.length; ++i) {
+ if (!path[i]) {
+ // Root
+ newPath = [ '' ];
+ } else if (path[i] === dotdot) {
+ // Go back
+ if (!newPath.length) {
+ newPath = [ dotdot ];
+ } else if (newPath.length === 1) {
+ if (newPath[0] === dot || !newPath[0]) {
+ newPath = [ dotdot ];
+ } else {
+ newPath.pop();
+ }
+ } else {
+ newPath.pop();
+ }
+ } else if (path[i] === dot) {
+ // Go here
+ if (!newPath.length) {
+ newPath = [ dot ];
+ }
+ } else {
+ // Everything else
+ newPath.push(path[i]);
+ }
+ }
+
+ return newPath;
+ }
+
+ function resolveUrl(cwd, baseUrl, path) {
+ var cwdPath = normalizePath(stringToPath(cwd));
+ var basePath = normalizePath(stringToPath(baseUrl || dot));
+ var npath = normalizePath(stringToPath(path));
+
+ if (npath[0] === dotdot || npath[0] === dot) {
+ // Relative paths are based on cwd
+ return pathToString(normalizePath(cwdPath.concat(npath)));
+ } else if (npath[0] === '') {
+ // Absolute path stays absolute
+ return pathToString(npath);
+ } else {
+ // Implicit relative paths are based on baseUrl
+ return pathToString(basePath.concat(npath));
+ }
+ }
+
+ function resolveCwd(baseUrl, cwd) {
+ var basePath = normalizePath(stringToPath(baseUrl || dot));
+ var npath = normalizePath(stringToPath(cwd));
+
+ if (npath[0] === dotdot || npath[0] === dot) {
+ // Relative paths are absolute
+ return pathToString(npath);
+ } else if (npath[0] === '') {
+ // Absolute path stays absolute
+ return pathToString(npath);
+ } else {
+ // Implicit relative paths are based on baseUrl
+ return pathToString(basePath.concat(npath));
+ }
+ }
+
+ function dirname(url) {
+ var path = stringToPath(url);
+ path = path.slice(0, path.length - 1);
+ return pathToString(path);
+ }
+ // Path functions }}}
+
+ // Argument extraction functions {{{
+ function defArgs(name, config, deps, callback) {
+ if (typeof name !== 'string') {
+ // Name omitted
+ callback = deps;
+ deps = config;
+ config = name;
+ name = null;
+ }
+
+ if (!isPlainOldObject(config)) {
+ // Config omitted
+ callback = deps;
+ deps = config;
+ config = { };
+ }
+
+ if (!isArray(deps)) {
+ // Dependencies omitted
+ callback = deps;
+ deps = [ ];
+ }
+
+ return {
+ name: name,
+ config: config,
+ deps: deps,
+ callback: callback
+ };
+ }
+
+ function reqArgs(config, deps, callback) {
+ // TODO require(string)
+ if (typeof config === 'string') {
+ throw new Error('Not supported');
+ }
+
+ if (!isPlainOldObject(config)) {
+ // Config omitted
+ callback = deps;
+ deps = config;
+ config = { };
+ }
+
+ if (!isArray(deps)) {
+ // Dependencies omitted
+ callback = deps;
+ deps = [ ];
+ }
+
+ return {
+ config: config,
+ deps: deps,
+ callback: callback
+ };
+ }
+ // Argument extraction functions }}}
+
+ function getScriptName(moduleName, config) {
+ if (ENABLE_ALIASES) {
+ if (hasOwn(config._aliases, moduleName)) {
+ return config._aliases[moduleName];
+ }
+ }
+
+ var scriptName = resolveUrl(config.cwd, config.baseUrl, moduleName);
+ scriptName = scriptName + (/\.js$/i.test(scriptName) ? '' : '.js');
+ return scriptName;
+ }
+
+ function mergeConfigInto(base, augmentation) {
+ // The order of these checks are important, because changes cascade
+
+ if (hasOwn(augmentation, 'baseUrl')) {
+ base.baseUrl = resolveUrl(base.cwd, base.baseUrl, augmentation.baseUrl);
+ }
+
+ if (hasOwn(augmentation, 'cwd')) {
+ base.cwd = augmentation.cwd;
+ //base.cwd = resolveCwd(base.baseUrl, augmentation.cwd);
+ }
+
+ if (ENABLE_ALIASES) {
+ if (hasOwn(base, '_aliases')) {
+ base._aliases = clone(base._aliases);
+ } else {
+ base._aliases = { };
+ }
+
+ if (hasOwn(augmentation, '_aliases')) {
+ extend(base._aliases, augmentation._aliases);
+ }
+
+ if (hasOwn(augmentation, 'aliases')) {
+ var aliasName;
+ for (aliasName in augmentation.aliases) {
+ if (!hasOwn(augmentation.aliases, aliasName)) {
+ continue;
+ }
+
+ var aliasTarget = augmentation.aliases[aliasName];
+
+ // Aliases are stored as their full script name
+ base._aliases[aliasName] = getScriptName(aliasTarget, base);
+ }
+ }
+ }
+
+ if (ENABLE_PACKAGES) {
+ if (hasOwn(base, '_packageOwners')) {
+ base._packageOwners = clone(base._packageOwners);
+ } else {
+ base._packageOwners = { };
+ }
+
+ if (hasOwn(augmentation, '_packageOwners')) {
+ extend(base._packageOwners, augmentation._packageOwners);
+ }
+
+ if (hasOwn(augmentation, 'packages')) {
+ var packageName;
+ for (packageName in augmentation.packages) {
+ if (!hasOwn(augmentation.packages, packageName)) {
+ continue;
+ }
+
+ var packageOwner = getScriptName(packageName, base);
+ forEach(augmentation.packages[packageName], function (moduleName) {
+ base._packageOwners[getScriptName(moduleName, base)] = packageOwner;
+ });
+ }
+ }
+ }
+ }
+
+ function mergeConfigs(first, second) {
+ var base = clone(first);
+ mergeConfigInto(base, second);
+ return base;
+ }
+
+ function findCycles(graph, vertices) {
+ var vertexIndices = { };
+ var vertexLowLinks = { };
+
+ var index = 0;
+ var stack = [ ];
+
+ var cycles = [ ];
+
+ function strongConnect(v) {
+ vertexIndices[v] = index;
+ vertexLowLinks[v] = index;
+ ++index;
+ stack.push(v);
+
+ if (hasOwn(graph, v)) {
+ graph[v].forEach(function (w) {
+ if (!hasOwn(vertexIndices, w)) {
+ strongConnect(w);
+ vertexLowLinks[v] = Math.min(vertexLowLinks[v], vertexLowLinks[w]);
+ } else if (stack.indexOf(w) >= 0) {
+ vertexLowLinks[v] = Math.min(vertexLowLinks[v], vertexIndices[w]);
+ }
+ });
+ }
+
+ if (vertexLowLinks[v] === vertexIndices[v]) {
+ var cycle = [ ];
+ var w;
+ do {
+ w = stack.pop();
+ cycle.push(w);
+ } while (w !== v);
+ cycles.push(cycle);
+ }
+ }
+
+ vertices.forEach(function (vertex) {
+ if (!hasOwn(vertexIndices, vertex)) {
+ strongConnect(vertex);
+ }
+ });
+
+ return cycles;
+ }
+
+ // dependencyGraph :: Map String [String]
+ var dependencyGraph = { };
+
+ // pulledScripts :: [String]
+ var pulledScripts = [ ];
+
+ function addDependency(from, to) {
+ if (hasOwn(dependencyGraph, from)) {
+ dependencyGraph[from].push(to);
+ } else {
+ dependencyGraph[from] = [ to ];
+ }
+ }
+
+ function checkCircularDependencies() {
+ var cycles = findCycles(dependencyGraph, pulledScripts);
+
+ cycles.forEach(function (cycle) {
+ if (cycle.length > 1) {
+ throw new Error('Circular dependency detected between scripts: ' + cycle.join(' '));
+ }
+ });
+ }
+
+ function getScriptsDependingUpon(scriptName) {
+ var scripts = [ ];
+
+ for (var curScript in dependencyGraph) {
+ if (hasOwn(dependencyGraph, curScript)) {
+ if (dependencyGraph[curScript].indexOf(scriptName) >= 0) {
+ scripts.push(curScript);
+ }
+ }
+ }
+
+ return scripts;
+ }
+
+ // requestedScripts :: Map String Bool
+ var requestedScripts = { };
+
+ // requestingScriptCount :: Int
+ var requestingScriptCount = 0;
+
+ // We have two queues here.
+ //
+ // The script complete queue is built up while executing scripts. A define
+ // call adds to this queue. The queue is flushed when the script completes
+ // execution. This allows us to determine which script was executed
+ // exactly for asynchronous loads.
+ //
+ // A load callback queue is built up after a define call knows its complete
+ // name configuration. It is executed when that defined module is
+ // requested. This allows for lazy loading of defiend modules, and also
+ // allows for asynchronous module definitions. There is a mapping of
+ // script name to load callback queue, thus this queue is a hash and not an
+ // array.
+
+ // scriptCompleteQueue :: [Maybe Error -> Configuration -> IO ()]
+ var scriptCompleteQueue = [ ];
+
+ // loadCallbackQueues :: Map String [IO ()]
+ var loadCallbackQueues = { };
+
+ // The push-pull mechanism decouples requesters of a module from definers
+ // of a module. When a module is defined, it is "pushed"; when a module is
+ // requested, it is "pulled". If a pull is made on an already-pushed
+ // module name, the pull callback is executed immediately. Else, the pull
+ // callback is executed immediately when the appropriate push is made.
+
+ // pushed :: Map String a
+ var pushed = { };
+
+ // pulling :: Map String [Maybe Error -> a -> IO ()]
+ var pulling = { };
+
+ function checkPullForLoadCallback(scriptName) {
+ if (hasOwn(pulling, scriptName) && hasOwn(loadCallbackQueues, scriptName)) {
+ var callbacks = loadCallbackQueues[scriptName];
+ delete loadCallbackQueues[scriptName];
+
+ forEach(callbacks, function (callback) {
+ callback();
+ });
+ }
+ }
+
+ function checkPullForPush(scriptName, value) {
+ if (hasOwn(pulling, scriptName) && hasOwn(pushed, scriptName)) {
+ var callbacks = pulling[scriptName];
+ delete pulling[scriptName];
+
+ forEach(callbacks, function (callback) {
+ callback(null, pushed[scriptName]);
+ });
+ }
+ }
+
+ function enqueueLoadCallback(scriptName, callback) {
+ if (hasOwn(loadCallbackQueues, scriptName)) {
+ loadCallbackQueues[scriptName].push(callback);
+ } else {
+ loadCallbackQueues[scriptName] = [ callback ];
+ }
+
+ checkPullForLoadCallback(scriptName);
+ }
+
+ function enqueueScriptCompleteCallback(callback) {
+ if (requestingScriptCount > 0) {
+ scriptCompleteQueue.push(callback);
+ } else {
+ callback(null, { });
+ }
+ }
+
+ function push(scriptName, value) {
+ if (hasOwn(pushed, scriptName)) {
+ throw new Error('Should not push value for ' + scriptName + ' again');
+ }
+
+ pushed[scriptName] = value;
+
+ checkPullForPush(scriptName);
+ }
+
+ function pull(scriptName, callback) {
+ if (CHECK_CYCLES) {
+ pulledScripts.push(scriptName);
+ }
+
+ if (hasOwn(pulling, scriptName)) {
+ pulling[scriptName].push(callback);
+ } else {
+ pulling[scriptName] = [ callback ];
+ }
+
+ checkPullForLoadCallback(scriptName);
+ checkPullForPush(scriptName);
+ }
+
+ function needsRequest(scriptName) {
+ return !hasOwn(requestedScripts, scriptName) && !hasOwn(pushed, scriptName) && !hasOwn(loadCallbackQueues, scriptName);
+ }
+
+ // Entry points {{{
+ function create(configuration) {
+ var context = extend({
+ 'require': req,
+ 'define': def,
+ 'reconfigure': reconfigure,
+ 'userCallback': defaultUserCallback
+ }, configuration);
+
+ var baseConfig = {
+ cwd: '.',
+ baseUrl: '.'
+ };
+
+ context.configuration = configuration;
+ req.config = config;
+ req.debug = debug;
+
+ return context;
+
+ function config(config) {
+ mergeConfigInto(baseConfig, config);
+ }
+
+ function defaultUserCallback(scriptName, data, moduleValues, moduleScripts, moduleNames, callback) {
+ if (LOGGING) {
+ console.log('Executing', scriptName);
+ }
+
+ var moduleValue;
+ if (typeof data === 'function') {
+ if (COMMONJS_COMPAT && data.length === 3 && moduleNames.length === 0) {
+ moduleValues = [
+ // require
+ function () {
+ throw new Error('Not supported');
+ },
+
+ // exports
+ { },
+
+ // module
+ { } // TODO
+ ];
+ }
+
+ moduleValue = data.apply(null, moduleValues);
+
+ if (COMMONJS_COMPAT && data.length === 3 && moduleNames.length === 0) {
+ if (typeof moduleValue === 'undefined') {
+ moduleValue = moduleValues[1]; // exports
+ }
+ }
+ } else {
+ moduleValue = data;
+ }
+
+ callback(null, moduleValue);
+ }
+
+ function reconfigure(configuration) {
+ extend(context, configuration);
+ }
+
+ function getRequestScriptName(scriptName, config) {
+ if (ENABLE_PACKAGES) {
+ if (hasOwn(config._packageOwners, scriptName)) {
+ return config._packageOwners[scriptName];
+ }
+ }
+
+ return scriptName;
+ }
+
+ function request(scriptName, config, callback) {
+ if (!needsRequest(scriptName)) {
+ throw new Error('Should not request ' + scriptName + ' again');
+ }
+
+ if (LOGGING) {
+ console.log('Requesting script ' + scriptName);
+ }
+
+ requestedScripts[scriptName] = true;
+ ++requestingScriptCount;
+
+ function done(err) {
+ --requestingScriptCount;
+
+ var scriptCompleteCallbacks = scriptCompleteQueue;
+ scriptCompleteQueue = [ ];
+
+ if (!err) {
+ if (scriptCompleteCallbacks.length === 0) {
+ console.warn('Possibly missing define for script ' + scriptName);
+ }
+ }
+
+ callback(err, scriptCompleteCallbacks);
+ }
+
+ function tryAsync() {
+ }
+
+ // Try a sync load first
+ if (context.loadScriptSync) {
+ // We have this setTimeout logic to handle exceptions thrown by
+ // loadScriptSync. We do not catch exceptions (so debugging is
+ // easier for users), or deal with the 'finally' mess, but
+ // still call done().
+ var timer;
+ if (HAS_SETTIMEOUT) {
+ timer = setTimeout(function () {
+ done(new Error('Script threw exception'));
+ }, 0);
+ }
+
+ var success = context.loadScriptSync(scriptName, config);
+
+ if (HAS_SETTIMEOUT) {
+ clearTimeout(timer);
+ }
+
+ if (success) {
+ done(null);
+ return;
+ }
+ }
+
+ if (context.loadScriptAsync) {
+ return context.loadScriptAsync(scriptName, done, config);
+ }
+
+ done(new Error('Failed to load script'));
+ }
+
+ function requestAndPullMany(scriptNames, config, callback) {
+ var loaded = [ ];
+ var values = [ ];
+ var i;
+ var called = false;
+
+ function checkValues() {
+ if (called) return;
+
+ var i;
+
+ for (i = 0; i < scriptNames.length; ++i) {
+ if (!loaded[i]) return;
+ }
+
+ called = true;
+ callback(null, values, scriptNames);
+ }
+
+ forEach(scriptNames, function (scriptName, i) {
+ var requestScriptName = getRequestScriptName(scriptName, config);
+
+ if (needsRequest(requestScriptName)) {
+ request(requestScriptName, config, function (err, callbacks) {
+ var neoConfig = mergeConfigs(config, { });
+ neoConfig.cwd = dirname(requestScriptName);
+ neoConfig.scriptName = scriptName;
+
+ forEach(callbacks, function (callback) {
+ callback(err, neoConfig);
+ });
+
+ if (err) {
+ var errorString = 'Failed to load ' + requestScriptName;
+
+ var dependers = getScriptsDependingUpon(requestScriptName);
+ if (dependers.length) {
+ errorString += ' (depended upon by ' + dependers.join(', ') + ')';
+ }
+
+ console.error(errorString, err);
+ }
+ });
+ }
+
+ pull(scriptName, function (err, value) {
+ if (err) throw err;
+
+ loaded[i] = true;
+ values[i] = value;
+ checkValues();
+ });
+ });
+
+ // In case we have no scripts to load
+ checkValues();
+ }
+
+ function req() {
+ // TODO require(string)
+
+ var args = reqArgs.apply(null, arguments);
+ var config = args.config;
+ var deps = args.deps;
+ var callback = args.callback;
+
+ if (LOGGING) {
+ console.log('Requiring [ ' + (deps || [ ]).join(', ') + ' ]');
+ }
+
+ var effectiveConfig = mergeConfigs(baseConfig, config);
+
+ enqueueScriptCompleteCallback(function (err, config) {
+ if (err) throw err;
+
+ mergeConfigInto(effectiveConfig, config);
+
+ var scriptNames = map(deps, function (dep) {
+ return getScriptName(dep, effectiveConfig);
+ });
+
+ requestAndPullMany(scriptNames, effectiveConfig, function (err, values) {
+ if (err) throw err;
+
+ context.userCallback(null, callback, values, scriptNames, deps.slice(), function (err, value) {
+ if (err) throw err;
+
+ // Ignore value
+ });
+ });
+ });
+ }
+
+ function def() {
+ var args = defArgs.apply(null, arguments);
+ var name = args.name;
+ var config = args.config;
+ var deps = args.deps;
+ var callback = args.callback;
+
+ if (LOGGING) {
+ console.log('Defining ' + (name || 'unnamed package') + ' with dependencies [ ' + (deps || [ ]).join(', ') + ' ]');
+ }
+
+ var effectiveConfig = mergeConfigs(baseConfig, config);
+
+ enqueueScriptCompleteCallback(function (err, config) {
+ if (err) throw err;
+
+ var oldEffectiveConfig = clone(effectiveConfig);
+
+ // Script name resolution should occur *before* merging config into
+ // effectiveConfig
+ mergeConfigInto(effectiveConfig, config);
+
+ var scriptName;
+ if (name) {
+ scriptName = getScriptName(name, effectiveConfig);
+ } else {
+ scriptName = config.scriptName;
+ }
+
+ enqueueLoadCallback(scriptName, function () {
+ var scriptNames = map(deps, function (dep) {
+ return getScriptName(dep, effectiveConfig);
+ });
+
+ if (CHECK_CYCLES) {
+ map(scriptNames, function (dep) {
+ addDependency(scriptName, dep);
+ });
+ }
+
+ checkCircularDependencies();
+
+ requestAndPullMany(scriptNames, effectiveConfig, function (err, values) {
+ if (err) throw err;
+
+ context.userCallback(scriptName, callback, values, scriptNames, deps.slice(), function (err, value) {
+ if (err) throw err;
+
+ push(scriptName, value);
+ });
+ });
+ });
+ });
+ }
+
+ function debug() {
+ console.log('Pulling:', pulling);
+ }
+ }
+ // Entry points }}}
+
+ (function () {
+ var un;
+
+ if (ENABLE_SPACEPORT && typeof loadScript === 'function') {
+ // Must be first, because Spaceport has the window object, too.
+ un = create({
+ 'loadScriptAsync': function (scriptName, callback) {
+ loadScript(scriptName, function () {
+ callback(null);
+ });
+ },
+ 'loadScriptSync': function (scriptName) {
+ return false;
+ }
+ });
+
+ // Set globals
+ require = un['require'];
+ define = un['define'];
+ } else if (ENABLE_BROWSER && typeof window !== 'undefined') {
+ var goodResponseCodes = [ 200, 204, 206, 301, 302, 303, 304, 307 ];
+ var doc = window.document;
+
+ var onreadystatechange = 'onreadystatechange';
+ var onload = 'onload';
+ var onerror = 'onerror';
+
+ function isCleanPath(scriptName) {
+ // If the path is "back" too much, it's not clean.
+ var x = stringToPath(dirname(window.location.pathname))
+ .concat(stringToPath(scriptName));
+ x = normalizePath(x);
+ return x[0] !== '..';
+ }
+
+ var webkitOnloadFlag = false;
+
+ un = create({
+ 'loadScriptAsync': function loadScriptAsync(scriptName, callback) {
+ if (!isCleanPath(scriptName)) {
+ setTimeout(function () {
+ callback(new Error('Path ' + scriptName + ' is not clean'));
+ }, 0);
+ return;
+ }
+
+ var script = doc.createElement('script');
+ script.async = true;
+
+ // Modelled after jQuery (src/ajax/script.js)
+ script[onload] = script[onreadystatechange] = function () {
+ if (!script.readyState || /loaded|complete/.test(script.readyState)) {
+ // Remove from DOM
+ var parent = script.parentNode;
+ if (parent) {
+ parent.removeChild(script);
+ }
+
+ // IE likes memleaks
+ script[onload] = script[onreadystatechange] = script[onerror] = null;
+ script = null;
+
+ callback(null);
+ }
+ };
+
+ script[onerror] = function () {
+ callback(new Error('Failed to load script'));
+ };
+
+ // Remember: we need to attach event handlers before
+ // assigning `src`. Events may be fired as soon as we set
+ // `src`.
+ script.src = scriptName;
+
+ doc['head'].appendChild(script);
+ },
+ 'loadScriptSync': function loadScriptSync(scriptName) {
+ // We provide synchronous script loading via XHR for
+ // browsers specifically to work around a Webkit bug.
+ // After document.onload is called, any script dynamically
+ // loaded will be loaded from Webkit's local cache; *no
+ // HTTP request is made at all*.
+
+ if (!BROWSER_SYNC) {
+ if (IS_WEBKIT) {
+ if (/loaded|complete/.test(document.readyState)) {
+ // Don't load synchronously if the document has already loaded
+ if (WARNINGS && !webkitOnloadFlag) {
+ console.warn('Scripts being loaded after document.onload; scripts may be loaded from out-of-date cache');
+ webkitOnloadFlag = true;
+ }
+
+ if (WARNINGS) {
+ console.warn('Script possibly loaded from out-of-date cache: ' + scriptName);
+ }
+
+ return false;
+ }
+
+ // Fall through; load synchronously anyway
+ } else {
+ return false;
+ }
+ }
+
+ if (!isCleanPath(scriptName)) {
+ return false;
+ }
+
+ var scriptSource;
+
+ try {
+ var xhr = new XMLHttpRequest();
+ xhr.open('GET', scriptName, false);
+ xhr.send(null);
+
+ if (goodResponseCodes.indexOf(xhr.status) < 0) {
+ return false;
+ }
+
+ scriptSource = xhr.responseText;
+ scriptSource += '\n\n//*/\n//@ sourceURL=' + scriptName;
+ } catch (e) {
+ return false;
+ }
+
+ var fn;
+ try {
+ fn = Function(scriptSource);
+ } catch (e) {
+ return false;
+ }
+
+ // Don't wrap user code in try/catch
+ fn();
+
+ return true;
+ }
+ });
+
+ window['require'] = un['require'];
+ window['define'] = un['define'];
+ } else if (ENABLE_NODEJS && typeof module !== 'undefined') {
+ un = module.exports = create({
+ 'context': { },
+ 'loadScriptSync': function (scriptName) {
+ // require here is the Node.JS-provided require
+
+ var code;
+ try {
+ code = require('fs')['readFileSync'](scriptName, 'utf8');
+ } catch (e) {
+ // TODO Detect file-not-found errors only
+ return false;
+ }
+
+ require('vm')['runInNewContext'](code, un['context'] || { }, scriptName);
+
+ return true;
+ }
+ });
+
+ un['context']['define'] = un['define'];
+ un['context']['require'] = un['require'];
+ } else {
+ throw new Error('Unsupported environment');
+ }
+ }());
+
+//@{{{
+}());
+//@}}}
« no previous file with comments | « chrome/test/data/third_party/spaceport/js/tests/text.js ('k') | chrome/test/data/third_party/spaceport/js/util/bench.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698