[fix] Don't trigger Finish event when in liveMode (#1115)
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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(`
|
||||
|
||||
Reference in New Issue
Block a user