Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(563)

Unified Diff: third_party/WebKit/Source/core/loader/FrameLoader.cpp

Issue 2284683002: PlzNavigate: support upgrade-insecure-navigation. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Adressed comments (Nate) Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « third_party/WebKit/Source/core/loader/FrameLoader.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/WebKit/Source/core/loader/FrameLoader.cpp
diff --git a/third_party/WebKit/Source/core/loader/FrameLoader.cpp b/third_party/WebKit/Source/core/loader/FrameLoader.cpp
index 0eb7138c45286ea4e9666d26bf2644b00a2aa9fc..bcd6bff4aaba995167eb93425e8abcbdf87e51b2 100644
--- a/third_party/WebKit/Source/core/loader/FrameLoader.cpp
+++ b/third_party/WebKit/Source/core/loader/FrameLoader.cpp
@@ -1424,6 +1424,7 @@ void FrameLoader::startLoad(FrameLoadRequest& frameLoadRequest, FrameLoadType ty
frameLoadRequest.resourceRequest().setRequestContext(determineRequestContextFromNavigationType(navigationType));
frameLoadRequest.resourceRequest().setFrameType(m_frame->isMainFrame() ? WebURLRequest::FrameTypeTopLevel : WebURLRequest::FrameTypeNested);
ResourceRequest& request = frameLoadRequest.resourceRequest();
+ upgradeInsecureRequest(request, nullptr);
if (!shouldContinueForNavigationPolicy(request, frameLoadRequest.substituteData(), nullptr, frameLoadRequest.shouldCheckMainWorldContentSecurityPolicy(), navigationType, navigationPolicy, type == FrameLoadTypeReplaceCurrentItem, frameLoadRequest.clientRedirect() == ClientRedirectPolicy::ClientRedirect))
return;
@@ -1452,7 +1453,6 @@ void FrameLoader::startLoad(FrameLoadRequest& frameLoadRequest, FrameLoadType ty
if (m_provisionalDocumentLoader->isClientRedirect())
m_provisionalDocumentLoader->appendRedirect(m_frame->document()->url());
m_provisionalDocumentLoader->appendRedirect(m_provisionalDocumentLoader->request().url());
- m_provisionalDocumentLoader->upgradeInsecureRequest();
double triggeringEventTime = frameLoadRequest.triggeringEvent() ? frameLoadRequest.triggeringEvent()->platformTimeStamp() : 0;
client()->dispatchDidStartProvisionalLoad(triggeringEventTime);
ASSERT(m_provisionalDocumentLoader);
@@ -1607,6 +1607,45 @@ SecurityContext::InsecureNavigationsSet* FrameLoader::insecureNavigationsToUpgra
return toLocalFrame(parentFrame)->document()->insecureNavigationsToUpgrade();
}
+void FrameLoader::upgradeInsecureRequest(ResourceRequest& resourceRequest, Document* document) const
+{
+ // Tack an 'Upgrade-Insecure-Requests' header to outgoing navigational requests, as described in
+ // https://w3c.github.io/webappsec/specs/upgrade/#feature-detect
+ if (resourceRequest.frameType() != WebURLRequest::FrameTypeNone) {
+
+ // Early return if the request has already been upgraded.
+ if (resourceRequest.httpHeaderField("Upgrade-Insecure-Requests") == AtomicString("1"))
+ return;
+
+ resourceRequest.addHTTPHeaderField("Upgrade-Insecure-Requests", "1");
+ }
+
+ KURL url = resourceRequest.url();
+
+ // If we don't yet have an |m_document| (because we're loading an iframe, for instance), check the FrameLoader's policy.
+ WebInsecureRequestPolicy relevantPolicy = document ? document->getInsecureRequestPolicy() : getInsecureRequestPolicy();
+ SecurityContext::InsecureNavigationsSet* relevantNavigationSet = document ? document->insecureNavigationsToUpgrade() : insecureNavigationsToUpgrade();
+
+ if (url.protocolIs("http") && relevantPolicy & kUpgradeInsecureRequests) {
+ // We always upgrade requests that meet any of the following criteria:
+ //
+ // 1. Are for subresources (including nested frames).
+ // 2. Are form submissions.
+ // 3. Whose hosts are contained in the document's InsecureNavigationSet.
+ if (resourceRequest.frameType() == WebURLRequest::FrameTypeNone
+ || resourceRequest.frameType() == WebURLRequest::FrameTypeNested
+ || resourceRequest.requestContext() == WebURLRequest::RequestContextForm
+ || (!url.host().isNull() && relevantNavigationSet->contains(url.host().impl()->hash()))) {
+ UseCounter::count(document, UseCounter::UpgradeInsecureRequestsUpgradedRequest);
+ url.setProtocol("https");
+ if (url.port() == 80)
+ url.setPort(443);
+ resourceRequest.setURL(url);
+ }
+ }
+}
+
+
std::unique_ptr<TracedValue> FrameLoader::toTracedValue() const
{
std::unique_ptr<TracedValue> tracedValue = TracedValue::create();
« no previous file with comments | « third_party/WebKit/Source/core/loader/FrameLoader.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698