JSFiddle - React, Tailwind, and code Playground

by termi

JavaScript

var object = document.createElement('object');
object.type = "application/pdf";
object.data = getDataUrl();
document.body.appendChild(object);

var iframe = document.createElement('iframe');
window.iframe = iframe;

/*iframe.style.height = '1px';
iframe.style.width = '1px';
iframe.style.position = 'absolute';
iframe.style.visibility = 'hidden';*/

document.body.appendChild(iframe);
/*
iframe.src = getUnknownDataUrl();
var a;
try {
    a = !!iframe.contentDocument;
}
catch(e){}*/

iframe.src = getDataUrl();
var b;
try {
    b = !!iframe.contentDocument;
}
catch(e){}

alert(b ? 'Probably FireFox with PDF.js support' : 'no PDF.js support')



function getDataUrl() {
    return 'data:application/pdf,%25PDF-1.5%0A%25%D0%D4%C5%D0%0A1%200%20obj%0A%3C%3C%2FType%2FPages%2FKids%5B3%200%20R%5D%2FMediaBox%5B0%200%20596%20842%5D%2FCount%201%3E%3Eendobj%0A2%200%20obj%0A%3C%3C%2FType%2FCatalog%2FPages%201%200%20R%3E%3Eendobj%0A3%200%20obj%0A%3C%3C%2FType%2FPage%2FContents%205%200%20R%2FResources%3C%3C%2FExtGState%3C%3C%2FG0%204%200%20R%3E%3E%2FProcSets%5B%2FPDF%2FText%2FImageB%2FImageC%2FImageI%5D%3E%3E%2FParent%201%200%20R%3E%3Eendobj%0A4%200%20obj%0A%3C%3C%2FType%2FExtGState%2FBM%2FNormal%2FCA%201%2FLC%200%2FLJ%200%2FLW%200%2FML%204%2FSA%20true%2Fca%201%3E%3Eendobj%0A5%200%20obj%0A%3C%3C%2FFilter%2FFlateDecode%2FLength%2070%3E%3Estream%0Ax%DA3%D0%B300%B0T0%00B%5D%03%08%DB%C8R%C1%C2%D0X%219%17%2Cjfn%AC%60ia%A0P%94%AA%10%AE%90%A7P%88M%D0%10%0C%83%DC%A1%8C%A2t%05%7Dw%03%85%F4bt%B5i%0A%81%00%0C%10%17%B5endstream%20endobj%0A6%200%20obj%0A%3C%3C%2FLength%2014%2FRoot%202%200%20R%2FSize%207%2FType%2FXRef%2FW%5B0%202%200%5D%3E%3Estream%0A%00%00%00%0F%00W%00%83%01%0A%01%5C%01%E3endstream%20endobj%0Astartxref%0A483%0A%25%25EOF%0A';
}

function getUnknownDataUrl() {
    return...