fix(parity): close iOS/Android/macOS feature & API parity gaps#128
Merged
Conversation
Bring iOS/Android/macOS to functional parity (newer/canonical impl wins): - nav: iOS load-failure detection (didFail+TIMEOUT); Android reload loadTime; honor navigate timeout on iOS/macOS - tabs: Android tab payloads emit windowId:"main" - storage: Android clipboard hasImage real detection; iOS/macOS cookies honor url/domain - capture: honor fullPage screenshot on Android (full-content draw) and macOS (scroll-stitch) - dom: Android get-attributes drops undocumented count - network: Android get-network-log type filter + summary + mimeType/font; status/since filters on all 3 - ai: macOS real JS dialog handling (DialogState + WKUIDelegate); ai-catalog/ai-fitness routes on macOS+Android Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- iOS navigate: ignore NSURLErrorCancelled/FrameLoadInterrupted, clear on new provisional nav, only fail when page genuinely didn't load (no false positives) - macOS navigate: add WKWebView load-failure capture (parity with iOS/Android) - macOS dialogs: per-renderer DialogState resolved by windowId/tabId (was a process-wide singleton that broke multi-window) - screenshot fullPage: Android scroll-and-stitch + height cap + OutOfMemoryError catch (was unbounded bitmap → crash); macOS pixel-accurate CGImage stitch (was Retina-incorrect); consistent imageScaleY metadata for full-page - cookies: align delete-cookies empty-body to safe no-op on all 3; get-cookies defaults to current-page scope on iOS/macOS (Android-canonical) - network: status filter is a category (success/error/pending) per contract, not an exact HTTP code; corrected docs/api/devtools.md to match Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…rupted is not a Foundation constant) The wave-2 nav-failure agents referenced a nonexistent constant, breaking the macOS (and iOS) Swift build. NSURLErrorCancelled (-999) already covers the benign superseded/redirect-interrupted/stopLoading cancellations. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ture docs - iOS screenshot fullPage: port scroll-and-stitch (was takeSnapshot viewport-only, never captured beyond the viewport) + page-relative imageScaleY/contentHeight metadata, matching Android/macOS - docs: request-interception and geolocation are unsupported on ALL platforms (functionality.md, api/README.md) — were stale "Android-only" - docs/api/core.md: full-page is scroll-and-stitch on all three platforms - CEFRenderer comment: per-renderer DialogState (no more shared singleton) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ncile - screenshot fullPage: emit truncated:false on iOS+macOS so the full-page response shape matches Android (which sets it under its height cap) - docs: geolocation override is unsupported on ALL platforms (browser.md caveat + api/README matrix were stale "Android via CDP") Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- screenshot-annotated honors fullPage on iOS/Android/macOS (reuses the shared scroll-and-stitch capture; was viewport-only) - macOS CEF/Chromium JS dialogs wired via CefJSDialogHandler -> per-renderer DialogState (alert/confirm/prompt/beforeunload), reaching WKWebView parity - starter native unit-test harness: XCTest targets (iOS/macOS) + Android JUnit, covering CookieScope matching and network status-category/since parsing Verified: macOS xcodebuild test 35/35, iOS test-build, Android assembleDebug + testDebugUnitTest, swiftlint 0 violations, adversarial review SHIP. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
….1.11, shared 0.1.2) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes the cross-platform parity gaps found by a multi-agent audit of iOS/Android/macOS against the CLI + shared contract + docs. Each gap was resolved toward the newer/canonical implementation; every finding was adversarially verified (Opus + Codex) before and after fixing.
Gaps closed
Navigation — iOS now detects genuine load failures (didFail, ignoring benign
NSURLErrorCancelled) without false-positives; macOS gains the same WKWebView failure capture; AndroidreloadreturnsloadTime;navigatetimeouthonored on iOS/macOS.Tabs/DOM — Android tab payloads emit
windowId:"main"; Androidget-attributesdrops the undocumentedcount.Screenshot —
fullPagenow genuinely scroll-and-stitches on all three (iOS/Android previously viewport-only); Android memory-capped +OutOfMemoryError-safe; macOS pixel-accurate Retina stitch; consistentcontentHeight/page-relativeimageScaleY/truncatedmetadata.Storage — Android clipboard
hasImagereal detection; iOS/macOS cookies honorurl/domain;delete-cookiesempty-body is a safe no-op everywhere;get-cookiesdefaults to current-page scope.Network — Android
get-network-loghonorstypefilter, returnssummary, addsmimeType/font;statusfilter is a category (success|error|pending) per contract on all three;sincehonored everywhere.AI/MCP — macOS JS dialogs are now real (per-renderer
DialogState+ WKUIDelegate, no global singleton);ai-catalog/ai-fitnessregistered on macOS+Android withkelpie_ai_catalog/kelpie_ai_fitnessMCP tools + CLI + docs.Docs — request-interception and geolocation reconciled as unsupported on all platforms (were stale "Android-only").
Verification
make lint-swift0 violations; ktlint clean; CLI 400/400, shared 12/12 tests passKnown follow-ups (not in this PR)
fullPageis still viewport-only (separate code path)CefJSDialogHandlerbridge)🤖 Generated with Claude Code