diff options
author | Peter Varga <pvarga@inf.u-szeged.hu> | 2019-05-15 10:33:07 +0200 |
---|---|---|
committer | Peter Varga <pvarga@inf.u-szeged.hu> | 2019-05-27 10:49:59 +0200 |
commit | 2c86c348d7a94f27d1e9e7a71c2435565cbe6fb5 (patch) | |
tree | 574dd43d6739aa975f8a40e150ff32946fca5899 /src/core/web_contents_delegate_qt.cpp | |
parent | e02bcb0855ebee0612cab0f3cd3f9fd494497336 (diff) |
Disable edit actions when content has no focused frame
Task-number: QTBUG-75505
Change-Id: Ia1329ff554a86e307aa7995e9af1665ea6c5e64c
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'src/core/web_contents_delegate_qt.cpp')
-rw-r--r-- | src/core/web_contents_delegate_qt.cpp | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/src/core/web_contents_delegate_qt.cpp b/src/core/web_contents_delegate_qt.cpp index 5cb94de5c..95a49f40a 100644 --- a/src/core/web_contents_delegate_qt.cpp +++ b/src/core/web_contents_delegate_qt.cpp @@ -63,6 +63,7 @@ #include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h" #include "components/web_cache/browser/web_cache_manager.h" +#include "content/browser/frame_host/render_frame_host_impl.h" #include "content/browser/renderer_host/render_widget_host_impl.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/invalidate_type.h" @@ -102,6 +103,7 @@ WebContentsDelegateQt::WebContentsDelegateQt(content::WebContents *webContents, , m_lastReceivedFindReply(0) , m_faviconManager(new FaviconManager(webContents, adapterClient)) , m_lastLoadProgress(-1) + , m_frameFocusedObserver(adapterClient) { webContents->SetDelegate(this); Observe(webContents); @@ -253,11 +255,30 @@ void WebContentsDelegateQt::HandleKeyboardEvent(content::WebContents *, const co m_viewClient->unhandledKeyEvent(reinterpret_cast<QKeyEvent *>(event.os_event)); } +void WebContentsDelegateQt::RenderFrameCreated(content::RenderFrameHost *render_frame_host) +{ + content::FrameTreeNode *node = static_cast<content::RenderFrameHostImpl *>(render_frame_host)->frame_tree_node(); + m_frameFocusedObserver.addNode(node); +} + void WebContentsDelegateQt::RenderFrameDeleted(content::RenderFrameHost *render_frame_host) { m_loadingErrorFrameList.removeOne(render_frame_host->GetRoutingID()); } +void WebContentsDelegateQt::RenderFrameHostChanged(content::RenderFrameHost *old_host, content::RenderFrameHost *new_host) +{ + if (old_host) { + content::FrameTreeNode *old_node = static_cast<content::RenderFrameHostImpl *>(old_host)->frame_tree_node(); + m_frameFocusedObserver.removeNode(old_node); + } + + if (new_host) { + content::FrameTreeNode *new_node = static_cast<content::RenderFrameHostImpl *>(new_host)->frame_tree_node(); + m_frameFocusedObserver.addNode(new_node); + } +} + void WebContentsDelegateQt::RenderViewHostChanged(content::RenderViewHost *, content::RenderViewHost *newHost) { if (newHost && newHost->GetWidget() && newHost->GetWidget()->GetView()) { @@ -704,4 +725,42 @@ WebContentsAdapter *WebContentsDelegateQt::webContentsAdapter() const return m_viewClient->webContentsAdapter(); } + +FrameFocusedObserver::FrameFocusedObserver(WebContentsAdapterClient *adapterClient) + : m_viewClient(adapterClient) +{} + +void FrameFocusedObserver::addNode(content::FrameTreeNode *node) +{ + if (m_observedNodes.contains(node)) + return; + + node->AddObserver(this); + m_observedNodes.append(node); +} + +void FrameFocusedObserver::removeNode(content::FrameTreeNode *node) +{ + node->RemoveObserver(this); + m_observedNodes.removeOne(node); +} + +void FrameFocusedObserver::OnFrameTreeNodeFocused(content::FrameTreeNode *node) +{ + Q_UNUSED(node); + m_viewClient->updateEditActions(); +} + +void FrameFocusedObserver::OnFrameTreeNodeDestroyed(content::FrameTreeNode *node) +{ + m_observedNodes.removeOne(node); + m_viewClient->updateEditActions(); +} + +FrameFocusedObserver::~FrameFocusedObserver() +{ + for (content::FrameTreeNode *node : m_observedNodes) + node->RemoveObserver(this); +} + } // namespace QtWebEngineCore |