[Payment Request] Implement MerchantValidationEvent.methodName
authoraestes@apple.com <aestes@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 28 Oct 2018 14:34:13 +0000 (14:34 +0000)
committeraestes@apple.com <aestes@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 28 Oct 2018 14:34:13 +0000 (14:34 +0000)
https://bugs.webkit.org/show_bug.cgi?id=190058

Reviewed by Darin Adler.

LayoutTests/imported/w3c:

* web-platform-tests/payment-request/MerchantValidationEvent/constructor.https-expected.txt:

Source/WebCore:

Implemented MerchantValidationEvent's methodName attribute and MerchantValidationEventInit's
methodName property as specified in the Payment Request API W3C Editor's Draft of
27 September 2018.

Covered by web-platform-tests/payment-request/MerchantValidationEvent/constructor.https.html.

* Modules/applepay/paymentrequest/ApplePayPaymentHandler.cpp:
(WebCore::ApplePayPaymentHandler::validateMerchant): Passed the payment method identifier
(as a string) to MerchantValidationEvent::create()
* Modules/paymentrequest/MerchantValidationEvent.cpp:
(WebCore::MerchantValidationEvent::create): Validated the methodName before constructing the
event, throwing a RangeError on failure.
(WebCore::MerchantValidationEvent::MerchantValidationEvent):
* Modules/paymentrequest/MerchantValidationEvent.h:
* Modules/paymentrequest/MerchantValidationEvent.idl:

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

LayoutTests/imported/w3c/ChangeLog
LayoutTests/imported/w3c/web-platform-tests/payment-request/MerchantValidationEvent/constructor.https-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/Modules/applepay/paymentrequest/ApplePayPaymentHandler.cpp
Source/WebCore/Modules/paymentrequest/MerchantValidationEvent.cpp
Source/WebCore/Modules/paymentrequest/MerchantValidationEvent.h
Source/WebCore/Modules/paymentrequest/MerchantValidationEvent.idl
Source/WebCore/Modules/paymentrequest/PaymentRequest.cpp

index 3f0ac09..c216a75 100644 (file)
@@ -1,3 +1,12 @@
+2018-10-28  Andy Estes  <aestes@apple.com>
+
+        [Payment Request] Implement MerchantValidationEvent.methodName
+        https://bugs.webkit.org/show_bug.cgi?id=190058
+
+        Reviewed by Darin Adler.
+
+        * web-platform-tests/payment-request/MerchantValidationEvent/constructor.https-expected.txt:
+
 2018-10-26  Antoine Quint  <graouts@apple.com>
 
         [Web Animations] Rebase some flaky tests
index 6a9d2a4..e390739 100644 (file)
@@ -5,10 +5,8 @@ PASS MerchantValidationEvent can be dispatched, even if not trusted.
 PASS Must have a validationURL IDL attribute, which is initialized with to the validationURL dictionary value. 
 PASS Must throw TypeError if initialized with an invalid URL. 
 PASS Relative validationURLs use the document as the base. 
-FAIL Must have a methodName IDL attribute, which is initialized with to the methodName dictionary value. assert_idl_attribute: property "methodName" not found in prototype chain
-FAIL When no methodName is passed, methodName attribute defaults to the empty string assert_equals: expected (string) "" but got (undefined) undefined
-FAIL MerchantValidationEvent can be constructed with valid PMIs assert_equals: expected (string) "https://example.com/pay" but got (undefined) undefined
-FAIL MerchantValidationEvent can't be constructed with invalid PMIs assert_throws: expected to throw when constructed with invalid PMI: 'basic-💳' function "() => {
-        const event = new MerchantValidationEvent("test", { methodName });
-      }" did not throw
+PASS Must have a methodName IDL attribute, which is initialized with to the methodName dictionary value. 
+PASS When no methodName is passed, methodName attribute defaults to the empty string 
+PASS MerchantValidationEvent can be constructed with valid PMIs 
+PASS MerchantValidationEvent can't be constructed with invalid PMIs 
 
