Chromium Code Reviews| 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. |