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

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

Issue 2022083002: Move 'frame-src' CSP checks into FrameFetchContext. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: redirects Created 4 years, 6 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) 2013 Google Inc. All rights reserved. 2 * Copyright (C) 2013 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after
508 case Resource::XSLStyleSheet: 508 case Resource::XSLStyleSheet:
509 ASSERT(RuntimeEnabledFeatures::xsltEnabled()); 509 ASSERT(RuntimeEnabledFeatures::xsltEnabled());
510 case Resource::SVGDocument: 510 case Resource::SVGDocument:
511 if (!securityOrigin->canRequest(url)) { 511 if (!securityOrigin->canRequest(url)) {
512 printAccessDeniedMessage(url); 512 printAccessDeniedMessage(url);
513 return ResourceRequestBlockedReasonOrigin; 513 return ResourceRequestBlockedReasonOrigin;
514 } 514 }
515 break; 515 break;
516 } 516 }
517 517
518 // FIXME: Convert this to check the isolated world's Content Security Policy once webkit.org/b/104520 is solved. 518 if (contentSecurityPolicyBlocksRequest(type, resourceRequest, url, options, forPreload, redirectStatus))
519 bool shouldBypassMainWorldCSP = frame()->script().shouldBypassMainWorldCSP() || options.contentSecurityPolicyOption == DoNotCheckContentSecurityPolicy; 519 return ResourceRequestBlockedReasonCSP;
520
521 // Don't send CSP messages for preloads, we might never actually display tho se items.
522 ContentSecurityPolicy::ReportingStatus cspReporting = forPreload ?
523 ContentSecurityPolicy::SuppressReport : ContentSecurityPolicy::SendRepor t;
524
525 if (m_document) {
526 DCHECK(m_document->contentSecurityPolicy());
527 if (!shouldBypassMainWorldCSP && !m_document->contentSecurityPolicy()->a llowRequest(resourceRequest.requestContext(), url, options.contentSecurityPolicy Nonce, redirectStatus, cspReporting))
528 return ResourceRequestBlockedReasonCSP;
529 }
530 520
531 if (type == Resource::Script || type == Resource::ImportResource) { 521 if (type == Resource::Script || type == Resource::ImportResource) {
532 ASSERT(frame()); 522 ASSERT(frame());
533 if (!frame()->loader().client()->allowScriptFromSource(!frame()->setting s() || frame()->settings()->scriptEnabled(), url)) { 523 if (!frame()->loader().client()->allowScriptFromSource(!frame()->setting s() || frame()->settings()->scriptEnabled(), url)) {
534 frame()->loader().client()->didNotAllowScript(); 524 frame()->loader().client()->didNotAllowScript();
535 // TODO(estark): Use a different ResourceRequestBlockedReason 525 // TODO(estark): Use a different ResourceRequestBlockedReason
536 // here, since this check has nothing to do with 526 // here, since this check has nothing to do with
537 // CSP. https://crbug.com/600795 527 // CSP. https://crbug.com/600795
538 return ResourceRequestBlockedReasonCSP; 528 return ResourceRequestBlockedReasonCSP;
539 } 529 }
(...skipping 23 matching lines...) Expand all
563 // folks block mixed content with a CSP policy, they don't get a warning. 553 // folks block mixed content with a CSP policy, they don't get a warning.
564 // They'll still get a warning in the console about CSP blocking the load. 554 // They'll still get a warning in the console about CSP blocking the load.
565 MixedContentChecker::ReportingStatus mixedContentReporting = forPreload ? 555 MixedContentChecker::ReportingStatus mixedContentReporting = forPreload ?
566 MixedContentChecker::SuppressReport : MixedContentChecker::SendReport; 556 MixedContentChecker::SuppressReport : MixedContentChecker::SendReport;
567 if (MixedContentChecker::shouldBlockFetch(frame(), resourceRequest, url, mix edContentReporting)) 557 if (MixedContentChecker::shouldBlockFetch(frame(), resourceRequest, url, mix edContentReporting))
568 return ResourceRequestBlockedReasonMixedContent; 558 return ResourceRequestBlockedReasonMixedContent;
569 559
570 return ResourceRequestBlockedReasonNone; 560 return ResourceRequestBlockedReasonNone;
571 } 561 }
572 562
563 bool FrameFetchContext::contentSecurityPolicyBlocksRequest(Resource::Type type, const ResourceRequest& resourceRequest, const KURL& url, const ResourceLoaderOpt ions& options, bool forPreload, ResourceRequest::RedirectStatus redirectStatus) const
564 {
565 // FIXME: Convert this to check the isolated world's Content Security Policy once webkit.org/b/104520 is solved.
566 if (!frame()->script().shouldBypassMainWorldCSP() && options.contentSecurity PolicyOption == CheckContentSecurityPolicy) {
567 // Don't send CSP messages for preloads, we might never actually display those items.
568 ContentSecurityPolicy::ReportingStatus cspReporting = forPreload ? Conte ntSecurityPolicy::SuppressReport : ContentSecurityPolicy::SendReport;
569 if (m_document) {
570 DCHECK(m_document->contentSecurityPolicy());
571 if (!m_document->contentSecurityPolicy()->allowRequest(resourceReque st.requestContext(), url, options.contentSecurityPolicyNonce, redirectStatus, cs pReporting))
572 return true;
573 } else if (type == Resource::MainResource) {
574 // When loading the main document of an iframe, we won't have a docu ment
575 // yet. We instead need to grab the frame's parent's policy in order to
576 // perform 'frame-src' checks:
577 if (Frame* parentFrame = frame()->tree().parent()) {
578 if (!parentFrame->securityContext()->contentSecurityPolicy()->al lowChildFrameFromSource(url, redirectStatus, cspReporting)) {
579 // TODO(mkwst): If we cancel the request after a redirect, w e never instantiate
580 // a document, and therefore don't inherit the loader's sand box flags, or trigger
581 // a load event. This is strange.
582 if (redirectStatus == ResourceRequest::RedirectStatus::Follo wedRedirect) {
583 frame()->document()->enforceSandboxFlags(SandboxOrigin);
584 frame()->owner()->dispatchLoad();
585 }
586 return true;
587 }
588 }
589 }
590 }
591 return false;
592 }
593
573 bool FrameFetchContext::isControlledByServiceWorker() const 594 bool FrameFetchContext::isControlledByServiceWorker() const
574 { 595 {
575 ASSERT(m_documentLoader || frame()->loader().documentLoader()); 596 ASSERT(m_documentLoader || frame()->loader().documentLoader());
576 if (m_documentLoader) 597 if (m_documentLoader)
577 return frame()->loader().client()->isControlledByServiceWorker(*m_docume ntLoader); 598 return frame()->loader().client()->isControlledByServiceWorker(*m_docume ntLoader);
578 // m_documentLoader is null while loading resources from an HTML import. 599 // m_documentLoader is null while loading resources from an HTML import.
579 // In such cases whether the request is controlled by ServiceWorker or not 600 // In such cases whether the request is controlled by ServiceWorker or not
580 // is determined by the document loader of the frame. 601 // is determined by the document loader of the frame.
581 return frame()->loader().client()->isControlledByServiceWorker(*frame()->loa der().documentLoader()); 602 return frame()->loader().client()->isControlledByServiceWorker(*frame()->loa der().documentLoader());
582 } 603 }
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
757 } 778 }
758 779
759 DEFINE_TRACE(FrameFetchContext) 780 DEFINE_TRACE(FrameFetchContext)
760 { 781 {
761 visitor->trace(m_document); 782 visitor->trace(m_document);
762 visitor->trace(m_documentLoader); 783 visitor->trace(m_documentLoader);
763 FetchContext::trace(visitor); 784 FetchContext::trace(visitor);
764 } 785 }
765 786
766 } // namespace blink 787 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698