[fix] Don't trigger Finish event when in liveMode (#1115)

This commit is contained in:
Justin Halsall
2023-02-09 08:48:57 +01:00
committed by GitHub
parent a77e302178
commit 25a4f5ab6c
2 changed files with 32 additions and 2 deletions

View File

@@ -709,7 +709,10 @@ export class Replayer {
// events are kept sorted by timestamp, check if this is the last event
const last_index = this.service.state.context.events.length - 1;
if (event === this.service.state.context.events[last_index]) {
if (
!this.config.liveMode &&
event === this.service.state.context.events[last_index]
) {
const finish = () => {
if (last_index < this.service.state.context.events.length - 1) {
// more events have been added since the setTimeout

View File

@@ -20,6 +20,7 @@ import StyleSheetTextMutation from './events/style-sheet-text-mutation';
import canvasInIframe from './events/canvas-in-iframe';
import adoptedStyleSheet from './events/adopted-style-sheet';
import adoptedStyleSheetModification from './events/adopted-style-sheet-modification';
import { ReplayerEvents } from '@rrweb/types';
interface ISuite {
code: string;
@@ -27,6 +28,9 @@ interface ISuite {
page: puppeteer.Page;
}
type IWindow = Window &
typeof globalThis & { rrweb: typeof import('../src'); events: typeof events };
describe('replayer', function () {
jest.setTimeout(10_000);
@@ -45,7 +49,7 @@ describe('replayer', function () {
page = await browser.newPage();
await page.goto('about:blank');
await page.evaluate(code);
await page.evaluate(`let events = ${JSON.stringify(events)}`);
await page.evaluate(`var events = ${JSON.stringify(events)}`);
page.on('console', (msg) => console.log('PAGE LOG:', msg.text()));
});
@@ -679,6 +683,29 @@ describe('replayer', function () {
expect(status).toEqual('live');
});
it("shouldn't trigger ReplayerEvents.Finish in live mode", async () => {
const status = await page.evaluate((FinishState) => {
return new Promise((resolve) => {
const win = window as IWindow;
let triggeredFinish = false;
const { Replayer } = win.rrweb;
const replayer = new Replayer([], {
liveMode: true,
});
replayer.on(FinishState, () => {
triggeredFinish = true;
});
replayer.startLive();
replayer.addEvent(win.events[0]);
requestAnimationFrame(() => {
resolve(triggeredFinish);
});
});
}, ReplayerEvents.Finish);
expect(status).toEqual(false);
});
it('replays same timestamp events in correct order', async () => {
await page.evaluate(`events = ${JSON.stringify(orderingEvents)}`);
await page.evaluate(`