summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Bruning <michael.bruning@theqtcompany.com>2015-02-23 16:20:37 +0100
committerMichael BrĂ¼ning <michael.bruning@theqtcompany.com>2015-02-26 11:43:32 +0000
commit67aba37ab361fc117366e283365920013b8d8464 (patch)
tree61a15569cb95ca754a17399cf0a557c621d83951
parent877fe7d55036492a897d0928fe43d5df2bc6e2e5 (diff)
Forward show and hide events to PluginViews
This was causing issues with windows plugins on windows, which were always visible on top of all other widgets and not hidden correctly when the owning web view was hidden. Task-number: QTBUG-44401 Task-number: QTBUG-42588 Task-number: QTBUG-43024 Change-Id: Ie0307fa2f7b2bf59f51a76db5feef2e8446c359d Reviewed-by: Allan Sandfeld Jensen <allan.jensen@theqtcompany.com>
-rw-r--r--Source/WebCore/page/Page.cpp15
-rw-r--r--Source/WebCore/page/Page.h4
-rw-r--r--Source/WebCore/platform/qt/QWebPageClient.h1
-rw-r--r--Source/WebCore/plugins/win/PluginViewWin.cpp23
-rw-r--r--Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp7
-rw-r--r--Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.h2
-rw-r--r--Source/WebKit/qt/WidgetApi/qgraphicswebview.cpp3
-rw-r--r--Source/WebKit/qt/WidgetApi/qwebpage.cpp6
-rw-r--r--Source/WebKit/qt/WidgetApi/qwebview.cpp4
-rw-r--r--Source/WebKit/qt/WidgetSupport/PageClientQt.cpp10
-rw-r--r--Source/WebKit/qt/WidgetSupport/PageClientQt.h2
11 files changed, 71 insertions, 6 deletions
diff --git a/Source/WebCore/page/Page.cpp b/Source/WebCore/page/Page.cpp
index b4c963a4f..5319f8e0c 100644
--- a/Source/WebCore/page/Page.cpp
+++ b/Source/WebCore/page/Page.cpp
@@ -1242,6 +1242,21 @@ void Page::privateBrowsingStateChanged()
pluginViewBases[i]->privateBrowsingStateChanged(privateBrowsingEnabled);
}
+#if PLATFORM(QT)
+void Page::pluginVisibilityChanged(bool visible)
+{
+ Vector<RefPtr<PluginViewBase>, 32> pluginViewBases;
+ collectPluginViews(pluginViewBases);
+
+ for (size_t i = 0; i < pluginViewBases.size(); ++i) {
+ if (visible)
+ pluginViewBases[i]->show();
+ else
+ pluginViewBases[i]->hide();
+ }
+}
+#endif // PLATFORM(QT)
+
#if !ASSERT_DISABLED
void Page::checkSubframeCountConsistency() const
{
diff --git a/Source/WebCore/page/Page.h b/Source/WebCore/page/Page.h
index d95565ab9..0931ed7b8 100644
--- a/Source/WebCore/page/Page.h
+++ b/Source/WebCore/page/Page.h
@@ -353,6 +353,10 @@ public:
void setVisibilityState(PageVisibilityState, bool);
#endif
+#if PLATFORM(QT)
+ void pluginVisibilityChanged(bool visible);
+#endif // PLATFORM(QT)
+
void addLayoutMilestones(LayoutMilestones);
void removeLayoutMilestones(LayoutMilestones);
LayoutMilestones requestedLayoutMilestones() const { return m_requestedLayoutMilestones; }
diff --git a/Source/WebCore/platform/qt/QWebPageClient.h b/Source/WebCore/platform/qt/QWebPageClient.h
index d07907287..71ba34a19 100644
--- a/Source/WebCore/platform/qt/QWebPageClient.h
+++ b/Source/WebCore/platform/qt/QWebPageClient.h
@@ -62,6 +62,7 @@ public:
virtual QOpenGLContext* openGLContextIfAvailable() { return 0; }
virtual void setInputMethodHints(Qt::InputMethodHints hint) = 0;
+ virtual bool isViewVisible() = 0;
#ifndef QT_NO_CURSOR
inline void resetCursor()
diff --git a/Source/WebCore/plugins/win/PluginViewWin.cpp b/Source/WebCore/plugins/win/PluginViewWin.cpp
index 3fa897db8..b225673ab 100644
--- a/Source/WebCore/plugins/win/PluginViewWin.cpp
+++ b/Source/WebCore/plugins/win/PluginViewWin.cpp
@@ -345,6 +345,17 @@ static bool isWindowsMessageUserGesture(UINT message)
}
}
+static inline bool isWebViewVisible(FrameView* view)
+{
+#if PLATFORM(QT)
+ if (PlatformPageClient client = view->hostWindow()->platformPageClient())
+ return client->isViewVisible();
+ return false;
+#else
+ return true;
+#endif // PLATFORM(QT)
+}
+
static inline IntPoint contentsToNativeWindow(FrameView* view, const IntPoint& point)
{
#if PLATFORM(QT)
@@ -511,9 +522,10 @@ void PluginView::show()
{
setSelfVisible(true);
- if (isParentVisible() && platformPluginWidget())
+ if (isParentVisible() && platformPluginWidget()) {
ShowWindow(platformPluginWidget(), SW_SHOWNA);
-
+ forceRedraw();
+ }
Widget::show();
}
@@ -819,9 +831,10 @@ void PluginView::setParentVisible(bool visible)
Widget::setParentVisible(visible);
if (isSelfVisible() && platformPluginWidget()) {
- if (visible)
+ if (visible) {
ShowWindow(platformPluginWidget(), SW_SHOWNA);
- else
+ forceRedraw();
+ } else
ShowWindow(platformPluginWidget(), SW_HIDE);
}
}
@@ -1019,7 +1032,7 @@ bool PluginView::platformStart()
#endif
DWORD flags = WS_CHILD;
- if (isSelfVisible())
+ if (isSelfVisible() && isWebViewVisible(toFrameView(parent())))
flags |= WS_VISIBLE;
HWND parentWindowHandle = windowHandleForPageClient(m_parentFrame->view()->hostWindow()->platformPageClient());
diff --git a/Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp b/Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp
index d1cf7b57d..734601ec2 100644
--- a/Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp
+++ b/Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp
@@ -345,6 +345,13 @@ QWebPageAdapter::VisibilityState QWebPageAdapter::visibilityState() const
#endif
}
+void QWebPageAdapter::setPluginsVisible(bool visible)
+{
+ if (!page)
+ return;
+ page->pluginVisibilityChanged(visible);
+}
+
void QWebPageAdapter::setNetworkAccessManager(QNetworkAccessManager *manager)
{
if (manager == networkManager)
diff --git a/Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.h b/Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.h
index ab07b84b2..1a26fe177 100644
--- a/Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.h
+++ b/Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.h
@@ -267,6 +267,8 @@ public:
void setVisibilityState(VisibilityState);
VisibilityState visibilityState() const;
+ void setPluginsVisible(bool visible);
+
static QWebPageAdapter* kit(WebCore::Page*);
WebCore::ViewportArguments viewportArguments() const;
void registerUndoStep(WTF::PassRefPtr<WebCore::UndoStep>);
diff --git a/Source/WebKit/qt/WidgetApi/qgraphicswebview.cpp b/Source/WebKit/qt/WidgetApi/qgraphicswebview.cpp
index a35252093..fe4a16ead 100644
--- a/Source/WebKit/qt/WidgetApi/qgraphicswebview.cpp
+++ b/Source/WebKit/qt/WidgetApi/qgraphicswebview.cpp
@@ -409,6 +409,9 @@ bool QGraphicsWebView::event(QEvent* event)
d->page->d->client->resetCursor();
}
#endif
+ if (event->type() == QEvent::Show
+ || event->type() == QEvent::Hide)
+ d->page->event(event);
}
}
return QGraphicsWidget::event(event);
diff --git a/Source/WebKit/qt/WidgetApi/qwebpage.cpp b/Source/WebKit/qt/WidgetApi/qwebpage.cpp
index 613c1ac56..5ddc5b457 100644
--- a/Source/WebKit/qt/WidgetApi/qwebpage.cpp
+++ b/Source/WebKit/qt/WidgetApi/qwebpage.cpp
@@ -2690,6 +2690,12 @@ bool QWebPage::event(QEvent *ev)
d->dynamicPropertyChangeEvent(this, static_cast<QDynamicPropertyChangeEvent*>(ev));
break;
#endif
+ case QEvent::Show:
+ d->setPluginsVisible(true);
+ break;
+ case QEvent::Hide:
+ d->setPluginsVisible(false);
+ break;
default:
return QObject::event(ev);
}
diff --git a/Source/WebKit/qt/WidgetApi/qwebview.cpp b/Source/WebKit/qt/WidgetApi/qwebview.cpp
index 1a35b325c..05cf042b0 100644
--- a/Source/WebKit/qt/WidgetApi/qwebview.cpp
+++ b/Source/WebKit/qt/WidgetApi/qwebview.cpp
@@ -703,7 +703,9 @@ bool QWebView::event(QEvent *e)
d->page->updatePositionDependentActions(event->pos());
} else
#endif // QT_NO_CONTEXTMENU
- if (e->type() == QEvent::ShortcutOverride) {
+ if (e->type() == QEvent::ShortcutOverride
+ || e->type() == QEvent::Show
+ || e->type() == QEvent::Hide) {
d->page->event(e);
#ifndef QT_NO_CURSOR
} else if (e->type() == QEvent::CursorChange) {
diff --git a/Source/WebKit/qt/WidgetSupport/PageClientQt.cpp b/Source/WebKit/qt/WidgetSupport/PageClientQt.cpp
index 8333a59cc..858290f6e 100644
--- a/Source/WebKit/qt/WidgetSupport/PageClientQt.cpp
+++ b/Source/WebKit/qt/WidgetSupport/PageClientQt.cpp
@@ -157,6 +157,11 @@ void PageClientQWidget::setWidgetVisible(Widget* widget, bool visible)
qtWidget->setVisible(visible);
}
+bool PageClientQWidget::isViewVisible()
+{
+ return view ? view->isVisible() : false;
+}
+
#if !defined(QT_NO_GRAPHICSVIEW)
PageClientQGraphicsWidget::~PageClientQGraphicsWidget()
{
@@ -343,6 +348,11 @@ QGraphicsView* PageClientQGraphicsWidget::firstGraphicsView() const
return view->scene()->views().first();
return 0;
}
+
+bool PageClientQGraphicsWidget::isViewVisible()
+{
+ return view ? view->isVisible() : false;
+}
#endif // QT_NO_GRAPHICSVIEW
} // namespace WebCore
diff --git a/Source/WebKit/qt/WidgetSupport/PageClientQt.h b/Source/WebKit/qt/WidgetSupport/PageClientQt.h
index 5db890eb5..8c7953634 100644
--- a/Source/WebKit/qt/WidgetSupport/PageClientQt.h
+++ b/Source/WebKit/qt/WidgetSupport/PageClientQt.h
@@ -83,6 +83,7 @@ public:
virtual QRectF windowRect() const;
virtual void setWidgetVisible(Widget*, bool visible);
+ virtual bool isViewVisible();
QWidget* view;
QWebPage* page;
@@ -168,6 +169,7 @@ public:
virtual bool viewResizesToContentsEnabled() const { return viewResizesToContents; }
virtual void setWidgetVisible(Widget*, bool);
+ virtual bool isViewVisible();
#if USE(TILED_BACKING_STORE)
virtual QRectF graphicsItemVisibleRect() const;