@exodus/react-native-webview 11.26.1-exodus.31 → 11.26.1-exodus.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/.all-contributorsrc +185 -0
  2. package/.circleci/config.yml +66 -0
  3. package/.eslintignore +2 -0
  4. package/.eslintrc.js +94 -0
  5. package/.flowconfig +88 -0
  6. package/.flowconfig.android +88 -0
  7. package/.gitattributes +12 -0
  8. package/.github/CODEOWNERS +1 -0
  9. package/.github/ISSUE_TEMPLATE/bug-report.md +42 -0
  10. package/.github/ISSUE_TEMPLATE/feature_request.md +30 -0
  11. package/.github/workflows/android-ci.yml +35 -0
  12. package/.github/workflows/detox.yml +20 -0
  13. package/.github/workflows/ios-ci.yml +31 -0
  14. package/.github/workflows/scripts/install-vs-features.ps1 +108 -0
  15. package/.github/workflows/stale.yml +17 -0
  16. package/.gitignore +62 -0
  17. package/.idea/.gitignore +5 -0
  18. package/.idea/inspectionProfiles/Project_Default.xml +6 -0
  19. package/.idea/misc.xml +9 -0
  20. package/.idea/modules.xml +8 -0
  21. package/.idea/react-native-webview.iml +9 -0
  22. package/.idea/vcs.xml +6 -0
  23. package/.idea/workspace.xml +104 -0
  24. package/.prettierrc.js +10 -0
  25. package/.releaserc +15 -0
  26. package/.vscode/settings.json +9 -0
  27. package/android/src/main/java/com/reactnativecommunity/webview/RNCWebViewManager.java +6 -0
  28. package/apple/RNCWebView.m +10 -0
  29. package/babel.config.js +11 -0
  30. package/bin/setup +26 -0
  31. package/docs/Contributing.md +102 -0
  32. package/docs/Custom-Android.md +222 -0
  33. package/docs/Custom-iOS.md +236 -0
  34. package/docs/Debugging.md +101 -0
  35. package/docs/Getting-Started.md +142 -0
  36. package/docs/Guide.md +613 -0
  37. package/docs/Reference.md +1639 -0
  38. package/example/.gitignore +14 -0
  39. package/example/.watchmanconfig +1 -0
  40. package/example/App.tsx +262 -0
  41. package/example/android/build.gradle +15 -0
  42. package/example/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  43. package/example/android/gradle/wrapper/gradle-wrapper.properties +5 -0
  44. package/example/android/gradle.properties +34 -0
  45. package/example/android/gradlew +234 -0
  46. package/example/android/gradlew.bat +89 -0
  47. package/example/android/settings.gradle +12 -0
  48. package/example/app.json +20 -0
  49. package/example/assets/test.html +9 -0
  50. package/example/babel.config.js +3 -0
  51. package/example/examples/Alerts.tsx +72 -0
  52. package/example/examples/ApplePay.tsx +23 -0
  53. package/example/examples/Background.tsx +54 -0
  54. package/example/examples/Downloads.tsx +57 -0
  55. package/example/examples/Injection.tsx +161 -0
  56. package/example/examples/LocalPageLoad.tsx +16 -0
  57. package/example/examples/Messaging.tsx +63 -0
  58. package/example/examples/NativeWebpage.tsx +22 -0
  59. package/example/examples/Scrolling.tsx +68 -0
  60. package/example/examples/Uploads.tsx +69 -0
  61. package/example/index.js +9 -0
  62. package/example/ios/Podfile +8 -0
  63. package/example/ios/Podfile.lock +445 -0
  64. package/jest-setups/jest.setup.js +8 -0
  65. package/jest.config.js +184 -0
  66. package/lib/WebView.android.d.ts.map +1 -0
  67. package/lib/WebView.android.js +5 -6
  68. package/lib/WebView.d.ts.map +1 -0
  69. package/lib/WebView.ios.d.ts.map +1 -0
  70. package/lib/WebView.ios.js +3 -1
  71. package/lib/WebView.styles.d.ts.map +1 -0
  72. package/lib/WebViewNativeComponent.android.d.ts.map +1 -0
  73. package/lib/WebViewNativeComponent.ios.d.ts.map +1 -0
  74. package/lib/WebViewShared.d.ts.map +1 -0
  75. package/lib/WebViewTypes.d.ts.map +1 -0
  76. package/lib/index.d.ts.map +1 -0
  77. package/lib/validation.d.ts +4 -0
  78. package/lib/validation.d.ts.map +1 -0
  79. package/lib/validation.js +9 -0
  80. package/metro.config.js +57 -0
  81. package/package.json +1 -1
  82. package/src/WebView.android.tsx +255 -0
  83. package/src/WebView.ios.tsx +230 -0
  84. package/src/WebView.styles.ts +44 -0
  85. package/src/WebView.tsx +18 -0
  86. package/src/WebViewNativeComponent.android.ts +8 -0
  87. package/src/WebViewNativeComponent.ios.ts +8 -0
  88. package/src/WebViewShared.tsx +318 -0
  89. package/src/WebViewTypes.ts +941 -0
  90. package/src/__tests__/WebViewShared-test.js +292 -0
  91. package/src/__tests__/__snapshots__/WebViewShared-test.js.snap +13 -0
  92. package/src/__tests__/validation-test.js +39 -0
  93. package/src/index.ts +4 -0
  94. package/src/validation.ts +13 -0
  95. package/tsconfig.json +24 -0
  96. package/yarn.lock +13397 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebView.ios.d.ts","sourceRoot":"","sources":["../src/WebView.ios.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA+D,MAAM,OAAO,CAAC;AAoBpF,OAAO,EACL,eAAe,EAIhB,MAAM,gBAAgB,CAAC;AA0MxB,QAAA,MAAM,OAAO;iCAHsB,QAAQ,OAAO,CAAC;CAGqB,CAAC;AAEzE,eAAe,OAAO,CAAC"}
