diff --git a/Libraries/Components/WKWebView/WKWebView.android.js b/Libraries/Components/WKWebView/WKWebView.android.js new file mode 100644 index 00000000000000..a4cab312304c75 --- /dev/null +++ b/Libraries/Components/WKWebView/WKWebView.android.js @@ -0,0 +1,22 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @format + * @flow + * @providesModule WKWebView + */ + +const React = require('React'); +const View = require('View'); +const Text = require('Text'); + +module.exports = () => { + return ( + + Android version not implemented. + + ); +}; diff --git a/Libraries/Components/WKWebView/WKWebView.ios.js b/Libraries/Components/WKWebView/WKWebView.ios.js new file mode 100644 index 00000000000000..d1af14bfebd6e7 --- /dev/null +++ b/Libraries/Components/WKWebView/WKWebView.ios.js @@ -0,0 +1,14 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @format + * @flow + * @providesModule WKWebView + */ + +const requireNativeComponent = require('requireNativeComponent'); + +module.exports = requireNativeComponent('RCTWKWebView'); diff --git a/React/Views/RCTWKWebView.h b/React/Views/RCTWKWebView.h new file mode 100644 index 00000000000000..7e985f68e7af9c --- /dev/null +++ b/React/Views/RCTWKWebView.h @@ -0,0 +1,22 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +@class RCTWKWebView; + +@protocol RCTWKWebViewDelegate +@end + +@interface RCTWKWebView : RCTView + +@property (nonatomic, weak) id delegate; +@property (nonatomic, copy) NSDictionary *source; + +@end diff --git a/React/Views/RCTWKWebView.m b/React/Views/RCTWKWebView.m new file mode 100644 index 00000000000000..98cdf290b87511 --- /dev/null +++ b/React/Views/RCTWKWebView.m @@ -0,0 +1,72 @@ +#import "RCTWKWebView.h" + +#import + +#import + +#import "RCTAutoInsetsProtocol.h" + +@interface RCTWKWebView () +@end + +@implementation RCTWKWebView +{ + WKWebView *_webView; +} + +- (void)dealloc +{ + +} + +- (instancetype)initWithFrame:(CGRect)frame +{ + if ((self = [super initWithFrame:frame])) { + super.backgroundColor = [UIColor clearColor]; + _webView = [[WKWebView alloc] initWithFrame:self.bounds]; + _webView.UIDelegate = self; + [self addSubview:_webView]; + } + return self; +} + +- (void)setSource:(NSDictionary *)source +{ + if (![_source isEqualToDictionary:source]) { + _source = [source copy]; + + // Check for a static html source first + NSString *html = [RCTConvert NSString:source[@"html"]]; + if (html) { + NSURL *baseURL = [RCTConvert NSURL:source[@"baseUrl"]]; + if (!baseURL) { + baseURL = [NSURL URLWithString:@"about:blank"]; + } + [_webView loadHTMLString:html baseURL:baseURL]; + return; + } + + NSURLRequest *request = [RCTConvert NSURLRequest:source]; + // Because of the way React works, as pages redirect, we actually end up + // passing the redirect urls back here, so we ignore them if trying to load + // the same url. We'll expose a call to 'reload' to allow a user to load + // the existing page. + if ([request.URL isEqual:_webView.URL]) { + return; + } + if (!request.URL) { + // Clear the webview + [_webView loadHTMLString:@"" baseURL:nil]; + return; + } + [_webView loadRequest:request]; + } +} + +- (void)layoutSubviews +{ + [super layoutSubviews]; + _webView.frame = self.bounds; +} + +@end diff --git a/React/Views/RCTWKWebViewManager.m b/React/Views/RCTWKWebViewManager.m new file mode 100644 index 00000000000000..e16bbe723e5087 --- /dev/null +++ b/React/Views/RCTWKWebViewManager.m @@ -0,0 +1,18 @@ +#import "RCTViewManager.h" +#import "RCTWKWebView.h" + +@interface RCTWKWebViewManager : RCTViewManager +@end + +@implementation RCTWKWebViewManager + +RCT_EXPORT_MODULE() + +- (UIView *)view +{ + return [RCTWKWebView new]; +} + +RCT_EXPORT_VIEW_PROPERTY(source, NSDictionary) + +@end