OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/renderer/browser_plugin/browser_plugin.h" | 5 #include "content/renderer/browser_plugin/browser_plugin.h" |
6 | 6 |
7 #include "base/message_loop.h" | 7 #include "base/message_loop.h" |
8 #include "base/string_util.h" | 8 #include "base/string_util.h" |
9 #if defined (OS_WIN) | 9 #if defined (OS_WIN) |
10 #include "base/sys_info.h" | 10 #include "base/sys_info.h" |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
95 void BrowserPlugin::SetSrcAttribute(const std::string& src) { | 95 void BrowserPlugin::SetSrcAttribute(const std::string& src) { |
96 if (src == src_ && !guest_crashed_) | 96 if (src == src_ && !guest_crashed_) |
97 return; | 97 return; |
98 if (!src.empty() || navigate_src_sent_) { | 98 if (!src.empty() || navigate_src_sent_) { |
99 BrowserPluginManager::Get()->Send( | 99 BrowserPluginManager::Get()->Send( |
100 new BrowserPluginHostMsg_NavigateGuest( | 100 new BrowserPluginHostMsg_NavigateGuest( |
101 render_view_->GetRoutingID(), | 101 render_view_->GetRoutingID(), |
102 instance_id_, | 102 instance_id_, |
103 parent_frame_, | 103 parent_frame_, |
104 src, | 104 src, |
105 gfx::Size(width(), height()))); | 105 *GetPendingResizeParams())); |
Fady Samuel
2012/09/24 22:16:58
Shouldn't this get freed after we send it?
lazyboy
2012/09/25 17:57:22
Done.
| |
106 // Record that we sent a NavigateGuest message to embedder. Once we send | 106 // Record that we sent a NavigateGuest message to embedder. Once we send |
107 // such a message, subsequent SetSrcAttribute() calls must always send | 107 // such a message, subsequent SetSrcAttribute() calls must always send |
108 // NavigateGuest messages to the embedder (even if |src| is empty), so | 108 // NavigateGuest messages to the embedder (even if |src| is empty), so |
109 // resize works correctly for all cases (e.g. The embedder can reset the | 109 // resize works correctly for all cases (e.g. The embedder can reset the |
110 // guest's |src| to empty value, resize and then set the |src| to a | 110 // guest's |src| to empty value, resize and then set the |src| to a |
111 // non-empty value). | 111 // non-empty value). |
112 navigate_src_sent_ = true; | 112 navigate_src_sent_ = true; |
113 } | 113 } |
114 src_ = src; | 114 src_ = src; |
115 guest_crashed_ = false; | 115 guest_crashed_ = false; |
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
355 const WebRect& clip_rect, | 355 const WebRect& clip_rect, |
356 const WebVector<WebRect>& cut_outs_rects, | 356 const WebVector<WebRect>& cut_outs_rects, |
357 bool is_visible) { | 357 bool is_visible) { |
358 int old_width = width(); | 358 int old_width = width(); |
359 int old_height = height(); | 359 int old_height = height(); |
360 plugin_rect_ = window_rect; | 360 plugin_rect_ = window_rect; |
361 if (old_width == window_rect.width && | 361 if (old_width == window_rect.width && |
362 old_height == window_rect.height) { | 362 old_height == window_rect.height) { |
363 return; | 363 return; |
364 } | 364 } |
365 // Until an actual navigation occurs, there is no browser side embedder | |
366 // present to notify about geometry updates. In this case, after we've updated | |
367 // the BrowserPlugin's state we are done and can return immediately. | |
368 if (!navigate_src_sent_) | |
369 return; | |
370 | 365 |
371 const size_t stride = skia::PlatformCanvas::StrideForWidth(window_rect.width); | 366 const size_t stride = skia::PlatformCanvas::StrideForWidth(window_rect.width); |
372 // Make sure the size of the damage buffer is at least four bytes so that we | 367 // Make sure the size of the damage buffer is at least four bytes so that we |
373 // can fit in a magic word to verify that the memory is shared correctly. | 368 // can fit in a magic word to verify that the memory is shared correctly. |
374 size_t size = | 369 size_t size = |
375 std::max(sizeof(unsigned int), | 370 std::max(sizeof(unsigned int), |
376 static_cast<size_t>(window_rect.height * | 371 static_cast<size_t>(window_rect.height * |
377 stride * | 372 stride * |
378 GetDeviceScaleFactor() * | 373 GetDeviceScaleFactor() * |
379 GetDeviceScaleFactor())); | 374 GetDeviceScaleFactor())); |
(...skipping 12 matching lines...) Expand all Loading... | |
392 new_damage_buffer = TransportDIB::Map(shared_mem.handle()); | 387 new_damage_buffer = TransportDIB::Map(shared_mem.handle()); |
393 #else | 388 #else |
394 new_damage_buffer = RenderProcess::current()->CreateTransportDIB(size); | 389 new_damage_buffer = RenderProcess::current()->CreateTransportDIB(size); |
395 #endif | 390 #endif |
396 if (!new_damage_buffer) | 391 if (!new_damage_buffer) |
397 NOTREACHED() << "Unable to create damage buffer"; | 392 NOTREACHED() << "Unable to create damage buffer"; |
398 DCHECK(new_damage_buffer->memory()); | 393 DCHECK(new_damage_buffer->memory()); |
399 // Insert the magic word. | 394 // Insert the magic word. |
400 *static_cast<unsigned int*>(new_damage_buffer->memory()) = 0xdeadbeef; | 395 *static_cast<unsigned int*>(new_damage_buffer->memory()) = 0xdeadbeef; |
401 | 396 |
402 BrowserPluginHostMsg_ResizeGuest_Params params; | |
403 params.damage_buffer_id = new_damage_buffer->id(); | |
404 #if defined(OS_WIN) | |
405 params.damage_buffer_size = size; | |
406 #endif | |
407 params.width = window_rect.width; | |
408 params.height = window_rect.height; | |
409 params.resize_pending = resize_pending_; | |
410 params.scale_factor = GetDeviceScaleFactor(); | |
411 BrowserPluginManager::Get()->Send(new BrowserPluginHostMsg_ResizeGuest( | |
412 render_view_->GetRoutingID(), | |
413 instance_id_, | |
414 params)); | |
415 resize_pending_ = true; | |
416 | |
417 if (damage_buffer_) { | 397 if (damage_buffer_) { |
418 RenderProcess::current()->FreeTransportDIB(damage_buffer_); | 398 RenderProcess::current()->FreeTransportDIB(damage_buffer_); |
419 damage_buffer_ = NULL; | 399 damage_buffer_ = NULL; |
420 } | 400 } |
421 damage_buffer_ = new_damage_buffer; | 401 damage_buffer_ = new_damage_buffer; |
402 | |
403 pending_resize_params_.reset(); | |
404 | |
405 scoped_ptr<BrowserPluginHostMsg_ResizeGuest_Params> params( | |
406 new BrowserPluginHostMsg_ResizeGuest_Params); | |
407 params->damage_buffer_id = new_damage_buffer->id(); | |
408 #if defined(OS_WIN) | |
409 params->damage_buffer_size = size; | |
410 #endif | |
411 params->width = window_rect.width; | |
412 params->height = window_rect.height; | |
413 params->resize_pending = resize_pending_; | |
414 params->scale_factor = GetDeviceScaleFactor(); | |
415 | |
416 // Until an actual navigation occurs, there is no browser side embedder | |
417 // present to notify about geometry updates. In this case, after we've updated | |
418 // the BrowserPlugin's state we are done and we do not send a resize message | |
419 // to the browser. | |
420 if (navigate_src_sent_) { | |
421 resize_pending_ = true; | |
422 BrowserPluginManager::Get()->Send(new BrowserPluginHostMsg_ResizeGuest( | |
423 render_view_->GetRoutingID(), | |
424 instance_id_, | |
425 *(params.get()))); | |
426 } else { | |
427 pending_resize_params_.reset(params.release()); | |
428 } | |
429 } | |
430 | |
431 BrowserPluginHostMsg_ResizeGuest_Params* | |
432 BrowserPlugin::GetPendingResizeParams() { | |
433 if (pending_resize_params_.get()) { | |
434 return pending_resize_params_.release(); | |
435 } else { | |
436 BrowserPluginHostMsg_ResizeGuest_Params* params = | |
437 new BrowserPluginHostMsg_ResizeGuest_Params; | |
438 | |
439 // We don't have a pending resize to send, so we send an invalid transport | |
440 // dib Id. | |
441 params->damage_buffer_id = TransportDIB::Id(); | |
442 params->width = width(); | |
443 params->height = height(); | |
444 return params; | |
445 } | |
422 } | 446 } |
423 | 447 |
424 void BrowserPlugin::updateFocus(bool focused) { | 448 void BrowserPlugin::updateFocus(bool focused) { |
425 BrowserPluginManager::Get()->Send(new BrowserPluginHostMsg_SetFocus( | 449 BrowserPluginManager::Get()->Send(new BrowserPluginHostMsg_SetFocus( |
426 render_view_->GetRoutingID(), | 450 render_view_->GetRoutingID(), |
427 instance_id_, | 451 instance_id_, |
428 focused)); | 452 focused)); |
429 } | 453 } |
430 | 454 |
431 void BrowserPlugin::updateVisibility(bool visible) { | 455 void BrowserPlugin::updateVisibility(bool visible) { |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
472 void* notify_data) { | 496 void* notify_data) { |
473 } | 497 } |
474 | 498 |
475 void BrowserPlugin::didFailLoadingFrameRequest( | 499 void BrowserPlugin::didFailLoadingFrameRequest( |
476 const WebKit::WebURL& url, | 500 const WebKit::WebURL& url, |
477 void* notify_data, | 501 void* notify_data, |
478 const WebKit::WebURLError& error) { | 502 const WebKit::WebURLError& error) { |
479 } | 503 } |
480 | 504 |
481 } // namespace content | 505 } // namespace content |
OLD | NEW |