(function () {
"use strict";
// ==UserScript==
// @name uso - installWith
// @namespace http://userscripts.org/users/37004
// @description Adds option to install script with an icon and/or updater plus the original script advisor. "So easy, a cavemonkey can do it"
// @copyright 2010+, Marti Martz (http://userscripts.org/users/37004)
// @license CC-BY-NC-SA-4.0; https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode
// @license GPL-3.0-or-later; http://www.gnu.org/licenses/gpl-3.0.txt
// @version 2.0.4.2eol
// @icon https://raw.githubusercontent.com/Martii/UserScripts/master/src/uso/installWith/res/icon48.png
// @homepageURL https://github.com/Martii/UserScripts/tree/master/src/uso/installWith
// @homepageURL https://openuserjs.org/scripts/marti/uso_-_installWith
// @homepageURL http://userscripts.org/scripts/show/68219
// @supportURL http://userscripts.org/topics/45480
// @include /^https?://userscripts.org(?::\d{1,5})?/?$/
// @include /^https?://userscripts\.org(?::\d{1,5})?/scripts/
// @include /^https?://userscripts\.org(?::\d{1,5})?/topics//
// @include /^https?://userscripts\.org(?::\d{1,5})?/reviews//
// @include /^https?://userscripts\.org(?::\d{1,5})?/users/.+?/scripts/
// @include /^https?://userscripts\.org(?::\d{1,5})?/users/.+?/favorites/
// @include /^https?://userscripts\.org(?::\d{1,5})?/groups/\d+/scripts/
// @include /^https?://userscripts\.org(?::\d{1,5})?/tags//
// @include /^https?://userscripts\.org(?::\d{1,5})?/home/(?:scripts|favorites)/
// @include /^https?://userscripts\.org(?::\d{1,5})?/posts//
// @include http://userscripts.org:8080/
// @include http://userscripts.org:8080/scripts*
// @include http://userscripts.org:8080/topics/*
// @include http://userscripts.org:8080/reviews/*
// @include http://userscripts.org:8080/users/*/scripts*
// @include http://userscripts.org:8080/users/*/favorites*
// @include http://userscripts.org:8080/groups/*/scripts*
// @include http://userscripts.org:8080/tags/*
// @include http://userscripts.org:8080/home/scripts*
// @include http://userscripts.org:8080/home/favorites*
// @include http://userscripts.org:8080/posts*
// @include http://userscripts.org/
// @include http://userscripts.org/scripts*
// @include http://userscripts.org/topics/*
// @include http://userscripts.org/reviews/*
// @include http://userscripts.org/users/*/scripts*
// @include http://userscripts.org/users/*/favorites*
// @include http://userscripts.org/groups/*/scripts*
// @include http://userscripts.org/tags/*
// @include http://userscripts.org/home/scripts*
// @include http://userscripts.org/home/favorites*
// @include http://userscripts.org/posts*
// @include https://userscripts.org/
// @include https://userscripts.org/scripts*
// @include https://userscripts.org/topics/*
// @include https://userscripts.org/reviews/*
// @include https://userscripts.org/users/*/scripts*
// @include https://userscripts.org/users/*/favorites*
// @include https://userscripts.org/groups/*/scripts*
// @include https://userscripts.org/tags/*
// @include https://userscripts.org/home/scripts*
// @include https://userscripts.org/home/favorites*
// @include https://userscripts.org/posts*
// @exclude /^https?://userscripts\.org(?::\d{1,5})?/scripts/diff//
// @exclude /^https?://userscripts\.org(?::\d{1,5})?/scripts/version//
// @exclude http://userscripts.org/scripts/diff/*
// @exclude http://userscripts.org/scripts/version/*
// @exclude https://userscripts.org/scripts/diff/*
// @exclude https://userscripts.org/scripts/version/*
// @updateURL http://userscripts.org:8080/scripts/source/68219.meta.js
// @installURL http://userscripts.org:8080/scripts/source/68219.user.js
// @downloadURL http://userscripts.org:8080/scripts/source/68219.user.js
// @resource icon https://raw.githubusercontent.com/Martii/UserScripts/master/src/uso/installWith/res/icon32.png
// @resource gmc https://raw.githubusercontent.com/sizzlemctwizzle/GM_config/master/gm_config_icon.png
// @resource usoc https://raw.githubusercontent.com/Martii/UserScripts/master/res/compatibilityMatrix/usoc16.png
// @resource uso https://raw.githubusercontent.com/Martii/UserScripts/master/res/compatibilityMatrix/uso16.png
// @resource clear https://raw.githubusercontent.com/Martii/UserScripts/master/src/uso/installWith/res/clear1.gif
// @resource more https://raw.githubusercontent.com/Martii/UserScripts/master/src/uso/installWith/res/more9x5.gif
// @resource less https://raw.githubusercontent.com/Martii/UserScripts/master/src/uso/installWith/res/less5x9.gif
// @resource list http://beta.usocheckup.dune.net/list.json
//@require https://secure.dune.net/usocheckup/68219.js?method=install&open=window&maxage=1&custom=yes&topicid=45479&id=usoCheckup
//@require http://userscripts.org/scripts/source/61794.user.js
// @require https://raw.githubusercontent.com/Martii/UserScripts/dc7d27fef916db3bea640139bd852b2c75a08ff8/lib/GM_setStyle/GM_setStyle.js
// @require https://raw.githubusercontent.com/Martii/GM_config/a0d0066ffaefb5fbb3402c3d46ac705e8b4124d8/gm_config.js
// @grant GM_addStyle
// @grant GM_deleteValue
// @grant GM_getResourceText
// @grant GM_getResourceURL
// @grant GM_getValue
// @grant GM_log
// @grant GM_openInTab
// @grant GM_registerMenuCommand
// @grant GM_setClipboard
// @grant GM_setValue
// @grant GM_xmlhttpRequest
// ==/UserScript==
if (!document || !document.body)
return;
const
gTHIS = this,
gJSE = !!(typeof window.wrappedJSObject == "object" && typeof window.wrappedJSObject.jQuery == "function"),
gPROTOCOL = location.protocol,
gPORTX = /^80$/.test(location.port) ? "" : ":8080",
gHOSTNAME = location.hostname,
gPATHNAME = location.pathname,
gISHOMEPAGE = /^\/scripts\/show\//.test(gPATHNAME),
gHASH = location.hash,
gCSS = GM_setStyle({
media: "screen, projection",
data: ".hid { display: none; } .HID { display: none !important } .blah { color: #f00 !important; } .halb { background-color: #f00 !important; }"
}),
gUAC = !!document.body.querySelector(".alt_topbottom"),
gHALT404 = true,
gRETRIES = 4,
gDELAYRETRYMIN = 3000,
gDELAYRETRYMAX = 8000,
gHEADLENADJ = 800, // NOTE: Inset
gTITLELENADJ = 800, // NOTE: Outset
gANONDIVISOR = 2.20,
gLIST = GM_getResourceText("list").replace(/[\n\r\s]*\}[\n\r\s]*$/, '')
;
let
gGROUPS,
gANODES,
gQNODES,
gBYTESMAX,
gBYTESMIN,
gIdle = true,
gISFRAMELESS = false,
gLoginMsgShown,
gLoginTrying,
gLoginTried
;
try {
gISFRAMELESS = (window == window.top);
}
catch (e) {}
/**
*
*/
function byteLength(aString) {
return unescape(encodeURIComponent(aString)).length;
}
/**
*
*/
function genReport(aReports, aReported, aMarkdown) {
let
i = 0,
maxList = 30,
post = ""
;
if (aMarkdown) {
aReports.split(",").forEach(function (e, i, a) {
if (i % maxList == 0) {
if (i != 0)
post += '\n';
post += 'Potentially unwanted scripts\n\n';
}
let found;
aReported.split(",").forEach(function (e1, i1, a1) {
if (e1 == e)
found = true;
});
if (!found)
post += '* [' + e + '](' + e + ')\n';
else
post += '* ' + e + '\n';
i++;
});
}
else {
post = aReports.split(',').map(function (aE) {
let found;
aReported.split(",").forEach(function (e1, i1, a1) {
if (e1 == aE)
found = true;
});
let item;
if (!found)
item = '\n<li><a href="' + aE + '">' + aE + '</a></li>';
else
item = '\n<li>' + aE + '</li>';
if (i % maxList == 0) {
aE = (i ? '\n</ul>\n' : '') + '<p>Potentially unwanted scripts</p>\n<ul>' + item;
}
else
aE = item;
i++;
return aE;
}).join('') + '\n</ul>';
}
return post;
}
/**
*
*/
function doReport(aReports) {
GM_xmlhttpRequest({
retry: gRETRIES,
url: "/topics/9.rss",
method: "GET",
onload: function(aR) {
switch(aR.status) {
case 404:
if (gHALT404)
this._retry = 0;
case 500:
case 502:
case 503:
if (gJSE && this.retry-- > 0) {
setTimeout(GM_xmlhttpRequest, gDELAYRETRYMIN + Math.round(Math.random() * (gDELAYRETRYMAX - gDELAYRETRYMIN)), this); // NOTE: Detached
break; // NOTE: Watchpoint
}
case 200:
let
parser = new DOMParser(),
xml = parser.parseFromString(aR.responseText, "text/xml"),
reported = []
;
let descriptions = xml.querySelectorAll("item description");
for (let i = 0, thisDescription; thisDescription = descriptions[i++];) {
let docfrag = document.createDocumentFragment();
let nodeDiv = document.createElement("div");
nodeDiv.innerHTML = thisDescription.textContent;
docfrag.appendChild(nodeDiv);
let anchors = docfrag.querySelectorAll("a");
for (let j = 0, thisAnchor; thisAnchor = anchors[j++];) {
let matches;
matches = thisAnchor.href.match(/^https?:\/\/userscripts\.org(\/users\/\d+)\/?/);
if (matches)
reported.push(matches[1]);
else if (matches = thisAnchor.href.match(/^https?:\/\/userscripts\.org(?::\d{1,5})?\/scripts\/show(\/\d+)\/?/))
reported.push(matches[1]);
else if (matches = thisAnchor.href.match(/^https?:\/\/userscripts\.org(?::\d{1,5})?(\/\d+)\/?/))
reported.push(matches[1]);
}
}
let count = 0, reports = aReports.split(",");
reports.forEach(function (e, i, a) {
reported.forEach(function (e1, i1, a1) {
if (e1 == e)
++count;
});
});
if (count > 0 && count == reports.length)
; // Do nothing
else {
let thisNode = document.querySelector("#content .posts tbody > tr:last-child .author .edit a.utility"), isReply;
if (thisNode) {
let dateNode = document.querySelector("#content .posts tbody > tr:last-child .author .date abbr");
if (dateNode) {
let dateLastPost = new Date(dateNode.title);
if ((Date.now() - dateLastPost) > (60 * 60 * 1000))
thisNode = undefined;
}
else {
if (gmcHome.get("enableDebugging"))
console.warn('Last posting date not found...reverting to reply mode');
thisNode = undefined;
}
}
if (!thisNode) {
thisNode = document.querySelector("#content > p a.utility");
isReply = true;
}
if (thisNode && (thisNode.textContent == "Reply to topic" || thisNode.textContent == "Edit post")) {
setTimeout(function () {
thisNode.click();
let that, retry = 4;
if (!isReply) {
setTimeout(that = function () {
let post_body = document.querySelector("#edit textarea#edit_post_body");
if (post_body) {
let UCF = !!document.querySelector("#edit .previewBtn");
if (UCF)
post_body.value = post_body.textContent + '\n' + genReport(aReports, reported.join(','), document.querySelector("#edit #post_markdown").checked);
else
post_body.textContent += '\n' + genReport(aReports, reported.join(','), document.querySelector("#edit #post_markdown").checked);
}
else {
if (retry-- > 0);
setTimeout(that, 500);
}
}, 0);
}
else {
setTimeout(that = function () {
let post_body = document.querySelector("#reply textarea#post_body");
if (post_body) {
let UCF = !!document.querySelector("#reply .previewBtn");
if (UCF)
post_body.value = genReport(aReports, reported.join(','), document.querySelector("#reply #post_markdown").checked);
else
post_body.value = genReport(aReports, reported.join(','), document.querySelector("#reply #post_markdown").checked);
}
else {
if (retry-- > 0);
setTimeout(that, 500);
}
}, 0);
}
}, 1000); // NOTE: Give UCF this much initial time to load before triggering click otherwise USO default shows depending on script order/count
}
}
break;
}
}
});
}
/**
*
*/
function init() {
gANODES = document.body.querySelectorAll(".script-meat, .userjs");
gQNODES = [];
/** Initial gCSS fix for tagging **/ // NOTE: This fix may be different in later FF versions
GM_setStyle({
node: gCSS,
data:
[
"th { border-bottom-style: none; }"
].join("\n")
});
if (/(^\/users\/.+?\/(?:scripts|favorites)|^\/home\/(?:scripts|favorites))/.test(gPATHNAME) || (/^\/$/.test(gPATHNAME)) && gUAC)
GM_setStyle({
node: gCSS,
data:
[
"#main th:first-child, #content th:first-child { border-left-width: 10px; padding-left: 7px; }",
"table.forums tr td.script-meat { background-color: #eee; border-left: 10px solid #eee; }"
].join("\n")
});
else if (/^\/groups\/\d+\/scripts/.test(gPATHNAME))
GM_setStyle({
node: gCSS,
data:
[
"#main th:first-child, #content th:first-child { border-right-width: 10px; padding-left: 7px; }",
"table.forums tr td.script-meat { background-color: #eee; border-left: 10px solid #eee; }"
].join("\n")
});
else
GM_setStyle({
node: gCSS,
data:
[
"#main th:first-child, #content th:first-child { padding-left: 16px; }",
"table.forums tr td.script-meat { background-color: #eee; border-left: 18px solid #eee; }"
].join("\n")
});
GM_setStyle({
node: gCSS,
data:
[
"table.forums tr td.script-meat { background-color: #eee; border-left-color: #eee; }",
"#install_script a.userjs { background: #ccc no-repeat scroll 0 0; border: 1px solid #ddd; border-left: 10px solid #888; border-radius: 0.25em; }",
"#install_script a.userjs:hover { background: #ccc no-repeat scroll 0 0; }",
"table.forums tr td.saU, #install_script a.saU { background-color: #ccc; border-left-color: #aaa; }",
"table.forums .actions { float: right; font-size: 0.9em; margin-left: 1em; }",
"table.forums .actions span { font-size: 0.8em; }",
"table.forums .actions .action, table.forums .actions .toggle { color: #444; margin-left: 0.5em; text-decoration: none; }",
"table.forums .actions .more { background: transparent url(" + GM_getResourceURL("more") + ") no-repeat scroll center bottom; cursor: pointer; height: 5px; padding: 4px 4px 0 4px; margin-left: 0.25em; width: 9px; }",
"table.forums .actions .less { background: transparent url(" + GM_getResourceURL("less") + ") no-repeat scroll center bottom; cursor: pointer; height: 9px; padding: 0 6px; margin-left: 0.25em; width: 5px; }",
"table.forums a.title { font-weight: bold; }",
"table.forums tr td.saEMBED, #install_script a.saEMBED { background-image: linear-gradient(to left, #888, rgba(136,136,136,0.25), rgba(136,136,136,0)) !important; }",
"table.forums tr td.saXCLUDE, #install_script a.saXCLUDE { background: #fff none repeat scroll 0 0; color: #000; }",
"#install_script a.saXCLUDE:hover { background: #fff none repeat scroll 0 0; color: #000; }",
"table.forums tr td.sabXCLUDE, #install_script a.sabXCLUDE { border-left-color: #ddd; }",
"table.forums tr td.saLOW, #install_script a.saLOW { background: #d6efc2 repeat scroll 0 0; }",
"#install_script a.saLOW:hover { background: #d6efc2 repeat scroll 0 0; }",
"table.forums tr td.sabLOW, #install_script a.sabLOW { border-left-color: #b0d813; }",
"table.forums tr td.saGUARD, #install_script a.saGUARD { background: #d5edf8 repeat scroll 0 0; }",
"#install_script a.saGUARD:hover { background: #d5edf8 repeat scroll 0 0; }",
"table.forums tr td.sabGUARD, #install_script a.sabGUARD { border-left-color: #92cae4; }",
"table.forums tr td.saELEVATE, #install_script a.saELEVATE, table tr.unlisted { background: #fbfad5 repeat scroll 0 0; }",
"#install_script a.saELEVATE:hover { background: #fbfad5 repeat scroll 0 0; }",
"table.forums tr td.sabELEVATE, #install_script a.sabELEVATE { border-left-color: #fbf700; }",
"table.forums tr td.saHIGH, #install_script a.saHIGH { background: #fbe5b0 repeat scroll 0 0; }",
"#install_script a.saHIGH:hover { background: #fbe5b0 repeat scroll 0 0; }",
"table.forums tr td.sabHIGH, #install_script a.sabHIGH { border-left-color: #fbbf5d; }",
"table.forums tr td.saSEVERE, #install_script a.saSEVERE { background: #fbe3e4 repeat scroll 0 0; }",
"#install_script a.saSEVERE:hover { background: #fbe3e4 repeat scroll 0 0; }",
"table.forums tr td.sabSEVERE, #install_script a.sabSEVERE { border-left-color: #fb7e83; }",
"table.forums tr td.sabABORT, #install_script a.saABORT { background: #000 none repeat scroll 0 0; color: #fff; }",
"#install_script a.saABORT:hover { background: #000 none repeat scroll 0 0; color: #fff; }",
"@-moz-keyframes saB { from { background: #888; } to { background: #fff; } }",
".saB { background: transparent none repeat scroll 0 0; -moz-animation: 1.5s ease 0s alternate none infinite saB !important; }",
".delusr { color: #fff; }",
".dim { opacity: 0.25; }",
".dim:hover { opacity: 1; }",
".byline { font-size: 0.9em; }",
".byline a:last-child { font-style: italic; }"
].join("\n")
});
let contentNode = document.getElementById("content");
if (!gJSE && contentNode && document.title != "500 Server Error – Userscripts.org") {
let nodeA = document.createElement("a");
nodeA.href = "/scripts/show/68219";
nodeA.textContent = "installWith";
let nodeSpan = document.createElement("span");
nodeSpan.textContent = "Enabling this sites JavaScript is highly recommended to improve your experience with ";
let nodeP = document.createElement("p");
nodeP.classList.add("notice");
nodeP.classList.add("info");
nodeSpan.appendChild(nodeA);
nodeSpan.appendChild(document.createTextNode("."));
nodeP.appendChild(nodeSpan);
if (/^\/users\/\d+\/scripts/.test(gPATHNAME))
contentNode.parentNode.insertBefore(nodeP, contentNode);
else
contentNode.insertBefore(nodeP, contentNode.firstChild);
}
addEventListener("resize", onViewportChange, false);
addEventListener("scroll", onViewportChange, false);
onViewportChange();
}
/**
*
*/
function firstValueOf(aMb, aKey, aPrefix) {
if (aPrefix) {
if (aMb[aPrefix] && aMb[aPrefix][aKey])
return ((typeof aMb[aPrefix][aKey] == "string") ? aMb[aPrefix][aKey] : aMb[aPrefix][aKey][0]);
}
else {
if (aMb[aKey])
return ((typeof aMb[aKey] == "string") ? aMb[aKey] : aMb[aKey][0]);
}
return undefined;
}
/**
*
*/
function lastValueOf(aMb, aKey, aPrefix) {
if (aPrefix) {
if (aMb[aPrefix] && aMb[aPrefix][aKey])
return ((typeof aMb[aPrefix][aKey] == "string") ? aMb[aPrefix][aKey] : aMb[aPrefix][aKey][aMb[aPrefix][aKey].length - 1]);
}
else {
if (aMb[aKey])
return ((typeof aMb[aKey] == "string") ? aMb[aKey] : aMb[aKey][aMb[aKey].length - 1]);
}
return undefined;
}
/**
*
*/
function toArray(aName, aMb) {
if (aMb) {
if (aMb[aName])
return Array.isArray(aMb[aName]) ? aMb[aName] : [aMb[aName]];
}
else
return [aName];
return undefined;
}
/**
*
*/
function addValue(aValue, aName, aMb) {
if (aMb[aName]) {
aMb[aName] = toArray(aName, aMb);
aMb[aName].push(aValue);
}
else
aMb[aName] = aValue;
return aMb[aName]; // TODO: Opt
}
/**
*
*/
function parseMeta(aString) {
aString = aString.toString();
let
re = /\/\/ @(\S+)(?:\s+(.*))?/,
headers = {},
name, prefix, header, key, value,
lines = aString.split(/[\r\n]+/).filter(function (e, i, a) {
return (e.match(re));
})
;
for (let i = 0, line; line = lines[i++];) {
[, name, value] = line.replace(/\s+$/, "").match(re);
switch (name) {
case "licence":
name = "license";
break;
}
[key, prefix] = name.split(/:/).reverse();
if (key) {
if (prefix) {
if (!headers[prefix])
headers[prefix] = new Object;
header = headers[prefix];
}
else
header = headers;
if (header[key]) {
if (!Array.isArray(header[key]))
header[key] = new Array(header[key]);
header[key].push(value || "");
}
else
header[key] = value || "";
}
}
if (headers["license"])
headers["licence"] = headers["license"];
return (headers.toSource() != "({})") ? headers : undefined;
}
/**
*
*/
function isViewing(thisNode) {
if (!thisNode || thisNode.nodeType !== 1)
return false;
if (!gJSE || gmcHome.get("disableViewportHold"))
return true; /** Work-around for !javascript.enabled issue **/
let html, rect;
html = document.documentElement;
rect = thisNode.getBoundingClientRect(); // BUG: Needs gJSE to return meaningful values on FF 20+?
return (
!!rect
&& rect.top <= html.clientHeight
&& rect.right >= 0
&& rect.bottom >= 0
&& rect.left <= html.clientWidth
);
}
/**
*
*/
function addToQspList(aQsp, aItem) {
if (aItem)
aQsp += (!aQsp) ? aItem : "," + aItem;
return aQsp;
}
/**
*
*/
function appendToQs(aQs, aQsp) {
if (aQsp)
aQs += (!aQs) ? "?" + aQsp : "&" + aQsp;
return aQs;
}
/**
*
*/
function nag(ev) {
ev.preventDefault();
if (!gmcHome.get("skipVerifyExclusion"))
if (confirm('Are you sure?'))
if (confirm('Are you really sure?'))
if(confirm('Are you really, really sure?\n\nLast chance before impending doom?')) {
ev.target.removeEventListener("click", nag, false);
ev.target.click();
}
}
/**
*
*/
function pingCount(ev) {
let matches = ev.target.pathname.match(/(\d+)(?:\/\d+)?\.user\.js$/)
if (matches) {
let scriptId;
[, scriptId] = matches;
GM_xmlhttpRequest({
retry: gRETRIES,
url: "http" + ((/^https:$/i.test(gPROTOCOL) || gmcHome.get("forceInstallSecure")) ? "s" : "") + "://userscripts.org" + gPORTX + "/scripts/source/" + scriptId + ".user.js",
method: "HEAD",
onload: function(aR) {
switch(aR.status) {
case 403:
if (gmcHome.get("enableDebugging"))
console.warn('Recently unlisted script');
break;
case 404:
if (gHALT404)
this._retry = 0;
case 500:
case 502:
case 503:
if (gJSE && this.retry-- > 0)
setTimeout(GM_xmlhttpRequest, gDELAYRETRYMIN + Math.round(Math.random() * (gDELAYRETRYMAX - gDELAYRETRYMIN)), this); // NOTE: Detached
else {
if (gmcHome.get("enableDebugging"))
console.warn('Unable to increment script count for update method: ' + xhr.status);
}
break;
case 200:
break;
}
}
});
}
}
/**
*
*/
function create(aNode, aScriptId, aMb, aProviders, aKU, aUsoCMethod) {
let thisNode = aNode.parentNode;
let userjsNode = thisNode.querySelector(".userjs");
if (!userjsNode)
return;
GM_setStyle({
node: gCSS,
data:
[
"#install_script .userjs { font-size: 1.1em !important; }",
"#install_script a.helpWith {",
" background: #5173d9 linear-gradient(to bottom, #92cae4, rgba(213,237,248,0)) repeat scroll 0 0;",
" border: 1px solid #999;",
" -moz-border-radius: 1em;",
" border-radius: 1em;",
" color: #fff;",
" float: right;",
" font-weight: bold;",
" height: 1.5em;",
" margin-top: 6px;",
" text-decoration: none;",
" width: 1.4em;",
"}",
"#install_script a.helpWith:hover { background: #ddd; }",
"#install_script select.updateWith { height: 24px; font-size: 0.9em; width: 88%; border: 3px solid #888; }",
"#install_script select.updateWith option.separator { border-top: thin dotted #666; }",
"#install_script select.updateWith img { background: none no-repeat scroll center center transparent; height: 16px; margin: 0.25em 0.25em 0.25em 0; vertical-align: middle; width: 16px; }",
"#install_script select.updateWith img.indent { margin-left: 0.6em; }"
].join("\n")
});
userjsNode.textContent = userjsNode.textContent + " with";
let helpNode = thisNode.querySelector(".help");
helpNode.classList.add("helpWith");
helpNode.textContent = "?";
let nodeImg = document.createElement("img");
nodeImg.src = GM_getResourceURL("uso");
let nodeText = document.createTextNode("userscripts.org (default)");
let nodeOption = document.createElement("option");
nodeOption.value = "uso";
nodeOption.title = "Use native provider";
let nodeSelect = document.createElement("select");
nodeSelect.id = "provider_id";
nodeSelect.classList.add("updateWith");
nodeSelect.addEventListener("change", function (ev) {
if (aKU)
gmc.set("providerPref1", this.value);
else
gmc.set("providerPref2", this.value);
gmc.write();
switch (this.value) {
case "uso":
aNode.removeEventListener("click", pingCount, false);
if (gISHOMEPAGE)
gmc.close();
aNode.href = "/scripts/source/" + aScriptId + ".user.js";
if (gmcHome.get("forceInstallSecure"))
aNode.protocol = "https:";
if (gmcHome.get("forceInstallRecent")) {
aNode.pathname = aNode.pathname
.replace(/\/source\//, "/version/")
.replace(/(\.user\.js)$/, "/" + lastValueOf(aMb, "version", "uso") + "$1");
aNode.addEventListener("click", pingCount, false);
}
break;
default:
aNode.removeEventListener("click", pingCount, false);
if (gISHOMEPAGE)
gmc.close();
let thisProvider, sname, qs, max, min;
for (let i = 0, thisProvider; thisProvider = aProviders[i++];) {
[,,,,, sname,, qs, max, min] = thisProvider;
if (sname == this.value)
break;
}
let origin, useBeta, mirrorDomain = gmcHome.get("mirrorDomain"), useSSL = (mirrorDomain == "secure");
if (this.value == "usoCB") {
useBeta = true;
origin = "http://beta.usocheckup.dune.net";
}
else {
if (useSSL)
origin = "https://secure.dune.net";
else if (mirrorDomain == "primary")
origin = "http://usocheckup.dune.net";
else
origin = "http://usocheckup.redirectme.net";
}
let pathname = (useSSL && !useBeta ? "/usocheckup/" : "/") + aScriptId + ".user.js";
let search = "";
search = appendToQs(search, /^usoC/.test(this.value) ? "": "updater=" + this.value);
search = appendToQs(search, max ? max + "=" + gmc.get("updaterMaxage") : "");
if (min && gmc.get("updaterMinage") != "1")
search = appendToQs(search, min ? min + "=" + gmc.get("updaterMinage") : "");
if (gmcHome.get("allowAOU"))
search = appendToQs(search, "allow=aou");
search = appendToQs(search, qs.replace(/\$1/, aScriptId));
let
atUsoAvatar = lastValueOf(aMb, "avatar", "uso"),
atUsoIcontype = lastValueOf(aMb, "icontype", "uso"),
iconQspList = ""
;
iconQspList = addToQspList(iconQspList, atUsoAvatar);
if (true && atUsoIcontype)
iconQspList = addToQspList(iconQspList, atUsoIcontype);
if (iconQspList)
search = appendToQs(search, "icon=" + (gmc.get("useGravatarIcon") || gmc.get("useScriptIcon") ? "1," : "0,") + iconQspList);
let hash = "#.user.js";
aNode.href = origin + pathname + search + hash;
/** Finish up gmc **/
if (gISFRAMELESS && gISHOMEPAGE) {
gmc.fields["useGravatarIcon"].settings.label = "<img style='margin-right: 0.5em;' src='http" + (/^https:$/i.test(gPROTOCOL) ? "s" : "") + "://www.gravatar.com/avatar/" + atUsoAvatar + "?r=pg&s=48&default=identicon' alt='Use this authors gravatar when available if not present' title='Use this authors gravatar when available if not present' />";
gmc.fields["useScriptIcon"].settings.label = "<img src='" + gPROTOCOL + "//s3.amazonaws.com/uso_ss/icon/" + aScriptId + "/large." + atUsoIcontype + "' alt='Favor this scripts USO icon when available if not present' title='Favor this scripts USO icon when available if not present'/>";
gmc.open();
if (max)
gmc.fields["updaterMaxage"].node.parentNode.classList.remove("hid");
else
gmc.fields["updaterMaxage"].node.parentNode.classList.add("hid");
if (min)
gmc.fields["updaterMinage"].node.parentNode.classList.remove("hid");
else
gmc.fields["updaterMinage"].node.parentNode.classList.add("hid");
if (/^usoC/.test(this.value)) {
switch (this.value) {
case "usoCOS":
case "usoCbU":
gmc.fields["indirectMethod"].node.parentNode.classList.add("hid");
gmc.fields["directMethod"].node.parentNode.classList.add("hid");
break;
case "usoCM":
if (aUsoCMethod) {
gmc.fields["indirectMethod"].node.parentNode.classList.add("hid");
gmc.fields["directMethod"].node.parentNode.classList.add("hid");
}
else {
gmc.fields["directMethod"].node.parentNode.classList.remove("hid");
gmc.fields["indirectMethod"].node.parentNode.classList.add("hid");
}
break;
case "usoCOI":
gmc.fields["indirectMethod"].node.parentNode.classList.add("hid");
gmc.fields["directMethod"].node.parentNode.classList.remove("hid");
break;
default:
gmc.fields["indirectMethod"].node.parentNode.classList.remove("hid");
gmc.fields["directMethod"].node.parentNode.classList.add("hid");
break;
}
}
else {
gmc.fields["indirectMethod"].node.parentNode.classList.add("hid");
gmc.fields["directMethod"].node.parentNode.classList.add("hid");
}
}
if (/^usoC/.test(this.value)) {
switch (this.value) {
case "usoCOS":
case "usoCbU":
aNode.search = aNode.search.replace(/method\=(?:show|install|update)/i, "method=show");
break;
case "usoCM":
if (aUsoCMethod)
aNode.search = aNode.search.replace(/method\=(?:show|install|update)/i, "method=" + aUsoCMethod);
else
aNode.search = aNode.search.replace(/method\=(?:show|install|update)/i, "method=" + gmc.get("directMethod"));
if (/method\=update/.test(aNode.search))
aNode.addEventListener("click", pingCount, false);
break;
case "usoCOI":
aNode.search = aNode.search.replace(/method\=(?:show|install|update)/i, "method=" + gmc.get("directMethod"));
if (gmc.get("directMethod") == "update")
aNode.addEventListener("click", pingCount, false);
break;
default:
aNode.search = aNode.search.replace(/method\=(?:show|install|update)/i, "method=" + gmc.get("indirectMethod"));
if (gmc.get("directMethod") == "update")
aNode.addEventListener("click", pingCount, false);
break;
}
}
break;
}
}, false);
nodeOption.appendChild(nodeImg);
nodeOption.appendChild(nodeText);
nodeSelect.appendChild(nodeOption);
for (let i = 0, thisProvider; thisProvider = aProviders[i++];) {
let stock, indent, icon, lname, separator, sname, tooltip;
[stock, indent, icon, lname, separator, sname, tooltip] = thisProvider;
nodeText = document.createTextNode(lname);
nodeImg = document.createElement("img");
nodeImg.src = /^http/.test(icon) ? icon : "http" + (/^https:$/i.test(gPROTOCOL) ? "s" : "") + "://www.gravatar.com/avatar/" + icon + "?r=PG&s=92&default=identicon";
if (indent)
nodeImg.classList.add("indent");
nodeOption = document.createElement("option");
nodeOption.value = sname;
nodeOption.title = tooltip;
if (separator)
nodeOption.classList.add("separator");
nodeOption.appendChild(nodeImg);
nodeOption.appendChild(nodeText);
if (stock)
nodeSelect.insertBefore(nodeOption, nodeSelect.firstChild.nextSibling); // NOTE: Reversed order
else if (!aKU)
nodeSelect.appendChild(nodeOption);
}
thisNode.insertBefore(nodeSelect, helpNode);
let providerPreference;
if (aKU)
providerPreference = gmc.get("providerPref1");
else
providerPreference = gmc.get("providerPref2");
for (let i = 0, thatNode; thatNode = nodeSelect.options[i]; ++i)
if (thatNode.value == providerPreference) {
nodeSelect.selectedIndex = i;
break;
}
let ev = new CustomEvent("change");
nodeSelect.dispatchEvent(ev);
}
/**
*
*/
function advise(aSa, aNode, aMb, aEmbed, aReduce, aCollapse, aHide) {
//if (gmcHome.get("enableDebugging")) {
//console.groupCollapsed(JSON.stringify(aMb, null, " ")); // BUG: FF 27 doesn't collapse these
//console.groupEnd();
//}
let
title,
max,
deletedUser,
advisories =
[
"ABORT",
"SEVERE",
"HIGH",
"ELEVATE",
"GUARD",
"LOW",
"XCLUDE",
"EMBED",
"UNKNOWN",
"INFO"
]
;
advisories.forEach(function (e, i, a) {
if (aSa[e]) {
if (!max)
max = e;
if (!title)
title = e + ":";
else
title += "\n" + e + ":";
title += "\n " + aSa[e].join("\n ");
}
let sa = Array.isArray(aSa[e]) ? aSa[e] : [aSa[e]], advisory;
for (let i = 0, len = sa.length; advisory = sa[i++];) {
// NOTE: Post actions
if (e == "ABORT" && aSa[e] == "Deleted user") {
aReduce = true;
aCollapse = true;
if (gmcHome.get("alwaysHideDeletedUser"))
aNode.parentNode.classList.add("hid");
else
deletedUser = true;
}
}
});
if (max) {
if (aEmbed)
aNode.classList.add("saEMBED");
aNode.classList.add("sa" + max);
aNode.classList.add("sab" + max);
}
if (title)
aNode.title = title;
if (max == "INFO") {
aNode.title = "UNKNOWN:\n Undetermined\n" + aNode.title;
pushAdvisory(aSa, "UNKNOWN", "Undetermined");
}
/** Sidebar **/
if (gISHOMEPAGE) {
let hookNode = document.getElementById("script_sidebar");
if (hookNode) {
GM_setStyle({
node: gCSS,
data:
[
"#script_sidebar h7 { display: block; font-weight: bold; }",
"#script_sidebar h7 dl { margin-bottom: 0; font-size: 0.9em; }",
"#script_sidebar h7 dt { font-weight: bold; padding: 0.25em 0.5em 0.5em 0.66em; }",
"#script_sidebar h7 dd { font-weight: normal; font-style: italic; padding-left: 0.5em; padding-right: 0.33em; }",
".advisories { background-image: linear-gradient(to top, #ddd, rgba(255,255,255,0)); border: thin solid #aaa !important; border-radius: 0.25em 0.25em; cursor: default; font-family: sans-serif; font-weight: normal !important; padding: 0.25em 0.75em; text-align: left; width: auto; }",
".advisories:hover { background-image: linear-gradient(to top, #bfe1ff, rgba(237,249,255,0)); }",
".advisories a { margin-top: -0.0625em; position: absolute; right: 0.5em; }",
".advisories img { max-height: 1.5em; }",
".barlight { background-color: #eee; }",
".barmedium { background-color: #ddd; }"
].join("\n")
});
advisories.reverse().forEach(function (e, i, a) {
if (aSa[e]) {
let nodeH7 = document.createElement("h7");
nodeH7.textContent = e;
hookNode.insertBefore(nodeH7, hookNode.firstChild);
let nodeDiv = document.createElement("div");
nodeDiv.classList.add("sa");
for (let j = 0, thisSummary; thisSummary = aSa[e][j]; j++) {
let thisDescription = thisSummary.split("\n").map(function (e) { return e.trim(); });
let nodeDl = document.createElement("dl");
let nodeDt = document.createElement("dt");
nodeDt.textContent = thisDescription[0];
if (j % 2 == 0)
nodeDt.classList.add("barlight");
for (let k = 1, thisClarification; thisClarification = thisDescription[k]; k++) {
let nodeDd = document.createElement("dd");
nodeDd.textContent = thisClarification;
if (k % 2 == 1)
nodeDd.classList.add("barmedium");
nodeDt.appendChild(nodeDd);
}
nodeDl.appendChild(nodeDt);
nodeDiv.appendChild(nodeDl);
nodeH7.appendChild(nodeDiv);
}
}
});
let nodeImg = document.createElement("img");
nodeImg.src = GM_getResourceURL("icon");
nodeImg.title = "uso - installWith";
nodeImg.alt = "installWith";
let nodeA = document.createElement("a");
nodeA.href = "/scripts/show/68219";
let nodeH6 = document.createElement("h6");
nodeH6.classList.add("advisories");
nodeH6.textContent = "Advisor";
nodeH6.addEventListener("click", function () {
gmcFilters.open();
let aid = lastValueOf(aMb, "author", "uso");
if (aid) {
gmcFilters.fields["lastScriptWrightId"].node.value = lastValueOf(aMb, "author", "uso"); // NOTE: Watchpoint
gmcFilters.fields["lastScriptWrightId"].node.title = lastValueOf(aMb, "name", "uso");
}
else
gmcFilters.fields["lastScriptWrightId"].node.value = "";
gmcFilters.fields["lastUserScriptId"].node.value = lastValueOf(aMb, "script", "uso");
gmcFilters.fields["lastUserScriptId"].node.title = lastValueOf(aMb, "title", "uso");
}, false);
nodeA.appendChild(nodeImg);
nodeH6.appendChild(nodeA);
hookNode.insertBefore(nodeH6, hookNode.firstChild);
}
}
else {
if (aHide && !/(^\/users\/.+?\/scripts|^\/home\/scripts|^\/scripts\/show\/\d+)/.test(gPATHNAME))
aNode.parentNode.classList.add("hid");
let actionsNodeDiv = document.createElement("div");
actionsNodeDiv.classList.add("actions");
aNode.insertBefore(actionsNodeDiv, aNode.firstChild);
let titleNode, descNode;
if (aMb) {
titleNode = aNode.querySelector(".title");
if (titleNode) {
if (aCollapse) {
titleNode.classList.add("dim");
if (deletedUser)
titleNode.classList.add("delusr");
}
let
maxLength = 50, // NOTE: Watchpoint
atName = lastValueOf(aMb, "name"),
atUsoScript = lastValueOf(aMb, "script", "uso"),
title = titleNode.textContent
;
let filterNodeA = document.createElement("a");
filterNodeA.classList.add("action");
filterNodeA.href = "#";
filterNodeA.textContent = "advisor";
filterNodeA.addEventListener("click", function (ev) {
ev.preventDefault();
gmcFilters.open();
let aid = lastValueOf(aMb, "author", "uso");
if (aid) {
gmcFilters.fields["lastScriptWrightId"].node.value = lastValueOf(aMb, "author", "uso"); // NOTE: Watchpoint
gmcFilters.fields["lastScriptWrightId"].node.title = lastValueOf(aMb, "name", "uso");
}
else
gmcFilters.fields["lastScriptWrightId"].node.value = "";
gmcFilters.fields["lastUserScriptId"].node.value = lastValueOf(aMb, "script", "uso");
gmcFilters.fields["lastUserScriptId"].node.title = lastValueOf(aMb, "title", "uso");
}, false);
let sourceNodeA = document.createElement("a");
sourceNodeA.classList.add("action");
sourceNodeA.href = "/scripts/review/" + atUsoScript;
sourceNodeA.textContent = "source";
actionsNodeDiv.appendChild(sourceNodeA);
actionsNodeDiv.appendChild(filterNodeA);
if (atName) {
let matches = title.match(/(.*)\.\.\.$/);
if (matches && atName.length > maxLength)
title = matches[1].trim();
let
titlex = title.substr(0, maxLength).trim(),
atNamex = atName.substr(0, titlex.length)
;
if (atNamex != titlex) {
titleNode.title = "@name " + atName;
if (titlex.replace("\u200d", "", "g").trim() == "") { // NOTE: Watchpoint
titleNode.textContent = atName;
titleNode.classList.add("halb");
}
else
titleNode.classList.add("blah");
}
else
titleNode.title = "@name " + titleNode.title.trim();
}
}
descNode = aNode.querySelector(".desc");
if (descNode) {
let
maxLength = 250, // NOTE: Watchpoint
atDescription = lastValueOf(aMb, "description"),
desc = descNode.textContent
;
if (atDescription) {
let matches = desc.match(/(.*)\.\.\.$/);
if (matches && atDescription.length > maxLength)
desc = matches[1].trim();
let
descx = desc.substr(0, maxLength).toLowerCase().trim(),
atDescriptionx = atDescription.substr(0, descx.length).toLowerCase()
;
if (atDescriptionx != descx) {
descNode.classList.add("blah");
descNode.title = "@description " + atDescription;
}
else
descNode.title = "@description " + atDescription;
}
else {
descNode.classList.add("blah");
descNode.title = "undefined @description";
}
}
}
let nodeImg = document.createElement("img");
nodeImg.classList.add("more");
nodeImg.src = GM_getResourceURL("clear");
nodeImg.alt = "hide";
nodeImg.addEventListener("click", unhideClick, false);
actionsNodeDiv.appendChild(nodeImg);
if (!/^(?:\/home\/scripts|\/users\/.+?\/scripts)/.test(gPATHNAME)) {
let bylineNodeDiv = document.createElement("div");
bylineNodeDiv.classList.add("byline");
if (aCollapse) {
bylineNodeDiv.classList.add("pus");
if (!gmcHome.get("alwaysShowAuthorId"))
bylineNodeDiv.classList.add("hid");
else
bylineNodeDiv.classList.add("dim");
}
if (descNode)
aNode.insertBefore(bylineNodeDiv, descNode);
else
aNode.appendChild(bylineNodeDiv);
if (aMb) {
let
atUsoAuthor = lastValueOf(aMb, "author", "uso"),
atUsoName = lastValueOf(aMb, "name", "uso"),
atUsoVanity = lastValueOf(aMb, "vanity", "uso")
;
if ((atUsoVanity && atUsoName) || atUsoAuthor) {
bylineNodeDiv.appendChild(document.createTextNode("By "));
if (atUsoVanity && atUsoName) {
let vanityNodeA = document.createElement("a");
vanityNodeA.href = "/users/" + atUsoVanity;
vanityNodeA.textContent = atUsoName;
bylineNodeDiv.appendChild(vanityNodeA);
}
if (atUsoAuthor) {
bylineNodeDiv.appendChild(document.createTextNode(" ("));
let authorNodeA = document.createElement("a");
authorNodeA.href = "/users/" + atUsoAuthor;
authorNodeA.textContent = atUsoAuthor;
bylineNodeDiv.appendChild(authorNodeA);
bylineNodeDiv.appendChild(document.createTextNode(")"));
}
}
}
}
if (aReduce) {
nodeImg.classList.remove("more");
nodeImg.classList.add("less");
nodeImg.alt = "show";
if (descNode)
descNode.classList.add("hid");
qNodes(gANODES);
}
}
}
/**
*
*/
function pushAdvisory(aSa, aAdvisory, aComment) {
aComment = toArray(aComment);
if (!aSa[aAdvisory])
aSa[aAdvisory] = new Array();
for (let i = 0, comment; comment = aComment[i++];) {
let found;
for (let j = 0, commented; commented = aSa[aAdvisory][j++];)
if (comment == commented)
found = true;
if (!found)
aSa[aAdvisory].push(comment);
}
}
/**
*
*/
function validateAOU(aURL, aScriptId, aRe1, aRe2, aCb) {
let matches = aURL.match(aRe1), match, REL;
if (matches) {
REL = true;
[, match] = matches;
aURL = gPROTOCOL + "//" + gHOSTNAME + "/scripts/source/" + match;
}
let protocols = aURL.match(/^(\w+:)/), protocol;
if (protocols) {
[, protocol] = protocols;
let SSL, sid, source, ISI, DDS, RHV, BT;
switch (protocol) {
case "https:":
SSL = true;
case "http:":
let matches = aURL.match(aRe2);
if (matches) {
let sid, source;
[, sid, source] = matches;
if (sid != aScriptId)
ISI = true;
if (source && source != "meta")
DDS = true;
}
else {
if (/^https?:\/\/userscripts.org(?::\d{1,5})?\/scripts\/\w+\/\d+.*\.(?:user|meta)\.js/.test(aURL))
BT = true;
else
RHV = true;
}
break;
}
aCb(REL, SSL, ISI, RHV, BT, DDS);
}
}
/**
*
*/
function parseList(aGroups, aCb) {
for (let group in aGroups) {
let scopes = aGroups[group]; // NOTE: Watchpoint
for (let scope in scopes) {
let target = scopes[scope];
for (let i = 0, len = target.length; i < len;) {
let
abstract,
patterns,
patternsx = {}
;
[abstract, patterns] = [target[i], typeof target[i + 1] != "undefined" ? target[i + 1] : undefined];
++i;
let
advisory,
summary
;
if (typeof abstract == "string")
[, advisory, summary] = abstract.match(/(\w+) (.*)/);
else
continue;
++i;
if (typeof patterns == "object") {
if (Array.isArray(patterns)) {
if (typeof patterns[0] != "string")
continue;
for (let i = 0, pattern; pattern = patterns[i++];)
patternsx[pattern] = "";
}
else
patternsx = patterns;
}
else
continue;
let j = 0, tips, provider, collector, block, reduce, collapse, hide;
for (; target[i + j] && typeof target[i + j] != "string"; ++j) {
let optflag = target[i + j];
if (!!optflag[0]) {
let verb;
[, verb] = optflag;
switch (verb) {
case "tip": // `tip1,tip2,...`
let comments;
[,, comments] = optflag;
if (typeof comments == "string")
tips = comments.split(",");
break;
case "provide":
optflag.shift();
optflag.shift();
// NOTE: No validation
provider = optflag;
break;
case "collect":
optflag.shift();
optflag.shift();
// NOTE: No validation
collector = optflag;
break;
case "block":
block = true;
break;
case "reduce":
reduce = true;
break;
case "collapse":
collapse = true;
break;
case "hide":
hide = true;
break;
}
}
}
i += (j - 1);
aCb(scope, patternsx, advisory, summary, tips, block, reduce, collapse, hide, provider, collector);
}
}
}
}
/**
*
*/
function unhideClick(ev) {
ev.preventDefault();
let targetNode = ev.target;
if (targetNode.classList.contains("less")) {
targetNode.classList.remove("less");
targetNode.classList.add("more");
targetNode.alt = "hide";
}
else {
targetNode.classList.remove("more");
targetNode.classList.add("less");
targetNode.alt = "show";
}
let requeue;
let descNode = targetNode.parentNode.parentNode.querySelector(".desc");
if (descNode) {
if (!descNode.classList.contains("hid")) {
descNode.classList.add("hid");
requeue = true;
}
else
descNode.classList.remove("hid");
}
else {
if (gmcHome.get("enableDebugging"))
console.error("Description node not found");
}
let bylineNode = targetNode.parentNode.parentNode.querySelector(".byline");
if (bylineNode) {
if (!gmcHome.get("alwaysShowAuthorId") && !bylineNode.classList.contains("hid") && bylineNode.classList.contains("pus")) {
bylineNode.classList.add("hid");
requeue = true;
}
else
bylineNode.classList.remove("hid");
}
else {
if (gmcHome.get("enableDebugging"))
console.warn("Byline node not found");
}
if (requeue)
qNodes(gANODES);
}
/**
*
*/
function parse(aSa, aNode, aScriptId, aMb, aSource) {
let
block,
lib,
KU,
usoCMethod,
ISI,
DDS,
RHV,
BT,
RN,
REL,
SSL,
EMBED,
REDUCE,
COLLAPSE,
HIDE
;
let excludes = toArray("exclude", aMb);
if (excludes)
for (let i = 0, exclude; exclude = excludes[i++];) {
if (exclude == "*") {
pushAdvisory(aSa, "XCLUDE", "Possible library support file detected");
block = true;
lib = true;
if (gISHOMEPAGE && !gmcHome.get("skipVerifyExclusion"))
aNode.addEventListener("click", nag, false);
break;
}
}
let updateURL = lastValueOf(aMb, "updateURL");
if (updateURL)
validateAOU(
updateURL,
aScriptId,
/^(\d+.*\.(?:meta|user)\.js)$/,
/^https?:\/\/(?:.*\.)?userscripts\.org(?::\d{1,5})?\/scripts\/source\/(\d+).*\.(meta|user)\.js/,
function (aREL, aSSL, aISI, aRHV, aBT, aDDS) {
if (aISI) { ISI = true; REDUCE = true; }
if (aREL) REL = true;
if (aSSL) SSL = true;
if (aRHV) RHV = true;
if (aBT) BT = true;
if (aDDS) DDS = true;
}
);
let
downloadURL = lastValueOf(aMb, "downloadURL"),
installURL = lastValueOf(aMb, "installURL")
;
[
installURL,
downloadURL
].forEach(function (e, i, a) {
if (e)
validateAOU(
e,
aScriptId,
/^(\d+.*\.user\.js)$/,
/^https?:\/\/(?:.*\.)?userscripts\.org(?::\d+)?\/scripts\/source\/(\d+).*\.user\.js/,
function (aREL, aSSL, aISI, aRHV, aBT) {
if (aISI) { ISI = true; REDUCE = true; }
if (aREL) REL = true;
if (aSSL) SSL = true;
if (aRHV) RHV = true;
if (aBT) BT = true;
}
);
});
let grants = toArray("grant", aMb);
if (grants)
for (let i = 0, grant; grant = grants[i++];) {
if (grant == "none") {
block = (lib) ? block : !gmcHome.get("allowUpdatersOnAOUgrantnone");
RN = (lib) ? RN : true;
break;
}
}
let
atRequires = toArray("require", aMb),
atIncludes = toArray("include", aMb),
atMatches = toArray("match", aMb),
atUsoScript = lastValueOf(aMb, "script", "uso"),
atUsoAuthor = lastValueOf(aMb, "author", "uso"),
atUsoTitle = lastValueOf(aMb, "title", "uso"),
atUsoDesc = lastValueOf(aMb, "desc", "uso"),
providers = []
;
let rewrite, json, GROUPS;
try { // TODO: Watchpoint
GROUPS = JSON.parse(gLIST + '}');
let jsonFilters = gmcFilters.get("jsonFilters");
json = JSON.parse(jsonFilters);
gGROUPS = JSON.parse(gLIST + ',"user":{' + jsonFilters.replace(/^[\n\r\s]*\{/, '') + '}');
}
catch (e) {
if (gmcHome.get("enableDebugging"))
console.warn('JSON parsing error...skipping user advisories');
gGROUPS = JSON.parse(gLIST + '}');
}
parseList(gGROUPS, function (aScope, aPatterns, aAdvisory, aSummary, aTips, aBlock, aReduce, aCollapse, aHide, aProvider, aCollector) {
for (let pattern in aPatterns) {
let matches = pattern.match(/^\/(.*)\/(i?g?m?y?)$/), patternx = pattern;
if (matches)
patternx = new RegExp(matches[1].replace(/\$1/, aScriptId), matches[2]);
if (aScope == "updater" && atRequires)
for (let i = 0, atRequire; atRequire = atRequires[i++];) {
let matches = (typeof patternx == "object") ? atRequire.match(patternx) : (atRequire == patternx) ? [atRequire, patternx] : null;
if (matches) {
if (/usocheckup/.test(matches[0])) {
let matches = atRequire.match(/method\=(\w+)/);
if (matches)
usoCMethod = matches[1];
else
usoCMethod = "show";
}
let sid = matches[1];
if (sid == aScriptId || sid == null) {
pushAdvisory(aSa, aAdvisory, aSummary + (aPatterns[pattern] ? " " + aPatterns[pattern] : "") + (aTips ? "\n " + aTips.join("\n ") : ""));
KU = true;
}
else {
pushAdvisory(aSa, "SEVERE", aSummary + "\n Possible malformed updater syntax");
REDUCE = true;
block = true;
break;
}
}
}
if (aScope == "@include" && atMatches)
for (let i = 0, atMatch; atMatch = atMatches[i++];)
if (atMatch.search(patternx) > -1) {
pushAdvisory(aSa, aAdvisory, aSummary);
if (aReduce) REDUCE = true;
break;
}
if (aScope == "@include" && atIncludes) {
for (let i = 0, atInclude; atInclude = atIncludes[i++];)
if (atInclude.search(patternx) > -1) {
pushAdvisory(aSa, aAdvisory, aSummary);
if (aReduce) REDUCE = true;
break;
}
}
else if (!atMatches && !atIncludes && !lib ) {
REDUCE = true;
pushAdvisory(aSa, "ELEVATE", "Possible implicit global web inclusion");
}
if (/^\@uso:author(?:$|\s)/.test(aScope) && atUsoAuthor)
if (atUsoAuthor.search(patternx) > -1) {
if (aSummary == "Potentially unwanted script") {
block = true;
REDUCE = true;
COLLAPSE = true;
if (gmcHome.get("alwaysHidePus"))
HIDE = true;
}
pushAdvisory(aSa, aAdvisory, aSummary + (aTips ? "\n " + aTips.join("\n ") : ""));
if (aBlock)
block = true;
if (aReduce)
REDUCE = true;
if (aCollapse)
COLLAPSE = true;
}
if (/^\@uso:script(?:$|\s)/.test(aScope) && atUsoScript)
if (atUsoScript.search(patternx) > -1) {
if (aSummary == "Potentially unwanted script") {
block = true;
REDUCE = true;
COLLAPSE = true;
if (gmcHome.get("alwaysHidePus"))
HIDE = true;
}
pushAdvisory(aSa, aAdvisory, aSummary + (aPatterns[pattern] ? " " + aPatterns[pattern] : "") + (aTips ? "\n " + aTips.join("\n ") : ""));
if (aBlock)
block = true;
if (aReduce)
REDUCE = true;
if (aCollapse)
COLLAPSE = true;
}
if (aScope == "@uso:title" && atUsoTitle) {
if (atUsoTitle.search(patternx) > -1) {
if (aSummary == "Potentially unwanted script") {
block = true;
REDUCE = true;
COLLAPSE = true;
if (gmcHome.get("alwaysHidePus"))
HIDE = true;
}
pushAdvisory(aSa, aAdvisory, aSummary + (aPatterns[pattern] ? " " + aPatterns[pattern] : "") + (aTips ? "\n " + aTips.join("\n ") : ""));
if (aBlock)
block = true;
if (aReduce)
REDUCE = true;
if (aCollapse)
COLLAPSE = true;
if (json && aCollector && !/^(?:\/home\/scripts|\/users\/.+?\/scripts|\/scripts\/show\/\d+)/.test(gPATHNAME)) {
let scope, advisorysummary;
[scope, advisorysummary] = aCollector;
let collect, id;
switch (scope) {
case "@uso:author":
collect = true;
id = atUsoAuthor;
break;
}
if (collect && id) {
if (!json[scope]) {
json[scope] = [advisorysummary, []];
rewrite = true;
}
let found, ids = json[scope][1]; // TODO:
ids.forEach(function (e, i, a) {
if (e == id)
found = true;
});
if (!found && json[scope + " (private)"]) {
ids = json[scope + " (private)"][1]; // TODO:
ids.forEach(function (e, i, a) {
if (e == id)
found = true;
});
}
if (!found && GROUPS && GROUPS["collections"][scope]) {
ids = GROUPS["collections"][scope][1]; // TODO:
ids.forEach(function (e, i, a) {
if (e == id)
found = true;
});
}
if (!found) {
json[scope][1].push(id); // TODO:
rewrite = true;
}
}
}
}
}
if (aScope == "@uso:desc" && atUsoDesc) {
if (atUsoDesc.search(patternx) > -1) {
if (aSummary == "Potentially unwanted script") {
block = true;
REDUCE = true;
COLLAPSE = true;
if (gmcHome.get("alwaysHidePus"))
HIDE = true;
}
pushAdvisory(aSa, aAdvisory, aSummary + (aPatterns[pattern] ? " " + aPatterns[pattern] : "") + (aTips ? "\n " + aTips.join("\n ") : ""));
if (aBlock)
block = true;
if (aReduce)
REDUCE = true;
if (aCollapse)
COLLAPSE = true;
if (json && aCollector && !/^(?:\/home\/scripts|\/users\/.+?\/scripts|\/scripts\/show\/\d+)/.test(gPATHNAME)) {
let scope, advisorysummary;
[scope, advisorysummary] = aCollector;
let collect, id;
switch (scope) {
case "@uso:author":
collect = true;
id = atUsoAuthor;
break;
}
if (collect && id) {
if (!json[scope]) {
json[scope] = [advisorysummary, []];
rewrite = true;
}
let found, ids = json[scope][1]; // TODO:
ids.forEach(function (e, i, a) {
if (e == id)
found = true;
});
if (!found && json[scope + " (private)"]) {
ids = json[scope + " (private)"][1]; // TODO:
ids.forEach(function (e, i, a) {
if (e == id)
found = true;
});
}
if (!found && GROUPS && GROUPS["collections"][scope]) {
ids = GROUPS["collections"][scope][1]; // TODO:
ids.forEach(function (e, i, a) {
if (e == id)
found = true;
});
}
if (!found) {
json[scope][1].push(id); // TODO:
rewrite = true;
}
}
}
}
}
if (aScope == "updaterEmbed" && aSource) {
if (aSource.search(patternx) > -1 && aScriptId != 68219 && aScriptId != 69307) {
EMBED = true;
pushAdvisory(aSa, aAdvisory, aSummary + (aPatterns[pattern] ? " " + aPatterns[pattern] : "") + (aTips ? "\n " + aTips.join("\n ") : ""));
}
}
if (aScope == "search" && aSource) {
if (aSource.search(patternx) > -1) {
if (aSummary == "Potentially unwanted script") {
block = true;
REDUCE = true;
COLLAPSE = true;
if (gmcHome.get("alwaysHidePus"))
HIDE = true;
}
pushAdvisory(aSa, aAdvisory, aSummary + (aPatterns[pattern] ? " " + aPatterns[pattern] : "") + (aTips ? "\n " + aTips.join("\n ") : ""));
if (aReduce)
REDUCE = true;
if (json && aCollector && !/^(?:\/home\/scripts|\/users\/.+?\/scripts|\/scripts\/show\/\d+)/.test(gPATHNAME)) {
let scope, advisorysummary;
[scope, advisorysummary] = aCollector;
let collect, id;
switch (scope) {
case "@uso:author":
collect = true;
id = atUsoAuthor;
break;
}
if (collect && id) {
if (!json[scope]) {
json[scope] = [advisorysummary, []];
rewrite = true;
}
let found, ids = json[scope][1]; // TODO:
ids.forEach(function (e, i, a) {
if (e == id)
found = true;
});
if (!found && json[scope + " (private)"]) {
ids = json[scope + " (private)"][1]; // TODO:
ids.forEach(function (e, i, a) {
if (e == id)
found = true;
});
}
if (!found && GROUPS && GROUPS["collections"][scope]) {
ids = GROUPS["collections"][scope][1]; // TODO:
ids.forEach(function (e, i, a) {
if (e == id)
found = true;
});
}
if (!found) {
json[scope][1].push(id); // TODO:
rewrite = true;
}
}
}
}
}
if (aProvider)
providers.push(aProvider);
}
});
if (json && rewrite) {
json["@uso:author"][1].sort(function (a, b) { return a - b });
gmcFilters.set("jsonFilters", JSON.stringify(json, null, "")); // TODO:
gmcFilters.write();
}
/** **/
let
msgDDS = "AOU\n Possible DDoS attack script and/or Privacy Loss",
msgRHV = "AOU\n Possible Remotely Hosted Version or bad target",
msgBT = "AOU\n Possible bad target and/or Privacy Loss",
msgISI = "AOU\n Possible incorrect scriptid applied for updates",
msgRN = "Restricted (content scope) namespace script"
;
if (DDS)
pushAdvisory(aSa, "SEVERE", msgDDS);
if (RHV)
pushAdvisory(aSa, "HIGH", msgRHV);
if (BT)
pushAdvisory(aSa, "HIGH", msgBT);
if (RN)
pushAdvisory(aSa, "ELEVATE", msgRN);
if (ISI)
pushAdvisory(aSa, "SEVERE", msgISI);
if (KU && RN) {
pushAdvisory(aSa, "ABORT", "Known updater and restricted (content scope) namespace are incompatible");
block = true;
}
advise(aSa, aNode, aMb, EMBED, REDUCE, COLLAPSE, HIDE);
if (/^\/(?:scripts|topics)\//.test(gPATHNAME)) {
if (block || (gmcHome.get("allowAOU") && (DDS || RHV || BT)) || (gmcHome.get("allowAOU") && ISI) || aMb["uso"]["unlisted"] == "") {
if (gmcHome.get("forceInstallSecure"))
aNode.protocol = "https:";
if (gmcHome.get("forceInstallRecent"))
aNode.pathname = aNode.pathname
.replace(/\/source\//, "/version/")
.replace(/(\.user\.js)$/, "/" + lastValueOf(aMb, "version", "uso") + "$1");
}
else
create(aNode, atUsoScript, aMb, providers, KU, usoCMethod);
}
}
/**
*
*/
function unitSizer(aNumber) {
if (typeof aNumber == "string")
aNumber = parseInt(aNumber);
return (
(aNumber >= 1024)
? (aNumber >= 1048576)
? parseInt(aNumber / 1024 / 1024 * 100) / 100 + " MiB"
: parseInt(aNumber / 1024 * 100) / 100 + " KiB"
: aNumber + " B"
);
}
/**
*
*/
function onError() { // NOTE: GM BUG with aR so don't use
if (gmcHome.get("enableNabAuthorId")) {
let contentNode = document.getElementById("content");
if (contentNode) {
let loginMsgNode = contentNode.querySelector("p.notice a[href$=login]");
if (!loginMsgNode && !gLoginTried) {
gLoginMsgShown = true;
let nodeP;
if (document.body.classList.contains("anon") && gmcHome.get("enableNabAuthorId")) {
let loginNodeA = document.createElement("a");
loginNodeA.href = "/login";
loginNodeA.textContent = "login";
let installWithNodeA = document.createElement("a");
installWithNodeA.href = "/scripts/show/68219";
installWithNodeA.textContent = "installWith";
let nodeSpan = document.createElement("span");
nodeSpan.textContent = "You may be able to reduce your bandwidth usage with a visit to the ";
nodeP = document.createElement("p");
nodeP.classList.add("notice");
nodeP.classList.add("info");
nodeSpan.appendChild(loginNodeA);
nodeSpan.appendChild(document.createTextNode(" page while using "));
nodeSpan.appendChild(installWithNodeA);
nodeSpan.appendChild(document.createTextNode("."));
nodeP.appendChild(nodeSpan);
if (/^\/users\/\d+\/scripts/.test(gPATHNAME))
contentNode.parentNode.insertBefore(nodeP, contentNode);
else
contentNode.insertBefore(nodeP, contentNode.firstChild);
}
if (gmcHome.get("enableAutoSession")) {
gLoginTrying = true;
GM_xmlhttpRequest({
retry: gRETRIES,
url: "http" + ((/^https:$/i.test(gPROTOCOL) || gmcHome.get("forceInstallSecure")) ? "s" : "") + "://userscripts.org" + gPORTX + "/login",
method: "HEAD",
onload: function (aR) {
switch(aR.status) {
case 404:
if (gHALT404)
this._retry = 0;
case 500:
case 502:
case 503:
if (gJSE && this.retry-- > 0)
setTimeout(GM_xmlhttpRequest, gDELAYRETRYMIN + Math.round(Math.random() * (gDELAYRETRYMAX - gDELAYRETRYMIN)), this); // NOTE: Detached
else {
if (gmcHome.get("enableDebugging"))
console.warn('Unable to establish session');
}
break;
case 200:
gBYTESMIN = undefined;
gLoginTried = true;
gLoginTrying = false;
break;
default:
if (gmcHome.get("enableDebugging"))
console.warn('Untrapped status code: ' + aR.status);
break;
}
}
});
}
}
}
gBYTESMIN = 0; // NOTE: Watchpoint
gBYTESMAX = parseInt(gBYTESMAX / gANONDIVISOR);
}
gIdle = true;
onViewportChange();
}
/**
*
*/
function onLoad(aR) {
switch (aR.status) {
case 404:
if (gHALT404)
this._retry = 0;
case 500:
case 502:
case 503:
if (gJSE && this._retry-- > 0)
setTimeout(GM_xmlhttpRequest, gDELAYRETRYMIN + Math.round(Math.random() * (gDELAYRETRYMAX - gDELAYRETRYMIN)), this); // NOTE: Detached
else {
if (/\.meta\.js$/.test(this.url)) {
pushAdvisory(this._sa, "ABORT", "Unable to retrieve script metadata");
this._mb = {};
this._mb["uso"] = {};
this._mb["uso"]["script"] = this._scriptId;
}
else if (/\.user\.js$/.test(this.url))
pushAdvisory(this._sa, "ABORT", "Unable to retrieve script source");
else
pushAdvisory(this._sa, "UNKNOWN", "Unable to retrieve authorship");
advise(this._sa, this._node, this._mb);
this._node.classList.remove("saB");
gQNODES.shift();
xhr.call(gTHIS, this);
}
break;
case 200:
case 206:
if (/\.meta\.js$/.test(this.url)) {
this._mb = parseMeta(aR.responseText);
if (!this._mb) {
pushAdvisory(this._sa, "ABORT", "Unable to retrieve script metadata");
advise(this._sa, this._node, this._mb);
this._node.classList.remove("saB");
gQNODES.shift();
xhr.call(gTHIS, this);
return;
}
let pageMetaVersion = document.querySelector("meta[name='uso:version']");
if (pageMetaVersion && gISHOMEPAGE)
if (lastValueOf(this._mb, "version", "uso") != pageMetaVersion.content) {
pushAdvisory(this._sa, "ABORT", "meta.js @uso:version and page @uso:version DO NOT MATCH");
advise(this._sa, this._node, this._mb);
this._node.classList.remove("saB");
gQNODES.shift();
xhr.call(gTHIS, this);
return;
}
if (lastValueOf(this._mb, "script", "uso") != this._scriptId) {
pushAdvisory(this._sa, "SEVERE", "Malformed metadata block");
addValue(this._scriptId, "script", this._mb["uso"]);
}
/** Create phantom key(s) if detected **/
if (this._node.classList.contains("userjs")) {
if (/\?token=/.test(this._node))
this._mb["uso"]["unlisted"] = "";
}
else {
let emNode = this._node.querySelector("em");
if (emNode && emNode.textContent == "unlisted")
this._mb["uso"]["unlisted"] = "";
}
let titleNode = this._node.querySelector(".title") || this._node.parentNode.parentNode.querySelector(".title");
if (titleNode)
addValue(titleNode.textContent, "title", this._mb["uso"]);
else
addValue("", "title", this._mb["uso"]);
let descNode = this._node.querySelector(".desc");
if (descNode)
addValue(descNode.textContent, "desc", this._mb["uso"]);
else {
let summaries = document.querySelectorAll("#root #content .script_summary");
for (let i = 0, thisNode; thisNode = summaries[i++];) {
let bNode = thisNode.querySelector("p b");
if (bNode && bNode.textContent.match(/^Script\sSummary\:$/i)) {
descNode = bNode.nextSibling;
addValue(descNode.textContent.replace(/^[\r\n]/, "").replace(/[\r\n]$/, ""), "desc", this._mb["uso"]);
}
}
}
if (!descNode)
addValue("", "desc", this._mb["uso"]);
let user_idNode = document.body.querySelector("#heading .author a");
if (user_idNode) {
addValue(user_idNode.getAttribute("user_id"), "author", this._mb["uso"]);
addValue(user_idNode.textContent, "name", this._mb["uso"]);
let matches = user_idNode.getAttribute("gravatar").match(/^.+?(?:gravatar_id\=(.+?)|\/avatar\/(.+?))[\?\&]/);
if (matches)
addValue(matches[1] || matches[2], "avatar", this._mb["uso"]);
else
addValue("", "avatar", this._mb["uso"]);
}
else if (/^\/users\/.+?\/scripts/.test(gPATHNAME)) {
user_idNode = document.querySelector("#section .container h2 a"); //document.querySelector(".avatar a");
if (user_idNode) {
let aid = user_idNode.pathname.match(/\/(\d+)$/);
if (aid) {
addValue(aid[1], "author", this._mb["uso"]);
addValue(user_idNode.textContent, "name", this._mb["uso"]);
let gravatarNode = document.querySelector(".avatar a img");
if (gravatarNode) {
let gid = gravatarNode.src.match(/^.+?(?:gravatar_id\=(.+?)|\/avatar\/(.+?))[\?\&]/);
if (gid)
addValue(gid[1] || gid[2], "avatar", this._mb["uso"]);
}
else
addValue("", "avatar", this._mb["uso"]);
}
else {
addValue("", "author", this._mb["uso"]);
addValue("", "name", this._mb["uso"]);
addValue("", "avatar", this._mb["uso"]);
}
}
else {
addValue("", "author", this._mb["uso"]);
addValue("", "name", this._mb["uso"]);
addValue("", "avatar", this._mb["uso"]);
}
}
else {
addValue("", "author", this._mb["uso"]);
addValue("", "name", this._mb["uso"]);
addValue("", "avatar", this._mb["uso"]);
}
let iconNode = document.getElementById("icon");
if (iconNode) {
let matches = iconNode.pathname.match(/\.(\w+)$/);
if (matches) {
addValue(matches[1], "icontype", this._mb["uso"]);
}
else
addValue("", "icontype", this._mb["uso"]);
}
else
addValue("", "icontype", this._mb["uso"]);
addValue(aR.responseText.length.toString(), "metajssize", this._mb["uso"]);
let stats = [];
let matches = aR.responseText.match(/\n/g); // NOTE: Meta should always have at least one newline
if (matches) {
addValue((matches.length + 1).toString(), "metajslines", this._mb["uso"]);
stats.push(unitSizer(lastValueOf(this._mb, "metajssize", "uso")) + " with " + lastValueOf(this._mb, "metajslines", "uso") + " lines");
}
let ws, nws;
matches = aR.responseText.match(/\s/g);
if (matches) {
ws = matches.length;
addValue(ws.toString(), "metajsws", this._mb["uso"]);
}
matches = aR.responseText.match(/\S/g);
if (matches) {
nws = matches.length;
addValue(nws.toString(), "metajsnws", this._mb["uso"]);
}
stats.push(parseInt(ws / (ws + nws) * 10000) / 100 + "% whitespace");
pushAdvisory(this._sa, "INFO", "Raw meta.js\n " + stats.join("\n "));
/** **/
if (this._mb["uso"]["unlisted"] == "") // NOTE: Self unlisting phantom if present
pushAdvisory(this._sa, "ELEVATE", "Unlisted script");
if ((
/^\/$/.test(gPATHNAME) && gmcHome.get("scanMainDepth") == "deep" ||
/^\/tags\//.test(gPATHNAME) && gmcHome.get("scanTagsDepth") == "deep" ||
/^\/scripts(?:\/?$|\/search\/?$)/.test(gPATHNAME) && gmcHome.get("scanScriptsDepth") == "deep" ||
/^\/groups\/\d+\/scripts/.test(gPATHNAME) && gmcHome.get("scanGroupsDepth") == "deep" ||
/(^\/users\/.+?\/(?:scripts|favorites)|^\/home\/(?:scripts|favorites))/.test(gPATHNAME) && gmcHome.get("scanScriptWrightDepth") == "deep" ||
/^\/(?:scripts\/show|topics)/.test(gPATHNAME) && !gmcHome.get("disableScanDeep")
) &&
this._mb["uso"]["unlisted"] != ""
) {
this.url = this.url.replace(/\/source\/(\d+)\.meta\.js$/, "/version/$1/" + lastValueOf(this._mb, "version", "uso") + ".user.js");
this._retry = gRETRIES;
GM_xmlhttpRequest.call(gTHIS, this);
}
else {
addValue("", "userjs", this._mb["uso"]);
let atUsoAuthor = lastValueOf(this._mb, "author", "uso");
if (gmcHome.get("enableNabAuthorId") && !atUsoAuthor && !/^\/home\/scripts/.test(gPATHNAME)) {
this.url = "/scripts/show/" + this._scriptId;
this.headers = { "Range": "bytes=" + (gBYTESMIN ? gBYTESMIN : 0) + "-" + (gBYTESMAX ? gBYTESMAX : "") };
if (gmcHome.get("enableDebugging"))
console.info(this.headers.Range);
this._retry = gRETRIES;
GM_xmlhttpRequest.call(gTHIS, this);
}
else {
parse(this._sa, this._node, this._scriptId, this._mb);
this._node.classList.remove("saB");
gQNODES.shift();
xhr.call(gTHIS, this);
}
}
}
else if (/\.user\.js$/.test(this.url)) {
/** Add some keys **/
addValue(aR.responseText, "userjs", this._mb["uso"]);
addValue(aR.responseText.length.toString(), "userjssize", this._mb["uso"]);
let stats = [];
let matches = aR.responseText.match(/\n/g); // NOTE: Script should always have at least one newline
if (matches) {
addValue((matches.length + 1).toString(), "userjslines", this._mb["uso"]);
stats.push(unitSizer(lastValueOf(this._mb, "userjssize", "uso")) + " with " + lastValueOf(this._mb, "userjslines", "uso") + " lines");
}
let ws, nws;
matches = aR.responseText.match(/\s/g);
if (matches) {
ws = matches.length;
addValue(ws.toString(), "userjsws", this._mb["uso"]);
}
matches = aR.responseText.match(/\S/g);
if (matches) {
nws = matches.length;
addValue(nws.toString(), "userjsnws", this._mb["uso"]);
}
stats.push(parseInt(ws / (ws + nws) * 10000) / 100 + "% whitespace");
pushAdvisory(this._sa, "INFO", "Raw user.js\n " + stats.join("\n "));
let atUsoAuthor = lastValueOf(this._mb, "author", "uso");
if (gmcHome.get("enableNabAuthorId") && !atUsoAuthor && !/^\/home\/scripts/.test(gPATHNAME)) {
this.url = "/scripts/show/" + this._scriptId;
this.headers = { "Range": "bytes=" + (gBYTESMIN ? gBYTESMIN : 0) + "-" + (gBYTESMAX ? gBYTESMAX : "") };
if (gmcHome.get("enableDebugging"))
console.info(this.headers.Range);
this._retry = gRETRIES;
GM_xmlhttpRequest.call(gTHIS, this);
}
else {
/** Remove some keys **/
let userjs = lastValueOf(this._mb, "userjs", "uso").replace(/\s+\/\/\s@(?:updateURL|installURL|downloadURL|exclude)\s+.*[^\n\r]/gm, "");
parse(this._sa, this._node, this._scriptId, this._mb, userjs);
this._node.classList.remove("saB");
gQNODES.shift();
xhr.call(gTHIS, this);
}
}
else if (/\/scripts\/show\/\d+$/.test(this.url)) {
let
parser = new DOMParser(),
doc = parser.parseFromString(aR.responseText, "text/html"),
retry
;
let titleNode = doc.querySelector(".title");
if (titleNode)
addValue(titleNode.textContent, "title", this._mb["uso"]);
// TODO: "desc" if resolved
let author = doc.querySelector("span.author");
if (author) {
let vcard = author.querySelector("a");
if (vcard) {
addValue(vcard.getAttribute("user_id"), "author", this._mb["uso"]);
let matches = vcard.getAttribute("gravatar").match(/^.+?(?:gravatar_id\=(.+?)|\/avatar\/(.+?))[\?\&]/);
if (matches)
addValue(matches[1] || matches[2], "avatar", this._mb["uso"]);
matches = vcard.getAttribute("href").match(/\/users\/(.*)/);
if (matches)
addValue(matches[1] || matches[2], "vanity", this._mb["uso"]);
addValue(vcard.textContent, "name", this._mb["uso"]);
}
else {
if (author.textContent == "By deleted user") {
pushAdvisory(this._sa, "ABORT", "Deleted user");
}
}
}
else {
gBYTESMIN = undefined; // NOTE: Force a reset during login
retry = true; // NOTE: Rerun current request
if (gmcHome.get("enableDebugging")) {
console.error('No ScriptWright id found in fragment for url: ' + this.url);
console.warn(aR.responseText);
}
}
this.headers = undefined;
if (!retry) {
let userjs;
/** Optionally remove some keys **/
if (this._mb["uso"]["userjs"])
userjs = lastValueOf(this._mb, "userjs", "uso").replace(/\s+\/\/\s@(?:updateURL|installURL|downloadURL|exclude)\s+.*[^\n\r]/gm, "");
parse(this._sa, this._node, this._scriptId, this._mb, userjs);
this._node.classList.remove("saB");
gQNODES.shift();
}
if (gQNODES.length > 0) {
// Recalculate low and high bytes for next node
if (!this.headLength)
this.headLength = byteLength(doc.documentElement.getElementsByTagName("head")[0].innerHTML) - byteLength(doc.title) + gHEADLENADJ;
let titleTextNode = gQNODES[0].querySelector("a.title").textContent;
let lenTitle = byteLength(titleTextNode);
if (/\.\.\.$/.test(titleTextNode) && titleTextNode.length == 50)
lenTitle = 255 * 4; // WATCHPOINT: Set to max bytes of unicode since unknown
lenTitle += byteLength(" for Greasemonkey");
let len = this.headLength - lenTitle;
let low = len + lenTitle;
let high = parseInt(len) + (lenTitle * 2) + (80 * 2) + gTITLELENADJ;
if (gBYTESMIN !== 0) {
gBYTESMIN = low;
gBYTESMAX = high;
}
else {
gBYTESMIN = 0;
if (gLoginTrying)
gBYTESMAX = high;
else
gBYTESMAX = parseInt(high / gANONDIVISOR);
}
}
else {
gBYTESMIN = undefined;
gBYTESMAX = undefined;
}
if (retry) {
this._retry = gRETRIES;
GM_xmlhttpRequest.call(gTHIS, this);
}
else
xhr.call(gTHIS, this);
}
break;
default:
pushAdvisory(this._sa, "ABORT", "Untrapped status code: " + aR.status);
advise(this._sa, this._node, this._mb);
this._node.classList.remove("saB");
gQNODES.shift();
xhr.call(gTHIS, this);
break;
}
}
/**
*
*/
function xhr(aReq) {
if (gQNODES.length > 0) {
gIdle = false;
let thisNode = gQNODES[0];
if (thisNode) {
thisNode.classList.add("saB");
let thatNode;
if (thisNode.classList.contains("userjs"))
thatNode = thisNode;
else
thatNode = thisNode.querySelector(".title");
let scriptId;
[, scriptId] = thatNode.pathname.match(/(\d+).*$/);
aReq._retry = gRETRIES;
aReq._sa = {};
aReq._node = thisNode;
aReq._scriptId = scriptId;
aReq._mb = null;
aReq.url = "/scripts/source/" + scriptId + ".meta.js";
GM_xmlhttpRequest(aReq);
}
}
else {
gIdle = true;
}
}
/**
*
*/
function qNodes(aNodes) {
for (let i = 0, thisNode; thisNode = aNodes[i++];)
if (isViewing(thisNode) && !thisNode.classList.contains("saU")) {
thisNode.classList.add("saU");
gQNODES.push(thisNode);
}
if (gIdle)
xhr({
method: "GET",
onload: onLoad,
onerror: onError
});
}
/**
*
*/
function onViewportChange() {
qNodes(gANODES);
}
/**
*
*/
function insertHook() {
let hookNode = document.getElementById("full_description");
if (hookNode && !hookNode.firstChild)
return hookNode.appendChild(document.createElement("div"));
else if (hookNode)
return (hookNode.insertBefore(document.createElement("div"), hookNode.firstChild));
else {
hookNode = document.getElementById("content");
if (hookNode) {
let nodeDiv = document.createElement("div");
let full_descriptionNodeDiv = document.createElement("div");
full_descriptionNodeDiv.id = "full_description";
full_descriptionNodeDiv.appendChild(nodeDiv);
return hookNode.appendChild(full_descriptionNodeDiv);
}
else {
if (gmcHome.get("enableDebugging"))
console.log("ERROR: USO DOM change detected... appending GMC remote to EoD");
return document.body.appendChild(document.createElement("div"));
}
}
}
/**
* main'ish
*/
/** Clean up USO for framed presentation **/
if (!gISFRAMELESS && /^\/scripts\/show\/\d+#heading/.test(gPATHNAME + gHASH)) {
aNodes = document.body.querySelectorAll("a");
for (let i = 0, thisNode; thisNode = aNodes[i++];)
thisNode.target = "_top";
GM_setStyle({
node: gCSS,
data:
[
"div.container { width: auto; margin: 0; }",
"div#content { width: 100% !important; left: 0; }",
"div#heading { height: 66px; min-height: 0; }",
"div#details h1.title { max-height: 2.05em; overflow: hidden; }",
"#section > .container { width: auto !important; }",
"#section_search { display: none !important; }",
"#install_script { bottom: auto !important; top: 10px !important; margin-right: 5px; }"
].join("\n")
});
}
/** Nearest fix(es) for any glitches with UAC/USO **/
if (gUAC)
GM_setStyle({
node: gCSS,
data: [
"div #full_description { width: 98.6%; }",
"#screenshots { width: 98% !important; }",
"#activity, #topics { float: inherit !important; }" // Alternative: "h6 { clear: both; }",
].join("\n")
});
else
GM_setStyle({
node: gCSS,
data: [
"div #full_description { width: 97.9%; }"
].join("\n")
});
/** **/
if (typeof GM_configStruct == "undefined") {
if (gmcHome.get("enableDebugging")) {
let msg = 'Fatal error. GM_config not found';
console.error(msg);
}
return;
}
GM_config = undefined;
let gmcHome = new GM_configStruct();
gmcHome.id = "gmc68219home";
gmcHome.init(
gISHOMEPAGE ? insertHook() : "",
[
'<img alt="installWith" title="uso – installWith" src="' + GM_getResourceURL("icon") + '" />',
'<p>Preferences</p>',
'<span>',
'<a href="/guides/24/">',
'<img alt="usoCheckup" title="Powered in part by usoCheckup" src="' + GM_getResourceURL("usoc") + '" />',
'</a>',
'<a href="' + gPROTOCOL + '//github.com/sizzlemctwizzle/GM_config/wiki/">',
'<img alt="GM_config" title="Powered in part by GM_config" src="' + GM_getResourceURL("gmc") + '" />',
'</a>',
'</span>'
].join(""),
GM_setStyle({
node: null,
data:
[
"@media screen, projection {",
"#gmc68219home { position: static !important; z-index: 0 !important; width: auto !important; height: auto !important; max-height: none !important; max-width: none !important; margin: 0 0 0.5em 0 !important; border: 1px solid #ddd !important; clear: right !important; }",
"#gmc68219home_header a { display: inline; }",
"#gmc68219home_header img { max-height: 32px; margin-right: 0.125em; vertical-align: middle; }",
"#gmc68219home_header > p { display: inline; margin: 0; vertical-align: middle; }",
"#gmc68219home_header span { float: right; }",
"#gmc68219home_header span > a { display: inline; margin-left: 0.25em; }",
"#gmc68219home_wrapper { background-color: #eee; padding-bottom: 0.25em; }",
"#gmc68219home .config_header { background-color: #333; color: #fff; font-size: 1.57em; margin: 0; padding: 0 0.5em; text-align: left; }",
"#gmc68219home .config_var { clear: both; margin: 0.33em; padding: 0; }",
"#gmc68219home .field_label { color: #333; font-size: 100%; font-weight: normal; margin: 0 0.25em; position: relative; top: -0.2em; }",
"#gmc68219home .section_header_holder { margin: 0.25em 0.5em !important; }",
"#gmc68219home .section_desc { margin: 0.25em 1.5em !important; }",
".gmc-yellownote { background-color: #ffd; font-size: 0.66em !important; }",
".gmc68219home-invisilink { text-decoration: none; color: #000; }",
".gmc68219home-invisilink:hover { color: #000; }",
"#gmc68219home_wrapper textarea,",
"#gmc68219home_wrapper input",
"{ font-size: 1em; }",
"#gmc68219home_wrapper input[type='text']",
"{ text-align: right; width: 2em; }",
"#gmc68219home_maxHeightListSa_var,",
"#gmc68219home_scanScriptWrightDepth_var,",
"#gmc68219home_scanScriptsDepth_var,",
"#gmc68219home_scanGroupsDepth_var,",
"#gmc68219home_scanTagsDepth_var,",
"#gmc68219home_scanMainDepth_var,",
"#gmc68219home_enableAutoSession_var,",
"#gmc68219home_alwaysShowAuthorId_var,",
"#gmc68219home_alwaysHidePus_var,",
"#gmc68219home_alwaysHideDeletedUser_var",
"{ margin-left: 2em !important; }",
"#gmc68219home .reset, #gmc68219home .reset a, #gmc68219home_buttons_holder { text-align: inherit; }",
"#gmc68219home_buttons_holder { margin: 0.5em; }",
"#gmc68219home_saveBtn { margin: 0.5em !important; padding: 0 3.0em !important; }",
"#gmc68219home_resetLink { margin-right: 1.5em; }",
"#gmc68219home_closeBtn { display: none; }",
"}",
"@media print {",
"#gmc68219home { display: none !important; }",
"}"
].join("\n")
}),
{
'forceInstallSecure': {
"section": [],
"type": 'checkbox',
"label": 'Force userscripts.org installations to use secure when browsing the site in unsecure',
"default": false
},
'forceInstallRecent': {
"type": 'checkbox',
"label": 'Force userscripts.org installations to use the most recently detected version',
"default": false
},
'mirrorDomain': {
"section": [,''],
"label": 'Mirror domain name for usoCheckup <em class="gmc-yellownote">Select primary ONLY or secure OPTIONALLY if behind a domain blocklist that prevents the redirect</em>',
"type": 'radio',
"options": ['redirect', 'primary', 'secure'],
"default": 'redirect'
},
'allowAOU': {
"type": 'checkbox',
"label": 'Allow Add-on Updater <em class="gmc-yellownote">WARNING: Greasemonkey versions 0.9.13+ can be <strong>UNSAFE</strong> with invalid <a class="gmc68219home-invisilink" href="' + gPROTOCOL + '//sf.net/apps/mediawiki/greasemonkey/index.php?title=Metadata_Block#.40updateURL">@updateURL</a> values</em>',
"default": false
},
'allowUpdatersOnAOUgrantnone': {
"section": [,''],
"type": 'checkbox',
"label": 'Allow updaters to be added on scripts that have <code><a class="gmc68219home-invisilink" href="' + gPROTOCOL + '//sf.net/apps/mediawiki/greasemonkey/index.php?title=Metadata_Block#.40grant">@grant</a> none</code> <em class="gmc-yellownote">WARNING: Some scripts may not work properly</em>',
"default": false
},
'skipVerifyExclusion': {
"type": 'checkbox',
"label": 'Skip verify for installation of exclusion scripts <em class="gmc-yellownote">Not recommended</em>',
"default": false
},
'disableScanDeep': {
"section": [,''],
"type": "checkbox",
"label": 'Disable deep scanning for individual script home pages <em class="gmc-yellownote">WARNING: Turning this option on may provide less accurate results</em>',
"default": false
},
'limitMaxHeightSa': {
"type": 'checkbox',
"label": 'Limit maximum height of all shown item types in the sidebar',
"default": false
},
'maxHeightListSa': {
"type": 'unsigned number',
"label": 'em maximum height of all shown item types',
"default": 10
},
'enableScanScriptWright': {
"section": [,''],
"type": "checkbox",
"label": 'Enable ScriptWright script pages scanning <em class="gmc-yellownote">WARNING: Deep scanning may be CPU and bandwidth intensive</em>',
"default": false
},
'scanScriptWrightDepth': {
"type": 'radio',
"options": ['shallow', 'deep'],
"default": 'shallow'
},
'enableScanGroups': {
"section": [,''],
"type": "checkbox",
"label": 'Enable Group script pages scanning <em class="gmc-yellownote">WARNING: Deep scanning may be CPU and bandwidth intensive</em>',
"default": false
},
'scanGroupsDepth': {
"type": 'radio',
"options": ['shallow', 'deep'],
"default": 'shallow'
},
'enableScanScripts': {
"type": "checkbox",
"label": 'Enable Scripts pages scanning <em class="gmc-yellownote">WARNING: Deep scanning may be CPU and bandwidth intensive</em>',
"default": false
},
'scanScriptsDepth': {
"type": 'radio',
"options": ['shallow', 'deep'],
"default": 'shallow'
},
'enableScanTags': {
"type": "checkbox",
"label": 'Enable Tags pages scanning <em class="gmc-yellownote">WARNING: Deep scanning may be CPU and bandwidth intensive</em>',
"default": false
},
'scanTagsDepth': {
"type": 'radio',
"options": ['shallow', 'deep'],
"default": 'shallow'
},
'enableScanMain': {
"type": "checkbox",
"label": 'Enable Popular scripts pages scanning <em class="gmc-yellownote">WARNING: Deep scanning may be CPU and bandwidth intensive</em>',
"default": false
},
'scanMainDepth': {
"type": 'radio',
"options": ['shallow', 'deep'],
"default": 'shallow'
},
'enableNabAuthorId': {
"section": [,''],
"type": "checkbox",
"label": 'Enable ScriptWright info request when unavailable <em class="gmc-yellownote">BETA: This may be bandwidth intensive and can be slow during high traffic periods</em>',
"default": false
},
'enableAutoSession': {
"type": "checkbox",
"label": 'Auto attempt to establish a session with userscripts.org <em class="gmc-yellownote">WARNING: This should reduce bandwidth some but usually has less privacy</em>',
"default": false
},
'alwaysShowAuthorId': {
"type": "checkbox",
"label": 'Always show ScriptWright info in mixed ScriptWright script lists',
"default": false
},
'alwaysHideDeletedUser': {
"type": "checkbox",
"label": 'Always hide a deleted ScriptWright in mixed ScriptWright script lists',
"default": false
},
'alwaysHidePus': {
"type": "checkbox",
"label": 'Always hide Potentially Unwanted scripts in mixed ScriptWright script lists',
"default": false
},
'disableViewportHold': {
"section": [,''],
"type": "checkbox",
"label": 'Disable Viewport hold <em class="gmc-yellownote">WARNING: This uses more bandwidth and can be slow during high traffic periods</em>',
"default": false
},
'enableDebugging': {
"section": [,''],
"type": "checkbox",
"label": 'Enable debugging <em class="gmc-yellownote">WARNING: Includes console methods, and alerts that may block script execution, for any known potential issues and monitoring</em>',
"default": false
}
}
);
gmcHome.onSave = function() {
let write = false;
let reopen = false;
GM_setStyle({
node: gCSS,
data:
[
"#script_sidebar h7 div.sa { max-height: " + (gmcHome.get("limitMaxHeightSa") ? gmcHome.get("maxHeightListSa") + "em" : "none") + "; }"
].join("\n")
});
if (write) gmc.write();
if (reopen) { gmc.close(); gmc.open(); }
}
/** **/
if (gmcHome.get("limitMaxHeightSa"))
GM_setStyle({
node: gCSS,
data:
[
"#script_sidebar h7 div.sa { max-height: " + gmcHome.get("maxHeightListSa") + "em; overflow: auto; }"
].join("\n")
});
if (gISFRAMELESS && /\/scripts\/show\/68219\/?$/.test(gPATHNAME)) {
gmcHome.open();
}
/**
*
*/
let gmc = new GM_configStruct();
gmc.id = "gmc68219";
gmc.init(
gISHOMEPAGE ? insertHook() : "",
(
(
(/\/scripts\/show\/68219\/?$/.test(gPATHNAME))
? [
'<img alt="installWith" title="uso - installWith" src="' + GM_getResourceURL("icon") + '" />'
].join("")
: [
'<a href="/scripts/show/68219">',
'<img alt="installWith" title="uso - installWith" src="' + GM_getResourceURL("icon") + '" />',
'</a>'
].join("")
)
+ [
'<p>Options</p>',
'<span>',
'<a href="/guides/24/">',
'<img alt="usoCheckup" title="Powered in part by usoCheckup" src="' + GM_getResourceURL("usoc") + '" />',
'</a>',
'<a href="' + gPROTOCOL + '//github.com/sizzlemctwizzle/GM_config/wiki">',
'<img alt="GM_config" title="Powered in part by GM_config" src="' + GM_getResourceURL("gmc") + '" />',
'</a>',
'</span>'
].join("")
),
/* Custom CSS */
GM_setStyle({
node: null,
data:
[
"@media screen, projection {",
"#gmc68219 { position: static !important; z-index: 0 !important; width: auto !important; height: auto !important; max-height: none !important; max-width: none !important; margin: 0 0 0.5em 0 !important; border: 1px solid #ddd !important; clear: right !important; }",
"#gmc68219_header a { display: inline; }",
"#gmc68219_header img { max-height: 32px; margin-right: 0.125em; vertical-align: middle; }",
"#gmc68219_header > p { display: inline; margin: 0; vertical-align: middle; }",
"#gmc68219_header span { float: right; }",
"#gmc68219_header span > a { display: inline; margin-left: 0.25em; }",
"#gmc68219_wrapper { background-color: #eee; padding-bottom: 0.25em; }",
"#gmc68219 .config_header { background-color: #333; color: #fff; font-size: 1.57em; margin: 0; padding: 0 0.5em; text-align: left; }",
"#gmc68219 .config_var { clear: both; margin: 0.33em; padding: 0; }",
"#gmc68219 .field_label { color: #333; font-size: 100%; font-weight: normal; margin: 0 0.25em; position: relative; top: -0.2em; }",
"#gmc68219 .section_header_holder { margin: 0.25em 0.5em !important; }",
"#gmc68219 .section_desc { margin: 0.25em 1.5em !important; }",
".gmc-yellownote { background-color: #ffd; font-size: 0.66em !important; }",
".gmc68219-invisilink { text-decoration: none; color: #000; }",
".gmc68219-invisilink:hover { color: #000; }",
"#gmc68219 .config_header { margin-bottom: 0.5em; }",
"#gmc68219_useGravatarIcon_var,",
"#gmc68219_useScriptIcon_var",
"{ display: inline !important; }",
"#gmc68219_useGravatarIcon_field_label img,",
"#gmc68219_useScriptIcon_field_label img",
"{ max-height: 48px; max-width: 48px; vertical-align: middle; }",
"#gmc68219_field_updaterMaxage,",
"#gmc68219_field_updaterMinage",
"{ height: 1em; margin: 0 0.25em; min-height: 0.8em; max-height: 2.1em; text-align: right; width: 2.5em; }",
"#gmc68219 .reset, #gmc68219 .reset a, #gmc68219_buttons_holder { text-align: inherit; }",
"#gmc68219_buttons_holder { margin: 0.5em; }",
"#gmc68219_saveBtn { margin: 0.5em !important; padding: 0 3.0em !important; }",
"#gmc68219_resetLink { margin-right: 1.5em; }",
"#gmc68219_closeBtn { display: none; }",
"}",
"@media print {",
"#gmc68219 { display: none !important; }",
"}"
].join("\n")
}),
/* Settings Object */
{
"useGravatarIcon": {
"section": [],
"type": "checkbox",
"label": '',
"default": false
},
"useScriptIcon": {
"type": "checkbox",
"label": '',
"default": false
},
"updaterMaxage": {
"type": "unsigned integer",
"label": 'day(s) maximum between checks for this script',
"default": 30
},
"updaterMinage": {
"type": "unsigned integer",
"label": 'hour(s) minimum before starting a check for this script',
"default": 1
},
'indirectMethod': {
"label": 'Method <em class="gmc-yellownote">Select update to use the most recently detected version.</em>',
"type": 'radio',
"options": ['show', 'install', 'update'],
"default": 'show'
},
'directMethod': {
"label": 'Method <em class="gmc-yellownote">Select update to use the most recently detected version.</em>',
"type": 'radio',
"options": ['install', 'update'],
"default": 'install'
},
'providerPref1': { "type": 'hidden', "default": "uso" },
'providerPref2': { "type": 'hidden', "default": "uso" }
}
);
gmc.onSave = function() {
let write = false;
let reopen = false;
if (gmc.get("updaterMinage") > gmc.get("updaterMaxage") * 24 ) {
gmc.set("updaterMinage", 1);
write = true;
}
if (write) gmc.write();
if (reopen) { gmc.close(); gmc.open(); }
let ev = new CustomEvent("change");
let selectNode = document.getElementById("provider_id");
selectNode.dispatchEvent(ev);
}
GM_config = undefined;
let gmcFilters = new GM_configStruct();
gmcFilters.id = "gmc68219filters";
gmcFilters.init(
document.body.insertBefore(document.createElement("div"), document.body.firstChild),
(
(
(/\/scripts\/show\/68219\/?$/.test(gPATHNAME))
? [
'<img alt="installWith" title="uso - installWith" src="' + GM_getResourceURL("icon") + '" />'
].join("")
: [
'<a href="/scripts/show/68219">',
'<img alt="installWith" title="uso - installWith" src="' + GM_getResourceURL("icon") + '" />',
'</a>'
].join("")
)
+ [
'<p>Advisor</p>',
'<span>',
'<a href="/guides/24/">',
'<img alt="usoCheckup" title="Powered in part by usoCheckup" src="' + GM_getResourceURL("usoc") + '" />',
'</a>',
'<a href="' + gPROTOCOL + '//github.com/sizzlemctwizzle/GM_config/wiki">',
'<img alt="GM_config" title="Powered in part by GM_config" src="' + GM_getResourceURL("gmc") + '" />',
'</a>',
'</span>'
].join("")
),
/* Custom CSS */
GM_setStyle({
node: null,
data:
[
"@media screen, projection {",
"#gmc68219filters { background-color: rgba(0, 0, 0, 0.66) !important; height: 100% !important; width: 100% !important; max-height: 100% !important; max-width: 100% !important; left: 0 !important; top: 0 !important; }",
"#gmc68219filters_wrapper { background-color: #eee; width: 45em; height: 40em; position: absolute; left: 45%; top: 50%; margin: -20em 0 0 -15em; border: 1px solid #ddd; }",
"#gmc68219filters_header a { display: inline; }",
"#gmc68219filters_header img { vertical-align: middle; }",
"#gmc68219filters_header > a img { height: 32px; margin-right: 0.25em; width: 32px; }",
"#gmc68219filters_header > img { height: 32px; margin-right: 0.25em; width: 32px; }",
"#gmc68219filters_header > p { display: inline; margin: 0; vertical-align: middle; }",
"#gmc68219filters_header span { float: right; }",
"#gmc68219filters_header span > a { display: inline; margin-left: 0.25em; }",
"#gmc68219filters .config_header { background-color: #333; color: #fff; font-size: 1.57em; margin: 0; padding: 0 0.5em; text-align: left; }",
"#gmc68219filters .config_var { clear: both; margin: 0 1em; padding: 0; }",
"#gmc68219filters .field_label { color: #333; font-size: 100%; font-weight: normal; margin: 0 0.25em; position: relative; top: 0.125em; }",
"#gmc68219filters .section_desc { margin: 0.25em 1.5em !important; }",
"#gmc68219filters .section_header { margin: 0 1em; text-align: left; }",
"#gmc68219filters .section_header img { margin: 0 0.25em; vertical-align: middle; }",
".gmc-yellownote { background-color: #ffd; font-size: 0.66em !important; }",
".gmc68219filters-invisilink { text-decoration: none; color: #000; }",
".gmc68219filters-invisilink:hover { color: #000; }",
"#gmc68219filters .field_label { top: -0.25em; }",
"#gmc68219filters_postPUStoSAM_var { margin-bottom: 0.25em !important; margin-top: 1.25em !important; }",
"#gmc68219filters_field_postPUStoSAM { height: 2.5em; width: 38.75em; }",
"#gmc68219filters_openSAMtopic_var,",
"#gmc68219filters_disableSAMCSS_var",
"{",
" margin-top: 0.125em !important; margin-bottom: 0.25em !important; margin-left: 1.75em !important; ",
"}",
"#gmc68219filters_section_0 { margin-top: 0 !important; }",
"#gmc68219filters_section_desc_0 { border-style: none !important; text-align: left !important; font-style: italic; }",
"#gmc68219filters_section_desc_0 span:first-child { margin-left: 10.5em; }",
"#gmc68219filters_section_desc_0 span:last-child { float: right; margin-right: 10.25em; }",
"#gmc68219filters_clearUserScriptIds_var",
"{ display: inline !important; margin-right: 0 !important; }",
"#gmc68219filters_field_clearUserScriptIds",
"{ font-size: 0.9em; width: 6em; }",
"#gmc68219filters_clearUserScriptPrivIds_var",
"{ display: inline !important; margin-right: 0 !important; margin-left: 3em !important; }",
"#gmc68219filters_field_clearUserScriptPrivIds",
"{ font-size: 0.9em; width: 8em; }",
"#gmc68219filters_moveUserScriptIds_var,",
"#gmc68219filters_moveUserScriptPrivIds_var",
"{ display: inline !important; margin-right: 0 !important; margin-left: 0 !important; }",
"#gmc68219filters_field_moveUserScriptIds,",
"#gmc68219filters_field_moveUserScriptPrivIds",
"{ font-size: 0.9em; width: 10.75em; }",
"#gmc68219filters_copyUserScriptIds_var,",
"#gmc68219filters_copyUserScriptPrivIds_var",
"{ display: inline !important; margin-right: 0 !important; margin-left: 0 !important; }",
"#gmc68219filters_field_copyUserScriptIds,",
"#gmc68219filters_field_copyUserScriptPrivIds",
"{ font-size: 0.9em; width: 6em; }",
"#gmc68219filters_usePlain_var { display: inline !important; margin: 0 !important; }",
"#gmc68219filters_copyScriptWrightIds_var,",
"#gmc68219filters_copyScriptWrightPrivIds_var",
"{ display: inline !important; margin-left: 0 !important; margin-right: 0 !important; }",
"#gmc68219filters_field_copyScriptWrightIds,",
"#gmc68219filters_field_copyScriptWrightPrivIds",
"{ font-size: 0.9em; width: 6em; }",
"#gmc68219filters_moveScriptWrightIds_var",
"{ display: inline !important; margin-left: 0 !important; margin-right: 0 !important; }",
"#gmc68219filters_field_moveScriptWrightIds",
"{ font-size: 0.9em; width: 10.75em; }",
"#gmc68219filters_moveScriptWrightPrivIds_var",
"{ display: inline !important; margin-left: 5.5em !important; margin-right: 0 !important; }",
"#gmc68219filters_field_moveScriptWrightPrivIds",
"{ font-size: 0.9em; width: 10.75em; }",
"#gmc68219filters_clearScriptWrightIds_var",
"{ display: inline !important; margin-left: 0 !important; }",
"#gmc68219filters_field_clearScriptWrightIds",
"{ font-size: 0.9em; width: 6em; }",
"#gmc68219filters_clearScriptWrightPrivIds_var",
"{ display: inline !important; margin-left: 0 !important; }",
"#gmc68219filters_field_clearScriptWrightPrivIds",
"{ font-size: 0.9em; width: 8em; }",
"#gmc68219filters_field_jsonFilters { height: 11em; min-height: 11em; max-height: 11em; font-size: 1.1em; resize: none; width: 38.2em; min-width: 38.2em; max-width: 38.2em; margin-top: 0.5em; }",
"#gmc68219filters_jsonFilters_field_label > p { margin-bottom: 0.25em; margin-top: 0.25em; }",
"#gmc68219filters_insertUserScriptIdToPU_var { display: inline !important; }",
"#gmc68219filters_field_insertUserScriptIdToPU { height: 2.25em; width: 8.5em; }",
"#gmc68219filters_lastUserScriptId_var { display: inline !important; margin-left: 0 !important; }",
"#gmc68219filters_field_lastUserScriptId { width: 8.125em; margin-top: 0; text-align: right; }",
"#gmc68219filters_lastScriptWrightId_var { display: inline !important; }",
"#gmc68219filters_field_lastScriptWrightId { width: 8.125em; margin-top: 0; text-align: right; }",
"#gmc68219filters_insertScriptWrightIdToPU_var { display: inline !important; margin-left: 0 !important; }",
"#gmc68219filters_field_insertScriptWrightIdToPU { height: 2.25em; width: 8.5em; }",
"#gmc68219filters_buttons_holder { margin: 0.5em; margin-top: 1em; padding-top: 0; text-align: inherit; bottom: 0; right: 0; }",
"#gmc68219filters .saveclose_buttons { margin: 0.5em 10px; }",
"#gmc68219filters_saveBtn { float: right; margin-right: 0.4em !important; width: 10em;",
"#gmc68219filters_resetLink { margin-right: 1.5em; }",
"}",
"@media print {",
"#gmc68219filters { display: none !important; }",
"}"
].join("\n")
}),
/* Settings Object */
{
'postPUStoSAM': {
"type": "button",
"label": 'Queue Potentially Unwanted (PU) Ids to Spam and Malware',
"script": function () {
try {
let json, write, post, GROUPS;
GROUPS = JSON.parse(gLIST + '}');
json = JSON.parse(gmcFilters.fields["jsonFilters"].node.value);
let jsonFull = JSON.parse('{"user":' + gmcFilters.fields["jsonFilters"].node.value + '}');
let reports = [];
let pendingReports = GM_getValue(":pendingReports");
if (pendingReports) {
pendingReports.split(',').forEach(function (e, i, a) {
reports.push(e);
});
}
parseList(jsonFull, function (aScope, aPatterns, aAdvisory, aSummary, aTips, aBlock, aReduce, aCollapse, aHide, aProvider, aCollector) {
switch (aScope) {
case "@uso:script":
case "@uso:author":
if (/Potentially\sunwanted\sscript/.test(aSummary)) {
for (let pattern in aPatterns) {
let matches = pattern.match(/^\"?(\d+)\"?$/);
if (matches) {
let id = matches[1];
if (aScope == "@uso:script") {
if (!json["@uso:script (private)"]) {
json["@uso:script (private)"] = ["GUARD Potentially unwanted script", []];
write = true;
}
let privateSids = json["@uso:script (private)"][1]; // TODO:
let found;
privateSids.forEach(function (e, i, a) {
if (e == id)
found = true;
});
if (!found && GROUPS && GROUPS["collections"]["@uso:script"]) {
let globalSids = GROUPS["collections"]["@uso:script"][1]; // TODO:
globalSids.forEach(function (e, i, a) {
if (e == id)
found = true;
});
}
if (!found) {
privateSids.push(id);
write = true;
reports.push('/' + id);
}
}
else {
if (!json["@uso:author (private)"]) {
json["@uso:author (private)"] = ["GUARD Potentially unwanted script", []];
write = true;
}
let privateAids = json["@uso:author (private)"][1]; // TODO:
let found;
privateAids.forEach(function (e, i, a) {
if (e == id)
found = true;
});
if (!found && GROUPS && GROUPS["collections"]["@uso:author"]) {
let globalAids = GROUPS["collections"]["@uso:author"][1]; // TODO:
globalAids.forEach(function (e, i, a) {
if (e == id)
found = true;
});
}
if (!found) {
privateAids.push(id);
write = true;
reports.push('/users/' + id);
}
}
}
}
}
break;
}
});
if (write) {
json["@uso:author"][1] = [];
json["@uso:script"][1] = [];
gmcFilters.fields["jsonFilters"].node.value = JSON.stringify(json, null, " ");
gmcFilters.set("jsonFilters", JSON.stringify(json, null, ""));
GM_setValue(":pendingReports", reports.sort(function (a, b) {
let re = /(\d+)$/;
return a.match(re)[1] - b.match(re)[1];
}).sort(function (a, b) {
let re = /^(.*\/)\d+$/;
if (a.match(re)[1] < b.match(re)[1])
return -1;
if (a.match(re)[1] > b.match(re)[1])
return 1
return 0;
}).toString());
post = true;
}
let openSAMtopic = gmcFilters.fields["openSAMtopic"].node.checked;
if (openSAMtopic != gmcFilters.get("openSAMtopic")) {
gmcFilters.set("openSAMtopic", openSAMtopic);
write = true;
}
if (write)
gmcFilters.write();
if (post && openSAMtopic) {
gmcFilters.close();
location.href = "/topics/9#posts-last";
}
}
catch (e) {
alert('ERROR: Invalid JSON for advisories.\n\nPlease correct or reset to defaults');
}
}
},
'openSAMtopic': {
"type": "checkbox",
"label": 'Auto open the <a href="/topics/9#posts-last"></>Spam and Malware</a> topic on queue',
"default": false
},
'clearUserScriptIds' : {
"type": "button",
"label": 'Clear PU',
"script": function () {
try {
let json = JSON.parse(gmcFilters.fields["jsonFilters"].node.value);
json["@uso:script"][1] = [];
gmcFilters.fields["jsonFilters"].node.value = JSON.stringify(json, null, " ");
}
catch (e) {
alert('ERROR: Invalid JSON for advisories.\n\nPlease correct or reset to defaults');
}
}
},
'moveUserScriptIds': {
"type": "button",
"label": 'Move PU to private',
"script": function () {
try {
let json = JSON.parse(gmcFilters.fields["jsonFilters"].node.value);
let sids = json["@uso:script"][1];
if (sids.length > 0) {
let GROUPS = JSON.parse(gLIST + '}');
sids.sort(function (a, b) { return a - b });
if (!json["@uso:script (private)"])
json["@uso:script (private)"] = ["GUARD Potentially unwanted script", []];
let privateSids = json["@uso:script (private)"][1]; // TODO:
sids.forEach(function (e, i, a) {
let found;
privateSids.forEach(function (e1, i1, a1) {
if (e == e1)
found = true;
});
if (!found && GROUPS && GROUPS["collections"]["@uso:script"]) {
let globalSids = GROUPS["collections"]["@uso:script"][1]; // TODO:
globalSids.forEach(function (e1, i1, a1) {
if (e == e1)
found = true;
});
}
if (!found)
privateSids.push(e);
});
json["@uso:script (private)"][1] = privateSids.sort(function (a, b) { return a - b });
json["@uso:script"][1] = [];
gmcFilters.fields["jsonFilters"].node.value = JSON.stringify(json, null, " ");
}
}
catch (e) {
alert('ERROR: Invalid JSON for advisories.\n\nPlease correct or reset to defaults');
}
}
},
'copyUserScriptIds' : {
"type": "button",
"label": 'Copy PU',
"script": function () {
try {
let json = JSON.parse(gmcFilters.fields["jsonFilters"].node.value);
let aids = json["@uso:script"][1];
if (aids.length > 0) {
aids.sort(function (a, b) { return a - b });
if (gmcFilters.fields["usePlain"].node.checked)
GM_setClipboard(
aids.join('\n'), "text"
);
else
GM_setClipboard(
aids.map(function (aE) {
return '"' + aE + '"'
}).join(',\n'), "text"
);
}
}
catch (e) {
alert('ERROR: Invalid JSON for advisories.\n\nPlease correct or reset to defaults');
}
}
},
'usePlain': {
"type": "checkbox",
"label": '',
"default": false
},
'copyScriptWrightIds' : {
"type": "button",
"label": 'Copy PU',
"script": function () {
try {
let json = JSON.parse(gmcFilters.fields["jsonFilters"].node.value);
let aids = json["@uso:author"][1];
if (aids.length > 0) {
aids.sort(function (a, b) { return a - b });
if (gmcFilters.fields["usePlain"].node.checked)
GM_setClipboard(
aids.join('\n'), "text"
);
else
GM_setClipboard(
aids.map(function (aE) {
return '"' + aE + '"'
}).join(',\n'), "text"
);
}
}
catch (e) {
alert('ERROR: Invalid JSON for advisories.\n\nPlease correct or reset to defaults');
}
}
},
'moveScriptWrightIds': {
"type": "button",
"label": 'Move PU to private',
"script": function () {
try {
let json = JSON.parse(gmcFilters.fields["jsonFilters"].node.value);
let aids = json["@uso:author"][1];
if (aids.length > 0) {
let GROUPS = JSON.parse(gLIST + '}');
aids.sort(function (a, b) { return a - b });
if (!json["@uso:author (private)"])
json["@uso:author (private)"] = ["GUARD Potentially unwanted script", []];
let privateAids = json["@uso:author (private)"][1]; // TODO:
aids.forEach(function (e, i, a) {
let found;
privateAids.forEach(function (e1, i1, a1) {
if (e == e1)
found = true;
});
if (!found && GROUPS && GROUPS["collections"]["@uso:author"]) {
let globalAids = GROUPS["collections"]["@uso:author"][1]; // TODO:
globalAids.forEach(function (e1, i1, a1) {
if (e == e1)
found = true;
});
}
if (!found)
privateAids.push(e);
});
json["@uso:author (private)"][1] = privateAids.sort(function (a, b) { return a - b });
json["@uso:author"][1] = [];
gmcFilters.fields["jsonFilters"].node.value = JSON.stringify(json, null, " ");
}
}
catch (e) {
alert('ERROR: Invalid JSON for advisories.\n\nPlease correct or reset to defaults');
}
}
},
'clearScriptWrightIds' : {
"type": "button",
"label": 'Clear PU',
"script": function () {
try {
let json = JSON.parse(gmcFilters.fields["jsonFilters"].node.value);
json["@uso:author"][1] = [];
gmcFilters.fields["jsonFilters"].node.value = JSON.stringify(json, null, " ");
}
catch (e) {
alert('ERROR: Invalid JSON for advisories.\n\nPlease correct or reset to defaults');
}
}
},
'clearUserScriptPrivIds' : {
"section" : [,'<span class="gmc-yellownote">Group Script shortcuts</span><span class="gmc-yellownote">Group Author shortcuts</span>'],
"type": "button",
"label": 'Clear private',
"script": function () {
try {
let json = JSON.parse(gmcFilters.fields["jsonFilters"].node.value);
json["@uso:script (private)"][1] = [];
gmcFilters.fields["jsonFilters"].node.value = JSON.stringify(json, null, " ");
}
catch (e) {
if (!/is\sundefined$/.test(e.message))
alert('ERROR: Invalid JSON for advisories.\n\nPlease correct or reset to defaults');
}
}
},
'moveUserScriptPrivIds': {
"type": "button",
"label": 'Move private to PU',
"script": function () {
try {
let json = JSON.parse(gmcFilters.fields["jsonFilters"].node.value);
let privateSids = json["@uso:script (private)"][1];
if (privateSids.length > 0) {
let GROUPS = JSON.parse(gLIST + '}');
privateSids.sort(function (a, b) { return a - b });
if (!json["@uso:script"])
json["@uso:script"] = ["GUARD Potentially unwanted script", []];
let sids = json["@uso:script"][1]; // TODO:
privateSids.forEach(function (e, i, a) {
let found;
sids.forEach(function (e1, i1, a1) {
if (e == e1)
found = true;
});
if (!found && GROUPS && GROUPS["collections"]["@uso:script"]) {
let globalSids = GROUPS["collections"]["@uso:script"][1]; // TODO:
globalSids.forEach(function (e1, i1, a1) {
if (e == e1)
found = true;
});
}
if (!found)
sids.push(e);
});
json["@uso:script"][1] = sids.sort(function (a, b) { return a - b });
json["@uso:script (private)"][1] = [];
gmcFilters.fields["jsonFilters"].node.value = JSON.stringify(json, null, " ");
}
}
catch (e) {
alert('ERROR: Invalid JSON for advisories.\n\nPlease correct or reset to defaults');
}
}
},
'moveScriptWrightPrivIds': {
"type": "button",
"label": 'Move private to PU',
"script": function () {
try {
let json = JSON.parse(gmcFilters.fields["jsonFilters"].node.value);
let privateAids = json["@uso:author (private)"][1];
if (privateAids.length > 0) {
let GROUPS = JSON.parse(gLIST + '}');
privateAids.sort(function (a, b) { return a - b });
if (!json["@uso:author"])
json["@uso:author"] = ["GUARD Potentially unwanted script", []];
let aids = json["@uso:author"][1];
privateAids.forEach(function (e, i, a) {
let found;
aids.forEach(function (e1, i1, a1) {
if (e == e1)
found = true;
});
if (!found && GROUPS && GROUPS["collections"]["@uso:author"]) {
let globalAids = GROUPS["collections"]["@uso:author"][1]; // TODO:
globalAids.forEach(function (e1, i1, a1) {
if (e == e1)
found = true;
});
}
if (!found)
aids.push(e);
});
json["@uso:author"][1] = aids.sort(function (a, b) { return a - b });
json["@uso:author (private)"][1] = [];
gmcFilters.fields["jsonFilters"].node.value = JSON.stringify(json, null, " ");
}
}
catch (e) {
alert('ERROR: Invalid JSON for advisories.\n\nPlease correct or reset to defaults');
}
}
},
'clearScriptWrightPrivIds' : {
"type": "button",
"label": 'Clear private',
"script": function () {
try {
let json = JSON.parse(gmcFilters.fields["jsonFilters"].node.value);
json["@uso:author (private)"][1] = [];
gmcFilters.fields["jsonFilters"].node.value = JSON.stringify(json, null, " ");
}
catch (e) {
if (!/is\sundefined$/.test(e.message))
alert('ERROR: Invalid JSON for advisories.\n\nPlease correct or reset to defaults');
}
}
},
'jsonFilters': {
"type": 'textarea',
"label": "<p><em class='gmc-yellownote'>use <a href='http://json.org/'>JSON</a> data-interchange format</em></p>",
"default": JSON.stringify(
JSON.parse(
[
'{',
' "@uso:author": [',
' "GUARD Potentially unwanted script",',
' [',
' "authorid1"',
' ]',
' ],',
' "@uso:script": [',
' "GUARD Potentially unwanted script",',
' [',
' "scriptid1"',
' ]',
' ]',
'}'
].join("\n")
), null, " ")
},
'insertUserScriptIdToPU': {
"type": "button",
"label": 'Script to PU',
"script": function () {
let sid = gmcFilters.fields["lastUserScriptId"].node.value;
if (sid != "") {
try {
let json = JSON.parse(gmcFilters.fields["jsonFilters"].node.value);
let GROUPS = JSON.parse(gLIST + '}');
let found, scripts = json["@uso:script"][1]; // TODO:
scripts.forEach(function (e, i, a) {
if (e == sid)
found = true;
});
if (!found && json["@uso:script (private)"]) {
scripts = json["@uso:script (private)"][1]; // TODO:
scripts.forEach(function (e, i, a) {
if (e == sid)
found = true;
});
}
if (!found && GROUPS && GROUPS["collections"]["@uso:script"]) {
let globalSids = GROUPS["collections"]["@uso:script"][1]; // TODO:
globalSids.forEach(function (e, i, a) {
if (e == sid)
found = true;
});
}
if (!found) {
if (!json["@uso:script"])
json["@uso:script"] = ["GUARD Potentially unwanted script", []];
json["@uso:script"][1].push(sid);
gmcFilters.fields["jsonFilters"].node.value = JSON.stringify(json, null, " ");
}
}
catch (e) {
alert('ERROR: Invalid JSON for advisories.\n\nPlease correct or reset to defaults');
}
}
}
},
'lastUserScriptId': {
"type": "text",
"default": ""
},
'lastScriptWrightId': {
"type": "text",
"default": ""
},
'insertScriptWrightIdToPU': {
"type": "button",
"label": 'Author to PU',
"script": function () {
let aid = gmcFilters.fields["lastScriptWrightId"].node.value;
if (aid != "") {
try {
let json = JSON.parse(gmcFilters.fields["jsonFilters"].node.value);
let GROUPS = JSON.parse(gLIST + '}');
let found, authors = json["@uso:author"][1]; // TODO:
authors.forEach(function (e, i, a) {
if (e == aid)
found = true;
});
if (json["@uso:author (private)"]) {
authors = json["@uso:author (private)"][1]; // TODO:
authors.forEach(function (e, i, a) {
if (e == aid)
found = true;
});
}
if (!found && GROUPS && GROUPS["collections"]["@uso:author"]) {
let globalAids = GROUPS["collections"]["@uso:author"][1]; // TODO:
globalAids.forEach(function (e, i, a) {
if (e == aid)
found = true;
});
}
if (!found) {
if (!json["@uso:author"])
json["@uso:author"] = ["GUARD Potentially unwanted script", []];
json["@uso:author"][1].push(aid);
gmcFilters.fields["jsonFilters"].node.value = JSON.stringify(json, null, " ");
}
}
catch (e) {
alert('ERROR: Invalid JSON for advisories.\n\nPlease correct or reset to defaults');
}
}
}
}
}
);
gmcFilters.onOpen = function () {
try {
gmcFilters.fields["jsonFilters"].node.value = JSON.stringify(JSON.parse(gmcFilters.get("jsonFilters")), null, " ");
}
catch (e) {}
gmcFilters.fields["usePlain"].node.title = "Use plain ids for clipboard copy";
gmcFilters.fields["jsonFilters"].node.setAttribute("spellcheck", "false");
gmcFilters.fields["jsonFilters"].node.setAttribute("wrap", "off");
gmcFilters.fields["lastScriptWrightId"].node.setAttribute("readonly", "readonly");
gmcFilters.fields["lastScriptWrightId"].node.setAttribute("placeholder", "No ScriptWright Id");
gmcFilters.fields["lastUserScriptId"].node.setAttribute("readonly", "readonly");
gmcFilters.fields["lastUserScriptId"].node.setAttribute("placeholder", "No User Script Id");
let saveBtn = document.getElementById("gmc68219filters_saveBtn");
if (saveBtn)
saveBtn.textContent = "Save \u0026 Close";
let closeBtn = document.getElementById("gmc68219filters_closeBtn");
if (closeBtn)
closeBtn.textContent = "Cancel";
}
gmcFilters.onSave = function () {
try {
gmcFilters.set("jsonFilters", JSON.stringify(JSON.parse(gmcFilters.get("jsonFilters")), null, ""));
gmcFilters.write();
gmcFilters.close();
}
catch (e) {
alert('ERROR: Invalid JSON for advisories.\n\nPlease correct or reset to defaults');
gmcFilters.open();
}
}
gmcFilters.onClose = function () {
try {
let junk = JSON.stringify(JSON.parse(gmcFilters.get("jsonFilters")), null, "");
}
catch (e) {
alert('ERROR: Invalid JSON for advisories.\n\nAll user defined advisories will be skipped until corrected.');
}
}
/**
*
*/
GM_setStyle({
node: gCSS,
data:
[
"table.forums tr td.script-meat { background-color: #eee; }"
].join("\n")
});
let authenticated = document.querySelector("body.loggedin");
if (/^\/topics\/9\/?$/.test(gPATHNAME) || /^\/posts\/?$/.test(gPATHNAME)) {
GM_setStyle({
node: gCSS,
data:
[
".columnize { column-width: 10em; -moz-column-width: 10em; }"
].join("\n")
});
let posts = document.querySelectorAll("#content .posts .entry-content p~ul");
for (let i = 0, thisNode; thisNode = posts[i++];)
if (thisNode.previousSibling && thisNode.previousSibling.textContent.match(/Potentially\sunwanted\sscripts/i))
thisNode.classList.add("columnize");
}
let pendingReports = GM_getValue(":pendingReports");
if (/^\/topics\/9\/?$/.test(gPATHNAME) && authenticated && pendingReports) {
let paginationLast = document.querySelector("#content .pagination .next_page");
if (paginationLast && !paginationLast.classList.contains("disabled")) {
let url = paginationLast.previousSibling.previousSibling.href;
if (url)
location.replace(url + "#footer");
}
else {
if (!gmcFilters.get("openSAMtopic")) {
if (confirm("You seem to have pending reports.\n\nDo you wish to post now?\n\nPlease note if cancelled the reports will be removed from the queue")) {
GM_deleteValue(":pendingReports");
doReport(pendingReports);
}
}
else {
GM_deleteValue(":pendingReports");
doReport(pendingReports);
}
}
}
else {
if (
/^\/$/.test(gPATHNAME) && gmcHome.get("enableScanMain")
|| /^\/tags\//.test(gPATHNAME) && gmcHome.get("enableScanTags")
|| /^\/scripts(?:\/?$|\/search\/?$)/.test(gPATHNAME) && gmcHome.get("enableScanScripts")
|| /^\/groups\/\d+\/scripts/.test(gPATHNAME) && gmcHome.get("enableScanGroups")
|| /(^\/users\/.+?\/(?:scripts|favorites)|^\/home\/(?:scripts|favorites))/.test(gPATHNAME) && gmcHome.get("enableScanScriptWright")
|| /^\/scripts\/show\//.test(gPATHNAME)
|| /^\/topics\//.test(gPATHNAME)
) {
init();
}
}
})();
Donate for the site OpenUserJS
Are you sure you want to go to an external site to donate a monetary value?
WARNING: Some countries laws may supersede the payment processors policy such as the GDPR and PayPal. While it is highly appreciated to donate, please check with your countries privacy and identity laws regarding privacy of information first. Use at your utmost discretion.