/* eslint-disable */
// dom-observer.js - observe DOM for triggers and notify background
(function () {
if (window.__RR_DOM_OBSERVER__) return;
window.__RR_DOM_OBSERVER__ = true;
const active = { triggers: [], hits: new Map() };
function now() {
return Date.now();
}
function applyTriggers(list) {
try {
active.triggers = Array.isArray(list) ? list.slice() : [];
active.hits.clear();
checkAll();
} catch (e) {}
}
function checkAll() {
try {
for (const t of active.triggers) {
maybeFire(t);
}
} catch (e) {}
}
function maybeFire(t) {
try {
const appear = t.appear !== false; // default true
const sel = String(t.selector || '').trim();
if (!sel) return;
const exists = !!document.querySelector(sel);
const key = t.id;
const last = active.hits.get(key) || 0;
const debounce = Math.max(0, Number(t.debounceMs ?? 800));
if (now() - last < debounce) return;
const should = appear ? exists : !exists;
if (should) {
active.hits.set(key, now());
chrome.runtime.sendMessage({
action: 'dom_trigger_fired',
triggerId: t.id,
url: location.href,
});
if (t.once !== false) removeTrigger(t.id);
}
} catch (e) {}
}
function removeTrigger(id) {
try {
active.triggers = active.triggers.filter((x) => x.id !== id);
} catch (e) {}
}
const mo = new MutationObserver(() => {
checkAll();
});
try {
mo.observe(document.documentElement || document, {
childList: true,
subtree: true,
attributes: false,
characterData: false,
});
} catch (e) {}
chrome.runtime.onMessage.addListener((req, _sender, sendResponse) => {
try {
if (req && req.action === 'dom_observer_ping') {
sendResponse({ status: 'pong' });
return false;
}
if (req && req.action === 'set_dom_triggers') {
applyTriggers(req.triggers || []);
sendResponse({ success: true, count: active.triggers.length });
return true;
}
} catch (e) {
sendResponse({ success: false, error: String(e && e.message ? e.message : e) });
return true;
}
return false;
});
})();