|  | @@ -0,0 +1,351 @@
 | 
	
		
			
			|  | 1 | +// /**
 | 
	
		
			
			|  | 2 | +//  * Copyright (c) 2015-present, Facebook, Inc.
 | 
	
		
			
			|  | 3 | +//  *
 | 
	
		
			
			|  | 4 | +//  * This source code is licensed under the MIT license found in the
 | 
	
		
			
			|  | 5 | +//  * LICENSE file in the root directory of this source tree.
 | 
	
		
			
			|  | 6 | +//  */
 | 
	
		
			
			|  | 7 | +
 | 
	
		
			
			|  | 8 | +// #import "IRWebView.h"
 | 
	
		
			
			|  | 9 | +
 | 
	
		
			
			|  | 10 | +// #import <UIKit/UIKit.h>
 | 
	
		
			
			|  | 11 | +
 | 
	
		
			
			|  | 12 | +// #import "RCTAutoInsetsProtocol.h"
 | 
	
		
			
			|  | 13 | +// #import "RCTConvert.h"
 | 
	
		
			
			|  | 14 | +// #import "RCTEventDispatcher.h"
 | 
	
		
			
			|  | 15 | +// #import "RCTLog.h"
 | 
	
		
			
			|  | 16 | +// #import "RCTUtils.h"
 | 
	
		
			
			|  | 17 | +// #import "RCTView.h"
 | 
	
		
			
			|  | 18 | +// #import "UIView+React.h"
 | 
	
		
			
			|  | 19 | +
 | 
	
		
			
			|  | 20 | +// NSString *const RCTJSNavigationScheme = @"react-js-navigation";
 | 
	
		
			
			|  | 21 | +
 | 
	
		
			
			|  | 22 | +// static NSString *const kPostMessageHost = @"postMessage";
 | 
	
		
			
			|  | 23 | +
 | 
	
		
			
			|  | 24 | +// @interface IRWebView () <UIWebViewDelegate, RCTAutoInsetsProtocol>
 | 
	
		
			
			|  | 25 | +
 | 
	
		
			
			|  | 26 | +// @property (nonatomic, copy) RCTDirectEventBlock onLoadingStart;
 | 
	
		
			
			|  | 27 | +// @property (nonatomic, copy) RCTDirectEventBlock onLoadingFinish;
 | 
	
		
			
			|  | 28 | +// @property (nonatomic, copy) RCTDirectEventBlock onLoadingError;
 | 
	
		
			
			|  | 29 | +// @property (nonatomic, copy) RCTDirectEventBlock onShouldStartLoadWithRequest;
 | 
	
		
			
			|  | 30 | +// @property (nonatomic, copy) RCTDirectEventBlock onMessage;
 | 
	
		
			
			|  | 31 | +
 | 
	
		
			
			|  | 32 | +// @end
 | 
	
		
			
			|  | 33 | +
 | 
	
		
			
			|  | 34 | +// @implementation IRWebView
 | 
	
		
			
			|  | 35 | +// {
 | 
	
		
			
			|  | 36 | +//   UIWebView *_webView;
 | 
	
		
			
			|  | 37 | +//   NSString *_injectedJavaScript;
 | 
	
		
			
			|  | 38 | +// }
 | 
	
		
			
			|  | 39 | +
 | 
	
		
			
			|  | 40 | +// - (void)dealloc
 | 
	
		
			
			|  | 41 | +// {
 | 
	
		
			
			|  | 42 | +//   _webView.delegate = nil;
 | 
	
		
			
			|  | 43 | +// }
 | 
	
		
			
			|  | 44 | +
 | 
	
		
			
			|  | 45 | +// - (instancetype)initWithFrame:(CGRect)frame
 | 
	
		
			
			|  | 46 | +// {
 | 
	
		
			
			|  | 47 | +//   if ((self = [super initWithFrame:frame])) {
 | 
	
		
			
			|  | 48 | +//     super.backgroundColor = [UIColor clearColor];
 | 
	
		
			
			|  | 49 | +//     _automaticallyAdjustContentInsets = YES;
 | 
	
		
			
			|  | 50 | +//     _contentInset = UIEdgeInsetsZero;
 | 
	
		
			
			|  | 51 | +//     _webView = [[UIWebView alloc] initWithFrame:self.bounds];
 | 
	
		
			
			|  | 52 | +//     _webView.delegate = self;
 | 
	
		
			
			|  | 53 | +// #if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 110000 /* __IPHONE_11_0 */
 | 
	
		
			
			|  | 54 | +//     if ([_webView.scrollView respondsToSelector:@selector(setContentInsetAdjustmentBehavior:)]) {
 | 
	
		
			
			|  | 55 | +//       _webView.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
 | 
	
		
			
			|  | 56 | +//     }
 | 
	
		
			
			|  | 57 | +// #endif
 | 
	
		
			
			|  | 58 | +//     [self addSubview:_webView];
 | 
	
		
			
			|  | 59 | +//   }
 | 
	
		
			
			|  | 60 | +//   return self;
 | 
	
		
			
			|  | 61 | +// }
 | 
	
		
			
			|  | 62 | +
 | 
	
		
			
			|  | 63 | +// RCT_NOT_IMPLEMENTED(- (instancetype)initWithCoder:(NSCoder *)aDecoder)
 | 
	
		
			
			|  | 64 | +
 | 
	
		
			
			|  | 65 | +// - (void)goForward
 | 
	
		
			
			|  | 66 | +// {
 | 
	
		
			
			|  | 67 | +//   [_webView goForward];
 | 
	
		
			
			|  | 68 | +// }
 | 
	
		
			
			|  | 69 | +
 | 
	
		
			
			|  | 70 | +// - (void)goBack
 | 
	
		
			
			|  | 71 | +// {
 | 
	
		
			
			|  | 72 | +//   [_webView goBack];
 | 
	
		
			
			|  | 73 | +// }
 | 
	
		
			
			|  | 74 | +
 | 
	
		
			
			|  | 75 | +// - (void)reload
 | 
	
		
			
			|  | 76 | +// {
 | 
	
		
			
			|  | 77 | +//   NSURLRequest *request = [RCTConvert NSURLRequest:self.source];
 | 
	
		
			
			|  | 78 | +//   if (request.URL && !_webView.request.URL.absoluteString.length) {
 | 
	
		
			
			|  | 79 | +//     [_webView loadRequest:request];
 | 
	
		
			
			|  | 80 | +//   }
 | 
	
		
			
			|  | 81 | +//   else {
 | 
	
		
			
			|  | 82 | +//     [_webView reload];
 | 
	
		
			
			|  | 83 | +//   }
 | 
	
		
			
			|  | 84 | +// }
 | 
	
		
			
			|  | 85 | +
 | 
	
		
			
			|  | 86 | +// - (void)stopLoading
 | 
	
		
			
			|  | 87 | +// {
 | 
	
		
			
			|  | 88 | +//   [_webView stopLoading];
 | 
	
		
			
			|  | 89 | +// }
 | 
	
		
			
			|  | 90 | +
 | 
	
		
			
			|  | 91 | +// - (void)postMessage:(NSString *)message
 | 
	
		
			
			|  | 92 | +// {
 | 
	
		
			
			|  | 93 | +//   NSDictionary *eventInitDict = @{
 | 
	
		
			
			|  | 94 | +//     @"data": message,
 | 
	
		
			
			|  | 95 | +//   };
 | 
	
		
			
			|  | 96 | +//   NSString *source = [NSString
 | 
	
		
			
			|  | 97 | +//     stringWithFormat:@"document.dispatchEvent(new MessageEvent('message', %@));",
 | 
	
		
			
			|  | 98 | +//     RCTJSONStringify(eventInitDict, NULL)
 | 
	
		
			
			|  | 99 | +//   ];
 | 
	
		
			
			|  | 100 | +//   [_webView stringByEvaluatingJavaScriptFromString:source];
 | 
	
		
			
			|  | 101 | +// }
 | 
	
		
			
			|  | 102 | +
 | 
	
		
			
			|  | 103 | +// - (void)injectJavaScript:(NSString *)script
 | 
	
		
			
			|  | 104 | +// {
 | 
	
		
			
			|  | 105 | +//   [_webView stringByEvaluatingJavaScriptFromString:script];
 | 
	
		
			
			|  | 106 | +// }
 | 
	
		
			
			|  | 107 | +
 | 
	
		
			
			|  | 108 | +// - (void)setSource:(NSDictionary *)source
 | 
	
		
			
			|  | 109 | +// {
 | 
	
		
			
			|  | 110 | +//   if (![_source isEqualToDictionary:source]) {
 | 
	
		
			
			|  | 111 | +//     _source = [source copy];
 | 
	
		
			
			|  | 112 | +
 | 
	
		
			
			|  | 113 | +//     // Check for a static html source first
 | 
	
		
			
			|  | 114 | +//     NSString *html = [RCTConvert NSString:source[@"html"]];
 | 
	
		
			
			|  | 115 | +//     if (html) {
 | 
	
		
			
			|  | 116 | +//       NSURL *baseURL = [RCTConvert NSURL:source[@"baseUrl"]];
 | 
	
		
			
			|  | 117 | +//       if (!baseURL) {
 | 
	
		
			
			|  | 118 | +//         baseURL = [NSURL URLWithString:@"about:blank"];
 | 
	
		
			
			|  | 119 | +//       }
 | 
	
		
			
			|  | 120 | +//       [_webView loadHTMLString:html baseURL:baseURL];
 | 
	
		
			
			|  | 121 | +//       return;
 | 
	
		
			
			|  | 122 | +//     }
 | 
	
		
			
			|  | 123 | +
 | 
	
		
			
			|  | 124 | +//     NSURLRequest *request = [RCTConvert NSURLRequest:source];
 | 
	
		
			
			|  | 125 | +//     // Because of the way React works, as pages redirect, we actually end up
 | 
	
		
			
			|  | 126 | +//     // passing the redirect urls back here, so we ignore them if trying to load
 | 
	
		
			
			|  | 127 | +//     // the same url. We'll expose a call to 'reload' to allow a user to load
 | 
	
		
			
			|  | 128 | +//     // the existing page.
 | 
	
		
			
			|  | 129 | +//     if ([request.URL isEqual:_webView.request.URL]) {
 | 
	
		
			
			|  | 130 | +//       return;
 | 
	
		
			
			|  | 131 | +//     }
 | 
	
		
			
			|  | 132 | +//     if (!request.URL) {
 | 
	
		
			
			|  | 133 | +//       // Clear the webview
 | 
	
		
			
			|  | 134 | +//       [_webView loadHTMLString:@"" baseURL:nil];
 | 
	
		
			
			|  | 135 | +//       return;
 | 
	
		
			
			|  | 136 | +//     }
 | 
	
		
			
			|  | 137 | +//     [_webView loadRequest:request];
 | 
	
		
			
			|  | 138 | +//   }
 | 
	
		
			
			|  | 139 | +// }
 | 
	
		
			
			|  | 140 | +
 | 
	
		
			
			|  | 141 | +// - (void)layoutSubviews
 | 
	
		
			
			|  | 142 | +// {
 | 
	
		
			
			|  | 143 | +//   [super layoutSubviews];
 | 
	
		
			
			|  | 144 | +//   _webView.frame = self.bounds;
 | 
	
		
			
			|  | 145 | +// }
 | 
	
		
			
			|  | 146 | +
 | 
	
		
			
			|  | 147 | +// - (void)setContentInset:(UIEdgeInsets)contentInset
 | 
	
		
			
			|  | 148 | +// {
 | 
	
		
			
			|  | 149 | +//   _contentInset = contentInset;
 | 
	
		
			
			|  | 150 | +//   [RCTView autoAdjustInsetsForView:self
 | 
	
		
			
			|  | 151 | +//                     withScrollView:_webView.scrollView
 | 
	
		
			
			|  | 152 | +//                       updateOffset:NO];
 | 
	
		
			
			|  | 153 | +// }
 | 
	
		
			
			|  | 154 | +
 | 
	
		
			
			|  | 155 | +// - (void)setScalesPageToFit:(BOOL)scalesPageToFit
 | 
	
		
			
			|  | 156 | +// {
 | 
	
		
			
			|  | 157 | +//   if (_webView.scalesPageToFit != scalesPageToFit) {
 | 
	
		
			
			|  | 158 | +//     _webView.scalesPageToFit = scalesPageToFit;
 | 
	
		
			
			|  | 159 | +//     [_webView reload];
 | 
	
		
			
			|  | 160 | +//   }
 | 
	
		
			
			|  | 161 | +// }
 | 
	
		
			
			|  | 162 | +
 | 
	
		
			
			|  | 163 | +// - (BOOL)scalesPageToFit
 | 
	
		
			
			|  | 164 | +// {
 | 
	
		
			
			|  | 165 | +//   return _webView.scalesPageToFit;
 | 
	
		
			
			|  | 166 | +// }
 | 
	
		
			
			|  | 167 | +
 | 
	
		
			
			|  | 168 | +// - (void)setBackgroundColor:(UIColor *)backgroundColor
 | 
	
		
			
			|  | 169 | +// {
 | 
	
		
			
			|  | 170 | +//   CGFloat alpha = CGColorGetAlpha(backgroundColor.CGColor);
 | 
	
		
			
			|  | 171 | +//   self.opaque = _webView.opaque = (alpha == 1.0);
 | 
	
		
			
			|  | 172 | +//   _webView.backgroundColor = backgroundColor;
 | 
	
		
			
			|  | 173 | +// }
 | 
	
		
			
			|  | 174 | +
 | 
	
		
			
			|  | 175 | +// - (UIColor *)backgroundColor
 | 
	
		
			
			|  | 176 | +// {
 | 
	
		
			
			|  | 177 | +//   return _webView.backgroundColor;
 | 
	
		
			
			|  | 178 | +// }
 | 
	
		
			
			|  | 179 | +
 | 
	
		
			
			|  | 180 | +// - (NSMutableDictionary<NSString *, id> *)baseEvent
 | 
	
		
			
			|  | 181 | +// {
 | 
	
		
			
			|  | 182 | +//   NSMutableDictionary<NSString *, id> *event = [[NSMutableDictionary alloc] initWithDictionary:@{
 | 
	
		
			
			|  | 183 | +//     @"url": _webView.request.URL.absoluteString ?: @"",
 | 
	
		
			
			|  | 184 | +//     @"loading" : @(_webView.loading),
 | 
	
		
			
			|  | 185 | +//     @"title": [_webView stringByEvaluatingJavaScriptFromString:@"document.title"],
 | 
	
		
			
			|  | 186 | +//     @"canGoBack": @(_webView.canGoBack),
 | 
	
		
			
			|  | 187 | +//     @"canGoForward" : @(_webView.canGoForward),
 | 
	
		
			
			|  | 188 | +//   }];
 | 
	
		
			
			|  | 189 | +
 | 
	
		
			
			|  | 190 | +//   return event;
 | 
	
		
			
			|  | 191 | +// }
 | 
	
		
			
			|  | 192 | +
 | 
	
		
			
			|  | 193 | +// - (void)refreshContentInset
 | 
	
		
			
			|  | 194 | +// {
 | 
	
		
			
			|  | 195 | +//   [RCTView autoAdjustInsetsForView:self
 | 
	
		
			
			|  | 196 | +//                     withScrollView:_webView.scrollView
 | 
	
		
			
			|  | 197 | +//                       updateOffset:YES];
 | 
	
		
			
			|  | 198 | +// }
 | 
	
		
			
			|  | 199 | +
 | 
	
		
			
			|  | 200 | +// #pragma mark - UIWebViewDelegate methods
 | 
	
		
			
			|  | 201 | +
 | 
	
		
			
			|  | 202 | +// - (BOOL)webView:(__unused UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request
 | 
	
		
			
			|  | 203 | +//  navigationType:(UIWebViewNavigationType)navigationType
 | 
	
		
			
			|  | 204 | +// {
 | 
	
		
			
			|  | 205 | +//   BOOL isJSNavigation = [request.URL.scheme isEqualToString:RCTJSNavigationScheme];
 | 
	
		
			
			|  | 206 | +
 | 
	
		
			
			|  | 207 | +//   static NSDictionary<NSNumber *, NSString *> *navigationTypes;
 | 
	
		
			
			|  | 208 | +//   static dispatch_once_t onceToken;
 | 
	
		
			
			|  | 209 | +//   dispatch_once(&onceToken, ^{
 | 
	
		
			
			|  | 210 | +//     navigationTypes = @{
 | 
	
		
			
			|  | 211 | +//       @(UIWebViewNavigationTypeLinkClicked): @"click",
 | 
	
		
			
			|  | 212 | +//       @(UIWebViewNavigationTypeFormSubmitted): @"formsubmit",
 | 
	
		
			
			|  | 213 | +//       @(UIWebViewNavigationTypeBackForward): @"backforward",
 | 
	
		
			
			|  | 214 | +//       @(UIWebViewNavigationTypeReload): @"reload",
 | 
	
		
			
			|  | 215 | +//       @(UIWebViewNavigationTypeFormResubmitted): @"formresubmit",
 | 
	
		
			
			|  | 216 | +//       @(UIWebViewNavigationTypeOther): @"other",
 | 
	
		
			
			|  | 217 | +//     };
 | 
	
		
			
			|  | 218 | +//   });
 | 
	
		
			
			|  | 219 | +
 | 
	
		
			
			|  | 220 | +//   // skip this for the JS Navigation handler
 | 
	
		
			
			|  | 221 | +//   if (!isJSNavigation && _onShouldStartLoadWithRequest) {
 | 
	
		
			
			|  | 222 | +//     NSMutableDictionary<NSString *, id> *event = [self baseEvent];
 | 
	
		
			
			|  | 223 | +//     [event addEntriesFromDictionary: @{
 | 
	
		
			
			|  | 224 | +//       @"url": (request.URL).absoluteString,
 | 
	
		
			
			|  | 225 | +//       @"navigationType": navigationTypes[@(navigationType)]
 | 
	
		
			
			|  | 226 | +//     }];
 | 
	
		
			
			|  | 227 | +//     if (![self.delegate webView:self
 | 
	
		
			
			|  | 228 | +//       shouldStartLoadForRequest:event
 | 
	
		
			
			|  | 229 | +//                    withCallback:_onShouldStartLoadWithRequest]) {
 | 
	
		
			
			|  | 230 | +//       return NO;
 | 
	
		
			
			|  | 231 | +//     }
 | 
	
		
			
			|  | 232 | +//   }
 | 
	
		
			
			|  | 233 | +
 | 
	
		
			
			|  | 234 | +//   if (_onLoadingStart) {
 | 
	
		
			
			|  | 235 | +//     // We have this check to filter out iframe requests and whatnot
 | 
	
		
			
			|  | 236 | +//     BOOL isTopFrame = [request.URL isEqual:request.mainDocumentURL];
 | 
	
		
			
			|  | 237 | +//     if (isTopFrame) {
 | 
	
		
			
			|  | 238 | +//       NSMutableDictionary<NSString *, id> *event = [self baseEvent];
 | 
	
		
			
			|  | 239 | +//       [event addEntriesFromDictionary: @{
 | 
	
		
			
			|  | 240 | +//         @"url": (request.URL).absoluteString,
 | 
	
		
			
			|  | 241 | +//         @"navigationType": navigationTypes[@(navigationType)]
 | 
	
		
			
			|  | 242 | +//       }];
 | 
	
		
			
			|  | 243 | +//       _onLoadingStart(event);
 | 
	
		
			
			|  | 244 | +//     }
 | 
	
		
			
			|  | 245 | +//   }
 | 
	
		
			
			|  | 246 | +
 | 
	
		
			
			|  | 247 | +//   if (isJSNavigation && [request.URL.host isEqualToString:kPostMessageHost]) {
 | 
	
		
			
			|  | 248 | +//     NSString *data = request.URL.query;
 | 
	
		
			
			|  | 249 | +//     data = [data stringByReplacingOccurrencesOfString:@"+" withString:@" "];
 | 
	
		
			
			|  | 250 | +//     data = [data stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
 | 
	
		
			
			|  | 251 | +
 | 
	
		
			
			|  | 252 | +//     NSMutableDictionary<NSString *, id> *event = [self baseEvent];
 | 
	
		
			
			|  | 253 | +//     [event addEntriesFromDictionary: @{
 | 
	
		
			
			|  | 254 | +//       @"data": data,
 | 
	
		
			
			|  | 255 | +//     }];
 | 
	
		
			
			|  | 256 | +
 | 
	
		
			
			|  | 257 | +//     NSString *source = @"document.dispatchEvent(new MessageEvent('message:received'));";
 | 
	
		
			
			|  | 258 | +
 | 
	
		
			
			|  | 259 | +//     [_webView stringByEvaluatingJavaScriptFromString:source];
 | 
	
		
			
			|  | 260 | +
 | 
	
		
			
			|  | 261 | +//     _onMessage(event);
 | 
	
		
			
			|  | 262 | +//   }
 | 
	
		
			
			|  | 263 | +
 | 
	
		
			
			|  | 264 | +//   // JS Navigation handler
 | 
	
		
			
			|  | 265 | +//   return !isJSNavigation;
 | 
	
		
			
			|  | 266 | +// }
 | 
	
		
			
			|  | 267 | +
 | 
	
		
			
			|  | 268 | +// - (void)webView:(__unused UIWebView *)webView didFailLoadWithError:(NSError *)error
 | 
	
		
			
			|  | 269 | +// {
 | 
	
		
			
			|  | 270 | +//   if (_onLoadingError) {
 | 
	
		
			
			|  | 271 | +//     if ([error.domain isEqualToString:NSURLErrorDomain] && error.code == NSURLErrorCancelled) {
 | 
	
		
			
			|  | 272 | +//       // NSURLErrorCancelled is reported when a page has a redirect OR if you load
 | 
	
		
			
			|  | 273 | +//       // a new URL in the WebView before the previous one came back. We can just
 | 
	
		
			
			|  | 274 | +//       // ignore these since they aren't real errors.
 | 
	
		
			
			|  | 275 | +//       // http://stackoverflow.com/questions/1024748/how-do-i-fix-nsurlerrordomain-error-999-in-iphone-3-0-os
 | 
	
		
			
			|  | 276 | +//       return;
 | 
	
		
			
			|  | 277 | +//     }
 | 
	
		
			
			|  | 278 | +
 | 
	
		
			
			|  | 279 | +//     if ([error.domain isEqualToString:@"WebKitErrorDomain"] && error.code == 102) {
 | 
	
		
			
			|  | 280 | +//       // Error code 102 "Frame load interrupted" is raised by the UIWebView if
 | 
	
		
			
			|  | 281 | +//       // its delegate returns FALSE from webView:shouldStartLoadWithRequest:navigationType
 | 
	
		
			
			|  | 282 | +//       // when the URL is from an http redirect. This is a common pattern when
 | 
	
		
			
			|  | 283 | +//       // implementing OAuth with a WebView.
 | 
	
		
			
			|  | 284 | +//       return;
 | 
	
		
			
			|  | 285 | +//     }
 | 
	
		
			
			|  | 286 | +
 | 
	
		
			
			|  | 287 | +//     NSMutableDictionary<NSString *, id> *event = [self baseEvent];
 | 
	
		
			
			|  | 288 | +//     [event addEntriesFromDictionary:@{
 | 
	
		
			
			|  | 289 | +//       @"domain": error.domain,
 | 
	
		
			
			|  | 290 | +//       @"code": @(error.code),
 | 
	
		
			
			|  | 291 | +//       @"description": error.localizedDescription,
 | 
	
		
			
			|  | 292 | +//     }];
 | 
	
		
			
			|  | 293 | +//     _onLoadingError(event);
 | 
	
		
			
			|  | 294 | +//   }
 | 
	
		
			
			|  | 295 | +// }
 | 
	
		
			
			|  | 296 | +
 | 
	
		
			
			|  | 297 | +// - (void)webViewDidFinishLoad:(UIWebView *)webView
 | 
	
		
			
			|  | 298 | +// {
 | 
	
		
			
			|  | 299 | +//   if (_messagingEnabled) {
 | 
	
		
			
			|  | 300 | +//     #if RCT_DEV
 | 
	
		
			
			|  | 301 | +//     // See isNative in lodash
 | 
	
		
			
			|  | 302 | +//     NSString *testPostMessageNative = @"String(window.postMessage) === String(Object.hasOwnProperty).replace('hasOwnProperty', 'postMessage')";
 | 
	
		
			
			|  | 303 | +//     BOOL postMessageIsNative = [
 | 
	
		
			
			|  | 304 | +//       [webView stringByEvaluatingJavaScriptFromString:testPostMessageNative]
 | 
	
		
			
			|  | 305 | +//       isEqualToString:@"true"
 | 
	
		
			
			|  | 306 | +//     ];
 | 
	
		
			
			|  | 307 | +//     if (!postMessageIsNative) {
 | 
	
		
			
			|  | 308 | +//       RCTLogError(@"Setting onMessage on a WebView overrides existing values of window.postMessage, but a previous value was defined");
 | 
	
		
			
			|  | 309 | +//     }
 | 
	
		
			
			|  | 310 | +//     #endif
 | 
	
		
			
			|  | 311 | +//     NSString *source = [NSString stringWithFormat:
 | 
	
		
			
			|  | 312 | +//       @"(function() {"
 | 
	
		
			
			|  | 313 | +//         "window.originalPostMessage = window.postMessage;"
 | 
	
		
			
			|  | 314 | +
 | 
	
		
			
			|  | 315 | +//         "var messageQueue = [];"
 | 
	
		
			
			|  | 316 | +//         "var messagePending = false;"
 | 
	
		
			
			|  | 317 | +
 | 
	
		
			
			|  | 318 | +//         "function processQueue() {"
 | 
	
		
			
			|  | 319 | +//           "if (!messageQueue.length || messagePending) return;"
 | 
	
		
			
			|  | 320 | +//           "messagePending = true;"
 | 
	
		
			
			|  | 321 | +//           "window.location = '%@://%@?' + encodeURIComponent(messageQueue.shift());"
 | 
	
		
			
			|  | 322 | +//         "}"
 | 
	
		
			
			|  | 323 | +
 | 
	
		
			
			|  | 324 | +//         "window.postMessage = function(data) {"
 | 
	
		
			
			|  | 325 | +//           "messageQueue.push(String(data));"
 | 
	
		
			
			|  | 326 | +//           "processQueue();"
 | 
	
		
			
			|  | 327 | +//         "};"
 | 
	
		
			
			|  | 328 | +
 | 
	
		
			
			|  | 329 | +//         "document.addEventListener('message:received', function(e) {"
 | 
	
		
			
			|  | 330 | +//           "messagePending = false;"
 | 
	
		
			
			|  | 331 | +//           "processQueue();"
 | 
	
		
			
			|  | 332 | +//         "});"
 | 
	
		
			
			|  | 333 | +//       "})();", RCTJSNavigationScheme, kPostMessageHost
 | 
	
		
			
			|  | 334 | +//     ];
 | 
	
		
			
			|  | 335 | +//     [webView stringByEvaluatingJavaScriptFromString:source];
 | 
	
		
			
			|  | 336 | +//   }
 | 
	
		
			
			|  | 337 | +//   if (_injectedJavaScript != nil) {
 | 
	
		
			
			|  | 338 | +//     NSString *jsEvaluationValue = [webView stringByEvaluatingJavaScriptFromString:_injectedJavaScript];
 | 
	
		
			
			|  | 339 | +
 | 
	
		
			
			|  | 340 | +//     NSMutableDictionary<NSString *, id> *event = [self baseEvent];
 | 
	
		
			
			|  | 341 | +//     event[@"jsEvaluationValue"] = jsEvaluationValue;
 | 
	
		
			
			|  | 342 | +
 | 
	
		
			
			|  | 343 | +//     _onLoadingFinish(event);
 | 
	
		
			
			|  | 344 | +//   }
 | 
	
		
			
			|  | 345 | +//   // we only need the final 'finishLoad' call so only fire the event when we're actually done loading.
 | 
	
		
			
			|  | 346 | +//   else if (_onLoadingFinish && !webView.loading && ![webView.request.URL.absoluteString isEqualToString:@"about:blank"]) {
 | 
	
		
			
			|  | 347 | +//     _onLoadingFinish([self baseEvent]);
 | 
	
		
			
			|  | 348 | +//   }
 | 
	
		
			
			|  | 349 | +// }
 | 
	
		
			
			|  | 350 | +
 | 
	
		
			
			|  | 351 | +// @end
 |