forked from mirrors/gecko-dev
124 lines
3.2 KiB
JavaScript
124 lines
3.2 KiB
JavaScript
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
"use strict";
|
|
|
|
this.util = (function () {
|
|
// eslint-disable-line no-unused-vars
|
|
const exports = {};
|
|
|
|
/** Removes a node from its document, if it's a node and the node is attached to a parent */
|
|
exports.removeNode = function (el) {
|
|
if (el && el.parentNode) {
|
|
el.remove();
|
|
}
|
|
};
|
|
|
|
/** Truncates the X coordinate to the document size */
|
|
exports.truncateX = function (x) {
|
|
const max = Math.max(
|
|
document.documentElement.clientWidth,
|
|
document.body.clientWidth,
|
|
document.documentElement.scrollWidth,
|
|
document.body.scrollWidth
|
|
);
|
|
if (x < 0) {
|
|
return 0;
|
|
} else if (x > max) {
|
|
return max;
|
|
}
|
|
return x;
|
|
};
|
|
|
|
/** Truncates the Y coordinate to the document size */
|
|
exports.truncateY = function (y) {
|
|
const max = Math.max(
|
|
document.documentElement.clientHeight,
|
|
document.body.clientHeight,
|
|
document.documentElement.scrollHeight,
|
|
document.body.scrollHeight
|
|
);
|
|
if (y < 0) {
|
|
return 0;
|
|
} else if (y > max) {
|
|
return max;
|
|
}
|
|
return y;
|
|
};
|
|
|
|
// Pixels of wiggle the captured region gets in captureSelectedText:
|
|
const CAPTURE_WIGGLE = 10;
|
|
const ELEMENT_NODE = document.ELEMENT_NODE;
|
|
|
|
exports.captureEnclosedText = function (box) {
|
|
const scrollX = window.scrollX;
|
|
const scrollY = window.scrollY;
|
|
const text = [];
|
|
function traverse(el) {
|
|
let elBox = el.getBoundingClientRect();
|
|
elBox = {
|
|
top: elBox.top + scrollY,
|
|
bottom: elBox.bottom + scrollY,
|
|
left: elBox.left + scrollX,
|
|
right: elBox.right + scrollX,
|
|
};
|
|
if (
|
|
elBox.bottom < box.top ||
|
|
elBox.top > box.bottom ||
|
|
elBox.right < box.left ||
|
|
elBox.left > box.right
|
|
) {
|
|
// Totally outside of the box
|
|
return;
|
|
}
|
|
if (
|
|
elBox.bottom > box.bottom + CAPTURE_WIGGLE ||
|
|
elBox.top < box.top - CAPTURE_WIGGLE ||
|
|
elBox.right > box.right + CAPTURE_WIGGLE ||
|
|
elBox.left < box.left - CAPTURE_WIGGLE
|
|
) {
|
|
// Partially outside the box
|
|
for (let i = 0; i < el.childNodes.length; i++) {
|
|
const child = el.childNodes[i];
|
|
if (child.nodeType === ELEMENT_NODE) {
|
|
traverse(child);
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
addText(el);
|
|
}
|
|
function addText(el) {
|
|
let t;
|
|
if (el.tagName === "IMG") {
|
|
t = el.getAttribute("alt") || el.getAttribute("title");
|
|
} else if (el.tagName === "A") {
|
|
t = el.innerText;
|
|
if (
|
|
el.getAttribute("href") &&
|
|
!el.getAttribute("href").startsWith("#")
|
|
) {
|
|
t += " (" + el.href + ")";
|
|
}
|
|
} else {
|
|
t = el.innerText;
|
|
}
|
|
if (t) {
|
|
text.push(t);
|
|
}
|
|
}
|
|
traverse(document.body);
|
|
if (text.length) {
|
|
let result = text.join("\n");
|
|
result = result.replace(/^\s+/, "");
|
|
result = result.replace(/\s+$/, "");
|
|
result = result.replace(/[ \t]+\n/g, "\n");
|
|
return result;
|
|
}
|
|
return null;
|
|
};
|
|
|
|
return exports;
|
|
})();
|
|
null;
|