<!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>[211446] 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/211446">211446</a></dd>
<dt>Author</dt> <dd>andersca@apple.com</dd>
<dt>Date</dt> <dd>2017-01-31 14:03:59 -0800 (Tue, 31 Jan 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>Apple Pay button does nothing on nytimes.com
https://bugs.webkit.org/show_bug.cgi?id=167664
rdar://problem/30273885

Reviewed by Sam Weinig.

Source/WebCore:

Separate line item validation into convertAndValidateTotal and convertAndValidate. The former
works on totals (which require an amount), and the latter works on regular line items that do not require an amount
if the item type is &quot;pending&quot;.

* Modules/applepay/ApplePaySession.cpp:
(WebCore::convertAndValidateTotal):
(WebCore::convertAndValidate):
Only check the amount if the type is not pending.

(WebCore::ApplePaySession::completeShippingMethodSelection):
(WebCore::ApplePaySession::completeShippingContactSelection):
(WebCore::ApplePaySession::completePaymentMethodSelection):
Call convertAndValidateTotal for totals.

LayoutTests:

Add a new test.

* http/tests/ssl/applepay/ApplePaySession-expected.txt:
* http/tests/ssl/applepay/ApplePaySession.html:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestshttptestssslapplepayApplePaySessionexpectedtxt">trunk/LayoutTests/http/tests/ssl/applepay/ApplePaySession-expected.txt</a></li>
<li><a href="#trunkLayoutTestshttptestssslapplepayApplePaySessionhtml">trunk/LayoutTests/http/tests/ssl/applepay/ApplePaySession.html</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreModulesapplepayApplePaySessioncpp">trunk/Source/WebCore/Modules/applepay/ApplePaySession.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (211445 => 211446)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2017-01-31 21:04:27 UTC (rev 211445)
+++ trunk/LayoutTests/ChangeLog        2017-01-31 22:03:59 UTC (rev 211446)
</span><span class="lines">@@ -1,3 +1,16 @@
</span><ins>+2017-01-31  Anders Carlsson  &lt;andersca@apple.com&gt;
+
+        Apple Pay button does nothing on nytimes.com
+        https://bugs.webkit.org/show_bug.cgi?id=167664
+        rdar://problem/30273885
+
+        Reviewed by Sam Weinig.
+
+        Add a new test.
+
+        * http/tests/ssl/applepay/ApplePaySession-expected.txt:
+        * http/tests/ssl/applepay/ApplePaySession.html:
+
</ins><span class="cx"> 2017-01-31  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed, fix layout tests added in r211435.
</span></span></pre></div>
<a id="trunkLayoutTestshttptestssslapplepayApplePaySessionexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/http/tests/ssl/applepay/ApplePaySession-expected.txt (211445 => 211446)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/http/tests/ssl/applepay/ApplePaySession-expected.txt        2017-01-31 21:04:27 UTC (rev 211445)
+++ trunk/LayoutTests/http/tests/ssl/applepay/ApplePaySession-expected.txt        2017-01-31 22:03:59 UTC (rev 211446)
</span><span class="lines">@@ -169,6 +169,9 @@
</span><span class="cx"> SETUP: request = validRequest(); request.lineItems = { };
</span><span class="cx"> PASS new ApplePaySession(2, request) threw exception TypeError: Type error.
</span><span class="cx"> 
</span><ins>+SETUP: request = validRequest(); request.lineItems = [{ label: 'label', type: 'pending' }];
+PASS new ApplePaySession(2, request) did not throw exception.
+
</ins><span class="cx"> SETUP: request = validRequest(); request.lineItems = [];
</span><span class="cx"> PASS new ApplePaySession(2, request) did not throw exception.
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestshttptestssslapplepayApplePaySessionhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/http/tests/ssl/applepay/ApplePaySession.html (211445 => 211446)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/http/tests/ssl/applepay/ApplePaySession.html        2017-01-31 21:04:27 UTC (rev 211445)
+++ trunk/LayoutTests/http/tests/ssl/applepay/ApplePaySession.html        2017-01-31 22:03:59 UTC (rev 211446)
</span><span class="lines">@@ -112,7 +112,7 @@
</span><span class="cx">     logAndShouldThrow(&quot;request = validRequest(); request.lineItems = null;&quot;, &quot;new ApplePaySession(2, request)&quot;)
</span><span class="cx">     logAndShouldThrow(&quot;request = validRequest(); request.lineItems = 7;&quot;, &quot;new ApplePaySession(2, request)&quot;)
</span><span class="cx">     logAndShouldThrow(&quot;request = validRequest(); request.lineItems = { };&quot;, &quot;new ApplePaySession(2, request)&quot;)
</span><del>-    // FIXME: Should we allow an empty lineItems sequence?
</del><ins>+    logAndShouldNotThrow(&quot;request = validRequest(); request.lineItems = [{ label: 'label', type: 'pending' }];&quot;, &quot;new ApplePaySession(2, request)&quot;)
</ins><span class="cx">     logAndShouldNotThrow(&quot;request = validRequest(); request.lineItems = [];&quot;, &quot;new ApplePaySession(2, request)&quot;)
</span><span class="cx">     logAndShouldThrow(&quot;request = validRequest(); request.lineItems = [''];&quot;, &quot;new ApplePaySession(2, request)&quot;)
</span><span class="cx">     logAndShouldThrow(&quot;request = validRequest(); request.lineItems = [null];&quot;, &quot;new ApplePaySession(2, request)&quot;)
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (211445 => 211446)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2017-01-31 21:04:27 UTC (rev 211445)
+++ trunk/Source/WebCore/ChangeLog        2017-01-31 22:03:59 UTC (rev 211446)
</span><span class="lines">@@ -1,3 +1,25 @@
</span><ins>+2017-01-31  Anders Carlsson  &lt;andersca@apple.com&gt;
+
+        Apple Pay button does nothing on nytimes.com
+        https://bugs.webkit.org/show_bug.cgi?id=167664
+        rdar://problem/30273885
+
+        Reviewed by Sam Weinig.
+
+        Separate line item validation into convertAndValidateTotal and convertAndValidate. The former
+        works on totals (which require an amount), and the latter works on regular line items that do not require an amount
+        if the item type is &quot;pending&quot;.
+
+        * Modules/applepay/ApplePaySession.cpp:
+        (WebCore::convertAndValidateTotal):
+        (WebCore::convertAndValidate):
+        Only check the amount if the type is not pending.
+
+        (WebCore::ApplePaySession::completeShippingMethodSelection):
+        (WebCore::ApplePaySession::completeShippingContactSelection):
+        (WebCore::ApplePaySession::completePaymentMethodSelection):
+        Call convertAndValidateTotal for totals.
+
</ins><span class="cx"> 2017-01-31  Youenn Fablet  &lt;youenn@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [WebRTC] Add a libwebrtc AudioModule specific to WebKit
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesapplepayApplePaySessioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/applepay/ApplePaySession.cpp (211445 => 211446)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/applepay/ApplePaySession.cpp        2017-01-31 21:04:27 UTC (rev 211445)
+++ trunk/Source/WebCore/Modules/applepay/ApplePaySession.cpp        2017-01-31 22:03:59 UTC (rev 211446)
</span><span class="lines">@@ -162,7 +162,7 @@
</span><span class="cx">     return amount;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static ExceptionOr&lt;PaymentRequest::LineItem&gt; convertAndValidate(ApplePayLineItem&amp;&amp; lineItem)
</del><ins>+static ExceptionOr&lt;PaymentRequest::LineItem&gt; convertAndValidateTotal(ApplePayLineItem&amp;&amp; lineItem)
</ins><span class="cx"> {
</span><span class="cx">     auto amount = parseAmount(lineItem.amount);
</span><span class="cx">     if (!amount)
</span><span class="lines">@@ -176,6 +176,25 @@
</span><span class="cx">     return WTFMove(result);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static ExceptionOr&lt;PaymentRequest::LineItem&gt; convertAndValidate(ApplePayLineItem&amp;&amp; lineItem)
+{
+    PaymentRequest::LineItem result;
+
+    // It is OK for pending types to not have an amount.
+    if (lineItem.type != PaymentRequest::LineItem::Type::Pending) {
+        auto amount = parseAmount(lineItem.amount);
+        if (!amount)
+            return Exception { TypeError, makeString(&quot;\&quot;&quot; + lineItem.amount, &quot;\&quot; is not a valid amount.&quot;) };
+
+        result.amount = *amount;
+    }
+
+    result.type = lineItem.type;
+    result.label = lineItem.label;
+
+    return WTFMove(result);
+}
+
</ins><span class="cx"> static ExceptionOr&lt;Vector&lt;PaymentRequest::LineItem&gt;&gt; convertAndValidate(std::optional&lt;Vector&lt;ApplePayLineItem&gt;&gt;&amp;&amp; lineItems)
</span><span class="cx"> {
</span><span class="cx">     Vector&lt;PaymentRequest::LineItem&gt; result;
</span><span class="lines">@@ -298,7 +317,7 @@
</span><span class="cx"> {
</span><span class="cx">     PaymentRequest result;
</span><span class="cx"> 
</span><del>-    auto total = convertAndValidate(WTFMove(paymentRequest.total));
</del><ins>+    auto total = convertAndValidateTotal(WTFMove(paymentRequest.total));
</ins><span class="cx">     if (total.hasException())
</span><span class="cx">         return total.releaseException();
</span><span class="cx">     result.setTotal(total.releaseReturnValue());
</span><span class="lines">@@ -611,7 +630,7 @@
</span><span class="cx">     if (!authorizationStatus)
</span><span class="cx">         return Exception { INVALID_ACCESS_ERR };
</span><span class="cx"> 
</span><del>-    auto convertedNewTotal = convertAndValidate(WTFMove(newTotal));
</del><ins>+    auto convertedNewTotal = convertAndValidateTotal(WTFMove(newTotal));
</ins><span class="cx">     if (convertedNewTotal.hasException())
</span><span class="cx">         return convertedNewTotal.releaseException();
</span><span class="cx"> 
</span><span class="lines">@@ -648,7 +667,7 @@
</span><span class="cx">     if (convertedNewShippingMethods.hasException())
</span><span class="cx">         return convertedNewShippingMethods.releaseException();
</span><span class="cx"> 
</span><del>-    auto convertedNewTotal = convertAndValidate(WTFMove(newTotal));
</del><ins>+    auto convertedNewTotal = convertAndValidateTotal(WTFMove(newTotal));
</ins><span class="cx">     if (convertedNewTotal.hasException())
</span><span class="cx">         return convertedNewTotal.releaseException();
</span><span class="cx"> 
</span><span class="lines">@@ -677,7 +696,7 @@
</span><span class="cx">     if (!canCompletePaymentMethodSelection())
</span><span class="cx">         return Exception { INVALID_ACCESS_ERR };
</span><span class="cx"> 
</span><del>-    auto convertedNewTotal = convertAndValidate(WTFMove(newTotal));
</del><ins>+    auto convertedNewTotal = convertAndValidateTotal(WTFMove(newTotal));
</ins><span class="cx">     if (convertedNewTotal.hasException())
</span><span class="cx">         return convertedNewTotal.releaseException();
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>