summaryrefslogtreecommitdiffstats
path: root/content/browser/renderer_host
diff options
context:
space:
mode:
Diffstat (limited to 'content/browser/renderer_host')
-rw-r--r--content/browser/renderer_host/render_widget_host_impl.cc43
-rw-r--r--content/browser/renderer_host/render_widget_host_impl.h10
-rw-r--r--content/browser/renderer_host/render_widget_host_view_aura.cc15
-rw-r--r--content/browser/renderer_host/render_widget_host_view_aura.h1
-rw-r--r--content/browser/renderer_host/render_widget_host_view_base.h4
-rw-r--r--content/browser/renderer_host/render_widget_host_view_mus.cc5
-rw-r--r--content/browser/renderer_host/render_widget_host_view_mus.h1
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_;