Skip to content

Commit

Permalink
Merge branch 'master' into ios-headers-user-agent
Browse files Browse the repository at this point in the history
  • Loading branch information
gronxb committed Apr 30, 2024
2 parents b182872 + 7119160 commit 1a85baa
Show file tree
Hide file tree
Showing 6 changed files with 287 additions and 24 deletions.
19 changes: 18 additions & 1 deletion apple/RNCWebViewImpl.m
Original file line number Diff line number Diff line change
Expand Up @@ -923,12 +923,14 @@ -(void)setKeyboardDisplayRequiresUserAction:(BOOL)keyboardDisplayRequiresUserAct

-(void)setHideKeyboardAccessoryView:(BOOL)hideKeyboardAccessoryView
{
_savedHideKeyboardAccessoryView = hideKeyboardAccessoryView;

if (_webView == nil) {
_savedHideKeyboardAccessoryView = hideKeyboardAccessoryView;
return;
}

if (_savedHideKeyboardAccessoryView == false) {
[self __addInputAccessoryView];
return;
}

Expand Down Expand Up @@ -958,6 +960,21 @@ -(void)setHideKeyboardAccessoryView:(BOOL)hideKeyboardAccessoryView
object_setClass(subview, newClass);
}

- (void)__addInputAccessoryView {
UIView* subview;

for (UIView* view in _webView.scrollView.subviews) {
if([[view.class description] hasSuffix:@"_SwizzleHelperWK"])
subview = view;
}

if(subview == nil) return;

Class newClass = subview.superclass;

object_setClass(subview, newClass);
}

