|  | // Copyright 2018 The Chromium Authors | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | /** | 
|  | * Helper class to be used as the super class of all custom elements in | 
|  | * chrome://omnibox. | 
|  | */ | 
|  | // TODO(manukh) Replace with `CustomElement` defined in | 
|  | //  ui/webui/resources/js/custom_element.ts. Their essentially equivalent with | 
|  | //  slightly different loading of the template element. | 
|  | export abstract class OmniboxElement extends HTMLElement { | 
|  | protected constructor(templateId: string) { | 
|  | super(); | 
|  | this.attachShadow({mode: 'open'}); | 
|  | const template = OmniboxElement.getTemplate(templateId); | 
|  | this.shadowRoot!.appendChild(template); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Finds the 1st element matching the query within the local shadow root. | 
|  | */ | 
|  | protected $<E extends Element = Element>(query: string): E|null { | 
|  | return this.shadowRoot!.querySelector<E>(query); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Finds all elements matching the query within the local shadow root. | 
|  | */ | 
|  | protected $all<E extends Element = Element>(query: string): NodeListOf<E> { | 
|  | return this.shadowRoot!.querySelectorAll<E>(query); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Get a template that's known to exist within the DOM document. | 
|  | */ | 
|  | private static getTemplate(templateId: string): Node { | 
|  | return document.querySelector<HTMLTemplateElement>( | 
|  | `#${templateId}`)!.content.cloneNode(true); | 
|  | } | 
|  | } |