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

Side by Side Diff: third_party/WebKit/Source/core/loader/FrameLoader.cpp

Issue 2372563002: Adding Embedding-CSP HTTP header (Closed)
Patch Set: Separating into two functions Created 4 years, 2 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserv ed. 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserv ed.
3 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) 3 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
4 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t orchmobile.com/) 4 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t orchmobile.com/)
5 * Copyright (C) 2008 Alp Toker <alp@atoker.com> 5 * Copyright (C) 2008 Alp Toker <alp@atoker.com>
6 * Copyright (C) Research In Motion Limited 2009. All rights reserved. 6 * Copyright (C) Research In Motion Limited 2009. All rights reserved.
7 * Copyright (C) 2011 Kris Jordan <krisjordan@gmail.com> 7 * Copyright (C) 2011 Kris Jordan <krisjordan@gmail.com>
8 * Copyright (C) 2011 Google Inc. All rights reserved. 8 * Copyright (C) 2011 Google Inc. All rights reserved.
9 * 9 *
10 * Redistribution and use in source and binary forms, with or without 10 * Redistribution and use in source and binary forms, with or without
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
167 if (!overrideURL.isEmpty()) { 167 if (!overrideURL.isEmpty()) {
168 request.setURL(overrideURL); 168 request.setURL(overrideURL);
169 request.clearHTTPReferrer(); 169 request.clearHTTPReferrer();
170 } 170 }
171 request.setSkipServiceWorker(frameLoadType == FrameLoadTypeReloadBypassingCa che ? WebURLRequest::SkipServiceWorker::All : WebURLRequest::SkipServiceWorker:: None); 171 request.setSkipServiceWorker(frameLoadType == FrameLoadTypeReloadBypassingCa che ? WebURLRequest::SkipServiceWorker::All : WebURLRequest::SkipServiceWorker:: None);
172 return request; 172 return request;
173 } 173 }
174 174
175 FrameLoader::FrameLoader(LocalFrame* frame) 175 FrameLoader::FrameLoader(LocalFrame* frame)
176 : m_frame(frame) 176 : m_frame(frame)
177 , m_requiredCSP(nullAtom)
Mike West 2016/10/06 08:00:51 Nit: I think this is the default, isn't it? You sh
177 , m_progressTracker(ProgressTracker::create(frame)) 178 , m_progressTracker(ProgressTracker::create(frame))
178 , m_loadType(FrameLoadTypeStandard) 179 , m_loadType(FrameLoadTypeStandard)
179 , m_inStopAllLoaders(false) 180 , m_inStopAllLoaders(false)
180 , m_checkTimer(TaskRunnerHelper::get(TaskType::Networking, frame), this, &Fr ameLoader::checkTimerFired) 181 , m_checkTimer(TaskRunnerHelper::get(TaskType::Networking, frame), this, &Fr ameLoader::checkTimerFired)
181 , m_forcedSandboxFlags(SandboxNone) 182 , m_forcedSandboxFlags(SandboxNone)
182 , m_dispatchingDidClearWindowObjectInMainWorld(false) 183 , m_dispatchingDidClearWindowObjectInMainWorld(false)
183 , m_protectProvisionalLoader(false) 184 , m_protectProvisionalLoader(false)
184 , m_isNavigationHandledByClient(false) 185 , m_isNavigationHandledByClient(false)
185 { 186 {
186 TRACE_EVENT_OBJECT_CREATED_WITH_ID("loading", "FrameLoader", this); 187 TRACE_EVENT_OBJECT_CREATED_WITH_ID("loading", "FrameLoader", this);
(...skipping 1246 matching lines...) Expand 10 before | Expand all | Expand 10 after
1433 void FrameLoader::startLoad(FrameLoadRequest& frameLoadRequest, FrameLoadType ty pe, NavigationPolicy navigationPolicy) 1434 void FrameLoader::startLoad(FrameLoadRequest& frameLoadRequest, FrameLoadType ty pe, NavigationPolicy navigationPolicy)
1434 { 1435 {
1435 DCHECK(client()->hasWebView()); 1436 DCHECK(client()->hasWebView());
1436 if (m_frame->document()->pageDismissalEventBeingDispatched() != Document::No Dismissal) 1437 if (m_frame->document()->pageDismissalEventBeingDispatched() != Document::No Dismissal)
1437 return; 1438 return;
1438 1439
1439 NavigationType navigationType = determineNavigationType(type, frameLoadReque st.resourceRequest().httpBody() || frameLoadRequest.form(), frameLoadRequest.tri ggeringEvent()); 1440 NavigationType navigationType = determineNavigationType(type, frameLoadReque st.resourceRequest().httpBody() || frameLoadRequest.form(), frameLoadRequest.tri ggeringEvent());
1440 frameLoadRequest.resourceRequest().setRequestContext(determineRequestContext FromNavigationType(navigationType)); 1441 frameLoadRequest.resourceRequest().setRequestContext(determineRequestContext FromNavigationType(navigationType));
1441 frameLoadRequest.resourceRequest().setFrameType(m_frame->isMainFrame() ? Web URLRequest::FrameTypeTopLevel : WebURLRequest::FrameTypeNested); 1442 frameLoadRequest.resourceRequest().setFrameType(m_frame->isMainFrame() ? Web URLRequest::FrameTypeTopLevel : WebURLRequest::FrameTypeNested);
1442 ResourceRequest& request = frameLoadRequest.resourceRequest(); 1443 ResourceRequest& request = frameLoadRequest.resourceRequest();
1443 upgradeInsecureRequest(request, nullptr); 1444
1445 // Record the latest requiredCSP value that will be used when sending this r equest.
1446 recordLatestRequiredCSP();
1447 addOutgoingSecurityHeadersAndUpgradeRequest(request, nullptr);
1444 if (!shouldContinueForNavigationPolicy(request, frameLoadRequest.substituteD ata(), nullptr, frameLoadRequest.shouldCheckMainWorldContentSecurityPolicy(), na vigationType, navigationPolicy, type == FrameLoadTypeReplaceCurrentItem, frameLo adRequest.clientRedirect() == ClientRedirectPolicy::ClientRedirect, frameLoadReq uest.form())) 1448 if (!shouldContinueForNavigationPolicy(request, frameLoadRequest.substituteD ata(), nullptr, frameLoadRequest.shouldCheckMainWorldContentSecurityPolicy(), na vigationType, navigationPolicy, type == FrameLoadTypeReplaceCurrentItem, frameLo adRequest.clientRedirect() == ClientRedirectPolicy::ClientRedirect, frameLoadReq uest.form()))
1445 return; 1449 return;
1446 1450
1447 m_frame->document()->cancelParsing(); 1451 m_frame->document()->cancelParsing();
1448 detachDocumentLoader(m_provisionalDocumentLoader); 1452 detachDocumentLoader(m_provisionalDocumentLoader);
1449 1453
1450 // beforeunload fired above, and detaching a DocumentLoader can fire 1454 // beforeunload fired above, and detaching a DocumentLoader can fire
1451 // events, which can detach this frame. 1455 // events, which can detach this frame.
1452 if (!m_frame->host()) 1456 if (!m_frame->host())
1453 return; 1457 return;
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
1616 1620
1617 // FIXME: We need a way to propagate insecure requests policy flags to 1621 // FIXME: We need a way to propagate insecure requests policy flags to
1618 // out-of-process frames. For now, we'll always use default behavior. 1622 // out-of-process frames. For now, we'll always use default behavior.
1619 if (!parentFrame->isLocalFrame()) 1623 if (!parentFrame->isLocalFrame())
1620 return nullptr; 1624 return nullptr;
1621 1625
1622 DCHECK(toLocalFrame(parentFrame)->document()); 1626 DCHECK(toLocalFrame(parentFrame)->document());
1623 return toLocalFrame(parentFrame)->document()->insecureNavigationsToUpgrade() ; 1627 return toLocalFrame(parentFrame)->document()->insecureNavigationsToUpgrade() ;
1624 } 1628 }
1625 1629
1626 void FrameLoader::upgradeInsecureRequest(ResourceRequest& resourceRequest, Docum ent* document) const 1630 void FrameLoader::addOutgoingSecurityHeadersAndUpgradeRequest(ResourceRequest& r esourceRequest, Document* document) const
1627 { 1631 {
1632 if (RuntimeEnabledFeatures::embedderCSPEnforcementEnabled() && !requiredCSP( ).isEmpty())
1633 resourceRequest.setHTTPHeaderField(HTTPNames::Embedding_CSP, requiredCSP ());
Mike West 2016/10/06 08:00:51 Can you add a DCHECK here that the 'requiredCSP()'
amalika 2016/10/06 18:54:57 Not sure if that's what you wanted?
1634
1628 // Tack an 'Upgrade-Insecure-Requests' header to outgoing navigational reque sts, as described in 1635 // Tack an 'Upgrade-Insecure-Requests' header to outgoing navigational reque sts, as described in
1629 // https://w3c.github.io/webappsec/specs/upgrade/#feature-detect 1636 // https://w3c.github.io/webappsec/specs/upgrade/#feature-detect
1630 if (resourceRequest.frameType() != WebURLRequest::FrameTypeNone) { 1637 if (resourceRequest.frameType() != WebURLRequest::FrameTypeNone) {
1631 1638
1632 // Early return if the request has already been upgraded. 1639 // Early return if the request has already been upgraded.
1633 if (resourceRequest.httpHeaderField("Upgrade-Insecure-Requests") == Atom icString("1")) 1640 if (resourceRequest.httpHeaderField("Upgrade-Insecure-Requests") == Atom icString("1"))
1634 return; 1641 return;
1635 1642
1636 resourceRequest.addHTTPHeaderField("Upgrade-Insecure-Requests", "1"); 1643 resourceRequest.addHTTPHeaderField("Upgrade-Insecure-Requests", "1");
1637 } 1644 }
1638 1645
1646 upgradeInsecureRequest(resourceRequest, document);
1647 }
1648
1649 void FrameLoader::upgradeInsecureRequest(ResourceRequest& resourceRequest, Docum ent* document) const
1650 {
1639 KURL url = resourceRequest.url(); 1651 KURL url = resourceRequest.url();
1640 1652
1641 // If we don't yet have an |m_document| (because we're loading an iframe, fo r instance), check the FrameLoader's policy. 1653 // If we don't yet have an |m_document| (because we're loading an iframe, fo r instance), check the FrameLoader's policy.
1642 WebInsecureRequestPolicy relevantPolicy = document ? document->getInsecureRe questPolicy() : getInsecureRequestPolicy(); 1654 WebInsecureRequestPolicy relevantPolicy = document ? document->getInsecureRe questPolicy() : getInsecureRequestPolicy();
1643 SecurityContext::InsecureNavigationsSet* relevantNavigationSet = document ? document->insecureNavigationsToUpgrade() : insecureNavigationsToUpgrade(); 1655 SecurityContext::InsecureNavigationsSet* relevantNavigationSet = document ? document->insecureNavigationsToUpgrade() : insecureNavigationsToUpgrade();
1644 1656
1645 if (url.protocolIs("http") && relevantPolicy & kUpgradeInsecureRequests) { 1657 if (url.protocolIs("http") && relevantPolicy & kUpgradeInsecureRequests) {
1646 // We always upgrade requests that meet any of the following criteria: 1658 // We always upgrade requests that meet any of the following criteria:
1647 // 1659 //
1648 // 1. Are for subresources (including nested frames). 1660 // 1. Are for subresources (including nested frames).
1649 // 2. Are form submissions. 1661 // 2. Are form submissions.
1650 // 3. Whose hosts are contained in the document's InsecureNavigationSet. 1662 // 3. Whose hosts are contained in the document's InsecureNavigationSet.
1651 if (resourceRequest.frameType() == WebURLRequest::FrameTypeNone 1663 if (resourceRequest.frameType() == WebURLRequest::FrameTypeNone
1652 || resourceRequest.frameType() == WebURLRequest::FrameTypeNested 1664 || resourceRequest.frameType() == WebURLRequest::FrameTypeNested
1653 || resourceRequest.requestContext() == WebURLRequest::RequestContext Form 1665 || resourceRequest.requestContext() == WebURLRequest::RequestContext Form
1654 || (!url.host().isNull() && relevantNavigationSet->contains(url.host ().impl()->hash()))) { 1666 || (!url.host().isNull() && relevantNavigationSet->contains(url.host ().impl()->hash()))) {
1655 UseCounter::count(document, UseCounter::UpgradeInsecureRequestsUpgra dedRequest); 1667 UseCounter::count(document, UseCounter::UpgradeInsecureRequestsUpgra dedRequest);
1656 url.setProtocol("https"); 1668 url.setProtocol("https");
1657 if (url.port() == 80) 1669 if (url.port() == 80)
1658 url.setPort(443); 1670 url.setPort(443);
1659 resourceRequest.setURL(url); 1671 resourceRequest.setURL(url);
1660 } 1672 }
1661 } 1673 }
1662 } 1674 }
1663 1675
1676 void FrameLoader::recordLatestRequiredCSP()
1677 {
1678 m_requiredCSP = m_frame->owner() ? m_frame->owner()->csp() : nullAtom;
1679 }
1664 1680
1665 std::unique_ptr<TracedValue> FrameLoader::toTracedValue() const 1681 std::unique_ptr<TracedValue> FrameLoader::toTracedValue() const
1666 { 1682 {
1667 std::unique_ptr<TracedValue> tracedValue = TracedValue::create(); 1683 std::unique_ptr<TracedValue> tracedValue = TracedValue::create();
1668 tracedValue->beginDictionary("frame"); 1684 tracedValue->beginDictionary("frame");
1669 tracedValue->setString("id_ref", String::format("0x%" PRIx64, static_cast<ui nt64_t>(reinterpret_cast<uintptr_t>(m_frame.get())))); 1685 tracedValue->setString("id_ref", String::format("0x%" PRIx64, static_cast<ui nt64_t>(reinterpret_cast<uintptr_t>(m_frame.get()))));
1670 tracedValue->endDictionary(); 1686 tracedValue->endDictionary();
1671 tracedValue->setBoolean("isLoadingMainFrame", isLoadingMainFrame()); 1687 tracedValue->setBoolean("isLoadingMainFrame", isLoadingMainFrame());
1672 tracedValue->setString("stateMachine", m_stateMachine.toString()); 1688 tracedValue->setString("stateMachine", m_stateMachine.toString());
1673 tracedValue->setString("provisionalDocumentLoaderURL", m_provisionalDocument Loader ? m_provisionalDocumentLoader->url() : String()); 1689 tracedValue->setString("provisionalDocumentLoaderURL", m_provisionalDocument Loader ? m_provisionalDocumentLoader->url() : String());
1674 tracedValue->setString("documentLoaderURL", m_documentLoader ? m_documentLoa der->url() : String()); 1690 tracedValue->setString("documentLoaderURL", m_documentLoader ? m_documentLoa der->url() : String());
1675 return tracedValue; 1691 return tracedValue;
1676 } 1692 }
1677 1693
1678 inline void FrameLoader::takeObjectSnapshot() const 1694 inline void FrameLoader::takeObjectSnapshot() const
1679 { 1695 {
1680 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID("loading", "FrameLoader", this, toTraced Value()); 1696 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID("loading", "FrameLoader", this, toTraced Value());
1681 } 1697 }
1682 1698
1683 } // namespace blink 1699 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698