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

Unified Diff: content/renderer/pepper/pepper_plugin_instance_impl.cc

Issue 680193002: Plugin Power Saver: Implement size-based heuristic for peripheral content. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 2 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: content/renderer/pepper/pepper_plugin_instance_impl.cc
diff --git a/content/renderer/pepper/pepper_plugin_instance_impl.cc b/content/renderer/pepper/pepper_plugin_instance_impl.cc
index e22101ba7c5f8660dd9d5d8a401b6c1139100266..52795cc422dcabf53b83e18fca6a3771f01ab671 100644
--- a/content/renderer/pepper/pepper_plugin_instance_impl.cc
+++ b/content/renderer/pepper/pepper_plugin_instance_impl.cc
@@ -21,6 +21,7 @@
#include "cc/layers/texture_layer.h"
#include "cc/trees/layer_tree_host.h"
#include "content/common/content_constants_internal.h"
+#include "content/common/frame_messages.h"
#include "content/common/input/web_input_event_traits.h"
#include "content/public/common/content_constants.h"
#include "content/public/common/content_switches.h"
@@ -225,6 +226,11 @@ const char kHeight[] = "height";
const char kBorder[] = "border"; // According to w3c, deprecated.
const char kStyle[] = "style";
+// Maximum dimensions plug-in content may have while still being considered
Lei Zhang 2014/10/28 02:16:23 Mention these match Safari's sizes.
tommycli 2014/10/28 22:18:07 Done.
+// peripheral content.
+const int kPeripheralContentMaxWidth = 400;
+const int kPeripheralContentMaxHeight = 300;
+
COMPILE_ASSERT_MATCHING_ENUM(TypePointer, PP_MOUSECURSOR_TYPE_POINTER);
COMPILE_ASSERT_MATCHING_ENUM(TypeCross, PP_MOUSECURSOR_TYPE_CROSS);
COMPILE_ASSERT_MATCHING_ENUM(TypeHand, PP_MOUSECURSOR_TYPE_HAND);
@@ -2052,6 +2058,18 @@ bool PepperPluginInstanceImpl::PrepareTextureMailbox(
void PepperPluginInstanceImpl::OnDestruct() { render_frame_ = NULL; }
+bool PepperPluginInstanceImpl::OnMessageReceived(const IPC::Message& message) {
+ // We set "handled" to false here, because we want this broadcast message to
Lei Zhang 2014/10/28 02:16:23 Do you want to coordinate this at the PluginModule
tommycli 2014/10/28 22:18:07 Done. I made a PluginPowerSaverHelper class to con
+ // be processed by every PepperPluginInstanceImpl, and not swallowed.
+ bool handled = false;
tommycli 2014/10/27 23:35:53 I set (handled = false) to make sure every instanc
groby-ooo-7-16 2014/10/28 00:39:12 You don't need this - as is, the code will _always
+ IPC_BEGIN_MESSAGE_MAP(PepperPluginInstanceImpl, message)
+ IPC_MESSAGE_HANDLER(FrameMsg_PluginContentOriginWhitelisted,
+ OnPluginContentOriginWhitelisted)
+ IPC_MESSAGE_UNHANDLED(handled = false)
+ IPC_END_MESSAGE_MAP()
+ return handled;
+}
+
void PepperPluginInstanceImpl::AddLatencyInfo(
const std::vector<ui::LatencyInfo>& latency_info) {
if (render_frame_ && render_frame_->GetRenderWidget()) {
@@ -3295,15 +3313,15 @@ void PepperPluginInstanceImpl::DidDataFromWebURLResponse(
}
}
-bool PepperPluginInstanceImpl::IsPeripheralContent() const {
+bool PepperPluginInstanceImpl::IsPeripheralContent() {
if (module_->name() != kFlashPluginName)
return false;
- // Peripheral plugin content is defined to be peripheral when the plugin
- // content's origin differs from the top level frame's origin. For example:
- // - Peripheral: a.com -> b.com/plugin.swf
- // - Peripheral: a.com -> b.com/iframe.html -> b.com/plugin.swf
- // - NOT peripheral: a.com -> b.com/iframe-to-a.html -> a.com/plugin.swf
+ // Plugin content is defined to be cross-origin when the plugin source's
+ // origin differs from the top level frame's origin. For example:
+ // - Cross-origin: a.com -> b.com/plugin.swf
+ // - Cross-origin: a.com -> b.com/iframe.html -> b.com/plugin.swf
+ // - Same-origin: a.com -> b.com/iframe-to-a.html -> a.com/plugin.swf
// TODO(alexmos): Update this to use the origin of the RemoteFrame when 426512
// is fixed. For now, case 3 in the comment above doesn't work in
@@ -3312,8 +3330,31 @@ bool PepperPluginInstanceImpl::IsPeripheralContent() const {
if (main_frame->isWebRemoteFrame())
return true;
+ // All same-origin plugin content is essential.
GURL main_frame_url = main_frame->document().url();
Lei Zhang 2014/10/28 02:16:23 nit: replace |main_frame_url| with |main_frame_ori
tommycli 2014/10/28 22:18:07 Done.
- return plugin_url_.GetOrigin() != main_frame_url.GetOrigin();
+ GURL plugin_origin = plugin_url_.GetOrigin();
+ if (plugin_origin == main_frame_url.GetOrigin())
+ return false;
+
+ // Cross-origin plugin content is peripheral if smaller than a maximum size.
+ blink::WebRect bounds = container()->element().boundsInViewportSpace();
+ bool content_is_large = bounds.width < kPeripheralContentMaxWidth ||
Lei Zhang 2014/10/28 02:16:23 Shouldn't the variable be named "content_is_small"
tommycli 2014/10/28 22:18:07 Done.
+ bounds.height < kPeripheralContentMaxHeight;
+
+ if (content_is_large) {
+ // Large cross-origin plugin content should temporarily whitelist all
+ // content from that origin for that top level frame. This whitelist is
+ // cleared when this render frame is destroyed.
+ Send(new FrameHostMsg_PluginContentOriginAllowed(
Lei Zhang 2014/10/28 02:16:23 It's weird that an IsFoo() method has side effects
tommycli 2014/10/28 22:18:07 Done.
+ render_frame()->GetRoutingID(),
+ plugin_origin));
+ } else {
+ Send(new FrameHostMsg_PluginContentMarkedPeripheral(
+ render_frame()->GetRoutingID(),
+ plugin_origin));
+ }
+
+ return content_is_large;
}
void PepperPluginInstanceImpl::SetPluginThrottled(bool throttled) {
@@ -3325,4 +3366,12 @@ void PepperPluginInstanceImpl::SetPluginThrottled(bool throttled) {
SendDidChangeView();
}
+void PepperPluginInstanceImpl::OnPluginContentOriginWhitelisted(
+ const GURL& content_origin) {
+ if (content_origin == plugin_url_.GetOrigin()) {
+ power_saver_enabled_ = false;
+ SetPluginThrottled(false);
groby-ooo-7-16 2014/10/28 00:39:12 Why not just SetPluginThrottled(false)?
tommycli 2014/10/28 22:18:07 power_saver_enabled_ needs to be set to false, so
+ }
+}
+
} // namespace content
« content/common/frame_messages.h ('K') | « content/renderer/pepper/pepper_plugin_instance_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698