<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[195694] trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/195694">195694</a></dd>
<dt>Author</dt> <dd>cdumez@apple.com</dd>
<dt>Date</dt> <dd>2016-01-27 14:37:48 -0800 (Wed, 27 Jan 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>window.atob() should ignore spaces in input
https://bugs.webkit.org/show_bug.cgi?id=153522
&lt;rdar://problem/24357822&gt;

Reviewed by Benjamin Poulain.

Source/WebCore:

window.atob() should ignore spaces in input as per:
- https://html.spec.whatwg.org/#dom-windowbase64-atob (Step 3)

Previously, WebKit would throw an exception and it was the only browser
to do so. Firefox and Chrome behavior according to the specification.

This was causing us to fail 10 checks in the following W3C HTML test:
http://w3c-test.org/html/webappapis/atob/base64.html

No new tests, updated existing test.

* page/DOMWindow.cpp:
(WebCore::DOMWindow::atob):
* page/Page.cpp:
(WebCore::Page::userStyleSheetLocationChanged):
* platform/network/DataURL.cpp:
(WebCore::handleDataURL):
* platform/network/DataURLDecoder.cpp:
(WebCore::DataURLDecoder::decodeBase64):

Source/WebKit/mac:

* WebCoreSupport/WebInspectorClient.mm:
(WebInspectorFrontendClient::save):

Source/WebKit2:

* UIProcess/mac/WebInspectorProxyMac.mm:
(WebKit::WebInspectorProxy::platformSave):

Source/WTF:

Turn Base64DecodePolicy enum into flags so that the caller can indicate
to both validate padding AND ignore spaces.

Also make sure that the output Vector size is properly shrunk when
spaces are ignored.

* wtf/text/Base64.cpp:
(WTF::base64DecodeInternal):
(WTF::base64Decode):
(WTF::base64URLDecode):
* wtf/text/Base64.h:

LayoutTests:

Update window.atob() test to cover cases with spaces in
input.

* fast/dom/Window/atob-btoa-expected.txt:
* fast/dom/Window/atob-btoa.html:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsfastdomWindowatobbtoaexpectedtxt">trunk/LayoutTests/fast/dom/Window/atob-btoa-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastdomWindowatobbtoahtml">trunk/LayoutTests/fast/dom/Window/atob-btoa.html</a></li>
<li><a href="#trunkSourceWTFChangeLog">trunk/Source/WTF/ChangeLog</a></li>
<li><a href="#trunkSourceWTFwtftextBase64cpp">trunk/Source/WTF/wtf/text/Base64.cpp</a></li>
<li><a href="#trunkSourceWTFwtftextBase64h">trunk/Source/WTF/wtf/text/Base64.h</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorepageDOMWindowcpp">trunk/Source/WebCore/page/DOMWindow.cpp</a></li>
<li><a href="#trunkSourceWebCorepagePagecpp">trunk/Source/WebCore/page/Page.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkDataURLcpp">trunk/Source/WebCore/platform/network/DataURL.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkDataURLDecodercpp">trunk/Source/WebCore/platform/network/DataURLDecoder.cpp</a></li>
<li><a href="#trunkSourceWebKitmacChangeLog">trunk/Source/WebKit/mac/ChangeLog</a></li>
<li><a href="#trunkSourceWebKitmacWebCoreSupportWebInspectorClientmm">trunk/Source/WebKit/mac/WebCoreSupport/WebInspectorClient.mm</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2UIProcessmacWebInspectorProxyMacmm">trunk/Source/WebKit2/UIProcess/mac/WebInspectorProxyMac.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (195693 => 195694)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2016-01-27 22:31:17 UTC (rev 195693)
+++ trunk/LayoutTests/ChangeLog        2016-01-27 22:37:48 UTC (rev 195694)
</span><span class="lines">@@ -1,3 +1,17 @@
</span><ins>+2016-01-27  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        window.atob() should ignore spaces in input
+        https://bugs.webkit.org/show_bug.cgi?id=153522
+        &lt;rdar://problem/24357822&gt;
+
+        Reviewed by Benjamin Poulain.
+
+        Update window.atob() test to cover cases with spaces in
+        input.
+
+        * fast/dom/Window/atob-btoa-expected.txt:
+        * fast/dom/Window/atob-btoa.html:
+
</ins><span class="cx"> 2016-01-27  Brady Eidson  &lt;beidson@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Modern IDB: SQLite backend doesn't update index records as object records are added.
</span></span></pre></div>
<a id="trunkLayoutTestsfastdomWindowatobbtoaexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/dom/Window/atob-btoa-expected.txt (195693 => 195694)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/dom/Window/atob-btoa-expected.txt        2016-01-27 22:31:17 UTC (rev 195693)
+++ trunk/LayoutTests/fast/dom/Window/atob-btoa-expected.txt        2016-01-27 22:37:48 UTC (rev 195694)
</span><span class="lines">@@ -26,8 +26,19 @@
</span><span class="cx"> PASS window.atob(&quot;&quot;) is &quot;&quot;
</span><span class="cx"> PASS window.atob(null) is &quot;žée&quot;
</span><span class="cx"> PASS window.atob(undefined) threw exception Error: InvalidCharacterError: DOM Exception 5.
</span><del>-PASS window.atob(&quot; YQ==&quot;) threw exception Error: InvalidCharacterError: DOM Exception 5.
-PASS window.atob(&quot;YQ==\u000a&quot;) threw exception Error: InvalidCharacterError: DOM Exception 5.
</del><ins>+PASS window.atob(&quot; YQ==&quot;) is &quot;a&quot;
+PASS window.atob(&quot;YQ==\u000a&quot;) is &quot;a&quot;
+PASS window.atob(&quot;ab\tcd&quot;) is &quot;i·&quot;
+PASS window.atob(&quot;ab\ncd&quot;) is &quot;i·&quot;
+PASS window.atob(&quot;ab\fcd&quot;) is &quot;i·&quot;
+PASS window.atob(&quot;ab cd&quot;) is &quot;i·&quot;
+PASS window.atob(&quot;ab\t\n\f\r cd&quot;) is &quot;i·&quot;
+PASS window.atob(&quot; \t\n\f\r ab\t\n\f\r cd\t\n\f\r &quot;) is &quot;i·&quot;
+PASS window.atob(&quot;ab\t\n\f\r =\t\n\f\r =\t\n\f\r &quot;) is &quot;i&quot;
+PASS window.atob(&quot;            &quot;) is &quot;&quot;
+PASS window.atob(&quot; abcd===&quot;) threw exception Error: InvalidCharacterError: DOM Exception 5.
+PASS window.atob(&quot;abcd=== &quot;) threw exception Error: InvalidCharacterError: DOM Exception 5.
+PASS window.atob(&quot;abcd ===&quot;) threw exception Error: InvalidCharacterError: DOM Exception 5.
</ins><span class="cx"> PASS window.atob(&quot;6ek=&quot;) is &quot;éé&quot;
</span><span class="cx"> PASS window.atob(&quot;6ek&quot;) is &quot;éé&quot;
</span><span class="cx"> PASS window.atob(&quot;gIE=&quot;) is &quot;€&quot;
</span></span></pre></div>
<a id="trunkLayoutTestsfastdomWindowatobbtoahtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/dom/Window/atob-btoa.html (195693 => 195694)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/dom/Window/atob-btoa.html        2016-01-27 22:31:17 UTC (rev 195693)
+++ trunk/LayoutTests/fast/dom/Window/atob-btoa.html        2016-01-27 22:37:48 UTC (rev 195694)
</span><span class="lines">@@ -36,8 +36,19 @@
</span><span class="cx"> shouldBe('window.atob(&quot;&quot;)', '&quot;&quot;');
</span><span class="cx"> shouldBe('window.atob(null)', '&quot;\x9Eée&quot;'); // Gets converted to &quot;null&quot; string.
</span><span class="cx"> shouldThrow('window.atob(undefined)');
</span><del>-shouldThrow('window.atob(&quot; YQ==&quot;)');
-shouldThrow('window.atob(&quot;YQ==\\u000a&quot;)');
</del><ins>+shouldBe('window.atob(&quot; YQ==&quot;)', '&quot;a&quot;');
+shouldBe('window.atob(&quot;YQ==\\u000a&quot;)', '&quot;a&quot;');
+shouldBe('window.atob(&quot;ab\\tcd&quot;)', '&quot;i·\x1d&quot;');
+shouldBe('window.atob(&quot;ab\\ncd&quot;)', '&quot;i·\x1d&quot;');
+shouldBe('window.atob(&quot;ab\\fcd&quot;)', '&quot;i·\x1d&quot;');
+shouldBe('window.atob(&quot;ab cd&quot;)', '&quot;i·\x1d&quot;');
+shouldBe('window.atob(&quot;ab\\t\\n\\f\\r cd&quot;)', '&quot;i·\x1d&quot;');
+shouldBe('window.atob(&quot; \\t\\n\\f\\r ab\\t\\n\\f\\r cd\\t\\n\\f\\r &quot;)', '&quot;i·\x1d&quot;');
+shouldBe('window.atob(&quot;ab\\t\\n\\f\\r =\\t\\n\\f\\r =\\t\\n\\f\\r &quot;)', '&quot;i&quot;');
+shouldBe('window.atob(&quot;            &quot;)', '&quot;&quot;');
+shouldThrow('window.atob(&quot; abcd===&quot;)');
+shouldThrow('window.atob(&quot;abcd=== &quot;)');
+shouldThrow('window.atob(&quot;abcd ===&quot;)');
</ins><span class="cx"> shouldBe('window.atob(&quot;6ek=&quot;)', '&quot;éé&quot;');
</span><span class="cx"> shouldBe('window.atob(&quot;6ek&quot;)', '&quot;éé&quot;');
</span><span class="cx"> shouldBe('window.atob(&quot;gIE=&quot;)', '&quot;\u0080\u0081&quot;');
</span></span></pre></div>
<a id="trunkSourceWTFChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/ChangeLog (195693 => 195694)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/ChangeLog        2016-01-27 22:31:17 UTC (rev 195693)
+++ trunk/Source/WTF/ChangeLog        2016-01-27 22:37:48 UTC (rev 195694)
</span><span class="lines">@@ -1,3 +1,23 @@
</span><ins>+2016-01-27  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        window.atob() should ignore spaces in input
+        https://bugs.webkit.org/show_bug.cgi?id=153522
+        &lt;rdar://problem/24357822&gt;
+
+        Reviewed by Benjamin Poulain.
+
+        Turn Base64DecodePolicy enum into flags so that the caller can indicate
+        to both validate padding AND ignore spaces.
+
+        Also make sure that the output Vector size is properly shrunk when
+        spaces are ignored.
+
+        * wtf/text/Base64.cpp:
+        (WTF::base64DecodeInternal):
+        (WTF::base64Decode):
+        (WTF::base64URLDecode):
+        * wtf/text/Base64.h:
+
</ins><span class="cx"> 2016-01-27  Alexey Proskuryakov  &lt;ap@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Remove ENABLE_CURRENTSRC
</span></span></pre></div>
<a id="trunkSourceWTFwtftextBase64cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/text/Base64.cpp (195693 => 195694)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/text/Base64.cpp        2016-01-27 22:31:17 UTC (rev 195693)
+++ trunk/Source/WTF/wtf/text/Base64.cpp        2016-01-27 22:37:48 UTC (rev 195694)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> /*
</span><span class="cx">    Copyright (C) 2000-2001 Dawit Alemayehu &lt;adawit@kde.org&gt;
</span><span class="cx">    Copyright (C) 2006 Alexey Proskuryakov &lt;ap@webkit.org&gt;
</span><del>-   Copyright (C) 2007, 2008, 2013 Apple Inc. All rights reserved.
</del><ins>+   Copyright (C) 2007, 2008, 2013, 2016 Apple Inc. All rights reserved.
</ins><span class="cx">    Copyright (C) 2010 Patrick Gansterer &lt;paroga@paroga.com&gt;
</span><span class="cx"> 
</span><span class="cx">    This program is free software; you can redistribute it and/or modify
</span><span class="lines">@@ -182,7 +182,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename T&gt;
</span><del>-static inline bool base64DecodeInternal(const T* data, unsigned length, Vector&lt;char&gt;&amp; out, Base64DecodePolicy policy, const char (&amp;decodeMap)[128])
</del><ins>+static inline bool base64DecodeInternal(const T* data, unsigned length, Vector&lt;char&gt;&amp; out, unsigned options, const char (&amp;decodeMap)[128])
</ins><span class="cx"> {
</span><span class="cx">     out.clear();
</span><span class="cx">     if (!length)
</span><span class="lines">@@ -192,29 +192,47 @@
</span><span class="cx"> 
</span><span class="cx">     unsigned equalsSignCount = 0;
</span><span class="cx">     unsigned outLength = 0;
</span><ins>+    bool hadError = false;
</ins><span class="cx">     for (unsigned idx = 0; idx &lt; length; ++idx) {
</span><span class="cx">         unsigned ch = data[idx];
</span><span class="cx">         if (ch == '=') {
</span><span class="cx">             ++equalsSignCount;
</span><del>-            // There should be no padding if length is a multiple of 4, and there
-            // should never be more than 2 padding characters.
-            if (policy == Base64FailOnInvalidCharacterOrExcessPadding &amp;&amp; (length % 4 || equalsSignCount &gt; 2))
-                return false;
</del><ins>+            // There should never be more than 2 padding characters.
+            if (options &amp; Base64ValidatePadding &amp;&amp; equalsSignCount &gt; 2) {
+                hadError = true;
+                break;
+            }
</ins><span class="cx">         } else {
</span><span class="cx">             char decodedCharacter = ch &lt; WTF_ARRAY_LENGTH(decodeMap) ? decodeMap[ch] : nonAlphabet;
</span><span class="cx">             if (decodedCharacter != nonAlphabet) {
</span><del>-                if (equalsSignCount)
-                    return false;
-                out[outLength] = decodedCharacter;
-                ++outLength;
-            } else if (policy == Base64FailOnInvalidCharacterOrExcessPadding || policy == Base64FailOnInvalidCharacter || (policy == Base64IgnoreWhitespace &amp;&amp; !isSpaceOrNewline(ch)))
-                return false;
</del><ins>+                if (equalsSignCount) {
+                    hadError = true;
+                    break;
+                }
+                out[outLength++] = decodedCharacter;
+            } else if (!(options &amp; Base64IgnoreSpacesAndNewLines) || !isSpaceOrNewline(ch)) {
+                hadError = true;
+                break;
+            }
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    // Make sure we shrink back the Vector before returning. outLength may be shorter than expected
+    // in case of error or in case of ignored spaces.
+    if (outLength &lt; out.size())
+        out.shrink(outLength);
+
+    if (hadError)
+        return false;
+
</ins><span class="cx">     if (!outLength)
</span><span class="cx">         return !equalsSignCount;
</span><span class="cx"> 
</span><ins>+    // The should be no padding if length is a multiple of 4.
+    // We use (outLength + equalsSignCount) instead of length because we don't want to account for ignored characters (i.e. spaces).
+    if (options &amp; Base64ValidatePadding &amp;&amp; equalsSignCount &amp;&amp; (outLength + equalsSignCount) % 4)
+        return false;
+
</ins><span class="cx">     // Valid data is (n * 4 + [0,2,3]) characters long.
</span><span class="cx">     if ((outLength % 4) == 1)
</span><span class="cx">         return false;
</span><span class="lines">@@ -248,15 +266,15 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool base64Decode(const String&amp; in, SignedOrUnsignedCharVectorAdapter out, Base64DecodePolicy policy)
</del><ins>+bool base64Decode(const String&amp; in, SignedOrUnsignedCharVectorAdapter out, unsigned options)
</ins><span class="cx"> {
</span><span class="cx">     unsigned length = in.length();
</span><span class="cx">     if (!length || in.is8Bit())
</span><del>-        return base64DecodeInternal(in.characters8(), length, out, policy, base64DecMap);
-    return base64DecodeInternal(in.characters16(), length, out, policy, base64DecMap);
</del><ins>+        return base64DecodeInternal(in.characters8(), length, out, options, base64DecMap);
+    return base64DecodeInternal(in.characters16(), length, out, options, base64DecMap);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool base64Decode(const Vector&lt;char&gt;&amp; in, SignedOrUnsignedCharVectorAdapter out, Base64DecodePolicy policy)
</del><ins>+bool base64Decode(const Vector&lt;char&gt;&amp; in, SignedOrUnsignedCharVectorAdapter out, unsigned options)
</ins><span class="cx"> {
</span><span class="cx">     out.clear();
</span><span class="cx"> 
</span><span class="lines">@@ -264,20 +282,20 @@
</span><span class="cx">     if (in.size() &gt; UINT_MAX)
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    return base64DecodeInternal(reinterpret_cast&lt;const LChar*&gt;(in.data()), in.size(), out, policy, base64DecMap);
</del><ins>+    return base64DecodeInternal(reinterpret_cast&lt;const LChar*&gt;(in.data()), in.size(), out, options, base64DecMap);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool base64Decode(const char* data, unsigned len, SignedOrUnsignedCharVectorAdapter out, Base64DecodePolicy policy)
</del><ins>+bool base64Decode(const char* data, unsigned len, SignedOrUnsignedCharVectorAdapter out, unsigned options)
</ins><span class="cx"> {
</span><del>-    return base64DecodeInternal(reinterpret_cast&lt;const LChar*&gt;(data), len, out, policy, base64DecMap);
</del><ins>+    return base64DecodeInternal(reinterpret_cast&lt;const LChar*&gt;(data), len, out, options, base64DecMap);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool base64URLDecode(const String&amp; in, SignedOrUnsignedCharVectorAdapter out)
</span><span class="cx"> {
</span><span class="cx">     unsigned length = in.length();
</span><span class="cx">     if (!length || in.is8Bit())
</span><del>-        return base64DecodeInternal(in.characters8(), length, out, Base64FailOnInvalidCharacter, base64URLDecMap);
-    return base64DecodeInternal(in.characters16(), length, out, Base64FailOnInvalidCharacter, base64URLDecMap);
</del><ins>+        return base64DecodeInternal(in.characters8(), length, out, Base64Default, base64URLDecMap);
+    return base64DecodeInternal(in.characters16(), length, out, Base64Default, base64URLDecMap);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool base64URLDecode(const Vector&lt;char&gt;&amp; in, SignedOrUnsignedCharVectorAdapter out)
</span><span class="lines">@@ -288,12 +306,12 @@
</span><span class="cx">     if (in.size() &gt; UINT_MAX)
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    return base64DecodeInternal(reinterpret_cast&lt;const LChar*&gt;(in.data()), in.size(), out, Base64FailOnInvalidCharacter, base64URLDecMap);
</del><ins>+    return base64DecodeInternal(reinterpret_cast&lt;const LChar*&gt;(in.data()), in.size(), out, Base64Default, base64URLDecMap);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool base64URLDecode(const char* data, unsigned len, SignedOrUnsignedCharVectorAdapter out)
</span><span class="cx"> {
</span><del>-    return base64DecodeInternal(reinterpret_cast&lt;const LChar*&gt;(data), len, out, Base64FailOnInvalidCharacter, base64URLDecMap);
</del><ins>+    return base64DecodeInternal(reinterpret_cast&lt;const LChar*&gt;(data), len, out, Base64Default, base64URLDecMap);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace WTF
</span></span></pre></div>
<a id="trunkSourceWTFwtftextBase64h"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/text/Base64.h (195693 => 195694)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/text/Base64.h        2016-01-27 22:31:17 UTC (rev 195693)
+++ trunk/Source/WTF/wtf/text/Base64.h        2016-01-27 22:37:48 UTC (rev 195694)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> /*
</span><span class="cx">  * Copyright (C) 2006 Alexey Proskuryakov &lt;ap@webkit.org&gt;
</span><span class="cx">  * Copyright (C) 2010 Patrick Gansterer &lt;paroga@paroga.com&gt;
</span><del>- * Copyright (C) 2013 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2013, 2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -40,11 +40,10 @@
</span><span class="cx">     Base64URLPolicy // No padding, no LFs.
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-enum Base64DecodePolicy {
-    Base64FailOnInvalidCharacterOrExcessPadding,
-    Base64FailOnInvalidCharacter,
-    Base64IgnoreWhitespace,
-    Base64IgnoreInvalidCharacters
</del><ins>+enum Base64DecodeOptions {
+    Base64Default = 0,
+    Base64ValidatePadding = 1 &lt;&lt; 0,
+    Base64IgnoreSpacesAndNewLines = 1 &lt;&lt; 1,
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> class SignedOrUnsignedCharVectorAdapter {
</span><span class="lines">@@ -85,9 +84,9 @@
</span><span class="cx"> String base64Encode(ConstSignedOrUnsignedCharVectorAdapter, Base64EncodePolicy = Base64DoNotInsertLFs);
</span><span class="cx"> String base64Encode(const CString&amp;, Base64EncodePolicy = Base64DoNotInsertLFs);
</span><span class="cx"> 
</span><del>-WTF_EXPORT_PRIVATE bool base64Decode(const String&amp;, SignedOrUnsignedCharVectorAdapter, Base64DecodePolicy = Base64FailOnInvalidCharacter);
-WTF_EXPORT_PRIVATE bool base64Decode(const Vector&lt;char&gt;&amp;, SignedOrUnsignedCharVectorAdapter, Base64DecodePolicy = Base64FailOnInvalidCharacter);
-WTF_EXPORT_PRIVATE bool base64Decode(const char*, unsigned, SignedOrUnsignedCharVectorAdapter, Base64DecodePolicy = Base64FailOnInvalidCharacter);
</del><ins>+WTF_EXPORT_PRIVATE bool base64Decode(const String&amp;, SignedOrUnsignedCharVectorAdapter, unsigned options = Base64Default);
+WTF_EXPORT_PRIVATE bool base64Decode(const Vector&lt;char&gt;&amp;, SignedOrUnsignedCharVectorAdapter, unsigned options = Base64Default);
+WTF_EXPORT_PRIVATE bool base64Decode(const char*, unsigned, SignedOrUnsignedCharVectorAdapter, unsigned options = Base64Default);
</ins><span class="cx"> 
</span><span class="cx"> inline void base64Encode(ConstSignedOrUnsignedCharVectorAdapter in, Vector&lt;char&gt;&amp; out, Base64EncodePolicy policy)
</span><span class="cx"> {
</span><span class="lines">@@ -151,11 +150,8 @@
</span><span class="cx"> using WTF::Base64EncodePolicy;
</span><span class="cx"> using WTF::Base64DoNotInsertLFs;
</span><span class="cx"> using WTF::Base64InsertLFs;
</span><del>-using WTF::Base64DecodePolicy;
-using WTF::Base64FailOnInvalidCharacterOrExcessPadding;
-using WTF::Base64FailOnInvalidCharacter;
-using WTF::Base64IgnoreWhitespace;
-using WTF::Base64IgnoreInvalidCharacters;
</del><ins>+using WTF::Base64ValidatePadding;
+using WTF::Base64IgnoreSpacesAndNewLines;
</ins><span class="cx"> using WTF::base64Encode;
</span><span class="cx"> using WTF::base64Decode;
</span><span class="cx"> using WTF::base64URLDecode;
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (195693 => 195694)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-01-27 22:31:17 UTC (rev 195693)
+++ trunk/Source/WebCore/ChangeLog        2016-01-27 22:37:48 UTC (rev 195694)
</span><span class="lines">@@ -1,3 +1,31 @@
</span><ins>+2016-01-27  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        window.atob() should ignore spaces in input
+        https://bugs.webkit.org/show_bug.cgi?id=153522
+        &lt;rdar://problem/24357822&gt;
+
+        Reviewed by Benjamin Poulain.
+
+        window.atob() should ignore spaces in input as per:
+        - https://html.spec.whatwg.org/#dom-windowbase64-atob (Step 3)
+
+        Previously, WebKit would throw an exception and it was the only browser
+        to do so. Firefox and Chrome behavior according to the specification.
+
+        This was causing us to fail 10 checks in the following W3C HTML test:
+        http://w3c-test.org/html/webappapis/atob/base64.html
+
+        No new tests, updated existing test.
+
+        * page/DOMWindow.cpp:
+        (WebCore::DOMWindow::atob):
+        * page/Page.cpp:
+        (WebCore::Page::userStyleSheetLocationChanged):
+        * platform/network/DataURL.cpp:
+        (WebCore::handleDataURL):
+        * platform/network/DataURLDecoder.cpp:
+        (WebCore::DataURLDecoder::decodeBase64):
+
</ins><span class="cx"> 2016-01-27  Ada Chan  &lt;adachan@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Move some logic related to the presentation mode button from mediaControlsiOS.js to mediaControlsApple.js
</span></span></pre></div>
<a id="trunkSourceWebCorepageDOMWindowcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/DOMWindow.cpp (195693 => 195694)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/DOMWindow.cpp        2016-01-27 22:31:17 UTC (rev 195693)
+++ trunk/Source/WebCore/page/DOMWindow.cpp        2016-01-27 22:37:48 UTC (rev 195694)
</span><span class="lines">@@ -1160,7 +1160,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     Vector&lt;char&gt; out;
</span><del>-    if (!base64Decode(encodedString, out, Base64FailOnInvalidCharacterOrExcessPadding)) {
</del><ins>+    if (!base64Decode(encodedString, out, Base64ValidatePadding | Base64IgnoreSpacesAndNewLines)) {
</ins><span class="cx">         ec = INVALID_CHARACTER_ERR;
</span><span class="cx">         return String();
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkSourceWebCorepagePagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/Page.cpp (195693 => 195694)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/Page.cpp        2016-01-27 22:31:17 UTC (rev 195693)
+++ trunk/Source/WebCore/page/Page.cpp        2016-01-27 22:37:48 UTC (rev 195694)
</span><span class="lines">@@ -1032,7 +1032,7 @@
</span><span class="cx">         m_didLoadUserStyleSheet = true;
</span><span class="cx"> 
</span><span class="cx">         Vector&lt;char&gt; styleSheetAsUTF8;
</span><del>-        if (base64Decode(decodeURLEscapeSequences(url.string().substring(35)), styleSheetAsUTF8, Base64IgnoreWhitespace))
</del><ins>+        if (base64Decode(decodeURLEscapeSequences(url.string().substring(35)), styleSheetAsUTF8, Base64IgnoreSpacesAndNewLines))
</ins><span class="cx">             m_userStyleSheet = String::fromUTF8(styleSheetAsUTF8.data(), styleSheetAsUTF8.size());
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkDataURLcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/DataURL.cpp (195693 => 195694)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/DataURL.cpp        2016-01-27 22:31:17 UTC (rev 195693)
+++ trunk/Source/WebCore/platform/network/DataURL.cpp        2016-01-27 22:37:48 UTC (rev 195694)
</span><span class="lines">@@ -76,7 +76,7 @@
</span><span class="cx">         handle-&gt;client()-&gt;didReceiveResponse(handle, response);
</span><span class="cx"> 
</span><span class="cx">         Vector&lt;char&gt; out;
</span><del>-        if (base64Decode(data, out, Base64IgnoreWhitespace) &amp;&amp; out.size() &gt; 0) {
</del><ins>+        if (base64Decode(data, out, Base64IgnoreSpacesAndNewLines) &amp;&amp; out.size() &gt; 0) {
</ins><span class="cx">             response.setExpectedContentLength(out.size());
</span><span class="cx">             handle-&gt;client()-&gt;didReceiveData(handle, out.data(), out.size(), 0);
</span><span class="cx">         }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkDataURLDecodercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/DataURLDecoder.cpp (195693 => 195694)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/DataURLDecoder.cpp        2016-01-27 22:31:17 UTC (rev 195693)
+++ trunk/Source/WebCore/platform/network/DataURLDecoder.cpp        2016-01-27 22:37:48 UTC (rev 195694)
</span><span class="lines">@@ -144,7 +144,7 @@
</span><span class="cx">     if (!base64URLDecode(task.encodedData.toStringWithoutCopying(), buffer)) {
</span><span class="cx">         // Didn't work, try unescaping and decoding as base64.
</span><span class="cx">         auto unescapedString = decodeURLEscapeSequences(task.encodedData.toStringWithoutCopying());
</span><del>-        if (!base64Decode(unescapedString, buffer, Base64IgnoreWhitespace))
</del><ins>+        if (!base64Decode(unescapedString, buffer, Base64IgnoreSpacesAndNewLines))
</ins><span class="cx">             return;
</span><span class="cx">     }
</span><span class="cx">     buffer.shrinkToFit();
</span></span></pre></div>
<a id="trunkSourceWebKitmacChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/ChangeLog (195693 => 195694)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/ChangeLog        2016-01-27 22:31:17 UTC (rev 195693)
+++ trunk/Source/WebKit/mac/ChangeLog        2016-01-27 22:37:48 UTC (rev 195694)
</span><span class="lines">@@ -1,3 +1,14 @@
</span><ins>+2016-01-27  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        window.atob() should ignore spaces in input
+        https://bugs.webkit.org/show_bug.cgi?id=153522
+        &lt;rdar://problem/24357822&gt;
+
+        Reviewed by Benjamin Poulain.
+
+        * WebCoreSupport/WebInspectorClient.mm:
+        (WebInspectorFrontendClient::save):
+
</ins><span class="cx"> 2016-01-27  Alexey Proskuryakov  &lt;ap@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Remove ENABLE_CURRENTSRC
</span></span></pre></div>
<a id="trunkSourceWebKitmacWebCoreSupportWebInspectorClientmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/WebCoreSupport/WebInspectorClient.mm (195693 => 195694)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/WebCoreSupport/WebInspectorClient.mm        2016-01-27 22:31:17 UTC (rev 195693)
+++ trunk/Source/WebKit/mac/WebCoreSupport/WebInspectorClient.mm        2016-01-27 22:37:48 UTC (rev 195694)
</span><span class="lines">@@ -310,7 +310,7 @@
</span><span class="cx"> 
</span><span class="cx">         if (base64Encoded) {
</span><span class="cx">             Vector&lt;char&gt; out;
</span><del>-            if (!base64Decode(contentCopy, out, Base64FailOnInvalidCharacterOrExcessPadding))
</del><ins>+            if (!base64Decode(contentCopy, out, Base64ValidatePadding))
</ins><span class="cx">                 return;
</span><span class="cx">             RetainPtr&lt;NSData&gt; dataContent = adoptNS([[NSData alloc] initWithBytes:out.data() length:out.size()]);
</span><span class="cx">             [dataContent writeToURL:actualURL atomically:YES];
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (195693 => 195694)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2016-01-27 22:31:17 UTC (rev 195693)
+++ trunk/Source/WebKit2/ChangeLog        2016-01-27 22:37:48 UTC (rev 195694)
</span><span class="lines">@@ -1,3 +1,14 @@
</span><ins>+2016-01-27  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        window.atob() should ignore spaces in input
+        https://bugs.webkit.org/show_bug.cgi?id=153522
+        &lt;rdar://problem/24357822&gt;
+
+        Reviewed by Benjamin Poulain.
+
+        * UIProcess/mac/WebInspectorProxyMac.mm:
+        (WebKit::WebInspectorProxy::platformSave):
+
</ins><span class="cx"> 2016-01-27  Ryosuke Niwa  &lt;rniwa@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Add API to access closed shadowRoot in InjectedBundle
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessmacWebInspectorProxyMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/mac/WebInspectorProxyMac.mm (195693 => 195694)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/mac/WebInspectorProxyMac.mm        2016-01-27 22:31:17 UTC (rev 195693)
+++ trunk/Source/WebKit2/UIProcess/mac/WebInspectorProxyMac.mm        2016-01-27 22:37:48 UTC (rev 195694)
</span><span class="lines">@@ -568,7 +568,7 @@
</span><span class="cx"> 
</span><span class="cx">         if (base64Encoded) {
</span><span class="cx">             Vector&lt;char&gt; out;
</span><del>-            if (!base64Decode(contentCopy, out, Base64FailOnInvalidCharacterOrExcessPadding))
</del><ins>+            if (!base64Decode(contentCopy, out, Base64ValidatePadding))
</ins><span class="cx">                 return;
</span><span class="cx">             RetainPtr&lt;NSData&gt; dataContent = adoptNS([[NSData alloc] initWithBytes:out.data() length:out.size()]);
</span><span class="cx">             [dataContent writeToURL:actualURL atomically:YES];
</span></span></pre>
</div>
</div>

</body>
</html>