- // ==UserScript==
- // @name Microsoft Update Catalog - Auto Highlight the version for your OS
- // @namespace http://tampermonkey.net/
- // @version 0.3
- // @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 products_txt = elm.textContent.replace(/[^a-zA-Z0-9\-\_\s\,]/g,'').trim();
- let products = products_txt.split(/\s*,\s*/);
- let isProductFound = products.includes(osVersion);
- /*
- Windows 7,Windows 8,Windows Server 2003,Windows Server 2003, Datacenter Edition,Windows Server 2008,Windows Server 2008 R2,Windows Server 2012,Windows Vista,Windows XP x64 Edition
- */
-
- if(isProductFound){
-
- 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...
- })();