blob: a3baa71fc842287a77f40d7df3bb8c6c0d458144 [file] [log] [blame]
WebInspector.SecurityModel=function(target)
{WebInspector.SDKModel.call(this,WebInspector.SecurityModel,target);this._dispatcher=new WebInspector.SecurityDispatcher(this);this._securityAgent=target.securityAgent();target.registerSecurityDispatcher(this._dispatcher);this._securityAgent.enable();}
WebInspector.SecurityModel.EventTypes={SecurityStateChanged:"SecurityStateChanged"}
WebInspector.SecurityModel.prototype={__proto__:WebInspector.SDKModel.prototype}
WebInspector.SecurityModel.fromTarget=function(target)
{var model=(target.model(WebInspector.SecurityModel));if(!model)
model=new WebInspector.SecurityModel(target);return model;}
WebInspector.SecurityModel.SecurityStateComparator=function(a,b)
{var securityStateMap;if(WebInspector.SecurityModel._symbolicToNumericSecurityState){securityStateMap=WebInspector.SecurityModel._symbolicToNumericSecurityState;}else{securityStateMap=new Map();var ordering=[SecurityAgent.SecurityState.Info,SecurityAgent.SecurityState.Insecure,SecurityAgent.SecurityState.Neutral,SecurityAgent.SecurityState.Warning,SecurityAgent.SecurityState.Secure,SecurityAgent.SecurityState.Unknown];for(var i=0;i<ordering.length;i++)
securityStateMap.set(ordering[i],i+1);WebInspector.SecurityModel._symbolicToNumericSecurityState=securityStateMap;}
var aScore=securityStateMap.get(a)||0;var bScore=securityStateMap.get(b)||0;return aScore-bScore;}
WebInspector.PageSecurityState=function(securityState,explanations,mixedContentStatus,schemeIsCryptographic){this.securityState=securityState;this.explanations=explanations;this.mixedContentStatus=mixedContentStatus;this.schemeIsCryptographic=schemeIsCryptographic;}
WebInspector.SecurityDispatcher=function(model)
{this._model=model;}
WebInspector.SecurityDispatcher.prototype={securityStateChanged:function(securityState,explanations,mixedContentStatus,schemeIsCryptographic)
{var pageSecurityState=new WebInspector.PageSecurityState(securityState,explanations||[],mixedContentStatus||null,schemeIsCryptographic||false);this._model.dispatchEventToListeners(WebInspector.SecurityModel.EventTypes.SecurityStateChanged,pageSecurityState);}};WebInspector.SecurityPanel=function()
{WebInspector.PanelWithSidebar.call(this,"security");this._mainView=new WebInspector.SecurityMainView(this);this._sidebarMainViewElement=new WebInspector.SecurityPanelSidebarTreeElement(WebInspector.UIString("Overview"),this._setVisibleView.bind(this,this._mainView),"security-main-view-sidebar-tree-item","lock-icon");this._sidebarTree=new WebInspector.SecurityPanelSidebarTree(this._sidebarMainViewElement,this.showOrigin.bind(this));this.panelSidebarElement().appendChild(this._sidebarTree.element);this.setDefaultFocusedElement(this._sidebarTree.element);this._lastResponseReceivedForLoaderId=new Map();this._origins=new Map();WebInspector.targetManager.addModelListener(WebInspector.ResourceTreeModel,WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated,this._onMainFrameNavigated,this);this._filterRequestCounts=new Map();WebInspector.targetManager.observeTargets(this,WebInspector.Target.Type.Page);WebInspector.targetManager.addModelListener(WebInspector.NetworkManager,WebInspector.NetworkManager.EventTypes.ResponseReceived,this._onResponseReceived,this);WebInspector.targetManager.addModelListener(WebInspector.NetworkManager,WebInspector.NetworkManager.EventTypes.RequestFinished,this._onRequestFinished,this);WebInspector.targetManager.addModelListener(WebInspector.SecurityModel,WebInspector.SecurityModel.EventTypes.SecurityStateChanged,this._onSecurityStateChanged,this);}
WebInspector.SecurityPanel.Origin;WebInspector.SecurityPanel.OriginState;WebInspector.SecurityPanel.prototype={setRanInsecureContentStyle:function(securityState)
{this._ranInsecureContentStyle=securityState;},setDisplayedInsecureContentStyle:function(securityState)
{this._displayedInsecureContentStyle=securityState;},_updateSecurityState:function(newSecurityState,explanations,mixedContentStatus,schemeIsCryptographic)
{this._sidebarMainViewElement.setSecurityState(newSecurityState);this._mainView.updateSecurityState(newSecurityState,explanations,mixedContentStatus,schemeIsCryptographic);},_onSecurityStateChanged:function(event)
{var data=(event.data);var securityState=(data.securityState);var explanations=(data.explanations);var mixedContentStatus=(data.mixedContentStatus);var schemeIsCryptographic=(data.schemeIsCryptographic);this._updateSecurityState(securityState,explanations,mixedContentStatus,schemeIsCryptographic);},selectAndSwitchToMainView:function()
{this._sidebarMainViewElement.select();},showOrigin:function(origin)
{var originState=this._origins.get(origin);if(!originState.originView)
originState.originView=new WebInspector.SecurityOriginView(this,origin,originState);this._setVisibleView(originState.originView);},wasShown:function()
{WebInspector.Panel.prototype.wasShown.call(this);if(!this._visibleView)
this.selectAndSwitchToMainView();},_setVisibleView:function(view)
{if(this._visibleView===view)
return;if(this._visibleView)
this._visibleView.detach();this._visibleView=view;if(view)
this.splitWidget().setMainWidget(view);},_onResponseReceived:function(event)
{var request=(event.data);if(request.resourceType()==WebInspector.resourceTypes.Document)
this._lastResponseReceivedForLoaderId.set(request.loaderId,request);},_processRequest:function(request)
{var origin=WebInspector.ParsedURL.splitURLIntoPathComponents(request.url)[0];if(!origin){return;}
var securityState=(request.securityState());if(request.mixedContentType===NetworkAgent.RequestMixedContentType.Blockable&&this._ranInsecureContentStyle)
securityState=this._ranInsecureContentStyle;else if(request.mixedContentType===NetworkAgent.RequestMixedContentType.OptionallyBlockable&&this._displayedInsecureContentStyle)
securityState=this._displayedInsecureContentStyle;if(this._origins.has(origin)){var originState=this._origins.get(origin);var oldSecurityState=originState.securityState;originState.securityState=this._securityStateMin(oldSecurityState,securityState);if(oldSecurityState!=originState.securityState){this._sidebarTree.updateOrigin(origin,securityState);if(originState.originView)
originState.originView.setSecurityState(securityState);}}else{var originState={};originState.securityState=securityState;var securityDetails=request.securityDetails();if(securityDetails){originState.securityDetails=securityDetails;originState.certificateDetailsPromise=request.target().networkManager.certificateDetailsPromise(securityDetails.certificateId);}
this._origins.set(origin,originState);this._sidebarTree.addOrigin(origin,securityState);}},_onRequestFinished:function(event)
{var request=(event.data);this._updateFilterRequestCounts(request);this._processRequest(request);},_updateFilterRequestCounts:function(request)
{if(request.mixedContentType===NetworkAgent.RequestMixedContentType.None)
return;var filterKey=WebInspector.NetworkLogView.MixedContentFilterValues.All;if(request.wasBlocked())
filterKey=WebInspector.NetworkLogView.MixedContentFilterValues.Blocked;else if(request.mixedContentType===NetworkAgent.RequestMixedContentType.Blockable)
filterKey=WebInspector.NetworkLogView.MixedContentFilterValues.BlockOverridden;else if(request.mixedContentType===NetworkAgent.RequestMixedContentType.OptionallyBlockable)
filterKey=WebInspector.NetworkLogView.MixedContentFilterValues.Displayed;if(!this._filterRequestCounts.has(filterKey))
this._filterRequestCounts.set(filterKey,1);else
this._filterRequestCounts.set(filterKey,this._filterRequestCounts.get(filterKey)+1);this._mainView.refreshExplanations();},filterRequestCount:function(filterKey)
{return this._filterRequestCounts.get(filterKey)||0;},_securityStateMin:function(stateA,stateB)
{return WebInspector.SecurityModel.SecurityStateComparator(stateA,stateB)<0?stateA:stateB;},targetAdded:function(target)
{WebInspector.SecurityModel.fromTarget(target);},targetRemoved:function(target)
{},_clearOrigins:function()
{this.selectAndSwitchToMainView();this._sidebarTree.clearOrigins();this._origins.clear();this._lastResponseReceivedForLoaderId.clear();this._filterRequestCounts.clear();},_onMainFrameNavigated:function(event){var frame=(event.data);var request=this._lastResponseReceivedForLoaderId.get(frame.loaderId);this._clearOrigins();var origin=WebInspector.ParsedURL.splitURLIntoPathComponents(request.url)[0];this._sidebarTree.setMainOrigin(origin);if(request)
this._processRequest(request);},__proto__:WebInspector.PanelWithSidebar.prototype}
WebInspector.SecurityPanel._instance=function()
{if(!WebInspector.SecurityPanel._instanceObject)
WebInspector.SecurityPanel._instanceObject=new WebInspector.SecurityPanel();return WebInspector.SecurityPanel._instanceObject;}
WebInspector.SecurityPanel.createCertificateViewerButton=function(text,certificateId)
{function showCertificateViewer(e)
{e.consume();WebInspector.multitargetNetworkManager.showCertificateViewer((certificateId));}
return createTextButton(text,showCertificateViewer,"security-certificate-button");}
WebInspector.SecurityPanelSidebarTree=function(mainViewElement,showOriginInPanel)
{this._showOriginInPanel=showOriginInPanel;this._mainOrigin=null;TreeOutlineInShadow.call(this);this.element.classList.add("sidebar-tree");this.registerRequiredCSS("security/sidebar.css");this.registerRequiredCSS("security/lockIcon.css");this.appendChild(mainViewElement);this._originGroups=new Map();for(var key in WebInspector.SecurityPanelSidebarTree.OriginGroupName){var originGroupName=WebInspector.SecurityPanelSidebarTree.OriginGroupName[key];var originGroup=new WebInspector.SidebarSectionTreeElement(WebInspector.UIString(originGroupName));originGroup.listItemElement.classList.add("security-sidebar-origins");this._originGroups.set(originGroupName,originGroup);this.appendChild(originGroup);}
this._clearOriginGroups();var mainViewReloadMessage=new WebInspector.SidebarTreeElement("security-main-view-reload-message",WebInspector.UIString("Reload to view details"));mainViewReloadMessage.selectable=false;this._originGroups.get(WebInspector.SecurityPanelSidebarTree.OriginGroupName.MainOrigin).appendChild(mainViewReloadMessage);this._elementsByOrigin=new Map();}
WebInspector.SecurityPanelSidebarTree.prototype={addOrigin:function(origin,securityState)
{var originElement=new WebInspector.SecurityPanelSidebarTreeElement(origin,this._showOriginInPanel.bind(this,origin),"security-sidebar-tree-item","security-property");originElement.listItemElement.title=origin;this._elementsByOrigin.set(origin,originElement);this.updateOrigin(origin,securityState);},setMainOrigin:function(origin)
{this._mainOrigin=origin;},updateOrigin:function(origin,securityState)
{var originElement=(this._elementsByOrigin.get(origin));originElement.setSecurityState(securityState);var newParent;if(origin===this._mainOrigin){newParent=this._originGroups.get(WebInspector.SecurityPanelSidebarTree.OriginGroupName.MainOrigin);}else{switch(securityState){case SecurityAgent.SecurityState.Secure:newParent=this._originGroups.get(WebInspector.SecurityPanelSidebarTree.OriginGroupName.Secure);break;case SecurityAgent.SecurityState.Unknown:newParent=this._originGroups.get(WebInspector.SecurityPanelSidebarTree.OriginGroupName.Unknown);break;default:newParent=this._originGroups.get(WebInspector.SecurityPanelSidebarTree.OriginGroupName.NonSecure);break;}}
var oldParent=originElement.parent;if(oldParent!==newParent){if(oldParent){oldParent.removeChild(originElement);if(oldParent.childCount()===0)
oldParent.hidden=true;}
newParent.appendChild(originElement);newParent.hidden=false;}},_clearOriginGroups:function()
{for(var originGroup of this._originGroups.values()){originGroup.removeChildren();originGroup.hidden=true;}
this._originGroups.get(WebInspector.SecurityPanelSidebarTree.OriginGroupName.MainOrigin).hidden=false;},clearOrigins:function()
{this._clearOriginGroups();this._elementsByOrigin.clear();},__proto__:TreeOutlineInShadow.prototype}
WebInspector.SecurityPanelSidebarTree.OriginGroupName={MainOrigin:"Main Origin",NonSecure:"Non-Secure Origins",Secure:"Secure Origins",Unknown:"Unknown / Canceled"}
WebInspector.SecurityPanelSidebarTreeElement=function(text,selectCallback,className,cssPrefix)
{this._selectCallback=selectCallback;this._cssPrefix=cssPrefix;WebInspector.SidebarTreeElement.call(this,className,text);this.iconElement.classList.add(this._cssPrefix);this.setSecurityState(SecurityAgent.SecurityState.Unknown);}
WebInspector.SecurityPanelSidebarTreeElement.prototype={setSecurityState:function(newSecurityState)
{if(this._securityState)
this.iconElement.classList.remove(this._cssPrefix+"-"+this._securityState)
this._securityState=newSecurityState;this.iconElement.classList.add(this._cssPrefix+"-"+newSecurityState);},securityState:function()
{return this._securityState;},onselect:function()
{this._selectCallback();return true;},__proto__:WebInspector.SidebarTreeElement.prototype}
WebInspector.SecurityPanelSidebarTreeElement.SecurityStateComparator=function(a,b)
{return WebInspector.SecurityModel.SecurityStateComparator(a.securityState(),b.securityState());}
WebInspector.SecurityPanelFactory=function()
{}
WebInspector.SecurityPanelFactory.prototype={createPanel:function()
{return WebInspector.SecurityPanel._instance();}}
WebInspector.SecurityMainView=function(panel)
{WebInspector.VBox.call(this,true);this.registerRequiredCSS("security/mainView.css");this.registerRequiredCSS("security/lockIcon.css");this.setMinimumSize(200,100);this.contentElement.classList.add("security-main-view");this._panel=panel;this._summarySection=this.contentElement.createChild("div","security-summary");this._securityExplanations=this.contentElement.createChild("div","security-explanation-list");this._summarySection.createChild("div","security-summary-section-title").textContent=WebInspector.UIString("Security Overview");var lockSpectrum=this._summarySection.createChild("div","lock-spectrum");lockSpectrum.createChild("div","lock-icon lock-icon-secure").title=WebInspector.UIString("Secure");lockSpectrum.createChild("div","security-summary-lock-spacer");lockSpectrum.createChild("div","lock-icon lock-icon-neutral").title=WebInspector.UIString("Not Secure");lockSpectrum.createChild("div","security-summary-lock-spacer");lockSpectrum.createChild("div","lock-icon lock-icon-insecure").title=WebInspector.UIString("Insecure (Broken)");this._summarySection.createChild("div","triangle-pointer-container").createChild("div","triangle-pointer-wrapper").createChild("div","triangle-pointer");this._summaryText=this._summarySection.createChild("div","security-summary-text");}
WebInspector.SecurityMainView.prototype={_addExplanation:function(explanation)
{var explanationSection=this._securityExplanations.createChild("div","security-explanation");explanationSection.classList.add("security-explanation-"+explanation.securityState);explanationSection.createChild("div","security-property").classList.add("security-property-"+explanation.securityState);var text=explanationSection.createChild("div","security-explanation-text");text.createChild("div","security-explanation-title").textContent=explanation.summary;text.createChild("div").textContent=explanation.description;if(explanation.certificateId){text.appendChild(WebInspector.SecurityPanel.createCertificateViewerButton(WebInspector.UIString("View certificate"),explanation.certificateId));}
return text;},updateSecurityState:function(newSecurityState,explanations,mixedContentStatus,schemeIsCryptographic)
{this._summarySection.classList.remove("security-summary-"+this._securityState);this._securityState=newSecurityState;this._summarySection.classList.add("security-summary-"+this._securityState);var summaryExplanationStrings={"unknown":WebInspector.UIString("This security of this page is unknown."),"insecure":WebInspector.UIString("This page is insecure (broken HTTPS)."),"neutral":WebInspector.UIString("This page is not secure."),"secure":WebInspector.UIString("This page is secure (valid HTTPS).")}
this._summaryText.textContent=summaryExplanationStrings[this._securityState];this._explanations=explanations,this._mixedContentStatus=mixedContentStatus;this._schemeIsCryptographic=schemeIsCryptographic;this._panel.setRanInsecureContentStyle(mixedContentStatus.ranInsecureContentStyle);this._panel.setDisplayedInsecureContentStyle(mixedContentStatus.displayedInsecureContentStyle);this.refreshExplanations();},refreshExplanations:function()
{this._securityExplanations.removeChildren();for(var explanation of this._explanations)
this._addExplanation(explanation);this._addMixedContentExplanations();},_addMixedContentExplanations:function()
{if(!this._schemeIsCryptographic)
return;if(this._mixedContentStatus&&(this._mixedContentStatus.ranInsecureContent||this._mixedContentStatus.displayedInsecureContent)){if(this._mixedContentStatus.ranInsecureContent)
this._addMixedContentExplanation(this._mixedContentStatus.ranInsecureContentStyle,WebInspector.UIString("Active Mixed Content"),WebInspector.UIString("You have recently allowed insecure content (such as scripts or iframes) to run on this site."),WebInspector.NetworkLogView.MixedContentFilterValues.BlockOverridden,showBlockOverriddenMixedContentInNetworkPanel);if(this._mixedContentStatus.displayedInsecureContent)
this._addMixedContentExplanation(this._mixedContentStatus.displayedInsecureContentStyle,WebInspector.UIString("Mixed Content"),WebInspector.UIString("The site includes HTTP resources."),WebInspector.NetworkLogView.MixedContentFilterValues.Displayed,showDisplayedMixedContentInNetworkPanel);}
if(this._mixedContentStatus&&(!this._mixedContentStatus.displayedInsecureContent&&!this._mixedContentStatus.ranInsecureContent)){this._addExplanation(({"securityState":SecurityAgent.SecurityState.Secure,"summary":WebInspector.UIString("Secure Resources"),"description":WebInspector.UIString("All resources on this page are served securely.")}));}
if(this._panel.filterRequestCount(WebInspector.NetworkLogView.MixedContentFilterValues.Blocked)>0)
this._addMixedContentExplanation(SecurityAgent.SecurityState.Info,WebInspector.UIString("Blocked mixed content"),WebInspector.UIString("Your page requested insecure resources that were blocked."),WebInspector.NetworkLogView.MixedContentFilterValues.Blocked,showBlockedMixedContentInNetworkPanel);function showDisplayedMixedContentInNetworkPanel(e)
{e.consume();WebInspector.NetworkPanel.revealAndFilter([{filterType:WebInspector.NetworkLogView.FilterType.MixedContent,filterValue:WebInspector.NetworkLogView.MixedContentFilterValues.Displayed}]);}
function showBlockOverriddenMixedContentInNetworkPanel(e)
{e.consume();WebInspector.NetworkPanel.revealAndFilter([{filterType:WebInspector.NetworkLogView.FilterType.MixedContent,filterValue:WebInspector.NetworkLogView.MixedContentFilterValues.BlockOverridden}]);}
function showBlockedMixedContentInNetworkPanel(e)
{e.consume();WebInspector.NetworkPanel.revealAndFilter([{filterType:WebInspector.NetworkLogView.FilterType.MixedContent,filterValue:WebInspector.NetworkLogView.MixedContentFilterValues.Blocked}]);}},_addMixedContentExplanation:function(securityState,summary,description,filterKey,networkFilterFn)
{var mixedContentExplanation=({"securityState":securityState,"summary":summary,"description":description});var filterRequestCount=this._panel.filterRequestCount(filterKey);var requestsAnchor=this._addExplanation(mixedContentExplanation).createChild("div","security-mixed-content link");if(filterRequestCount>0){requestsAnchor.textContent=WebInspector.UIString("View %d request%s in Network Panel",filterRequestCount,(filterRequestCount>1?"s":""));}else{requestsAnchor.textContent=WebInspector.UIString("View requests in Network Panel");}
requestsAnchor.href="";requestsAnchor.addEventListener("click",networkFilterFn);},__proto__:WebInspector.VBox.prototype}
WebInspector.SecurityOriginView=function(panel,origin,originState)
{this._panel=panel;WebInspector.VBox.call(this);this.setMinimumSize(200,100);this.element.classList.add("security-origin-view");this.registerRequiredCSS("security/originView.css");this.registerRequiredCSS("security/lockIcon.css");var titleSection=this.element.createChild("div","origin-view-section title-section");titleSection.createChild("div","origin-view-title").textContent=WebInspector.UIString("Origin");var originDisplay=titleSection.createChild("div","origin-display");this._originLockIcon=originDisplay.createChild("span","security-property");this._originLockIcon.classList.add("security-property-"+originState.securityState);originDisplay.createChild("span","origin").textContent=origin;var originNetworkLink=originDisplay.createChild("div","link");originNetworkLink.textContent=WebInspector.UIString("View requests in Network Panel");function showOriginRequestsInNetworkPanel()
{var parsedURL=new WebInspector.ParsedURL(origin);WebInspector.NetworkPanel.revealAndFilter([{filterType:WebInspector.NetworkLogView.FilterType.Domain,filterValue:parsedURL.host},{filterType:WebInspector.NetworkLogView.FilterType.Scheme,filterValue:parsedURL.scheme}]);}
originNetworkLink.addEventListener("click",showOriginRequestsInNetworkPanel,false);if(originState.securityDetails){var connectionSection=this.element.createChild("div","origin-view-section");connectionSection.createChild("div","origin-view-section-title").textContent=WebInspector.UIString("Connection");var table=new WebInspector.SecurityDetailsTable();connectionSection.appendChild(table.element());table.addRow("Protocol",originState.securityDetails.protocol);table.addRow("Key Exchange",originState.securityDetails.keyExchange);table.addRow("Cipher Suite",originState.securityDetails.cipher+(originState.securityDetails.mac?" with "+originState.securityDetails.mac:""));var certificateSection=this.element.createChild("div","origin-view-section");certificateSection.createChild("div","origin-view-section-title").textContent=WebInspector.UIString("Certificate");function displayCertificateDetails(certificateDetails)
{var sanDiv=this._createSanDiv(certificateDetails.subject);var validFromString=new Date(1000*certificateDetails.validFrom).toUTCString();var validUntilString=new Date(1000*certificateDetails.validTo).toUTCString();var table=new WebInspector.SecurityDetailsTable();certificateSection.appendChild(table.element());table.addRow("Subject",certificateDetails.subject.name);table.addRow("SAN",sanDiv);table.addRow("Valid From",validFromString);table.addRow("Valid Until",validUntilString);table.addRow("Issuer",certificateDetails.issuer);table.addRow("",WebInspector.SecurityPanel.createCertificateViewerButton(WebInspector.UIString("Open full certificate details"),originState.securityDetails.certificateId));}
function displayCertificateDetailsUnavailable()
{certificateSection.createChild("div").textContent=WebInspector.UIString("Certificate details unavailable.");}
originState.certificateDetailsPromise.then(displayCertificateDetails.bind(this),displayCertificateDetailsUnavailable);var noteSection=this.element.createChild("div","origin-view-section");noteSection.createChild("div").textContent=WebInspector.UIString("The security details above are from the first inspected response.");}else if(originState.securityState!==SecurityAgent.SecurityState.Unknown){var notSecureSection=this.element.createChild("div","origin-view-section");notSecureSection.createChild("div","origin-view-section-title").textContent=WebInspector.UIString("Not Secure");notSecureSection.createChild("div").textContent=WebInspector.UIString("Your connection to this origin is not secure.");}else{var noInfoSection=this.element.createChild("div","origin-view-section");noInfoSection.createChild("div","origin-view-section-title").textContent=WebInspector.UIString("No Security Information");noInfoSection.createChild("div").textContent=WebInspector.UIString("No security details are available for this origin.");}}
WebInspector.SecurityOriginView.prototype={_createSanDiv:function(certificateSubject)
{var sanDiv=createElement("div");var sanList=certificateSubject.sanDnsNames.concat(certificateSubject.sanIpAddresses);if(sanList.length===0){sanDiv.textContent=WebInspector.UIString("(N/A)");sanDiv.classList.add("empty-san");}else{var truncatedNumToShow=2;var listIsTruncated=sanList.length>truncatedNumToShow;for(var i=0;i<sanList.length;i++){var span=sanDiv.createChild("span","san-entry");span.textContent=sanList[i];if(listIsTruncated&&i>=truncatedNumToShow)
span.classList.add("truncated-entry");}
if(listIsTruncated){var truncatedSANToggle=sanDiv.createChild("div","link");truncatedSANToggle.href="";function toggleSANTruncation()
{if(sanDiv.classList.contains("truncated-san")){sanDiv.classList.remove("truncated-san")
truncatedSANToggle.textContent=WebInspector.UIString("Show less");}else{sanDiv.classList.add("truncated-san");truncatedSANToggle.textContent=WebInspector.UIString("Show more (%d total)",sanList.length);}}
truncatedSANToggle.addEventListener("click",toggleSANTruncation,false);toggleSANTruncation();}}
return sanDiv;},setSecurityState:function(newSecurityState)
{for(var className of Array.prototype.slice.call(this._originLockIcon.classList)){if(className.startsWith("security-property-"))
this._originLockIcon.classList.remove(className);}
this._originLockIcon.classList.add("security-property-"+newSecurityState);},__proto__:WebInspector.VBox.prototype}
WebInspector.SecurityDetailsTable=function()
{this._element=createElement("table");this._element.classList.add("details-table");}
WebInspector.SecurityDetailsTable.prototype={element:function()
{return this._element;},addRow:function(key,value)
{var row=this._element.createChild("div","details-table-row");row.createChild("div").textContent=key;var valueDiv=row.createChild("div");if(typeof value==="string"){valueDiv.textContent=value;}else{valueDiv.appendChild(value);}}};Runtime.cachedResources["security/lockIcon.css"]="/* Copyright (c) 2015 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n.lock-icon,\n.security-property {\n background-size: cover;\n height: 16px;\n width: 16px;\n}\n\n.lock-icon-unknown {\n background-image: url(Images/securityStateNeutral.svg);\n}\n\n.lock-icon-neutral {\n background-image: url(Images/securityStateNeutral.svg);\n}\n\n.lock-icon-insecure {\n background-image: url(Images/securityStateInsecure.svg);\n}\n\n.lock-icon-secure {\n background-image: url(Images/securityStateSecure.svg);\n}\n\n.security-property-insecure {\n background-image: url(Images/securityPropertyInsecure.svg);\n}\n\n.security-property-neutral {\n background-image: url(Images/securityPropertyWarning.svg);\n}\n\n.security-property-warning {\n background-image: url(Images/securityPropertyWarning.svg);\n}\n\n.security-property-unknown {\n background-image: url(Images/securityPropertyUnknown.svg);\n}\n\n.security-property-secure {\n background-image: url(Images/securityPropertySecure.svg);\n}\n\n.security-property-info {\n background-image: url(Images/securityPropertyInfo.svg);\n}\n\n/*# sourceURL=security/lockIcon.css */";Runtime.cachedResources["security/mainView.css"]="/* Copyright (c) 2015 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n.security-main-view {\n -webkit-user-select: text;\n overflow-x: hidden;\n overflow-y: auto;\n background-color: #f9f9f9;\n}\n\n.security-main-view > div {\n flex-shrink: 0;\n}\n\n.security-summary {\n background-color: #fff;\n}\n\n.security-summary-section-title {\n font-size: 14px;\n margin: 12px 24px;\n}\n\n.lock-spectrum {\n min-width: 180px;\n max-width: 240px;\n margin: 6px 12px;\n display: flex;\n align-items: center;\n}\n\n.security-summary .lock-icon {\n flex: none;\n width: 32px;\n height: 32px;\n margin: 0 12px;\n background-position: center center;\n\n /* Defaults for dynamic properties. */\n opacity: 0.5;\n}\n\n/* Shrink the margin for the page lock icon. */\n.security-summary .lock-icon-neutral {\n margin: 0 6px;\n}\n\n.security-summary-secure .lock-icon-secure,\n.security-summary-neutral .lock-icon-neutral,\n.security-summary-insecure .lock-icon-insecure {\n opacity: 1;\n}\n\n.security-summary-lock-spacer {\n flex: 1 1 auto;\n height: 1px;\n background: rgb(217, 217, 217);\n}\n\n.triangle-pointer-container {\n /* Let (lock width) = (horizonal width of 1 lock icon, including both margins) */\n /* Horizontal margin is (lock width)/2 + (lock-spectrum horizontal margin) */\n margin: 8px 40px 0px;\n /* Width is (lock spectrum width) - (lock width) */\n min-width: 124px;\n max-width: 184px;\n}\n\n.triangle-pointer-wrapper {\n /* Defaults for dynamic properties. */\n transform: translateX(50%);\n transition: transform 0.3s;\n}\n\n.triangle-pointer {\n width: 12px;\n height: 12px;\n margin-bottom: -6px;\n margin-left: -6px;\n transform: rotate(-45deg);\n border-style: solid;\n border-width: 1px 1px 0 0;\n\n /* Defaults for dynamic properties. */\n background: rgb(243, 243, 243);\n border-color: rgb(217, 217, 217);\n}\n\n.security-summary-secure .triangle-pointer-wrapper {\n transform: translateX(0%);\n}\n\n.security-summary-neutral .triangle-pointer-wrapper {\n transform: translateX(50%);\n}\n\n.security-summary-insecure .triangle-pointer-wrapper {\n transform: translateX(100%);\n}\n\n.security-summary-text {\n padding: 12px 24px;\n border-style: solid;\n border-width: 1px 0;\n\n /* Defaults for dynamic properties. */\n background: rgb(243, 243, 243);\n border-color: rgb(217, 217, 217);\n color: rgb(127, 127, 127);\n}\n\n.security-summary-secure .triangle-pointer,\n.security-summary-secure .security-summary-text {\n background: rgb(243, 252, 244);\n border-color: rgb(137, 222, 144);\n color: rgb(42, 194, 57);\n}\n\n.security-summary-neutral .triangle-pointer,\n.security-summary-neutral .security-summary-text {\n background: rgb(255, 251, 243);\n border-color: rgb(253, 214, 129);\n color: rgb(253, 177, 48);\n}\n\n.security-summary-insecure .triangle-pointer,\n.security-summary-insecure .security-summary-text {\n background: rgb(253, 245, 245);\n border-color: rgb(243, 157, 151);\n color: rgb(216, 70, 60);\n}\n\n.security-explanation {\n padding: 12px;\n border-bottom: 1px solid rgb(230, 230, 230);\n background-color: #fff;\n\n display: flex;\n white-space: nowrap;\n}\n\n.security-explanation-text {\n flex: auto;\n white-space: normal;\n}\n\n.security-explanation-info {\n border-bottom: none;\n background-color: transparent;\n}\n\n.security-certificate-button {\n margin-top: 8px;\n}\n\n.security-explanation .security-property {\n flex: none;\n width: 18px;\n height: 18px;\n margin-left: 10px;\n margin-right: 18px;\n}\n\n.security-explanation-title {\n color: rgb(90, 90, 90);\n margin-top: 1px;\n margin-bottom: 8px;\n}\n\n.security-explanation-neutral .security-section-title,\n.security-explanation-warning .security-section-title\n{\n color: rgb(253, 177, 48);\n font-weight: bold;\n}\n.security-explanation-insecure .security-section-title\n{\n color: rgb(216, 71, 60);\n font-weight: bold;\n}\n\n.security-mixed-content {\n margin-top: 8px;\n}\n\n/*# sourceURL=security/mainView.css */";Runtime.cachedResources["security/originView.css"]="/* Copyright (c) 2015 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n.security-origin-view {\n overflow-x: hidden;\n overflow-y: scroll;\n display: block;\n -webkit-user-select: text;\n}\n\n.security-origin-view .origin-view-section {\n padding: 1.5em 1.5em 1.5em;\n border-bottom: 1px solid rgb(230, 230, 230);\n}\n\n.security-origin-view .title-section {\n padding-bottom: 1.5em;\n}\n\n.security-origin-view .origin-display .security-property {\n margin: -1px 2px 0px 0px;\n display: inline-block;\n vertical-align: middle;\n}\n\n.security-origin-view .origin-view-title {\n font-size: 1.25em;\n margin-top: 0.5em;\n margin-bottom: 0.25em;\n}\n\n.security-origin-view .origin-view-section-title {\n font-weight: bold;\n font-size: 1em;\n margin-bottom: 0.25em;\n}\n\n.security-origin-view .details-table-row {\n display: flex;\n white-space: nowrap;\n overflow: hidden;\n margin-top: 6px;\n}\n\n.security-origin-view .details-table-row > div {\n align-items: flex-start;\n}\n\n.security-origin-view .details-table-row > div:first-child {\n color: rgb(140, 140, 140);\n width: 7em;\n margin-right: 1em;\n flex: none;\n display: flex;\n justify-content: flex-end;\n}\n.security-origin-view .details-table-row > div:nth-child(2) {\n flex: auto;\n white-space: normal;\n}\n\n.security-origin-view .details-table .empty-san {\n color: rgb(140, 140, 140);\n}\n\n.security-origin-view .details-table .san-entry {\n display: block;\n}\n\n.security-origin-view .truncated-san .truncated-entry {\n display: none;\n}\n\n.security-certificate-button {\n margin-top: 4px;\n}\n\n/*# sourceURL=security/originView.css */";Runtime.cachedResources["security/sidebar.css"]="/* Copyright (c) 2015 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n.tree-outline {\n padding: 0;\n}\n\n.tree-outline li {\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n\n.tree-outline:focus li.selected .lock-icon-neutral {\n background-color: #fff;\n}\n\n.tree-outline .security-main-view-sidebar-tree-item {\n border-bottom: 1px solid rgb(230, 230, 230);\n padding: 16px 0;\n}\n\n.tree-outline .security-sidebar-origins {\n padding: 1px 8px 6px 8px;\n margin-top: 1em;\n margin-bottom: 0.5em;\n color: rgb(90, 90, 90);\n}\n\n.tree-outline ol {\n padding-left: 0;\n}\n\n.tree-outline li::before {\n content: none;\n}\n\n.tree-outline .security-main-view-sidebar-tree-item,\n.tree-outline .security-sidebar-origins,\n.tree-outline .sidebar-tree-section + .children > .sidebar-tree-item {\n padding-left: 16px;\n}\n\n.tree-outline .sidebar-tree-item .lock-icon,\n.tree-outline .sidebar-tree-item .security-property {\n margin-right: 2px;\n flex: none;\n}\n\n.tree-outline:focus .security-sidebar-tree-item.selected .icon:not(.security-property-unknown) {\n background-image: none;\n background-color: #fff;\n}\n\n.security-sidebar-tree-item {\n padding: 2px 0;\n}\n\n.security-sidebar-tree-item .titles {\n overflow: hidden;\n margin-right: 5px;\n}\n\n.tree-outline li.selected .lock-icon-neutral {\n background-image: none;\n background-color: #5a5a5a;\n -webkit-mask-image: url(Images/securityStateNeutral.svg);\n -webkit-mask-size: cover;\n}\n\n.tree-outline .security-sidebar-tree-item.selected .security-property-insecure {\n -webkit-mask-image: url(Images/securityPropertyInsecure.svg);\n}\n\n.security-sidebar-tree-item.selected .security-property-neutral,\n.security-sidebar-tree-item.selected .security-property-warning {\n -webkit-mask-image: url(Images/securityPropertyWarning.svg);\n}\n\n.tree-outline .security-sidebar-tree-item.selected .security-property-unknown {\n -webkit-mask-image: url(Images/securityPropertyUnknown.svg);\n}\n\n.security-sidebar-tree-item.selected .security-property-secure {\n -webkit-mask-image: url(Images/securityPropertySecure.svg);\n}\n\n.sidebar-tree-item.security-main-view-reload-message .title {\n color: rgba(0, 0, 0, 0.5);\n padding-left: 8px;\n}\n\n/*# sourceURL=security/sidebar.css */";