Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- var GR = GR || {};
- GR.ignoreProtocols = ['data:', 'chrome:', 'javascript:', 'about:', 'resource:', 'jar:'];
- GR.Ajax = {
- requests: [],
- transport: null,
- states: ["Uninitialized", "Loading", "Loaded", "Interactive", "Complete"],
- initialize: function () {
- this.transport = this.getXHRObject()
- },
- getXHRObject: function () {
- var xhrObj = false;
- try {
- xhrObj = new XMLHttpRequest()
- } catch (e) {
- var progid = ["MSXML2.XMLHTTP.5.0", "MSXML2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"];
- for (var i = 0;
- i < progid.length; ++i) {
- try {
- xhrObj = new ActiveXObject(progid[i])
- } catch (e) {
- continue
- }
- break
- }
- } finally {
- return xhrObj
- }
- },
- request: function (options) {
- var o = options || {};
- o.type = o.type && o.type.toLowerCase() || "get";
- o.async = o.async || true;
- o.dataType = o.dataType || "text";
- o.contentType = o.contentType || "application/x-www-form-urlencoded";
- this.requests.push(o);
- var s = this.getState();
- if (s == "Uninitialized" || s == "Complete" || s == "Loaded") {
- this.sendRequest()
- }
- },
- serialize: function (data) {
- var r = [""],
- rl = 0;
- if (data) {
- if (typeof data == "string") {
- r[rl++] = data
- } else {
- if (data.innerHTML && data.elements) {
- for (var i = 0, el, l = (el = data.elements).length;
- i < l;
- i++) {
- if (el[i].name) {
- r[rl++] = encodeURIComponent(el[i].name);
- r[rl++] = "=";
- r[rl++] = encodeURIComponent(el[i].value);
- r[rl++] = "&"
- }
- }
- } else {
- for (var param in data) {
- r[rl++] = encodeURIComponent(param);
- r[rl++] = "=";
- r[rl++] = encodeURIComponent(data[param]);
- r[rl++] = "&"
- }
- }
- }
- }
- return r.join("").replace(/&$/, "")
- },
- sendRequest: function () {
- var t = GR.Ajax.transport,
- r = GR.Ajax.requests.shift(),
- data;
- t.open(r.type, r.url, r.async);
- t.setRequestHeader("X-Requested-With", "XMLHttpRequest");
- if (data = GR.Ajax.serialize(r.data)) {
- t.setRequestHeader("Content-Type", r.contentType)
- }
- t.onreadystatechange = function () {
- GR.Ajax.onStateChange(r)
- };
- t.send(data)
- },
- onStateChange: function (options) {
- var fn, o = options,
- t = this.transport;
- var state = this.getState(t);
- if (fn = o["on" + state]) {
- fn(this.getResponse(o), o)
- }
- if (state == "Complete") {
- var success = t.status == 200,
- response = this.getResponse(o);
- if (fn = o.onUpdate) {
- fn(response, o)
- }
- if (fn = o["on" + (success ? "Success" : "Failure")]) {
- fn(response, o)
- }
- //t.onreadystatechange = GR.emptyFn;
- if (this.requests.length > 0) {
- setTimeout(this.sendRequest, 10)
- }
- }
- },
- getResponse: function (options) {
- var t = this.transport,
- type = options.dataType;
- if (t.status != 200) {
- return t.statusText
- } else {
- if (type == "text") {
- return t.responseText
- } else {
- if (type == "html") {
- return t.responseText
- } else {
- if (type == "xml") {
- return t.responseXML
- } else {
- if (type == "json") {
- return eval("(" + t.responseText + ")")
- }
- }
- }
- }
- }
- },
- getState: function () {
- return this.states[this.transport.readyState]
- }
- };
- GR.findHtml = function(win, docs) {
- docs = docs || [];
- if ( win ) {
- var frames = win.frames;
- try {
- if ( win.document ) {
- if ( GR.isValidProtocol(win.document.location.href) ) {
- GR.addResource("html", win.document.location.href);
- docs[docs.length] = win.document;
- }
- }
- // recurse into this iframe and find sub-iframes (if any)
- for ( var i = 0, len = frames.length; i < len; i++ ) {
- GR.findHtml(frames[i], docs);
- }
- }
- catch(err) {
- GR.dprint("findHtml: Caught error accessing window document. Error: " + err.description);
- }
- }
- return docs;
- };
- GR.findScripts = function(doc) {
- var aElems = doc.getElementsByTagName("script");
- for ( var i = 0, len = aElems.length; i < len; i++ ) {
- var elem = aElems[i];
- if ( "string" === typeof(elem["src"]) && elem["src"].length && GR.isValidProtocol(elem["src"]) ) {
- if ( -1 === elem["src"].indexOf("mobileperf/") ) {
- GR.addResource("js", elem["src"], elem);
- }
- }
- }
- };
- GR.findStylesheets = function(doc) {
- var aElems = doc.styleSheets;
- for ( var i = 0, len = aElems.length; i < len; i++ ) {
- var elem = aElems[i];
- if ( "string" === typeof(elem["href"]) && elem["href"].length && GR.isValidProtocol(elem["href"]) ) {
- if ( elem["href"] != doc.location ) {
- // In FF *all* the stylesheets have an HREF field. It's set to the document.location.
- GR.addResource("css", elem["href"], elem);
- }
- // If it IS an imported styled sheet we'll add the component inside this function.
- GR.findImportedStyleSheets(elem);
- }
- // IE
- if ( "object" === typeof(elem["imports"]) ) {
- var aImports = elem["imports"];
- for ( var j = 0, lenImports = aImports.length; j < lenImports; j++ ) {
- var elemImport = aImports[j];
- if ( "string" === typeof(elemImport["href"]) && elemImport["href"].length && GR.isValidProtocol(elemImport["href"]) ) {
- GR.addResource("css", elemImport["href"], elem);
- }
- }
- }
- }
- };
- GR.findImportedStyleSheets = function(styleSheet) {
- try {
- if ( "object" === typeof(styleSheet["cssRules"]) ) {
- for (var irule in styleSheet["cssRules"]) {
- if ( "length" === irule ) {
- continue;
- }
- var rule = styleSheet["cssRules"][irule];
- if ( "object" == typeof(rule["styleSheet"]) &&
- "string" == typeof(rule["styleSheet"]["href"]) &&
- rule["styleSheet"]["href"].length &&
- GR.isValidProtocol(rule["styleSheet"]["href"]) ) {
- var impStyleSheet = rule["styleSheet"];
- // It IS an imported stylesheet!
- GR.addResource("css", impStyleSheet["href"]);
- // Recursively check if this stylesheet itself imports any other stylesheets.
- GR.findImportedStyleSheets(impStyleSheet);
- }
- else {
- break;
- }
- }
- }
- }
- catch(err) {
- GR.dprint("findImportedStyleSheets: Caught error finding imported stylesheets. Error: " + err.description);
- }
- };
- GR.findImages = function(doc) {
- var aElems = doc.images;
- var hFound = {};
- for ( var i = 0, len = aElems.length; i < len; i++ ) {
- var elem = aElems[i];
- if ( "string" === typeof(elem["src"]) && elem["src"].length && GR.isValidProtocol(elem["src"]) ) {
- var src = elem["src"];
- if ( "undefined" === typeof(hFound[src]) ) {
- hFound[src] = 1;
- GR.addResource("image", src, elem);
- }
- }
- }
- };
- GR.findBgImages = function(doc) {
- var elems = doc.getElementsByTagName('*');
- var nElems = elems.length;
- GR.hBgImages = {};
- for ( var i = 0; i < nElems; i++ ) {
- var elem = elems[i];
- var imageUrl = GR.getStyleAndUrl(elem, 'backgroundImage', true, doc);
- if ( imageUrl ) {
- if ( 0 == imageUrl.toLowerCase().indexOf("data:") ) {
- continue;
- }
- imageUrl = imageUrl.replace("\\", ""); // Firefox 3.5 added a backslash to a URL that contained a comma (",")
- if ( ! GR.hBgImages[imageUrl] ) {
- GR.hBgImages[imageUrl] = 1;
- GR.addResource("cssimage", imageUrl, elem);
- }
- }
- }
- };
- GR.findFlash = function(doc) {
- var aElements = doc.applets;
- for ( var i = 0, len = aElements.length; i < len; i++ ) {
- var elem = aElements[i];
- if ( "string" == typeof(elem["Movie"]) && elem["Movie"].length ) {
- GR.addResource("flash", elem["Movie"]);
- }
- }
- var aElements = doc.getElementsByTagName("embed");
- for ( var i = 0, len = aElements.length; i < len; i++) {
- var elem = aElements[i];
- if ( "string" == typeof(elem["src"]) && elem.src.length && GR.isValidProtocol(elem.src) ) {
- GR.addResource("flash", elem.src);
- }
- }
- };
- GR.isValidProtocol = function(url) {
- url = url.toLowerCase();
- for ( var max = GR.ignoreProtocols.length, i = 0; i < max; i++ ) {
- if ( url.indexOf(GR.ignoreProtocols[i]) === 0 ) {
- return false;
- }
- }
- return true;
- };
- GR.addResource = function(type, url, elem) {
- GR.dprint("found resource of type " + type + ": " + url.substring(0, 128));
- var aResources = GR.resources[type];
- if ( "undefined" === typeof(aResources) ) {
- GR.resources[type] = [];
- aResources = GR.resources[type];
- }
- aResources[aResources.length] = { 'url': url, 'elem': elem };
- };
- GR.dprint = function(msg) {
- if ( "undefined" != typeof(console) && "undefined" != typeof(console.log) ) {
- console.log(msg);
- }
- };
- GR.init = function() {
- GR.resources = {};
- GR.bIE = ( -1 != navigator.userAgent.indexOf('MSIE') );
- GR.Ajax.initialize();
- };
- GR.removeDiv = function() {
- var div = document.getElementById('grdiv');
- div.parentNode.removeChild(div);
- };
- GR.report = function(doc) {
- var div = doc.createElement('div');
- div.id = "grdiv";
- div.style.cssText = "border: 2px solid #000; background: white; padding: 0 0 4px 8px; margin: 8px; position: absolute; top: 50px; right: 50px; font-size: 10px; font-family: 'Lucida Grande','Lucida Sans Unicode',Lucida,Arial,Helvetica,sans-serif; z-index: 9999; color: #000; text-align: left; line-height: 1.3em;";
- var sHtml = "<div style='float: right; text-align: right;'><a style='font-weight: bold; color: #FFF; text-decoration: none; border: 1px solid #C00; padding: 0 2px 0 2px; background: #C00;' href='#' onclick='GR.removeDiv(); return false;'>X</a></div><div style='font-weight: bold; font-size: 1.1em; margin-bottom: 8px;'>Page Resources bookmarklet</div>";
- // List the resources in these categories:
- var aTypes = ["html", "js", "css", "image", "cssimage", "flash"];
- for ( var i = 0, len = aTypes.length; i < len; i++ ) {
- sHtml += GR.reportType(aTypes[i]);
- }
- sHtml += "<div style='margin: 16px 2em 0 0;'><a style='border: 0; text-decoration: underline; color: #0645AD;' href=\"http://stevesouders.com/mobileperf/pageresources.php\" target='_blank'>Page Resources home</a></div>";
- div.innerHTML = sHtml;
- doc.body.appendChild(div);
- div.style.width = div.offsetWidth + "px"; // fix the width so it doesn't resize if the user collapses the twisties
- };
- GR.reportType = function(type) {
- var aResources = GR.resources[type];
- if ( ! aResources ) {
- return "";
- }
- var len = aResources.length;
- var id = "pr_" + type;
- var sHtml = "<div>" +
- "<a style='border: 0; text-decoration: underline; color: #0645AD;' href='#' onclick='GR.toggle(this, \"" + id + "\"); return false;'><img border=0 src='http://stevesouders.com/mobileperf/twistyOpen.png'></a> " +
- len + " " + GR.prettyType(type) + " resource" + ( 1 < len ? "s" : "" ) + ":</div><div id='" + id + "' style='margin-left: 10px; margin-bottom: 10px;'>";
- for ( var i = 0; i < len; i++ ) {
- var elem = aResources[i];
- sHtml += "<div style='margin-right: 8px;'><a style='border: 0; text-decoration: underline; color: #0645AD;' href='" + elem['url'] + "'>" + GR.shortenUrl(elem['url']) + "</a><div id='"+escape(GR.shortenUrl(elem['url']))+"'>" +
- GR.reportTypeDetails(type, elem['elem'], elem['url']) +
- "</div></div>";
- }
- sHtml += "</div>";
- return sHtml;
- };
- // return a string of additional details
- GR.reportTypeDetails = function(type, elem, url) {
- var renderProcessGenerator = function renderProcessGenerator(url) {
- var renderProcess = function renderProcess(src) {
- GR.dprint("size of " + url + " " + src.length);
- id = escape(GR.shortenUrl(url));
- document.getElementById(id).innerHTML = src.length;
- }
- return renderProcess;
- }
- sHtml = "";
- if ( "image" === type ) {
- if ( "undefined" != typeof(elem.naturalWidth) ) {
- sHtml += "(" + elem.naturalWidth + "x" + elem.naturalHeight;
- }
- else {
- sHtml += "(" + elem.width + "x" + elem.height;
- }
- if ( "undefined" != typeof(elem.fileSize) ) {
- sHtml += ", " + parseInt(elem.fileSize / 1024) + "K";
- }
- sHtml += ")";
- }
- else if ( "js" === type){
- GR.Ajax.request({ url: url,
- onSuccess: renderProcessGenerator(url),
- onFailure: alert
- })
- }
- else if ( "css" === type){
- //GR.dprint("???? " + elem.href);
- GR.Ajax.request({ url: url,
- onSuccess: renderProcessGenerator(url),
- onFailure: alert
- })
- }
- return sHtml;
- };
- GR.toggle = function(a, targetId) {
- var elem = document.getElementById(targetId);
- if ( a && elem ) {
- bShow = ( "none" == elem.style.display );
- elem.style.display = ( bShow ? "block" : "none" );
- a.getElementsByTagName('img')[0].src = ( bShow ? "http://stevesouders.com/mobileperf/twistyOpen.png" : "http://stevesouders.com/mobileperf/twistyClosed.png" );
- }
- };
- GR.getStyleAndUrl = function(elem, prop, bGetUrl, doc) {
- var val = "";
- if ( elem.currentStyle ) {
- val = elem.currentStyle[prop];
- }
- if ( elem.ownerDocument && elem.ownerDocument.defaultView && doc.defaultView.getComputedStyle ) {
- var style = elem.ownerDocument.defaultView.getComputedStyle(elem, "");
- if ( style ) {
- val = style[prop];
- }
- }
- if ( "backgroundPosition" === prop && GR.bIE ) {
- var posX = GR.getStyleAndUrl(elem, 'backgroundPositionX', false, doc);
- posX = ( "left" == posX ? "0%" : ( "center" == posX ? "50%" : ( "right" == posX ? "100%" : posX ) ) );
- var posY = GR.getStyleAndUrl(elem, 'backgroundPositionY', false, doc);
- posY = ( "top" == posY ? "0%" : ( "center" == posY ? "50%" : ( "bottom" == posY ? "100%" : posY ) ) );
- val = posX + " " + posY;
- }
- if ( !bGetUrl ) {
- return val;
- }
- if ( "string" != typeof(val) || 0 !== val.indexOf('url(') ) {
- return false;
- }
- val = val.replace(/url\(/, "");
- val = val.substr(0, val.length - 1);
- if ( 0 === val.indexOf('"') ) {
- val = val.substr(1, val.length - 2);
- }
- return val;
- };
- GR.shortenUrl = function(url) {
- if ( 60 < url.length ) {
- // strip the querystring
- var hostname = "", dirs = "", filename = "", ext = "", querystring = "";
- if ( url.match( /^(http.*\/\/.*?\/)(.*)$/ ) ) {
- // break it apart
- hostname = RegExp.$1; // HAS trailing slash
- url = RegExp.$2;
- if ( url.match( /^(.*)(\?.*)$/ ) ) {
- url = RegExp.$1;
- querystring = RegExp.$2; // HAS leading "?"
- }
- if ( url.match( /^(.*\/)(.*)$/ ) ) {
- dirs = RegExp.$1; // HAS trailing slash
- url = RegExp.$2;
- }
- if ( url.match( /^(.*)(\..*?)$/ ) && 5 > RegExp.$2.length ) {
- filename = RegExp.$1; // NO trailing "."
- ext = RegExp.$2; // HAS leading "."
- }
- var hlen = hostname.length, dlen = dirs.length, flen = filename.length, elen = ext.length, qlen = querystring.length;
- // build it back up
- if ( 60 > hlen + dlen + flen + elen ) {
- // trim querystring
- url = hostname + dirs + filename + ext;
- return url + ( qlen ? querystring.substring(0, 57 - url.length) + "..." : "" );
- }
- if ( 64 > hlen + flen + elen ) {
- // trim dirs
- return hostname + dirs.substring(0, (60-(hlen + flen + elen))) + ".../" + filename + ext;
- }
- if ( 60 > hlen ) {
- // trim filename
- return hostname + ( dirs ? ".../" : "" ) + filename.substring(0, (60-(hlen + elen))) + "..." + ext;
- }
- return hostname.substring(0, 53) + ".../...";
- }
- }
- return url;
- };
- GR.prettyType = function(type) {
- switch(type) {
- case "html": return "HTML";
- case "js": return "Script";
- case "css": return "Stylesheet";
- case "image": return "Image";
- case "cssimage": return "CSS Background Image";
- case "flash": return "Flash";
- }
- return "unrecognized type";
- };
- GR.findResources = function(doc) {
- GR.findScripts(doc);
- GR.findStylesheets(doc);
- GR.findImages(doc);
- GR.findBgImages(doc);
- GR.findFlash(doc);
- };
- GR.start = function() {
- GR.init();
- var subDocs = GR.findHtml(window);
- for ( var i = 0, len = subDocs.length; i < len; i++ ) {
- GR.findResources(subDocs[i]);
- }
- GR.report(window.document);
- };
- GR.start();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement