Skip to content

Commit

Permalink
fix: return fake version for performance.timeOrigin (#515)
Browse files Browse the repository at this point in the history
* fix: return fake version for `performance.timeOrigin`

Fixes #514

* Simplify implementation

* Update comment

---------

Co-authored-by: Carl-Erik Kopseng <[email protected]>
  • Loading branch information
rriski and fatso83 authored Dec 5, 2024
1 parent 7861c93 commit ff8d907
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 18 deletions.
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

Check warning on line 27 in src/fake-timers-src.js

View workflow job for this annotation

GitHub Actions / lint

Syntax error in type: function(IdleDeadline)
* @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}

Check warning on line 478 in src/fake-timers-src.js

View workflow job for this annotation

GitHub Actions / lint

The type 'ClockDate' is undefined
*/
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" */
/**

Check warning on line 674 in src/fake-timers-src.js

View workflow job for this annotation

GitHub Actions / lint

JSDoc @returns declaration present but return expression not available in function
* Timer comparitor
*
* @param {Timer} a
* @param {Timer} b
* @returns {number}
Expand Down Expand Up @@ -815,7 +804,6 @@ function withGlobal(_global) {

/**

Check warning on line 805 in src/fake-timers-src.js

View workflow job for this annotation

GitHub Actions / lint

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

/**

Check warning on line 816 in src/fake-timers-src.js

View workflow job for this annotation

GitHub Actions / lint

Missing JSDoc @returns declaration
* 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

0 comments on commit ff8d907

Please sign in to comment.