Skip to content

Platform capabilities and macOS acceptance ​

The Safari scene matrix is the reference for both platforms. Windows uses the pinned WebKit Windows Port; macOS uses system WKWebView. Shared code and passing tests on one platform cannot certify another platform's native behavior.

Current acceptance status ​

The maintainer confirmed macOS manual acceptance of the beta.3 candidate on 2026-10-28. Case-level receipts remain with that run; this Windows documentation work does not add new macOS passes. Later affected native changes still require scoped verification.

Windows uses milestone windows-desktop/2026-10-29, with qualified runtime/host evidence and outstanding dependency/package delivery gates. Record implementation, compilation, native checks and unsupported behavior separately. Builds, signatures and shared tests do not establish optical or input parity.

Current implementation and differences ​

AreaWindowsmacOS
Engine/runtimeSource-built WebKit plus required host API manifestSystem WKWebView; record actual OS/WebKit/SDK capabilities, without copying the Windows runtime or changing its locks
Website storagePersistent store; absolute DEVDUO_WEBKIT_PROFILE isolates testsDefault persistent website store, no corresponding profile override. Preferences isolation does not isolate website data
PresentationFull drawing frame, four-side obscured insets and independent backing scaleClosed side layout uses supported system insets; Open top continuation remains a reserved-frame/color approximation
Presentation changesRotation, language, Fit, outline, appearance and shell changes keep the view/document; fold/mode replaces itSame ownership contract; native points/backing pixels must remain distinct from CSS and scene coordinates
Mobile identity/titlesNative compatibility UA before first request; document-confirmed titlesSame native UA and title policy through Swift callbacks/KVO; both containers share the observed identity
Local InspectorSeparate native Inspector, detached before showingCapability-checked private selectors and hidden attachment target avoid asynchronous docking shrinking the measured viewport
Native remote inspectionExplicit unauthenticated WebKit TCP listenerSystem Safari Develop discovery through isInspectable; Windows listener address/port fields do not configure it
CDP/chiiToken-protected page bridge; separate system WebView2 frontendSame page bridge; separate nonpersistent tools WKWebView. No engine-debugger/full-CDP compatibility claim
ProxySystem/direct/custom native HTTP/HTTPS/SOCKS5System/custom via supported website-store configuration; direct rejected. Default store is shared across measured views; neither platform supplies authenticated proxies
Fixed-container colorsNative four-edge API plus host fillsCapability-checked system extension; otherwise limited opaque full-width footer/root fallback, which cannot certify translucent masks
Scroll indicatorsNative eligibility/input plus a passive scene-edge thumbNo matching host policy; system WebKit scrollbars/preferences remain authoritative
Glass and accessibilityDirectComposition approximation; scoped WebCore AX/UIA and Narrator supportSystem AppKit glass and native WKWebView accessibility; capability and assistive-technology coverage remain platform-specific

src/DevDuo/macos/WebViewBridge.swift, DeveloperWebViewBridge.swift and ScreenshotBridge.swift own native macOS behavior. Shared host/browser/scene logic lives under Host/, Browser/, Device/ and DeveloperTools/. Exact Windows API and unsupported capabilities belong in the backend guide.

Prepare a macOS run ​

Use Contributing for mise, Xcode/macOS SDK, real symlinks and build commands. just test-macos exercises AppKit layout, input policy, private-capability/fallback and Inspector attachment behavior. It is not end-to-end website or final-window acceptance.

Select the changed component below rather than restarting every scenario. Preserve existing receipts for unaffected behavior. Use isolated host preferences/output and a unique test origin/token; do not clear unrelated website data. DEVDUO_WEBKIT_PROFILE does not isolate macOS storage.

just serve supplies calibration on loopback port 8765. Serve reviewed standalone pages separately when needed:

sh
mise exec -- uv run --locked python -m http.server 8878 --bind 127.0.0.1 --directory tests/DevDuo.WebKitProbe/pages

The static server cannot verify request headers, redirects or proxy routing; those need a controlled recorder. Keep temporary recorder code and receipts local, and preserve provenance.

Native acceptance matrix ​

Apply relevant rows to the exact candidate. For geometry changes, include both containers, all affected body mappings and initial/compact/tab variants; preserve Closed 180° history and verify observed orientation. Routine unrelated edits do not require the full matrix or display reconfiguration.

Changed areaObservable requirements
Navigation, identity and titlesOffline welcome/Home, redirects/history/error handling, native first-document/subresource/fetch UA and dynamic/empty/long titles; no provisional title leakage
Storage and servicesSame-origin tokenized localStorage/IndexedDB/persistent cookies survive normal restart; tools storage stays separate; services restart disabled
Scene and presentationPresentation changes retain URL, document/time origin, form/history and valid scroll; record clamps rather than restoring by script. Check independent masks, complete tab containers and native frames at affected Fit values
Inspector and shortcutsActual separate DOM/Console, F12/Ctrl+Shift+I with native page focus, no docking viewport reservation, explicit missing-capability errors and no stale frontend
Remote/CDP/proxyActual Safari discovery or page bridge, target reconnect, listener cleanup, mutual exclusion and future traffic routing without reloading the current page. Do not bypass Console paste protection or claim trusted HTTPS from a failed TLS handshake
Continuation, alpha and materialStatic and animated real flow, document boundaries, masks/backdrops and returned native colors; distinguish Open approximation and system/fallback capabilities. Compare actual windows as well as DOM/snapshots
Input, lifecycle and accessTransformed clicks, keyboard/IME, popups, VoiceOver, relevant resize/close/replacement races and resource cleanup; no callbacks into disposed containers

For overlay/indicator fixtures, use their authored controls or test APIs one operation at a time and wait for the fixture's settled state. These inputs must not become production DOM workarounds. Viewport alpha, inset solid color and glass-covered pixels require distinct observations. System preferences, native indicator eligibility and the missing macOS scene-edge policy remain explicit.

Decisions and lessons ​

  • Native child logical sizes must be exact scene units; scale the ancestor for Fit. Floating-point size truncation must not change the CSS viewport.
  • Inspector connection and docking restoration are asynchronous. Reserve a hidden attachment target and verify the visible detached frontend without shrinking the device view.
  • A populated tools DOM can still paint blank if native layout/orientation is wrong. Inspect the actual tools window, not only successful protocol evaluation.
  • Private SPI must be checked at runtime. Exercising a forced fallback branch proves its geometry/lifecycle, not system-extension pixels or another OS's capabilities.

Evidence and acceptance report ​

Keep original state/window captures, runtime/capability branches and source/binary provenance in a new ignored evidence session. Report the changed scope, tests actually run, baseline inherited and remaining limits. macOS points, backing pixels, CSS viewports and native window captures are distinct evidence; Windows DPI or source-raster results do not substitute for them.

English | 中文

Independent project · first-party code: MIT · simulator artwork: see third-party notices