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

Side by Side 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 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 "webkit/glue/plugins/webplugin_delegate_impl.h" 5 #include "webkit/glue/plugins/webplugin_delegate_impl.h"
6 6
7 #include <string> 7 #include <string>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/file_util.h" 10 #include "base/file_util.h"
11 #include "base/message_loop.h" 11 #include "base/message_loop.h"
12 #include "base/gfx/gdi_util.h"
13 #include "base/gfx/point.h"
14 #include "base/stats_counters.h" 12 #include "base/stats_counters.h"
15 #include "base/string_util.h" 13 #include "base/string_util.h"
16 #include "webkit/default_plugin/plugin_impl.h" 14 #include "webkit/default_plugin/plugin_impl.h"
17 #include "webkit/glue/glue_util.h" 15 #include "webkit/glue/glue_util.h"
18 #include "webkit/glue/webplugin.h" 16 #include "webkit/glue/webplugin.h"
19 #include "webkit/glue/plugins/plugin_instance.h" 17 #include "webkit/glue/plugins/plugin_instance.h"
20 #include "webkit/glue/plugins/plugin_lib.h" 18 #include "webkit/glue/plugins/plugin_lib.h"
21 #include "webkit/glue/plugins/plugin_list.h" 19 #include "webkit/glue/plugins/plugin_list.h"
22 #include "webkit/glue/plugins/plugin_stream_url.h" 20 #include "webkit/glue/plugins/plugin_stream_url.h"
23 #include "webkit/glue/webkit_glue.h" 21 #include "webkit/glue/webkit_glue.h"
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
126 instance_(instance), 124 instance_(instance),
127 quirks_(0), 125 quirks_(0),
128 plugin_(NULL), 126 plugin_(NULL),
129 windowless_(false), 127 windowless_(false),
130 windowed_handle_(NULL), 128 windowed_handle_(NULL),
131 windowed_did_set_window_(false), 129 windowed_did_set_window_(false),
132 windowless_needs_set_window_(true), 130 windowless_needs_set_window_(true),
133 plugin_wnd_proc_(NULL), 131 plugin_wnd_proc_(NULL),
134 last_message_(0), 132 last_message_(0),
135 is_calling_wndproc(false), 133 is_calling_wndproc(false),
136 initial_plugin_resize_done_(false),
137 dummy_window_for_activation_(NULL), 134 dummy_window_for_activation_(NULL),
138 handle_event_message_filter_hook_(NULL), 135 handle_event_message_filter_hook_(NULL),
139 handle_event_pump_messages_event_(NULL), 136 handle_event_pump_messages_event_(NULL),
140 handle_event_depth_(0), 137 handle_event_depth_(0),
141 user_gesture_message_posted_(false), 138 user_gesture_message_posted_(false),
142 #pragma warning(suppress: 4355) // can use this 139 #pragma warning(suppress: 4355) // can use this
143 user_gesture_msg_factory_(this), 140 user_gesture_msg_factory_(this),
144 plugin_module_handle_(NULL) { 141 plugin_module_handle_(NULL) {
145 memset(&window_, 0, sizeof(window_)); 142 memset(&window_, 0, sizeof(window_));
146 143
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
314 } 311 }
315 } 312 }
316 } 313 }
317 314
318 instance_ = 0; 315 instance_ = 0;
319 } 316 }
320 } 317 }
321 318
322 void WebPluginDelegateImpl::UpdateGeometry( 319 void WebPluginDelegateImpl::UpdateGeometry(
323 const gfx::Rect& window_rect, 320 const gfx::Rect& window_rect,
324 const gfx::Rect& clip_rect, 321 const gfx::Rect& clip_rect) {
325 const std::vector<gfx::Rect>& cutout_rects,
326 bool visible) {
327 if (windowless_) { 322 if (windowless_) {
328 WindowlessUpdateGeometry(window_rect, clip_rect); 323 WindowlessUpdateGeometry(window_rect, clip_rect);
329 } else { 324 } else {
330 WindowedUpdateGeometry(window_rect, clip_rect, cutout_rects, visible); 325 WindowedUpdateGeometry(window_rect, clip_rect);
331 } 326 }
332 } 327 }
333 328
334 void WebPluginDelegateImpl::Paint(HDC hdc, const gfx::Rect& rect) { 329 void WebPluginDelegateImpl::Paint(HDC hdc, const gfx::Rect& rect) {
335 if (windowless_) 330 if (windowless_)
336 WindowlessPaint(hdc, rect); 331 WindowlessPaint(hdc, rect);
337 } 332 }
338 333
339 void WebPluginDelegateImpl::Print(HDC hdc) { 334 void WebPluginDelegateImpl::Print(HDC hdc) {
340 // Disabling the call to NPP_Print as it causes a crash in 335 // Disabling the call to NPP_Print as it causes a crash in
(...skipping 28 matching lines...) Expand all
369 bool success, 364 bool success,
370 bool notify_needed, 365 bool notify_needed,
371 int notify_data) { 366 int notify_data) {
372 instance()->SendJavaScriptStream(url, result, success, notify_needed, 367 instance()->SendJavaScriptStream(url, result, success, notify_needed,
373 notify_data); 368 notify_data);
374 } 369 }
375 370
376 void WebPluginDelegateImpl::DidReceiveManualResponse( 371 void WebPluginDelegateImpl::DidReceiveManualResponse(
377 const std::string& url, const std::string& mime_type, 372 const std::string& url, const std::string& mime_type,
378 const std::string& headers, uint32 expected_length, uint32 last_modified) { 373 const std::string& headers, uint32 expected_length, uint32 last_modified) {
374 if (!windowless_) {
375 // Calling NPP_WriteReady before NPP_SetWindow causes movies to not load in
376 // Flash. See http://b/issue?id=892174.
377 DCHECK(windowed_did_set_window_);
378 }
379
379 instance()->DidReceiveManualResponse(url, mime_type, headers, 380 instance()->DidReceiveManualResponse(url, mime_type, headers,
380 expected_length, last_modified); 381 expected_length, last_modified);
381 } 382 }
382 383
383 void WebPluginDelegateImpl::DidReceiveManualData(const char* buffer, 384 void WebPluginDelegateImpl::DidReceiveManualData(const char* buffer,
384 int length) { 385 int length) {
385 instance()->DidReceiveManualData(buffer, length); 386 instance()->DidReceiveManualData(buffer, length);
386 } 387 }
387 388
388 void WebPluginDelegateImpl::DidFinishManualLoading() { 389 void WebPluginDelegateImpl::DidFinishManualLoading() {
(...skipping 11 matching lines...) Expand all
400 void WebPluginDelegateImpl::InstallMissingPlugin() { 401 void WebPluginDelegateImpl::InstallMissingPlugin() {
401 NPEvent evt; 402 NPEvent evt;
402 evt.event = PluginInstallerImpl::kInstallMissingPluginMessage; 403 evt.event = PluginInstallerImpl::kInstallMissingPluginMessage;
403 evt.lParam = 0; 404 evt.lParam = 0;
404 evt.wParam = 0; 405 evt.wParam = 0;
405 instance()->NPP_HandleEvent(&evt); 406 instance()->NPP_HandleEvent(&evt);
406 } 407 }
407 408
408 void WebPluginDelegateImpl::WindowedUpdateGeometry( 409 void WebPluginDelegateImpl::WindowedUpdateGeometry(
409 const gfx::Rect& window_rect, 410 const gfx::Rect& window_rect,
410 const gfx::Rect& clip_rect, 411 const gfx::Rect& clip_rect) {
411 const std::vector<gfx::Rect>& cutout_rects, 412 if (WindowedReposition(window_rect, clip_rect) ||
412 bool visible) {
413 if (WindowedReposition(window_rect, clip_rect, cutout_rects, visible) ||
414 !windowed_did_set_window_) { 413 !windowed_did_set_window_) {
415 // Let the plugin know that it has been moved 414 // Let the plugin know that it has been moved
416 WindowedSetWindow(); 415 WindowedSetWindow();
417 } 416 }
418 } 417 }
419 418
420 bool WebPluginDelegateImpl::WindowedCreatePlugin() { 419 bool WebPluginDelegateImpl::WindowedCreatePlugin() {
421 DCHECK(!windowed_handle_); 420 DCHECK(!windowed_handle_);
422 421
423 RegisterNativeWindowClass(); 422 RegisterNativeWindowClass();
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after
655 reinterpret_cast<LPARAM>( 654 reinterpret_cast<LPARAM>(
656 &WebPluginDelegateImpl::FlashWindowlessWndProc))) { 655 &WebPluginDelegateImpl::FlashWindowlessWndProc))) {
657 // Log that this happened. Flash will still work; it just means the 656 // Log that this happened. Flash will still work; it just means the
658 // throttle isn't installed (and Flash will use more CPU). 657 // throttle isn't installed (and Flash will use more CPU).
659 NOTREACHED(); 658 NOTREACHED();
660 LOG(ERROR) << "Failed to wrap all windowless Flash windows"; 659 LOG(ERROR) << "Failed to wrap all windowless Flash windows";
661 } 660 }
662 return true; 661 return true;
663 } 662 }
664 663
665 void WebPluginDelegateImpl::MoveWindow(
666 HWND window,
667 const gfx::Rect& window_rect,
668 const gfx::Rect& clip_rect,
669 const std::vector<gfx::Rect>& cutout_rects,
670 bool visible) {
671 HRGN hrgn = ::CreateRectRgn(clip_rect.x(),
672 clip_rect.y(),
673 clip_rect.right(),
674 clip_rect.bottom());
675 gfx::SubtractRectanglesFromRegion(hrgn, cutout_rects);
676
677 // Note: System will own the hrgn after we call SetWindowRgn,
678 // so we don't need to call DeleteObject(hrgn)
679 ::SetWindowRgn(window, hrgn, FALSE);
680
681 unsigned long flags = 0;
682 if (visible)
683 flags |= SWP_SHOWWINDOW;
684 else
685 flags |= SWP_HIDEWINDOW;
686
687 ::SetWindowPos(window,
688 NULL,
689 window_rect.x(),
690 window_rect.y(),
691 window_rect.width(),
692 window_rect.height(),
693 flags);
694 }
695
696 bool WebPluginDelegateImpl::WindowedReposition( 664 bool WebPluginDelegateImpl::WindowedReposition(
697 const gfx::Rect& window_rect, 665 const gfx::Rect& window_rect,
698 const gfx::Rect& clip_rect, 666 const gfx::Rect& clip_rect) {
699 const std::vector<gfx::Rect>& cutout_rects,
700 bool visible) {
701 if (!windowed_handle_) { 667 if (!windowed_handle_) {
702 NOTREACHED(); 668 NOTREACHED();
703 return false; 669 return false;
704 } 670 }
705 671
706 if (window_rect_ == window_rect && clip_rect_ == clip_rect && 672 if (window_rect_ == window_rect && clip_rect_ == clip_rect)
707 cutout_rects == cutout_rects_ &&
708 initial_plugin_resize_done_)
709 return false; 673 return false;
710 674
675 // Clipping is handled by WebPlugin.
676 if (window_rect.size() != window_rect_.size()) {
677 ::SetWindowPos(windowed_handle_,
678 NULL,
679 0,
680 0,
681 window_rect.width(),
682 window_rect.height(),
683 SWP_SHOWWINDOW);
684 }
685
711 window_rect_ = window_rect; 686 window_rect_ = window_rect;
712 clip_rect_ = clip_rect; 687 clip_rect_ = clip_rect;
713 cutout_rects_ = cutout_rects;
714 688
715 if (!initial_plugin_resize_done_) { 689 // Ensure that the entire window gets repainted.
716 // We need to ensure that the plugin process continues to reposition 690 ::InvalidateRect(windowed_handle_, NULL, FALSE);
717 // the plugin window until we receive an indication that it is now visible.
718 // Subsequent repositions will be done by the browser.
719 if (visible)
720 initial_plugin_resize_done_ = true;
721 // We created the window with 0 width and height since we didn't know it
722 // at the time. Now that we know the geometry, we we can update its size
723 // since the browser only calls SetWindowPos when scrolling occurs.
724 MoveWindow(windowed_handle_, window_rect, clip_rect, cutout_rects, visible);
725 // Ensure that the entire window gets repainted.
726 ::InvalidateRect(windowed_handle_, NULL, FALSE);
727 }
728 691
729 return true; 692 return true;
730 } 693 }
731 694
732 void WebPluginDelegateImpl::WindowedSetWindow() { 695 void WebPluginDelegateImpl::WindowedSetWindow() {
733 if (!instance_) 696 if (!instance_)
734 return; 697 return;
735 698
736 if (!windowed_handle_) { 699 if (!windowed_handle_) {
737 NOTREACHED(); 700 NOTREACHED();
(...skipping 428 matching lines...) Expand 10 before | Expand all | Expand 10 after
1166 1129
1167 // It is ok to pass NULL here to GetCursor as we are not looking for cursor 1130 // It is ok to pass NULL here to GetCursor as we are not looking for cursor
1168 // types defined by Webkit. 1131 // types defined by Webkit.
1169 HCURSOR previous_cursor = 1132 HCURSOR previous_cursor =
1170 current_plugin_instance_->current_windowless_cursor_.GetCursor(NULL); 1133 current_plugin_instance_->current_windowless_cursor_.GetCursor(NULL);
1171 1134
1172 current_plugin_instance_->current_windowless_cursor_.InitFromExternalCursor( 1135 current_plugin_instance_->current_windowless_cursor_.InitFromExternalCursor(
1173 cursor); 1136 cursor);
1174 return previous_cursor; 1137 return previous_cursor;
1175 } 1138 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698