88 lines
2.8 KiB
JavaScript
88 lines
2.8 KiB
JavaScript
// Derived from Chromium WebRTC Internals Dashboard - see Acknowledgements for full license details
|
|
|
|
import {assert} from "./assert.js";
|
|
export function $(id) {
|
|
const el = document.querySelector(`#${id}`);
|
|
if (el) {
|
|
assert(el instanceof HTMLElement);
|
|
return el
|
|
}
|
|
return null
|
|
}
|
|
export function getRequiredElement(id) {
|
|
const el = document.querySelector(`#${id}`);
|
|
assert(el);
|
|
assert(el instanceof HTMLElement);
|
|
return el
|
|
}
|
|
export function getDeepActiveElement() {
|
|
let a = document.activeElement;
|
|
while (a && a.shadowRoot && a.shadowRoot.activeElement) {
|
|
a = a.shadowRoot.activeElement
|
|
}
|
|
return a
|
|
}
|
|
export function isRTL() {
|
|
return document.documentElement.dir === "rtl"
|
|
}
|
|
export function appendParam(url, key, value) {
|
|
const param = encodeURIComponent(key) + "=" + encodeURIComponent(value);
|
|
if (url.indexOf("?") === -1) {
|
|
return url + "?" + param
|
|
}
|
|
return url + "&" + param
|
|
}
|
|
export function ensureTransitionEndEvent(el, timeOut) {
|
|
if (timeOut === undefined) {
|
|
const style = getComputedStyle(el);
|
|
timeOut = parseFloat(style.transitionDuration) * 1e3;
|
|
timeOut += 50
|
|
}
|
|
let fired = false;
|
|
el.addEventListener("transitionend", (function f() {
|
|
el.removeEventListener("transitionend", f);
|
|
fired = true
|
|
}
|
|
));
|
|
window.setTimeout((function() {
|
|
if (!fired) {
|
|
el.dispatchEvent(new CustomEvent("transitionend",{
|
|
bubbles: true,
|
|
composed: true
|
|
}))
|
|
}
|
|
}
|
|
), timeOut)
|
|
}
|
|
export function htmlEscape(original) {
|
|
return original.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'")
|
|
}
|
|
export function quoteString(str) {
|
|
return str.replace(/([\\\.\+\*\?\[\^\]\$\(\)\{\}\=\!\<\>\|\:])/g, "\\$1")
|
|
}
|
|
export function listenOnce(target, eventNames, callback) {
|
|
const eventNamesArray = Array.isArray(eventNames) ? eventNames : eventNames.split(/ +/);
|
|
const removeAllAndCallCallback = function(event) {
|
|
eventNamesArray.forEach((function(eventName) {
|
|
target.removeEventListener(eventName, removeAllAndCallCallback, false)
|
|
}
|
|
));
|
|
return callback(event)
|
|
};
|
|
eventNamesArray.forEach((function(eventName) {
|
|
target.addEventListener(eventName, removeAllAndCallCallback, false)
|
|
}
|
|
))
|
|
}
|
|
export function hasKeyModifiers(e) {
|
|
return !!(e.altKey || e.ctrlKey || e.metaKey || e.shiftKey)
|
|
}
|
|
export function isUndoKeyboardEvent(event) {
|
|
if (event.key !== "z") {
|
|
return false
|
|
}
|
|
const excludedModifiers = [event.altKey, event.shiftKey, event.ctrlKey];
|
|
let targetModifier = event.ctrlKey;
|
|
targetModifier = event.metaKey;
|
|
return targetModifier && !excludedModifiers.some((modifier=>modifier))
|
|
}
|