[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
|
// events are kept sorted by timestamp, check if this is the last event
|
||||||
const last_index = this.service.state.context.events.length - 1;
|
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 = () => {
|
const finish = () => {
|
||||||
if (last_index < this.service.state.context.events.length - 1) {
|
if (last_index < this.service.state.context.events.length - 1) {
|
||||||
// more events have been added since the setTimeout
|
// 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 canvasInIframe from './events/canvas-in-iframe';
|
||||||
import adoptedStyleSheet from './events/adopted-style-sheet';
|
import adoptedStyleSheet from './events/adopted-style-sheet';
|
||||||
import adoptedStyleSheetModification from './events/adopted-style-sheet-modification';
|
import adoptedStyleSheetModification from './events/adopted-style-sheet-modification';
|
||||||
|
import { ReplayerEvents } from '@rrweb/types';
|
||||||
|
|
||||||
interface ISuite {
|
interface ISuite {
|
||||||
code: string;
|
code: string;
|
||||||
@@ -27,6 +28,9 @@ interface ISuite {
|
|||||||
page: puppeteer.Page;
|
page: puppeteer.Page;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type IWindow = Window &
|
||||||
|
typeof globalThis & { rrweb: typeof import('../src'); events: typeof events };
|
||||||
|
|
||||||
describe('replayer', function () {
|
describe('replayer', function () {
|
||||||
jest.setTimeout(10_000);
|
jest.setTimeout(10_000);
|
||||||
|
|
||||||
@@ -45,7 +49,7 @@ describe('replayer', function () {
|
|||||||
page = await browser.newPage();
|
page = await browser.newPage();
|
||||||
await page.goto('about:blank');
|
await page.goto('about:blank');
|
||||||
await page.evaluate(code);
|
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()));
|
page.on('console', (msg) => console.log('PAGE LOG:', msg.text()));
|
||||||
});
|
});
|
||||||
@@ -679,6 +683,29 @@ describe('replayer', function () {
|
|||||||
expect(status).toEqual('live');
|
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 () => {
|
it('replays same timestamp events in correct order', async () => {
|
||||||
await page.evaluate(`events = ${JSON.stringify(orderingEvents)}`);
|
await page.evaluate(`events = ${JSON.stringify(orderingEvents)}`);
|
||||||
await page.evaluate(`
|
await page.evaluate(`
|
||||||
|
|||||||
Reference in New Issue
Block a user