fix: open an approval window while another one has focus (closes #290)
The background centred each approval window on the last focused window, which could be an earlier approval window still open; headless Chrome reports one as 1280x720, the browser refused the resulting position, and the request failed with no window. It now centres only on a browser window, and when the browser refuses a position it asks again without one. In the Chrome suite a test could raise its prompt while the previous test's window was still closing. After a passed test the runner now gives approval windows five seconds to close and fails the test if one is still open; after a failed test it closes them. Model: opus-5-5
This commit was merged in pull request #453.
This commit is contained in:
+22
-3
@@ -437,7 +437,13 @@ async function openApprovalWindow(id) {
|
||||
width: popupWidth,
|
||||
height: popupHeight,
|
||||
};
|
||||
if (currentWin) {
|
||||
// Centred on a browser window only. The last focused window can be
|
||||
// another approval window still open, and centring on one can give a
|
||||
// position the browser refuses ("Bounds must be at least 50% within
|
||||
// visible screen space"): headless Chrome reports this 360x600 popup as
|
||||
// 1280x720. The request then failed with no window at all. Over a popup,
|
||||
// the browser picks the position.
|
||||
if (currentWin && currentWin.type === "normal") {
|
||||
opts.left = Math.round(
|
||||
currentWin.left + (currentWin.width - popupWidth) / 2,
|
||||
);
|
||||
@@ -455,10 +461,23 @@ async function openApprovalWindow(id) {
|
||||
win = await windowsCreate(opts);
|
||||
} catch (e) {
|
||||
// The promise namespace reports the failure by rejecting where the
|
||||
// callback namespace reported it by handing back no window; both land
|
||||
// on the !win branch below, which settles the approval.
|
||||
// callback namespace reported it by handing back no window; both
|
||||
// leave win null.
|
||||
log.errorf("could not open the approval window:", e);
|
||||
}
|
||||
// The browser also refuses a centred position that is too far off screen,
|
||||
// as it is over a browser window near the screen edge. Asked again
|
||||
// without a position, it places the window itself. If that fails too,
|
||||
// the !win branch below settles the approval.
|
||||
if (!win && opts.left !== undefined) {
|
||||
delete opts.left;
|
||||
delete opts.top;
|
||||
try {
|
||||
win = await windowsCreate(opts);
|
||||
} catch (e) {
|
||||
log.errorf("could not open the approval window:", e);
|
||||
}
|
||||
}
|
||||
|
||||
const approval = pendingApprovals[id];
|
||||
if (!approval) {
|
||||
|
||||
Reference in New Issue
Block a user