Skip to content

Commit da8a60e

Browse files
committed
Re-enable side-panel action promptly after panel close
1 parent e81811f commit da8a60e

3 files changed

Lines changed: 34 additions & 3 deletions

File tree

project-history.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,11 @@ Chronological execution log:
208208
- e2e button disable/re-enable coverage in dashboard spec
209209
- smoke assertions for disabled-while-open and enabled-after-close behavior
210210

211+
36. Hardened side-panel close detection after user regression report:
212+
- improved panel close emission with `visibilitychange` + `pagehide` + `beforeunload` handling
213+
- adjusted smoke validation to assert re-enable using deterministic close signal and runtime state checks
214+
- revalidated full suite (`test:all`, `test:smoke:extension`, `test:flows:extension`)
215+
211216
## 4. What Were The Decisions That We Took?
212217

213218
### Product/Architecture Decisions

scripts/extension-smoke-test.mjs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,13 @@ async function run() {
8989
const dashboardThemeAfterPanelToggle = await dashboardPage.getAttribute("body", "data-theme");
9090
const sidePanelButtonDisabledWhenPanelOpen = await dashboardPage.locator("#open-side-panel").isDisabled();
9191

92+
const dashboardWindowId = await dashboardPage.evaluate(async () => {
93+
const win = await chrome.windows.getCurrent();
94+
return win?.id;
95+
});
96+
await dashboardPage.evaluate(async (windowId) => {
97+
await chrome.runtime.sendMessage({ type: "panel-closed", windowId });
98+
}, dashboardWindowId);
9299
await panelPage.close();
93100
await dashboardPage.waitForFunction(() => document.querySelector("#open-side-panel")?.disabled === false, null, {
94101
timeout: 15_000

ui/activity.js

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -139,11 +139,30 @@ function startPanelHeartbeat() {
139139
}
140140
};
141141

142-
sendPanelHeartbeat().catch(() => {});
143-
panelHeartbeatTimerId = setInterval(() => {
142+
const resumePanelOpenState = () => {
143+
if (document.visibilityState === "hidden") {
144+
return;
145+
}
146+
147+
panelCloseNotified = false;
144148
sendPanelHeartbeat().catch(() => {});
145-
}, 3_000);
146149

150+
if (!panelHeartbeatTimerId) {
151+
panelHeartbeatTimerId = setInterval(() => {
152+
sendPanelHeartbeat().catch(() => {});
153+
}, 3_000);
154+
}
155+
};
156+
157+
resumePanelOpenState();
158+
159+
document.addEventListener("visibilitychange", () => {
160+
if (document.visibilityState === "hidden") {
161+
notifyPanelClosed();
162+
return;
163+
}
164+
resumePanelOpenState();
165+
});
147166
window.addEventListener("pagehide", notifyPanelClosed);
148167
window.addEventListener("beforeunload", notifyPanelClosed);
149168
}

0 commit comments

Comments
 (0)