OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 "chrome/renderer/webplugin_delegate_proxy.h" | 5 #include "chrome/renderer/webplugin_delegate_proxy.h" |
6 | 6 |
7 #include <atlbase.h> | 7 #include <atlbase.h> |
8 | 8 |
9 #include "generated_resources.h" | 9 #include "generated_resources.h" |
10 | 10 |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
131 } | 131 } |
132 | 132 |
133 WebPluginDelegateProxy::WebPluginDelegateProxy(const std::string& mime_type, | 133 WebPluginDelegateProxy::WebPluginDelegateProxy(const std::string& mime_type, |
134 const std::string& clsid, | 134 const std::string& clsid, |
135 RenderView* render_view) | 135 RenderView* render_view) |
136 : render_view_(render_view), | 136 : render_view_(render_view), |
137 mime_type_(mime_type), | 137 mime_type_(mime_type), |
138 clsid_(clsid), | 138 clsid_(clsid), |
139 plugin_(NULL), | 139 plugin_(NULL), |
140 windowless_(false), | 140 windowless_(false), |
141 first_paint_(true), | |
142 npobject_(NULL), | 141 npobject_(NULL), |
143 send_deferred_update_geometry_(false), | 142 send_deferred_update_geometry_(false), |
144 visible_(false), | 143 visible_(false), |
145 sad_plugin_(NULL), | 144 sad_plugin_(NULL), |
146 window_script_object_(NULL), | 145 window_script_object_(NULL), |
147 transparent_(false), | 146 transparent_(false), |
148 invalidate_pending_(false) { | 147 invalidate_pending_(false) { |
149 } | 148 } |
150 | 149 |
151 WebPluginDelegateProxy::~WebPluginDelegateProxy() { | 150 WebPluginDelegateProxy::~WebPluginDelegateProxy() { |
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
387 return 4 * rect.width() * rect.height(); | 386 return 4 * rect.width() * rect.height(); |
388 } | 387 } |
389 | 388 |
390 void WebPluginDelegateProxy::ResetWindowlessBitmaps() { | 389 void WebPluginDelegateProxy::ResetWindowlessBitmaps() { |
391 backing_store_.reset(); | 390 backing_store_.reset(); |
392 transport_store_.reset(); | 391 transport_store_.reset(); |
393 backing_store_canvas_.reset(); | 392 backing_store_canvas_.reset(); |
394 transport_store_canvas_.reset(); | 393 transport_store_canvas_.reset(); |
395 background_store_.reset(); | 394 background_store_.reset(); |
396 background_store_canvas_.release(); | 395 background_store_canvas_.release(); |
| 396 backing_store_painted_ = gfx::Rect(); |
397 } | 397 } |
398 | 398 |
399 bool WebPluginDelegateProxy::CreateBitmap( | 399 bool WebPluginDelegateProxy::CreateBitmap( |
400 scoped_ptr<base::SharedMemory>* memory, | 400 scoped_ptr<base::SharedMemory>* memory, |
401 scoped_ptr<gfx::PlatformCanvasWin>* canvas) { | 401 scoped_ptr<gfx::PlatformCanvasWin>* canvas) { |
402 size_t size = GetPaintBufSize(plugin_rect_); | 402 size_t size = GetPaintBufSize(plugin_rect_); |
403 scoped_ptr<base::SharedMemory> new_shared_memory(new base::SharedMemory()); | 403 scoped_ptr<base::SharedMemory> new_shared_memory(new base::SharedMemory()); |
404 if (!new_shared_memory->Create(L"", false, true, size)) | 404 if (!new_shared_memory->Create(L"", false, true, size)) |
405 return false; | 405 return false; |
406 | 406 |
407 scoped_ptr<gfx::PlatformCanvasWin> new_canvas(new gfx::PlatformCanvasWin); | 407 scoped_ptr<gfx::PlatformCanvasWin> new_canvas(new gfx::PlatformCanvasWin); |
408 if (!new_canvas->initialize(plugin_rect_.width(), plugin_rect_.height(), | 408 if (!new_canvas->initialize(plugin_rect_.width(), plugin_rect_.height(), |
409 true, new_shared_memory->handle())) { | 409 true, new_shared_memory->handle())) { |
410 return false; | 410 return false; |
411 } | 411 } |
412 | 412 |
413 memory->swap(new_shared_memory); | 413 memory->swap(new_shared_memory); |
414 canvas->swap(new_canvas); | 414 canvas->swap(new_canvas); |
415 return true; | 415 return true; |
416 } | 416 } |
417 | 417 |
418 void WebPluginDelegateProxy::Paint(HDC hdc, const gfx::Rect& damaged_rect) { | 418 void WebPluginDelegateProxy::Paint(HDC hdc, const gfx::Rect& damaged_rect) { |
419 // If the plugin is no longer connected (channel crashed) draw a crashed | 419 // If the plugin is no longer connected (channel crashed) draw a crashed |
420 // plugin bitmap | 420 // plugin bitmap |
421 if (!channel_host_->channel_valid()) { | 421 if (!channel_host_->channel_valid()) { |
422 PaintSadPlugin(hdc, damaged_rect); | 422 PaintSadPlugin(hdc, damaged_rect); |
423 return; | 423 return; |
424 } | 424 } |
425 | 425 |
426 // No paint events for windowed plugins. However, if it is the first paint | 426 // No paint events for windowed plugins. |
427 // we don't know yet whether the plugin is windowless or not, so we have to | 427 if (!windowless_) |
428 // send the event. | |
429 if (!windowless_ && !first_paint_) { | |
430 // TODO(maruel): That's not true for printing and thumbnail capture. | |
431 // We shall use PrintWindow() to draw the window. | |
432 return; | 428 return; |
433 } | |
434 | 429 |
435 // We got a paint before the plugin's coordinates, so there's no buffer to | 430 // We got a paint before the plugin's coordinates, so there's no buffer to |
436 // copy from. | 431 // copy from. |
437 if (!backing_store_canvas_.get()) | 432 if (!backing_store_canvas_.get()) |
438 return; | 433 return; |
439 | 434 |
440 // Limit the damaged rectangle to whatever is contained inside the plugin | 435 // Limit the damaged rectangle to whatever is contained inside the plugin |
441 // rectangle, as that's the rectangle that we'll bitblt to the hdc. | 436 // rectangle, as that's the rectangle that we'll bitblt to the hdc. |
442 gfx::Rect rect = damaged_rect.Intersect(plugin_rect_); | 437 gfx::Rect rect = damaged_rect.Intersect(plugin_rect_); |
443 | 438 |
444 bool background_changed = false; | 439 bool background_changed = false; |
445 if (background_store_canvas_.get() && BackgroundChanged(hdc, rect)) { | 440 if (background_store_canvas_.get() && BackgroundChanged(hdc, rect)) { |
446 background_changed = true; | 441 background_changed = true; |
447 HDC background_hdc = | 442 HDC background_hdc = |
448 background_store_canvas_->getTopPlatformDevice().getBitmapDC(); | 443 background_store_canvas_->getTopPlatformDevice().getBitmapDC(); |
449 BitBlt(background_hdc, rect.x()-plugin_rect_.x(), rect.y()-plugin_rect_.y(), | 444 BitBlt(background_hdc, rect.x()-plugin_rect_.x(), rect.y()-plugin_rect_.y(), |
450 rect.width(), rect.height(), hdc, rect.x(), rect.y(), SRCCOPY); | 445 rect.width(), rect.height(), hdc, rect.x(), rect.y(), SRCCOPY); |
451 } | 446 } |
452 | 447 |
453 if (first_paint_ || background_changed) { | 448 gfx::Rect offset_rect = rect; |
454 gfx::Rect offset_rect = rect; | 449 offset_rect.Offset(-plugin_rect_.x(), -plugin_rect_.y()); |
455 offset_rect.Offset(-plugin_rect_.x(), -plugin_rect_.y()); | 450 if (background_changed || !backing_store_painted_.Contains(offset_rect)) { |
456 Send(new PluginMsg_Paint(instance_id_, offset_rect)); | 451 Send(new PluginMsg_Paint(instance_id_, offset_rect)); |
457 CopyFromTransportToBacking(offset_rect); | 452 CopyFromTransportToBacking(offset_rect); |
458 } | 453 } |
459 | 454 |
460 first_paint_ = false; | |
461 HDC backing_hdc = backing_store_canvas_->getTopPlatformDevice().getBitmapDC(); | 455 HDC backing_hdc = backing_store_canvas_->getTopPlatformDevice().getBitmapDC(); |
462 BitBlt(hdc, rect.x(), rect.y(), rect.width(), rect.height(), backing_hdc, | 456 BitBlt(hdc, rect.x(), rect.y(), rect.width(), rect.height(), backing_hdc, |
463 rect.x()-plugin_rect_.x(), rect.y()-plugin_rect_.y(), SRCCOPY); | 457 rect.x()-plugin_rect_.x(), rect.y()-plugin_rect_.y(), SRCCOPY); |
464 | 458 |
465 if (invalidate_pending_) { | 459 if (invalidate_pending_) { |
466 // Only send the PaintAck message if this paint is in response to an | 460 // Only send the PaintAck message if this paint is in response to an |
467 // invalidate from the plugin, since this message acts as an access token | 461 // invalidate from the plugin, since this message acts as an access token |
468 // to ensure only one process is using the transport dib at a time. | 462 // to ensure only one process is using the transport dib at a time. |
469 invalidate_pending_ = false; | 463 invalidate_pending_ = false; |
470 Send(new PluginMsg_DidPaint(instance_id_)); | 464 Send(new PluginMsg_DidPaint(instance_id_)); |
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
695 return; | 689 return; |
696 } | 690 } |
697 | 691 |
698 void WebPluginDelegateProxy::CopyFromTransportToBacking(const gfx::Rect& rect) { | 692 void WebPluginDelegateProxy::CopyFromTransportToBacking(const gfx::Rect& rect) { |
699 if (!backing_store_canvas_.get()) | 693 if (!backing_store_canvas_.get()) |
700 return; | 694 return; |
701 | 695 |
702 // Copy the damaged rect from the transport bitmap to the backing store. | 696 // Copy the damaged rect from the transport bitmap to the backing store. |
703 HDC backing = backing_store_canvas_->getTopPlatformDevice().getBitmapDC(); | 697 HDC backing = backing_store_canvas_->getTopPlatformDevice().getBitmapDC(); |
704 HDC transport = transport_store_canvas_->getTopPlatformDevice().getBitmapDC(); | 698 HDC transport = transport_store_canvas_->getTopPlatformDevice().getBitmapDC(); |
705 | |
706 BitBlt(backing, rect.x(), rect.y(), rect.width(), rect.height(), | 699 BitBlt(backing, rect.x(), rect.y(), rect.width(), rect.height(), |
707 transport, rect.x(), rect.y(), SRCCOPY); | 700 transport, rect.x(), rect.y(), SRCCOPY); |
| 701 backing_store_painted_ = backing_store_painted_.Union(rect); |
708 } | 702 } |
709 | 703 |
710 void WebPluginDelegateProxy::OnHandleURLRequest( | 704 void WebPluginDelegateProxy::OnHandleURLRequest( |
711 const PluginHostMsg_URLRequest_Params& params) { | 705 const PluginHostMsg_URLRequest_Params& params) { |
712 const char* data = NULL; | 706 const char* data = NULL; |
713 if (params.buffer.size()) | 707 if (params.buffer.size()) |
714 data = ¶ms.buffer[0]; | 708 data = ¶ms.buffer[0]; |
715 | 709 |
716 const char* target = NULL; | 710 const char* target = NULL; |
717 if (params.target.length()) | 711 if (params.target.length()) |
(...skipping 27 matching lines...) Expand all Loading... |
745 plugin_->CancelDocumentLoad(); | 739 plugin_->CancelDocumentLoad(); |
746 } | 740 } |
747 | 741 |
748 void WebPluginDelegateProxy::OnInitiateHTTPRangeRequest( | 742 void WebPluginDelegateProxy::OnInitiateHTTPRangeRequest( |
749 const std::string& url, const std::string& range_info, | 743 const std::string& url, const std::string& range_info, |
750 HANDLE existing_stream, bool notify_needed, HANDLE notify_data) { | 744 HANDLE existing_stream, bool notify_needed, HANDLE notify_data) { |
751 plugin_->InitiateHTTPRangeRequest(url.c_str(), range_info.c_str(), | 745 plugin_->InitiateHTTPRangeRequest(url.c_str(), range_info.c_str(), |
752 existing_stream, notify_needed, | 746 existing_stream, notify_needed, |
753 notify_data); | 747 notify_data); |
754 } | 748 } |
OLD | NEW |