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 <memory> | 7 #include <memory> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
53 DCHECK(!premade_throttler_); | 53 DCHECK(!premade_throttler_); |
54 premade_throttler_ = throttler; | 54 premade_throttler_ = throttler; |
55 } | 55 } |
56 | 56 |
57 LoadablePluginPlaceholder::LoadablePluginPlaceholder( | 57 LoadablePluginPlaceholder::LoadablePluginPlaceholder( |
58 content::RenderFrame* render_frame, | 58 content::RenderFrame* render_frame, |
59 blink::WebLocalFrame* frame, | 59 blink::WebLocalFrame* frame, |
60 const blink::WebPluginParams& params, | 60 const blink::WebPluginParams& params, |
61 const std::string& html_data) | 61 const std::string& html_data) |
62 : PluginPlaceholderBase(render_frame, frame, params, html_data), | 62 : PluginPlaceholderBase(render_frame, frame, params, html_data), |
63 is_delayed_placeholder_(false), | 63 is_blocked_for_tinyness_(false), |
64 is_blocked_for_background_tab_(false), | 64 is_blocked_for_background_tab_(false), |
65 is_blocked_for_prerendering_(false), | 65 is_blocked_for_prerendering_(false), |
66 is_blocked_for_power_saver_poster_(false), | 66 is_blocked_for_power_saver_poster_(false), |
67 power_saver_enabled_(false), | 67 power_saver_enabled_(false), |
68 premade_throttler_(nullptr), | 68 premade_throttler_(nullptr), |
69 allow_loading_(false), | 69 allow_loading_(false), |
70 finished_loading_(false), | 70 finished_loading_(false), |
71 heuristic_run_before_(premade_throttler_ != nullptr), | 71 heuristic_run_before_(premade_throttler_ != nullptr), |
72 weak_factory_(this) {} | 72 weak_factory_(this) {} |
73 | 73 |
74 LoadablePluginPlaceholder::~LoadablePluginPlaceholder() { | 74 LoadablePluginPlaceholder::~LoadablePluginPlaceholder() { |
75 } | 75 } |
76 | 76 |
77 void LoadablePluginPlaceholder::SetDelegate( | |
78 std::unique_ptr<Delegate> delegate) { | |
79 delegate_ = std::move(delegate); | |
80 } | |
81 | |
82 void LoadablePluginPlaceholder::MarkPluginEssential( | 77 void LoadablePluginPlaceholder::MarkPluginEssential( |
83 PluginInstanceThrottler::PowerSaverUnthrottleMethod method) { | 78 PluginInstanceThrottler::PowerSaverUnthrottleMethod method) { |
84 if (!power_saver_enabled_) | 79 if (!power_saver_enabled_) |
85 return; | 80 return; |
86 | 81 |
87 power_saver_enabled_ = false; | 82 power_saver_enabled_ = false; |
88 | 83 |
89 if (premade_throttler_) | 84 if (premade_throttler_) |
90 premade_throttler_->MarkPluginEssential(method); | 85 premade_throttler_->MarkPluginEssential(method); |
91 else if (method != PluginInstanceThrottler::UNTHROTTLE_METHOD_DO_NOT_RECORD) | 86 else if (method != PluginInstanceThrottler::UNTHROTTLE_METHOD_DO_NOT_RECORD) |
92 PluginInstanceThrottler::RecordUnthrottleMethodMetric(method); | 87 PluginInstanceThrottler::RecordUnthrottleMethodMetric(method); |
93 | 88 |
94 if (is_blocked_for_power_saver_poster_) { | 89 is_blocked_for_power_saver_poster_ = false; |
95 is_blocked_for_power_saver_poster_ = false; | 90 is_blocked_for_tinyness_ = false; |
96 if (!LoadingBlocked()) | 91 if (!LoadingBlocked()) |
97 LoadPlugin(); | 92 LoadPlugin(); |
98 } | |
99 } | 93 } |
100 | 94 |
101 void LoadablePluginPlaceholder::ReplacePlugin(blink::WebPlugin* new_plugin) { | 95 void LoadablePluginPlaceholder::ReplacePlugin(blink::WebPlugin* new_plugin) { |
102 CHECK(plugin()); | 96 CHECK(plugin()); |
103 if (!new_plugin) | 97 if (!new_plugin) |
104 return; | 98 return; |
105 blink::WebPluginContainer* container = plugin()->container(); | 99 blink::WebPluginContainer* container = plugin()->container(); |
106 // This can occur if the container has been destroyed. | 100 // This can occur if the container has been destroyed. |
107 if (!container) { | 101 if (!container) { |
108 new_plugin->destroy(); | 102 new_plugin->destroy(); |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
185 if (premade_throttler_ && premade_throttler_->GetWebPlugin()) { | 179 if (premade_throttler_ && premade_throttler_->GetWebPlugin()) { |
186 return premade_throttler_->GetWebPlugin()->v8ScriptableObject(isolate); | 180 return premade_throttler_->GetWebPlugin()->v8ScriptableObject(isolate); |
187 } | 181 } |
188 return v8::Local<v8::Object>(); | 182 return v8::Local<v8::Object>(); |
189 } | 183 } |
190 | 184 |
191 void LoadablePluginPlaceholder::OnUnobscuredRectUpdate( | 185 void LoadablePluginPlaceholder::OnUnobscuredRectUpdate( |
192 const gfx::Rect& unobscured_rect) { | 186 const gfx::Rect& unobscured_rect) { |
193 DCHECK(content::RenderThread::Get()); | 187 DCHECK(content::RenderThread::Get()); |
194 | 188 |
195 // TODO(groby): Handle the case of power saver not being enabled. | |
196 if (!plugin() || !finished_loading_) | 189 if (!plugin() || !finished_loading_) |
197 return; | 190 return; |
198 | 191 |
| 192 if (!is_blocked_for_tinyness_ && !is_blocked_for_power_saver_poster_) |
| 193 return; |
| 194 |
199 if (unobscured_rect_ == unobscured_rect) | 195 if (unobscured_rect_ == unobscured_rect) |
200 return; | 196 return; |
201 | 197 |
202 unobscured_rect_ = unobscured_rect; | 198 unobscured_rect_ = unobscured_rect; |
203 | 199 |
204 float zoom_factor = plugin()->container()->pageZoomFactor(); | 200 float zoom_factor = plugin()->container()->pageZoomFactor(); |
205 int width = roundf(unobscured_rect_.width() / zoom_factor); | 201 int width = roundf(unobscured_rect_.width() / zoom_factor); |
206 int height = roundf(unobscured_rect_.height() / zoom_factor); | 202 int height = roundf(unobscured_rect_.height() / zoom_factor); |
207 int x = roundf(unobscured_rect_.x() / zoom_factor); | 203 int x = roundf(unobscured_rect_.x() / zoom_factor); |
208 int y = roundf(unobscured_rect_.y() / zoom_factor); | 204 int y = roundf(unobscured_rect_.y() / zoom_factor); |
209 | 205 |
210 // On a size update check if we now qualify as a essential plugin. | 206 // On a size update check if we now qualify as a essential plugin. |
211 url::Origin content_origin = url::Origin(GetPluginParams().url); | 207 url::Origin content_origin = url::Origin(GetPluginParams().url); |
212 content::RenderFrame::PeripheralContentStatus status = | 208 content::RenderFrame::PeripheralContentStatus status = |
213 render_frame()->GetPeripheralContentStatus( | 209 render_frame()->GetPeripheralContentStatus( |
214 render_frame()->GetWebFrame()->top()->getSecurityOrigin(), | 210 render_frame()->GetWebFrame()->top()->getSecurityOrigin(), |
215 content_origin, gfx::Size(width, height)); | 211 content_origin, gfx::Size(width, height)); |
216 // If this is a "delay" placeholder, delegate decisions. | 212 |
217 if (is_delayed_placeholder_) { | 213 bool plugin_is_tiny_and_blocked = |
218 OnLoadedRectUpdate(gfx::Rect(x, y, width, height), status); | 214 is_blocked_for_tinyness_ && |
219 is_delayed_placeholder_ = false; | 215 status == |
| 216 content::RenderFrame::CONTENT_STATUS_ESSENTIAL_CROSS_ORIGIN_TINY; |
| 217 |
| 218 // Early exit for plugins that we've discovered to be essential. |
| 219 if (!plugin_is_tiny_and_blocked && |
| 220 status != content::RenderFrame::CONTENT_STATUS_PERIPHERAL) { |
| 221 MarkPluginEssential( |
| 222 heuristic_run_before_ |
| 223 ? PluginInstanceThrottler::UNTHROTTLE_METHOD_BY_SIZE_CHANGE |
| 224 : PluginInstanceThrottler::UNTHROTTLE_METHOD_DO_NOT_RECORD); |
| 225 |
| 226 if (!heuristic_run_before_ && |
| 227 status == |
| 228 content::RenderFrame::CONTENT_STATUS_ESSENTIAL_CROSS_ORIGIN_BIG) { |
| 229 render_frame()->WhitelistContentOrigin(content_origin); |
| 230 } |
| 231 |
220 return; | 232 return; |
221 } | 233 } |
| 234 heuristic_run_before_ = true; |
| 235 |
| 236 if (is_blocked_for_tinyness_) { |
| 237 if (plugin_is_tiny_and_blocked) { |
| 238 OnBlockedTinyContent(); |
| 239 } else { |
| 240 is_blocked_for_tinyness_ = false; |
| 241 if (!LoadingBlocked()) { |
| 242 LoadPlugin(); |
| 243 } |
| 244 } |
| 245 } |
222 | 246 |
223 if (is_blocked_for_power_saver_poster_) { | 247 if (is_blocked_for_power_saver_poster_) { |
224 // Adjust poster container padding and dimensions to center play button for | 248 // Adjust poster container padding and dimensions to center play button for |
225 // plugins and plugin posters that have their top or left portions obscured. | 249 // plugins and plugin posters that have their top or left portions obscured. |
226 std::string script = base::StringPrintf( | 250 std::string script = base::StringPrintf( |
227 "window.resizePoster('%dpx', '%dpx', '%dpx', '%dpx')", x, y, width, | 251 "window.resizePoster('%dpx', '%dpx', '%dpx', '%dpx')", x, y, width, |
228 height); | 252 height); |
229 plugin()->web_view()->mainFrame()->executeScript( | 253 plugin()->web_view()->mainFrame()->executeScript( |
230 blink::WebScriptSource(base::UTF8ToUTF16(script))); | 254 blink::WebScriptSource(base::UTF8ToUTF16(script))); |
231 | |
232 if (status != content::RenderFrame::CONTENT_STATUS_PERIPHERAL) { | |
233 MarkPluginEssential( | |
234 heuristic_run_before_ | |
235 ? PluginInstanceThrottler::UNTHROTTLE_METHOD_BY_SIZE_CHANGE | |
236 : PluginInstanceThrottler::UNTHROTTLE_METHOD_DO_NOT_RECORD); | |
237 | |
238 if (!heuristic_run_before_ && | |
239 status == | |
240 content::RenderFrame::CONTENT_STATUS_ESSENTIAL_CROSS_ORIGIN_BIG) { | |
241 render_frame()->WhitelistContentOrigin(content_origin); | |
242 } | |
243 } | |
244 | |
245 heuristic_run_before_ = true; | |
246 } | 255 } |
247 } | 256 } |
248 | 257 |
249 void LoadablePluginPlaceholder::WasShown() { | 258 void LoadablePluginPlaceholder::WasShown() { |
250 if (is_blocked_for_background_tab_) { | 259 if (is_blocked_for_background_tab_) { |
251 is_blocked_for_background_tab_ = false; | 260 is_blocked_for_background_tab_ = false; |
252 if (!LoadingBlocked()) | 261 if (!LoadingBlocked()) |
253 LoadPlugin(); | 262 LoadPlugin(); |
254 } | 263 } |
255 } | 264 } |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
351 void LoadablePluginPlaceholder::SetIdentifier(const std::string& identifier) { | 360 void LoadablePluginPlaceholder::SetIdentifier(const std::string& identifier) { |
352 identifier_ = identifier; | 361 identifier_ = identifier; |
353 } | 362 } |
354 | 363 |
355 const std::string& LoadablePluginPlaceholder::GetIdentifier() const { | 364 const std::string& LoadablePluginPlaceholder::GetIdentifier() const { |
356 return identifier_; | 365 return identifier_; |
357 } | 366 } |
358 | 367 |
359 bool LoadablePluginPlaceholder::LoadingBlocked() const { | 368 bool LoadablePluginPlaceholder::LoadingBlocked() const { |
360 DCHECK(allow_loading_); | 369 DCHECK(allow_loading_); |
361 return is_blocked_for_background_tab_ || is_blocked_for_power_saver_poster_ || | 370 return is_blocked_for_tinyness_ || is_blocked_for_background_tab_ || |
362 is_blocked_for_prerendering_; | 371 is_blocked_for_power_saver_poster_ || is_blocked_for_prerendering_; |
363 } | 372 } |
364 | 373 |
365 } // namespace plugins | 374 } // namespace plugins |
OLD | NEW |