blob: 3b36af811c11e192958e4124d67c6c45df9c4f86 [file] [log] [blame]
// Copyright 2014 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 "content/renderer/peripheral_content_heuristic.h"
#include <cmath>
#include "ui/gfx/geometry/size.h"
namespace content {
namespace {
// Content below this size in height and width is considered "tiny".
// Tiny content is never peripheral, as tiny plugins often serve a critical
// purpose, and the user often cannot find and click to unthrottle it.
const int kTinyContentSize = 5;
// Cross-origin content must have a width and height both exceeding these
// minimums to be considered "large", and thus not peripheral.
const int kLargeContentMinWidth = 398;
const int kLargeContentMinHeight = 298;
// Mark some 16:9 aspect ratio content as essential (not peripheral). This is to
// mark as "large" some medium sized video content that meets a minimum area
// requirement, even if it is below the max width/height above.
const double kEssentialVideoAspectRatio = 16.0 / 9.0;
const double kAspectRatioEpsilon = 0.01;
const int kEssentialVideoMinimumArea = 120000;
} // namespace
// static
RenderFrame::PeripheralContentStatus
PeripheralContentHeuristic::GetPeripheralStatus(
const std::set<url::Origin>& origin_whitelist,
const url::Origin& main_frame_origin,
const url::Origin& content_origin,
const gfx::Size& unobscured_size) {
if (main_frame_origin.IsSameOriginWith(content_origin))
return RenderFrame::CONTENT_STATUS_ESSENTIAL_SAME_ORIGIN;
if (origin_whitelist.count(content_origin))
return RenderFrame::CONTENT_STATUS_ESSENTIAL_CROSS_ORIGIN_WHITELISTED;
if (unobscured_size.IsEmpty())
return RenderFrame::CONTENT_STATUS_ESSENTIAL_UNKNOWN_SIZE;
if (unobscured_size.width() <= kTinyContentSize &&
unobscured_size.height() <= kTinyContentSize) {
return RenderFrame::CONTENT_STATUS_ESSENTIAL_CROSS_ORIGIN_TINY;
}
if (IsLargeContent(unobscured_size))
return RenderFrame::CONTENT_STATUS_ESSENTIAL_CROSS_ORIGIN_BIG;
return RenderFrame::CONTENT_STATUS_PERIPHERAL;
}
// static
bool PeripheralContentHeuristic::IsLargeContent(
const gfx::Size& unobscured_size) {
int width = unobscured_size.width();
int height = unobscured_size.height();
if (width >= kLargeContentMinWidth && height >= kLargeContentMinHeight)
return true;
double aspect_ratio = static_cast<double>(width) / height;
if (std::abs(aspect_ratio - kEssentialVideoAspectRatio) <
kAspectRatioEpsilon &&
width * height >= kEssentialVideoMinimumArea) {
return true;
}
return false;
}
} // namespace content