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

Side by Side Diff: chrome/browser/render_widget_host_view_win.cc

Issue 18637: More speedup of scrolling when many windowed plugins in a page. Scrolling is... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: 'spell 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
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/browser/render_widget_host_view_win.h" 5 #include "chrome/browser/render_widget_host_view_win.h"
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/gfx/gdi_util.h" 8 #include "base/gfx/gdi_util.h"
9 #include "base/gfx/rect.h" 9 #include "base/gfx/rect.h"
10 #include "base/histogram.h" 10 #include "base/histogram.h"
11 #include "base/win_util.h" 11 #include "base/win_util.h"
12 #include "chrome/browser/browser_accessibility.h" 12 #include "chrome/browser/browser_accessibility.h"
13 #include "chrome/browser/browser_accessibility_manager.h" 13 #include "chrome/browser/browser_accessibility_manager.h"
14 #include "chrome/browser/browser_trial.h" 14 #include "chrome/browser/browser_trial.h"
15 #include "chrome/browser/renderer_host/render_process_host.h" 15 #include "chrome/browser/renderer_host/render_process_host.h"
16 // TODO(beng): (Cleanup) we should not need to include this file... see comment 16 // TODO(beng): (Cleanup) we should not need to include this file... see comment
17 // in |DidBecomeSelected|. 17 // in |DidBecomeSelected|.
18 #include "chrome/browser/render_view_host.h" 18 #include "chrome/browser/render_view_host.h"
19 #include "chrome/browser/render_widget_host.h" 19 #include "chrome/browser/render_widget_host.h"
20 #include "chrome/common/chrome_constants.h" 20 #include "chrome/common/chrome_constants.h"
21 #include "chrome/common/chrome_switches.h" 21 #include "chrome/common/chrome_switches.h"
22 #include "chrome/common/l10n_util.h" 22 #include "chrome/common/l10n_util.h"
23 #include "chrome/common/plugin_messages.h" 23 #include "chrome/common/plugin_messages.h"
24 #include "chrome/common/win_util.h" 24 #include "chrome/common/win_util.h"
25 // Included for views::kReflectedMessage - TODO(beng): move this to win_util.h! 25 // Included for views::kReflectedMessage - TODO(beng): move this to win_util.h!
26 #include "chrome/views/widget_win.h" 26 #include "chrome/views/widget_win.h"
27 #include "webkit/glue/plugins/plugin_constants_win.h"
28 #include "webkit/glue/plugins/webplugin_delegate_impl.h"
27 #include "webkit/glue/webcursor.h" 29 #include "webkit/glue/webcursor.h"
28 30
29 using base::TimeDelta; 31 using base::TimeDelta;
30 using base::TimeTicks; 32 using base::TimeTicks;
31 33
32 namespace { 34 namespace {
33 35
34 // Tooltips will wrap after this width. Yes, wrap. Imagine that! 36 // Tooltips will wrap after this width. Yes, wrap. Imagine that!
35 const int kTooltipMaxWidthPixels = 300; 37 const int kTooltipMaxWidthPixels = 300;
36 38
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
251 void RenderWidgetHostViewWin::IMEUpdateStatus(ViewHostMsg_ImeControl control, 253 void RenderWidgetHostViewWin::IMEUpdateStatus(ViewHostMsg_ImeControl control,
252 const gfx::Rect& caret_rect) { 254 const gfx::Rect& caret_rect) {
253 if (control == IME_DISABLE) { 255 if (control == IME_DISABLE) {
254 ime_input_.DisableIME(m_hWnd); 256 ime_input_.DisableIME(m_hWnd);
255 } else { 257 } else {
256 ime_input_.EnableIME(m_hWnd, caret_rect, 258 ime_input_.EnableIME(m_hWnd, caret_rect,
257 control == IME_COMPLETE_COMPOSITION); 259 control == IME_COMPLETE_COMPOSITION);
258 } 260 }
259 } 261 }
260 262
263 BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lparam) {
264 if (!WebPluginDelegateImpl::IsPluginDelegateWindow(hwnd))
265 return TRUE;
266
267 gfx::Rect* rect = reinterpret_cast<gfx::Rect*>(lparam);
268 static UINT msg = RegisterWindowMessage(kPaintMessageName);
269 WPARAM wparam = rect->x() << 16 | rect->y();
270 lparam = rect->width() << 16 | rect->height();
271
272 // SendMessage gets the message across much quicker than PostMessage, since it
273 // doesn't get queued. When the plugin thread calls PeakMessage or other
darin (slow to review) 2009/01/22 00:40:03 s/PeakMessage/PeekMessage/
jam 2009/01/22 01:03:10 Done.
274 // Win32 APIs, sent messages are dispatched automatically.
275 SendNotifyMessage(hwnd, msg, wparam, lparam);
276
277 return TRUE;
278 }
279
280 void RenderWidgetHostViewWin::Redraw(const gfx::Rect& rect) {
281 // Paint the invalid region synchronously. Our caller will not paint again
282 // until we return, so by painting to the screen here, we ensure effective
283 // rate-limiting of backing store updates. This helps a lot on pages that
284 // have animations or fairly expensive layout (e.g., google maps).
285 //
286 // We paint this window synchronously, however child windows (i.e. plugins)
287 // are painted asynchronously. By avoiding synchronous cross-process window
288 // message dispatching we allow scrolling to be smooth, and also avoid the
289 // browser process locking up if the plugin process is hung.
290 //
291 RedrawWindow(
292 &rect.ToRECT(), NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_NOCHILDREN);
293
294 // Send the invalid rect in screen coordinates.
295 gfx::Rect screen_rect = GetViewBounds();
296 gfx::Rect invalid_screen_rect = rect;
297 invalid_screen_rect.Offset(screen_rect.x(), screen_rect.y());
298
299 LPARAM lparam = reinterpret_cast<LPARAM>(&invalid_screen_rect);
300 EnumChildWindows(m_hWnd, EnumChildProc, lparam);
301 }
302
261 void RenderWidgetHostViewWin::DidPaintRect(const gfx::Rect& rect) { 303 void RenderWidgetHostViewWin::DidPaintRect(const gfx::Rect& rect) {
262 if (is_hidden_) 304 if (is_hidden_)
263 return; 305 return;
264 306
265 RECT invalid_rect = rect.ToRECT(); 307 Redraw(rect);
266
267 // Paint the invalid region synchronously. Our caller will not paint again
268 // until we return, so by painting to the screen here, we ensure effective
269 // rate-limiting of backing store updates. This helps a lot on pages that
270 // have animations or fairly expensive layout (e.g., google maps).
271 //
272 // Please refer to the RenderWidgetHostViewWin::DidScrollRect function for the
273 // reasoning behind the combination of flags passed to RedrawWindow.
274 //
275 RedrawWindow(&invalid_rect, NULL,
276 RDW_INVALIDATE | RDW_UPDATENOW | RDW_ALLCHILDREN | RDW_FRAME);
277 } 308 }
278 309
279 void RenderWidgetHostViewWin::DidScrollRect( 310 void RenderWidgetHostViewWin::DidScrollRect(
280 const gfx::Rect& rect, int dx, int dy) { 311 const gfx::Rect& rect, int dx, int dy) {
281 if (is_hidden_) 312 if (is_hidden_)
282 return; 313 return;
283 314
284 // We need to pass in SW_INVALIDATE to ScrollWindowEx. The MSDN 315 // We need to pass in SW_INVALIDATE to ScrollWindowEx. The MSDN
285 // documentation states that it only applies to the HRGN argument, which is 316 // documentation states that it only applies to the HRGN argument, which is
286 // wrong. Not passing in this flag does not invalidate the region which was 317 // wrong. Not passing in this flag does not invalidate the region which was
287 // scrolled from, thus causing painting issues. 318 // scrolled from, thus causing painting issues.
288 RECT clip_rect = rect.ToRECT(); 319 RECT clip_rect = rect.ToRECT();
289 ScrollWindowEx(dx, dy, NULL, &clip_rect, NULL, NULL, SW_INVALIDATE); 320 ScrollWindowEx(dx, dy, NULL, &clip_rect, NULL, NULL, SW_INVALIDATE);
290 321
291 RECT invalid_rect = {0}; 322 RECT invalid_rect = {0};
292 GetUpdateRect(&invalid_rect); 323 GetUpdateRect(&invalid_rect);
293 324 Redraw(gfx::Rect(invalid_rect));
294 // Paint the invalid region synchronously. Our caller will not paint again
295 // until we return, so by painting to the screen here, we ensure effective
296 // rate-limiting of backing store updates. This helps a lot on pages that
297 // have animations or fairly expensive layout (e.g., google maps).
298 //
299 // Our RenderWidgetHostViewWin does not have a non-client area, whereas the
300 // children (plugin windows) may. If we don't pass in RDW_FRAME then the
301 // children don't receive WM_NCPAINT messages while scrolling, which causes
302 // painting problems (http://b/issue?id=923945). We need to pass
303 // RDW_INVALIDATE as it is required for RDW_FRAME to work.
304 //
305 RedrawWindow(&invalid_rect, NULL,
306 RDW_INVALIDATE | RDW_UPDATENOW | RDW_ALLCHILDREN | RDW_FRAME);
307 } 325 }
308 326
309 void RenderWidgetHostViewWin::RendererGone() { 327 void RenderWidgetHostViewWin::RendererGone() {
310 // TODO(darin): keep this around, and draw sad-tab into it. 328 // TODO(darin): keep this around, and draw sad-tab into it.
311 UpdateCursorIfOverSelf(); 329 UpdateCursorIfOverSelf();
312 DestroyWindow(); 330 DestroyWindow();
313 } 331 }
314 332
315 void RenderWidgetHostViewWin::Destroy() { 333 void RenderWidgetHostViewWin::Destroy() {
316 // We've been told to destroy. 334 // We've been told to destroy.
(...skipping 580 matching lines...) Expand 10 before | Expand all | Expand 10 after
897 if (::IsWindow(tooltip_hwnd_)) 915 if (::IsWindow(tooltip_hwnd_))
898 ::DestroyWindow(tooltip_hwnd_); 916 ::DestroyWindow(tooltip_hwnd_);
899 tooltip_hwnd_ = NULL; 917 tooltip_hwnd_ = NULL;
900 } 918 }
901 919
902 void RenderWidgetHostViewWin::ShutdownHost() { 920 void RenderWidgetHostViewWin::ShutdownHost() {
903 shutdown_factory_.RevokeAll(); 921 shutdown_factory_.RevokeAll();
904 render_widget_host_->Shutdown(); 922 render_widget_host_->Shutdown();
905 // Do not touch any members at this point, |this| has been deleted. 923 // Do not touch any members at this point, |this| has been deleted.
906 } 924 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698