blob: dffaed197f90906d63009729b9911ac1dce19e82 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/data_reduction_proxy/content/renderer/content_previews_render_frame_observer.h"
#include <string>
#include "base/macros.h"
#include "base/strings/string_piece.h"
#include "base/strings/string_split.h"
#include "base/strings/string_util.h"
#include "components/data_reduction_proxy/core/common/data_reduction_proxy_headers.h"
#include "content/public/renderer/render_frame.h"
#include "third_party/blink/public/platform/web_string.h"
#include "third_party/blink/public/web/web_document_loader.h"
#include "third_party/blink/public/web/web_local_frame.h"
namespace data_reduction_proxy {
namespace {
bool HasEmptyImageDirective(const blink::WebURLResponse& web_url_response) {
std::string chrome_proxy_value =
web_url_response
.HttpHeaderField(blink::WebString::FromUTF8(chrome_proxy_header()))
.Utf8();
for (const auto& directive :
base::SplitStringPiece(chrome_proxy_value, ",", base::TRIM_WHITESPACE,
base::SPLIT_WANT_NONEMPTY)) {
if (!base::StartsWith(directive, page_policies_directive(),
base::CompareCase::INSENSITIVE_ASCII)) {
continue;
}
// Check policy directive for empty-image entry.
base::StringPiece page_policies_value = base::StringPiece(directive).substr(
strlen(page_policies_directive()) + 1);
for (const auto& policy :
base::SplitStringPiece(page_policies_value, "|", base::TRIM_WHITESPACE,
base::SPLIT_WANT_NONEMPTY)) {
if (base::LowerCaseEqualsASCII(policy, empty_image_directive())) {
return true;
}
}
}
return false;
}
} // namespace
ContentPreviewsRenderFrameObserver::ContentPreviewsRenderFrameObserver(
content::RenderFrame* render_frame)
: content::RenderFrameObserver(render_frame) {}
ContentPreviewsRenderFrameObserver::~ContentPreviewsRenderFrameObserver() =
default;
// Static
bool ContentPreviewsRenderFrameObserver::ValidatePreviewsStateWithResponse(
content::PreviewsState previews_state,
const blink::WebURLResponse& web_url_response) {
bool has_lite_page_state = previews_state & content::SERVER_LITE_PAGE_ON;
bool has_lite_page_directive =
web_url_response
.HttpHeaderField(blink::WebString::FromUTF8(
chrome_proxy_content_transform_header()))
.Utf8() == lite_page_directive();
DCHECK_EQ(has_lite_page_state, has_lite_page_directive)
<< "Inconsistent PreviewsState ServerLitePage:" << has_lite_page_state
<< " header:" << has_lite_page_directive;
bool has_lofi_state = previews_state & content::SERVER_LOFI_ON;
bool has_empty_image_directive = HasEmptyImageDirective(web_url_response);
DCHECK_EQ(has_lofi_state, has_empty_image_directive)
<< "Inconsistent PreviewsState ServerLoFi:" << has_lofi_state
<< " header:" << has_empty_image_directive;
return (has_lite_page_state == has_lite_page_directive) &&
(has_lofi_state == has_empty_image_directive);
}
void ContentPreviewsRenderFrameObserver::OnDestruct() {
delete this;
}
void ContentPreviewsRenderFrameObserver::DidCommitProvisionalLoad(
bool is_same_document_navigation,
ui::PageTransition transition) {
if (is_same_document_navigation)
return;
content::PreviewsState previews_state = render_frame()->GetPreviewsState();
if (previews_state == 0 || previews_state == content::PREVIEWS_OFF)
return;
const blink::WebURLResponse& web_url_response =
render_frame()->GetWebFrame()->GetDocumentLoader()->GetResponse();
// TODO(dougarnett): Remove this once proven stable to complete
// crbug.com/782922.
DCHECK(ValidatePreviewsStateWithResponse(previews_state, web_url_response));
}
} // namespace data_reduction_proxy