| 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/command_line.h" | |
| 10 #include "base/json/string_escape.h" | 9 #include "base/json/string_escape.h" |
| 11 #include "base/strings/string_piece.h" | 10 #include "base/strings/string_piece.h" |
| 12 #include "base/strings/stringprintf.h" | 11 #include "base/strings/stringprintf.h" |
| 13 #include "base/strings/utf_string_conversions.h" | 12 #include "base/strings/utf_string_conversions.h" |
| 14 #include "base/thread_task_runner_handle.h" | 13 #include "base/thread_task_runner_handle.h" |
| 15 #include "base/values.h" | 14 #include "base/values.h" |
| 16 #include "content/public/child/v8_value_converter.h" | 15 #include "content/public/child/v8_value_converter.h" |
| 17 #include "content/public/common/content_switches.h" | |
| 18 #include "content/public/renderer/render_frame.h" | 16 #include "content/public/renderer/render_frame.h" |
| 19 #include "content/public/renderer/render_thread.h" | 17 #include "content/public/renderer/render_thread.h" |
| 20 #include "gin/handle.h" | |
| 21 #include "gin/object_template_builder.h" | |
| 22 #include "third_party/WebKit/public/web/WebDOMMessageEvent.h" | 18 #include "third_party/WebKit/public/web/WebDOMMessageEvent.h" |
| 23 #include "third_party/WebKit/public/web/WebDocument.h" | 19 #include "third_party/WebKit/public/web/WebDocument.h" |
| 24 #include "third_party/WebKit/public/web/WebElement.h" | 20 #include "third_party/WebKit/public/web/WebElement.h" |
| 25 #include "third_party/WebKit/public/web/WebInputEvent.h" | 21 #include "third_party/WebKit/public/web/WebInputEvent.h" |
| 26 #include "third_party/WebKit/public/web/WebKit.h" | 22 #include "third_party/WebKit/public/web/WebKit.h" |
| 27 #include "third_party/WebKit/public/web/WebLocalFrame.h" | 23 #include "third_party/WebKit/public/web/WebLocalFrame.h" |
| 28 #include "third_party/WebKit/public/web/WebPluginContainer.h" | 24 #include "third_party/WebKit/public/web/WebPluginContainer.h" |
| 29 #include "third_party/WebKit/public/web/WebScriptSource.h" | 25 #include "third_party/WebKit/public/web/WebScriptSource.h" |
| 30 #include "third_party/WebKit/public/web/WebSerializedScriptValue.h" | 26 #include "third_party/WebKit/public/web/WebSerializedScriptValue.h" |
| 31 #include "third_party/WebKit/public/web/WebView.h" | 27 #include "third_party/WebKit/public/web/WebView.h" |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 181 } | 177 } |
| 182 return v8::Local<v8::Object>(); | 178 return v8::Local<v8::Object>(); |
| 183 } | 179 } |
| 184 | 180 |
| 185 void LoadablePluginPlaceholder::OnUnobscuredRectUpdate( | 181 void LoadablePluginPlaceholder::OnUnobscuredRectUpdate( |
| 186 const gfx::Rect& unobscured_rect) { | 182 const gfx::Rect& unobscured_rect) { |
| 187 DCHECK(content::RenderThread::Get()); | 183 DCHECK(content::RenderThread::Get()); |
| 188 if (!power_saver_enabled_ || !finished_loading_) | 184 if (!power_saver_enabled_ || !finished_loading_) |
| 189 return; | 185 return; |
| 190 | 186 |
| 191 unobscured_rect_ = unobscured_rect; | 187 // Only update the unobscured rect during the recheck phase. Also early exit |
| 192 | 188 // to prevent reentrancy issues. |
| 193 // During a size recheck, we will get another notification into this method. | 189 if (in_size_recheck_) { |
| 194 // Use this flag to early exit to prevent reentrancy issues. | 190 unobscured_rect_ = unobscured_rect; |
| 195 if (in_size_recheck_) | |
| 196 return; | 191 return; |
| 192 } |
| 197 | 193 |
| 198 if (!size_update_timer_.IsRunning()) { | 194 if (!size_update_timer_.IsRunning()) { |
| 199 // TODO(tommycli): We have to post a delayed task to recheck the size, as | 195 // TODO(tommycli): We have to post a delayed task to recheck the size, as |
| 200 // Blink can report wrong sizes for partially obscured plugins while the | 196 // Blink can report wrong sizes for partially obscured plugins while the |
| 201 // compositing state is dirty. https://crbug.com/343769 | 197 // compositing state is dirty. https://crbug.com/343769 |
| 202 size_update_timer_.Start( | 198 size_update_timer_.Start( |
| 203 FROM_HERE, | 199 FROM_HERE, |
| 204 base::TimeDelta::FromMilliseconds(kSizeChangeRecheckDelayMilliseconds), | 200 base::TimeDelta::FromMilliseconds(kSizeChangeRecheckDelayMilliseconds), |
| 205 base::Bind(&LoadablePluginPlaceholder::RecheckSizeAndMaybeUnthrottle, | 201 base::Bind(&LoadablePluginPlaceholder::RecheckSizeAndMaybeUnthrottle, |
| 206 weak_factory_.GetWeakPtr())); | 202 weak_factory_.GetWeakPtr())); |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 266 | 262 |
| 267 void LoadablePluginPlaceholder::DidFinishLoadingCallback() { | 263 void LoadablePluginPlaceholder::DidFinishLoadingCallback() { |
| 268 finished_loading_ = true; | 264 finished_loading_ = true; |
| 269 if (message_.length() > 0) | 265 if (message_.length() > 0) |
| 270 UpdateMessage(); | 266 UpdateMessage(); |
| 271 | 267 |
| 272 // Wait for the placeholder to finish loading to hide the premade plugin. | 268 // Wait for the placeholder to finish loading to hide the premade plugin. |
| 273 // This is necessary to prevent a flicker. | 269 // This is necessary to prevent a flicker. |
| 274 if (premade_throttler_ && power_saver_enabled_) | 270 if (premade_throttler_ && power_saver_enabled_) |
| 275 premade_throttler_->SetHiddenForPlaceholder(true /* hidden */); | 271 premade_throttler_->SetHiddenForPlaceholder(true /* hidden */); |
| 272 } |
| 276 | 273 |
| 274 void LoadablePluginPlaceholder::DidFinishIconRepositionForTestingCallback() { |
| 277 // Set an attribute and post an event, so browser tests can wait for the | 275 // Set an attribute and post an event, so browser tests can wait for the |
| 278 // placeholder to be ready to receive simulated user input. | 276 // placeholder to be ready to receive simulated user input. |
| 279 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | 277 blink::WebElement element = plugin()->container()->element(); |
| 280 switches::kEnablePluginPlaceholderTesting)) { | 278 element.setAttribute("placeholderReady", "true"); |
| 281 blink::WebElement element = plugin()->container()->element(); | |
| 282 element.setAttribute("placeholderLoaded", "true"); | |
| 283 | 279 |
| 284 scoped_ptr<content::V8ValueConverter> converter( | 280 scoped_ptr<content::V8ValueConverter> converter( |
| 285 content::V8ValueConverter::create()); | 281 content::V8ValueConverter::create()); |
| 286 base::StringValue value("placeholderLoaded"); | 282 base::StringValue value("placeholderReady"); |
| 287 blink::WebSerializedScriptValue message_data = | 283 blink::WebSerializedScriptValue message_data = |
| 288 blink::WebSerializedScriptValue::serialize(converter->ToV8Value( | 284 blink::WebSerializedScriptValue::serialize(converter->ToV8Value( |
| 289 &value, element.document().frame()->mainWorldScriptContext())); | 285 &value, element.document().frame()->mainWorldScriptContext())); |
| 290 blink::WebDOMMessageEvent msg_event(message_data); | 286 blink::WebDOMMessageEvent msg_event(message_data); |
| 291 element.dispatchEvent(msg_event); | 287 |
| 292 } | 288 element.dispatchEvent(msg_event); |
| 293 } | 289 } |
| 294 | 290 |
| 295 void LoadablePluginPlaceholder::SetPluginInfo( | 291 void LoadablePluginPlaceholder::SetPluginInfo( |
| 296 const content::WebPluginInfo& plugin_info) { | 292 const content::WebPluginInfo& plugin_info) { |
| 297 plugin_info_ = plugin_info; | 293 plugin_info_ = plugin_info; |
| 298 } | 294 } |
| 299 | 295 |
| 300 const content::WebPluginInfo& LoadablePluginPlaceholder::GetPluginInfo() const { | 296 const content::WebPluginInfo& LoadablePluginPlaceholder::GetPluginInfo() const { |
| 301 return plugin_info_; | 297 return plugin_info_; |
| 302 } | 298 } |
| 303 | 299 |
| 304 void LoadablePluginPlaceholder::SetIdentifier(const std::string& identifier) { | 300 void LoadablePluginPlaceholder::SetIdentifier(const std::string& identifier) { |
| 305 identifier_ = identifier; | 301 identifier_ = identifier; |
| 306 } | 302 } |
| 307 | 303 |
| 308 const std::string& LoadablePluginPlaceholder::GetIdentifier() const { | 304 const std::string& LoadablePluginPlaceholder::GetIdentifier() const { |
| 309 return identifier_; | 305 return identifier_; |
| 310 } | 306 } |
| 311 | 307 |
| 312 bool LoadablePluginPlaceholder::LoadingBlocked() const { | 308 bool LoadablePluginPlaceholder::LoadingBlocked() const { |
| 313 DCHECK(allow_loading_); | 309 DCHECK(allow_loading_); |
| 314 return is_blocked_for_background_tab_ || is_blocked_for_power_saver_poster_ || | 310 return is_blocked_for_background_tab_ || is_blocked_for_power_saver_poster_ || |
| 315 is_blocked_for_prerendering_; | 311 is_blocked_for_prerendering_; |
| 316 } | 312 } |
| 317 | 313 |
| 318 void LoadablePluginPlaceholder::RecheckSizeAndMaybeUnthrottle() { | 314 void LoadablePluginPlaceholder::RecheckSizeAndMaybeUnthrottle() { |
| 319 DCHECK(content::RenderThread::Get()); | 315 DCHECK(content::RenderThread::Get()); |
| 320 DCHECK(!in_size_recheck_); | 316 DCHECK(!in_size_recheck_); |
| 317 DCHECK(finished_loading_); |
| 321 | 318 |
| 322 if (!plugin()) | 319 if (!plugin()) |
| 323 return; | 320 return; |
| 324 | 321 |
| 325 in_size_recheck_ = true; | 322 in_size_recheck_ = true; |
| 326 | 323 |
| 324 gfx::Rect old_rect = unobscured_rect_; |
| 325 |
| 327 // Re-check the size in case the reported size was incorrect. | 326 // Re-check the size in case the reported size was incorrect. |
| 328 plugin()->container()->reportGeometry(); | 327 plugin()->container()->reportGeometry(); |
| 329 | 328 |
| 329 if (old_rect == unobscured_rect_) { |
| 330 in_size_recheck_ = false; |
| 331 return; |
| 332 } |
| 333 |
| 330 float zoom_factor = plugin()->container()->pageZoomFactor(); | 334 float zoom_factor = plugin()->container()->pageZoomFactor(); |
| 331 int width = roundf(unobscured_rect_.width() / zoom_factor); | 335 int width = roundf(unobscured_rect_.width() / zoom_factor); |
| 332 int height = roundf(unobscured_rect_.height() / zoom_factor); | 336 int height = roundf(unobscured_rect_.height() / zoom_factor); |
| 333 | 337 |
| 334 if (is_blocked_for_power_saver_poster_) { | 338 if (is_blocked_for_power_saver_poster_) { |
| 335 // Adjust poster container padding and dimensions to center play button for | 339 // Adjust poster container padding and dimensions to center play button for |
| 336 // plugins and plugin posters that have their top or left portions obscured. | 340 // plugins and plugin posters that have their top or left portions obscured. |
| 337 int x = roundf(unobscured_rect_.x() / zoom_factor); | 341 int x = roundf(unobscured_rect_.x() / zoom_factor); |
| 338 int y = roundf(unobscured_rect_.y() / zoom_factor); | 342 int y = roundf(unobscured_rect_.y() / zoom_factor); |
| 339 std::string script = base::StringPrintf( | 343 std::string script = base::StringPrintf( |
| (...skipping 19 matching lines...) Expand all Loading... |
| 359 render_frame()->WhitelistContentOrigin(content_origin); | 363 render_frame()->WhitelistContentOrigin(content_origin); |
| 360 } | 364 } |
| 361 | 365 |
| 362 heuristic_run_before_ = true; | 366 heuristic_run_before_ = true; |
| 363 } | 367 } |
| 364 | 368 |
| 365 in_size_recheck_ = false; | 369 in_size_recheck_ = false; |
| 366 } | 370 } |
| 367 | 371 |
| 368 } // namespace plugins | 372 } // namespace plugins |
| OLD | NEW |