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

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

Issue 1612: Implement "iframe shim" behavior for windowed plugins.... (Closed) Base URL: http://src.chromium.org/svn/trunk/src/
Patch Set: '' Created 12 years, 2 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/stacking_order_iterator.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 "base/file_util.h" 7 #include "base/file_util.h"
8 #include "base/message_loop.h" 8 #include "base/message_loop.h"
9 #include "base/gfx/gdi_util.h"
9 #include "base/gfx/point.h" 10 #include "base/gfx/point.h"
10 #include "base/stats_counters.h" 11 #include "base/stats_counters.h"
11 #include "webkit/default_plugin/plugin_impl.h" 12 #include "webkit/default_plugin/plugin_impl.h"
12 #include "webkit/glue/glue_util.h" 13 #include "webkit/glue/glue_util.h"
13 #include "webkit/glue/webplugin.h" 14 #include "webkit/glue/webplugin.h"
14 #include "webkit/glue/plugins/plugin_instance.h" 15 #include "webkit/glue/plugins/plugin_instance.h"
15 #include "webkit/glue/plugins/plugin_lib.h" 16 #include "webkit/glue/plugins/plugin_lib.h"
16 #include "webkit/glue/plugins/plugin_list.h" 17 #include "webkit/glue/plugins/plugin_list.h"
17 #include "webkit/glue/plugins/plugin_stream_url.h" 18 #include "webkit/glue/plugins/plugin_stream_url.h"
18 19
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
243 } 244 }
244 245
245 instance_->NPP_Destroy(); 246 instance_->NPP_Destroy();
246 247
247 instance_->set_web_plugin(NULL); 248 instance_->set_web_plugin(NULL);
248 249
249 instance_ = 0; 250 instance_ = 0;
250 } 251 }
251 } 252 }
252 253
253 void WebPluginDelegateImpl::UpdateGeometry(const gfx::Rect& window_rect, 254 void WebPluginDelegateImpl::UpdateGeometry(
254 const gfx::Rect& clip_rect, 255 const gfx::Rect& window_rect,
255 bool visible) { 256 const gfx::Rect& clip_rect,
257 const std::vector<gfx::Rect>& cutout_rects,
258 bool visible) {
256 if (windowless_) { 259 if (windowless_) {
257 WindowlessUpdateGeometry(window_rect, clip_rect); 260 WindowlessUpdateGeometry(window_rect, clip_rect);
258 } else { 261 } else {
259 WindowedUpdateGeometry(window_rect, clip_rect, visible); 262 WindowedUpdateGeometry(window_rect, clip_rect, cutout_rects, visible);
260 } 263 }
261 264
262 // Initiate a download on the plugin url. This should be done for the 265 // Initiate a download on the plugin url. This should be done for the
263 // first update geometry sequence. 266 // first update geometry sequence.
264 if (first_geometry_update_) { 267 if (first_geometry_update_) {
265 first_geometry_update_ = false; 268 first_geometry_update_ = false;
266 // An empty url corresponds to an EMBED tag with no src attribute. 269 // An empty url corresponds to an EMBED tag with no src attribute.
267 if (!load_manually_ && !plugin_url_.empty()) { 270 if (!load_manually_ && !plugin_url_.empty()) {
268 instance_->SendStream(plugin_url_.c_str(), false, NULL); 271 instance_->SendStream(plugin_url_.c_str(), false, NULL);
269 } 272 }
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
337 } 340 }
338 341
339 void WebPluginDelegateImpl::InstallMissingPlugin() { 342 void WebPluginDelegateImpl::InstallMissingPlugin() {
340 NPEvent evt; 343 NPEvent evt;
341 evt.event = PluginInstallerImpl::kInstallMissingPluginMessage; 344 evt.event = PluginInstallerImpl::kInstallMissingPluginMessage;
342 evt.lParam = 0; 345 evt.lParam = 0;
343 evt.wParam = 0; 346 evt.wParam = 0;
344 instance()->NPP_HandleEvent(&evt); 347 instance()->NPP_HandleEvent(&evt);
345 } 348 }
346 349
347 void WebPluginDelegateImpl::WindowedUpdateGeometry(const gfx::Rect& window_rect, 350 void WebPluginDelegateImpl::WindowedUpdateGeometry(
348 const gfx::Rect& clip_rect, 351 const gfx::Rect& window_rect,
349 bool visible) { 352 const gfx::Rect& clip_rect,
350 if (WindowedReposition(window_rect, clip_rect, visible) || 353 const std::vector<gfx::Rect>& cutout_rects,
354 bool visible) {
355 if (WindowedReposition(window_rect, clip_rect, cutout_rects, visible) ||
351 !windowed_did_set_window_) { 356 !windowed_did_set_window_) {
352 // Let the plugin know that it has been moved 357 // Let the plugin know that it has been moved
353 WindowedSetWindow(); 358 WindowedSetWindow();
354 } 359 }
355 } 360 }
356 361
357 bool WebPluginDelegateImpl::WindowedCreatePlugin() { 362 bool WebPluginDelegateImpl::WindowedCreatePlugin() {
358 DCHECK(!windowed_handle_); 363 DCHECK(!windowed_handle_);
359 364
360 RegisterNativeWindowClass(); 365 RegisterNativeWindowClass();
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
577 reinterpret_cast<LPARAM>( 582 reinterpret_cast<LPARAM>(
578 &WebPluginDelegateImpl::FlashWindowlessWndProc))) { 583 &WebPluginDelegateImpl::FlashWindowlessWndProc))) {
579 // Log that this happened. Flash will still work; it just means the 584 // Log that this happened. Flash will still work; it just means the
580 // throttle isn't installed (and Flash will use more CPU). 585 // throttle isn't installed (and Flash will use more CPU).
581 NOTREACHED(); 586 NOTREACHED();
582 LOG(ERROR) << "Failed to wrap all windowless Flash windows"; 587 LOG(ERROR) << "Failed to wrap all windowless Flash windows";
583 } 588 }
584 return true; 589 return true;
585 } 590 }
586 591
587 void WebPluginDelegateImpl::MoveWindow(HWND window, 592 void WebPluginDelegateImpl::MoveWindow(
588 const gfx::Rect& window_rect, 593 HWND window,
589 const gfx::Rect& clip_rect, 594 const gfx::Rect& window_rect,
590 bool visible) { 595 const gfx::Rect& clip_rect,
596 const std::vector<gfx::Rect>& cutout_rects,
597 bool visible) {
591 HRGN hrgn = ::CreateRectRgn(clip_rect.x(), 598 HRGN hrgn = ::CreateRectRgn(clip_rect.x(),
592 clip_rect.y(), 599 clip_rect.y(),
593 clip_rect.right(), 600 clip_rect.right(),
594 clip_rect.bottom()); 601 clip_rect.bottom());
602 gfx::SubtractRectanglesFromRegion(hrgn, cutout_rects);
595 603
596 // Note: System will own the hrgn after we call SetWindowRgn, 604 // Note: System will own the hrgn after we call SetWindowRgn,
597 // so we don't need to call DeleteObject(hrgn) 605 // so we don't need to call DeleteObject(hrgn)
598 ::SetWindowRgn(window, hrgn, FALSE); 606 ::SetWindowRgn(window, hrgn, FALSE);
599 607
600 unsigned long flags = 0; 608 unsigned long flags = 0;
601 if (visible) 609 if (visible)
602 flags |= SWP_SHOWWINDOW; 610 flags |= SWP_SHOWWINDOW;
603 else 611 else
604 flags |= SWP_HIDEWINDOW; 612 flags |= SWP_HIDEWINDOW;
605 613
606 ::SetWindowPos(window, 614 ::SetWindowPos(window,
607 NULL, 615 NULL,
608 window_rect.x(), 616 window_rect.x(),
609 window_rect.y(), 617 window_rect.y(),
610 window_rect.width(), 618 window_rect.width(),
611 window_rect.height(), 619 window_rect.height(),
612 flags); 620 flags);
613 } 621 }
614 622
615 bool WebPluginDelegateImpl::WindowedReposition(const gfx::Rect& window_rect, 623 bool WebPluginDelegateImpl::WindowedReposition(
616 const gfx::Rect& clip_rect, 624 const gfx::Rect& window_rect,
617 bool visible) { 625 const gfx::Rect& clip_rect,
626 const std::vector<gfx::Rect>& cutout_rects,
627 bool visible) {
618 if (!windowed_handle_) { 628 if (!windowed_handle_) {
619 NOTREACHED(); 629 NOTREACHED();
620 return false; 630 return false;
621 } 631 }
622 632
623 if (window_rect_ == window_rect && clip_rect_ == clip_rect && 633 if (window_rect_ == window_rect && clip_rect_ == clip_rect &&
634 cutout_rects == cutout_rects_ &&
624 initial_plugin_resize_done_) 635 initial_plugin_resize_done_)
625 return false; 636 return false;
626 637
627 window_rect_ = window_rect; 638 window_rect_ = window_rect;
628 clip_rect_ = clip_rect; 639 clip_rect_ = clip_rect;
640 cutout_rects_ = cutout_rects;
629 641
630 if (!initial_plugin_resize_done_) { 642 if (!initial_plugin_resize_done_) {
631 // We need to ensure that the plugin process continues to reposition 643 // We need to ensure that the plugin process continues to reposition
632 // the plugin window until we receive an indication that it is now visible. 644 // the plugin window until we receive an indication that it is now visible.
633 // Subsequent repositions will be done by the browser. 645 // Subsequent repositions will be done by the browser.
634 if (visible) 646 if (visible)
635 initial_plugin_resize_done_ = true; 647 initial_plugin_resize_done_ = true;
636 // We created the window with 0 width and height since we didn't know it 648 // We created the window with 0 width and height since we didn't know it
637 // at the time. Now that we know the geometry, we we can update its size 649 // at the time. Now that we know the geometry, we we can update its size
638 // since the browser only calls SetWindowPos when scrolling occurs. 650 // since the browser only calls SetWindowPos when scrolling occurs.
639 MoveWindow(windowed_handle_, window_rect, clip_rect, visible); 651 MoveWindow(windowed_handle_, window_rect, clip_rect, cutout_rects, visible);
640 // Ensure that the entire window gets repainted. 652 // Ensure that the entire window gets repainted.
641 ::InvalidateRect(windowed_handle_, NULL, FALSE); 653 ::InvalidateRect(windowed_handle_, NULL, FALSE);
642 } 654 }
643 655
644 return true; 656 return true;
645 } 657 }
646 658
647 void WebPluginDelegateImpl::WindowedSetWindow() { 659 void WebPluginDelegateImpl::WindowedSetWindow() {
648 if (!instance_) 660 if (!instance_)
649 return; 661 return;
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
784 const gfx::Rect& clip_rect) { 796 const gfx::Rect& clip_rect) {
785 // Only resend to the instance if the geometry has changed. 797 // Only resend to the instance if the geometry has changed.
786 if (window_rect == window_rect_ && clip_rect == clip_rect_) 798 if (window_rect == window_rect_ && clip_rect == clip_rect_)
787 return; 799 return;
788 800
789 // Set this flag before entering the instance in case of side-effects. 801 // Set this flag before entering the instance in case of side-effects.
790 windowless_needs_set_window_ = true; 802 windowless_needs_set_window_ = true;
791 803
792 // We will inform the instance of this change when we call NPP_SetWindow. 804 // We will inform the instance of this change when we call NPP_SetWindow.
793 clip_rect_ = clip_rect; 805 clip_rect_ = clip_rect;
806 cutout_rects_.clear();
794 807
795 if (window_rect_ != window_rect) { 808 if (window_rect_ != window_rect) {
796 window_rect_ = window_rect; 809 window_rect_ = window_rect;
797 810
798 WindowlessSetWindow(true); 811 WindowlessSetWindow(true);
799 812
800 WINDOWPOS win_pos = {0}; 813 WINDOWPOS win_pos = {0};
801 win_pos.x = window_rect_.x(); 814 win_pos.x = window_rect_.x();
802 win_pos.y = window_rect_.y(); 815 win_pos.y = window_rect_.y();
803 win_pos.cx = window_rect_.width(); 816 win_pos.cx = window_rect_.width();
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after
1055 break; 1068 break;
1056 } 1069 }
1057 1070
1058 return false; 1071 return false;
1059 } 1072 }
1060 1073
1061 void WebPluginDelegateImpl::OnUserGestureEnd() { 1074 void WebPluginDelegateImpl::OnUserGestureEnd() {
1062 user_gesture_message_posted_ = false; 1075 user_gesture_message_posted_ = false;
1063 instance()->PopPopupsEnabledState(); 1076 instance()->PopPopupsEnabledState();
1064 } 1077 }
OLDNEW
« no previous file with comments | « webkit/glue/plugins/webplugin_delegate_impl.h ('k') | webkit/glue/stacking_order_iterator.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698