class WebRTCStreamerOptionsElement extends HTMLElement { constructor() { super(); this.shadowDOM = this.attachShadow({mode: 'open'}); this.shadowDOM.innerHTML = `

Options

`; this.button = this.shadowDOM.getElementById("apply"); this.button.onclick = () => this.notifyOptions(); this.params = new URLSearchParams(); } static get observedAttributes() { return ['options']; } attributeChangedCallback(attrName, oldVal, newVal) { if (attrName === "options") { this.fillOptions(); } } connectedCallback() { this.fillOptions(); } fillOptions() { const options = this.getAttribute("options") || ""; this.params = new URLSearchParams(options); let optElement = this.shadowDOM.getElementById("options"); optElement.innerHTML = ""; for (let [k,v] of this.params.entries()) { let label = document.createTextNode(k+":"); optElement.appendChild(label); let input = document.createElement("input"); input.type = "text"; input.value = v; input.onchange = () => this.params.set(k, input.value); optElement.appendChild(input); optElement.appendChild(document.createElement("br")); } } notifyOptions() { this.setAttribute("options", this.params.toString()); this.dispatchEvent(new CustomEvent('change', { detail: { options: this.params.toString(), } })); } } customElements.define('webrtc-streamer-options', WebRTCStreamerOptionsElement);