Bgerstle has uploaded a new change for review. https://gerrit.wikimedia.org/r/223787
Change subject: brute-force fix for schemeless image URLs ...................................................................... brute-force fix for schemeless image URLs also added unit tests for all the NSURL+Extras categories Bug: T102258 Change-Id: Ia44c86e4d648401f7d00c258683eef62d6c7456f --- M Wikipedia.xcodeproj/project.pbxproj M Wikipedia/Categories/NSURL+Extras.h M Wikipedia/Categories/NSURL+Extras.m M Wikipedia/Images/WMFImageController.swift A WikipediaUnitTests/NSURLExtrasTests.m 5 files changed, 105 insertions(+), 1 deletion(-) git pull ssh://gerrit.wikimedia.org:29418/apps/ios/wikipedia refs/changes/87/223787/1 diff --git a/Wikipedia.xcodeproj/project.pbxproj b/Wikipedia.xcodeproj/project.pbxproj index bbd0cfb..ca4b1d7 100644 --- a/Wikipedia.xcodeproj/project.pbxproj +++ b/Wikipedia.xcodeproj/project.pbxproj @@ -278,6 +278,7 @@ BC6BF4001B19213600362968 /* XCTestCase+WMFLocaleTesting.m in Sources */ = {isa = PBXBuildFile; fileRef = BC6BF3FE1B19209900362968 /* XCTestCase+WMFLocaleTesting.m */; }; BC7DFCD61AA4E5FE000035C3 /* WMFImageURLParsing.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7DFCD51AA4E5FE000035C3 /* WMFImageURLParsing.m */; }; BC7E4A441B33812700EECD8B /* LanguagesViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BC7E4A431B33812700EECD8B /* LanguagesViewController.storyboard */; }; + BC8210CC1B4EB2390010BF7B /* NSURLExtrasTests.m in Sources */ = {isa = PBXBuildFile; fileRef = BC8210CB1B4EB2390010BF7B /* NSURLExtrasTests.m */; }; BC86B9361A92966B00B4C039 /* AFHTTPRequestOperationManager+UniqueRequests.m in Sources */ = {isa = PBXBuildFile; fileRef = BC86B9351A92966B00B4C039 /* AFHTTPRequestOperationManager+UniqueRequests.m */; }; BC86B93D1A929CC500B4C039 /* UICollectionViewFlowLayout+NSCopying.m in Sources */ = {isa = PBXBuildFile; fileRef = BC86B93C1A929CC500B4C039 /* UICollectionViewFlowLayout+NSCopying.m */; }; BC86B9401A929D7900B4C039 /* UICollectionViewFlowLayout+WMFItemSizeThatFits.m in Sources */ = {isa = PBXBuildFile; fileRef = BC86B93F1A929D7900B4C039 /* UICollectionViewFlowLayout+WMFItemSizeThatFits.m */; }; @@ -884,6 +885,7 @@ BC7DFCD51AA4E5FE000035C3 /* WMFImageURLParsing.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WMFImageURLParsing.m; sourceTree = "<group>"; }; BC7E4A431B33812700EECD8B /* LanguagesViewController.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = LanguagesViewController.storyboard; sourceTree = "<group>"; }; BC7E4A491B34A26A00EECD8B /* WMFLogging.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WMFLogging.h; sourceTree = "<group>"; }; + BC8210CB1B4EB2390010BF7B /* NSURLExtrasTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSURLExtrasTests.m; sourceTree = "<group>"; }; BC86B9341A92966B00B4C039 /* AFHTTPRequestOperationManager+UniqueRequests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "AFHTTPRequestOperationManager+UniqueRequests.h"; sourceTree = "<group>"; }; BC86B9351A92966B00B4C039 /* AFHTTPRequestOperationManager+UniqueRequests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "AFHTTPRequestOperationManager+UniqueRequests.m"; sourceTree = "<group>"; }; BC86B93B1A929CC500B4C039 /* UICollectionViewFlowLayout+NSCopying.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UICollectionViewFlowLayout+NSCopying.h"; sourceTree = "<group>"; }; @@ -2321,6 +2323,7 @@ BCAFC5CF1AFD5E7D004615BA /* MWKArticle+WMFSharingTests.m */, BC5FE5741B1DFF5400273BC0 /* ArticleFetcherTests.m */, BC092BA61B19189100093C59 /* MWKSiteInfoFetcherTests.m */, + BC8210CB1B4EB2390010BF7B /* NSURLExtrasTests.m */, ); name = Tests; path = WikipediaUnitTests; @@ -3182,6 +3185,7 @@ BCB8487B1AAAADF90077EC24 /* WMFRoundingUtilitiesTests.m in Sources */, BC0FED6F1AAA0268002488D7 /* MWKImageInfo+MWKImageComparisonTests.m in Sources */, BC0FED621AAA0263002488D7 /* WMFCodingStyle.m in Sources */, + BC8210CC1B4EB2390010BF7B /* NSURLExtrasTests.m in Sources */, BC0FED741AAA026C002488D7 /* CircularBitwiseRotationTests.m in Sources */, BCEC77951AC9C74700D9DDA5 /* NSArray+WMFShuffle.m in Sources */, BCE912BD1ACC629B00B74B42 /* NSIndexSet+BKReduceTests.m in Sources */, diff --git a/Wikipedia/Categories/NSURL+Extras.h b/Wikipedia/Categories/NSURL+Extras.h index dbcdcc1..208e8f1 100644 --- a/Wikipedia/Categories/NSURL+Extras.h +++ b/Wikipedia/Categories/NSURL+Extras.h @@ -19,6 +19,12 @@ - (NSString*)wmf_mimeTypeForExtension; +/// Prepend the receiver with the given scheme, unless one was already present. +- (instancetype)wmf_prependSchemeIfNeeded:(NSString*)scheme; + +/// Prepend the receiver with "https" if it doesn't already have a scheme. +- (instancetype)wmf_prependSchemeIfNeeded; + @end NS_ASSUME_NONNULL_END diff --git a/Wikipedia/Categories/NSURL+Extras.m b/Wikipedia/Categories/NSURL+Extras.m index 5d3e150..360a3ce 100644 --- a/Wikipedia/Categories/NSURL+Extras.m +++ b/Wikipedia/Categories/NSURL+Extras.m @@ -26,4 +26,19 @@ return [self.pathExtension wmf_asMIMEType]; } +- (instancetype)wmf_prependSchemeIfNeeded:(NSString*)scheme { + NSParameterAssert(scheme.length); + if (self.scheme.length) { + return self; + } else { + NSURLComponents* components = [[NSURLComponents alloc] initWithURL:self resolvingAgainstBaseURL:YES]; + components.scheme = scheme; + return components.URL; + } +} + +- (instancetype)wmf_prependSchemeIfNeeded { + return [self wmf_prependSchemeIfNeeded:@"https"]; +} + @end diff --git a/Wikipedia/Images/WMFImageController.swift b/Wikipedia/Images/WMFImageController.swift index 5891eca..0107fe6 100644 --- a/Wikipedia/Images/WMFImageController.swift +++ b/Wikipedia/Images/WMFImageController.swift @@ -139,7 +139,8 @@ * @return An `ImageDownload` with the image data and the origin it was loaded from. */ public func fetchImageWithURL(url: NSURL) -> Promise<ImageDownload> { - let promise = imageManager.promisedImageWithURL(url, options: SDWebImageOptions.allZeros) + // HAX: make sure all image requests have a scheme (MW api sometimes omits one) + let promise = imageManager.promisedImageWithURL(url.wmf_prependSchemeIfNeeded(), options: .allZeros) return maybeApplyDebugTransforms(promise) } diff --git a/WikipediaUnitTests/NSURLExtrasTests.m b/WikipediaUnitTests/NSURLExtrasTests.m new file mode 100644 index 0000000..a0b3697 --- /dev/null +++ b/WikipediaUnitTests/NSURLExtrasTests.m @@ -0,0 +1,78 @@ +// +// NSURLExtrasTests.m +// Wikipedia +// +// Created by Brian Gerstle on 7/9/15. +// Copyright (c) 2015 Wikimedia Foundation. All rights reserved. +// + +#import <UIKit/UIKit.h> +#import <XCTest/XCTest.h> +#import "NSURL+Extras.h" + +#define HC_SHORTHAND 1 +#import <OCHamcrest/OCHamcrest.h> + +static NSURL* fakeURLWithExtension(NSString* extension) { + return [NSURL URLWithString:[@"http://foo.org/bar." stringByAppendingString:extension]]; +} + +@interface NSURLExtrasTests : XCTestCase + +@end + +@implementation NSURLExtrasTests + +- (void)testOptionalURLReturnsNilForNilString { + XCTAssertNil([NSURL wmf_optionalURLWithString:nil]); +} + +- (void)testOptionalURLReturnsNilForEmptyString { + XCTAssertNil([NSURL wmf_optionalURLWithString:@""]); +} + +- (void)testMimeTypeWithPNGExtension { + NSArray* testURLMimeTypes = + [@[fakeURLWithExtension(@"png"), + fakeURLWithExtension(@"PNG")] valueForKey : WMF_SAFE_KEYPATH(NSURL.new, wmf_mimeTypeForExtension)]; + assertThat(testURLMimeTypes, everyItem(is(@"image/png"))); +} + +- (void)testMimeTypeWithJPEGExtension { + NSArray* testURLMimeTypes = + [@[fakeURLWithExtension(@"jpg"), + fakeURLWithExtension(@"jpeg"), + fakeURLWithExtension(@"JPG"), + fakeURLWithExtension(@"JPEG")] valueForKey : WMF_SAFE_KEYPATH(NSURL.new, wmf_mimeTypeForExtension)]; + assertThat(testURLMimeTypes, everyItem(is(@"image/jpeg"))); +} + +- (void)testMimeTypeWithGIFExtension { + NSArray* testURLMimeTypes = + [@[fakeURLWithExtension(@"gif"), + fakeURLWithExtension(@"GIF")] valueForKey : WMF_SAFE_KEYPATH(NSURL.new, wmf_mimeTypeForExtension)]; + assertThat(testURLMimeTypes, everyItem(is(@"image/gif"))); +} + +- (void)testPrependSchemeAddHTTPSToSchemelessURL { + assertThat([[NSURL URLWithString:@"//foo.org/bar.jpg"] wmf_prependSchemeIfNeeded], + is([NSURL URLWithString:@"https://foo.org/bar.jpg"])); +} + +- (void)testPrependSchemeReturnsOriginalURLWithScheme { + NSURL* urlWithScheme = [NSURL URLWithString:@"https://foo.org/bar"]; + // checking identity instead of equality to make sure we return the receiver + XCTAssertTrue(urlWithScheme == [urlWithScheme wmf_prependSchemeIfNeeded]); +} + +- (void)testSchemelessURLStringPreservesEverythingExceptSchemeAndColon { + NSURL* urlWithScheme = [NSURL URLWithString:@"https://foo.org/bar"]; + assertThat([urlWithScheme wmf_schemelessURLString], is(@"//foo.org/bar")); +} + +- (void)testSchemelessURLIsEqualToAbsoluteStringOfURLWithoutScheme { + NSURL* urlWithoutScheme = [NSURL URLWithString:@"//foo.org/bar"]; + assertThat([urlWithoutScheme wmf_schemelessURLString], is(urlWithoutScheme.absoluteString)); +} + +@end -- To view, visit https://gerrit.wikimedia.org/r/223787 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ia44c86e4d648401f7d00c258683eef62d6c7456f Gerrit-PatchSet: 1 Gerrit-Project: apps/ios/wikipedia Gerrit-Branch: 5.0 Gerrit-Owner: Bgerstle <bgers...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits