Microsoft Update Catalog - Auto Highlight the version for your OS

Auto Highlight the version for your OS when you download the updates from Microsoft Update Catalog

Verze ze dne 14. 07. 2021. Zobrazit nejnovější verzi.

// ==UserScript==
// @name         Microsoft Update Catalog - Auto Highlight the version for your OS
// @namespace    http://tampermonkey.net/
// @version      0.2
// @description  Auto Highlight the version for your OS when you download the updates from Microsoft Update Catalog
// @author       You
// @match        https://www.catalog.update.microsoft.com/*
// @icon         https://www.google.com/s2/favicons?domain=microsoft.com
// @grant        none
// ==/UserScript==

(function $$() {
    'use strict';

    if(!document.documentElement) return window.requestAnimationFrame($$);


    function addStyle(styleText) {
        const styleNode = document.createElement('style');
        styleNode.type = 'text/css';
        styleNode.textContent = styleText;
        document.documentElement.appendChild(styleNode);
        return styleNode;
    }

    const cssText=`
    [ms-update-highlighted-row] td{
    font-weight:900;
    }
    [ms-update-highlighted-row] td input:only-of-type{
    font-weight:600;
    background-color:rgba(100,135,220,0.3);
    }

    `


    function isIntelX64(){
    // https://stackoverflow.com/a/13709431/6764107

        if(!window.navigator)return null;

        let ua= navigator.userAgent;
        if(!ua || typeof ua !='string')return null;

        let kua = ua.replace(/64\d/g,'').replace(/\s*[;,]\s*/,'$1 ')

        let res1 = /x86_64|x86\-64|Win64|x64;|amd64|AMD64|WOW64|x64_64/.test(kua);
        let res2 = /ia64|sparc64|ppc64|IRIX64/.test(kua);

        return res1 && !res2;

    }



    /* DEMO http://jsfiddle.net/rLnwg3vy/ */

    /**
 * JavaScript Client Detection
 * (C) viazenetti GmbH (Christian Ludwig)
 */
function getJSCD () {
    {
        let screen = window.screen;
        var unknown = '-';

        // screen
        var screenSize = '';
        if (screen && screen.width) {
            let width = (screen.width) ? screen.width : '';
            let height = (screen.height) ? screen.height : '';
            screenSize += '' + width + " x " + height;
        }

        // browser
        var nVer = navigator.appVersion;
        var nAgt = navigator.userAgent;
        var browser = navigator.appName;
        var version = '' + parseFloat(navigator.appVersion);
        var majorVersion = parseInt(navigator.appVersion, 10);
        var nameOffset, verOffset, ix;

        // Opera
        if ((verOffset = nAgt.indexOf('Opera')) != -1) {
            browser = 'Opera';
            version = nAgt.substring(verOffset + 6);
            if ((verOffset = nAgt.indexOf('Version')) != -1) {
                version = nAgt.substring(verOffset + 8);
            }
        }
        // Opera Next
        if ((verOffset = nAgt.indexOf('OPR')) != -1) {
            browser = 'Opera';
            version = nAgt.substring(verOffset + 4);
        }
        // Legacy Edge
        else if ((verOffset = nAgt.indexOf('Edge')) != -1) {
            browser = 'Microsoft Legacy Edge';
            version = nAgt.substring(verOffset + 5);
        }
        // Edge (Chromium)
        else if ((verOffset = nAgt.indexOf('Edg')) != -1) {
            browser = 'Microsoft Edge';
            version = nAgt.substring(verOffset + 4);
        }
        // MSIE
        else if ((verOffset = nAgt.indexOf('MSIE')) != -1) {
            browser = 'Microsoft Internet Explorer';
            version = nAgt.substring(verOffset + 5);
        }
        // Chrome
        else if ((verOffset = nAgt.indexOf('Chrome')) != -1) {
            browser = 'Chrome';
            version = nAgt.substring(verOffset + 7);
        }
        // Safari
        else if ((verOffset = nAgt.indexOf('Safari')) != -1) {
            browser = 'Safari';
            version = nAgt.substring(verOffset + 7);
            if ((verOffset = nAgt.indexOf('Version')) != -1) {
                version = nAgt.substring(verOffset + 8);
            }
        }
        // Firefox
        else if ((verOffset = nAgt.indexOf('Firefox')) != -1) {
            browser = 'Firefox';
            version = nAgt.substring(verOffset + 8);
        }
        // MSIE 11+
        else if (nAgt.indexOf('Trident/') != -1) {
            browser = 'Microsoft Internet Explorer';
            version = nAgt.substring(nAgt.indexOf('rv:') + 3);
        }
        // Other browsers
        else if ((nameOffset = nAgt.lastIndexOf(' ') + 1) < (verOffset = nAgt.lastIndexOf('/'))) {
            browser = nAgt.substring(nameOffset, verOffset);
            version = nAgt.substring(verOffset + 1);
            if (browser.toLowerCase() == browser.toUpperCase()) {
                browser = navigator.appName;
            }
        }
        // trim the version string
        if ((ix = version.indexOf(';')) != -1) version = version.substring(0, ix);
        if ((ix = version.indexOf(' ')) != -1) version = version.substring(0, ix);
        if ((ix = version.indexOf(')')) != -1) version = version.substring(0, ix);

        majorVersion = parseInt('' + version, 10);
        if (isNaN(majorVersion)) {
            version = '' + parseFloat(navigator.appVersion);
            majorVersion = parseInt(navigator.appVersion, 10);
        }

        // mobile version
        var mobile = /Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test(nVer);

        // cookie
        var cookieEnabled = (navigator.cookieEnabled) ? true : false;

        if (typeof navigator.cookieEnabled == 'undefined' && !cookieEnabled) {
            document.cookie = 'testcookie';
            cookieEnabled = (document.cookie.indexOf('testcookie') != -1) ? true : false;
        }

        // system
        var os = unknown;
        var clientStrings = [
            {s:'Windows 10', r:/(Windows 10.0|Windows NT 10.0)/},
            {s:'Windows 8.1', r:/(Windows 8.1|Windows NT 6.3)/},
            {s:'Windows 8', r:/(Windows 8|Windows NT 6.2)/},
            {s:'Windows 7', r:/(Windows 7|Windows NT 6.1)/},
            {s:'Windows Vista', r:/Windows NT 6.0/},
            {s:'Windows Server 2003', r:/Windows NT 5.2/},
            {s:'Windows XP', r:/(Windows NT 5.1|Windows XP)/},
            {s:'Windows 2000', r:/(Windows NT 5.0|Windows 2000)/},
            {s:'Windows ME', r:/(Win 9x 4.90|Windows ME)/},
            {s:'Windows 98', r:/(Windows 98|Win98)/},
            {s:'Windows 95', r:/(Windows 95|Win95|Windows_95)/},
            {s:'Windows NT 4.0', r:/(Windows NT 4.0|WinNT4.0|WinNT|Windows NT)/},
            {s:'Windows CE', r:/Windows CE/},
            {s:'Windows 3.11', r:/Win16/},
            {s:'Android', r:/Android/},
            {s:'Open BSD', r:/OpenBSD/},
            {s:'Sun OS', r:/SunOS/},
            {s:'Chrome OS', r:/CrOS/},
            {s:'Linux', r:/(Linux|X11(?!.*CrOS))/},
            {s:'iOS', r:/(iPhone|iPad|iPod)/},
            {s:'Mac OS X', r:/Mac OS X/},
            {s:'Mac OS', r:/(Mac OS|MacPPC|MacIntel|Mac_PowerPC|Macintosh)/},
            {s:'QNX', r:/QNX/},
            {s:'UNIX', r:/UNIX/},
            {s:'BeOS', r:/BeOS/},
            {s:'OS/2', r:/OS\/2/},
            {s:'Search Bot', r:/(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\/Teoma|ia_archiver)/}
        ];
        for (var id in clientStrings) {
            var cs = clientStrings[id];
            if (cs.r.test(nAgt)) {
                os = cs.s;
                break;
            }
        }

        var osVersion = unknown;

        if (/Windows/.test(os)) {
            osVersion = /Windows (.*)/.exec(os)[1];
            os = 'Windows';
        }

        switch (os) {
            case 'Mac OS':
            case 'Mac OS X':
            case 'Android':
                osVersion = /(?:Android|Mac OS|Mac OS X|MacPPC|MacIntel|Mac_PowerPC|Macintosh) ([\.\_\d]+)/.exec(nAgt)[1];
                break;

            case 'iOS':
                osVersion = /OS (\d+)_(\d+)_?(\d+)?/.exec(nVer);
                osVersion = osVersion[1] + '.' + osVersion[2] + '.' + (osVersion[3] | 0);
                break;
        }

        // flash (you'll need to include swfobject)
        /* script src="//ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js" */
        var flashVersion = 'no check';
        if (typeof swfobject != 'undefined') {
            var fv = swfobject.getFlashPlayerVersion();
            if (fv.major > 0) {
                flashVersion = fv.major + '.' + fv.minor + ' r' + fv.release;
            }
            else  {
                flashVersion = unknown;
            }
        }
    }

    return {
        screen: screenSize,
        browser: browser,
        browserVersion: version,
        browserMajorVersion: majorVersion,
        mobile: mobile,
        os: os,
        osVersion: osVersion,
        cookies: cookieEnabled,
        flashVersion: flashVersion,
        isIntelX64: isIntelX64()
    };
}

/*
alert(
    'OS: ' + jscd.os +' '+ jscd.osVersion + '\n' +
    'Browser: ' + jscd.browser +' '+ jscd.browserMajorVersion +
      ' (' + jscd.browserVersion + ')\n' +
    'Mobile: ' + jscd.mobile + '\n' +
    'Flash: ' + jscd.flashVersion + '\n' +
    'Cookies: ' + jscd.cookies + '\n' +
    'Screen Size: ' + jscd.screen + '\n\n' +
    'Full User Agent: ' + navigator.userAgent
);*/







    function nearestParent(dom, f){

        let p = dom;
        while(p && p.nodeType>0){
            if(f(p)) return p
            p=p.parentNode;
        }
        return null;

    }

    function nOfType(elm){
        if(!elm)return -1;
        let parent = elm.parentNode;
        let i=0;
        if(!parent) return -1;
        for(const s of parent.children){
            if(elm===s) return i;
            if(s.nodeName==elm.nodeName) i++;
        }
        return -1;

    }

    let jscd=null;


    let addedStyle=null;



    let m11=1;
    setInterval(function(){
        let e11;
        if(m11&&(e11=document.querySelector('td>a[id*="product"]:only-of-type>span:only-of-type'))){

            m11=0;


            let e22=document.querySelector('td>a[id*="title"]:only-of-type>span:only-of-type');

            if(!e22)return;

            jscd = jscd||getJSCD();

            let osVersion = jscd.os +' '+ jscd.osVersion;
            if(osVersion=='Windows 7'){

            }



            let tContainer = nearestParent(e11, (elm)=>elm.nodeName=="TBODY"||elm.nodeName=="TABLE");

            let idx11=nOfType(nearestParent(e11, (elm)=>elm.nodeName=="TD"))
            let idx22=nOfType(nearestParent(e22, (elm)=>elm.nodeName=="TD"))




            let tds = tContainer.querySelectorAll(`td:nth-of-type(${idx11+1})`)

            for(const elm of tds){

                let txt = elm.textContent.replace(/[^a-zA-Z0-9\-\_\s]/g,'').trim();

                if(txt==osVersion){

                    let tr = nearestParent(elm, (elm)=>elm.nodeName=="TR")


                    let title = tr.querySelector(`td:nth-of-type(${idx22+1})`)

                    let p = (title.textContent+'').match(/\b(x64|x86)\b/);

                    console.log(p);

                    if(p){
                        if((p[0]=='x86'&&jscd.isIntelX64===true)||(p[0]=='x64'&&jscd.isIntelX64===false)) continue;
                    }

                    addedStyle=addedStyle||addStyle(cssText);

                    tr.setAttribute('ms-update-highlighted-row','')

                }

            }

        }

    },250)





    // Your code here...
})();