Title: [261468] trunk
Revision
261468
Author
commit-qu...@webkit.org
Date
2020-05-10 23:57:27 -0700 (Sun, 10 May 2020)

Log Message

Fix base64.any.html test
https://bugs.webkit.org/show_bug.cgi?id=211671

Patch by Rob Buis <rb...@igalia.com> on 2020-05-10
Reviewed by Darin Adler.

LayoutTests/imported/w3c:

Update improved test expectation.

* web-platform-tests/fetch/data-urls/base64.any-expected.txt:
* web-platform-tests/fetch/data-urls/base64.any.worker-expected.txt:

Source/WebCore:

Fix base64.any.html test by extending DataURLDecoder with a
forgiving-base64 decode mode [1], as used by the Fetch
data: URL processor algorithm [2].

Behavior matches Chrome and Firefox.

[1] https://infra.spec.whatwg.org/#forgiving-base64-decode
[2] https://fetch.spec.whatwg.org/#data-url-processor

Test: imported/w3c/web-platform-tests/fetch/data-urls/base64.any.html

* loader/ResourceLoader.cpp:
(WebCore::ResourceLoader::loadDataURL):
* platform/network/DataURLDecoder.cpp:
(WebCore::DataURLDecoder::decodeBase64):
(WebCore::DataURLDecoder::decode):
* platform/network/DataURLDecoder.h:

Modified Paths

Diff

Modified: trunk/LayoutTests/imported/w3c/ChangeLog (261467 => 261468)


--- trunk/LayoutTests/imported/w3c/ChangeLog	2020-05-11 06:14:56 UTC (rev 261467)
+++ trunk/LayoutTests/imported/w3c/ChangeLog	2020-05-11 06:57:27 UTC (rev 261468)
@@ -1,5 +1,17 @@
 2020-05-10  Rob Buis  <rb...@igalia.com>
 
+        Fix base64.any.html test
+        https://bugs.webkit.org/show_bug.cgi?id=211671
+
+        Reviewed by Darin Adler.
+
+        Update improved test expectation.
+
+        * web-platform-tests/fetch/data-urls/base64.any-expected.txt:
+        * web-platform-tests/fetch/data-urls/base64.any.worker-expected.txt:
+
+2020-05-10  Rob Buis  <rb...@igalia.com>
+
         [ iOS wk2 and Mac wk2 ] imported/w3c/web-platform-tests/fetch/stale-while-revalidate/frame-removal.html is flaky failing.
         https://bugs.webkit.org/show_bug.cgi?id=209281
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/data-urls/base64.any-expected.txt (261467 => 261468)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/data-urls/base64.any-expected.txt	2020-05-11 06:14:56 UTC (rev 261467)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/data-urls/base64.any-expected.txt	2020-05-11 06:57:27 UTC (rev 261468)
@@ -4,9 +4,9 @@
 PASS data: URL base64 handling: "abcd" 
 PASS data: URL base64 handling: " abcd" 
 PASS data: URL base64 handling: "abcd " 
-FAIL data: URL base64 handling: " abcd===" assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL data: URL base64 handling: "abcd=== " assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL data: URL base64 handling: "abcd ===" assert_unreached: Should have rejected: undefined Reached unreachable code
+PASS data: URL base64 handling: " abcd===" 
+PASS data: URL base64 handling: "abcd=== " 
+PASS data: URL base64 handling: "abcd ===" 
 PASS data: URL base64 handling: "a" 
 PASS data: URL base64 handling: "ab" 
 PASS data: URL base64 handling: "abc" 
@@ -22,21 +22,21 @@
 PASS data: URL base64 handling: "a===" 
 PASS data: URL base64 handling: "a====" 
 PASS data: URL base64 handling: "a=====" 
-FAIL data: URL base64 handling: "ab=" assert_unreached: Should have rejected: undefined Reached unreachable code
+PASS data: URL base64 handling: "ab=" 
 PASS data: URL base64 handling: "ab==" 
-FAIL data: URL base64 handling: "ab===" assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL data: URL base64 handling: "ab====" assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL data: URL base64 handling: "ab=====" assert_unreached: Should have rejected: undefined Reached unreachable code
+PASS data: URL base64 handling: "ab===" 
+PASS data: URL base64 handling: "ab====" 
+PASS data: URL base64 handling: "ab=====" 
 PASS data: URL base64 handling: "abc=" 
-FAIL data: URL base64 handling: "abc==" assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL data: URL base64 handling: "abc===" assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL data: URL base64 handling: "abc====" assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL data: URL base64 handling: "abc=====" assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL data: URL base64 handling: "abcd=" assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL data: URL base64 handling: "abcd==" assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL data: URL base64 handling: "abcd===" assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL data: URL base64 handling: "abcd====" assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL data: URL base64 handling: "abcd=====" assert_unreached: Should have rejected: undefined Reached unreachable code
+PASS data: URL base64 handling: "abc==" 
+PASS data: URL base64 handling: "abc===" 
+PASS data: URL base64 handling: "abc====" 
+PASS data: URL base64 handling: "abc=====" 
+PASS data: URL base64 handling: "abcd=" 
+PASS data: URL base64 handling: "abcd==" 
+PASS data: URL base64 handling: "abcd===" 
+PASS data: URL base64 handling: "abcd====" 
+PASS data: URL base64 handling: "abcd=====" 
 PASS data: URL base64 handling: "abcde=" 
 PASS data: URL base64 handling: "abcde==" 
 PASS data: URL base64 handling: "abcde===" 
