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 <width>x<height> (e.g. 1280x800)
|
||||||
/// viewport reset | clear (drop the override, restore real size)
|
/// viewport reset | clear (drop the override, restore real size)
|
||||||
fn parse_viewport(rest: &[&str], id: &str) -> Result<Value, ParseError> {
|
fn parse_viewport(rest: &[&str], id: &str) -> Result<Value, ParseError> {
|
||||||
const USAGE: &str =
|
const USAGE: &str = "viewport <width> <height> [scale] [--dpr N] [--mobile] | viewport reset";
|
||||||
"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 }));
|
return Ok(json!({ "id": id, "action": "viewport", "reset": true }));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Positional (non-flag) tokens. A `WxH` token counts as one positional.
|
// 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() {
|
let (w, h, scale_tok): (i32, i32, Option<&str>) = match positionals.first() {
|
||||||
Some(first) if first.contains('x') || first.contains('X') => {
|
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) => {
|
Some(w_str) => {
|
||||||
let h_str = positionals
|
let h_str = positionals.get(1).ok_or(ParseError::MissingArguments {
|
||||||
.get(1)
|
context: "viewport".to_string(),
|
||||||
.ok_or(ParseError::MissingArguments { context: "viewport".to_string(), usage: USAGE })?;
|
usage: USAGE,
|
||||||
|
})?;
|
||||||
let w = w_str.parse::<i32>().map_err(|_| ParseError::InvalidValue {
|
let w = w_str.parse::<i32>().map_err(|_| ParseError::InvalidValue {
|
||||||
message: format!("Invalid width: {}", w_str),
|
message: format!("Invalid width: {}", w_str),
|
||||||
usage: USAGE,
|
usage: USAGE,
|
||||||
@@ -3220,13 +3227,12 @@ fn parse_viewport(rest: &[&str], id: &str) -> Result<Value, ParseError> {
|
|||||||
None => None,
|
None => None,
|
||||||
};
|
};
|
||||||
if let Some(i) = rest.iter().position(|a| *a == "--dpr" || *a == "--scale") {
|
if let Some(i) = rest.iter().position(|a| *a == "--dpr" || *a == "--scale") {
|
||||||
let v = rest
|
let v = rest.get(i + 1).and_then(|s| s.parse::<f64>().ok()).ok_or(
|
||||||
.get(i + 1)
|
ParseError::InvalidValue {
|
||||||
.and_then(|s| s.parse::<f64>().ok())
|
|
||||||
.ok_or(ParseError::InvalidValue {
|
|
||||||
message: "--dpr/--scale needs a number".to_string(),
|
message: "--dpr/--scale needs a number".to_string(),
|
||||||
usage: USAGE,
|
usage: USAGE,
|
||||||
})?;
|
},
|
||||||
|
)?;
|
||||||
scale = Some(v);
|
scale = Some(v);
|
||||||
}
|
}
|
||||||
if let Some(s) = scale {
|
if let Some(s) = scale {
|
||||||
@@ -5442,7 +5448,8 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_viewport_dpr_and_mobile_flags() {
|
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["action"], "viewport");
|
||||||
assert_eq!(cmd["width"], 375);
|
assert_eq!(cmd["width"], 375);
|
||||||
assert_eq!(cmd["height"], 812);
|
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 —
|
/// 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
|
/// hence `None` there. We detect the relay by matching our `ws_url` against
|
||||||
/// the live relay URL the native-messaging host published.
|
/// 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> {
|
fn agent_group(&self) -> Option<String> {
|
||||||
let via_relay = crate::connect::relay_url().as_deref() == Some(self.ws_url.as_str());
|
if !self.via_relay() {
|
||||||
if !via_relay {
|
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
let name = DAEMON_SESSION
|
let name = DAEMON_SESSION
|
||||||
@@ -2161,7 +2169,13 @@ impl BrowserManager {
|
|||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
// Screencast captures the actual content area, not the emulated CSS
|
// 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(target_id) = self.active_target_id() {
|
||||||
if let Ok(window_info) = self
|
if let Ok(window_info) = self
|
||||||
.client
|
.client
|
||||||
@@ -2191,10 +2205,27 @@ impl BrowserManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Ok(())
|
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> {
|
pub async fn set_user_agent(&self, user_agent: &str) -> Result<(), String> {
|
||||||
let session_id = self.active_session_id()?;
|
let session_id = self.active_session_id()?;
|
||||||
self.client
|
self.client
|
||||||
|
|||||||
Reference in New Issue
Block a user