Index: Source/core/loader/MixedContentChecker.cpp |
diff --git a/Source/core/loader/MixedContentChecker.cpp b/Source/core/loader/MixedContentChecker.cpp |
index e7a6674899b012b231a05cb33e673cbe2a1f63f9..b529b1b71ad936edaf0c6ea5e370f51556fba0a1 100644 |
--- a/Source/core/loader/MixedContentChecker.cpp |
+++ b/Source/core/loader/MixedContentChecker.cpp |
@@ -62,6 +62,132 @@ bool MixedContentChecker::isMixedContent(SecurityOrigin* securityOrigin, const K |
return !SecurityOrigin::isSecure(url); |
} |
+MixedContentChecker::ContextType contextTypeFromContext(WebURLRequest::RequestContext context) |
jochen (gone - plz use gerrit)
2014/09/05 08:26:14
static?
|
+{ |
+ switch (context) { |
+ // "Optionally-blockable" mixed content |
+ case WebURLRequest::RequestContextAudio: |
+ case WebURLRequest::RequestContextFavicon: |
+ case WebURLRequest::RequestContextImage: |
+ case WebURLRequest::RequestContextVideo: |
+ return MixedContentChecker::OptionallyBlockable; |
+ |
+ // "Blockable" mixed content |
+ case WebURLRequest::RequestContextBeacon: |
+ case WebURLRequest::RequestContextCSPReport: |
+ case WebURLRequest::RequestContextEmbed: |
+ case WebURLRequest::RequestContextFetch: |
+ case WebURLRequest::RequestContextFont: |
+ case WebURLRequest::RequestContextForm: |
+ case WebURLRequest::RequestContextFrame: |
+ case WebURLRequest::RequestContextHyperlink: |
+ case WebURLRequest::RequestContextIframe: |
+ case WebURLRequest::RequestContextImageSet: |
+ case WebURLRequest::RequestContextImport: |
+ case WebURLRequest::RequestContextLocation: |
+ case WebURLRequest::RequestContextManifest: |
+ case WebURLRequest::RequestContextObject: |
+ case WebURLRequest::RequestContextPing: |
+ case WebURLRequest::RequestContextScript: |
+ case WebURLRequest::RequestContextServiceWorker: |
+ case WebURLRequest::RequestContextSharedWorker: |
+ case WebURLRequest::RequestContextStyle: |
+ case WebURLRequest::RequestContextSubresource: |
+ case WebURLRequest::RequestContextTrack: |
+ case WebURLRequest::RequestContextWorker: |
+ case WebURLRequest::RequestContextXSLT: |
+ return MixedContentChecker::Blockable; |
+ |
+ // "Blockable" mixed content whose behavior changed recently, and which is thus guarded behind the "lax" flag |
+ case WebURLRequest::RequestContextEventSource: |
+ case WebURLRequest::RequestContextXMLHttpRequest: |
+ return MixedContentChecker::BlockableUnlessLax; |
+ |
+ // Contexts that we should block, but don't currently. |
+ case WebURLRequest::RequestContextDownload: |
+ case WebURLRequest::RequestContextInternal: |
+ case WebURLRequest::RequestContextPlugin: |
+ case WebURLRequest::RequestContextPrefetch: |
+ return MixedContentChecker::ShouldBeBlockable; |
+ |
+ case WebURLRequest::RequestContextUnspecified: |
+ ASSERT_NOT_REACHED(); |
+ } |
+ ASSERT_NOT_REACHED(); |
+ return MixedContentChecker::Blockable; |
+} |
+ |
+// static |
+bool MixedContentChecker::shouldBlockSubresourceFetch(LocalFrame* frame, const ResourceRequest& resourceRequest, const KURL& url) |
+{ |
+ return false; |
+} |
+ |
+// static |
+bool MixedContentChecker::shouldBlockFetch(LocalFrame* frame, const ResourceRequest& resourceRequest, const KURL& url) |
+{ |
+ // No frame, no mixed content: |
+ if (!frame) |
+ return false; |
+ |
+ // Check the top frame first. |
+ if (Frame* top = frame->tree().top()) { |
+ // FIXME: We need a way to access the top-level frame's SecurityOrigin when that frame |
+ // is in a different process from the current frame. Until that is done, we bail out |
+ // early and allow the load. |
+ if (!top->isLocalFrame()) |
+ return true; |
+ |
+ LocalFrame* localTop = toLocalFrame(top); |
+ if (frame != localTop && shouldBlockFetch(localTop, resourceRequest, url)) |
+ return true; |
+ } |
+ |
+ // We only need to examine insecure URLs in secure contexts; return early otherwise. |
+ if (SecurityOrigin::isSecure(url) || frame->document()->securityOrigin()->protocol() != "https") |
+ return false; |
+ |
+ // Likewise, we only care about subresource loads: |
+ if (resourceRequest.frameType() == WebURLRequest::FrameTypeTopLevel) |
+ return false; |
+ |
+ Settings* settings = frame->settings(); |
+ FrameLoaderClient* client = frame->loader().client(); |
+ SecurityOrigin* securityOrigin = frame->document()->securityOrigin(); |
+ bool allowed = false; |
+ |
+ switch (contextTypeFromContext(resourceRequest.requestContext())) { |
+ case OptionallyBlockable: |
+ allowed = client->allowDisplayingInsecureContent(settings && settings->allowDisplayOfInsecureContent(), securityOrigin, url); |
+ if (allowed) |
+ client->didDisplayInsecureContent(); |
+ return !allowed; |
+ |
+ case Blockable: |
+ allowed = client->allowRunningInsecureContent(settings && settings->allowRunningOfInsecureContent(), securityOrigin, url); |
+ if (allowed) |
+ client->didRunInsecureContent(securityOrigin, url); |
+ return !allowed; |
+ |
+ case BlockableUnlessLax: |
+ if (RuntimeEnabledFeatures::laxMixedContentCheckingEnabled()) { |
+ allowed = client->allowDisplayingInsecureContent(settings && settings->allowDisplayOfInsecureContent(), securityOrigin, url); |
+ if (allowed) |
+ client->didDisplayInsecureContent(); |
+ } else { |
+ allowed = client->allowRunningInsecureContent(settings && settings->allowRunningOfInsecureContent(), securityOrigin, url); |
+ if (allowed) |
+ client->didRunInsecureContent(securityOrigin, url); |
+ } |
+ return !allowed; |
+ |
+ case ShouldBeBlockable: |
+ return false; |
+ }; |
+ ASSERT_NOT_REACHED(); |
+ return true; |
+} |
+ |
bool MixedContentChecker::canDisplayInsecureContentInternal(SecurityOrigin* securityOrigin, const KURL& url, const MixedContentType type) const |
{ |
// Check the top frame if it differs from MixedContentChecker's m_frame. |