index bb8662b..b234f1b 100644 (file)
@@ -1,3 +1,26 @@
+2018-10-28  Andy Estes  <aestes@apple.com>
+
+        [Payment Request] Implement MerchantValidationEvent.methodName
+        https://bugs.webkit.org/show_bug.cgi?id=190058
+
+        Reviewed by Darin Adler.
+
+        Implemented MerchantValidationEvent's methodName attribute and MerchantValidationEventInit's
+        methodName property as specified in the Payment Request API W3C Editor's Draft of
+        27 September 2018.
+
+        Covered by web-platform-tests/payment-request/MerchantValidationEvent/constructor.https.html.
+
+        * Modules/applepay/paymentrequest/ApplePayPaymentHandler.cpp:
+        (WebCore::ApplePayPaymentHandler::validateMerchant): Passed the payment method identifier
+        (as a string) to MerchantValidationEvent::create()
+        * Modules/paymentrequest/MerchantValidationEvent.cpp:
+        (WebCore::MerchantValidationEvent::create): Validated the methodName before constructing the
+        event, throwing a RangeError on failure.
+        (WebCore::MerchantValidationEvent::MerchantValidationEvent):
+        * Modules/paymentrequest/MerchantValidationEvent.h:
+        * Modules/paymentrequest/MerchantValidationEvent.idl:
+
 2018-10-27  Antoine Quint  <graouts@apple.com>
 
         [Web Animations] Remove WebAnimation::description()
index c9bd3c7..fdd088e 100644 (file)
@@ -503,7 +503,7 @@ unsigned ApplePayPaymentHandler::version() const
 void ApplePayPaymentHandler::validateMerchant(URL&& validationURL)
 {
     if (validationURL.isValid())
-        m_paymentRequest->dispatchEvent(MerchantValidationEvent::create(eventNames().merchantvalidationEvent, WTFMove(validationURL)).get());
+        m_paymentRequest->dispatchEvent(MerchantValidationEvent::create(eventNames().merchantvalidationEvent, WTF::get<URL>(m_identifier).string(), WTFMove(validationURL)).get());
 }
 
 static Ref<PaymentAddress> convert(const ApplePayPaymentContact& contact)
