From 070cae36a672b01e1cda8d9a96a4623d8d3b2b0d Mon Sep 17 00:00:00 2001 From: Eden Chuang Date: Tue, 4 Dec 2018 15:42:03 -0500 Subject: [PATCH 01/22] bug 1494917 - mochitest test updation. r=baku --HG-- extra : histedit_source : ea66d06661ca3a225bcd0a4888b1f5f4f32e72ff --- dom/payments/test/RetryPaymentChromeScript.js | 37 ++++++++++++++++--- dom/payments/test/test_retryPayment.html | 9 ++--- 2 files changed, 34 insertions(+), 12 deletions(-) diff --git a/dom/payments/test/RetryPaymentChromeScript.js b/dom/payments/test/RetryPaymentChromeScript.js index c85eeea33872..23ba1c77ae50 100644 --- a/dom/payments/test/RetryPaymentChromeScript.js +++ b/dom/payments/test/RetryPaymentChromeScript.js @@ -129,6 +129,7 @@ function checkPaymentMethodErrors(testName, errors) { const DummyUIService = { testName: "", rejectRetry: false, + emptyErrors: false, showPayment(requestId) { acceptPayment(requestId, "show"); }, @@ -143,13 +144,32 @@ const DummyUIService = { }, updatePayment(requestId) { const payment = paymentSrv.getPaymentRequestById(requestId); - if (payment.paymentDetails.error !== "error") { - emitTestFail("Expect 'error' on details.error, but got '" + - payment.paymentDetails.error + "'"); + if (!DummyUIService.emptyErrors) { + if (payment.paymentDetails.error !== "error") { + emitTestFail("Expect 'error' on details.error, but got '" + + payment.paymentDetails.error + "'"); + } + checkAddressErrors(this.testName, payment.paymentDetails.shippingAddressErrors) + checkPayerErrors(this.testName, payment.paymentDetails.payerErrors); + checkPaymentMethodErrors(this.testName, payment.paymentDetails.paymentMethodErrors); + } else { + if (payment.paymentDetails.error) { + emitTestFail(`${this.testName}: Expect null on details.error, but got + '${payment.paymentDetails.error}'`); + } + if (payment.paymentDetails.payer) { + emitTestFail(`${this.testName}: Expect null on details.payer, but got + '${payment.paymentDetails.payer}'`); + } + if (payment.paymentDetails.shippingAddressErrors) { + emitTestFail(`${this.testName}: Expect null on details.shippingAddressErrors, + but got '${payment.paymentDetails.shippingAddressErrors}'`); + } + if (payment.paymentDetails.paymentMethod) { + emitTestFail(`${this.testName}: Expect null on details.paymentMethod, but + got '${payment.paymentDetails.paymentMethod}'`); + } } - checkAddressErrors(this.testName, payment.paymentDetails.shippingAddressErrors) - checkPayerErrors(this.testName, payment.paymentDetails.payerErrors); - checkPaymentMethodErrors(this.testName, payment.paymentDetails.paymentMethodErrors); if (this.rejectRetry) { rejectPayment(requestId); } else { @@ -164,6 +184,11 @@ paymentSrv.setTestingUIService(DummyUIService.QueryInterface(Ci.nsIPaymentUIServ addMessageListener("start-test", function(testName) { DummyUIService.testName = testName; + if (testName === "testRetryWithEmptyErrors") { + DummyUIService.emptyErrors = true; + } else { + DummyUIService.emptyErrors = false; + } sendAsyncMessage("start-test-complete"); }); diff --git a/dom/payments/test/test_retryPayment.html b/dom/payments/test/test_retryPayment.html index 2e7c6d0155c3..38241dcedd81 100644 --- a/dom/payments/test/test_retryPayment.html +++ b/dom/payments/test/test_retryPayment.html @@ -209,7 +209,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=1435161 const payRequest = new PaymentRequest(defaultMethods, defaultDetails, options); ok(payRequest, testName + ": failed to create PaymentRequest."); if (!payRequest) { - requestChromeAction("finish-test"); + await requestChromeAction("finish-test"); return; } const handler = SpecialPowers.getDOMWindowUtils(window).setHandlingUserInput(true); @@ -226,13 +226,10 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=1435161 } try { await payResponse.retry(); - ok(false, `${testName}: Unexpected success when retry the PaymentResponse.`); + } catch(err) { + ok(false, unexpectedErrMsg(testName, err.name, "retrying")); await requestChromeAction("finish-test"); return; - } catch(err) { - is(err.name, - "AbortError", - expectedErrMsg(testName, "AbortError", err.name, "retrying")); } try { await payResponse.complete("success"); From 273386aaea4d49b4384e2132a15d7e6af91716a7 Mon Sep 17 00:00:00 2001 From: Eden Chuang Date: Wed, 5 Dec 2018 15:02:01 -0500 Subject: [PATCH 02/22] bug 1494917 - Warning to console when calling PaymentResponse.retry() with improper error fields. r=baku 1. Warning to browser console when calling with empty error fields. 2. Warning to browser console when calling with non-empty payer errors but corresponding PaymentOptions.requestPayerXXX is false. --HG-- extra : histedit_source : 816c44a0ceca5202886a48eee96d2ef7f7315487 --- dom/locales/en-US/chrome/dom/dom.properties | 9 +- dom/payments/PaymentRequestData.cpp | 10 ++- dom/payments/PaymentResponse.cpp | 94 +++++++++++++++------ dom/payments/PaymentResponse.h | 3 +- 4 files changed, 84 insertions(+), 32 deletions(-) diff --git a/dom/locales/en-US/chrome/dom/dom.properties b/dom/locales/en-US/chrome/dom/dom.properties index 055f44d0e22b..94431b681fcb 100644 --- a/dom/locales/en-US/chrome/dom/dom.properties +++ b/dom/locales/en-US/chrome/dom/dom.properties @@ -353,7 +353,14 @@ AmbientLightEventWarning=Use of the ambient light sensor is deprecated. IDBOpenDBOptions_StorageTypeWarning=The ‘storage’ attribute in options passed to indexedDB.open is deprecated and will soon be removed. To get persistent storage, please use navigator.storage.persist() instead. DOMQuadBoundsAttrWarning=DOMQuad.bounds is deprecated in favor of DOMQuad.getBounds() UnsupportedEntryTypesIgnored=Ignoring unsupported entryTypes: %S. - +# LOCALIZATION NOTE (PaymentRequestRetryWithEmptyErrors): Do not translate "PaymentRequest". The %S is the id of the PaymentRequest. +PaymentRequestRetryWithEmptyErrors=Retrying the PaymentRequest(%S) with empty error fields. +# LOCALIZATION NOTE (PaymentRequestRetryWithNonemptyPayerErrorName): Do not translate "PaymentRequest", "PayerErrorFields.name" and "PaymentOptions.requestPayerName". The %S is the id of the PaymentRequest +PaymentRequestRetryWithNonemptyPayerErrorName=Retrying the PaymentRequest(%S) with non-empty PayerErrorFields.name, but PaymentOptions.requestPayerName is false. +# LOCALIZATION NOTE (PaymentRequestRetryWithNonemptyPayerErrorEmail): Do not translate "PaymentRequest", "PayerErrorFields.email" and "PaymentOptions.requestPayerEmail". The %S is the id of the PaymentRequest +PaymentRequestRetryWithNonemptyPayerErrorEmail=Retrying the PaymentRequest(%S) with non-empty PayerErrorFields.email, but PaymentOptions.requestPayerEmail is false. +# LOCALIZATION NOTE (PaymentRequestRetryWithNonemptyPayerErrorPhone): Do not translate "PaymentRequest", "PayerErrorFields.phone" and "PaymentOptions.requestPayerPhone". The %S is the id of the PaymentRequest +PaymentRequestRetryWithNonemptyPayerErrorPhone=Retrying the PaymentRequest(%S) with non-empty PayerErrorFields.phone, but PaymentOptions.requestPayerPhone is false. #LOCALIZATION NOTE(DeprecatedTestingInterfaceWarning): Do not translate this message. It's just testing only. DeprecatedTestingInterfaceWarning=TestingDeprecatedInterface is a testing-only interface and this is its testing deprecation message. #LOCALIZATION NOTE(DeprecatedTestingMethodWarning): Do not translate this message. It's just testing only. diff --git a/dom/payments/PaymentRequestData.cpp b/dom/payments/PaymentRequestData.cpp index f23b693de9f3..af4694634af4 100644 --- a/dom/payments/PaymentRequestData.cpp +++ b/dom/payments/PaymentRequestData.cpp @@ -417,6 +417,10 @@ PaymentDetails::GetError(nsAString& aError) { NS_IMETHODIMP PaymentDetails::GetShippingAddressErrors(JSContext* aCx, JS::MutableHandleValue aErrors) { + aErrors.set(JS::NullValue()); + if (mShippingAddressErrors.IsEmpty()) { + return NS_OK; + } AddressErrors errors; errors.Init(mShippingAddressErrors); if (!ToJSValue(aCx, errors, aErrors)) { @@ -427,6 +431,10 @@ PaymentDetails::GetShippingAddressErrors(JSContext* aCx, NS_IMETHODIMP PaymentDetails::GetPayerErrors(JSContext* aCx, JS::MutableHandleValue aErrors) { + aErrors.set(JS::NullValue()); + if (mPayerErrors.IsEmpty()) { + return NS_OK; + } PayerErrors errors; errors.Init(mPayerErrors); if (!ToJSValue(aCx, errors, aErrors)) { @@ -438,8 +446,8 @@ PaymentDetails::GetPayerErrors(JSContext* aCx, JS::MutableHandleValue aErrors) { NS_IMETHODIMP PaymentDetails::GetPaymentMethodErrors(JSContext* aCx, JS::MutableHandleValue aErrors) { + aErrors.set(JS::NullValue()); if (mPaymentMethodErrors.IsEmpty()) { - aErrors.set(JS::NullValue()); return NS_OK; } nsresult rv = DeserializeToJSValue(mPaymentMethodErrors, aCx, aErrors); diff --git a/dom/payments/PaymentResponse.cpp b/dom/payments/PaymentResponse.cpp index 5691b51de194..c876e74510c0 100644 --- a/dom/payments/PaymentResponse.cpp +++ b/dom/payments/PaymentResponse.cpp @@ -4,14 +4,15 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#include "mozilla/StaticPrefs.h" +#include "BasicCardPayment.h" #include "mozilla/dom/PaymentResponse.h" #include "mozilla/dom/BasicCardPaymentBinding.h" #include "mozilla/dom/PaymentRequestUpdateEvent.h" -#include "BasicCardPayment.h" +#include "mozilla/EventStateManager.h" +#include "mozilla/StaticPrefs.h" +#include "nsContentUtils.h" #include "PaymentAddress.h" #include "PaymentRequestUtils.h" -#include "mozilla/EventStateManager.h" namespace mozilla { namespace dom { @@ -256,16 +257,12 @@ already_AddRefed PaymentResponse::Retry( return promise.forget(); } - nsresult rv = ValidatePaymentValidationErrors(aErrors); - if (NS_WARN_IF(NS_FAILED(rv))) { - promise->MaybeReject(rv); - return promise.forget(); - } + ValidatePaymentValidationErrors(aErrors); // Depending on the PMI, try to do IDL type conversion // (e.g., basic-card expects at BasicCardErrors dictionary) nsAutoString errorMsg; - rv = ConvertPaymentMethodErrors(aCx, aErrors, errorMsg); + nsresult rv = ConvertPaymentMethodErrors(aCx, aErrors, errorMsg); if (NS_WARN_IF(NS_FAILED(rv))) { MOZ_ASSERT(!errorMsg.IsEmpty()); ErrorResult error; @@ -337,78 +334,119 @@ nsresult PaymentResponse::ConvertPaymentMethodErrors( return NS_OK; } -nsresult PaymentResponse::ValidatePaymentValidationErrors( +void PaymentResponse::ValidatePaymentValidationErrors( const PaymentValidationErrors& aErrors) { - // Should not be empty errors // check PaymentValidationErrors.error if (aErrors.mError.WasPassed() && !aErrors.mError.Value().IsEmpty()) { - return NS_OK; + return; } + PaymentOptions options; + mRequest->GetOptions(options); + nsIDocument* doc = GetOwner()->GetExtantDoc(); // check PaymentValidationErrors.payer if (aErrors.mPayer.WasPassed()) { PayerErrors payerErrors(aErrors.mPayer.Value()); if (payerErrors.mName.WasPassed() && !payerErrors.mName.Value().IsEmpty()) { - return NS_OK; + if (!options.mRequestPayerName && doc) { + const char16_t* params[] = { mRequestId.get() }; + nsContentUtils::ReportToConsole(nsIScriptError::warningFlag, + NS_LITERAL_CSTRING("DOM::Web Payments"), + doc, + nsContentUtils::eDOM_PROPERTIES, + "PaymentRequestRetryWithNonemptyPayerErrorName", + params, + 1); + } + return; } if (payerErrors.mEmail.WasPassed() && !payerErrors.mEmail.Value().IsEmpty()) { - return NS_OK; + if (!options.mRequestPayerEmail && doc) { + const char16_t* params[] = { mRequestId.get() }; + nsContentUtils::ReportToConsole(nsIScriptError::warningFlag, + NS_LITERAL_CSTRING("DOM::Web Payments"), + doc, + nsContentUtils::eDOM_PROPERTIES, + "PaymentRequestRetryWithNonemptyPayerErrorEmail", + params, + 1); + } + return; } if (payerErrors.mPhone.WasPassed() && !payerErrors.mPhone.Value().IsEmpty()) { - return NS_OK; + if (!options.mRequestPayerPhone && doc) { + const char16_t* params[] = { mRequestId.get() }; + nsContentUtils::ReportToConsole(nsIScriptError::warningFlag, + NS_LITERAL_CSTRING("DOM::Web Payments"), + doc, + nsContentUtils::eDOM_PROPERTIES, + "PaymentRequestRetryWithNonemptyPayerErrorPhone", + params, + 1); + } + return; } } // check PaymentValidationErrors.paymentMethod if (aErrors.mPaymentMethod.WasPassed()) { - return NS_OK; + return; } // check PaymentValidationErrors.shippingAddress if (aErrors.mShippingAddress.WasPassed()) { AddressErrors addErrors(aErrors.mShippingAddress.Value()); if (addErrors.mAddressLine.WasPassed() && !addErrors.mAddressLine.Value().IsEmpty()) { - return NS_OK; + return; } if (addErrors.mCity.WasPassed() && !addErrors.mCity.Value().IsEmpty()) { - return NS_OK; + return; } if (addErrors.mCountry.WasPassed() && !addErrors.mCountry.Value().IsEmpty()) { - return NS_OK; + return; } if (addErrors.mDependentLocality.WasPassed() && !addErrors.mDependentLocality.Value().IsEmpty()) { - return NS_OK; + return; } if (addErrors.mOrganization.WasPassed() && !addErrors.mOrganization.Value().IsEmpty()) { - return NS_OK; + return; } if (addErrors.mPhone.WasPassed() && !addErrors.mPhone.Value().IsEmpty()) { - return NS_OK; + return; } if (addErrors.mPostalCode.WasPassed() && !addErrors.mPostalCode.Value().IsEmpty()) { - return NS_OK; + return; } if (addErrors.mRecipient.WasPassed() && !addErrors.mRecipient.Value().IsEmpty()) { - return NS_OK; + return; } if (addErrors.mRegion.WasPassed() && !addErrors.mRegion.Value().IsEmpty()) { - return NS_OK; + return; } if (addErrors.mRegionCode.WasPassed() && !addErrors.mRegionCode.Value().IsEmpty()) { - return NS_OK; + return; } if (addErrors.mSortingCode.WasPassed() && !addErrors.mSortingCode.Value().IsEmpty()) { - return NS_OK; + return; } } - return NS_ERROR_DOM_ABORT_ERR; + if (doc) { + const char16_t* params[] = { mRequestId.get() }; + nsContentUtils::ReportToConsole(nsIScriptError::warningFlag, + NS_LITERAL_CSTRING("DOM::Web Payments"), + doc, + nsContentUtils::eDOM_PROPERTIES, + "PaymentRequestRetryWithEmptyErrors", + params, + 1); + } } NS_IMETHODIMP diff --git a/dom/payments/PaymentResponse.h b/dom/payments/PaymentResponse.h index 5df24d227463..3608f11925eb 100644 --- a/dom/payments/PaymentResponse.h +++ b/dom/payments/PaymentResponse.h @@ -146,8 +146,7 @@ class PaymentResponse final : public DOMEventTargetHelper, protected: ~PaymentResponse(); - nsresult ValidatePaymentValidationErrors( - const PaymentValidationErrors& aErrors); + void ValidatePaymentValidationErrors(const PaymentValidationErrors& aErrors); nsresult ConvertPaymentMethodErrors(JSContext* aCx, const PaymentValidationErrors& aErrors, From 767fbe89df96a757d53f0b2de6033382d4e7a40a Mon Sep 17 00:00:00 2001 From: Andrea Marchesini Date: Thu, 20 Dec 2018 14:32:48 +0100 Subject: [PATCH 03/22] Bug 1514853 - network.cookie.cookieBehavior default to 0 in release, r=tanvi --- browser/app/profile/firefox.js | 5 ++++- .../preferences/in-content/tests/browser_contentblocking.js | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js index 2b4eb2b71933..ca7cdf4a3c7a 100644 --- a/browser/app/profile/firefox.js +++ b/browser/app/profile/firefox.js @@ -1513,8 +1513,11 @@ pref("browser.ping-centre.production.endpoint", "https://tiles.services.mozilla. // Enable GMP support in the addon manager. pref("media.gmp-provider.enabled", true); -// Enable blocking access to storage from tracking resources by default +// Enable blocking access to storage from tracking resources only in nightly +// and early beta. By default the value is 0: BEHAVIOR_ACCEPT +#ifdef NIGHTLY_OR_EARLY_BETA pref("network.cookie.cookieBehavior", 4 /* BEHAVIOR_REJECT_TRACKER */); +#endif pref("browser.contentblocking.allowlist.storage.enabled", true); diff --git a/browser/components/preferences/in-content/tests/browser_contentblocking.js b/browser/components/preferences/in-content/tests/browser_contentblocking.js index ca304c3cff57..a051af6337fb 100644 --- a/browser/components/preferences/in-content/tests/browser_contentblocking.js +++ b/browser/components/preferences/in-content/tests/browser_contentblocking.js @@ -232,7 +232,7 @@ add_task(async function testContentBlockingCustomCategory() { // Changing the NCB_PREF should necessarily set CAT_PREF to "custom" Services.prefs.setIntPref(NCB_PREF, Ci.nsICookieService.BEHAVIOR_ACCEPT); - await TestUtils.waitForCondition(() => Services.prefs.prefHasUserValue(NCB_PREF)); + await TestUtils.waitForCondition(() => !Services.prefs.prefHasUserValue(NCB_PREF)); is(Services.prefs.getStringPref(CAT_PREF), "custom", `${CAT_PREF} has been set to custom`); gBrowser.removeCurrentTab(); From 3c5b7bc26a01515327d6e06ba7098490faee7e44 Mon Sep 17 00:00:00 2001 From: Diego Pino Garcia Date: Thu, 20 Dec 2018 03:28:00 +0200 Subject: [PATCH 04/22] Bug 1446158 - Create a handleEvent custom element mixin to forward events from handleEvent to on* methods. r=MattN --- .../payments/res/components/rich-select.js | 16 +++----- .../payments/res/containers/address-form.js | 40 +++++++------------ .../payments/res/containers/address-picker.js | 15 +------ .../res/containers/basic-card-form.js | 38 +++++------------- .../res/containers/completion-error-page.js | 22 +++++----- .../payments/res/containers/payment-dialog.js | 34 ++++++++-------- .../res/containers/payment-method-picker.js | 22 +++++----- .../res/containers/shipping-option-picker.js | 12 +----- .../payments/res/mixins/HandleEventMixin.js | 28 +++++++++++++ 9 files changed, 100 insertions(+), 127 deletions(-) create mode 100644 browser/components/payments/res/mixins/HandleEventMixin.js diff --git a/browser/components/payments/res/components/rich-select.js b/browser/components/payments/res/components/rich-select.js index 5c92139c9c57..4860ef5447d5 100644 --- a/browser/components/payments/res/components/rich-select.js +++ b/browser/components/payments/res/components/rich-select.js @@ -2,6 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +import HandleEventMixin from "../mixins/HandleEventMixin.js"; import ObservedPropertiesMixin from "../mixins/ObservedPropertiesMixin.js"; import RichOption from "./rich-option.js"; @@ -13,7 +14,7 @@ import RichOption from "./rich-option.js"; * Note: The only supported way to change the selected option is via the * `value` setter. */ -export default class RichSelect extends ObservedPropertiesMixin(HTMLElement) { +export default class RichSelect extends HandleEventMixin(ObservedPropertiesMixin(HTMLElement)) { static get observedAttributes() { return [ "disabled", @@ -57,15 +58,10 @@ export default class RichSelect extends ObservedPropertiesMixin(HTMLElement) { return this.popupBox.querySelector(`:scope > [value="${CSS.escape(value)}"]`); } - handleEvent(event) { - switch (event.type) { - case "change": { - // Since the render function depends on the popupBox's value, we need to - // re-render if the value changes. - this.render(); - break; - } - } + onChange(event) { + // Since the render function depends on the popupBox's value, we need to + // re-render if the value changes. + this.render(); } render() { diff --git a/browser/components/payments/res/containers/address-form.js b/browser/components/payments/res/containers/address-form.js index 11d1a4265349..3ddea319c9d4 100644 --- a/browser/components/payments/res/containers/address-form.js +++ b/browser/components/payments/res/containers/address-form.js @@ -7,6 +7,7 @@ import LabelledCheckbox from "../components/labelled-checkbox.js"; import PaymentRequestPage from "../components/payment-request-page.js"; import PaymentStateSubscriberMixin from "../mixins/PaymentStateSubscriberMixin.js"; import paymentRequest from "../paymentRequest.js"; +import HandleEventMixin from "../mixins/HandleEventMixin.js"; /* import-globals-from ../unprivileged-fallbacks.js */ /** @@ -20,7 +21,8 @@ import paymentRequest from "../paymentRequest.js"; * as it will be much easier to share the logic once we switch to Fluent. */ -export default class AddressForm extends PaymentStateSubscriberMixin(PaymentRequestPage) { +export default class AddressForm extends + HandleEventMixin(PaymentStateSubscriberMixin(PaymentRequestPage)) { constructor() { super(); @@ -216,32 +218,18 @@ export default class AddressForm extends PaymentStateSubscriberMixin(PaymentRequ this.updateSaveButtonState(); } - handleEvent(event) { - switch (event.type) { - case "change": { - if (event.target.id == "country") { - this.updateRequiredState(); - } - this.updateSaveButtonState(); - break; - } - case "click": { - this.onClick(event); - break; - } - case "input": { - this.onInput(event); - break; - } - case "invalid": { - if (event.target instanceof HTMLFormElement) { - this.onInvalidForm(event); - break; - } + onChange(event) { + if (event.target.id == "country") { + this.updateRequiredState(); + } + this.updateSaveButtonState(); + } - this.onInvalidField(event); - break; - } + onInvalid(event) { + if (event.target instanceof HTMLFormElement) { + this.onInvalidForm(event); + } else { + this.onInvalidField(event); } } diff --git a/browser/components/payments/res/containers/address-picker.js b/browser/components/payments/res/containers/address-picker.js index 4db41a1b6df8..fef2343a74dd 100644 --- a/browser/components/payments/res/containers/address-picker.js +++ b/browser/components/payments/res/containers/address-picker.js @@ -6,6 +6,7 @@ import AddressForm from "./address-form.js"; import AddressOption from "../components/address-option.js"; import RichPicker from "./rich-picker.js"; import paymentRequest from "../paymentRequest.js"; +import HandleEventMixin from "../mixins/HandleEventMixin.js"; /** * @@ -13,7 +14,7 @@ import paymentRequest from "../paymentRequest.js"; * listening to savedAddresses & tempAddresses. */ -export default class AddressPicker extends RichPicker { +export default class AddressPicker extends HandleEventMixin(RichPicker) { static get pickerAttributes() { return [ "address-fields", @@ -197,18 +198,6 @@ export default class AddressPicker extends RichPicker { }) || ""; } - handleEvent(event) { - switch (event.type) { - case "change": { - this.onChange(event); - break; - } - case "click": { - this.onClick(event); - } - } - } - onChange(event) { let [selectedKey, selectedLeaf] = this.selectedStateKey.split("|"); if (!selectedKey) { diff --git a/browser/components/payments/res/containers/basic-card-form.js b/browser/components/payments/res/containers/basic-card-form.js index 11025317b2d8..a5bb6c56ecc1 100644 --- a/browser/components/payments/res/containers/basic-card-form.js +++ b/browser/components/payments/res/containers/basic-card-form.js @@ -10,6 +10,7 @@ import LabelledCheckbox from "../components/labelled-checkbox.js"; import PaymentRequestPage from "../components/payment-request-page.js"; import PaymentStateSubscriberMixin from "../mixins/PaymentStateSubscriberMixin.js"; import paymentRequest from "../paymentRequest.js"; +import HandleEventMixin from "../mixins/HandleEventMixin.js"; /* import-globals-from ../unprivileged-fallbacks.js */ @@ -20,7 +21,8 @@ import paymentRequest from "../paymentRequest.js"; * as it will be much easier to share the logic once we switch to Fluent. */ -export default class BasicCardForm extends PaymentStateSubscriberMixin(PaymentRequestPage) { +export default class BasicCardForm extends + HandleEventMixin(PaymentStateSubscriberMixin(PaymentRequestPage)) { constructor() { super(); @@ -268,32 +270,6 @@ export default class BasicCardForm extends PaymentStateSubscriberMixin(PaymentRe this.updateSaveButtonState(); } - handleEvent(event) { - switch (event.type) { - case "change": { - this.onChange(event); - break; - } - case "click": { - this.onClick(event); - break; - } - case "input": { - this.onInput(event); - break; - } - case "invalid": { - if (event.target instanceof HTMLFormElement) { - this.onInvalidForm(event); - break; - } - - this.onInvalidField(event); - break; - } - } - } - onChange(evt) { let ccType = this.form.querySelector("#cc-type"); this.cscInput.setAttribute("card-type", ccType.value); @@ -390,6 +366,14 @@ export default class BasicCardForm extends PaymentStateSubscriberMixin(PaymentRe this.updateSaveButtonState(); } + onInvalid(event) { + if (event.target instanceof HTMLFormElement) { + this.onInvalidForm(event); + } else { + this.onInvalidField(event); + } + } + /** * @param {Event} event - "invalid" event * Note: Keep this in-sync with the equivalent version in address-form.js diff --git a/browser/components/payments/res/containers/completion-error-page.js b/browser/components/payments/res/containers/completion-error-page.js index 167967899845..83b40bf2331c 100644 --- a/browser/components/payments/res/containers/completion-error-page.js +++ b/browser/components/payments/res/containers/completion-error-page.js @@ -2,6 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +import HandleEventMixin from "../mixins/HandleEventMixin.js"; import PaymentRequestPage from "../components/payment-request-page.js"; import PaymentStateSubscriberMixin from "../mixins/PaymentStateSubscriberMixin.js"; import paymentRequest from "../paymentRequest.js"; @@ -15,7 +16,8 @@ import paymentRequest from "../paymentRequest.js"; * as it will be much easier to implement and share the logic once we switch to Fluent. */ -export default class CompletionErrorPage extends PaymentStateSubscriberMixin(PaymentRequestPage) { +export default class CompletionErrorPage extends + HandleEventMixin(PaymentStateSubscriberMixin(PaymentRequestPage)) { constructor() { super(); @@ -80,16 +82,14 @@ export default class CompletionErrorPage extends PaymentStateSubscriberMixin(Pay this.suggestionsList.appendChild(suggestionsFragment); } - handleEvent(event) { - if (event.type == "click") { - switch (event.target) { - case this.doneButton: { - this.onDoneButtonClick(event); - break; - } - default: { - throw new Error("Unexpected click target"); - } + onClick(event) { + switch (event.target) { + case this.doneButton: { + this.onDoneButtonClick(event); + break; + } + default: { + throw new Error("Unexpected click target"); } } } diff --git a/browser/components/payments/res/containers/payment-dialog.js b/browser/components/payments/res/containers/payment-dialog.js index 9af57c827fc3..64ce56171bff 100644 --- a/browser/components/payments/res/containers/payment-dialog.js +++ b/browser/components/payments/res/containers/payment-dialog.js @@ -2,6 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +import HandleEventMixin from "../mixins/HandleEventMixin.js"; import PaymentStateSubscriberMixin from "../mixins/PaymentStateSubscriberMixin.js"; import paymentRequest from "../paymentRequest.js"; @@ -26,7 +27,8 @@ import "./shipping-option-picker.js"; * being exported once tests stop depending on it. */ -export default class PaymentDialog extends PaymentStateSubscriberMixin(HTMLElement) { +export default class PaymentDialog extends + HandleEventMixin(PaymentStateSubscriberMixin(HTMLElement)) { constructor() { super(); this._template = document.getElementById("payment-dialog-template"); @@ -77,22 +79,20 @@ export default class PaymentDialog extends PaymentStateSubscriberMixin(HTMLEleme super.disconnectedCallback(); } - handleEvent(event) { - if (event.type == "click") { - switch (event.currentTarget) { - case this._viewAllButton: - let orderDetailsShowing = !this.requestStore.getState().orderDetailsShowing; - this.requestStore.setState({ orderDetailsShowing }); - break; - case this._payButton: - this.pay(); - break; - case this._manageText: - if (event.target instanceof HTMLAnchorElement) { - this.openPreferences(event); - } - break; - } + onClick(event) { + switch (event.currentTarget) { + case this._viewAllButton: + let orderDetailsShowing = !this.requestStore.getState().orderDetailsShowing; + this.requestStore.setState({ orderDetailsShowing }); + break; + case this._payButton: + this.pay(); + break; + case this._manageText: + if (event.target instanceof HTMLAnchorElement) { + this.openPreferences(event); + } + break; } } diff --git a/browser/components/payments/res/containers/payment-method-picker.js b/browser/components/payments/res/containers/payment-method-picker.js index a930b7eaec98..10e85ab079a6 100644 --- a/browser/components/payments/res/containers/payment-method-picker.js +++ b/browser/components/payments/res/containers/payment-method-picker.js @@ -4,8 +4,10 @@ import BasicCardOption from "../components/basic-card-option.js"; import CscInput from "../components/csc-input.js"; +import HandleEventMixin from "../mixins/HandleEventMixin.js"; import RichPicker from "./rich-picker.js"; import paymentRequest from "../paymentRequest.js"; + /* import-globals-from ../unprivileged-fallbacks.js */ /** @@ -14,7 +16,7 @@ import paymentRequest from "../paymentRequest.js"; * listening to savedBasicCards. */ -export default class PaymentMethodPicker extends RichPicker { +export default class PaymentMethodPicker extends HandleEventMixin(RichPicker) { constructor() { super(); this.dropdown.setAttribute("option-type", "basic-card-option"); @@ -115,18 +117,12 @@ export default class PaymentMethodPicker extends RichPicker { return this.getAttribute("selected-state-key"); } - handleEvent(event) { - switch (event.type) { - case "input": - case "change": { - this.onInputOrChange(event); - break; - } - case "click": { - this.onClick(event); - break; - } - } + onInput(event) { + this.onInputOrChange(event); + } + + onChange(event) { + this.onInputOrChange(event); } onInputOrChange({currentTarget}) { diff --git a/browser/components/payments/res/containers/shipping-option-picker.js b/browser/components/payments/res/containers/shipping-option-picker.js index 47af49bf78b6..2c5d8d654800 100644 --- a/browser/components/payments/res/containers/shipping-option-picker.js +++ b/browser/components/payments/res/containers/shipping-option-picker.js @@ -4,6 +4,7 @@ import RichPicker from "./rich-picker.js"; import ShippingOption from "../components/shipping-option.js"; +import HandleEventMixin from "../mixins/HandleEventMixin.js"; /** * @@ -11,7 +12,7 @@ import ShippingOption from "../components/shipping-option.js"; *