123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212 |
- let overDiv;
- chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
- if (request.action === "highlight") {
- if (request.message && !isOpen) {
- overDiv = document.createElement("div");
- overDiv.classList.add("bg-overDiv");
- // CSS样式内容
- var css = `
- .bg-overDiv{
- position: fixed;
- opacity: 0.5;
- background: rgb(20 122 218 / 85%);
- backdrop-filter: blur(5px);
- cursor: pointer;
- z-index: 99999999999;
- display: none;
- }`;
- // 创建一个style元素
- var style = document.createElement("style");
- style.classList.add("bg-style");
- // 为style元素添加CSS内容
- if (style.styleSheet) {
- style.styleSheet.cssText = css;
- } else {
- style.appendChild(document.createTextNode(css));
- }
- // 将style元素添加到body的末尾
- document.body.appendChild(style); //把这个样式加入body的最后
- document.body.appendChild(overDiv);
- isOpen = true;
- window.addEventListener("click", clickHandler);
- window.addEventListener("mousemove", mouseMoveHandler);
- }
- if (!request.message && isOpen) {
- document.querySelector(".bg-overDiv")?.remove();
- document.querySelector(".bg-style")?.remove();
- window.removeEventListener("click", clickHandler);
- window.removeEventListener("mousemove", mouseMoveHandler);
- isOpen = false;
- }
- }
- });
- const jsRequests = []; // 使用 Set 以避免重复的 URL
- // 观察 DOM 的变化
- const observer = new MutationObserver((mutations) => {
- for (const mutation of mutations) {
- if (mutation.type === "childList") {
- mutation.addedNodes.forEach((node) => {
- if (node.nodeName === "SCRIPT" && node.src) {
- const url = new URL(node.src);
- if (url.pathname.startsWith("/lib")) return;
- fetch(node.src)
- .then((res) => res.text())
- .then((data) => {
- jsRequests.push({
- fileName: getFileName(node.src),
- url: node.src,
- data,
- });
- });
- //jsRequests.add(node.src);
- }
- });
- }
- }
- });
- function getFileName(url) {
- // 创建一个URL对象
- const urlObj = new URL(url);
- // 获取路径部分
- const pathname = urlObj.pathname;
- // 提取文件名
- const fileName = pathname.substring(pathname.lastIndexOf("/") + 1);
- return fileName;
- }
- // 观察整个文档
- observer.observe(document, { childList: true, subtree: true });
- // 获取当前加载的脚本
- const scripts = Array.from(document.getElementsByTagName("script"));
- scripts.forEach((script) => {
- if (script.src) {
- const url = new URL(script.src);
- if (url.pathname.startsWith("/lib")) return;
- fetch(script.src)
- .then((res) => res.text())
- .then((data) => {
- jsRequests.push({
- fileName: getFileName(script.src),
- url: script.src,
- data,
- });
- });
- // jsRequests.add(script.src);
- }
- });
- let isOpen = false;
- function clickHandler(e) {
- // console.log(jsRequests);
- // console.log(oldTarget);
- chrome.runtime.sendMessage({
- action: "show_popup",
- jslist: jsRequests,
- targe: oldTarget.outerHTML,
- csslist: Array.from(document.styleSheets).map(({ href, cssRules, ownerNode }, index) => {
- return {
- href: href === null ? "自定义样式" + index : href,
- selectorTexts: Array.from(cssRules).map(({ selectorText }) => selectorText),
- styleCode: ownerNode instanceof HTMLStyleElement ? ownerNode.innerHTML : "" // 自定义的样式,需要提前存储
- }
- }),
- path: getNodePosition(oldTarget),
- });
- }
- function getNodePosition(element) {
- let id = [];
- if (element === document) {
- return [];
- } else {
- let parentNode = element.parentNode;
- let index = 0;
- for (let i = 0; parentNode.childNodes.length; i++) {
- let child = parentNode.childNodes[i];
- if (child.nodeName === "#text") continue;
- if (child === element) {
- id = [index];
- break;
- }
- index++;
- }
- return getNodePosition(element.parentNode).concat(id);
- }
- }
- // window.addEventListener("click", function (e) {
- // // e.preventDefault();
- // // e.stopPropagation();
- // console.log("点击");
- // });
- let oldTarget;
- function mouseMoveHandler(e) {
- if (!isOpen) return;
- let target =
- findTarget(document.elementsFromPoint(e.clientX, e.clientY)) || e.target;
- if (oldTarget !== target) {
- overDiv.style.cssText = "";
- oldTarget = target;
- let rect = target.getClientRects();
- if (rect.length > 0) {
- rect = rect[0];
- overDiv.style.cssText =
- "display: block; top:" +
- rect.top +
- "px;left: " +
- rect.left +
- "px; width: " +
- rect.width +
- "px; height: " +
- rect.height +
- "px;";
- }
- }
- oldTarget = target;
- let oldEle = document.querySelector(".bg-overlay");
- if (oldEle) {
- oldEle.classList.remove("bg-overlay");
- }
- target.classList.add("bg-overlay");
- }
- function findTarget(eles) {
- for (let i = 0; i < eles.length; i++) {
- if (eles[i].classList.contains("bg-overDiv") === false) return eles[i];
- }
- }
- function findChildren(ele, x, y) {
- let clds = ele.children;
- let findEle = ele;
- if (clds.length > 0) {
- let len = clds.length;
- let cur = null;
- for (let i = 0; i < len; i++) {
- let rect = clds[i].getClientRects();
- if (!rect[0]) continue;
- if (
- rect[0].x + rect[0].width >= x &&
- rect[0].x <= x &&
- rect[0].y + rect[0].height >= y &&
- rect[0].y <= y
- ) {
- findEle = findChildren(clds[i], x, y);
- break;
- }
- }
- }
- return findEle;
- }
|