| Index: webkit/glue/plugins/webplugin_delegate_impl.cc
|
| ===================================================================
|
| --- webkit/glue/plugins/webplugin_delegate_impl.cc (revision 2783)
|
| +++ webkit/glue/plugins/webplugin_delegate_impl.cc (working copy)
|
| @@ -6,6 +6,7 @@
|
|
|
| #include "base/file_util.h"
|
| #include "base/message_loop.h"
|
| +#include "base/gfx/gdi_util.h"
|
| #include "base/gfx/point.h"
|
| #include "base/stats_counters.h"
|
| #include "webkit/default_plugin/plugin_impl.h"
|
| @@ -250,13 +251,15 @@
|
| }
|
| }
|
|
|
| -void WebPluginDelegateImpl::UpdateGeometry(const gfx::Rect& window_rect,
|
| - const gfx::Rect& clip_rect,
|
| - bool visible) {
|
| +void WebPluginDelegateImpl::UpdateGeometry(
|
| + const gfx::Rect& window_rect,
|
| + const gfx::Rect& clip_rect,
|
| + const std::vector<gfx::Rect>& cutout_rects,
|
| + bool visible) {
|
| if (windowless_) {
|
| WindowlessUpdateGeometry(window_rect, clip_rect);
|
| } else {
|
| - WindowedUpdateGeometry(window_rect, clip_rect, visible);
|
| + WindowedUpdateGeometry(window_rect, clip_rect, cutout_rects, visible);
|
| }
|
|
|
| // Initiate a download on the plugin url. This should be done for the
|
| @@ -344,10 +347,12 @@
|
| instance()->NPP_HandleEvent(&evt);
|
| }
|
|
|
| -void WebPluginDelegateImpl::WindowedUpdateGeometry(const gfx::Rect& window_rect,
|
| - const gfx::Rect& clip_rect,
|
| - bool visible) {
|
| - if (WindowedReposition(window_rect, clip_rect, visible) ||
|
| +void WebPluginDelegateImpl::WindowedUpdateGeometry(
|
| + const gfx::Rect& window_rect,
|
| + const gfx::Rect& clip_rect,
|
| + const std::vector<gfx::Rect>& cutout_rects,
|
| + bool visible) {
|
| + if (WindowedReposition(window_rect, clip_rect, cutout_rects, visible) ||
|
| !windowed_did_set_window_) {
|
| // Let the plugin know that it has been moved
|
| WindowedSetWindow();
|
| @@ -584,14 +589,17 @@
|
| return true;
|
| }
|
|
|
| -void WebPluginDelegateImpl::MoveWindow(HWND window,
|
| - const gfx::Rect& window_rect,
|
| - const gfx::Rect& clip_rect,
|
| - bool visible) {
|
| +void WebPluginDelegateImpl::MoveWindow(
|
| + HWND window,
|
| + const gfx::Rect& window_rect,
|
| + const gfx::Rect& clip_rect,
|
| + const std::vector<gfx::Rect>& cutout_rects,
|
| + bool visible) {
|
| HRGN hrgn = ::CreateRectRgn(clip_rect.x(),
|
| clip_rect.y(),
|
| clip_rect.right(),
|
| clip_rect.bottom());
|
| + gfx::SubtractRectanglesFromRegion(hrgn, cutout_rects);
|
|
|
| // Note: System will own the hrgn after we call SetWindowRgn,
|
| // so we don't need to call DeleteObject(hrgn)
|
| @@ -612,20 +620,24 @@
|
| flags);
|
| }
|
|
|
| -bool WebPluginDelegateImpl::WindowedReposition(const gfx::Rect& window_rect,
|
| - const gfx::Rect& clip_rect,
|
| - bool visible) {
|
| +bool WebPluginDelegateImpl::WindowedReposition(
|
| + const gfx::Rect& window_rect,
|
| + const gfx::Rect& clip_rect,
|
| + const std::vector<gfx::Rect>& cutout_rects,
|
| + bool visible) {
|
| if (!windowed_handle_) {
|
| NOTREACHED();
|
| return false;
|
| }
|
|
|
| if (window_rect_ == window_rect && clip_rect_ == clip_rect &&
|
| + cutout_rects == cutout_rects_ &&
|
| initial_plugin_resize_done_)
|
| return false;
|
|
|
| window_rect_ = window_rect;
|
| clip_rect_ = clip_rect;
|
| + cutout_rects_ = cutout_rects;
|
|
|
| if (!initial_plugin_resize_done_) {
|
| // We need to ensure that the plugin process continues to reposition
|
| @@ -636,7 +648,7 @@
|
| // We created the window with 0 width and height since we didn't know it
|
| // at the time. Now that we know the geometry, we we can update its size
|
| // since the browser only calls SetWindowPos when scrolling occurs.
|
| - MoveWindow(windowed_handle_, window_rect, clip_rect, visible);
|
| + MoveWindow(windowed_handle_, window_rect, clip_rect, cutout_rects, visible);
|
| // Ensure that the entire window gets repainted.
|
| ::InvalidateRect(windowed_handle_, NULL, FALSE);
|
| }
|
| @@ -791,6 +803,7 @@
|
|
|
| // We will inform the instance of this change when we call NPP_SetWindow.
|
| clip_rect_ = clip_rect;
|
| + cutout_rects_.clear();
|
|
|
| if (window_rect_ != window_rect) {
|
| window_rect_ = window_rect;
|
|
|