348 lines
8.8 KiB
JavaScript
348 lines
8.8 KiB
JavaScript
|
/** @license React v0.20.2
|
|||
|
* scheduler-tracing.development.js
|
|||
|
*
|
|||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|||
|
*
|
|||
|
* This source code is licensed under the MIT license found in the
|
|||
|
* LICENSE file in the root directory of this source tree.
|
|||
|
*/
|
|||
|
|
|||
|
'use strict';
|
|||
|
|
|||
|
if (process.env.NODE_ENV !== "production") {
|
|||
|
(function() {
|
|||
|
'use strict';
|
|||
|
|
|||
|
var DEFAULT_THREAD_ID = 0; // Counters used to generate unique IDs.
|
|||
|
|
|||
|
var interactionIDCounter = 0;
|
|||
|
var threadIDCounter = 0; // Set of currently traced interactions.
|
|||
|
// Interactions "stack"–
|
|||
|
// Meaning that newly traced interactions are appended to the previously active set.
|
|||
|
// When an interaction goes out of scope, the previous set (if any) is restored.
|
|||
|
|
|||
|
exports.__interactionsRef = null; // Listener(s) to notify when interactions begin and end.
|
|||
|
|
|||
|
exports.__subscriberRef = null;
|
|||
|
|
|||
|
{
|
|||
|
exports.__interactionsRef = {
|
|||
|
current: new Set()
|
|||
|
};
|
|||
|
exports.__subscriberRef = {
|
|||
|
current: null
|
|||
|
};
|
|||
|
}
|
|||
|
function unstable_clear(callback) {
|
|||
|
|
|||
|
var prevInteractions = exports.__interactionsRef.current;
|
|||
|
exports.__interactionsRef.current = new Set();
|
|||
|
|
|||
|
try {
|
|||
|
return callback();
|
|||
|
} finally {
|
|||
|
exports.__interactionsRef.current = prevInteractions;
|
|||
|
}
|
|||
|
}
|
|||
|
function unstable_getCurrent() {
|
|||
|
{
|
|||
|
return exports.__interactionsRef.current;
|
|||
|
}
|
|||
|
}
|
|||
|
function unstable_getThreadID() {
|
|||
|
return ++threadIDCounter;
|
|||
|
}
|
|||
|
function unstable_trace(name, timestamp, callback) {
|
|||
|
var threadID = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : DEFAULT_THREAD_ID;
|
|||
|
|
|||
|
var interaction = {
|
|||
|
__count: 1,
|
|||
|
id: interactionIDCounter++,
|
|||
|
name: name,
|
|||
|
timestamp: timestamp
|
|||
|
};
|
|||
|
var prevInteractions = exports.__interactionsRef.current; // Traced interactions should stack/accumulate.
|
|||
|
// To do that, clone the current interactions.
|
|||
|
// The previous set will be restored upon completion.
|
|||
|
|
|||
|
var interactions = new Set(prevInteractions);
|
|||
|
interactions.add(interaction);
|
|||
|
exports.__interactionsRef.current = interactions;
|
|||
|
var subscriber = exports.__subscriberRef.current;
|
|||
|
var returnValue;
|
|||
|
|
|||
|
try {
|
|||
|
if (subscriber !== null) {
|
|||
|
subscriber.onInteractionTraced(interaction);
|
|||
|
}
|
|||
|
} finally {
|
|||
|
try {
|
|||
|
if (subscriber !== null) {
|
|||
|
subscriber.onWorkStarted(interactions, threadID);
|
|||
|
}
|
|||
|
} finally {
|
|||
|
try {
|
|||
|
returnValue = callback();
|
|||
|
} finally {
|
|||
|
exports.__interactionsRef.current = prevInteractions;
|
|||
|
|
|||
|
try {
|
|||
|
if (subscriber !== null) {
|
|||
|
subscriber.onWorkStopped(interactions, threadID);
|
|||
|
}
|
|||
|
} finally {
|
|||
|
interaction.__count--; // If no async work was scheduled for this interaction,
|
|||
|
// Notify subscribers that it's completed.
|
|||
|
|
|||
|
if (subscriber !== null && interaction.__count === 0) {
|
|||
|
subscriber.onInteractionScheduledWorkCompleted(interaction);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return returnValue;
|
|||
|
}
|
|||
|
function unstable_wrap(callback) {
|
|||
|
var threadID = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_THREAD_ID;
|
|||
|
|
|||
|
var wrappedInteractions = exports.__interactionsRef.current;
|
|||
|
var subscriber = exports.__subscriberRef.current;
|
|||
|
|
|||
|
if (subscriber !== null) {
|
|||
|
subscriber.onWorkScheduled(wrappedInteractions, threadID);
|
|||
|
} // Update the pending async work count for the current interactions.
|
|||
|
// Update after calling subscribers in case of error.
|
|||
|
|
|||
|
|
|||
|
wrappedInteractions.forEach(function (interaction) {
|
|||
|
interaction.__count++;
|
|||
|
});
|
|||
|
var hasRun = false;
|
|||
|
|
|||
|
function wrapped() {
|
|||
|
var prevInteractions = exports.__interactionsRef.current;
|
|||
|
exports.__interactionsRef.current = wrappedInteractions;
|
|||
|
subscriber = exports.__subscriberRef.current;
|
|||
|
|
|||
|
try {
|
|||
|
var returnValue;
|
|||
|
|
|||
|
try {
|
|||
|
if (subscriber !== null) {
|
|||
|
subscriber.onWorkStarted(wrappedInteractions, threadID);
|
|||
|
}
|
|||
|
} finally {
|
|||
|
try {
|
|||
|
returnValue = callback.apply(undefined, arguments);
|
|||
|
} finally {
|
|||
|
exports.__interactionsRef.current = prevInteractions;
|
|||
|
|
|||
|
if (subscriber !== null) {
|
|||
|
subscriber.onWorkStopped(wrappedInteractions, threadID);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return returnValue;
|
|||
|
} finally {
|
|||
|
if (!hasRun) {
|
|||
|
// We only expect a wrapped function to be executed once,
|
|||
|
// But in the event that it's executed more than once–
|
|||
|
// Only decrement the outstanding interaction counts once.
|
|||
|
hasRun = true; // Update pending async counts for all wrapped interactions.
|
|||
|
// If this was the last scheduled async work for any of them,
|
|||
|
// Mark them as completed.
|
|||
|
|
|||
|
wrappedInteractions.forEach(function (interaction) {
|
|||
|
interaction.__count--;
|
|||
|
|
|||
|
if (subscriber !== null && interaction.__count === 0) {
|
|||
|
subscriber.onInteractionScheduledWorkCompleted(interaction);
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
wrapped.cancel = function cancel() {
|
|||
|
subscriber = exports.__subscriberRef.current;
|
|||
|
|
|||
|
try {
|
|||
|
if (subscriber !== null) {
|
|||
|
subscriber.onWorkCanceled(wrappedInteractions, threadID);
|
|||
|
}
|
|||
|
} finally {
|
|||
|
// Update pending async counts for all wrapped interactions.
|
|||
|
// If this was the last scheduled async work for any of them,
|
|||
|
// Mark them as completed.
|
|||
|
wrappedInteractions.forEach(function (interaction) {
|
|||
|
interaction.__count--;
|
|||
|
|
|||
|
if (subscriber && interaction.__count === 0) {
|
|||
|
subscriber.onInteractionScheduledWorkCompleted(interaction);
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
return wrapped;
|
|||
|
}
|
|||
|
|
|||
|
var subscribers = null;
|
|||
|
|
|||
|
{
|
|||
|
subscribers = new Set();
|
|||
|
}
|
|||
|
|
|||
|
function unstable_subscribe(subscriber) {
|
|||
|
{
|
|||
|
subscribers.add(subscriber);
|
|||
|
|
|||
|
if (subscribers.size === 1) {
|
|||
|
exports.__subscriberRef.current = {
|
|||
|
onInteractionScheduledWorkCompleted: onInteractionScheduledWorkCompleted,
|
|||
|
onInteractionTraced: onInteractionTraced,
|
|||
|
onWorkCanceled: onWorkCanceled,
|
|||
|
onWorkScheduled: onWorkScheduled,
|
|||
|
onWorkStarted: onWorkStarted,
|
|||
|
onWorkStopped: onWorkStopped
|
|||
|
};
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
function unstable_unsubscribe(subscriber) {
|
|||
|
{
|
|||
|
subscribers.delete(subscriber);
|
|||
|
|
|||
|
if (subscribers.size === 0) {
|
|||
|
exports.__subscriberRef.current = null;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
function onInteractionTraced(interaction) {
|
|||
|
var didCatchError = false;
|
|||
|
var caughtError = null;
|
|||
|
subscribers.forEach(function (subscriber) {
|
|||
|
try {
|
|||
|
subscriber.onInteractionTraced(interaction);
|
|||
|
} catch (error) {
|
|||
|
if (!didCatchError) {
|
|||
|
didCatchError = true;
|
|||
|
caughtError = error;
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
if (didCatchError) {
|
|||
|
throw caughtError;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
function onInteractionScheduledWorkCompleted(interaction) {
|
|||
|
var didCatchError = false;
|
|||
|
var caughtError = null;
|
|||
|
subscribers.forEach(function (subscriber) {
|
|||
|
try {
|
|||
|
subscriber.onInteractionScheduledWorkCompleted(interaction);
|
|||
|
} catch (error) {
|
|||
|
if (!didCatchError) {
|
|||
|
didCatchError = true;
|
|||
|
caughtError = error;
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
if (didCatchError) {
|
|||
|
throw caughtError;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
function onWorkScheduled(interactions, threadID) {
|
|||
|
var didCatchError = false;
|
|||
|
var caughtError = null;
|
|||
|
subscribers.forEach(function (subscriber) {
|
|||
|
try {
|
|||
|
subscriber.onWorkScheduled(interactions, threadID);
|
|||
|
} catch (error) {
|
|||
|
if (!didCatchError) {
|
|||
|
didCatchError = true;
|
|||
|
caughtError = error;
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
if (didCatchError) {
|
|||
|
throw caughtError;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
function onWorkStarted(interactions, threadID) {
|
|||
|
var didCatchError = false;
|
|||
|
var caughtError = null;
|
|||
|
subscribers.forEach(function (subscriber) {
|
|||
|
try {
|
|||
|
subscriber.onWorkStarted(interactions, threadID);
|
|||
|
} catch (error) {
|
|||
|
if (!didCatchError) {
|
|||
|
didCatchError = true;
|
|||
|
caughtError = error;
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
if (didCatchError) {
|
|||
|
throw caughtError;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
function onWorkStopped(interactions, threadID) {
|
|||
|
var didCatchError = false;
|
|||
|
var caughtError = null;
|
|||
|
subscribers.forEach(function (subscriber) {
|
|||
|
try {
|
|||
|
subscriber.onWorkStopped(interactions, threadID);
|
|||
|
} catch (error) {
|
|||
|
if (!didCatchError) {
|
|||
|
didCatchError = true;
|
|||
|
caughtError = error;
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
if (didCatchError) {
|
|||
|
throw caughtError;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
function onWorkCanceled(interactions, threadID) {
|
|||
|
var didCatchError = false;
|
|||
|
var caughtError = null;
|
|||
|
subscribers.forEach(function (subscriber) {
|
|||
|
try {
|
|||
|
subscriber.onWorkCanceled(interactions, threadID);
|
|||
|
} catch (error) {
|
|||
|
if (!didCatchError) {
|
|||
|
didCatchError = true;
|
|||
|
caughtError = error;
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
if (didCatchError) {
|
|||
|
throw caughtError;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
exports.unstable_clear = unstable_clear;
|
|||
|
exports.unstable_getCurrent = unstable_getCurrent;
|
|||
|
exports.unstable_getThreadID = unstable_getThreadID;
|
|||
|
exports.unstable_subscribe = unstable_subscribe;
|
|||
|
exports.unstable_trace = unstable_trace;
|
|||
|
exports.unstable_unsubscribe = unstable_unsubscribe;
|
|||
|
exports.unstable_wrap = unstable_wrap;
|
|||
|
})();
|
|||
|
}
|