REGRESSION (r219013): OAuth flows are broken when redirecting back to application...
authordbates@webkit.org <dbates@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 9 Aug 2017 16:30:41 +0000 (16:30 +0000)
committerdbates@webkit.org <dbates@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 9 Aug 2017 16:30:41 +0000 (16:30 +0000)
commitc55bc700413ed61bbd7e5ad93d29dfdc04b313c5
tree83b155ba5beed5f5715dddbc16b419feee93e649
parent63d3ee4372b7b4938a6b26f2afb2a107653115f2
REGRESSION (r219013): OAuth flows are broken when redirecting back to application after authentication
https://bugs.webkit.org/show_bug.cgi?id=175247
<rdar://problem/33679804>

Reviewed by Brady Eidson.

Source/WebCore:

Add SPI so that Safari can differentiate between a form submission and a redirected form submission
and have PolicyCheck notify the frame loader client if the navigation was in response to receiving a
redirect response. This is the WebKit portion to fix an issue when a native app makes use of an OAuth
OAuth flow that bounces to Safari for user login and then bounce back to the app. Microsoft Graph's
OAuth flow is one example.

Safari was differentiating between a form submission and a redirected form submission based on the
nullity of WKNavigationAction.sourceFrame because in both cases the navigation type was WKNavigationTypeFormSubmitted.
The navigation type is the same for both navigations because WebKit always used the navigation
action from the original request for the redirect request when the original request redirected.
Prior to r219013, WKNavigationAction.sourceFrame would be nil for a form submission that redirects.
Following r219013, WKNavigationAction.sourceFrame is non-nil unless the navigation was initiated by
API. In particular, WKNavigationAction.sourceFrame is non-nil for the redirect navigation corresponding
to a form submission that redirects.

* loader/EmptyClients.cpp:
(WebCore::EmptyFrameLoaderClient::dispatchDecidePolicyForNavigationAction):
* loader/FrameLoaderClient.h:
Have dispatchDecidePolicyForNavigationAction() take a boolean as to whether the navigation was in
response to receiving a redirect response.
* loader/PolicyChecker.cpp:
(WebCore::PolicyChecker::checkNavigationPolicy): Notify the frame loader client whether the navigation
is in response to receiving a redirect response.

Source/WebKit:

Add SPI WKNavigationAction._isRedirect to query whether the navigation was in response to receiving
a redirect response. The majority of the WebKit change is plumbing this knowledge through to connect
it with the SPI.

* Shared/NavigationActionData.cpp:
(WebKit::NavigationActionData::encode const):
(WebKit::NavigationActionData::decode):
Encode and decode the boolean NavigationActionData::isRedirect.
* Shared/NavigationActionData.h:
* UIProcess/API/APINavigationAction.h:
* UIProcess/API/Cocoa/WKNavigationAction.mm:
(-[WKNavigationAction _isRedirect]): Added.
* UIProcess/API/Cocoa/WKNavigationActionPrivate.h:
* WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
(WebKit::WebFrameLoaderClient::dispatchDecidePolicyForNavigationAction): Set NavigationActionData::isRedirect
depending on whether the navigation is in response to receiving a redirect response.
* WebProcess/WebCoreSupport/WebFrameLoaderClient.h:

Source/WebKitLegacy/mac:

Plumb knowledge of whether a navigation was in response to receiving a redirect response.
We do not actually make use of this knowledge in WebKitLegacy because we do not know of any
clients that need to make use of this information at this time. If such a needs comes up
then we can expose API/SPI similar to what we do for WebKit.

* WebCoreSupport/WebFrameLoaderClient.h:
* WebCoreSupport/WebFrameLoaderClient.mm:
(WebFrameLoaderClient::dispatchDecidePolicyForNavigationAction):

Source/WebKitLegacy/win:

Plumb knowledge of whether a navigation was in response to receiving a redirect response.
We do not actually make use of this knowledge in WebKitLegacy because we do not know of any
clients that need to make use of this information at this time. If such a needs comes up
then we can expose API/SPI similar to what we do for WebKit.

* WebCoreSupport/WebFrameLoaderClient.cpp:
(WebFrameLoaderClient::dispatchDecidePolicyForNavigationAction):
* WebCoreSupport/WebFrameLoaderClient.h:

Tools:

Add tests for redirects.

* TestWebKitAPI/Tests/WebKit2Cocoa/DecidePolicyForNavigationAction.mm:
(TEST):
* TestWebKitAPI/cocoa/TestProtocol.mm:
(createRedirectURL):
(-[TestProtocol startLoading]):

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@220459 268f45cc-cd09-0410-ab3c-d52691b4dbfc
21 files changed:
Source/WebCore/ChangeLog
Source/WebCore/loader/EmptyClients.cpp
Source/WebCore/loader/FrameLoaderClient.h
Source/WebCore/loader/PolicyChecker.cpp
Source/WebKit/ChangeLog
Source/WebKit/Shared/NavigationActionData.cpp
Source/WebKit/Shared/NavigationActionData.h
Source/WebKit/UIProcess/API/APINavigationAction.h
Source/WebKit/UIProcess/API/Cocoa/WKNavigationAction.mm
Source/WebKit/UIProcess/API/Cocoa/WKNavigationActionPrivate.h
Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp
Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.h
Source/WebKitLegacy/mac/ChangeLog
Source/WebKitLegacy/mac/WebCoreSupport/WebFrameLoaderClient.h
Source/WebKitLegacy/mac/WebCoreSupport/WebFrameLoaderClient.mm
Source/WebKitLegacy/win/ChangeLog
Source/WebKitLegacy/win/WebCoreSupport/WebFrameLoaderClient.cpp
Source/WebKitLegacy/win/WebCoreSupport/WebFrameLoaderClient.h
Tools/ChangeLog
Tools/TestWebKitAPI/Tests/WebKit2Cocoa/DecidePolicyForNavigationAction.mm
Tools/TestWebKitAPI/cocoa/TestProtocol.mm