90 lines
2.6 KiB
JavaScript
90 lines
2.6 KiB
JavaScript
const fs = require("fs");
|
|||
|
|
const path = require("path");
|
||
|
|
const { JSDOM } = require("jsdom");
|
||
|
|
|
||
|
|
function loadContentScript({ url, html, settings }) {
|
||
|
|
const dom = new JSDOM(html || "<!DOCTYPE html><html><body></body></html>", {
|
||
|
|
url: url,
|
||
|
|
runScripts: "dangerously"
|
||
|
|
});
|
||
|
|
|
||
|
|
const window = dom.window;
|
||
|
|
const storedSettings = Object.assign(
|
||
|
|
{ plexUrl: "https://app.plex.tv", skipIntro: true, skipCredits: true },
|
||
|
|
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 },
|
||
|
|
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 wait(ms) {
|
||
|
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
||
|
|
}
|
||
|
|
|
||
|
|
module.exports = { loadContentScript, loadPopupScript, wait };
|