<Activity mode="hidden"> prevents WKWebView from loading content (onLoad never fires)
Nobody has claimed this yet.
- Dominant language
- C++
- Stars
- 127k
- Forks
- 25.3k
- Avg merge
- 1d 23h
- Merged PRs (30d)
- 4
Description
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
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with Fabric's cloneHiddenInstance() behavior and reproduce the issue using the linked Snack and the minimal example. Verify the fix against the visible, hidden, and control WebViews; done means the hidden WKWebView loads content and its onLoad, onLoadStart, and onLoadEnd callbacks fire.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- ios, react-native, typescript
- Domain
- mobile-dev
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 50/100