From 29bd30136c23ea0ace72af37ae012126c060f709 Mon Sep 17 00:00:00 2001 From: Mark Dawson Date: Wed, 26 Apr 2017 11:17:46 -0700 Subject: [PATCH] Add a removeData function This function will clear the specified data from the WKWebView. You call the function with an array of the types you want to remove: this.webView.removeData([ WebsiteDataTypes.DiskCache, WebsiteDataTypes.OfflineWebApplicationCache, WebsiteDataTypes.MemoryCache, WebsiteDataTypes.LocalStorage, WebsiteDataTypes.Cookies, WebsiteDataTypes.SessionStorage, WebsiteDataTypes.IndexedDBDatabases, WebsiteDataTypes.WebSQLDatabases, ]) WebsiteDataTypes is now exported from the module, so you include: import WKWebView, { WebsiteDataTypes } from 'react-native-wkwebview-reborn' If you pass null for the array then all data types are removed. --- WKWebView.ios.js | 16 ++++++++++++++++ index.js | 3 ++- ios/RCTWKWebView/RCTWKWebView.h | 23 ++++++++++++----------- ios/RCTWKWebView/RCTWKWebView.m | 17 +++++++++++++++++ ios/RCTWKWebView/RCTWKWebViewManager.m | 22 ++++++++++++++++++++++ 5 files changed, 69 insertions(+), 12 deletions(-) diff --git a/WKWebView.ios.js b/WKWebView.ios.js index bc045a56..bf13c451 100644 --- a/WKWebView.ios.js +++ b/WKWebView.ios.js @@ -344,6 +344,10 @@ var WKWebView = React.createClass({ return WKWebViewManager.evaluateJavaScript(this.getWebViewHandle(), js); }, + removeData: function(types) { + return WKWebViewManager.removeData(this.getWebViewHandle(), types) + }, + /** * We return an event with a bunch of fields including: * url, title, loading, canGoBack, canGoForward @@ -446,3 +450,15 @@ var styles = StyleSheet.create({ }); export default WKWebView; + +const WebsiteDataTypes = { + DiskCache: 'WKWebsiteDataTypeDiskCache', + OfflineWebApplicationCache: 'WKWebsiteDataTypeOfflineWebApplicationCache', + MemoryCache: 'WKWebsiteDataTypeMemoryCache', + LocalStorage: 'WKWebsiteDataTypeLocalStorage', + Cookies: 'WKWebsiteDataTypeCookies', + SessionStorage: 'WKWebsiteDataTypeSessionStorage', + IndexedDBDatabases: 'WKWebsiteDataTypeIndexedDBDatabases', + WebSQLDatabases: 'WKWebsiteDataTypeWebSQLDatabases', +} +export { WebsiteDataTypes } diff --git a/index.js b/index.js index 6537b249..7da6d4c1 100644 --- a/index.js +++ b/index.js @@ -1,5 +1,6 @@ 'use strict'; -import WKWebView from './WKWebView'; +import WKWebView, {WebsiteDataTypes} from './WKWebView'; export default WKWebView; +export { WebsiteDataTypes } diff --git a/ios/RCTWKWebView/RCTWKWebView.h b/ios/RCTWKWebView/RCTWKWebView.h index 9c90a510..f0aaeab3 100644 --- a/ios/RCTWKWebView/RCTWKWebView.h +++ b/ios/RCTWKWebView/RCTWKWebView.h @@ -13,26 +13,27 @@ extern NSString *const RCTJSNavigationScheme; @protocol RCTWKWebViewDelegate - (BOOL)webView:(RCTWKWebView *)webView -shouldStartLoadForRequest:(NSMutableDictionary *)request - withCallback:(RCTDirectEventBlock)callback; + shouldStartLoadForRequest:(NSMutableDictionary *)request + withCallback:(RCTDirectEventBlock)callback; @end @interface RCTWKWebView : RCTView -@property (nonatomic, weak) id delegate; - -@property (nonatomic, copy) NSDictionary *source; -@property (nonatomic, assign) UIEdgeInsets contentInset; -@property (nonatomic, assign) BOOL automaticallyAdjustContentInsets; -@property (nonatomic, assign) BOOL openNewWindowInWebView; -@property (nonatomic, copy) NSString *injectedJavaScript; +@property(nonatomic, weak) id delegate; +@property(nonatomic, copy) NSDictionary *source; +@property(nonatomic, assign) UIEdgeInsets contentInset; +@property(nonatomic, assign) BOOL automaticallyAdjustContentInsets; +@property(nonatomic, assign) BOOL openNewWindowInWebView; +@property(nonatomic, copy) NSString *injectedJavaScript; - (void)goForward; - (void)goBack; - (void)reload; - (void)stopLoading; -- (void)evaluateJavaScript:(NSString *)javaScriptString completionHandler:(void (^)(id, NSError *error))completionHandler; - +- (void)evaluateJavaScript:(NSString *)javaScriptString + completionHandler:(void (^)(id, NSError *error))completionHandler; +-(void)removeData:(NSArray *)types + completionHandler:(void (^)(id, NSError *error))completionHandler; @end diff --git a/ios/RCTWKWebView/RCTWKWebView.m b/ios/RCTWKWebView/RCTWKWebView.m index 95df4789..648a3a02 100644 --- a/ios/RCTWKWebView/RCTWKWebView.m +++ b/ios/RCTWKWebView/RCTWKWebView.m @@ -85,6 +85,23 @@ - (void)evaluateJavaScript:(NSString *)javaScriptString [_webView evaluateJavaScript:javaScriptString completionHandler:completionHandler]; } +- (void)removeData:(NSArray *)types + completionHandler:(void (^)(id, NSError *error))completionHandler +{ + NSSet *websiteDataTypes; + + if (types != nil) { + websiteDataTypes = [NSSet setWithArray:types]; + } else { + websiteDataTypes = [WKWebsiteDataStore allWebsiteDataTypes]; + } + + NSDate *dateFrom = [NSDate dateWithTimeIntervalSince1970:0]; + [[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes modifiedSince:dateFrom completionHandler:^{ + completionHandler(self, nil); + }]; +} + - (void)goBack { [_webView goBack]; diff --git a/ios/RCTWKWebView/RCTWKWebViewManager.m b/ios/RCTWKWebView/RCTWKWebViewManager.m index 472af2c6..31ab10f2 100644 --- a/ios/RCTWKWebView/RCTWKWebViewManager.m +++ b/ios/RCTWKWebView/RCTWKWebViewManager.m @@ -112,6 +112,28 @@ - (UIView *)view }]; } +RCT_EXPORT_METHOD(removeData:(nonnull NSNumber *)reactTag + types:(NSArray *)types + resolver:(RCTPromiseResolveBlock)resolve + rejecter:(RCTPromiseRejectBlock)reject) +{ + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { + RCTWKWebView *view = viewRegistry[reactTag]; + if (![view isKindOfClass:[RCTWKWebView class]]) { + RCTLogError(@"Invalid view returned from registry, expecting RCTWKWebView, got: %@", view); + } else { + [view removeData:types completionHandler:^(id result, NSError *error) { + if (error) { + reject(@"removeFailed", @"Error calling removeData", error); + } else { + resolve(nil); + } + }]; + } + }]; + +} + #pragma mark - Exported synchronous methods - (BOOL)webView:(__unused RCTWKWebView *)webView