Last active
November 4, 2025 02:32
-
-
Save xmoforf/cfb3caf58ddb07f37b650df2b655739d to your computer and use it in GitHub Desktop.
WedgeMarker-alpha.user.js
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // ==UserScript== | |
| // @name MAM - WedgeWaster (Alpha Test) (Bookmark Edition) | |
| // @author WirlyWirly | |
| // @namespace https://github.com/xmoforf | |
| // @version 2.8 | |
| // @match https://www.myanonamouse.net/ | |
| // @match https://www.myanonamouse.net/index.php | |
| // @match https://www.myanonamouse.net/preferences/index.php* | |
| // @match https://www.myanonamouse.net/t/* | |
| // @match https://www.myanonamouse.net/tor/browse.php* | |
| // @icon https://www.myanonamouse.net/favicon.ico | |
| // @homepage https://gist.github.com/xmoforf/cfb3caf58ddb07f37b650df2b655739d | |
| // @updateURL https://gist.github.com/xmoforf/cfb3caf58ddb07f37b650df2b655739d/raw/WedgeMarker-alpha.user.js | |
| // @downloadURL https://gist.github.com/xmoforf/cfb3caf58ddb07f37b650df2b655739d/raw/WedgeMarker-alpha.user.js | |
| // @description Waste a wedge and not your time when bookmarking! | |
| // @grant GM.getValue | |
| // @grant GM.setValue | |
| // @grant GM.deleteValue | |
| // @run-at document-end | |
| // ==/UserScript== | |
| // ----------------------------------- CODE -------------------------------------- | |
| (async () => { | |
| // Grabbing action is different based on configuration | |
| const GRAB_ACTIONS = { | |
| bookmark: (id, url) => { | |
| // eslint-disable-next-line no-undef | |
| bookmarkClick("add", id); // bookmark | |
| }, | |
| download: (id, url) => { | |
| window.location = url; // download | |
| }, | |
| }; | |
| // Base64 Encoded Icons | |
| const IMG_BUTTON_TO_CLICK = `data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJwAAAAxCAYAAAAvOsB9AAAEsWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIKICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgdGlmZjpJbWFnZUxlbmd0aD0iNDkiCiAgIHRpZmY6SW1hZ2VXaWR0aD0iMTU2IgogICB0aWZmOlJlc29sdXRpb25Vbml0PSIyIgogICB0aWZmOlhSZXNvbHV0aW9uPSI5Ny8xIgogICB0aWZmOllSZXNvbHV0aW9uPSI5Ny8xIgogICBleGlmOlBpeGVsWERpbWVuc2lvbj0iMTU2IgogICBleGlmOlBpeGVsWURpbWVuc2lvbj0iNDkiCiAgIGV4aWY6Q29sb3JTcGFjZT0iMSIKICAgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIKICAgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIgogICB4bXA6TW9kaWZ5RGF0ZT0iMjAyMi0x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`; | |
| const IMG_ICON_TO_CLICK_MAP = { | |
| bookmark: `data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB+kLARYoN8+4YvkAAAPvSURBVEjH7VVtTFtlFH7ee2+/oB1UPnVTEljAbRBCpHNOjBlqiJIhJFuckR9Wl5oYY2T8WIBfZnOZmQkSTZyJRodTk20wN8ExxhqYwiYYqC0tOhhbWcfajumg9Lbee/u+/hi9FGHq/GNMPMn9ce45Oc9znnPe9wX+60ZW/ElQwfPcFkHgs3VaTcrsnBjU6zWXKGXdkqQ4/jGAIUmbn5f7wLGGBtsGS2kRM5mSeUJAGQPn8/mV7wed3K66/SOSrDQD+PyuWuE4kmO1VgeCge9kRj0s/g3+0M5c7k4l7s/eGoy0t7UoZWUlbgC1f1WXX5SFHDl2tKUoOzuDd//sjc2FwiTNvIr0D3piPMch5/4sDgB0Oq2wbl0e9/yOyvSNG4tqpqf9z01NXZ8F4LwjitFoKHx7/y7KqIfZz33JKndaWeVOK3OPnaKJ3UREB+0628q6zrZSWXIxRj1MDA/TE1+9TzdvLnYDeGGZMgAQDkeryss3AQCSDNqYUa9RrFWP0Py8NUtmNDcvEtdPXuZwX6HT/hkFAAwGPamqKidnuj/Jb29r+XTD+tzRROkIAPA895lj5PiO9HSzcDdzY2CyGI6EZFkxyrLCFEXhAoGbeGvfQaG/3zGm0wlb4gyHmppsD3GEk1JSTVzaPSlScnJS8t/CWKCpEYSw2bwKOp1OLwg819MzwDU0vluqMt675w0CQLfgavyBXzBxZZqWPVzIJVYM3riF64GbrLgwjySuuawoRo2wKMDly77FGSQmxmIUR09+y/a81wb7gGvZQfT6Arg4eY3F/d8kGbv3HULNq804d97J/pi/THMxEsWhjgsEIKh76ZllmlhKCmApKVC7YpRheiYEAsKCM7O3l2FuHq7Ri9RkMijxvKHEdbzq62PusVOq7w/0s48PN8cSc6au9tGunlYmSy4WER0sEBxQY/X1L8qCwNeoHRBCFvT9FQaDDmvuy1jCOhQSIUakJXIdPHwazkk/KGXs6SctRK/XqrFvOnu9ihI7rs6A57kUAOjuHWYDgx5Vx9C8iGhUYmtzV+O1l7cSAIhGJbzzQTuck34CAJ6J28Mcn7zGpnwBBgAHDuzOIYT0qQAEsVQAqN3+BKkoL1WZ7m05Qj/64vSSbmRFQe/IJZXEo5YHCQB0nBliXl8QAFBZ+bjQ1Gh7TJWotrbatNKS19ue5UBI4mYoJmOS8OGbVgw7J1h2phmWkgICAHWvVHMrXqIAkJWVpl0pmJlhRmZ6KvH7Z9i27a/fINz68ZNf29nqe9PJ1opNJF78z54CsnBVn2hssFXdKXPUPY7Ojt5iWaFOQkh3U6PtqRVO9BIwu/2COHD+x2T8b/+6/Q51R+mm2kvtHgAAAABJRU5ErkJggg==`, | |
| download: `data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAApgAAAKYB3X3/OAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAPuSURBVEiJtVVrTFtlGH6+0gttodDCSsEWUguMIoYNurlFt5GZbE12wduymTkNBBf9NRNFk6ETkgWc0f0wC1FMFpfNwIyDKNvQZQEiGKdiM2Rc5DJoM0qlXNrT0uuhnz8WDjuUrWPq8+97n/c8z/t+ec/7EUop/k8IHiaJEJLwqAZktQ4IITqxWFghl4v2yyTCNKNRHfF6QwG3J8C4mcBFu93zGaXUv2YDQki8NkNx1qBX7Xxh/xPK3TsN4vU5qRwfiVBcbOkL1Z3ucrjdgUbbHXcdpdT9UAaEEKM+S9lcf3qf3vxstiRWZVeu/cVW13U6Zma9Vyds7g8opdP3NSCEGDYUaLraLr2arklb23X/9LM1UnXyumNykuket82/Sym18gwAEH2W8o+Oy2Ubs3TJaxK/F5beKRyvueYYHpu7OW6df5tSOgAARKtVHHujbHNtxZEi2SOrA0hMlEAijkPXL1acqG2ft91xDdmnfG+RHINqIDNdbszOUvwbfZRseQz5OSrUn+/jYm2dtgApfnLdXE9LqXItYrOuIFRJEhDy4LxdZT8yApU8Lg7hMI+w2b1oaByEwxk96h03plBafhX2/ims/IXCbIR3XlgIegRCAUTw+bjgt2238V5NN+K9frjGnVEGv/dO47BZiw+/vAVL/wwXb7o8huK9zTjXPMLLv7sqIsvOF1pG8FV1EV4p1SHkDaP2jIX3wdGXjRh1slifr0ZxQSpiQbgy8HimAiM2LwoMClzpmUbRU1oen6wQ49OqrVFCh/Ya8KJZD5GQv96ill3l0ULUt07i+eM9CEtE2L1dF7PKJdwrfsMyHXF5wn9HdZCulqH+5LaYYj4/i/dP/YrB0XmUH8jFgdJcjvMHWByp7BwctTIlUR2wi/xJmHMFsaf8BzQ0DfHi51uGsTk3Ad/UmLA1Q4rfLA6O8yyEAdBpSqmHM2C8YZj2NcO05xJvOoYn3PAvhNB6fYJn0Ds4i+1FKUhMEsK3yOLMuX6OU6dIUfZS3oaCHFVTXI4uoeqwWSfq7mcw52Rg3pSGvjEGO7ZkAAC0GjkM+iRUHMyDTLp8oxq1HJWfWBAvEuDjxjEcqyhEZsbyoty2SSP9+vtRJTemOzamgBUI0XFrHmUH83jVPmPSIFUZj2BokYsVF6Tii49KMMOK8PmpEjxt0qy8bQCAMMRGggCkQp8XZ0+YAJHoLhMMckmsIA7PvdnuGLrtsifIRetaG3bpdOlypKtleP1Q3qrCSyAlJnV1okz4TppKIr5fktXh9/05wrzmmFn4jhCiKzSmtOdnJ8fcjjcHZp1LD44UQNoDchlK6RxXFSEyAOpYBgCcqz76/yX+AbrdiORE+q5tAAAAAElFTkSuQmCC`, | |
| }; | |
| // User-configurable actions | |
| const PURCHASE_FAIL_ACTION = await getFreeleechFailAction(); | |
| const WASTE_ACTION = await getWasteAction(); | |
| const grabTorrent = GRAB_ACTIONS[WASTE_ACTION] ?? ((id, url) => {}); | |
| const IMG_ICON_TO_CLICK = IMG_ICON_TO_CLICK_MAP[WASTE_ACTION]; | |
| const IMG_ICON_SUCCESS = `data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAsQAAALEBxi1JjQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAGTSURBVEiJ7ZO7ThtBGEbPzBjbKCCRNwgSTxCFhksZAcI0KagRWDjcJCipED1NOipTIYtLHRuMRANI6VPzAAgvkYLjXXt3/hTYEpe1WRvo+Mpfo3Pm8g2855mo1wKtXax1l2+9dV+CSdcvJwORw73U7sarCGZOV/vifvUYGGzMHNfBaP3jxYI6vAh8uT+v2RpO5cbTbwEHMMpgCeLmLeAAXuARiF9SAJmTpa8gC1bkoxJdvPlztXUwfVDtFG5FKLnXwYd4IqUyxcVvAofca5Qg50G3N5Edyf5tFy5iKbmO32XM/N5kbkcLbPKorgo1HPuXLMyezfa+BA6ggU+h96AYMpVEviHpBN4Q/AoV1E9iKol8+mi5vxM4gNbWrgK3rSRa28tO4AB6e2z7txY9Djx50OfSgMd0VyYMfrfBer4fLw9bZfNAb9jCVvD91G622boH7YkqiQp/IogiaQceKmglaRfeVACQPlkY1aJ+Aj1w9/0dt9S0LW0LAOYKiwMmxkbN1j6Xq+WqEVnJTeXOosLfEyn/AWKDDrpj1jJOAAAAAElFTkSuQmCC`; | |
| async function clearSettings() { | |
| await GM.deleteValue("wasteAction"); | |
| await GM.deleteValue("freeleechFailAction"); | |
| window.location.reload(); | |
| } | |
| function promptDropdown(label, options, defaultValue) { | |
| return new Promise((resolve) => { | |
| // Create modal elements | |
| const modal = document.createElement("div"); | |
| modal.style = ` | |
| position: fixed; left: 0; top: 0; width: 100vw; height: 100vh; | |
| background: rgba(0,0,0,0.5); display: flex; align-items: center; justify-content: center; z-index: 10000; | |
| `; | |
| const box = document.createElement("div"); | |
| box.style = `padding: 16px; border-radius: 6px; min-width: 220px; border: 1px solid white`; | |
| box.innerHTML = `<label>${label}</label><br><br>`; | |
| box.style.backgroundColor = getComputedStyle( | |
| document.body, | |
| ).backgroundColor; | |
| const select = document.createElement("select"); | |
| for (const opt of options) { | |
| let option = document.createElement("option"); | |
| option.value = opt; | |
| option.textContent = opt; | |
| if (opt === defaultValue) option.selected = true; | |
| select.appendChild(option); | |
| } | |
| const okButton = document.createElement("button"); | |
| okButton.textContent = "OK"; | |
| okButton.style = "margin-left:10px;"; | |
| box.appendChild(select); | |
| box.appendChild(okButton); | |
| modal.appendChild(box); | |
| document.body.appendChild(modal); | |
| okButton.onclick = () => { | |
| resolve(select.value); | |
| document.body.removeChild(modal); | |
| }; | |
| }); | |
| } | |
| async function getWasteAction() { | |
| const storageKey = "wasteAction"; | |
| const grabChoices = Object.keys(GRAB_ACTIONS); | |
| let choice = await GM.getValue(storageKey, null); | |
| if (grabChoices.includes(choice)) { | |
| return choice; | |
| } else { | |
| choice = await promptDropdown( | |
| "What action do you want to take when Wedge Wasting?", | |
| grabChoices, | |
| grabChoices[0], | |
| ); | |
| await GM.setValue(storageKey, choice); | |
| return choice; | |
| } | |
| } | |
| async function getFreeleechFailAction() { | |
| const storageKey = "freeleechFailAction"; | |
| let choice = await GM.getValue(storageKey, null); | |
| if (choice === null) { | |
| let rawChoice = await promptDropdown( | |
| "Do you want to take the action if the freeleech purchase fails?", | |
| ["Yes", "No"], | |
| ["Yes"], | |
| ); | |
| choice = { Yes: "act", No: "dontAct" }[rawChoice] ?? null; | |
| await GM.setValue(storageKey, choice); | |
| } | |
| return choice; | |
| } | |
| // Returns whether we are on the details page | |
| function onDetailsPage() { | |
| return window.location.pathname.match(/\/t\/\d+/); | |
| } | |
| // Returns whether we are on the home page | |
| function onHomePage() { | |
| return ( | |
| window.location.pathname === "/" || | |
| window.location.pathname === "/index.php" | |
| ); | |
| } | |
| // Returns whether we're on the browse page | |
| function onBrowsePage() { | |
| return window.location.pathname.match(/\/tor\/browse\.php/); | |
| } | |
| function onPrefsPage() { | |
| return window.location.pathname.match(/preferences\/index\.php.*/); | |
| } | |
| // Create the large WedgeWaster button | |
| function makeWWButton() { | |
| let button = document.createElement("div"); | |
| button.style = "margin-top: 1em"; | |
| button.innerHTML = `<img style="max-width: 130px" src="${IMG_BUTTON_TO_CLICK}">`; | |
| return button; | |
| } | |
| // Create the small WedgeWaster icon | |
| function makeWWIcon(source) { | |
| const computedStyle = window.getComputedStyle(source); | |
| const copiedProps = [ | |
| "display", | |
| "padding", | |
| "width", | |
| "height", | |
| "user-select", | |
| "cursor", | |
| ]; | |
| let button = document.createElement("a"); | |
| copiedProps.forEach((prop) => { | |
| button.style[prop] = computedStyle.getPropertyValue(prop); | |
| }); | |
| button.style.backgroundImage = `url(${IMG_ICON_TO_CLICK})`; | |
| button.style.backgroundRepeat = "no-repeat"; | |
| return button; | |
| } | |
| // When the purchase button is clicked | |
| function purchaseTorrent(torrentID, torrentFileURL, pageType) { | |
| let freeleechURL = `https://www.myanonamouse.net/json/bonusBuy.php/?spendtype=personalFL&torrentid=${torrentID}`; | |
| function purchaseSuccessAction(message) { | |
| // Update Ratio box | |
| if (pageType === "details") { | |
| let ratioBox = document.getElementById("ratio"); | |
| ratioBox.getElementsByClassName( | |
| "torDetInnerBottomSpan", | |
| )[0].innerText = "This torrent is a Personal freeleech!"; | |
| } | |
| grabTorrent(torrentID, torrentFileURL); | |
| console.log(`WedgeMarker | Success: ${message}`); | |
| } | |
| const PURCHASE_ACTIONS = { | |
| act: (message) => { | |
| console.log(`WedgeMarker | Warn: ${message}`); | |
| grabTorrent(torrentID, torrentFileURL); | |
| }, | |
| dontAct: (message) => { | |
| console.log(`WedgeMarker | Error: ${message}`); | |
| alert( | |
| `WedgeMarker\n\nError: Torrent Not Grabbed.\n\n${message}`, | |
| ); | |
| }, | |
| }; | |
| const purchaseFailAction = | |
| PURCHASE_ACTIONS[PURCHASE_FAIL_ACTION] ?? ((id, url) => {}); | |
| var xhr = new XMLHttpRequest(); | |
| xhr.open("GET", freeleechURL, true); | |
| xhr.onreadystatechange = () => { | |
| if (this.readyState == 4 && this.status == 200) { | |
| let mamResponse = JSON.parse(this.response); | |
| let successfulPurchase = mamResponse.success; | |
| successfulPurchase | |
| ? purchaseSuccessAction(mamResponse.type) | |
| : purchaseFailAction(mamResponse.error); | |
| } | |
| }; | |
| xhr.send(); | |
| } | |
| // (Browe page) Look for changes and add buttons | |
| function findThenAddButtons(mutations) { | |
| // Function to Process each row that is a torrent | |
| function processTorrentRow(torrentRow) { | |
| function alreadyFreeleech() { | |
| let vipFreeleech = | |
| torrentRow.children[1].querySelector('img[alt="VIP"]'); | |
| let siteFreeleech = torrentRow.children[1].querySelector( | |
| 'img[alt="freeleech"]', | |
| ); | |
| let personalFreeleech = torrentRow.children[1].querySelector( | |
| 'span[title="personal freeleech"]', | |
| ); | |
| return vipFreeleech || siteFreeleech || personalFreeleech; | |
| } | |
| // Get torrent ID and File URL from the default download button | |
| let downloadButton = | |
| torrentRow.getElementsByClassName("directDownload")[0]; | |
| let titleLink = torrentRow.getElementsByClassName("torTitle"); | |
| // let torrentID = downloadButton.id.match(/dlLink(\d+)/)[1]; // other way doesnt work on homepage | |
| let torrentID = titleLink[0].href.match(/\/t\/(.*)/)[1]; | |
| let torrentFileURL = downloadButton.href; | |
| // Add the WedgeMarker button above/before the normal download button | |
| let wedgeWasterButton = makeWWIcon(downloadButton); | |
| wedgeWasterButton.addEventListener("click", () => { | |
| if (alreadyFreeleech()) { | |
| console.log( | |
| "WedgeMarker | Info: Save a wedge, this torrent is already freeleech!", | |
| ); | |
| grabTorrent(torrentID, torrentFileURL); | |
| wedgeWasterButton.src = IMG_ICON_SUCCESS; | |
| } else { | |
| purchaseTorrent(torrentID, torrentFileURL, "browse"); | |
| wedgeWasterButton.src = IMG_ICON_SUCCESS; | |
| } | |
| }); | |
| downloadButton.parentNode.insertBefore( | |
| wedgeWasterButton, | |
| downloadButton, | |
| ); | |
| } | |
| try { | |
| // For all torrent elements in the table | |
| let torrentRows = document | |
| .getElementsByTagName("tbody")[1] | |
| .getElementsByTagName("tr"); | |
| for (let torrentRow of torrentRows) { | |
| let isActualTorrentRow = | |
| torrentRow.getElementsByClassName("directDownload") | |
| .length == 1; | |
| if (isActualTorrentRow) { | |
| processTorrentRow(torrentRow); | |
| } | |
| } | |
| } catch (e) { | |
| if (e instanceof TypeError) { | |
| // No changes or not ready | |
| } else { | |
| console.log(`WedgeMarker | Error: Unexpected Error\n\n${e}`); | |
| } | |
| } | |
| } | |
| // | |
| // When page loads | |
| // | |
| console.log( | |
| `WedgeMarker | Info: PURCHASE_FAIL_ACTION = ${PURCHASE_FAIL_ACTION}`, | |
| ); | |
| console.log(`WedgeMarker | Info: WASTE_ACTION = ${WASTE_ACTION}`); | |
| var searchResultsUpdated = new MutationObserver(findThenAddButtons); | |
| if (onDetailsPage()) { | |
| let torrentFileURL = document.getElementById("tddl").href; | |
| let torrentID = document.URL.match(/\/t\/(\d+)/)[1]; | |
| let pageType = "details"; | |
| let downloadButtons = document | |
| .getElementById("download") | |
| .getElementsByClassName("torDetInnerBottom")[0]; | |
| // Add WedgeMarker button | |
| let button = makeWWButton(); | |
| button.addEventListener("click", () => { | |
| let freeLeechStatusText = document | |
| .getElementById("ratio") | |
| .getElementsByClassName("torDetInnerBottomSpan")[0].innerText; | |
| let freeLeechStatus = freeLeechStatusText.match(/freeleech/i); | |
| if (freeLeechStatus) { | |
| console.log( | |
| "WedgeMarker | Info: Save a wedge, this torrent is already freeleech!", | |
| ); | |
| grabTorrent(torrentID); | |
| } else { | |
| purchaseTorrent(torrentID, torrentFileURL); | |
| } | |
| }); | |
| // ...below normal download button | |
| downloadButtons.appendChild(button); | |
| // | |
| // | |
| } else if (onBrowsePage() || onHomePage()) { | |
| let target = document.getElementById("ssr"); | |
| let config = { childList: true }; | |
| // Monitor page for any changes | |
| searchResultsUpdated.observe(target, config); | |
| // | |
| // | |
| } else if (onPrefsPage()) { | |
| function getSettingsMenu() { | |
| return document | |
| .getElementById("mainBody") | |
| .getElementsByTagName("tr")[0]; | |
| } | |
| function makeWWResetSettingsButton(menu) { | |
| let newButton = [ | |
| menu.childNodes[2].cloneNode(true), // spacer | |
| menu.childNodes[3].cloneNode(true), // anchor tag | |
| ]; | |
| let anchor = newButton[1].children[0]; | |
| anchor.innerHTML = "WedgeWaster<br/>Reset Settings"; | |
| anchor.href = "#"; | |
| anchor.onclick = (event) => { | |
| event.preventDefault(); | |
| clearSettings(); | |
| }; | |
| return newButton; | |
| } | |
| function insertWWResetSettingsButton(menu, newSettingsButton) { | |
| newSettingsButton.forEach((el) => { | |
| menu.insertBefore(el, menu.children[menu.children.length - 1]); | |
| }); | |
| } | |
| let menu = getSettingsMenu(); | |
| let newButton = makeWWResetSettingsButton(menu); | |
| insertWWResetSettingsButton(menu, newButton); | |
| } | |
| })(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment