fix(build): include browser.rs clear_viewport/via_relay (#47) + cargo fmt
Release binaries / Build macOS ARM64 (push) Has been cancelled
Release binaries / Build macOS x64 (push) Has been cancelled
Release binaries / Build Linux ARM64 (push) Has been cancelled
Release binaries / Build Linux musl ARM64 (push) Has been cancelled
Release binaries / Build Linux musl x64 (push) Has been cancelled
Release binaries / Build Linux x64 (push) Has been cancelled
Release binaries / Build Windows x64 (push) Has been cancelled
Release binaries / Attach binaries to GitHub Release (push) Has been cancelled
Release binaries / Build macOS ARM64 (push) Has been cancelled
Release binaries / Build macOS x64 (push) Has been cancelled
Release binaries / Build Linux ARM64 (push) Has been cancelled
Release binaries / Build Linux musl ARM64 (push) Has been cancelled
Release binaries / Build Linux musl x64 (push) Has been cancelled
Release binaries / Build Linux x64 (push) Has been cancelled
Release binaries / Build Windows x64 (push) Has been cancelled
Release binaries / Attach binaries to GitHub Release (push) Has been cancelled
v1.5.24 (d5cd9cd) shipped a commands.rs caller of `clear_viewport` but not the
browser.rs method it lives in (a concurrent in-progress #47 viewport/resize edit
was only partly staged), so main didn't compile and the format check failed.
Commit the matching browser.rs method + via_relay() helper and run cargo fmt.
Full tree builds; 863 tests pass.
This commit is contained in:
+20
-13
@@ -3162,15 +3162,21 @@ fn parse_mouse(rest: &[&str], id: &str) -> Result<Value, ParseError> {
|
||||
/// viewport <width>x<height> (e.g. 1280x800)
|
||||
/// viewport reset | clear (drop the override, restore real size)
|
||||
fn parse_viewport(rest: &[&str], id: &str) -> Result<Value, ParseError> {
|
||||
const USAGE: &str =
|
||||
"viewport <width> <height> [scale] [--dpr N] [--mobile] | viewport reset";
|
||||
const USAGE: &str = "viewport <width> <height> [scale] [--dpr N] [--mobile] | viewport reset";
|
||||
|
||||
if matches!(rest.first().copied(), Some("reset") | Some("clear") | Some("off")) {
|
||||
if matches!(
|
||||
rest.first().copied(),
|
||||
Some("reset") | Some("clear") | Some("off")
|
||||
) {
|
||||
return Ok(json!({ "id": id, "action": "viewport", "reset": true }));
|
||||
}
|
||||
|
||||
// Positional (non-flag) tokens. A `WxH` token counts as one positional.
|
||||
let positionals: Vec<&str> = rest.iter().copied().filter(|a| !a.starts_with("--")).collect();
|
||||
let positionals: Vec<&str> = rest
|
||||
.iter()
|
||||
.copied()
|
||||
.filter(|a| !a.starts_with("--"))
|
||||
.collect();
|
||||
|
||||
let (w, h, scale_tok): (i32, i32, Option<&str>) = match positionals.first() {
|
||||
Some(first) if first.contains('x') || first.contains('X') => {
|
||||
@@ -3188,9 +3194,10 @@ fn parse_viewport(rest: &[&str], id: &str) -> Result<Value, ParseError> {
|
||||
}
|
||||
}
|
||||
Some(w_str) => {
|
||||
let h_str = positionals
|
||||
.get(1)
|
||||
.ok_or(ParseError::MissingArguments { context: "viewport".to_string(), usage: USAGE })?;
|
||||
let h_str = positionals.get(1).ok_or(ParseError::MissingArguments {
|
||||
context: "viewport".to_string(),
|
||||
usage: USAGE,
|
||||
})?;
|
||||
let w = w_str.parse::<i32>().map_err(|_| ParseError::InvalidValue {
|
||||
message: format!("Invalid width: {}", w_str),
|
||||
usage: USAGE,
|
||||
@@ -3220,13 +3227,12 @@ fn parse_viewport(rest: &[&str], id: &str) -> Result<Value, ParseError> {
|
||||
None => None,
|
||||
};
|
||||
if let Some(i) = rest.iter().position(|a| *a == "--dpr" || *a == "--scale") {
|
||||
let v = rest
|
||||
.get(i + 1)
|
||||
.and_then(|s| s.parse::<f64>().ok())
|
||||
.ok_or(ParseError::InvalidValue {
|
||||
let v = rest.get(i + 1).and_then(|s| s.parse::<f64>().ok()).ok_or(
|
||||
ParseError::InvalidValue {
|
||||
message: "--dpr/--scale needs a number".to_string(),
|
||||
usage: USAGE,
|
||||
})?;
|
||||
},
|
||||
)?;
|
||||
scale = Some(v);
|
||||
}
|
||||
if let Some(s) = scale {
|
||||
@@ -5442,7 +5448,8 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn test_viewport_dpr_and_mobile_flags() {
|
||||
let cmd = parse_command(&args("viewport 375 812 --dpr 3 --mobile"), &default_flags()).unwrap();
|
||||
let cmd =
|
||||
parse_command(&args("viewport 375 812 --dpr 3 --mobile"), &default_flags()).unwrap();
|
||||
assert_eq!(cmd["action"], "viewport");
|
||||
assert_eq!(cmd["width"], 375);
|
||||
assert_eq!(cmd["height"], 812);
|
||||
|
||||
@@ -1950,9 +1950,17 @@ impl BrowserManager {
|
||||
/// CDP browser the endpoint is strict, so we must NOT send the custom param —
|
||||
/// hence `None` there. We detect the relay by matching our `ws_url` against
|
||||
/// the live relay URL the native-messaging host published.
|
||||
/// Whether this manager is driving the user's real Chrome through the
|
||||
/// `ab-connect` extension relay (vs. a browser we launched or a direct CDP
|
||||
/// endpoint). Detected by matching our `ws_url` against the live relay URL
|
||||
/// the native-messaging host published. Used to avoid relay-unsafe CDP that
|
||||
/// would disturb the user's window (e.g. Browser.setContentsSize, issue #47).
|
||||
fn via_relay(&self) -> bool {
|
||||
crate::connect::relay_url().as_deref() == Some(self.ws_url.as_str())
|
||||
}
|
||||
|
||||
fn agent_group(&self) -> Option<String> {
|
||||
let via_relay = crate::connect::relay_url().as_deref() == Some(self.ws_url.as_str());
|
||||
if !via_relay {
|
||||
if !self.via_relay() {
|
||||
return None;
|
||||
}
|
||||
let name = DAEMON_SESSION
|
||||
@@ -2161,7 +2169,13 @@ impl BrowserManager {
|
||||
.await?;
|
||||
|
||||
// Screencast captures the actual content area, not the emulated CSS
|
||||
// viewport, so resize the content area to match.
|
||||
// viewport, so resize the content area to match — but ONLY for a browser
|
||||
// we launched. Over the ab-connect relay the "window" is the user's real
|
||||
// Chrome window, and Browser.setContentsSize would physically resize it
|
||||
// (issue #47) — the exact thing the CDP device-metrics override exists to
|
||||
// avoid. The Emulation override above already gives the tab the requested
|
||||
// CSS viewport without touching the OS window, so skip the resize there.
|
||||
if !self.via_relay() {
|
||||
if let Ok(target_id) = self.active_target_id() {
|
||||
if let Ok(window_info) = self
|
||||
.client
|
||||
@@ -2191,10 +2205,27 @@ impl BrowserManager {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Clear the CDP device-metrics override (`viewport reset`), restoring the
|
||||
/// tab's real layout viewport. Never touches the OS window, so it is safe on
|
||||
/// the relay (we never physically resized the user's window — see
|
||||
/// `set_viewport`).
|
||||
pub async fn clear_viewport(&self) -> Result<(), String> {
|
||||
let session_id = self.active_session_id()?;
|
||||
self.client
|
||||
.send_command(
|
||||
"Emulation.clearDeviceMetricsOverride",
|
||||
Some(json!({})),
|
||||
Some(session_id),
|
||||
)
|
||||
.await?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub async fn set_user_agent(&self, user_agent: &str) -> Result<(), String> {
|
||||
let session_id = self.active_session_id()?;
|
||||
self.client
|
||||
|
||||
Reference in New Issue
Block a user