Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(503)

Unified Diff: components/plugins/renderer/loadable_plugin_placeholder.cc

Issue 1124173008: Plugin Power Saver: Unthrottle dynamically sized plugins correctly. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: components/plugins/renderer/loadable_plugin_placeholder.cc
diff --git a/components/plugins/renderer/loadable_plugin_placeholder.cc b/components/plugins/renderer/loadable_plugin_placeholder.cc
index 90c3f9ba7183580e8f0c07d6736c85feda4421e8..ea288e2f424c972346428367c6863f9c53c60ea8 100644
--- a/components/plugins/renderer/loadable_plugin_placeholder.cc
+++ b/components/plugins/renderer/loadable_plugin_placeholder.cc
@@ -11,6 +11,7 @@
#include "base/strings/string_piece.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
+#include "base/thread_task_runner_handle.h"
#include "base/values.h"
#include "content/public/child/v8_value_converter.h"
#include "content/public/common/content_switches.h"
@@ -46,6 +47,11 @@ using content::RenderThread;
namespace plugins {
#if defined(ENABLE_PLUGINS)
+// TODO(tommycli): After an unthrottling size update, re-check the size after
+// this delay, as Blink can report incorrect sizes to plugins while the
+// compositing state is dirty. Chosen because it seems to work.
+const int kSizeChangeRecheckDelayMilliseconds = 100;
+
void LoadablePluginPlaceholder::BlockForPowerSaverPoster() {
DCHECK(!is_blocked_for_power_saver_poster_);
is_blocked_for_power_saver_poster_ = true;
@@ -84,6 +90,7 @@ LoadablePluginPlaceholder::LoadablePluginPlaceholder(
allow_loading_(false),
hidden_(false),
finished_loading_(false),
+ in_size_recheck_(false),
weak_factory_(this) {
}
@@ -265,6 +272,40 @@ v8::Local<v8::Object> LoadablePluginPlaceholder::GetV8ScriptableObject(
return v8::Local<v8::Object>();
}
+#if defined(ENABLE_PLUGINS)
+void LoadablePluginPlaceholder::OnUnobscuredSizeUpdate(
+ const gfx::Size& unobscured_size) {
+ DCHECK(
+ content::RenderThread::Get()->GetTaskRunner()->BelongsToCurrentThread());
+ if (!power_saver_enabled_ || !premade_throttler_ || !finished_loading_)
+ return;
+
+ unobscured_size_ = unobscured_size;
+
+ // During a size recheck, we will get another notification into this method.
+ // Use this flag to early exit to prevent reentrancy issues.
+ if (in_size_recheck_)
+ return;
+
+ if (PluginInstanceThrottler::IsLargeContent(unobscured_size.width(),
+ unobscured_size.height())) {
+ if (!size_update_timer_.IsRunning()) {
+ // TODO(tommycli): We have to post a delayed task to recheck the size, as
+ // Blink can report wrong sizes for partially obscured plugins while the
+ // compositing state is dirty. https://crbug.com/343769
+ size_update_timer_.Start(
+ FROM_HERE, base::TimeDelta::FromMilliseconds(
+ kSizeChangeRecheckDelayMilliseconds),
+ base::Bind(&LoadablePluginPlaceholder::RecheckSizeAndMaybeUnthrottle,
+ weak_factory_.GetWeakPtr()));
+ }
+ } else {
+ // Cancel any pending unthrottle due to resize calls.
+ size_update_timer_.Stop();
+ }
+}
+#endif // defined(ENABLE_PLUGINS)
+
void LoadablePluginPlaceholder::WasShown() {
if (is_blocked_for_background_tab_) {
is_blocked_for_background_tab_ = false;
@@ -389,4 +430,24 @@ bool LoadablePluginPlaceholder::LoadingBlocked() const {
is_blocked_for_prerendering_;
}
+#if defined(ENABLE_PLUGINS)
+void LoadablePluginPlaceholder::RecheckSizeAndMaybeUnthrottle() {
+ DCHECK(
+ content::RenderThread::Get()->GetTaskRunner()->BelongsToCurrentThread());
+ DCHECK(!in_size_recheck_);
+ in_size_recheck_ = true;
+
+ // Re-check the size in case the reported size was incorrect.
+ plugin()->container()->reportGeometry();
+
+ if (PluginInstanceThrottler::IsLargeContent(unobscured_size_.width(),
+ unobscured_size_.height())) {
+ MarkPluginEssential(
+ PluginInstanceThrottler::UNTHROTTLE_METHOD_BY_SIZE_CHANGE);
+ }
+
+ in_size_recheck_ = false;
+}
+#endif // defined(ENABLE_PLUGINS)
+
} // namespace plugins
« no previous file with comments | « components/plugins/renderer/loadable_plugin_placeholder.h ('k') | components/plugins/renderer/webview_plugin.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698