blob: bd2b9ef307693b098a24ea73fb590daa60039615 [file] [log] [blame]
// Copyright 2015 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 "base/macros.h"
#include "base/memory/scoped_ptr.h"
#include "content/common/content_export.h"
namespace blink {
class WebPlugin;
struct WebPluginParams;
namespace gfx {
class Size;
class SkBitmap;
namespace content {
// This class manages the metric collection, throttling, and unthrottling of a
// single peripheral plugin instance. If the Power Saver feature is disabled,
// the plugin instance will never actually be throttled, but still collects
// user interaction metrics.
// The process for throttling a plugin is as follows:
// 1) Attempt to find a representative keyframe to display as a placeholder for
// the plugin.
// 2) a) If a representative keyframe is found, throttle the plugin at that
// keyframe.
// b) If a representative keyframe is not found, throttle the plugin after a
// certain period of time.
// The plugin will then be unthrottled by receiving a mouse click from the user.
// To choose a representative keyframe, we first wait for a certain number of
// "interesting" frames to be displayed by the plugin. A frame is called
// interesting if it meets some heuristic. After we have seen a certain number
// of interesting frames, we throttle the plugin and use that frame as the
// representative keyframe.
class CONTENT_EXPORT PluginInstanceThrottler {
// How the throttled power saver is unthrottled, if ever.
// These numeric values are used in UMA logs; do not change them.
enum PowerSaverUnthrottleMethod {
UNTHROTTLE_METHOD_DO_NOT_RECORD = -1, // Sentinel value to skip recording.
class Observer {
// Guaranteed to be called before the throttle is engaged.
virtual void OnKeyframeExtracted(const SkBitmap* bitmap) {}
virtual void OnThrottleStateChange() {}
virtual void OnPeripheralStateChange() {}
// Called when the plugin should be hidden due to a placeholder.
virtual void OnHiddenForPlaceholder(bool hidden) {}
virtual void OnThrottlerDestroyed() {}
static scoped_ptr<PluginInstanceThrottler> Create();
static void RecordUnthrottleMethodMetric(PowerSaverUnthrottleMethod method);
virtual ~PluginInstanceThrottler() {}
virtual void AddObserver(Observer* observer) = 0;
virtual void RemoveObserver(Observer* observer) = 0;
virtual bool IsThrottled() const = 0;
virtual bool IsHiddenForPlaceholder() const = 0;
// Marks the plugin as essential. Unthrottles the plugin if already throttled.
virtual void MarkPluginEssential(PowerSaverUnthrottleMethod method) = 0;
// Called by the placeholder when the plugin should temporarily be hidden.
virtual void SetHiddenForPlaceholder(bool hidden) = 0;
virtual blink::WebPlugin* GetWebPlugin() const = 0;
// Gets the throttler's best estimate of the plugin's visible dimensions.
virtual const gfx::Size& GetSize() const = 0;
// Throttler needs to know when the plugin audio is throttled, as this may
// prevent the plugin from generating new frames.
virtual void NotifyAudioThrottled() = 0;
PluginInstanceThrottler() {}