react / react/react-native

<Activity mode="hidden"> prevents WKWebView from loading content (onLoad never fires)

Offen
#56,180 1 Kommentar 1 Reaktion 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Component: WebView Needs: Triage :mag: Stale
Vorherrschende Sprache
C++
Sterne
127k
Forks
25.3k
Ø Merge
1 T. 23 Std.
Gemergte PRs (30 T.)
4

Beschreibung

Description

A WKWebView (via react-native-webview) inside never loads its content. onLoad/onLoadStart/onLoadEnd never fire. This makes Activity unusable for pre-rendering/pooling WebViews offscreen.

Activity mode="hidden" applies display: none via cloneHiddenInstance() in Fabric, which maps to UIView.hidden = YES + Yoga zeroing the frame. WKWebView requires a non-zero frame and visible state to initialize its Web Content process and load content.

Also produces this warning as the web content process gets jetsammed:
[BrowserEngineKit] Failed to terminate process: Error Domain=com.apple.extensionKit.errorDomain Code=18 NSUnderlyingError: RBSRequestErrorDomain Code=3 "No such process found"

WebView pooling — pre-render WebViews in Activity mode="hidden", then flip to mode="visible" for instant display. Currently impossible because content never loads while hidden.

Versions

  • react-native: 0.83.2
  • react: 19.2.0
  • react-native-webview: 13.16.0
Steps to reproduce

Minimal Reproducible Example:

  import { useState, useCallback, Activity } from "react";
  import { View, Text, StyleSheet } from "react-native";
  import { WebView } from "react-native-webview";

  const HTML = `<!DOCTYPE html><html><body><h1>Hello</h1></body></html>`;

  export default function Test() {
    const [logs, setLogs] = useState<string[]>([]);
    const log = useCallback((msg: string) => {
      console.log(msg);
      setLogs((p) => [msg, ...p]);
    }, []);

    return (
      <View style={{ flex: 1, padding: 20 }}>
        {/* ✅ This fires onLoad */}
        <Activity mode="visible">
          <View style={{ width: 1, height: 1, overflow: "hidden" }}>
            <WebView source={{ html: HTML }} onLoad={() => log("VISIBLE: onLoad ✅")} />
          </View>
        </Activity>

        {/* ❌ This never fires onLoad */}
        <Activity mode="hidden">
          <View style={{ width: 1, height: 1, overflow: "hidden" }}>
            <WebView source={{ html: HTML }} onLoad={() => log("HIDDEN: onLoad ❌")} />
          </View>
        </Activity>

        {/* ✅ Control without Activity */}
        <View style={{ width: 1, height: 1, overflow: "hidden" }}>
          <WebView source={{ html: HTML }} onLoad={() => log("CONTROL: onLoad ✅")} />
        </View>

        {logs.map((l, i) => <Text key={i}>{l}</Text>)}
      </View>
    );
  }

Only VISIBLE and CONTROL log. HIDDEN never fires any load events.

React Native Version

0.83.2

Affected Platforms

Runtime - iOS

Output of npx @react-native-community/cli info
info Fetching system and libraries information...
System:
  OS: macOS 15.6.1
  CPU: (10) arm64 Apple M1 Pro
  Memory: 128.64 MB / 16.00 GB
  Shell:
    version: "5.9"
    path: /bin/zsh
Binaries:
  Node:
    version: 23.2.0
    path: /Users/mark/.nvm/versions/node/v23.2.0/bin/node
  Yarn:
    version: 1.22.22
    path: /Users/mark/.nvm/versions/node/v23.2.0/bin/yarn
  npm:
    version: 10.9.0
    path: /Users/mark/.nvm/versions/node/v23.2.0/bin/npm
  Watchman: Not Found
Managers:
  CocoaPods:
    version: 1.16.2
    path: /opt/homebrew/bin/pod
SDKs:
  iOS SDK:
    Platforms:
      - DriverKit 25.2
      - iOS 26.2
      - macOS 26.2
      - tvOS 26.2
      - visionOS 26.2
      - watchOS 26.2
  Android SDK: Not Found
IDEs:
  Android Studio: 2025.2 AI-252.27397.103.2522.14617522
  Xcode:
    version: 26.2/17C52
    path: /usr/bin/xcodebuild
Languages:
  Java:
    version: 23.0.2
    path: /opt/homebrew/opt/openjdk/bin/javac
  Ruby:
    version: 2.6.10
    path: /usr/bin/ruby
npmPackages:
  "@react-native-community/cli": Not Found
  react:
    installed: 19.2.0
    wanted: 19.2.0
  react-native:
    installed: 0.83.2
    wanted: 0.83.2
  react-native-macos: Not Found
npmGlobalPackages:
  "*react-native*": Not Found
Android:
  hermesEnabled: Not found
  newArchEnabled: Not found
iOS:
  hermesEnabled: Not found
  newArchEnabled: Not found

info React Native v0.84.1 is now available (your project is running on v0.83.2).
info Changelog: https://github.com/facebook/react-native/releases/tag/v0.84.1
info Diff: https://react-native-community.github.io/upgrade-helper/?from=0.83.2&to=0.84.1
info For mor
Stacktrace or Logs
[BrowserEngineKit] Failed to terminate process: Error Domain=com.apple.extensionKit.errorDomain Code=18 NSUnderlyingError: RBSRequestErrorDomain Code=3 "No such process found"
MANDATORY Reproducer

https://snack.expo.dev/@markwitt/ab3289

Screenshots and Videos

No response

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne mit dem Verhalten von cloneHiddenInstance() in Fabric und reproduziere das Problem mithilfe des verlinkten Snack und des minimalen Beispiels. Überprüfe den Fix anhand der sichtbaren, ausgeblendeten und Kontroll-WebViews; die Arbeit ist abgeschlossen, wenn die ausgeblendete WKWebView Inhalte lädt und ihre onLoad-, onLoadStart- und onLoadEnd-Callbacks ausgelöst werden.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
ios, react-native, typescript
Bereich
mobile-dev
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Aktiv
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
50/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.