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&&);
}