Skip to content

Instantly share code, notes, and snippets.

@jl91
Forked from jscher2000/showAsPrint.js
Created July 19, 2019 21:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jl91/3f5c9968783820a373535623ba7fa10b to your computer and use it in GitHub Desktop.
Save jl91/3f5c9968783820a373535623ba7fa10b to your computer and use it in GitHub Desktop.
Emulate print media in Firefox 62 (userscript work in progress)
// For Firefox's Web Console, creates the functions showAsPrint() and undoShowAsPrint()
// to roughly emulate print media and revert
function showAsPrint(){
var docSS = document.styleSheets, ss, oldMedia, newMedia, rules;
var p2s = function(media){
if (media.indexOf('all') > -1) return media; //no need to change
if (media == 'print') return 'all, wasprint'; //show on screen, too
if (media.indexOf('print') > -1 && media.indexOf('screen') > -1) return media; //no need to change
if (media == 'screen') return 'wasscreen'; //hide these rules
if (media.indexOf('screen') > -1) return media.replace('screen', 'wasscreen'); //hide these rules
if (media.trim().slice(0,1) == '(' && media.trim().slice(-1) == ')') return media; //too hard to parse
return media + ', WTF'; //for debugging only
}
for (var i=0; i<docSS.length; i++) {
ss = docSS[i];
if (!ss.disabled){
if (ss.ownerNode && ss.ownerNode.id.indexOf('stylus-') == -1 && ss.ownerNode.id.indexOf('stylish-') == -1){
// check link or style tag for media attribute and edit as needed
if (ss.ownerNode.hasAttribute('media') && ss.ownerNode.getAttribute('media') != 'all'){
oldMedia = ss.ownerNode.getAttribute('media');
newMedia = p2s(oldMedia);
if (newMedia != oldMedia){
//console.log('Updating: ' + ss.ownerNode.outerHTML + ' to ' + newMedia);
ss.ownerNode.setAttribute('media', newMedia);
}
}
// check content of style sheet for media rules
try {
rules = ss.cssRules;
} catch(err) {
console.log('Can\'t access cssRules for ' + ss.href + ' due to: ' + err );
rules = [];
}
for (var j=0; j<rules.length; j++){
if (rules[j].type == 4){
oldMedia = rules[j].conditionText;
newMedia = p2s(oldMedia);
if (newMedia != oldMedia){
//console.log('Updating CSSMediaRule from ' + oldMedia + ' to ' + newMedia);
rules[j].conditionText = newMedia;
}
}
}
} else if (!ss.ownerNode){
console.log('No .ownerNode on i=' + i);
}
}
}
}
function undoShowAsPrint(){
var docSS = document.styleSheets, ss, oldMedia, newMedia, rules;
var unp2s = function(media){
if (media == 'all, wasprint' || media == 'all,wasprint') return 'print'; //undo applying to screen
if (media == 'wasscreen') return 'screen'; //undo hiding
if (media.indexOf('wasscreen') > -1) return media.replace('wasscreen', 'screen'); //undo hiding
return media; // otherwise, we didn't mess with it
}
for (var i=0; i<docSS.length; i++) {
ss = docSS[i];
if (!ss.disabled){
if (ss.ownerNode && ss.ownerNode.id.indexOf('stylus-') == -1 && ss.ownerNode.id.indexOf('stylish-') == -1){
// check link or style tag for media attribute and edit as needed
if (ss.ownerNode.hasAttribute('media') && ss.ownerNode.getAttribute('media') != 'all'){
oldMedia = ss.ownerNode.getAttribute('media');
newMedia = unp2s(oldMedia);
if (newMedia != oldMedia){
//console.log('Restoring: ' + ss.ownerNode.outerHTML + ' to ' + newMedia);
ss.ownerNode.setAttribute('media', newMedia);
}
} else {
// check content of style sheet for media rules
try {
rules = ss.cssRules;
} catch(err) {
console.log('Can\'t access cssRules for ' + ss.href + ' due to: ' + err );
rules = [];
}
for (var j=0; j<rules.length; j++){
if (rules[j].type == 4){
oldMedia = rules[j].conditionText;
newMedia = unp2s(oldMedia);
if (newMedia != oldMedia){
//console.log('Restoring CSSMediaRule from ' + oldMedia + ' to ' + newMedia);
rules[j].conditionText = newMedia;
}
}
}
}
} else if (!ss.ownerNode){
console.log('No .ownerNode on i=' + i);
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment