Upgrade to WGPU v29 + AnyRender 0.10 (+ font embolden)#428
Conversation
1d18d0b to
d5e749c
Compare
|
@nicoburns want me to fix the wasm build? |
d5e749c to
6b5d62f
Compare
|
@nicoburns The Build wasm examples failure is caused by a duplicate The immediate fix is a A cleaner structural fix: add the wasm examples to the root workspace as non-default members. # root Cargo.toml
[workspace]
members = [
# ... existing members ...
"examples/wasm_hello",
"examples/wasm_7guis",
]
default-members = [
# ... existing default members, excluding the wasm examples ...
]With this, the examples inherit |
|
@tonybierman I think it's just that I didn't upgrade to matching anyrender versions there. Was there a reason why the wasm examples aren't in the workspace? Or could we look at moving them into the workspace (where they'd pick up the workspace versions by default)? |
|
@nicoburns I can add the wasm examples to the root workspace as non-default members. See my detailed comment above. |
|
Non-default members makes sense for wasm examples I think |
4a1cd11 to
daf731e
Compare
Signed-off-by: Nico Burns <nico@nicoburns.com>
Signed-off-by: Nico Burns <nico@nicoburns.com>
65fb152 to
cb5daf6
Compare
* fix: check for visibility changes for damage (DioxusLabs#343) * Port Mustang, Scripting, and Forms; Add branding and docs * Use shared `SourceCache` for thread-local fontique `Collection`s * Fix stale node references after node removal When nodes are removed: - Clear hover_node_id if it was set to the node being remove - Clear active_node_id if it was set to the node being removed - Remove snapshots for removed nodes to prevent stale snapshot panics Co-Authored-By: Nico Burns <nico@nicoburns.com> * Set restyle hint when updating style attribute Fixes DioxusLabs#345 * Upgrade to Parley with icu4x + core-text font enumeration * Enable multithreading in Stylo * Use if-let in process_preorder * Run stylo gc Signed-off-by: Nico Burns <nico@nicoburns.com> * Add mimalloc feature to browser app Signed-off-by: Nico Burns <nico@nicoburns.com> * Upgrade to Stylo 0.12 Signed-off-by: Nico Burns <nico@nicoburns.com> * Fix min-content size of text inputs * Don't make new windows visible until after AccessKit has initialized (DioxusLabs#350) Signed-off-by: Nico Burns <nico@nicoburns.com> * Fix google image * Upgrade comrak to 0.50 Signed-off-by: Nico Burns <nico@nicoburns.com> * Upgrade Skrifa to 0.37 * cargo update Signed-off-by: Nico Burns <nico@nicoburns.com> * Implement CSS `caret-color` property Signed-off-by: Nico Burns <nico@nicoburns.com> * chore: move from print to tracing (DioxusLabs#356) * Fix unused_variable warnings with tracing feature disabled Signed-off-by: Nico Burns <nico@nicoburns.com> * Add support text-indent (bump Parley) Signed-off-by: Nico Burns <nico@nicoburns.com> * Move text_indent computation down to right before it's use to avoid (DioxusLabs#360) wasted work when the early exit fires. (Also keeps the variable definition next to its usage) Use GenericTextIdent::zero() instead of manually constructing the default so verbosely Changed unwrap_or to unwrap_or_else to avoid eagerly constructing the default value on every call * Feature/errors in browser UI (DioxusLabs#361) * Move text_indent computation down to right before it's use to avoid wasted work when the early exit fires. (Also keeps the variable definition next to its usage) Use GenericTextIdent::zero() instead of manually constructing the default so verbosely Changed unwrap_or to unwrap_or_else to avoid eagerly constructing the default value on every call * Show errors in the UI I opened a page, has mistyped the url and wondered why nothing happened, until I checked the logs. Admittedly this is not nice, but it's something and a base for discussion. * PR feedback * Implement the view-source menu-item from DioxusLabs#363 (DioxusLabs#364) * Implement the view-source menu-item from DioxusLabs#363 This allows to, well, view the source code of the current document. Trade-Off: We store the entire source as a Signal<String> ... an alternative would be to refetch it. * PR feedback * BrowserUI: tweak menu styling * Add word-spacing. (DioxusLabs#367) Co-authored-by: Austin M. Reppert <austinmreppert@protonmail.com> * Feature/capture screenshot (DioxusLabs#365) * Implement the view-source menu-item from DioxusLabs#363 This allows to, well, view the source code of the current document. Trade-Off: We store the entire source as a Signal<String> ... an alternative would be to refetch it. * Implement the "capture screenshot" menu-item from DioxusLabs#363 * PR feedback * Make rfd optional and only enable it on desktop platforms (hopefully... just winged that, have no ios/android experience) * Use async file dialog (fixes crash on macos) Signed-off-by: Nico Burns <nico@nicoburns.com> * Make rfd dependency optional Signed-off-by: Nico Burns <nico@nicoburns.com> --------- Signed-off-by: Nico Burns <nico@nicoburns.com> Co-authored-by: Nico Burns <nico@nicoburns.com> * BrowserUI: Split screenshot functionality into separate module * BrowserUI: Fix styles when building with dx dx's style preprocessing seems to choke on the commented out code. * BrowserUI: tweak mobile styling * cargo fmt * Draw borders with the same color in single bezpath. (DioxusLabs#366) * Draw adjacent borders with the same color in single bezpath. * Avoid unnecessary deref. * Avoid duplicate draw. * Handle wraparound case. * Handle non-adjacent edges touching. --------- Co-authored-by: Austin M. Reppert <austinmreppert@protonmail.com> * BrowserUI: fix build with screenshot feature disabled * Track critical resources (prevent Flash Of Unstyled Content) * Remove duplicate paint call * Bump parley Signed-off-by: Nico Burns <nico@nicoburns.com> * Add support for the `direction` property. This implements support for block-level boxes. Implementation: DioxusLabs/taffy#906 * Implement naive text-transform (uppercase and lowercase) * Update MainActivity.kt (DioxusLabs#378) * WASM compile fixes (DioxusLabs#379) Signed-off-by: Nico Burns <nico@nicoburns.com> * Support `scale`, `rotate`, and `translate` properties (DioxusLabs#380) * Support individual scale,rotate,translate properties Signed-off-by: Nico Burns <nico@nicoburns.com> * Revert to resolving transform during paint --------- Signed-off-by: Nico Burns <nico@nicoburns.com> * Bump Taffy (&LayoutInput cache key) Signed-off-by: Nico Burns <nico@nicoburns.com> * Log perf in "just browser" command * Upgrade Stylo to 0.13 * Upgrade Stylo to 0.14 * Fix tests post Stylo 0.14 upgrade * Upgrade AnyRender 0.8 (WGPU v28) (+bump MSRV to 1.92) (DioxusLabs#382) Signed-off-by: Nico Burns <nico@nicoburns.com> * BrowserUI: AnyRender Scene capture (DioxusLabs#369) * BrowserUI: Implement AnyRender Scene capture * Use .scene extension when recording scenes Signed-off-by: Nico Burns <nico@nicoburns.com> --------- Signed-off-by: Nico Burns <nico@nicoburns.com> * Bump parley Signed-off-by: Nico Burns <nico@nicoburns.com> * Bump Parley (0.8.0 + floats) Signed-off-by: Nico Burns <nico@nicoburns.com> * Remove outdated allow(dead_code) Signed-off-by: Nico Burns <nico@nicoburns.com> * Filter out comments when constructing layout tree (fixes DioxusLabs#387) Co-Authored-By: Tristan Phease <tristan.phease@gmail.com> * Implement Apple Standard Keybindings (DioxusLabs#388) Signed-off-by: Nico Burns <nico@nicoburns.com> * Use Taffy v0.10.0 from crates.io Signed-off-by: Nico Burns <nico@nicoburns.com> * Upgrade Stylo to v0.15.0 Signed-off-by: Nico Burns <nico@nicoburns.com> * Upgrade Parley (macoOS CJK fix) * Fix get_client_bounding_rect method. Previously it was returning the width in place of the height Signed-off-by: Nico Burns <nico@nicoburns.com> * Upgrade Stylo v0.16.0 Signed-off-by: Nico Burns <nico@nicoburns.com> * Bump Parley (float PR fixes) * Fix backspace deleting two characters on macos Signed-off-by: Nico Burns <nico@nicoburns.com> * Disable zip for WPT archive Signed-off-by: Nico Burns <nico@nicoburns.com> * Add BaseDocument::set_media_type for paged/print use cases (DioxusLabs#390) * Allow configuring the CSS media type on BaseDocument Previously `make_device` hardcoded `MediaType::screen()`, so `@media print` rules were never applied — which blocks PDF / print-styled rendering on top of Blitz. Add `DocumentConfig::media_type`, store the resolved `MediaType` on `BaseDocument`, and expose `media_type()` / `set_media_type()` so callers can switch media types at runtime (rebuilding the stylist device). * Take MediaType by value in make_device Every caller now has a concrete MediaType to pass (resolved from DocumentConfig during construction, or read from self.media_type afterwards), so wrapping it in Option just added noise and a hidden default-to-screen path that the non-construction callers would never intentionally hit. * Bump Taffy to v0.10.1 Signed-off-by: Nico Burns <nico@nicoburns.com> * Trigger WPT results update Signed-off-by: Nico Burns <nico@nicoburns.com> * Make trigger job depend on wpt job Signed-off-by: Nico Burns <nico@nicoburns.com> * Fix clippy lints (rust 1.95) Signed-off-by: Nico Burns <nico@nicoburns.com> * CI: fix small typo to trigger CI Signed-off-by: Nico Burns <nico@nicoburns.com> * Publish WPT results to Github Pages Signed-off-by: Nico Burns <nico@nicoburns.com> * Set permissions for deploying to Github Pages Signed-off-by: Nico Burns <nico@nicoburns.com> * CI: Calculate WPT score summary Signed-off-by: Nico Burns <nico@nicoburns.com> * CI: Diff WPT with main Signed-off-by: Nico Burns <nico@nicoburns.com> * Only upload to Github Pages on the main branch Signed-off-by: Nico Burns <nico@nicoburns.com> * feat(table): support rowspan attribute on td/th (DioxusLabs#395) * examples: add rowspan minimal reproduction fixture Demonstrates the current broken behavior where <td rowspan=2> is rendered as span=1, causing cells in row 3 to overlap or shift unexpectedly. * feat(table): support rowspan attribute on td/th The `<td rowspan=N>` / `<th rowspan=N>` attribute was ignored because `grid_row.end` was hardcoded to `span(1)`. This caused cells in later rows to overlap with or shift around rowspan cells from earlier rows. Fix: - Parse `rowspan` on cell nodes, clamped to [1, 65534] per HTML Standard. - Apply it to `grid_row` span. - Switch `grid_column.start` to `auto` so that cells use Taffy's grid auto-placement for column positioning. - Set `grid_auto_flow: RowDense` on the table root. The `dense` auto-flow is required because the default (sparse) flow holds a per-item secondary-axis cursor across rows in `place_definite_secondary_axis_item`. With sparse flow, a cell in row N+1 would start its column search after wherever the previous cell ended, rather than restarting from the first track of its own row. That makes it impossible to backfill columns left empty by rowspan cells from earlier rows. The `dense` branch resets the search to the first track for every item and so naturally skips columns occupied by rowspan cells (it still honors each cell's explicit grid_row so inter-row order is preserved). rowspan=0 is currently clamped to 1 rather than interpreted as "span to end of row group" as the HTML Living Standard specifies. Browser behavior for rowspan=0 is inconsistent and this PR focuses on the common case; deferring the spec-exact behavior as a follow-up. * CI: fix WPT deploy branch Signed-off-by: Nico Burns <nico@nicoburns.com> * Cargo update Signed-off-by: Nico Burns <nico@nicoburns.com> * Upgrade html/xml/markup5ever to v0.39 Signed-off-by: Nico Burns <nico@nicoburns.com> * Bump comrak to v0.52 Signed-off-by: Nico Burns <nico@nicoburns.com> * Upgrade reqwest to 0.13 Signed-off-by: Nico Burns <nico@nicoburns.com> * Upgrade pixels_window_renderer Signed-off-by: Nico Burns <nico@nicoburns.com> * Upgrade to wuff 0.2.4 Signed-off-by: Nico Burns <nico@nicoburns.com> * Upgrade accesskit_macos and accesskit_unix Signed-off-by: Nico Burns <nico@nicoburns.com> * Fix clippy Signed-off-by: Nico Burns <nico@nicoburns.com> * Use parley v0.9.0 Signed-off-by: Nico Burns <nico@nicoburns.com> * Remove direct rendering dependencies (handled by AnyRender) Signed-off-by: Nico Burns <nico@nicoburns.com> * Reorder deps: move Parley next to Taffy Signed-off-by: Nico Burns <nico@nicoburns.com> * Remove fastrand dependency Signed-off-by: Nico Burns <nico@nicoburns.com> * Upgrade rustc-hash to 2.1.2 Signed-off-by: Nico Burns <nico@nicoburns.com> * Upgrade png to 0.18 * Remove C-based WOFF decoding. Rename `woff-rust` feature to just `woff` The `wuff` crate has proved itself to be reliable, so there is no need to maintain the C-based WOFF decoding anymore. * Upgrade pixels_window_renderer Signed-off-by: Nico Burns <nico@nicoburns.com> * CI: Set rustflags on ios Signed-off-by: Nico Burns <nico@nicoburns.com> * Port Config::with_window_attributes from dioxus-native 0.7.x Signed-off-by: Nico Burns <nico@nicoburns.com> * Make dioxus-cli-config a non-optional dependency of dioxus-native Signed-off-by: Nico Burns <nico@nicoburns.com> * Upgrade dioxus-native and dioxus-native-dom to Edition 2024 Signed-off-by: Nico Burns <nico@nicoburns.com> * Cargo fmt (Edition 2024) Signed-off-by: Nico Burns <nico@nicoburns.com> * Simplify dioxus-native prelude code * Bump version to 0.3.0-alpha.1 Signed-off-by: Nico Burns <nico@nicoburns.com> * Use exact (=) version constraint for internal alpha dependencies Signed-off-by: Nico Burns <nico@nicoburns.com> * Implement CSS counter-style symbols() support (DioxusLabs#396) Implements the CSS symbols() function for custom counter styles. Previously fell back to • for all custom counter-style definitions. Now properly cycles through the defined symbols based on the list item index, per CSS counter-styles spec. Fixes TODO in layout/list.rs * CI: Only run archive job trigger on main branch Signed-off-by: Nico Burns <nico@nicoburns.com> * perf: only clip box-shadow layer when element has opacity (DioxusLabs#397) Previously, a clip layer was always created when an element had an outset box-shadow, even if the element was fully opaque (opacity == 1.0). Now we only create the clip/layer when opacity < 1.0, avoiding unnecessary layer creation for the common case of fully opaque elements. * refactor: use extract_if instead of retain (DioxusLabs#399) * fix: implement case-sensitive attribute selectors (DioxusLabs#401) Add support for CSS [attr="value" i] case-insensitive attribute selectors. Uses Cow<str> to avoid allocations in the common case (case-sensitive), only allocating when lowercase conversion is needed. * Add package opt-level overrides for "tiny" profile * Make content_type option is Blitz net types Signed-off-by: Nico Burns <nico@nicoburns.com> * feat(browser): add opt-in FPS counter overlay (DioxusLabs#402) * feat: add FPS counter overlay to browser UI Adds an opt-in HUD-style overlay (top-right) that shows current FPS and frame time, gated behind a `--show-fps` CLI flag. Frame timing is measured via a dioxus_native CustomPaintSource whose `render` method is invoked once per real paint, giving a true wall-clock measurement of the redraw cadence. Addresses the "FPS counter" item in DioxusLabs#363. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * style: apply rustfmt to browser main.rs Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * refactor: move FPS toggle to menu, remove --show-fps CLI flag - Remove ShowFps context and --show-fps command-line argument - Add "Toggle FPS" menu item below "Toggle DevTools" - Lower FPS overlay z-index (50) below dropdown menu (100) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: gate FPS overlay behind vello feature flag use_wgpu is only available with the vello rendering backend, so fps_overlay, the show_fps signal, and the Toggle FPS menu item are all gated behind #[cfg(feature = "vello")]. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * style: apply rustfmt to browser crate Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com> * feat(browser): tabs (multiple embedded documents) (DioxusLabs#406) * Functional tabs * feat(browser): polish tabs — title cache, reactive window title, disabled nav buttons - Per-tab title Signal populated after parse; tab strip shows live titles, falls back to URL. - Window title bound reactively to active tab's title (Step 5 of DioxusLabs#363 plan). - Back/forward IconButtons gain a disabled prop; render dim and click is a no-op when there's no history in that direction. - Tabs widened, rounded upper corners, seamless join with urlbar. - active_tab() returns Tab directly instead of a 5-tuple (clears clippy type_complexity). - Drop apps/browser/TABS-PLAN.md (planning doc, no longer needed in-tree). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * refactor(browser): split app() into TabStrip/Toolbar components, fix stale-request bug - Extract TabStrip and Toolbar as sub-components to reduce app() from ~425 to ~60 lines - Fix inverted stale-request guard in load_document (was printing but never returning) - Deduplicate DocumentConfig construction into make_doc_config() helper - Replace println! with tracing::{info,warn,error,debug}; add tracing as direct dep - Fix is_focussed → is_focused spelling - Replace core::mem::drop() → drop() (two sites) - Fix window_title to call tab_title_or_url() instead of duplicating logic - Remove dead History::refresh method - Extract HOME_URL_STR constant; merge std use-tree imports Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(browser): add custom start page with centered Blitz logo New tabs and the home button now open about:newtab, a local start page that displays the Blitz logo centered on a light background. The logo is embedded as a base64 data URI so no network request is needed. DocumentLoader intercepts about:newtab synchronously before spawning a fetch task. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(browser): add status bar with hover-link URL and loading indicator StatusBar component polls the sub-document's hover node at 100ms intervals (same pattern as FpsOverlay), walks the layout_parent chain to find the nearest <a> ancestor, and resolves relative hrefs against the current page URL. Displays loading URL during fetches; hidden when idle and not hovering a link. Fixed-positioned bottom-left, pointer- events: none so it never blocks clicks. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(browser): avoid RefCell panic in StatusBar polling task The polling task wakes up during Dioxus event processing, which holds a mutable borrow on the outer BaseDocument. Replace handle.doc() with handle.try_doc() so that if the RefCell is already borrowed, the poll cycle is silently skipped rather than panicking. Add NodeHandle::try_doc() to dioxus-native-dom for this purpose. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(browser): reset DocumentLoaderStatus to Idle after fetch completes The async load task never wrote Idle back when done, so the status bar kept showing "Loading…" indefinitely. One write after the match covers both the success and error paths; the stale-request early-return is unaffected. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(browser): add Clear Cache menu item; nudge FPS overlay down - blitz-net: store CACacheManager in Provider, expose async clear_cache() - browser: Clear Cache menu item calls it via use_context (cache feature-gated) - browser.css: fps-overlay top 48px → 80px to clear the urlbar Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * refactor(browser): idiomatic cleanup of main.rs - Rename `Ordering as Ao` alias to plain `Ordering` - Pre-compute `has_back`/`has_forward` once per Toolbar render instead of calling `active_tab()` twice - Extract `hovered_href` free fn to replace 50-line labeled-block nest in StatusBar polling loop - Replace `str::from_utf8(&bytes).unwrap()` with `String::from_utf8_lossy` to avoid panic on non-UTF-8 responses - Use `saturating_sub(1)` in `close_tab` to guard against underflow - Fix clippy `redundant_closure` in `use_signal(|| String::new())` - Run rustfmt Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * Correctly unload subdocuments when their node is removed from the DOM * refactor(browser): split main.rs into focused modules Move History, Tab, DocumentLoader, TabStrip, Toolbar, and StatusBar into their own files. Expose a public HistoryNav delegation trait to bridge the private trait generated by #[store] across module boundaries. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * Avoid triggering Dioxus change detection if hover_url hasn't changed * Fix tab navigation and incremental layout panic Navigation now works in all tabs, not just the rightmost one, by subscribing the load effect to every tab's current URL signal. Fixes a panic ("invalid key") in resolve_layout_children_recursive when incremental layout is enabled: anonymous blocks and pseudo-elements can be removed from the slab between render passes, leaving stale IDs in cached layout_children. Guard the recursive function entry against stale keys and filter them from the cached children list before use. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(browser): compress tabs to fit and add hover tooltip Tabs now shrink equally as more are opened (flex: 1 1 0, min-width: 0) so the + button is never pushed off screen. A CSS tooltip shows the full tab title on hover for tabs that are too narrow to read. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(browser): prevent tab switch from triggering page reload Move the load-on-history-change effect into a per-tab TabView component so it only subscribes to that one tab's history URL. Switching tabs no longer fires any load effect since active_tab_id is not a reactive dependency of TabView's use_effect. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * perf(resolve): avoid Vec allocation when iterating stale layout children Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com> Co-authored-by: Nico Burns <nico@nicoburns.com> * Reduce default tab width and border-radius * Implement merged titlebar on macOS Signed-off-by: Nico Burns <nico@nicoburns.com> * Close menu when triggering the open in external browser menu item Signed-off-by: Nico Burns <nico@nicoburns.com> * Allow clicking a `<button>` element to submit a form * stores everywhere (DioxusLabs#409) Co-authored-by: Evan Almloff <evanalmloff@gmail.com> * feat(browser): Dioxus Tabs (DioxusLabs#412) Replace inline about:newtab HTML with a Dioxus-rendered AboutPage component, and extract URL/nav helpers from toolbar.rs into a new nav module. Settings, History, and Bookmarks are wired through the menu to Dioxus tabs and currently open a stub placeholder. Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(browser): browser history and tab favicons (DioxusLabs#413) * feat(browser): browser history and tab favicons Adds a browsing history page (about:history) with per-entry favicons and elapsed-time labels, favicon display in the tab strip, and ICO decoder support. Favicon probing and sniffing live in a new favicon.rs module; history data and dedup logic are in browser_history.rs. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(browser): BrowsingHistory store, decoder-based favicon probe, clippy cleanup - Replace Signal<VecDeque<HistoryEntry>> with Store<BrowsingHistory>; record_visit/clear become Store extension methods. The free function is kept private so it can be unit-tested without a Dioxus runtime. - Favicon probe decodes via image+usvg instead of magic-byte sniffing, so truncated payloads are correctly rejected. Drop the `ico` cargo feature in favor of always-on image/ico. - Add BaseDocument::favicon_url() so the browser app reads the icon link through the document API. - .tab-content: min-height: 0 to let the flex child shrink. - apps/browser is clean under -W unwrap_used/expect_used/panic/ indexing_slicing/arithmetic_side_effects/redundant_clone: saturating arithmetic for indices, wrapping_add for the reload generation counter, get/get_mut for bounded indexing, let-else for Event downcasts, scoped #[allow] with reason comments where an invariant makes the operation safe. capture_anyrender_scene logs and returns on error instead of unwrapping. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * Revert drive-by lint changes Signed-off-by: Nico Burns <nico@nicoburns.com> --------- Signed-off-by: Nico Burns <nico@nicoburns.com> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: Nico Burns <nico@nicoburns.com> * perf(browser): move favicon probe off the page-load critical path (DioxusLabs#414) * perf(browser): move favicon probe off the page-load critical path The favicon resolver was awaited inside DocumentLoader::load_document, so every navigation blocked on a network round-trip plus a full image decode of the icon before the new document could be swapped in. The decode also ran on the async executor thread. Split favicon resolution into a synchronous candidate-URL computation and an async probe. The loader returns immediately with the candidate; the tab spawns the probe in the background and writes tab.favicon_url when it resolves (gated on the tab still being on the same page, so a stale probe can't stomp a newer navigation). History entries created with favicon=None get patched in place via a new BrowsingHistory:: set_favicon(id, url), keyed by the entry id record_visit now returns. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * style(browser): rustfmt Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com> * Browser UI: use pointer cursor less Signed-off-by: Nico Burns <nico@nicoburns.com> * Differentiate between cursor:default and cursor:auto * feat(browser): urlbar autocomplete and on-disk history (DioxusLabs#415) * feat(browser): urlbar autocomplete and on-disk history Adds urlbar autocomplete (history matches + a "Search with DuckDuckGo" row, keyboard-driven) backed by a new sqlite history store that hydrates the in-memory BrowsingHistory on startup. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * refactor(browser): extract browser-persistence crate; fuzzy urlbar suggestions - Move HistoryStore into a new workspace crate apps/browser/persistence, managed via rusqlite_migration. Introduce HistoryService that owns the in-memory Store and on-disk HistoryStore together so callers no longer write to both sides. - Replace urlbar substring matching with nucleo fuzzy ranking; add a Literal "what Enter would do" row; drop hover-to-select. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * style(browser-persistence): rustfmt import order Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * Pre-select the first suggestion --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com> Co-authored-by: Nico Burns <nico@nicoburns.com> * Add CI task to publish browser app (DioxusLabs#417) * Fixup artifact names * Use git dep for dioxus cli Signed-off-by: Nico Burns <nico@nicoburns.com> * Publish: Install more deps on linux * Set webview_install_mode to skip + set windows icon_path Signed-off-by: Nico Burns <nico@nicoburns.com> * Add artefact paths for linux Signed-off-by: Nico Burns <nico@nicoburns.com> * Fixup webview_install_mode * Only use git CLI on linux * Use windows path syntax for windows icon path Signed-off-by: Nico Burns <nico@nicoburns.com> * Fixup artefact paths Signed-off-by: Nico Burns <nico@nicoburns.com> * Use CLI that canonicalizes windows icon path Signed-off-by: Nico Burns <nico@nicoburns.com> * Use backslash for windows icon path * Try new cli version * Upload artifacts for windows bundle * Actually use an arm runner for windows arm builds Signed-off-by: Nico Burns <nico@nicoburns.com> * Fix windows arm artifact paths Signed-off-by: Nico Burns <nico@nicoburns.com> * Use american spelling of artifact Signed-off-by: Nico Burns <nico@nicoburns.com> * Use v0.7.3 of CLI * Enable verbose logging Signed-off-by: Nico Burns <nico@nicoburns.com> * Enable trace logs Signed-off-by: Nico Burns <nico@nicoburns.com> * Use bin cli on all platforms Signed-off-by: Nico Burns <nico@nicoburns.com> * Use Rust 1.92 Signed-off-by: Nico Burns <nico@nicoburns.com> * Use git CLI on macOS (signing/notarization fixes) Signed-off-by: Nico Burns <nico@nicoburns.com> * Sign and Notarize macOS bundle Signed-off-by: Nico Burns <nico@nicoburns.com> * Fix bundle path for new bundler * Set APPLE_API_KEY not APPLE_API_KEY_ID variable Signed-off-by: Nico Burns <nico@nicoburns.com> * Run CI task on push to main Signed-off-by: Nico Burns <nico@nicoburns.com> --------- Signed-off-by: Nico Burns <nico@nicoburns.com> * Bump action versions * cargo update * CI: disable fail-fast for browser publish task Signed-off-by: Nico Burns <nico@nicoburns.com> * Use new CLI bundling on linux/windows (DioxusLabs#419) * Enable browser CI for pull requests Signed-off-by: Nico Burns <nico@nicoburns.com> * Use dioxus cli 0.7.7 on windows/linux Signed-off-by: Nico Burns <nico@nicoburns.com> * Use whole dir for artifacts on windows/linux Signed-off-by: Nico Burns <nico@nicoburns.com> * Add nice job names * Upload single file artifacts Signed-off-by: Nico Burns <nico@nicoburns.com> * Fix macos x86_64 dmg location Signed-off-by: Nico Burns <nico@nicoburns.com> --------- Signed-off-by: Nico Burns <nico@nicoburns.com> * Don't run Publish Browser workflow on PRs Signed-off-by: Nico Burns <nico@nicoburns.com> * fix windows icon (DioxusLabs#420) * perf(browser): move urlbar fuzzy matching to nucleo worker (DioxusLabs#416) * perf(browser): move urlbar fuzzy matching to nucleo worker Replace the synchronous nucleo-matcher rescore with a tokio worker that drives the higher-level `nucleo` crate, so each keystroke no longer rescans the entire history on the UI thread. The toolbar pushes queries into the worker via a channel and reads results from a Signal; history entries are pushed in via a use_effect so the matcher restarts when history changes. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * Fix merge conflict --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com> Co-authored-by: Nico Burns <nico@nicoburns.com> * Use GET rather than POST for synthesized duckduckgo queries. (so they don't all show up in the history with the same URL) * Use native-tls rather than rustls (fixes Android) * Use pointerdown rather than mousedown for suggestions (works on mobile) * Upgrade Stylo to v0.17 Signed-off-by: Nico Burns <nico@nicoburns.com> * Initial `user-select:none` implementation (DioxusLabs#411) * Implement `user-select:none`. This implementation only prevents starting a selection in the node, and does not prevent selecting pseudo-elements with `user-select: auto`. Signed-off-by: Nico Burns <nico@nicoburns.com> * Don't use text cursor for text with `user-select:none` --------- Signed-off-by: Nico Burns <nico@nicoburns.com> * Use Blitz logo with text on start page * Remove unused BLITZ_LOGO asset Signed-off-by: Nico Burns <nico@nicoburns.com> * Add Browser UI build for Android (DioxusLabs#423) * Add Browser UI build for Android Signed-off-by: Nico Burns <nico@nicoburns.com> * Run Publish Browser on PR Signed-off-by: Nico Burns <nico@nicoburns.com> * Only use Signed Builds environment for main branch builds Signed-off-by: Nico Burns <nico@nicoburns.com> * Only write private key file on main branch Signed-off-by: Nico Burns <nico@nicoburns.com> * Only delete prviate key file on main branch Signed-off-by: Nico Burns <nico@nicoburns.com> * Pass --android and fix artifact path * Run Android build on x86 host (arm runner doesn't include the Android SDK) Signed-off-by: Nico Burns <nico@nicoburns.com> --------- Signed-off-by: Nico Burns <nico@nicoburns.com> * Rename published apk (DioxusLabs#424) * Rename apk Signed-off-by: Nico Burns <nico@nicoburns.com> * Remove android from name Signed-off-by: Nico Burns <nico@nicoburns.com> --------- Signed-off-by: Nico Burns <nico@nicoburns.com> * Enable vendored openssl by default on Android * CI: sign Android Builds * Browser UI: Add max-width to new tab page search input * Fix crash from mouse leaving viewport meaning mousedown_node_id doesn't exist even though mousebutton is down Signed-off-by: Nico Burns <nico@nicoburns.com> * Upgrade to dioxus v0.7.8. Use prebuilt v0.7.8 CLI for builds on all platforms Signed-off-by: Nico Burns <nico@nicoburns.com> * cargo update Signed-off-by: Nico Burns <nico@nicoburns.com> * Don't run publish browser workflow on PRs Signed-off-by: Nico Burns <nico@nicoburns.com> * New Custom Widget API (DioxusLabs#425) Replaces the CustomPaintSource API with a new Custom Widget API based based on the Widget trait. See custom_widget and wgpu_texture examples for details. Signed-off-by: Nico Burns <nico@nicoburns.com> * Fix Dioxus Native sub documents (Custom Widget PR broke setting sub documents) Signed-off-by: Nico Burns <nico@nicoburns.com> * Fix blitz-shell compile with custom-widget feature disabled Signed-off-by: Nico Burns <nico@nicoburns.com> * Add wasm32 support (async renderer resume) (DioxusLabs#426) * Add WASM support Signed-off-by: Nico Burns <nico@nicoburns.com> * wasm_7guis: fix Update/Delete buttons appearing disabled when selection exists Blitz does not invalidate :disabled pseudo-class styling when the disabled attribute changes reactively. Drive the disabled visual state via a .btn-off class instead, matching the class-toggle pattern already used for .list-item.selected. The disabled attribute is kept for semantics; hover suppression is updated to exclude .btn-off buttons. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * Upgrade to latest AnyRender `main` --------- Signed-off-by: Nico Burns <nico@nicoburns.com> Co-authored-by: Nico Burns <nico@nicoburns.com> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * Upgrade to published AnyRender 0.9 Signed-off-by: Nico Burns <nico@nicoburns.com> * Implement event handling for custom widgets Signed-off-by: Nico Burns <nico@nicoburns.com> * Standardize wasm examples: unify seven_guis/todomvc, add HOWTO_WASM.md (DioxusLabs#429) Fix examples CI build. Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * WASM canvas resize: skip with_surface_size on wasm (alt to DioxusLabs#431) (DioxusLabs#432) Alternative implementation of Nico's hypothesis on DioxusLabs#431. Instead of stripping the inline `canvas.style.width/height` that winit-web writes, drop the `.with_surface_size(...)` call on wasm entirely so the styles never get set in the first place. Host CSS controls the canvas box. Three pieces in one branch: - Examples (seven_guis, todomvc, wasm_hello) no longer call `.with_surface_size(...)` on wasm; the seven_guis and todomvc `index.html` files get `canvas { width: 100%; height: 100% }` so the canvas fills the viewport once winit isn't pinning it. - `View::init` falls back to reading the canvas's CSS layout box (`offset_width × offset_height × devicePixelRatio`) when winit-web's initial `surface_size()` is 0×0 — without this, wgpu fails with a swapchain-size-0 error before the first ResizeObserver fires. - Same wgpu `surface.configure` debounce as DioxusLabs#431, with a coalesce guard so a continuous browser-window drag schedules one timer instead of one per `SurfaceResized`. Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com> * Add font face override (DioxusLabs#433) * blitz-dom: honour @font-face descriptors in FontInfoOverride Propagate font-family / font-weight / font-style from the @font-face descriptors all the way through the NetProvider handler to Collection::register_fonts, instead of dropping them and forcing parley to read the family name from the TTF's name table. * blitz-dom: unit tests for stylo_to_fontique_style mapping Cover the four interesting branches of the stylo -> fontique font-style translator added in the prior commit: - StyloFontStyle::Italic -> FontStyle::Italic - Oblique(0deg, 0deg) -> FontStyle::Normal (CSS `normal` round-trip) - Oblique(14deg, 14deg) -> FontStyle::Oblique(Some(14.0)) - Oblique(10deg, 20deg) -> FontStyle::Oblique(Some(10.0)) The Oblique(0, 0) -> Normal mapping is the subtle case stylo's parser emits for bare CSS `normal`; pinning it stops a future refactor from silently regressing upright font matching. * blitz-dom: regression-pin @font-face descriptor honouring Drive load_resource directly with a Resource::Font carrying FontFaceOverrides { family_name: Some(\"AliasedFamily\"), .. } and assert that fontique's Collection ends up with a family registered under the CSS-declared alias rather than the TTF's internal `name` table entry. We bypass HTML parsing here because blitz-html (which owns the parser that drives fetch_font_face) is a downstream crate and would create a circular dependency. The descriptor parsing path is already covered by the stylo_to_fontique_style unit tests in net.rs; this test pins the load-side of the pipeline so a future refactor of load_resource can't silently drop the override again. --------- Co-authored-by: Henrique Anzoategui <hanzoategui@kigo.io> * Make dioxus_native::launch_cfg work on WASM (DioxusLabs#434) Adds `font_ctx: Option<FontContext>` to `Config` with a `with_font_ctx` builder, threads it through to `DocumentConfig`, and seeds WASM defaults (`with_append(true)` + initial surface size) so a single `launch_cfg` call replaces the ~70-line hand-rolled wasm entry point in each example. - New `blitz_dom::build_font_ctx` helper for constructing a FontContext from bundled font bytes, re-exported from `dioxus-native`. - New `panic-hook` and `woff` features on `dioxus-native`, default-on. - `blitz-dom`'s default FontContext no longer requests system fonts on wasm32 (browsers don't expose them). - Gates the tokio-backed `blitz_net::Provider` setup behind `not(target_arch = "wasm32")`. - Simplifies `examples/todomvc/src/wasm.rs` and the `wasm_entry` module in `examples/seven_guis/src/lib.rs`. Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * Add StyleThreading::Sequential opt-out for concurrent document resolves (DioxusLabs#437) * Add StyleThreading::Sequential opt-out for concurrent document resolves Stylo runs traversal on a process-wide rayon pool shared between all Documents. Its per-worker SHARING_CACHE_KEY thread-local is mutably borrowed for the entire traversal, so two concurrent resolves that share a pool worker panic with "already mutably borrowed". Add a per-document `StyleThreading` enum on DocumentConfig. The new `Sequential` variant bypasses the global pool at the traverse_dom call site (packages/blitz-dom/src/stylo.rs), making it safe to resolve from many user threads concurrently. The default remains `Parallel`; existing single-document callers are unaffected. Note: a `set_pref!("layout.threads", ...)` approach won't work because the pref is read once when STYLE_THREAD_POOL is first forced. Gating at the traverse_dom call site makes the choice truly per-document. This is a Blitz-side mitigation; the underlying Stylo race is unchanged. Refs DioxusLabs#430 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * Fix apps/browser DocumentConfig literals after style_threading addition Two struct literals in apps/browser exhaustively listed every DocumentConfig field, so adding `style_threading` broke the compile with E0063. Appending `..Default::default()` resolves it and makes both sites robust to future field additions. Refs DioxusLabs#430 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com> * Fix intermittent image loads on rate-limited CDNs (DioxusLabs#435) (DioxusLabs#439) * Fix intermittent image loads on rate-limited CDNs - blitz-net: per-host concurrency cap (6), 429/503 retry with Retry-After + exponential backoff, updated User-Agent per Wikimedia policy, and a HttpStatus error variant for non-2xx responses - blitz-dom: ImageHandler::parse now reports underlying decode/SVG errors instead of a generic "Could not parse image"; load_resource warns on failure and cleans up pending_images so retries can succeed - apps/browser: optional CLI URL argument for opening a page directly, blitz-paint?/tracing pass-through Fixes DioxusLabs#435. * blitz-net: drop 429/503 retry loop Other browsers surface rate-limit errors instead of auto-retrying, and the in-loop tokio::time::sleep was keeping fetch tasks alive past window close, hanging the process on shutdown. The per-host concurrency cap and HttpStatus error variant stay; refresh now drives retries. Also drop a few stale/redundant comments in the same file. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * blitz-dom: abort in-flight fetches on navigation + share image cache Threads `DocumentConfig::abort_signal` through every sub-resource Request blitz-dom issues (stylesheets, @import, @font-face, <img>, background images), so a single AbortController cancels everything tied to a document. The browser installs a fresh controller per load and aborts the previous one on reload, navigate, and drop — fixing the refresh-pounding case where prior loads kept fetching after the user moved on. Adds `DocumentConfig::image_cache` (SharedImageCache = Arc<Mutex<HashMap<String, ImageData>>>) so decoded images persist across BaseDocument lifetimes. The browser supplies one cache per tab, so a refresh reuses already-decoded images instead of re-fetching and tripping rate-limited CDNs. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * blitz-dom: drop SharedImageCache, rely on http_cache_reqwest Reverts the shared in-memory decoded-image cache from 3193e26 following reviewer feedback. Storing decoded RGBA8 pixels keyed by URL with no eviction policy across a tab's lifetime is unbounded memory growth — and the wrong layer for this problem. blitz-net already has a disk-based HTTP cache via `http_cache_reqwest`, which is the correct place to short-circuit network fetches on refresh. Keeps the abort-on-navigate/reload wiring from 3193e26; that change is independent and addresses a separate class of refresh-pounding behavior (cancelling stale fetches rather than caching their results). Adds a docstring on `BaseDocument::build_request` explaining why both it and the free `net::stamped_request` exist (borrow-checker split). If `http_cache_reqwest` isn't catching Wikimedia thumbnails on refresh, that's the layer to investigate. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com> * blitz-net: restore Firefox UA to fix DuckDuckGo redirect links (DioxusLabs#440) Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * CI: fix macos Signed-off-by: Nico Burns <nico@nicoburns.com> * CI: fix macOS Intel Signed-off-by: Nico Burns <nico@nicoburns.com> * Add architecture mermaid diagram Signed-off-by: Nico Burns <nico@nicoburns.com> * More CI fixes Signed-off-by: Nico Burns <nico@nicoburns.com> * Upgrade to WGPU v29 + AnyRender 0.10 (+ font embolden) (DioxusLabs#428) * Upgrade to WGPU v29 + Vello with font embolden * Use AnyRender that marks override textures as dirty Signed-off-by: Nico Burns <nico@nicoburns.com> * Implement custom wgpu textures for Vello Hybrid * Upgrade to released version of vellos * Use AnyRender 0.10 from crates.io Signed-off-by: Nico Burns <nico@nicoburns.com> --------- Signed-off-by: Nico Burns <nico@nicoburns.com> * Use taffy with experimental cache fix Signed-off-by: Nico Burns <nico@nicoburns.com> * Bump direct skrifa dependency to 0.42.1 Signed-off-by: Nico Burns <nico@nicoburns.com> * Feature flag font-embolden Signed-off-by: Nico Burns <nico@nicoburns.com> * Upgrade anyrender (patch out embolden offsetting) * Upgrade anyrender_skia to 0.8.0 (skia-safe 0.97.0) Signed-off-by: Nico Burns <nico@nicoburns.com> * Don't hint emboldened text Signed-off-by: Nico Burns <nico@nicoburns.com> * Browser UI: make anyrender dep non-optional Signed-off-by: Nico Burns <nico@nicoburns.com> * Make vello_hybrid the default renderer Signed-off-by: Nico Burns <nico@nicoburns.com> * Enable font embolden by default on apple platforms Signed-off-by: Nico Burns <nico@nicoburns.com> * Bump Taffy (version number only) Signed-off-by: Nico Burns <nico@nicoburns.com> * Bump taffy version again Signed-off-by: Nico Burns <nico@nicoburns.com> * Move wasm_hello example into the main workspace Signed-off-by: Nico Burns <nico@nicoburns.com> * Bump version to 0.3.0-alpha.3 Signed-off-by: Nico Burns <nico@nicoburns.com> * Remove profile from wasm_hello example Signed-off-by: Nico Burns <nico@nicoburns.com> * Fix typo: WANRING -> WARNING Signed-off-by: Nico Burns <nico@nicoburns.com> * Introduce precendence chain for renderers Signed-off-by: Nico Burns <nico@nicoburns.com> * Require blitz-dom/custom-widget in dioxus-native-dom Signed-off-by: Nico Burns <nico@nicoburns.com> * Reduce MSRV to 1.89 Signed-off-by: Nico Burns <nico@nicoburns.com> * Bump version to 0.3.0-alpha.4 Signed-off-by: Nico Burns <nico@nicoburns.com> * Enable FPS meter for all renderers Signed-off-by: Nico Burns <nico@nicoburns.com> --------- Signed-off-by: Nico Burns <nico@nicoburns.com> Co-authored-by: koko <72217393+kokoISnoTarget@users.noreply.github.com> Co-authored-by: Nico Burns <nico@nicoburns.com> Co-authored-by: Joe Leaver <joe@joeleaver.com> Co-authored-by: Tom <97800396+mogambro@users.noreply.github.com> Co-authored-by: Austin M. Reppert <austinmreppert@gmail.com> Co-authored-by: Austin M. Reppert <austinmreppert@protonmail.com> Co-authored-by: niminypiminy <141541168+niminypiminy@users.noreply.github.com> Co-authored-by: Tristan Phease <tristan.phease@gmail.com> Co-authored-by: mitsuru <hayasaka.mitsuru@gmail.com> Co-authored-by: lainon1 <271530700+lainon1@users.noreply.github.com> Co-authored-by: Tony Bierman <tonybierman@gmail.com> Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com> Co-authored-by: Evan Almloff <evanalmloff@gmail.com> Co-authored-by: Klemen <klemensustar1@gmail.com> Co-authored-by: Henrique Anzoategui <hanzoategui@augeomarketing.com> Co-authored-by: Henrique Anzoategui <hanzoategui@kigo.io>
No description provided.