// 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 #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& 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(width) / height; if (std::abs(aspect_ratio - kEssentialVideoAspectRatio) < kAspectRatioEpsilon && width * height >= kEssentialVideoMinimumArea) { return true; } return false; } } // namespace content