avm99963 | cbea314 | 2019-03-28 00:48:15 +0100 | [diff] [blame] | 1 | var mutationObserver, intersectionObserver, options; |
| 2 | |
avm99963 | af7860e | 2019-06-04 03:33:26 +0200 | [diff] [blame] | 3 | function parseUrl(url) { |
| 4 | var forum_a = url.match(/forum\/([0-9]+)/i); |
| 5 | var thread_a = url.match(/thread\/([0-9]+)/i); |
| 6 | |
| 7 | if (forum_a === null || thread_a === null) { |
| 8 | return false; |
| 9 | } |
| 10 | |
| 11 | return { |
| 12 | "forum": forum_a[1], |
| 13 | "thread": thread_a[1] |
| 14 | }; |
| 15 | } |
| 16 | |
avm99963 | 3b9ff84 | 2019-06-04 04:01:31 +0200 | [diff] [blame^] | 17 | function duplicateThreads() { |
| 18 | var modal = document.querySelector(".pane[pane-id=\"default-1\"]"); |
| 19 | var duplicateinto = parseUrl(modal.querySelector("#infinitegforums_duplicateinto").value); |
| 20 | if (duplicateinto === false) { |
| 21 | return; |
| 22 | } |
| 23 | modal.querySelector("footer").style.display = "none"; |
| 24 | var checkboxes = document.querySelectorAll(".thread-group material-checkbox[aria-checked=\"true\"]"); |
| 25 | modal.querySelector("main").innerHTML = '<p style="text-align: center;">'+chrome.i18n.getMessage("inject_duplicate_progress")+':<br><progress id="infinitegforums_progress" max="'+checkboxes.length+'" value="0"></progress></p>'; |
| 26 | checkboxes.forEach(checkbox => { |
| 27 | var thread = parseUrl(checkbox.parentNode.parentNode.querySelector("a.header-content").href); |
| 28 | var script = document.createElement('script'); |
| 29 | script.textContent = 'fetch("https://support.google.com/s/community/api/MarkDuplicateThread", {"credentials":"include","headers":{"content-type":"text/plain; charset=utf-8"},"body":\'{\"1\":\"'+thread.forum+'\",\"2\":\"'+thread.thread+'\",\"3\":{\"2\":{\"1\":\"'+duplicateinto.forum+'\",\"2\":\"'+duplicateinto.thread+'\"}}}\',"method":"POST","mode":"cors"}).then(_ => { var progress = document.querySelector("#infinitegforums_progress"); progress.value = parseInt(progress.value) + 1; if (progress.value == progress.getAttribute("max")) { location.reload(); } });'; |
| 30 | document.head.appendChild(script); |
| 31 | script.remove(); |
| 32 | }); |
| 33 | } |
| 34 | |
avm99963 | 847ee63 | 2019-03-27 00:57:44 +0100 | [diff] [blame] | 35 | function mutationCallback(mutationList, observer) { |
| 36 | mutationList.forEach((mutation) => { |
| 37 | if (mutation.type == "childList") { |
| 38 | mutation.addedNodes.forEach(function (node) { |
avm99963 | d075725 | 2019-03-30 20:13:00 +0100 | [diff] [blame] | 39 | if (typeof node.classList !== "undefined") { |
| 40 | if (options.list && node.classList.contains("view-more-button-container")) { |
| 41 | intersectionObserver.observe(node.querySelector(".view-more-button")); |
| 42 | } |
Nico Sinisterra | 4ae1c57 | 2019-03-27 12:57:13 -0300 | [diff] [blame] | 43 | |
avm99963 | d075725 | 2019-03-30 20:13:00 +0100 | [diff] [blame] | 44 | if (options.thread && node.classList.contains("load-more-bar")) { |
| 45 | intersectionObserver.observe(node.querySelector(".load-more-button")); |
| 46 | } |
| 47 | |
avm99963 | 6d9c5fe | 2019-06-04 00:35:53 +0200 | [diff] [blame] | 48 | if (options.threadall && node.classList.contains("load-more-bar")) { |
| 49 | intersectionObserver.observe(node.querySelector(".load-all-button")); |
| 50 | } |
| 51 | |
avm99963 | d075725 | 2019-03-30 20:13:00 +0100 | [diff] [blame] | 52 | if (options.history && ("parentNode" in node) && node.parentNode !== null && ("tagName" in node.parentNode) && node.parentNode.tagName == "EC-USER") { |
| 53 | var nameElement = node.querySelector(".name span"); |
| 54 | if (nameElement !== null) { |
| 55 | var name = encodeURIComponent(nameElement.innerText); |
| 56 | var link = document.createElement("a"); |
| 57 | link.setAttribute("href", "https://support.google.com/s/community/search/query%3D%2528creator%253A%2522"+name+"%2522%2B%257C%2Breplier%253A%2522"+name+"%2522%2529%2B-forum%253A0"); |
avm99963 | a3d1ef3 | 2019-03-30 23:33:29 +0100 | [diff] [blame] | 58 | link.innerText = chrome.i18n.getMessage("inject_previousposts"); |
avm99963 | d075725 | 2019-03-30 20:13:00 +0100 | [diff] [blame] | 59 | node.querySelector(".main-card").appendChild(document.createElement("br")); |
| 60 | node.querySelector(".main-card").appendChild(link); |
| 61 | } |
| 62 | } |
avm99963 | af7860e | 2019-06-04 03:33:26 +0200 | [diff] [blame] | 63 | |
| 64 | if (options.batchduplicate && ("tagName" in node) && node.tagName == "MATERIAL-BUTTON" && node.getAttribute("debugid") !== null && (node.getAttribute("debugid") == "mark-read-button" || node.getAttribute("debugid") == "mark-unread-button") && ("parentNode" in node) && document.querySelector("[debugid=\"batchduplicate\"]") === null && node.parentNode !== null && ("parentNode" in node.parentNode) && node.parentNode.parentNode !== null && ("tagName" in node.parentNode.parentNode) && node.parentNode.parentNode.tagName == "EC-BULK-ACTIONS") { |
| 65 | var clone = node.cloneNode(true); |
| 66 | clone.setAttribute("debugid", "batchduplicate"); |
| 67 | clone.setAttribute("title", chrome.i18n.getMessage("inject_duplicatebtn")); |
| 68 | clone.querySelector("material-icon").setAttribute("icon", "control_point_duplicate"); |
| 69 | clone.querySelector("i.material-icon-i").innerText = "control_point_duplicate"; |
| 70 | node.parentNode.prepend(clone); |
| 71 | clone.addEventListener("click", function() { |
| 72 | var modal = document.querySelector(".pane[pane-id=\"default-1\"]"); |
| 73 | modal.classList.add("visible"); |
| 74 | modal.style.display = "block"; |
| 75 | modal.innerHTML = '<material-dialog role="dialog" aria-modal="true" style="display: block!important; width: 600px; max-width: 100%; margin: 8px auto; padding: 16px 0; background: white; box-shadow: 0 24px 38px 3px rgba(0,0,0,.14), 0 9px 46px 8px rgba(0,0,0,.12), 0 11px 15px -7px rgba(0,0,0,.2);"><header role="presentation" style="padding: 24px 24px 0; width: 100%; box-sizing: border-box;"><div style="color: #202124; font-family: \'Google Sans\',sans-serif; font-size: 18px; font-weight: 400; line-height: 24px; margin-bottom: 4px; text-align: center;">'+chrome.i18n.getMessage("inject_duplicatebtn")+'</div></header><main role="presentation" style="font-size: 13px; font-weight: 400; color: rgba(0,0,0,.87); overflow: auto; padding: 0 24px;"><p><label for="duplicate_thread">'+chrome.i18n.getMessage("inject_duplicateinto")+' </label><input type="url" id="infinitegforums_duplicateinto" placeholder="'+chrome.i18n.getMessage("inject_duplicateinto_placeholder")+'" style="width: 400px;"></p></main><footer role="presentation" style="padding: 0 24px;"><material-button role="button" style="display: inline-block; float: right; color: #1a73e8; height: 36px; min-width: 64px; margin: 0 4px; cursor: pointer;" id="infinitegforums_duplicate"><div class="content" style="line-height: 36px; text-align: center;">'+chrome.i18n.getMessage("inject_duplicate_confirm")+'</div></material-button><material-button role="button" style="display: inline-block; float: right; color: #1a73e8; height: 36px; min-width: 64px; margin: 0 4px; cursor: pointer;" id="infinitegforums_cancel"><div class="content" style="line-height: 36px; text-align: center;">'+chrome.i18n.getMessage("inject_duplicate_cancel")+'</div></material-button><div style="clear: both;"></div></footer></material-dialog>'; |
avm99963 | 3b9ff84 | 2019-06-04 04:01:31 +0200 | [diff] [blame^] | 76 | modal.querySelector("#infinitegforums_duplicateinto").focus(); |
avm99963 | af7860e | 2019-06-04 03:33:26 +0200 | [diff] [blame] | 77 | modal.querySelector("#infinitegforums_cancel").addEventListener("click", function() { |
| 78 | var modal = document.querySelector(".pane[pane-id=\"default-1\"]"); |
| 79 | modal.classList.remove("visible"); |
| 80 | modal.style.display = "none"; |
| 81 | modal.innerHTML = ""; |
| 82 | }); |
avm99963 | 3b9ff84 | 2019-06-04 04:01:31 +0200 | [diff] [blame^] | 83 | modal.querySelector("#infinitegforums_duplicateinto").addEventListener("keypress", function() { |
| 84 | if (event.keyCode == 13) { |
| 85 | duplicateThreads(); |
avm99963 | af7860e | 2019-06-04 03:33:26 +0200 | [diff] [blame] | 86 | } |
avm99963 | af7860e | 2019-06-04 03:33:26 +0200 | [diff] [blame] | 87 | }); |
avm99963 | 3b9ff84 | 2019-06-04 04:01:31 +0200 | [diff] [blame^] | 88 | modal.querySelector("#infinitegforums_duplicate").addEventListener("click", duplicateThreads); |
avm99963 | af7860e | 2019-06-04 03:33:26 +0200 | [diff] [blame] | 89 | }); |
| 90 | } |
avm99963 | d075725 | 2019-03-30 20:13:00 +0100 | [diff] [blame] | 91 | } |
avm99963 | 847ee63 | 2019-03-27 00:57:44 +0100 | [diff] [blame] | 92 | }); |
| 93 | } |
| 94 | }); |
| 95 | } |
| 96 | |
| 97 | function intersectionCallback(entries, observer) { |
| 98 | entries.forEach(entry => { |
| 99 | if (entry.isIntersecting) { |
| 100 | entry.target.click(); |
| 101 | } |
| 102 | }); |
| 103 | }; |
| 104 | |
| 105 | var observerOptions = { |
| 106 | childList: true, |
| 107 | attributes: true, |
| 108 | subtree: true |
| 109 | } |
| 110 | |
avm99963 | 847ee63 | 2019-03-27 00:57:44 +0100 | [diff] [blame] | 111 | var intersectionOptions = { |
| 112 | root: document.querySelector('.scrollable-content'), |
| 113 | rootMargin: '0px', |
| 114 | threshold: 1.0 |
| 115 | } |
| 116 | |
avm99963 | cbea314 | 2019-03-28 00:48:15 +0100 | [diff] [blame] | 117 | chrome.storage.sync.get(null, function(items) { |
| 118 | options = items; |
| 119 | |
| 120 | mutationObserver = new MutationObserver(mutationCallback); |
| 121 | mutationObserver.observe(document.querySelector(".scrollable-content"), observerOptions); |
| 122 | |
| 123 | intersectionObserver = new IntersectionObserver(intersectionCallback, intersectionOptions); |
avm99963 | 122dc9b | 2019-03-30 18:44:18 +0100 | [diff] [blame] | 124 | |
| 125 | if (options.fixedtoolbar) { |
| 126 | var link = document.createElement('link'); |
| 127 | link.setAttribute("rel", "stylesheet"); |
avm99963 | 8a3a615 | 2019-03-31 21:12:02 +0200 | [diff] [blame] | 128 | link.setAttribute("href", "data:text/css;charset=UTF-8,ec-bulk-actions{position: sticky; top: 0; background: white; z-index: 96;}"); |
avm99963 | b21f625 | 2019-03-30 22:06:21 +0100 | [diff] [blame] | 129 | document.head.appendChild(link); |
avm99963 | 122dc9b | 2019-03-30 18:44:18 +0100 | [diff] [blame] | 130 | } |
avm99963 | cbea314 | 2019-03-28 00:48:15 +0100 | [diff] [blame] | 131 | }); |