You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

88 lines
2.1 KiB

/** global: browser */
/** global: XMLSerializer */
/* global browser */
/* eslint-env browser */
const port = browser.runtime.connect({
name: 'content.js',
});
if (typeof browser !== 'undefined' && typeof document.body !== 'undefined') {
try {
port.postMessage({ id: 'init' });
// HTML
let html = new XMLSerializer().serializeToString(document);
const chunks = [];
const maxCols = 2000;
const maxRows = 3000;
const rows = html.length / maxCols;
let i;
for (i = 0; i < rows; i += 1) {
if (i < maxRows / 2 || i > rows - maxRows / 2) {
chunks.push(html.slice(i * maxCols, (i + 1) * maxCols));
}
}
html = chunks.join('\n');
// Scripts
const scripts = Array.prototype.slice
.apply(document.scripts)
.filter(script => script.src)
.map(script => script.src)
.filter(script => script.indexOf('data:text/javascript;') !== 0);
port.postMessage({ id: 'analyze', subject: { html, scripts } });
// JavaScript variables
const script = document.createElement('script');
script.onload = () => {
const onMessage = (event) => {
if (event.data.id !== 'js') {
return;
}
window.removeEventListener('message', onMessage);
port.postMessage({ id: 'analyze', subject: { js: event.data.js } });
script.remove();
};
window.addEventListener('message', onMessage);
port.postMessage({ id: 'get_js_patterns' });
};
script.setAttribute('src', browser.extension.getURL('js/inject.js'));
document.body.appendChild(script);
} catch (error) {
port.postMessage({ id: 'log', subject: error });
}
}
port.onMessage.addListener((message) => {
switch (message.id) {
case 'get_js_patterns':
postMessage({
id: 'patterns',
patterns: message.response.patterns,
}, window.location.href);
break;
default:
// Do nothing
}
});
// https://stackoverflow.com/a/44774834
// https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/tabs/executeScript#Return_value
undefined; // eslint-disable-line no-unused-expressions