OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "components/plugins/renderer/loadable_plugin_placeholder.h" | 5 #include "components/plugins/renderer/loadable_plugin_placeholder.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
9 #include "base/json/string_escape.h" | 9 #include "base/json/string_escape.h" |
10 #include "base/strings/string_piece.h" | 10 #include "base/strings/string_piece.h" |
(...skipping 13 matching lines...) Expand all Loading... |
24 using base::UserMetricsAction; | 24 using base::UserMetricsAction; |
25 using blink::WebElement; | 25 using blink::WebElement; |
26 using blink::WebLocalFrame; | 26 using blink::WebLocalFrame; |
27 using blink::WebMouseEvent; | 27 using blink::WebMouseEvent; |
28 using blink::WebNode; | 28 using blink::WebNode; |
29 using blink::WebPlugin; | 29 using blink::WebPlugin; |
30 using blink::WebPluginContainer; | 30 using blink::WebPluginContainer; |
31 using blink::WebPluginParams; | 31 using blink::WebPluginParams; |
32 using blink::WebScriptSource; | 32 using blink::WebScriptSource; |
33 using blink::WebURLRequest; | 33 using blink::WebURLRequest; |
| 34 using content::PluginInstanceThrottler; |
34 using content::PluginPowerSaverMode; | 35 using content::PluginPowerSaverMode; |
35 using content::RenderThread; | 36 using content::RenderThread; |
36 | 37 |
37 namespace plugins { | 38 namespace plugins { |
38 | 39 |
39 #if defined(ENABLE_PLUGINS) | 40 #if defined(ENABLE_PLUGINS) |
40 void LoadablePluginPlaceholder::BlockForPowerSaverPoster() { | 41 void LoadablePluginPlaceholder::BlockForPowerSaverPoster() { |
41 DCHECK(!is_blocked_for_power_saver_poster_); | 42 DCHECK(!is_blocked_for_power_saver_poster_); |
42 is_blocked_for_power_saver_poster_ = true; | 43 is_blocked_for_power_saver_poster_ = true; |
43 | 44 |
44 render_frame()->RegisterPeripheralPlugin( | 45 render_frame()->RegisterPeripheralPlugin( |
45 GURL(GetPluginParams().url).GetOrigin(), | 46 GURL(GetPluginParams().url).GetOrigin(), |
46 base::Bind(&LoadablePluginPlaceholder::DisablePowerSaverForInstance, | 47 base::Bind(&LoadablePluginPlaceholder::DisablePowerSaverForInstance, |
47 weak_factory_.GetWeakPtr())); | 48 weak_factory_.GetWeakPtr(), |
| 49 PluginInstanceThrottler::UNTHROTTLE_METHOD_BY_WHITELIST)); |
48 } | 50 } |
49 #endif | 51 #endif |
50 | 52 |
51 LoadablePluginPlaceholder::LoadablePluginPlaceholder( | 53 LoadablePluginPlaceholder::LoadablePluginPlaceholder( |
52 content::RenderFrame* render_frame, | 54 content::RenderFrame* render_frame, |
53 WebLocalFrame* frame, | 55 WebLocalFrame* frame, |
54 const WebPluginParams& params, | 56 const WebPluginParams& params, |
55 const std::string& html_data, | 57 const std::string& html_data, |
56 GURL placeholderDataUrl) | 58 GURL placeholderDataUrl) |
57 : PluginPlaceholder(render_frame, | 59 : PluginPlaceholder(render_frame, |
58 frame, | 60 frame, |
59 params, | 61 params, |
60 html_data, | 62 html_data, |
61 placeholderDataUrl), | 63 placeholderDataUrl), |
62 is_blocked_for_background_tab_(false), | 64 is_blocked_for_background_tab_(false), |
63 is_blocked_for_prerendering_(false), | 65 is_blocked_for_prerendering_(false), |
64 is_blocked_for_power_saver_poster_(false), | 66 is_blocked_for_power_saver_poster_(false), |
65 power_saver_mode_(PluginPowerSaverMode::POWER_SAVER_MODE_ESSENTIAL), | 67 power_saver_mode_(PluginPowerSaverMode::POWER_SAVER_MODE_ESSENTIAL), |
66 allow_loading_(false), | 68 allow_loading_(false), |
| 69 placeholder_was_replaced_(false), |
67 hidden_(false), | 70 hidden_(false), |
68 finished_loading_(false), | 71 finished_loading_(false), |
69 weak_factory_(this) { | 72 weak_factory_(this) { |
70 } | 73 } |
71 | 74 |
72 LoadablePluginPlaceholder::~LoadablePluginPlaceholder() { | 75 LoadablePluginPlaceholder::~LoadablePluginPlaceholder() { |
| 76 #if defined(ENABLE_PLUGINS) |
| 77 if (!placeholder_was_replaced_ && !is_blocked_for_prerendering_ && |
| 78 power_saver_mode_ != PluginPowerSaverMode::POWER_SAVER_MODE_ESSENTIAL) { |
| 79 PluginInstanceThrottler::RecordUnthrottleMethodMetric( |
| 80 PluginInstanceThrottler::UNTHROTTLE_METHOD_NEVER); |
| 81 } |
| 82 #endif |
73 } | 83 } |
74 | 84 |
75 #if defined(ENABLE_PLUGINS) | 85 #if defined(ENABLE_PLUGINS) |
76 void LoadablePluginPlaceholder::DisablePowerSaverForInstance() { | 86 void LoadablePluginPlaceholder::DisablePowerSaverForInstance( |
| 87 PluginInstanceThrottler::PowerSaverUnthrottleMethod method) { |
| 88 if (power_saver_mode_ == PluginPowerSaverMode::POWER_SAVER_MODE_ESSENTIAL) |
| 89 return; |
| 90 |
77 power_saver_mode_ = PluginPowerSaverMode::POWER_SAVER_MODE_ESSENTIAL; | 91 power_saver_mode_ = PluginPowerSaverMode::POWER_SAVER_MODE_ESSENTIAL; |
| 92 PluginInstanceThrottler::RecordUnthrottleMethodMetric(method); |
78 if (is_blocked_for_power_saver_poster_) { | 93 if (is_blocked_for_power_saver_poster_) { |
79 is_blocked_for_power_saver_poster_ = false; | 94 is_blocked_for_power_saver_poster_ = false; |
80 if (!LoadingBlocked()) | 95 if (!LoadingBlocked()) |
81 LoadPlugin(); | 96 LoadPlugin(); |
82 } | 97 } |
83 } | 98 } |
84 #endif | 99 #endif |
85 | 100 |
86 gin::ObjectTemplateBuilder LoadablePluginPlaceholder::GetObjectTemplateBuilder( | 101 gin::ObjectTemplateBuilder LoadablePluginPlaceholder::GetObjectTemplateBuilder( |
87 v8::Isolate* isolate) { | 102 v8::Isolate* isolate) { |
(...skipping 30 matching lines...) Expand all Loading... |
118 // During initialization, the new plug-in might have replaced itself in turn | 133 // During initialization, the new plug-in might have replaced itself in turn |
119 // with another plug-in. Make sure not to use the passed in |new_plugin| after | 134 // with another plug-in. Make sure not to use the passed in |new_plugin| after |
120 // this point. | 135 // this point. |
121 new_plugin = container->plugin(); | 136 new_plugin = container->plugin(); |
122 | 137 |
123 plugin()->RestoreTitleText(); | 138 plugin()->RestoreTitleText(); |
124 container->invalidate(); | 139 container->invalidate(); |
125 container->reportGeometry(); | 140 container->reportGeometry(); |
126 plugin()->ReplayReceivedData(new_plugin); | 141 plugin()->ReplayReceivedData(new_plugin); |
127 plugin()->destroy(); | 142 plugin()->destroy(); |
| 143 |
| 144 placeholder_was_replaced_ = true; |
128 } | 145 } |
129 | 146 |
130 void LoadablePluginPlaceholder::HidePlugin() { | 147 void LoadablePluginPlaceholder::HidePlugin() { |
131 hidden_ = true; | 148 hidden_ = true; |
132 if (!plugin()) | 149 if (!plugin()) |
133 return; | 150 return; |
134 WebPluginContainer* container = plugin()->container(); | 151 WebPluginContainer* container = plugin()->container(); |
135 WebElement element = container->element(); | 152 WebElement element = container->element(); |
136 element.setAttribute("style", "display: none;"); | 153 element.setAttribute("style", "display: none;"); |
137 // If we have a width and height, search for a parent (often <div>) with the | 154 // If we have a width and height, search for a parent (often <div>) with the |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
232 if (!plugin()) | 249 if (!plugin()) |
233 return; | 250 return; |
234 if (!allow_loading_) { | 251 if (!allow_loading_) { |
235 NOTREACHED(); | 252 NOTREACHED(); |
236 return; | 253 return; |
237 } | 254 } |
238 | 255 |
239 // TODO(mmenke): In the case of prerendering, feed into | 256 // TODO(mmenke): In the case of prerendering, feed into |
240 // ChromeContentRendererClient::CreatePlugin instead, to | 257 // ChromeContentRendererClient::CreatePlugin instead, to |
241 // reduce the chance of future regressions. | 258 // reduce the chance of future regressions. |
242 scoped_ptr<content::PluginInstanceThrottler> throttler; | 259 scoped_ptr<PluginInstanceThrottler> throttler; |
243 #if defined(ENABLE_PLUGINS) | 260 #if defined(ENABLE_PLUGINS) |
244 throttler = content::PluginInstanceThrottler::Get( | 261 throttler = PluginInstanceThrottler::Get( |
245 render_frame(), GetPluginParams().url, power_saver_mode_); | 262 render_frame(), GetPluginParams().url, power_saver_mode_); |
246 #endif | 263 #endif |
247 WebPlugin* plugin = render_frame()->CreatePlugin( | 264 WebPlugin* plugin = render_frame()->CreatePlugin( |
248 GetFrame(), plugin_info_, GetPluginParams(), throttler.Pass()); | 265 GetFrame(), plugin_info_, GetPluginParams(), throttler.Pass()); |
249 ReplacePlugin(plugin); | 266 ReplacePlugin(plugin); |
250 } | 267 } |
251 | 268 |
252 void LoadablePluginPlaceholder::LoadCallback() { | 269 void LoadablePluginPlaceholder::LoadCallback() { |
253 RenderThread::Get()->RecordAction(UserMetricsAction("Plugin_Load_Click")); | 270 RenderThread::Get()->RecordAction(UserMetricsAction("Plugin_Load_Click")); |
254 #if defined(ENABLE_PLUGINS) | 271 #if defined(ENABLE_PLUGINS) |
255 // If the user specifically clicks on the plug-in content's placeholder, | 272 // If the user specifically clicks on the plug-in content's placeholder, |
256 // disable power saver throttling for this instance. | 273 // disable power saver throttling for this instance. |
257 DisablePowerSaverForInstance(); | 274 DisablePowerSaverForInstance( |
| 275 PluginInstanceThrottler::UNTHROTTLE_METHOD_BY_CLICK); |
258 #endif | 276 #endif |
259 LoadPlugin(); | 277 LoadPlugin(); |
260 } | 278 } |
261 | 279 |
262 void LoadablePluginPlaceholder::HideCallback() { | 280 void LoadablePluginPlaceholder::HideCallback() { |
263 RenderThread::Get()->RecordAction(UserMetricsAction("Plugin_Hide_Click")); | 281 RenderThread::Get()->RecordAction(UserMetricsAction("Plugin_Hide_Click")); |
264 HidePlugin(); | 282 HidePlugin(); |
265 } | 283 } |
266 | 284 |
267 void LoadablePluginPlaceholder::DidFinishLoadingCallback() { | 285 void LoadablePluginPlaceholder::DidFinishLoadingCallback() { |
(...skipping 15 matching lines...) Expand all Loading... |
283 identifier_ = identifier; | 301 identifier_ = identifier; |
284 } | 302 } |
285 | 303 |
286 bool LoadablePluginPlaceholder::LoadingBlocked() const { | 304 bool LoadablePluginPlaceholder::LoadingBlocked() const { |
287 DCHECK(allow_loading_); | 305 DCHECK(allow_loading_); |
288 return is_blocked_for_background_tab_ || is_blocked_for_power_saver_poster_ || | 306 return is_blocked_for_background_tab_ || is_blocked_for_power_saver_poster_ || |
289 is_blocked_for_prerendering_; | 307 is_blocked_for_prerendering_; |
290 } | 308 } |
291 | 309 |
292 } // namespace plugins | 310 } // namespace plugins |
OLD | NEW |