diff options
Diffstat (limited to 'content/browser/renderer_host')
7 files changed, 77 insertions, 2 deletions
diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc index 0f80e94..59cf26f 100644 --- a/content/browser/renderer_host/render_widget_host_impl.cc +++ b/content/browser/renderer_host/render_widget_host_impl.cc @@ -469,6 +469,12 @@ bool RenderWidgetHostImpl::OnMessageReceived(const IPC::Message &msg) { IPC_MESSAGE_HANDLER(ViewHostMsg_SelectionChanged, OnSelectionChanged) IPC_MESSAGE_HANDLER(ViewHostMsg_SelectionBoundsChanged, OnSelectionBoundsChanged) +#if defined(OS_WIN) + IPC_MESSAGE_HANDLER(ViewHostMsg_WindowlessPluginDummyWindowCreated, + OnWindowlessPluginDummyWindowCreated) + IPC_MESSAGE_HANDLER(ViewHostMsg_WindowlessPluginDummyWindowDestroyed, + OnWindowlessPluginDummyWindowDestroyed) +#endif IPC_MESSAGE_HANDLER(InputHostMsg_ImeCompositionRangeChanged, OnImeCompositionRangeChanged) IPC_MESSAGE_HANDLER(ViewHostMsg_DidFirstPaintAfterLoad, @@ -1812,6 +1818,43 @@ void RenderWidgetHostImpl::OnShowDisambiguationPopup( Send(new ViewMsg_ReleaseDisambiguationPopupBitmap(GetRoutingID(), id)); } +#if defined(OS_WIN) +void RenderWidgetHostImpl::OnWindowlessPluginDummyWindowCreated( + gfx::NativeViewId dummy_activation_window) { + HWND hwnd = reinterpret_cast<HWND>(dummy_activation_window); + + // This may happen as a result of a race condition when the plugin is going + // away. + wchar_t window_title[MAX_PATH + 1] = {0}; + if (!IsWindow(hwnd) || + !GetWindowText(hwnd, window_title, arraysize(window_title)) || + lstrcmpiW(window_title, kDummyActivationWindowName) != 0) { + return; + } + +#if defined(USE_AURA) + SetParent(hwnd, + reinterpret_cast<HWND>(view_->GetParentForWindowlessPlugin())); +#else + SetParent(hwnd, reinterpret_cast<HWND>(GetNativeViewId())); +#endif + dummy_windows_for_activation_.push_back(hwnd); +} + +void RenderWidgetHostImpl::OnWindowlessPluginDummyWindowDestroyed( + gfx::NativeViewId dummy_activation_window) { + HWND hwnd = reinterpret_cast<HWND>(dummy_activation_window); + std::list<HWND>::iterator i = dummy_windows_for_activation_.begin(); + for (; i != dummy_windows_for_activation_.end(); ++i) { + if ((*i) == hwnd) { + dummy_windows_for_activation_.erase(i); + return; + } + } + NOTREACHED() << "Unknown dummy window"; +} +#endif + void RenderWidgetHostImpl::SetIgnoreInputEvents(bool ignore_input_events) { ignore_input_events_ = ignore_input_events; } diff --git a/content/browser/renderer_host/render_widget_host_impl.h b/content/browser/renderer_host/render_widget_host_impl.h index f9600fc..6094b9b 100644 --- a/content/browser/renderer_host/render_widget_host_impl.h +++ b/content/browser/renderer_host/render_widget_host_impl.h @@ -589,6 +589,12 @@ class CONTENT_EXPORT RenderWidgetHostImpl : public RenderWidgetHost, void OnShowDisambiguationPopup(const gfx::Rect& rect_pixels, const gfx::Size& size, const cc::SharedBitmapId& id); +#if defined(OS_WIN) + void OnWindowlessPluginDummyWindowCreated( + gfx::NativeViewId dummy_activation_window); + void OnWindowlessPluginDummyWindowDestroyed( + gfx::NativeViewId dummy_activation_window); +#endif void OnSelectionChanged(const base::string16& text, uint32_t offset, const gfx::Range& range); @@ -798,6 +804,10 @@ class CONTENT_EXPORT RenderWidgetHostImpl : public RenderWidgetHost, // being sent, in which case the timer should fire). bool received_paint_after_load_; +#if defined(OS_WIN) + std::list<HWND> dummy_windows_for_activation_; +#endif + RenderWidgetHostLatencyTracker latency_tracker_; int next_browser_snapshot_id_; diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc index add56ff..b5f413f 100644 --- a/content/browser/renderer_host/render_widget_host_view_aura.cc +++ b/content/browser/renderer_host/render_widget_host_view_aura.cc @@ -1075,6 +1075,15 @@ void RenderWidgetHostViewAura::DidStopFlinging() { void RenderWidgetHostViewAura::SetParentNativeViewAccessible( gfx::NativeViewAccessible accessible_parent) { } + +gfx::NativeViewId RenderWidgetHostViewAura::GetParentForWindowlessPlugin() + const { + if (legacy_render_widget_host_HWND_) { + return reinterpret_cast<gfx::NativeViewId>( + legacy_render_widget_host_HWND_->hwnd()); + } + return NULL; +} #endif bool RenderWidgetHostViewAura::HasAcceleratedSurface( @@ -2577,8 +2586,10 @@ void RenderWidgetHostViewAura::InternalSetBounds(const gfx::Rect& rect) { delegated_frame_host_->WasResized(); #if defined(OS_WIN) // Create the legacy dummy window which corresponds to the bounds of the - // webcontents. It is needed for accessibility and for scrolling to work in - // legacy drivers for trackpoints/trackpads, etc. + // webcontents. This will be passed as the container window for windowless + // plugins. + // Additonally the legacy dummy window is needed for accessibility and for + // scrolling to work in legacy drivers for trackpoints/trackpads, etc. if (!legacy_window_destroyed_ && GetNativeViewId()) { if (!legacy_render_widget_host_HWND_) { legacy_render_widget_host_HWND_ = LegacyRenderWidgetHostHWND::Create( diff --git a/content/browser/renderer_host/render_widget_host_view_aura.h b/content/browser/renderer_host/render_widget_host_view_aura.h index 245105f..932fd37 100644 --- a/content/browser/renderer_host/render_widget_host_view_aura.h +++ b/content/browser/renderer_host/render_widget_host_view_aura.h @@ -210,6 +210,7 @@ class CONTENT_EXPORT RenderWidgetHostViewAura #if defined(OS_WIN) void SetParentNativeViewAccessible( gfx::NativeViewAccessible accessible_parent) override; + gfx::NativeViewId GetParentForWindowlessPlugin() const override; #endif // Overridden from ui::TextInputClient: diff --git a/content/browser/renderer_host/render_widget_host_view_base.h b/content/browser/renderer_host/render_widget_host_view_base.h index ff99d5f..0422f82 100644 --- a/content/browser/renderer_host/render_widget_host_view_base.h +++ b/content/browser/renderer_host/render_widget_host_view_base.h @@ -381,6 +381,10 @@ class CONTENT_EXPORT RenderWidgetHostViewBase : public RenderWidgetHostView, #if defined(OS_WIN) virtual void SetParentNativeViewAccessible( gfx::NativeViewAccessible accessible_parent) = 0; + + // Returns an HWND that's given as the parent window for windowless Flash to + // workaround crbug.com/301548. + virtual gfx::NativeViewId GetParentForWindowlessPlugin() const = 0; #endif // Add and remove observers for lifetime event notifications. The order in diff --git a/content/browser/renderer_host/render_widget_host_view_mus.cc b/content/browser/renderer_host/render_widget_host_view_mus.cc index 8b945da9..9d2d21f 100644 --- a/content/browser/renderer_host/render_widget_host_view_mus.cc +++ b/content/browser/renderer_host/render_widget_host_view_mus.cc @@ -319,6 +319,11 @@ void RenderWidgetHostViewMus::UnlockCompositingSurface() { #if defined(OS_WIN) void RenderWidgetHostViewMus::SetParentNativeViewAccessible( gfx::NativeViewAccessible accessible_parent) {} + +gfx::NativeViewId RenderWidgetHostViewMus::GetParentForWindowlessPlugin() + const { + return gfx::NativeViewId(); +} #endif } // namespace content diff --git a/content/browser/renderer_host/render_widget_host_view_mus.h b/content/browser/renderer_host/render_widget_host_view_mus.h index d63ae6e..69b1686 100644 --- a/content/browser/renderer_host/render_widget_host_view_mus.h +++ b/content/browser/renderer_host/render_widget_host_view_mus.h @@ -124,6 +124,7 @@ class CONTENT_EXPORT RenderWidgetHostViewMus : public RenderWidgetHostViewBase { #if defined(OS_WIN) void SetParentNativeViewAccessible( gfx::NativeViewAccessible accessible_parent) override; + gfx::NativeViewId GetParentForWindowlessPlugin() const override; #endif RenderWidgetHostImpl* host_; |