// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import {assert} from 'chrome://resources/js/assert.js';
/**
* Queries |selector| on |element|'s shadow root and returns the resulting
* element if there is any.
*/
export function $$<K extends keyof HTMLElementTagNameMap>(
element: Element, selector: K): HTMLElementTagNameMap[K]|null;
export function $$<K extends keyof SVGElementTagNameMap>(
element: Element, selector: K): SVGElementTagNameMap[K]|null;
export function $$<E extends Element = Element>(
element: Element, selector: string): E|null;
export function $$(element: Element, selector: string) {
return element.shadowRoot!.querySelector(selector);
}
type Constructor<T> = new (...args: any[]) => T;
/**
* Queries |selector| on |root| and returns the resulting element. Throws
* exception if there is no resulting element or if element is not of type
* |type|.
*/
export function strictQuery<T>(
root: Element|ShadowRoot, selector: string, type: Constructor<T>): T {
const element = root.querySelector(selector);
assert(element && element instanceof type);
return element;
}