NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @namespace https://openuserjs.org/users/Marti // @exclude * // @author Marti Martz (https://openuserjs.org/users/Marti) // @icon https://gravatar.com/avatar/7ff58eb098c23feafa72e0b4cd13f396&r=G&s=48&default=identicon // ==UserLibrary== // @name GM_setStyle // @description Alternative to GM_addStyle for Greasemonkey // @copyright 2011+, Marti Martz (https://openuserjs.org/users/Marti) // @license CC-BY-NC-SA-4.0; https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode // @license GPL-3.0-or-later; https://www.gnu.org/licenses/gpl-3.0.txt // @version 0.0.17.007b // ==/UserScript== // ==/UserLibrary== // ==OpenUserJS== // @author Marti // @collaborator sizzle // ==/OpenUserJS== /* jshint esversion: 5 */ function GM_setStyle(aObject) { "use strict"; // ** function validateCSS(aData, aSpace) { // ** Create a core html5 document implementation for sanitizing var dt = document.implementation.createDocumentType("html", "", ""), doc = document.implementation.createDocument("", "", dt), body = doc.createElement("body"), head = doc.createElement("head"), html = doc.createElement("html") ; html.setAttribute("lang", "en-US"); html.appendChild(body); html.insertBefore(head, html.firstChild); doc.appendChild(html); // ** Create some specifics for this implementation var meta = doc.createElement("meta"); meta.setAttribute("http-equiv", "Content-Type"); meta.setAttribute("content", "text/html; charset=UTF-8"); head.appendChild(meta); var nodeStyle = doc.createElement("style"); nodeStyle.setAttribute("type", "text/css"); nodeStyle.textContent = aData; head.appendChild(nodeStyle); var css = []; if (doc.styleSheets && doc.styleSheets.length) { for (var rule = 0, styleSheet = doc.styleSheets[0], rules = doc.styleSheets[0].cssRules.length; rule < rules ; rule++) css.push(styleSheet.cssRules[rule].cssText); return (css.length) ? css.join(aSpace) : ""; } return aData; } function onDOMContentLoaded(ev, aObject) { if (typeof aObject.data == "undefined") aObject.data = ""; if (typeof aObject.space == "undefined") aObject.space = "\n"; if (typeof aObject.data == "xml") aObject.data = aObject.data.toString(); if (typeof aObject.media == "xml") aObject.media = aObject.media.toString(); if (typeof aObject.node == "undefined") { var nodeStyle = document.createElement("style"); nodeStyle.setAttribute("type", "text/css"); if (aObject.media) nodeStyle.setAttribute("media", aObject.media); nodeStyle.textContent = validateCSS(aObject.data, aObject.space); var headNode = document.documentElement.firstChild; while (headNode && headNode.nodeName != "HEAD") headNode = headNode.nextSibling; if (headNode && headNode.nodeName == "HEAD") headNode.appendChild(nodeStyle); else document.body.insertBefore(nodeStyle, document.body.firstChild); if (aObject.callback) { aObject.data = nodeStyle.textContent; aObject.node = nodeStyle; aObject.callback(); } return nodeStyle; } else if (aObject.node !== null && aObject.node.nodeName == "STYLE") { aObject.node.textContent = validateCSS( aObject.node.textContent + aObject.space + aObject.data, aObject.space ); if (aObject.callback) { aObject.data = aObject.node.textContent; aObject.callback(); } return aObject.node; } else { var cssText = validateCSS(aObject.data, aObject.space); if (aObject.callback) { aObject.data = cssText; aObject.callback(); } return cssText; } } if (window.document && window.document.documentElement || aObject.node === null) return onDOMContentLoaded(null, aObject); else window.addEventListener("DOMContentLoaded", function(ev) { onDOMContentLoaded(ev, aObject); }, false); return undefined; }