fix: inherit viewport dimensions in recording context (#1208)

* fix: inherit viewport dimensions in recording context

When `record start` creates a new browser context, it now re-applies the
current viewport settings (from `set viewport` or `set device`) so the
recording resolution matches what the user configured instead of falling
back to the default 1280×720.

Closes #1207

* style: apply cargo fmt to e2e test

* chore: remove obvious comments

* chore: remove obvious comments from e2e test

---------

Co-authored-by: hyunjinee <leehj0110@kakao.com>
This commit is contained in:
jin.2
2026-04-13 23:40:26 -05:00
committed by GitHub
co-authored by hyunjinee
parent ddf6d6a2af
commit db29d5fead
2 changed files with 97 additions and 2 deletions
+81
View File
@@ -4127,3 +4127,84 @@ async fn e2e_upload_with_css_selector() {
let resp = execute_command(&json!({ "id": "99", "action": "close" }), &mut state).await;
assert_success(&resp);
}
// ---------------------------------------------------------------------------
// Recording: viewport inheritance
// ---------------------------------------------------------------------------
/// Verify that `recording_start` inherits the current viewport dimensions
/// into the newly created recording context. Without this, the recording
/// context falls back to the default 1280×720 regardless of what the user set.
#[tokio::test]
#[ignore]
async fn e2e_recording_inherits_viewport() {
let mut state = DaemonState::new();
let resp = execute_command(
&json!({ "id": "1", "action": "launch", "headless": true }),
&mut state,
)
.await;
assert_success(&resp);
let resp = execute_command(
&json!({ "id": "2", "action": "navigate", "url": "data:text/html,<h1>Viewport</h1>" }),
&mut state,
)
.await;
assert_success(&resp);
let resp = execute_command(
&json!({ "id": "3", "action": "viewport", "width": 800, "height": 600 }),
&mut state,
)
.await;
assert_success(&resp);
let tmp_dir = std::env::temp_dir();
let rec_path = tmp_dir.join(format!("ab-e2e-rec-viewport-{}.webm", std::process::id()));
let resp = execute_command(
&json!({ "id": "4", "action": "recording_start", "path": rec_path.to_string_lossy() }),
&mut state,
)
.await;
assert_success(&resp);
tokio::time::sleep(tokio::time::Duration::from_millis(500)).await;
let resp = execute_command(
&json!({ "id": "5", "action": "evaluate", "script": "window.innerWidth" }),
&mut state,
)
.await;
assert_success(&resp);
let rec_width = get_data(&resp)["result"].as_i64().unwrap();
let resp = execute_command(
&json!({ "id": "6", "action": "evaluate", "script": "window.innerHeight" }),
&mut state,
)
.await;
assert_success(&resp);
let rec_height = get_data(&resp)["result"].as_i64().unwrap();
assert_eq!(
rec_width, 800,
"Recording context width should be 800 (inherited from viewport), got {rec_width}"
);
assert_eq!(
rec_height, 600,
"Recording context height should be 600 (inherited from viewport), got {rec_height}"
);
let resp = execute_command(
&json!({ "id": "7", "action": "recording_stop" }),
&mut state,
)
.await;
assert_success(&resp);
let _ = std::fs::remove_file(&rec_path);
let resp = execute_command(&json!({ "id": "99", "action": "close" }), &mut state).await;
assert_success(&resp);
}