fix(fill/tabs): dispatch real input/change/blur (#25); close <tab> wording + chrome-use current (#26)
#25 — fill() didn't fire the events framework inputs / site autocomplete need: it set value directly (bypassing React's value-tracker) and typed via Input.insertText, so controlled components and input/change/blur listeners (e.g. Mercari's postal-code → 都道府県 lookup) never ran though the value showed. fill now emulates a real edit: focus, set through the element's prototype value setter (React _valueTracker registers), then dispatch input → input → change → blur/ focusout. SELECT and contenteditable handled too. type <sel> <text> remains for per-keystroke sites. Verified live: an input wired with input/change/blur fired 'IICB' from one fill. #26 (ergonomics): - 'close <tab>' now closes just that tab and prints 'Tab [tN] closed'; bare 'close' still closes the browser. Previously 'close t12' ran a browser close and alarmingly printed 'Browser closed'. - new 'chrome-use current': prints the active tab's stable handle (tabId + CDP targetId + url/title), refreshed live — so an agent holds the targetId (which survives cross-process nav) instead of re-deriving 'which tab is live' from 'tabs' every step. The deeper tab-id churn is the #21/#23 stable-targetId story. Tests cover fill events (live), close tab-vs-browser parse, and current.
This commit is contained in:
@@ -1395,6 +1395,7 @@ pub async fn execute_command(cmd: &Value, state: &mut DaemonState) -> Value {
|
||||
"count" => handle_count(cmd, state).await,
|
||||
"styles" => handle_styles(cmd, state).await,
|
||||
"bringtofront" => handle_bringtofront(state).await,
|
||||
"current" => handle_current(state).await,
|
||||
"timezone" => handle_timezone(cmd, state).await,
|
||||
"locale" => handle_locale(cmd, state).await,
|
||||
"geolocation" => handle_geolocation(cmd, state).await,
|
||||
@@ -5333,6 +5334,18 @@ async fn handle_bringtofront(state: &DaemonState) -> Result<Value, String> {
|
||||
Ok(json!({ "broughtToFront": true }))
|
||||
}
|
||||
|
||||
async fn handle_current(state: &mut DaemonState) -> Result<Value, String> {
|
||||
let mgr = state.browser.as_mut().ok_or("Browser not launched")?;
|
||||
// Refresh so `current` reflects the live URL/title even after a cross-process
|
||||
// nav (the relay's cached target_info can lag) (#26).
|
||||
mgr.resync_targets().await.ok();
|
||||
let mut info = mgr.active_page_info().ok_or("No active tab")?;
|
||||
if let Some(obj) = info.as_object_mut() {
|
||||
obj.insert("current".to_string(), json!(true));
|
||||
}
|
||||
Ok(info)
|
||||
}
|
||||
|
||||
async fn handle_timezone(cmd: &Value, state: &DaemonState) -> Result<Value, String> {
|
||||
let mgr = state.browser.as_ref().ok_or("Browser not launched")?;
|
||||
let timezone = cmd
|
||||
|
||||
Reference in New Issue
Block a user