openreplay/frontend/app/player/web/managers/DOM/safeCSSRules.ts
2025-05-02 09:48:51 +02:00

53 lines
1.4 KiB
TypeScript

import logger from 'App/logger';
function isChromium(item) {
return ['Chromium', 'Google Chrome', 'NewBrowser'].includes(item.brand);
}
// @ts-ignore
const isChromeLike = navigator.userAgentData?.brands?.some(isChromium);
export function insertRule(
sheet: { insertRule: (rule: string, index?: number) => void },
msg: { rule: string; index: number },
) {
/**
* inserting -moz- styles in chrome-like browsers causes issues and warnings
* changing them to -webkit- is usually fine because they're covered by native styles
* and not inserting them will break sheet indexing
* */
if (msg.rule.includes('-moz-') && isChromeLike) {
msg.rule = msg.rule.replace(/-moz-/g, '-webkit-');
}
try {
sheet.insertRule(msg.rule, msg.index);
} catch (e) {
try {
sheet.insertRule(msg.rule);
} catch (e) {
logger.warn('Cannot insert rule.', e, '\nmessage: ', msg, sheet);
}
}
}
export function deleteRule(
sheet: { deleteRule: (index: number) => void },
msg: { index: number },
) {
try {
sheet.deleteRule(msg.index);
} catch (e) {
logger.warn(e, msg, sheet);
}
}
export function replaceRule(
sheet: { insertRule: (rule: string, index?: number) => void, deleteRule: (index: number) => void },
msg: { rule: string, index: number },
) {
try {
sheet.deleteRule(msg.index);
sheet.insertRule(msg.rule, msg.index);
} catch (e) {
logger.warn('Cannot replace rule.', e, '\nmessage: ', msg);
}
}