const fs = require("fs"); const path = require("path"); const { JSDOM } = require("jsdom"); function loadContentScript({ url, html, settings }) { const dom = new JSDOM(html || "", { url: url, runScripts: "dangerously" }); const window = dom.window; const storedSettings = Object.assign( { plexUrl: "https://app.plex.tv", skipIntro: true, skipCredits: true, introDelaySeconds: 0, creditsDelaySeconds: 0 }, settings || {} ); const changeListeners = []; window.__clickedElements = []; const originalClick = window.HTMLElement.prototype.click; window.HTMLElement.prototype.click = function () { window.__clickedElements.push(this); return originalClick.call(this); }; window.chrome = { storage: { sync: { get: (defaults, cb) => cb(Object.assign({}, defaults, storedSettings)), set: (obj, cb) => { Object.assign(storedSettings, obj); if (cb) cb(); } }, onChanged: { addListener: (fn) => changeListeners.push(fn) } } }; const utilsCode = fs.readFileSync(path.join(__dirname, "..", "utils.js"), "utf8"); const contentCode = fs.readFileSync(path.join(__dirname, "..", "content.js"), "utf8"); window.eval(utilsCode + "\n" + contentCode); function fireStorageChange(changes) { const wrapped = {}; Object.keys(changes).forEach((k) => { wrapped[k] = { newValue: changes[k] }; }); changeListeners.forEach((fn) => fn(wrapped, "sync")); } return { dom, window, fireStorageChange }; } function loadPopupScript({ initialSettings } = {}) { const html = fs.readFileSync(path.join(__dirname, "..", "popup.html"), "utf8"); const dom = new JSDOM(html, { url: "chrome-extension://fake/popup.html", runScripts: "dangerously" }); const window = dom.window; const storedSettings = Object.assign( { plexUrl: "https://app.plex.tv", skipIntro: true, skipCredits: true, introDelaySeconds: 0, creditsDelaySeconds: 0 }, initialSettings || {} ); const savedCalls = []; window.chrome = { storage: { sync: { get: (defaults, cb) => cb(Object.assign({}, defaults, storedSettings)), set: (obj, cb) => { savedCalls.push(obj); Object.assign(storedSettings, obj); if (cb) cb(); } } } }; const utilsCode = fs.readFileSync(path.join(__dirname, "..", "utils.js"), "utf8"); const popupCode = fs.readFileSync(path.join(__dirname, "..", "popup.js"), "utf8"); window.eval(utilsCode + "\n" + popupCode); return { dom, window, savedCalls, storedSettings }; } function loadUtils() { const dom = new JSDOM("", { url: "https://example.com", runScripts: "dangerously" }); const window = dom.window; const utilsCode = fs.readFileSync(path.join(__dirname, "..", "utils.js"), "utf8"); window.eval(utilsCode); return window; } function wait(ms) { return new Promise((resolve) => setTimeout(resolve, ms)); } module.exports = { loadContentScript, loadPopupScript, loadUtils, wait };