Skip to content

Commit 8d10228

Browse files
Restrict navigation-time WKWebsiteDataStore swapping to main frame navigations
https://bugs.webkit.org/show_bug.cgi?id=181217 Reviewed by Tim Horton. Source/WebKit: If we swap during an iframe navigation, then we get a page in a strange state. The intent of the main frame navigation WKWebsiteDataStore swap is that that is a time when we can change storages without a page in an inconsistent state. * UIProcess/Cocoa/NavigationState.mm: (WebKit::NavigationState::NavigationClient::decidePolicyForNavigationAction): Tools: * TestWebKitAPI/Tests/WebKitCocoa/WebsitePolicies.mm: (-[WebsitePoliciesWebsiteDataStoreDelegate _webView:decidePolicyForNavigationAction:decisionHandler:]): (TEST): git-svn-id: http://svn.webkit.org/repository/webkit/trunk@226472 268f45cc-cd09-0410-ab3c-d52691b4dbfc
1 parent 77fdb88 commit 8d10228

File tree

4 files changed

+49
-2
lines changed

4 files changed

+49
-2
lines changed

Source/WebKit/ChangeLog

+14
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,17 @@
1+
2018-01-05 Alex Christensen <[email protected]>
2+
3+
Restrict navigation-time WKWebsiteDataStore swapping to main frame navigations
4+
https://bugs.webkit.org/show_bug.cgi?id=181217
5+
6+
Reviewed by Tim Horton.
7+
8+
If we swap during an iframe navigation, then we get a page in a strange state.
9+
The intent of the main frame navigation WKWebsiteDataStore swap is that
10+
that is a time when we can change storages without a page in an inconsistent state.
11+
12+
* UIProcess/Cocoa/NavigationState.mm:
13+
(WebKit::NavigationState::NavigationClient::decidePolicyForNavigationAction):
14+
115
2018-01-05 Alex Christensen <[email protected]>
216

317
Add WKBundleFrameCreateFrameHandle

Source/WebKit/UIProcess/Cocoa/NavigationState.mm

