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/web_contents/web_contents_view_aura.h" | 5 #include "content/browser/web_contents/web_contents_view_aura.h" |
6 | 6 |
7 #include "base/auto_reset.h" | 7 #include "base/auto_reset.h" |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "base/files/file_util.h" | 9 #include "base/files/file_util.h" |
10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
60 #include "ui/base/dragdrop/os_exchange_data.h" | 60 #include "ui/base/dragdrop/os_exchange_data.h" |
61 #include "ui/base/hit_test.h" | 61 #include "ui/base/hit_test.h" |
62 #include "ui/compositor/layer.h" | 62 #include "ui/compositor/layer.h" |
63 #include "ui/compositor/scoped_layer_animation_settings.h" | 63 #include "ui/compositor/scoped_layer_animation_settings.h" |
64 #include "ui/events/event.h" | 64 #include "ui/events/event.h" |
65 #include "ui/events/event_utils.h" | 65 #include "ui/events/event_utils.h" |
66 #include "ui/gfx/canvas.h" | 66 #include "ui/gfx/canvas.h" |
67 #include "ui/gfx/image/image.h" | 67 #include "ui/gfx/image/image.h" |
68 #include "ui/gfx/image/image_png_rep.h" | 68 #include "ui/gfx/image/image_png_rep.h" |
69 #include "ui/gfx/image/image_skia.h" | 69 #include "ui/gfx/image/image_skia.h" |
| 70 #include "ui/gfx/native_widget_types.h" |
70 #include "ui/gfx/screen.h" | 71 #include "ui/gfx/screen.h" |
71 #include "ui/wm/public/drag_drop_client.h" | 72 #include "ui/wm/public/drag_drop_client.h" |
72 #include "ui/wm/public/drag_drop_delegate.h" | 73 #include "ui/wm/public/drag_drop_delegate.h" |
73 | 74 |
| 75 #if defined(OS_WIN) |
| 76 #include "content/browser/accessibility/browser_accessibility_manager.h" |
| 77 #include "content/browser/accessibility/browser_accessibility_win.h" |
| 78 #include "ui/base/win/hidden_window.h" |
| 79 #endif |
| 80 |
74 namespace content { | 81 namespace content { |
75 WebContentsView* CreateWebContentsView( | 82 WebContentsView* CreateWebContentsView( |
76 WebContentsImpl* web_contents, | 83 WebContentsImpl* web_contents, |
77 WebContentsViewDelegate* delegate, | 84 WebContentsViewDelegate* delegate, |
78 RenderViewHostDelegateView** render_view_host_delegate_view) { | 85 RenderViewHostDelegateView** render_view_host_delegate_view) { |
79 WebContentsViewAura* rv = new WebContentsViewAura(web_contents, delegate); | 86 WebContentsViewAura* rv = new WebContentsViewAura(web_contents, delegate); |
80 *render_view_host_delegate_view = rv; | 87 *render_view_host_delegate_view = rv; |
81 return rv; | 88 return rv; |
82 } | 89 } |
83 | 90 |
(...skipping 551 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
635 host_window_ = NULL; | 642 host_window_ = NULL; |
636 } | 643 } |
637 } | 644 } |
638 | 645 |
639 virtual void OnWindowAddedToRootWindow(aura::Window* window) override { | 646 virtual void OnWindowAddedToRootWindow(aura::Window* window) override { |
640 if (window == view_->window_) { | 647 if (window == view_->window_) { |
641 window->GetHost()->AddObserver(this); | 648 window->GetHost()->AddObserver(this); |
642 #if defined(OS_WIN) | 649 #if defined(OS_WIN) |
643 if (!window->GetRootWindow()->HasObserver(this)) | 650 if (!window->GetRootWindow()->HasObserver(this)) |
644 window->GetRootWindow()->AddObserver(this); | 651 window->GetRootWindow()->AddObserver(this); |
| 652 if (view_->legacy_hwnd_) { |
| 653 view_->legacy_hwnd_->UpdateParent( |
| 654 window->GetHost()->GetAcceleratedWidget()); |
| 655 } |
645 #endif | 656 #endif |
646 } | 657 } |
647 } | 658 } |
648 | 659 |
649 virtual void OnWindowRemovingFromRootWindow(aura::Window* window, | 660 virtual void OnWindowRemovingFromRootWindow(aura::Window* window, |
650 aura::Window* new_root) override { | 661 aura::Window* new_root) override { |
651 if (window == view_->window_) { | 662 if (window == view_->window_) { |
652 window->GetHost()->RemoveObserver(this); | 663 window->GetHost()->RemoveObserver(this); |
653 #if defined(OS_WIN) | 664 #if defined(OS_WIN) |
654 window->GetRootWindow()->RemoveObserver(this); | 665 window->GetRootWindow()->RemoveObserver(this); |
655 | 666 |
656 const aura::Window::Windows& root_children = | 667 const aura::Window::Windows& root_children = |
657 window->GetRootWindow()->children(); | 668 window->GetRootWindow()->children(); |
658 for (size_t i = 0; i < root_children.size(); ++i) { | 669 for (size_t i = 0; i < root_children.size(); ++i) { |
659 if (root_children[i] != view_->window_ && | 670 if (root_children[i] != view_->window_ && |
660 root_children[i] != host_window_) { | 671 root_children[i] != host_window_) { |
661 root_children[i]->RemoveObserver(this); | 672 root_children[i]->RemoveObserver(this); |
662 } | 673 } |
663 } | 674 } |
| 675 |
| 676 if (view_->legacy_hwnd_) |
| 677 view_->legacy_hwnd_->UpdateParent(ui::GetHiddenWindow()); |
664 #endif | 678 #endif |
665 } | 679 } |
666 } | 680 } |
667 | 681 |
668 // Overridden WindowTreeHostObserver: | 682 // Overridden WindowTreeHostObserver: |
669 virtual void OnHostMoved(const aura::WindowTreeHost* host, | 683 virtual void OnHostMoved(const aura::WindowTreeHost* host, |
670 const gfx::Point& new_origin) override { | 684 const gfx::Point& new_origin) override { |
671 TRACE_EVENT1("ui", | 685 TRACE_EVENT1("ui", |
672 "WebContentsViewAura::WindowObserver::OnHostMoved", | 686 "WebContentsViewAura::WindowObserver::OnHostMoved", |
673 "new_origin", new_origin.ToString()); | 687 "new_origin", new_origin.ToString()); |
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1010 | 1024 |
1011 void WebContentsViewAura::GetContainerBounds(gfx::Rect *out) const { | 1025 void WebContentsViewAura::GetContainerBounds(gfx::Rect *out) const { |
1012 *out = window_->GetBoundsInScreen(); | 1026 *out = window_->GetBoundsInScreen(); |
1013 } | 1027 } |
1014 | 1028 |
1015 void WebContentsViewAura::SizeContents(const gfx::Size& size) { | 1029 void WebContentsViewAura::SizeContents(const gfx::Size& size) { |
1016 gfx::Rect bounds = window_->bounds(); | 1030 gfx::Rect bounds = window_->bounds(); |
1017 if (bounds.size() != size) { | 1031 if (bounds.size() != size) { |
1018 bounds.set_size(size); | 1032 bounds.set_size(size); |
1019 window_->SetBounds(bounds); | 1033 window_->SetBounds(bounds); |
| 1034 #if defined(OS_WIN) |
| 1035 if (legacy_hwnd_) |
| 1036 legacy_hwnd_->SetBounds(window_->GetBoundsInRootWindow()); |
| 1037 #endif |
1020 } else { | 1038 } else { |
1021 // Our size matches what we want but the renderers size may not match. | 1039 // Our size matches what we want but the renderers size may not match. |
1022 // Pretend we were resized so that the renderers size is updated too. | 1040 // Pretend we were resized so that the renderers size is updated too. |
1023 SizeChangedCommon(size); | 1041 SizeChangedCommon(size); |
1024 } | 1042 } |
1025 } | 1043 } |
1026 | 1044 |
1027 void WebContentsViewAura::Focus() { | 1045 void WebContentsViewAura::Focus() { |
1028 if (web_contents_->GetInterstitialPage()) { | 1046 if (web_contents_->GetInterstitialPage()) { |
1029 web_contents_->GetInterstitialPage()->Focus(); | 1047 web_contents_->GetInterstitialPage()->Focus(); |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1106 // 1) guests do not support NPAPI plugins. | 1124 // 1) guests do not support NPAPI plugins. |
1107 // 2) guests' window bounds are supposed to come from its embedder. | 1125 // 2) guests' window bounds are supposed to come from its embedder. |
1108 if (!BrowserPluginGuest::IsGuest(web_contents_)) | 1126 if (!BrowserPluginGuest::IsGuest(web_contents_)) |
1109 window_observer_.reset(new WindowObserver(this)); | 1127 window_observer_.reset(new WindowObserver(this)); |
1110 | 1128 |
1111 // delegate_->GetDragDestDelegate() creates a new delegate on every call. | 1129 // delegate_->GetDragDestDelegate() creates a new delegate on every call. |
1112 // Hence, we save a reference to it locally. Similar model is used on other | 1130 // Hence, we save a reference to it locally. Similar model is used on other |
1113 // platforms as well. | 1131 // platforms as well. |
1114 if (delegate_) | 1132 if (delegate_) |
1115 drag_dest_delegate_ = delegate_->GetDragDestDelegate(); | 1133 drag_dest_delegate_ = delegate_->GetDragDestDelegate(); |
| 1134 |
| 1135 #if defined(OS_WIN) |
| 1136 if (context && context->GetHost()) { |
| 1137 HWND parent_hwnd = context->GetHost()->GetAcceleratedWidget(); |
| 1138 CHECK(parent_hwnd); |
| 1139 legacy_hwnd_.reset(LegacyRenderWidgetHostHWND::Create(parent_hwnd, this)); |
| 1140 } |
| 1141 #endif |
1116 } | 1142 } |
1117 | 1143 |
1118 RenderWidgetHostViewBase* WebContentsViewAura::CreateViewForWidget( | 1144 RenderWidgetHostViewBase* WebContentsViewAura::CreateViewForWidget( |
1119 RenderWidgetHost* render_widget_host, bool is_guest_view_hack) { | 1145 RenderWidgetHost* render_widget_host, bool is_guest_view_hack) { |
1120 if (render_widget_host->GetView()) { | 1146 if (render_widget_host->GetView()) { |
1121 // During testing, the view will already be set up in most cases to the | 1147 // During testing, the view will already be set up in most cases to the |
1122 // test view, so we don't want to clobber it with a real one. To verify that | 1148 // test view, so we don't want to clobber it with a real one. To verify that |
1123 // this actually is happening (and somebody isn't accidentally creating the | 1149 // this actually is happening (and somebody isn't accidentally creating the |
1124 // view twice), we check for the RVH Factory, which will be set when we're | 1150 // view twice), we check for the RVH Factory, which will be set when we're |
1125 // making special ones (which go along with the special views). | 1151 // making special ones (which go along with the special views). |
(...skipping 20 matching lines...) Expand all Loading... |
1146 // We listen to drag drop events in the newly created view's window. | 1172 // We listen to drag drop events in the newly created view's window. |
1147 aura::client::SetDragDropDelegate(view->GetNativeView(), this); | 1173 aura::client::SetDragDropDelegate(view->GetNativeView(), this); |
1148 | 1174 |
1149 if (view->overscroll_controller() && | 1175 if (view->overscroll_controller() && |
1150 (!web_contents_->GetDelegate() || | 1176 (!web_contents_->GetDelegate() || |
1151 web_contents_->GetDelegate()->CanOverscrollContent())) { | 1177 web_contents_->GetDelegate()->CanOverscrollContent())) { |
1152 InstallOverscrollControllerDelegate(view); | 1178 InstallOverscrollControllerDelegate(view); |
1153 } | 1179 } |
1154 | 1180 |
1155 AttachTouchEditableToRenderView(); | 1181 AttachTouchEditableToRenderView(); |
| 1182 |
| 1183 #if defined(OS_WIN) |
| 1184 if (legacy_hwnd_) |
| 1185 view->SetLegacyRenderWidgetHostHWND(legacy_hwnd_.get()); |
| 1186 #endif |
| 1187 |
1156 return view; | 1188 return view; |
1157 } | 1189 } |
1158 | 1190 |
1159 RenderWidgetHostViewBase* WebContentsViewAura::CreateViewForPopupWidget( | 1191 RenderWidgetHostViewBase* WebContentsViewAura::CreateViewForPopupWidget( |
1160 RenderWidgetHost* render_widget_host) { | 1192 RenderWidgetHost* render_widget_host) { |
1161 return new RenderWidgetHostViewAura(render_widget_host, false); | 1193 RenderWidgetHostViewAura* view = |
| 1194 new RenderWidgetHostViewAura(render_widget_host, false); |
| 1195 #if defined(OS_WIN) |
| 1196 if (legacy_hwnd_) |
| 1197 view->SetLegacyRenderWidgetHostHWND(legacy_hwnd_.get()); |
| 1198 #endif |
| 1199 return view; |
1162 } | 1200 } |
1163 | 1201 |
1164 void WebContentsViewAura::SetPageTitle(const base::string16& title) { | 1202 void WebContentsViewAura::SetPageTitle(const base::string16& title) { |
1165 window_->SetTitle(title); | 1203 window_->SetTitle(title); |
1166 } | 1204 } |
1167 | 1205 |
1168 void WebContentsViewAura::RenderViewCreated(RenderViewHost* host) { | 1206 void WebContentsViewAura::RenderViewCreated(RenderViewHost* host) { |
1169 } | 1207 } |
1170 | 1208 |
1171 void WebContentsViewAura::RenderViewSwappedIn(RenderViewHost* host) { | 1209 void WebContentsViewAura::RenderViewSwappedIn(RenderViewHost* host) { |
(...skipping 459 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1631 } | 1669 } |
1632 return; | 1670 return; |
1633 } | 1671 } |
1634 if (visible) { | 1672 if (visible) { |
1635 if (!web_contents_->should_normally_be_visible()) | 1673 if (!web_contents_->should_normally_be_visible()) |
1636 web_contents_->WasShown(); | 1674 web_contents_->WasShown(); |
1637 } else { | 1675 } else { |
1638 if (web_contents_->should_normally_be_visible()) | 1676 if (web_contents_->should_normally_be_visible()) |
1639 web_contents_->WasHidden(); | 1677 web_contents_->WasHidden(); |
1640 } | 1678 } |
| 1679 |
| 1680 #if defined(OS_WIN) |
| 1681 if (!legacy_hwnd_) |
| 1682 return; |
| 1683 |
| 1684 if (visible && GetNativeView() && GetNativeView()->GetHost()) { |
| 1685 legacy_hwnd_->UpdateParent( |
| 1686 GetNativeView()->GetHost()->GetAcceleratedWidget()); |
| 1687 legacy_hwnd_->SetBounds(window_->GetBoundsInRootWindow()); |
| 1688 legacy_hwnd_->Show(); |
| 1689 } else { |
| 1690 // We reparent the legacy Chrome_RenderWidgetHostHWND window to the global |
| 1691 // hidden window on the same lines as Windowed plugin windows. |
| 1692 legacy_hwnd_->UpdateParent(ui::GetHiddenWindow()); |
| 1693 legacy_hwnd_->Hide(); |
| 1694 } |
| 1695 #endif |
1641 } | 1696 } |
1642 | 1697 |
| 1698 #if defined(OS_WIN) |
| 1699 gfx::NativeViewAccessible |
| 1700 WebContentsViewAura::GetNativeViewAccessible() { |
| 1701 BrowserAccessibilityManager* manager = |
| 1702 web_contents_->GetRootBrowserAccessibilityManager(); |
| 1703 if (!manager) |
| 1704 return nullptr; |
| 1705 |
| 1706 return manager->GetRoot()->ToBrowserAccessibilityWin(); |
| 1707 } |
| 1708 #endif |
| 1709 |
1643 } // namespace content | 1710 } // namespace content |
OLD | NEW |