index 40f5731..32a3b6f 100644 (file)
@@ -33,9 +33,9 @@
 
 namespace WebCore {
 
-Ref<MerchantValidationEvent> MerchantValidationEvent::create(const AtomicString& type, URL&& validationURL)
+Ref<MerchantValidationEvent> MerchantValidationEvent::create(const AtomicString& type, const String& methodName, URL&& validationURL)
 {
-    return adoptRef(*new MerchantValidationEvent(type, WTFMove(validationURL)));
+    return adoptRef(*new MerchantValidationEvent(type, methodName, WTFMove(validationURL)));
 }
 
 ExceptionOr<Ref<MerchantValidationEvent>> MerchantValidationEvent::create(Document& document, const AtomicString& type, Init&& eventInit)
@@ -44,19 +44,28 @@ ExceptionOr<Ref<MerchantValidationEvent>> MerchantValidationEvent::create(Docume
     if (!validationURL.isValid())
         return Exception { TypeError };
 
-    return adoptRef(*new MerchantValidationEvent(type, WTFMove(validationURL), WTFMove(eventInit)));
+    auto methodName = WTFMove(eventInit.methodName);
+    if (!methodName.isEmpty()) {
+        auto validatedMethodName = convertAndValidatePaymentMethodIdentifier(methodName);
+        if (!validatedMethodName)
+            return Exception { RangeError, makeString('"', methodName, "\" is an invalid payment method identifier.") };
+    }
+
+    return adoptRef(*new MerchantValidationEvent(type, WTFMove(methodName), WTFMove(validationURL), WTFMove(eventInit)));
 }
 
-MerchantValidationEvent::MerchantValidationEvent(const AtomicString& type, URL&& validationURL)
+MerchantValidationEvent::MerchantValidationEvent(const AtomicString& type, const String& methodName, URL&& validationURL)
     : Event { type, Event::CanBubble::No, Event::IsCancelable::No }
+    , m_methodName { methodName }
     , m_validationURL { WTFMove(validationURL) }
 {
     ASSERT(isTrusted());
     ASSERT(m_validationURL.isValid());
 }
 
-MerchantValidationEvent::MerchantValidationEvent(const AtomicString& type, URL&& validationURL, Init&& eventInit)
+MerchantValidationEvent::MerchantValidationEvent(const AtomicString& type, String&& methodName, URL&& validationURL, Init&& eventInit)
     : Event { type, WTFMove(eventInit), IsTrusted::No }
+    , m_methodName { WTFMove(methodName) }
     , m_validationURL { WTFMove(validationURL) }
 {
     ASSERT(!isTrusted());
index b093d3a..9f6d066 100644 (file)
@@ -38,23 +38,26 @@ class Document;
 class MerchantValidationEvent final : public Event {
 public:
     struct Init final : EventInit {
+        String methodName;
         String validationURL;
     };
 
-    static Ref<MerchantValidationEvent> create(const AtomicString&, URL&&);
-    static ExceptionOr<Ref<MerchantValidationEvent>> create(Document&, const AtomicString&, Init&&);
+    static Ref<MerchantValidationEvent> create(const AtomicString& type, const String& methodName, URL&& validationURL);
+    static ExceptionOr<Ref<MerchantValidationEvent>> create(Document&, const AtomicString& type, Init&&);
 
+    const String& methodName() const { return m_methodName; }
     const String& validationURL() const { return m_validationURL.string(); }
     ExceptionOr<void> complete(Ref<DOMPromise>&&);
 
 private:
-    MerchantValidationEvent(const AtomicString&, URL&&);
-    MerchantValidationEvent(const AtomicString&, URL&&, Init&&);
+    MerchantValidationEvent(const AtomicString& type, const String& methodName, URL&& validationURL);
+    MerchantValidationEvent(const AtomicString& type, String&& methodName, URL&& validationURL, Init&&);
 
     // Event
     EventInterface eventInterface() const final;
 
     bool m_isCompleted { false };
+    String m_methodName;
     URL m_validationURL;
 };
 
index 7c2bdb2..99a7512 100644 (file)
     Exposed=Window,
     SecureContext,
 ] interface MerchantValidationEvent : Event {
-    readonly attribute DOMString validationURL;
+    readonly attribute DOMString methodName;
+    readonly attribute USVString validationURL;
     [MayThrowException] void complete(Promise<any> merchantSessionPromise);
 };
 
 [
     Conditional=PAYMENT_REQUEST,
 ] dictionary MerchantValidationEventInit : EventInit {
+    DOMString methodName = "";
     USVString validationURL = "";
 };
index 88ee0bd..c9dbb86 100644 (file)
@@ -275,7 +275,7 @@ static ExceptionOr<std::tuple<String, Vector<String>>> checkAndCanonicalizeDetai
         if (shouldValidatePaymentMethodIdentifier == ShouldValidatePaymentMethodIdentifier::Yes) {
             auto paymentMethodIdentifier = convertAndValidatePaymentMethodIdentifier(modifier.supportedMethods);
             if (!paymentMethodIdentifier)
-                return Exception { RangeError, makeString("\"", modifier.supportedMethods, "\" is an invalid payment method identifier.") };
+                return Exception { RangeError, makeString('"', modifier.supportedMethods, "\" is an invalid payment method identifier.") };
         }
 
         if (modifier.total) {
@@ -323,7 +323,7 @@ ExceptionOr<Ref<PaymentRequest>> PaymentRequest::create(Document& document, Vect
     for (auto& paymentMethod : methodData) {
         auto identifier = convertAndValidatePaymentMethodIdentifier(paymentMethod.supportedMethods);
         if (!identifier)
-            return Exception { RangeError, makeString("\"", paymentMethod.supportedMethods, "\" is an invalid payment method identifier.") };
+            return Exception { RangeError, makeString('"', paymentMethod.supportedMethods, "\" is an invalid payment method identifier.") };
 
         String serializedData;
         if (paymentMethod.data) {