signal-desktop/js/calling-tools/util.js
2024-05-23 15:19:12 -07:00

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, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;")
}
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))
}