From 3972f1bfd5c6042f127aa19aeda6dfcdd4a51441 Mon Sep 17 00:00:00 2001 From: Rad Azzouz Date: Wed, 12 Aug 2015 17:20:43 -0400 Subject: [PATCH 1/7] Replaced all `+ [NSException raise:]` with `NSAssert` --- OnePasswordExtension.m | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/OnePasswordExtension.m b/OnePasswordExtension.m index b53b041..cc13e7a 100644 --- a/OnePasswordExtension.m +++ b/OnePasswordExtension.m @@ -208,6 +208,7 @@ - (void)changePasswordForLoginForURLString:(nonnull NSString *)URLString loginDe - (void)fillItemIntoWebView:(nonnull id)webView forViewController:(nonnull UIViewController *)viewController sender:(nullable id)sender showOnlyLogins:(BOOL)yesOrNo completion:(nullable void (^)(BOOL success, NSError * __nullable error))completion { NSAssert(webView != nil, @"webView must not be nil"); NSAssert(viewController != nil, @"viewController must not be nil"); + NSAssert([webView isKindOfClass:[UIWebView class]] || [webView isKindOfClass:[WKWebView class]], @"webView must be an instance of WKWebView or UIWebView."); #ifdef __IPHONE_8_0 if ([webView isKindOfClass:[UIWebView class]]) { @@ -217,6 +218,8 @@ - (void)fillItemIntoWebView:(nonnull id)webView forViewController:(nonnull UIVie } }]; } +#endif + #if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0 || ONE_PASSWORD_EXTENSION_ENABLE_WK_WEB_VIEW else if ([webView isKindOfClass:[WKWebView class]]) { [self fillItemIntoWKWebView:webView forViewController:viewController sender:(id)sender showOnlyLogins:yesOrNo completion:^(BOOL success, NSError *error) { @@ -225,10 +228,6 @@ - (void)fillItemIntoWebView:(nonnull id)webView forViewController:(nonnull UIVie } }]; } -#endif - else { - [NSException raise:@"Invalid argument: web view must be an instance of WKWebView or UIWebView." format:@""]; - } #endif } @@ -240,7 +239,8 @@ - (BOOL)isOnePasswordExtensionActivityType:(nullable NSString *)activityType { - (void)createExtensionItemForWebView:(nonnull id)webView completion:(void (^)(NSExtensionItem * __nullable extensionItem, NSError * __nullable error))completion { NSAssert(webView != nil, @"webView must not be nil"); - + NSAssert([webView isKindOfClass:[UIWebView class]] || [webView isKindOfClass:[WKWebView class]], @"webView must be an instance of WKWebView or UIWebView."); + #ifdef __IPHONE_8_0 if ([webView isKindOfClass:[UIWebView class]]) { UIWebView *uiWebView = (UIWebView *)webView; @@ -248,6 +248,8 @@ - (void)createExtensionItemForWebView:(nonnull id)webView completion:(void (^)(N [self createExtensionItemForURLString:uiWebView.request.URL.absoluteString webPageDetails:collectedPageDetails completion:completion]; } +#endif + #if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0 || ONE_PASSWORD_EXTENSION_ENABLE_WK_WEB_VIEW else if ([webView isKindOfClass:[WKWebView class]]) { WKWebView *wkWebView = (WKWebView *)webView; @@ -272,10 +274,6 @@ - (void)createExtensionItemForWebView:(nonnull id)webView completion:(void (^)(N [self createExtensionItemForURLString:wkWebView.URL.absoluteString webPageDetails:result completion:completion]; }]; } -#endif - else { - [NSException raise:@"Invalid argument: web view must be an instance of WKWebView or UIWebView." format:@""]; - } #endif } From bbe2b8cd100c7479c3c3346b0656332826e0dd53 Mon Sep 17 00:00:00 2001 From: Rad Azzouz Date: Wed, 12 Aug 2015 17:21:23 -0400 Subject: [PATCH 2/7] Added nullability for private methods --- OnePasswordExtension.m | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/OnePasswordExtension.m b/OnePasswordExtension.m index cc13e7a..b446263 100644 --- a/OnePasswordExtension.m +++ b/OnePasswordExtension.m @@ -383,7 +383,7 @@ - (void)findLoginIn1PasswordWithURLString:(NSString *)URLString collectedPageDet } #if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0 || ONE_PASSWORD_EXTENSION_ENABLE_WK_WEB_VIEW -- (void)fillItemIntoWKWebView:(WKWebView *)webView forViewController:(UIViewController *)viewController sender:(id)sender showOnlyLogins:(BOOL)yesOrNo completion:(void (^)(BOOL success, NSError *error))completion { +- (void)fillItemIntoWKWebView:(nonnull WKWebView *)webView forViewController:(nonnull UIViewController *)viewController sender:(nullable id)sender showOnlyLogins:(BOOL)yesOrNo completion:(void (^)(BOOL success, NSError * __nullable error))completion { [webView evaluateJavaScript:OPWebViewCollectFieldsScript completionHandler:^(NSString *result, NSError *error) { if (result == nil) { NSLog(@"1Password Extension failed to collect web page fields: %@", error); @@ -403,7 +403,7 @@ - (void)fillItemIntoWKWebView:(WKWebView *)webView forViewController:(UIViewCont } #endif -- (void)fillItemIntoUIWebView:(UIWebView *)webView webViewController:(UIViewController *)viewController sender:(id)sender showOnlyLogins:(BOOL)yesOrNo completion:(void (^)(BOOL success, NSError *error))completion { +- (void)fillItemIntoUIWebView:(nonnull UIWebView *)webView webViewController:(nonnull UIViewController *)viewController sender:(nullable id)sender showOnlyLogins:(BOOL)yesOrNo completion:(void (^)(BOOL success, NSError * __nullable error))completion { NSString *collectedPageDetails = [webView stringByEvaluatingJavaScriptFromString:OPWebViewCollectFieldsScript]; [self findLoginIn1PasswordWithURLString:webView.request.URL.absoluteString collectedPageDetails:collectedPageDetails forWebViewController:viewController sender:sender withWebView:webView showOnlyLogins:yesOrNo completion:^(BOOL success, NSError *error) { if (completion) { @@ -412,7 +412,8 @@ - (void)fillItemIntoUIWebView:(UIWebView *)webView webViewController:(UIViewCont }]; } -- (void)executeFillScript:(NSString *)fillScript inWebView:(id)webView completion:(void (^)(BOOL success, NSError *error))completion { +- (void)executeFillScript:(NSString * __nullable)fillScript inWebView:(nonnull id)webView completion:(void (^)(BOOL success, NSError * __nullable error))completion { + if (fillScript == nil) { NSLog(@"Failed to executeFillScript, fillScript is missing"); if (completion) { @@ -425,6 +426,7 @@ - (void)executeFillScript:(NSString *)fillScript inWebView:(id)webView completio NSMutableString *scriptSource = [OPWebViewFillScript mutableCopy]; [scriptSource appendFormat:@"(document, %@);", fillScript]; +#ifdef __IPHONE_8_0 if ([webView isKindOfClass:[UIWebView class]]) { NSString *result = [((UIWebView *)webView) stringByEvaluatingJavaScriptFromString:scriptSource]; BOOL success = (result != nil); @@ -441,7 +443,8 @@ - (void)executeFillScript:(NSString *)fillScript inWebView:(id)webView completio return; } - +#endif + #if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0 || ONE_PASSWORD_EXTENSION_ENABLE_WK_WEB_VIEW if ([webView isKindOfClass:[WKWebView class]]) { [((WKWebView *)webView) evaluateJavaScript:scriptSource completionHandler:^(NSString *result, NSError *evaluationError) { @@ -461,12 +464,10 @@ - (void)executeFillScript:(NSString *)fillScript inWebView:(id)webView completio return; } #endif - - [NSException raise:@"Invalid argument: web view must be an instance of WKWebView or UIWebView." format:@""]; } #ifdef __IPHONE_8_0 -- (void)processExtensionItem:(NSExtensionItem *)extensionItem completion:(void (^)(NSDictionary *itemDictionary, NSError *error))completion { +- (void)processExtensionItem:(nullable NSExtensionItem *)extensionItem completion:(void (^)(NSDictionary *itemDictionary, NSError * __nullable error))completion { if (extensionItem.attachments.count == 0) { NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: @"Unexpected data returned by App Extension: extension item had no attachments." }; NSError *error = [[NSError alloc] initWithDomain:AppExtensionErrorDomain code:AppExtensionErrorCodeUnexpectedData userInfo:userInfo]; @@ -507,12 +508,9 @@ - (void)processExtensionItem:(NSExtensionItem *)extensionItem completion:(void ( }]; } -- (UIActivityViewController *)activityViewControllerForItem:(NSDictionary *)item viewController:(UIViewController*)viewController sender:(id)sender typeIdentifier:(NSString *)typeIdentifier { +- (UIActivityViewController *)activityViewControllerForItem:(nonnull NSDictionary *)item viewController:(nonnull UIViewController*)viewController sender:(nullable id)sender typeIdentifier:(nonnull NSString *)typeIdentifier { #ifdef __IPHONE_8_0 - - if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad && sender == nil) { - [NSException raise:@"Invalid argument: sender must not be nil on iPad." format:@""]; - } + NSAssert(NO == (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad && sender == nil), @"sender must not be nil on iPad."); NSItemProvider *itemProvider = [[NSItemProvider alloc] initWithItem:item typeIdentifier:typeIdentifier]; @@ -540,7 +538,7 @@ - (UIActivityViewController *)activityViewControllerForItem:(NSDictionary *)item #endif -- (void)createExtensionItemForURLString:(NSString *)URLString webPageDetails:(NSString *)webPageDetails completion:(void (^)(NSExtensionItem *extensionItem, NSError *error))completion { +- (void)createExtensionItemForURLString:(nonnull NSString *)URLString webPageDetails:(nullable NSString *)webPageDetails completion:(void (^)(NSExtensionItem *extensionItem, NSError * __nullable error))completion { NSError *jsonError = nil; NSData *data = [webPageDetails dataUsingEncoding:NSUTF8StringEncoding]; NSDictionary *webPageDetailsDictionary = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&jsonError]; @@ -585,7 +583,7 @@ + (NSError *)extensionCancelledByUserError { return [NSError errorWithDomain:AppExtensionErrorDomain code:AppExtensionErrorCodeCancelledByUser userInfo:userInfo]; } -+ (NSError *)failedToContactExtensionErrorWithActivityError:(NSError *)activityError { ++ (NSError *)failedToContactExtensionErrorWithActivityError:(nullable NSError *)activityError { NSMutableDictionary *userInfo = [NSMutableDictionary new]; userInfo[NSLocalizedDescriptionKey] = NSLocalizedStringFromTable(@"Failed to contact the 1Password Extension", @"OnePasswordExtension", @"1Password Extension Error Message"); if (activityError) { @@ -595,7 +593,7 @@ + (NSError *)failedToContactExtensionErrorWithActivityError:(NSError *)activityE return [NSError errorWithDomain:AppExtensionErrorDomain code:AppExtensionErrorCodeFailedToContactExtension userInfo:userInfo]; } -+ (NSError *)failedToCollectFieldsErrorWithUnderlyingError:(NSError *)underlyingError { ++ (NSError *)failedToCollectFieldsErrorWithUnderlyingError:(nullable NSError *)underlyingError { NSMutableDictionary *userInfo = [NSMutableDictionary new]; userInfo[NSLocalizedDescriptionKey] = NSLocalizedStringFromTable(@"Failed to execute script that collects web page information", @"OnePasswordExtension", @"1Password Extension Error Message"); if (underlyingError) { @@ -605,7 +603,7 @@ + (NSError *)failedToCollectFieldsErrorWithUnderlyingError:(NSError *)underlying return [NSError errorWithDomain:AppExtensionErrorDomain code:AppExtensionErrorCodeCollectFieldsScriptFailed userInfo:userInfo]; } -+ (NSError *)failedToFillFieldsErrorWithLocalizedErrorMessage:(NSString *)errorMessage underlyingError:(NSError *)underlyingError { ++ (NSError *)failedToFillFieldsErrorWithLocalizedErrorMessage:(nullable NSString *)errorMessage underlyingError:(nullable NSError *)underlyingError { NSMutableDictionary *userInfo = [NSMutableDictionary new]; if (errorMessage) { userInfo[NSLocalizedDescriptionKey] = errorMessage; @@ -617,7 +615,7 @@ + (NSError *)failedToFillFieldsErrorWithLocalizedErrorMessage:(NSString *)errorM return [NSError errorWithDomain:AppExtensionErrorDomain code:AppExtensionErrorCodeFillFieldsScriptFailed userInfo:userInfo]; } -+ (NSError *)failedToLoadItemProviderDataErrorWithUnderlyingError:(NSError *)underlyingError { ++ (NSError *)failedToLoadItemProviderDataErrorWithUnderlyingError:(nullable NSError *)underlyingError { NSMutableDictionary *userInfo = [NSMutableDictionary new]; userInfo[NSLocalizedDescriptionKey] = NSLocalizedStringFromTable(@"Failed to parse information returned by 1Password Extension", @"OnePasswordExtension", @"1Password Extension Error Message"); if (underlyingError) { From ce6b8fe940111dde0bedcd877e57f1e972215406 Mon Sep 17 00:00:00 2001 From: Rad Azzouz Date: Wed, 12 Aug 2015 17:32:50 -0400 Subject: [PATCH 3/7] ACME Browser is now a Universal app. --- .../WebView Demo for iOS.xcodeproj/project.pbxproj | 4 ++-- Demos/WebView Demo for iOS/WebView Demo for iOS/Info.plist | 7 +++++++ .../WebView Demo for iOS/WebView Demo for iOS/welcome.html | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/Demos/WebView Demo for iOS/WebView Demo for iOS.xcodeproj/project.pbxproj b/Demos/WebView Demo for iOS/WebView Demo for iOS.xcodeproj/project.pbxproj index e6bea4d..65d00bd 100644 --- a/Demos/WebView Demo for iOS/WebView Demo for iOS.xcodeproj/project.pbxproj +++ b/Demos/WebView Demo for iOS/WebView Demo for iOS.xcodeproj/project.pbxproj @@ -266,7 +266,7 @@ INFOPLIST_FILE = "$(SRCROOT)/WebView Demo for iOS/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_NAME = "WebView Demo for iOS"; - TARGETED_DEVICE_FAMILY = 1; + TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; @@ -278,7 +278,7 @@ INFOPLIST_FILE = "$(SRCROOT)/WebView Demo for iOS/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_NAME = "WebView Demo for iOS"; - TARGETED_DEVICE_FAMILY = 1; + TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; }; diff --git a/Demos/WebView Demo for iOS/WebView Demo for iOS/Info.plist b/Demos/WebView Demo for iOS/WebView Demo for iOS/Info.plist index 6417323..fdd4e97 100644 --- a/Demos/WebView Demo for iOS/WebView Demo for iOS/Info.plist +++ b/Demos/WebView Demo for iOS/WebView Demo for iOS/Info.plist @@ -47,5 +47,12 @@ UIInterfaceOrientationPortrait + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationPortrait + diff --git a/Demos/WebView Demo for iOS/WebView Demo for iOS/welcome.html b/Demos/WebView Demo for iOS/WebView Demo for iOS/welcome.html index cf9aaf4..23030aa 100644 --- a/Demos/WebView Demo for iOS/WebView Demo for iOS/welcome.html +++ b/Demos/WebView Demo for iOS/WebView Demo for iOS/welcome.html @@ -78,7 +78,7 @@

Top Sites

  • Local Canyons
  • Geococcyx on Wikipedia
  • Twitter
  • -
  • Facebook
  • +
  • Facebook
  • From 439775ecb8f3b359f6bfd973352d924247fad99e Mon Sep 17 00:00:00 2001 From: Rad Azzouz Date: Wed, 12 Aug 2015 21:29:53 -0400 Subject: [PATCH 4/7] Making sure that `#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0 || ONE_PASSWORD_EXTENSION_ENABLE_WK_WEB_VIEW` is inside `#ifdef __IPHONE_8_0` --- OnePasswordExtension.m | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/OnePasswordExtension.m b/OnePasswordExtension.m index b446263..e825019 100644 --- a/OnePasswordExtension.m +++ b/OnePasswordExtension.m @@ -218,9 +218,7 @@ - (void)fillItemIntoWebView:(nonnull id)webView forViewController:(nonnull UIVie } }]; } -#endif - -#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0 || ONE_PASSWORD_EXTENSION_ENABLE_WK_WEB_VIEW + #if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0 || ONE_PASSWORD_EXTENSION_ENABLE_WK_WEB_VIEW else if ([webView isKindOfClass:[WKWebView class]]) { [self fillItemIntoWKWebView:webView forViewController:viewController sender:(id)sender showOnlyLogins:yesOrNo completion:^(BOOL success, NSError *error) { if (completion) { @@ -228,6 +226,7 @@ - (void)fillItemIntoWebView:(nonnull id)webView forViewController:(nonnull UIVie } }]; } + #endif #endif } @@ -248,9 +247,7 @@ - (void)createExtensionItemForWebView:(nonnull id)webView completion:(void (^)(N [self createExtensionItemForURLString:uiWebView.request.URL.absoluteString webPageDetails:collectedPageDetails completion:completion]; } -#endif - -#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0 || ONE_PASSWORD_EXTENSION_ENABLE_WK_WEB_VIEW + #if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0 || ONE_PASSWORD_EXTENSION_ENABLE_WK_WEB_VIEW else if ([webView isKindOfClass:[WKWebView class]]) { WKWebView *wkWebView = (WKWebView *)webView; [wkWebView evaluateJavaScript:OPWebViewCollectFieldsScript completionHandler:^(NSString *result, NSError *evaluateError) { @@ -274,6 +271,7 @@ - (void)createExtensionItemForWebView:(nonnull id)webView completion:(void (^)(N [self createExtensionItemForURLString:wkWebView.URL.absoluteString webPageDetails:result completion:completion]; }]; } + #endif #endif } @@ -440,13 +438,10 @@ - (void)executeFillScript:(NSString * __nullable)fillScript inWebView:(nonnull i if (completion) { completion(success, error); } - - return; } -#endif -#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0 || ONE_PASSWORD_EXTENSION_ENABLE_WK_WEB_VIEW - if ([webView isKindOfClass:[WKWebView class]]) { + #if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0 || ONE_PASSWORD_EXTENSION_ENABLE_WK_WEB_VIEW + else if ([webView isKindOfClass:[WKWebView class]]) { [((WKWebView *)webView) evaluateJavaScript:scriptSource completionHandler:^(NSString *result, NSError *evaluationError) { BOOL success = (result != nil); NSError *error = nil; @@ -460,9 +455,8 @@ - (void)executeFillScript:(NSString * __nullable)fillScript inWebView:(nonnull i completion(success, error); } }]; - - return; } + #endif #endif } From 4016278a975a90df0dbed7e58eb9d65f3ffa8d54 Mon Sep 17 00:00:00 2001 From: Rad Azzouz Date: Wed, 12 Aug 2015 17:20:43 -0400 Subject: [PATCH 5/7] Replaced all `+ [NSException raise:]` with `NSAssert` --- OnePasswordExtension.m | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/OnePasswordExtension.m b/OnePasswordExtension.m index b53b041..cc13e7a 100644 --- a/OnePasswordExtension.m +++ b/OnePasswordExtension.m @@ -208,6 +208,7 @@ - (void)changePasswordForLoginForURLString:(nonnull NSString *)URLString loginDe - (void)fillItemIntoWebView:(nonnull id)webView forViewController:(nonnull UIViewController *)viewController sender:(nullable id)sender showOnlyLogins:(BOOL)yesOrNo completion:(nullable void (^)(BOOL success, NSError * __nullable error))completion { NSAssert(webView != nil, @"webView must not be nil"); NSAssert(viewController != nil, @"viewController must not be nil"); + NSAssert([webView isKindOfClass:[UIWebView class]] || [webView isKindOfClass:[WKWebView class]], @"webView must be an instance of WKWebView or UIWebView."); #ifdef __IPHONE_8_0 if ([webView isKindOfClass:[UIWebView class]]) { @@ -217,6 +218,8 @@ - (void)fillItemIntoWebView:(nonnull id)webView forViewController:(nonnull UIVie } }]; } +#endif + #if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0 || ONE_PASSWORD_EXTENSION_ENABLE_WK_WEB_VIEW else if ([webView isKindOfClass:[WKWebView class]]) { [self fillItemIntoWKWebView:webView forViewController:viewController sender:(id)sender showOnlyLogins:yesOrNo completion:^(BOOL success, NSError *error) { @@ -225,10 +228,6 @@ - (void)fillItemIntoWebView:(nonnull id)webView forViewController:(nonnull UIVie } }]; } -#endif - else { - [NSException raise:@"Invalid argument: web view must be an instance of WKWebView or UIWebView." format:@""]; - } #endif } @@ -240,7 +239,8 @@ - (BOOL)isOnePasswordExtensionActivityType:(nullable NSString *)activityType { - (void)createExtensionItemForWebView:(nonnull id)webView completion:(void (^)(NSExtensionItem * __nullable extensionItem, NSError * __nullable error))completion { NSAssert(webView != nil, @"webView must not be nil"); - + NSAssert([webView isKindOfClass:[UIWebView class]] || [webView isKindOfClass:[WKWebView class]], @"webView must be an instance of WKWebView or UIWebView."); + #ifdef __IPHONE_8_0 if ([webView isKindOfClass:[UIWebView class]]) { UIWebView *uiWebView = (UIWebView *)webView; @@ -248,6 +248,8 @@ - (void)createExtensionItemForWebView:(nonnull id)webView completion:(void (^)(N [self createExtensionItemForURLString:uiWebView.request.URL.absoluteString webPageDetails:collectedPageDetails completion:completion]; } +#endif + #if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0 || ONE_PASSWORD_EXTENSION_ENABLE_WK_WEB_VIEW else if ([webView isKindOfClass:[WKWebView class]]) { WKWebView *wkWebView = (WKWebView *)webView; @@ -272,10 +274,6 @@ - (void)createExtensionItemForWebView:(nonnull id)webView completion:(void (^)(N [self createExtensionItemForURLString:wkWebView.URL.absoluteString webPageDetails:result completion:completion]; }]; } -#endif - else { - [NSException raise:@"Invalid argument: web view must be an instance of WKWebView or UIWebView." format:@""]; - } #endif } From 006bab17388a74b6d7cb1c70aba91023d796e0c0 Mon Sep 17 00:00:00 2001 From: Rad Azzouz Date: Wed, 12 Aug 2015 17:21:23 -0400 Subject: [PATCH 6/7] Added nullability for private methods --- OnePasswordExtension.m | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/OnePasswordExtension.m b/OnePasswordExtension.m index cc13e7a..b446263 100644 --- a/OnePasswordExtension.m +++ b/OnePasswordExtension.m @@ -383,7 +383,7 @@ - (void)findLoginIn1PasswordWithURLString:(NSString *)URLString collectedPageDet } #if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0 || ONE_PASSWORD_EXTENSION_ENABLE_WK_WEB_VIEW -- (void)fillItemIntoWKWebView:(WKWebView *)webView forViewController:(UIViewController *)viewController sender:(id)sender showOnlyLogins:(BOOL)yesOrNo completion:(void (^)(BOOL success, NSError *error))completion { +- (void)fillItemIntoWKWebView:(nonnull WKWebView *)webView forViewController:(nonnull UIViewController *)viewController sender:(nullable id)sender showOnlyLogins:(BOOL)yesOrNo completion:(void (^)(BOOL success, NSError * __nullable error))completion { [webView evaluateJavaScript:OPWebViewCollectFieldsScript completionHandler:^(NSString *result, NSError *error) { if (result == nil) { NSLog(@"1Password Extension failed to collect web page fields: %@", error); @@ -403,7 +403,7 @@ - (void)fillItemIntoWKWebView:(WKWebView *)webView forViewController:(UIViewCont } #endif -- (void)fillItemIntoUIWebView:(UIWebView *)webView webViewController:(UIViewController *)viewController sender:(id)sender showOnlyLogins:(BOOL)yesOrNo completion:(void (^)(BOOL success, NSError *error))completion { +- (void)fillItemIntoUIWebView:(nonnull UIWebView *)webView webViewController:(nonnull UIViewController *)viewController sender:(nullable id)sender showOnlyLogins:(BOOL)yesOrNo completion:(void (^)(BOOL success, NSError * __nullable error))completion { NSString *collectedPageDetails = [webView stringByEvaluatingJavaScriptFromString:OPWebViewCollectFieldsScript]; [self findLoginIn1PasswordWithURLString:webView.request.URL.absoluteString collectedPageDetails:collectedPageDetails forWebViewController:viewController sender:sender withWebView:webView showOnlyLogins:yesOrNo completion:^(BOOL success, NSError *error) { if (completion) { @@ -412,7 +412,8 @@ - (void)fillItemIntoUIWebView:(UIWebView *)webView webViewController:(UIViewCont }]; } -- (void)executeFillScript:(NSString *)fillScript inWebView:(id)webView completion:(void (^)(BOOL success, NSError *error))completion { +- (void)executeFillScript:(NSString * __nullable)fillScript inWebView:(nonnull id)webView completion:(void (^)(BOOL success, NSError * __nullable error))completion { + if (fillScript == nil) { NSLog(@"Failed to executeFillScript, fillScript is missing"); if (completion) { @@ -425,6 +426,7 @@ - (void)executeFillScript:(NSString *)fillScript inWebView:(id)webView completio NSMutableString *scriptSource = [OPWebViewFillScript mutableCopy]; [scriptSource appendFormat:@"(document, %@);", fillScript]; +#ifdef __IPHONE_8_0 if ([webView isKindOfClass:[UIWebView class]]) { NSString *result = [((UIWebView *)webView) stringByEvaluatingJavaScriptFromString:scriptSource]; BOOL success = (result != nil); @@ -441,7 +443,8 @@ - (void)executeFillScript:(NSString *)fillScript inWebView:(id)webView completio return; } - +#endif + #if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0 || ONE_PASSWORD_EXTENSION_ENABLE_WK_WEB_VIEW if ([webView isKindOfClass:[WKWebView class]]) { [((WKWebView *)webView) evaluateJavaScript:scriptSource completionHandler:^(NSString *result, NSError *evaluationError) { @@ -461,12 +464,10 @@ - (void)executeFillScript:(NSString *)fillScript inWebView:(id)webView completio return; } #endif - - [NSException raise:@"Invalid argument: web view must be an instance of WKWebView or UIWebView." format:@""]; } #ifdef __IPHONE_8_0 -- (void)processExtensionItem:(NSExtensionItem *)extensionItem completion:(void (^)(NSDictionary *itemDictionary, NSError *error))completion { +- (void)processExtensionItem:(nullable NSExtensionItem *)extensionItem completion:(void (^)(NSDictionary *itemDictionary, NSError * __nullable error))completion { if (extensionItem.attachments.count == 0) { NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: @"Unexpected data returned by App Extension: extension item had no attachments." }; NSError *error = [[NSError alloc] initWithDomain:AppExtensionErrorDomain code:AppExtensionErrorCodeUnexpectedData userInfo:userInfo]; @@ -507,12 +508,9 @@ - (void)processExtensionItem:(NSExtensionItem *)extensionItem completion:(void ( }]; } -- (UIActivityViewController *)activityViewControllerForItem:(NSDictionary *)item viewController:(UIViewController*)viewController sender:(id)sender typeIdentifier:(NSString *)typeIdentifier { +- (UIActivityViewController *)activityViewControllerForItem:(nonnull NSDictionary *)item viewController:(nonnull UIViewController*)viewController sender:(nullable id)sender typeIdentifier:(nonnull NSString *)typeIdentifier { #ifdef __IPHONE_8_0 - - if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad && sender == nil) { - [NSException raise:@"Invalid argument: sender must not be nil on iPad." format:@""]; - } + NSAssert(NO == (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad && sender == nil), @"sender must not be nil on iPad."); NSItemProvider *itemProvider = [[NSItemProvider alloc] initWithItem:item typeIdentifier:typeIdentifier]; @@ -540,7 +538,7 @@ - (UIActivityViewController *)activityViewControllerForItem:(NSDictionary *)item #endif -- (void)createExtensionItemForURLString:(NSString *)URLString webPageDetails:(NSString *)webPageDetails completion:(void (^)(NSExtensionItem *extensionItem, NSError *error))completion { +- (void)createExtensionItemForURLString:(nonnull NSString *)URLString webPageDetails:(nullable NSString *)webPageDetails completion:(void (^)(NSExtensionItem *extensionItem, NSError * __nullable error))completion { NSError *jsonError = nil; NSData *data = [webPageDetails dataUsingEncoding:NSUTF8StringEncoding]; NSDictionary *webPageDetailsDictionary = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&jsonError]; @@ -585,7 +583,7 @@ + (NSError *)extensionCancelledByUserError { return [NSError errorWithDomain:AppExtensionErrorDomain code:AppExtensionErrorCodeCancelledByUser userInfo:userInfo]; } -+ (NSError *)failedToContactExtensionErrorWithActivityError:(NSError *)activityError { ++ (NSError *)failedToContactExtensionErrorWithActivityError:(nullable NSError *)activityError { NSMutableDictionary *userInfo = [NSMutableDictionary new]; userInfo[NSLocalizedDescriptionKey] = NSLocalizedStringFromTable(@"Failed to contact the 1Password Extension", @"OnePasswordExtension", @"1Password Extension Error Message"); if (activityError) { @@ -595,7 +593,7 @@ + (NSError *)failedToContactExtensionErrorWithActivityError:(NSError *)activityE return [NSError errorWithDomain:AppExtensionErrorDomain code:AppExtensionErrorCodeFailedToContactExtension userInfo:userInfo]; } -+ (NSError *)failedToCollectFieldsErrorWithUnderlyingError:(NSError *)underlyingError { ++ (NSError *)failedToCollectFieldsErrorWithUnderlyingError:(nullable NSError *)underlyingError { NSMutableDictionary *userInfo = [NSMutableDictionary new]; userInfo[NSLocalizedDescriptionKey] = NSLocalizedStringFromTable(@"Failed to execute script that collects web page information", @"OnePasswordExtension", @"1Password Extension Error Message"); if (underlyingError) { @@ -605,7 +603,7 @@ + (NSError *)failedToCollectFieldsErrorWithUnderlyingError:(NSError *)underlying return [NSError errorWithDomain:AppExtensionErrorDomain code:AppExtensionErrorCodeCollectFieldsScriptFailed userInfo:userInfo]; } -+ (NSError *)failedToFillFieldsErrorWithLocalizedErrorMessage:(NSString *)errorMessage underlyingError:(NSError *)underlyingError { ++ (NSError *)failedToFillFieldsErrorWithLocalizedErrorMessage:(nullable NSString *)errorMessage underlyingError:(nullable NSError *)underlyingError { NSMutableDictionary *userInfo = [NSMutableDictionary new]; if (errorMessage) { userInfo[NSLocalizedDescriptionKey] = errorMessage; @@ -617,7 +615,7 @@ + (NSError *)failedToFillFieldsErrorWithLocalizedErrorMessage:(NSString *)errorM return [NSError errorWithDomain:AppExtensionErrorDomain code:AppExtensionErrorCodeFillFieldsScriptFailed userInfo:userInfo]; } -+ (NSError *)failedToLoadItemProviderDataErrorWithUnderlyingError:(NSError *)underlyingError { ++ (NSError *)failedToLoadItemProviderDataErrorWithUnderlyingError:(nullable NSError *)underlyingError { NSMutableDictionary *userInfo = [NSMutableDictionary new]; userInfo[NSLocalizedDescriptionKey] = NSLocalizedStringFromTable(@"Failed to parse information returned by 1Password Extension", @"OnePasswordExtension", @"1Password Extension Error Message"); if (underlyingError) { From e5835477318655620c98445548c3f9ac9173565d Mon Sep 17 00:00:00 2001 From: Rad Azzouz Date: Wed, 12 Aug 2015 21:29:53 -0400 Subject: [PATCH 7/7] Making sure that `#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0 || ONE_PASSWORD_EXTENSION_ENABLE_WK_WEB_VIEW` is inside `#ifdef __IPHONE_8_0` --- OnePasswordExtension.m | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/OnePasswordExtension.m b/OnePasswordExtension.m index b446263..e825019 100644 --- a/OnePasswordExtension.m +++ b/OnePasswordExtension.m @@ -218,9 +218,7 @@ - (void)fillItemIntoWebView:(nonnull id)webView forViewController:(nonnull UIVie } }]; } -#endif - -#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0 || ONE_PASSWORD_EXTENSION_ENABLE_WK_WEB_VIEW + #if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0 || ONE_PASSWORD_EXTENSION_ENABLE_WK_WEB_VIEW else if ([webView isKindOfClass:[WKWebView class]]) { [self fillItemIntoWKWebView:webView forViewController:viewController sender:(id)sender showOnlyLogins:yesOrNo completion:^(BOOL success, NSError *error) { if (completion) { @@ -228,6 +226,7 @@ - (void)fillItemIntoWebView:(nonnull id)webView forViewController:(nonnull UIVie } }]; } + #endif #endif } @@ -248,9 +247,7 @@ - (void)createExtensionItemForWebView:(nonnull id)webView completion:(void (^)(N [self createExtensionItemForURLString:uiWebView.request.URL.absoluteString webPageDetails:collectedPageDetails completion:completion]; } -#endif - -#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0 || ONE_PASSWORD_EXTENSION_ENABLE_WK_WEB_VIEW + #if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0 || ONE_PASSWORD_EXTENSION_ENABLE_WK_WEB_VIEW else if ([webView isKindOfClass:[WKWebView class]]) { WKWebView *wkWebView = (WKWebView *)webView; [wkWebView evaluateJavaScript:OPWebViewCollectFieldsScript completionHandler:^(NSString *result, NSError *evaluateError) { @@ -274,6 +271,7 @@ - (void)createExtensionItemForWebView:(nonnull id)webView completion:(void (^)(N [self createExtensionItemForURLString:wkWebView.URL.absoluteString webPageDetails:result completion:completion]; }]; } + #endif #endif } @@ -440,13 +438,10 @@ - (void)executeFillScript:(NSString * __nullable)fillScript inWebView:(nonnull i if (completion) { completion(success, error); } - - return; } -#endif -#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0 || ONE_PASSWORD_EXTENSION_ENABLE_WK_WEB_VIEW - if ([webView isKindOfClass:[WKWebView class]]) { + #if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0 || ONE_PASSWORD_EXTENSION_ENABLE_WK_WEB_VIEW + else if ([webView isKindOfClass:[WKWebView class]]) { [((WKWebView *)webView) evaluateJavaScript:scriptSource completionHandler:^(NSString *result, NSError *evaluationError) { BOOL success = (result != nil); NSError *error = nil; @@ -460,9 +455,8 @@ - (void)executeFillScript:(NSString * __nullable)fillScript inWebView:(nonnull i completion(success, error); } }]; - - return; } + #endif #endif }