OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/browser/renderer_host/render_widget_host_view_aura.h" | 5 #include "content/browser/renderer_host/render_widget_host_view_aura.h" |
6 | 6 |
7 #include "base/auto_reset.h" | 7 #include "base/auto_reset.h" |
8 #include "base/basictypes.h" | 8 #include "base/basictypes.h" |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/callback_helpers.h" | 10 #include "base/callback_helpers.h" |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
76 #include "ui/gfx/rect_conversions.h" | 76 #include "ui/gfx/rect_conversions.h" |
77 #include "ui/gfx/screen.h" | 77 #include "ui/gfx/screen.h" |
78 #include "ui/gfx/size_conversions.h" | 78 #include "ui/gfx/size_conversions.h" |
79 #include "ui/gfx/skia_util.h" | 79 #include "ui/gfx/skia_util.h" |
80 #include "ui/wm/public/window_types.h" | 80 #include "ui/wm/public/window_types.h" |
81 | 81 |
82 #if defined(OS_WIN) | 82 #if defined(OS_WIN) |
83 #include "base/win/windows_version.h" | 83 #include "base/win/windows_version.h" |
84 #include "content/browser/accessibility/browser_accessibility_manager_win.h" | 84 #include "content/browser/accessibility/browser_accessibility_manager_win.h" |
85 #include "content/browser/accessibility/browser_accessibility_win.h" | 85 #include "content/browser/accessibility/browser_accessibility_win.h" |
| 86 #include "content/browser/renderer_host/legacy_render_widget_host_win.h" |
86 #include "content/common/plugin_constants_win.h" | 87 #include "content/common/plugin_constants_win.h" |
87 #include "ui/base/win/hidden_window.h" | 88 #include "ui/base/win/hidden_window.h" |
88 #include "ui/gfx/gdi_util.h" | 89 #include "ui/gfx/gdi_util.h" |
89 #include "ui/gfx/win/dpi.h" | 90 #include "ui/gfx/win/dpi.h" |
90 #endif | 91 #endif |
91 | 92 |
92 using gfx::RectToSkIRect; | 93 using gfx::RectToSkIRect; |
93 using gfx::SkIRectToRect; | 94 using gfx::SkIRectToRect; |
94 | 95 |
95 using blink::WebScreenInfo; | 96 using blink::WebScreenInfo; |
(...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
490 host_->SetView(this); | 491 host_->SetView(this); |
491 window_observer_.reset(new WindowObserver(this)); | 492 window_observer_.reset(new WindowObserver(this)); |
492 aura::client::SetTooltipText(window_, &tooltip_); | 493 aura::client::SetTooltipText(window_, &tooltip_); |
493 aura::client::SetActivationDelegate(window_, this); | 494 aura::client::SetActivationDelegate(window_, this); |
494 aura::client::SetActivationChangeObserver(window_, this); | 495 aura::client::SetActivationChangeObserver(window_, this); |
495 aura::client::SetFocusChangeObserver(window_, this); | 496 aura::client::SetFocusChangeObserver(window_, this); |
496 gfx::Screen::GetScreenFor(window_)->AddObserver(this); | 497 gfx::Screen::GetScreenFor(window_)->AddObserver(this); |
497 software_frame_manager_.reset(new SoftwareFrameManager( | 498 software_frame_manager_.reset(new SoftwareFrameManager( |
498 weak_ptr_factory_.GetWeakPtr())); | 499 weak_ptr_factory_.GetWeakPtr())); |
499 #if defined(OS_WIN) | 500 #if defined(OS_WIN) |
500 plugin_parent_window_ = NULL; | 501 legacy_render_widget_host_HWND_ = NULL; |
501 #endif | 502 #endif |
502 ImageTransportFactory::GetInstance()->AddObserver(this); | 503 ImageTransportFactory::GetInstance()->AddObserver(this); |
503 } | 504 } |
504 | 505 |
505 //////////////////////////////////////////////////////////////////////////////// | 506 //////////////////////////////////////////////////////////////////////////////// |
506 // RenderWidgetHostViewAura, RenderWidgetHostView implementation: | 507 // RenderWidgetHostViewAura, RenderWidgetHostView implementation: |
507 | 508 |
508 bool RenderWidgetHostViewAura::OnMessageReceived( | 509 bool RenderWidgetHostViewAura::OnMessageReceived( |
509 const IPC::Message& message) { | 510 const IPC::Message& message) { |
510 bool handled = true; | 511 bool handled = true; |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
622 !released_front_lock_.get()) { | 623 !released_front_lock_.get()) { |
623 ui::Compositor* compositor = GetCompositor(); | 624 ui::Compositor* compositor = GetCompositor(); |
624 if (compositor) | 625 if (compositor) |
625 released_front_lock_ = compositor->GetCompositorLock(); | 626 released_front_lock_ = compositor->GetCompositorLock(); |
626 } | 627 } |
627 | 628 |
628 #if defined(OS_WIN) | 629 #if defined(OS_WIN) |
629 LPARAM lparam = reinterpret_cast<LPARAM>(this); | 630 LPARAM lparam = reinterpret_cast<LPARAM>(this); |
630 EnumChildWindows(ui::GetHiddenWindow(), ShowWindowsCallback, lparam); | 631 EnumChildWindows(ui::GetHiddenWindow(), ShowWindowsCallback, lparam); |
631 | 632 |
632 if (::IsWindow(plugin_parent_window_)) { | 633 DCHECK(legacy_render_widget_host_HWND_); |
| 634 if (::IsWindow(legacy_render_widget_host_HWND_->hwnd())) { |
633 gfx::Rect window_bounds = window_->GetBoundsInRootWindow(); | 635 gfx::Rect window_bounds = window_->GetBoundsInRootWindow(); |
634 ::SetWindowPos(plugin_parent_window_, NULL, window_bounds.x(), | 636 ::SetWindowPos(legacy_render_widget_host_HWND_->hwnd(), NULL, |
635 window_bounds.y(), window_bounds.width(), | 637 window_bounds.x(), window_bounds.y(), window_bounds.width(), |
636 window_bounds.height(), 0); | 638 window_bounds.height(), 0); |
637 } | 639 } |
638 #endif | 640 #endif |
639 } | 641 } |
640 | 642 |
641 void RenderWidgetHostViewAura::WasHidden() { | 643 void RenderWidgetHostViewAura::WasHidden() { |
642 if (!host_ || host_->is_hidden()) | 644 if (!host_ || host_->is_hidden()) |
643 return; | 645 return; |
644 host_->WasHidden(); | 646 host_->WasHidden(); |
645 software_frame_manager_->SetVisibility(false); | 647 software_frame_manager_->SetVisibility(false); |
646 delegated_frame_evictor_->SetVisible(false); | 648 delegated_frame_evictor_->SetVisible(false); |
647 released_front_lock_ = NULL; | 649 released_front_lock_ = NULL; |
648 | 650 |
649 #if defined(OS_WIN) | 651 #if defined(OS_WIN) |
650 constrained_rects_.clear(); | 652 constrained_rects_.clear(); |
651 aura::WindowEventDispatcher* dispatcher = window_->GetDispatcher(); | 653 aura::WindowEventDispatcher* dispatcher = window_->GetDispatcher(); |
652 if (dispatcher) { | 654 if (dispatcher) { |
653 HWND parent = dispatcher->host()->GetAcceleratedWidget(); | 655 HWND parent = dispatcher->host()->GetAcceleratedWidget(); |
654 LPARAM lparam = reinterpret_cast<LPARAM>(this); | 656 LPARAM lparam = reinterpret_cast<LPARAM>(this); |
655 | 657 |
656 EnumChildWindows(parent, HideWindowsCallback, lparam); | 658 EnumChildWindows(parent, HideWindowsCallback, lparam); |
657 } | 659 } |
658 if (::IsWindow(plugin_parent_window_)) | |
659 ::SetWindowPos(plugin_parent_window_, NULL, 0, 0, 0, 0, 0); | |
660 #endif | 660 #endif |
661 } | 661 } |
662 | 662 |
663 void RenderWidgetHostViewAura::SetSize(const gfx::Size& size) { | 663 void RenderWidgetHostViewAura::SetSize(const gfx::Size& size) { |
664 // For a SetSize operation, we don't care what coordinate system the origin | 664 // For a SetSize operation, we don't care what coordinate system the origin |
665 // of the window is in, it's only important to make sure that the origin | 665 // of the window is in, it's only important to make sure that the origin |
666 // remains constant after the operation. | 666 // remains constant after the operation. |
667 InternalSetBounds(gfx::Rect(window_->bounds().origin(), size)); | 667 InternalSetBounds(gfx::Rect(window_->bounds().origin(), size)); |
668 } | 668 } |
669 | 669 |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
868 return window_->HasFocus(); | 868 return window_->HasFocus(); |
869 } | 869 } |
870 | 870 |
871 bool RenderWidgetHostViewAura::IsSurfaceAvailableForCopy() const { | 871 bool RenderWidgetHostViewAura::IsSurfaceAvailableForCopy() const { |
872 return CanCopyToBitmap() || !!host_->GetBackingStore(false); | 872 return CanCopyToBitmap() || !!host_->GetBackingStore(false); |
873 } | 873 } |
874 | 874 |
875 void RenderWidgetHostViewAura::Show() { | 875 void RenderWidgetHostViewAura::Show() { |
876 window_->Show(); | 876 window_->Show(); |
877 WasShown(); | 877 WasShown(); |
| 878 #if defined(OS_WIN) |
| 879 if (legacy_render_widget_host_HWND_) |
| 880 legacy_render_widget_host_HWND_->Show(); |
| 881 #endif |
878 } | 882 } |
879 | 883 |
880 void RenderWidgetHostViewAura::Hide() { | 884 void RenderWidgetHostViewAura::Hide() { |
881 window_->Hide(); | 885 window_->Hide(); |
882 WasHidden(); | 886 WasHidden(); |
| 887 #if defined(OS_WIN) |
| 888 if (legacy_render_widget_host_HWND_) |
| 889 legacy_render_widget_host_HWND_->Hide(); |
| 890 #endif |
883 } | 891 } |
884 | 892 |
885 bool RenderWidgetHostViewAura::IsShowing() { | 893 bool RenderWidgetHostViewAura::IsShowing() { |
886 return window_->IsVisible(); | 894 return window_->IsVisible(); |
887 } | 895 } |
888 | 896 |
889 gfx::Rect RenderWidgetHostViewAura::GetViewBounds() const { | 897 gfx::Rect RenderWidgetHostViewAura::GetViewBounds() const { |
890 // This is the size that we want the renderer to produce. While we're waiting | 898 // This is the size that we want the renderer to produce. While we're waiting |
891 // for the correct frame (i.e. during a resize), don't change the size so that | 899 // for the correct frame (i.e. during a resize), don't change the size so that |
892 // we don't pipeline more resizes than we can handle. | 900 // we don't pipeline more resizes than we can handle. |
(...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1214 // a Window::SetBoundsInternal call. | 1222 // a Window::SetBoundsInternal call. |
1215 if (!in_bounds_changed_) | 1223 if (!in_bounds_changed_) |
1216 window_->SetBounds(rect); | 1224 window_->SetBounds(rect); |
1217 host_->WasResized(); | 1225 host_->WasResized(); |
1218 MaybeCreateResizeLock(); | 1226 MaybeCreateResizeLock(); |
1219 if (touch_editing_client_) { | 1227 if (touch_editing_client_) { |
1220 touch_editing_client_->OnSelectionOrCursorChanged(selection_anchor_rect_, | 1228 touch_editing_client_->OnSelectionOrCursorChanged(selection_anchor_rect_, |
1221 selection_focus_rect_); | 1229 selection_focus_rect_); |
1222 } | 1230 } |
1223 #if defined(OS_WIN) | 1231 #if defined(OS_WIN) |
1224 // Create the dummy plugin parent window which will be passed as the | 1232 // Create the legacy dummy window which corresponds to the bounds of the |
1225 // container window to windowless plugins. | 1233 // webcontents. This will be passed as the container window for windowless |
| 1234 // plugins. |
1226 // Plugins like Flash assume the container window which is returned via the | 1235 // Plugins like Flash assume the container window which is returned via the |
1227 // NPNVnetscapeWindow property corresponds to the bounds of the webpage. | 1236 // NPNVnetscapeWindow property corresponds to the bounds of the webpage. |
1228 // This is not true in Aura where we have only HWND which is the main Aura | 1237 // This is not true in Aura where we have only HWND which is the main Aura |
1229 // window. If we return this window to plugins like Flash then it causes the | 1238 // window. If we return this window to plugins like Flash then it causes the |
1230 // coordinate translations done by these plugins to break. | 1239 // coordinate translations done by these plugins to break. |
1231 if (!plugin_parent_window_ && GetNativeViewId()) { | 1240 // Additonally the legacy dummy window is needed for accessibility and for |
1232 plugin_parent_window_ = ::CreateWindowEx( | 1241 // scrolling to work in legacy drivers for trackpoints/trackpads, etc. |
1233 0, L"Static", NULL, WS_CHILDWINDOW, 0, 0, 0, 0, | 1242 if (GetNativeViewId()) { |
1234 reinterpret_cast<HWND>(GetNativeViewId()), NULL, NULL, NULL); | 1243 if (!legacy_render_widget_host_HWND_) { |
1235 if (::IsWindow(plugin_parent_window_)) | 1244 legacy_render_widget_host_HWND_ = new LegacyRenderWidgetHostHWND( |
1236 ::SetProp(plugin_parent_window_, content::kPluginDummyParentProperty, | 1245 reinterpret_cast<HWND>(GetNativeViewId())); |
1237 reinterpret_cast<HANDLE>(true)); | 1246 } |
1238 } | 1247 if (::IsWindow(legacy_render_widget_host_HWND_->hwnd())) { |
1239 if (::IsWindow(plugin_parent_window_)) { | 1248 gfx::Rect window_bounds = window_->GetBoundsInRootWindow(); |
1240 gfx::Rect window_bounds = window_->GetBoundsInRootWindow(); | 1249 ::SetWindowPos(legacy_render_widget_host_HWND_->hwnd(), NULL, |
1241 ::SetWindowPos(plugin_parent_window_, NULL, window_bounds.x(), | 1250 window_bounds.x(), window_bounds.y(), |
1242 window_bounds.y(), window_bounds.width(), | 1251 window_bounds.width(), window_bounds.height(), 0); |
1243 window_bounds.height(), 0); | 1252 } |
1244 } | 1253 } |
1245 #endif | 1254 #endif |
1246 } | 1255 } |
1247 | 1256 |
1248 void RenderWidgetHostViewAura::CheckResizeLock() { | 1257 void RenderWidgetHostViewAura::CheckResizeLock() { |
1249 if (!resize_lock_ || resize_lock_->expected_size() != current_frame_size_) | 1258 if (!resize_lock_ || resize_lock_->expected_size() != current_frame_size_) |
1250 return; | 1259 return; |
1251 | 1260 |
1252 // Since we got the size we were looking for, unlock the compositor. But delay | 1261 // Since we got the size we were looking for, unlock the compositor. But delay |
1253 // the release of the lock until we've kicked a frame with the new texture, to | 1262 // the release of the lock until we've kicked a frame with the new texture, to |
(...skipping 448 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1702 void RenderWidgetHostViewAura::SetParentNativeViewAccessible( | 1711 void RenderWidgetHostViewAura::SetParentNativeViewAccessible( |
1703 gfx::NativeViewAccessible accessible_parent) { | 1712 gfx::NativeViewAccessible accessible_parent) { |
1704 if (GetBrowserAccessibilityManager()) { | 1713 if (GetBrowserAccessibilityManager()) { |
1705 GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerWin() | 1714 GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerWin() |
1706 ->set_parent_iaccessible(accessible_parent); | 1715 ->set_parent_iaccessible(accessible_parent); |
1707 } | 1716 } |
1708 } | 1717 } |
1709 | 1718 |
1710 gfx::NativeViewId RenderWidgetHostViewAura::GetParentForWindowlessPlugin() | 1719 gfx::NativeViewId RenderWidgetHostViewAura::GetParentForWindowlessPlugin() |
1711 const { | 1720 const { |
1712 return reinterpret_cast<gfx::NativeViewId>(plugin_parent_window_); | 1721 if (legacy_render_widget_host_HWND_) { |
| 1722 return reinterpret_cast<gfx::NativeViewId>( |
| 1723 legacy_render_widget_host_HWND_->hwnd()); |
| 1724 } |
| 1725 return NULL; |
1713 } | 1726 } |
1714 #endif | 1727 #endif |
1715 | 1728 |
1716 void RenderWidgetHostViewAura::BuffersSwapped( | 1729 void RenderWidgetHostViewAura::BuffersSwapped( |
1717 const gfx::Size& surface_size, | 1730 const gfx::Size& surface_size, |
1718 const gfx::Rect& damage_rect, | 1731 const gfx::Rect& damage_rect, |
1719 float surface_scale_factor, | 1732 float surface_scale_factor, |
1720 const std::string& mailbox_name, | 1733 const std::string& mailbox_name, |
1721 const std::vector<ui::LatencyInfo>& latency_info, | 1734 const std::vector<ui::LatencyInfo>& latency_info, |
1722 const BufferPresentedCallback& ack_callback) { | 1735 const BufferPresentedCallback& ack_callback) { |
(...skipping 480 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2203 return; | 2216 return; |
2204 HWND hwnd = dispatcher->host()->GetAcceleratedWidget(); | 2217 HWND hwnd = dispatcher->host()->GetAcceleratedWidget(); |
2205 | 2218 |
2206 // The accessible_parent may be NULL at this point. The WebContents will pass | 2219 // The accessible_parent may be NULL at this point. The WebContents will pass |
2207 // it down to this instance (by way of the RenderViewHost and | 2220 // it down to this instance (by way of the RenderViewHost and |
2208 // RenderWidgetHost) when it is known. This instance will then set it on its | 2221 // RenderWidgetHost) when it is known. This instance will then set it on its |
2209 // BrowserAccessibilityManager. | 2222 // BrowserAccessibilityManager. |
2210 gfx::NativeViewAccessible accessible_parent = | 2223 gfx::NativeViewAccessible accessible_parent = |
2211 host_->GetParentNativeViewAccessible(); | 2224 host_->GetParentNativeViewAccessible(); |
2212 | 2225 |
2213 BrowserAccessibilityManager* manager = new BrowserAccessibilityManagerWin( | 2226 BrowserAccessibilityManager* manager = new BrowserAccessibilityManagerWin( |
2214 hwnd, accessible_parent, | 2227 legacy_render_widget_host_HWND_, accessible_parent, |
2215 BrowserAccessibilityManagerWin::GetEmptyDocument(), this); | 2228 BrowserAccessibilityManagerWin::GetEmptyDocument(), this); |
2216 #else | 2229 #else |
2217 BrowserAccessibilityManager* manager = BrowserAccessibilityManager::Create( | 2230 BrowserAccessibilityManager* manager = BrowserAccessibilityManager::Create( |
2218 BrowserAccessibilityManager::GetEmptyDocument(), this); | 2231 BrowserAccessibilityManager::GetEmptyDocument(), this); |
2219 #endif | 2232 #endif |
2220 | 2233 |
2221 SetBrowserAccessibilityManager(manager); | 2234 SetBrowserAccessibilityManager(manager); |
2222 } | 2235 } |
2223 | 2236 |
2224 gfx::GLSurfaceHandle RenderWidgetHostViewAura::GetCompositingSurface() { | 2237 gfx::GLSurfaceHandle RenderWidgetHostViewAura::GetCompositingSurface() { |
(...skipping 1110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3335 // destroyed, as it may then outlive the GLHelper. | 3348 // destroyed, as it may then outlive the GLHelper. |
3336 for (std::set<OwnedMailbox*>::iterator it = | 3349 for (std::set<OwnedMailbox*>::iterator it = |
3337 active_frame_subscriber_textures_.begin(); | 3350 active_frame_subscriber_textures_.begin(); |
3338 it != active_frame_subscriber_textures_.end(); | 3351 it != active_frame_subscriber_textures_.end(); |
3339 ++it) { | 3352 ++it) { |
3340 (*it)->Destroy(); | 3353 (*it)->Destroy(); |
3341 } | 3354 } |
3342 active_frame_subscriber_textures_.clear(); | 3355 active_frame_subscriber_textures_.clear(); |
3343 | 3356 |
3344 #if defined(OS_WIN) | 3357 #if defined(OS_WIN) |
3345 if (::IsWindow(plugin_parent_window_)) | 3358 legacy_render_widget_host_HWND_ = NULL; |
3346 ::DestroyWindow(plugin_parent_window_); | |
3347 #endif | 3359 #endif |
3348 } | 3360 } |
3349 | 3361 |
3350 void RenderWidgetHostViewAura::UpdateCursorIfOverSelf() { | 3362 void RenderWidgetHostViewAura::UpdateCursorIfOverSelf() { |
3351 const gfx::Point screen_point = | 3363 const gfx::Point screen_point = |
3352 gfx::Screen::GetScreenFor(GetNativeView())->GetCursorScreenPoint(); | 3364 gfx::Screen::GetScreenFor(GetNativeView())->GetCursorScreenPoint(); |
3353 aura::Window* root_window = window_->GetRootWindow(); | 3365 aura::Window* root_window = window_->GetRootWindow(); |
3354 if (!root_window) | 3366 if (!root_window) |
3355 return; | 3367 return; |
3356 | 3368 |
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3566 RenderWidgetHost* widget) { | 3578 RenderWidgetHost* widget) { |
3567 return new RenderWidgetHostViewAura(widget); | 3579 return new RenderWidgetHostViewAura(widget); |
3568 } | 3580 } |
3569 | 3581 |
3570 // static | 3582 // static |
3571 void RenderWidgetHostViewPort::GetDefaultScreenInfo(WebScreenInfo* results) { | 3583 void RenderWidgetHostViewPort::GetDefaultScreenInfo(WebScreenInfo* results) { |
3572 GetScreenInfoForWindow(results, NULL); | 3584 GetScreenInfoForWindow(results, NULL); |
3573 } | 3585 } |
3574 | 3586 |
3575 } // namespace content | 3587 } // namespace content |
OLD | NEW |