webextensions/src/scripts/contentscript.js

92 lines
2.2 KiB
JavaScript

import ext from "./utils/ext";
let extractDOM = () => {
let indexInParent = node => {
let children = node.parentNode.childNodes;
let num = 0;
for (let i = 0; i < children.length; i++) {
if (children[i] === node) return num;
if (children[i].nodeType === 1) num++;
}
return -1;
};
let gx = el => {
let xp = "";
for (; el && el.nodeType === 1; el = el.parentNode) {
let id = indexInParent(el) + 1; // jQuery(el.parentNode).children(el.tagName).index(el)+1;
id = id > 1 ? "[" + id + "]" : "";
xp = "/" + el.tagName.toLowerCase() + id + xp;
}
return xp;
};
document.addEventListener("click", function(evt) {
let tar = evt.target;
while (tar && tar !== this) {
if (tar.matches(".shikihover")) {
let data = extractTags();
data.xpath = gx(tar);
}
}
});
};
let extractTags = () => {
let url = document.location.href;
if (!url || !url.match(/^http/)) {
console.error("Invalid URL : " + url);
return;
}
let data = {
title: "",
description: "",
image: "",
url: url
};
let ogTitle = document.querySelector("meta[property='og:title']");
if (ogTitle) {
data.title = ogTitle.getAttribute("content");
} else {
data.title = document.title;
}
let descriptionTag =
document.querySelector("meta[property='og:description']") ||
document.querySelector("meta[name='description']");
if (descriptionTag) {
data.description = descriptionTag.getAttribute("content");
}
let imgTag =
document.querySelector("meta[property='og:image']") ||
document.querySelector("meta[property='twitter-image']");
if (imgTag) {
data.image = imgTag.getAttribute("content");
} else {
imgTag =
document.querySelector("link[rel=icon]") ||
document.querySelector("link[rel=apple-touch-icon]");
if (imgTag) {
data.image = imgTag.getAttribute("href");
}
}
return data;
};
function onRequest(request, sender, sendResponse) {
if (request.action === "process-page") {
sendResponse(extractTags());
}
if (request.action === "DOM") {
console.log("DOM");
sendResponse(extractDOM());
}
}
ext.runtime.onMessage.addListener(onRequest);