Index: third_party/WebKit/Source/core/inspector/InspectorNetworkAgent.cpp |
diff --git a/third_party/WebKit/Source/core/inspector/InspectorNetworkAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorNetworkAgent.cpp |
index c23cd6e6b90876686d037f4016f1a7853edc7309..5d688b3588805f36ab5508e7f7a5453e66375759 100644 |
--- a/third_party/WebKit/Source/core/inspector/InspectorNetworkAgent.cpp |
+++ b/third_party/WebKit/Source/core/inspector/InspectorNetworkAgent.cpp |
@@ -315,7 +315,7 @@ static std::unique_ptr<protocol::Network::Request> buildObjectForResourceRequest |
return requestObject; |
} |
-static std::unique_ptr<protocol::Network::Response> buildObjectForResourceResponse(const ResourceResponse& response, Resource* cachedResource = nullptr, bool* isEmpty = nullptr) |
+static std::unique_ptr<protocol::Network::Response> buildObjectForResourceResponse(const ResourceResponse& response, Vector<Vector<AtomicString>>* certificates, Resource* cachedResource = nullptr, bool* isEmpty = nullptr) |
{ |
if (response.isNull()) |
return nullptr; |
@@ -420,6 +420,12 @@ static std::unique_ptr<protocol::Network::Response> buildObjectForResourceRespon |
const ResourceResponse::SecurityDetails* responseSecurityDetails = response.getSecurityDetails(); |
+ std::unique_ptr<protocol::Array<String>> sanList = protocol::Array<String>::create(); |
+ for (auto const& san : responseSecurityDetails->sanList) |
+ sanList->addItem(san); |
+ |
+ certificates->append(responseSecurityDetails->certificate); |
+ |
std::unique_ptr<protocol::Array<protocol::Network::SignedCertificateTimestamp>> signedCertificateTimestampList = protocol::Array<protocol::Network::SignedCertificateTimestamp>::create(); |
for (auto const& sct : responseSecurityDetails->sctList) { |
std::unique_ptr<protocol::Network::SignedCertificateTimestamp> signedCertificateTimestamp = protocol::Network::SignedCertificateTimestamp::create() |
@@ -439,8 +445,14 @@ static std::unique_ptr<protocol::Network::Response> buildObjectForResourceRespon |
.setProtocol(responseSecurityDetails->protocol) |
.setKeyExchange(responseSecurityDetails->keyExchange) |
.setCipher(responseSecurityDetails->cipher) |
- .setCertificateId(responseSecurityDetails->certID) |
+ .setSubjectName(responseSecurityDetails->subjectName) |
+ .setSanList(std::move(sanList)) |
+ .setIssuer(responseSecurityDetails->issuer) |
+ .setValidFrom(responseSecurityDetails->validFrom) |
+ .setValidTo(responseSecurityDetails->validTo) |
+ .setCertificateId(0) // Keep this in protocol for compatability. |
.setSignedCertificateTimestampList(std::move(signedCertificateTimestampList)) |
+ .setCertificateIndex(certificates->size() - 1) |
.build(); |
if (responseSecurityDetails->mac.length() > 0) |
securityDetails->setMac(responseSecurityDetails->mac); |
@@ -480,6 +492,11 @@ bool InspectorNetworkAgent::shouldBlockRequest(const ResourceRequest& request) |
return false; |
} |
+void InspectorNetworkAgent::didStartProvisionalLoad() |
+{ |
+ m_certificates.clear(); |
+} |
+ |
void InspectorNetworkAgent::didBlockRequest(LocalFrame* frame, const ResourceRequest& request, DocumentLoader* loader, const FetchInitiatorInfo& initiatorInfo, ResourceRequestBlockedReason reason) |
{ |
unsigned long identifier = createUniqueIdentifier(); |
@@ -524,7 +541,7 @@ void InspectorNetworkAgent::willSendRequestInternal(LocalFrame* frame, unsigned |
requestInfo->setMixedContentType(mixedContentTypeForContextType(MixedContentChecker::contextTypeForInspector(frame, request))); |
String resourceType = InspectorPageAgent::resourceTypeJson(type); |
- frontend()->requestWillBeSent(requestId, frameId, loaderId, urlWithoutFragment(loader->url()).getString(), std::move(requestInfo), monotonicallyIncreasingTime(), currentTime(), std::move(initiatorObject), buildObjectForResourceResponse(redirectResponse), resourceType); |
+ frontend()->requestWillBeSent(requestId, frameId, loaderId, urlWithoutFragment(loader->url()).getString(), std::move(requestInfo), monotonicallyIncreasingTime(), currentTime(), std::move(initiatorObject), buildObjectForResourceResponse(redirectResponse, &m_certificates), resourceType); |
if (m_pendingXHRReplayData && !m_pendingXHRReplayData->async()) |
frontend()->flush(); |
} |
@@ -574,7 +591,7 @@ void InspectorNetworkAgent::didReceiveResourceResponse(LocalFrame* frame, unsign |
bool isNotModified = response.httpStatusCode() == 304; |
bool resourceIsEmpty = true; |
- std::unique_ptr<protocol::Network::Response> resourceResponse = buildObjectForResourceResponse(response, cachedResource, &resourceIsEmpty); |
+ std::unique_ptr<protocol::Network::Response> resourceResponse = buildObjectForResourceResponse(response, &m_certificates, cachedResource, &resourceIsEmpty); |
InspectorPageAgent::ResourceType type = cachedResource ? InspectorPageAgent::cachedResourceType(*cachedResource) : InspectorPageAgent::OtherResource; |
// Override with already discovered resource type. |
@@ -940,6 +957,7 @@ void InspectorNetworkAgent::disable(ErrorString*) |
m_instrumentingAgents->removeInspectorNetworkAgent(this); |
m_resourcesData->clear(); |
m_knownRequestIdMap.clear(); |
+ m_certificates.clear(); |
} |
void InspectorNetworkAgent::setUserAgentOverride(ErrorString* errorString, const String& userAgent) |
@@ -1120,6 +1138,16 @@ void InspectorNetworkAgent::setDataSizeLimitsForTest(ErrorString*, int maxTotal, |
m_resourcesData->setResourcesDataSizeLimits(maxTotal, maxResource); |
} |
+void InspectorNetworkAgent::showCertificateViewer(ErrorString*, int certificateIndex) |
+{ |
+ size_t index = static_cast<size_t>(certificateIndex); |
+ if (index >= m_certificates.size()) { |
+ NOTREACHED(); |
+ return; |
+ } |
+ m_client->showCertificateViewer(m_certificates[index]); |
+} |
+ |
void InspectorNetworkAgent::didCommitLoad(LocalFrame* frame, DocumentLoader* loader) |
{ |
if (loader->frame() != m_inspectedFrames->root()) |
@@ -1172,8 +1200,9 @@ void InspectorNetworkAgent::removeFinishedReplayXHRFired(TimerBase*) |
m_replayXHRsToBeDeleted.clear(); |
} |
-InspectorNetworkAgent::InspectorNetworkAgent(InspectedFrames* inspectedFrames) |
- : m_inspectedFrames(inspectedFrames) |
+InspectorNetworkAgent::InspectorNetworkAgent(Client* client, InspectedFrames* inspectedFrames) |
+ : m_client(client) |
+ , m_inspectedFrames(inspectedFrames) |
, m_resourcesData(NetworkResourcesData::create(maximumTotalBufferSize, maximumResourceBufferSize)) |
, m_pendingRequest(nullptr) |
, m_isRecalculatingStyle(false) |