@@ -78,6 +78,6 @@
 PASS data: URL base64 handling: "YR" 
 PASS data: URL base64 handling: "~~" 
 PASS data: URL base64 handling: ".." 
-FAIL data: URL base64 handling: "--" assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL data: URL base64 handling: "__" assert_unreached: Should have rejected: undefined Reached unreachable code
+PASS data: URL base64 handling: "--" 
+PASS data: URL base64 handling: "__" 
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/data-urls/base64.any.worker-expected.txt (261467 => 261468)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/data-urls/base64.any.worker-expected.txt	2020-05-11 06:14:56 UTC (rev 261467)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/data-urls/base64.any.worker-expected.txt	2020-05-11 06:57:27 UTC (rev 261468)
@@ -4,9 +4,9 @@
 PASS data: URL base64 handling: "abcd" 
 PASS data: URL base64 handling: " abcd" 
 PASS data: URL base64 handling: "abcd " 
-FAIL data: URL base64 handling: " abcd===" assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL data: URL base64 handling: "abcd=== " assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL data: URL base64 handling: "abcd ===" assert_unreached: Should have rejected: undefined Reached unreachable code
+PASS data: URL base64 handling: " abcd===" 
+PASS data: URL base64 handling: "abcd=== " 
+PASS data: URL base64 handling: "abcd ===" 
 PASS data: URL base64 handling: "a" 
 PASS data: URL base64 handling: "ab" 
 PASS data: URL base64 handling: "abc" 
@@ -22,21 +22,21 @@
 PASS data: URL base64 handling: "a===" 
 PASS data: URL base64 handling: "a====" 
 PASS data: URL base64 handling: "a=====" 
-FAIL data: URL base64 handling: "ab=" assert_unreached: Should have rejected: undefined Reached unreachable code
+PASS data: URL base64 handling: "ab=" 
 PASS data: URL base64 handling: "ab==" 
-FAIL data: URL base64 handling: "ab===" assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL data: URL base64 handling: "ab====" assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL data: URL base64 handling: "ab=====" assert_unreached: Should have rejected: undefined Reached unreachable code
+PASS data: URL base64 handling: "ab===" 
+PASS data: URL base64 handling: "ab====" 
+PASS data: URL base64 handling: "ab=====" 
 PASS data: URL base64 handling: "abc=" 
-FAIL data: URL base64 handling: "abc==" assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL data: URL base64 handling: "abc===" assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL data: URL base64 handling: "abc====" assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL data: URL base64 handling: "abc=====" assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL data: URL base64 handling: "abcd=" assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL data: URL base64 handling: "abcd==" assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL data: URL base64 handling: "abcd===" assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL data: URL base64 handling: "abcd====" assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL data: URL base64 handling: "abcd=====" assert_unreached: Should have rejected: undefined Reached unreachable code
+PASS data: URL base64 handling: "abc==" 
+PASS data: URL base64 handling: "abc===" 
+PASS data: URL base64 handling: "abc====" 
+PASS data: URL base64 handling: "abc=====" 
+PASS data: URL base64 handling: "abcd=" 
+PASS data: URL base64 handling: "abcd==" 
+PASS data: URL base64 handling: "abcd===" 
+PASS data: URL base64 handling: "abcd====" 
+PASS data: URL base64 handling: "abcd=====" 
 PASS data: URL base64 handling: "abcde=" 
 PASS data: URL base64 handling: "abcde==" 
 PASS data: URL base64 handling: "abcde===" 
@@ -78,6 +78,6 @@
 PASS data: URL base64 handling: "YR" 
 PASS data: URL base64 handling: "~~" 
 PASS data: URL base64 handling: ".." 
-FAIL data: URL base64 handling: "--" assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL data: URL base64 handling: "__" assert_unreached: Should have rejected: undefined Reached unreachable code
+PASS data: URL base64 handling: "--" 
+PASS data: URL base64 handling: "__" 
 

Modified: trunk/Source/WebCore/ChangeLog (261467 => 261468)


--- trunk/Source/WebCore/ChangeLog	2020-05-11 06:14:56 UTC (rev 261467)
+++ trunk/Source/WebCore/ChangeLog	2020-05-11 06:57:27 UTC (rev 261468)
@@ -1,3 +1,28 @@
+2020-05-10  Rob Buis  <rb...@igalia.com>
+
+        Fix base64.any.html test
+        https://bugs.webkit.org/show_bug.cgi?id=211671
+
+        Reviewed by Darin Adler.
+
+        Fix base64.any.html test by extending DataURLDecoder with a
+        forgiving-base64 decode mode [1], as used by the Fetch
+        data: URL processor algorithm [2].
+
+        Behavior matches Chrome and Firefox.
+
+        [1] https://infra.spec.whatwg.org/#forgiving-base64-decode
+        [2] https://fetch.spec.whatwg.org/#data-url-processor
+
+        Test: imported/w3c/web-platform-tests/fetch/data-urls/base64.any.html
+
+        * loader/ResourceLoader.cpp:
+        (WebCore::ResourceLoader::loadDataURL):
+        * platform/network/DataURLDecoder.cpp:
+        (WebCore::DataURLDecoder::decodeBase64):
+        (WebCore::DataURLDecoder::decode):
+        * platform/network/DataURLDecoder.h:
+
 2020-05-10  Darin Adler  <da...@apple.com>
 
         Add copy constructor and assignment operator to Ref<>

Modified: trunk/Source/WebCore/loader/ResourceLoader.cpp (261467 => 261468)


--- trunk/Source/WebCore/loader/ResourceLoader.cpp	2020-05-11 06:14:56 UTC (rev 261467)
+++ trunk/Source/WebCore/loader/ResourceLoader.cpp	2020-05-11 06:57:27 UTC (rev 261468)
@@ -273,7 +273,10 @@
             scheduleContext.scheduledPairs = *scheduledPairs;
     }
 #endif
-    DataURLDecoder::decode(url, scheduleContext, [this, protectedThis = makeRef(*this), url](auto decodeResult) mutable {
+    auto mode = DataURLDecoder::Mode::Legacy;
+    if (m_request.requester() == ResourceRequest::Requester::Fetch)
+        mode = DataURLDecoder::Mode::ForgivingBase64;
+    DataURLDecoder::decode(url, scheduleContext, mode, [this, protectedThis = makeRef(*this), url](auto decodeResult) mutable {
         if (this->reachedTerminalState())
             return;
         if (!decodeResult) {

Modified: trunk/Source/WebCore/platform/network/DataURLDecoder.cpp (261467 => 261468)


--- trunk/Source/WebCore/platform/network/DataURLDecoder.cpp	2020-05-11 06:14:56 UTC (rev 261467)
+++ trunk/Source/WebCore/platform/network/DataURLDecoder.cpp	2020-05-11 06:57:27 UTC (rev 261468)
@@ -152,15 +152,21 @@
     );
 }
 
-static void decodeBase64(DecodeTask& task)
+static void decodeBase64(DecodeTask& task, Mode mode)
 {
     Vector<char> buffer;
-    // First try base64url.
-    if (!base64URLDecode(task.encodedData.toStringWithoutCopying(), buffer)) {
-        // Didn't work, try unescaping and decoding as base64.
+    if (mode == Mode::ForgivingBase64) {
         auto unescapedString = decodeURLEscapeSequences(task.encodedData.toStringWithoutCopying());
-        if (!base64Decode(unescapedString, buffer, Base64IgnoreSpacesAndNewLines | Base64DiscardVerticalTab))
+        if (!base64Decode(unescapedString, buffer, Base64ValidatePadding | Base64IgnoreSpacesAndNewLines | Base64DiscardVerticalTab))
             return;
+    } else {
+        // First try base64url.
+        if (!base64URLDecode(task.encodedData.toStringWithoutCopying(), buffer)) {
+            // Didn't work, try unescaping and decoding as base64.
+            auto unescapedString = decodeURLEscapeSequences(task.encodedData.toStringWithoutCopying());
+            if (!base64Decode(unescapedString, buffer, Base64IgnoreSpacesAndNewLines | Base64DiscardVerticalTab))
+                return;
+        }
     }
     buffer.shrinkToFit();
     task.result.data = ""
@@ -176,14 +182,14 @@
     task.result.data = ""
 }
 
-void decode(const URL& url, const ScheduleContext& scheduleContext, DecodeCompletionHandler&& completionHandler)
+void decode(const URL& url, const ScheduleContext& scheduleContext, Mode mode, DecodeCompletionHandler&& completionHandler)
 {
     ASSERT(url.protocolIsData());
 
-    decodeQueue().dispatch([decodeTask = createDecodeTask(url, scheduleContext, WTFMove(completionHandler))]() mutable {
+    decodeQueue().dispatch([decodeTask = createDecodeTask(url, scheduleContext, WTFMove(completionHandler)), mode]() mutable {
         if (decodeTask->process()) {
             if (decodeTask->isBase64)
-                decodeBase64(*decodeTask);
+                decodeBase64(*decodeTask, mode);
             else
                 decodeEscaped(*decodeTask);
         }

Modified: trunk/Source/WebCore/platform/network/DataURLDecoder.h (261467 => 261468)


--- trunk/Source/WebCore/platform/network/DataURLDecoder.h	2020-05-11 06:14:56 UTC (rev 261467)
+++ trunk/Source/WebCore/platform/network/DataURLDecoder.h	2020-05-11 06:57:27 UTC (rev 261468)
@@ -51,7 +51,8 @@
 #endif
 };
 
-void decode(const URL&, const ScheduleContext&, DecodeCompletionHandler&&);
+enum class Mode { Legacy, ForgivingBase64 };
+void decode(const URL&, const ScheduleContext&, Mode, DecodeCompletionHandler&&);
 
 }
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to