Use same parser for <meta http-equiv="refresh"> and `Refresh` HTTP header
authorcdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 12 Sep 2019 04:32:29 +0000 (04:32 +0000)
committercdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 12 Sep 2019 04:32:29 +0000 (04:32 +0000)
https://bugs.webkit.org/show_bug.cgi?id=201694

Reviewed by Alex Christensen.

LayoutTests/imported/w3c:

Rebaseline WPT test now that it is passing.

* web-platform-tests/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/parsing-expected.txt:

Source/WebCore:

Use same parser for <meta http-equiv="refresh"> and `Refresh` HTTP header. This aligns
our behavior with Blink and makes us more compliant on web-platform-tests. This also
simplifies our code.

No new tests, rebaselined existing test.

* loader/FrameLoader.cpp:
(WebCore::FrameLoader::receivedFirstData):
* platform/network/HTTPParsers.cpp:
(WebCore::parseHTTPRefresh): Deleted.
* platform/network/HTTPParsers.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249792 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/imported/w3c/ChangeLog
LayoutTests/imported/w3c/web-platform-tests/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/parsing-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/loader/FrameLoader.cpp
Source/WebCore/platform/network/HTTPParsers.cpp
Source/WebCore/platform/network/HTTPParsers.h

index 6ae29d5..0dfd322 100644 (file)
@@ -1,5 +1,16 @@
 2019-09-11  Chris Dumez  <cdumez@apple.com>
 
+        Use same parser for <meta http-equiv="refresh"> and `Refresh` HTTP header
+        https://bugs.webkit.org/show_bug.cgi?id=201694
+
+        Reviewed by Alex Christensen.
+
+        Rebaseline WPT test now that it is passing.
+
+        * web-platform-tests/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/parsing-expected.txt:
+
+2019-09-11  Chris Dumez  <cdumez@apple.com>
+
         Posting a message to a redundant service worker should fail silently instead of throwing
         https://bugs.webkit.org/show_bug.cgi?id=201696
 
index ce04745..fb825da 100644 (file)
@@ -1,6 +1,4 @@
 
-Harness Error (TIMEOUT), message = null
-
 PASS <meta>: "" 
 PASS Refresh header: "" 
 PASS <meta>: "1" 
@@ -21,13 +19,13 @@ PASS Refresh header: "1; url=foo"
 PASS <meta>: "1, url=foo" 
 PASS Refresh header: "1, url=foo" 
 PASS <meta>: "1 url=foo" 
-TIMEOUT Refresh header: "1 url=foo" Test timed out
+PASS Refresh header: "1 url=foo" 
 PASS <meta>: "1;\turl=foo" 
 PASS Refresh header: "1;\turl=foo" 
 PASS <meta>: "1,\turl=foo" 
 PASS Refresh header: "1,\turl=foo" 
 PASS <meta>: "1\turl=foo" 
-TIMEOUT Refresh header: "1\turl=foo" Test timed out
+PASS Refresh header: "1\turl=foo" 
 PASS <meta>: "1;\rurl=foo" 
 PASS <meta>: "1,\rurl=foo" 
 PASS <meta>: "1\rurl=foo" 
@@ -42,7 +40,7 @@ PASS Refresh header: "1url=foo"
 PASS <meta>: "1x;url=foo" 
 PASS Refresh header: "1x;url=foo" 
 PASS <meta>: "1 x;url=foo" 
-TIMEOUT Refresh header: "1 x;url=foo" Test timed out
+PASS Refresh header: "1 x;url=foo" 
 PASS <meta>: "1;;url=foo" 
 PASS Refresh header: "1;;url=foo" 
 PASS <meta>: "  1  ;  url  =  foo" 
@@ -54,7 +52,7 @@ PASS Refresh header: "  1  ;  foo"
 PASS <meta>: "  1  ,  foo" 
 PASS Refresh header: "  1  ,  foo" 
 PASS <meta>: "  1  url  =  foo" 
-TIMEOUT Refresh header: "  1  url  =  foo" Test timed out
+PASS Refresh header: "  1  url  =  foo" 
 PASS <meta>: "1; url=foo " 
 PASS Refresh header: "1; url=foo " 
 PASS <meta>: "1; url=f\to\no" 
