diff --git a/packages/playwright-core/src/utils/isomorphic/time.ts b/packages/playwright-core/src/utils/isomorphic/time.ts index 981d45e2d2..55cb4048be 100644 --- a/packages/playwright-core/src/utils/isomorphic/time.ts +++ b/packages/playwright-core/src/utils/isomorphic/time.ts @@ -14,6 +14,18 @@ * limitations under the License. */ -export function monotonicTime(): number { - return Math.floor(performance.now() * 1000) / 1000; +let _timeOrigin = performance.timeOrigin; +let _timeShift = 0; + +export function setTimeOrigin(origin: number) { + _timeOrigin = origin; + _timeShift = performance.timeOrigin - origin; +} + +export function timeOrigin(): number { + return _timeOrigin; +} + +export function monotonicTime(): number { + return Math.floor((performance.now() + _timeShift) * 1000) / 1000; } diff --git a/packages/playwright/src/common/ipc.ts b/packages/playwright/src/common/ipc.ts index d941d59b8b..b13ba4df72 100644 --- a/packages/playwright/src/common/ipc.ts +++ b/packages/playwright/src/common/ipc.ts @@ -55,6 +55,7 @@ export type SerializedConfig = { }; export type ProcessInitParams = { + timeOrigin: number; processName: string; }; diff --git a/packages/playwright/src/common/process.ts b/packages/playwright/src/common/process.ts index 54dd2fe991..bfe2e9c533 100644 --- a/packages/playwright/src/common/process.ts +++ b/packages/playwright/src/common/process.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { startProfiling, stopProfiling } from 'playwright-core/lib/utils'; +import { setTimeOrigin, startProfiling, stopProfiling } from 'playwright-core/lib/utils'; import { serializeError } from '../util'; import { registerESMLoader } from './esmLoaderHost'; @@ -69,6 +69,7 @@ process.on('message', async (message: any) => { if (message.method === '__init__') { const { processParams, runnerParams, runnerScript } = message.params as { processParams: ProcessInitParams, runnerParams: any, runnerScript: string }; void startProfiling(); + setTimeOrigin(processParams.timeOrigin); const { create } = require(runnerScript); processRunner = create(runnerParams) as ProcessRunner; processName = processParams.processName; diff --git a/packages/playwright/src/runner/processHost.ts b/packages/playwright/src/runner/processHost.ts index cc972b2601..d78095c0ec 100644 --- a/packages/playwright/src/runner/processHost.ts +++ b/packages/playwright/src/runner/processHost.ts @@ -17,7 +17,7 @@ import child_process from 'child_process'; import { EventEmitter } from 'events'; -import { assert } from 'playwright-core/lib/utils'; +import { assert, timeOrigin } from 'playwright-core/lib/utils'; import { debug } from 'playwright-core/lib/utilsBundle'; import { esmLoaderRegistered } from '../common/esmLoaderHost'; @@ -115,7 +115,8 @@ export class ProcessHost extends EventEmitter { return error; const processParams: ProcessInitParams = { - processName: this._processName + processName: this._processName, + timeOrigin: timeOrigin(), }; this.send({