@@ -490,6 +490,39 @@ <h3>
490490 }
491491 </ pre >
492492 </ section >
493+ < section >
494+ < h3 >
495+ Fine-grained error reporting
496+ </ h3 >
497+ < p >
498+ A developer can use the < a data-link-for =
499+ "PaymentDetailsUpdate "> shippingAddressErrors</ a > member of the
500+ < a > PaymentDetailsUpdate</ a > dictionary to indicate that there are
501+ validation errors with specific attributes of a
502+ < a > PaymentAddress</ a > . The < a data-link-for =
503+ "PaymentDetailsUpdate "> shippingAddressErrors</ a > member is a
504+ < a > AddressErrorFields</ a > dictionary, whose members specifically
505+ demarcate the fields of a < a > physical address</ a > that are erroneous
506+ while also providing helpful error messages to be displayed to the
507+ end user.
508+ </ p >
509+ < pre class ="example ">
510+ request.onshippingaddresschange = ev => {
511+ ev.updateWith(validateAddress(request.shippingAddress));
512+ };
513+ function validateAddress(shippingAddress) {
514+ const error = "Can't ship to this address.";
515+ const shippingAddressErrors = {
516+ cityError: "FarmVille is not a real place.",
517+ postalCodeError: "Unknown postal code for your country.",
518+ };
519+ // Empty shippingOptions implies that we can't ship
520+ // to this address.
521+ const shippingOptions = [];
522+ return { error, shippingAddressErrors, shippingOptions };
523+ }
524+ </ pre >
525+ </ section >
493526 < section data-link-for ="PaymentResponse ">
494527 < h3 >
495528 POSTing payment response back to a server
@@ -1713,6 +1746,7 @@ <h2>
17131746 dictionary PaymentDetailsUpdate : PaymentDetailsBase {
17141747 DOMString error;
17151748 PaymentItem total;
1749+ AddressErrorFields shippingAddressErrors;
17161750 };
17171751 </ pre >
17181752 < p >
@@ -1756,6 +1790,14 @@ <h2>
17561790 "PaymentCurrencyAmount.value "> value</ a > is a negative number.
17571791 </ p >
17581792 </ dd >
1793+ < dt >
1794+ < dfn > shippingAddressErrors</ dfn > member
1795+ </ dt >
1796+ < dd >
1797+ Represents validation errors with the shipping address that is
1798+ associated with the < a data-cite ="!DOM#event-target "> event
1799+ target</ a > .
1800+ </ dd >
17591801 </ dl >
17601802 </ section >
17611803 </ section >
@@ -2040,7 +2082,7 @@ <h2>
20402082 Physical addresses
20412083 </ h2 >
20422084 < p >
2043- A < dfn > physical address</ dfn > is composed of the following concepts .
2085+ A < dfn > physical address</ dfn > is composed of the following parts .
20442086 </ p >
20452087 < dl data-sort ="">
20462088 < dt >
@@ -2704,6 +2746,154 @@ <h2>
27042746 </ dd >
27052747 </ dl >
27062748 </ section >
2749+ < section data-dfn-for ="AddressErrorFields " data-link-for =
2750+ "AddressErrorFields ">
2751+ < h2 >
2752+ < dfn > AddressErrorFields</ dfn > dictionary
2753+ </ h2 >
2754+ < pre class ="idl ">
2755+ dictionary AddressErrorFields {
2756+ DOMString addressLineError;
2757+ DOMString cityError;
2758+ DOMString countryError;
2759+ DOMString dependentLocalityError;
2760+ DOMString languageCodeError;
2761+ DOMString organizationError;
2762+ DOMString phoneError;
2763+ DOMString postalCodeError;
2764+ DOMString recipientError;
2765+ DOMString regionError;
2766+ DOMString regionCodeError;
2767+ DOMString sortingCodeError;
2768+ };
2769+ </ pre >
2770+ < p >
2771+ The members of the < a > AddressErrorFields</ a > dictionary represent
2772+ validation errors with specific parts of a < a > physical address</ a > .
2773+ Each dictionary member has a dual function: firstly, its presence
2774+ denotes that a particular part of an address is suffering from a
2775+ validation error. Secondly, the string value allows the developer to
2776+ describe the validation error (and possibly how the end user can fix
2777+ the error).
2778+ </ p >
2779+ < p class ="note ">
2780+ Developers need to be aware that users might not have the ability to
2781+ fix certain parts of an address. As such, they need to be mindful to
2782+ not to ask the user to fix things they might not have control over
2783+ (e.g., < a > languageCodeError</ a > ).
2784+ </ p >
2785+ < dl >
2786+ < dt >
2787+ < dfn > addressLineError</ dfn > member
2788+ </ dt >
2789+ < dd >
2790+ Denotes that the < a > address line</ a > has a validation error. In the
2791+ user agent's UI, this member corresponds to the input field that
2792+ provided the < a > PaymentAddress</ a > 's < a data-link-for =
2793+ "PaymentAddress "> addressLine</ a > attribute's value.
2794+ </ dd >
2795+ < dt >
2796+ < dfn > cityError</ dfn > member
2797+ </ dt >
2798+ < dd >
2799+ Denotes that the < a > city</ a > has a validation error. In the user
2800+ agent's UI, this member corresponds to the input field that
2801+ provided the < a > PaymentAddress</ a > 's < a data-link-for =
2802+ "PaymentAddress "> city</ a > attribute's value.
2803+ </ dd >
2804+ < dt >
2805+ < dfn > countryError</ dfn > member
2806+ </ dt >
2807+ < dd >
2808+ Denotes that the < a > country</ a > has a validation error. In the user
2809+ agent's UI, this member corresponds to the input field that
2810+ provided the < a > PaymentAddress</ a > 's < a data-link-for =
2811+ "PaymentAddress "> country</ a > attribute's value.
2812+ </ dd >
2813+ < dt >
2814+ < dfn > dependentLocalityError</ dfn > member
2815+ </ dt >
2816+ < dd >
2817+ Denotes that the < a > dependent locality</ a > has a validation error.
2818+ In the user agent's UI, this member corresponds to the input field
2819+ that provided the < a > PaymentAddress</ a > 's < a data-link-for =
2820+ "PaymentAddress "> dependentLocality</ a > attribute's value.
2821+ </ dd >
2822+ < dt >
2823+ < dfn > languageCodeError</ dfn > member
2824+ </ dt >
2825+ < dd >
2826+ Denotes that the < a > language code</ a > has a validation error. In
2827+ the user agent's UI, this member corresponds to the input field
2828+ that provided the < a > PaymentAddress</ a > 's < a data-link-for =
2829+ "PaymentAddress "> languageCode</ a > attribute's value.
2830+ </ dd >
2831+ < dt >
2832+ < dfn > organizationError</ dfn > member
2833+ </ dt >
2834+ < dd >
2835+ Denotes that the < a > organization</ a > has a validation error. In the
2836+ user agent's UI, this member corresponds to the input field that
2837+ provided the < a > PaymentAddress</ a > 's < a data-link-for =
2838+ "PaymentAddress "> organization</ a > attribute's value.
2839+ </ dd >
2840+ < dt >
2841+ < dfn > phoneError</ dfn > member
2842+ </ dt >
2843+ < dd >
2844+ Denotes that the < a > phone number</ a > has a validation error. In the
2845+ user agent's UI, this member corresponds to the input field that
2846+ provided the < a > PaymentAddress</ a > 's < a data-link-for =
2847+ "PaymentAddress "> phone</ a > attribute's value.
2848+ </ dd >
2849+ < dt >
2850+ < dfn > postalCodeError</ dfn > member
2851+ </ dt >
2852+ < dd >
2853+ Denotes that the < a > postal code</ a > has a validation error. In the
2854+ user agent's UI, this member corresponds to the input field that
2855+ provided the < a > PaymentAddress</ a > 's < a data-link-for =
2856+ "PaymentAddress "> postalCode</ a > attribute's value.
2857+ </ dd >
2858+ < dt >
2859+ < dfn > recipientError</ dfn > member
2860+ </ dt >
2861+ < dd >
2862+ Denotes that the < a > recipient</ a > has a validation error. In the
2863+ user agent's UI, this member corresponds to the input field that
2864+ provided the < a > PaymentAddress</ a > 's < a data-link-for =
2865+ "PaymentAddress "> addressLine</ a > attribute's value.
2866+ </ dd >
2867+ < dt >
2868+ < dfn > regionError</ dfn > member
2869+ </ dt >
2870+ < dd >
2871+ Denotes that the < a > region</ a > has a validation error. In the user
2872+ agent's UI, this member corresponds to the input field that
2873+ provided the < a > PaymentAddress</ a > 's < a data-link-for =
2874+ "PaymentAddress "> region</ a > attribute's value.
2875+ </ dd >
2876+ < dt >
2877+ < dfn > regionCodeError</ dfn > member
2878+ </ dt >
2879+ < dd >
2880+ Denotes that the region code representation of the < a > region</ a >
2881+ has a validation error. In the user agent's UI, this member
2882+ corresponds to the input field that provided the
2883+ < a > PaymentAddress</ a > 's < a data-link-for =
2884+ "PaymentAddress "> regionCode</ a > attribute's value.
2885+ </ dd >
2886+ < dt >
2887+ < dfn > sortingCodeError</ dfn > member
2888+ </ dt >
2889+ < dd >
2890+ The < a > sorting code</ a > has a validation error. In the user agent's
2891+ UI, this member corresponds to the input field that provided the
2892+ < a > PaymentAddress</ a > 's < a data-link-for =
2893+ "PaymentAddress "> sortingCode</ a > attribute's value.
2894+ </ dd >
2895+ </ dl >
2896+ </ section >
27072897 < section >
27082898 < h2 >
27092899 Creating a < code > PaymentAddress</ code > from user-provided input
@@ -3914,21 +4104,37 @@ <h2>
39144104 </ li >
39154105 </ ol >
39164106 </ li >
3917- < li > If < var > request</ var > .< a > [[\options]]</ a > .< a data-lt =
3918- "PaymentOptions.requestShipping "> requestShipping</ a > is true,
3919- and
3920- < var > request</ var > .< a > [[\details]]</ a > .< a > shippingOptions</ a >
3921- is empty, then the developer has signified that there are no
3922- valid shipping options for the currently-chosen shipping
3923- address (given by < var > request</ var > 's < a data-lt =
3924- "PaymentRequest.shippingAddress "> shippingAddress</ a > ). In
3925- this case, the user agent SHOULD display an error indicating
3926- this, and MAY indicate that the currently-chosen shipping
3927- address is invalid in some way. The user agent SHOULD use the
3928- < a data-lt ="PaymentDetailsUpdate.error "> error</ a > member of
3929- < var > details</ var > , if it is present, to give more
3930- information about why there are no valid shipping options for
3931- that address.
4107+ < li >
4108+ < p >
4109+ If < var > request</ var > .< a > [[\options]]</ a > .< a data-lt =
4110+ "PaymentOptions.requestShipping "> requestShipping</ a > is
4111+ true, and
4112+ < var > request</ var > .< a > [[\details]]</ a > .< a > shippingOptions</ a >
4113+ is empty, then the developer has signified that there are
4114+ no valid shipping options for the currently-chosen
4115+ shipping address (given by < var > request</ var > 's
4116+ < a data-lt =
4117+ "PaymentRequest.shippingAddress "> shippingAddress</ a > ).
4118+ </ p >
4119+ < p >
4120+ In this case, the user agent SHOULD display an error
4121+ indicating this, and MAY indicate that the
4122+ currently-chosen shipping address is invalid in some way.
4123+ The user agent SHOULD use the < a data-lt =
4124+ "PaymentDetailsUpdate.error "> error</ a > member of
4125+ < var > details</ var > , if it is present, to give more
4126+ information about why there are no valid shipping options
4127+ for that address.
4128+ </ p >
4129+ < p >
4130+ Further, if the < a data-lt =
4131+ "PaymentDetailsUpdate.shippingAddressErrors "> shippingAddressErrors</ a >
4132+ member is present, the user agent SHOULD display an error
4133+ specifically for each erroneous field of the shipping
4134+ address. This is done by matching each present member of
4135+ the < a > AddressErrorFields</ a > to a corresponding input
4136+ field in the shown user interface.
4137+ </ p >
39324138 </ li >
39334139 </ ol >
39344140 </ li >
0 commit comments