@@ -85,53 +83,53 @@ PASS Refresh header: ",foo"
 PASS <meta>: "foo" 
 PASS Refresh header: "foo" 
 PASS <meta>: "+1; url=foo" 
-FAIL Refresh header: "+1; url=foo" assert_equals: expected "refresh.py" but got "foo"
+PASS Refresh header: "+1; url=foo" 
 PASS <meta>: "-1; url=foo" 
 PASS Refresh header: "-1; url=foo" 
 PASS <meta>: "+0; url=foo" 
-FAIL Refresh header: "+0; url=foo" assert_equals: expected "refresh.py" but got "foo"
+PASS Refresh header: "+0; url=foo" 
 PASS <meta>: "-0; url=foo" 
-FAIL Refresh header: "-0; url=foo" assert_equals: expected "refresh.py" but got "foo"
+PASS Refresh header: "-0; url=foo" 
 PASS <meta>: "0; url=foo" 
 PASS Refresh header: "0; url=foo" 
 PASS <meta>: "+1; foo" 
-FAIL Refresh header: "+1; foo" assert_equals: expected "refresh.py" but got "foo"
+PASS Refresh header: "+1; foo" 
 PASS <meta>: "-1; foo" 
 PASS Refresh header: "-1; foo" 
 PASS <meta>: "+0; foo" 
-FAIL Refresh header: "+0; foo" assert_equals: expected "refresh.py" but got "foo"
+PASS Refresh header: "+0; foo" 
 PASS <meta>: "-0; foo" 
-FAIL Refresh header: "-0; foo" assert_equals: expected "refresh.py" but got "foo"
+PASS Refresh header: "-0; foo" 
 PASS <meta>: "0; foo" 
 PASS Refresh header: "0; foo" 
 PASS <meta>: "+1" 
-FAIL Refresh header: "+1" assert_unreached: Got > 1 load events Reached unreachable code
+PASS Refresh header: "+1" 
 PASS <meta>: "-1" 
 PASS Refresh header: "-1" 
 PASS <meta>: "+0" 
-FAIL Refresh header: "+0" assert_unreached: Got > 1 load events Reached unreachable code
+PASS Refresh header: "+0" 
 PASS <meta>: "-0" 
-FAIL Refresh header: "-0" assert_unreached: Got > 1 load events Reached unreachable code
+PASS Refresh header: "-0" 
 PASS <meta>: "0" 
 PASS Refresh header: "0" 
 PASS <meta>: "1.9; url=foo" 
 PASS Refresh header: "1.9; url=foo" 
 PASS <meta>: "1.9..5.; url=foo" 
-TIMEOUT Refresh header: "1.9..5.; url=foo" Test timed out
+PASS Refresh header: "1.9..5.; url=foo" 
 PASS <meta>: ".9; url=foo" 
 PASS Refresh header: ".9; url=foo" 
 PASS <meta>: "0.9; url=foo" 
 PASS Refresh header: "0.9; url=foo" 
 PASS <meta>: "0...9; url=foo" 
-TIMEOUT Refresh header: "0...9; url=foo" Test timed out
+PASS Refresh header: "0...9; url=foo" 
 PASS <meta>: "0...; url=foo" 
-TIMEOUT Refresh header: "0...; url=foo" Test timed out
+PASS Refresh header: "0...; url=foo" 
 PASS <meta>: "1e0; url=foo" 
-FAIL Refresh header: "1e0; url=foo" assert_equals: expected "refresh.py" but got "foo"
+PASS Refresh header: "1e0; url=foo" 
 PASS <meta>: "1e1; url=foo" 
 PASS Refresh header: "1e1; url=foo" 
 PASS <meta>: "10e-1; url=foo" 
-FAIL Refresh header: "10e-1; url=foo" assert_equals: expected "refresh.py" but got "foo"
+PASS Refresh header: "10e-1; url=foo" 
 PASS <meta>: "-0.1; url=foo" 
 PASS Refresh header: "-0.1; url=foo" 
 
