Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(765)

Unified Diff: webkit/glue/plugins/webplugin_delegate_impl.cc

Issue 18082: Improve scrolling performance when there are many windowed plugins in a page.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Call DestroyWindow on the right thread & ensure NPP_SetWindow is called right away Created 11 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: webkit/glue/plugins/webplugin_delegate_impl.cc
===================================================================
--- webkit/glue/plugins/webplugin_delegate_impl.cc (revision 8043)
+++ webkit/glue/plugins/webplugin_delegate_impl.cc (working copy)
@@ -9,8 +9,6 @@
#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 "base/string_util.h"
#include "webkit/default_plugin/plugin_impl.h"
@@ -133,7 +131,6 @@
plugin_wnd_proc_(NULL),
last_message_(0),
is_calling_wndproc(false),
- initial_plugin_resize_done_(false),
dummy_window_for_activation_(NULL),
handle_event_message_filter_hook_(NULL),
handle_event_pump_messages_event_(NULL),
@@ -321,13 +318,11 @@
void WebPluginDelegateImpl::UpdateGeometry(
const gfx::Rect& window_rect,
- const gfx::Rect& clip_rect,
- const std::vector<gfx::Rect>& cutout_rects,
- bool visible) {
+ const gfx::Rect& clip_rect) {
if (windowless_) {
WindowlessUpdateGeometry(window_rect, clip_rect);
} else {
- WindowedUpdateGeometry(window_rect, clip_rect, cutout_rects, visible);
+ WindowedUpdateGeometry(window_rect, clip_rect);
}
}
@@ -376,6 +371,12 @@
void WebPluginDelegateImpl::DidReceiveManualResponse(
const std::string& url, const std::string& mime_type,
const std::string& headers, uint32 expected_length, uint32 last_modified) {
+ if (!windowless_) {
+ // Calling NPP_WriteReady before NPP_SetWindow causes movies to not load in
+ // Flash. See http://b/issue?id=892174.
+ DCHECK(windowed_did_set_window_);
+ }
+
instance()->DidReceiveManualResponse(url, mime_type, headers,
expected_length, last_modified);
}
@@ -407,10 +408,8 @@
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) ||
+ const gfx::Rect& clip_rect) {
+ if (WindowedReposition(window_rect, clip_rect) ||
!windowed_did_set_window_) {
// Let the plugin know that it has been moved
WindowedSetWindow();
@@ -662,69 +661,33 @@
return true;
}
-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)
- ::SetWindowRgn(window, hrgn, FALSE);
-
- unsigned long flags = 0;
- if (visible)
- flags |= SWP_SHOWWINDOW;
- else
- flags |= SWP_HIDEWINDOW;
-
- ::SetWindowPos(window,
- NULL,
- window_rect.x(),
- window_rect.y(),
- window_rect.width(),
- window_rect.height(),
- flags);
-}
-
bool WebPluginDelegateImpl::WindowedReposition(
const gfx::Rect& window_rect,
- const gfx::Rect& clip_rect,
- const std::vector<gfx::Rect>& cutout_rects,
- bool visible) {
+ const gfx::Rect& clip_rect) {
if (!windowed_handle_) {
NOTREACHED();
return false;
}
- if (window_rect_ == window_rect && clip_rect_ == clip_rect &&
- cutout_rects == cutout_rects_ &&
- initial_plugin_resize_done_)
+ if (window_rect_ == window_rect && clip_rect_ == clip_rect)
return false;
+ // Clipping is handled by WebPlugin.
+ if (window_rect.size() != window_rect_.size()) {
+ ::SetWindowPos(windowed_handle_,
+ NULL,
+ 0,
+ 0,
+ window_rect.width(),
+ window_rect.height(),
+ SWP_SHOWWINDOW);
+ }
+
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
- // the plugin window until we receive an indication that it is now visible.
- // Subsequent repositions will be done by the browser.
- if (visible)
- initial_plugin_resize_done_ = true;
- // 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, cutout_rects, visible);
- // Ensure that the entire window gets repainted.
- ::InvalidateRect(windowed_handle_, NULL, FALSE);
- }
+ // Ensure that the entire window gets repainted.
+ ::InvalidateRect(windowed_handle_, NULL, FALSE);
return true;
}

Powered by Google App Engine
This is Rietveld 408576698