Index: content/browser/web_contents/web_contents_view_aura.cc |
diff --git a/content/browser/web_contents/web_contents_view_aura.cc b/content/browser/web_contents/web_contents_view_aura.cc |
index d04508ecd4cd6cf81ba68380725524958f605a5d..b78399ff02274278f5b3c83ac4368a651f14cd2a 100644 |
--- a/content/browser/web_contents/web_contents_view_aura.cc |
+++ b/content/browser/web_contents/web_contents_view_aura.cc |
@@ -70,6 +70,10 @@ |
#include "ui/wm/public/drag_drop_client.h" |
#include "ui/wm/public/drag_drop_delegate.h" |
+#if defined(OS_WIN) |
+#include "ui/base/win/hidden_window.h" |
+#endif |
+ |
namespace content { |
WebContentsView* CreateWebContentsView( |
WebContentsImpl* web_contents, |
@@ -633,6 +637,8 @@ class WebContentsViewAura::WindowObserver |
#if defined(OS_WIN) |
if (!window->GetRootWindow()->HasObserver(this)) |
window->GetRootWindow()->AddObserver(this); |
+ view_->legacy_hwnd_->UpdateParent( |
+ window->GetHost()->GetAcceleratedWidget()); |
#endif |
} |
} |
@@ -652,6 +658,10 @@ class WebContentsViewAura::WindowObserver |
root_children[i]->RemoveObserver(this); |
} |
} |
+ |
+ // Update the legacy window's parent temporarily to the desktop window. |
+ // It will eventually get reparented to the right root. |
+ view_->legacy_hwnd_->UpdateParent(::GetDesktopWindow()); |
#endif |
} |
} |
@@ -1005,6 +1015,7 @@ void WebContentsViewAura::SizeContents(const gfx::Size& size) { |
if (bounds.size() != size) { |
bounds.set_size(size); |
window_->SetBounds(bounds); |
+ legacy_hwnd_->SetBounds(window_->GetBoundsInRootWindow()); |
} else { |
// Our size matches what we want but the renderers size may not match. |
// Pretend we were resized so that the renderers size is updated too. |
@@ -1098,6 +1109,15 @@ void WebContentsViewAura::CreateView( |
// platforms as well. |
if (delegate_) |
drag_dest_delegate_ = delegate_->GetDragDestDelegate(); |
+ |
+#if defined(OS_WIN) |
+ HWND parent_hwnd; |
+ if (context && context->GetHost()) |
+ parent_hwnd = context->GetHost()->GetAcceleratedWidget(); |
+ else |
+ parent_hwnd = ::GetDesktopWindow(); |
+ legacy_hwnd_.reset(LegacyRenderWidgetHostHWND::Create(parent_hwnd, this)); |
+#endif |
} |
RenderWidgetHostViewBase* WebContentsViewAura::CreateViewForWidget( |
@@ -1138,12 +1158,22 @@ RenderWidgetHostViewBase* WebContentsViewAura::CreateViewForWidget( |
} |
AttachTouchEditableToRenderView(); |
+ |
+#if defined(OS_WIN) |
+ view->SetLegacyRenderWidgetHostHWND(legacy_hwnd_.get()); |
+#endif |
+ |
return view; |
} |
RenderWidgetHostViewBase* WebContentsViewAura::CreateViewForPopupWidget( |
RenderWidgetHost* render_widget_host) { |
- return new RenderWidgetHostViewAura(render_widget_host); |
+ RenderWidgetHostViewAura* view = |
+ new RenderWidgetHostViewAura(render_widget_host); |
+#if defined(OS_WIN) |
+ view->SetLegacyRenderWidgetHostHWND(legacy_hwnd_.get()); |
+#endif |
+ return view; |
} |
void WebContentsViewAura::SetPageTitle(const base::string16& title) { |
@@ -1612,6 +1642,31 @@ void WebContentsViewAura::UpdateWebContentsVisibility(bool visible) { |
if (web_contents_->should_normally_be_visible()) |
web_contents_->WasHidden(); |
} |
+ |
+#if defined(OS_WIN) |
+ if (visible) { |
+ legacy_hwnd_->UpdateParent( |
+ GetNativeView()->GetHost()->GetAcceleratedWidget()); |
+ legacy_hwnd_->SetBounds(window_->GetBoundsInRootWindow()); |
+ legacy_hwnd_->Show(); |
+ } else { |
+ // We reparent the legacy Chrome_RenderWidgetHostHWND window to the global |
+ // hidden window on the same lines as Windowed plugin windows. |
+ legacy_hwnd_->UpdateParent(ui::GetHiddenWindow()); |
+ legacy_hwnd_->Hide(); |
+ } |
+#endif |
+} |
+ |
+#if defined(OS_WIN) |
+BrowserAccessibilityManager* |
+ WebContentsViewAura::GetRootBrowserAccessibilityManager() { |
+ return web_contents_->GetRootBrowserAccessibilityManager(); |
} |
+void WebContentsViewAura::OnLegacyHwndDestroyed( |
+ LegacyRenderWidgetHostHWND* owner) { |
+} |
+#endif |
+ |
} // namespace content |