Chromium Code Reviews| 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 29 matching lines...) Expand all Loading... | |
| 40 void LoadablePluginPlaceholder::BlockForPowerSaverPoster() { | 40 void LoadablePluginPlaceholder::BlockForPowerSaverPoster() { |
| 41 DCHECK(!is_blocked_for_power_saver_poster_); | 41 DCHECK(!is_blocked_for_power_saver_poster_); |
| 42 is_blocked_for_power_saver_poster_ = true; | 42 is_blocked_for_power_saver_poster_ = true; |
| 43 | 43 |
| 44 render_frame()->RegisterPeripheralPlugin( | 44 render_frame()->RegisterPeripheralPlugin( |
| 45 GURL(GetPluginParams().url).GetOrigin(), | 45 GURL(GetPluginParams().url).GetOrigin(), |
| 46 base::Bind(&LoadablePluginPlaceholder::MarkPluginEssential, | 46 base::Bind(&LoadablePluginPlaceholder::MarkPluginEssential, |
| 47 weak_factory_.GetWeakPtr(), | 47 weak_factory_.GetWeakPtr(), |
| 48 PluginInstanceThrottler::UNTHROTTLE_METHOD_BY_WHITELIST)); | 48 PluginInstanceThrottler::UNTHROTTLE_METHOD_BY_WHITELIST)); |
| 49 } | 49 } |
| 50 #endif | |
| 51 | 50 |
| 52 void LoadablePluginPlaceholder::SetPremadePlugin( | 51 void LoadablePluginPlaceholder::SetPremadePlugin( |
| 53 content::PluginInstanceThrottler* throttler) { | 52 content::PluginInstanceThrottler* throttler) { |
| 54 DCHECK(throttler); | 53 DCHECK(throttler); |
| 55 DCHECK(!premade_throttler_); | 54 DCHECK(!premade_throttler_); |
| 56 premade_throttler_ = throttler; | 55 premade_throttler_ = throttler; |
| 57 | |
| 58 premade_throttler_->AddObserver(this); | |
| 59 } | 56 } |
| 57 #endif | |
| 60 | 58 |
| 61 LoadablePluginPlaceholder::LoadablePluginPlaceholder( | 59 LoadablePluginPlaceholder::LoadablePluginPlaceholder( |
| 62 content::RenderFrame* render_frame, | 60 content::RenderFrame* render_frame, |
| 63 WebLocalFrame* frame, | 61 WebLocalFrame* frame, |
| 64 const WebPluginParams& params, | 62 const WebPluginParams& params, |
| 65 const std::string& html_data, | 63 const std::string& html_data, |
| 66 GURL placeholderDataUrl) | 64 GURL placeholderDataUrl) |
| 67 : PluginPlaceholder(render_frame, | 65 : PluginPlaceholder(render_frame, |
| 68 frame, | 66 frame, |
| 69 params, | 67 params, |
| 70 html_data, | 68 html_data, |
| 71 placeholderDataUrl), | 69 placeholderDataUrl), |
| 72 is_blocked_for_background_tab_(false), | 70 is_blocked_for_background_tab_(false), |
| 73 is_blocked_for_prerendering_(false), | 71 is_blocked_for_prerendering_(false), |
| 74 is_blocked_for_power_saver_poster_(false), | 72 is_blocked_for_power_saver_poster_(false), |
| 75 power_saver_enabled_(false), | 73 power_saver_enabled_(false), |
| 76 plugin_marked_essential_(false), | |
| 77 premade_throttler_(nullptr), | 74 premade_throttler_(nullptr), |
| 78 allow_loading_(false), | 75 allow_loading_(false), |
| 79 placeholder_was_replaced_(false), | |
| 80 hidden_(false), | 76 hidden_(false), |
| 81 finished_loading_(false), | 77 finished_loading_(false), |
| 82 weak_factory_(this) { | 78 weak_factory_(this) { |
| 83 } | 79 } |
| 84 | 80 |
| 85 LoadablePluginPlaceholder::~LoadablePluginPlaceholder() { | 81 LoadablePluginPlaceholder::~LoadablePluginPlaceholder() { |
| 86 #if defined(ENABLE_PLUGINS) | |
| 87 DCHECK(!premade_throttler_); | |
| 88 | |
| 89 if (!plugin_marked_essential_ && !placeholder_was_replaced_ && | |
| 90 !is_blocked_for_prerendering_ && is_blocked_for_power_saver_poster_) { | |
| 91 PluginInstanceThrottler::RecordUnthrottleMethodMetric( | |
| 92 PluginInstanceThrottler::UNTHROTTLE_METHOD_NEVER); | |
| 93 } | |
| 94 #endif | |
| 95 } | 82 } |
| 96 | 83 |
| 97 #if defined(ENABLE_PLUGINS) | 84 #if defined(ENABLE_PLUGINS) |
| 98 void LoadablePluginPlaceholder::MarkPluginEssential( | 85 void LoadablePluginPlaceholder::MarkPluginEssential( |
| 99 PluginInstanceThrottler::PowerSaverUnthrottleMethod method) { | 86 PluginInstanceThrottler::PowerSaverUnthrottleMethod method) { |
| 100 if (plugin_marked_essential_) | 87 if (!power_saver_enabled_) |
| 101 return; | 88 return; |
| 102 | 89 |
| 103 plugin_marked_essential_ = true; | 90 power_saver_enabled_ = false; |
| 91 | |
| 104 if (premade_throttler_) | 92 if (premade_throttler_) |
| 105 premade_throttler_->MarkPluginEssential(method); | 93 premade_throttler_->MarkPluginEssential(method); |
| 106 else | 94 else |
| 107 PluginInstanceThrottler::RecordUnthrottleMethodMetric(method); | 95 PluginInstanceThrottler::RecordUnthrottleMethodMetric(method); |
| 108 | 96 |
| 109 if (is_blocked_for_power_saver_poster_) { | 97 if (is_blocked_for_power_saver_poster_) { |
| 110 is_blocked_for_power_saver_poster_ = false; | 98 is_blocked_for_power_saver_poster_ = false; |
| 111 if (!LoadingBlocked()) | 99 if (!LoadingBlocked()) |
| 112 LoadPlugin(); | 100 LoadPlugin(); |
| 113 } | 101 } |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 141 return; | 129 return; |
| 142 } | 130 } |
| 143 | 131 |
| 144 // The plugin has been removed from the page. Destroy the old plugin. We | 132 // The plugin has been removed from the page. Destroy the old plugin. We |
| 145 // will be destroyed as soon as V8 garbage collects us. | 133 // will be destroyed as soon as V8 garbage collects us. |
| 146 if (!element.pluginContainer()) { | 134 if (!element.pluginContainer()) { |
| 147 plugin()->destroy(); | 135 plugin()->destroy(); |
| 148 return; | 136 return; |
| 149 } | 137 } |
| 150 | 138 |
| 151 placeholder_was_replaced_ = true; | |
| 152 | |
| 153 // During initialization, the new plugin might have replaced itself in turn | 139 // During initialization, the new plugin might have replaced itself in turn |
| 154 // with another plugin. Make sure not to use the passed in |new_plugin| after | 140 // with another plugin. Make sure not to use the passed in |new_plugin| after |
| 155 // this point. | 141 // this point. |
| 156 new_plugin = container->plugin(); | 142 new_plugin = container->plugin(); |
| 157 | 143 |
| 158 plugin()->RestoreTitleText(); | 144 plugin()->RestoreTitleText(); |
| 159 container->invalidate(); | 145 container->invalidate(); |
| 160 container->reportGeometry(); | 146 container->reportGeometry(); |
| 161 plugin()->ReplayReceivedData(new_plugin); | 147 plugin()->ReplayReceivedData(new_plugin); |
| 162 plugin()->destroy(); | 148 plugin()->destroy(); |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 219 void LoadablePluginPlaceholder::UpdateMessage() { | 205 void LoadablePluginPlaceholder::UpdateMessage() { |
| 220 if (!plugin()) | 206 if (!plugin()) |
| 221 return; | 207 return; |
| 222 std::string script = | 208 std::string script = |
| 223 "window.setMessage(" + base::GetQuotedJSONString(message_) + ")"; | 209 "window.setMessage(" + base::GetQuotedJSONString(message_) + ")"; |
| 224 plugin()->web_view()->mainFrame()->executeScript( | 210 plugin()->web_view()->mainFrame()->executeScript( |
| 225 WebScriptSource(base::UTF8ToUTF16(script))); | 211 WebScriptSource(base::UTF8ToUTF16(script))); |
| 226 } | 212 } |
| 227 | 213 |
| 228 void LoadablePluginPlaceholder::PluginDestroyed() { | 214 void LoadablePluginPlaceholder::PluginDestroyed() { |
| 229 // Since the premade plugin has been detached from the container, it will not | 215 #if defined(ENABLE_PLUGINS) |
| 230 // be automatically destroyed along with the page. | 216 if (power_saver_enabled_) { |
|
Bernhard Bauer
2015/04/29 10:46:00
Early-return if |power_saver_enabled_| is false?
tommycli
2015/04/29 18:17:28
Err well we still want to call PluginPlaceholder::
Bernhard Bauer
2015/04/29 18:53:26
Oh, durr.
| |
| 231 if (!placeholder_was_replaced_ && premade_throttler_) { | 217 if (premade_throttler_) { |
| 232 premade_throttler_->RemoveObserver(this); | 218 // Since the premade plugin has been detached from the container, it will |
| 233 premade_throttler_->GetWebPlugin()->destroy(); | 219 // not be automatically destroyed along with the page. |
| 234 premade_throttler_ = nullptr; | 220 premade_throttler_->GetWebPlugin()->destroy(); |
| 221 premade_throttler_ = nullptr; | |
| 222 } else if (is_blocked_for_power_saver_poster_) { | |
| 223 // Record the NEVER unthrottle count only if there is no throttler. | |
| 224 PluginInstanceThrottler::RecordUnthrottleMethodMetric( | |
| 225 PluginInstanceThrottler::UNTHROTTLE_METHOD_NEVER); | |
| 226 } | |
| 227 | |
| 228 // Prevent processing subsequent calls to MarkPluginEssential. | |
| 229 power_saver_enabled_ = false; | |
| 235 } | 230 } |
| 231 #endif | |
| 236 | 232 |
| 237 PluginPlaceholder::PluginDestroyed(); | 233 PluginPlaceholder::PluginDestroyed(); |
| 238 } | 234 } |
| 239 | 235 |
| 240 void LoadablePluginPlaceholder::WasShown() { | 236 void LoadablePluginPlaceholder::WasShown() { |
| 241 if (is_blocked_for_background_tab_) { | 237 if (is_blocked_for_background_tab_) { |
| 242 is_blocked_for_background_tab_ = false; | 238 is_blocked_for_background_tab_ = false; |
| 243 if (!LoadingBlocked()) | 239 if (!LoadingBlocked()) |
| 244 LoadPlugin(); | 240 LoadPlugin(); |
| 245 } | 241 } |
| 246 } | 242 } |
| 247 | 243 |
| 248 void LoadablePluginPlaceholder::OnThrottleStateChange() { | |
| 249 DCHECK(premade_throttler_); | |
| 250 if (!premade_throttler_->IsThrottled()) { | |
| 251 // Premade plugin has been unthrottled externally (by audio playback, etc.). | |
| 252 LoadPlugin(); | |
| 253 } | |
| 254 } | |
| 255 | |
| 256 void LoadablePluginPlaceholder::OnLoadBlockedPlugins( | 244 void LoadablePluginPlaceholder::OnLoadBlockedPlugins( |
| 257 const std::string& identifier) { | 245 const std::string& identifier) { |
| 258 if (!identifier.empty() && identifier != identifier_) | 246 if (!identifier.empty() && identifier != identifier_) |
| 259 return; | 247 return; |
| 260 | 248 |
| 261 RenderThread::Get()->RecordAction(UserMetricsAction("Plugin_Load_UI")); | 249 RenderThread::Get()->RecordAction(UserMetricsAction("Plugin_Load_UI")); |
| 262 LoadPlugin(); | 250 LoadPlugin(); |
| 263 } | 251 } |
| 264 | 252 |
| 265 void LoadablePluginPlaceholder::OnSetIsPrerendering(bool is_prerendering) { | 253 void LoadablePluginPlaceholder::OnSetIsPrerendering(bool is_prerendering) { |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 279 if (hidden_) | 267 if (hidden_) |
| 280 return; | 268 return; |
| 281 if (!plugin()) | 269 if (!plugin()) |
| 282 return; | 270 return; |
| 283 if (!allow_loading_) { | 271 if (!allow_loading_) { |
| 284 NOTREACHED(); | 272 NOTREACHED(); |
| 285 return; | 273 return; |
| 286 } | 274 } |
| 287 | 275 |
| 288 if (premade_throttler_) { | 276 if (premade_throttler_) { |
| 289 premade_throttler_->RemoveObserver(this); | |
| 290 premade_throttler_->SetHiddenForPlaceholder(false /* hidden */); | 277 premade_throttler_->SetHiddenForPlaceholder(false /* hidden */); |
| 291 | |
| 292 ReplacePlugin(premade_throttler_->GetWebPlugin()); | 278 ReplacePlugin(premade_throttler_->GetWebPlugin()); |
| 293 premade_throttler_ = nullptr; | 279 premade_throttler_ = nullptr; |
| 294 } else { | 280 } else { |
| 295 // TODO(mmenke): In the case of prerendering, feed into | 281 // TODO(mmenke): In the case of prerendering, feed into |
| 296 // ChromeContentRendererClient::CreatePlugin instead, to | 282 // ChromeContentRendererClient::CreatePlugin instead, to |
| 297 // reduce the chance of future regressions. | 283 // reduce the chance of future regressions. |
| 298 scoped_ptr<PluginInstanceThrottler> throttler; | 284 scoped_ptr<PluginInstanceThrottler> throttler; |
| 299 #if defined(ENABLE_PLUGINS) | 285 #if defined(ENABLE_PLUGINS) |
| 300 // If the plugin has already been marked essential in its placeholder form, | 286 // If the plugin has already been marked essential in its placeholder form, |
| 301 // we shouldn't create a new throttler and start the process all over again. | 287 // we shouldn't create a new throttler and start the process all over again. |
| 302 if (!plugin_marked_essential_ && power_saver_enabled_) | 288 if (power_saver_enabled_) |
| 303 throttler = PluginInstanceThrottler::Create(); | 289 throttler = PluginInstanceThrottler::Create(); |
| 304 #endif | 290 #endif |
| 305 WebPlugin* plugin = render_frame()->CreatePlugin( | 291 WebPlugin* plugin = render_frame()->CreatePlugin( |
| 306 GetFrame(), plugin_info_, GetPluginParams(), throttler.Pass()); | 292 GetFrame(), plugin_info_, GetPluginParams(), throttler.Pass()); |
| 307 | 293 |
| 308 ReplacePlugin(plugin); | 294 ReplacePlugin(plugin); |
| 309 } | 295 } |
| 310 } | 296 } |
| 311 | 297 |
| 312 void LoadablePluginPlaceholder::LoadCallback() { | 298 void LoadablePluginPlaceholder::LoadCallback() { |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 324 HidePlugin(); | 310 HidePlugin(); |
| 325 } | 311 } |
| 326 | 312 |
| 327 void LoadablePluginPlaceholder::DidFinishLoadingCallback() { | 313 void LoadablePluginPlaceholder::DidFinishLoadingCallback() { |
| 328 finished_loading_ = true; | 314 finished_loading_ = true; |
| 329 if (message_.length() > 0) | 315 if (message_.length() > 0) |
| 330 UpdateMessage(); | 316 UpdateMessage(); |
| 331 | 317 |
| 332 // Wait for the placeholder to finish loading to hide the premade plugin. | 318 // Wait for the placeholder to finish loading to hide the premade plugin. |
| 333 // This is necessary to prevent a flicker. | 319 // This is necessary to prevent a flicker. |
| 334 if (premade_throttler_ && !placeholder_was_replaced_) | 320 if (premade_throttler_ && power_saver_enabled_) |
| 335 premade_throttler_->SetHiddenForPlaceholder(true /* hidden */); | 321 premade_throttler_->SetHiddenForPlaceholder(true /* hidden */); |
| 336 } | 322 } |
| 337 | 323 |
| 338 void LoadablePluginPlaceholder::SetPluginInfo( | 324 void LoadablePluginPlaceholder::SetPluginInfo( |
| 339 const content::WebPluginInfo& plugin_info) { | 325 const content::WebPluginInfo& plugin_info) { |
| 340 plugin_info_ = plugin_info; | 326 plugin_info_ = plugin_info; |
| 341 } | 327 } |
| 342 | 328 |
| 343 const content::WebPluginInfo& LoadablePluginPlaceholder::GetPluginInfo() const { | 329 const content::WebPluginInfo& LoadablePluginPlaceholder::GetPluginInfo() const { |
| 344 return plugin_info_; | 330 return plugin_info_; |
| 345 } | 331 } |
| 346 | 332 |
| 347 void LoadablePluginPlaceholder::SetIdentifier(const std::string& identifier) { | 333 void LoadablePluginPlaceholder::SetIdentifier(const std::string& identifier) { |
| 348 identifier_ = identifier; | 334 identifier_ = identifier; |
| 349 } | 335 } |
| 350 | 336 |
| 351 bool LoadablePluginPlaceholder::LoadingBlocked() const { | 337 bool LoadablePluginPlaceholder::LoadingBlocked() const { |
| 352 DCHECK(allow_loading_); | 338 DCHECK(allow_loading_); |
| 353 return is_blocked_for_background_tab_ || is_blocked_for_power_saver_poster_ || | 339 return is_blocked_for_background_tab_ || is_blocked_for_power_saver_poster_ || |
| 354 is_blocked_for_prerendering_; | 340 is_blocked_for_prerendering_; |
| 355 } | 341 } |
| 356 | 342 |
| 357 } // namespace plugins | 343 } // namespace plugins |
| OLD | NEW |