// UIScrollViewDelegate method
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
Expand Down
14 changes: 14 additions & 0 deletions example/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import Uploads from './examples/Uploads';
import Injection from './examples/Injection';
import LocalPageLoad from './examples/LocalPageLoad';
import Messaging from './examples/Messaging';
import MultiMessaging from './examples/MultiMessaging';
import NativeWebpage from './examples/NativeWebpage';
import ApplePay from './examples/ApplePay';
import CustomMenu from './examples/CustomMenu';
Expand All @@ -34,6 +35,14 @@ const TESTS = {
return <Messaging />;
},
},
MultiMessaging: {
title: 'MultiMessaging',
testId: 'multimessaging',
description: 'Multi js-webview postMessage messaging test',
render() {
return <MultiMessaging />;
},
},
Alerts: {
title: 'Alerts',
testId: 'alerts',
Expand Down Expand Up @@ -224,6 +233,11 @@ export default class App extends Component<Props, State> {
title="Messaging"
onPress={() => this._changeTest('Messaging')}
/>
<Button
testID="testType_multimessaging"
title="MultiMessaging"
onPress={() => this._changeTest('MultiMessaging')}
/>
<Button
testID="testType_nativeWebpage"
title="NativeWebpage"
Expand Down
104 changes: 104 additions & 0 deletions example/examples/MultiMessaging.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
/* eslint-disable react-native/no-inline-styles */
import React from 'react';
import { View, Alert, TextInput } from 'react-native';

import WebView from 'react-native-webview';

const HTML = `<!DOCTYPE html>\n
<html>
<head>
<title>Messaging</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=160, user-scalable=no">
<style type="text/css">
body {
margin: 0;
padding: 0;
font: 62.5% arial, sans-serif;
background: #ccc;
}
</style>
</head>
<body>
<button onclick="sendPostMessage()">Send post message from JS to WebView</button>
<p id="demo"></p>
<p id="test">Nothing received yet</p>
<script>
function sendPostMessage() {
window.ReactNativeWebView.postMessage('Message from JS');
}
window.addEventListener('message',function(event){
document.getElementById('test').innerHTML = event.data;
console.log("Message received from RN: ",event.data);
},false);
document.addEventListener('message',function(event){
document.getElementById('test').innerHTML = event.data;
console.log("Message received from RN: ",event.data);
},false);
</script>
</body>
</html>`;

export default function MultiMessaging() {
const webView = React.useRef<WebView | null>(null);
const webView2 = React.useRef<WebView | null>(null);

return (
<View style={{ flex: 1, flexDirection: 'row' }}>
<View style={{ flexDirection: 'column', flex: 1, margin: 4 }}>
<TextInput
style={{
height: 40,
borderColor: 'gray',
borderWidth: 1,
margin: 8,
}}
onSubmitEditing={(e) => {
webView.current?.postMessage(e.nativeEvent.text);
}}
/>
<WebView
ref={webView}
source={{ html: HTML }}
onLoadEnd={() => {
webView.current?.postMessage('Hello from RN');
}}
automaticallyAdjustContentInsets={false}
onMessage={(e: { nativeEvent: { data?: string } }) => {
Alert.alert('Message received from JS: ', e.nativeEvent.data);
}}
/>
</View>

<View style={{ flexDirection: 'column', flex: 1, margin: 4 }}>
<TextInput
style={{
height: 40,
borderColor: 'gray',
borderWidth: 1,
margin: 8,
}}
onSubmitEditing={(e) => {
webView2.current?.postMessage(e.nativeEvent.text);
}}
/>
<WebView
ref={webView2}
source={{
html: HTML.replace(/from JS/g, 'from JS2'),
}}
onLoadEnd={() => {
webView2.current?.postMessage('Hello from RN2');
}}
automaticallyAdjustContentInsets={false}
onMessage={(e: { nativeEvent: { data?: string } }) => {
Alert.alert('Message received from JS2: ', e.nativeEvent.data);
}}
/>
</View>
</View>
);
}
106 changes: 106 additions & 0 deletions example/examples/MultiMessaging.windows.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
/* eslint-disable react-native/no-inline-styles */
import React from 'react';
import { View, Alert, TextInput } from 'react-native';

import WebView from 'react-native-webview';

const HTML = `<!DOCTYPE html>\n
<html>
<head>
<title>Messaging</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=160, user-scalable=no">
<style type="text/css">
body {
margin: 0;
padding: 0;
font: 62.5% arial, sans-serif;
background: #ccc;
}
</style>
</head>
<body>
<button onclick="sendPostMessage()">Send post message from JS to WebView</button>
<p id="demo"></p>
<p id="test">Nothing received yet</p>
<script>
function sendPostMessage() {
window.postMessage('Message from JS');
}
window.addEventListener('message',function(event){
document.getElementById('test').innerHTML = event.data;
console.log("Message received from RN: ",event.data);
},false);
document.addEventListener('message',function(event){
document.getElementById('test').innerHTML = event.data;
console.log("Message received from RN: ",event.data);
},false);
</script>
</body>
</html>`;

export default function MultiMessaging() {
const webView = React.useRef<WebView | null>(null);
const webView2 = React.useRef<WebView | null>(null);

return (
<View style={{ flex: 1, flexDirection: 'row' }}>
<View style={{ flexDirection: 'column', flex: 1, margin: 4 }}>
<TextInput
style={{
height: 40,
borderColor: 'gray',
borderWidth: 1,
margin: 8,
}}
onSubmitEditing={(e) => {
webView.current?.postMessage(e.nativeEvent.text);
}}
/>
<WebView
ref={webView}
source={{ html: HTML }}
onLoadEnd={() => {
webView.current?.postMessage('Hello from RN');
}}
automaticallyAdjustContentInsets={false}
onMessage={(e: { nativeEvent: { data?: string } }) => {
Alert.alert('Message received from JS: ', e.nativeEvent.data);
}}
useWebView2
/>
</View>

<View style={{ flexDirection: 'column', flex: 1, margin: 4 }}>
<TextInput
style={{
height: 40,
borderColor: 'gray',
borderWidth: 1,
margin: 8,
}}
onSubmitEditing={(e) => {
webView2.current?.postMessage(e.nativeEvent.text);
}}
/>
<WebView
ref={webView2}
source={{
html: HTML.replace(/from JS/g, 'from JS2'),
}}
onLoadEnd={() => {
webView2.current?.postMessage('Hello from RN2');
}}
automaticallyAdjustContentInsets={false}
onMessage={(e: { nativeEvent: { data?: string } }) => {
Alert.alert('Message received from JS2: ', e.nativeEvent.data);
}}
useWebView2
/>
</View>
</View>
);
}
5 changes: 3 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
"Thibault Malbranche <malbranche.thibault@gmail.com>"
],
"license": "MIT",
"version": "13.8.4",
"version": "13.8.7",
"homepage": "https://github.com/react-native-webview/react-native-webview#readme",
"scripts": {
"android": "react-native run-android",
Expand All @@ -22,7 +22,8 @@
"ci:publish": "yarn semantic-release",
"lint": "yarn tsc --noEmit && yarn eslint ./src --ext .ts,.tsx,.js,.jsx",
"build": "babel --extensions \".ts,.tsx\" --out-dir lib src",
"prepare": "yarn build",
"prepare:types": "tsc --noEmit false --emitDeclarationOnly --declaration --rootDir src --outDir lib",
"prepare": "yarn prepare:types && yarn build",
"appium": "appium",
"test:windows": "yarn jest --setupFiles=./jest-setups/jest.setup.js",
"add:macos": "yarn add react-native-macos@0.73.17"
Expand Down

0 comments on commit 1a85baa

Please sign in to comment.