Commit 3a90cf23 authored by lgarron@chromium.org's avatar lgarron@chromium.org

Keep track of per-origin origin security details in the Security panel.

BUG=502118, 503170

Review URL: https://codereview.chromium.org/1284413004

git-svn-id: svn://svn.chromium.org/blink/trunk@200868 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent e0f70263
......@@ -54,7 +54,8 @@ WebInspector.NetworkManager.EventTypes = {
RequestStarted: "RequestStarted",
RequestUpdated: "RequestUpdated",
RequestFinished: "RequestFinished",
RequestUpdateDropped: "RequestUpdateDropped"
RequestUpdateDropped: "RequestUpdateDropped",
ResponseReceivedSecurityDetails: "ResponseReceivedSecurityDetails"
}
WebInspector.NetworkManager._MIMETypes = {
......@@ -349,6 +350,41 @@ WebInspector.NetworkDispatcher.prototype = {
this._updateNetworkRequestWithResponse(networkRequest, response);
this._updateNetworkRequest(networkRequest);
this._dispatchResponseReceivedSecurityDetails(requestId, response);
},
/**
* @param {!NetworkAgent.RequestId} requestId
* @param {!NetworkAgent.Response} response
*/
_dispatchResponseReceivedSecurityDetails: function(requestId, response)
{
var eventData = {};
eventData.requestId = requestId;
eventData.origin = WebInspector.ParsedURL.splitURLIntoPathComponents(response.url)[0];
eventData.securityState = response.securityState;
if (response.securityDetails) {
/**
* @this {WebInspector.NetworkDispatcher}
* @param {?Protocol.Error} error
* @param {!NetworkAgent.CertificateDetails} certificateDetails
*/
function callback(error, certificateDetails)
{
if (error)
console.error("Unable to get certificate details from the browser (for certificate ID ", response.securityDetails.certificateId, "): ", error);
else
eventData.securityDetails.certificateDetails = certificateDetails;
this._manager.dispatchEventToListeners(WebInspector.NetworkManager.EventTypes.ResponseReceivedSecurityDetails, eventData);
}
eventData.securityDetails = response.securityDetails;
this._manager._networkAgent.getCertificateDetails(response.securityDetails.certificateId, callback.bind(this));
} else {
this._manager.dispatchEventToListeners(WebInspector.NetworkManager.EventTypes.ResponseReceivedSecurityDetails, eventData);
}
},
/**
......
......@@ -24,6 +24,12 @@ WebInspector.SecurityPanel = function() {
this._mainView = new WebInspector.SecurityMainView();
this.showMainView();
/** @type {!Map<string, !{securityState: !SecurityAgent.SecurityState, securityDetails: ?NetworkAgent.SecurityDetails}>} */
this._origins = new Map();
WebInspector.targetManager.addEventListener(WebInspector.ResourceTreeModel.EventTypes.InspectedURLChanged, this._clear, this);
WebInspector.targetManager.addEventListener(WebInspector.ResourceTreeModel.EventTypes.WillReloadPage, this._clear, this);
WebInspector.targetManager.addEventListener(WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated, this._clear, this);
WebInspector.targetManager.observeTargets(this);
}
......@@ -71,6 +77,40 @@ WebInspector.SecurityPanel.prototype = {
this.splitWidget().setMainWidget(view);
},
/**
* @param {!WebInspector.Event} event
*/
_onResponseReceivedSecurityDetails: function(event)
{
var data = event.data;
var origin = /** @type {string} */ (data.origin);
var securityState = /** @type {!SecurityAgent.SecurityState} */ (data.securityState);
if (this._origins.has(origin)) {
var originData = this._origins.get(origin);
originData.securityState = this._securityStateMin(originData.securityState, securityState);
} else {
// TODO(lgarron): Store a (deduplicated) list of different security details we have seen.
var originData = {};
originData.securityState = securityState;
if (data.securityDetails)
originData.securityDetails = data.securityDetails;
this._origins.set(origin, originData);
}
},
/**
* @param {!SecurityAgent.SecurityState} stateA
* @param {!SecurityAgent.SecurityState} stateB
* @return {!SecurityAgent.SecurityState}
*/
_securityStateMin: function(stateA, stateB)
{
var ordering = ["unknown", "insecure", "neutral", "warning", "secure"];
return (ordering.indexOf(stateA) < ordering.indexOf(stateB)) ? stateA : stateB;
},
/**
* @override
* @param {!WebInspector.Target} target
......@@ -82,6 +122,10 @@ WebInspector.SecurityPanel.prototype = {
this._securityModel = WebInspector.SecurityModel.fromTarget(target);
this._securityModel.addEventListener(WebInspector.SecurityModel.EventTypes.SecurityStateChanged, this._onSecurityStateChanged, this);
this._updateSecurityState(this._securityModel.securityState(), []);
this._origins.clear();
this._networkManager = target.networkManager;
this._networkManager.addEventListener(WebInspector.NetworkManager.EventTypes.ResponseReceivedSecurityDetails, this._onResponseReceivedSecurityDetails, this);
}
},
......@@ -94,11 +138,19 @@ WebInspector.SecurityPanel.prototype = {
if (target === this._target) {
this._securityModel.removeEventListener(WebInspector.SecurityModel.EventTypes.SecurityStateChanged, this._onSecurityStateChanged, this);
delete this._securityModel;
this._networkManager.removeEventListener(WebInspector.NetworkManager.EventTypes.ResponseReceivedSecurityDetails, this._onResponseReceivedSecurityDetails, this);
delete this._networkManager;
delete this._target;
this._updateSecurityState(SecurityAgent.SecurityState.Unknown, []);
this._clear();
}
},
_clear: function()
{
this._updateSecurityState(SecurityAgent.SecurityState.Unknown, []);
this._origins.clear();
},
__proto__: WebInspector.PanelWithSidebar.prototype
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment