| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights | 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights |
| 3 * reserved. | 3 * reserved. |
| 4 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) | 4 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) |
| 5 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. | 5 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. |
| 6 * (http://www.torchmobile.com/) | 6 * (http://www.torchmobile.com/) |
| 7 * Copyright (C) 2008 Alp Toker <alp@atoker.com> | 7 * Copyright (C) 2008 Alp Toker <alp@atoker.com> |
| 8 * Copyright (C) Research In Motion Limited 2009. All rights reserved. | 8 * Copyright (C) Research In Motion Limited 2009. All rights reserved. |
| 9 * Copyright (C) 2011 Kris Jordan <krisjordan@gmail.com> | 9 * Copyright (C) 2011 Kris Jordan <krisjordan@gmail.com> |
| 10 * Copyright (C) 2011 Google Inc. All rights reserved. | 10 * Copyright (C) 2011 Google Inc. All rights reserved. |
| (...skipping 1654 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1665 frameLoadRequest.triggeringEvent()); | 1665 frameLoadRequest.triggeringEvent()); |
| 1666 resourceRequest.setRequestContext( | 1666 resourceRequest.setRequestContext( |
| 1667 determineRequestContextFromNavigationType(navigationType)); | 1667 determineRequestContextFromNavigationType(navigationType)); |
| 1668 resourceRequest.setFrameType(m_frame->isMainFrame() | 1668 resourceRequest.setFrameType(m_frame->isMainFrame() |
| 1669 ? WebURLRequest::FrameTypeTopLevel | 1669 ? WebURLRequest::FrameTypeTopLevel |
| 1670 : WebURLRequest::FrameTypeNested); | 1670 : WebURLRequest::FrameTypeNested); |
| 1671 | 1671 |
| 1672 // Record the latest requiredCSP value that will be used when sending this | 1672 // Record the latest requiredCSP value that will be used when sending this |
| 1673 // request. | 1673 // request. |
| 1674 recordLatestRequiredCSP(); | 1674 recordLatestRequiredCSP(); |
| 1675 modifyRequestForCSP(resourceRequest, nullptr); | 1675 modifyRequestForCSP(resourceRequest, frameLoadRequest.originDocument()); |
| 1676 if (!shouldContinueForNavigationPolicy( | 1676 if (!shouldContinueForNavigationPolicy( |
| 1677 resourceRequest, frameLoadRequest.substituteData(), nullptr, | 1677 resourceRequest, frameLoadRequest.substituteData(), nullptr, |
| 1678 frameLoadRequest.shouldCheckMainWorldContentSecurityPolicy(), | 1678 frameLoadRequest.shouldCheckMainWorldContentSecurityPolicy(), |
| 1679 navigationType, navigationPolicy, | 1679 navigationType, navigationPolicy, |
| 1680 type == FrameLoadTypeReplaceCurrentItem, | 1680 type == FrameLoadTypeReplaceCurrentItem, |
| 1681 frameLoadRequest.clientRedirect() == | 1681 frameLoadRequest.clientRedirect() == |
| 1682 ClientRedirectPolicy::ClientRedirect, | 1682 ClientRedirectPolicy::ClientRedirect, |
| 1683 frameLoadRequest.form())) | 1683 frameLoadRequest.form())) |
| 1684 return; | 1684 return; |
| 1685 | 1685 |
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1860 return parentFrame->securityContext()->getInsecureRequestPolicy(); | 1860 return parentFrame->securityContext()->getInsecureRequestPolicy(); |
| 1861 } | 1861 } |
| 1862 | 1862 |
| 1863 SecurityContext::InsecureNavigationsSet* | 1863 SecurityContext::InsecureNavigationsSet* |
| 1864 FrameLoader::insecureNavigationsToUpgrade() const { | 1864 FrameLoader::insecureNavigationsToUpgrade() const { |
| 1865 DCHECK(m_frame); | 1865 DCHECK(m_frame); |
| 1866 Frame* parentFrame = m_frame->tree().parent(); | 1866 Frame* parentFrame = m_frame->tree().parent(); |
| 1867 if (!parentFrame) | 1867 if (!parentFrame) |
| 1868 return nullptr; | 1868 return nullptr; |
| 1869 | 1869 |
| 1870 // FIXME: We need a way to propagate insecure requests policy flags to | 1870 return parentFrame->securityContext()->insecureNavigationsToUpgrade(); |
| 1871 // out-of-process frames. For now, we'll always use default behavior. | |
| 1872 if (!parentFrame->isLocalFrame()) | |
| 1873 return nullptr; | |
| 1874 | |
| 1875 DCHECK(toLocalFrame(parentFrame)->document()); | |
| 1876 return toLocalFrame(parentFrame)->document()->insecureNavigationsToUpgrade(); | |
| 1877 } | 1871 } |
| 1878 | 1872 |
| 1879 void FrameLoader::modifyRequestForCSP(ResourceRequest& resourceRequest, | 1873 void FrameLoader::modifyRequestForCSP(ResourceRequest& resourceRequest, |
| 1880 Document* document) const { | 1874 Document* originDocument) const { |
| 1881 if (RuntimeEnabledFeatures::embedderCSPEnforcementEnabled() && | 1875 if (RuntimeEnabledFeatures::embedderCSPEnforcementEnabled() && |
| 1882 !requiredCSP().isEmpty()) { | 1876 !requiredCSP().isEmpty()) { |
| 1883 // TODO(amalika): Strengthen this DCHECK that requiredCSP has proper format | 1877 // TODO(amalika): Strengthen this DCHECK that requiredCSP has proper format |
| 1884 DCHECK(requiredCSP().getString().containsOnlyASCII()); | 1878 DCHECK(requiredCSP().getString().containsOnlyASCII()); |
| 1885 resourceRequest.setHTTPHeaderField(HTTPNames::Embedding_CSP, requiredCSP()); | 1879 resourceRequest.setHTTPHeaderField(HTTPNames::Embedding_CSP, requiredCSP()); |
| 1886 } | 1880 } |
| 1887 | 1881 |
| 1888 // Tack an 'Upgrade-Insecure-Requests' header to outgoing navigational | 1882 // Tack an 'Upgrade-Insecure-Requests' header to outgoing navigational |
| 1889 // requests, as described in | 1883 // requests, as described in |
| 1890 // https://w3c.github.io/webappsec/specs/upgrade/#feature-detect | 1884 // https://w3c.github.io/webappsec/specs/upgrade/#feature-detect |
| 1891 if (resourceRequest.frameType() != WebURLRequest::FrameTypeNone) { | 1885 if (resourceRequest.frameType() != WebURLRequest::FrameTypeNone) { |
| 1892 // Early return if the request has already been upgraded. | 1886 // Early return if the request has already been upgraded. |
| 1893 if (!resourceRequest.httpHeaderField(HTTPNames::Upgrade_Insecure_Requests) | 1887 if (!resourceRequest.httpHeaderField(HTTPNames::Upgrade_Insecure_Requests) |
| 1894 .isNull()) { | 1888 .isNull()) { |
| 1895 return; | 1889 return; |
| 1896 } | 1890 } |
| 1897 | 1891 |
| 1898 resourceRequest.setHTTPHeaderField(HTTPNames::Upgrade_Insecure_Requests, | 1892 resourceRequest.setHTTPHeaderField(HTTPNames::Upgrade_Insecure_Requests, |
| 1899 "1"); | 1893 "1"); |
| 1900 } | 1894 } |
| 1901 | 1895 |
| 1902 upgradeInsecureRequest(resourceRequest, document); | 1896 upgradeInsecureRequest(resourceRequest, originDocument); |
| 1903 } | 1897 } |
| 1904 | 1898 |
| 1905 void FrameLoader::upgradeInsecureRequest(ResourceRequest& resourceRequest, | 1899 void FrameLoader::upgradeInsecureRequest(ResourceRequest& resourceRequest, |
| 1906 Document* document) const { | 1900 Document* originDocument) const { |
| 1901 // We always upgrade requests that meet any of the following criteria: |
| 1902 // |
| 1903 // Enforced in FrameLoader::upgradeInsecureRequest. |
| 1904 // 1. Are for subresources. |
| 1905 // 2. Are for nested frames. |
| 1906 // 3. Are form submissions. |
| 1907 // 4. Whose hosts are contained in the originDocument's upgrade insecure |
| 1908 // navigations set. (same-frame navigation). |
| 1909 // Enforced in Frame::upgradeInsecureRequest. |
| 1910 // 4. Whose hosts are contained in the originDocument's upgrade insecure |
| 1911 // navigations set. (cross-frame navigation). |
| 1912 |
| 1907 KURL url = resourceRequest.url(); | 1913 KURL url = resourceRequest.url(); |
| 1908 | 1914 |
| 1909 // If we don't yet have an |m_document| (because we're loading an iframe, for | 1915 // If we don't yet have an |originDocument| (because we're loading an iframe, |
| 1910 // instance), check the FrameLoader's policy. | 1916 // for instance), check the FrameLoader's policy. |
| 1911 WebInsecureRequestPolicy relevantPolicy = | 1917 WebInsecureRequestPolicy relevantPolicy = |
| 1912 document ? document->getInsecureRequestPolicy() | 1918 originDocument ? originDocument->getInsecureRequestPolicy() |
| 1913 : getInsecureRequestPolicy(); | 1919 : getInsecureRequestPolicy(); |
| 1914 SecurityContext::InsecureNavigationsSet* relevantNavigationSet = | 1920 SecurityContext::InsecureNavigationsSet* relevantNavigationSet = |
| 1915 document ? document->insecureNavigationsToUpgrade() | 1921 originDocument ? originDocument->insecureNavigationsToUpgrade() |
| 1916 : insecureNavigationsToUpgrade(); | 1922 : insecureNavigationsToUpgrade(); |
| 1917 | 1923 |
| 1918 if (url.protocolIs("http") && relevantPolicy & kUpgradeInsecureRequests) { | 1924 if (url.protocolIs("http") && relevantPolicy & kUpgradeInsecureRequests) { |
| 1919 // We always upgrade requests that meet any of the following criteria: | |
| 1920 // | |
| 1921 // 1. Are for subresources (including nested frames). | |
| 1922 // 2. Are form submissions. | |
| 1923 // 3. Whose hosts are contained in the document's InsecureNavigationSet. | |
| 1924 if (resourceRequest.frameType() == WebURLRequest::FrameTypeNone || | 1925 if (resourceRequest.frameType() == WebURLRequest::FrameTypeNone || |
| 1925 resourceRequest.frameType() == WebURLRequest::FrameTypeNested || | 1926 resourceRequest.frameType() == WebURLRequest::FrameTypeNested || |
| 1926 resourceRequest.requestContext() == WebURLRequest::RequestContextForm || | 1927 resourceRequest.requestContext() == WebURLRequest::RequestContextForm || |
| 1927 (!url.host().isNull() && | 1928 (!url.host().isNull() && |
| 1928 relevantNavigationSet->contains(url.host().impl()->hash()))) { | 1929 relevantNavigationSet->contains(url.host().impl()->hash()))) { |
| 1929 UseCounter::count(document, | 1930 UseCounter::count(originDocument, |
| 1930 UseCounter::UpgradeInsecureRequestsUpgradedRequest); | 1931 UseCounter::UpgradeInsecureRequestsUpgradedRequest); |
| 1931 url.setProtocol("https"); | 1932 url.setProtocol("https"); |
| 1932 if (url.port() == 80) | 1933 if (url.port() == 80) |
| 1933 url.setPort(443); | 1934 url.setPort(443); |
| 1934 resourceRequest.setURL(url); | 1935 resourceRequest.setURL(url); |
| 1935 } | 1936 } |
| 1936 } | 1937 } |
| 1937 } | 1938 } |
| 1938 | 1939 |
| 1939 void FrameLoader::recordLatestRequiredCSP() { | 1940 void FrameLoader::recordLatestRequiredCSP() { |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1959 m_documentLoader ? m_documentLoader->url() : String()); | 1960 m_documentLoader ? m_documentLoader->url() : String()); |
| 1960 return tracedValue; | 1961 return tracedValue; |
| 1961 } | 1962 } |
| 1962 | 1963 |
| 1963 inline void FrameLoader::takeObjectSnapshot() const { | 1964 inline void FrameLoader::takeObjectSnapshot() const { |
| 1964 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID("loading", "FrameLoader", this, | 1965 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID("loading", "FrameLoader", this, |
| 1965 toTracedValue()); | 1966 toTracedValue()); |
| 1966 } | 1967 } |
| 1967 | 1968 |
| 1968 } // namespace blink | 1969 } // namespace blink |
| OLD | NEW |