summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2019-03-21 11:19:09 +0100
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2019-03-21 11:53:14 +0000
commitc8d11a21c648e87f3560042e1c022f031a6e6519 (patch)
treed8885fb28dd423258abc4eeadbdd7157c7b5c6c5
parent01c763c83d0c846164dcb5b69b9343e6ee2ac0b7 (diff)
Fixup focus implementation
Follow the other implementation and pass TakeFocus to WebContents Delegate, and hook to our UI from there. Also fixes use of Blur instead of LostFocus, which means we now render unfocused more correctly. Change-Id: I34a1882489bc68b9ff36ed5139af0ee8a3a95b79 Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
-rw-r--r--src/core/render_widget_host_view_qt.cpp4
-rw-r--r--src/core/web_contents_adapter_client.h2
-rw-r--r--src/core/web_contents_delegate_qt.cpp6
-rw-r--r--src/core/web_contents_delegate_qt.h1
-rw-r--r--src/core/web_contents_view_qt.cpp40
-rw-r--r--src/core/web_contents_view_qt.h23
-rw-r--r--src/webengine/api/qquickwebengineview.cpp8
-rw-r--r--src/webengine/api/qquickwebengineview_p_p.h2
-rw-r--r--src/webenginewidgets/api/qwebenginepage.cpp5
-rw-r--r--src/webenginewidgets/api/qwebenginepage_p.h2
10 files changed, 61 insertions, 32 deletions
diff --git a/src/core/render_widget_host_view_qt.cpp b/src/core/render_widget_host_view_qt.cpp
index 40ed75973..c6db88658 100644
--- a/src/core/render_widget_host_view_qt.cpp
+++ b/src/core/render_widget_host_view_qt.cpp
@@ -1124,7 +1124,7 @@ void RenderWidgetHostViewQt::closePopup()
// (hiding the widget and automatic memory cleanup via
// RenderWidget::CloseWidgetSoon() -> RenderWidgetHostImpl::ShutdownAndDestroyWidget(true).
host()->SetActive(false);
- host()->Blur();
+ host()->LostFocus();
}
void RenderWidgetHostViewQt::ProcessAckedTouchEvent(const content::TouchEventWithLatencyInfo &touch, content::InputEventAckState ack_result) {
@@ -1644,7 +1644,7 @@ void RenderWidgetHostViewQt::handleFocusEvent(QFocusEvent *ev)
ev->accept();
} else if (ev->lostFocus()) {
host()->SetActive(false);
- host()->Blur();
+ host()->LostFocus();
ev->accept();
}
}
diff --git a/src/core/web_contents_adapter_client.h b/src/core/web_contents_adapter_client.h
index 28be33c23..75d010865 100644
--- a/src/core/web_contents_adapter_client.h
+++ b/src/core/web_contents_adapter_client.h
@@ -446,7 +446,7 @@ public:
virtual void didFindText(quint64 requestId, int matchCount) = 0;
virtual void didPrintPage(quint64 requestId, const QByteArray &result) = 0;
virtual void didPrintPageToPdf(const QString &filePath, bool success) = 0;
- virtual void passOnFocus(bool reverse) = 0;
+ virtual bool passOnFocus(bool reverse) = 0;
// returns the last QObject (QWidget/QQuickItem) based object in the accessibility
// hierarchy before going into the BrowserAccessibility tree
virtual QObject *accessibilityParentObject() = 0;
diff --git a/src/core/web_contents_delegate_qt.cpp b/src/core/web_contents_delegate_qt.cpp
index 4bde93fd3..5cb94de5c 100644
--- a/src/core/web_contents_delegate_qt.cpp
+++ b/src/core/web_contents_delegate_qt.cpp
@@ -684,6 +684,12 @@ void WebContentsDelegateQt::UnregisterProtocolHandler(content::WebContents *webC
registry->RemoveHandler(handler);
}
+bool WebContentsDelegateQt::TakeFocus(content::WebContents *source, bool reverse)
+{
+ Q_UNUSED(source);
+ return m_viewClient->passOnFocus(reverse);
+}
+
FaviconManager *WebContentsDelegateQt::faviconManager()
{
return m_faviconManager.data();
diff --git a/src/core/web_contents_delegate_qt.h b/src/core/web_contents_delegate_qt.h
index 9c0f8f484..2baa1176f 100644
--- a/src/core/web_contents_delegate_qt.h
+++ b/src/core/web_contents_delegate_qt.h
@@ -127,6 +127,7 @@ public:
bool CheckMediaAccessPermission(content::RenderFrameHost* render_frame_host, const GURL& security_origin, content::MediaStreamType type) override;
void RegisterProtocolHandler(content::WebContents* web_contents, const std::string& protocol, const GURL& url, bool user_gesture) override;
void UnregisterProtocolHandler(content::WebContents* web_contents, const std::string& protocol, const GURL& url, bool user_gesture) override;
+ bool TakeFocus(content::WebContents *source, bool reverse) override;
// WebContentsObserver overrides
void RenderFrameDeleted(content::RenderFrameHost *render_frame_host) override;
diff --git a/src/core/web_contents_view_qt.cpp b/src/core/web_contents_view_qt.cpp
index 3c4465ae3..7e0275aa0 100644
--- a/src/core/web_contents_view_qt.cpp
+++ b/src/core/web_contents_view_qt.cpp
@@ -51,6 +51,7 @@
#include "content/browser/renderer_host/render_view_host_impl.h"
#include "content/browser/renderer_host/render_widget_host_impl.h"
#include "content/browser/web_contents/web_contents_impl.h"
+#include "content/public/browser/web_contents_delegate.h"
#include "content/public/common/context_menu_params.h"
#include <ui/gfx/image/image_skia.h>
@@ -128,6 +129,22 @@ void WebContentsViewQt::SetInitialFocus()
Focus();
}
+void WebContentsViewQt::FocusThroughTabTraversal(bool reverse)
+{
+ content::WebContentsImpl *web_contents = static_cast<content::WebContentsImpl*>(m_webContents);
+ if (web_contents->ShowingInterstitialPage()) {
+ web_contents->GetInterstitialPage()->FocusThroughTabTraversal(reverse);
+ return;
+ }
+ content::RenderWidgetHostView *fullscreen_view = web_contents->GetFullscreenRenderWidgetHostView();
+ if (fullscreen_view) {
+ fullscreen_view->Focus();
+ return;
+ }
+ web_contents->GetRenderViewHost()->SetInitialFocus(reverse);
+}
+
+
ASSERT_ENUMS_MATCH(WebEngineContextMenuData::MediaTypeNone, blink::WebContextMenuData::kMediaTypeNone)
ASSERT_ENUMS_MATCH(WebEngineContextMenuData::MediaTypeImage, blink::WebContextMenuData::kMediaTypeImage)
ASSERT_ENUMS_MATCH(WebEngineContextMenuData::MediaTypeVideo, blink::WebContextMenuData::kMediaTypeVideo)
@@ -247,25 +264,22 @@ void WebContentsViewQt::UpdateDragCursor(blink::WebDragOperation dragOperation)
#endif // QT_CONFIG(draganddrop)
}
-void WebContentsViewQt::TakeFocus(bool reverse)
+void WebContentsViewQt::GotFocus(content::RenderWidgetHostImpl* render_widget_host)
{
- m_client->passOnFocus(reverse);
+ content::WebContentsImpl *web_contents = static_cast<content::WebContentsImpl*>(m_webContents);
+ web_contents->NotifyWebContentsFocused(render_widget_host);
}
-void WebContentsViewQt::FocusThroughTabTraversal(bool reverse)
+void WebContentsViewQt::LostFocus(content::RenderWidgetHostImpl* render_widget_host)
{
content::WebContentsImpl *web_contents = static_cast<content::WebContentsImpl*>(m_webContents);
- if (web_contents->ShowingInterstitialPage()) {
- web_contents->GetInterstitialPage()->FocusThroughTabTraversal(reverse);
- return;
- }
- content::RenderWidgetHostView *fullscreen_view = web_contents->GetFullscreenRenderWidgetHostView();
- if (fullscreen_view) {
- fullscreen_view->Focus();
- return;
- }
- web_contents->GetRenderViewHost()->SetInitialFocus(reverse);
+ web_contents->NotifyWebContentsLostFocus(render_widget_host);
}
+void WebContentsViewQt::TakeFocus(bool reverse)
+{
+ if (m_webContents->GetDelegate())
+ m_webContents->GetDelegate()->TakeFocus(m_webContents, reverse);
+}
} // namespace QtWebEngineCore
diff --git a/src/core/web_contents_view_qt.h b/src/core/web_contents_view_qt.h
index d1a2ff81e..7036907c5 100644
--- a/src/core/web_contents_view_qt.h
+++ b/src/core/web_contents_view_qt.h
@@ -69,6 +69,7 @@ public:
void initialize(WebContentsAdapterClient* client);
WebContentsAdapterClient *client() { return m_client; }
+ // content::WebContentsView overrides:
content::RenderWidgetHostViewBase *CreateViewForWidget(content::RenderWidgetHost* render_widget_host, bool is_guest_view_hack) override;
void CreateView(const gfx::Size& initial_size, gfx::NativeView context) override;
@@ -107,6 +108,16 @@ public:
gfx::Rect GetViewBounds() const override { QT_NOT_YET_IMPLEMENTED return gfx::Rect(); }
+ void FocusThroughTabTraversal(bool reverse) override;
+
+#if defined(OS_MACOSX)
+ void SetAllowOtherViews(bool allow) override { m_allowOtherViews = allow; }
+ bool GetAllowOtherViews() const override { return m_allowOtherViews; }
+ void CloseTabAfterEventTracking() override { QT_NOT_YET_IMPLEMENTED }
+ bool IsEventTracking() const override { QT_NOT_YET_IMPLEMENTED; return false; }
+#endif // defined(OS_MACOSX)
+
+ // content::RenderViewHostDelegateView overrides:
void StartDragging(const content::DropData& drop_data, blink::WebDragOperationsMask allowed_ops,
const gfx::ImageSkia& image, const gfx::Vector2d& image_offset,
const content::DragEventSourceInfo& event_info,
@@ -116,18 +127,10 @@ public:
void ShowContextMenu(content::RenderFrameHost *, const content::ContextMenuParams &params) override;
+ void GotFocus(content::RenderWidgetHostImpl *render_widget_host) override;
+ void LostFocus(content::RenderWidgetHostImpl *render_widget_host) override;
void TakeFocus(bool reverse) override;
- void FocusThroughTabTraversal(bool reverse) override;
-
-
-#if defined(OS_MACOSX)
- void SetAllowOtherViews(bool allow) override { m_allowOtherViews = allow; }
- bool GetAllowOtherViews() const override { return m_allowOtherViews; }
- void CloseTabAfterEventTracking() override { QT_NOT_YET_IMPLEMENTED }
- bool IsEventTracking() const override { QT_NOT_YET_IMPLEMENTED; return false; }
-#endif // defined(OS_MACOSX)
-
private:
content::WebContents *m_webContents;
WebContentsAdapterClient *m_client;
diff --git a/src/webengine/api/qquickwebengineview.cpp b/src/webengine/api/qquickwebengineview.cpp
index 53f12fa97..fd3cc8e82 100644
--- a/src/webengine/api/qquickwebengineview.cpp
+++ b/src/webengine/api/qquickwebengineview.cpp
@@ -333,12 +333,16 @@ void QQuickWebEngineViewPrivate::runFileChooser(QSharedPointer<FilePickerControl
ui()->showFilePicker(controller);
}
-void QQuickWebEngineViewPrivate::passOnFocus(bool reverse)
+bool QQuickWebEngineViewPrivate::passOnFocus(bool reverse)
{
Q_Q(QQuickWebEngineView);
// The child delegate currently has focus, find the next one from there and give it focus.
QQuickItem *next = q->scopedFocusItem()->nextItemInFocusChain(!reverse);
- next->forceActiveFocus(reverse ? Qt::BacktabFocusReason : Qt::TabFocusReason);
+ if (next) {
+ next->forceActiveFocus(reverse ? Qt::BacktabFocusReason : Qt::TabFocusReason);
+ return true;
+ }
+ return false;
}
void QQuickWebEngineViewPrivate::titleChanged(const QString &title)
diff --git a/src/webengine/api/qquickwebengineview_p_p.h b/src/webengine/api/qquickwebengineview_p_p.h
index bc7a05b67..3c4189fd9 100644
--- a/src/webengine/api/qquickwebengineview_p_p.h
+++ b/src/webengine/api/qquickwebengineview_p_p.h
@@ -130,7 +130,7 @@ public:
void didFindText(quint64, int) override;
void didPrintPage(quint64 requestId, const QByteArray &result) override;
void didPrintPageToPdf(const QString &filePath, bool success) override;
- void passOnFocus(bool reverse) override;
+ bool passOnFocus(bool reverse) override;
void javaScriptConsoleMessage(JavaScriptConsoleMessageLevel level, const QString& message, int lineNumber, const QString& sourceID) override;
void authenticationRequired(QSharedPointer<QtWebEngineCore::AuthenticationDialogController>) override;
void runMediaAccessPermissionRequest(const QUrl &securityOrigin, MediaRequestFlags requestFlags) override;
diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp
index fae34ae8d..63863ab34 100644
--- a/src/webenginewidgets/api/qwebenginepage.cpp
+++ b/src/webenginewidgets/api/qwebenginepage.cpp
@@ -522,10 +522,11 @@ void QWebEnginePagePrivate::didPrintPage(quint64 requestId, const QByteArray &re
#endif
}
-void QWebEnginePagePrivate::passOnFocus(bool reverse)
+bool QWebEnginePagePrivate::passOnFocus(bool reverse)
{
if (view)
- view->focusNextPrevChild(!reverse);
+ return view->focusNextPrevChild(!reverse);
+ return false;
}
void QWebEnginePagePrivate::authenticationRequired(QSharedPointer<AuthenticationDialogController> controller)
diff --git a/src/webenginewidgets/api/qwebenginepage_p.h b/src/webenginewidgets/api/qwebenginepage_p.h
index a50a1972a..25ed89371 100644
--- a/src/webenginewidgets/api/qwebenginepage_p.h
+++ b/src/webenginewidgets/api/qwebenginepage_p.h
@@ -126,7 +126,7 @@ public:
void didFindText(quint64 requestId, int matchCount) override;
void didPrintPage(quint64 requestId, const QByteArray &result) override;
void didPrintPageToPdf(const QString &filePath, bool success) override;
- void passOnFocus(bool reverse) override;
+ bool passOnFocus(bool reverse) override;
void javaScriptConsoleMessage(JavaScriptConsoleMessageLevel level, const QString& message, int lineNumber, const QString& sourceID) override;
void authenticationRequired(QSharedPointer<QtWebEngineCore::AuthenticationDialogController>) override;
void releaseProfile() override;