Bug 1417749 - Create a currency-amount Custom Element. r=marcosc
authorMatthew Noorenberghe <mozilla@noorenberghe.ca>
Thu, 16 Nov 2017 21:58:29 -0800
changeset 436983 84f6ddc4988255bc65b7113f6feee9a2da73981d
parent 436982 dec59488ecf18c74c22f9c6592ec10fd6a889905
child 436984 3895deba198e01a603127fbb69be8b6eed96da18
push id117
push userfmarier@mozilla.com
push dateTue, 28 Nov 2017 20:17:16 +0000
reviewersmarcosc
bugs1417749
milestone59.0a1
Bug 1417749 - Create a currency-amount Custom Element. r=marcosc MozReview-Commit-ID: 1XF7UqvhQSy
.eslintignore
toolkit/components/payments/jar.mn
toolkit/components/payments/moz.build
toolkit/components/payments/res/components/currency-amount.js
toolkit/components/payments/res/mixins/ObservedPropertiesMixin.js
toolkit/components/payments/res/paymentRequest.js
toolkit/components/payments/res/paymentRequest.xhtml
toolkit/components/payments/res/vendor/custom-elements.min.js
toolkit/components/payments/res/vendor/custom-elements.min.js.map
toolkit/components/payments/test/browser/browser_total.js
toolkit/components/payments/test/mochitest/.eslintrc.js
toolkit/components/payments/test/mochitest/mochitest.ini
toolkit/components/payments/test/mochitest/payments_common.js
toolkit/components/payments/test/mochitest/test_ObservedPropertiesMixin.html
toolkit/components/payments/test/mochitest/test_currency_amount.html
toolkit/content/license.html
--- a/.eslintignore
+++ b/.eslintignore
@@ -348,16 +348,17 @@ toolkit/components/workerloader/tests/mo
 # Tests old non-star function generators
 toolkit/modules/tests/xpcshell/test_task.js
 
 # External code:
 toolkit/components/microformats/test/**
 toolkit/components/microformats/microformat-shiv.js
 toolkit/components/reader/Readability.js
 toolkit/components/reader/JSDOMParser.js
+toolkit/components/payments/res/vendor/*
 
 # Uses preprocessing
 toolkit/content/widgets/wizard.xml
 toolkit/components/osfile/osfile.jsm
 toolkit/components/urlformatter/nsURLFormatter.js
 toolkit/modules/AppConstants.jsm
 toolkit/mozapps/downloads/nsHelperAppDlg.js
 toolkit/mozapps/update/tests/data/xpcshellConstantsPP.js
--- a/toolkit/components/payments/jar.mn
+++ b/toolkit/components/payments/jar.mn
@@ -7,8 +7,11 @@ toolkit.jar:
     content/payments/paymentDialog.css                (content/paymentDialog.css)
     content/payments/paymentDialog.js                 (content/paymentDialog.js)
     content/payments/paymentDialogFrameScript.js      (content/paymentDialogFrameScript.js)
     content/payments/paymentDialog.xhtml              (content/paymentDialog.xhtml)
 %   resource payments %res/payments/
     res/payments                                      (res/paymentRequest.*)
     res/payments/debugging.html                       (res/debugging.html)
     res/payments/debugging.js                         (res/debugging.js)
+    res/payments/components/                          (res/components/*.js)
+    res/payments/mixins/                              (res/mixins/*.js)
+    res/payments/vendor/                              (res/vendor/*)
--- a/toolkit/components/payments/moz.build
+++ b/toolkit/components/payments/moz.build
@@ -11,13 +11,15 @@ with Files('**'):
 
 EXTRA_COMPONENTS += [
     'payments.manifest',
     'paymentUIService.js',
 ]
 
 JAR_MANIFESTS += ['jar.mn']
 
+MOCHITEST_MANIFESTS += ['test/mochitest/mochitest.ini']
+
 SPHINX_TREES['docs'] = 'docs'
 
 TESTING_JS_MODULES += [
     'test/PaymentTestUtils.jsm',
 ]
new file mode 100644
--- /dev/null
+++ b/toolkit/components/payments/res/components/currency-amount.js
@@ -0,0 +1,37 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * 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/. */
+
+/**
+ * <currency-amount value="7.5" currency="USD"></currency-amount>
+ */
+
+/* global ObservedPropertiesMixin */
+
+class CurrencyAmount extends ObservedPropertiesMixin(HTMLElement) {
+  static get observedAttributes() {
+    return ["currency", "value"];
+  }
+
+  render() {
+    let output = "";
+    try {
+      if (this.value && this.currency) {
+        let number = Number.parseFloat(this.value);
+        if (Number.isNaN(number) || !Number.isFinite(number)) {
+          throw new RangeError("currency-amount value must be a finite number");
+        }
+        const formatter = new Intl.NumberFormat(navigator.languages, {
+          style: "currency",
+          currency: this.currency,
+          currencyDisplay: "symbol",
+        });
+        output = formatter.format(this.value);
+      }
+    } finally {
+      this.textContent = output;
+    }
+  }
+}
+
+customElements.define("currency-amount", CurrencyAmount);
new file mode 100644
--- /dev/null
+++ b/toolkit/components/payments/res/mixins/ObservedPropertiesMixin.js
@@ -0,0 +1,66 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * 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/. */
+
+/**
+ * Define getters and setters for observedAttributes converted to camelCase and
+ * trigger a batched aynchronous call to `render` upon observed
+ * attribute/property changes.
+ */
+
+/* exported ObservedPropertiesMixin */
+
+function ObservedPropertiesMixin(superClass) {
+  return class ObservedProperties extends superClass {
+    constructor() {
+      super();
+
+      this._observedPropertiesMixin = {
+        pendingRender: false,
+      };
+
+      // Reflect property changes for `observedAttributes` to attributes.
+      for (let name of (this.constructor.observedAttributes || [])) {
+        if (name in this) {
+          // Don't overwrite existing properties.
+          continue;
+        }
+        // Convert attribute names from kebab-case to camelCase properties
+        Object.defineProperty(this, name.replace(/-([a-z])/g, ($0, $1) => $1.toUpperCase()), {
+          configurable: true,
+          get() {
+            return this.getAttribute(name);
+          },
+          set(value) {
+            if (value === null || value === undefined) {
+              this.removeAttribute(name);
+            } else {
+              this.setAttribute(name, value);
+            }
+          },
+        });
+      }
+    }
+
+    async _invalidateFromObservedPropertiesMixin() {
+      if (this._observedPropertiesMixin.pendingRender) {
+        return;
+      }
+
+      this._observedPropertiesMixin.pendingRender = true;
+      await Promise.resolve();
+      try {
+        this.render();
+      } finally {
+        this._observedPropertiesMixin.pendingRender = false;
+      }
+    }
+
+    attributeChangedCallback(attr, oldValue, newValue) {
+      if (oldValue === newValue) {
+        return;
+      }
+      this._invalidateFromObservedPropertiesMixin();
+    }
+  };
+}
--- a/toolkit/components/payments/res/paymentRequest.js
+++ b/toolkit/components/payments/res/paymentRequest.js
@@ -99,18 +99,19 @@ let PaymentRequest = {
     // Handle getting called before the DOM is ready.
     await this.domReadyPromise;
 
     let hostNameEl = document.getElementById("host-name");
     hostNameEl.textContent = this.request.topLevelPrincipal.URI.displayHost;
 
     let totalItem = this.request.paymentDetails.totalItem;
     let totalEl = document.getElementById("total");
-    totalEl.querySelector(".value").textContent = totalItem.amount.value;
-    totalEl.querySelector(".currency").textContent = totalItem.amount.currency;
+    let currencyEl = totalEl.querySelector("currency-amount");
+    currencyEl.value = totalItem.amount.value;
+    currencyEl.currency = totalItem.amount.currency;
     totalEl.querySelector(".label").textContent = totalItem.label;
   },
 
   onCancel() {
     this.sendMessageToChrome("paymentCancel");
   },
 
   onPaymentRequestUnload() {
--- a/toolkit/components/payments/res/paymentRequest.xhtml
+++ b/toolkit/components/payments/res/paymentRequest.xhtml
@@ -3,24 +3,26 @@
    - 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/. -->
 <!DOCTYPE html>
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
   <meta http-equiv="Content-Security-Policy" content="default-src 'self'"/>
   <title></title>
   <link rel="stylesheet" href="paymentRequest.css"/>
+  <script src="vendor/custom-elements.min.js"></script>
+  <script src="mixins/ObservedPropertiesMixin.js"></script>
+  <script src="components/currency-amount.js"></script>
   <script src="paymentRequest.js"></script>
 </head>
 <body>
   <iframe id="debugging-console" hidden="hidden" src="debugging.html"></iframe>
   <div id="host-name"></div>
 
   <div id="total">
     <h2 class="label"></h2>
-    <span class="value"></span>
-    <span class="currency"></span>
+    <currency-amount></currency-amount>
   </div>
   <div id="controls-container">
     <button id="cancel">Cancel payment</button>
   </div>
 </body>
 </html>
new file mode 100644
--- /dev/null
+++ b/toolkit/components/payments/res/vendor/custom-elements.min.js
@@ -0,0 +1,37 @@
+(function(){
+'use strict';var h=new function(){};var aa=new Set("annotation-xml color-profile font-face font-face-src font-face-uri font-face-format font-face-name missing-glyph".split(" "));function n(b){var a=aa.has(b);b=/^[a-z][.0-9_a-z]*-[\-.0-9_a-z]*$/.test(b);return!a&&b}function p(b){var a=b.isConnected;if(void 0!==a)return a;for(;b&&!(b.__CE_isImportDocument||b instanceof Document);)b=b.parentNode||(window.ShadowRoot&&b instanceof ShadowRoot?b.host:void 0);return!(!b||!(b.__CE_isImportDocument||b instanceof Document))}
+function q(b,a){for(;a&&a!==b&&!a.nextSibling;)a=a.parentNode;return a&&a!==b?a.nextSibling:null}
+function t(b,a,c){c=c?c:new Set;for(var d=b;d;){if(d.nodeType===Node.ELEMENT_NODE){var e=d;a(e);var f=e.localName;if("link"===f&&"import"===e.getAttribute("rel")){d=e.import;if(d instanceof Node&&!c.has(d))for(c.add(d),d=d.firstChild;d;d=d.nextSibling)t(d,a,c);d=q(b,e);continue}else if("template"===f){d=q(b,e);continue}if(e=e.__CE_shadowRoot)for(e=e.firstChild;e;e=e.nextSibling)t(e,a,c)}d=d.firstChild?d.firstChild:q(b,d)}}function u(b,a,c){b[a]=c};function v(){this.a=new Map;this.o=new Map;this.f=[];this.b=!1}function ba(b,a,c){b.a.set(a,c);b.o.set(c.constructor,c)}function w(b,a){b.b=!0;b.f.push(a)}function x(b,a){b.b&&t(a,function(a){return y(b,a)})}function y(b,a){if(b.b&&!a.__CE_patched){a.__CE_patched=!0;for(var c=0;c<b.f.length;c++)b.f[c](a)}}function z(b,a){var c=[];t(a,function(b){return c.push(b)});for(a=0;a<c.length;a++){var d=c[a];1===d.__CE_state?b.connectedCallback(d):A(b,d)}}
+function B(b,a){var c=[];t(a,function(b){return c.push(b)});for(a=0;a<c.length;a++){var d=c[a];1===d.__CE_state&&b.disconnectedCallback(d)}}
+function C(b,a,c){c=c?c:{};var d=c.w||new Set,e=c.s||function(a){return A(b,a)},f=[];t(a,function(a){if("link"===a.localName&&"import"===a.getAttribute("rel")){var c=a.import;c instanceof Node&&"complete"===c.readyState?(c.__CE_isImportDocument=!0,c.__CE_hasRegistry=!0):a.addEventListener("load",function(){var c=a.import;if(!c.__CE_documentLoadHandled){c.__CE_documentLoadHandled=!0;c.__CE_isImportDocument=!0;c.__CE_hasRegistry=!0;var f=new Set(d);f.delete(c);C(b,c,{w:f,s:e})}})}else f.push(a)},d);
+if(b.b)for(a=0;a<f.length;a++)y(b,f[a]);for(a=0;a<f.length;a++)e(f[a])}
+function A(b,a){if(void 0===a.__CE_state){var c=b.a.get(a.localName);if(c){c.constructionStack.push(a);var d=c.constructor;try{try{if(new d!==a)throw Error("The custom element constructor did not produce the element being upgraded.");}finally{c.constructionStack.pop()}}catch(m){throw a.__CE_state=2,m;}a.__CE_state=1;a.__CE_definition=c;if(c.attributeChangedCallback)for(c=c.observedAttributes,d=0;d<c.length;d++){var e=c[d],f=a.getAttribute(e);null!==f&&b.attributeChangedCallback(a,e,null,f,null)}p(a)&&
+b.connectedCallback(a)}}}v.prototype.connectedCallback=function(b){var a=b.__CE_definition;a.connectedCallback&&a.connectedCallback.call(b)};v.prototype.disconnectedCallback=function(b){var a=b.__CE_definition;a.disconnectedCallback&&a.disconnectedCallback.call(b)};v.prototype.attributeChangedCallback=function(b,a,c,d,e){var f=b.__CE_definition;f.attributeChangedCallback&&-1<f.observedAttributes.indexOf(a)&&f.attributeChangedCallback.call(b,a,c,d,e)};function D(b,a){this.c=b;this.a=a;this.b=void 0;C(this.c,this.a);"loading"===this.a.readyState&&(this.b=new MutationObserver(this.f.bind(this)),this.b.observe(this.a,{childList:!0,subtree:!0}))}function E(b){b.b&&b.b.disconnect()}D.prototype.f=function(b){var a=this.a.readyState;"interactive"!==a&&"complete"!==a||E(this);for(a=0;a<b.length;a++)for(var c=b[a].addedNodes,d=0;d<c.length;d++)C(this.c,c[d])};function ca(){var b=this;this.b=this.a=void 0;this.f=new Promise(function(a){b.b=a;b.a&&a(b.a)})}function F(b){if(b.a)throw Error("Already resolved.");b.a=void 0;b.b&&b.b(void 0)};function G(b){this.i=!1;this.c=b;this.m=new Map;this.j=function(b){return b()};this.g=!1;this.l=[];this.u=new D(b,document)}
+G.prototype.define=function(b,a){var c=this;if(!(a instanceof Function))throw new TypeError("Custom element constructors must be functions.");if(!n(b))throw new SyntaxError("The element name '"+b+"' is not valid.");if(this.c.a.get(b))throw Error("A custom element with name '"+b+"' has already been defined.");if(this.i)throw Error("A custom element is already being defined.");this.i=!0;var d,e,f,m,l;try{var g=function(b){var a=k[b];if(void 0!==a&&!(a instanceof Function))throw Error("The '"+b+"' callback must be a function.");
+return a},k=a.prototype;if(!(k instanceof Object))throw new TypeError("The custom element constructor's prototype is not an object.");d=g("connectedCallback");e=g("disconnectedCallback");f=g("adoptedCallback");m=g("attributeChangedCallback");l=a.observedAttributes||[]}catch(r){return}finally{this.i=!1}a={localName:b,constructor:a,connectedCallback:d,disconnectedCallback:e,adoptedCallback:f,attributeChangedCallback:m,observedAttributes:l,constructionStack:[]};ba(this.c,b,a);this.l.push(a);this.g||
+(this.g=!0,this.j(function(){return da(c)}))};function da(b){if(!1!==b.g){b.g=!1;for(var a=b.l,c=[],d=new Map,e=0;e<a.length;e++)d.set(a[e].localName,[]);C(b.c,document,{s:function(a){if(void 0===a.__CE_state){var e=a.localName,f=d.get(e);f?f.push(a):b.c.a.get(e)&&c.push(a)}}});for(e=0;e<c.length;e++)A(b.c,c[e]);for(;0<a.length;){for(var f=a.shift(),e=f.localName,f=d.get(f.localName),m=0;m<f.length;m++)A(b.c,f[m]);(e=b.m.get(e))&&F(e)}}}G.prototype.get=function(b){if(b=this.c.a.get(b))return b.constructor};
+G.prototype.whenDefined=function(b){if(!n(b))return Promise.reject(new SyntaxError("'"+b+"' is not a valid custom element name."));var a=this.m.get(b);if(a)return a.f;a=new ca;this.m.set(b,a);this.c.a.get(b)&&!this.l.some(function(a){return a.localName===b})&&F(a);return a.f};G.prototype.v=function(b){E(this.u);var a=this.j;this.j=function(c){return b(function(){return a(c)})}};window.CustomElementRegistry=G;G.prototype.define=G.prototype.define;G.prototype.get=G.prototype.get;
+G.prototype.whenDefined=G.prototype.whenDefined;G.prototype.polyfillWrapFlushCallback=G.prototype.v;var H=window.Document.prototype.createElement,ea=window.Document.prototype.createElementNS,fa=window.Document.prototype.importNode,ga=window.Document.prototype.prepend,ha=window.Document.prototype.append,ia=window.DocumentFragment.prototype.prepend,ja=window.DocumentFragment.prototype.append,I=window.Node.prototype.cloneNode,J=window.Node.prototype.appendChild,K=window.Node.prototype.insertBefore,L=window.Node.prototype.removeChild,M=window.Node.prototype.replaceChild,N=Object.getOwnPropertyDescriptor(window.Node.prototype,
+"textContent"),O=window.Element.prototype.attachShadow,P=Object.getOwnPropertyDescriptor(window.Element.prototype,"innerHTML"),Q=window.Element.prototype.getAttribute,R=window.Element.prototype.setAttribute,S=window.Element.prototype.removeAttribute,T=window.Element.prototype.getAttributeNS,U=window.Element.prototype.setAttributeNS,ka=window.Element.prototype.removeAttributeNS,la=window.Element.prototype.insertAdjacentElement,ma=window.Element.prototype.prepend,na=window.Element.prototype.append,
+V=window.Element.prototype.before,oa=window.Element.prototype.after,pa=window.Element.prototype.replaceWith,qa=window.Element.prototype.remove,ra=window.HTMLElement,W=Object.getOwnPropertyDescriptor(window.HTMLElement.prototype,"innerHTML"),sa=window.HTMLElement.prototype.insertAdjacentElement;function ta(){var b=X;window.HTMLElement=function(){function a(){var a=this.constructor,d=b.o.get(a);if(!d)throw Error("The custom element being constructed was not registered with `customElements`.");var e=d.constructionStack;if(!e.length)return e=H.call(document,d.localName),Object.setPrototypeOf(e,a.prototype),e.__CE_state=1,e.__CE_definition=d,y(b,e),e;var d=e.length-1,f=e[d];if(f===h)throw Error("The HTMLElement constructor was either called reentrantly for this constructor or called multiple times.");
+e[d]=h;Object.setPrototypeOf(f,a.prototype);y(b,f);return f}a.prototype=ra.prototype;return a}()};function Y(b,a,c){function d(a){return function(d){for(var c=[],e=0;e<arguments.length;++e)c[e-0]=arguments[e];for(var e=[],f=[],k=0;k<c.length;k++){var r=c[k];r instanceof Element&&p(r)&&f.push(r);if(r instanceof DocumentFragment)for(r=r.firstChild;r;r=r.nextSibling)e.push(r);else e.push(r)}a.apply(this,c);for(c=0;c<f.length;c++)B(b,f[c]);if(p(this))for(c=0;c<e.length;c++)f=e[c],f instanceof Element&&z(b,f)}}c.h&&(a.prepend=d(c.h));c.append&&(a.append=d(c.append))};function ua(){var b=X;u(Document.prototype,"createElement",function(a){if(this.__CE_hasRegistry){var c=b.a.get(a);if(c)return new c.constructor}a=H.call(this,a);y(b,a);return a});u(Document.prototype,"importNode",function(a,c){a=fa.call(this,a,c);this.__CE_hasRegistry?C(b,a):x(b,a);return a});u(Document.prototype,"createElementNS",function(a,c){if(this.__CE_hasRegistry&&(null===a||"http://www.w3.org/1999/xhtml"===a)){var d=b.a.get(c);if(d)return new d.constructor}a=ea.call(this,a,c);y(b,a);return a});
+Y(b,Document.prototype,{h:ga,append:ha})};function va(){var b=X;function a(a,d){Object.defineProperty(a,"textContent",{enumerable:d.enumerable,configurable:!0,get:d.get,set:function(a){if(this.nodeType===Node.TEXT_NODE)d.set.call(this,a);else{var c=void 0;if(this.firstChild){var e=this.childNodes,l=e.length;if(0<l&&p(this))for(var c=Array(l),g=0;g<l;g++)c[g]=e[g]}d.set.call(this,a);if(c)for(a=0;a<c.length;a++)B(b,c[a])}}})}u(Node.prototype,"insertBefore",function(a,d){if(a instanceof DocumentFragment){var c=Array.prototype.slice.apply(a.childNodes);
+a=K.call(this,a,d);if(p(this))for(d=0;d<c.length;d++)z(b,c[d]);return a}c=p(a);d=K.call(this,a,d);c&&B(b,a);p(this)&&z(b,a);return d});u(Node.prototype,"appendChild",function(a){if(a instanceof DocumentFragment){var d=Array.prototype.slice.apply(a.childNodes);a=J.call(this,a);if(p(this))for(var c=0;c<d.length;c++)z(b,d[c]);return a}d=p(a);c=J.call(this,a);d&&B(b,a);p(this)&&z(b,a);return c});u(Node.prototype,"cloneNode",function(a){a=I.call(this,a);this.ownerDocument.__CE_hasRegistry?C(b,a):x(b,a);
+return a});u(Node.prototype,"removeChild",function(a){var d=p(a),c=L.call(this,a);d&&B(b,a);return c});u(Node.prototype,"replaceChild",function(a,d){if(a instanceof DocumentFragment){var c=Array.prototype.slice.apply(a.childNodes);a=M.call(this,a,d);if(p(this))for(B(b,d),d=0;d<c.length;d++)z(b,c[d]);return a}var c=p(a),f=M.call(this,a,d),m=p(this);m&&B(b,d);c&&B(b,a);m&&z(b,a);return f});N&&N.get?a(Node.prototype,N):w(b,function(b){a(b,{enumerable:!0,configurable:!0,get:function(){for(var a=[],b=
+0;b<this.childNodes.length;b++)a.push(this.childNodes[b].textContent);return a.join("")},set:function(a){for(;this.firstChild;)L.call(this,this.firstChild);J.call(this,document.createTextNode(a))}})})};function wa(b){var a=Element.prototype;function c(a){return function(d){for(var c=[],e=0;e<arguments.length;++e)c[e-0]=arguments[e];for(var e=[],l=[],g=0;g<c.length;g++){var k=c[g];k instanceof Element&&p(k)&&l.push(k);if(k instanceof DocumentFragment)for(k=k.firstChild;k;k=k.nextSibling)e.push(k);else e.push(k)}a.apply(this,c);for(c=0;c<l.length;c++)B(b,l[c]);if(p(this))for(c=0;c<e.length;c++)l=e[c],l instanceof Element&&z(b,l)}}V&&(a.before=c(V));V&&(a.after=c(oa));pa&&u(a,"replaceWith",function(a){for(var c=
+[],d=0;d<arguments.length;++d)c[d-0]=arguments[d];for(var d=[],m=[],l=0;l<c.length;l++){var g=c[l];g instanceof Element&&p(g)&&m.push(g);if(g instanceof DocumentFragment)for(g=g.firstChild;g;g=g.nextSibling)d.push(g);else d.push(g)}l=p(this);pa.apply(this,c);for(c=0;c<m.length;c++)B(b,m[c]);if(l)for(B(b,this),c=0;c<d.length;c++)m=d[c],m instanceof Element&&z(b,m)});qa&&u(a,"remove",function(){var a=p(this);qa.call(this);a&&B(b,this)})};function xa(){var b=X;function a(a,c){Object.defineProperty(a,"innerHTML",{enumerable:c.enumerable,configurable:!0,get:c.get,set:function(a){var d=this,e=void 0;p(this)&&(e=[],t(this,function(a){a!==d&&e.push(a)}));c.set.call(this,a);if(e)for(var f=0;f<e.length;f++){var k=e[f];1===k.__CE_state&&b.disconnectedCallback(k)}this.ownerDocument.__CE_hasRegistry?C(b,this):x(b,this);return a}})}function c(a,c){u(a,"insertAdjacentElement",function(a,d){var e=p(d);a=c.call(this,a,d);e&&B(b,d);p(a)&&z(b,d);
+return a})}O&&u(Element.prototype,"attachShadow",function(a){return this.__CE_shadowRoot=a=O.call(this,a)});P&&P.get?a(Element.prototype,P):W&&W.get?a(HTMLElement.prototype,W):w(b,function(b){a(b,{enumerable:!0,configurable:!0,get:function(){return I.call(this,!0).innerHTML},set:function(a){var b="template"===this.localName,c=b?this.content:this,d=H.call(document,this.localName);for(d.innerHTML=a;0<c.childNodes.length;)L.call(c,c.childNodes[0]);for(a=b?d.content:d;0<a.childNodes.length;)J.call(c,
+a.childNodes[0])}})});u(Element.prototype,"setAttribute",function(a,c){if(1!==this.__CE_state)return R.call(this,a,c);var d=Q.call(this,a);R.call(this,a,c);c=Q.call(this,a);b.attributeChangedCallback(this,a,d,c,null)});u(Element.prototype,"setAttributeNS",function(a,c,f){if(1!==this.__CE_state)return U.call(this,a,c,f);var d=T.call(this,a,c);U.call(this,a,c,f);f=T.call(this,a,c);b.attributeChangedCallback(this,c,d,f,a)});u(Element.prototype,"removeAttribute",function(a){if(1!==this.__CE_state)return S.call(this,
+a);var c=Q.call(this,a);S.call(this,a);null!==c&&b.attributeChangedCallback(this,a,c,null,null)});u(Element.prototype,"removeAttributeNS",function(a,c){if(1!==this.__CE_state)return ka.call(this,a,c);var d=T.call(this,a,c);ka.call(this,a,c);var e=T.call(this,a,c);d!==e&&b.attributeChangedCallback(this,c,d,e,a)});sa?c(HTMLElement.prototype,sa):la?c(Element.prototype,la):console.warn("Custom Elements: `Element#insertAdjacentElement` was not patched.");Y(b,Element.prototype,{h:ma,append:na});wa(b)};/*
+
+ Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
+ This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ Code distributed by Google as part of the polymer project is also
+ subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+var Z=window.customElements;if(!Z||Z.forcePolyfill||"function"!=typeof Z.define||"function"!=typeof Z.get){var X=new v;ta();ua();Y(X,DocumentFragment.prototype,{h:ia,append:ja});va();xa();document.__CE_hasRegistry=!0;var customElements=new G(X);Object.defineProperty(window,"customElements",{configurable:!0,enumerable:!0,value:customElements})};
+}).call(self);
+
+//# sourceMappingURL=custom-elements.min.js.map
new file mode 100644
--- /dev/null
+++ b/toolkit/components/payments/res/vendor/custom-elements.min.js.map
@@ -0,0 +1,1 @@
+{"version":3,"sources":["src/AlreadyConstructedMarker.js","src/Utilities.js","src/CustomElementInternals.js","src/CustomElementState.js","src/DocumentConstructionObserver.js","src/Deferred.js","src/CustomElementRegistry.js","src/Patch/Native.js","src/Patch/HTMLElement.js","src/custom-elements.js","src/Patch/Interface/ParentNode.js","src/Patch/Document.js","src/Patch/Node.js","src/Patch/Interface/ChildNode.js","src/Patch/Element.js","src/Patch/DocumentFragment.js"],"names":["$jscompDefaultExport","AlreadyConstructedMarker","reservedTagList","Set","isValidCustomElementName$$module$$src$Utilities","isValidCustomElementName","localName","reserved","has","validForm","test","isConnected$$module$$src$Utilities","isConnected","node","nativeValue","undefined","current","__CE_isImportDocument","Document","parentNode","window","ShadowRoot","host","nextSiblingOrAncestorSibling$$module$$src$Utilities","nextSiblingOrAncestorSibling","root","start","nextSibling","walkDeepDescendantElements$$module$$src$Utilities","walkDeepDescendantElements","callback","visitedImports","nodeType","Node","ELEMENT_NODE","element","getAttribute","importNode","import","add","child","firstChild","shadowRoot","__CE_shadowRoot","setPropertyUnchecked$$module$$src$Utilities","setPropertyUnchecked","destination","name","value","constructor","CustomElementInternals","_localNameToDefinition","Map","_constructorToDefinition","_patches","_hasPatches","setDefinition","definition","set","addPatch","listener","push","patchTree","patch","__CE_patched","i","length","connectTree","elements","custom","__CE_state","connectedCallback","upgradeElement","disconnectTree","disconnectedCallback","patchAndUpgradeTree","options","upgrade","gatherElements","readyState","__CE_hasRegistry","addEventListener","__CE_documentLoadHandled","clonedVisitedImports","delete","localNameToDefinition","get","constructionStack","result","Error","pop","e","failed","__CE_definition","attributeChangedCallback","observedAttributes","call","oldValue","newValue","namespace","indexOf","DocumentConstructionObserver","internals","doc","_internals","_document","_observer","MutationObserver","_handleMutations","bind","observe","childList","subtree","disconnect","mutations","addedNodes","j","Deferred","_resolve","_value","_promise","Promise","resolve","CustomElementRegistry","_elementDefinitionIsRunning","_whenDefinedDeferred","_flushCallback","this._flushCallback","fn","_flushPending","_pendingDefinitions","_documentConstructionObserver","document","define","Function","TypeError","SyntaxError","adoptedCallback","getCallback","callbackValue","prototype","Object","_flush","pendingDefinitions","elementsWithStableDefinitions","elementsWithPendingDefinitions","pendingElements","shift","pendingUpgradableElements","deferred","whenDefined","reject","prior","some","d","polyfillWrapFlushCallback","outer","inner","flush","Document_createElement","createElement","Document_createElementNS","createElementNS","Document_importNode","Document_prepend","Document_append","DocumentFragment_prepend","DocumentFragment","DocumentFragment_append","Node_cloneNode","cloneNode","Node_appendChild","appendChild","Node_insertBefore","insertBefore","Node_removeChild","removeChild","Node_replaceChild","replaceChild","Node_textContent","getOwnPropertyDescriptor","Element_attachShadow","Element","Element_innerHTML","Element_getAttribute","Element_setAttribute","setAttribute","Element_removeAttribute","removeAttribute","Element_getAttributeNS","getAttributeNS","Element_setAttributeNS","setAttributeNS","Element_removeAttributeNS","removeAttributeNS","Element_insertAdjacentElement","Element_prepend","Element_append","Element_before","Element_after","Element_replaceWith","Element_remove","HTMLElement","HTMLElement_innerHTML","HTMLElement_insertAdjacentElement","$jscompDefaultExport$$module$$src$Patch$HTMLElement","$jscompDefaultExport$$module$$src$Patch$Native.Document_createElement.call","setPrototypeOf","lastIndex","$jscompDefaultExport$$module$$src$Patch$Native.HTMLElement","$jscompDefaultExport$$module$$src$Patch$Interface$ParentNode","builtIn","appendPrependPatch","builtInMethod","flattenedNodes","connectedElements","nodes","apply","prepend","append","$jscompDefaultExport$$module$$src$Patch$Document","deep","clone","$jscompDefaultExport$$module$$src$Patch$Native.Document_importNode.call","NS_HTML","$jscompDefaultExport$$module$$src$Patch$Native.Document_createElementNS.call","$jscompDefaultExport$$module$$src$Patch$Native.Document_prepend","$jscompDefaultExport$$module$$src$Patch$Native.Document_append","$jscompDefaultExport$$module$$src$Patch$Node","patch_textContent","baseDescriptor","defineProperty","enumerable","configurable","assignedValue","TEXT_NODE","removedNodes","childNodes","childNodesLength","Array","refNode","insertedNodes","slice","nativeResult","$jscompDefaultExport$$module$$src$Patch$Native.Node_insertBefore.call","nodeWasConnected","$jscompDefaultExport$$module$$src$Patch$Native.Node_appendChild.call","$jscompDefaultExport$$module$$src$Patch$Native.Node_cloneNode.call","ownerDocument","$jscompDefaultExport$$module$$src$Patch$Native.Node_removeChild.call","nodeToInsert","nodeToRemove","$jscompDefaultExport$$module$$src$Patch$Native.Node_replaceChild.call","nodeToInsertWasConnected","thisIsConnected","$jscompDefaultExport$$module$$src$Patch$Native.Node_textContent","$jscompDefaultExport$$module$$src$Patch$Native.Node_textContent.get","parts","textContent","join","createTextNode","$jscompDefaultExport$$module$$src$Patch$Interface$ChildNode","beforeAfterPatch","$jscompDefaultExport$$module$$src$Patch$Native.Element_before","$jscompDefaultExport$$module$$src$Patch$Native.Element_after","$jscompDefaultExport$$module$$src$Patch$Native.Element_replaceWith","wasConnected","$jscompDefaultExport$$module$$src$Patch$Native.Element_remove","$jscompDefaultExport$$module$$src$Patch$Element","patch_innerHTML","htmlString","removedElements","patch_insertAdjacentElement","baseMethod","where","insertedElement","$jscompDefaultExport$$module$$src$Patch$Native.Element_attachShadow","init","$jscompDefaultExport$$module$$src$Patch$Native.Element_attachShadow.call","$jscompDefaultExport$$module$$src$Patch$Native.Element_innerHTML","$jscompDefaultExport$$module$$src$Patch$Native.Element_innerHTML.get","$jscompDefaultExport$$module$$src$Patch$Native.HTMLElement_innerHTML","$jscompDefaultExport$$module$$src$Patch$Native.HTMLElement_innerHTML.get","innerHTML","isTemplate","content","rawElement","container","$jscompDefaultExport$$module$$src$Patch$Native.Element_setAttribute.call","$jscompDefaultExport$$module$$src$Patch$Native.Element_getAttribute.call","$jscompDefaultExport$$module$$src$Patch$Native.Element_setAttributeNS.call","$jscompDefaultExport$$module$$src$Patch$Native.Element_getAttributeNS.call","$jscompDefaultExport$$module$$src$Patch$Native.Element_removeAttribute.call","$jscompDefaultExport$$module$$src$Patch$Native.Element_removeAttributeNS.call","$jscompDefaultExport$$module$$src$Patch$Native.HTMLElement_insertAdjacentElement","$jscompDefaultExport$$module$$src$Patch$Native.Element_insertAdjacentElement","console","warn","$jscompDefaultExport$$module$$src$Patch$Native.Element_prepend","$jscompDefaultExport$$module$$src$Patch$Native.Element_append","priorCustomElements","$jscompDefaultExport$$module$$src$Patch$Native.DocumentFragment_prepend","$jscompDefaultExport$$module$$src$Patch$Native.DocumentFragment_append","customElements"],"mappings":"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","file":"custom-elements.min.js","sourcesContent":["/**\n * This class exists only to work around Closure's lack of a way to describe\n * singletons. It represents the 'already constructed marker' used in custom\n * element construction stacks.\n *\n * https://html.spec.whatwg.org/#concept-already-constructed-marker\n */\nclass AlreadyConstructedMarker {}\n\nexport default new AlreadyConstructedMarker();\n","const reservedTagList = new Set([\n  'annotation-xml',\n  'color-profile',\n  'font-face',\n  'font-face-src',\n  'font-face-uri',\n  'font-face-format',\n  'font-face-name',\n  'missing-glyph',\n]);\n\n/**\n * @param {string} localName\n * @returns {boolean}\n */\nexport function isValidCustomElementName(localName) {\n  const reserved = reservedTagList.has(localName);\n  const validForm = /^[a-z][.0-9_a-z]*-[\\-.0-9_a-z]*$/.test(localName);\n  return !reserved && validForm;\n}\n\n/**\n * @private\n * @param {!Node} node\n * @return {boolean}\n */\nexport function isConnected(node) {\n  // Use `Node#isConnected`, if defined.\n  const nativeValue = node.isConnected;\n  if (nativeValue !== undefined) {\n    return nativeValue;\n  }\n\n  /** @type {?Node|undefined} */\n  let current = node;\n  while (current && !(current.__CE_isImportDocument || current instanceof Document)) {\n    current = current.parentNode || (window.ShadowRoot && current instanceof ShadowRoot ? current.host : undefined);\n  }\n  return !!(current && (current.__CE_isImportDocument || current instanceof Document));\n}\n\n/**\n * @param {!Node} root\n * @param {!Node} start\n * @return {?Node}\n */\nfunction nextSiblingOrAncestorSibling(root, start) {\n  let node = start;\n  while (node && node !== root && !node.nextSibling) {\n    node = node.parentNode;\n  }\n  return (!node || node === root) ? null : node.nextSibling;\n}\n\n/**\n * @param {!Node} root\n * @param {!Node} start\n * @return {?Node}\n */\nfunction nextNode(root, start) {\n  return start.firstChild ? start.firstChild : nextSiblingOrAncestorSibling(root, start);\n}\n\n/**\n * @param {!Node} root\n * @param {!function(!Element)} callback\n * @param {!Set<Node>=} visitedImports\n */\nexport function walkDeepDescendantElements(root, callback, visitedImports = new Set()) {\n  let node = root;\n  while (node) {\n    if (node.nodeType === Node.ELEMENT_NODE) {\n      const element = /** @type {!Element} */(node);\n\n      callback(element);\n\n      const localName = element.localName;\n      if (localName === 'link' && element.getAttribute('rel') === 'import') {\n        // If this import (polyfilled or not) has it's root node available,\n        // walk it.\n        const importNode = /** @type {!Node} */ (element.import);\n        if (importNode instanceof Node && !visitedImports.has(importNode)) {\n          // Prevent multiple walks of the same import root.\n          visitedImports.add(importNode);\n\n          for (let child = importNode.firstChild; child; child = child.nextSibling) {\n            walkDeepDescendantElements(child, callback, visitedImports);\n          }\n        }\n\n        // Ignore descendants of import links to prevent attempting to walk the\n        // elements created by the HTML Imports polyfill that we just walked\n        // above.\n        node = nextSiblingOrAncestorSibling(root, element);\n        continue;\n      } else if (localName === 'template') {\n        // Ignore descendants of templates. There shouldn't be any descendants\n        // because they will be moved into `.content` during construction in\n        // browsers that support template but, in case they exist and are still\n        // waiting to be moved by a polyfill, they will be ignored.\n        node = nextSiblingOrAncestorSibling(root, element);\n        continue;\n      }\n\n      // Walk shadow roots.\n      const shadowRoot = element.__CE_shadowRoot;\n      if (shadowRoot) {\n        for (let child = shadowRoot.firstChild; child; child = child.nextSibling) {\n          walkDeepDescendantElements(child, callback, visitedImports);\n        }\n      }\n    }\n\n    node = nextNode(root, node);\n  }\n}\n\n/**\n * Used to suppress Closure's \"Modifying the prototype is only allowed if the\n * constructor is in the same scope\" warning without using\n * `@suppress {newCheckTypes, duplicate}` because `newCheckTypes` is too broad.\n *\n * @param {!Object} destination\n * @param {string} name\n * @param {*} value\n */\nexport function setPropertyUnchecked(destination, name, value) {\n  destination[name] = value;\n}\n","import * as Utilities from './Utilities.js';\nimport CEState from './CustomElementState.js';\n\nexport default class CustomElementInternals {\n  constructor() {\n    /** @type {!Map<string, !CustomElementDefinition>} */\n    this._localNameToDefinition = new Map();\n\n    /** @type {!Map<!Function, !CustomElementDefinition>} */\n    this._constructorToDefinition = new Map();\n\n    /** @type {!Array<!function(!Node)>} */\n    this._patches = [];\n\n    /** @type {boolean} */\n    this._hasPatches = false;\n  }\n\n  /**\n   * @param {string} localName\n   * @param {!CustomElementDefinition} definition\n   */\n  setDefinition(localName, definition) {\n    this._localNameToDefinition.set(localName, definition);\n    this._constructorToDefinition.set(definition.constructor, definition);\n  }\n\n  /**\n   * @param {string} localName\n   * @return {!CustomElementDefinition|undefined}\n   */\n  localNameToDefinition(localName) {\n    return this._localNameToDefinition.get(localName);\n  }\n\n  /**\n   * @param {!Function} constructor\n   * @return {!CustomElementDefinition|undefined}\n   */\n  constructorToDefinition(constructor) {\n    return this._constructorToDefinition.get(constructor);\n  }\n\n  /**\n   * @param {!function(!Node)} listener\n   */\n  addPatch(listener) {\n    this._hasPatches = true;\n    this._patches.push(listener);\n  }\n\n  /**\n   * @param {!Node} node\n   */\n  patchTree(node) {\n    if (!this._hasPatches) return;\n\n    Utilities.walkDeepDescendantElements(node, element => this.patch(element));\n  }\n\n  /**\n   * @param {!Node} node\n   */\n  patch(node) {\n    if (!this._hasPatches) return;\n\n    if (node.__CE_patched) return;\n    node.__CE_patched = true;\n\n    for (let i = 0; i < this._patches.length; i++) {\n      this._patches[i](node);\n    }\n  }\n\n  /**\n   * @param {!Node} root\n   */\n  connectTree(root) {\n    const elements = [];\n\n    Utilities.walkDeepDescendantElements(root, element => elements.push(element));\n\n    for (let i = 0; i < elements.length; i++) {\n      const element = elements[i];\n      if (element.__CE_state === CEState.custom) {\n        this.connectedCallback(element);\n      } else {\n        this.upgradeElement(element);\n      }\n    }\n  }\n\n  /**\n   * @param {!Node} root\n   */\n  disconnectTree(root) {\n    const elements = [];\n\n    Utilities.walkDeepDescendantElements(root, element => elements.push(element));\n\n    for (let i = 0; i < elements.length; i++) {\n      const element = elements[i];\n      if (element.__CE_state === CEState.custom) {\n        this.disconnectedCallback(element);\n      }\n    }\n  }\n\n  /**\n   * Upgrades all uncustomized custom elements at and below a root node for\n   * which there is a definition. When custom element reaction callbacks are\n   * assumed to be called synchronously (which, by the current DOM / HTML spec\n   * definitions, they are *not*), callbacks for both elements customized\n   * synchronously by the parser and elements being upgraded occur in the same\n   * relative order.\n   *\n   * NOTE: This function, when used to simulate the construction of a tree that\n   * is already created but not customized (i.e. by the parser), does *not*\n   * prevent the element from reading the 'final' (true) state of the tree. For\n   * example, the element, during truly synchronous parsing / construction would\n   * see that it contains no children as they have not yet been inserted.\n   * However, this function does not modify the tree, the element will\n   * (incorrectly) have children. Additionally, self-modification restrictions\n   * for custom element constructors imposed by the DOM spec are *not* enforced.\n   *\n   *\n   * The following nested list shows the steps extending down from the HTML\n   * spec's parsing section that cause elements to be synchronously created and\n   * upgraded:\n   *\n   * The \"in body\" insertion mode:\n   * https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody\n   * - Switch on token:\n   *   .. other cases ..\n   *   -> Any other start tag\n   *      - [Insert an HTML element](below) for the token.\n   *\n   * Insert an HTML element:\n   * https://html.spec.whatwg.org/multipage/syntax.html#insert-an-html-element\n   * - Insert a foreign element for the token in the HTML namespace:\n   *   https://html.spec.whatwg.org/multipage/syntax.html#insert-a-foreign-element\n   *   - Create an element for a token:\n   *     https://html.spec.whatwg.org/multipage/syntax.html#create-an-element-for-the-token\n   *     - Will execute script flag is true?\n   *       - (Element queue pushed to the custom element reactions stack.)\n   *     - Create an element:\n   *       https://dom.spec.whatwg.org/#concept-create-element\n   *       - Sync CE flag is true?\n   *         - Constructor called.\n   *         - Self-modification restrictions enforced.\n   *       - Sync CE flag is false?\n   *         - (Upgrade reaction enqueued.)\n   *     - Attributes appended to element.\n   *       (`attributeChangedCallback` reactions enqueued.)\n   *     - Will execute script flag is true?\n   *       - (Element queue popped from the custom element reactions stack.\n   *         Reactions in the popped stack are invoked.)\n   *   - (Element queue pushed to the custom element reactions stack.)\n   *   - Insert the element:\n   *     https://dom.spec.whatwg.org/#concept-node-insert\n   *     - Shadow-including descendants are connected. During parsing\n   *       construction, there are no shadow-*excluding* descendants.\n   *       However, the constructor may have validly attached a shadow\n   *       tree to itself and added descendants to that shadow tree.\n   *       (`connectedCallback` reactions enqueued.)\n   *   - (Element queue popped from the custom element reactions stack.\n   *     Reactions in the popped stack are invoked.)\n   *\n   * @param {!Node} root\n   * @param {{\n   *   visitedImports: (!Set<!Node>|undefined),\n   *   upgrade: (!function(!Element)|undefined),\n   * }=} options\n   */\n  patchAndUpgradeTree(root, options = {}) {\n    const visitedImports = options.visitedImports || new Set();\n    const upgrade = options.upgrade || (element => this.upgradeElement(element));\n\n    const elements = [];\n\n    const gatherElements = element => {\n      if (element.localName === 'link' && element.getAttribute('rel') === 'import') {\n        // The HTML Imports polyfill sets a descendant element of the link to\n        // the `import` property, specifically this is *not* a Document.\n        const importNode = /** @type {?Node} */ (element.import);\n\n        if (importNode instanceof Node && importNode.readyState === 'complete') {\n          importNode.__CE_isImportDocument = true;\n\n          // Connected links are associated with the registry.\n          importNode.__CE_hasRegistry = true;\n        } else {\n          // If this link's import root is not available, its contents can't be\n          // walked. Wait for 'load' and walk it when it's ready.\n          element.addEventListener('load', () => {\n            const importNode = /** @type {!Node} */ (element.import);\n\n            if (importNode.__CE_documentLoadHandled) return;\n            importNode.__CE_documentLoadHandled = true;\n\n            importNode.__CE_isImportDocument = true;\n\n            // Connected links are associated with the registry.\n            importNode.__CE_hasRegistry = true;\n\n            // Clone the `visitedImports` set that was populated sync during\n            // the `patchAndUpgradeTree` call that caused this 'load' handler to\n            // be added. Then, remove *this* link's import node so that we can\n            // walk that import again, even if it was partially walked later\n            // during the same `patchAndUpgradeTree` call.\n            const clonedVisitedImports = new Set(visitedImports);\n            clonedVisitedImports.delete(importNode);\n\n            this.patchAndUpgradeTree(importNode, {visitedImports: clonedVisitedImports, upgrade});\n          });\n        }\n      } else {\n        elements.push(element);\n      }\n    };\n\n    // `walkDeepDescendantElements` populates (and internally checks against)\n    // `visitedImports` when traversing a loaded import.\n    Utilities.walkDeepDescendantElements(root, gatherElements, visitedImports);\n\n    if (this._hasPatches) {\n      for (let i = 0; i < elements.length; i++) {\n        this.patch(elements[i]);\n      }\n    }\n\n    for (let i = 0; i < elements.length; i++) {\n      upgrade(elements[i]);\n    }\n  }\n\n  /**\n   * @param {!Element} element\n   */\n  upgradeElement(element) {\n    const currentState = element.__CE_state;\n    if (currentState !== undefined) return;\n\n    const definition = this.localNameToDefinition(element.localName);\n    if (!definition) return;\n\n    definition.constructionStack.push(element);\n\n    const constructor = definition.constructor;\n    try {\n      try {\n        let result = new (constructor)();\n        if (result !== element) {\n          throw new Error('The custom element constructor did not produce the element being upgraded.');\n        }\n      } finally {\n        definition.constructionStack.pop();\n      }\n    } catch (e) {\n      element.__CE_state = CEState.failed;\n      throw e;\n    }\n\n    element.__CE_state = CEState.custom;\n    element.__CE_definition = definition;\n\n    if (definition.attributeChangedCallback) {\n      const observedAttributes = definition.observedAttributes;\n      for (let i = 0; i < observedAttributes.length; i++) {\n        const name = observedAttributes[i];\n        const value = element.getAttribute(name);\n        if (value !== null) {\n          this.attributeChangedCallback(element, name, null, value, null);\n        }\n      }\n    }\n\n    if (Utilities.isConnected(element)) {\n      this.connectedCallback(element);\n    }\n  }\n\n  /**\n   * @param {!Element} element\n   */\n  connectedCallback(element) {\n    const definition = element.__CE_definition;\n    if (definition.connectedCallback) {\n      definition.connectedCallback.call(element);\n    }\n  }\n\n  /**\n   * @param {!Element} element\n   */\n  disconnectedCallback(element) {\n    const definition = element.__CE_definition;\n    if (definition.disconnectedCallback) {\n      definition.disconnectedCallback.call(element);\n    }\n  }\n\n  /**\n   * @param {!Element} element\n   * @param {string} name\n   * @param {?string} oldValue\n   * @param {?string} newValue\n   * @param {?string} namespace\n   */\n  attributeChangedCallback(element, name, oldValue, newValue, namespace) {\n    const definition = element.__CE_definition;\n    if (\n      definition.attributeChangedCallback &&\n      definition.observedAttributes.indexOf(name) > -1\n    ) {\n      definition.attributeChangedCallback.call(element, name, oldValue, newValue, namespace);\n    }\n  }\n}\n","/**\n * @enum {number}\n */\nconst CustomElementState = {\n  custom: 1,\n  failed: 2,\n};\n\nexport default CustomElementState;\n","import CustomElementInternals from './CustomElementInternals.js';\n\nexport default class DocumentConstructionObserver {\n  constructor(internals, doc) {\n    /**\n     * @type {!CustomElementInternals}\n     */\n    this._internals = internals;\n\n    /**\n     * @type {!Document}\n     */\n    this._document = doc;\n\n    /**\n     * @type {MutationObserver|undefined}\n     */\n    this._observer = undefined;\n\n\n    // Simulate tree construction for all currently accessible nodes in the\n    // document.\n    this._internals.patchAndUpgradeTree(this._document);\n\n    if (this._document.readyState === 'loading') {\n      this._observer = new MutationObserver(this._handleMutations.bind(this));\n\n      // Nodes created by the parser are given to the observer *before* the next\n      // task runs. Inline scripts are run in a new task. This means that the\n      // observer will be able to handle the newly parsed nodes before the inline\n      // script is run.\n      this._observer.observe(this._document, {\n        childList: true,\n        subtree: true,\n      });\n    }\n  }\n\n  disconnect() {\n    if (this._observer) {\n      this._observer.disconnect();\n    }\n  }\n\n  /**\n   * @param {!Array<!MutationRecord>} mutations\n   */\n  _handleMutations(mutations) {\n    // Once the document's `readyState` is 'interactive' or 'complete', all new\n    // nodes created within that document will be the result of script and\n    // should be handled by patching.\n    const readyState = this._document.readyState;\n    if (readyState === 'interactive' || readyState === 'complete') {\n      this.disconnect();\n    }\n\n    for (let i = 0; i < mutations.length; i++) {\n      const addedNodes = mutations[i].addedNodes;\n      for (let j = 0; j < addedNodes.length; j++) {\n        const node = addedNodes[j];\n        this._internals.patchAndUpgradeTree(node);\n      }\n    }\n  }\n}\n","/**\n * @template T\n */\nexport default class Deferred {\n  constructor() {\n    /**\n     * @private\n     * @type {T|undefined}\n     */\n    this._value = undefined;\n\n    /**\n     * @private\n     * @type {Function|undefined}\n     */\n    this._resolve = undefined;\n\n    /**\n     * @private\n     * @type {!Promise<T>}\n     */\n    this._promise = new Promise(resolve => {\n      this._resolve = resolve;\n\n      if (this._value) {\n        resolve(this._value);\n      }\n    });\n  }\n\n  /**\n   * @param {T} value\n   */\n  resolve(value) {\n    if (this._value) {\n      throw new Error('Already resolved.');\n    }\n\n    this._value = value;\n\n    if (this._resolve) {\n      this._resolve(value);\n    }\n  }\n\n  /**\n   * @return {!Promise<T>}\n   */\n  toPromise() {\n    return this._promise;\n  }\n}\n","import CustomElementInternals from './CustomElementInternals.js';\nimport DocumentConstructionObserver from './DocumentConstructionObserver.js';\nimport Deferred from './Deferred.js';\nimport * as Utilities from './Utilities.js';\n\n/**\n * @unrestricted\n */\nexport default class CustomElementRegistry {\n\n  /**\n   * @param {!CustomElementInternals} internals\n   */\n  constructor(internals) {\n    /**\n     * @private\n     * @type {boolean}\n     */\n    this._elementDefinitionIsRunning = false;\n\n    /**\n     * @private\n     * @type {!CustomElementInternals}\n     */\n    this._internals = internals;\n\n    /**\n     * @private\n     * @type {!Map<string, !Deferred<undefined>>}\n     */\n    this._whenDefinedDeferred = new Map();\n\n    /**\n     * The default flush callback triggers the document walk synchronously.\n     * @private\n     * @type {!Function}\n     */\n    this._flushCallback = fn => fn();\n\n    /**\n     * @private\n     * @type {boolean}\n     */\n    this._flushPending = false;\n\n    /**\n     * @private\n     * @type {!Array<!CustomElementDefinition>}\n     */\n    this._pendingDefinitions = [];\n\n    /**\n     * @private\n     * @type {!DocumentConstructionObserver}\n     */\n    this._documentConstructionObserver = new DocumentConstructionObserver(internals, document);\n  }\n\n  /**\n   * @param {string} localName\n   * @param {!Function} constructor\n   */\n  define(localName, constructor) {\n    if (!(constructor instanceof Function)) {\n      throw new TypeError('Custom element constructors must be functions.');\n    }\n\n    if (!Utilities.isValidCustomElementName(localName)) {\n      throw new SyntaxError(`The element name '${localName}' is not valid.`);\n    }\n\n    if (this._internals.localNameToDefinition(localName)) {\n      throw new Error(`A custom element with name '${localName}' has already been defined.`);\n    }\n\n    if (this._elementDefinitionIsRunning) {\n      throw new Error('A custom element is already being defined.');\n    }\n    this._elementDefinitionIsRunning = true;\n\n    let connectedCallback;\n    let disconnectedCallback;\n    let adoptedCallback;\n    let attributeChangedCallback;\n    let observedAttributes;\n    try {\n      /** @type {!Object} */\n      const prototype = constructor.prototype;\n      if (!(prototype instanceof Object)) {\n        throw new TypeError('The custom element constructor\\'s prototype is not an object.');\n      }\n\n      function getCallback(name) {\n        const callbackValue = prototype[name];\n        if (callbackValue !== undefined && !(callbackValue instanceof Function)) {\n          throw new Error(`The '${name}' callback must be a function.`);\n        }\n        return callbackValue;\n      }\n\n      connectedCallback = getCallback('connectedCallback');\n      disconnectedCallback = getCallback('disconnectedCallback');\n      adoptedCallback = getCallback('adoptedCallback');\n      attributeChangedCallback = getCallback('attributeChangedCallback');\n      observedAttributes = constructor['observedAttributes'] || [];\n    } catch (e) {\n      return;\n    } finally {\n      this._elementDefinitionIsRunning = false;\n    }\n\n    const definition = {\n      localName,\n      constructor,\n      connectedCallback,\n      disconnectedCallback,\n      adoptedCallback,\n      attributeChangedCallback,\n      observedAttributes,\n      constructionStack: [],\n    };\n\n    this._internals.setDefinition(localName, definition);\n    this._pendingDefinitions.push(definition);\n\n    // If we've already called the flush callback and it hasn't called back yet,\n    // don't call it again.\n    if (!this._flushPending) {\n      this._flushPending = true;\n      this._flushCallback(() => this._flush());\n    }\n  }\n\n  _flush() {\n    // If no new definitions were defined, don't attempt to flush. This could\n    // happen if a flush callback keeps the function it is given and calls it\n    // multiple times.\n    if (this._flushPending === false) return;\n    this._flushPending = false;\n\n    const pendingDefinitions = this._pendingDefinitions;\n\n    /**\n     * Unupgraded elements with definitions that were defined *before* the last\n     * flush, in document order.\n     * @type {!Array<!Element>}\n     */\n    const elementsWithStableDefinitions = [];\n\n    /**\n     * A map from `localName`s of definitions that were defined *after* the last\n     * flush to unupgraded elements matching that definition, in document order.\n     * @type {!Map<string, !Array<!Element>>}\n     */\n    const elementsWithPendingDefinitions = new Map();\n    for (let i = 0; i < pendingDefinitions.length; i++) {\n      elementsWithPendingDefinitions.set(pendingDefinitions[i].localName, []);\n    }\n\n    this._internals.patchAndUpgradeTree(document, {\n      upgrade: element => {\n        // Ignore the element if it has already upgraded or failed to upgrade.\n        if (element.__CE_state !== undefined) return;\n\n        const localName = element.localName;\n\n        // If there is an applicable pending definition for the element, add the\n        // element to the list of elements to be upgraded with that definition.\n        const pendingElements = elementsWithPendingDefinitions.get(localName);\n        if (pendingElements) {\n          pendingElements.push(element);\n        // If there is *any other* applicable definition for the element, add it\n        // to the list of elements with stable definitions that need to be upgraded.\n        } else if (this._internals.localNameToDefinition(localName)) {\n          elementsWithStableDefinitions.push(element);\n        }\n      },\n    });\n\n    // Upgrade elements with 'stable' definitions first.\n    for (let i = 0; i < elementsWithStableDefinitions.length; i++) {\n      this._internals.upgradeElement(elementsWithStableDefinitions[i]);\n    }\n\n    // Upgrade elements with 'pending' definitions in the order they were defined.\n    while (pendingDefinitions.length > 0) {\n      const definition = pendingDefinitions.shift();\n      const localName = definition.localName;\n\n      // Attempt to upgrade all applicable elements.\n      const pendingUpgradableElements = elementsWithPendingDefinitions.get(definition.localName);\n      for (let i = 0; i < pendingUpgradableElements.length; i++) {\n        this._internals.upgradeElement(pendingUpgradableElements[i]);\n      }\n\n      // Resolve any promises created by `whenDefined` for the definition.\n      const deferred = this._whenDefinedDeferred.get(localName);\n      if (deferred) {\n        deferred.resolve(undefined);\n      }\n    }\n  }\n\n  /**\n   * @param {string} localName\n   * @return {Function|undefined}\n   */\n  get(localName) {\n    const definition = this._internals.localNameToDefinition(localName);\n    if (definition) {\n      return definition.constructor;\n    }\n\n    return undefined;\n  }\n\n  /**\n   * @param {string} localName\n   * @return {!Promise<undefined>}\n   */\n  whenDefined(localName) {\n    if (!Utilities.isValidCustomElementName(localName)) {\n      return Promise.reject(new SyntaxError(`'${localName}' is not a valid custom element name.`));\n    }\n\n    const prior = this._whenDefinedDeferred.get(localName);\n    if (prior) {\n      return prior.toPromise();\n    }\n\n    const deferred = new Deferred();\n    this._whenDefinedDeferred.set(localName, deferred);\n\n    const definition = this._internals.localNameToDefinition(localName);\n    // Resolve immediately only if the given local name has a definition *and*\n    // the full document walk to upgrade elements with that local name has\n    // already happened.\n    if (definition && !this._pendingDefinitions.some(d => d.localName === localName)) {\n      deferred.resolve(undefined);\n    }\n\n    return deferred.toPromise();\n  }\n\n  polyfillWrapFlushCallback(outer) {\n    this._documentConstructionObserver.disconnect();\n    const inner = this._flushCallback;\n    this._flushCallback = flush => outer(() => inner(flush));\n  }\n}\n\n// Closure compiler exports.\nwindow['CustomElementRegistry'] = CustomElementRegistry;\nCustomElementRegistry.prototype['define'] = CustomElementRegistry.prototype.define;\nCustomElementRegistry.prototype['get'] = CustomElementRegistry.prototype.get;\nCustomElementRegistry.prototype['whenDefined'] = CustomElementRegistry.prototype.whenDefined;\nCustomElementRegistry.prototype['polyfillWrapFlushCallback'] = CustomElementRegistry.prototype.polyfillWrapFlushCallback;\n","export default {\n  Document_createElement: window.Document.prototype.createElement,\n  Document_createElementNS: window.Document.prototype.createElementNS,\n  Document_importNode: window.Document.prototype.importNode,\n  Document_prepend: window.Document.prototype['prepend'],\n  Document_append: window.Document.prototype['append'],\n  DocumentFragment_prepend: window.DocumentFragment.prototype['prepend'],\n  DocumentFragment_append: window.DocumentFragment.prototype['append'],\n  Node_cloneNode: window.Node.prototype.cloneNode,\n  Node_appendChild: window.Node.prototype.appendChild,\n  Node_insertBefore: window.Node.prototype.insertBefore,\n  Node_removeChild: window.Node.prototype.removeChild,\n  Node_replaceChild: window.Node.prototype.replaceChild,\n  Node_textContent: Object.getOwnPropertyDescriptor(window.Node.prototype, 'textContent'),\n  Element_attachShadow: window.Element.prototype['attachShadow'],\n  Element_innerHTML: Object.getOwnPropertyDescriptor(window.Element.prototype, 'innerHTML'),\n  Element_getAttribute: window.Element.prototype.getAttribute,\n  Element_setAttribute: window.Element.prototype.setAttribute,\n  Element_removeAttribute: window.Element.prototype.removeAttribute,\n  Element_getAttributeNS: window.Element.prototype.getAttributeNS,\n  Element_setAttributeNS: window.Element.prototype.setAttributeNS,\n  Element_removeAttributeNS: window.Element.prototype.removeAttributeNS,\n  Element_insertAdjacentElement: window.Element.prototype['insertAdjacentElement'],\n  Element_prepend: window.Element.prototype['prepend'],\n  Element_append: window.Element.prototype['append'],\n  Element_before: window.Element.prototype['before'],\n  Element_after: window.Element.prototype['after'],\n  Element_replaceWith: window.Element.prototype['replaceWith'],\n  Element_remove: window.Element.prototype['remove'],\n  HTMLElement: window.HTMLElement,\n  HTMLElement_innerHTML: Object.getOwnPropertyDescriptor(window.HTMLElement.prototype, 'innerHTML'),\n  HTMLElement_insertAdjacentElement: window.HTMLElement.prototype['insertAdjacentElement'],\n};\n","import Native from './Native.js';\nimport CustomElementInternals from '../CustomElementInternals.js';\nimport CEState from '../CustomElementState.js';\nimport AlreadyConstructedMarker from '../AlreadyConstructedMarker.js';\n\n/**\n * @param {!CustomElementInternals} internals\n */\nexport default function(internals) {\n  window['HTMLElement'] = (function() {\n    /**\n     * @type {function(new: HTMLElement): !HTMLElement}\n     */\n    function HTMLElement() {\n      // This should really be `new.target` but `new.target` can't be emulated\n      // in ES5. Assuming the user keeps the default value of the constructor's\n      // prototype's `constructor` property, this is equivalent.\n      /** @type {!Function} */\n      const constructor = this.constructor;\n\n      const definition = internals.constructorToDefinition(constructor);\n      if (!definition) {\n        throw new Error('The custom element being constructed was not registered with `customElements`.');\n      }\n\n      const constructionStack = definition.constructionStack;\n\n      if (constructionStack.length === 0) {\n        const element = Native.Document_createElement.call(document, definition.localName);\n        Object.setPrototypeOf(element, constructor.prototype);\n        element.__CE_state = CEState.custom;\n        element.__CE_definition = definition;\n        internals.patch(element);\n        return element;\n      }\n\n      const lastIndex = constructionStack.length - 1;\n      const element = constructionStack[lastIndex];\n      if (element === AlreadyConstructedMarker) {\n        throw new Error('The HTMLElement constructor was either called reentrantly for this constructor or called multiple times.');\n      }\n      constructionStack[lastIndex] = AlreadyConstructedMarker;\n\n      Object.setPrototypeOf(element, constructor.prototype);\n      internals.patch(/** @type {!HTMLElement} */ (element));\n\n      return element;\n    }\n\n    HTMLElement.prototype = Native.HTMLElement.prototype;\n\n    return HTMLElement;\n  })();\n};\n","/**\n * @license\n * Copyright (c) 2016 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\nimport CustomElementInternals from './CustomElementInternals.js';\nimport CustomElementRegistry from './CustomElementRegistry.js';\n\nimport PatchHTMLElement from './Patch/HTMLElement.js';\nimport PatchDocument from './Patch/Document.js';\nimport PatchDocumentFragment from './Patch/DocumentFragment.js';\nimport PatchNode from './Patch/Node.js';\nimport PatchElement from './Patch/Element.js';\n\nconst priorCustomElements = window['customElements'];\n\nif (!priorCustomElements ||\n     priorCustomElements['forcePolyfill'] ||\n     (typeof priorCustomElements['define'] != 'function') ||\n     (typeof priorCustomElements['get'] != 'function')) {\n  /** @type {!CustomElementInternals} */\n  const internals = new CustomElementInternals();\n\n  PatchHTMLElement(internals);\n  PatchDocument(internals);\n  PatchDocumentFragment(internals);\n  PatchNode(internals);\n  PatchElement(internals);\n\n  // The main document is always associated with the registry.\n  document.__CE_hasRegistry = true;\n\n  /** @type {!CustomElementRegistry} */\n  const customElements = new CustomElementRegistry(internals);\n\n  Object.defineProperty(window, 'customElements', {\n    configurable: true,\n    enumerable: true,\n    value: customElements,\n  });\n}\n","import CustomElementInternals from '../../CustomElementInternals.js';\nimport * as Utilities from '../../Utilities.js';\n\n/**\n * @typedef {{\n *   prepend: !function(...(!Node|string)),\n  *  append: !function(...(!Node|string)),\n * }}\n */\nlet ParentNodeNativeMethods;\n\n/**\n * @param {!CustomElementInternals} internals\n * @param {!Object} destination\n * @param {!ParentNodeNativeMethods} builtIn\n */\nexport default function(internals, destination, builtIn) {\n  /**\n   * @param {!function(...(!Node|string))} builtInMethod\n   * @return {!function(...(!Node|string))}\n   */\n  function appendPrependPatch(builtInMethod) {\n    return function(...nodes) {\n      /**\n       * A copy of `nodes`, with any DocumentFragment replaced by its children.\n       * @type {!Array<!Node>}\n       */\n      const flattenedNodes = [];\n\n      /**\n       * Elements in `nodes` that were connected before this call.\n       * @type {!Array<!Node>}\n       */\n      const connectedElements = [];\n\n      for (var i = 0; i < nodes.length; i++) {\n        const node = nodes[i];\n\n        if (node instanceof Element && Utilities.isConnected(node)) {\n          connectedElements.push(node);\n        }\n\n        if (node instanceof DocumentFragment) {\n          for (let child = node.firstChild; child; child = child.nextSibling) {\n            flattenedNodes.push(child);\n          }\n        } else {\n          flattenedNodes.push(node);\n        }\n      }\n\n      builtInMethod.apply(this, nodes);\n\n      for (let i = 0; i < connectedElements.length; i++) {\n        internals.disconnectTree(connectedElements[i]);\n      }\n\n      if (Utilities.isConnected(this)) {\n        for (let i = 0; i < flattenedNodes.length; i++) {\n          const node = flattenedNodes[i];\n          if (node instanceof Element) {\n            internals.connectTree(node);\n          }\n        }\n      }\n    };\n  }\n\n  if (builtIn.prepend !== undefined) {\n    Utilities.setPropertyUnchecked(destination, 'prepend', appendPrependPatch(builtIn.prepend));\n  }\n\n  if (builtIn.append !== undefined) {\n    Utilities.setPropertyUnchecked(destination, 'append', appendPrependPatch(builtIn.append));\n  }\n};\n","import Native from './Native.js';\nimport CustomElementInternals from '../CustomElementInternals.js';\nimport * as Utilities from '../Utilities.js';\n\nimport PatchParentNode from './Interface/ParentNode.js';\n\n/**\n * @param {!CustomElementInternals} internals\n */\nexport default function(internals) {\n  Utilities.setPropertyUnchecked(Document.prototype, 'createElement',\n    /**\n     * @this {Document}\n     * @param {string} localName\n     * @return {!Element}\n     */\n    function(localName) {\n      // Only create custom elements if this document is associated with the registry.\n      if (this.__CE_hasRegistry) {\n        const definition = internals.localNameToDefinition(localName);\n        if (definition) {\n          return new (definition.constructor)();\n        }\n      }\n\n      const result = /** @type {!Element} */\n        (Native.Document_createElement.call(this, localName));\n      internals.patch(result);\n      return result;\n    });\n\n  Utilities.setPropertyUnchecked(Document.prototype, 'importNode',\n    /**\n     * @this {Document}\n     * @param {!Node} node\n     * @param {boolean=} deep\n     * @return {!Node}\n     */\n    function(node, deep) {\n      const clone = Native.Document_importNode.call(this, node, deep);\n      // Only create custom elements if this document is associated with the registry.\n      if (!this.__CE_hasRegistry) {\n        internals.patchTree(clone);\n      } else {\n        internals.patchAndUpgradeTree(clone);\n      }\n      return clone;\n    });\n\n  const NS_HTML = \"http://www.w3.org/1999/xhtml\";\n\n  Utilities.setPropertyUnchecked(Document.prototype, 'createElementNS',\n    /**\n     * @this {Document}\n     * @param {?string} namespace\n     * @param {string} localName\n     * @return {!Element}\n     */\n    function(namespace, localName) {\n      // Only create custom elements if this document is associated with the registry.\n      if (this.__CE_hasRegistry && (namespace === null || namespace === NS_HTML)) {\n        const definition = internals.localNameToDefinition(localName);\n        if (definition) {\n          return new (definition.constructor)();\n        }\n      }\n\n      const result = /** @type {!Element} */\n        (Native.Document_createElementNS.call(this, namespace, localName));\n      internals.patch(result);\n      return result;\n    });\n\n  PatchParentNode(internals, Document.prototype, {\n    prepend: Native.Document_prepend,\n    append: Native.Document_append,\n  });\n};\n","import Native from './Native.js';\nimport CustomElementInternals from '../CustomElementInternals.js';\nimport * as Utilities from '../Utilities.js';\n\n/**\n * @param {!CustomElementInternals} internals\n */\nexport default function(internals) {\n  // `Node#nodeValue` is implemented on `Attr`.\n  // `Node#textContent` is implemented on `Attr`, `Element`.\n\n  Utilities.setPropertyUnchecked(Node.prototype, 'insertBefore',\n    /**\n     * @this {Node}\n     * @param {!Node} node\n     * @param {?Node} refNode\n     * @return {!Node}\n     */\n    function(node, refNode) {\n      if (node instanceof DocumentFragment) {\n        const insertedNodes = Array.prototype.slice.apply(node.childNodes);\n        const nativeResult = Native.Node_insertBefore.call(this, node, refNode);\n\n        // DocumentFragments can't be connected, so `disconnectTree` will never\n        // need to be called on a DocumentFragment's children after inserting it.\n\n        if (Utilities.isConnected(this)) {\n          for (let i = 0; i < insertedNodes.length; i++) {\n            internals.connectTree(insertedNodes[i]);\n          }\n        }\n\n        return nativeResult;\n      }\n\n      const nodeWasConnected = Utilities.isConnected(node);\n      const nativeResult = Native.Node_insertBefore.call(this, node, refNode);\n\n      if (nodeWasConnected) {\n        internals.disconnectTree(node);\n      }\n\n      if (Utilities.isConnected(this)) {\n        internals.connectTree(node);\n      }\n\n      return nativeResult;\n    });\n\n  Utilities.setPropertyUnchecked(Node.prototype, 'appendChild',\n    /**\n     * @this {Node}\n     * @param {!Node} node\n     * @return {!Node}\n     */\n    function(node) {\n      if (node instanceof DocumentFragment) {\n        const insertedNodes = Array.prototype.slice.apply(node.childNodes);\n        const nativeResult = Native.Node_appendChild.call(this, node);\n\n        // DocumentFragments can't be connected, so `disconnectTree` will never\n        // need to be called on a DocumentFragment's children after inserting it.\n\n        if (Utilities.isConnected(this)) {\n          for (let i = 0; i < insertedNodes.length; i++) {\n            internals.connectTree(insertedNodes[i]);\n          }\n        }\n\n        return nativeResult;\n      }\n\n      const nodeWasConnected = Utilities.isConnected(node);\n      const nativeResult = Native.Node_appendChild.call(this, node);\n\n      if (nodeWasConnected) {\n        internals.disconnectTree(node);\n      }\n\n      if (Utilities.isConnected(this)) {\n        internals.connectTree(node);\n      }\n\n      return nativeResult;\n    });\n\n  Utilities.setPropertyUnchecked(Node.prototype, 'cloneNode',\n    /**\n     * @this {Node}\n     * @param {boolean=} deep\n     * @return {!Node}\n     */\n    function(deep) {\n      const clone = Native.Node_cloneNode.call(this, deep);\n      // Only create custom elements if this element's owner document is\n      // associated with the registry.\n      if (!this.ownerDocument.__CE_hasRegistry) {\n        internals.patchTree(clone);\n      } else {\n        internals.patchAndUpgradeTree(clone);\n      }\n      return clone;\n    });\n\n  Utilities.setPropertyUnchecked(Node.prototype, 'removeChild',\n    /**\n     * @this {Node}\n     * @param {!Node} node\n     * @return {!Node}\n     */\n    function(node) {\n      const nodeWasConnected = Utilities.isConnected(node);\n      const nativeResult = Native.Node_removeChild.call(this, node);\n\n      if (nodeWasConnected) {\n        internals.disconnectTree(node);\n      }\n\n      return nativeResult;\n    });\n\n  Utilities.setPropertyUnchecked(Node.prototype, 'replaceChild',\n    /**\n     * @this {Node}\n     * @param {!Node} nodeToInsert\n     * @param {!Node} nodeToRemove\n     * @return {!Node}\n     */\n    function(nodeToInsert, nodeToRemove) {\n      if (nodeToInsert instanceof DocumentFragment) {\n        const insertedNodes = Array.prototype.slice.apply(nodeToInsert.childNodes);\n        const nativeResult = Native.Node_replaceChild.call(this, nodeToInsert, nodeToRemove);\n\n        // DocumentFragments can't be connected, so `disconnectTree` will never\n        // need to be called on a DocumentFragment's children after inserting it.\n\n        if (Utilities.isConnected(this)) {\n          internals.disconnectTree(nodeToRemove);\n          for (let i = 0; i < insertedNodes.length; i++) {\n            internals.connectTree(insertedNodes[i]);\n          }\n        }\n\n        return nativeResult;\n      }\n\n      const nodeToInsertWasConnected = Utilities.isConnected(nodeToInsert);\n      const nativeResult = Native.Node_replaceChild.call(this, nodeToInsert, nodeToRemove);\n      const thisIsConnected = Utilities.isConnected(this);\n\n      if (thisIsConnected) {\n        internals.disconnectTree(nodeToRemove);\n      }\n\n      if (nodeToInsertWasConnected) {\n        internals.disconnectTree(nodeToInsert);\n      }\n\n      if (thisIsConnected) {\n        internals.connectTree(nodeToInsert);\n      }\n\n      return nativeResult;\n    });\n\n\n  function patch_textContent(destination, baseDescriptor) {\n    Object.defineProperty(destination, 'textContent', {\n      enumerable: baseDescriptor.enumerable,\n      configurable: true,\n      get: baseDescriptor.get,\n      set: /** @this {Node} */ function(assignedValue) {\n        // If this is a text node then there are no nodes to disconnect.\n        if (this.nodeType === Node.TEXT_NODE) {\n          baseDescriptor.set.call(this, assignedValue);\n          return;\n        }\n\n        let removedNodes = undefined;\n        // Checking for `firstChild` is faster than reading `childNodes.length`\n        // to compare with 0.\n        if (this.firstChild) {\n          // Using `childNodes` is faster than `children`, even though we only\n          // care about elements.\n          const childNodes = this.childNodes;\n          const childNodesLength = childNodes.length;\n          if (childNodesLength > 0 && Utilities.isConnected(this)) {\n            // Copying an array by iterating is faster than using slice.\n            removedNodes = new Array(childNodesLength);\n            for (let i = 0; i < childNodesLength; i++) {\n              removedNodes[i] = childNodes[i];\n            }\n          }\n        }\n\n        baseDescriptor.set.call(this, assignedValue);\n\n        if (removedNodes) {\n          for (let i = 0; i < removedNodes.length; i++) {\n            internals.disconnectTree(removedNodes[i]);\n          }\n        }\n      },\n    });\n  }\n\n  if (Native.Node_textContent && Native.Node_textContent.get) {\n    patch_textContent(Node.prototype, Native.Node_textContent);\n  } else {\n    internals.addPatch(function(element) {\n      patch_textContent(element, {\n        enumerable: true,\n        configurable: true,\n        // NOTE: This implementation of the `textContent` getter assumes that\n        // text nodes' `textContent` getter will not be patched.\n        get: /** @this {Node} */ function() {\n          /** @type {!Array<string>} */\n          const parts = [];\n\n          for (let i = 0; i < this.childNodes.length; i++) {\n            parts.push(this.childNodes[i].textContent);\n          }\n\n          return parts.join('');\n        },\n        set: /** @this {Node} */ function(assignedValue) {\n          while (this.firstChild) {\n            Native.Node_removeChild.call(this, this.firstChild);\n          }\n          Native.Node_appendChild.call(this, document.createTextNode(assignedValue));\n        },\n      });\n    });\n  }\n};\n","import CustomElementInternals from '../../CustomElementInternals.js';\nimport * as Utilities from '../../Utilities.js';\n\n/**\n * @typedef {{\n *   before: !function(...(!Node|string)),\n *   after: !function(...(!Node|string)),\n *   replaceWith: !function(...(!Node|string)),\n *   remove: !function(),\n * }}\n */\nlet ChildNodeNativeMethods;\n\n/**\n * @param {!CustomElementInternals} internals\n * @param {!Object} destination\n * @param {!ChildNodeNativeMethods} builtIn\n */\nexport default function(internals, destination, builtIn) {\n  /**\n   * @param {!function(...(!Node|string))} builtInMethod\n   * @return {!function(...(!Node|string))}\n   */\n  function beforeAfterPatch(builtInMethod) {\n    return function(...nodes) {\n      /**\n       * A copy of `nodes`, with any DocumentFragment replaced by its children.\n       * @type {!Array<!Node>}\n       */\n      const flattenedNodes = [];\n\n      /**\n       * Elements in `nodes` that were connected before this call.\n       * @type {!Array<!Node>}\n       */\n      const connectedElements = [];\n\n      for (var i = 0; i < nodes.length; i++) {\n        const node = nodes[i];\n\n        if (node instanceof Element && Utilities.isConnected(node)) {\n          connectedElements.push(node);\n        }\n\n        if (node instanceof DocumentFragment) {\n          for (let child = node.firstChild; child; child = child.nextSibling) {\n            flattenedNodes.push(child);\n          }\n        } else {\n          flattenedNodes.push(node);\n        }\n      }\n\n      builtInMethod.apply(this, nodes);\n\n      for (let i = 0; i < connectedElements.length; i++) {\n        internals.disconnectTree(connectedElements[i]);\n      }\n\n      if (Utilities.isConnected(this)) {\n        for (let i = 0; i < flattenedNodes.length; i++) {\n          const node = flattenedNodes[i];\n          if (node instanceof Element) {\n            internals.connectTree(node);\n          }\n        }\n      }\n    };\n  }\n\n  if (builtIn.before !== undefined) {\n    Utilities.setPropertyUnchecked(destination, 'before', beforeAfterPatch(builtIn.before));\n  }\n\n  if (builtIn.before !== undefined) {\n    Utilities.setPropertyUnchecked(destination, 'after', beforeAfterPatch(builtIn.after));\n  }\n\n  if (builtIn.replaceWith !== undefined) {\n    Utilities.setPropertyUnchecked(destination, 'replaceWith',\n      /**\n       * @param {...(!Node|string)} nodes\n       */\n      function(...nodes) {\n        /**\n         * A copy of `nodes`, with any DocumentFragment replaced by its children.\n         * @type {!Array<!Node>}\n         */\n        const flattenedNodes = [];\n\n        /**\n         * Elements in `nodes` that were connected before this call.\n         * @type {!Array<!Node>}\n         */\n        const connectedElements = [];\n\n        for (var i = 0; i < nodes.length; i++) {\n          const node = nodes[i];\n\n          if (node instanceof Element && Utilities.isConnected(node)) {\n            connectedElements.push(node);\n          }\n\n          if (node instanceof DocumentFragment) {\n            for (let child = node.firstChild; child; child = child.nextSibling) {\n              flattenedNodes.push(child);\n            }\n          } else {\n            flattenedNodes.push(node);\n          }\n        }\n\n        const wasConnected = Utilities.isConnected(this);\n\n        builtIn.replaceWith.apply(this, nodes);\n\n        for (let i = 0; i < connectedElements.length; i++) {\n          internals.disconnectTree(connectedElements[i]);\n        }\n\n        if (wasConnected) {\n          internals.disconnectTree(this);\n          for (let i = 0; i < flattenedNodes.length; i++) {\n            const node = flattenedNodes[i];\n            if (node instanceof Element) {\n              internals.connectTree(node);\n            }\n          }\n        }\n      });\n    }\n\n  if (builtIn.remove !== undefined) {\n    Utilities.setPropertyUnchecked(destination, 'remove',\n      function() {\n        const wasConnected = Utilities.isConnected(this);\n\n        builtIn.remove.call(this);\n\n        if (wasConnected) {\n          internals.disconnectTree(this);\n        }\n      });\n  }\n};\n","import Native from './Native.js';\nimport CustomElementInternals from '../CustomElementInternals.js';\nimport CEState from '../CustomElementState.js';\nimport * as Utilities from '../Utilities.js';\n\nimport PatchParentNode from './Interface/ParentNode.js';\nimport PatchChildNode from './Interface/ChildNode.js';\n\n/**\n * @param {!CustomElementInternals} internals\n */\nexport default function(internals) {\n  if (Native.Element_attachShadow) {\n    Utilities.setPropertyUnchecked(Element.prototype, 'attachShadow',\n      /**\n       * @this {Element}\n       * @param {!{mode: string}} init\n       * @return {ShadowRoot}\n       */\n      function(init) {\n        const shadowRoot = Native.Element_attachShadow.call(this, init);\n        this.__CE_shadowRoot = shadowRoot;\n        return shadowRoot;\n      });\n  }\n\n\n  function patch_innerHTML(destination, baseDescriptor) {\n    Object.defineProperty(destination, 'innerHTML', {\n      enumerable: baseDescriptor.enumerable,\n      configurable: true,\n      get: baseDescriptor.get,\n      set: /** @this {Element} */ function(htmlString) {\n        const isConnected = Utilities.isConnected(this);\n\n        // NOTE: In IE11, when using the native `innerHTML` setter, all nodes\n        // that were previously descendants of the context element have all of\n        // their children removed as part of the set - the entire subtree is\n        // 'disassembled'. This work around walks the subtree *before* using the\n        // native setter.\n        /** @type {!Array<!Element>|undefined} */\n        let removedElements = undefined;\n        if (isConnected) {\n          removedElements = [];\n          Utilities.walkDeepDescendantElements(this, element => {\n            if (element !== this) {\n              removedElements.push(element);\n            }\n          });\n        }\n\n        baseDescriptor.set.call(this, htmlString);\n\n        if (removedElements) {\n          for (let i = 0; i < removedElements.length; i++) {\n            const element = removedElements[i];\n            if (element.__CE_state === CEState.custom) {\n              internals.disconnectedCallback(element);\n            }\n          }\n        }\n\n        // Only create custom elements if this element's owner document is\n        // associated with the registry.\n        if (!this.ownerDocument.__CE_hasRegistry) {\n          internals.patchTree(this);\n        } else {\n          internals.patchAndUpgradeTree(this);\n        }\n        return htmlString;\n      },\n    });\n  }\n\n  if (Native.Element_innerHTML && Native.Element_innerHTML.get) {\n    patch_innerHTML(Element.prototype, Native.Element_innerHTML);\n  } else if (Native.HTMLElement_innerHTML && Native.HTMLElement_innerHTML.get) {\n    patch_innerHTML(HTMLElement.prototype, Native.HTMLElement_innerHTML);\n  } else {\n\n    internals.addPatch(function(element) {\n      patch_innerHTML(element, {\n        enumerable: true,\n        configurable: true,\n        // Implements getting `innerHTML` by performing an unpatched `cloneNode`\n        // of the element and returning the resulting element's `innerHTML`.\n        // TODO: Is this too expensive?\n        get: /** @this {Element} */ function() {\n          return Native.Node_cloneNode.call(this, true).innerHTML;\n        },\n        // Implements setting `innerHTML` by creating an unpatched element,\n        // setting `innerHTML` of that element and replacing the target\n        // element's children with those of the unpatched element.\n        set: /** @this {Element} */ function(assignedValue) {\n          // NOTE: re-route to `content` for `template` elements.\n          // We need to do this because `template.appendChild` does not\n          // route into `template.content`.\n          const isTemplate = (this.localName === 'template');\n          /** @type {!Node} */\n          const content = isTemplate ? (/** @type {!HTMLTemplateElement} */\n            (this)).content : this;\n          /** @type {!Node} */\n          const rawElement = Native.Document_createElement.call(document,\n            this.localName);\n          rawElement.innerHTML = assignedValue;\n\n          while (content.childNodes.length > 0) {\n            Native.Node_removeChild.call(content, content.childNodes[0]);\n          }\n          const container = isTemplate ? rawElement.content : rawElement;\n          while (container.childNodes.length > 0) {\n            Native.Node_appendChild.call(content, container.childNodes[0]);\n          }\n        },\n      });\n    });\n  }\n\n\n  Utilities.setPropertyUnchecked(Element.prototype, 'setAttribute',\n    /**\n     * @this {Element}\n     * @param {string} name\n     * @param {string} newValue\n     */\n    function(name, newValue) {\n      // Fast path for non-custom elements.\n      if (this.__CE_state !== CEState.custom) {\n        return Native.Element_setAttribute.call(this, name, newValue);\n      }\n\n      const oldValue = Native.Element_getAttribute.call(this, name);\n      Native.Element_setAttribute.call(this, name, newValue);\n      newValue = Native.Element_getAttribute.call(this, name);\n      internals.attributeChangedCallback(this, name, oldValue, newValue, null);\n    });\n\n  Utilities.setPropertyUnchecked(Element.prototype, 'setAttributeNS',\n    /**\n     * @this {Element}\n     * @param {?string} namespace\n     * @param {string} name\n     * @param {string} newValue\n     */\n    function(namespace, name, newValue) {\n      // Fast path for non-custom elements.\n      if (this.__CE_state !== CEState.custom) {\n        return Native.Element_setAttributeNS.call(this, namespace, name, newValue);\n      }\n\n      const oldValue = Native.Element_getAttributeNS.call(this, namespace, name);\n      Native.Element_setAttributeNS.call(this, namespace, name, newValue);\n      newValue = Native.Element_getAttributeNS.call(this, namespace, name);\n      internals.attributeChangedCallback(this, name, oldValue, newValue, namespace);\n    });\n\n  Utilities.setPropertyUnchecked(Element.prototype, 'removeAttribute',\n    /**\n     * @this {Element}\n     * @param {string} name\n     */\n    function(name) {\n      // Fast path for non-custom elements.\n      if (this.__CE_state !== CEState.custom) {\n        return Native.Element_removeAttribute.call(this, name);\n      }\n\n      const oldValue = Native.Element_getAttribute.call(this, name);\n      Native.Element_removeAttribute.call(this, name);\n      if (oldValue !== null) {\n        internals.attributeChangedCallback(this, name, oldValue, null, null);\n      }\n    });\n\n  Utilities.setPropertyUnchecked(Element.prototype, 'removeAttributeNS',\n    /**\n     * @this {Element}\n     * @param {?string} namespace\n     * @param {string} name\n     */\n    function(namespace, name) {\n      // Fast path for non-custom elements.\n      if (this.__CE_state !== CEState.custom) {\n        return Native.Element_removeAttributeNS.call(this, namespace, name);\n      }\n\n      const oldValue = Native.Element_getAttributeNS.call(this, namespace, name);\n      Native.Element_removeAttributeNS.call(this, namespace, name);\n      // In older browsers, `Element#getAttributeNS` may return the empty string\n      // instead of null if the attribute does not exist. For details, see;\n      // https://developer.mozilla.org/en-US/docs/Web/API/Element/getAttributeNS#Notes\n      const newValue = Native.Element_getAttributeNS.call(this, namespace, name);\n      if (oldValue !== newValue) {\n        internals.attributeChangedCallback(this, name, oldValue, newValue, namespace);\n      }\n    });\n\n\n  function patch_insertAdjacentElement(destination, baseMethod) {\n    Utilities.setPropertyUnchecked(destination, 'insertAdjacentElement',\n      /**\n       * @this {Element}\n       * @param {string} where\n       * @param {!Element} element\n       * @return {?Element}\n       */\n      function(where, element) {\n        const wasConnected = Utilities.isConnected(element);\n        const insertedElement = /** @type {!Element} */\n          (baseMethod.call(this, where, element));\n\n        if (wasConnected) {\n          internals.disconnectTree(element);\n        }\n\n        if (Utilities.isConnected(insertedElement)) {\n          internals.connectTree(element);\n        }\n        return insertedElement;\n      });\n  }\n\n  if (Native.HTMLElement_insertAdjacentElement) {\n    patch_insertAdjacentElement(HTMLElement.prototype, Native.HTMLElement_insertAdjacentElement);\n  } else if (Native.Element_insertAdjacentElement) {\n    patch_insertAdjacentElement(Element.prototype, Native.Element_insertAdjacentElement);\n  } else {\n    console.warn('Custom Elements: `Element#insertAdjacentElement` was not patched.');\n  }\n\n\n  PatchParentNode(internals, Element.prototype, {\n    prepend: Native.Element_prepend,\n    append: Native.Element_append,\n  });\n\n  PatchChildNode(internals, Element.prototype, {\n    before: Native.Element_before,\n    after: Native.Element_after,\n    replaceWith: Native.Element_replaceWith,\n    remove: Native.Element_remove,\n  });\n};\n","import CustomElementInternals from '../CustomElementInternals.js';\nimport Native from './Native.js';\nimport PatchParentNode from './Interface/ParentNode.js';\n\n/**\n * @param {!CustomElementInternals} internals\n */\nexport default function(internals) {\n  PatchParentNode(internals, DocumentFragment.prototype, {\n    prepend: Native.DocumentFragment_prepend,\n    append: Native.DocumentFragment_append,\n  });\n};\n"]}
\ No newline at end of file
--- a/toolkit/components/payments/test/browser/browser_total.js
+++ b/toolkit/components/payments/test/browser/browser_total.js
@@ -1,18 +1,15 @@
 "use strict";
 
 /* eslint-disable mozilla/no-cpows-in-tests */
 add_task(async function test_total() {
   const testTask = ({methodData, details}) => {
-    is(content.document.querySelector("#total > .value").textContent,
-       details.total.amount.value,
-       "Check total value");
-    is(content.document.querySelector("#total > .currency").textContent,
-       details.total.amount.currency,
-       "Check currency");
+    is(content.document.querySelector("#total > currency-amount").textContent,
+       "$60.00",
+       "Check total currency amount");
   };
   const args = {
     methodData: [PTU.MethodData.basicCard],
     details: PTU.Details.total60USD,
   };
   await spawnInDialogForMerchantTask(PTU.ContentTasks.createRequest, testTask, args);
 });
new file mode 100644
--- /dev/null
+++ b/toolkit/components/payments/test/mochitest/.eslintrc.js
@@ -0,0 +1,7 @@
+"use strict";
+
+module.exports = {
+  "extends": [
+    "plugin:mozilla/mochitest-test"
+  ],
+};
new file mode 100644
--- /dev/null
+++ b/toolkit/components/payments/test/mochitest/mochitest.ini
@@ -0,0 +1,10 @@
+[DEFAULT]
+support-files =
+   ../../res/components/currency-amount.js
+   ../../res/mixins/ObservedPropertiesMixin.js
+   ../../res/vendor/custom-elements.min.js
+   ../../res/vendor/custom-elements.min.js.map
+   payments_common.js
+
+[test_currency_amount.html]
+[test_ObservedPropertiesMixin.html]
new file mode 100644
--- /dev/null
+++ b/toolkit/components/payments/test/mochitest/payments_common.js
@@ -0,0 +1,12 @@
+"use strict";
+
+/* exported asyncElementRendered */
+
+/**
+ * A helper to await on while waiting for an asynchronous rendering of a Custom
+ * Element.
+ * @returns {Promise}
+ */
+function asyncElementRendered() {
+  return Promise.resolve();
+}
new file mode 100644
--- /dev/null
+++ b/toolkit/components/payments/test/mochitest/test_ObservedPropertiesMixin.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+Test the ObservedPropertiesMixin
+-->
+<head>
+  <meta charset="utf-8">
+  <title>Test the ObservedPropertiesMixin</title>
+  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <script type="application/javascript" src="/tests/SimpleTest/SpawnTask.js"></script>
+  <script src="payments_common.js"></script>
+  <script src="custom-elements.min.js"></script>
+  <script src="ObservedPropertiesMixin.js"></script>
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+  <p id="display">
+    <test-element id="el1" one="foo" two-word="bar"></test-element>
+  </p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+</pre>
+<script type="application/javascript">
+/** Test the ObservedPropertiesMixin **/
+
+/* import-globals-from payments_common.js */
+/* import-globals-from ../../res/mixins/ObservedPropertiesMixin.js */
+
+class TestElement extends ObservedPropertiesMixin(HTMLElement) {
+  static get observedAttributes() {
+    return ["one", "two-word"];
+  }
+
+  render() {
+    this.textContent = JSON.stringify({
+      one: this.one,
+      twoWord: this.twoWord,
+    });
+  }
+}
+
+customElements.define("test-element", TestElement);
+let el1 = document.getElementById("el1");
+
+add_task(async function test_default_properties() {
+  is(el1.one, "foo", "Check .one matches @one");
+  is(el1.twoWord, "bar", "Check .twoWord matches @two-word");
+  let expected = `{"one":"foo","twoWord":"bar"}`;
+  is(el1.textContent, expected, "Check textContent");
+});
+
+add_task(async function test_set_properties() {
+  el1.one = "a";
+  el1.twoWord = "b";
+  is(el1.one, "a", "Check .one value");
+  is(el1.getAttribute("one"), "a", "Check @one");
+  is(el1.twoWord, "b", "Check .twoWord value");
+  is(el1.getAttribute("two-word"), "b", "Check @two-word");
+  let expected = `{"one":"a","twoWord":"b"}`;
+  await asyncElementRendered();
+  is(el1.textContent, expected, "Check textContent");
+});
+
+add_task(async function test_set_attributes() {
+  el1.setAttribute("one", "X");
+  el1.setAttribute("two-word", "Y");
+  is(el1.one, "X", "Check .one value");
+  is(el1.getAttribute("one"), "X", "Check @one");
+  is(el1.twoWord, "Y", "Check .twoWord value");
+  is(el1.getAttribute("two-word"), "Y", "Check @two-word");
+  let expected = `{"one":"X","twoWord":"Y"}`;
+  await asyncElementRendered();
+  is(el1.textContent, expected, "Check textContent");
+});
+
+add_task(async function test_async_render() {
+  // Setup
+  el1.setAttribute("one", "1");
+  el1.setAttribute("two-word", "2");
+  await asyncElementRendered(); // Wait for the async render
+
+  el1.setAttribute("one", "new1");
+
+  is(el1.one, "new1", "Check .one value");
+  is(el1.getAttribute("one"), "new1", "Check @one");
+  is(el1.twoWord, "2", "Check .twoWord value");
+  is(el1.getAttribute("two-word"), "2", "Check @two-word");
+  let expected = `{"one":"1","twoWord":"2"}`;
+  is(el1.textContent, expected, "Check textContent is still old value due to async rendering");
+  await asyncElementRendered();
+  expected = `{"one":"new1","twoWord":"2"}`;
+  is(el1.textContent, expected, "Check textContent now has the new value");
+});
+
+add_task(async function test_batched_render() {
+  // Setup
+  el1.setAttribute("one", "1");
+  el1.setAttribute("two-word", "2");
+  await asyncElementRendered();
+
+  el1.setAttribute("one", "new1");
+  el1.setAttribute("two-word", "new2");
+
+  is(el1.one, "new1", "Check .one value");
+  is(el1.getAttribute("one"), "new1", "Check @one");
+  is(el1.twoWord, "new2", "Check .twoWord value");
+  is(el1.getAttribute("two-word"), "new2", "Check @two-word");
+  let expected = `{"one":"1","twoWord":"2"}`;
+  is(el1.textContent, expected, "Check textContent is still old value due to async rendering");
+  await asyncElementRendered();
+  expected = `{"one":"new1","twoWord":"new2"}`;
+  is(el1.textContent, expected, "Check textContent now has the new value");
+});
+</script>
+
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/toolkit/components/payments/test/mochitest/test_currency_amount.html
@@ -0,0 +1,143 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+Test the currency-amount component
+-->
+<head>
+  <meta charset="utf-8">
+  <title>Test the currency-amount component</title>
+  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <script type="application/javascript" src="/tests/SimpleTest/SpawnTask.js"></script>
+  <script src="payments_common.js"></script>
+  <script src="custom-elements.min.js"></script>
+  <script src="ObservedPropertiesMixin.js"></script>
+  <script src="currency-amount.js"></script>
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+  <p id="display">
+    <currency-amount id="amount1"></currency-amount>
+  </p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+</pre>
+<script type="application/javascript">
+/** Test the currency-amount component **/
+
+/* import-globals-from payments_common.js */
+
+let amount1 = document.getElementById("amount1");
+
+add_task(async function test_no_value() {
+  ok(amount1, "amount1 exists");
+  is(amount1.textContent, "", "Initially empty");
+
+  amount1.currency = "USD";
+  await asyncElementRendered();
+  is(amount1.getAttribute("currency"), "USD", "Check @currency");
+  ok(!amount1.hasAttribute("value"), "Check @value");
+  is(amount1.currency, "USD", "Check .currency");
+  is(amount1.value, null, "Check .value");
+  is(amount1.textContent, "", "Empty while missing an amount");
+
+  amount1.currency = null;
+  await asyncElementRendered();
+  ok(!amount1.hasAttribute("currency"), "Setting to null should remove @currency");
+  ok(!amount1.hasAttribute("value"), "Check @value");
+  is(amount1.currency, null, "Check .currency");
+  is(amount1.value, null, "Check .value");
+});
+
+add_task(async function test_no_value() {
+  amount1.value = 1.23;
+  await asyncElementRendered();
+
+  is(amount1.getAttribute("value"), "1.23", "Check @value");
+  ok(!amount1.hasAttribute("currency"), "Check @currency");
+  is(amount1.currency, null, "Check .currency");
+  is(amount1.value, "1.23", "Check .value");
+  is(amount1.textContent, "", "Empty while missing a currency");
+
+  amount1.value = null;
+  await asyncElementRendered();
+  ok(!amount1.hasAttribute("value"), "Setting to null should remove @value");
+  is(amount1.currency, null, "Check .currency");
+  is(amount1.value, null, "Check .value");
+});
+
+add_task(async function test_valid_currency_amount_cad() {
+  amount1.value = 12.34;
+  info("waiting to set second property");
+  await asyncElementRendered();
+  amount1.currency = "CAD";
+  await asyncElementRendered();
+
+  is(amount1.getAttribute("value"), "12.34", "Check @value");
+  is(amount1.value, "12.34", "Check .value");
+  is(amount1.getAttribute("currency"), "CAD", "Check @currency");
+  is(amount1.currency, "CAD", "Check .currency");
+  is(amount1.textContent, "CA$12.34", "Check output format");
+});
+
+add_task(async function test_valid_currency_amount_eur_batched_prop() {
+  info("setting two properties in a row synchronously");
+  amount1.value = 98.76;
+  amount1.currency = "EUR";
+  await asyncElementRendered();
+
+  is(amount1.getAttribute("value"), "98.76", "Check @value");
+  is(amount1.value, "98.76", "Check .value");
+  is(amount1.getAttribute("currency"), "EUR", "Check @currency");
+  is(amount1.currency, "EUR", "Check .currency");
+  is(amount1.textContent, "€98.76", "Check output format");
+});
+
+add_task(async function test_valid_currency_amount_eur_batched_attr() {
+  info("setting two attributes in a row synchronously");
+  amount1.setAttribute("value", 11.88);
+  amount1.setAttribute("currency", "CAD");
+  await asyncElementRendered();
+
+  is(amount1.getAttribute("value"), "11.88", "Check @value");
+  is(amount1.value, "11.88", "Check .value");
+  is(amount1.getAttribute("currency"), "CAD", "Check @currency");
+  is(amount1.currency, "CAD", "Check .currency");
+  is(amount1.textContent, "CA$11.88", "Check output format");
+});
+
+add_task(async function test_invalid_currency() {
+  isnot(amount1.textContent, "", "Start with initial content");
+  amount1.value = 33.33;
+  amount1.currency = "__invalid__";
+  await asyncElementRendered();
+
+  is(amount1.getAttribute("value"), "33.33", "Check @value");
+  is(amount1.value, "33.33", "Check .value");
+  is(amount1.getAttribute("currency"), "__invalid__", "Check @currency");
+  is(amount1.currency, "__invalid__", "Check .currency");
+  is(amount1.textContent, "", "Invalid currency should clear output");
+});
+
+add_task(async function test_invalid_value() {
+  info("setting some initial values");
+  amount1.value = 4.56;
+  amount1.currency = "GBP";
+  await asyncElementRendered();
+  isnot(amount1.textContent, "", "Start with initial content");
+
+  info("setting an alphabetical invalid value");
+  amount1.value = "abcdef";
+  await asyncElementRendered();
+
+  is(amount1.getAttribute("value"), "abcdef", "Check @value");
+  is(amount1.value, "abcdef", "Check .value");
+  is(amount1.getAttribute("currency"), "GBP", "Check @currency");
+  is(amount1.currency, "GBP", "Check .currency");
+  is(amount1.textContent, "", "Invalid value should clear output");
+});
+</script>
+
+</body>
+</html>
--- a/toolkit/content/license.html
+++ b/toolkit/content/license.html
@@ -140,16 +140,17 @@
 #if defined(XP_WIN) || defined(XP_MACOSX) || defined(XP_LINUX)
       <li><a href="about:license#openvr">OpenVR License</a></li>
 #endif
       <li><a href="about:license#ordered-float">ordered-float License</a></li>
       <li><a href="about:license#owning_ref">owning_ref License</a></li>
       <li><a href="about:license#pbkdf2-sha256">pbkdf2_sha256 License</a></li>
       <li><a href="about:license#pdfium">PDFium License</a></li>
       <li><a href="about:license#phf">phf, phf_codegen, phf_generator, phf_shared License</a></li>
+      <li><a href="about:license#polymer">Polymer License</a></li>
       <li><a href="about:license#praton">praton License</a></li>
       <li><a href="about:license#praton1">praton and inet_ntop License</a></li>
       <li><a href="about:license#precomputed-hash">precomputed-hash License</a></li>
       <li><a href="about:license#qcms">qcms License</a></li>
       <li><a href="about:license#qrcode-generator">QR Code Generator License</a></li>
       <li><a href="about:license#raven-js">Raven.js License</a></li>
       <li><a href="about:license#react">React License</a></li>
       <li><a href="about:license#react-intl">React Intl License</a></li>
@@ -5299,16 +5300,54 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE F
 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 SOFTWARE.
 </pre>
 
 
     <hr>
 
+    <h1><a id="polymer"></a>Polymer License</h1>
+
+    <p>This license applies to the file
+    <code>toolkit/components/payments/res/vendor/custom-elements.min.js</code>.</p>
+
+<pre>
+Copyright (c) 2014 The Polymer Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+   * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+   * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+   * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+</pre>
+
+
+    <hr>
+
     <h1><a id="precomputed-hash"></a>precomputed-hash License</h1>
 
     <p>This license applies to files in the directory
     <code>third_party/rust/precomputed-hash</code>.</p>
 
 <pre>
 MIT License