diff options
author | Julian Rex <julian.rex@mapbox.com> | 2019-06-11 18:22:20 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-06-11 18:22:20 -0400 |
commit | edd04d31eb591180b76969be971039b0cde00c88 (patch) | |
tree | e390cd2afa64198540ec92bfc99c4a421aad7115 /platform/darwin | |
parent | ec0fa4c85a53f189946c42e81745bb1670788228 (diff) | |
download | qtlocation-mapboxgl-edd04d31eb591180b76969be971039b0cde00c88.tar.gz |
[ios] Added offline query parameter (#14857)
Diffstat (limited to 'platform/darwin')
-rw-r--r-- | platform/darwin/src/http_file_source.mm | 43 | ||||
-rw-r--r-- | platform/darwin/test/MGLResourceTests.mm | 74 |
2 files changed, 106 insertions, 11 deletions
diff --git a/platform/darwin/src/http_file_source.mm b/platform/darwin/src/http_file_source.mm index 0d14c44c01..79810546b3 100644 --- a/platform/darwin/src/http_file_source.mm +++ b/platform/darwin/src/http_file_source.mm @@ -196,24 +196,45 @@ HTTPFileSource::HTTPFileSource() HTTPFileSource::~HTTPFileSource() = default; +MGL_EXPORT +NSURL *resourceURLWithAccountType(const Resource& resource, NSInteger accountType) { + + NSURL *url = [NSURL URLWithString:@(resource.url.c_str())]; + +#if TARGET_OS_IPHONE || TARGET_OS_SIMULATOR + if (accountType == 0 && + ([url.host isEqualToString:@"mapbox.com"] || [url.host hasSuffix:@".mapbox.com"])) { + NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO]; + NSURLQueryItem *accountsQueryItem = [NSURLQueryItem queryItemWithName:@"sku" value:MGLAccountManager.skuToken]; + + NSMutableArray *queryItems = [NSMutableArray arrayWithObject:accountsQueryItem]; + + // offline here + if (resource.usage == Resource::Usage::Offline) { + [queryItems addObject:[NSURLQueryItem queryItemWithName:@"offline" value:@"true"]]; + } + + if (components.queryItems) { + [queryItems addObjectsFromArray:components.queryItems]; + } + + components.queryItems = queryItems; + url = components.URL; + } +#else + (void)accountType; +#endif + return url; +} + std::unique_ptr<AsyncRequest> HTTPFileSource::request(const Resource& resource, Callback callback) { auto request = std::make_unique<HTTPRequest>(callback); auto shared = request->shared; // Explicit copy so that it also gets copied into the completion handler block below. @autoreleasepool { - NSURL *url = [NSURL URLWithString:@(resource.url.c_str())]; + NSURL *url = resourceURLWithAccountType(resource, impl->accountType); MGLLogDebug(@"Requesting URI: %@", url.relativePath); -#if TARGET_OS_IPHONE || TARGET_OS_SIMULATOR - if (impl->accountType == 0 && - ([url.host isEqualToString:@"mapbox.com"] || [url.host hasSuffix:@".mapbox.com"])) { - NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO]; - NSURLQueryItem *accountsQueryItem = [NSURLQueryItem queryItemWithName:@"sku" value:MGLAccountManager.skuToken]; - components.queryItems = components.queryItems ? [components.queryItems arrayByAddingObject:accountsQueryItem] : @[accountsQueryItem]; - url = components.URL; - } -#endif - NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url]; if (resource.priorEtag) { [req addValue:@(resource.priorEtag->c_str()) diff --git a/platform/darwin/test/MGLResourceTests.mm b/platform/darwin/test/MGLResourceTests.mm new file mode 100644 index 0000000000..0420997c39 --- /dev/null +++ b/platform/darwin/test/MGLResourceTests.mm @@ -0,0 +1,74 @@ +#import <Mapbox/Mapbox.h> +#import <XCTest/XCTest.h> +#import <mbgl/storage/resource.hpp> + +namespace mbgl { + extern NSURL *resourceURLWithAccountType(const Resource& resource, NSInteger accountType); +} + +@interface MGLResourceTests : XCTestCase +@end + +@implementation MGLResourceTests + +- (void)testOfflineQueryParameterIsAddedForOfflineResource { + + using namespace mbgl; + + std::string testURL = "test://mapbox.com/testing_offline_query?a=one&b=two"; + + // Is our test URL "correct" for subsequent checks? + { + NSURL *url = [NSURL URLWithString:@(testURL.c_str())]; + NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO]; + NSArray<NSURLQueryItem *> *items = components.queryItems; + XCTAssert(items.count == 2 ); + } + + Resource resource(Resource::Kind::Unknown, testURL); + + // By default, resource are NOT offline + { + NSURL *url = resourceURLWithAccountType(resource, 0); + NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO]; + for (NSURLQueryItem *item in components.queryItems) { + XCTAssertFalse([item.name isEqualToString:@"offline"]); + } + } + + // Now check offline + resource.setUsage(Resource::Usage::Offline); + + { + NSURL *url = resourceURLWithAccountType(resource, 0); + NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO]; + + // For offline, we expect a single offline param and a sku param + NSInteger foundCount = 0; + +#if TARGET_OS_IPHONE || TARGET_OS_SIMULATOR + for (NSURLQueryItem *item in components.queryItems) { + if (([item.name isEqualToString:@"offline"] && [item.value isEqualToString:@"true"]) || + ([item.name isEqualToString:@"a"] && [item.value isEqualToString:@"one"]) || + ([item.name isEqualToString:@"b"] && [item.value isEqualToString:@"two"]) || + ([item.name isEqualToString:@"sku"])) { + foundCount++; + } + } + + XCTAssert(foundCount == 4); +#else + // NOTE: Currently the macOS SDK does not supply the sku or offline query parameters + for (NSURLQueryItem *item in components.queryItems) { + if (([item.name isEqualToString:@"a"] && [item.value isEqualToString:@"one"]) || + ([item.name isEqualToString:@"b"] && [item.value isEqualToString:@"two"])) { + foundCount++; + } + } + + XCTAssert(foundCount == 2); +#endif + } +} + +@end |