+5-1
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,7 @@ static void tryAppLink(Ref<API::NavigationAction>&& navigationAction, const Stri
417417
void NavigationState::NavigationClient::decidePolicyForNavigationAction(WebPageProxy& webPageProxy, Ref<API::NavigationAction>&& navigationAction, Ref<WebFramePolicyListenerProxy>&& listener, API::Object* userInfo)
418418
{
419419
String mainFrameURLString = webPageProxy.mainFrame()->url();
420+
bool subframeNavigation = navigationAction->targetFrame() && !navigationAction->targetFrame()->isMainFrame();
420421

421422
if (!m_navigationState.m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionDecisionHandler
422423
&& !m_navigationState.m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionDecisionHandlerWebsitePolicies
@@ -461,7 +462,7 @@ static void tryAppLink(Ref<API::NavigationAction>&& navigationAction, const Stri
461462

462463
auto checker = CompletionHandlerCallChecker::create(navigationDelegate.get(), delegateHasWebsitePolicies ? @selector(_webView:decidePolicyForNavigationAction:decisionHandler:) : @selector(webView:decidePolicyForNavigationAction:decisionHandler:));
463464

464-
auto decisionHandlerWithPolicies = [localListener = WTFMove(listener), navigationAction = navigationAction.copyRef(), checker = WTFMove(checker), mainFrameURLString, webPageProxy = makeRef(webPageProxy)](WKNavigationActionPolicy actionPolicy, _WKWebsitePolicies *websitePolicies) mutable {
465+
auto decisionHandlerWithPolicies = [localListener = WTFMove(listener), navigationAction = navigationAction.copyRef(), checker = WTFMove(checker), mainFrameURLString, webPageProxy = makeRef(webPageProxy), subframeNavigation](WKNavigationActionPolicy actionPolicy, _WKWebsitePolicies *websitePolicies) mutable {
465466
if (checker->completionHandlerHasBeenCalled())
466467
return;
467468
checker->didCallCompletionHandler();
@@ -473,6 +474,9 @@ static void tryAppLink(Ref<API::NavigationAction>&& navigationAction, const Stri
473474
auto& sessionID = data->websiteDataStoreParameters->networkSessionParameters.sessionID;
474475
if (!sessionID.isEphemeral() && sessionID != PAL::SessionID::defaultSessionID())
475476
[NSException raise:NSInvalidArgumentException format:@"_WKWebsitePolicies.websiteDataStore must be nil, default, or non-persistent."];
477+
if (subframeNavigation)
478+
[NSException raise:NSInvalidArgumentException format:@"_WKWebsitePolicies.websiteDataStore must be nil for subframe navigations."];
479+
476480
webPageProxy->changeWebsiteDataStore(websitePolicies->_websitePolicies->websiteDataStore()->websiteDataStore());
477481
}
478482
}

Tools/ChangeLog

+11
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,14 @@
1+
2018-01-05 Alex Christensen <[email protected]>
2+
3+
Restrict navigation-time WKWebsiteDataStore swapping to main frame navigations
4+
https://bugs.webkit.org/show_bug.cgi?id=181217
5+
6+
Reviewed by Tim Horton.
7+
8+
* TestWebKitAPI/Tests/WebKitCocoa/WebsitePolicies.mm:
9+
(-[WebsitePoliciesWebsiteDataStoreDelegate _webView:decidePolicyForNavigationAction:decisionHandler:]):
10+
(TEST):
11+
112
2018-01-05 Alex Christensen <[email protected]>
213

314
Add WKBundleFrameCreateFrameHandle

Tools/TestWebKitAPI/Tests/WebKitCocoa/WebsitePolicies.mm

+19-1
Original file line numberDiff line numberDiff line change
@@ -811,11 +811,25 @@ - (void)_webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigat
811811

812812
done = true;
813813
}
814-
if ([url.path isEqualToString:@"/checkStorage"] || [url.path isEqualToString:@"/checkCookies"]) {
814+
if ([url.path isEqualToString:@"/checkStorage"]
815+
|| [url.path isEqualToString:@"/checkCookies"]
816+
|| [url.path isEqualToString:@"/mainFrame"]) {
815817
_WKWebsitePolicies *websitePolicies = [[[_WKWebsitePolicies alloc] init] autorelease];
816818
websitePolicies.websiteDataStore = [WKWebsiteDataStore nonPersistentDataStore];
817819
decisionHandler(WKNavigationActionPolicyAllow, websitePolicies);
818820
}
821+
if ([url.path isEqualToString:@"/subFrame"]) {
822+
_WKWebsitePolicies *websitePolicies = [[[_WKWebsitePolicies alloc] init] autorelease];
823+
websitePolicies.websiteDataStore = [WKWebsiteDataStore nonPersistentDataStore];
824+
bool sawException = false;
825+
@try {
826+
decisionHandler(WKNavigationActionPolicyCancel, websitePolicies);
827+
} @catch (NSException *exception) {
828+
sawException = true;
829+
}
830+
EXPECT_TRUE(sawException);
831+
done = true;
832+
}
819833
}
820834

821835
- (void)webView:(WKWebView *)webView startURLSchemeTask:(id <WKURLSchemeTask>)task
@@ -869,6 +883,10 @@ - (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSStrin
869883

870884
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"test:///invalid"]]];
871885
TestWebKitAPI::Util::run(&done);
886+
887+
done = false;
888+
[webView loadHTMLString:@"<iframe src='subFrame'></iframe>" baseURL:[NSURL URLWithString:@"http://webkit.org/mainFrame"]];
889+
TestWebKitAPI::Util::run(&done);
872890
}
873891

874892
TEST(WebKit, WebsitePoliciesDataStore)

0 commit comments

Comments
 (0)