index 18692c2..15fa653 100644 (file)
@@ -1,3 +1,22 @@
+2019-09-11  Chris Dumez  <cdumez@apple.com>
+
+        Use same parser for <meta http-equiv="refresh"> and `Refresh` HTTP header
+        https://bugs.webkit.org/show_bug.cgi?id=201694
+
+        Reviewed by Alex Christensen.
+
+        Use same parser for <meta http-equiv="refresh"> and `Refresh` HTTP header. This aligns
+        our behavior with Blink and makes us more compliant on web-platform-tests. This also
+        simplifies our code.
+
+        No new tests, rebaselined existing test.
+
+        * loader/FrameLoader.cpp:
+        (WebCore::FrameLoader::receivedFirstData):
+        * platform/network/HTTPParsers.cpp:
+        (WebCore::parseHTTPRefresh): Deleted.
+        * platform/network/HTTPParsers.h:
+
 2019-09-11  Saam Barati  <sbarati@apple.com>
 
         [WHLSL] Ensure structs/arrays with pointers as fields are disallowed
index 13e14d5..07f5cea 100644 (file)
@@ -703,7 +703,7 @@ void FrameLoader::receivedFirstData()
 
     double delay;
     String urlString;
-    if (!parseHTTPRefresh(documentLoader.response().httpHeaderField(HTTPHeaderName::Refresh), delay, urlString))
+    if (!parseMetaHTTPEquivRefresh(documentLoader.response().httpHeaderField(HTTPHeaderName::Refresh), delay, urlString))
         return;
     auto completedURL = urlString.isEmpty() ? document.url() : document.completeURL(urlString);
     if (!WTF::protocolIsJavaScript(completedURL))
index 50a2379..108e516 100644 (file)
@@ -199,65 +199,6 @@ static String trimInputSample(const char* p, size_t length)
     return s;
 }
 
-bool parseHTTPRefresh(const String& refresh, double& delay, String& url)
-{
-    unsigned len = refresh.length();
-    unsigned pos = 0;
-    
-    if (!skipWhiteSpace(refresh, pos))
-        return false;
-    
-    while (pos != len && refresh[pos] != ',' && refresh[pos] != ';')
-        ++pos;
-    
-    if (pos == len) { // no URL
-        url = String();
-        bool ok;
-        delay = refresh.stripWhiteSpace().toDouble(&ok);
-        return ok;
-    } else {
-        bool ok;
-        delay = refresh.left(pos).stripWhiteSpace().toDouble(&ok);
-        if (!ok)
-            return false;
-        
-        ++pos;
-        skipWhiteSpace(refresh, pos);
-        unsigned urlStartPos = pos;
-        if (refresh.findIgnoringASCIICase("url", urlStartPos) == urlStartPos) {
-            urlStartPos += 3;
-            skipWhiteSpace(refresh, urlStartPos);
-            if (refresh[urlStartPos] == '=') {
-                ++urlStartPos;
-                skipWhiteSpace(refresh, urlStartPos);
-            } else
-                urlStartPos = pos;  // e.g. "Refresh: 0; url.html"
-        }
-
-        unsigned urlEndPos = len;
-
-        if (refresh[urlStartPos] == '"' || refresh[urlStartPos] == '\'') {
-            UChar quotationMark = refresh[urlStartPos];
-            urlStartPos++;
-            while (urlEndPos > urlStartPos) {
-                urlEndPos--;
-                if (refresh[urlEndPos] == quotationMark)
-                    break;
-            }
-            
-            // https://bugs.webkit.org/show_bug.cgi?id=27868
-            // Sometimes there is no closing quote for the end of the URL even though there was an opening quote.
-            // If we looped over the entire alleged URL string back to the opening quote, just use everything
-            // after the opening quote instead.
-            if (urlEndPos == urlStartPos)
-                urlEndPos = len;
-        }
-
-        url = refresh.substring(urlStartPos, urlEndPos - urlStartPos).stripWhiteSpace();
-        return true;
-    }
-}
-
 Optional<WallTime> parseHTTPDate(const String& value)
 {
     double dateInMillisecondsSinceEpoch = parseDateFromNullTerminatedCharacters(value.utf8().data());
index e3e1927..cc6ce10 100644 (file)
@@ -73,7 +73,6 @@ bool isValidHTTPHeaderValue(const String&);
 bool isValidAcceptHeaderValue(const String&);
 bool isValidLanguageHeaderValue(const String&);
 bool isValidHTTPToken(const String&);
-bool parseHTTPRefresh(const String& refresh, double& delay, String& url);
 Optional<WallTime> parseHTTPDate(const String&);
 String filenameFromHTTPContentDisposition(const String&);
 String extractMIMETypeFromMediaType(const String&);