| Index: Source/core/loader/MixedContentChecker.cpp
|
| diff --git a/Source/core/loader/MixedContentChecker.cpp b/Source/core/loader/MixedContentChecker.cpp
|
| index 7a81b6b13e899bce51b38bec59237e9087f1ef14..7a61bc3f51288ac0db20c7638eb66aaabe1ec9f1 100644
|
| --- a/Source/core/loader/MixedContentChecker.cpp
|
| +++ b/Source/core/loader/MixedContentChecker.cpp
|
| @@ -109,7 +109,7 @@ MixedContentChecker::ContextType MixedContentChecker::contextTypeFromContext(Web
|
| case WebURLRequest::RequestContextXMLHttpRequest:
|
| return ContextTypeBlockableUnlessLax;
|
|
|
| - // Contexts that we should block, but don't currently.
|
| + // FIXME: Contexts that we should block, but don't currently. https://crbug.com/388650
|
| case WebURLRequest::RequestContextDownload:
|
| case WebURLRequest::RequestContextInternal:
|
| case WebURLRequest::RequestContextPlugin:
|
| @@ -124,6 +124,94 @@ MixedContentChecker::ContextType MixedContentChecker::contextTypeFromContext(Web
|
| }
|
|
|
| // static
|
| +const char* MixedContentChecker::typeNameFromContext(WebURLRequest::RequestContext context)
|
| +{
|
| + switch (context) {
|
| + case WebURLRequest::RequestContextAudio:
|
| + return "audio file";
|
| + case WebURLRequest::RequestContextBeacon:
|
| + return "Beacon endpoint";
|
| + case WebURLRequest::RequestContextCSPReport:
|
| + return "Content Security Policy reporting endpoint";
|
| + case WebURLRequest::RequestContextDownload:
|
| + return "download";
|
| + case WebURLRequest::RequestContextEmbed:
|
| + return "plugin resource";
|
| + case WebURLRequest::RequestContextEventSource:
|
| + return "EventSource endpoint";
|
| + case WebURLRequest::RequestContextFavicon:
|
| + return "favicon";
|
| + case WebURLRequest::RequestContextFetch:
|
| + return "resource";
|
| + case WebURLRequest::RequestContextFont:
|
| + return "font";
|
| + case WebURLRequest::RequestContextForm:
|
| + return "form action";
|
| + case WebURLRequest::RequestContextFrame:
|
| + return "frame";
|
| + case WebURLRequest::RequestContextHyperlink:
|
| + return "resource";
|
| + case WebURLRequest::RequestContextIframe:
|
| + return "frame";
|
| + case WebURLRequest::RequestContextImage:
|
| + return "image";
|
| + case WebURLRequest::RequestContextImageSet:
|
| + return "image";
|
| + case WebURLRequest::RequestContextImport:
|
| + return "HTML Import";
|
| + case WebURLRequest::RequestContextInternal:
|
| + return "resource";
|
| + case WebURLRequest::RequestContextLocation:
|
| + return "resource";
|
| + case WebURLRequest::RequestContextManifest:
|
| + return "manifest";
|
| + case WebURLRequest::RequestContextObject:
|
| + return "plugin resource";
|
| + case WebURLRequest::RequestContextPing:
|
| + return "hyperlink auditing endpoint";
|
| + case WebURLRequest::RequestContextPlugin:
|
| + return "plugin data";
|
| + case WebURLRequest::RequestContextPrefetch:
|
| + return "prefetch resource";
|
| + case WebURLRequest::RequestContextScript:
|
| + return "script";
|
| + case WebURLRequest::RequestContextServiceWorker:
|
| + return "Service Worker script";
|
| + case WebURLRequest::RequestContextSharedWorker:
|
| + return "Shared Worker script";
|
| + case WebURLRequest::RequestContextStyle:
|
| + return "stylesheet";
|
| + case WebURLRequest::RequestContextSubresource:
|
| + return "resource";
|
| + case WebURLRequest::RequestContextTrack:
|
| + return "Text Track";
|
| + case WebURLRequest::RequestContextUnspecified:
|
| + return "resource";
|
| + case WebURLRequest::RequestContextVideo:
|
| + return "video";
|
| + case WebURLRequest::RequestContextWorker:
|
| + return "Worker script";
|
| + case WebURLRequest::RequestContextXMLHttpRequest:
|
| + return "XMLHttpRequest endpoint";
|
| + case WebURLRequest::RequestContextXSLT:
|
| + return "XSLT";
|
| + }
|
| + ASSERT_NOT_REACHED();
|
| + return "resource";
|
| +}
|
| +
|
| +// static
|
| +void MixedContentChecker::logToConsole(LocalFrame* frame, const KURL& url, WebURLRequest::RequestContext requestContext, bool allowed)
|
| +{
|
| + String message = String::format(
|
| + "Mixed Content: The page at '%s' was loaded over HTTPS, but requested an insecure %s '%s'. %s",
|
| + frame->document()->url().elidedString().utf8().data(), typeNameFromContext(requestContext), url.elidedString().utf8().data(),
|
| + allowed ? "This content should also be served over HTTPS." : "This request has been blocked; the content must be served over HTTPS.");
|
| + MessageLevel messageLevel = allowed ? WarningMessageLevel : ErrorMessageLevel;
|
| + frame->document()->addConsoleMessage(ConsoleMessage::create(SecurityMessageSource, messageLevel, message));
|
| +}
|
| +
|
| +// static
|
| bool MixedContentChecker::shouldBlockFetch(LocalFrame* frame, const ResourceRequest& resourceRequest, const KURL& url)
|
| {
|
| // No frame, no mixed content:
|
| @@ -156,36 +244,34 @@ bool MixedContentChecker::shouldBlockFetch(LocalFrame* frame, const ResourceRequ
|
| SecurityOrigin* securityOrigin = frame->document()->securityOrigin();
|
| bool allowed = false;
|
|
|
| - switch (contextTypeFromContext(resourceRequest.requestContext())) {
|
| + ContextType contextType = contextTypeFromContext(resourceRequest.requestContext());
|
| + if (contextType == ContextTypeBlockableUnlessLax)
|
| + contextType = RuntimeEnabledFeatures::laxMixedContentCheckingEnabled() ? ContextTypeOptionallyBlockable : ContextTypeBlockable;
|
| +
|
| + switch (contextType) {
|
| case ContextTypeOptionallyBlockable:
|
| allowed = client->allowDisplayingInsecureContent(settings && settings->allowDisplayOfInsecureContent(), securityOrigin, url);
|
| if (allowed)
|
| client->didDisplayInsecureContent();
|
| - return !allowed;
|
| + break;
|
|
|
| case ContextTypeBlockable:
|
| allowed = client->allowRunningInsecureContent(settings && settings->allowRunningOfInsecureContent(), securityOrigin, url);
|
| if (allowed)
|
| client->didRunInsecureContent(securityOrigin, url);
|
| - return !allowed;
|
| -
|
| - case ContextTypeBlockableUnlessLax:
|
| - 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;
|
| + break;
|
|
|
| case ContextTypeShouldBeBlockable:
|
| return false;
|
| +
|
| + case ContextTypeBlockableUnlessLax:
|
| + // We map this to either OptionallyBlockable or Blockable above.
|
| + ASSERT_NOT_REACHED();
|
| + return true;
|
| };
|
| - ASSERT_NOT_REACHED();
|
| - return true;
|
| +
|
| + logToConsole(frame, url, resourceRequest.requestContext(), allowed);
|
| + return !allowed;
|
| }
|
|
|
| bool MixedContentChecker::canDisplayInsecureContentInternal(SecurityOrigin* securityOrigin, const KURL& url, const MixedContentType type) const
|
|
|