diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2017-12-18 10:25:43 +0100 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2017-12-18 10:46:46 +0100 |
commit | 90178924ee7dda26e5f9b07c21eb6b3c7b802c98 (patch) | |
tree | 47a4e72b173e5e2ad10aacbb726931f03e358e27 /src | |
parent | 168867aac8789f00adad08e574b16569084cb9cd (diff) | |
parent | 6f9ecd0a4675b0e1a7ef6851cbda7e43c05e9536 (diff) |
Merge remote-tracking branch 'origin/5.10' into dev
Change-Id: I9ddd2bdd830a862cd81dc1af5616d43e652a1c0e
Diffstat (limited to 'src')
-rw-r--r-- | src/core/browser_context_adapter.cpp | 7 | ||||
-rw-r--r-- | src/core/browser_context_qt.cpp | 3 | ||||
-rw-r--r-- | src/core/browsing_data_remover_delegate_qt.cpp | 85 | ||||
-rw-r--r-- | src/core/browsing_data_remover_delegate_qt.h | 66 | ||||
-rw-r--r-- | src/core/core_chromium.pri | 2 | ||||
-rw-r--r-- | src/core/render_widget_host_view_qt.cpp | 11 | ||||
-rw-r--r-- | src/core/surface_factory_qt.cpp | 40 | ||||
-rw-r--r-- | src/core/url_request_context_getter_qt.cpp | 18 | ||||
-rw-r--r-- | src/core/url_request_context_getter_qt.h | 2 | ||||
-rw-r--r-- | src/core/web_contents_adapter.cpp | 27 | ||||
-rw-r--r-- | src/core/web_engine_context.cpp | 7 | ||||
-rw-r--r-- | src/core/web_engine_settings.cpp | 5 | ||||
-rw-r--r-- | src/webengine/doc/src/qtwebengine-overview.qdoc | 2 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebenginepage.cpp | 3 |
14 files changed, 221 insertions, 57 deletions
diff --git a/src/core/browser_context_adapter.cpp b/src/core/browser_context_adapter.cpp index f76969c74..0f392f9f8 100644 --- a/src/core/browser_context_adapter.cpp +++ b/src/core/browser_context_adapter.cpp @@ -41,6 +41,7 @@ #include "content/browser/web_contents/web_contents_impl.h" #include "content/public/browser/browser_thread.h" +#include "content/public/browser/browsing_data_remover.h" #include "browser_context_qt.h" #include "content_client_qt.h" @@ -500,8 +501,10 @@ void BrowserContextAdapter::setHttpAcceptLanguage(const QString &httpAcceptLangu void BrowserContextAdapter::clearHttpCache() { - if (m_browserContext->url_request_getter_.get()) - m_browserContext->url_request_getter_->clearHttpCache(); + content::BrowsingDataRemover *remover = content::BrowserContext::GetBrowsingDataRemover(m_browserContext.data()); + remover->Remove(base::Time(), base::Time::Max(), + content::BrowsingDataRemover::DATA_TYPE_CACHE, + content::BrowsingDataRemover::ORIGIN_TYPE_UNPROTECTED_WEB | content::BrowsingDataRemover::ORIGIN_TYPE_PROTECTED_WEB); } void BrowserContextAdapter::setSpellCheckLanguages(const QStringList &languages) diff --git a/src/core/browser_context_qt.cpp b/src/core/browser_context_qt.cpp index 415318fe8..dd0884edb 100644 --- a/src/core/browser_context_qt.cpp +++ b/src/core/browser_context_qt.cpp @@ -40,6 +40,7 @@ #include "browser_context_qt.h" #include "browser_context_adapter.h" +#include "browsing_data_remover_delegate_qt.h" #include "download_manager_delegate_qt.h" #include "permission_manager_qt.h" #include "qtwebenginecoreglobal_p.h" @@ -184,7 +185,7 @@ content::BackgroundSyncController* BrowserContextQt::GetBackgroundSyncController content::BrowsingDataRemoverDelegate *BrowserContextQt::GetBrowsingDataRemoverDelegate() { - return nullptr; + return new BrowsingDataRemoverDelegateQt; } content::PermissionManager *BrowserContextQt::GetPermissionManager() diff --git a/src/core/browsing_data_remover_delegate_qt.cpp b/src/core/browsing_data_remover_delegate_qt.cpp new file mode 100644 index 000000000..aeb7a4884 --- /dev/null +++ b/src/core/browsing_data_remover_delegate_qt.cpp @@ -0,0 +1,85 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtWebEngine module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "browsing_data_remover_delegate_qt.h" + +#include "base/bind.h" +#include "components/web_cache/browser/web_cache_manager.h" +#include "content/public/browser/browsing_data_remover.h" + +#include <QtGlobal> + +namespace QtWebEngineCore { + +bool DoesOriginMatchEmbedderMask(int origin_type_mask, + const GURL &origin, + storage::SpecialStoragePolicy *policy) { + Q_UNUSED(origin_type_mask); + Q_UNUSED(origin); + Q_UNUSED(policy); + return true; +} + +content::BrowsingDataRemoverDelegate::EmbedderOriginTypeMatcher BrowsingDataRemoverDelegateQt::GetOriginTypeMatcher() const { + return base::Bind(&DoesOriginMatchEmbedderMask); +} + +bool BrowsingDataRemoverDelegateQt::MayRemoveDownloadHistory() const { + return true; +} + +void BrowsingDataRemoverDelegateQt::RemoveEmbedderData( + const base::Time &delete_begin, + const base::Time &delete_end, + int remove_mask, + const content::BrowsingDataFilterBuilder& filter_builder, + int origin_type_mask, + const base::Closure &callback) { + Q_UNUSED(delete_begin); + Q_UNUSED(delete_end); + Q_UNUSED(filter_builder); + Q_UNUSED(origin_type_mask); + + if (remove_mask & content::BrowsingDataRemover::DATA_TYPE_CACHE) + web_cache::WebCacheManager::GetInstance()->ClearCache(); + + callback.Run(); +} + +} // namespace QtWebEngineCore diff --git a/src/core/browsing_data_remover_delegate_qt.h b/src/core/browsing_data_remover_delegate_qt.h new file mode 100644 index 000000000..204f4e625 --- /dev/null +++ b/src/core/browsing_data_remover_delegate_qt.h @@ -0,0 +1,66 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtWebEngine module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef BROWSING_DATA_REMOVER_DELEGATE_QT_H +#define BROWSING_DATA_REMOVER_DELEGATE_QT_H + +#include "content/public/browser/browsing_data_remover_delegate.h" + +namespace QtWebEngineCore { + +class BrowsingDataRemoverDelegateQt : public content::BrowsingDataRemoverDelegate { + +public: + BrowsingDataRemoverDelegateQt() {} + ~BrowsingDataRemoverDelegateQt() override {} + + content::BrowsingDataRemoverDelegate::EmbedderOriginTypeMatcher GetOriginTypeMatcher() const override; + bool MayRemoveDownloadHistory() const override; + void RemoveEmbedderData( + const base::Time &delete_begin, + const base::Time &delete_end, + int remove_mask, + const content::BrowsingDataFilterBuilder& filter_builder, + int origin_type_mask, + const base::Closure &callback) override; +}; + +} // namespace QtWebEngineCore + +#endif // BROWSING_DATA_REMOVER_DELEGATE_QT_H diff --git a/src/core/core_chromium.pri b/src/core/core_chromium.pri index b4dbaeb4f..7a7e3ab02 100644 --- a/src/core/core_chromium.pri +++ b/src/core/core_chromium.pri @@ -42,6 +42,7 @@ SOURCES = \ browser_context_adapter.cpp \ browser_context_adapter_client.cpp \ browser_context_qt.cpp \ + browsing_data_remover_delegate_qt.cpp \ browser_message_filter_qt.cpp \ certificate_error_controller.cpp \ chromium_gpu_helper.cpp \ @@ -119,6 +120,7 @@ HEADERS = \ browser_context_adapter.h \ browser_context_adapter_client.h \ browser_context_qt.h \ + browsing_data_remover_delegate_qt.h \ browser_message_filter_qt.h \ certificate_error_controller_p.h \ certificate_error_controller.h \ diff --git a/src/core/render_widget_host_view_qt.cpp b/src/core/render_widget_host_view_qt.cpp index 762f91b3c..f0cd9c088 100644 --- a/src/core/render_widget_host_view_qt.cpp +++ b/src/core/render_widget_host_view_qt.cpp @@ -341,6 +341,10 @@ RenderWidgetHostViewQt::RenderWidgetHostViewQt(content::RenderWidgetHost* widget , m_emptyPreviousSelection(true) , m_wheelAckPending(false) { + auto* task_runner = base::ThreadTaskRunnerHandle::Get().get(); + m_beginFrameSource.reset(new cc::DelayBasedBeginFrameSource( + base::MakeUnique<cc::DelayBasedTimeSource>(task_runner))); + m_host->SetView(this); #ifndef QT_NO_ACCESSIBILITY if (isAccessibilityEnabled()) { @@ -349,10 +353,6 @@ RenderWidgetHostViewQt::RenderWidgetHostViewQt(content::RenderWidgetHost* widget content::BrowserAccessibilityStateImpl::GetInstance()->EnableAccessibility(); } #endif // QT_NO_ACCESSIBILITY - auto* task_runner = base::ThreadTaskRunnerHandle::Get().get(); - m_beginFrameSource.reset(new cc::DelayBasedBeginFrameSource( - base::MakeUnique<cc::DelayBasedTimeSource>(task_runner))); - if (GetTextInputManager()) GetTextInputManager()->AddObserver(this); @@ -1660,8 +1660,7 @@ void RenderWidgetHostViewQt::SetNeedsBeginFrames(bool needs_begin_frames) void RenderWidgetHostViewQt::updateNeedsBeginFramesInternal() { - if (!m_beginFrameSource) - return; + Q_ASSERT(m_beginFrameSource); if (m_addedFrameObserver == m_needsBeginFrames) return; diff --git a/src/core/surface_factory_qt.cpp b/src/core/surface_factory_qt.cpp index c976e8b04..8c0bd6c82 100644 --- a/src/core/surface_factory_qt.cpp +++ b/src/core/surface_factory_qt.cpp @@ -56,13 +56,10 @@ #if defined(USE_OZONE) #include <EGL/egl.h> +#include <QOpenGLContext> +#include <dlfcn.h> -#ifndef QT_LIBDIR_EGL -#define QT_LIBDIR_EGL "/usr/lib" -#endif -#ifndef QT_LIBDIR_GLES2 -#define QT_LIBDIR_GLES2 QT_LIBDIR_EGL -#endif +Q_GUI_EXPORT QOpenGLContext *qt_gl_global_share_context(); namespace QtWebEngineCore { @@ -98,29 +95,32 @@ base::NativeLibrary LoadLibrary(const base::FilePath& filename) { bool GLOzoneQt::LoadGLES2Bindings(gl::GLImplementation /*implementation*/) { - base::FilePath libEGLPath = QtWebEngineCore::toFilePath(QT_LIBDIR_EGL); - libEGLPath = libEGLPath.Append("libEGL.so.1"); - base::NativeLibrary eglLibrary = LoadLibrary(libEGLPath); - if (!eglLibrary) + base::NativeLibrary eglgles2Library = dlopen(NULL, RTLD_LAZY); + if (!eglgles2Library) { + LOG(ERROR) << "Failed to open EGL/GLES2 context " << dlerror(); return false; + } - base::FilePath libGLES2Path = QtWebEngineCore::toFilePath(QT_LIBDIR_GLES2); - libGLES2Path = libGLES2Path.Append("libGLESv2.so.2"); - base::NativeLibrary gles2Library = LoadLibrary(libGLES2Path); - if (!gles2Library) - return false; + gl::GLGetProcAddressProc get_proc_address = + reinterpret_cast<gl::GLGetProcAddressProc>( + base::GetFunctionPointerFromNativeLibrary(eglgles2Library, + "eglGetProcAddress")); + if (!get_proc_address) { + // QTBUG-63341 most likely libgles2 not linked with libegl -> fallback to qpa + if (QOpenGLContext *context = qt_gl_global_share_context()) { + get_proc_address = reinterpret_cast<gl::GLGetProcAddressProc>( + context->getProcAddress("eglGetProcAddress")); + } + } - gl::GLGetProcAddressProc get_proc_address = reinterpret_cast<gl::GLGetProcAddressProc>(base::GetFunctionPointerFromNativeLibrary(eglLibrary, "eglGetProcAddress")); if (!get_proc_address) { LOG(ERROR) << "eglGetProcAddress not found."; - base::UnloadNativeLibrary(eglLibrary); - base::UnloadNativeLibrary(gles2Library); + base::UnloadNativeLibrary(eglgles2Library); return false; } gl::SetGLGetProcAddressProc(get_proc_address); - gl::AddGLNativeLibrary(eglLibrary); - gl::AddGLNativeLibrary(gles2Library); + gl::AddGLNativeLibrary(eglgles2Library); return true; } diff --git a/src/core/url_request_context_getter_qt.cpp b/src/core/url_request_context_getter_qt.cpp index b77cd50f9..22d626e96 100644 --- a/src/core/url_request_context_getter_qt.cpp +++ b/src/core/url_request_context_getter_qt.cpp @@ -54,7 +54,6 @@ #include "net/cert/ct_log_verifier.h" #include "net/cert/ct_policy_enforcer.h" #include "net/cert/multi_log_ct_verifier.h" -#include "net/disk_cache/disk_cache.h" #include "net/dns/host_resolver.h" #include "net/dns/mapped_host_resolver.h" #include "net/extras/sqlite/sqlite_channel_id_store.h" @@ -545,23 +544,6 @@ void URLRequestContextGetterQt::generateHttpCache() m_storage->set_http_transaction_factory(std::unique_ptr<net::HttpCache>(cache)); } -void URLRequestContextGetterQt::clearHttpCache() -{ - if (m_urlRequestContext) - content::BrowserThread::PostTask(content::BrowserThread::IO, FROM_HERE, base::Bind(&URLRequestContextGetterQt::clearCurrentCacheBackend, this)); -} - -static void doomCallback(int error_code) { Q_UNUSED(error_code); } - -void URLRequestContextGetterQt::clearCurrentCacheBackend() -{ - if (m_urlRequestContext->http_transaction_factory() && m_urlRequestContext->http_transaction_factory()->GetCache()) { - disk_cache::Backend *backend = m_urlRequestContext->http_transaction_factory()->GetCache()->GetCurrentBackend(); - if (backend) - backend->DoomAllEntries(base::Bind(&doomCallback)); - } -} - void URLRequestContextGetterQt::generateJobFactory() { Q_ASSERT(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); diff --git a/src/core/url_request_context_getter_qt.h b/src/core/url_request_context_getter_qt.h index 495c9eb28..4a97a1398 100644 --- a/src/core/url_request_context_getter_qt.h +++ b/src/core/url_request_context_getter_qt.h @@ -82,7 +82,6 @@ public: void updateUserAgent(); void updateCookieStore(); void updateHttpCache(); - void clearHttpCache(); void updateJobFactory(); void updateRequestInterceptor(); @@ -97,7 +96,6 @@ private: void generateUserAgent(); void generateJobFactory(); void regenerateJobFactory(); - void clearCurrentCacheBackend(); void cancelAllUrlRequests(); net::HttpNetworkSession::Params generateNetworkSessionParams(); net::HttpNetworkSession::Context generateNetworkSessionContext(); diff --git a/src/core/web_contents_adapter.cpp b/src/core/web_contents_adapter.cpp index 515981b1b..59a917ae2 100644 --- a/src/core/web_contents_adapter.cpp +++ b/src/core/web_contents_adapter.cpp @@ -94,6 +94,7 @@ #include <QPageLayout> #include <QStringList> #include <QStyleHints> +#include <QTimer> #include <QVariant> #include <QtCore/qelapsedtimer.h> #include <QtCore/qmimedata.h> @@ -601,10 +602,28 @@ void WebContentsAdapter::load(const QWebEngineHttpRequest &request) params.extra_headers += (*it).toStdString() + ": " + request.header(*it).toStdString(); } - d->webContents->GetController().LoadURLWithParams(params); - // Follow chrome::Navigate and invalidate the URL immediately. - d->webContentsDelegate->NavigationStateChanged(d->webContents.get(), content::INVALIDATE_TYPE_URL); - focusIfNecessary(); + bool resizeNeeded = false; + if (request.url().hasFragment()) { + if (content::RenderWidgetHostView *rwhv = webContents()->GetRenderWidgetHostView()) { + const gfx::Size &viewportSize = rwhv->GetVisibleViewportSize(); + resizeNeeded = (viewportSize.width() == 0 || viewportSize.height() == 0); + } + } + + auto navigate = [this, params]() { + Q_D(WebContentsAdapter); + webContents()->GetController().LoadURLWithParams(params); + // Follow chrome::Navigate and invalidate the URL immediately. + d->webContentsDelegate->NavigationStateChanged(webContents(), content::INVALIDATE_TYPE_URL); + focusIfNecessary(); + }; + + if (resizeNeeded) { + // Schedule navigation on the event loop. + QTimer::singleShot(0, navigate); + } else { + navigate(); + } } void WebContentsAdapter::setContent(const QByteArray &data, const QString &mimeType, const QUrl &baseUrl) diff --git a/src/core/web_engine_context.cpp b/src/core/web_engine_context.cpp index d1f041c56..e7bbbb9c7 100644 --- a/src/core/web_engine_context.cpp +++ b/src/core/web_engine_context.cpp @@ -51,6 +51,7 @@ #if BUILDFLAG(ENABLE_BASIC_PRINTING) #include "chrome/browser/printing/print_job_manager.h" #endif // defined(ENABLE_BASIC_PRINTING) +#include "components/web_cache/browser/web_cache_manager.h" #include "content/browser/devtools/devtools_http_handler.h" #include "content/browser/gpu/gpu_main_thread_factory.h" #include "content/browser/renderer_host/render_process_host_impl.h" @@ -68,6 +69,7 @@ #include "content/renderer/in_process_renderer_thread.h" #include "content/utility/in_process_utility_thread.h" #include "gpu/command_buffer/service/gpu_switches.h" +#include "gpu/ipc/host/gpu_switches.h" #include "net/base/port_util.h" #include "ppapi/features/features.h" #include "ui/events/event_switches.h" @@ -343,6 +345,8 @@ WebEngineContext::WebEngineContext() parsedCommandLine->AppendSwitch(switches::kDisableAcceleratedVideoDecode); // Same problem with Pepper using OpenGL images. parsedCommandLine->AppendSwitch(switches::kDisablePepper3DImageChromium); + // Same problem with select popups. + parsedCommandLine->AppendSwitch(switches::kDisableNativeGpuMemoryBuffers); #endif #if defined(Q_OS_WIN) @@ -494,6 +498,9 @@ WebEngineContext::WebEngineContext() // first gets referenced on the IO thread. MediaCaptureDevicesDispatcher::GetInstance(); + // Initialize WebCacheManager here to ensure its subscription to render process creation events. + web_cache::WebCacheManager::GetInstance(); + base::ThreadRestrictions::SetIOAllowed(true); if (parsedCommandLine->HasSwitch(switches::kExplicitlyAllowedPorts)) { diff --git a/src/core/web_engine_settings.cpp b/src/core/web_engine_settings.cpp index 58245d760..f438091c6 100644 --- a/src/core/web_engine_settings.cpp +++ b/src/core/web_engine_settings.cpp @@ -355,9 +355,10 @@ void WebEngineSettings::applySettingsToWebPreferences(content::WebPreferences *p // Override for now prefs->touch_event_feature_detection_enabled = isTouchEventsAPIEnabled(); if (prefs->viewport_enabled) { - // We should enable viewport and viewport-meta together, but since 5.7 we - // no longer have a command-line flag for viewport-meta. + // We need to enable the viewport options together as it doesn't really work + // to enable them separately. With viewport-enabled we match Android defaults. prefs->viewport_meta_enabled = true; + prefs->shrinks_viewport_contents_to_fit = true; } // Attributes mapping. diff --git a/src/webengine/doc/src/qtwebengine-overview.qdoc b/src/webengine/doc/src/qtwebengine-overview.qdoc index e9ca573b7..904e4a551 100644 --- a/src/webengine/doc/src/qtwebengine-overview.qdoc +++ b/src/webengine/doc/src/qtwebengine-overview.qdoc @@ -89,7 +89,7 @@ \l{https://chromium.googlesource.com/chromium/src/+/master/docs/chromium_browser_vs_google_chrome.md}{overview} that is part of the documentation in the \l {Chromium Project} upstream source tree. - This version of Qt WebEngine is based on Chromium version 56.0.2924.122, with + This version of Qt WebEngine is based on Chromium version 61.0.3163.99, with additional security fixes from newer versions. \section2 Qt WebEngine Process diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp index fb7372284..3bb7f6c83 100644 --- a/src/webenginewidgets/api/qwebenginepage.cpp +++ b/src/webenginewidgets/api/qwebenginepage.cpp @@ -1365,7 +1365,8 @@ void QWebEnginePage::triggerAction(WebAction action, bool) d->adapter->inspectElementAt(menuData.position()); break; case ExitFullScreen: - d->adapter->exitFullScreen(); + // See under ViewSource, anything that can trigger a delete of the current view is dangerous to call directly here. + QTimer::singleShot(0, this, [d](){ d->adapter->exitFullScreen(); }); break; case RequestClose: d->adapter->requestClose(); |