Last active
December 16, 2015 00:10
-
-
Save andrejko/5345998 to your computer and use it in GitHub Desktop.
View chrome cached files from http://www.sensefulsolutions.com/2012/01/viewing-chrome-cache-easy-way.html
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(function () { | |
var preTags = document.getElementsByTagName('pre'); | |
var preWithHeaderInfo = preTags[0]; | |
var preWithContent = preTags[2]; | |
var lines = preWithContent.textContent.split('\n'); | |
var text = ''; | |
for (var i = 0; i < lines.length; i++) { | |
var line = lines[i]; | |
var firstIndex = 11; // first index of the chars to match | |
var indexJump = 4; | |
var totalCharsPerLine = 16; | |
index = firstIndex; | |
for (var j = 0; j < totalCharsPerLine; j++) { | |
var hexValAsStr = line.substr(index, 2); | |
if (hexValAsStr == ' ') { | |
// no more chars | |
break; | |
} | |
var asciiVal = parseInt(hexValAsStr, 16); | |
text += String.fromCharCode(asciiVal); | |
index += indexJump; | |
} | |
} | |
var headerText = preWithHeaderInfo.textContent; | |
var elToInsertBefore = document.body.childNodes[0]; | |
var insertedDiv = document.createElement("div"); | |
document.body.insertBefore(insertedDiv, elToInsertBefore); | |
// find the filename | |
var nodes = [document.body]; | |
var filepath = ''; | |
while (true) { | |
var node = nodes.pop(); | |
if (node.hasChildNodes()) { | |
var children = node.childNodes; | |
for (var i = children.length - 1; i >= 0; i--) { | |
nodes.push(children[i]); | |
} | |
} | |
if (node.nodeType === Node.TEXT_NODE && /\S/.test(node.nodeValue)) { | |
// 1st depth-first text node (with non-whitespace chars) found | |
filepath = node.nodeValue; | |
break; | |
} | |
} | |
outputResults(insertedDiv, convertToBase64(text), filepath, headerText); | |
insertedDiv.appendChild(document.createElement('hr')); | |
function outputResults(parentElement, fileContents, fileUrl, headerText) { | |
// last updated 1/27/12 | |
var rgx = /.+\/([^\/]+)/; | |
var filename = rgx.exec(fileUrl)[1]; | |
// get the content type | |
rgx = /content-type: (.+)/i; | |
var match = rgx.exec(headerText); | |
var contentTypeFound = match != null; | |
var contentType = "text/plain"; | |
if (contentTypeFound) { | |
contentType = match[1]; | |
} | |
var dataUri = "data:" + contentType + ";base64," + fileContents; | |
// check for gzipped file | |
var gZipRgx = /content-encoding: gzip/i; | |
if (gZipRgx.test(headerText)) { | |
filename += '.gz'; | |
} | |
// check for image | |
var imageRgx = /image/i; | |
var isImage = imageRgx.test(contentType); | |
// create link | |
var aTag = document.createElement('a'); | |
aTag.textContent = "Left-click to download the cached file"; | |
aTag.setAttribute('href', dataUri); | |
aTag.setAttribute('download', filename); | |
parentElement.appendChild(aTag); | |
parentElement.appendChild(document.createElement('br')); | |
// create image | |
if (isImage) { | |
var imgTag = document.createElement('img'); | |
imgTag.setAttribute("src", dataUri); | |
parentElement.appendChild(imgTag); | |
parentElement.appendChild(document.createElement('br')); | |
} | |
// create warning | |
if (!contentTypeFound) { | |
var pTag = document.createElement('p'); | |
pTag.textContent = "WARNING: the type of file was not found in the headers... defaulting to text file."; | |
parentElement.appendChild(pTag); | |
} | |
} | |
function getBase64Char(base64Value) { | |
if (base64Value < 0) { | |
throw "Invalid number: " + base64Value; | |
} else if (base64Value <= 25) { | |
// A-Z | |
return String.fromCharCode(base64Value + "A".charCodeAt(0)); | |
} else if (base64Value <= 51) { | |
// a-z | |
base64Value -= 26; // a | |
return String.fromCharCode(base64Value + "a".charCodeAt(0)); | |
} else if (base64Value <= 61) { | |
// 0-9 | |
base64Value -= 52; // 0 | |
return String.fromCharCode(base64Value + "0".charCodeAt(0)); | |
} else if (base64Value <= 62) { | |
return '+'; | |
} else if (base64Value <= 63) { | |
return '/'; | |
} else { | |
throw "Invalid number: " + base64Value; | |
} | |
} | |
function convertToBase64(input) { | |
// http://en.wikipedia.org/wiki/Base64#Example | |
var remainingBits; | |
var result = ""; | |
var additionalCharsNeeded = 0; | |
var charIndex = -1; | |
var charAsciiValue; | |
var advanceToNextChar = function () { | |
charIndex++; | |
charAsciiValue = input.charCodeAt(charIndex); | |
return charIndex < input.length; | |
}; | |
while (true) { | |
var base64Char; | |
// handle 1st char | |
if (!advanceToNextChar()) break; | |
base64Char = charAsciiValue >>> 2; | |
remainingBits = charAsciiValue & 3; // 0000 0011 | |
result += getBase64Char(base64Char); // 1st char | |
additionalCharsNeeded = 3; | |
// handle 2nd char | |
if (!advanceToNextChar()) break; | |
base64Char = (remainingBits << 4) | (charAsciiValue >>> 4); | |
remainingBits = charAsciiValue & 15; // 0000 1111 | |
result += getBase64Char(base64Char); // 2nd char | |
additionalCharsNeeded = 2; | |
// handle 3rd char | |
if (!advanceToNextChar()) break; | |
base64Char = (remainingBits << 2) | (charAsciiValue >>> 6); | |
result += getBase64Char(base64Char); // 3rd char | |
remainingBits = charAsciiValue & 63; // 0011 1111 | |
result += getBase64Char(remainingBits); // 4th char | |
additionalCharsNeeded = 0; | |
} | |
// there may be an additional 2-3 chars that need to be added | |
if (additionalCharsNeeded == 2) { | |
remainingBits = remainingBits << 2; // 4 extra bits | |
result += getBase64Char(remainingBits) + "="; | |
} else if (additionalCharsNeeded == 3) { | |
remainingBits = remainingBits << 4; // 2 extra bits | |
result += getBase64Char(remainingBits) + "=="; | |
} else if (additionalCharsNeeded != 0) { | |
throw "Unhandled number of additional chars needed: " + additionalCharsNeeded; | |
} | |
return result; | |
} | |
})() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment