Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: return fake version for performance.timeOrigin #515

Merged
merged 3 commits into from
Dec 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 3 additions & 15 deletions src/fake-timers-src.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ if (typeof require === "function" && typeof module === "object") {

/**
* Queues a function to be called during a browser's idle periods
*
* @callback RequestIdleCallback
* @param {function(IdleDeadline)} callback
* @param {{timeout: number}} options - an options object
Expand Down Expand Up @@ -106,7 +105,6 @@ if (typeof require === "function" && typeof module === "object") {

/**
* Configuration object for the `install` method.
*
* @typedef {object} Config
* @property {number|Date} [now] a number (in milliseconds) or a Date object (default epoch)
* @property {string[]} [toFake] names of the methods that should be faked.
Expand All @@ -120,7 +118,6 @@ if (typeof require === "function" && typeof module === "object") {
/* eslint-disable jsdoc/require-property-description */
/**
* The internal structure to describe a scheduled fake timer
*
* @typedef {object} Timer
* @property {Function} func
* @property {*[]} args
Expand All @@ -134,7 +131,6 @@ if (typeof require === "function" && typeof module === "object") {

/**
* A Node timer
*
* @typedef {object} NodeImmediate
* @property {function(): boolean} hasRef
* @property {function(): NodeImmediate} ref
Expand All @@ -146,7 +142,6 @@ if (typeof require === "function" && typeof module === "object") {

/**
* Mocks available features in the specified global namespace.
*
* @param {*} _global Namespace to mock (e.g. `window`)
* @returns {FakeTimers}
*/
Expand Down Expand Up @@ -276,7 +271,6 @@ function withGlobal(_global) {
* Parse strings like "01:10:00" (meaning 1 hour, 10 minutes, 0 seconds) into
* number of milliseconds. This is used to support human-readable strings passed
* to clock.tick()
*
* @param {string} str
* @returns {number}
*/
Expand Down Expand Up @@ -312,7 +306,6 @@ function withGlobal(_global) {

/**
* Get the decimal part of the millisecond value as nanoseconds
*
* @param {number} msFloat the number of milliseconds
* @returns {number} an integer number of nanoseconds in the range [0,1e6)
*
Expand All @@ -329,7 +322,6 @@ function withGlobal(_global) {

/**
* Used to grok the `now` parameter to createClock.
*
* @param {Date|number} epoch the system time
* @returns {number}
*/
Expand Down Expand Up @@ -483,7 +475,6 @@ function withGlobal(_global) {
/**
* A normal Class constructor cannot be called without `new`, but Date can, so we need
* to wrap it in a Proxy in order to ensure this functionality of Date is kept intact
*
* @type {ClockDate}
*/
const ClockDateProxy = new Proxy(ClockDate, {
Expand All @@ -510,7 +501,6 @@ function withGlobal(_global) {
* Most of the properties are the original native ones,
* but we need to take control of those that have a
* dependency on the current clock.
*
* @returns {object} the partly fake Intl implementation
*/
function createIntl() {
Expand Down Expand Up @@ -683,7 +673,6 @@ function withGlobal(_global) {
/* eslint consistent-return: "off" */
/**
* Timer comparitor
*
* @param {Timer} a
* @param {Timer} b
* @returns {number}
Expand Down Expand Up @@ -815,7 +804,6 @@ function withGlobal(_global) {

/**
* Gets clear handler name for a given timer type
*
* @param {string} ttype
*/
function getClearHandler(ttype) {
Expand All @@ -827,7 +815,6 @@ function withGlobal(_global) {

/**
* Gets schedule handler name for a given timer type
*
* @param {string} ttype
*/
function getScheduleHandler(ttype) {
Expand Down Expand Up @@ -1183,13 +1170,11 @@ function withGlobal(_global) {

/**
* A high resolution timestamp in milliseconds.
*
* @typedef {number} DOMHighResTimeStamp
*/

/**
* performance.now()
*
* @returns {DOMHighResTimeStamp}
*/
function fakePerformanceNow() {
Expand Down Expand Up @@ -1848,6 +1833,9 @@ function withGlobal(_global) {
new FakePerformanceEntry(name, "mark", 0, 0);
clock.performance.measure = (name) =>
new FakePerformanceEntry(name, "measure", 0, 100);
// `timeOrigin` should return the time of when the Window session started
// (or the Worker was installed)
clock.performance.timeOrigin = getEpoch(config.now);
} else if ((config.toFake || []).includes("performance")) {
return handleMissingTimer("performance");
}
Expand Down
13 changes: 10 additions & 3 deletions test/fake-timers-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -3684,6 +3684,16 @@ describe("FakeTimers", function () {
testEntry(performance.measure("bar", "s", "t"));
});

it("should create fake version of `timeOrigin` that returns the installed time", function () {
if (typeof Performance === "undefined") {
return this.skip();
}

this.clock = FakeTimers.install({ now: new Date(1234) });
assert.isNumber(performance.timeOrigin);
assert.equals(performance.timeOrigin, 1234);
});

it("should replace the getEntries, getEntriesByX methods with noops that return []", function () {
if (typeof Performance === "undefined") {
return this.skip();
Expand Down Expand Up @@ -4788,7 +4798,6 @@ describe("FakeTimers", function () {

/**
* Returns elements that are present in both lists.
*
* @function
* @template E
* @param {E[]} [list1]
Expand All @@ -4801,7 +4810,6 @@ describe("FakeTimers", function () {

/**
* Get property names and original values from timers module.
*
* @function
* @param {string[]} [toFake]
* @returns {{propertyName: string, originalValue: any}[]}
Expand Down Expand Up @@ -5948,7 +5956,6 @@ describe("Node Timer: ref(), unref(),hasRef()", function () {
describe("Intl API", function () {
/**
* Tester function to check if the globally hijacked Intl object is plugging into the faked Clock
*
* @param {string} ianaTimeZone - IANA time zone name
* @param {number} timestamp - UNIX timestamp
* @returns {boolean}
Expand Down