# HG changeset patch # User nanaya # Date 1530894576 -32400 # Node ID 19c391840d4ac47235e570e3aa8e0d64dec80113 # Parent e76b7766d5bf06654e6a16647e6d47864e43f1ca Rewrite the whole thing to use observer instead And holy crap plain javascript is stupid. Doesn't help I'm not using smarter loop method. diff -r e76b7766d5bf -r 19c391840d4a tweetdeck-large-image.user.js --- a/tweetdeck-large-image.user.js Sat Jun 30 21:56:55 2018 +0900 +++ b/tweetdeck-large-image.user.js Sat Jul 07 01:29:36 2018 +0900 @@ -1,7 +1,7 @@ // ==UserScript== // @name Tweetdeck large image // @namespace https://myconan.net -// @version 1.0.2 +// @version 2.0.0 // @description No more stupid link for images in tweetdeck // @author nanaya // @match https://tweetdeck.twitter.com/* @@ -12,23 +12,63 @@ ;(function() { "use strict"; - var $ = jQuery; - var replaceLink = function(e) { - var link = e.currentTarget; - if (link._ecUserscript === true) { return; } - - var images = link.getElementsByClassName("media-img"); - + // loop through passed nodes (or body if called without arguments) + var run = function(nodes) { + if (nodes === undefined) { + nodes = [document.body]; + } + + for (var i = 0; i < nodes.length; i++) { + // first try fixing itself + fix(nodes[i]); + + // and then find all the links inside + var links = nodes[i].querySelectorAll(".js-media-image-link"); + + for (var j = 0; j < links.length; j++) { + fix(links[j]); + } + } + }; + + var fix = function(link) { + // basic sanity check + if (!link.classList.contains("js-media-image-link")) { + return; + } + + // don't run again if already run on passed link + if (link._ecUserscript) { + return; + } + link._ecUserscript = true; + + var image = link.querySelector(".media-img"); var url; - if (images.length) { - url = images[0].src.replace(/:[a-z0-9]+$/, ""); + + if (image === null) { + // sometimes the image is just background image of the link. + // strip all query strings and original :size suffix + url = getComputedStyle(link).backgroundImage.replace(/^url\(('|")?(.+?)(?::small)?(?:\?.*)?\1\)$/, "$2"); } else { - url = getComputedStyle(link).backgroundImage.replace(/^url\(('|")?(.+?)(:small)?\1\)$/, "$2"); + url = image.src.replace(/:[a-z0-9]+(?:\?.*)?$/, ""); } + link.setAttribute("href", url + ":orig"); - link._ecUserscript = true; + + }; + + var onMutate = function(mutations) { + for (var mutation in mutations) { + run(mutation.addedNodes); + } }; - - $(document).off(".ec-userscript"); - $(document).on("mouseenter.ec-userscript", ".js-media-image-link", replaceLink); -}).call(); \ No newline at end of file + + // the observer + var observer = new MutationObserver(onMutate); + + // start the observer + observer.observe(document, { childList: true, subtree: true}); + // initial run on existing document + run(); +}).call();