@@ -32,6 +32,7 @@ const requireNativeComponent = require('requireNativeComponent');
32
32
const resolveAssetSource = require ( 'resolveAssetSource' ) ;
33
33
34
34
const RCTWebViewManager = require ( 'NativeModules' ) . WebViewManager ;
35
+ const RCTWKWebViewManager = require ( 'NativeModules' ) . WKWebViewManager ;
35
36
36
37
const BGWASH = 'rgba(255,255,255,0.8)' ;
37
38
const RCT_WEBVIEW_REF = 'webview' ;
@@ -66,6 +67,9 @@ const DataDetectorTypes = [
66
67
'link' ,
67
68
'address' ,
68
69
'calendarEvent' ,
70
+ 'trackingNumber' ,
71
+ 'flightNumber' ,
72
+ 'lookupSuggestion' ,
69
73
'none' ,
70
74
'all' ,
71
75
] ;
@@ -162,6 +166,12 @@ class WebView extends React.Component {
162
166
PropTypes . number ,
163
167
] ) ,
164
168
169
+ /**
170
+ * If true, use WKWebView instead of UIWebView.
171
+ * @platform ios
172
+ */
173
+ useWebKit : PropTypes . bool ,
174
+
165
175
/**
166
176
* Function that returns a view to show if there's an error.
167
177
*/
@@ -264,6 +274,11 @@ class WebView extends React.Component {
264
274
* - `'none'`
265
275
* - `'all'`
266
276
*
277
+ * With the new WebKit implementation, we have three new values:
278
+ * - `'trackingNumber'`,
279
+ * - `'flightNumber'`,
280
+ * - `'lookupSuggestion'`,
281
+ *
267
282
* @platform ios
268
283
*/
269
284
dataDetectorTypes : PropTypes . oneOfType ( [
@@ -433,7 +448,13 @@ class WebView extends React.Component {
433
448
434
449
const nativeConfig = this . props . nativeConfig || { } ;
435
450
436
- const viewManager = nativeConfig . viewManager || RCTWebViewManager ;
451
+ let viewManager = nativeConfig . viewManager ;
452
+
453
+ if ( this . props . useWebKit ) {
454
+ viewManager = viewManager || RCTWKWebViewManager ;
455
+ } else {
456
+ viewManager = viewManager || RCTWebViewManager ;
457
+ }
437
458
438
459
const compiledWhitelist = [
439
460
'about:blank' ,
@@ -474,7 +495,13 @@ class WebView extends React.Component {
474
495
475
496
const messagingEnabled = typeof this . props . onMessage === 'function' ;
476
497
477
- const NativeWebView = nativeConfig . component || RCTWebView ;
498
+ let NativeWebView = nativeConfig . component ;
499
+
500
+ if ( this . props . useWebKit ) {
501
+ NativeWebView = NativeWebView || RCTWKWebView ;
502
+ } else {
503
+ NativeWebView = NativeWebView || RCTWebView ;
504
+ }
478
505
479
506
const webView = (
480
507
< NativeWebView
@@ -514,13 +541,21 @@ class WebView extends React.Component {
514
541
) ;
515
542
}
516
543
544
+ _getCommands ( ) {
545
+ if ( ! this . props . useWebKit ) {
546
+ return UIManager . RCTWebView . Commands ;
547
+ }
548
+
549
+ return UIManager . RCTWKWebView . Commands ;
550
+ }
551
+
517
552
/**
518
553
* Go forward one page in the web view's history.
519
554
*/
520
555
goForward = ( ) => {
521
556
UIManager . dispatchViewManagerCommand (
522
557
this . getWebViewHandle ( ) ,
523
- UIManager . RCTWebView . Commands . goForward ,
558
+ this . _getCommands ( ) . goForward ,
524
559
null ,
525
560
) ;
526
561
} ;
@@ -531,7 +566,7 @@ class WebView extends React.Component {
531
566
goBack = ( ) => {
532
567
UIManager . dispatchViewManagerCommand (
533
568
this . getWebViewHandle ( ) ,
534
- UIManager . RCTWebView . Commands . goBack ,
569
+ this . _getCommands ( ) . goBack ,
535
570
null ,
536
571
) ;
537
572
} ;
@@ -543,7 +578,7 @@ class WebView extends React.Component {
543
578
this . setState ( { viewState : WebViewState . LOADING } ) ;
544
579
UIManager . dispatchViewManagerCommand (
545
580
this . getWebViewHandle ( ) ,
546
- UIManager . RCTWebView . Commands . reload ,
581
+ this . _getCommands ( ) . reload ,
547
582
null ,
548
583
) ;
549
584
} ;
@@ -554,7 +589,7 @@ class WebView extends React.Component {
554
589
stopLoading = ( ) => {
555
590
UIManager . dispatchViewManagerCommand (
556
591
this . getWebViewHandle ( ) ,
557
- UIManager . RCTWebView . Commands . stopLoading ,
592
+ this . _getCommands ( ) . stopLoading ,
558
593
null ,
559
594
) ;
560
595
} ;
@@ -572,7 +607,7 @@ class WebView extends React.Component {
572
607
postMessage = data => {
573
608
UIManager . dispatchViewManagerCommand (
574
609
this . getWebViewHandle ( ) ,
575
- UIManager . RCTWebView . Commands . postMessage ,
610
+ this . _getCommands ( ) . postMessage ,
576
611
[ String ( data ) ] ,
577
612
) ;
578
613
} ;
@@ -586,7 +621,7 @@ class WebView extends React.Component {
586
621
injectJavaScript = data => {
587
622
UIManager . dispatchViewManagerCommand (
588
623
this . getWebViewHandle ( ) ,
589
- UIManager . RCTWebView . Commands . injectJavaScript ,
624
+ this . _getCommands ( ) . injectJavaScript ,
590
625
[ data ] ,
591
626
) ;
592
627
} ;
@@ -641,9 +676,36 @@ class WebView extends React.Component {
641
676
const { onMessage} = this . props ;
642
677
onMessage && onMessage ( event ) ;
643
678
} ;
679
+
680
+ componentDidUpdate ( prevProps ) {
681
+ if ( ! ( prevProps . useWebKit && this . props . useWebKit ) ) {
682
+ return ;
683
+ }
684
+
685
+ this . _showRedboxOnPropChanges ( prevProps , 'allowsInlineMediaPlayback' ) ;
686
+ this . _showRedboxOnPropChanges ( prevProps , 'mediaPlaybackRequiresUserAction' ) ;
687
+ this . _showRedboxOnPropChanges ( prevProps , 'dataDetectorTypes' ) ;
688
+ }
689
+
690
+ _showRedboxOnPropChanges ( prevProps , propName : string ) {
691
+ if ( this . props [ propName ] !== prevProps [ propName ] ) {
692
+ console . error (
693
+ `Changes to property ${ propName } do nothing after the initial render.` ,
694
+ ) ;
695
+ }
696
+ }
644
697
}
645
698
646
- const RCTWebView = requireNativeComponent ( 'RCTWebView' ) ;
699
+ const RCTWebView = requireNativeComponent (
700
+ 'RCTWebView' ,
701
+ WebView ,
702
+ WebView . extraNativeComponentConfig ,
703
+ ) ;
704
+ const RCTWKWebView = requireNativeComponent (
705
+ 'RCTWKWebView' ,
706
+ WebView ,
707
+ WebView . extraNativeComponentConfig ,
708
+ ) ;
647
709
648
710
const styles = StyleSheet . create ( {
649
711
container : {
0 commit comments