Diff
Modified: trunk/LayoutTests/ChangeLog (214806 => 214807)
--- trunk/LayoutTests/ChangeLog 2017-04-03 16:59:41 UTC (rev 214806)
+++ trunk/LayoutTests/ChangeLog 2017-04-03 17:08:12 UTC (rev 214807)
@@ -1,3 +1,24 @@
+2017-04-03 Carlos Garcia Campos <cgar...@igalia.com>
+
+ [SOUP] URI Fragment is lost after redirect
+ https://bugs.webkit.org/show_bug.cgi?id=170058
+
+ Reviewed by Michael Catanzaro.
+
+ Add tests to check we correctly handle fragment identifiers on server redirections.
+
+ * http/tests/navigation/redirect-preserves-fragment-expected.txt: Added.
+ * http/tests/navigation/redirect-preserves-fragment.html: Added.
+ * http/tests/navigation/redirect-to-fragment-expected.txt: Added.
+ * http/tests/navigation/redirect-to-fragment.html: Added.
+ * http/tests/navigation/redirect-to-fragment2-expected.txt: Added.
+ * http/tests/navigation/redirect-to-fragment2.html: Added.
+ * http/tests/navigation/resources/redirect-preserves-fragment.php: Added.
+ * http/tests/navigation/resources/redirect-to-fragment.php: Added.
+ * http/tests/navigation/resources/redirect-to-fragment2.php: Added.
+ * platform/ios/TestExpectations:
+ * platform/mac/TestExpectations:
+
2017-04-03 Youenn Fablet <you...@apple.com>
captureStream is getting black frames with webgl canvas
Added: trunk/LayoutTests/http/tests/navigation/redirect-preserves-fragment-expected.txt (0 => 214807)
--- trunk/LayoutTests/http/tests/navigation/redirect-preserves-fragment-expected.txt (rev 0)
+++ trunk/LayoutTests/http/tests/navigation/redirect-preserves-fragment-expected.txt 2017-04-03 17:08:12 UTC (rev 214807)
@@ -0,0 +1,7 @@
+http://127.0.0.1:8000/navigation/resources/redirect-preserves-fragment.php#foo - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/navigation/resources/redirect-preserves-fragment.php#foo, main document URL http://127.0.0.1:8000/navigation/redirect-preserves-fragment.html, http method GET> redirectResponse (null)
+http://127.0.0.1:8000/navigation/redirect-preserves-fragment.html - didFinishLoading
+http://127.0.0.1:8000/navigation/resources/redirect-preserves-fragment.php#foo - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/navigation/resources/success.html#foo, main document URL http://127.0.0.1:8000/navigation/redirect-preserves-fragment.html, http method GET> redirectResponse <NSURLResponse http://127.0.0.1:8000/navigation/resources/redirect-preserves-fragment.php#foo, http status code 302>
+http://127.0.0.1:8000/navigation/resources/redirect-preserves-fragment.php#foo - didReceiveResponse <NSURLResponse http://127.0.0.1:8000/navigation/resources/success.html#foo, http status code 200>
+Test passes if WebKit preserves the request fragment identifier after the redirection.
+
+
Added: trunk/LayoutTests/http/tests/navigation/redirect-preserves-fragment.html (0 => 214807)
--- trunk/LayoutTests/http/tests/navigation/redirect-preserves-fragment.html (rev 0)
+++ trunk/LayoutTests/http/tests/navigation/redirect-preserves-fragment.html 2017-04-03 17:08:12 UTC (rev 214807)
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+if (window.testRunner) {
+ testRunner.dumpAsText();
+ testRunner.dumpResourceLoadCallbacks();
+ testRunner.waitUntilDone();
+}
+
+_onload_ = function() {
+ if (window.testRunner)
+ testRunner.notifyDone();
+}
+</script>
+</head>
+<body>
+<p>Test passes if WebKit preserves the request fragment identifier after the redirection.</p>
+<iframe src=""
+</body>
+</html>
Added: trunk/LayoutTests/http/tests/navigation/redirect-to-fragment-expected.txt (0 => 214807)
--- trunk/LayoutTests/http/tests/navigation/redirect-to-fragment-expected.txt (rev 0)
+++ trunk/LayoutTests/http/tests/navigation/redirect-to-fragment-expected.txt 2017-04-03 17:08:12 UTC (rev 214807)
@@ -0,0 +1,7 @@
+http://127.0.0.1:8000/navigation/resources/redirect-to-fragment.php#foo - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/navigation/resources/redirect-to-fragment.php#foo, main document URL http://127.0.0.1:8000/navigation/redirect-to-fragment.html, http method GET> redirectResponse (null)
+http://127.0.0.1:8000/navigation/redirect-to-fragment.html - didFinishLoading
+http://127.0.0.1:8000/navigation/resources/redirect-to-fragment.php#foo - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/navigation/resources/success.html#bar, main document URL http://127.0.0.1:8000/navigation/redirect-to-fragment.html, http method GET> redirectResponse <NSURLResponse http://127.0.0.1:8000/navigation/resources/redirect-to-fragment.php#foo, http status code 302>
+http://127.0.0.1:8000/navigation/resources/redirect-to-fragment.php#foo - didReceiveResponse <NSURLResponse http://127.0.0.1:8000/navigation/resources/success.html#bar, http status code 200>
+Test passes if WebKit ignores the request fragment identifier after the redirect to a url with a fragment identifier.
+
+
Added: trunk/LayoutTests/http/tests/navigation/redirect-to-fragment.html (0 => 214807)
--- trunk/LayoutTests/http/tests/navigation/redirect-to-fragment.html (rev 0)
+++ trunk/LayoutTests/http/tests/navigation/redirect-to-fragment.html 2017-04-03 17:08:12 UTC (rev 214807)
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+if (window.testRunner) {
+ testRunner.dumpAsText();
+ testRunner.dumpResourceLoadCallbacks();
+ testRunner.waitUntilDone();
+}
+
+_onload_ = function() {
+ if (window.testRunner)
+ testRunner.notifyDone();
+}
+</script>
+</head>
+<body>
+<p>Test passes if WebKit ignores the request fragment identifier after the redirect to a url with a fragment identifier.</p>
+<iframe src=""
+</body>
+</html>
Added: trunk/LayoutTests/http/tests/navigation/redirect-to-fragment2-expected.txt (0 => 214807)
--- trunk/LayoutTests/http/tests/navigation/redirect-to-fragment2-expected.txt (rev 0)
+++ trunk/LayoutTests/http/tests/navigation/redirect-to-fragment2-expected.txt 2017-04-03 17:08:12 UTC (rev 214807)
@@ -0,0 +1,8 @@
+http://127.0.0.1:8000/navigation/resources/redirect-to-fragment2.php - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/navigation/resources/redirect-to-fragment2.php, main document URL http://127.0.0.1:8000/navigation/redirect-to-fragment2.html, http method GET> redirectResponse (null)
+http://127.0.0.1:8000/navigation/redirect-to-fragment2.html - didFinishLoading
+http://127.0.0.1:8000/navigation/resources/redirect-to-fragment2.php - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/navigation/resources/redirect-preserves-fragment.php#bar, main document URL http://127.0.0.1:8000/navigation/redirect-to-fragment2.html, http method GET> redirectResponse <NSURLResponse http://127.0.0.1:8000/navigation/resources/redirect-to-fragment2.php, http status code 302>
+http://127.0.0.1:8000/navigation/resources/redirect-to-fragment2.php - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/navigation/resources/success.html#bar, main document URL http://127.0.0.1:8000/navigation/redirect-to-fragment2.html, http method GET> redirectResponse <NSURLResponse http://127.0.0.1:8000/navigation/resources/redirect-preserves-fragment.php#bar, http status code 302>
+http://127.0.0.1:8000/navigation/resources/redirect-to-fragment2.php - didReceiveResponse <NSURLResponse http://127.0.0.1:8000/navigation/resources/success.html#bar, http status code 200>
+Test passes if WebKit keeps fragment identifier from first redirected URL.
+
+
Added: trunk/LayoutTests/http/tests/navigation/redirect-to-fragment2.html (0 => 214807)
--- trunk/LayoutTests/http/tests/navigation/redirect-to-fragment2.html (rev 0)
+++ trunk/LayoutTests/http/tests/navigation/redirect-to-fragment2.html 2017-04-03 17:08:12 UTC (rev 214807)
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+if (window.testRunner) {
+ testRunner.dumpAsText();
+ testRunner.dumpResourceLoadCallbacks();
+ testRunner.waitUntilDone();
+}
+
+_onload_ = function() {
+ if (window.testRunner)
+ testRunner.notifyDone();
+}
+</script>
+</head>
+<body>
+<p>Test passes if WebKit keeps fragment identifier from first redirected URL.</p>
+<iframe src=""
+</body>
+</html>
Added: trunk/LayoutTests/http/tests/navigation/resources/redirect-preserves-fragment.php (0 => 214807)
--- trunk/LayoutTests/http/tests/navigation/resources/redirect-preserves-fragment.php (rev 0)
+++ trunk/LayoutTests/http/tests/navigation/resources/redirect-preserves-fragment.php 2017-04-03 17:08:12 UTC (rev 214807)
@@ -0,0 +1,4 @@
+<?php
+header('Location: success.html');
+?>
+
Added: trunk/LayoutTests/http/tests/navigation/resources/redirect-to-fragment.php (0 => 214807)
--- trunk/LayoutTests/http/tests/navigation/resources/redirect-to-fragment.php (rev 0)
+++ trunk/LayoutTests/http/tests/navigation/resources/redirect-to-fragment.php 2017-04-03 17:08:12 UTC (rev 214807)
@@ -0,0 +1,4 @@
+<?php
+header('Location: success.html#bar');
+?>
+
Added: trunk/LayoutTests/http/tests/navigation/resources/redirect-to-fragment2.php (0 => 214807)
--- trunk/LayoutTests/http/tests/navigation/resources/redirect-to-fragment2.php (rev 0)
+++ trunk/LayoutTests/http/tests/navigation/resources/redirect-to-fragment2.php 2017-04-03 17:08:12 UTC (rev 214807)
@@ -0,0 +1,4 @@
+<?php
+header('Location: redirect-preserves-fragment.php#bar');
+?>
+
Modified: trunk/LayoutTests/platform/ios/TestExpectations (214806 => 214807)
--- trunk/LayoutTests/platform/ios/TestExpectations 2017-04-03 16:59:41 UTC (rev 214806)
+++ trunk/LayoutTests/platform/ios/TestExpectations 2017-04-03 17:08:12 UTC (rev 214807)
@@ -2931,3 +2931,5 @@
fast/css-generated-content/initial-letter-pagination-sunken.html [ Skip ]
fast/css-generated-content/initial-letter-pagination-raised-rl.html [ Skip ]
fast/css-generated-content/initial-letter-pagination-sunken-rl.html [ Skip ]
+
+webkit.org/b/158420 http/tests/navigation/redirect-to-fragment2.html [ Failure ]
Modified: trunk/LayoutTests/platform/mac/TestExpectations (214806 => 214807)
--- trunk/LayoutTests/platform/mac/TestExpectations 2017-04-03 16:59:41 UTC (rev 214806)
+++ trunk/LayoutTests/platform/mac/TestExpectations 2017-04-03 17:08:12 UTC (rev 214807)
@@ -1568,3 +1568,5 @@
webkit.org/b/168132 http/tests/xmlhttprequest/simple-cross-origin-progress-events.html [ Pass Timeout ]
webkit.org/b/169838 [ Release ] fast/workers/worker-close-more.html [ Pass Timeout ]
+
+webkit.org/b/158420 http/tests/navigation/redirect-to-fragment2.html [ Failure ]
Modified: trunk/Source/WebKit2/ChangeLog (214806 => 214807)
--- trunk/Source/WebKit2/ChangeLog 2017-04-03 16:59:41 UTC (rev 214806)
+++ trunk/Source/WebKit2/ChangeLog 2017-04-03 17:08:12 UTC (rev 214807)
@@ -1,3 +1,19 @@
+2017-04-03 Carlos Garcia Campos <cgar...@igalia.com>
+
+ [SOUP] URI Fragment is lost after redirect
+ https://bugs.webkit.org/show_bug.cgi?id=170058
+
+ Reviewed by Michael Catanzaro.
+
+ In case of redirection check if the current request has a fragment identifier and apply it to the redirection
+ only when it doesn't have a fragment identifier yet.
+
+ * NetworkProcess/soup/NetworkDataTaskSoup.cpp:
+ (WebKit::NetworkDataTaskSoup::NetworkDataTaskSoup):
+ (WebKit::NetworkDataTaskSoup::createRequest):
+ (WebKit::NetworkDataTaskSoup::continueHTTPRedirection):
+ * NetworkProcess/soup/NetworkDataTaskSoup.h:
+
2017-04-03 Antti Koivisto <an...@apple.com>
Mutex may be freed too late in NetworkCache::Storage::traverse
Modified: trunk/Source/WebKit2/NetworkProcess/soup/NetworkDataTaskSoup.cpp (214806 => 214807)
--- trunk/Source/WebKit2/NetworkProcess/soup/NetworkDataTaskSoup.cpp 2017-04-03 16:59:41 UTC (rev 214806)
+++ trunk/Source/WebKit2/NetworkProcess/soup/NetworkDataTaskSoup.cpp 2017-04-03 17:08:12 UTC (rev 214807)
@@ -75,7 +75,7 @@
}
applyAuthenticationToRequest(request);
}
- createRequest(request);
+ createRequest(WTFMove(request));
}
NetworkDataTaskSoup::~NetworkDataTaskSoup()
@@ -102,9 +102,11 @@
m_allowOverwriteDownload = allowOverwrite;
}
-void NetworkDataTaskSoup::createRequest(const ResourceRequest& request)
+void NetworkDataTaskSoup::createRequest(ResourceRequest&& request)
{
- GUniquePtr<SoupURI> soupURI = request.createSoupURI();
+ m_currentRequest = WTFMove(request);
+
+ GUniquePtr<SoupURI> soupURI = m_currentRequest.createSoupURI();
if (!soupURI) {
scheduleFailure(InvalidURLFailure);
return;
@@ -116,9 +118,9 @@
return;
}
- request.updateSoupRequest(soupRequest.get());
+ m_currentRequest.updateSoupRequest(soupRequest.get());
- if (!request.url().protocolIsInHTTPFamily()) {
+ if (!m_currentRequest.url().protocolIsInHTTPFamily()) {
m_soupRequest = WTFMove(soupRequest);
return;
}
@@ -132,7 +134,7 @@
unsigned messageFlags = SOUP_MESSAGE_NO_REDIRECT;
- request.updateSoupMessage(soupMessage.get());
+ m_currentRequest.updateSoupMessage(soupMessage.get());
if (m_shouldContentSniff == DoNotSniffContent)
soup_message_disable_feature(soupMessage.get(), SOUP_TYPE_CONTENT_SNIFFER);
if (m_user.isEmpty() && m_password.isEmpty() && m_storedCredentials == DoNotAllowStoredCredentials) {
@@ -158,7 +160,7 @@
soup_message_set_flags(soupMessage.get(), static_cast<SoupMessageFlags>(soup_message_get_flags(soupMessage.get()) | messageFlags));
#if SOUP_CHECK_VERSION(2, 43, 1)
- soup_message_set_priority(soupMessage.get(), toSoupMessagePriority(request.priority()));
+ soup_message_set_priority(soupMessage.get(), toSoupMessagePriority(m_currentRequest.priority()));
#endif
m_soupRequest = WTFMove(soupRequest);
@@ -636,14 +638,17 @@
return;
}
- ResourceRequest request = m_firstRequest;
- request.setURL(URL(m_response.url(), m_response.httpHeaderField(HTTPHeaderName::Location)));
+ ResourceRequest request = m_currentRequest;
+ URL redirectedURL = URL(m_response.url(), m_response.httpHeaderField(HTTPHeaderName::Location));
+ if (!redirectedURL.hasFragmentIdentifier() && request.url().hasFragmentIdentifier())
+ redirectedURL.setFragmentIdentifier(request.url().fragmentIdentifier());
+ request.setURL(redirectedURL);
// Should not set Referer after a redirect from a secure resource to non-secure one.
if (m_shouldClearReferrerOnHTTPSToHTTPRedirect && !request.url().protocolIs("https") && protocolIs(request.httpReferrer(), "https"))
request.clearHTTPReferrer();
- bool isCrossOrigin = !protocolHostAndPortAreEqual(m_firstRequest.url(), request.url());
+ bool isCrossOrigin = !protocolHostAndPortAreEqual(m_currentRequest.url(), request.url());
if (!equalLettersIgnoringASCIICase(request.httpMethod(), "get")) {
// Change newRequest method to GET if change was made during a previous redirection or if current redirection says so.
if (m_soupMessage->method == SOUP_METHOD_GET || !request.url().protocolIsInHTTPFamily() || shouldRedirectAsGET(m_soupMessage.get(), isCrossOrigin)) {
@@ -689,7 +694,7 @@
#endif
applyAuthenticationToRequest(request);
}
- createRequest(request);
+ createRequest(WTFMove(request));
if (m_soupRequest && m_state != State::Suspended) {
m_state = State::Suspended;
resume();
Modified: trunk/Source/WebKit2/NetworkProcess/soup/NetworkDataTaskSoup.h (214806 => 214807)
--- trunk/Source/WebKit2/NetworkProcess/soup/NetworkDataTaskSoup.h 2017-04-03 16:59:41 UTC (rev 214806)
+++ trunk/Source/WebKit2/NetworkProcess/soup/NetworkDataTaskSoup.h 2017-04-03 17:08:12 UTC (rev 214807)
@@ -59,7 +59,7 @@
void startTimeout();
void stopTimeout();
- void createRequest(const WebCore::ResourceRequest&);
+ void createRequest(WebCore::ResourceRequest&&);
void clearRequest();
static void sendRequestCallback(SoupRequest*, GAsyncResult*, NetworkDataTaskSoup*);
void didSendRequest(GRefPtr<GInputStream>&&);
@@ -129,6 +129,7 @@
GRefPtr<GAsyncResult> m_pendingResult;
WebCore::ProtectionSpace m_protectionSpaceForPersistentStorage;
WebCore::Credential m_credentialForPersistentStorage;
+ WebCore::ResourceRequest m_currentRequest;
WebCore::ResourceResponse m_response;
Vector<char> m_readBuffer;
unsigned m_redirectCount { 0 };