From bfeb9d2ff66f710a03a1a906cc5fd94b70ec137d Mon Sep 17 00:00:00 2001 From: Jaculabilis Date: Sat, 3 Mar 2018 17:30:07 -0600 Subject: [PATCH] Initial commit --- manifest.json | 23 +++++++++++++++++++++++ optimize.js | 46 ++++++++++++++++++++++++++++++++++++++++++++++ options.html | 29 +++++++++++++++++++++++++++++ options.js | 35 +++++++++++++++++++++++++++++++++++ 4 files changed, 133 insertions(+) create mode 100644 manifest.json create mode 100644 optimize.js create mode 100644 options.html create mode 100644 options.js diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..cf13bff --- /dev/null +++ b/manifest.json @@ -0,0 +1,23 @@ +{ + "manifest_version": 2, + + "name": "DOM Optimizer", + "description": "Keeps your web pages thin by optimizing the DOM.", + "version": "1.0", + + "permissions": [ + "storage" + ], + + "content_scripts": [ + { + "matches": [""], + "js": ["optimize.js"] + } + ], + + "options_ui": { + "page": "options.html", + "chrome_style": true + } +} \ No newline at end of file diff --git a/optimize.js b/optimize.js new file mode 100644 index 0000000..b675248 --- /dev/null +++ b/optimize.js @@ -0,0 +1,46 @@ +function getLowHangingLeaves() { + var parList = [document]; + var chiList = document.childNodes; + while (chiList.length > 0) { + parList = chiList; + chiList = []; + for (var i = 0; i < parList.length; i++) { + Array.prototype.push.apply(chiList, parList[i].childNodes); + } + } + return parList; +} + +function sleep(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); +} + +async function trimDomIteratively(initialDelay, levelDelay, iterDelay, maxPerIter) { + console.log("DOM optimization called with initialDelay="+initialDelay+" levelDelay="+levelDelay+" iterDelay="+iterDelay+" maxPerIter="+maxPerIter); + if (maxPerIter < 1) + maxPerIter = Number.POSITIVE_INFINITY; + var topEls = [null] + if (initialDelay > 0) + await sleep(initialDelay); + while (topEls.length > 0) { + if (levelDelay > 0) + await sleep(levelDelay); + topEls = getLowHangingLeaves() + for (var i = 0; i < topEls.length && i < maxPerIter; i++) { + if (iterDelay > 0) + await sleep(iterDelay); + topEls[i].parentNode.removeChild(topEls[i]); + } + console.log("Optimized " + i + " elements"); + } +} + +chrome.storage.sync.get({ + initialDelay: 10000, + levelDelay: 1000, + iterDelay: 0, + maxPerIter: 0 + }, function(items) { + trimDomIteratively(items.initialDelay, items.levelDelay, items.iterDelay, items.maxPerIter); + } +); diff --git a/options.html b/options.html new file mode 100644 index 0000000..24a8ed6 --- /dev/null +++ b/options.html @@ -0,0 +1,29 @@ + + + +DOM Trimmer options + + +

+ + Initial delay (ms) +

+

+ + Level delay (ms) +

+

+ + Iteration delay (ms) +

+

+ + Trims per iteration (dom objects) +

+ +
+ + + + \ No newline at end of file diff --git a/options.js b/options.js new file mode 100644 index 0000000..e734ac2 --- /dev/null +++ b/options.js @@ -0,0 +1,35 @@ +function save_options() { + var initial = document.getElementById('initial').value; + var level = document.getElementById('level').value; + var iter = document.getElementById('iter').value; + var maxPer = document.getElementById('maxPer').value; + chrome.storage.sync.set({ + initialDelay: initial, + levelDelay: level, + iterDelay: iter, + maxPerIter: maxPer + }, function() { + var status = document.getElementById('save'); + status.textContent = 'Saved!'; + setTimeout(function() { + status.textContent = 'Save'; + }, 750); + }); +} + +function restore_options() { + chrome.storage.sync.get({ + initialDelay: 10000, + levelDelay: 1000, + iterDelay: 0, + maxPerIter: 0 + }, function(items) { + document.getElementById('initial').value = items.initialDelay; + document.getElementById('level').value = items.levelDelay; + document.getElementById('iter').value = items.iterDelay; + document.getElementById('maxPer').value = items.maxPerIter; + }); +} +document.addEventListener('DOMContentLoaded', restore_options); +document.getElementById('save').addEventListener('click', + save_options); \ No newline at end of file