diff --git a/ParseTwitterUtils/ParseTwitterUtils/Internal/Dialog/PFOAuth1FlowDialog.m b/ParseTwitterUtils/ParseTwitterUtils/Internal/Dialog/PFOAuth1FlowDialog.m index 75702d357..0c66597a1 100644 --- a/ParseTwitterUtils/ParseTwitterUtils/Internal/Dialog/PFOAuth1FlowDialog.m +++ b/ParseTwitterUtils/ParseTwitterUtils/Internal/Dialog/PFOAuth1FlowDialog.m @@ -414,7 +414,21 @@ - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigati NSURL *url = navigationAction.request.URL; BOOL hasPrefix = [url.absoluteString hasPrefix:self.redirectURLPrefix]; if (hasPrefix) { - [self _dismissWithSuccess:YES url:url error:nil]; + NSURLComponents* components = [[NSURLComponents alloc] initWithString:url.absoluteString]; + NSArray * items = components.queryItems; + if (items) { + for (NSURLQueryItem * queryItem in items) { + if ([queryItem.name isEqualToString:@"denied"]) { + [self _dismissWithSuccess:NO url:url error:nil]; + break; + } else if ([queryItem.name isEqualToString:@"oauth_verifier"] || [queryItem.name isEqualToString:@"oauth_token" ]) { + [self _dismissWithSuccess:YES url:url error:nil]; + break;; + } + } + } else { + [self _dismissWithSuccess:NO url:url error:nil]; + } decisionHandler(WKNavigationActionPolicyCancel); return; } else if (navigationAction.navigationType == UIWebViewNavigationTypeLinkClicked && [self.dataSource dialog:self shouldOpenURLInExternalBrowser:url]) { diff --git a/ParseTwitterUtils/Tests/Unit/OAuth1FlowDialogTests.m b/ParseTwitterUtils/Tests/Unit/OAuth1FlowDialogTests.m index a3d7727f1..68d57dbf5 100644 --- a/ParseTwitterUtils/Tests/Unit/OAuth1FlowDialogTests.m +++ b/ParseTwitterUtils/Tests/Unit/OAuth1FlowDialogTests.m @@ -127,7 +127,8 @@ - (void)skip_testRotation { - (void)testWebViewDelegate { NSURL *sampleURL = [NSURL URLWithString:@"http://foo.bar"]; - NSURL *successURL = [NSURL URLWithString:@"foo://success"]; + NSURL *successURL = [NSURL URLWithString:@"foo://success/?oauth_verifier=abcd&oauth_token=authtoken123"]; + NSURL *rejectedURL = [NSURL URLWithString:@"foo://success/?denied=authtoken123"]; //XCTestExpectation *flowExpectation = [[XCTestExpectation alloc] initWithDescription: @"Waiting for redirect"]; XCTestExpectation *flowExpectation = [self currentSelectorTestExpectation]; @@ -172,7 +173,22 @@ - (void)testWebViewDelegate { [canceledExpectation fulfill]; }]; - [self waitForExpectations:@[policyExpectation, flowExpectation, canceledExpectation] timeout:20]; + XCTestExpectation *canceledOnDeniedExpectation = [[XCTestExpectation alloc] initWithDescription:@"Waiting for canceled policy decision"]; + + WKNavigation* rejectNavigation = (WKNavigation *)([[NSObject alloc] init]); + [flowDialog webView:webView didStartProvisionalNavigation:rejectNavigation]; + [flowDialog webView:webView didFinishNavigation:rejectNavigation]; + + FakeWKNavigationAction *rejectAction = [[FakeWKNavigationAction alloc] init]; + rejectAction.navigationType = WKNavigationTypeOther; + rejectAction.request = [NSURLRequest requestWithURL:rejectedURL]; + + [flowDialog webView:webView decidePolicyForNavigationAction:rejectAction decisionHandler:^(WKNavigationActionPolicy policy) { + XCTAssertTrue(policy == WKNavigationActionPolicyCancel); + [canceledOnDeniedExpectation fulfill]; + }]; + + [self waitForExpectations:@[policyExpectation, flowExpectation, canceledExpectation, canceledOnDeniedExpectation] timeout:20]; } @end