@@ -6,6 +6,7 @@ import codegenNativeCommandsUntyped from 'react-native/Libraries/Utilities/codeg
6
6
  import RNCWebView from "./WebViewNativeComponent.ios";
7
7
  import { defaultOriginWhitelist, defaultDeeplinkWhitelist, defaultRenderError, defaultRenderLoading, useWebWiewLogic, versionPasses, } from './WebViewShared';
8
8
  import styles from './WebView.styles';
9
+ import validateProps from './validation';
9
10
  const codegenNativeCommands = codegenNativeCommandsUntyped;
10
11
  const Commands = codegenNativeCommands({
11
12
  supportedCommands: ['goBack', 'goForward', 'reload', 'stopLoading', /* 'injectJavaScript', */ 'requestFocus', 'postMessage', 'loadUrl'],
@@ -39,7 +40,8 @@ const sharedCookiesEnabled = false;
39
40
  const enableApplePay = false;
40
41
  const dataDetectorTypes = 'none';
41
42
  const hardMinimumIOSVersion = '12.5.6 <13, 13.6.1 <14, 14.8.1 <15, 15.7.1';
42
- const WebViewComponent = forwardRef(({ javaScriptEnabled = true, cacheEnabled = true, originWhitelist = defaultOriginWhitelist, deeplinkWhitelist = defaultDeeplinkWhitelist, textInteractionEnabled = true, injectedJavaScript, injectedJavaScriptBeforeContentLoaded, startInLoadingState, onLoadStart, onError, onLoad, onLoadEnd, onMessage: onMessageProp, renderLoading, renderError, style, containerStyle, source, incognito, validateMeta, validateData, decelerationRate: decelerationRateProp, onShouldStartLoadWithRequest: onShouldStartLoadWithRequestProp, minimumIOSVersion, unsupportedVersionComponent: UnsupportedVersionComponent, ...otherProps }, ref) => {
43
+ const WebViewComponent = forwardRef((props, ref) => {
44
+ const { javaScriptEnabled = true, cacheEnabled = true, originWhitelist = defaultOriginWhitelist, deeplinkWhitelist = defaultDeeplinkWhitelist, textInteractionEnabled = true, injectedJavaScript, injectedJavaScriptBeforeContentLoaded, startInLoadingState, onLoadStart, onError, onLoad, onLoadEnd, onMessage: onMessageProp, renderLoading, renderError, style, containerStyle, source, incognito, validateMeta, validateData, decelerationRate: decelerationRateProp, onShouldStartLoadWithRequest: onShouldStartLoadWithRequestProp, minimumIOSVersion, unsupportedVersionComponent: UnsupportedVersionComponent, ...otherProps } = validateProps(props);
43
45
  const webViewRef = useRef(null);
44
46
  const onShouldStartLoadWithRequestCallback = useCallback((shouldStart, _url, lockIdentifier = 0) => {
45
47
  const viewManager = RNCWebViewManager;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebView.styles.d.ts","sourceRoot":"","sources":["../src/WebView.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEhE,UAAU,MAAM;IACd,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,EAAE,SAAS,CAAC;IACrB,cAAc,EAAE,SAAS,CAAC;IAC1B,kBAAkB,EAAE,SAAS,CAAC;IAC9B,OAAO,EAAE,SAAS,CAAC;IACnB,kBAAkB,EAAE,SAAS,CAAC;CAC/B;AAED,QAAA,MAAM,MAAM,QA8BV,CAAC;AAEH,eAAe,MAAM,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebViewNativeComponent.android.d.ts","sourceRoot":"","sources":["../src/WebViewNativeComponent.android.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAE3D,QAAA,MAAM,UAAU,EAAE,OAAO,oBAExB,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebViewNativeComponent.ios.d.ts","sourceRoot":"","sources":["../src/WebViewNativeComponent.ios.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,QAAA,MAAM,UAAU,EAAE,OAAO,gBAExB,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebViewShared.d.ts","sourceRoot":"","sources":["../src/WebViewShared.tsx"],"names":[],"mappings":"AACA,OAAO,KAAiD,MAAM,OAAO,CAAC;AAEtE,OAAO,EACL,4BAA4B,EAC5B,2BAA2B,EAC3B,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,sBAAsB,EACtB,sBAAsB,EACtB,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,gBAAgB,CAAC;AAGxB,QAAA,MAAM,sBAAsB,wBAAyB,CAAC;AACtD,QAAA,MAAM,wBAAwB,qBAAsB,CAAC;AAgDrD,QAAA,MAAM,kCAAkC,8BAEvB,OAAO,OACf,MAAM,kBACK,MAAM,KACnB,IAAI,mBACQ,SAAS,MAAM,EAAE,qBACf,SAAS,MAAM,EAAE,oIA8CrC,CAAC;AAEF,QAAA,MAAM,oBAAoB,mBAIzB,CAAC;AACF,QAAA,MAAM,kBAAkB,gBACT,MAAM,GAAG,SAAS,aACpB,MAAM,aACN,MAAM,gBAQlB,CAAC;AAEF,OAAO,EACL,sBAAsB,EACtB,wBAAwB,EACxB,kCAAkC,EAClC,oBAAoB,EACpB,kBAAkB,GACnB,CAAC;AAGF,eAAO,MAAM,eAAe;;sDAgBuB,IAAI;iDACT,IAAI;yBAC5B,sBAAsB,GAAG,iBAAiB,KAAK,IAAI;6CAC/B,IAAI;6BACpB,cAAc,KAAK,IAAI;gCACpB,sBAAsB,KAAK,IAAI;qBACzC,SAAS,MAAM,EAAE;uBACf,SAAS,MAAM,EAAE;;wDAEgB,OAAO,OAAO,MAAM,mBAAmB,MAAM,GAAG,SAAS,KAAK,IAAI;0BAChG,kBAAkB,KAAK,kBAAkB;yBAC1C,MAAM,KAAK,MAAM;;;;;;;;0BA2FG,sBAAsB;2BApFjC,MAAM;;;;CAsGrC,CAAC;AAEF,eAAO,MAAM,aAAa,YAAa,MAAM,GAAG,SAAS,WAAW,MAAM,GAAG,SAAS,KAAG,OA+BxF,CAAA"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebViewTypes.d.ts","sourceRoot":"","sources":["../src/WebViewTypes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,WAAW,CAAC;AAEhC,OAAO,EAAE,OAAO,EAAE,CAAC;AACnB,eAAe,OAAO,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { AndroidWebViewProps, IOSWebViewProps } from './WebViewTypes';
2
+ declare const validateProps: <P extends IOSWebViewProps | AndroidWebViewProps>(props: P) => P;
3
+ export default validateProps;
4
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAE1E,QAAA,MAAM,aAAa,kEAOlB,CAAA;AAED,eAAe,aAAa,CAAA"}
@@ -0,0 +1,9 @@
1
+ import invariant from 'invariant';
2
+ const validateProps = (props) => {
3
+ if (props.source && 'html' in props.source) {
4
+ const { originWhitelist } = props;
5
+ invariant(originWhitelist && originWhitelist.length > 0 && !originWhitelist.includes('*'), 'originWhitelist is required when using source.html prop and cannot include *');
6
+ }
7
+ return props;
8
+ };
9
+ export default validateProps;
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Metro configuration for React Native
3
+ * https://github.com/facebook/react-native
4
+ *
5
+ * @format
6
+ */
7
+
8
+ const path = require('path');
9
+
10
+ const exclusionList = (() => {
11
+ try {
12
+ return require('metro-config/src/defaults/exclusionList');
13
+ } catch (_) {
14
+ // `blacklist` was renamed to `exclusionList` in 0.60
15
+ return require('metro-config/src/defaults/blacklist');
16
+ }
17
+ })();
18
+
19
+ const blockList = exclusionList([
20
+ /node_modules\/.*\/node_modules\/react-native\/.*/,
21
+
22
+ // Workaround for `EPERM: operation not permitted, lstat '~\midl-MIDLRT-cl.read.1.tlog'`
23
+ /.*\.tlog/,
24
+
25
+ // This stops "react-native run-windows" from causing the metro server to
26
+ // crash if its already running
27
+ new RegExp(`${path.join(__dirname, 'windows').replace(/[/\\]+/g, '/')}.*`),
28
+
29
+ // Workaround for `EBUSY: resource busy or locked, open '~\msbuild.ProjectImports.zip'`
30
+ /.*\.ProjectImports\.zip/,
31
+ ]);
32
+
33
+ /**
34
+ * This config is a bit exotic because our example app is not its own package
35
+ * (that would require setting this repo up as a monorepo). We need to tell
36
+ * Metro that the root of the project is our `example` folder (`projectRoot`),
37
+ * and that it should look for modules in repo root (`watchFolders`) as this is
38
+ * where the `node_modules` folder lives. Metro will otherwise fail to resolve
39
+ * anything.
40
+ */
41
+ module.exports = {
42
+ projectRoot: path.join(__dirname, 'example'),
43
+ watchFolders: [__dirname],
44
+ resolver: {
45
+ resolverMainFields: ['main-internal', 'browser', 'main'],
46
+ blacklistRE: blockList,
47
+ blockList,
48
+ },
49
+ transformer: {
50
+ getTransformOptions: async () => ({
51
+ transform: {
52
+ experimentalImportSupport: false,
53
+ inlineRequires: false,
54
+ },
55
+ }),
56
+ },
57
+ };
package/package.json CHANGED
@@ -9,7 +9,7 @@
9
9
  "Thibault Malbranche <malbranche.thibault@gmail.com>"
10
10
  ],
11
11
  "license": "MIT",
12
- "version": "11.26.1-exodus.31",
12
+ "version": "11.26.1-exodus.32",
13
13
  "homepage": "https://github.com/ExodusMovement/react-native-webview#readme",
14
14
  "scripts": {
15
15
  "android": "react-native run-android",
@@ -0,0 +1,255 @@
1
+ import React, { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';
2
+
3
+ import {
4
+ Text,
5
+ View,
6
+ NativeModules,
7
+ } from 'react-native';
8
+
9
+ import BatchedBridge from 'react-native/Libraries/BatchedBridge/BatchedBridge';
10
+ // @ts-expect-error react-native doesn't have this type
11
+ import codegenNativeCommandsUntyped from 'react-native/Libraries/Utilities/codegenNativeCommands';
12
+
13
+ import invariant from 'invariant';
14
+
15
+ import RNCWebView from "./WebViewNativeComponent.android";
16
+ import {
17
+ defaultOriginWhitelist,
18
+ defaultDeeplinkWhitelist,
19
+ defaultRenderError,
20
+ defaultRenderLoading,
21
+ useWebWiewLogic,
22
+ versionPasses,
23
+ } from './WebViewShared';
24
+ import {
25
+ AndroidWebViewProps,
26
+ NativeWebViewAndroid,
27
+ } from './WebViewTypes';
28
+
29
+ import styles from './WebView.styles';
30
+ import validateProps from './validation'
31
+
32
+ const { getWebViewDefaultUserAgent } = NativeModules.RNCWebViewUtils;
33
+
34
+ let userAgentPromise: Promise<string> | undefined
35
+
36
+ async function getUserAgent(): Promise<string> {
37
+ if (!userAgentPromise) userAgentPromise = getWebViewDefaultUserAgent()
38
+ const userAgent = await userAgentPromise
39
+ return userAgent || 'unknown'
40
+ }
41
+
42
+ const codegenNativeCommands = codegenNativeCommandsUntyped as <T extends {}>(options: { supportedCommands: (keyof T)[] }) => T;
43
+
44
+ const Commands = codegenNativeCommands({
45
+ supportedCommands: ['goBack', 'goForward', 'reload', 'stopLoading', /* 'injectJavaScript', */ 'requestFocus', 'postMessage', 'clearFormData', 'clearCache', 'clearHistory', 'loadUrl'],
46
+ });
47
+
48
+ /**
49
+ * A simple counter to uniquely identify WebView instances. Do not use this for anything else.
50
+ */
51
+ let uniqueRef = 0;
52
+
53
+ /**
54
+ * Harcoded default for security.
55
+ */
56
+ const mediaPlaybackRequiresUserAction = true;
57
+ // Android only
58
+ const setSupportMultipleWindows = true;
59
+ const mixedContentMode = 'never'
60
+ const hardMinimumChromeVersion = '100.0' // TODO: determinime a good lower bound
61
+
62
+ const WebViewComponent = forwardRef<{}, AndroidWebViewProps>((props, ref) => {
63
+ const {
64
+ overScrollMode = 'always',
65
+ javaScriptEnabled = true,
66
+ thirdPartyCookiesEnabled = true,
67
+ scalesPageToFit = true,
68
+ saveFormDataDisabled = false,
69
+ cacheEnabled = true,
70
+ androidHardwareAccelerationDisabled = false,
71
+ androidLayerType = "none",
72
+ originWhitelist = defaultOriginWhitelist,
73
+ deeplinkWhitelist = defaultDeeplinkWhitelist,
74
+ setBuiltInZoomControls = true,
75
+ setDisplayZoomControls = false,
76
+ nestedScrollEnabled = false,
77
+ startInLoadingState,
78
+ onLoadStart,
79
+ onError,
80
+ onLoad,
81
+ onLoadEnd,
82
+ onMessage: onMessageProp,
83
+ onOpenWindow: onOpenWindowProp,
84
+ renderLoading,
85
+ renderError,
86
+ style,
87
+ containerStyle,
88
+ source,
89
+ onShouldStartLoadWithRequest: onShouldStartLoadWithRequestProp,
90
+ validateMeta,
91
+ validateData,
92
+ minimumChromeVersion,
93
+ unsupportedVersionComponent: UnsupportedVersionComponent,
94
+ ...otherProps
95
+ } = validateProps(props)
96
+
97
+ const messagingModuleName = useRef<string>(`WebViewMessageHandler${uniqueRef += 1}`).current;
98
+ const webViewRef = useRef<NativeWebViewAndroid | null>(null);
99
+
100
+ const onShouldStartLoadWithRequestCallback = useCallback((shouldStart: boolean,
101
+ url: string,
102
+ lockIdentifier?: number) => {
103
+ if (lockIdentifier) {
104
+ NativeModules.RNCWebView.onShouldStartLoadWithRequestCallback(shouldStart, lockIdentifier);
105
+ } else if (shouldStart) {
106
+ Commands.loadUrl(webViewRef.current, url);
107
+ }
108
+ }, []);
109
+
110
+ const { onLoadingStart, onShouldStartLoadWithRequest, onMessage, viewState, setViewState, lastErrorEvent, onLoadingError, onLoadingFinish, onLoadingProgress, onOpenWindow, passesWhitelist } = useWebWiewLogic({
111
+ onLoad,
112
+ onError,
113
+ onLoadEnd,
114
+ onLoadStart,
115
+ onMessageProp,
116
+ onOpenWindowProp,
117
+ startInLoadingState,
118
+ originWhitelist,
119
+ deeplinkWhitelist,
120
+ onShouldStartLoadWithRequestProp,
121
+ onShouldStartLoadWithRequestCallback,
122
+ validateMeta,
123
+ validateData,
124
+ })
125
+
126
+ useImperativeHandle(ref, () => ({
127
+ goForward: () => webViewRef.current && Commands.goForward(webViewRef.current),
128
+ goBack: () => webViewRef.current && Commands.goBack(webViewRef.current),
129
+ reload: () => {
130
+ setViewState(
131
+ 'LOADING',
132
+ );
133
+ if (webViewRef.current) {
134
+ Commands.reload(webViewRef.current)
135
+ }
136
+ },
137
+ stopLoading: () => webViewRef.current && Commands.stopLoading(webViewRef.current),
138
+ postMessage: (data: string) => webViewRef.current && Commands.postMessage(webViewRef.current, data),
139
+ // injectJavaScript: (data: string) => Commands.injectJavaScript(webViewRef.current, data),
140
+ requestFocus: () => webViewRef.current && Commands.requestFocus(webViewRef.current),
141
+ clearFormData: () => webViewRef.current && Commands.clearFormData(webViewRef.current),
142
+ clearCache: (includeDiskFiles: boolean) => webViewRef.current && Commands.clearCache(webViewRef.current, includeDiskFiles),
143
+ clearHistory: () => webViewRef.current && Commands.clearHistory(webViewRef.current),
144
+ }), [setViewState, webViewRef]);
145
+
146
+ const directEventCallbacks = useMemo(() => ({
147
+ onShouldStartLoadWithRequest,
148
+ onMessage,
149
+ }), [onMessage, onShouldStartLoadWithRequest]);
150
+
151
+ useEffect(() => {
152
+ BatchedBridge.registerCallableModule(messagingModuleName, directEventCallbacks);
153
+ }, [messagingModuleName, directEventCallbacks])
154
+
155
+ const [userAgent, setUserAgent] = useState<string>()
156
+
157
+ useEffect(() => {
158
+ getUserAgent().then(setUserAgent)
159
+ }, [])
160
+
161
+ if (!userAgent) return null // stop the rendering until userAgent is known
162
+ const version = userAgent.match(/chrome\/((?:[0-9]+\.)+[0-9]+)/i)?.[1]
163
+ if (!(versionPasses(version, minimumChromeVersion) && versionPasses(version, hardMinimumChromeVersion))) {
164
+ if (UnsupportedVersionComponent) {
165
+ return <UnsupportedVersionComponent />
166
+ }
167
+ return (
168
+ <View style={{ alignSelf: 'flex-start' }}>
169
+ <Text style={{ color: 'red' }}>
170
+ Chrome version is outdated and insecure. Update it to continue.
171
+ </Text>
172
+ </View>
173
+ );
174
+ }
175
+
176
+ let otherView = null;
177
+ if (viewState === 'LOADING') {
178
+ otherView = (renderLoading || defaultRenderLoading)();
179
+ } else if (viewState === 'ERROR') {
180
+ invariant(lastErrorEvent != null, 'lastErrorEvent expected to be non-null');
181
+ otherView = (renderError || defaultRenderError)(
182
+ lastErrorEvent.domain,
183
+ lastErrorEvent.code,
184
+ lastErrorEvent.description,
185
+ );
186
+ } else if (viewState !== 'IDLE') {
187
+ console.error(`RNCWebView invalid state encountered: ${viewState}`);
188
+ }
189
+
190
+ const webViewStyles = [styles.container, styles.webView, style];
191
+ const webViewContainerStyle = [styles.container, containerStyle];
192
+
193
+ if (typeof source !== "number" && source && 'method' in source) {
194
+ if (source.method === 'POST' && source.headers) {
195
+ console.warn(
196
+ 'WebView: `source.headers` is not supported when using POST.',
197
+ );
198
+ } else if (source.method === 'GET' && source.body) {
199
+ console.warn('WebView: `source.body` is not supported when using GET.');
200
+ }
201
+ }
202
+
203
+ const safeSource = (typeof source === "object" && 'uri' in source && !passesWhitelist(source.uri)) ? { uri: 'about:blank' } : source;
204
+
205
+ const NativeWebView = RNCWebView;
206
+
207
+ const webView = <NativeWebView
208
+ key="webViewKey"
209
+ {...otherProps}
210
+ messagingEnabled={typeof onMessageProp === 'function'}
211
+ messagingModuleName={messagingModuleName}
212
+
213
+ onLoadingError={onLoadingError}
214
+ onLoadingFinish={onLoadingFinish}
215
+ onLoadingProgress={onLoadingProgress}
216
+ onLoadingStart={onLoadingStart}
217
+ onMessage={onMessage}
218
+ onOpenWindow={onOpenWindow}
219
+ onShouldStartLoadWithRequest={onShouldStartLoadWithRequest}
220
+
221
+ ref={webViewRef}
222
+ // TODO: find a better way to type this.
223
+ source={safeSource}
224
+ style={webViewStyles}
225
+ overScrollMode={overScrollMode}
226
+ javaScriptEnabled={javaScriptEnabled}
227
+ thirdPartyCookiesEnabled={thirdPartyCookiesEnabled}
228
+ scalesPageToFit={scalesPageToFit}
229
+ saveFormDataDisabled={saveFormDataDisabled}
230
+ cacheEnabled={cacheEnabled}
231
+ androidHardwareAccelerationDisabled={androidHardwareAccelerationDisabled}
232
+ androidLayerType={androidLayerType}
233
+ setSupportMultipleWindows={setSupportMultipleWindows}
234
+ setBuiltInZoomControls={setBuiltInZoomControls}
235
+ setDisplayZoomControls={setDisplayZoomControls}
236
+ mixedContentMode={mixedContentMode}
237
+ nestedScrollEnabled={nestedScrollEnabled}
238
+ mediaPlaybackRequiresUserAction={mediaPlaybackRequiresUserAction}
239
+ />
240
+
241
+ return (
242
+ <View style={webViewContainerStyle}>
243
+ {webView}
244
+ {otherView}
245
+ </View>
246
+ );
247
+ });
248
+
249
+ // native implementation should return "true" only for Android 5+
250
+ const isFileUploadSupported: () => Promise<boolean>
251
+ = NativeModules.RNCWebView.isFileUploadSupported();
252
+
253
+ const WebView = Object.assign(WebViewComponent, {isFileUploadSupported});
254
+
255
+ export default WebView;
@@ -0,0 +1,230 @@
1
+ import React, { forwardRef, useCallback, useImperativeHandle, useRef } from 'react';
2
+ import {
3
+ Text,
4
+ View,
5
+ NativeModules,
6
+ Platform,
7
+ } from 'react-native';
8
+ import invariant from 'invariant';
9
+
10
+ // @ts-expect-error react-native doesn't have this type
11
+ import codegenNativeCommandsUntyped from 'react-native/Libraries/Utilities/codegenNativeCommands';
12
+ import RNCWebView from "./WebViewNativeComponent.ios";
13
+ import {
14
+ defaultOriginWhitelist,
15
+ defaultDeeplinkWhitelist,
16
+ defaultRenderError,
17
+ defaultRenderLoading,
18
+ useWebWiewLogic,
19
+ versionPasses,
20
+ } from './WebViewShared';
21
+ import {
22
+ IOSWebViewProps,
23
+ DecelerationRateConstant,
24
+ NativeWebViewIOS,
25
+ ViewManager,
26
+ } from './WebViewTypes';
27
+
28
+ import styles from './WebView.styles';
29
+ import validateProps from './validation'
30
+
31
+ const codegenNativeCommands = codegenNativeCommandsUntyped as <T extends {}>(options: { supportedCommands: (keyof T)[] }) => T;
32
+
33
+ const Commands = codegenNativeCommands({
34
+ supportedCommands: ['goBack', 'goForward', 'reload', 'stopLoading', /* 'injectJavaScript', */ 'requestFocus', 'postMessage', 'loadUrl'],
35
+ });
36
+
37
+ const processDecelerationRate = (
38
+ decelerationRate: DecelerationRateConstant | number | undefined,
39
+ ) => {
40
+ let newDecelerationRate = decelerationRate;
41
+ if (newDecelerationRate === 'normal') {
42
+ newDecelerationRate = 0.998;
43
+ } else if (newDecelerationRate === 'fast') {
44
+ newDecelerationRate = 0.99;
45
+ }
46
+ return newDecelerationRate;
47
+ };
48
+
49
+ const RNCWebViewManager = NativeModules.RNCWebViewManager as ViewManager;
50
+
51
+ const useWarnIfChanges = <T extends unknown>(value: T, name: string) => {
52
+ const ref = useRef(value);
53
+ if (ref.current !== value) {
54
+ console.warn(`Changes to property ${name} do nothing after the initial render.`);
55
+ ref.current = value;
56
+ }
57
+ }
58
+
59
+ /**
60
+ * Harcoded defaults for security.
61
+ */
62
+ const mediaPlaybackRequiresUserAction = true;
63
+ // iOS only configs
64
+ const allowsInlineMediaPlayback = true;
65
+ const useSharedProcessPool = false;
66
+ const sharedCookiesEnabled = false;
67
+ const enableApplePay = false;
68
+ const dataDetectorTypes = 'none';
69
+ const hardMinimumIOSVersion = '12.5.6 <13, 13.6.1 <14, 14.8.1 <15, 15.7.1'
70
+
71
+ const WebViewComponent = forwardRef<{}, IOSWebViewProps>((props, ref) => {
72
+ const {
73
+ javaScriptEnabled = true,
74
+ cacheEnabled = true,
75
+ originWhitelist = defaultOriginWhitelist,
76
+ deeplinkWhitelist = defaultDeeplinkWhitelist,
77
+ textInteractionEnabled= true,
78
+ injectedJavaScript,
79
+ injectedJavaScriptBeforeContentLoaded,
80
+ startInLoadingState,
81
+ onLoadStart,
82
+ onError,
83
+ onLoad,
84
+ onLoadEnd,
85
+ onMessage: onMessageProp,
86
+ renderLoading,
87
+ renderError,
88
+ style,
89
+ containerStyle,
90
+ source,
91
+ incognito,
92
+ validateMeta,
93
+ validateData,
94
+ decelerationRate: decelerationRateProp,
95
+ onShouldStartLoadWithRequest: onShouldStartLoadWithRequestProp,
96
+ minimumIOSVersion,
97
+ unsupportedVersionComponent: UnsupportedVersionComponent,
98
+ ...otherProps
99
+ } = validateProps(props)
100
+
101
+ const webViewRef = useRef<NativeWebViewIOS | null>(null);
102
+
103
+ const onShouldStartLoadWithRequestCallback = useCallback((
104
+ shouldStart: boolean,
105
+ _url: string,
106
+ lockIdentifier = 0,
107
+ ) => {
108
+ const viewManager = RNCWebViewManager;
109
+
110
+ viewManager.startLoadWithResult(!!shouldStart, lockIdentifier);
111
+ }, []);
112
+
113
+ const { onLoadingStart, onShouldStartLoadWithRequest, onMessage, viewState, setViewState, lastErrorEvent, onLoadingError, onLoadingFinish, onLoadingProgress } = useWebWiewLogic({
114
+ onLoad,
115
+ onError,
116
+ onLoadEnd,
117
+ onLoadStart,
118
+ onMessageProp,
119
+ startInLoadingState,
120
+ originWhitelist,
121
+ deeplinkWhitelist,
122
+ onShouldStartLoadWithRequestProp,
123
+ onShouldStartLoadWithRequestCallback,
124
+ validateMeta,
125
+ validateData,
126
+ });
127
+
128
+ useImperativeHandle(ref, () => ({
129
+ goForward: () => webViewRef.current && Commands.goForward(webViewRef.current),
130
+ goBack: () => webViewRef.current && Commands.goBack(webViewRef.current),
131
+ reload: () => {
132
+ setViewState(
133
+ 'LOADING',
134
+ );
135
+ if (webViewRef.current) {
136
+ Commands.reload(webViewRef.current)
137
+ }
138
+ },
139
+ stopLoading: () => webViewRef.current && Commands.stopLoading(webViewRef.current),
140
+ postMessage: (data: string) => webViewRef.current && Commands.postMessage(webViewRef.current, data),
141
+ // injectJavaScript: (data: string) => Commands.injectJavaScript(webViewRef.current, data),
142
+ requestFocus: () => webViewRef.current && Commands.requestFocus(webViewRef.current),
143
+ }), [setViewState, webViewRef]);
144
+
145
+
146
+ useWarnIfChanges(allowsInlineMediaPlayback, 'allowsInlineMediaPlayback');
147
+ useWarnIfChanges(incognito, 'incognito');
148
+ useWarnIfChanges(mediaPlaybackRequiresUserAction, 'mediaPlaybackRequiresUserAction');
149
+ useWarnIfChanges(dataDetectorTypes, 'dataDetectorTypes');
150
+
151
+ const version = String(Platform.Version)
152
+ if (!(versionPasses(version, minimumIOSVersion) && versionPasses(version, hardMinimumIOSVersion))) {
153
+ if (UnsupportedVersionComponent) {
154
+ return <UnsupportedVersionComponent />
155
+ }
156
+ return (
157
+ <View style={{ alignSelf: 'flex-start' }}>
158
+ <Text style={{ color: 'red' }}>
159
+ iOS version is outdated and insecure. Update it to continue.
160
+ </Text>
161
+ </View>
162
+ );
163
+ }
164
+
165
+ let otherView = null;
166
+ if (viewState === 'LOADING') {
167
+ otherView = (renderLoading || defaultRenderLoading)();
168
+ } else if (viewState === 'ERROR') {
169
+ invariant(lastErrorEvent != null, 'lastErrorEvent expected to be non-null');
170
+ otherView = (renderError || defaultRenderError)(
171
+ lastErrorEvent.domain,
172
+ lastErrorEvent.code,
173
+ lastErrorEvent.description,
174
+ );
175
+ } else if (viewState !== 'IDLE') {
176
+ console.error(`RNCWebView invalid state encountered: ${viewState}`);
177
+ }
178
+
179
+ const webViewStyles = [styles.container, styles.webView, style];
180
+ const webViewContainerStyle = [styles.container, containerStyle];
181
+
182
+ const decelerationRate = processDecelerationRate(decelerationRateProp);
183
+
184
+ const NativeWebView = RNCWebView;
185
+
186
+ const webView = (
187
+ <NativeWebView
188
+ key="webViewKey"
189
+ {...otherProps}
190
+ enableApplePay={enableApplePay}
191
+ javaScriptEnabled={javaScriptEnabled}
192
+ cacheEnabled={cacheEnabled}
193
+ dataDetectorTypes={dataDetectorTypes}
194
+ useSharedProcessPool={useSharedProcessPool}
195
+ textInteractionEnabled={textInteractionEnabled}
196
+ decelerationRate={decelerationRate}
197
+ messagingEnabled={typeof onMessageProp === 'function'}
198
+ onLoadingError={onLoadingError}
199
+ onLoadingFinish={onLoadingFinish}
200
+ onLoadingProgress={onLoadingProgress}
201
+ onLoadingStart={onLoadingStart}
202
+ onMessage={onMessage}
203
+ onShouldStartLoadWithRequest={onShouldStartLoadWithRequest}
204
+ injectedJavaScript={injectedJavaScript}
205
+ injectedJavaScriptBeforeContentLoaded={injectedJavaScriptBeforeContentLoaded}
206
+ allowsInlineMediaPlayback={allowsInlineMediaPlayback}
207
+ incognito={incognito}
208
+ mediaPlaybackRequiresUserAction={mediaPlaybackRequiresUserAction}
209
+ ref={webViewRef}
210
+ sharedCookiesEnabled={sharedCookiesEnabled}
211
+ // TODO: find a better way to type this.
212
+ source={source}
213
+ style={webViewStyles}
214
+ />
215
+ );
216
+
217
+ return (
218
+ <View style={webViewContainerStyle}>
219
+ {webView}
220
+ {otherView}
221
+ </View>
222
+ );})
223
+
224
+ // no native implementation for iOS, depends only on permissions
225
+ const isFileUploadSupported: () => Promise<boolean>
226
+ = async () => true;
227
+
228
+ const WebView = Object.assign(WebViewComponent, {isFileUploadSupported});
229
+
230
+ export default WebView;