@dev-blinq/cucumber_client 1.0.1654-dev โ 1.0.1655-dev
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/client/recorderv3/services.js +244 -248
- package/package.json +1 -1
|
@@ -298,190 +298,190 @@ export class RemoteBrowserService extends EventEmitter {
|
|
|
298
298
|
lastKnownUrl: page.url(),
|
|
299
299
|
lastKnownWsDebuggerUrl: cdpTargetId ? `${this.wsUrlBase}${cdpTargetId}` : undefined,
|
|
300
300
|
});
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
}
|
|
305
|
-
if (this.pages.size > 0 && !this._selectedPageId) {
|
|
306
|
-
this._selectedPageId = Array.from(this.pages.keys())[0];
|
|
307
|
-
}
|
|
308
|
-
await this.syncState();
|
|
309
|
-
this.context.on("page", async (page) => {
|
|
310
|
-
const stableTabId = uuidv4();
|
|
311
|
-
this.log("๐ New page event triggered", { stableTabId, url: page.url() });
|
|
312
|
-
// We get the ID immediately, but it might be null if the page is too new
|
|
313
|
-
const cdpTargetId = await this.getCdpTargetId(page);
|
|
314
|
-
this.pages.set(stableTabId, {
|
|
315
|
-
page,
|
|
316
|
-
cdpTargetId,
|
|
317
|
-
lastKnownTitle: undefined,
|
|
318
|
-
lastKnownUrl: page.url(),
|
|
319
|
-
lastKnownWsDebuggerUrl: cdpTargetId ? `${this.wsUrlBase}${cdpTargetId}` : undefined,
|
|
320
|
-
});
|
|
321
|
-
if (cdpTargetId) {
|
|
322
|
-
this.log("โ
Page mapped to CDP ID", { stableTabId, cdpTargetId });
|
|
323
|
-
}
|
|
324
|
-
else {
|
|
325
|
-
this.log("โ ๏ธ Could not find CDP ID for new page yet", { stableTabId });
|
|
326
|
-
}
|
|
327
|
-
if (!this._selectedPageId) {
|
|
328
|
-
// Select the first page that opens
|
|
329
|
-
this._selectedPageId = stableTabId;
|
|
330
|
-
this.log("๐ฏ Initial selected page set", { selectedPageId: this._selectedPageId });
|
|
331
|
-
}
|
|
332
|
-
this.attachPageLifecycleListeners(page, stableTabId);
|
|
333
|
-
await this.syncState();
|
|
334
|
-
});
|
|
335
|
-
}
|
|
336
|
-
attachPageLifecycleListeners(page, stableTabId) {
|
|
337
|
-
page.on("load", () => this.syncState());
|
|
338
|
-
page.on("framenavigated", () => this.syncState());
|
|
339
|
-
page.on("close", async () => {
|
|
340
|
-
this.log("๐๏ธ Page close event", { stableTabId });
|
|
341
|
-
this.pages.delete(stableTabId);
|
|
342
|
-
if (this._selectedPageId === stableTabId) {
|
|
343
|
-
this._selectedPageId = this.pages.size > 0 ? Array.from(this.pages.keys())[0] : null;
|
|
344
|
-
this.log("๐ Selected page changed after close", { newSelectedId: this._selectedPageId });
|
|
345
|
-
}
|
|
346
|
-
await this.syncState();
|
|
347
|
-
});
|
|
348
|
-
}
|
|
349
|
-
async syncState() {
|
|
350
|
-
try {
|
|
351
|
-
this.log("๐ Starting state sync");
|
|
352
|
-
const state = await this.getState();
|
|
353
|
-
this.log("โ
State sync complete", { pagesCount: state.pages.length, selectedPageId: state.selectedPageId });
|
|
354
|
-
this.emit("BrowserService.stateSync", state);
|
|
355
|
-
}
|
|
356
|
-
catch (error) {
|
|
357
|
-
this.log("โ Error syncing state", { error });
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
async getState() {
|
|
361
|
-
this.log("๐ Getting current state");
|
|
362
|
-
const pagesData = [];
|
|
363
|
-
const pagesToDelete = []; // To clean up closed pages
|
|
364
|
-
for (const [stableTabId, pageInfo] of this.pages.entries()) {
|
|
365
|
-
const pageData = {
|
|
366
|
-
id: stableTabId,
|
|
367
|
-
title: pageInfo.lastKnownTitle ?? "",
|
|
368
|
-
url: pageInfo.lastKnownUrl ?? pageInfo.page.url(),
|
|
369
|
-
wsDebuggerUrl: pageInfo.lastKnownWsDebuggerUrl ?? "",
|
|
370
|
-
};
|
|
371
|
-
try {
|
|
372
|
-
if (pageInfo.page.isClosed()) {
|
|
373
|
-
this.log("๐งน Found closed page during getState, marking for deletion", { stableTabId });
|
|
374
|
-
pagesToDelete.push(stableTabId);
|
|
375
|
-
continue;
|
|
376
|
-
}
|
|
377
|
-
// Get the one, true, live CDP ID
|
|
378
|
-
const currentCdpId = await this.getCdpTargetId(pageInfo.page);
|
|
379
|
-
if (currentCdpId && pageInfo.cdpTargetId !== currentCdpId) {
|
|
380
|
-
this.log("๐ CDP ID changed", { stableTabId, old: pageInfo.cdpTargetId, new: currentCdpId });
|
|
381
|
-
pageInfo.cdpTargetId = currentCdpId; // Update our internal reference
|
|
382
|
-
}
|
|
383
|
-
// Manually construct the WebSocket URL
|
|
384
|
-
const wsDebuggerUrl = currentCdpId
|
|
385
|
-
? `${this.wsUrlBase}${currentCdpId}`
|
|
386
|
-
: (pageInfo.lastKnownWsDebuggerUrl ?? "");
|
|
387
|
-
if (!wsDebuggerUrl) {
|
|
388
|
-
this.log("โ ๏ธ Could not get CDP ID, wsDebuggerUrl will be empty", { stableTabId });
|
|
389
|
-
}
|
|
390
|
-
const title = await pageInfo.page.title();
|
|
391
|
-
const currentUrl = pageInfo.page.url();
|
|
392
|
-
pageData.title = title;
|
|
393
|
-
pageData.url = currentUrl;
|
|
394
|
-
pageData.wsDebuggerUrl = wsDebuggerUrl; // Use the constructed URL
|
|
395
|
-
pageInfo.lastKnownTitle = title;
|
|
396
|
-
pageInfo.lastKnownUrl = currentUrl;
|
|
397
|
-
pageInfo.lastKnownWsDebuggerUrl = wsDebuggerUrl;
|
|
398
|
-
this.log("๐ฅPage data", pageData);
|
|
399
|
-
}
|
|
400
|
-
catch (error) {
|
|
401
|
-
const message = error instanceof Error ? error.message : JSON.stringify(error);
|
|
402
|
-
if (this.isTransientPageDataError(error)) {
|
|
403
|
-
this.log("โณ Transient error getting page data, will retry", { stableTabId, message });
|
|
301
|
+
page.on("framenavigated", async () => {
|
|
302
|
+
try {
|
|
303
|
+
await this.ensureClipboardScriptLoaded(page);
|
|
404
304
|
}
|
|
405
|
-
|
|
406
|
-
this.log("โ Error
|
|
407
|
-
pagesToDelete.push(stableTabId); // Mark for deletion
|
|
408
|
-
continue;
|
|
305
|
+
catch (err) {
|
|
306
|
+
this.log("โ Error injecting clipboard script on navigation", { stableTabId, error: err });
|
|
409
307
|
}
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
this.log("
|
|
435
|
-
|
|
436
|
-
if (
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
}
|
|
446
|
-
await this.syncState();
|
|
447
|
-
}
|
|
448
|
-
catch (error) {
|
|
449
|
-
this.log("โ Error creating tab", { error });
|
|
450
|
-
}
|
|
451
|
-
}
|
|
452
|
-
async closeTab(stableTabId) {
|
|
453
|
-
try {
|
|
454
|
-
this.log("๐๏ธ Closing tab", { stableTabId });
|
|
455
|
-
const pageInfo = this.pages.get(stableTabId);
|
|
456
|
-
if (pageInfo) {
|
|
457
|
-
await pageInfo.page.close(); // This will trigger the 'close' event
|
|
458
|
-
}
|
|
459
|
-
else {
|
|
460
|
-
this.log("โ ๏ธ Page not found for closing", { stableTabId });
|
|
461
|
-
}
|
|
462
|
-
}
|
|
463
|
-
catch (error) {
|
|
464
|
-
this.log("โ Error closing tab", { error });
|
|
465
|
-
}
|
|
466
|
-
}
|
|
467
|
-
async selectTab(stableTabId) {
|
|
468
|
-
try {
|
|
469
|
-
this.log("๐ฏ Selecting tab", { stableTabId });
|
|
470
|
-
const pageInfo = this.pages.get(stableTabId);
|
|
471
|
-
if (pageInfo) {
|
|
472
|
-
this._selectedPageId = stableTabId;
|
|
473
|
-
await pageInfo.page.bringToFront();
|
|
474
|
-
this.log("โ
Tab selected successfully", { stableTabId });
|
|
475
|
-
await this.syncState();
|
|
476
|
-
}
|
|
477
|
-
else {
|
|
478
|
-
this.log("โ ๏ธ Page not found for selection", { stableTabId });
|
|
479
|
-
}
|
|
480
|
-
}
|
|
481
|
-
catch (error) {
|
|
482
|
-
this.log("โ Error selecting tab", { error });
|
|
483
|
-
}
|
|
308
|
+
});
|
|
309
|
+
// this.log("โ
Existing page added to map", { stableTabId, cdpTargetId, url: page.url() });
|
|
310
|
+
// this.attachPageLifecycleListeners(page, stableTabId);
|
|
311
|
+
// this.log("๐ Attached lifecycle listeners to existing page", { stableTabId });
|
|
312
|
+
}
|
|
313
|
+
// if (this.pages.size > 0 && !this._selectedPageId) {
|
|
314
|
+
// this._selectedPageId = Array.from(this.pages.keys())[0];
|
|
315
|
+
// }
|
|
316
|
+
// await this.syncState();
|
|
317
|
+
this.context.on("page", async (page) => {
|
|
318
|
+
// const stableTabId = uuidv4();
|
|
319
|
+
// this.log("๐ New page event triggered", { stableTabId, url: page.url() });
|
|
320
|
+
// // We get the ID immediately, but it might be null if the page is too new
|
|
321
|
+
// const cdpTargetId = await this.getCdpTargetId(page);
|
|
322
|
+
// this.pages.set(stableTabId, {
|
|
323
|
+
// page,
|
|
324
|
+
// cdpTargetId,
|
|
325
|
+
// lastKnownTitle: undefined,
|
|
326
|
+
// lastKnownUrl: page.url(),
|
|
327
|
+
// lastKnownWsDebuggerUrl: cdpTargetId ? `${this.wsUrlBase}${cdpTargetId}` : undefined,
|
|
328
|
+
// });
|
|
329
|
+
// if (cdpTargetId) {
|
|
330
|
+
// this.log("โ
Page mapped to CDP ID", { stableTabId, cdpTargetId });
|
|
331
|
+
// } else {
|
|
332
|
+
// this.log("โ ๏ธ Could not find CDP ID for new page yet", { stableTabId });
|
|
333
|
+
// }
|
|
334
|
+
// if (!this._selectedPageId) {
|
|
335
|
+
// // Select the first page that opens
|
|
336
|
+
// this._selectedPageId = stableTabId;
|
|
337
|
+
// this.log("๐ฏ Initial selected page set", { selectedPageId: this._selectedPageId });
|
|
338
|
+
// }
|
|
339
|
+
// this.attachPageLifecycleListeners(page, stableTabId);
|
|
340
|
+
// await this.syncState();
|
|
341
|
+
await this.ensureClipboardScriptLoaded(page);
|
|
342
|
+
});
|
|
484
343
|
}
|
|
344
|
+
// private attachPageLifecycleListeners(page: Page, stableTabId: string) {
|
|
345
|
+
// page.on("load", () => this.syncState());
|
|
346
|
+
// page.on("framenavigated", () => this.syncState());
|
|
347
|
+
// page.on("close", async () => {
|
|
348
|
+
// this.log("๐๏ธ Page close event", { stableTabId });
|
|
349
|
+
// this.pages.delete(stableTabId);
|
|
350
|
+
// if (this._selectedPageId === stableTabId) {
|
|
351
|
+
// this._selectedPageId = this.pages.size > 0 ? Array.from(this.pages.keys())[0] : null;
|
|
352
|
+
// this.log("๐ Selected page changed after close", { newSelectedId: this._selectedPageId });
|
|
353
|
+
// }
|
|
354
|
+
// await this.syncState();
|
|
355
|
+
// });
|
|
356
|
+
// }
|
|
357
|
+
// private async syncState() {
|
|
358
|
+
// try {
|
|
359
|
+
// this.log("๐ Starting state sync");
|
|
360
|
+
// const state = await this.getState();
|
|
361
|
+
// this.log("โ
State sync complete", { pagesCount: state.pages.length, selectedPageId: state.selectedPageId });
|
|
362
|
+
// this.emit("BrowserService.stateSync", state);
|
|
363
|
+
// } catch (error) {
|
|
364
|
+
// this.log("โ Error syncing state", { error });
|
|
365
|
+
// }
|
|
366
|
+
// }
|
|
367
|
+
// async getState(): Promise<BrowserState> {
|
|
368
|
+
// this.log("๐ Getting current state");
|
|
369
|
+
// const pagesData: PageData[] = [];
|
|
370
|
+
// const pagesToDelete: string[] = []; // To clean up closed pages
|
|
371
|
+
// for (const [stableTabId, pageInfo] of this.pages.entries()) {
|
|
372
|
+
// const pageData: PageData = {
|
|
373
|
+
// id: stableTabId,
|
|
374
|
+
// title: pageInfo.lastKnownTitle ?? "",
|
|
375
|
+
// url: pageInfo.lastKnownUrl ?? pageInfo.page.url(),
|
|
376
|
+
// wsDebuggerUrl: pageInfo.lastKnownWsDebuggerUrl ?? "",
|
|
377
|
+
// };
|
|
378
|
+
// try {
|
|
379
|
+
// if (pageInfo.page.isClosed()) {
|
|
380
|
+
// this.log("๐งน Found closed page during getState, marking for deletion", { stableTabId });
|
|
381
|
+
// pagesToDelete.push(stableTabId);
|
|
382
|
+
// continue;
|
|
383
|
+
// }
|
|
384
|
+
// // Get the one, true, live CDP ID
|
|
385
|
+
// const currentCdpId = await this.getCdpTargetId(pageInfo.page);
|
|
386
|
+
// if (currentCdpId && pageInfo.cdpTargetId !== currentCdpId) {
|
|
387
|
+
// this.log("๐ CDP ID changed", { stableTabId, old: pageInfo.cdpTargetId, new: currentCdpId });
|
|
388
|
+
// pageInfo.cdpTargetId = currentCdpId; // Update our internal reference
|
|
389
|
+
// }
|
|
390
|
+
// // Manually construct the WebSocket URL
|
|
391
|
+
// const wsDebuggerUrl = currentCdpId
|
|
392
|
+
// ? `${this.wsUrlBase}${currentCdpId}`
|
|
393
|
+
// : (pageInfo.lastKnownWsDebuggerUrl ?? "");
|
|
394
|
+
// if (!wsDebuggerUrl) {
|
|
395
|
+
// this.log("โ ๏ธ Could not get CDP ID, wsDebuggerUrl will be empty", { stableTabId });
|
|
396
|
+
// }
|
|
397
|
+
// const title = await pageInfo.page.title();
|
|
398
|
+
// const currentUrl = pageInfo.page.url();
|
|
399
|
+
// pageData.title = title;
|
|
400
|
+
// pageData.url = currentUrl;
|
|
401
|
+
// pageData.wsDebuggerUrl = wsDebuggerUrl; // Use the constructed URL
|
|
402
|
+
// pageInfo.lastKnownTitle = title;
|
|
403
|
+
// pageInfo.lastKnownUrl = currentUrl;
|
|
404
|
+
// pageInfo.lastKnownWsDebuggerUrl = wsDebuggerUrl;
|
|
405
|
+
// this.log("๐ฅPage data", pageData);
|
|
406
|
+
// } catch (error) {
|
|
407
|
+
// const message = error instanceof Error ? error.message : JSON.stringify(error);
|
|
408
|
+
// if (this.isTransientPageDataError(error)) {
|
|
409
|
+
// this.log("โณ Transient error getting page data, will retry", { stableTabId, message });
|
|
410
|
+
// } else {
|
|
411
|
+
// this.log("โ Error getting page data", { stableTabId, message });
|
|
412
|
+
// pagesToDelete.push(stableTabId); // Mark for deletion
|
|
413
|
+
// continue;
|
|
414
|
+
// }
|
|
415
|
+
// }
|
|
416
|
+
// if (!pageData.title) {
|
|
417
|
+
// pageData.title = pageInfo.page.url() === "about:blank" ? "" : "Loading...";
|
|
418
|
+
// }
|
|
419
|
+
// pagesData.push(pageData);
|
|
420
|
+
// }
|
|
421
|
+
// pagesToDelete.forEach((id) => this.pages.delete(id));
|
|
422
|
+
// if (this._selectedPageId && !this.pages.has(this._selectedPageId)) {
|
|
423
|
+
// this._selectedPageId = pagesData.length > 0 ? pagesData[0].id : null;
|
|
424
|
+
// this.log("๐ Corrected selectedPageId", { new: this._selectedPageId });
|
|
425
|
+
// }
|
|
426
|
+
// if (!this._selectedPageId && pagesData.length > 0) {
|
|
427
|
+
// this._selectedPageId = pagesData[0].id;
|
|
428
|
+
// this.log("๐ฏ Set default selectedPageId", { new: this._selectedPageId });
|
|
429
|
+
// }
|
|
430
|
+
// const state = {
|
|
431
|
+
// pages: pagesData,
|
|
432
|
+
// selectedPageId: this._selectedPageId,
|
|
433
|
+
// };
|
|
434
|
+
// this.log("๐ฆ Final state", state);
|
|
435
|
+
// return state;
|
|
436
|
+
// }
|
|
437
|
+
// async createTab(url: string = "about:blank"): Promise<void> {
|
|
438
|
+
// try {
|
|
439
|
+
// this.log("๐ Creating new tab", { url });
|
|
440
|
+
// const page = await this.context.newPage(); // This will trigger the 'page' event
|
|
441
|
+
// if (url !== "about:blank") {
|
|
442
|
+
// await page.goto(url, { waitUntil: "domcontentloaded" });
|
|
443
|
+
// }
|
|
444
|
+
// for (const [stableTabId, pageInfo] of this.pages.entries()) {
|
|
445
|
+
// if (pageInfo.page === page) {
|
|
446
|
+
// this._selectedPageId = stableTabId;
|
|
447
|
+
// this.log("โ
New tab created and selected", { stableTabId, url });
|
|
448
|
+
// break;
|
|
449
|
+
// }
|
|
450
|
+
// }
|
|
451
|
+
// await this.syncState();
|
|
452
|
+
// } catch (error) {
|
|
453
|
+
// this.log("โ Error creating tab", { error });
|
|
454
|
+
// }
|
|
455
|
+
// }
|
|
456
|
+
// async closeTab(stableTabId: string): Promise<void> {
|
|
457
|
+
// try {
|
|
458
|
+
// this.log("๐๏ธ Closing tab", { stableTabId });
|
|
459
|
+
// const pageInfo = this.pages.get(stableTabId);
|
|
460
|
+
// if (pageInfo) {
|
|
461
|
+
// await pageInfo.page.close(); // This will trigger the 'close' event
|
|
462
|
+
// } else {
|
|
463
|
+
// this.log("โ ๏ธ Page not found for closing", { stableTabId });
|
|
464
|
+
// }
|
|
465
|
+
// } catch (error) {
|
|
466
|
+
// this.log("โ Error closing tab", { error });
|
|
467
|
+
// }
|
|
468
|
+
// }
|
|
469
|
+
// async selectTab(stableTabId: string): Promise<void> {
|
|
470
|
+
// try {
|
|
471
|
+
// this.log("๐ฏ Selecting tab", { stableTabId });
|
|
472
|
+
// const pageInfo = this.pages.get(stableTabId);
|
|
473
|
+
// if (pageInfo) {
|
|
474
|
+
// this._selectedPageId = stableTabId;
|
|
475
|
+
// await pageInfo.page.bringToFront();
|
|
476
|
+
// this.log("โ
Tab selected successfully", { stableTabId });
|
|
477
|
+
// await this.syncState();
|
|
478
|
+
// } else {
|
|
479
|
+
// this.log("โ ๏ธ Page not found for selection", { stableTabId });
|
|
480
|
+
// }
|
|
481
|
+
// } catch (error) {
|
|
482
|
+
// this.log("โ Error selecting tab", { error });
|
|
483
|
+
// }
|
|
484
|
+
// }
|
|
485
485
|
getPageInfo(stableTabId) {
|
|
486
486
|
if (!stableTabId) {
|
|
487
487
|
this.log("โ ๏ธ Operation requested without a selected tab");
|
|
@@ -494,73 +494,69 @@ export class RemoteBrowserService extends EventEmitter {
|
|
|
494
494
|
}
|
|
495
495
|
return pageInfo;
|
|
496
496
|
}
|
|
497
|
-
async navigateTab(stableTabId, url) {
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
this.log("โ Error navigating forward", { stableTabId, error });
|
|
561
|
-
throw error;
|
|
562
|
-
}
|
|
563
|
-
}
|
|
497
|
+
// async navigateTab(stableTabId: string, url: string): Promise<void> {
|
|
498
|
+
// const pageInfo = this.getPageInfo(stableTabId);
|
|
499
|
+
// if (!pageInfo) {
|
|
500
|
+
// return;
|
|
501
|
+
// }
|
|
502
|
+
// try {
|
|
503
|
+
// this.log("๐ Navigating tab", { stableTabId, url });
|
|
504
|
+
// await pageInfo.page.goto(url, { waitUntil: "domcontentloaded" });
|
|
505
|
+
// this._selectedPageId = stableTabId;
|
|
506
|
+
// await this.syncState();
|
|
507
|
+
// } catch (error) {
|
|
508
|
+
// this.log("โ Error navigating tab", { stableTabId, url, error });
|
|
509
|
+
// throw error;
|
|
510
|
+
// }
|
|
511
|
+
// }
|
|
512
|
+
// async reloadTab(stableTabId: string): Promise<void> {
|
|
513
|
+
// const pageInfo = this.getPageInfo(stableTabId);
|
|
514
|
+
// if (!pageInfo) {
|
|
515
|
+
// return;
|
|
516
|
+
// }
|
|
517
|
+
// try {
|
|
518
|
+
// this.log("๐ Reloading tab", { stableTabId, url: pageInfo.page.url() });
|
|
519
|
+
// await pageInfo.page.reload({ waitUntil: "domcontentloaded" });
|
|
520
|
+
// await this.syncState();
|
|
521
|
+
// } catch (error) {
|
|
522
|
+
// this.log("โ Error reloading tab", { stableTabId, error });
|
|
523
|
+
// throw error;
|
|
524
|
+
// }
|
|
525
|
+
// }
|
|
526
|
+
// async goBack(stableTabId: string): Promise<void> {
|
|
527
|
+
// const pageInfo = this.getPageInfo(stableTabId);
|
|
528
|
+
// if (!pageInfo) {
|
|
529
|
+
// return;
|
|
530
|
+
// }
|
|
531
|
+
// try {
|
|
532
|
+
// this.log("โฌ
๏ธ Navigating back", { stableTabId });
|
|
533
|
+
// const response = await pageInfo.page.goBack({ waitUntil: "domcontentloaded" });
|
|
534
|
+
// if (!response) {
|
|
535
|
+
// this.log("โน๏ธ No history entry to go back to", { stableTabId });
|
|
536
|
+
// }
|
|
537
|
+
// await this.syncState();
|
|
538
|
+
// } catch (error) {
|
|
539
|
+
// this.log("โ Error navigating back", { stableTabId, error });
|
|
540
|
+
// throw error;
|
|
541
|
+
// }
|
|
542
|
+
// }
|
|
543
|
+
// async goForward(stableTabId: string): Promise<void> {
|
|
544
|
+
// const pageInfo = this.getPageInfo(stableTabId);
|
|
545
|
+
// if (!pageInfo) {
|
|
546
|
+
// return;
|
|
547
|
+
// }
|
|
548
|
+
// try {
|
|
549
|
+
// this.log("โก๏ธ Navigating forward", { stableTabId });
|
|
550
|
+
// const response = await pageInfo.page.goForward({ waitUntil: "domcontentloaded" });
|
|
551
|
+
// if (!response) {
|
|
552
|
+
// this.log("โน๏ธ No history entry to go forward to", { stableTabId });
|
|
553
|
+
// }
|
|
554
|
+
// await this.syncState();
|
|
555
|
+
// } catch (error) {
|
|
556
|
+
// this.log("โ Error navigating forward", { stableTabId, error });
|
|
557
|
+
// throw error;
|
|
558
|
+
// }
|
|
559
|
+
// }
|
|
564
560
|
async applyClipboardPayload(payload) {
|
|
565
561
|
this.log("๐ applyClipboardPayload called", {
|
|
566
562
|
hasText: !!payload?.text,
|