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

Side by Side Diff: webkit/glue/plugins/webplugin_delegate_impl.cc

Issue 42626: Report the plugin position to windowed plugins as (0,0)... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 9 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
« no previous file with comments | « webkit/glue/plugins/webplugin_delegate_impl.h ('k') | webkit/glue/webplugin.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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"
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
138 WebPluginDelegateImpl::WebPluginDelegateImpl( 138 WebPluginDelegateImpl::WebPluginDelegateImpl(
139 gfx::NativeView containing_view, 139 gfx::NativeView containing_view,
140 NPAPI::PluginInstance *instance) 140 NPAPI::PluginInstance *instance)
141 : parent_(containing_view), 141 : parent_(containing_view),
142 instance_(instance), 142 instance_(instance),
143 quirks_(0), 143 quirks_(0),
144 plugin_(NULL), 144 plugin_(NULL),
145 windowless_(false), 145 windowless_(false),
146 windowed_handle_(NULL), 146 windowed_handle_(NULL),
147 windowed_did_set_window_(false), 147 windowed_did_set_window_(false),
148 windowed_manage_position_(false),
148 windowless_needs_set_window_(true), 149 windowless_needs_set_window_(true),
149 plugin_wnd_proc_(NULL), 150 plugin_wnd_proc_(NULL),
150 last_message_(0), 151 last_message_(0),
151 is_calling_wndproc(false), 152 is_calling_wndproc(false),
152 dummy_window_for_activation_(NULL), 153 dummy_window_for_activation_(NULL),
153 handle_event_message_filter_hook_(NULL), 154 handle_event_message_filter_hook_(NULL),
154 handle_event_pump_messages_event_(NULL), 155 handle_event_pump_messages_event_(NULL),
155 handle_event_depth_(0), 156 handle_event_depth_(0),
156 user_gesture_message_posted_(false), 157 user_gesture_message_posted_(false),
157 #pragma warning(suppress: 4355) // can use this 158 #pragma warning(suppress: 4355) // can use this
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
259 // the window handle and validate the same. The window handle can be 260 // the window handle and validate the same. The window handle can be
260 // retreived via NPN_GetValue of NPNVnetscapeWindow. 261 // retreived via NPN_GetValue of NPNVnetscapeWindow.
261 instance_->set_window_handle(parent_); 262 instance_->set_window_handle(parent_);
262 CreateDummyWindowForActivation(); 263 CreateDummyWindowForActivation();
263 handle_event_pump_messages_event_ = CreateEvent(NULL, TRUE, FALSE, NULL); 264 handle_event_pump_messages_event_ = CreateEvent(NULL, TRUE, FALSE, NULL);
264 } else { 265 } else {
265 if (!WindowedCreatePlugin()) 266 if (!WindowedCreatePlugin())
266 return false; 267 return false;
267 } 268 }
268 269
269 plugin->SetWindow(windowed_handle_, handle_event_pump_messages_event_); 270 windowed_manage_position_ =
271 plugin->SetWindow(windowed_handle_, handle_event_pump_messages_event_);
270 plugin_url_ = url.spec(); 272 plugin_url_ = url.spec();
271 273
272 // The windowless version of the Silverlight plugin calls the 274 // The windowless version of the Silverlight plugin calls the
273 // WindowFromPoint API and passes the result of that to the 275 // WindowFromPoint API and passes the result of that to the
274 // TrackPopupMenu API call as the owner window. This causes the API 276 // TrackPopupMenu API call as the owner window. This causes the API
275 // to fail as the API expects the window handle to live on the same 277 // to fail as the API expects the window handle to live on the same
276 // thread as the caller. It works in the other browsers as the plugin 278 // thread as the caller. It works in the other browsers as the plugin
277 // lives on the browser thread. Our workaround is to intercept the 279 // lives on the browser thread. Our workaround is to intercept the
278 // TrackPopupMenu API for Silverlight and replace the window handle 280 // TrackPopupMenu API for Silverlight and replace the window handle
279 // with the dummy activation window. 281 // with the dummy activation window.
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after
543 // all active plugins with each pass through the throttle, otherwise 545 // all active plugins with each pass through the throttle, otherwise
544 // we see video jankiness. 546 // we see video jankiness.
545 std::list<MSG>* throttle_queue = g_throttle_queue.Pointer(); 547 std::list<MSG>* throttle_queue = g_throttle_queue.Pointer();
546 std::map<HWND, int> processed; 548 std::map<HWND, int> processed;
547 549
548 std::list<MSG>::iterator it = throttle_queue->begin(); 550 std::list<MSG>::iterator it = throttle_queue->begin();
549 while (it != throttle_queue->end()) { 551 while (it != throttle_queue->end()) {
550 const MSG& msg = *it; 552 const MSG& msg = *it;
551 if (processed.find(msg.hwnd) == processed.end()) { 553 if (processed.find(msg.hwnd) == processed.end()) {
552 WNDPROC proc = reinterpret_cast<WNDPROC>(msg.time); 554 WNDPROC proc = reinterpret_cast<WNDPROC>(msg.time);
553 » // It is possible that the window was closed after we queued 555 // It is possible that the window was closed after we queued
554 » // this message. This is a rare event; just verify the window 556 // this message. This is a rare event; just verify the window
555 » // is alive. (see also bug 1259488) 557 // is alive. (see also bug 1259488)
556 » if (IsWindow(msg.hwnd)) 558 if (IsWindow(msg.hwnd))
557 CallWindowProc(proc, msg.hwnd, msg.message, msg.wParam, msg.lParam); 559 CallWindowProc(proc, msg.hwnd, msg.message, msg.wParam, msg.lParam);
558 processed[msg.hwnd] = 1; 560 processed[msg.hwnd] = 1;
559 it = throttle_queue->erase(it); 561 it = throttle_queue->erase(it);
560 } else { 562 } else {
561 it++; 563 it++;
562 } 564 }
563 } 565 }
564 566
565 if (throttle_queue->size() > 0) 567 if (throttle_queue->size() > 0)
566 MessageLoop::current()->PostDelayedTask(FROM_HERE, 568 MessageLoop::current()->PostDelayedTask(FROM_HERE,
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
688 const gfx::Rect& window_rect, 690 const gfx::Rect& window_rect,
689 const gfx::Rect& clip_rect) { 691 const gfx::Rect& clip_rect) {
690 if (!windowed_handle_) { 692 if (!windowed_handle_) {
691 NOTREACHED(); 693 NOTREACHED();
692 return false; 694 return false;
693 } 695 }
694 696
695 if (window_rect_ == window_rect && clip_rect_ == clip_rect) 697 if (window_rect_ == window_rect && clip_rect_ == clip_rect)
696 return false; 698 return false;
697 699
698 // There are a few parts to managing the plugin windows: 700 // If windowed_manage_position_ is false, then the plugin will be moved
699 // - Initial geometry, show / resize / position the window. 701 // elsewhere. This allows the window moves/scrolling/clipping to be
700 // - Geometry updates, resize the window. 702 // synchronized with the page and other windows.
701 // - Geometry updates, move the window or update the clipping region.
702 // This code should handle the first two, positioning and sizing the window
703 // initially, and resizing it when the size changes. Clipping and moving are
704 // handled separately by WebPlugin, after it has called this code. This
705 // allows window moves, like scrolling, to be synchronized with painting.
706 // See WebPluginImpl::setFrameRect().
707 if (window_rect.size() != window_rect_.size()) { 703 if (window_rect.size() != window_rect_.size()) {
708 ::SetWindowPos(windowed_handle_, 704 ::SetWindowPos(windowed_handle_,
709 NULL, 705 NULL,
710 0, 706 windowed_manage_position_ ? window_rect.x() : 0,
711 0, 707 windowed_manage_position_ ? window_rect.y() : 0,
712 window_rect.width(), 708 window_rect.width(),
713 window_rect.height(), 709 window_rect.height(),
714 SWP_SHOWWINDOW); 710 SWP_SHOWWINDOW);
715 } 711 }
716 712
717 window_rect_ = window_rect; 713 window_rect_ = window_rect;
718 clip_rect_ = clip_rect; 714 clip_rect_ = clip_rect;
719 715
720 // Ensure that the entire window gets repainted. 716 // Ensure that the entire window gets repainted.
721 ::InvalidateRect(windowed_handle_, NULL, FALSE); 717 ::InvalidateRect(windowed_handle_, NULL, FALSE);
(...skipping 13 matching lines...) Expand all
735 instance()->set_window_handle(windowed_handle_); 731 instance()->set_window_handle(windowed_handle_);
736 732
737 DCHECK(!instance()->windowless()); 733 DCHECK(!instance()->windowless());
738 734
739 window_.clipRect.top = clip_rect_.y(); 735 window_.clipRect.top = clip_rect_.y();
740 window_.clipRect.left = clip_rect_.x(); 736 window_.clipRect.left = clip_rect_.x();
741 window_.clipRect.bottom = clip_rect_.y() + clip_rect_.height(); 737 window_.clipRect.bottom = clip_rect_.y() + clip_rect_.height();
742 window_.clipRect.right = clip_rect_.x() + clip_rect_.width(); 738 window_.clipRect.right = clip_rect_.x() + clip_rect_.width();
743 window_.height = window_rect_.height(); 739 window_.height = window_rect_.height();
744 window_.width = window_rect_.width(); 740 window_.width = window_rect_.width();
745 window_.x = window_rect_.x(); 741 window_.x = windowed_manage_position_ ? window_rect_.x() : 0;
746 window_.y = window_rect_.y(); 742 window_.y = windowed_manage_position_ ? window_rect_.y() : 0;
747 743
748 window_.window = windowed_handle_; 744 window_.window = windowed_handle_;
749 window_.type = NPWindowTypeWindow; 745 window_.type = NPWindowTypeWindow;
750 746
751 // Reset this flag before entering the instance in case of side-effects. 747 // Reset this flag before entering the instance in case of side-effects.
752 windowed_did_set_window_ = true; 748 windowed_did_set_window_ = true;
753 749
754 NPError err = instance()->NPP_SetWindow(&window_); 750 NPError err = instance()->NPP_SetWindow(&window_);
755 if (quirks_ & PLUGIN_QUIRK_SETWINDOW_TWICE) 751 if (quirks_ & PLUGIN_QUIRK_SETWINDOW_TWICE)
756 instance()->NPP_SetWindow(&window_); 752 instance()->NPP_SetWindow(&window_);
(...skipping 435 matching lines...) Expand 10 before | Expand all | Expand 10 after
1192 1188
1193 // It is ok to pass NULL here to GetCursor as we are not looking for cursor 1189 // It is ok to pass NULL here to GetCursor as we are not looking for cursor
1194 // types defined by Webkit. 1190 // types defined by Webkit.
1195 HCURSOR previous_cursor = 1191 HCURSOR previous_cursor =
1196 g_current_plugin_instance->current_windowless_cursor_.GetCursor(NULL); 1192 g_current_plugin_instance->current_windowless_cursor_.GetCursor(NULL);
1197 1193
1198 g_current_plugin_instance->current_windowless_cursor_.InitFromExternalCursor( 1194 g_current_plugin_instance->current_windowless_cursor_.InitFromExternalCursor(
1199 cursor); 1195 cursor);
1200 return previous_cursor; 1196 return previous_cursor;
1201 } 1197 }
OLDNEW
« no previous file with comments | « webkit/glue/plugins/webplugin_delegate_impl.h ('k') | webkit/glue/webplugin.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698