Diff
Modified: trunk/Source/WebKit2/ChangeLog (171026 => 171027)
--- trunk/Source/WebKit2/ChangeLog 2014-07-12 19:10:07 UTC (rev 171026)
+++ trunk/Source/WebKit2/ChangeLog 2014-07-12 20:40:17 UTC (rev 171027)
@@ -1,3 +1,41 @@
+2014-07-12 Dan Bernstein <[email protected]>
+
+ [Cocoa] Client is not notified of same-document navigations
+ https://bugs.webkit.org/show_bug.cgi?id=134855
+
+ Reviewed by Sam Weinig.
+
+ * UIProcess/API/APILoaderClient.h:
+ (API::LoaderClient::didSameDocumentNavigationForFrame): Added navigationID parameter.
+
+ * UIProcess/API/C/WKPage.cpp:
+ (WKPageSetPageLoaderClient): Ditto.
+
+ * UIProcess/API/Cocoa/WKNavigationDelegatePrivate.h: Added new enum and delegate method.
+
+ * UIProcess/Cocoa/NavigationState.h: Declare override of
+ API::LoaderClient::didSameDocumentNavigationForFrame. Added flag in
+ m_navigationDelegateMethods struct.
+ * UIProcess/Cocoa/NavigationState.mm:
+ (WebKit::NavigationState::setNavigationDelegate): Initialize new m_navigationDelegateMethods
+ flag.
+ (WebKit::toWKSameDocumentNavigationType): Added this helper to convert from internal to API
+ values.
+ (WebKit::NavigationState::LoaderClient::didSameDocumentNavigationForFrame): Override to call
+ the delegate method, if implemented.
+
+ * UIProcess/WebPageProxy.cpp:
+ (WebKit::WebPageProxy::didSameDocumentNavigationForFrame): Added navigationID parameter,
+ which is forwarded to the client.
+ * UIProcess/WebPageProxy.h: Added navigationID parameter.
+ * UIProcess/WebPageProxy.messages.in: Ditto.
+
+ * WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
+ (WebKit::WebFrameLoaderClient::dispatchDidChangeLocationWithinPage): Send the navigation ID.
+ (WebKit::WebFrameLoaderClient::dispatchDidPushStateWithinPage): Ditto.
+ (WebKit::WebFrameLoaderClient::dispatchDidReplaceStateWithinPage): Ditto.
+ (WebKit::WebFrameLoaderClient::dispatchDidPopStateWithinPage): Ditto.
+
2014-07-12 Oliver Hunt <[email protected]>
Extend WebContent sandbox to allow some extra access for frameworks
Modified: trunk/Source/WebKit2/UIProcess/API/APILoaderClient.h (171026 => 171027)
--- trunk/Source/WebKit2/UIProcess/API/APILoaderClient.h 2014-07-12 19:10:07 UTC (rev 171026)
+++ trunk/Source/WebKit2/UIProcess/API/APILoaderClient.h 2014-07-12 20:40:17 UTC (rev 171027)
@@ -62,7 +62,7 @@
virtual void didFinishDocumentLoadForFrame(WebKit::WebPageProxy*, WebKit::WebFrameProxy*, uint64_t, API::Object*) { }
virtual void didFinishLoadForFrame(WebKit::WebPageProxy*, WebKit::WebFrameProxy*, uint64_t, API::Object*) { }
virtual void didFailLoadWithErrorForFrame(WebKit::WebPageProxy*, WebKit::WebFrameProxy*, uint64_t, const WebCore::ResourceError&, API::Object*) { }
- virtual void didSameDocumentNavigationForFrame(WebKit::WebPageProxy*, WebKit::WebFrameProxy*, WebKit::SameDocumentNavigationType, API::Object*) { }
+ virtual void didSameDocumentNavigationForFrame(WebKit::WebPageProxy*, WebKit::WebFrameProxy*, uint64_t, WebKit::SameDocumentNavigationType, API::Object*) { }
virtual void didReceiveTitleForFrame(WebKit::WebPageProxy*, const WTF::String&, WebKit::WebFrameProxy*, API::Object*) { }
virtual void didFirstLayoutForFrame(WebKit::WebPageProxy*, WebKit::WebFrameProxy*, API::Object*) { }
virtual void didDestroyNavigation(WebKit::WebPageProxy*, uint64_t) { }
Modified: trunk/Source/WebKit2/UIProcess/API/C/WKPage.cpp (171026 => 171027)
--- trunk/Source/WebKit2/UIProcess/API/C/WKPage.cpp 2014-07-12 19:10:07 UTC (rev 171026)
+++ trunk/Source/WebKit2/UIProcess/API/C/WKPage.cpp 2014-07-12 20:40:17 UTC (rev 171027)
@@ -835,7 +835,7 @@
m_client.didFailLoadWithErrorForFrame(toAPI(page), toAPI(frame), toAPI(error), toAPI(userData), m_client.base.clientInfo);
}
- virtual void didSameDocumentNavigationForFrame(WebPageProxy* page, WebFrameProxy* frame, SameDocumentNavigationType type, API::Object* userData) override
+ virtual void didSameDocumentNavigationForFrame(WebPageProxy* page, WebFrameProxy* frame, uint64_t, SameDocumentNavigationType type, API::Object* userData) override
{
if (!m_client.didSameDocumentNavigationForFrame)
return;
Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKNavigationDelegatePrivate.h (171026 => 171027)
--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKNavigationDelegatePrivate.h 2014-07-12 19:10:07 UTC (rev 171026)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKNavigationDelegatePrivate.h 2014-07-12 20:40:17 UTC (rev 171027)
@@ -34,6 +34,13 @@
static const WKNavigationResponsePolicy _WKNavigationResponsePolicyBecomeDownload = (WKNavigationResponsePolicy)(WKNavigationResponsePolicyAllow + 1);
+typedef NS_ENUM(NSInteger, _WKSameDocumentNavigationType) {
+ _WKSameDocumentNavigationTypeAnchorNavigation,
+ _WKSameDocumentNavigationTypeSessionStatePush,
+ _WKSameDocumentNavigationTypeSessionStateReplace,
+ _WKSameDocumentNavigationTypeSessionStatePop,
+} WK_AVAILABLE(10_10, 8_0);
+
@protocol WKNavigationDelegatePrivate <WKNavigationDelegate>
@optional
@@ -41,6 +48,7 @@
- (void)_webView:(WKWebView *)webView navigation:(WKNavigation *)navigation didFailProvisionalLoadInSubframe:(WKFrameInfo *)subframe withError:(NSError *)error;
- (void)_webView:(WKWebView *)webView navigationDidFinishDocumentLoad:(WKNavigation *)navigation;
+- (void)_webView:(WKWebView *)webView navigation:(WKNavigation *)navigation didSameDocumentNavigation:(_WKSameDocumentNavigationType)navigationType;
- (void)_webView:(WKWebView *)webView renderingProgressDidChange:(_WKRenderingProgressEvents)progressEvents;
Modified: trunk/Source/WebKit2/UIProcess/Cocoa/NavigationState.h (171026 => 171027)
--- trunk/Source/WebKit2/UIProcess/Cocoa/NavigationState.h 2014-07-12 19:10:07 UTC (rev 171026)
+++ trunk/Source/WebKit2/UIProcess/Cocoa/NavigationState.h 2014-07-12 20:40:17 UTC (rev 171027)
@@ -102,6 +102,7 @@
virtual void didFinishDocumentLoadForFrame(WebKit::WebPageProxy*, WebKit::WebFrameProxy*, uint64_t navigationID, API::Object*) override;
virtual void didFinishLoadForFrame(WebPageProxy*, WebFrameProxy*, uint64_t navigationID, API::Object*) override;
virtual void didFailLoadWithErrorForFrame(WebPageProxy*, WebFrameProxy*, uint64_t navigationID, const WebCore::ResourceError&, API::Object*) override;
+ virtual void didSameDocumentNavigationForFrame(WebPageProxy*, WebFrameProxy*, uint64_t navigationID, SameDocumentNavigationType, API::Object*) override;
virtual void didDestroyNavigation(WebKit::WebPageProxy*, uint64_t navigationID) override;
virtual void didLayout(WebKit::WebPageProxy*, WebCore::LayoutMilestones, API::Object*) override;
virtual bool canAuthenticateAgainstProtectionSpaceInFrame(WebKit::WebPageProxy*, WebKit::WebFrameProxy*, WebKit::WebProtectionSpace*) override;
@@ -149,6 +150,7 @@
bool webViewNavigationDidFinishDocumentLoad : 1;
bool webViewDidFinishNavigation : 1;
bool webViewDidFailNavigationWithError : 1;
+ bool webViewNavigationDidSameDocumentNavigation : 1;
bool webViewRenderingProgressDidChange : 1;
bool webViewDidReceiveAuthenticationChallengeCompletionHandler : 1;
Modified: trunk/Source/WebKit2/UIProcess/Cocoa/NavigationState.mm (171026 => 171027)
--- trunk/Source/WebKit2/UIProcess/Cocoa/NavigationState.mm 2014-07-12 19:10:07 UTC (rev 171026)
+++ trunk/Source/WebKit2/UIProcess/Cocoa/NavigationState.mm 2014-07-12 20:40:17 UTC (rev 171027)
@@ -130,6 +130,7 @@
m_navigationDelegateMethods.webViewNavigationDidFailProvisionalLoadInSubframeWithError = [delegate respondsToSelector:@selector(_webView:navigation:didFailProvisionalLoadInSubframe:withError:)];
m_navigationDelegateMethods.webViewNavigationDidFinishDocumentLoad = [delegate respondsToSelector:@selector(_webView:navigationDidFinishDocumentLoad:)];
+ m_navigationDelegateMethods.webViewNavigationDidSameDocumentNavigation = [delegate respondsToSelector:@selector(_webView:navigation:didSameDocumentNavigation:)];
m_navigationDelegateMethods.webViewRenderingProgressDidChange = [delegate respondsToSelector:@selector(_webView:renderingProgressDidChange:)];
m_navigationDelegateMethods.webViewDidReceiveAuthenticationChallengeCompletionHandler = [delegate respondsToSelector:@selector(webView:didReceiveAuthenticationChallenge:completionHandler:)];
m_navigationDelegateMethods.webViewCanAuthenticateAgainstProtectionSpace = [delegate respondsToSelector:@selector(_webView:canAuthenticateAgainstProtectionSpace:)];
@@ -568,6 +569,43 @@
[navigationDelegate webView:m_navigationState.m_webView didFailNavigation:navigation withError:errorWithRecoveryAttempter.get()];
}
+static _WKSameDocumentNavigationType toWKSameDocumentNavigationType(SameDocumentNavigationType navigationType)
+{
+ switch (navigationType) {
+ case SameDocumentNavigationAnchorNavigation:
+ return _WKSameDocumentNavigationTypeAnchorNavigation;
+ case SameDocumentNavigationSessionStatePush:
+ return _WKSameDocumentNavigationTypeSessionStatePush;
+ case SameDocumentNavigationSessionStateReplace:
+ return _WKSameDocumentNavigationTypeSessionStateReplace;
+ case SameDocumentNavigationSessionStatePop:
+ return _WKSameDocumentNavigationTypeSessionStatePop;
+ }
+
+ ASSERT_NOT_REACHED();
+ return _WKSameDocumentNavigationTypeAnchorNavigation;
+}
+
+void NavigationState::LoaderClient::didSameDocumentNavigationForFrame(WebPageProxy*, WebFrameProxy* webFrameProxy, uint64_t navigationID, SameDocumentNavigationType navigationType, API::Object*)
+{
+ if (!webFrameProxy->isMainFrame())
+ return;
+
+ if (!m_navigationState.m_navigationDelegateMethods.webViewNavigationDidSameDocumentNavigation)
+ return;
+
+ auto navigationDelegate = m_navigationState.m_navigationDelegate.get();
+ if (!navigationDelegate)
+ return;
+
+ // FIXME: We should assert that navigationID is not zero here, but it's currently zero for some navigations through the page cache.
+ WKNavigation *navigation = nil;
+ if (navigationID)
+ navigation = m_navigationState.m_navigations.get(navigationID).get();
+
+ [static_cast<id <WKNavigationDelegatePrivate>>(navigationDelegate.get()) _webView:m_navigationState.m_webView navigation:navigation didSameDocumentNavigation:toWKSameDocumentNavigationType(navigationType)];
+}
+
void NavigationState::LoaderClient::didDestroyNavigation(WebPageProxy*, uint64_t navigationID)
{
m_navigationState.m_navigations.remove(navigationID);
Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp (171026 => 171027)
--- trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp 2014-07-12 19:10:07 UTC (rev 171026)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp 2014-07-12 20:40:17 UTC (rev 171027)
@@ -2683,7 +2683,7 @@
m_loaderClient->didFailLoadWithErrorForFrame(this, frame, navigationID, error, userData.get());
}
-void WebPageProxy::didSameDocumentNavigationForFrame(uint64_t frameID, uint32_t opaqueSameDocumentNavigationType, const String& url, IPC::MessageDecoder& decoder)
+void WebPageProxy::didSameDocumentNavigationForFrame(uint64_t frameID, uint64_t navigationID, uint32_t opaqueSameDocumentNavigationType, const String& url, IPC::MessageDecoder& decoder)
{
RefPtr<API::Object> userData;
WebContextUserMessageDecoder messageDecoder(userData, process());
@@ -2703,7 +2703,7 @@
frame->didSameDocumentNavigation(url);
m_pageLoadState.commitChanges();
- m_loaderClient->didSameDocumentNavigationForFrame(this, frame, static_cast<SameDocumentNavigationType>(opaqueSameDocumentNavigationType), userData.get());
+ m_loaderClient->didSameDocumentNavigationForFrame(this, frame, navigationID, static_cast<SameDocumentNavigationType>(opaqueSameDocumentNavigationType), userData.get());
}
void WebPageProxy::didReceiveTitleForFrame(uint64_t frameID, const String& title, IPC::MessageDecoder& decoder)
Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.h (171026 => 171027)
--- trunk/Source/WebKit2/UIProcess/WebPageProxy.h 2014-07-12 19:10:07 UTC (rev 171026)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.h 2014-07-12 20:40:17 UTC (rev 171027)
@@ -943,7 +943,7 @@
void didFinishDocumentLoadForFrame(uint64_t frameID, uint64_t navigationID, IPC::MessageDecoder&);
void didFinishLoadForFrame(uint64_t frameID, uint64_t navigationID, IPC::MessageDecoder&);
void didFailLoadForFrame(uint64_t frameID, uint64_t navigationID, const WebCore::ResourceError&, IPC::MessageDecoder&);
- void didSameDocumentNavigationForFrame(uint64_t frameID, uint32_t sameDocumentNavigationType, const String&, IPC::MessageDecoder&);
+ void didSameDocumentNavigationForFrame(uint64_t frameID, uint64_t navigationID, uint32_t sameDocumentNavigationType, const String&, IPC::MessageDecoder&);
void didReceiveTitleForFrame(uint64_t frameID, const String&, IPC::MessageDecoder&);
void didFirstLayoutForFrame(uint64_t frameID, IPC::MessageDecoder&);
void didFirstVisuallyNonEmptyLayoutForFrame(uint64_t frameID, IPC::MessageDecoder&);
Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in (171026 => 171027)
--- trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in 2014-07-12 19:10:07 UTC (rev 171026)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in 2014-07-12 20:40:17 UTC (rev 171027)
@@ -141,7 +141,7 @@
DidDisplayInsecureContentForFrame(uint64_t frameID, WebKit::InjectedBundleUserMessageEncoder userData) Variadic
DidRunInsecureContentForFrame(uint64_t frameID, WebKit::InjectedBundleUserMessageEncoder userData) Variadic
DidDetectXSSForFrame(uint64_t frameID, WebKit::InjectedBundleUserMessageEncoder userData) Variadic
- DidSameDocumentNavigationForFrame(uint64_t frameID, uint32_t type, String url, WebKit::InjectedBundleUserMessageEncoder userData) Variadic
+ DidSameDocumentNavigationForFrame(uint64_t frameID, uint64_t navigationID, uint32_t type, String url, WebKit::InjectedBundleUserMessageEncoder userData) Variadic
DidDestroyNavigation(uint64_t navigationID)
FrameDidBecomeFrameSet(uint64_t frameID, bool value)
Modified: trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp (171026 => 171027)
--- trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp 2014-07-12 19:10:07 UTC (rev 171026)
+++ trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp 2014-07-12 20:40:17 UTC (rev 171027)
@@ -328,7 +328,8 @@
webPage->injectedBundleLoaderClient().didSameDocumentNavigationForFrame(webPage, m_frame, SameDocumentNavigationAnchorNavigation, userData);
// Notify the UIProcess.
- webPage->send(Messages::WebPageProxy::DidSameDocumentNavigationForFrame(m_frame->frameID(), SameDocumentNavigationAnchorNavigation, m_frame->coreFrame()->document()->url().string(), InjectedBundleUserMessageEncoder(userData.get())));
+ WebDocumentLoader& documentLoader = static_cast<WebDocumentLoader&>(*m_frame->coreFrame()->loader().documentLoader());
+ webPage->send(Messages::WebPageProxy::DidSameDocumentNavigationForFrame(m_frame->frameID(), documentLoader.navigationID(), SameDocumentNavigationAnchorNavigation, m_frame->coreFrame()->document()->url().string(), InjectedBundleUserMessageEncoder(userData.get())));
}
void WebFrameLoaderClient::dispatchDidPushStateWithinPage()
@@ -343,7 +344,8 @@
webPage->injectedBundleLoaderClient().didSameDocumentNavigationForFrame(webPage, m_frame, SameDocumentNavigationSessionStatePush, userData);
// Notify the UIProcess.
- webPage->send(Messages::WebPageProxy::DidSameDocumentNavigationForFrame(m_frame->frameID(), SameDocumentNavigationSessionStatePush, m_frame->coreFrame()->document()->url().string(), InjectedBundleUserMessageEncoder(userData.get())));
+ WebDocumentLoader& documentLoader = static_cast<WebDocumentLoader&>(*m_frame->coreFrame()->loader().documentLoader());
+ webPage->send(Messages::WebPageProxy::DidSameDocumentNavigationForFrame(m_frame->frameID(), documentLoader.navigationID(), SameDocumentNavigationSessionStatePush, m_frame->coreFrame()->document()->url().string(), InjectedBundleUserMessageEncoder(userData.get())));
}
void WebFrameLoaderClient::dispatchDidReplaceStateWithinPage()
@@ -358,7 +360,8 @@
webPage->injectedBundleLoaderClient().didSameDocumentNavigationForFrame(webPage, m_frame, SameDocumentNavigationSessionStateReplace, userData);
// Notify the UIProcess.
- webPage->send(Messages::WebPageProxy::DidSameDocumentNavigationForFrame(m_frame->frameID(), SameDocumentNavigationSessionStateReplace, m_frame->coreFrame()->document()->url().string(), InjectedBundleUserMessageEncoder(userData.get())));
+ WebDocumentLoader& documentLoader = static_cast<WebDocumentLoader&>(*m_frame->coreFrame()->loader().documentLoader());
+ webPage->send(Messages::WebPageProxy::DidSameDocumentNavigationForFrame(m_frame->frameID(), documentLoader.navigationID(), SameDocumentNavigationSessionStateReplace, m_frame->coreFrame()->document()->url().string(), InjectedBundleUserMessageEncoder(userData.get())));
}
void WebFrameLoaderClient::dispatchDidPopStateWithinPage()
@@ -373,7 +376,8 @@
webPage->injectedBundleLoaderClient().didSameDocumentNavigationForFrame(webPage, m_frame, SameDocumentNavigationSessionStatePop, userData);
// Notify the UIProcess.
- webPage->send(Messages::WebPageProxy::DidSameDocumentNavigationForFrame(m_frame->frameID(), SameDocumentNavigationSessionStatePop, m_frame->coreFrame()->document()->url().string(), InjectedBundleUserMessageEncoder(userData.get())));
+ WebDocumentLoader& documentLoader = static_cast<WebDocumentLoader&>(*m_frame->coreFrame()->loader().documentLoader());
+ webPage->send(Messages::WebPageProxy::DidSameDocumentNavigationForFrame(m_frame->frameID(), documentLoader.navigationID(), SameDocumentNavigationSessionStatePop, m_frame->coreFrame()->document()->url().string(), InjectedBundleUserMessageEncoder(userData.get())));
}
void WebFrameLoaderClient::dispatchWillClose()