Bug 1417749 - Create a currency-amount Custom Element. r=marcosc
authorMatthew Noorenberghe <mozilla@noorenberghe.ca>
Thu, 16 Nov 2017 21:58:29 -0800
changeset 446642 84f6ddc4988255bc65b7113f6feee9a2da73981d
parent 446641 dec59488ecf18c74c22f9c6592ec10fd6a889905
child 446643 3895deba198e01a603127fbb69be8b6eed96da18
push id1648
push usermtabara@mozilla.com
push dateThu, 01 Mar 2018 12:45:47 +0000
treeherdermozilla-release@cbb9688c2eeb [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmarcosc
bugs1417749
milestone59.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
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