zendriver 0.2.21

Async-first, undetectable browser automation via the Chrome DevTools Protocol
Documentation
# Changelog

All notable changes to this crate documented here. Format: [Keep a
Changelog](https://keepachangelog.com/en/1.1.0/). Adheres to [SemVer](https://semver.org/).

## [Unreleased]

## [0.2.21] - 2026-07-16

### Added

- Add split_proxy_url helper for per-context proxy config
- Add BrowserContextBuilder with per-context proxy credentials
- Auto-install per-context proxy auth on each context tab
- Unregister proxy credentials on BrowserContext drop

### Fixed

- Decode + redact proxy userinfo, default socks port, guard one-actor invariant


## [0.2.20] - 2026-07-16


## [0.2.19] - 2026-07-15

### Added

- Resolve the WS endpoint from DevToolsActivePort as a fallback
- Discover per-user %LOCALAPPDATA% chrome installs on windows

### Fixed

- Bound the CDP handshake and kill the child on timeout
- Send CDP Browser.close before falling back to signals
- Sweep stray page targets instead of silently discarding them
- Kill chrome's whole process tree via a windows job object
- Gate the owning-browser test helper to unix like its callers
- Bound every CDP call, not just the launch handshake
- Stop exec'ing `chrome --version` on Windows, where it never exits
- Stop crying wolf on the initial target attach


## [0.2.18] - 2026-07-12


## [0.2.17] - 2026-07-10


## [0.2.16] - 2026-07-10

### Fixed

- Hide navigator.webdriver in the native profile


## [0.2.15] - 2026-06-13


## [0.2.14] - 2026-06-03


## [0.2.13] - 2026-06-03

### Added

- Opt-in tracker/fingerprinter blocklist ([#51](https://github.com/TurtIeSocks/zendriver-rs/pull/51))


## [0.2.12] - 2026-06-03

### Added

- Native-function toString masking (full + cross-realm) ([#49](https://github.com/TurtIeSocks/zendriver-rs/pull/49))


## [0.2.11] - 2026-06-03

### Added

- Opt-in stuck-request eviction for wait_for_idle (max_inflight_age)

### Fixed

- Start initial tab on about:blank to fix flaky wait_for_idle


## [0.2.10] - 2026-06-03

### Added

- BrowserBuilder::geo_locale (geo feature)


## [0.2.9] - 2026-06-03

### Added

- Warn when a pinned Chrome major leaks Accept-Encoding


## [0.2.8] - 2026-06-03


## [0.2.7] - 2026-06-02

### Added

- Wire Tab::datadome() + re-exports + error mapping behind the datadome feature

### Changed

- TimedOut is an Outcome, not an Error (unify result model)
- TimedOut is an Outcome, not an Error (unify result model)


## [0.2.6] - 2026-06-02


## [0.2.5] - 2026-06-02


## [0.2.4] - 2026-06-02

### Added

- PredicateSet types + CSS compilation
- Predicate JS post-filter compilation
- ConflictingSelectors variant
- Predicate methods on FindBuilder
- Predicate methods on FindAllBuilder
- Predicate resolution + mixing guard at terminal
- Select/select_all CSS aliases on Tab/Frame/Element

### Changed

- Simplify resolver match, drop dead helper, doc attr-name safety


## [0.2.3] - 2026-06-02

### Added

- Persona::from_browser live-probe via JsProbe trait
- Browser builder .persona/.persona_overlay/.surface
- Persist persona seed alongside user_data_dir


## [0.2.2] - 2026-06-02


## [0.2.1] - 2026-06-02

### Added

- Tier 2 tools — chords, download, runtime-UA, fine stealth, modify_response, frame nav/load waits (Phase B)


## [0.2.0] - 2026-06-02

### Added

- Full nodriver / zendriver-py parity — phases P-A…P-E ([#17](https://github.com/TurtIeSocks/zendriver-rs/pull/17))


### Added

- `Browser::reconnect()` — re-establish a dropped connection to the same still-running Chrome process (re-dials the surviving `/devtools/browser/<id>` endpoint on the existing `Connection`, re-arms `Target.setAutoAttach{flatten:true}` so stealth re-injects, refreshes the tab registry). Scoped v1: existing `Tab`/`Frame`/`Element` handles are **invalidated** — re-acquire via `tabs()` (not `main_tab()`, which still returns the stale handle). Per-feature domain re-arm (`Network.enable`, `Fetch` rules, etc.) and transparent handle-preserving reconnect are deferred.

### Changed

- An unexpected WebSocket drop (Chrome died / socket severed) now surfaces in-flight CDP calls as the new distinct `ZendriverError::Disconnected` variant, instead of the opaque shutdown error used for a clean `close()`. Long-running callers can now tell "connection lost" apart from "I closed it" and recover via `Browser::reconnect()`.

## [0.1.4] - 2026-06-01

### Added

- Add BrowserContext skeleton
- BrowserInner::dispose_browser_context
- Drop for BrowserContext schedules dispose
- Browser::create_browser_context[_with]
- BrowserContext::new_tab[_at] threads browserContextId


### Added

- `Browser::create_browser_context` and `Browser::create_browser_context_with(proxy_server, proxy_bypass_list)` — high-level wrappers around CDP `Target.createBrowserContext` for per-context proxy and storage isolation.
- `BrowserContext` RAII guard with `new_tab` / `new_tab_at` (threads `browserContextId` into `Target.createTarget`) and a `Drop` impl that schedules `Target.disposeBrowserContext` via the underlying connection.
- `examples/browser_context_isolation` demonstrating per-context proxy bindings against a rotating upstream.


## [0.1.3] - 2026-05-26

### Added

- Scaffold zendriver-imperva crate
- Wire imperva feature into parent crate


## [0.1.2] - 2026-05-25

### Fixed

- Repair stealth + cloudflare nightly tests against drift


## [0.1.1] - 2026-05-25

### Changed

- Split workspace.package.version into per-crate versions ([#5](https://github.com/TurtIeSocks/zendriver-rs/pull/5))