diff --git a/dependencies/yslow-3.1.4-sitespeed.js b/dependencies/yslow-3.1.4-sitespeed.js index abc0b9333..14da1e445 100644 --- a/dependencies/yslow-3.1.4-sitespeed.js +++ b/dependencies/yslow-3.1.4-sitespeed.js @@ -1 +1 @@ -var i,arg,page,urlCount,viewport,webpage=require("webpage"),args=phantom.args,len=args.length,urls=[],yslowArgs={info:"all",format:"json",ruleset:"ydefault",beacon:false,ua:false,viewport:false,headers:false,console:0,threshold:80},unaryArgs={help:false,version:false,dict:false,verbose:false},argsAlias={i:"info",f:"format",r:"ruleset",h:"help",V:"version",d:"dict",u:"ua",vp:"viewport",c:"console",b:"beacon",v:"verbose",t:"threshold",ch:"headers"};for(i=0;i specify the information to display/log (basic|grade|stats|comps|all) [all]"," -f, --format specify the output results format (json|xml|plain|tap|junit) [json]"," -r, --ruleset specify the YSlow performance ruleset to be used (ydefault|yslow1|yblog) [ydefault]"," -b, --beacon specify an URL to log the results"," -d, --dict include dictionary of results fields"," -v, --verbose output beacon response information"," -t, --threshold for test formats, the threshold to test scores ([0-100]|[A-F]|{JSON}) [80]",' e.g.: -t B or -t 75 or -t \'{"overall": "B", "ycdn": "F", "yexpires": 85}\'',' -u, --ua "" specify the user agent string sent to server when the page requests resources'," -vp, --viewport specify page viewport size WxY, where W = width and H = height [400x300]",' -ch, --headers specify custom request headers, e.g.: -ch \'{"Cookie": "foo=bar"}\''," -c, --console output page console messages (0: none, 1: message, 2: message + line + source) [0]",""," Examples:",""," phantomjs "+phantom.scriptName+" http://yslow.org"," phantomjs "+phantom.scriptName+" -i grade -f xml www.yahoo.com www.cnn.com www.nytimes.com"," phantomjs "+phantom.scriptName+' -info all --format plain --ua "MSIE 9.0" http://yslow.org'," phantomjs "+phantom.scriptName+" -i basic --rulseset yslow1 -d http://yslow.org"," phantomjs "+phantom.scriptName+" -i grade -b http://www.showslow.com/beacon/yslow/ -v yslow.org"," phantomjs --load-plugins=yes "+phantom.scriptName+" -vp 800x600 http://www.yahoo.com"," phantomjs "+phantom.scriptName+" -i grade -f tap -t 85 http://yslow.org",""].join("\n"));phantom.exit()}yslowArgs.dict=unaryArgs.dict;yslowArgs.verbose=unaryArgs.verbose;urls.forEach(function(a){var c=webpage.create();c.resources={};c.settings.webSecurityEnabled=false;c.onResourceRequested=function(d){c.resources[d.url]={request:d}};c.onResourceReceived=function(d){var e,f=c.resources[d.url].response;if(!f){c.resources[d.url].response=d}else{for(e in d){if(d.hasOwnProperty(e)){f[e]=d[e]}}}};yslowArgs.console=parseInt(yslowArgs.console,10)||0;if(yslowArgs.console){if(yslowArgs.console===1){c.onConsoleMessage=function(d){console.log(d)}}else{c.onConsoleMessage=function(f,d,e){console.log(JSON.stringify({message:f,lineNumber:d,source:e},null,4))}}}if(yslowArgs.ua){c.settings.userAgent=yslowArgs.ua}if(yslowArgs.viewport){viewport=yslowArgs.viewport.toLowerCase();c.viewportSize={width:parseInt(viewport.slice(0,viewport.indexOf("x")),10)||c.viewportSize.width,height:parseInt(viewport.slice(viewport.indexOf("x")+1),10)||c.viewportSize.height}}if(yslowArgs.headers){try{c.customHeaders=JSON.parse(yslowArgs.headers)}catch(b){console.log("Invalid custom headers: "+b)}}c.startTime=new Date();c.open(a,function(k){var f,j,m,n,l,d,h,e=c.startTime,g=c.resources;if(k!=="success"){console.log("FAIL to load "+d)}else{l=new Date()-e;for(d in g){if(g.hasOwnProperty(d)){h=g[d].response;if(h){h.time=new Date(h.time)-e}}}f=function(){if(typeof YSLOW==="undefined"){YSLOW={}}YSLOW.DEBUG=true;YSLOW.registerRule=function(q){YSLOW.controller.addRule(q)};YSLOW.registerRuleset=function(q){YSLOW.controller.addRuleset(q)};YSLOW.registerRenderer=function(q){YSLOW.controller.addRenderer(q)};YSLOW.registerTool=function(q){YSLOW.Tools.addCustomTool(q)};YSLOW.addEventListener=function(r,s,q){YSLOW.util.event.addListener(r,s,q)};YSLOW.removeEventListener=function(q,r){return YSLOW.util.event.removeListener(q,r)};YSLOW.Error=function(q,r){this.name=q;this.message=r};YSLOW.Error.prototype={toString:function(){return this.name+"\n"+this.message}};YSLOW.version="3.1.4";YSLOW.ComponentSet=function(q,r){this.root_node=q;this.components=[];this.outstanding_net_request=0;this.component_info=[];this.onloadTimestamp=r;this.nextID=1;this.notified_fetch_done=false};YSLOW.ComponentSet.prototype={clear:function(){this.components=[];this.component_info=[];this.cleared=true;if(this.outstanding_net_request>0){YSLOW.util.dump("YSLOW.ComponentSet.Clearing component set before all net requests finish.")}},addComponent:function(t,u,r,w){var q,v,s;if(!t){if(!this.empty_url){this.empty_url=[]}this.empty_url[u]=(this.empty_url[u]||0)+1}if(t&&u){if(!YSLOW.ComponentSet.isValidProtocol(t)||!YSLOW.ComponentSet.isValidURL(t)){return q}t=YSLOW.util.makeAbsoluteUrl(t,r);t=YSLOW.util.escapeHtml(t);v=typeof this.component_info[t]!=="undefined";s=u==="doc";if(!v||s){this.component_info[t]={state:"NONE",count:v?this.component_info[t].count:0};q=new YSLOW.Component(t,u,this,w);if(q){q.id=this.nextID+=1;this.components[this.components.length]=q;if(!this.doc_comp&&s){this.doc_comp=q}if(this.component_info[t].state==="NONE"){this.component_info[t].state="REQUESTED";this.outstanding_net_request+=1}}else{this.component_info[t].state="ERROR";YSLOW.util.event.fire("componentFetchError")}}this.component_info[t].count+=1}return q},addComponentNoDuplicate:function(r,s,q){if(r&&s){r=YSLOW.util.escapeHtml(r);r=YSLOW.util.makeAbsoluteUrl(r,q);if(this.component_info[r]===undefined){return this.addComponent(r,s,q)}}},getComponentsByType:function(D,A,u){var w,v,B,s,E,y,r,x=this.components,C=this.component_info,q=[],z={};if(typeof A==="undefined"){A=!(YSLOW.util.Preference.getPref("excludeAfterOnload",true))}if(typeof u==="undefined"){u=!(YSLOW.util.Preference.getPref("excludeBeaconsFromLint",true))}if(typeof D==="string"){z[D]=1}else{for(w=0,B=D.length;w0){w=u.substr(0,r);for(t=0;t0){w.expires=new Date(r);if(w.expires.toString()==="Invalid Date"){w.expires=w.getMaxAge()}}else{w.expires=w.getMaxAge()}if(w.type==="image"&&!s){if(typeof Image!==B){u=new Image()}else{u=document.createElement("img")}if(w.body.length){y="data:"+w.headers["content-type"]+";base64,"+YSLOW.util.base64Encode(w.body);z=1}else{y=w.url}u.onerror=function(){u.onerror=t;if(z){u.src=w.url}};u.onload=function(){u.onload=t;if(u&&u.width&&u.height){if(w.object_prop){w.object_prop.actual_width=u.width;w.object_prop.actual_height=u.height}else{w.object_prop={width:u.width,height:u.height,actual_width:u.width,actual_height:u.height}}if(u.width<2&&u.height<2){w.is_beacon=true}}};u.src=y}};YSLOW.Component.prototype.hasOldModifiedDate=function(){var q=Number(new Date()),r=this.headers["last-modified"];if(typeof r!=="undefined"){return((q-Number(new Date(r)))>(24*60*60*1000))}return false};YSLOW.Component.prototype.hasFarFutureExpiresOrMaxAge=function(){var t,r=Number(new Date()),s=YSLOW.util.Preference.getPref("minFutureExpiresSeconds",2*24*60*60),q=s*1000;if(typeof this.expires==="object"){t=Number(this.expires);if((t-r)>q){return true}}return false};YSLOW.Component.prototype.getEtag=function(){return this.headers.etag||""};YSLOW.Component.prototype.getMaxAge=function(){var r,s,q,t=this.headers["cache-control"];if(t){r=t.indexOf("max-age");if(r>-1){s=parseInt(t.substring(r+8),10);if(s>0){q=YSLOW.util.maxAgeToDate(s)}}}return q};YSLOW.Component.prototype.getSetCookieSize=function(){var s,q,r=0;if(this.headers&&this.headers["set-cookie"]){s=this.headers["set-cookie"].split("\n");if(s.length>0){for(q=0;q0){s=this.cookie.split("\n");if(s.length>0){for(q=0;qq.parent.onloadTimestamp;q.populateProperties(false,true);q.get_info_state="DONE";q.parent.onComponentGetInfoStateChange({comp:q,state:"DONE"})};if(s.request&&s.response){r(s.request,s.response)}};YSLOW.controller={rules:{},rulesets:{},onloadTimestamp:null,renderers:{},default_ruleset_id:"ydefault",run_pending:0,init:function(){var r,q,t,s;YSLOW.util.event.addListener("onload",function(u){this.onloadTimestamp=u.time;YSLOW.util.setTimer(function(){YSLOW.controller.run_pending_event()})},this);YSLOW.util.event.addListener("onUnload",function(u){this.run_pending=0;this.onloadTimestamp=null},this);r=YSLOW.util.Preference.getPrefList("customRuleset.",undefined);if(r&&r.length>0){for(q=0;q0){t=JSON.parse(s,null);t.custom=true;this.addRuleset(t)}}}this.default_ruleset_id=YSLOW.util.Preference.getPref("defaultRuleset","ydefault");this.loadRulePreference()},run:function(t,u,r){var v,q,s=t.document;if(!s||!s.location||s.location.href.indexOf("about:")===0||"undefined"===typeof s.location.hostname){if(!r){q="Please enter a valid website address before running YSlow.";YSLOW.ysview.openDialog(YSLOW.ysview.panel_doc,389,150,q,"","Ok")}return}if(!u.PAGE.loaded){this.run_pending={win:t,yscontext:u};return}YSLOW.util.event.fire("peelStart",undefined);v=YSLOW.peeler.peel(s,this.onloadTimestamp);u.component_set=v;YSLOW.util.event.fire("peelComplete",{component_set:v});v.notifyPeelDone()},run_pending_event:function(){if(this.run_pending){this.run(this.run_pending.win,this.run_pending.yscontext,false);this.run_pending=0}},lint:function(H,s,q){var t,x,F,w,y,z,G,E=[],C=[],D=0,B=0,u=this,v=u.rulesets,A=u.default_ruleset_id;if(q){E=v[q]}else{if(A&&v[A]){E=v[A]}else{for(F in v){if(v.hasOwnProperty(F)&&v[F]){E=v[F];break}}}}x=E.rules;for(F in x){if(x.hasOwnProperty(F)&&x[F]&&this.rules.hasOwnProperty(F)){try{t=this.rules[F];w=YSLOW.util.merge(t.config,x[F]);y=t.lint(H,s.component_set,w);z=(E.weights?E.weights[F]:undefined);if(z!==undefined){z=parseInt(z,10)}if(z===undefined||z<0||z>100){if(v.ydefault.weights[F]){z=v.ydefault.weights[F]}else{z=5}}y.weight=z;if(y.score!==undefined){if(typeof y.score!=="number"){G=parseInt(y.score,10);if(!isNaN(G)){y.score=G}}if(typeof y.score==="number"){B+=y.weight;if(!YSLOW.util.Preference.getPref("allowNegativeScore",false)){if(y.score<0){y.score=0}if(typeof y.score!=="number"){y.score=-1}}if(y.score!==0){D+=y.score*(typeof y.weight!=="undefined"?y.weight:1)}}}y.name=t.name;y.category=t.category;y.rule_id=F;C[C.length]=y}catch(r){YSLOW.util.dump("YSLOW.controller.lint: "+F,r);YSLOW.util.event.fire("lintError",{rule:F,message:r})}}}s.PAGE.overallScore=D/(B>0?B:1);s.result_set=new YSLOW.ResultSet(C,s.PAGE.overallScore,E);s.result_set.url=s.component_set.doc_comp.url;YSLOW.util.event.fire("lintResultReady",{yslowContext:s});return s.result_set},runTool:function(D,A,r){var G,w,C,v,y,q,B,t,F,E,x,z=YSLOW.Tools.getTool(D);try{if(typeof z==="object"){G=z.run(A.document,A.component_set,r);if(z.print_output){w="";if(typeof G==="object"){w=G.html}else{if(typeof G==="string"){w=G}}C=YSLOW.util.getNewDoc();x=C.body||C.documentElement;x.innerHTML=w;v=C.getElementsByTagName("head")[0];if(typeof G.css==="undefined"){q="chrome://yslow/content/yslow/tool.css";B=new XMLHttpRequest();B.open("GET",q,false);B.send(null);y=B.responseText}else{y=G.css}if(typeof y==="string"){t=C.createElement("style");t.setAttribute("type","text/css");t.appendChild(C.createTextNode(y));v.appendChild(t)}if(typeof G.js!=="undefined"){F=C.createElement("script");F.setAttribute("type","text/javascript");F.appendChild(C.createTextNode(G.js));v.appendChild(F)}if(typeof G.plot_component!=="undefined"&&G.plot_component===true){YSLOW.renderer.plotComponents(C,A)}}}else{E=D+" is not a tool.";YSLOW.util.dump(E);YSLOW.util.event.fire("toolError",{tool_id:D,message:E})}}catch(u){YSLOW.util.dump("YSLOW.controller.runTool: "+D,u);YSLOW.util.event.fire("toolError",{tool_id:D,message:u})}},render:function(u,q,t){var s=this.renderers[u],r="";if(s.supports[q]!==undefined&&s.supports[q]===1){switch(q){case"components":r=s.componentsView(t.comps,t.total_size);break;case"reportcard":r=s.reportcardView(t.result_set);break;case"stats":r=s.statsView(t.stats);break;case"tools":r=s.toolsView(t.tools);break;case"rulesetEdit":r=s.rulesetEditView(t.rulesets);break}}return r},getRenderer:function(q){return this.renderers[q]},addRule:function(s){var q,r,t=["id","name","config","info","lint"];if(YSLOW.doc.rules&&YSLOW.doc.rules[s.id]){r=YSLOW.doc.rules[s.id];if(r.name){s.name=r.name}if(r.info){s.info=r.info}}for(q=0;q0&&r){r.config.howfar=q}}};YSLOW.util={merge:function(r,q){var s,t={};for(s in r){if(r.hasOwnProperty(s)){t[s]=r[s]}}for(s in q){if(q.hasOwnProperty(s)){t[s]=q[s]}}return t},dump:function(){var q;if(!YSLOW.DEBUG){return}q=Array.prototype.slice.apply(arguments);q=q&&q.length===1?q[0]:q;try{if(typeof Firebug!=="undefined"&&Firebug.Console&&Firebug.Console.log){Firebug.Console.log(q)}else{if(typeof Components!=="undefined"&&Components.classes&&Components.interfaces){Components.classes["@mozilla.org/consoleservice;1"].getService(Components.interfaces.nsIConsoleService).logStringMessage(JSON.stringify(q,null,2))}}}catch(s){try{console.log(q)}catch(r){}}},filter:function(t,u,r){var s,q=r?[]:{};for(s in t){if(t.hasOwnProperty(s)&&u(s,t[s])){q[r?q.length:s]=t[s]}}return q},expires_month:{Jan:1,Feb:2,Mar:3,Apr:4,May:5,Jun:6,Jul:7,Aug:8,Sep:9,Oct:10,Nov:11,Dec:12},prettyExpiresDate:function(q){var r;if(Object.prototype.toString.call(q)==="[object Date]"&&q.toString()!=="Invalid Date"&&!isNaN(q)){r=q.getMonth()+1;return q.getFullYear()+"/"+r+"/"+q.getDate()}else{if(!q){return"no expires"}}return"invalid date object"},maxAgeToDate:function(r){var q=new Date();q=q.getTime()+parseInt(r,10)*1000;return new Date(q)},plural:function(s,t){var r,q=s,u={are:["are","is"],s:["s",""],"do":["do","does"],num:[t,t]};for(r in u){if(u.hasOwnProperty(r)){q=q.replace(new RegExp("%"+r+"%","gm"),(t===1)?u[r][1]:u[r][0])}}return q},countExpressions:function(s){var q=0,r;r=s.indexOf("expression(");while(r!==-1){q+=1;r=s.indexOf("expression(",r+1)}return q},countAlphaImageLoaderFilter:function(v){var t,u,s,w,r=0,x=0,q={};t=v.indexOf("filter:");while(t!==-1){s=false;if(t>0&&v.charAt(t-1)==="_"){s=true}u=v.indexOf(";",t+7);if(u!==-1){w=v.substring(t+7,u);if(w.indexOf("AlphaImageLoader")!==-1){if(s){x+=1}else{r+=1}}}t=v.indexOf("filter:",t+1)}if(x>0){q.hackFilter=x}if(r>0){q.filter=r}return q},getHostname:function(r){var q=r.split("/")[2];return(q&&q.split(":")[0])||""},getUniqueDomains:function(w,u){var t,r,v,q={},s=[];for(t=0,r=w.length;t0.2){return false}return true},isETagGood:function(q){var s=/^[0-9a-f]+:[0-9a-f]+$/,r=/^[0-9a-f]+\-[0-9a-f]+\-[0-9a-f]+$/;if(!q){return true}q=q.replace(/^["']|["'][\s\S]*$/g,"");return !(r.test(q)||s.test(q))},getComponentType:function(q){var r="unknown";if(q&&typeof q==="string"){if(q==="text/html"||q==="text/plain"){r="doc"}else{if(q==="text/css"){r="css"}else{if(/javascript/.test(q)){r="js"}else{if(/flash/.test(q)){r="flash"}else{if(/image/.test(q)){r="image"}else{if(/font/.test(q)){r="font"}}}}}}}return r},base64Encode:function(v){var u,t,s,x,r="",w=0,q=["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","0","1","2","3","4","5","6","7","8","9","+","/"];for(u=0;u>2];r+=q[((t&3)<<4)|((s&240)>>4)];if(w>0){r+="="}else{r+=q[((s&15)<<2)|((x&192)>>6)]}if(w>1){r+="="}else{r+=q[(x&63)]}}return r},getXHR:function(){var q=0,t=null,r=["MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP"];if(typeof XMLHttpRequest==="function"){return new XMLHttpRequest()}for(q=0;q/g,">")},escapeQuotes:function(r,q){if(q==="single"){return r.replace(/\'/g,"\\'")}if(q==="double"){return r.replace(/\"/g,'\\"')}return r.replace(/\'/g,"\\'").replace(/\"/g,'\\"')},formatHeaderName:(function(){var q={"content-md5":"Content-MD5",dnt:"DNT",etag:"ETag",p3p:"P3P",te:"TE","www-authenticate":"WWW-Authenticate","x-att-deviceid":"X-ATT-DeviceId","x-cdn":"X-CDN","x-ua-compatible":"X-UA-Compatible","x-xss-protection":"X-XSS-Protection"};return function(s){var r=s.toLowerCase();if(q.hasOwnProperty(r)){return q[r]}else{return r.replace(/(^|-)([a-z])/g,function(t,u,v){return u+v.toUpperCase()})}}}()),mod:function(q,r){return Math.round(q-(Math.floor(q/r)*r))},briefUrl:function(s,q){var r,t,u,v;q=q||100;if(s===undefined){return""}r=s.indexOf("//");if(-1!==r){t=s.indexOf("?");if(-1!==t){s=s.substring(0,t)+"?..."}if(s.length>q){u=s.indexOf("/",r+2);v=s.lastIndexOf("/");if(-1!==u&&-1!==v&&u!==v){s=s.substring(0,u+1)+"..."+s.substring(v)}else{s=s.substring(0,q+1)+"..."}}}return s},prettyAnchor:function(y,r,t,s,w,q,z){var u,x="",v="",A=0;if(typeof r==="undefined"){r=y}if(typeof t==="undefined"){t=""}else{t=' class="'+t+'"'}if(typeof w==="undefined"){w=100}if(typeof q==="undefined"){q=1}z=(z)?' rel="'+z+'"':"";r=YSLOW.util.escapeHtml(r);y=YSLOW.util.escapeHtml(y);u=YSLOW.util.escapeQuotes(r,"double");if(s){y=YSLOW.util.briefUrl(y,w);x=' title="'+u+'"'}while(0"+y.substring(0,w);y=y.substring(w);A+=1;if(A>=q){if(0";break}else{v+=" "}}return v},kbSize:function(q){var r=q%(q>100?100:10);q-=r;return parseFloat(q/1000)+(0===(q%1000)?".0":"")+"K"},prettyTypes:{image:"Image",doc:"HTML/Text",cssimage:"CSS Image",css:"Stylesheet File",js:"JavaScript File",flash:"Flash Object",iframe:"IFrame",xhr:"XMLHttpRequest",redirect:"Redirect",favicon:"Favicon",unknown:"Unknown"},prettyType:function(q){return YSLOW.util.prettyTypes[q]},prettyScore:function(r){var q="F";if(!parseInt(r,10)&&r!==0){return r}if(r===-1){return"N/A"}if(r>=90){q="A"}else{if(r>=80){q="B"}else{if(r>=70){q="C"}else{if(r>=60){q="D"}else{if(r>=50){q="E"}}}}}return q},getResults:function(w,S){var O,L,J,u,t,H,T,G,F,x,v,r,W,Q,I,s,E,D,y,A,N,K,B,z=/ "):"")}}return{score:J,message:z,components:r}}});YSLOW.registerRule({id:"yexpires",url:"http://developer.yahoo.com/performance/rules.html#expires",category:["server"],config:{points:11,howfar:172800,types:["css","js","image","cssimage","flash","favicon"]},lint:function(y,A,r){var x,t,z,s,w,u=parseInt(r.howfar,10)*1000,v=[],q=A.getComponentsByType(r.types);for(t=0,w=q.length;tx+u){continue}}v.push(q[t])}s=100-v.length*parseInt(r.points,10);return{score:s,message:(v.length>0)?YSLOW.util.plural("There %are% %num% static component%s%",v.length)+" without a far-future expiration date.":"",components:v}}});YSLOW.registerRule({id:"ycompress",url:"http://developer.yahoo.com/performance/rules.html#gzip",category:["server"],config:{min_filesize:500,types:["doc","iframe","xhr","js","css"],points:11},lint:function(x,y,r){var t,w,s,u,v=[],q=y.getComponentsByType(r.types);for(t=0,w=q.length;t0)?YSLOW.util.plural("There %are% %num% plain text component%s%",v.length)+" that should be sent compressed":"",components:v}}});YSLOW.registerRule({id:"ycsstop",url:"http://developer.yahoo.com/performance/rules.html#css_top",category:["css"],config:{points:10},lint:function(x,y,r){var t,w,s,u,q=y.getComponentsByType("css"),v=[];for(t=0,w=q.length;t0){s-=1+v.length*parseInt(r.points,10)}return{score:s,message:(v.length>0)?YSLOW.util.plural("There %are% %num% stylesheet%s%",v.length)+" found in the body of the document":"",components:v}}});YSLOW.registerRule({id:"yjsbottom",url:"http://developer.yahoo.com/performance/rules.html#js_bottom",category:["javascript"],config:{points:5},lint:function(x,y,r){var t,w,u,s,v=[],q=y.getComponentsByType("js");for(t=0,w=q.length;t0)?YSLOW.util.plural("There %are% %num% JavaScript script%s%",v.length)+" found in the head of the document":"",components:v}}});YSLOW.registerRule({id:"yexpressions",url:"http://developer.yahoo.com/performance/rules.html#css_expressions",category:["css"],config:{points:2},lint:function(y,B,r){var t,w,A,u,z=(B.inline&&B.inline.styles)||[],q=B.getComponentsByType("css"),v=[],s=100,x=0;for(t=0,w=q.length;t0){u.yexpressions=YSLOW.util.plural("%num% expression%s%",A);x+=A;v.push(u)}}for(t=0,w=z.length;t0){v.push("inline <style> tag #"+(t+1)+" ("+YSLOW.util.plural("%num% expression%s%",A)+")");x+=A}}if(x>0){s=90-x*r.points}return{score:s,message:x>0?"There is a total of "+YSLOW.util.plural("%num% expression%s%",x):"",components:v}}});YSLOW.registerRule({id:"yexternal",url:"http://developer.yahoo.com/performance/rules.html#external",category:["javascript","css"],config:{},lint:function(v,x,r){var t,u=x.inline,s=(u&&u.styles)||[],q=(u&&u.scripts)||[],w=[];if(s.length){t=YSLOW.util.plural("There is a total of %num% inline css",s.length);w.push(t)}if(q.length){t=YSLOW.util.plural("There is a total of %num% inline script%s%",q.length);w.push(t)}return{score:"n/a",message:"Only consider this if your property is a common user home page.",components:w}}});YSLOW.registerRule({id:"ydns",url:"http://developer.yahoo.com/performance/rules.html#dns_lookups",category:["content"],config:{max_domains:4,points:5},lint:function(y,A,q){var t,v,s,u=YSLOW.util,w=u.kbSize,x=u.plural,r=100,z=u.summaryByDomain(A.components,["size","size_compressed"],true);if(z.length>q.max_domains){r-=(z.length-q.max_domains)*q.points}if(z.length){for(t=0,v=z.length;t0?" ("+w(s.sum_size_compressed)+" GZip)":"")}}return{score:r,message:(z.length>q.max_domains)?x("The components are split over more than %num% domain%s%",q.max_domains):"",components:z}}});YSLOW.registerRule({id:"yminify",url:"http://developer.yahoo.com/performance/rules.html#minify",category:["javascript","css"],config:{points:10,types:["js","css"]},lint:function(A,C,r){var u,x,s,z,v,y=C.inline,B=(y&&y.styles)||[],t=(y&&y.scripts)||[],q=C.getComponentsByType(r.types),w=[];for(u=0,x=q.length;u0)?YSLOW.util.plural("There %are% %num% component%s% that can be minified",w.length):"",components:w}}});YSLOW.registerRule({id:"yredirects",url:"http://developer.yahoo.com/performance/rules.html#redirects",category:["content"],config:{points:10},lint:function(y,z,r){var u,x,v,s,w=[],t=YSLOW.util.briefUrl,q=z.getComponentsByType("redirect");for(u=0,x=q.length;u0)?YSLOW.util.plural("There %are% %num% redirect%s%",q.length):"",components:w}}});YSLOW.registerRule({id:"ydupes",url:"http://developer.yahoo.com/performance/rules.html#js_dupes",category:["javascript","css"],config:{points:5,types:["js","css"]},lint:function(y,z,s){var v,q,t,x,u={},w=[],r=z.getComponentsByType(s.types);for(v=0,x=r.length;v1){w.push(r[u[v].compindex])}}t=100-w.length*parseInt(s.points,10);return{score:t,message:(w.length>0)?YSLOW.util.plural("There %are% %num% duplicate component%s%",w.length):"",components:w}}});YSLOW.registerRule({id:"yetags",url:"http://developer.yahoo.com/performance/rules.html#etags",category:["server"],config:{points:11,types:["flash","js","css","cssimage","image","favicon"]},lint:function(y,z,r){var t,w,s,u,x,v=[],q=z.getComponentsByType(r.types);for(t=0,w=q.length;t0)?YSLOW.util.plural("There %are% %num% component%s% with misconfigured ETags",v.length):"",components:v}}});YSLOW.registerRule({id:"yxhr",url:"http://developer.yahoo.com/performance/rules.html#cacheajax",category:["content"],config:{points:5,min_cache_time:3600},lint:function(y,A,r){var u,z,x,s,w,t=parseInt(r.min_cache_time,10)*1000,v=[],q=A.getComponentsByType("xhr");for(u=0;ux+t){continue}}v.push(q[u])}s=100-v.length*parseInt(r.points,10);return{score:s,message:(v.length>0)?YSLOW.util.plural("There %are% %num% XHR component%s% that %are% not cacheable",v.length):"",components:v}}});YSLOW.registerRule({id:"yxhrmethod",url:"http://developer.yahoo.com/performance/rules.html#ajax_get",category:["server"],config:{points:5},lint:function(s,w,q){var r,t,v=[],u=w.getComponentsByType("xhr");for(r=0;r0)?YSLOW.util.plural("There %are% %num% XHR component%s% that %do% not use GET HTTP method",v.length):"",components:v}}});YSLOW.registerRule({id:"ymindom",url:"http://developer.yahoo.com/performance/rules.html#min_dom",category:["content"],config:{range:250,points:10,maxdom:900},lint:function(s,u,r){var q=u.domElementsCount,t=100;if(q>r.maxdom){t=99-Math.ceil((q-parseInt(r.maxdom,10))/parseInt(r.range,10))*parseInt(r.points,10)}return{score:t,message:(q>r.maxdom)?YSLOW.util.plural("There %are% %num% DOM element%s% on the page",q):"",components:[]}}});YSLOW.registerRule({id:"yno404",url:"http://developer.yahoo.com/performance/rules.html#no404",category:["content"],config:{points:5,types:["css","js","image","cssimage","flash","xhr","favicon"]},lint:function(x,y,r){var t,w,u,s,v=[],q=y.getComponentsByType(r.types);for(t=0,w=q.length;t0)?YSLOW.util.plural("There %are% %num% request%s% that %are% 404 Not Found",v.length):"",components:v}}});YSLOW.registerRule({id:"ymincookie",url:"http://developer.yahoo.com/performance/rules.html#cookie_size",category:["cookie"],config:{points:10,max_cookie_size:1000},lint:function(u,x,r){var w,t=x.cookies,q=(t&&t.length)||0,s="",v=100;if(q>r.max_cookie_size){w=Math.floor(q/r.max_cookie_size);v-=1+w*parseInt(r.points,10);s=YSLOW.util.plural("There %are% %num% byte%s% of cookies on this page",q)}return{score:v,message:s,components:[]}}});YSLOW.registerRule({id:"ycookiefree",url:"http://developer.yahoo.com/performance/rules.html#cookie_free",category:["cookie"],config:{points:5,types:["js","css","image","cssimage","flash","favicon"]},lint:function(A,B,t){var v,z,u,x,q,y=[],s=YSLOW.util.getHostname,w=s(B.doc_comp.url),r=B.getComponentsByType(t.types);for(v=0,z=r.length;v0)?YSLOW.util.plural("There %are% %num% component%s% that %are% not cookie-free",y.length):"",components:y}}});YSLOW.registerRule({id:"ynofilter",url:"http://developer.yahoo.com/performance/rules.html#no_filters",category:["css"],config:{points:5,halfpoints:2},lint:function(B,E,s){var u,y,t,v,A,x,D,C=(E.inline&&E.inline.styles)||[],r=E.getComponentsByType("css"),w=[],q=0,z=0;for(u=0,y=r.length;u0){r[u].yfilters=YSLOW.util.plural("%num% filter%s%",x);w.push(r[u])}}for(u=0,y=C.length;u0){w.push("inline <style> tag #"+(u+1)+" ("+YSLOW.util.plural("%num% filter%s%",x)+")")}}t=100-(q*s.points+z*s.halfpoints);return{score:t,message:(q+z)>0?"There is a total of "+YSLOW.util.plural("%num% filter%s%",q+z):"",components:w}}});YSLOW.registerRule({id:"yimgnoscale",url:"http://developer.yahoo.com/performance/rules.html#no_scale",category:["images"],config:{points:5},lint:function(s,x,q){var r,w,t,v=[],u=x.getComponentsByType("image");for(r=0;r0)?YSLOW.util.plural("There %are% %num% image%s% that %are% scaled down",v.length):"",components:v}}});YSLOW.registerRule({id:"yfavicon",url:"http://developer.yahoo.com/performance/rules.html#favicon",category:["images"],config:{points:5,size:2000,min_cache_time:3600},lint:function(y,A,r){var x,z,w,t,s,v=[],u=parseInt(r.min_cache_time,10)*1000,q=A.getComponentsByType("favicon");if(q.length){w=q[0];if(parseInt(w.status,10)===404){v.push("Favicon was not found")}if(w.size>r.size){v.push(YSLOW.util.plural("Favicon is more than %num% bytes",r.size))}z=w.expires;if(typeof z==="object"&&typeof z.getTime==="function"){x=new Date().getTime();s=z.getTime()>=x+u}if(!s){v.push("Favicon is not cacheable")}}t=100-v.length*parseInt(r.points,10);return{score:t,message:(v.length>0)?v.join("\n"):"",components:[]}}});YSLOW.registerRule({id:"yemptysrc",url:"http://developer.yahoo.com/performance/rules.html#emptysrc",category:["server"],config:{points:100},lint:function(x,A,r){var w,s,v,y=A.empty_url,u=[],t=[],q="",z=parseInt(r.points,10);s=100;if(y){for(w in y){if(y.hasOwnProperty(w)){v=y[w];s-=v*z;t.push(v+" "+w)}}q=t.join(", ")+YSLOW.util.plural(" component%s% with empty link were found.",t.length)}return{score:s,message:q,components:u}}});YSLOW.registerRuleset({id:"ydefault",name:"YSlow(V2)",rules:{ynumreq:{},ycdn:{},yemptysrc:{},yexpires:{},ycompress:{},ycsstop:{},yjsbottom:{},yexpressions:{},yexternal:{},ydns:{},yminify:{},yredirects:{},ydupes:{},yetags:{},yxhr:{},yxhrmethod:{},ymindom:{},yno404:{},ymincookie:{},ycookiefree:{},ynofilter:{},yimgnoscale:{},yfavicon:{}},weights:{ynumreq:8,ycdn:6,yemptysrc:30,yexpires:10,ycompress:8,ycsstop:4,yjsbottom:4,yexpressions:3,yexternal:4,ydns:3,yminify:4,yredirects:4,ydupes:4,yetags:2,yxhr:4,yxhrmethod:3,ymindom:3,yno404:4,ymincookie:3,ycookiefree:3,ynofilter:4,yimgnoscale:3,yfavicon:2}});YSLOW.registerRuleset({id:"yslow1",name:"Classic(V1)",rules:{ynumreq:{},ycdn:{},yexpires:{},ycompress:{},ycsstop:{},yjsbottom:{},yexpressions:{},yexternal:{},ydns:{},yminify:{types:["js"],check_inline:false},yredirects:{},ydupes:{types:["js"]},yetags:{}},weights:{ynumreq:8,ycdn:6,yexpires:10,ycompress:8,ycsstop:4,yjsbottom:4,yexpressions:3,yexternal:4,ydns:3,yminify:4,yredirects:4,ydupes:4,yetags:2}});YSLOW.registerRuleset({id:"yblog",name:"Small Site or Blog",rules:{ynumreq:{},yemptysrc:{},ycompress:{},ycsstop:{},yjsbottom:{},yexpressions:{},ydns:{},yminify:{},yredirects:{},ydupes:{},ymindom:{},yno404:{},ynofilter:{},yimgnoscale:{},yfavicon:{}},weights:{ynumreq:8,yemptysrc:30,ycompress:8,ycsstop:4,yjsbottom:4,yexpressions:3,ydns:3,yminify:4,yredirects:4,ydupes:4,ymindom:3,yno404:4,ynofilter:4,yimgnoscale:3,yfavicon:2}});var o={};o.getTLD=function(s){var r=s;var q=/\.(gov|ac|mil|net|org|co)\.\w\w$/i;if(s.match(q)){var t=/[\w]+\.[\w]+\.[\w]+$/i;r=s.match(t).toString()}else{var u=/[\w]+\.[\w]+$/i;r=s.match(u).toString()}return r};o.getSynchronouslyJavascripts=function(s){var r=[];for(var q=0;q0){for(var u=0;u0)?YSLOW.util.plural("There %are% %num% print css files included on the page, that should be @media query instead",x.length):"",components:x}}});YSLOW.registerRule({id:"cssinheaddomain",name:"Load CSS in head from document domain",info:"Make sure css in head is loaded from same domain as document, in order to have a better user experience and minimize dns lookups",category:["css"],config:{points:10},url:"http://sitespeed.io/rules/#cssinheaddomain",lint:function(B,D,s){var y=B.getElementsByTagName("link"),r=D.getComponentsByType("css"),z,x,q,A={},u=[],v=[],t=100;x=YSLOW.util.getHostname(D.doc_comp.url);for(w=0,len=y.length;wy+u){continue}else{if(r.skip.indexOf(q[t].url)>1){x.push(q[t].url);continue}}}v.push(q[t])}s=100-v.length*parseInt(r.points,10);B=(v.length>0)?YSLOW.util.plural("There %are% %num% static component%s%",v.length)+" without a far-future expiration date.":"";B+=(x.length>0)?YSLOW.util.plural(" There %are% %num% static component%s% that are skipped from the score calculation",x.length)+":"+x:"";return{score:s,message:B,components:v}}});YSLOW.registerRule({id:"inlinecsswhenfewrequest",name:"Do not load css files when the page has few request",info:"When a page has few requests, it is better to inline the css, to make the page to start render as early as possible",category:["css"],config:{points:20,limit:15,types:["css","js","image","cssimage","flash","favicon"]},url:"http://sitespeed.io/rules/#inlinecsswhenfewrequest",lint:function(t,x,q){var w=x.getComponentsByType(q.types),r=x.getComponentsByType("css"),s="",u=100,v=[];if(w.length0){for(i=0,len=r.length;i1){for(i=0,len=w.length;i1){x.push(r[w])}}t=100-x.length*11;return{score:t,message:(x.length>0)?YSLOW.util.plural("There %are% %num% 3rd party JS file%s% included more than once on the page",x.length):"",components:x}}});YSLOW.registerRuleset({id:"sitespeed.io-1.5",name:"Sitespeed.io rules v1.5",rules:{criticalpath:{},spof:{},ynumreq:{max_js:2,max_css:2,max_cssimages:2},yemptysrc:{},ycompress:{},ycsstop:{},yjsbottom:{},yexpressions:{},yexternal:{},ydns:{},yminify:{},yredirects:{},ydupes:{},yetags:{},yxhr:{},yxhrmethod:{},ymindom:{},yno404:{},ymincookie:{},ycookiefree:{},ynofilter:{},yimgnoscale:{},_3po_asyncjs:{},_3po_jsonce:{},cssprint:{},cssinheaddomain:{},syncjsinhead:{},avoidfont:{},totalrequests:{},expiresmod:{},nodnslookupswhenfewrequests:{},inlinecsswhenfewrequest:{},textcontent:{}},weights:{criticalpath:15,spof:5,ynumreq:8,yemptysrc:30,ycompress:8,ycsstop:4,yjsbottom:4,yexpressions:3,yexternal:4,ydns:3,yminify:4,yredirects:4,ydupes:4,yetags:2,yxhr:4,yxhrmethod:3,ymindom:3,yno404:4,ymincookie:3,ycookiefree:3,ynofilter:4,yimgnoscale:3,_3po_asyncjs:10,_3po_jsonce:10,cssprint:3,cssinheaddomain:8,syncjsinhead:20,avoidfont:1,totalrequests:10,expiresmod:10,nodnslookupswhenfewrequests:8,inlinecsswhenfewrequest:7,textcontent:1}});YSLOW.ResultSet=function(s,r,q){this.ruleset_applied=q;this.overall_score=r;this.results=s};YSLOW.ResultSet.prototype={getResults:function(){return this.results},getRulesetApplied:function(){return this.ruleset_applied},getOverallScore:function(){return this.overall_score}};YSLOW.view=function(r,w){var u,t,v,q,s;this.panel_doc=r.document;this.buttonViews={};this.curButtonId="";this.panelNode=r.panelNode;this.loadCSS(this.panel_doc);u=this.panel_doc.createElement("div");u.id="toolbarDiv";u.innerHTML=this.getToolbarSource();u.style.display="block";t=this.panel_doc.createElement("div");t.style.display="block";v='

text

';q=this.panel_doc.createElement("div");q.id="dialogDiv";q.innerHTML=v;q.style.display="none";this.modaldlg=q;this.tooltip=new YSLOW.view.Tooltip(this.panel_doc,r.panelNode);s=this.panel_doc.createElement("div");s.id="copyrightDiv";s.innerHTML=YSLOW.doc.copyright;this.copyright=s;if(r.panelNode){r.panelNode.id="yslowDiv";r.panelNode.appendChild(q);r.panelNode.appendChild(u);r.panelNode.appendChild(t);r.panelNode.appendChild(s)}this.viewNode=t;this.viewNode.id="viewDiv";this.viewNode.className="yui-skin-sam";this.yscontext=w;YSLOW.util.addEventListener(this.panelNode,"click",function(E){var A,B,z,F,C,D=r.document.ysview.getElementByTagNameAndId(r.panelNode,"div","toolbarDiv");if(D){B=r.document.ysview.getElementByTagNameAndId(D,"li","helpLink");if(B){z=B.offsetLeft;F=B.offsetTop;C=B.offsetParent;while(C){z+=C.offsetLeft;F+=C.offsetTop;C=C.offsetParent}if(E.clientX>=z&&E.clientY>=F&&E.clientX"+x.name+"

"+x.info,y.target)}}}});YSLOW.util.addEventListener(this.panelNode,"mouseout",function(x){r.document.ysview.tooltip.hide()});YSLOW.util.addEventListener(this.panel_doc.defaultView||this.panel_doc.parentWindow,"resize",function(y){var x=r.document.ysview.modaldlg;if(x&&x.style.display==="block"){x.style.display="none"}})};YSLOW.view.prototype={setDocument:function(q){this.panel_doc=q},loadCSS:function(){},addButtonView:function(q,s){var r=this.getButtonView(q);if(!r){r=this.panel_doc.createElement("div");r.style.display="none";this.viewNode.appendChild(r);this.buttonViews[q]=r}r.innerHTML=s;this.showButtonView(q)},clearAllButtonView:function(){var r=this.buttonViews,s=this.viewNode,q=function(t){if(r.hasOwnProperty(t)){s.removeChild(r[t]);delete r[t]}};q("ysPerfButton");q("ysCompsButton");q("ysStatsButton")},showButtonView:function(r){var q,s=this.getButtonView(r);if(!s){YSLOW.util.dump("ERROR: YSLOW.view.showButtonView: Couldn't find ButtonView '"+r+"'.");return}for(q in this.buttonViews){if(this.buttonViews.hasOwnProperty(q)&&q!==r){this.buttonViews[q].style.display="none"}}if(r==="ysPerfButton"){if(this.copyright){this.copyright.style.display="none"}}else{if(this.curButtonId==="ysPerfButton"){if(this.copyright){this.copyright.style.display="block"}}}s.style.display="block";this.curButtonId=r},getButtonView:function(q){return(this.buttonViews.hasOwnProperty(q)?this.buttonViews[q]:undefined)},setButtonView:function(q,s){var r=this.getButtonView(q);if(!r){YSLOW.util.dump("ERROR: YSLOW.view.setButtonView: Couldn't find ButtonView '"+q+"'.");return}r.innerHTML=s;this.showButtonView(q)},setSplashView:function(r,s,t){var w,v="Grade your web pages with YSlow",x="YSlow gives you:",u="
  • Grade based on the performance (you can define your own rules)
  • Summary of the Components in the page
  • Chart with statistics
  • Tools including Smush.It and JSLint
  • ",q="Learn more about YSlow and YDN";if(YSLOW.doc.splash){if(YSLOW.doc.splash.title){v=YSLOW.doc.splash.title}if(YSLOW.doc.splash.content){if(YSLOW.doc.splash.content.header){x=YSLOW.doc.splash.content.header}if(YSLOW.doc.splash.content.text){u=YSLOW.doc.splash.content.text}}if(YSLOW.doc.splash.more_info){q=YSLOW.doc.splash.more_info}}if(typeof t!=="undefined"){YSLOW.hideToolsInfo=t}else{t=YSLOW.hideToolsInfo}if(t){u=u.replace(/
  • Tools[^<]+<\/li>/,"")}w='

    '+v+'

    '+x+'

      '+u+"
    ";if(typeof r!=="undefined"){YSLOW.hideAutoRun=r}else{r=YSLOW.hideAutoRun}if(!r){w+=''}w+='
    ";this.addButtonView("panel_about",w)},genProgressView:function(){var q='

    Finding components in the page:

    Getting component information:

    start...
    ';this.setButtonView("panel_about",q)},updateProgressView:function(q,v){var u,x,y,w,z,r,s,t,A="";if(this.curButtonId==="panel_about"){z=this.getButtonView(this.curButtonId);if(q==="peel"){u=this.getElementByTagNameAndId(z,"div","peelprogress");x=this.getElementByTagNameAndId(z,"div","progbar");y=this.getElementByTagNameAndId(z,"div","progtext");A=v.message;w=(v.current_step*100)/v.total_step}else{if(q==="fetch"){u=this.getElementByTagNameAndId(z,"div","fetchprogress");x=this.getElementByTagNameAndId(z,"div","progbar2");y=this.getElementByTagNameAndId(z,"div","progtext2");A=v.last_component_url;w=(v.current*100)/v.total}else{if(q==="message"){y=this.getElementByTagNameAndId(z,"div","progtext2");if(y){y.innerHTML=v}return}else{return}}}}if(u&&x&&y){r=u.clientWidth;if(w<0){w=0}if(w>100){w=100}w=100-w;s=(r*w)/100;if(s>r){s=r}t=r-parseInt(s,10);x.style.width=parseInt(s,10)+"px";x.style.left=parseInt(t,10)+"px";y.innerHTML=A}},updateStatusBar:function(x){var z,s,A,t,q,r=YSLOW,u=r.util,w=r.view,y=u.Preference,v=this.yscontext;if(!v.PAGE.statusbar){v.PAGE.statusbar=true;if(!v.PAGE.overallScore){r.controller.lint(x,v)}if(!v.PAGE.totalSize){v.collectStats()}z=u.kbSize(v.PAGE.totalSize);s=u.prettyScore(v.PAGE.overallScore);w.setStatusBar(s,"yslow_status_grade");w.setStatusBar(z,"yslow_status_size");if(y.getPref("optinBeacon",false)){t=y.getPref("beaconInfo","basic"),q=y.getPref("beaconUrl","http://rtblab.pclick.yahoo.com/images/ysb.gif");A=u.getResults(v,t);u.sendBeacon(A,t,q)}}},getRulesetListSource:function(q){var u,s,t="",r=YSLOW.controller.getDefaultRulesetId();for(u in q){if(q[u]){t+='"}}return t},updateRulesetList:function(){var u,w,s,t=this.panel_doc.getElementsByTagName("select"),q=YSLOW.controller.getRegisteredRuleset(),r=this.getRulesetListSource(q),v=function(x){this.ownerDocument.ysview.onChangeRuleset(x)};for(u=0;uRulesets ";t+='';t+='";t+='";t+="";return t},show:function(r){var s="html",q="";r=r||this.yscontext.defaultview;if(this.yscontext.component_set===null){YSLOW.controller.run(window.top.content,this.yscontext,false);this.yscontext.defaultview=r}else{if(this.getButtonView(r)){this.showButtonView(r)}else{if("ysCompsButton"===r){q+=this.yscontext.genComponents(s);this.addButtonView("ysCompsButton",q)}else{if("ysStatsButton"===r){q+=this.yscontext.genStats(s);this.addButtonView("ysStatsButton",q);YSLOW.renderer.plotComponents(this.getButtonView("ysStatsButton"),this.yscontext)}else{if("ysToolButton"===r){q+=this.yscontext.genToolsView(s);this.addButtonView("ysToolButton",q)}else{q+=this.yscontext.genPerformance(s);this.addButtonView("ysPerfButton",q)}}}}this.panelNode.scrollTop=0;this.panelNode.scrollLeft=0;this.updateStatusBar(this.yscontext.document);this.updateToolbarSelection()}},updateToolbarSelection:function(){var q,r,s;switch(this.curButtonId){case"ysCompsButton":case"ysPerfButton":case"ysStatsButton":case"ysToolButton":q=this.getElementByTagNameAndId(this.panelNode,"li",this.curButtonId);if(q){if(q.className.indexOf("selected")!==-1){return}else{q.className+=" selected";if(q.previousSibling){q.previousSibling.className+=" off"}}}break;default:break}r=this.getElementByTagNameAndId(this.panelNode,"ul","toolbarLinks");s=r.firstChild;while(s){if(s.id!==this.curButtonId&&s.className.indexOf("selected")!==-1){this.unselect(s);if(s.previousSibling){YSLOW.view.removeClassName(s.previousSibling,"off")}}s=s.nextSibling}},showPerformance:function(){this.show("ysPerfButton")},showStats:function(){this.show("ysStatsButton")},showComponents:function(){this.show("ysCompsButton")},showTools:function(){this.show("ysToolButton")},showRuleSettings:function(){var q=this.yscontext.genRulesetEditView("html");this.addButtonView("ysRuleEditButton",q);this.panelNode.scrollTop=0;this.panelNode.scrollLeft=0;this.updateToolbarSelection()},runTest:function(){YSLOW.controller.run(window.top.content,this.yscontext,false)},setAutorun:function(q){YSLOW.util.Preference.setPref("extensions.yslow.autorun",q)},setAntiIframe:function(q){YSLOW.antiIframe=q},addCDN:function(z){var t,r,v=this,x=document,A=v.yscontext,B=YSLOW.util.Preference,w=B.getPref("cdnHostnames",""),q=v.panel_doc,s=q.getElementById("tab-label-list"),y=s.getElementsByTagName("li"),u=y.length;if(w){w=w.replace(/\s+/g,"").split(",");w.push(z);w=w.join()}else{w=z}B.setPref("extensions.yslow.cdnHostnames",w);for(t=0;t-1){r=s.id;break}}YSLOW.controller.lint(A.document,A);v.addButtonView("ysPerfButton",A.genPerformance("html"));YSLOW.view.restoreStatusBar(A);v.updateToolbarSelection();s=q.getElementById(r);v.onclickTabLabel({currentTarget:s},true)},onChangeRuleset:function(t){var u,r,v,w,q=YSLOW.util.getCurrentTarget(t),s=q.options[q.selectedIndex];YSLOW.controller.setDefaultRuleset(s.value);u=q.ownerDocument;r="Do you want to run the selected ruleset now?";v="Run Test";w=function(y){var x;u.ysview.closeDialog(u);if(u.yslowContext.component_set===null){YSLOW.controller.run(u.yslowContext.document.defaultView||u.yslowContext.document.parentWindow,u.yslowContext,false)}else{YSLOW.controller.lint(u.yslowContext.document,u.yslowContext)}x=u.yslowContext.genPerformance("html");u.ysview.addButtonView("ysPerfButton",x);u.ysview.panelNode.scrollTop=0;u.ysview.panelNode.scrollLeft=0;YSLOW.view.restoreStatusBar(u.yslowContext);u.ysview.updateToolbarSelection()};this.openDialog(u,389,150,r,undefined,v,w)},onclickTabLabel:function(q,w){var s,r,t,y,A,z,v,B=YSLOW.util.getCurrentTarget(q),x=B.parentNode,u=x.nextSibling;if(B.className.indexOf("selected")!==-1||B.id.indexOf("label")===-1){return false}if(x){s=x.firstChild;while(s){if(this.unselect(s)){r=s.id.substring(5);break}s=s.nextSibling}B.className+=" selected";t=B.id.substring(5);s=u.firstChild;while(s){v=s.id.substring(3);if(!y&&r&&v===r){if(s.className.indexOf("yui-hidden")===-1){s.className+=" yui-hidden"}y=true}if(!A&&t&&v===t){YSLOW.view.removeClassName(s,"yui-hidden");A=true;z=s}if((y||!r)&&(A||!t)){break}s=s.nextSibling}if(w===true&&A===true&&z){this.positionResultTab(z,u,B)}}return false},positionResultTab:function(r,q,w){var u,z,A,v=5,x=this.panel_doc,t=x.defaultView||x.parentWindow,s=t.offsetHeight?t.offsetHeight:t.innerHeight,B=w.offsetTop+r.offsetHeight;q.style.height=B+"px";r.style.position="absolute";r.style.left=w.offsetLeft+w.offsetWidth+"px";r.style.top=w.offsetTop+"px";u=r.offsetTop;z=r.offsetParent;while(z!==null){u+=z.offsetTop;z=z.offsetParent}if(uthis.panelNode.scrollTop+s){if(uu-this.panelNode.scrollTop){A=u-this.panelNode.scrollTop}this.panelNode.scrollTop+=A}}},onclickResult:function(q){YSLOW.util.preventDefault(q);return this.onclickTabLabel(q,true)},unselect:function(q){return YSLOW.view.removeClassName(q,"selected")},filterResult:function(z,q){var v,u,r,w,s,x,t,y=this.getButtonView("ysPerfButton");if(q==="all"){u=true}if(y){v=this.getElementByTagNameAndId(y,"ul","tab-label-list")}if(v){r=v.firstChild;t=v.nextSibling;s=t.firstChild;while(r){YSLOW.view.removeClassName(r,"first");if(u||r.className.indexOf(q)!==-1){r.style.display="block";if(w===undefined){w=s;x=r;YSLOW.view.removeClassName(s,"yui-hidden");r.className+=" first";if(r.className.indexOf("selected")===-1){r.className+=" selected"}r=r.nextSibling;s=s.nextSibling;continue}}else{r.style.display="none"}if(s.className.indexOf("yui-hidden")===-1){s.className+=" yui-hidden"}this.unselect(r);r=r.nextSibling;s=s.nextSibling}if(w){this.positionResultTab(w,t,x)}}},updateFilterSelection:function(s){var q,r=YSLOW.util.getCurrentTarget(s);YSLOW.util.preventDefault(s);if(r.className.indexOf("selected")!==-1){return}r.className+=" selected";q=r.parentNode.firstChild;while(q){if(q!==r&&this.unselect(q)){break}q=q.nextSibling}this.filterResult(r.ownerDocument,r.id)},onclickToolbarMenu:function(q){var u,s=YSLOW.util.getCurrentTarget(q),t=s.parentNode,r=t.parentNode;if(t.className.indexOf("selected")!==-1){return}t.className+=" selected";if(t.previousSibling){t.previousSibling.className+=" off"}if(r){u=r.firstChild;while(u){if(u!==t&&this.unselect(u)){if(u.previousSibling){YSLOW.view.removeClassName(u.previousSibling,"off")}break}u=u.nextSibling}}},expandCollapseComponentType:function(u,r){var s,t=YSLOW.controller.getRenderer("html"),q=this.getButtonView("ysCompsButton");if(q){s=this.getElementByTagNameAndId(q,"table","components-table");t.expandCollapseComponentType(u,s,r)}},expandAll:function(t){var r,s=YSLOW.controller.getRenderer("html"),q=this.getButtonView("ysCompsButton");if(q){r=this.getElementByTagNameAndId(q,"table","components-table");s.expandAllComponentType(t,r)}},regenComponentsTable:function(v,u,r){var s,t=YSLOW.controller.getRenderer("html"),q=this.getButtonView("ysCompsButton");if(q){s=this.getElementByTagNameAndId(q,"table","components-table");t.regenComponentsTable(v,s,u,r,this.yscontext.component_set)}},showComponentHeaders:function(s){var r,t,q=this.getButtonView("ysCompsButton");if(q){r=this.getElementByTagNameAndId(q,"tr",s);if(r){t=r.firstChild;if(r.style.display==="none"){r.style.display="table-row"}else{r.style.display="none"}}}},openLink:function(q){YSLOW.util.openLink(q)},openPopup:function(s,r,u,q,t){window.open(s,r||"_blank","width="+(u||626)+",height="+(q||436)+","+(t||"toolbar=0,status=1,location=1,resizable=1"))},runTool:function(q,r){YSLOW.controller.runTool(q,this.yscontext,r)},onclickRuleset:function(v){var s,r,q,u,w=YSLOW.util.getCurrentTarget(v),t=w.className.indexOf("ruleset-");YSLOW.util.preventDefault(v);if(t!==-1){r=w.className.indexOf(" ",t+8);if(r!==-1){s=w.className.substring(t+8,r)}else{s=w.className.substring(t+8)}q=this.getButtonView("ysRuleEditButton");if(q){u=this.getElementByTagNameAndId(q,"form","edit-form");YSLOW.renderer.initRulesetEditForm(w.ownerDocument,u,YSLOW.controller.getRuleset(s))}}return this.onclickTabLabel(v,false)},openSaveAsDialog:function(s,r){var q='',t="Save",u=function(B){var y,w,v,z,x,A=YSLOW.util.getCurrentTarget(B).ownerDocument;if(A.ysview.modaldlg){y=A.ysview.getElementByTagNameAndId(A.ysview.modaldlg,"input","saveas-name")}if(y){if(YSLOW.controller.checkRulesetName(y.value)===true){w=q+'
    '+y.value+" ruleset already exists.
    ";A.ysview.closeDialog(A);A.ysview.openDialog(A,389,150,w,"",t,u)}else{v=A.ysview.getButtonView("ysRuleEditButton");if(v){z=A.ysview.getElementByTagNameAndId(v,"form",r);x=A.createElement("input");x.type="hidden";x.name="saveas-name";x.value=y.value;z.appendChild(x);z.submit()}A.ysview.closeDialog(A)}}};this.openDialog(s,389,150,q,undefined,t,u)},openPrintableDialog:function(t){var s="Please run YSlow first before using Printable View.",r="Check which information you want to view or print
    ",q='
    ',u="Ok",v=function(y){var w,x=YSLOW.util.getCurrentTarget(y).ownerDocument,A=x.getElementsByName("print-type"),z={};for(w=0;w0){for(q=0;q0){if(J[E].className==="dialog-box"){G=J[E]}else{if(J[E].className==="dialog-text"){z=J[E]}else{if(J[E].className==="dialog-more-text"){y=J[E]}}}}}if(H&&G&&z&&y){z.innerHTML=(x?x:"");y.innerHTML=(w?w:"");r=H.getElementsByTagName("input");for(D=0;D0)?s:225)+"px";G.style.top=((A&&A>0)?A:80)+"px";H.style.left=this.panelNode.scrollLeft+"px";H.style.top=this.panelNode.scrollTop+"px";H.style.display="block";if(r.length>0){r[0].focus()}}},closeDialog:function(r){var q=this.modaldlg;q.style.display="none"},saveRuleset:function(u,r){var s,t=YSLOW.controller.getRenderer("html"),q=this.getButtonView("ysRuleEditButton");if(q){s=this.getElementByTagNameAndId(q,"form",r);t.saveRuleset(u,s)}},deleteRuleset:function(u,r){var s,t=YSLOW.controller.getRenderer("html"),q=this.getButtonView("ysRuleEditButton");if(q){s=this.getElementByTagNameAndId(q,"form",r);t.deleteRuleset(u,s)}},shareRuleset:function(v,t){var q,x,u,y,w,r=YSLOW.controller.getRenderer("html"),s=this.getButtonView("ysRuleEditButton");if(s){q=this.getElementByTagNameAndId(s,"form",t);x=r.getEditFormRulesetId(q);u=YSLOW.controller.getRuleset(x);if(u){y=YSLOW.Exporter.exportRuleset(u);if(y){w="";this.openDialog(v,389,150,w,"","Ok")}}}},createRuleset:function(s,r){var q,t,v=s.parentNode,u=v.parentNode,w=u.firstChild;while(w){this.unselect(w);w=w.nextSibling}q=this.getButtonView("ysRuleEditButton");if(q){t=this.getElementByTagNameAndId(q,"form",r);YSLOW.renderer.initRulesetEditForm(this.panel_doc,t)}},showHideHelp:function(){var q,r=this.getElementByTagNameAndId(this.panelNode,"div","toolbarDiv");if(r){q=this.getElementByTagNameAndId(r,"div","helpDiv")}if(q){if(q.style.visibility==="visible"){q.style.visibility="hidden"}else{q.style.visibility="visible"}}},smushIt:function(r,q){YSLOW.util.smushIt(q,function(w){var u,t,v,x,s="";if(w.error){s+="
    "+w.error+"
    "}else{v=YSLOW.util.getSmushUrl();x=YSLOW.util.makeAbsoluteUrl(w.dest,v);s+="
    Original size: "+w.src_size+" bytes
    Result size: "+w.dest_size+" bytes
    % Savings: "+w.percent+"%
    "}u='
    Image: '+YSLOW.util.briefUrl(q,250)+"
    ";t=s;r.ysview.openDialog(r,389,150,u,t,"Ok")})},checkAllRules:function(v,s,r){var t,q,u,w;if(typeof r!=="boolean"){return}q=this.getButtonView("ysRuleEditButton");if(q){u=this.getElementByTagNameAndId(q,"form",s);w=u.elements;for(t=0;tD||H>q){this.tooltip.style.display="none";return}F=w.offsetParent;while(F!==null){B+=F.offsetLeft;A+=F.offsetTop;F=F.offsetParent}B+=w.offsetLeft;A+=w.offsetTop;if(BE.ysview.panelNode.scrollTop+q)){this.tooltip.style.display="none";return}t=B+w.offsetWidth/2;s=A+w.offsetHeight/2;if(B+w.offsetWidth+C+u=E.ysview.panelNode.scrollTop)&&(A-C+H+C<=E.ysview.panelNode.scrollTop+q)){A=A-C;r="right top"}else{A+=w.offsetHeight-H;r="right bottom"}}else{if(A-H-C>=E.ysview.panelNode.scrollTop){A-=H+C;r="top"}else{A+=w.offsetHeight+C;r="bottom"}z=Math.floor(t-u/2);if((z>=E.ysview.panelNode.scrollLeft)&&(z+u<=E.ysview.panelNode.scrollLeft+D)){B=z}else{if(z0&&q&&q.length>0){t=s.className.split(" ");for(r=0;r0){y[q]=w[q]}C+=w[q]}}return{total_size:C,num_requests:r,count_obj:v,size_obj:w,canvas_data:y}},collectStats:function(){var q=this.computeStats();if(q!==undefined){this.PAGE.totalSize=q.total_size;this.PAGE.totalRequests=q.num_requests;this.PAGE.totalObjCount=q.count_obj;this.PAGE.totalObjSize=q.size_obj;this.PAGE.canvas_data.empty=q.canvas_data}q=this.computeStats(true);if(q){this.PAGE.totalSizePrimed=q.total_size;this.PAGE.totalRequestsPrimed=q.num_requests;this.PAGE.totalObjCountPrimed=q.count_obj;this.PAGE.totalObjSizePrimed=q.size_obj;this.PAGE.canvas_data.primed=q.canvas_data}},genPerformance:function(r,q){if(this.result_set===null){if(!q){q=this.document}YSLOW.controller.lint(q,this)}return YSLOW.controller.render(r,"reportcard",{result_set:this.result_set})},genStats:function(r){var q={};if(!this.PAGE.totalSize){this.collectStats()}q.PAGE=this.PAGE;return YSLOW.controller.render(r,"stats",{stats:q})},genComponents:function(q){if(!this.PAGE.totalSize){this.collectStats()}return YSLOW.controller.render(q,"components",{comps:this.component_set.components,total_size:this.PAGE.totalSize})},genToolsView:function(r){var q=YSLOW.Tools.getAllTools();return YSLOW.controller.render(r,"tools",{tools:q})},genRulesetEditView:function(q){return YSLOW.controller.render(q,"rulesetEdit",{rulesets:YSLOW.controller.getRegisteredRuleset()})}};YSLOW.renderer={sortBy:"type",sortDesc:false,bPrintable:false,colors:{doc:"#8963df",redirect:"#FC8C8C",iframe:"#FFDFDF",xhr:"#89631f",flash:"#8D4F5B",js:"#9fd0e8",css:"#aba5eb",cssimage:"#677ab8",image:"#d375cd",favicon:"#a26c00",unknown:"#888888"},reset:function(){this.sortBy="type";this.sortDesc=false},genStats:function(y,z){var v,w,s,r,B,x,q,u,t="",A=0;if(!y.PAGE){return""}if(z){v=y.PAGE.totalObjCountPrimed;w=y.PAGE.totalObjSizePrimed;s=y.PAGE.totalRequestsPrimed;A=y.PAGE.totalSizePrimed}else{v=y.PAGE.totalObjCount;w=y.PAGE.totalObjSize;s=y.PAGE.totalRequests;A=y.PAGE.totalSize}r=YSLOW.peeler.types;B=(z)?"primed":"empty";for(x=0;x
     
    '+v[q]+''+YSLOW.util.prettyType(q)+''+YSLOW.util.kbSize(w[q])+""}}u='
    HTTP Requests - '+s+'
    Total Weight - '+YSLOW.util.kbSize(A)+'
    '+t+"
    ";return u},plotComponents:function(q,r){if(typeof q!=="object"){return}this.plotOne(q,r.PAGE.canvas_data.empty,r.PAGE.totalSize,"comp-canvas-empty");this.plotOne(q,r.PAGE.canvas_data.primed,r.PAGE.totalSizePrimed,"comp-canvas-primed")},plotOne:function(A,t,z,y){var s,u,C,r,x,q,w,D,v,B=A.getElementsByTagName("canvas");for(u=0;u'+YSLOW.util.escapeHtml(q.headers[s])+""}}if(q.req_headers){r+='Request Headers';for(s in q.req_headers){if(q.req_headers.hasOwnProperty(s)&&q.req_headers[s]){r+=''+YSLOW.util.escapeHtml(YSLOW.util.formatHeaderName(s))+'

    '+YSLOW.util.escapeHtml(q.req_headers[s])+"

    "}}}r+="";return r},genComponentRow:function(w,v,r,u){var s,A,t,q,z,y,x;if(typeof r!=="string"){r=""}if(v.status>=400&&v.status<500){r+=" compError"}if(v.after_onload===true){r+=" afteronload"}s="compHeaders"+v.id;A='";for(t in w){if(w.hasOwnProperty(t)){q=t;z="";if(t==="type"){z+=v[t];if(v.is_beacon){z+=" †"}if(v.after_onload){z+=" *"}}else{if(t==="size"){z+=YSLOW.util.kbSize(v.size)}else{if(t==="url"){if(v.status>=400&&v.status<500){A+=''+v[t]+" (status: "+v.status+")";continue}else{z+=YSLOW.util.prettyAnchor(v[t],v[t],undefined,!YSLOW.renderer.bPrintable,100,1,v.type)}}else{if(t==="gzip"&&(v.compressed==="gzip"||v.compressed==="deflate")){z+=(v.size_compressed!==undefined?YSLOW.util.kbSize(v.size_compressed):"uncertain")}else{if(t==="set-cookie"){y=v.getSetCookieSize();z+=y>0?y:""}else{if(t==="cookie"){x=v.getReceivedCookieSize();z+=x>0?x:""}else{if(t==="etag"){z+=v.getEtag()}else{if(t==="expires"){z+=YSLOW.util.prettyExpiresDate(v.expires)}else{if(t==="headers"){if(YSLOW.renderer.bPrintable){continue}if(v.raw_headers&&v.raw_headers.length>0){z+="'}}else{if(t==="action"){if(YSLOW.renderer.bPrintable){continue}if(v.type==="cssimage"||v.type==="image"){if(v.response_type===undefined||v.response_type==="image"){z+="smush.it"}}}else{if(v[t]!==undefined){z+=v[t]}}}}}}}}}}}A+=''+z+""}}A+="";if(v.raw_headers&&v.raw_headers.length>0){A+=''+this.getComponentHeadersTable(v)+""}return A},componentSortCallback:function(q,y){var r,t,u,w="",v="",x=YSLOW.renderer.sortBy,s=YSLOW.renderer.sortDesc;switch(x){case"type":w=q.type;v=y.type;break;case"size":w=q.size?Number(q.size):0;v=y.size?Number(y.size):0;break;case"gzip":w=q.size_compressed?Number(q.size_compressed):0;v=y.size_compressed?Number(y.size_compressed):0;break;case"set-cookie":w=q.getSetCookieSize();v=y.getSetCookieSize();break;case"cookie":w=q.getReceivedCookieSize();v=y.getReceivedCookieSize();break;case"headers":break;case"url":w=q.url;v=y.url;break;case"respTime":w=q.respTime?Number(q.respTime):0;v=y.respTime?Number(y.respTime):0;break;case"etag":w=q.getEtag();v=y.getEtag();break;case"action":if(q.type==="cssimage"||q.type==="image"){w="smush.it"}if(y.type==="cssimage"||y.type==="image"){v="smush.it"}break;case"expires":w=q.expires||0;v=y.expires||0;break}if(w===v){if(q.id>y.id){return(s)?-1:1}if(q.idv){return(s)?-1:1}if(w',v='
    ',t='
    ';for(q in A){if(A.hasOwnProperty(q)&&A[q]){y=A[q];s='
    ";if(z.rules[q]!==undefined){B+=1}if(z.weights!==undefined&&z.weights[q]!==undefined){w+=''}r=(u%3);switch(r){case 0:x+=s;break;case 1:v+=s;break;case 2:t+=s;break}u+=1}}x+="
    ";v+="
    ";t+="";return'

    '+z.name+' Ruleset (includes '+parseInt(B,10)+" of "+parseInt(u,10)+' rules)

    '+x+""+v+""+t+'
    '+w+"
    "},genRulesetEditForm:function(q){var r="";r+='
    '+YSLOW.renderer.genRulesCheckbox(q)+'
    ';return r},initRulesetEditForm:function(I,r,D){var C,F,E,B,G,K,w,J,v,y,q,u,A,s=r.elements,t="",z=[],x=0,H=0;for(F=0;F'}x+=1}}q.innerHTML="(includes "+parseInt(x,10)+" of "+parseInt(H,10)+" rules)";K.innerHTML='';w.innerHTML='';J.innerHTML=D.name}else{K.innerHTML="";w.innerHTML="";J.innerHTML="New";q.innerHTML=""}v.innerHTML=t}};YSLOW.registerRenderer({id:"html",supports:{components:1,reportcard:1,stats:1,tools:1,rulesetEdit:1},genComponentsTable:function(r,C,v){var A,y,B,z,u={type:"TYPE",size:"SIZE
    (KB)",gzip:"GZIP
    (KB)","set-cookie":"COOKIE RECEIVED
    (bytes)",cookie:"COOKIE SENT
    (bytes)",headers:"HEADERS",url:"URL",expires:"EXPIRES
    (Y/M/D)",respTime:"RESPONSE
    TIME (ms)",etag:"ETAG",action:"ACTION"},x=false,t="",w="",q=0,s=0;if(C!==undefined&&u[C]===undefined){return""}if(YSLOW.renderer.bPrintable){C=YSLOW.renderer.sortBy;v=YSLOW.renderer.sortDesc}else{if(C===undefined||C==="type"){C="type";x=true}}r=YSLOW.renderer.sortComponents(r,C,v);t+='';for(A in u){if(u.hasOwnProperty(A)&&u[A]){if(YSLOW.renderer.bPrintable&&(A==="action"||A==="components"||A==="headers")){continue}t+="'+(C===A?(v?"↓":"↑"):"")+" "+u[A]+""}}}t+="";for(y=0;y";t+=w;w="";q=0;s=0;B=z.type}}w+=YSLOW.renderer.genComponentRow(u,z,(q%2===0?"even":"odd"),x);q+=1;s+=z.size}else{t+=YSLOW.renderer.genComponentRow(u,z,(y%2===0?"even":"odd"),false)}}if(w.length>0){t+='";t+=w}t+="
    '+B+" ("+q+')'+YSLOW.util.kbSize(s)+"
    '+B+" ("+q+')'+YSLOW.util.kbSize(s)+"
    ";return t},componentsView:function(w,r){var t,s=this.genComponentsTable(w,YSLOW.renderer.sortBy,false),u="in type column indicates the component is loaded after window onload event.",q="denotes 1x1 pixels image that may be image beacon",v="Components";if(YSLOW.doc){if(YSLOW.doc.components_legend){if(YSLOW.doc.components_legend.beacon){u=YSLOW.doc.components_legend.beacon}if(YSLOW.doc.components_legend.after_onload){q=YSLOW.doc.components_legend.after_onload}}if(YSLOW.doc.view_names&&YSLOW.doc.view_names.components){v=YSLOW.doc.view_names.components}}t='
    '+v+'The page has a total of '+w.length+' components and a total weight of '+YSLOW.util.kbSize(r)+' bytes
    '+s+'
    * '+u+"
    † "+q+"
    ";return t},reportcardPrintableView:function(t,r,w){var u,s,y,q,x,v='
    ";for(u=0;u"}}v+="
    Overall Grade: '+r+" (Ruleset applied: "+w.name+")
    '+q+'

    '+y.name+'

    '+y.message+"
    ";if(y.components&&y.components.length>0){v+='
      ';for(s=0;s"+y.components[s]+""}else{if(y.components[s].url!==undefined){v+="
    • "+YSLOW.util.briefUrl(y.components[s].url,60)+"
    • "}}}v+="

    "}v+="

    ";return v},getFilterCode:function(x,u,s,q){var w,r,v,y,B,C,t,A=u.length,z=[];for(r in x){if(x.hasOwnProperty(r)&&x[r]){z.push(r)}}z.sort();w='
    • ALL ('+A+')
    • FILTER BY:
    • ';for(v=0,y=z.length;v'+z[v].toUpperCase()+" ("+x[z[v]]+")"}B="http://yslow.org/scoremeter/?url="+encodeURIComponent(q)+"&grade="+s;for(v=0;v=0&&t<100){B+="&"+C.rule_id.toLowerCase()+"="+t}}B=encodeURIComponent(encodeURIComponent(B));q=encodeURIComponent(encodeURIComponent(q.slice(0,60)+(q.length>60?"...":"")));w+='";w+='";w+="
    ";return w},reportcardView:function(s){var w,H,F,E,x,r,v,L,B,I,K,J,q,u,y='
    ',G=s.getRulesetApplied(),A=s.getResults(),t=s.url,M="Grade",D="",C="",z={};if(YSLOW.doc){if(YSLOW.doc.view_names&&YSLOW.doc.view_names.grade){M=YSLOW.doc.view_names.grade}}w=YSLOW.util.prettyScore(s.getOverallScore());if(YSLOW.renderer.bPrintable){return this.reportcardPrintableView(A,w,G)}y+='
    '+M+'
    '+w+'
    Overall performance score '+Math.round(s.getOverallScore())+'Ruleset applied: '+G.name+'URL: '+YSLOW.util.briefUrl(t,100)+"
    ";for(H=0;H0){L+=" "}L+=x.category[E];if(z[x.category[E]]===undefined){z[x.category[E]]=0}z[x.category[E]]+=1}}if(L.length>0){D+=' class="'+L+'"'}D+=' onclick="javascript:document.ysview.onclickResult(event)">
    '+r+''+x.name+"
  • ";C+='
    ")}C+='">

    Grade '+r+" on "+x.name+"

    "+x.message+"
    ";if(x.components&&x.components.length>0){C+='

      ';for(F=0;F"+J+""}else{if(J.url!==undefined){C+="
    • ";q=x.rule_id.toLowerCase();if(x.rule_id.match("expires")){C+="("+YSLOW.util.prettyExpiresDate(J.expires)+") "}C+=YSLOW.util.prettyAnchor(J.url,J.url,undefined,true,120,undefined,J.type)+"
    • "}}}C+="

    "}C+="

    ";u=YSLOW.controller.getRule(x.rule_id);if(u){C+='

    '+(u.info||"** To be added **")+"

    ";if(u.url!==undefined){C+='

    »Read More

    "}}C+="
    "}}y+='
    '+this.getFilterCode(z,A,w,t)+'
      '+D+'
    '+C+'
    '+YSLOW.doc.copyright+"
    ";return y},statsView:function(r){var q="",s="Stats";if(YSLOW.doc){if(YSLOW.doc.view_names&&YSLOW.doc.view_names.stats){s=YSLOW.doc.view_names.stats}}q+='
    '+s+'The page has a total of '+r.PAGE.totalRequests+' HTTP requests and a total weight of '+YSLOW.util.kbSize(r.PAGE.totalSize)+" bytes with empty cache
    ";q+='
    WEIGHT GRAPHS
    ';q+='
    Empty Cache
    '+YSLOW.renderer.genStats(r,false)+"
    ";q+='
    Primed Cache
    '+YSLOW.renderer.genStats(r,true)+"
    ";q+="
    ";return q},toolsView:function(u){var t,s,r,q="",w="Tools",v="Click the Launch Tool link next to the tool you want to run to start the tool.";if(YSLOW.doc){if(YSLOW.doc.tools_desc){v=YSLOW.doc.tools_desc}if(YSLOW.doc.view_names&&YSLOW.doc.view_names.tools){w=YSLOW.doc.view_names.tools}}for(t=0;t"}q+="
    "+r.name+"-"+(r.short_desc||"Short text here explaining what are the main benefits of running this App")+"
    ";s='
    '+w+""+v+'
    '+q+"
    ";return s},rulesetEditView:function(D){var s,B,u,t,w='
    ',C,z,y=0,r=false,q,v,A="Rule Settings",x="Choose which ruleset better fit your specific needs. You can Save As an existing rule, based on an existing ruleset.";if(YSLOW.doc){if(YSLOW.doc.rulesettings_desc){x=YSLOW.doc.rulesettings_desc}if(YSLOW.doc.view_names&&YSLOW.doc.view_names.rulesetedit){A=YSLOW.doc.view_names.rulesetedit}}v=YSLOW.controller.getDefaultRulesetId();C='
    • STANDARD SETS
    • ';for(s in D){if(D.hasOwnProperty(s)&&D[s]){B=D[s];u="tab"+y;if(!r&&B.custom===true){C+='
    • CUSTOM SETS
    • ';r=true}C+='
    • '+B.name+"
    • ";y+=1}}C+='
    ';z='
    '+YSLOW.renderer.genRulesetEditForm(q)+"
    ";w+=C+z;t='
    '+A+""+x+"
    "+w+"
    ";return t},rulesetEditUpdateTab:function(I,q,C,r,A){var s,B,F,u,z,G,D,x,t,y,H,E,v,w=q.parentNode.parentNode.parentNode;if(w&&w.id==="settingsDiv"&&C.custom===true){s=w.firstChild;B=s.nextSibling;if(r<1){F=s.firstChild;while(F){u=F.className.indexOf("ruleset-");if(u!==-1){z=F.className.substring(u+8);u=z.indexOf(" ");if(u!==-1){z=z.substring(0,u)}if(C.id===z){u=F.id.indexOf("label");if(u!==-1){G=F.id.substring(u+5);if(F.className.indexOf("selected")!==-1){D={};D.currentTarget=H;I.ysview.onclickRuleset(D)}if(F.previousSibling&&F.previousSibling.id==="custom-set-title"&&F.nextSibling&&F.nextSibling.id==="create-ruleset"){x=F.previousSibling}s.removeChild(F);if(x){s.removeChild(x)}}break}else{H=F}}F=F.nextSibling}}else{F=s.lastChild;while(F){y=F.id.indexOf("label");if(y!==-1){t=F.id.substring(y+5);break}F=F.previousSibling}t=Number(t)+1;F=I.createElement("li");F.className="ruleset-"+C.id;F.id="label"+t;F.onclick=function(J){I.ysview.onclickRuleset(J)};F.innerHTML=''+C.name+"";s.insertBefore(F,s.lastChild);E=s.firstChild;while(E){if(E.id&&E.id==="custom-set-title"){x=E;break}E=E.nextSibling}if(!x){x=I.createElement("li");x.className="new-section header";x.id="custom-set-title";x.innerHTML="CUSTOM SETS";s.insertBefore(x,F)}if(A){v={};v.currentTarget=F;I.ysview.onclickRuleset(v)}}}},hasClassName:function(t,q){var r,s=t.split(" ");if(s){for(r=0;r";s+=""+u[t].type+"";s+=""+u[t].size+"";if(u[t].compressed===false){s+=""}else{s+=""+(u[t].size_compressed!==undefined?parseInt(u[t].size_compressed,10):"uncertain")+""}q=u[t].getSetCookieSize();if(q>0){s+=""+parseInt(q,10)+""}q=u[t].getReceivedCookieSize();if(q>0){s+=""+parseInt(q,10)+""}s+=""+encodeURI(u[t].url)+"";s+=""+u[t].expires+"";s+=""+u[t].respTime+"";s+=""+u[t].getEtag()+"";s+=""}s+="";return s},reportcardView:function(w){var t,r,y,u=w.getOverallScore(),s=YSLOW.util.prettyScore(u),x=w.getRulesetApplied(),v=w.getResults(),q='';q+='';for(t=0;t';q+=""+y.message+"";if(v.components&&v.components.length>0){q+="";for(r=0;r"+y.components[r]+""}else{if(y.components[r].url!==undefined){q+=""+y.components[r].url+""}}}q+=""}q+=""}q+="";return q},statsView:function(t){var s,w,r,v='',u='',q=YSLOW.peeler.types;for(s=0;s'}if((t.PAGE.totalObjCount[w])!==undefined){u+=''}}v+="";u+="";r=''+v+u+"";return r}});YSLOW.peeler={types:["doc","js","css","iframe","flash","cssimage","image","favicon","xhr","redirect","font"],NODETYPE:{ELEMENT:1,DOCUMENT:9},CSSRULE:{IMPORT_RULE:3,FONT_FACE_RULE:5},peel:function(q,r){},findDocuments:function(r){var y,B,u,z,v,w,q,C,A,s={};YSLOW.util.event.fire("peelProgress",{total_step:7,current_step:1,message:"Finding documents"});if(!r){return}if(!YSLOW.util.Preference.getPref("extensions.yslow.getFramesComponents",true)){s[r.URL]={document:r,type:"doc"};return s}z="doc";if(r.nodeType===this.NODETYPE.DOCUMENT){B=r;u=r.URL}else{if(r.nodeType===this.NODETYPE.ELEMENT&&r.nodeName.toLowerCase()==="frame"){B=r.contentDocument;u=r.src}else{if(r.nodeType===this.NODETYPE.ELEMENT&&r.nodeName.toLowerCase()==="iframe"){B=r.contentDocument;u=r.src;z="iframe";try{A=r.contentWindow;A=A&&A.parent;A=A&&A.document;A=A||r.ownerDocument;if(A&&A.URL===u){u=!r.getAttribute("src")?"":"about:blank"}}catch(t){YSLOW.util.dump(t)}}else{return s}}}s[u]={document:B,type:z};try{y=B.getElementsByTagName("iframe");for(v=0,w=y.length;v0){for(s=0;s0){for(s=0;s specify the information to display/log (basic|grade|stats|comps|all) [all]"," -f, --format specify the output results format (json|xml|plain|tap|junit) [json]"," -r, --ruleset specify the YSlow performance ruleset to be used (ydefault|yslow1|yblog) [ydefault]"," -b, --beacon specify an URL to log the results"," -d, --dict include dictionary of results fields"," -v, --verbose output beacon response information"," -t, --threshold for test formats, the threshold to test scores ([0-100]|[A-F]|{JSON}) [80]",' e.g.: -t B or -t 75 or -t \'{"overall": "B", "ycdn": "F", "yexpires": 85}\'',' -u, --ua "" specify the user agent string sent to server when the page requests resources'," -vp, --viewport specify page viewport size WxY, where W = width and H = height [400x300]",' -ch, --headers specify custom request headers, e.g.: -ch \'{"Cookie": "foo=bar"}\''," -c, --console output page console messages (0: none, 1: message, 2: message + line + source) [0]",""," Examples:",""," phantomjs "+phantom.scriptName+" http://yslow.org"," phantomjs "+phantom.scriptName+" -i grade -f xml www.yahoo.com www.cnn.com www.nytimes.com"," phantomjs "+phantom.scriptName+' -info all --format plain --ua "MSIE 9.0" http://yslow.org'," phantomjs "+phantom.scriptName+" -i basic --rulseset yslow1 -d http://yslow.org"," phantomjs "+phantom.scriptName+" -i grade -b http://www.showslow.com/beacon/yslow/ -v yslow.org"," phantomjs --load-plugins=yes "+phantom.scriptName+" -vp 800x600 http://www.yahoo.com"," phantomjs "+phantom.scriptName+" -i grade -f tap -t 85 http://yslow.org",""].join("\n"));phantom.exit()}yslowArgs.dict=unaryArgs.dict;yslowArgs.verbose=unaryArgs.verbose;urls.forEach(function(a){var c=webpage.create();c.resources={};c.settings.webSecurityEnabled=false;c.onResourceRequested=function(d){c.resources[d.url]={request:d}};c.onResourceReceived=function(d){var e,f=c.resources[d.url].response;if(!f){c.resources[d.url].response=d}else{for(e in d){if(d.hasOwnProperty(e)){f[e]=d[e]}}}};yslowArgs.console=parseInt(yslowArgs.console,10)||0;if(yslowArgs.console){if(yslowArgs.console===1){c.onConsoleMessage=function(d){console.log(d)}}else{c.onConsoleMessage=function(f,d,e){console.log(JSON.stringify({message:f,lineNumber:d,source:e},null,4))}}}if(yslowArgs.ua){c.settings.userAgent=yslowArgs.ua}if(yslowArgs.viewport){viewport=yslowArgs.viewport.toLowerCase();c.viewportSize={width:parseInt(viewport.slice(0,viewport.indexOf("x")),10)||c.viewportSize.width,height:parseInt(viewport.slice(viewport.indexOf("x")+1),10)||c.viewportSize.height}}if(yslowArgs.headers){try{c.customHeaders=JSON.parse(yslowArgs.headers)}catch(b){console.log("Invalid custom headers: "+b)}}c.startTime=new Date();c.open(a,function(k){var f,j,m,n,l,d,h,e=c.startTime,g=c.resources;if(k!=="success"){console.log("FAIL to load "+d)}else{l=new Date()-e;for(d in g){if(g.hasOwnProperty(d)){h=g[d].response;if(h){h.time=new Date(h.time)-e}}}f=function(){if(typeof YSLOW==="undefined"){YSLOW={}}YSLOW.DEBUG=true;YSLOW.registerRule=function(q){YSLOW.controller.addRule(q)};YSLOW.registerRuleset=function(q){YSLOW.controller.addRuleset(q)};YSLOW.registerRenderer=function(q){YSLOW.controller.addRenderer(q)};YSLOW.registerTool=function(q){YSLOW.Tools.addCustomTool(q)};YSLOW.addEventListener=function(r,s,q){YSLOW.util.event.addListener(r,s,q)};YSLOW.removeEventListener=function(q,r){return YSLOW.util.event.removeListener(q,r)};YSLOW.Error=function(q,r){this.name=q;this.message=r};YSLOW.Error.prototype={toString:function(){return this.name+"\n"+this.message}};YSLOW.version="3.1.4";YSLOW.ComponentSet=function(q,r){this.root_node=q;this.components=[];this.outstanding_net_request=0;this.component_info=[];this.onloadTimestamp=r;this.nextID=1;this.notified_fetch_done=false};YSLOW.ComponentSet.prototype={clear:function(){this.components=[];this.component_info=[];this.cleared=true;if(this.outstanding_net_request>0){YSLOW.util.dump("YSLOW.ComponentSet.Clearing component set before all net requests finish.")}},addComponent:function(t,u,r,w){var q,v,s;if(!t){if(!this.empty_url){this.empty_url=[]}this.empty_url[u]=(this.empty_url[u]||0)+1}if(t&&u){if(!YSLOW.ComponentSet.isValidProtocol(t)||!YSLOW.ComponentSet.isValidURL(t)){return q}t=YSLOW.util.makeAbsoluteUrl(t,r);t=YSLOW.util.escapeHtml(t);v=typeof this.component_info[t]!=="undefined";s=u==="doc";if(!v||s){this.component_info[t]={state:"NONE",count:v?this.component_info[t].count:0};q=new YSLOW.Component(t,u,this,w);if(q){q.id=this.nextID+=1;this.components[this.components.length]=q;if(!this.doc_comp&&s){this.doc_comp=q}if(this.component_info[t].state==="NONE"){this.component_info[t].state="REQUESTED";this.outstanding_net_request+=1}}else{this.component_info[t].state="ERROR";YSLOW.util.event.fire("componentFetchError")}}this.component_info[t].count+=1}return q},addComponentNoDuplicate:function(r,s,q){if(r&&s){r=YSLOW.util.escapeHtml(r);r=YSLOW.util.makeAbsoluteUrl(r,q);if(this.component_info[r]===undefined){return this.addComponent(r,s,q)}}},getComponentsByType:function(D,A,u){var w,v,B,s,E,y,r,x=this.components,C=this.component_info,q=[],z={};if(typeof A==="undefined"){A=!(YSLOW.util.Preference.getPref("excludeAfterOnload",true))}if(typeof u==="undefined"){u=!(YSLOW.util.Preference.getPref("excludeBeaconsFromLint",true))}if(typeof D==="string"){z[D]=1}else{for(w=0,B=D.length;w0){w=u.substr(0,r);for(t=0;t0){w.expires=new Date(r);if(w.expires.toString()==="Invalid Date"){w.expires=w.getMaxAge()}}else{w.expires=w.getMaxAge()}if(w.type==="image"&&!s){if(typeof Image!==B){u=new Image()}else{u=document.createElement("img")}if(w.body.length){y="data:"+w.headers["content-type"]+";base64,"+YSLOW.util.base64Encode(w.body);z=1}else{y=w.url}u.onerror=function(){u.onerror=t;if(z){u.src=w.url}};u.onload=function(){u.onload=t;if(u&&u.width&&u.height){if(w.object_prop){w.object_prop.actual_width=u.width;w.object_prop.actual_height=u.height}else{w.object_prop={width:u.width,height:u.height,actual_width:u.width,actual_height:u.height}}if(u.width<2&&u.height<2){w.is_beacon=true}}};u.src=y}};YSLOW.Component.prototype.hasOldModifiedDate=function(){var q=Number(new Date()),r=this.headers["last-modified"];if(typeof r!=="undefined"){return((q-Number(new Date(r)))>(24*60*60*1000))}return false};YSLOW.Component.prototype.hasFarFutureExpiresOrMaxAge=function(){var t,r=Number(new Date()),s=YSLOW.util.Preference.getPref("minFutureExpiresSeconds",2*24*60*60),q=s*1000;if(typeof this.expires==="object"){t=Number(this.expires);if((t-r)>q){return true}}return false};YSLOW.Component.prototype.getEtag=function(){return this.headers.etag||""};YSLOW.Component.prototype.getMaxAge=function(){var r,s,q,t=this.headers["cache-control"];if(t){r=t.indexOf("max-age");if(r>-1){s=parseInt(t.substring(r+8),10);if(s>0){q=YSLOW.util.maxAgeToDate(s)}}}return q};YSLOW.Component.prototype.getSetCookieSize=function(){var s,q,r=0;if(this.headers&&this.headers["set-cookie"]){s=this.headers["set-cookie"].split("\n");if(s.length>0){for(q=0;q0){s=this.cookie.split("\n");if(s.length>0){for(q=0;qq.parent.onloadTimestamp;q.populateProperties(false,true);q.get_info_state="DONE";q.parent.onComponentGetInfoStateChange({comp:q,state:"DONE"})};if(s.request&&s.response){r(s.request,s.response)}};YSLOW.controller={rules:{},rulesets:{},onloadTimestamp:null,renderers:{},default_ruleset_id:"ydefault",run_pending:0,init:function(){var r,q,t,s;YSLOW.util.event.addListener("onload",function(u){this.onloadTimestamp=u.time;YSLOW.util.setTimer(function(){YSLOW.controller.run_pending_event()})},this);YSLOW.util.event.addListener("onUnload",function(u){this.run_pending=0;this.onloadTimestamp=null},this);r=YSLOW.util.Preference.getPrefList("customRuleset.",undefined);if(r&&r.length>0){for(q=0;q0){t=JSON.parse(s,null);t.custom=true;this.addRuleset(t)}}}this.default_ruleset_id=YSLOW.util.Preference.getPref("defaultRuleset","ydefault");this.loadRulePreference()},run:function(t,u,r){var v,q,s=t.document;if(!s||!s.location||s.location.href.indexOf("about:")===0||"undefined"===typeof s.location.hostname){if(!r){q="Please enter a valid website address before running YSlow.";YSLOW.ysview.openDialog(YSLOW.ysview.panel_doc,389,150,q,"","Ok")}return}if(!u.PAGE.loaded){this.run_pending={win:t,yscontext:u};return}YSLOW.util.event.fire("peelStart",undefined);v=YSLOW.peeler.peel(s,this.onloadTimestamp);u.component_set=v;YSLOW.util.event.fire("peelComplete",{component_set:v});v.notifyPeelDone()},run_pending_event:function(){if(this.run_pending){this.run(this.run_pending.win,this.run_pending.yscontext,false);this.run_pending=0}},lint:function(H,s,q){var t,x,F,w,y,z,G,E=[],C=[],D=0,B=0,u=this,v=u.rulesets,A=u.default_ruleset_id;if(q){E=v[q]}else{if(A&&v[A]){E=v[A]}else{for(F in v){if(v.hasOwnProperty(F)&&v[F]){E=v[F];break}}}}x=E.rules;for(F in x){if(x.hasOwnProperty(F)&&x[F]&&this.rules.hasOwnProperty(F)){try{t=this.rules[F];w=YSLOW.util.merge(t.config,x[F]);y=t.lint(H,s.component_set,w);z=(E.weights?E.weights[F]:undefined);if(z!==undefined){z=parseInt(z,10)}if(z===undefined||z<0||z>100){if(v.ydefault.weights[F]){z=v.ydefault.weights[F]}else{z=5}}y.weight=z;if(y.score!==undefined){if(typeof y.score!=="number"){G=parseInt(y.score,10);if(!isNaN(G)){y.score=G}}if(typeof y.score==="number"){B+=y.weight;if(!YSLOW.util.Preference.getPref("allowNegativeScore",false)){if(y.score<0){y.score=0}if(typeof y.score!=="number"){y.score=-1}}if(y.score!==0){D+=y.score*(typeof y.weight!=="undefined"?y.weight:1)}}}y.name=t.name;y.category=t.category;y.rule_id=F;C[C.length]=y}catch(r){YSLOW.util.dump("YSLOW.controller.lint: "+F,r);YSLOW.util.event.fire("lintError",{rule:F,message:r})}}}s.PAGE.overallScore=D/(B>0?B:1);s.result_set=new YSLOW.ResultSet(C,s.PAGE.overallScore,E);s.result_set.url=s.component_set.doc_comp.url;YSLOW.util.event.fire("lintResultReady",{yslowContext:s});return s.result_set},runTool:function(D,A,r){var G,w,C,v,y,q,B,t,F,E,x,z=YSLOW.Tools.getTool(D);try{if(typeof z==="object"){G=z.run(A.document,A.component_set,r);if(z.print_output){w="";if(typeof G==="object"){w=G.html}else{if(typeof G==="string"){w=G}}C=YSLOW.util.getNewDoc();x=C.body||C.documentElement;x.innerHTML=w;v=C.getElementsByTagName("head")[0];if(typeof G.css==="undefined"){q="chrome://yslow/content/yslow/tool.css";B=new XMLHttpRequest();B.open("GET",q,false);B.send(null);y=B.responseText}else{y=G.css}if(typeof y==="string"){t=C.createElement("style");t.setAttribute("type","text/css");t.appendChild(C.createTextNode(y));v.appendChild(t)}if(typeof G.js!=="undefined"){F=C.createElement("script");F.setAttribute("type","text/javascript");F.appendChild(C.createTextNode(G.js));v.appendChild(F)}if(typeof G.plot_component!=="undefined"&&G.plot_component===true){YSLOW.renderer.plotComponents(C,A)}}}else{E=D+" is not a tool.";YSLOW.util.dump(E);YSLOW.util.event.fire("toolError",{tool_id:D,message:E})}}catch(u){YSLOW.util.dump("YSLOW.controller.runTool: "+D,u);YSLOW.util.event.fire("toolError",{tool_id:D,message:u})}},render:function(u,q,t){var s=this.renderers[u],r="";if(s.supports[q]!==undefined&&s.supports[q]===1){switch(q){case"components":r=s.componentsView(t.comps,t.total_size);break;case"reportcard":r=s.reportcardView(t.result_set);break;case"stats":r=s.statsView(t.stats);break;case"tools":r=s.toolsView(t.tools);break;case"rulesetEdit":r=s.rulesetEditView(t.rulesets);break}}return r},getRenderer:function(q){return this.renderers[q]},addRule:function(s){var q,r,t=["id","name","config","info","lint"];if(YSLOW.doc.rules&&YSLOW.doc.rules[s.id]){r=YSLOW.doc.rules[s.id];if(r.name){s.name=r.name}if(r.info){s.info=r.info}}for(q=0;q0&&r){r.config.howfar=q}}};YSLOW.util={merge:function(r,q){var s,t={};for(s in r){if(r.hasOwnProperty(s)){t[s]=r[s]}}for(s in q){if(q.hasOwnProperty(s)){t[s]=q[s]}}return t},dump:function(){var q;if(!YSLOW.DEBUG){return}q=Array.prototype.slice.apply(arguments);q=q&&q.length===1?q[0]:q;try{if(typeof Firebug!=="undefined"&&Firebug.Console&&Firebug.Console.log){Firebug.Console.log(q)}else{if(typeof Components!=="undefined"&&Components.classes&&Components.interfaces){Components.classes["@mozilla.org/consoleservice;1"].getService(Components.interfaces.nsIConsoleService).logStringMessage(JSON.stringify(q,null,2))}}}catch(s){try{console.log(q)}catch(r){}}},filter:function(t,u,r){var s,q=r?[]:{};for(s in t){if(t.hasOwnProperty(s)&&u(s,t[s])){q[r?q.length:s]=t[s]}}return q},expires_month:{Jan:1,Feb:2,Mar:3,Apr:4,May:5,Jun:6,Jul:7,Aug:8,Sep:9,Oct:10,Nov:11,Dec:12},prettyExpiresDate:function(q){var r;if(Object.prototype.toString.call(q)==="[object Date]"&&q.toString()!=="Invalid Date"&&!isNaN(q)){r=q.getMonth()+1;return q.getFullYear()+"/"+r+"/"+q.getDate()}else{if(!q){return"no expires"}}return"invalid date object"},maxAgeToDate:function(r){var q=new Date();q=q.getTime()+parseInt(r,10)*1000;return new Date(q)},plural:function(s,t){var r,q=s,u={are:["are","is"],s:["s",""],"do":["do","does"],num:[t,t]};for(r in u){if(u.hasOwnProperty(r)){q=q.replace(new RegExp("%"+r+"%","gm"),(t===1)?u[r][1]:u[r][0])}}return q},countExpressions:function(s){var q=0,r;r=s.indexOf("expression(");while(r!==-1){q+=1;r=s.indexOf("expression(",r+1)}return q},countAlphaImageLoaderFilter:function(v){var t,u,s,w,r=0,x=0,q={};t=v.indexOf("filter:");while(t!==-1){s=false;if(t>0&&v.charAt(t-1)==="_"){s=true}u=v.indexOf(";",t+7);if(u!==-1){w=v.substring(t+7,u);if(w.indexOf("AlphaImageLoader")!==-1){if(s){x+=1}else{r+=1}}}t=v.indexOf("filter:",t+1)}if(x>0){q.hackFilter=x}if(r>0){q.filter=r}return q},getHostname:function(r){var q=r.split("/")[2];return(q&&q.split(":")[0])||""},getUniqueDomains:function(w,u){var t,r,v,q={},s=[];for(t=0,r=w.length;t0.2){return false}return true},isETagGood:function(q){var s=/^[0-9a-f]+:[0-9a-f]+$/,r=/^[0-9a-f]+\-[0-9a-f]+\-[0-9a-f]+$/;if(!q){return true}q=q.replace(/^["']|["'][\s\S]*$/g,"");return !(r.test(q)||s.test(q))},getComponentType:function(q){var r="unknown";if(q&&typeof q==="string"){if(q==="text/html"||q==="text/plain"){r="doc"}else{if(q==="text/css"){r="css"}else{if(/javascript/.test(q)){r="js"}else{if(/flash/.test(q)){r="flash"}else{if(/image/.test(q)){r="image"}else{if(/font/.test(q)){r="font"}}}}}}}return r},base64Encode:function(v){var u,t,s,x,r="",w=0,q=["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","0","1","2","3","4","5","6","7","8","9","+","/"];for(u=0;u>2];r+=q[((t&3)<<4)|((s&240)>>4)];if(w>0){r+="="}else{r+=q[((s&15)<<2)|((x&192)>>6)]}if(w>1){r+="="}else{r+=q[(x&63)]}}return r},getXHR:function(){var q=0,t=null,r=["MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP"];if(typeof XMLHttpRequest==="function"){return new XMLHttpRequest()}for(q=0;q/g,">")},escapeQuotes:function(r,q){if(q==="single"){return r.replace(/\'/g,"\\'")}if(q==="double"){return r.replace(/\"/g,'\\"')}return r.replace(/\'/g,"\\'").replace(/\"/g,'\\"')},formatHeaderName:(function(){var q={"content-md5":"Content-MD5",dnt:"DNT",etag:"ETag",p3p:"P3P",te:"TE","www-authenticate":"WWW-Authenticate","x-att-deviceid":"X-ATT-DeviceId","x-cdn":"X-CDN","x-ua-compatible":"X-UA-Compatible","x-xss-protection":"X-XSS-Protection"};return function(s){var r=s.toLowerCase();if(q.hasOwnProperty(r)){return q[r]}else{return r.replace(/(^|-)([a-z])/g,function(t,u,v){return u+v.toUpperCase()})}}}()),mod:function(q,r){return Math.round(q-(Math.floor(q/r)*r))},briefUrl:function(s,q){var r,t,u,v;q=q||100;if(s===undefined){return""}r=s.indexOf("//");if(-1!==r){t=s.indexOf("?");if(-1!==t){s=s.substring(0,t)+"?..."}if(s.length>q){u=s.indexOf("/",r+2);v=s.lastIndexOf("/");if(-1!==u&&-1!==v&&u!==v){s=s.substring(0,u+1)+"..."+s.substring(v)}else{s=s.substring(0,q+1)+"..."}}}return s},prettyAnchor:function(y,r,t,s,w,q,z){var u,x="",v="",A=0;if(typeof r==="undefined"){r=y}if(typeof t==="undefined"){t=""}else{t=' class="'+t+'"'}if(typeof w==="undefined"){w=100}if(typeof q==="undefined"){q=1}z=(z)?' rel="'+z+'"':"";r=YSLOW.util.escapeHtml(r);y=YSLOW.util.escapeHtml(y);u=YSLOW.util.escapeQuotes(r,"double");if(s){y=YSLOW.util.briefUrl(y,w);x=' title="'+u+'"'}while(0"+y.substring(0,w);y=y.substring(w);A+=1;if(A>=q){if(0";break}else{v+=" "}}return v},kbSize:function(q){var r=q%(q>100?100:10);q-=r;return parseFloat(q/1000)+(0===(q%1000)?".0":"")+"K"},prettyTypes:{image:"Image",doc:"HTML/Text",cssimage:"CSS Image",css:"Stylesheet File",js:"JavaScript File",flash:"Flash Object",iframe:"IFrame",xhr:"XMLHttpRequest",redirect:"Redirect",favicon:"Favicon",unknown:"Unknown"},prettyType:function(q){return YSLOW.util.prettyTypes[q]},prettyScore:function(r){var q="F";if(!parseInt(r,10)&&r!==0){return r}if(r===-1){return"N/A"}if(r>=90){q="A"}else{if(r>=80){q="B"}else{if(r>=70){q="C"}else{if(r>=60){q="D"}else{if(r>=50){q="E"}}}}}return q},getResults:function(w,S){var O,L,J,u,t,H,T,G,F,x,v,r,W,Q,I,s,E,D,y,A,N,K,B,z=/ "):"")}}return{score:J,message:z,components:r}}});YSLOW.registerRule({id:"yexpires",url:"http://developer.yahoo.com/performance/rules.html#expires",category:["server"],config:{points:11,howfar:172800,types:["css","js","image","cssimage","flash","favicon"]},lint:function(y,A,r){var x,t,z,s,w,u=parseInt(r.howfar,10)*1000,v=[],q=A.getComponentsByType(r.types);for(t=0,w=q.length;tx+u){continue}}v.push(q[t])}s=100-v.length*parseInt(r.points,10);return{score:s,message:(v.length>0)?YSLOW.util.plural("There %are% %num% static component%s%",v.length)+" without a far-future expiration date.":"",components:v}}});YSLOW.registerRule({id:"ycompress",url:"http://developer.yahoo.com/performance/rules.html#gzip",category:["server"],config:{min_filesize:500,types:["doc","iframe","xhr","js","css"],points:11},lint:function(x,y,r){var t,w,s,u,v=[],q=y.getComponentsByType(r.types);for(t=0,w=q.length;t0)?YSLOW.util.plural("There %are% %num% plain text component%s%",v.length)+" that should be sent compressed":"",components:v}}});YSLOW.registerRule({id:"ycsstop",url:"http://developer.yahoo.com/performance/rules.html#css_top",category:["css"],config:{points:10},lint:function(x,y,r){var t,w,s,u,q=y.getComponentsByType("css"),v=[];for(t=0,w=q.length;t0){s-=1+v.length*parseInt(r.points,10)}return{score:s,message:(v.length>0)?YSLOW.util.plural("There %are% %num% stylesheet%s%",v.length)+" found in the body of the document":"",components:v}}});YSLOW.registerRule({id:"yjsbottom",url:"http://developer.yahoo.com/performance/rules.html#js_bottom",category:["javascript"],config:{points:5},lint:function(x,y,r){var t,w,u,s,v=[],q=y.getComponentsByType("js");for(t=0,w=q.length;t0)?YSLOW.util.plural("There %are% %num% JavaScript script%s%",v.length)+" found in the head of the document":"",components:v}}});YSLOW.registerRule({id:"yexpressions",url:"http://developer.yahoo.com/performance/rules.html#css_expressions",category:["css"],config:{points:2},lint:function(y,B,r){var t,w,A,u,z=(B.inline&&B.inline.styles)||[],q=B.getComponentsByType("css"),v=[],s=100,x=0;for(t=0,w=q.length;t0){u.yexpressions=YSLOW.util.plural("%num% expression%s%",A);x+=A;v.push(u)}}for(t=0,w=z.length;t0){v.push("inline <style> tag #"+(t+1)+" ("+YSLOW.util.plural("%num% expression%s%",A)+")");x+=A}}if(x>0){s=90-x*r.points}return{score:s,message:x>0?"There is a total of "+YSLOW.util.plural("%num% expression%s%",x):"",components:v}}});YSLOW.registerRule({id:"yexternal",url:"http://developer.yahoo.com/performance/rules.html#external",category:["javascript","css"],config:{},lint:function(v,x,r){var t,u=x.inline,s=(u&&u.styles)||[],q=(u&&u.scripts)||[],w=[];if(s.length){t=YSLOW.util.plural("There is a total of %num% inline css",s.length);w.push(t)}if(q.length){t=YSLOW.util.plural("There is a total of %num% inline script%s%",q.length);w.push(t)}return{score:"n/a",message:"Only consider this if your property is a common user home page.",components:w}}});YSLOW.registerRule({id:"ydns",url:"http://developer.yahoo.com/performance/rules.html#dns_lookups",category:["content"],config:{max_domains:4,points:5},lint:function(y,A,q){var t,v,s,u=YSLOW.util,w=u.kbSize,x=u.plural,r=100,z=u.summaryByDomain(A.components,["size","size_compressed"],true);if(z.length>q.max_domains){r-=(z.length-q.max_domains)*q.points}if(z.length){for(t=0,v=z.length;t0?" ("+w(s.sum_size_compressed)+" GZip)":"")}}return{score:r,message:(z.length>q.max_domains)?x("The components are split over more than %num% domain%s%",q.max_domains):"",components:z}}});YSLOW.registerRule({id:"yminify",url:"http://developer.yahoo.com/performance/rules.html#minify",category:["javascript","css"],config:{points:10,types:["js","css"]},lint:function(A,C,r){var u,x,s,z,v,y=C.inline,B=(y&&y.styles)||[],t=(y&&y.scripts)||[],q=C.getComponentsByType(r.types),w=[];for(u=0,x=q.length;u0)?YSLOW.util.plural("There %are% %num% component%s% that can be minified",w.length):"",components:w}}});YSLOW.registerRule({id:"yredirects",url:"http://developer.yahoo.com/performance/rules.html#redirects",category:["content"],config:{points:10},lint:function(y,z,r){var u,x,v,s,w=[],t=YSLOW.util.briefUrl,q=z.getComponentsByType("redirect");for(u=0,x=q.length;u0)?YSLOW.util.plural("There %are% %num% redirect%s%",q.length):"",components:w}}});YSLOW.registerRule({id:"ydupes",url:"http://developer.yahoo.com/performance/rules.html#js_dupes",category:["javascript","css"],config:{points:5,types:["js","css"]},lint:function(y,z,s){var v,q,t,x,u={},w=[],r=z.getComponentsByType(s.types);for(v=0,x=r.length;v1){w.push(r[u[v].compindex])}}t=100-w.length*parseInt(s.points,10);return{score:t,message:(w.length>0)?YSLOW.util.plural("There %are% %num% duplicate component%s%",w.length):"",components:w}}});YSLOW.registerRule({id:"yetags",url:"http://developer.yahoo.com/performance/rules.html#etags",category:["server"],config:{points:11,types:["flash","js","css","cssimage","image","favicon"]},lint:function(y,z,r){var t,w,s,u,x,v=[],q=z.getComponentsByType(r.types);for(t=0,w=q.length;t0)?YSLOW.util.plural("There %are% %num% component%s% with misconfigured ETags",v.length):"",components:v}}});YSLOW.registerRule({id:"yxhr",url:"http://developer.yahoo.com/performance/rules.html#cacheajax",category:["content"],config:{points:5,min_cache_time:3600},lint:function(y,A,r){var u,z,x,s,w,t=parseInt(r.min_cache_time,10)*1000,v=[],q=A.getComponentsByType("xhr");for(u=0;ux+t){continue}}v.push(q[u])}s=100-v.length*parseInt(r.points,10);return{score:s,message:(v.length>0)?YSLOW.util.plural("There %are% %num% XHR component%s% that %are% not cacheable",v.length):"",components:v}}});YSLOW.registerRule({id:"yxhrmethod",url:"http://developer.yahoo.com/performance/rules.html#ajax_get",category:["server"],config:{points:5},lint:function(s,w,q){var r,t,v=[],u=w.getComponentsByType("xhr");for(r=0;r0)?YSLOW.util.plural("There %are% %num% XHR component%s% that %do% not use GET HTTP method",v.length):"",components:v}}});YSLOW.registerRule({id:"ymindom",url:"http://developer.yahoo.com/performance/rules.html#min_dom",category:["content"],config:{range:250,points:10,maxdom:900},lint:function(s,u,r){var q=u.domElementsCount,t=100;if(q>r.maxdom){t=99-Math.ceil((q-parseInt(r.maxdom,10))/parseInt(r.range,10))*parseInt(r.points,10)}return{score:t,message:(q>r.maxdom)?YSLOW.util.plural("There %are% %num% DOM element%s% on the page",q):"",components:[]}}});YSLOW.registerRule({id:"yno404",url:"http://developer.yahoo.com/performance/rules.html#no404",category:["content"],config:{points:5,types:["css","js","image","cssimage","flash","xhr","favicon"]},lint:function(x,y,r){var t,w,u,s,v=[],q=y.getComponentsByType(r.types);for(t=0,w=q.length;t0)?YSLOW.util.plural("There %are% %num% request%s% that %are% 404 Not Found",v.length):"",components:v}}});YSLOW.registerRule({id:"ymincookie",url:"http://developer.yahoo.com/performance/rules.html#cookie_size",category:["cookie"],config:{points:10,max_cookie_size:1000},lint:function(u,x,r){var w,t=x.cookies,q=(t&&t.length)||0,s="",v=100;if(q>r.max_cookie_size){w=Math.floor(q/r.max_cookie_size);v-=1+w*parseInt(r.points,10);s=YSLOW.util.plural("There %are% %num% byte%s% of cookies on this page",q)}return{score:v,message:s,components:[]}}});YSLOW.registerRule({id:"ycookiefree",url:"http://developer.yahoo.com/performance/rules.html#cookie_free",category:["cookie"],config:{points:5,types:["js","css","image","cssimage","flash","favicon"]},lint:function(A,B,t){var v,z,u,x,q,y=[],s=YSLOW.util.getHostname,w=s(B.doc_comp.url),r=B.getComponentsByType(t.types);for(v=0,z=r.length;v0)?YSLOW.util.plural("There %are% %num% component%s% that %are% not cookie-free",y.length):"",components:y}}});YSLOW.registerRule({id:"ynofilter",url:"http://developer.yahoo.com/performance/rules.html#no_filters",category:["css"],config:{points:5,halfpoints:2},lint:function(B,E,s){var u,y,t,v,A,x,D,C=(E.inline&&E.inline.styles)||[],r=E.getComponentsByType("css"),w=[],q=0,z=0;for(u=0,y=r.length;u0){r[u].yfilters=YSLOW.util.plural("%num% filter%s%",x);w.push(r[u])}}for(u=0,y=C.length;u0){w.push("inline <style> tag #"+(u+1)+" ("+YSLOW.util.plural("%num% filter%s%",x)+")")}}t=100-(q*s.points+z*s.halfpoints);return{score:t,message:(q+z)>0?"There is a total of "+YSLOW.util.plural("%num% filter%s%",q+z):"",components:w}}});YSLOW.registerRule({id:"yimgnoscale",url:"http://developer.yahoo.com/performance/rules.html#no_scale",category:["images"],config:{points:5},lint:function(s,x,q){var r,w,t,v=[],u=x.getComponentsByType("image");for(r=0;r0)?YSLOW.util.plural("There %are% %num% image%s% that %are% scaled down",v.length):"",components:v}}});YSLOW.registerRule({id:"yfavicon",url:"http://developer.yahoo.com/performance/rules.html#favicon",category:["images"],config:{points:5,size:2000,min_cache_time:3600},lint:function(y,A,r){var x,z,w,t,s,v=[],u=parseInt(r.min_cache_time,10)*1000,q=A.getComponentsByType("favicon");if(q.length){w=q[0];if(parseInt(w.status,10)===404){v.push("Favicon was not found")}if(w.size>r.size){v.push(YSLOW.util.plural("Favicon is more than %num% bytes",r.size))}z=w.expires;if(typeof z==="object"&&typeof z.getTime==="function"){x=new Date().getTime();s=z.getTime()>=x+u}if(!s){v.push("Favicon is not cacheable")}}t=100-v.length*parseInt(r.points,10);return{score:t,message:(v.length>0)?v.join("\n"):"",components:[]}}});YSLOW.registerRule({id:"yemptysrc",url:"http://developer.yahoo.com/performance/rules.html#emptysrc",category:["server"],config:{points:100},lint:function(x,A,r){var w,s,v,y=A.empty_url,u=[],t=[],q="",z=parseInt(r.points,10);s=100;if(y){for(w in y){if(y.hasOwnProperty(w)){v=y[w];s-=v*z;t.push(v+" "+w)}}q=t.join(", ")+YSLOW.util.plural(" component%s% with empty link were found.",t.length)}return{score:s,message:q,components:u}}});YSLOW.registerRuleset({id:"ydefault",name:"YSlow(V2)",rules:{ynumreq:{},ycdn:{},yemptysrc:{},yexpires:{},ycompress:{},ycsstop:{},yjsbottom:{},yexpressions:{},yexternal:{},ydns:{},yminify:{},yredirects:{},ydupes:{},yetags:{},yxhr:{},yxhrmethod:{},ymindom:{},yno404:{},ymincookie:{},ycookiefree:{},ynofilter:{},yimgnoscale:{},yfavicon:{}},weights:{ynumreq:8,ycdn:6,yemptysrc:30,yexpires:10,ycompress:8,ycsstop:4,yjsbottom:4,yexpressions:3,yexternal:4,ydns:3,yminify:4,yredirects:4,ydupes:4,yetags:2,yxhr:4,yxhrmethod:3,ymindom:3,yno404:4,ymincookie:3,ycookiefree:3,ynofilter:4,yimgnoscale:3,yfavicon:2}});YSLOW.registerRuleset({id:"yslow1",name:"Classic(V1)",rules:{ynumreq:{},ycdn:{},yexpires:{},ycompress:{},ycsstop:{},yjsbottom:{},yexpressions:{},yexternal:{},ydns:{},yminify:{types:["js"],check_inline:false},yredirects:{},ydupes:{types:["js"]},yetags:{}},weights:{ynumreq:8,ycdn:6,yexpires:10,ycompress:8,ycsstop:4,yjsbottom:4,yexpressions:3,yexternal:4,ydns:3,yminify:4,yredirects:4,ydupes:4,yetags:2}});YSLOW.registerRuleset({id:"yblog",name:"Small Site or Blog",rules:{ynumreq:{},yemptysrc:{},ycompress:{},ycsstop:{},yjsbottom:{},yexpressions:{},ydns:{},yminify:{},yredirects:{},ydupes:{},ymindom:{},yno404:{},ynofilter:{},yimgnoscale:{},yfavicon:{}},weights:{ynumreq:8,yemptysrc:30,ycompress:8,ycsstop:4,yjsbottom:4,yexpressions:3,ydns:3,yminify:4,yredirects:4,ydupes:4,ymindom:3,yno404:4,ynofilter:4,yimgnoscale:3,yfavicon:2}});var o={};o.getTLD=function(s){var r=s;var q=/\.(gov|ac|mil|net|org|co)\.\w\w$/i;if(s.match(q)){var t=/[\w]+\.[\w]+\.[\w]+$/i;r=s.match(t).toString()}else{var u=/[\w]+\.[\w]+$/i;r=s.match(u).toString()}return r};o.getSynchronouslyJavascripts=function(s){var r=[];for(var q=0;q0){for(var u=0;u0)?YSLOW.util.plural("There %are% %num% print css files included on the page, that should be @media query instead",x.length):"",components:x}}});YSLOW.registerRule({id:"cssinheaddomain",name:"Load CSS in head from document domain",info:"Make sure css in head is loaded from same domain as document, in order to have a better user experience and minimize dns lookups",category:["css"],config:{points:10},url:"http://sitespeed.io/rules/#cssinheaddomain",lint:function(B,D,s){var y=B.getElementsByTagName("link"),r=D.getComponentsByType("css"),z,x,q,A={},u=[],v=[],t=100;x=YSLOW.util.getHostname(D.doc_comp.url);for(w=0,len=y.length;wy+u){continue}else{if(r.skip.indexOf(q[t].url)>1){x.push(q[t].url);continue}}}v.push(q[t])}s=100-v.length*parseInt(r.points,10);B=(v.length>0)?YSLOW.util.plural("There %are% %num% static component%s%",v.length)+" without a far-future expiration date.":"";B+=(x.length>0)?YSLOW.util.plural(" There %are% %num% static component%s% that are skipped from the score calculation",x.length)+":"+x:"";return{score:s,message:B,components:v}}});YSLOW.registerRule({id:"inlinecsswhenfewrequest",name:"Do not load css files when the page has few request",info:"When a page has few requests, it is better to inline the css, to make the page to start render as early as possible",category:["css"],config:{points:20,limit:15,types:["css","js","image","cssimage","flash","favicon"]},url:"http://sitespeed.io/rules/#inlinecsswhenfewrequest",lint:function(t,x,q){var w=x.getComponentsByType(q.types),r=x.getComponentsByType("css"),s="",u=100,v=[];if(w.length0){for(i=0,len=r.length;i1){for(i=0,len=w.length;i1){x.push(r[w])}}t=100-x.length*11;return{score:t,message:(x.length>0)?YSLOW.util.plural("There %are% %num% 3rd party JS file%s% included more than once on the page",x.length):"",components:x}}});YSLOW.registerRuleset({id:"sitespeed.io-1.5",name:"Sitespeed.io rules v1.5",rules:{criticalpath:{},spof:{},ynumreq:{max_js:2,max_css:2,max_cssimages:2},yemptysrc:{},ycompress:{},ycsstop:{},yjsbottom:{},yexpressions:{},yexternal:{},ydns:{},yminify:{},yredirects:{},ydupes:{},yetags:{},yxhr:{},yxhrmethod:{},ymindom:{},yno404:{},ymincookie:{},ycookiefree:{},ynofilter:{},yimgnoscale:{},_3po_asyncjs:{},_3po_jsonce:{},cssprint:{},cssinheaddomain:{},syncjsinhead:{},avoidfont:{},totalrequests:{},expiresmod:{},nodnslookupswhenfewrequests:{},inlinecsswhenfewrequest:{},textcontent:{}},weights:{criticalpath:15,spof:5,ynumreq:8,yemptysrc:30,ycompress:8,ycsstop:4,yjsbottom:4,yexpressions:3,yexternal:4,ydns:3,yminify:4,yredirects:4,ydupes:4,yetags:2,yxhr:4,yxhrmethod:3,ymindom:3,yno404:4,ymincookie:3,ycookiefree:3,ynofilter:4,yimgnoscale:3,_3po_asyncjs:10,_3po_jsonce:10,cssprint:3,cssinheaddomain:8,syncjsinhead:20,avoidfont:1,totalrequests:10,expiresmod:10,nodnslookupswhenfewrequests:8,inlinecsswhenfewrequest:7,textcontent:1}});YSLOW.ResultSet=function(s,r,q){this.ruleset_applied=q;this.overall_score=r;this.results=s};YSLOW.ResultSet.prototype={getResults:function(){return this.results},getRulesetApplied:function(){return this.ruleset_applied},getOverallScore:function(){return this.overall_score}};YSLOW.view=function(r,w){var u,t,v,q,s;this.panel_doc=r.document;this.buttonViews={};this.curButtonId="";this.panelNode=r.panelNode;this.loadCSS(this.panel_doc);u=this.panel_doc.createElement("div");u.id="toolbarDiv";u.innerHTML=this.getToolbarSource();u.style.display="block";t=this.panel_doc.createElement("div");t.style.display="block";v='

    text

    ';q=this.panel_doc.createElement("div");q.id="dialogDiv";q.innerHTML=v;q.style.display="none";this.modaldlg=q;this.tooltip=new YSLOW.view.Tooltip(this.panel_doc,r.panelNode);s=this.panel_doc.createElement("div");s.id="copyrightDiv";s.innerHTML=YSLOW.doc.copyright;this.copyright=s;if(r.panelNode){r.panelNode.id="yslowDiv";r.panelNode.appendChild(q);r.panelNode.appendChild(u);r.panelNode.appendChild(t);r.panelNode.appendChild(s)}this.viewNode=t;this.viewNode.id="viewDiv";this.viewNode.className="yui-skin-sam";this.yscontext=w;YSLOW.util.addEventListener(this.panelNode,"click",function(E){var A,B,z,F,C,D=r.document.ysview.getElementByTagNameAndId(r.panelNode,"div","toolbarDiv");if(D){B=r.document.ysview.getElementByTagNameAndId(D,"li","helpLink");if(B){z=B.offsetLeft;F=B.offsetTop;C=B.offsetParent;while(C){z+=C.offsetLeft;F+=C.offsetTop;C=C.offsetParent}if(E.clientX>=z&&E.clientY>=F&&E.clientX"+x.name+"

    "+x.info,y.target)}}}});YSLOW.util.addEventListener(this.panelNode,"mouseout",function(x){r.document.ysview.tooltip.hide()});YSLOW.util.addEventListener(this.panel_doc.defaultView||this.panel_doc.parentWindow,"resize",function(y){var x=r.document.ysview.modaldlg;if(x&&x.style.display==="block"){x.style.display="none"}})};YSLOW.view.prototype={setDocument:function(q){this.panel_doc=q},loadCSS:function(){},addButtonView:function(q,s){var r=this.getButtonView(q);if(!r){r=this.panel_doc.createElement("div");r.style.display="none";this.viewNode.appendChild(r);this.buttonViews[q]=r}r.innerHTML=s;this.showButtonView(q)},clearAllButtonView:function(){var r=this.buttonViews,s=this.viewNode,q=function(t){if(r.hasOwnProperty(t)){s.removeChild(r[t]);delete r[t]}};q("ysPerfButton");q("ysCompsButton");q("ysStatsButton")},showButtonView:function(r){var q,s=this.getButtonView(r);if(!s){YSLOW.util.dump("ERROR: YSLOW.view.showButtonView: Couldn't find ButtonView '"+r+"'.");return}for(q in this.buttonViews){if(this.buttonViews.hasOwnProperty(q)&&q!==r){this.buttonViews[q].style.display="none"}}if(r==="ysPerfButton"){if(this.copyright){this.copyright.style.display="none"}}else{if(this.curButtonId==="ysPerfButton"){if(this.copyright){this.copyright.style.display="block"}}}s.style.display="block";this.curButtonId=r},getButtonView:function(q){return(this.buttonViews.hasOwnProperty(q)?this.buttonViews[q]:undefined)},setButtonView:function(q,s){var r=this.getButtonView(q);if(!r){YSLOW.util.dump("ERROR: YSLOW.view.setButtonView: Couldn't find ButtonView '"+q+"'.");return}r.innerHTML=s;this.showButtonView(q)},setSplashView:function(r,s,t){var w,v="Grade your web pages with YSlow",x="YSlow gives you:",u="
  • Grade based on the performance (you can define your own rules)
  • Summary of the Components in the page
  • Chart with statistics
  • Tools including Smush.It and JSLint
  • ",q="Learn more about YSlow and YDN";if(YSLOW.doc.splash){if(YSLOW.doc.splash.title){v=YSLOW.doc.splash.title}if(YSLOW.doc.splash.content){if(YSLOW.doc.splash.content.header){x=YSLOW.doc.splash.content.header}if(YSLOW.doc.splash.content.text){u=YSLOW.doc.splash.content.text}}if(YSLOW.doc.splash.more_info){q=YSLOW.doc.splash.more_info}}if(typeof t!=="undefined"){YSLOW.hideToolsInfo=t}else{t=YSLOW.hideToolsInfo}if(t){u=u.replace(/
  • Tools[^<]+<\/li>/,"")}w='

    '+v+'

    '+x+'

      '+u+"
    ";if(typeof r!=="undefined"){YSLOW.hideAutoRun=r}else{r=YSLOW.hideAutoRun}if(!r){w+=''}w+='
    ";this.addButtonView("panel_about",w)},genProgressView:function(){var q='

    Finding components in the page:

    Getting component information:

    start...
    ';this.setButtonView("panel_about",q)},updateProgressView:function(q,v){var u,x,y,w,z,r,s,t,A="";if(this.curButtonId==="panel_about"){z=this.getButtonView(this.curButtonId);if(q==="peel"){u=this.getElementByTagNameAndId(z,"div","peelprogress");x=this.getElementByTagNameAndId(z,"div","progbar");y=this.getElementByTagNameAndId(z,"div","progtext");A=v.message;w=(v.current_step*100)/v.total_step}else{if(q==="fetch"){u=this.getElementByTagNameAndId(z,"div","fetchprogress");x=this.getElementByTagNameAndId(z,"div","progbar2");y=this.getElementByTagNameAndId(z,"div","progtext2");A=v.last_component_url;w=(v.current*100)/v.total}else{if(q==="message"){y=this.getElementByTagNameAndId(z,"div","progtext2");if(y){y.innerHTML=v}return}else{return}}}}if(u&&x&&y){r=u.clientWidth;if(w<0){w=0}if(w>100){w=100}w=100-w;s=(r*w)/100;if(s>r){s=r}t=r-parseInt(s,10);x.style.width=parseInt(s,10)+"px";x.style.left=parseInt(t,10)+"px";y.innerHTML=A}},updateStatusBar:function(x){var z,s,A,t,q,r=YSLOW,u=r.util,w=r.view,y=u.Preference,v=this.yscontext;if(!v.PAGE.statusbar){v.PAGE.statusbar=true;if(!v.PAGE.overallScore){r.controller.lint(x,v)}if(!v.PAGE.totalSize){v.collectStats()}z=u.kbSize(v.PAGE.totalSize);s=u.prettyScore(v.PAGE.overallScore);w.setStatusBar(s,"yslow_status_grade");w.setStatusBar(z,"yslow_status_size");if(y.getPref("optinBeacon",false)){t=y.getPref("beaconInfo","basic"),q=y.getPref("beaconUrl","http://rtblab.pclick.yahoo.com/images/ysb.gif");A=u.getResults(v,t);u.sendBeacon(A,t,q)}}},getRulesetListSource:function(q){var u,s,t="",r=YSLOW.controller.getDefaultRulesetId();for(u in q){if(q[u]){t+='"}}return t},updateRulesetList:function(){var u,w,s,t=this.panel_doc.getElementsByTagName("select"),q=YSLOW.controller.getRegisteredRuleset(),r=this.getRulesetListSource(q),v=function(x){this.ownerDocument.ysview.onChangeRuleset(x)};for(u=0;uRulesets ";t+='
  • ';t+='";t+='";t+="";return t},show:function(r){var s="html",q="";r=r||this.yscontext.defaultview;if(this.yscontext.component_set===null){YSLOW.controller.run(window.top.content,this.yscontext,false);this.yscontext.defaultview=r}else{if(this.getButtonView(r)){this.showButtonView(r)}else{if("ysCompsButton"===r){q+=this.yscontext.genComponents(s);this.addButtonView("ysCompsButton",q)}else{if("ysStatsButton"===r){q+=this.yscontext.genStats(s);this.addButtonView("ysStatsButton",q);YSLOW.renderer.plotComponents(this.getButtonView("ysStatsButton"),this.yscontext)}else{if("ysToolButton"===r){q+=this.yscontext.genToolsView(s);this.addButtonView("ysToolButton",q)}else{q+=this.yscontext.genPerformance(s);this.addButtonView("ysPerfButton",q)}}}}this.panelNode.scrollTop=0;this.panelNode.scrollLeft=0;this.updateStatusBar(this.yscontext.document);this.updateToolbarSelection()}},updateToolbarSelection:function(){var q,r,s;switch(this.curButtonId){case"ysCompsButton":case"ysPerfButton":case"ysStatsButton":case"ysToolButton":q=this.getElementByTagNameAndId(this.panelNode,"li",this.curButtonId);if(q){if(q.className.indexOf("selected")!==-1){return}else{q.className+=" selected";if(q.previousSibling){q.previousSibling.className+=" off"}}}break;default:break}r=this.getElementByTagNameAndId(this.panelNode,"ul","toolbarLinks");s=r.firstChild;while(s){if(s.id!==this.curButtonId&&s.className.indexOf("selected")!==-1){this.unselect(s);if(s.previousSibling){YSLOW.view.removeClassName(s.previousSibling,"off")}}s=s.nextSibling}},showPerformance:function(){this.show("ysPerfButton")},showStats:function(){this.show("ysStatsButton")},showComponents:function(){this.show("ysCompsButton")},showTools:function(){this.show("ysToolButton")},showRuleSettings:function(){var q=this.yscontext.genRulesetEditView("html");this.addButtonView("ysRuleEditButton",q);this.panelNode.scrollTop=0;this.panelNode.scrollLeft=0;this.updateToolbarSelection()},runTest:function(){YSLOW.controller.run(window.top.content,this.yscontext,false)},setAutorun:function(q){YSLOW.util.Preference.setPref("extensions.yslow.autorun",q)},setAntiIframe:function(q){YSLOW.antiIframe=q},addCDN:function(z){var t,r,v=this,x=document,A=v.yscontext,B=YSLOW.util.Preference,w=B.getPref("cdnHostnames",""),q=v.panel_doc,s=q.getElementById("tab-label-list"),y=s.getElementsByTagName("li"),u=y.length;if(w){w=w.replace(/\s+/g,"").split(",");w.push(z);w=w.join()}else{w=z}B.setPref("extensions.yslow.cdnHostnames",w);for(t=0;t-1){r=s.id;break}}YSLOW.controller.lint(A.document,A);v.addButtonView("ysPerfButton",A.genPerformance("html"));YSLOW.view.restoreStatusBar(A);v.updateToolbarSelection();s=q.getElementById(r);v.onclickTabLabel({currentTarget:s},true)},onChangeRuleset:function(t){var u,r,v,w,q=YSLOW.util.getCurrentTarget(t),s=q.options[q.selectedIndex];YSLOW.controller.setDefaultRuleset(s.value);u=q.ownerDocument;r="Do you want to run the selected ruleset now?";v="Run Test";w=function(y){var x;u.ysview.closeDialog(u);if(u.yslowContext.component_set===null){YSLOW.controller.run(u.yslowContext.document.defaultView||u.yslowContext.document.parentWindow,u.yslowContext,false)}else{YSLOW.controller.lint(u.yslowContext.document,u.yslowContext)}x=u.yslowContext.genPerformance("html");u.ysview.addButtonView("ysPerfButton",x);u.ysview.panelNode.scrollTop=0;u.ysview.panelNode.scrollLeft=0;YSLOW.view.restoreStatusBar(u.yslowContext);u.ysview.updateToolbarSelection()};this.openDialog(u,389,150,r,undefined,v,w)},onclickTabLabel:function(q,w){var s,r,t,y,A,z,v,B=YSLOW.util.getCurrentTarget(q),x=B.parentNode,u=x.nextSibling;if(B.className.indexOf("selected")!==-1||B.id.indexOf("label")===-1){return false}if(x){s=x.firstChild;while(s){if(this.unselect(s)){r=s.id.substring(5);break}s=s.nextSibling}B.className+=" selected";t=B.id.substring(5);s=u.firstChild;while(s){v=s.id.substring(3);if(!y&&r&&v===r){if(s.className.indexOf("yui-hidden")===-1){s.className+=" yui-hidden"}y=true}if(!A&&t&&v===t){YSLOW.view.removeClassName(s,"yui-hidden");A=true;z=s}if((y||!r)&&(A||!t)){break}s=s.nextSibling}if(w===true&&A===true&&z){this.positionResultTab(z,u,B)}}return false},positionResultTab:function(r,q,w){var u,z,A,v=5,x=this.panel_doc,t=x.defaultView||x.parentWindow,s=t.offsetHeight?t.offsetHeight:t.innerHeight,B=w.offsetTop+r.offsetHeight;q.style.height=B+"px";r.style.position="absolute";r.style.left=w.offsetLeft+w.offsetWidth+"px";r.style.top=w.offsetTop+"px";u=r.offsetTop;z=r.offsetParent;while(z!==null){u+=z.offsetTop;z=z.offsetParent}if(uthis.panelNode.scrollTop+s){if(uu-this.panelNode.scrollTop){A=u-this.panelNode.scrollTop}this.panelNode.scrollTop+=A}}},onclickResult:function(q){YSLOW.util.preventDefault(q);return this.onclickTabLabel(q,true)},unselect:function(q){return YSLOW.view.removeClassName(q,"selected")},filterResult:function(z,q){var v,u,r,w,s,x,t,y=this.getButtonView("ysPerfButton");if(q==="all"){u=true}if(y){v=this.getElementByTagNameAndId(y,"ul","tab-label-list")}if(v){r=v.firstChild;t=v.nextSibling;s=t.firstChild;while(r){YSLOW.view.removeClassName(r,"first");if(u||r.className.indexOf(q)!==-1){r.style.display="block";if(w===undefined){w=s;x=r;YSLOW.view.removeClassName(s,"yui-hidden");r.className+=" first";if(r.className.indexOf("selected")===-1){r.className+=" selected"}r=r.nextSibling;s=s.nextSibling;continue}}else{r.style.display="none"}if(s.className.indexOf("yui-hidden")===-1){s.className+=" yui-hidden"}this.unselect(r);r=r.nextSibling;s=s.nextSibling}if(w){this.positionResultTab(w,t,x)}}},updateFilterSelection:function(s){var q,r=YSLOW.util.getCurrentTarget(s);YSLOW.util.preventDefault(s);if(r.className.indexOf("selected")!==-1){return}r.className+=" selected";q=r.parentNode.firstChild;while(q){if(q!==r&&this.unselect(q)){break}q=q.nextSibling}this.filterResult(r.ownerDocument,r.id)},onclickToolbarMenu:function(q){var u,s=YSLOW.util.getCurrentTarget(q),t=s.parentNode,r=t.parentNode;if(t.className.indexOf("selected")!==-1){return}t.className+=" selected";if(t.previousSibling){t.previousSibling.className+=" off"}if(r){u=r.firstChild;while(u){if(u!==t&&this.unselect(u)){if(u.previousSibling){YSLOW.view.removeClassName(u.previousSibling,"off")}break}u=u.nextSibling}}},expandCollapseComponentType:function(u,r){var s,t=YSLOW.controller.getRenderer("html"),q=this.getButtonView("ysCompsButton");if(q){s=this.getElementByTagNameAndId(q,"table","components-table");t.expandCollapseComponentType(u,s,r)}},expandAll:function(t){var r,s=YSLOW.controller.getRenderer("html"),q=this.getButtonView("ysCompsButton");if(q){r=this.getElementByTagNameAndId(q,"table","components-table");s.expandAllComponentType(t,r)}},regenComponentsTable:function(v,u,r){var s,t=YSLOW.controller.getRenderer("html"),q=this.getButtonView("ysCompsButton");if(q){s=this.getElementByTagNameAndId(q,"table","components-table");t.regenComponentsTable(v,s,u,r,this.yscontext.component_set)}},showComponentHeaders:function(s){var r,t,q=this.getButtonView("ysCompsButton");if(q){r=this.getElementByTagNameAndId(q,"tr",s);if(r){t=r.firstChild;if(r.style.display==="none"){r.style.display="table-row"}else{r.style.display="none"}}}},openLink:function(q){YSLOW.util.openLink(q)},openPopup:function(s,r,u,q,t){window.open(s,r||"_blank","width="+(u||626)+",height="+(q||436)+","+(t||"toolbar=0,status=1,location=1,resizable=1"))},runTool:function(q,r){YSLOW.controller.runTool(q,this.yscontext,r)},onclickRuleset:function(v){var s,r,q,u,w=YSLOW.util.getCurrentTarget(v),t=w.className.indexOf("ruleset-");YSLOW.util.preventDefault(v);if(t!==-1){r=w.className.indexOf(" ",t+8);if(r!==-1){s=w.className.substring(t+8,r)}else{s=w.className.substring(t+8)}q=this.getButtonView("ysRuleEditButton");if(q){u=this.getElementByTagNameAndId(q,"form","edit-form");YSLOW.renderer.initRulesetEditForm(w.ownerDocument,u,YSLOW.controller.getRuleset(s))}}return this.onclickTabLabel(v,false)},openSaveAsDialog:function(s,r){var q='',t="Save",u=function(B){var y,w,v,z,x,A=YSLOW.util.getCurrentTarget(B).ownerDocument;if(A.ysview.modaldlg){y=A.ysview.getElementByTagNameAndId(A.ysview.modaldlg,"input","saveas-name")}if(y){if(YSLOW.controller.checkRulesetName(y.value)===true){w=q+'
    '+y.value+" ruleset already exists.
    ";A.ysview.closeDialog(A);A.ysview.openDialog(A,389,150,w,"",t,u)}else{v=A.ysview.getButtonView("ysRuleEditButton");if(v){z=A.ysview.getElementByTagNameAndId(v,"form",r);x=A.createElement("input");x.type="hidden";x.name="saveas-name";x.value=y.value;z.appendChild(x);z.submit()}A.ysview.closeDialog(A)}}};this.openDialog(s,389,150,q,undefined,t,u)},openPrintableDialog:function(t){var s="Please run YSlow first before using Printable View.",r="Check which information you want to view or print
    ",q='
    ',u="Ok",v=function(y){var w,x=YSLOW.util.getCurrentTarget(y).ownerDocument,A=x.getElementsByName("print-type"),z={};for(w=0;w0){for(q=0;q0){if(J[E].className==="dialog-box"){G=J[E]}else{if(J[E].className==="dialog-text"){z=J[E]}else{if(J[E].className==="dialog-more-text"){y=J[E]}}}}}if(H&&G&&z&&y){z.innerHTML=(x?x:"");y.innerHTML=(w?w:"");r=H.getElementsByTagName("input");for(D=0;D0)?s:225)+"px";G.style.top=((A&&A>0)?A:80)+"px";H.style.left=this.panelNode.scrollLeft+"px";H.style.top=this.panelNode.scrollTop+"px";H.style.display="block";if(r.length>0){r[0].focus()}}},closeDialog:function(r){var q=this.modaldlg;q.style.display="none"},saveRuleset:function(u,r){var s,t=YSLOW.controller.getRenderer("html"),q=this.getButtonView("ysRuleEditButton");if(q){s=this.getElementByTagNameAndId(q,"form",r);t.saveRuleset(u,s)}},deleteRuleset:function(u,r){var s,t=YSLOW.controller.getRenderer("html"),q=this.getButtonView("ysRuleEditButton");if(q){s=this.getElementByTagNameAndId(q,"form",r);t.deleteRuleset(u,s)}},shareRuleset:function(v,t){var q,x,u,y,w,r=YSLOW.controller.getRenderer("html"),s=this.getButtonView("ysRuleEditButton");if(s){q=this.getElementByTagNameAndId(s,"form",t);x=r.getEditFormRulesetId(q);u=YSLOW.controller.getRuleset(x);if(u){y=YSLOW.Exporter.exportRuleset(u);if(y){w="";this.openDialog(v,389,150,w,"","Ok")}}}},createRuleset:function(s,r){var q,t,v=s.parentNode,u=v.parentNode,w=u.firstChild;while(w){this.unselect(w);w=w.nextSibling}q=this.getButtonView("ysRuleEditButton");if(q){t=this.getElementByTagNameAndId(q,"form",r);YSLOW.renderer.initRulesetEditForm(this.panel_doc,t)}},showHideHelp:function(){var q,r=this.getElementByTagNameAndId(this.panelNode,"div","toolbarDiv");if(r){q=this.getElementByTagNameAndId(r,"div","helpDiv")}if(q){if(q.style.visibility==="visible"){q.style.visibility="hidden"}else{q.style.visibility="visible"}}},smushIt:function(r,q){YSLOW.util.smushIt(q,function(w){var u,t,v,x,s="";if(w.error){s+="
    "+w.error+"
    "}else{v=YSLOW.util.getSmushUrl();x=YSLOW.util.makeAbsoluteUrl(w.dest,v);s+="
    Original size: "+w.src_size+" bytes
    Result size: "+w.dest_size+" bytes
    % Savings: "+w.percent+"%
    "}u='
    Image: '+YSLOW.util.briefUrl(q,250)+"
    ";t=s;r.ysview.openDialog(r,389,150,u,t,"Ok")})},checkAllRules:function(v,s,r){var t,q,u,w;if(typeof r!=="boolean"){return}q=this.getButtonView("ysRuleEditButton");if(q){u=this.getElementByTagNameAndId(q,"form",s);w=u.elements;for(t=0;tD||H>q){this.tooltip.style.display="none";return}F=w.offsetParent;while(F!==null){B+=F.offsetLeft;A+=F.offsetTop;F=F.offsetParent}B+=w.offsetLeft;A+=w.offsetTop;if(BE.ysview.panelNode.scrollTop+q)){this.tooltip.style.display="none";return}t=B+w.offsetWidth/2;s=A+w.offsetHeight/2;if(B+w.offsetWidth+C+u=E.ysview.panelNode.scrollTop)&&(A-C+H+C<=E.ysview.panelNode.scrollTop+q)){A=A-C;r="right top"}else{A+=w.offsetHeight-H;r="right bottom"}}else{if(A-H-C>=E.ysview.panelNode.scrollTop){A-=H+C;r="top"}else{A+=w.offsetHeight+C;r="bottom"}z=Math.floor(t-u/2);if((z>=E.ysview.panelNode.scrollLeft)&&(z+u<=E.ysview.panelNode.scrollLeft+D)){B=z}else{if(z0&&q&&q.length>0){t=s.className.split(" ");for(r=0;r0){y[q]=w[q]}C+=w[q]}}return{total_size:C,num_requests:r,count_obj:v,size_obj:w,canvas_data:y}},collectStats:function(){var q=this.computeStats();if(q!==undefined){this.PAGE.totalSize=q.total_size;this.PAGE.totalRequests=q.num_requests;this.PAGE.totalObjCount=q.count_obj;this.PAGE.totalObjSize=q.size_obj;this.PAGE.canvas_data.empty=q.canvas_data}q=this.computeStats(true);if(q){this.PAGE.totalSizePrimed=q.total_size;this.PAGE.totalRequestsPrimed=q.num_requests;this.PAGE.totalObjCountPrimed=q.count_obj;this.PAGE.totalObjSizePrimed=q.size_obj;this.PAGE.canvas_data.primed=q.canvas_data}},genPerformance:function(r,q){if(this.result_set===null){if(!q){q=this.document}YSLOW.controller.lint(q,this)}return YSLOW.controller.render(r,"reportcard",{result_set:this.result_set})},genStats:function(r){var q={};if(!this.PAGE.totalSize){this.collectStats()}q.PAGE=this.PAGE;return YSLOW.controller.render(r,"stats",{stats:q})},genComponents:function(q){if(!this.PAGE.totalSize){this.collectStats()}return YSLOW.controller.render(q,"components",{comps:this.component_set.components,total_size:this.PAGE.totalSize})},genToolsView:function(r){var q=YSLOW.Tools.getAllTools();return YSLOW.controller.render(r,"tools",{tools:q})},genRulesetEditView:function(q){return YSLOW.controller.render(q,"rulesetEdit",{rulesets:YSLOW.controller.getRegisteredRuleset()})}};YSLOW.renderer={sortBy:"type",sortDesc:false,bPrintable:false,colors:{doc:"#8963df",redirect:"#FC8C8C",iframe:"#FFDFDF",xhr:"#89631f",flash:"#8D4F5B",js:"#9fd0e8",css:"#aba5eb",cssimage:"#677ab8",image:"#d375cd",favicon:"#a26c00",unknown:"#888888"},reset:function(){this.sortBy="type";this.sortDesc=false},genStats:function(y,z){var v,w,s,r,B,x,q,u,t="",A=0;if(!y.PAGE){return""}if(z){v=y.PAGE.totalObjCountPrimed;w=y.PAGE.totalObjSizePrimed;s=y.PAGE.totalRequestsPrimed;A=y.PAGE.totalSizePrimed}else{v=y.PAGE.totalObjCount;w=y.PAGE.totalObjSize;s=y.PAGE.totalRequests;A=y.PAGE.totalSize}r=YSLOW.peeler.types;B=(z)?"primed":"empty";for(x=0;x
     
    '+v[q]+''+YSLOW.util.prettyType(q)+''+YSLOW.util.kbSize(w[q])+""}}u='
    HTTP Requests - '+s+'
    Total Weight - '+YSLOW.util.kbSize(A)+'
    '+t+"
    ";return u},plotComponents:function(q,r){if(typeof q!=="object"){return}this.plotOne(q,r.PAGE.canvas_data.empty,r.PAGE.totalSize,"comp-canvas-empty");this.plotOne(q,r.PAGE.canvas_data.primed,r.PAGE.totalSizePrimed,"comp-canvas-primed")},plotOne:function(A,t,z,y){var s,u,C,r,x,q,w,D,v,B=A.getElementsByTagName("canvas");for(u=0;u'+YSLOW.util.escapeHtml(q.headers[s])+""}}if(q.req_headers){r+='Request Headers';for(s in q.req_headers){if(q.req_headers.hasOwnProperty(s)&&q.req_headers[s]){r+=''+YSLOW.util.escapeHtml(YSLOW.util.formatHeaderName(s))+'

    '+YSLOW.util.escapeHtml(q.req_headers[s])+"

    "}}}r+="";return r},genComponentRow:function(w,v,r,u){var s,A,t,q,z,y,x;if(typeof r!=="string"){r=""}if(v.status>=400&&v.status<500){r+=" compError"}if(v.after_onload===true){r+=" afteronload"}s="compHeaders"+v.id;A='";for(t in w){if(w.hasOwnProperty(t)){q=t;z="";if(t==="type"){z+=v[t];if(v.is_beacon){z+=" †"}if(v.after_onload){z+=" *"}}else{if(t==="size"){z+=YSLOW.util.kbSize(v.size)}else{if(t==="url"){if(v.status>=400&&v.status<500){A+=''+v[t]+" (status: "+v.status+")";continue}else{z+=YSLOW.util.prettyAnchor(v[t],v[t],undefined,!YSLOW.renderer.bPrintable,100,1,v.type)}}else{if(t==="gzip"&&(v.compressed==="gzip"||v.compressed==="deflate")){z+=(v.size_compressed!==undefined?YSLOW.util.kbSize(v.size_compressed):"uncertain")}else{if(t==="set-cookie"){y=v.getSetCookieSize();z+=y>0?y:""}else{if(t==="cookie"){x=v.getReceivedCookieSize();z+=x>0?x:""}else{if(t==="etag"){z+=v.getEtag()}else{if(t==="expires"){z+=YSLOW.util.prettyExpiresDate(v.expires)}else{if(t==="headers"){if(YSLOW.renderer.bPrintable){continue}if(v.raw_headers&&v.raw_headers.length>0){z+="'}}else{if(t==="action"){if(YSLOW.renderer.bPrintable){continue}if(v.type==="cssimage"||v.type==="image"){if(v.response_type===undefined||v.response_type==="image"){z+="smush.it"}}}else{if(v[t]!==undefined){z+=v[t]}}}}}}}}}}}A+=''+z+""}}A+="";if(v.raw_headers&&v.raw_headers.length>0){A+=''+this.getComponentHeadersTable(v)+""}return A},componentSortCallback:function(q,y){var r,t,u,w="",v="",x=YSLOW.renderer.sortBy,s=YSLOW.renderer.sortDesc;switch(x){case"type":w=q.type;v=y.type;break;case"size":w=q.size?Number(q.size):0;v=y.size?Number(y.size):0;break;case"gzip":w=q.size_compressed?Number(q.size_compressed):0;v=y.size_compressed?Number(y.size_compressed):0;break;case"set-cookie":w=q.getSetCookieSize();v=y.getSetCookieSize();break;case"cookie":w=q.getReceivedCookieSize();v=y.getReceivedCookieSize();break;case"headers":break;case"url":w=q.url;v=y.url;break;case"respTime":w=q.respTime?Number(q.respTime):0;v=y.respTime?Number(y.respTime):0;break;case"etag":w=q.getEtag();v=y.getEtag();break;case"action":if(q.type==="cssimage"||q.type==="image"){w="smush.it"}if(y.type==="cssimage"||y.type==="image"){v="smush.it"}break;case"expires":w=q.expires||0;v=y.expires||0;break}if(w===v){if(q.id>y.id){return(s)?-1:1}if(q.idv){return(s)?-1:1}if(w',v='
    ',t='
    ';for(q in A){if(A.hasOwnProperty(q)&&A[q]){y=A[q];s='
    ";if(z.rules[q]!==undefined){B+=1}if(z.weights!==undefined&&z.weights[q]!==undefined){w+=''}r=(u%3);switch(r){case 0:x+=s;break;case 1:v+=s;break;case 2:t+=s;break}u+=1}}x+="
    ";v+="
    ";t+="";return'

    '+z.name+' Ruleset (includes '+parseInt(B,10)+" of "+parseInt(u,10)+' rules)

    '+x+""+v+""+t+'
    '+w+"
    "},genRulesetEditForm:function(q){var r="";r+='
    '+YSLOW.renderer.genRulesCheckbox(q)+'
    ';return r},initRulesetEditForm:function(I,r,D){var C,F,E,B,G,K,w,J,v,y,q,u,A,s=r.elements,t="",z=[],x=0,H=0;for(F=0;F'}x+=1}}q.innerHTML="(includes "+parseInt(x,10)+" of "+parseInt(H,10)+" rules)";K.innerHTML='';w.innerHTML='';J.innerHTML=D.name}else{K.innerHTML="";w.innerHTML="";J.innerHTML="New";q.innerHTML=""}v.innerHTML=t}};YSLOW.registerRenderer({id:"html",supports:{components:1,reportcard:1,stats:1,tools:1,rulesetEdit:1},genComponentsTable:function(r,C,v){var A,y,B,z,u={type:"TYPE",size:"SIZE
    (KB)",gzip:"GZIP
    (KB)","set-cookie":"COOKIE RECEIVED
    (bytes)",cookie:"COOKIE SENT
    (bytes)",headers:"HEADERS",url:"URL",expires:"EXPIRES
    (Y/M/D)",respTime:"RESPONSE
    TIME (ms)",etag:"ETAG",action:"ACTION"},x=false,t="",w="",q=0,s=0;if(C!==undefined&&u[C]===undefined){return""}if(YSLOW.renderer.bPrintable){C=YSLOW.renderer.sortBy;v=YSLOW.renderer.sortDesc}else{if(C===undefined||C==="type"){C="type";x=true}}r=YSLOW.renderer.sortComponents(r,C,v);t+='';for(A in u){if(u.hasOwnProperty(A)&&u[A]){if(YSLOW.renderer.bPrintable&&(A==="action"||A==="components"||A==="headers")){continue}t+="'+(C===A?(v?"↓":"↑"):"")+" "+u[A]+""}}}t+="";for(y=0;y";t+=w;w="";q=0;s=0;B=z.type}}w+=YSLOW.renderer.genComponentRow(u,z,(q%2===0?"even":"odd"),x);q+=1;s+=z.size}else{t+=YSLOW.renderer.genComponentRow(u,z,(y%2===0?"even":"odd"),false)}}if(w.length>0){t+='";t+=w}t+="
    '+B+" ("+q+')'+YSLOW.util.kbSize(s)+"
    '+B+" ("+q+')'+YSLOW.util.kbSize(s)+"
    ";return t},componentsView:function(w,r){var t,s=this.genComponentsTable(w,YSLOW.renderer.sortBy,false),u="in type column indicates the component is loaded after window onload event.",q="denotes 1x1 pixels image that may be image beacon",v="Components";if(YSLOW.doc){if(YSLOW.doc.components_legend){if(YSLOW.doc.components_legend.beacon){u=YSLOW.doc.components_legend.beacon}if(YSLOW.doc.components_legend.after_onload){q=YSLOW.doc.components_legend.after_onload}}if(YSLOW.doc.view_names&&YSLOW.doc.view_names.components){v=YSLOW.doc.view_names.components}}t='
    '+v+'The page has a total of '+w.length+' components and a total weight of '+YSLOW.util.kbSize(r)+' bytes
    '+s+'
    * '+u+"
    † "+q+"
    ";return t},reportcardPrintableView:function(t,r,w){var u,s,y,q,x,v='
    ";for(u=0;u"}}v+="
    Overall Grade: '+r+" (Ruleset applied: "+w.name+")
    '+q+'

    '+y.name+'

    '+y.message+"
    ";if(y.components&&y.components.length>0){v+='
      ';for(s=0;s"+y.components[s]+""}else{if(y.components[s].url!==undefined){v+="
    • "+YSLOW.util.briefUrl(y.components[s].url,60)+"
    • "}}}v+="

    "}v+="

    ";return v},getFilterCode:function(x,u,s,q){var w,r,v,y,B,C,t,A=u.length,z=[];for(r in x){if(x.hasOwnProperty(r)&&x[r]){z.push(r)}}z.sort();w='
    • ALL ('+A+')
    • FILTER BY:
    • ';for(v=0,y=z.length;v'+z[v].toUpperCase()+" ("+x[z[v]]+")"}B="http://yslow.org/scoremeter/?url="+encodeURIComponent(q)+"&grade="+s;for(v=0;v=0&&t<100){B+="&"+C.rule_id.toLowerCase()+"="+t}}B=encodeURIComponent(encodeURIComponent(B));q=encodeURIComponent(encodeURIComponent(q.slice(0,60)+(q.length>60?"...":"")));w+='";w+='";w+="
    ";return w},reportcardView:function(s){var w,H,F,E,x,r,v,L,B,I,K,J,q,u,y='
    ',G=s.getRulesetApplied(),A=s.getResults(),t=s.url,M="Grade",D="",C="",z={};if(YSLOW.doc){if(YSLOW.doc.view_names&&YSLOW.doc.view_names.grade){M=YSLOW.doc.view_names.grade}}w=YSLOW.util.prettyScore(s.getOverallScore());if(YSLOW.renderer.bPrintable){return this.reportcardPrintableView(A,w,G)}y+='
    '+M+'
    '+w+'
    Overall performance score '+Math.round(s.getOverallScore())+'Ruleset applied: '+G.name+'URL: '+YSLOW.util.briefUrl(t,100)+"
    ";for(H=0;H0){L+=" "}L+=x.category[E];if(z[x.category[E]]===undefined){z[x.category[E]]=0}z[x.category[E]]+=1}}if(L.length>0){D+=' class="'+L+'"'}D+=' onclick="javascript:document.ysview.onclickResult(event)">
    '+r+''+x.name+"
    ";C+='
    ")}C+='">

    Grade '+r+" on "+x.name+"

    "+x.message+"
    ";if(x.components&&x.components.length>0){C+='

      ';for(F=0;F"+J+""}else{if(J.url!==undefined){C+="
    • ";q=x.rule_id.toLowerCase();if(x.rule_id.match("expires")){C+="("+YSLOW.util.prettyExpiresDate(J.expires)+") "}C+=YSLOW.util.prettyAnchor(J.url,J.url,undefined,true,120,undefined,J.type)+"
    • "}}}C+="

    "}C+="

    ";u=YSLOW.controller.getRule(x.rule_id);if(u){C+='

    '+(u.info||"** To be added **")+"

    ";if(u.url!==undefined){C+='

    »Read More

    "}}C+="
    "}}y+='
    '+this.getFilterCode(z,A,w,t)+'
      '+D+'
    '+C+'
    '+YSLOW.doc.copyright+"
    ";return y},statsView:function(r){var q="",s="Stats";if(YSLOW.doc){if(YSLOW.doc.view_names&&YSLOW.doc.view_names.stats){s=YSLOW.doc.view_names.stats}}q+='
    '+s+'The page has a total of '+r.PAGE.totalRequests+' HTTP requests and a total weight of '+YSLOW.util.kbSize(r.PAGE.totalSize)+" bytes with empty cache
    ";q+='
    WEIGHT GRAPHS
    ';q+='
    Empty Cache
    '+YSLOW.renderer.genStats(r,false)+"
    ";q+='
    Primed Cache
    '+YSLOW.renderer.genStats(r,true)+"
    ";q+="
    ";return q},toolsView:function(u){var t,s,r,q="",w="Tools",v="Click the Launch Tool link next to the tool you want to run to start the tool.";if(YSLOW.doc){if(YSLOW.doc.tools_desc){v=YSLOW.doc.tools_desc}if(YSLOW.doc.view_names&&YSLOW.doc.view_names.tools){w=YSLOW.doc.view_names.tools}}for(t=0;t"}q+="
    "+r.name+"-"+(r.short_desc||"Short text here explaining what are the main benefits of running this App")+"
    ";s='
    '+w+""+v+'
    '+q+"
    ";return s},rulesetEditView:function(D){var s,B,u,t,w='
    ',C,z,y=0,r=false,q,v,A="Rule Settings",x="Choose which ruleset better fit your specific needs. You can Save As an existing rule, based on an existing ruleset.";if(YSLOW.doc){if(YSLOW.doc.rulesettings_desc){x=YSLOW.doc.rulesettings_desc}if(YSLOW.doc.view_names&&YSLOW.doc.view_names.rulesetedit){A=YSLOW.doc.view_names.rulesetedit}}v=YSLOW.controller.getDefaultRulesetId();C='
    • STANDARD SETS
    • ';for(s in D){if(D.hasOwnProperty(s)&&D[s]){B=D[s];u="tab"+y;if(!r&&B.custom===true){C+='
    • CUSTOM SETS
    • ';r=true}C+='
    • '+B.name+"
    • ";y+=1}}C+='
    ';z='
    '+YSLOW.renderer.genRulesetEditForm(q)+"
    ";w+=C+z;t='
    '+A+""+x+"
    "+w+"
    ";return t},rulesetEditUpdateTab:function(I,q,C,r,A){var s,B,F,u,z,G,D,x,t,y,H,E,v,w=q.parentNode.parentNode.parentNode;if(w&&w.id==="settingsDiv"&&C.custom===true){s=w.firstChild;B=s.nextSibling;if(r<1){F=s.firstChild;while(F){u=F.className.indexOf("ruleset-");if(u!==-1){z=F.className.substring(u+8);u=z.indexOf(" ");if(u!==-1){z=z.substring(0,u)}if(C.id===z){u=F.id.indexOf("label");if(u!==-1){G=F.id.substring(u+5);if(F.className.indexOf("selected")!==-1){D={};D.currentTarget=H;I.ysview.onclickRuleset(D)}if(F.previousSibling&&F.previousSibling.id==="custom-set-title"&&F.nextSibling&&F.nextSibling.id==="create-ruleset"){x=F.previousSibling}s.removeChild(F);if(x){s.removeChild(x)}}break}else{H=F}}F=F.nextSibling}}else{F=s.lastChild;while(F){y=F.id.indexOf("label");if(y!==-1){t=F.id.substring(y+5);break}F=F.previousSibling}t=Number(t)+1;F=I.createElement("li");F.className="ruleset-"+C.id;F.id="label"+t;F.onclick=function(J){I.ysview.onclickRuleset(J)};F.innerHTML=''+C.name+"";s.insertBefore(F,s.lastChild);E=s.firstChild;while(E){if(E.id&&E.id==="custom-set-title"){x=E;break}E=E.nextSibling}if(!x){x=I.createElement("li");x.className="new-section header";x.id="custom-set-title";x.innerHTML="CUSTOM SETS";s.insertBefore(x,F)}if(A){v={};v.currentTarget=F;I.ysview.onclickRuleset(v)}}}},hasClassName:function(t,q){var r,s=t.split(" ");if(s){for(r=0;r";s+=""+u[t].type+"";s+=""+u[t].size+"";if(u[t].compressed===false){s+=""}else{s+=""+(u[t].size_compressed!==undefined?parseInt(u[t].size_compressed,10):"uncertain")+""}q=u[t].getSetCookieSize();if(q>0){s+=""+parseInt(q,10)+""}q=u[t].getReceivedCookieSize();if(q>0){s+=""+parseInt(q,10)+""}s+=""+encodeURI(u[t].url)+"";s+=""+u[t].expires+"";s+=""+u[t].respTime+"";s+=""+u[t].getEtag()+"";s+=""}s+="";return s},reportcardView:function(w){var t,r,y,u=w.getOverallScore(),s=YSLOW.util.prettyScore(u),x=w.getRulesetApplied(),v=w.getResults(),q='';q+='';for(t=0;t';q+=""+y.message+"";if(v.components&&v.components.length>0){q+="";for(r=0;r"+y.components[r]+""}else{if(y.components[r].url!==undefined){q+=""+y.components[r].url+""}}}q+=""}q+=""}q+="";return q},statsView:function(t){var s,w,r,v='',u='',q=YSLOW.peeler.types;for(s=0;s'}if((t.PAGE.totalObjCount[w])!==undefined){u+=''}}v+="";u+="";r=''+v+u+"";return r}});YSLOW.peeler={types:["doc","js","css","iframe","flash","cssimage","image","favicon","xhr","redirect","font"],NODETYPE:{ELEMENT:1,DOCUMENT:9},CSSRULE:{IMPORT_RULE:3,FONT_FACE_RULE:5},peel:function(q,r){},findDocuments:function(r){var y,B,u,z,v,w,q,C,A,s={};YSLOW.util.event.fire("peelProgress",{total_step:7,current_step:1,message:"Finding documents"});if(!r){return}if(!YSLOW.util.Preference.getPref("extensions.yslow.getFramesComponents",true)){s[r.URL]={document:r,type:"doc"};return s}z="doc";if(r.nodeType===this.NODETYPE.DOCUMENT){B=r;u=r.URL}else{if(r.nodeType===this.NODETYPE.ELEMENT&&r.nodeName.toLowerCase()==="frame"){B=r.contentDocument;u=r.src}else{if(r.nodeType===this.NODETYPE.ELEMENT&&r.nodeName.toLowerCase()==="iframe"){B=r.contentDocument;u=r.src;z="iframe";try{A=r.contentWindow;A=A&&A.parent;A=A&&A.document;A=A||r.ownerDocument;if(A&&A.URL===u){u=!r.getAttribute("src")?"":"about:blank"}}catch(t){YSLOW.util.dump(t)}}else{return s}}}s[u]={document:B,type:z};try{y=B.getElementsByTagName("iframe");for(v=0,w=y.length;v0){for(s=0;s0){for(s=0;s