diff options
Diffstat (limited to 'src/core/api')
-rw-r--r-- | src/core/api/core_api.pro | 20 | ||||
-rw-r--r-- | src/core/api/qtbug-60565.cpp | 138 | ||||
-rw-r--r-- | src/core/api/qtbug-61521.cpp | 120 | ||||
-rw-r--r-- | src/core/api/qtwebenginecoreglobal.cpp | 157 | ||||
-rw-r--r-- | src/core/api/qwebenginecertificateerror.cpp | 194 | ||||
-rw-r--r-- | src/core/api/qwebenginecertificateerror.h | 113 | ||||
-rw-r--r-- | src/core/api/qwebengineclientcertificatestore.cpp | 4 | ||||
-rw-r--r-- | src/core/api/qwebengineclientcertificatestore.h | 11 | ||||
-rw-r--r-- | src/core/api/qwebenginecontextmenurequest.cpp | 296 | ||||
-rw-r--r-- | src/core/api/qwebenginecontextmenurequest.h | 168 | ||||
-rw-r--r-- | src/core/api/qwebenginecontextmenurequest_p.h | 93 | ||||
-rw-r--r-- | src/core/api/qwebenginecookiestore_p.h | 4 | ||||
-rw-r--r-- | src/core/api/qwebenginedownloadrequest.cpp | 680 | ||||
-rw-r--r-- | src/core/api/qwebenginedownloadrequest.h | 178 | ||||
-rw-r--r-- | src/core/api/qwebenginedownloadrequest_p.h | 100 | ||||
-rw-r--r-- | src/core/api/qwebenginehttprequest.cpp | 10 | ||||
-rw-r--r-- | src/core/api/qwebenginehttprequest.h | 6 | ||||
-rw-r--r-- | src/core/api/qwebenginesettings.cpp | 142 | ||||
-rw-r--r-- | src/core/api/qwebenginesettings.h | 154 |
19 files changed, 2236 insertions, 352 deletions
diff --git a/src/core/api/core_api.pro b/src/core/api/core_api.pro index d53fb6942..e1a716955 100644 --- a/src/core/api/core_api.pro +++ b/src/core/api/core_api.pro @@ -36,6 +36,7 @@ HEADERS = \ qwebengineclientcertificatestore.h \ qtwebenginecoreglobal.h \ qtwebenginecoreglobal_p.h \ + qwebenginecertificateerror.h \ qwebenginecookiestore.h \ qwebenginecookiestore_p.h \ qwebenginefindtextresult.h \ @@ -49,10 +50,16 @@ HEADERS = \ qwebengineurlrequestinfo_p.h \ qwebengineurlrequestjob.h \ qwebengineurlscheme.h \ - qwebengineurlschemehandler.h + qwebengineurlschemehandler.h \ + qwebenginecontextmenurequest.h \ + qwebenginecontextmenurequest_p.h \ + qwebenginedownloadrequest.h \ + qwebenginedownloadrequest_p.h \ + qwebenginesettings.h SOURCES = \ qtwebenginecoreglobal.cpp \ + qwebenginecertificateerror.cpp \ qwebengineclientcertificatestore.cpp \ qwebenginecookiestore.cpp \ qwebenginefindtextresult.cpp \ @@ -64,13 +71,10 @@ SOURCES = \ qwebengineurlrequestinfo.cpp \ qwebengineurlrequestjob.cpp \ qwebengineurlscheme.cpp \ - qwebengineurlschemehandler.cpp - -### Qt6 Remove this workaround -unix:!isEmpty(QMAKE_LFLAGS_VERSION_SCRIPT):!static { - SOURCES += qtbug-60565.cpp \ - qtbug-61521.cpp -} + qwebengineurlschemehandler.cpp \ + qwebenginecontextmenurequest.cpp \ + qwebenginedownloadrequest.cpp \ + qwebenginesettings.cpp # Chromium headers included are not remotely clean CONFIG -= warning_clean diff --git a/src/core/api/qtbug-60565.cpp b/src/core/api/qtbug-60565.cpp deleted file mode 100644 index f48a2a701..000000000 --- a/src/core/api/qtbug-60565.cpp +++ /dev/null @@ -1,138 +0,0 @@ -/**************************************************************************** -** -** 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 <new> -#include <unistd.h> - -#if defined(__LP64__) -# define SIZE_T_MANGLING "m" -#else -# define SIZE_T_MANGLING "j" -#endif - -#define SHIM_ALIAS_SYMBOL(fn) __attribute__((weak, alias(#fn))) -#define SHIM_HIDDEN __attribute__ ((visibility ("hidden"))) - -extern "C" { - -__asm__(".symver __ShimCppNew, _Znw" SIZE_T_MANGLING "@Qt_5"); -void* __ShimCppNew(size_t size) - SHIM_ALIAS_SYMBOL(ShimCppNew); - -__asm__(".symver __ShimCppDelete, _ZdlPv@Qt_5"); -void __ShimCppDelete(void* address) - SHIM_ALIAS_SYMBOL(ShimCppDelete); - -__asm__(".symver __ShimCppNewArray, _Zna" SIZE_T_MANGLING "@Qt_5"); -void* __ShimCppNewArray(size_t size) - SHIM_ALIAS_SYMBOL(ShimCppNewArray); - -__asm__(".symver __ShimCppDeleteArray, _ZdaPv@Qt_5"); -void __ShimCppDeleteArray(void* address) - SHIM_ALIAS_SYMBOL(ShimCppDeleteArray); - -__asm__(".symver __ShimCppNewNoThrow, _Znw" SIZE_T_MANGLING "RKSt9nothrow_t@Qt_5"); -void *__ShimCppNewNoThrow(size_t size, const std::nothrow_t&) noexcept - SHIM_ALIAS_SYMBOL(ShimCppNewNoThrow); - -__asm__(".symver __ShimCppNewArrayNoThrow, _Zna" SIZE_T_MANGLING "RKSt9nothrow_t@Qt_5"); -void *__ShimCppNewArrayNoThrow(size_t size, const std::nothrow_t&) noexcept - SHIM_ALIAS_SYMBOL(ShimCppNewArrayNoThrow); - -__asm__(".symver __ShimCppDeleteNoThrow, _ZdlPvRKSt9nothrow_t@Qt_5"); -void __ShimCppDeleteNoThrow(void* address, const std::nothrow_t&) noexcept - SHIM_ALIAS_SYMBOL(ShimCppDeleteNoThrow); - -__asm__(".symver __ShimCppDeleteArrayNoThrow, _ZdaPvRKSt9nothrow_t@Qt_5"); -void __ShimCppDeleteArrayNoThrow(void* address, const std::nothrow_t&) noexcept - SHIM_ALIAS_SYMBOL(ShimCppDeleteArrayNoThrow); - -static void* __shimCppNew(size_t size); -static void* __shimCppNewArray(size_t size); -static void __shimCppDelete(void *address); -static void __shimCppDeleteArray(void *address); - -SHIM_HIDDEN void* ShimCppNew(size_t size) { - return __shimCppNew(size); -} - -SHIM_HIDDEN void* ShimCppNewNoThrow(size_t size, const std::nothrow_t&) noexcept { - return __shimCppNew(size); -} - -SHIM_HIDDEN void* ShimCppNewArray(size_t size) { - return __shimCppNewArray(size); -} - -SHIM_HIDDEN void* ShimCppNewArrayNoThrow(size_t size, const std::nothrow_t&) noexcept { - return __shimCppNewArray(size); -} - -SHIM_HIDDEN void ShimCppDelete(void* address) { - __shimCppDelete(address); -} - -SHIM_HIDDEN void ShimCppDeleteNoThrow(void* address, const std::nothrow_t&) noexcept { - __shimCppDelete(address); -} - -SHIM_HIDDEN void ShimCppDeleteArray(void* address) { - __shimCppDeleteArray(address); -} - -SHIM_HIDDEN void ShimCppDeleteArrayNoThrow(void* address, const std::nothrow_t&) noexcept { - __shimCppDeleteArray(address); -} -} // extern "C" - -static void* __shimCppNew(size_t size) { - return operator new(size); -} - -static void* __shimCppNewArray(size_t size) { - return operator new[](size); -} - -static void __shimCppDelete(void* address) { - operator delete(address); -} - -static void __shimCppDeleteArray(void* address) { - operator delete[](address); -} diff --git a/src/core/api/qtbug-61521.cpp b/src/core/api/qtbug-61521.cpp deleted file mode 100644 index 002a1af22..000000000 --- a/src/core/api/qtbug-61521.cpp +++ /dev/null @@ -1,120 +0,0 @@ -/**************************************************************************** -** -** 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 <stdlib.h> -#include <malloc.h> - -#define SHIM_ALIAS_SYMBOL(fn) __attribute__((weak, alias(#fn))) -#define SHIM_SYMBOL_VERSION(fn) __asm__(".symver __" #fn "," #fn "@Qt_5") -#define SHIM_HIDDEN __attribute__ ((visibility ("hidden"))) - -extern "C" { - -SHIM_SYMBOL_VERSION(malloc); -void* __malloc(size_t size) - SHIM_ALIAS_SYMBOL(ShimMalloc); - -SHIM_SYMBOL_VERSION(free); -void __free(void* ptr) - SHIM_ALIAS_SYMBOL(ShimFree); - -SHIM_SYMBOL_VERSION(realloc); -void* __realloc(void* ptr, size_t size) - SHIM_ALIAS_SYMBOL(ShimRealloc); - -SHIM_SYMBOL_VERSION(calloc); -void* __calloc(size_t n, size_t size) - SHIM_ALIAS_SYMBOL(ShimCalloc); - -SHIM_SYMBOL_VERSION(cfree); -void __cfree(void* ptr) - SHIM_ALIAS_SYMBOL(ShimCFree); - -SHIM_SYMBOL_VERSION(memalign); -void* __memalign(size_t align, size_t s) - SHIM_ALIAS_SYMBOL(ShimMemalign); - -SHIM_SYMBOL_VERSION(valloc); -void* __valloc(size_t size) - SHIM_ALIAS_SYMBOL(ShimValloc); - -SHIM_SYMBOL_VERSION(pvalloc); -void* __pvalloc(size_t size) - SHIM_ALIAS_SYMBOL(ShimPvalloc); - -SHIM_SYMBOL_VERSION(posix_memalign); -int __posix_memalign(void** r, size_t a, size_t s) - SHIM_ALIAS_SYMBOL(ShimPosixMemalign); - -SHIM_HIDDEN void* ShimMalloc(size_t size) { - return malloc(size); -} - -SHIM_HIDDEN void ShimFree(void* ptr) { - free(ptr); -} - -SHIM_HIDDEN void* ShimRealloc(void* ptr, size_t size) { - return realloc(ptr,size); -} - -SHIM_HIDDEN void* ShimCalloc(size_t n, size_t size) { - return calloc(n,size); -} - -SHIM_HIDDEN void ShimCFree(void* ptr) { - free(ptr); -} - -SHIM_HIDDEN void* ShimMemalign(size_t align, size_t s) { - return memalign(align,s); -} - -SHIM_HIDDEN void* ShimValloc(size_t size) { - return valloc(size); -} - -SHIM_HIDDEN void* ShimPvalloc(size_t size) { - return pvalloc(size); -} - -SHIM_HIDDEN int ShimPosixMemalign(void** r, size_t a, size_t s) { - return posix_memalign(r,a,s); -} -} // extern "C" diff --git a/src/core/api/qtwebenginecoreglobal.cpp b/src/core/api/qtwebenginecoreglobal.cpp index 3c9387a10..0e0c4b63b 100644 --- a/src/core/api/qtwebenginecoreglobal.cpp +++ b/src/core/api/qtwebenginecoreglobal.cpp @@ -105,83 +105,104 @@ Q_WEBENGINECORE_PRIVATE_EXPORT void initialize() qputenv("QT_MAC_PRO_WEBENGINE_WORKAROUND", "1"); #endif // No need to override the shared context if QApplication already set one (e.g with Qt::AA_ShareOpenGLContexts). - if (qt_gl_global_share_context()) - return; + if (!qt_gl_global_share_context()) { - QCoreApplication *app = QCoreApplication::instance(); - if (!app) { - qFatal("QtWebEngine::initialize() but no core application instance."); - return; - } - - // Bail out silently if the user did not construct a QGuiApplication. - if (!qobject_cast<QGuiApplication *>(app)) - return; - - if (app->thread() != QThread::currentThread()) { - qFatal("QtWebEngine::initialize() must be called from the Qt gui thread."); - return; - } + QCoreApplication *app = QCoreApplication::instance(); + if (!app) { + qFatal("QtWebEngine::initialize() but no core application instance."); + return; + } - if (shareContext) - return; + // Bail out silently if the user did not construct a QGuiApplication. + if (!qobject_cast<QGuiApplication *>(app)) + return; - shareContext = new QOpenGLContext; - QSurfaceFormat format = QSurfaceFormat::defaultFormat(); -// format.setOption(QSurfaceFormat::ResetNotification); + if (app->thread() != QThread::currentThread()) { + qFatal("QtWebEngine::initialize() must be called from the Qt gui thread."); + return; + } -#ifdef Q_OS_MACOS - if (format == QSurfaceFormat()) { - QOpenGLContext testContext; - - // Chromium turns off OpenGL for CoreProfiles with versions < 4.1 - // The newest Mac that only supports 3.3 was released in Mid 2011, - // so it should be safe to request 4.1, but we still double check it - // works in order not to set an invalid default surface format. - format.setVersion(4, 1); - format.setProfile(QSurfaceFormat::CoreProfile); - - testContext.setFormat(format); - if (testContext.create()) { - QOffscreenSurface surface; - surface.setFormat(format); - surface.create(); - - if (testContext.makeCurrent(&surface)) { - // The Cocoa QPA integration allows sharing between OpenGL 3.2 and 4.1 contexts, - // which means even though we requested a 4.1 context, if we only get a 3.2 context, - // it will still work an Chromium will not black list it. - if (testContext.format().version() >= qMakePair(3, 2) && - testContext.format().profile() == QSurfaceFormat::CoreProfile && - !isCurrentContextSoftware()) { - QSurfaceFormat::setDefaultFormat(format); - } else { - qWarning("The available OpenGL surface format was either not version 3.2 or higher or not a Core Profile.\n" - "Chromium on macOS will fall back to software rendering in this case.\n" - "Hardware acceleration and features such as WebGL will not be available."); - format = QSurfaceFormat::defaultFormat(); - } - testContext.doneCurrent(); + if (shareContext) + return; + + shareContext = new QOpenGLContext; + QSurfaceFormat format = QSurfaceFormat::defaultFormat(); + +#if defined(Q_OS_MACOS) + if (format == QSurfaceFormat()) { + QOpenGLContext testContext; + + // Chromium turns off OpenGL for CoreProfiles with versions < 4.1 + // The newest Mac that only supports 3.3 was released in Mid 2011, + // so it should be safe to request 4.1, but we still double check it + // works in order not to set an invalid default surface format. + format.setVersion(4, 1); + format.setProfile(QSurfaceFormat::CoreProfile); + + testContext.setFormat(format); + if (testContext.create()) { + QOffscreenSurface surface; + surface.setFormat(format); + surface.create(); + + if (testContext.makeCurrent(&surface)) { + // The Cocoa QPA integration allows sharing between OpenGL 3.2 and 4.1 contexts, + // which means even though we requested a 4.1 context, if we only get a 3.2 + // context, it will still work an Chromium will not black list it. + if (testContext.format().version() >= qMakePair(3, 2) + && testContext.format().profile() == QSurfaceFormat::CoreProfile + && !isCurrentContextSoftware()) { + QSurfaceFormat::setDefaultFormat(format); + } else { + qWarning("The available OpenGL surface format was either not version 3.2 " + "or higher or not a Core Profile.\n" + "Chromium on macOS will fall back to software rendering in this " + "case.\n" + "Hardware acceleration and features such as WebGL will not be " + "available."); + format = QSurfaceFormat::defaultFormat(); + } + testContext.doneCurrent(); + } + surface.destroy(); + } + } else { + // The user explicitly requested a specific surface format that does not fit Chromium's + // requirements. Warn them about this. + if (format.version() < qMakePair(3, 2) + || format.profile() != QSurfaceFormat::CoreProfile) { + qWarning("An OpenGL surfcace format was requested that is either not version 3.2 " + "or higher or a not Core Profile.\n" + "Chromium on macOS will fall back to software rendering in this case.\n" + "Hardware acceleration and features such as WebGL will not be available."); } - surface.destroy(); - } - } else { - // The user explicitly requested a specific surface format that does not fit Chromium's requirements. Warn them about this. - if (format.version() < qMakePair(3,2) || format.profile() != QSurfaceFormat::CoreProfile) { - qWarning("An OpenGL surfcace format was requested that is either not version 3.2 or higher or a not Core Profile.\n" - "Chromium on macOS will fall back to software rendering in this case.\n" - "Hardware acceleration and features such as WebGL will not be available."); } - } #endif - shareContext->setFormat(format); - shareContext->create(); - qAddPostRoutine(deleteShareContext); - qt_gl_set_global_share_context(shareContext); + shareContext->setFormat(format); + shareContext->create(); + qAddPostRoutine(deleteShareContext); + qt_gl_set_global_share_context(shareContext); + + // Classes like QOpenGLWidget check for the attribute + app->setAttribute(Qt::AA_ShareOpenGLContexts); + } + +#if defined(Q_OS_MACOS) + // Check that the default QSurfaceFormat OpenGL profile is compatible with the global OpenGL + // shared context profile, otherwise this could lead to a nasty crash. + QSurfaceFormat sharedFormat = qt_gl_global_share_context()->format(); + QSurfaceFormat defaultFormat = QSurfaceFormat::defaultFormat(); + + if (defaultFormat.profile() != sharedFormat.profile() + && defaultFormat.profile() == QSurfaceFormat::CoreProfile + && defaultFormat.version() >= qMakePair(3, 2)) { + qFatal("QWebEngine: Default QSurfaceFormat OpenGL profile is not compatible with the " + "global shared context OpenGL profile. Please make sure you set a compatible " + "QSurfaceFormat before the QtGui application instance is created."); + } +#endif - // Classes like QOpenGLWidget check for the attribute - app->setAttribute(Qt::AA_ShareOpenGLContexts); #endif // QT_CONFIG(opengl) } } // namespace QtWebEngineCore diff --git a/src/core/api/qwebenginecertificateerror.cpp b/src/core/api/qwebenginecertificateerror.cpp new file mode 100644 index 000000000..40c9a1c7b --- /dev/null +++ b/src/core/api/qwebenginecertificateerror.cpp @@ -0,0 +1,194 @@ +/**************************************************************************** +** +** Copyright (C) 2016 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 "qwebenginecertificateerror.h" + +#include "certificate_error_controller.h" + +QT_BEGIN_NAMESPACE + +/*! + \class QWebEngineCertificateError + \brief The QWebEngineCertificateError class provides information about a certificate error. + \since 5.4 + \inmodule QtWebEngineCore + + Provides information about a certificate error. This class is used as a parameter of + QWebEnginePage::certificateError(). +*/ + +/*! \internal +*/ +QWebEngineCertificateError::QWebEngineCertificateError( + const QSharedPointer<QtWebEngineCore::CertificateErrorController> &controller) + : d(controller) +{ +} + +QWebEngineCertificateError::QWebEngineCertificateError(const QWebEngineCertificateError &) = default; + +QWebEngineCertificateError& QWebEngineCertificateError::operator=(const QWebEngineCertificateError &) = default; + +/*! \internal +*/ +QWebEngineCertificateError::~QWebEngineCertificateError() = default; + +/*! + \enum QWebEngineCertificateError::Type + + This enum describes the type of certificate error encountered. + + The values of this enum type match the SSL errors Chromium provides. + QSslError::SslError values are not used directly, because the Qt error + categories cannot be mapped to the Chromium error categories. + + \value SslPinnedKeyNotInCertificateChain The certificate did not match the built-in public keys + pinned for the host name. + \value CertificateCommonNameInvalid The certificate's common name did not match the host name. + \value CertificateDateInvalid The certificate is not valid at the current date and time. + \value CertificateAuthorityInvalid The certificate is not signed by a trusted authority. + \value CertificateContainsErrors The certificate contains errors. + \value CertificateNoRevocationMechanism The certificate has no mechanism for determining if it has been revoked. + \value CertificateUnableToCheckRevocation Revocation information for the certificate is not available. + \value CertificateRevoked The certificate has been revoked. + \value CertificateInvalid The certificate is invalid. + \value CertificateWeakSignatureAlgorithm The certificate is signed using a weak signature algorithm. + \value CertificateNonUniqueName The host name specified in the certificate is not unique. + \value CertificateWeakKey The certificate contains a weak key. + \value CertificateNameConstraintViolation The certificate claimed DNS names that are in violation of name constraints. + \value CertificateValidityTooLong The certificate has a validity period that is too long. (Added in Qt 5.7) + \value CertificateTransparencyRequired Certificate Transparency was required for this connection, but the server + did not provide CT information that complied with the policy. (Added in Qt 5.8) + \value CertificateKnownInterceptionBlocked The certificate is known to be + used for interception by an entity other the device owner. (Added in + 5.15) + \value SslObsoleteVersion The connection uses an obsolete version of SSL/TLS. (Added in Qt 6.0) +*/ + +/*! + Returns whether this error can be overridden and accepted. + + \sa error(), description() +*/ +bool QWebEngineCertificateError::isOverridable() const +{ + return d->overridable(); +} + +/*! + Returns the URL that triggered the error. + + \sa error(), description() +*/ +QUrl QWebEngineCertificateError::url() const +{ + return d->url(); +} + +/*! + Returns the type of the error. + + \sa description(), isOverridable() +*/ +QWebEngineCertificateError::Type QWebEngineCertificateError::type() const +{ + return d->error(); +} + +/*! + Returns a short localized human-readable description of the error. + + \sa error(), url(), isOverridable() +*/ +QString QWebEngineCertificateError::description() const +{ + return d->errorString(); +} + +/*! + \since 5.14 + + Marks the certificate error for delayed handling. + + This function should be called when there is a need to postpone the decision whether to accept a + certificate, for example, while waiting for user input. When called, the function pauses the + URL request until acceptCertificate() or rejectCertificate() is called. + + \note It is only possible to defer overridable certificate errors. + + \sa isOverridable(), deferred() +*/ +void QWebEngineCertificateError::defer() +{ + d->defer(); +} + +/*! + \since 5.14 + + Accepts the certificate and continues the loading of the requested URL. +*/ +void QWebEngineCertificateError::acceptCertificate() +{ + d->ignoreCertificateError(); +} + +/*! + \since 5.14 + + Rejects the certificate and aborts the loading of the requested URL. +*/ +void QWebEngineCertificateError::rejectCertificate() +{ + d->rejectCertificate(); +} + +/*! + \since 5.14 + + Returns the peer's chain of digital certificates. + + Chain starts with the peer's immediate certificate and ending with the CA's certificate. +*/ +QList<QSslCertificate> QWebEngineCertificateError::certificateChain() const +{ + return d->certificateChain(); +} + +QT_END_NAMESPACE diff --git a/src/core/api/qwebenginecertificateerror.h b/src/core/api/qwebenginecertificateerror.h new file mode 100644 index 000000000..ffcebaf9b --- /dev/null +++ b/src/core/api/qwebenginecertificateerror.h @@ -0,0 +1,113 @@ +/**************************************************************************** +** +** Copyright (C) 2016 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 QWEBENGINECERTIFICATEERROR_H +#define QWEBENGINECERTIFICATEERROR_H + +#include <QtWebEngineCore/qtwebenginecoreglobal.h> + +#include <QtCore/qsharedpointer.h> +#include <QtCore/qurl.h> +#include <QtNetwork/QSslCertificate> + +namespace QtWebEngineCore { +class WebContentsDelegateQt; +class CertificateErrorController; +} + +QT_BEGIN_NAMESPACE + +class Q_WEBENGINECORE_EXPORT QWebEngineCertificateError { + Q_GADGET + Q_PROPERTY(QUrl url READ url CONSTANT FINAL) + Q_PROPERTY(Type type READ type CONSTANT FINAL) + Q_PROPERTY(QString description READ description CONSTANT FINAL) + Q_PROPERTY(bool overridable READ isOverridable CONSTANT FINAL) + +public: + QWebEngineCertificateError(const QWebEngineCertificateError &other); + QWebEngineCertificateError& operator=(const QWebEngineCertificateError &other); + ~QWebEngineCertificateError(); + + // Keep this identical to NET_ERROR in net_error_list.h, or add mapping layer. + enum Type { + SslPinnedKeyNotInCertificateChain = -150, + CertificateCommonNameInvalid = -200, + CertificateDateInvalid = -201, + CertificateAuthorityInvalid = -202, + CertificateContainsErrors = -203, + CertificateNoRevocationMechanism = -204, + CertificateUnableToCheckRevocation = -205, + CertificateRevoked = -206, + CertificateInvalid = -207, + CertificateWeakSignatureAlgorithm = -208, + CertificateNonUniqueName = -210, + CertificateWeakKey = -211, + CertificateNameConstraintViolation = -212, + CertificateValidityTooLong = -213, + CertificateTransparencyRequired = -214, + CertificateSymantecLegacy = -215, + CertificateKnownInterceptionBlocked = -217, + SslObsoleteVersion = -218, + }; + Q_ENUM(Type) + + Type type() const; + QUrl url() const; + bool isOverridable() const; + QString description() const; + + Q_INVOKABLE void defer(); + Q_INVOKABLE void rejectCertificate(); + Q_INVOKABLE void acceptCertificate(); + + QList<QSslCertificate> certificateChain() const; + +private: + friend class QtWebEngineCore::WebContentsDelegateQt; + QWebEngineCertificateError( + const QSharedPointer<QtWebEngineCore::CertificateErrorController> &controller); + QSharedPointer<QtWebEngineCore::CertificateErrorController> d; +}; + +QT_END_NAMESPACE + +Q_DECLARE_METATYPE(QWebEngineCertificateError) + +#endif // QWEBENGINECERTIFICATEERROR_H diff --git a/src/core/api/qwebengineclientcertificatestore.cpp b/src/core/api/qwebengineclientcertificatestore.cpp index 84f273328..462a63b26 100644 --- a/src/core/api/qwebengineclientcertificatestore.cpp +++ b/src/core/api/qwebengineclientcertificatestore.cpp @@ -88,9 +88,9 @@ void QWebEngineClientCertificateStore::add(const QSslCertificate &certificate, c Returns an empty list if the store does not contain any certificates. */ -QVector<QSslCertificate> QWebEngineClientCertificateStore::certificates() const +QList<QSslCertificate> QWebEngineClientCertificateStore::certificates() const { - QVector<QSslCertificate> certificateList; + QList<QSslCertificate> certificateList; for (auto data : qAsConst(m_storeData->extraCerts)) certificateList.append(data->certificate); return certificateList; diff --git a/src/core/api/qwebengineclientcertificatestore.h b/src/core/api/qwebengineclientcertificatestore.h index a4c83bb2e..a9282f0fb 100644 --- a/src/core/api/qwebengineclientcertificatestore.h +++ b/src/core/api/qwebengineclientcertificatestore.h @@ -41,8 +41,10 @@ #define QWEBENGINECLIENTCERTIFICATESTORE_H #include <QtWebEngineCore/qtwebenginecoreglobal.h> +#include <QtNetwork/qtnetwork-config.h> -#include <QtCore/qvector.h> +#if QT_CONFIG(ssl) +#include <QtCore/qlist.h> #include <QtNetwork/qsslcertificate.h> #include <QtNetwork/qsslkey.h> @@ -53,13 +55,11 @@ class ProfileAdapter; QT_BEGIN_NAMESPACE -#if QT_CONFIG(ssl) - class Q_WEBENGINECORE_EXPORT QWebEngineClientCertificateStore { public: void add(const QSslCertificate &certificate, const QSslKey &privateKey); - QVector<QSslCertificate> certificates() const; + QList<QSslCertificate> certificates() const; void remove(const QSslCertificate &certificate); void clear(); @@ -72,8 +72,7 @@ private: QtWebEngineCore::ClientCertificateStoreData *m_storeData; }; -#endif // QT_CONFIG(ssl) - QT_END_NAMESPACE +#endif // QT_CONFIG(ssl) #endif // QWebEngineClientCertificateStore_H diff --git a/src/core/api/qwebenginecontextmenurequest.cpp b/src/core/api/qwebenginecontextmenurequest.cpp new file mode 100644 index 000000000..62a328b72 --- /dev/null +++ b/src/core/api/qwebenginecontextmenurequest.cpp @@ -0,0 +1,296 @@ +/**************************************************************************** +** +** Copyright (C) 2020 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 "qwebenginecontextmenurequest.h" +#include "qwebenginecontextmenurequest_p.h" + +QT_BEGIN_NAMESPACE + +/*! + \class QWebEngineContextMenuRequest + \since 6.0 + \brief The QWebEngineContextMenuRequest class provides request for populating or extending a context menu with actions. + + \inmodule QtWebEngineCore + + QWebEngineContextMenuRequest is returned by QWebEngineView::lastContextMenuRequest() after a context menu event, + and contains information about where the context menu event took place. This is also in the context + in which any context specific QWebEnginePage::WebAction will be performed. +*/ + +/*! + \enum QWebEngineContextMenuRequest::MediaType + \readonly + \since 6.0 + + This enum describes the media type of the context menu request if any. + + \value MediaTypeNone The context is not a media type. + \value MediaTypeImage The context is an image element. + \value MediaTypeVideo The context is a video element. + \value MediaTypeAudio The context is an audio element. + \value MediaTypeCanvas The context is a canvas element. + \value MediaTypeFile The context is a file. + \value MediaTypePlugin The context is a plugin element. +*/ + +/*! + \enum QWebEngineContextMenuRequest::EditFlag + \readonly + \since 6.0 + + The available edit operations in the current context menu request. + + \value CanUndo Undo is available. + \value CanRedo Redo is available. + \value CanCut Cut is available. + \value CanCopy Copy is available. + \value CanPaste Paste is available. + \value CanDelete Delete is available. + \value CanSelectAll Select All is available. + \value CanTranslate Translate is available. + \value CanEditRichly Context is richly editable. +*/ + +/*! + \enum QWebEngineContextMenuRequest::MediaFlag + \readonly + \since 6.0 + + The current media element's status and its available operations. + \c MediaNone if the selected web page content is not a media element. + + \value MediaInError An error occurred. + \value MediaPaused Media is paused. + \value MediaMuted Media is muted. + \value MediaLoop Media can be looped. + \value MediaCanSave Media can be saved. + \value MediaHasAudio Media has audio. + \value MediaCanToggleControls Media can show controls. + \value MediaControls Media controls are shown. + \value MediaCanPrint Media is printable. + \value MediaCanRotate Media is rotatable. +*/ + +/*! + \internal +*/ +QWebEngineContextMenuRequest::QWebEngineContextMenuRequest( + QWebEngineContextMenuRequestPrivate *request) + : d(request) +{ +} + +/*! + Destroys the context menu request. +*/ +QWebEngineContextMenuRequest::~QWebEngineContextMenuRequest() = default; + +/*! + Returns the position of the context menu request, usually the mouse + position where the context menu event was triggered. +*/ +QPoint QWebEngineContextMenuRequest::position() const +{ + return d->m_position; +} + +/*! + Returns the selected text of the context menu request. +*/ +QString QWebEngineContextMenuRequest::selectedText() const +{ + return d->m_selectedText; +} + +/*! + Returns the text of a link if the context menu request was requested for a link. +*/ +QString QWebEngineContextMenuRequest::linkText() const +{ + return d->m_linkText; +} + +/*! + Returns the URL of a link if the menu context request is a link. + It is not guaranteed to be a valid URL. +*/ +QUrl QWebEngineContextMenuRequest::linkUrl() const +{ + return d->m_unfilteredLinkUrl; +} + +/*! + If the context menu request is a media element, returns the URL of that media. +*/ +QUrl QWebEngineContextMenuRequest::mediaUrl() const +{ + return d->m_mediaUrl; +} + +/*! + Returns the type of the media element or \c MediaTypeNone + if the context menu requestis not a media element. +*/ +QWebEngineContextMenuRequest::MediaType QWebEngineContextMenuRequest::mediaType() const +{ + return static_cast<QWebEngineContextMenuRequest::MediaType>(d->m_mediaType); +} + +/*! + Returns \c true if the context menu request is editable by the user; + otherwise returns \c false. +*/ +bool QWebEngineContextMenuRequest::isContentEditable() const +{ + return d->m_isEditable; +} + +/*! + If the menu context request is a word considered misspelled by the spell-checker, + returns the misspelled word. + + For possible replacements of the word, see spellCheckerSuggestions(). +*/ +QString QWebEngineContextMenuRequest::misspelledWord() const +{ + return d->m_misspelledWord; +} + + +/*! + If the menu context request is a word considered misspelled by the spell-checker, + returns a list of suggested replacements for misspelledWord(). +*/ +QStringList QWebEngineContextMenuRequest::spellCheckerSuggestions() const +{ + return d->m_spellCheckerSuggestions; +} + +/*! + TODO: needs api in page +*/ +bool QWebEngineContextMenuRequest::isAccepted() const +{ + return d->m_accepted; +} + +/*! + TODO: needs api in page +*/ +void QWebEngineContextMenuRequest::setAccepted(bool accepted) +{ + d->m_accepted = accepted; +} + +/*! + Returns the current media element's status and its available operations. + \c MediaNone if the selected web page content is not a media element. +*/ +QWebEngineContextMenuRequest::MediaFlags QWebEngineContextMenuRequest::mediaFlags() const +{ + return static_cast<QWebEngineContextMenuRequest::MediaFlags>(d->m_mediaFlags); +} + +/*! + Returns the available edit operations in the current context + or \c CanDoNone if no actions are available. +*/ +QWebEngineContextMenuRequest::EditFlags QWebEngineContextMenuRequest::editFlags() const +{ + return static_cast<QWebEngineContextMenuRequest::EditFlags>(d->m_editFlags); +} + +/*! + \internal +*/ +QUrl QWebEngineContextMenuRequest::filteredLinkUrl() const +{ + return d->m_filteredLinkUrl; +} + +/*! + \internal +*/ +QString QWebEngineContextMenuRequest::altText() const +{ + return d->m_altText; +} + +/*! + \internal +*/ +QString QWebEngineContextMenuRequest::titleText() const +{ + return d->m_titleText; +} + +/*! + \internal +*/ +QUrl QWebEngineContextMenuRequest::referrerUrl() const +{ + return !d->m_frameUrl.isEmpty() ? d->m_frameUrl : d->m_pageUrl; +} + +/*! + \internal +*/ +QtWebEngineCore::ReferrerPolicy QWebEngineContextMenuRequest::referrerPolicy() const +{ + return d->m_referrerPolicy; +} + +/*! + \internal +*/ +QString QWebEngineContextMenuRequest::suggestedFileName() const +{ + return d->m_suggestedFileName; +} + +/*! + \internal +*/ +bool QWebEngineContextMenuRequest::hasImageContent() const +{ + return d->m_hasImageContent; +} + +QT_END_NAMESPACE diff --git a/src/core/api/qwebenginecontextmenurequest.h b/src/core/api/qwebenginecontextmenurequest.h new file mode 100644 index 000000000..bc8095dc9 --- /dev/null +++ b/src/core/api/qwebenginecontextmenurequest.h @@ -0,0 +1,168 @@ +/**************************************************************************** +** +** Copyright (C) 2020 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 QWEBENGINECONTEXTMENUREQUEST_H +#define QWEBENGINECONTEXTMENUREQUEST_H + +#include <QtWebEngineCore/qtwebenginecoreglobal.h> +#include <QtCore/QObject> +#include <QtCore/QUrl> +#include <QtCore/QPoint> +#include <QScopedPointer> + +namespace QtWebEngineCore { +class RenderViewContextMenuQt; +class WebContentsViewQt; + +// Must match blink::WebReferrerPolicy +enum class ReferrerPolicy { + Always, + Default, + NoReferrerWhenDowngrade, + Never, + Origin, + OriginWhenCrossOrigin, + NoReferrerWhenDowngradeOriginWhenCrossOrigin, + SameOrigin, + StrictOrigin, + Last = StrictOrigin, +}; +} + +QT_BEGIN_NAMESPACE + +class QWebEngineContextMenuRequestPrivate; +class Q_WEBENGINECORE_EXPORT QWebEngineContextMenuRequest : public QObject +{ + Q_OBJECT +public: + enum MediaType { + MediaTypeNone, + MediaTypeImage, + MediaTypeVideo, + MediaTypeAudio, + MediaTypeCanvas, + MediaTypeFile, + MediaTypePlugin + }; + Q_ENUM(MediaType) + + // Must match QWebEngineCore::WebEngineContextMenuData::MediaFlags: + enum MediaFlag { + MediaInError = 0x1, + MediaPaused = 0x2, + MediaMuted = 0x4, + MediaLoop = 0x8, + MediaCanSave = 0x10, + MediaHasAudio = 0x20, + MediaCanToggleControls = 0x40, + MediaControls = 0x80, + MediaCanPrint = 0x100, + MediaCanRotate = 0x200, + }; + Q_DECLARE_FLAGS(MediaFlags, MediaFlag) + Q_FLAG(MediaFlags) + + // Must match QWebEngineCore::WebEngineContextMenuData::EditFlags: + enum EditFlag { + CanUndo = 0x1, + CanRedo = 0x2, + CanCut = 0x4, + CanCopy = 0x8, + CanPaste = 0x10, + CanDelete = 0x20, + CanSelectAll = 0x40, + CanTranslate = 0x80, + CanEditRichly = 0x100, + }; + Q_DECLARE_FLAGS(EditFlags, EditFlag) + Q_FLAG(EditFlags) + + Q_PROPERTY(QPoint position READ position CONSTANT FINAL) + Q_PROPERTY(QString selectedText READ selectedText CONSTANT FINAL) + Q_PROPERTY(QString linkText READ linkText CONSTANT FINAL) + Q_PROPERTY(QUrl linkUrl READ linkUrl CONSTANT FINAL) + Q_PROPERTY(QUrl mediaUrl READ mediaUrl CONSTANT FINAL) + Q_PROPERTY(MediaType mediaType READ mediaType CONSTANT FINAL) + Q_PROPERTY(bool isContentEditable READ isContentEditable CONSTANT FINAL) + Q_PROPERTY(QString misspelledWord READ misspelledWord CONSTANT FINAL) + Q_PROPERTY(QStringList spellCheckerSuggestions READ spellCheckerSuggestions CONSTANT FINAL) + Q_PROPERTY(bool accepted READ isAccepted WRITE setAccepted FINAL) + Q_PROPERTY(MediaFlags mediaFlags READ mediaFlags CONSTANT FINAL REVISION 1) + Q_PROPERTY(EditFlags editFlags READ editFlags CONSTANT FINAL REVISION 1) + + virtual ~QWebEngineContextMenuRequest(); + QPoint position() const; + QString selectedText() const; + QString linkText() const; + QUrl linkUrl() const; + QUrl mediaUrl() const; + MediaType mediaType() const; + bool isContentEditable() const; + QString misspelledWord() const; + QStringList spellCheckerSuggestions() const; + bool isAccepted() const; + void setAccepted(bool accepted); + MediaFlags mediaFlags() const; + EditFlags editFlags() const; + +private: + QUrl filteredLinkUrl() const; + QString altText() const; + QString titleText() const; + QUrl referrerUrl() const; + QtWebEngineCore::ReferrerPolicy referrerPolicy() const; + bool hasImageContent() const; + QString suggestedFileName() const; + +private: + QWebEngineContextMenuRequest(QWebEngineContextMenuRequestPrivate *d); + QScopedPointer<QWebEngineContextMenuRequestPrivate> d; + friend class QtWebEngineCore::WebContentsViewQt; + friend class QtWebEngineCore::RenderViewContextMenuQt; + friend class QQuickWebEngineViewPrivate; + friend class QQuickWebEngineView; + friend class ContextMenuRequestJSWrapper; + friend class QWebEngineViewPrivate; + friend class QWebEnginePage; +}; + +QT_END_NAMESPACE + +#endif // QWEBENGINECONTEXTMENUREQUEST_H diff --git a/src/core/api/qwebenginecontextmenurequest_p.h b/src/core/api/qwebenginecontextmenurequest_p.h new file mode 100644 index 000000000..c7b98a871 --- /dev/null +++ b/src/core/api/qwebenginecontextmenurequest_p.h @@ -0,0 +1,93 @@ +/**************************************************************************** +** +** Copyright (C) 2020 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 QWEBENGINECONTEXTMENUREQUEST_P_H +#define QWEBENGINECONTEXTMENUREQUEST_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qtwebenginecoreglobal_p.h" +#include "qwebenginecontextmenurequest.h" +#include <QPoint> +#include <QUrl> + +QT_BEGIN_NAMESPACE + +class QWebEngineContextMenuRequestPrivate +{ +public: + bool m_accepted = false; + bool m_hasImageContent = false; + bool m_isEditable = false; + bool m_isSpellCheckerEnabled = false; + uint m_mediaType = 0; + uint m_mediaFlags = 0; + uint m_editFlags = 0; + QPoint m_position; + QUrl m_filteredLinkUrl; + QUrl m_unfilteredLinkUrl; + QUrl m_mediaUrl; + QString m_altText; + QString m_linkText; + QString m_titleText; + QString m_selectedText; + QString m_suggestedFileName; + QString m_misspelledWord; + QStringList m_spellCheckerSuggestions; + QUrl m_pageUrl; + QUrl m_frameUrl; + QtWebEngineCore::ReferrerPolicy m_referrerPolicy = QtWebEngineCore::ReferrerPolicy::Default; + // Some likely candidates for future additions as we add support for the related actions: + // bool isImageBlocked; + // <enum tbd> mediaType; + // ... +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/core/api/qwebenginecookiestore_p.h b/src/core/api/qwebenginecookiestore_p.h index a79e2b095..e6fa245c2 100644 --- a/src/core/api/qwebenginecookiestore_p.h +++ b/src/core/api/qwebenginecookiestore_p.h @@ -56,7 +56,7 @@ #include "qwebenginecallback_p.h" #include "qwebenginecookiestore.h" -#include <QVector> +#include <QList> #include <QNetworkCookie> #include <QUrl> @@ -79,7 +79,7 @@ class Q_WEBENGINECORE_PRIVATE_EXPORT QWebEngineCookieStorePrivate { public: QtWebEngineCore::CallbackDirectory callbackDirectory; std::function<bool(const QWebEngineCookieStore::FilterRequest &)> filterCallback; - QVector<CookieData> m_pendingUserCookies; + QList<CookieData> m_pendingUserCookies; quint64 m_nextCallbackId; bool m_deleteSessionCookiesPending; bool m_deleteAllCookiesPending; diff --git a/src/core/api/qwebenginedownloadrequest.cpp b/src/core/api/qwebenginedownloadrequest.cpp new file mode 100644 index 000000000..bf4994a64 --- /dev/null +++ b/src/core/api/qwebenginedownloadrequest.cpp @@ -0,0 +1,680 @@ +/**************************************************************************** +** +** Copyright (C) 2019 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 "qwebenginedownloadrequest.h" +#include "qwebenginedownloadrequest_p.h" + +#include "profile_adapter.h" + +#include <QDir> +#include "QFileInfo" + +QT_BEGIN_NAMESPACE + +using QtWebEngineCore::ProfileAdapterClient; + +ASSERT_ENUMS_MATCH(ProfileAdapterClient::NoReason, QWebEngineDownloadRequest::NoReason) +ASSERT_ENUMS_MATCH(ProfileAdapterClient::FileFailed, QWebEngineDownloadRequest::FileFailed) +ASSERT_ENUMS_MATCH(ProfileAdapterClient::FileAccessDenied, QWebEngineDownloadRequest::FileAccessDenied) +ASSERT_ENUMS_MATCH(ProfileAdapterClient::FileNoSpace, QWebEngineDownloadRequest::FileNoSpace) +ASSERT_ENUMS_MATCH(ProfileAdapterClient::FileNameTooLong, QWebEngineDownloadRequest::FileNameTooLong) +ASSERT_ENUMS_MATCH(ProfileAdapterClient::FileTooLarge, QWebEngineDownloadRequest::FileTooLarge) +ASSERT_ENUMS_MATCH(ProfileAdapterClient::FileVirusInfected, QWebEngineDownloadRequest::FileVirusInfected) +ASSERT_ENUMS_MATCH(ProfileAdapterClient::FileTransientError, QWebEngineDownloadRequest::FileTransientError) +ASSERT_ENUMS_MATCH(ProfileAdapterClient::FileBlocked, QWebEngineDownloadRequest::FileBlocked) +ASSERT_ENUMS_MATCH(ProfileAdapterClient::FileSecurityCheckFailed, QWebEngineDownloadRequest::FileSecurityCheckFailed) +ASSERT_ENUMS_MATCH(ProfileAdapterClient::FileTooShort, QWebEngineDownloadRequest::FileTooShort) +ASSERT_ENUMS_MATCH(ProfileAdapterClient::FileHashMismatch, QWebEngineDownloadRequest::FileHashMismatch) +ASSERT_ENUMS_MATCH(ProfileAdapterClient::NetworkFailed, QWebEngineDownloadRequest::NetworkFailed) +ASSERT_ENUMS_MATCH(ProfileAdapterClient::NetworkTimeout, QWebEngineDownloadRequest::NetworkTimeout) +ASSERT_ENUMS_MATCH(ProfileAdapterClient::NetworkDisconnected, QWebEngineDownloadRequest::NetworkDisconnected) +ASSERT_ENUMS_MATCH(ProfileAdapterClient::NetworkServerDown, QWebEngineDownloadRequest::NetworkServerDown) +ASSERT_ENUMS_MATCH(ProfileAdapterClient::NetworkInvalidRequest, QWebEngineDownloadRequest::NetworkInvalidRequest) +ASSERT_ENUMS_MATCH(ProfileAdapterClient::ServerFailed, QWebEngineDownloadRequest::ServerFailed) +//ASSERT_ENUMS_MATCH(ProfileAdapterClient::ServerNoRange, QWebEngineDownloadRequest::ServerNoRange) +ASSERT_ENUMS_MATCH(ProfileAdapterClient::ServerBadContent, QWebEngineDownloadRequest::ServerBadContent) +ASSERT_ENUMS_MATCH(ProfileAdapterClient::ServerUnauthorized, QWebEngineDownloadRequest::ServerUnauthorized) +ASSERT_ENUMS_MATCH(ProfileAdapterClient::ServerCertProblem, QWebEngineDownloadRequest::ServerCertProblem) +ASSERT_ENUMS_MATCH(ProfileAdapterClient::ServerForbidden, QWebEngineDownloadRequest::ServerForbidden) +ASSERT_ENUMS_MATCH(ProfileAdapterClient::ServerUnreachable, QWebEngineDownloadRequest::ServerUnreachable) +ASSERT_ENUMS_MATCH(ProfileAdapterClient::UserCanceled, QWebEngineDownloadRequest::UserCanceled) +//ASSERT_ENUMS_MATCH(ProfileAdapterClient::UserShutdown, QWebEngineDownloadRequest::UserShutdown) +//ASSERT_ENUMS_MATCH(ProfileAdapterClient::Crash, QWebEngineDownloadRequest::Crash) + +static inline QWebEngineDownloadRequest::DownloadState toDownloadState(int state) +{ + switch (state) { + case ProfileAdapterClient::DownloadInProgress: + return QWebEngineDownloadRequest::DownloadInProgress; + case ProfileAdapterClient::DownloadCompleted: + return QWebEngineDownloadRequest::DownloadCompleted; + case ProfileAdapterClient::DownloadCancelled: + return QWebEngineDownloadRequest::DownloadCancelled; + case ProfileAdapterClient::DownloadInterrupted: + return QWebEngineDownloadRequest::DownloadInterrupted; + default: + Q_UNREACHABLE(); + return QWebEngineDownloadRequest::DownloadCancelled; + } +} + +static inline QWebEngineDownloadRequest::DownloadInterruptReason toDownloadInterruptReason(int reason) +{ + return static_cast<QWebEngineDownloadRequest::DownloadInterruptReason>(reason); +} + +/*! + \class QWebEngineDownloadRequest + \brief The QWebEngineDownloadRequest class provides information about a download. + + \inmodule QtWebEngineCore + + QWebEngineDownloadRequest models a download throughout its life cycle, starting + with a pending download request and finishing with a completed download. It + can be used, for example, to get information about new downloads, to monitor + progress, and to pause, resume, and cancel downloads. + + Downloads are usually triggered by user interaction on a web page. It is the + QWebEngineProfile's responsibility to notify the application of new download + requests, which it does by emitting the + \l{QWebEngineProfile::downloadRequested}{downloadRequested} signal together + with a newly created QWebEngineDownloadRequest. The application can then + examine this item and decide whether to accept it or not. A signal handler + must explicitly call accept() on the item for \QWE to actually start + downloading and writing data to disk. If no signal handler calls accept(), + then the download request will be automatically rejected and nothing will be + written to disk. + + \note Some properties, such as setting the path and file name where the file + will be saved (see \l downloadDirectory() and \l downloadFileName()), can + only be changed before calling accept(). + + \section2 Object Life Cycle + + All items are guaranteed to be valid during the emission of the + \l{QWebEngineProfile::downloadRequested}{downloadRequested} signal. If + accept() is \e not called by any signal handler, then the item will be + deleted \e immediately after signal emission. This means that the + application \b{must not} keep references to rejected download items. It also + means the application should not use a queued connection to this signal. + + If accept() \e is called by a signal handler, then the QWebEngineProfile + will take ownership of the item. However, it is safe for the application to + delete the item at any time, except during the handling of the + \l{QWebEngineProfile::downloadRequested}{downloadRequested} signal. The + QWebEngineProfile being a long-lived object, it is in fact recommended that + the application delete any items it is no longer interested in. + + \note Deleting an item will also automatically cancel a download since 5.12.2, + but it is recommended to cancel manually before deleting for portability. + + \section2 Web Page Downloads + + In addition to normal file downloads, which consist simply of retrieving + some raw bytes from the network and writing them to disk, \QWE also + supports saving complete web pages, which involves parsing the page's HTML, + downloading any dependent resources, and potentially packaging everything + into a special file format (\l savePageFormat). To check if a download is + for a file or a web page, use \l isSavePageDownload. + + \sa QWebEngineProfile, QWebEngineProfile::downloadRequested, + QWebEnginePage::download, QWebEnginePage::save +*/ + +QWebEngineDownloadRequestPrivate::QWebEngineDownloadRequestPrivate(QtWebEngineCore::ProfileAdapter *adapter, const QUrl &url) + : m_profileAdapter(adapter) + , downloadFinished(false) + , downloadId(-1) + , downloadState(QWebEngineDownloadRequest::DownloadCancelled) + , savePageFormat(QWebEngineDownloadRequest::MimeHtmlSaveFormat) + , interruptReason(QWebEngineDownloadRequest::NoReason) + , downloadUrl(url) + , downloadPaused(false) + , isCustomFileName(false) + , totalBytes(-1) + , receivedBytes(0) + , isSavePageDownload(false) + , page(nullptr) +{ +} + +QWebEngineDownloadRequestPrivate::~QWebEngineDownloadRequestPrivate() +{ +} + +void QWebEngineDownloadRequestPrivate::update(const ProfileAdapterClient::DownloadItemInfo &info) +{ + Q_Q(QWebEngineDownloadRequest); + + Q_ASSERT(downloadState != QWebEngineDownloadRequest::DownloadRequested); + + if (toDownloadInterruptReason(info.downloadInterruptReason) != interruptReason) { + interruptReason = toDownloadInterruptReason(info.downloadInterruptReason); + Q_EMIT q->interruptReasonChanged(); + } + if (toDownloadState(info.state) != downloadState) { + downloadState = toDownloadState(info.state); + Q_EMIT q->stateChanged(downloadState); + } + + if (info.receivedBytes != receivedBytes || info.totalBytes != totalBytes) { + + if (info.receivedBytes != receivedBytes) { + receivedBytes = info.receivedBytes; + Q_EMIT q->receivedBytesChanged(); + } + if (info.totalBytes != totalBytes) { + totalBytes = info.totalBytes; + Q_EMIT q->totalBytesChanged(); + } + Q_EMIT q->downloadProgress(receivedBytes, totalBytes); + } + + if (info.done) + setFinished(); + + if (downloadPaused != info.paused) { + downloadPaused = info.paused; + Q_EMIT q->isPausedChanged(); + } +} + +void QWebEngineDownloadRequestPrivate::setFinished() +{ + if (downloadFinished) + return; + + downloadFinished = true; + Q_EMIT q_ptr->isFinishedChanged(); +} + +/*! + Accepts the current download request, which will start the download. + + If the item is in the \l DownloadRequested state, then it will transition + into the \l DownloadInProgress state and the downloading will begin. If the + item is in any other state, then nothing will happen. + + \sa finished(), stateChanged() +*/ + +void QWebEngineDownloadRequest::accept() +{ + Q_D(QWebEngineDownloadRequest); + + if (d->downloadState != QWebEngineDownloadRequest::DownloadRequested) + return; + + d->downloadState = QWebEngineDownloadRequest::DownloadInProgress; + Q_EMIT stateChanged(d->downloadState); +} + +/*! + Cancels the current download. + + If the item is in the \l DownloadInProgress state, then it will transition + into the \l DownloadCancelled state, the downloading will stop, and partially + downloaded files will be deleted from disk. + + If the item is in the \l DownloadCompleted state, then nothing will happen. + If the item is in any other state, then it will transition into the \l + DownloadCancelled state without further effect. + + \sa finished(), stateChanged() +*/ + +void QWebEngineDownloadRequest::cancel() +{ + Q_D(QWebEngineDownloadRequest); + + QWebEngineDownloadRequest::DownloadState state = d->downloadState; + + if (state == QWebEngineDownloadRequest::DownloadCompleted + || state == QWebEngineDownloadRequest::DownloadCancelled) + return; + + // We directly cancel the download request if the user cancels + // before it even started, so no need to notify the profile here. + if (state == QWebEngineDownloadRequest::DownloadInProgress) { + if (d->m_profileAdapter) + d->m_profileAdapter->cancelDownload(d->downloadId); + } else { + d->downloadState = QWebEngineDownloadRequest::DownloadCancelled; + Q_EMIT stateChanged(d->downloadState); + d->setFinished(); + } +} + +/*! + Pauses the download. + + Has no effect if the state is not \l DownloadInProgress. Does not change the + state. + + \sa resume(), isPaused() +*/ + +void QWebEngineDownloadRequest::pause() +{ + Q_D(QWebEngineDownloadRequest); + + QWebEngineDownloadRequest::DownloadState state = d->downloadState; + + if (state != QWebEngineDownloadRequest::DownloadInProgress) + return; + + if (d->m_profileAdapter) + d->m_profileAdapter->pauseDownload(d->downloadId); +} + +/*! + Resumes the current download if it was paused or interrupted. + + Has no effect if the state is not \l DownloadInProgress or \l + DownloadInterrupted. Does not change the state. + + \sa pause(), isPaused(), state() +*/ +void QWebEngineDownloadRequest::resume() +{ + Q_D(QWebEngineDownloadRequest); + + QWebEngineDownloadRequest::DownloadState state = d->downloadState; + + if (d->downloadFinished || (state != QWebEngineDownloadRequest::DownloadInProgress && state != QWebEngineDownloadRequest::DownloadInterrupted)) + return; + if (d->m_profileAdapter) + d->m_profileAdapter->resumeDownload(d->downloadId); +} + +/*! + Returns the download item's ID. +*/ + +quint32 QWebEngineDownloadRequest::id() const +{ + Q_D(const QWebEngineDownloadRequest); + return d->downloadId; +} + +/*! + \fn void QWebEngineDownloadRequest::finished() + + This signal is emitted when the download finishes. + + \sa state(), isFinished() +*/ + +/*! + \fn void QWebEngineDownloadRequest::isPausedChanged(bool isPaused) + + This signal is emitted whenever \a isPaused changes. + + \sa pause(), isPaused() +*/ + +/*! + \fn void QWebEngineDownloadRequest::stateChanged(DownloadState state) + + This signal is emitted whenever the download's \a state changes. + + \sa state(), DownloadState +*/ + +/*! + \fn void QWebEngineDownloadRequest::downloadProgress(qint64 bytesReceived, qint64 bytesTotal) + + This signal is emitted to indicate the progress of the download request. + + The \a bytesReceived parameter indicates the number of bytes received, while + \a bytesTotal indicates the total number of bytes expected to be downloaded. + If the size of the file to be downloaded is not known, \c bytesTotal will be + 0. + + \sa totalBytes(), receivedBytes() +*/ + +/*! + \enum QWebEngineDownloadRequest::DownloadState + + This enum describes the state of the download: + + \value DownloadRequested Download has been requested, but has not been accepted yet. + \value DownloadInProgress Download is in progress. + \value DownloadCompleted Download completed successfully. + \value DownloadCancelled Download has been cancelled. + \value DownloadInterrupted Download has been interrupted (by the server or because of lost + connectivity). +*/ + +/*! + \enum QWebEngineDownloadRequest::SavePageFormat + + This enum describes the format that is used to save a web page. + + \value UnknownSaveFormat This is not a request for downloading a complete web page. + \value SingleHtmlSaveFormat The page is saved as a single HTML page. Resources such as images + are not saved. + \value CompleteHtmlSaveFormat The page is saved as a complete HTML page, for example a directory + containing the single HTML page and the resources. + \value MimeHtmlSaveFormat The page is saved as a complete web page in the MIME HTML format. +*/ + +/*! + \enum QWebEngineDownloadRequest::DownloadInterruptReason + + Describes the reason why a download was interrupted: + + \value NoReason Unknown reason or not interrupted. + \value FileFailed General file operation failure. + \value FileAccessDenied The file cannot be written locally, due to access restrictions. + \value FileNoSpace Insufficient space on the target drive. + \value FileNameTooLong The directory or file name is too long. + \value FileTooLarge The file size exceeds the file system limitation. + \value FileVirusInfected The file is infected with a virus. + \value FileTransientError Temporary problem (for example the file is in use, + out of memory, or too many files are opened at once). + \value FileBlocked The file was blocked due to local policy. + \value FileSecurityCheckFailed An attempt to check the safety of the download + failed due to unexpected reasons. + \value FileTooShort An attempt was made to seek past the end of a file when + opening a file (as part of resuming a previously interrupted download). + \value FileHashMismatch The partial file did not match the expected hash. + + \value NetworkFailed General network failure. + \value NetworkTimeout The network operation has timed out. + \value NetworkDisconnected The network connection has been terminated. + \value NetworkServerDown The server has gone down. + \value NetworkInvalidRequest The network request was invalid (for example, the + original or redirected URL is invalid, has an unsupported scheme, or is disallowed by policy). + + \value ServerFailed General server failure. + \value ServerBadContent The server does not have the requested data. + \value ServerUnauthorized The server did not authorize access to the resource. + \value ServerCertProblem A problem with the server certificate occurred. + \value ServerForbidden Access forbidden by the server. + \value ServerUnreachable Unexpected server response (might indicate that + the responding server may not be the intended server). + \value UserCanceled The user canceled the download. +*/ + +/*! + Returns the download item's current state. + + \sa DownloadState +*/ + +QWebEngineDownloadRequest::DownloadState QWebEngineDownloadRequest::state() const +{ + Q_D(const QWebEngineDownloadRequest); + return d->downloadState; +} + +/*! + Returns the the total amount of data to download in bytes. + + \c -1 means the size is unknown. +*/ + +qint64 QWebEngineDownloadRequest::totalBytes() const +{ + Q_D(const QWebEngineDownloadRequest); + return d->totalBytes; +} + +/*! + Returns the amount of data in bytes that has been downloaded so far. + + \c -1 means the size is unknown. +*/ + +qint64 QWebEngineDownloadRequest::receivedBytes() const +{ + Q_D(const QWebEngineDownloadRequest); + return d->receivedBytes; +} + +/*! + Returns the download's origin URL. +*/ + +QUrl QWebEngineDownloadRequest::url() const +{ + Q_D(const QWebEngineDownloadRequest); + return d->downloadUrl; +} + +/*! + Returns the MIME type of the download. +*/ + +QString QWebEngineDownloadRequest::mimeType() const +{ + Q_D(const QWebEngineDownloadRequest); + return d->mimeType; +} + +/*! + Returns the download directory path. +*/ + +QString QWebEngineDownloadRequest::downloadDirectory() const +{ + Q_D(const QWebEngineDownloadRequest); + return d->downloadDirectory; +} + +/*! + Sets \a directory as the directory path to download the file to. + + The download directory path can only be set in response to the QWebEngineProfile::downloadRequested() + signal before the download is accepted. Past that point, this function has no effect on the + download item's state. +*/ + +void QWebEngineDownloadRequest::setDownloadDirectory(const QString &directory) +{ + Q_D(QWebEngineDownloadRequest); + if (d->downloadState != QWebEngineDownloadRequest::DownloadRequested) { + qWarning("Setting the download directory is not allowed after the download has been accepted."); + return; + } + + if (!directory.isEmpty() && d->downloadDirectory != directory) + d->downloadDirectory = directory; + + if (!d->isCustomFileName && d->m_profileAdapter) + d->downloadFileName = QFileInfo(d->m_profileAdapter->determineDownloadPath(d->downloadDirectory, + d->suggestedFileName, + d->startTime)).fileName(); +} + +/*! + Returns the file name to download the file to. +*/ + +QString QWebEngineDownloadRequest::downloadFileName() const +{ + Q_D(const QWebEngineDownloadRequest); + return d->downloadFileName; +} + +/*! + Sets \a fileName as the file name to download the file to. + + The download file name can only be set in response to the QWebEngineProfile::downloadRequested() + signal before the download is accepted. Past that point, this function has no effect on the + download item's state. +*/ + +void QWebEngineDownloadRequest::setDownloadFileName(const QString &fileName) +{ + Q_D(QWebEngineDownloadRequest); + if (d->downloadState != QWebEngineDownloadRequest::DownloadRequested) { + qWarning("Setting the download file name is not allowed after the download has been accepted."); + return; + } + + if (!fileName.isEmpty()) { + d->downloadFileName = fileName; + d->isCustomFileName = true; + } +} + +/*! + Returns the suggested file name. +*/ + +QString QWebEngineDownloadRequest::suggestedFileName() const +{ + Q_D(const QWebEngineDownloadRequest); + return d->suggestedFileName; +} + +/*! + Returns whether this download is finished (completed, cancelled, or non-resumable interrupted state). + + \sa finished(), state(), +*/ + +bool QWebEngineDownloadRequest::isFinished() const +{ + Q_D(const QWebEngineDownloadRequest); + return d->downloadFinished; +} + +/*! + Returns whether this download is paused. + + \sa pause(), resume() +*/ + +bool QWebEngineDownloadRequest::isPaused() const +{ + Q_D(const QWebEngineDownloadRequest); + return d->downloadPaused; +} + +/*! + Returns the format the web page will be saved in if this is a download request for a web page. + \sa setSavePageFormat(), isSavePageDownload() +*/ +QWebEngineDownloadRequest::SavePageFormat QWebEngineDownloadRequest::savePageFormat() const +{ + Q_D(const QWebEngineDownloadRequest); + return d->savePageFormat; +} + +/*! + Sets the \a format the web page will be saved in if this is a download request for a web page. + + \sa savePageFormat(), isSavePageDownload() +*/ +void QWebEngineDownloadRequest::setSavePageFormat(QWebEngineDownloadRequest::SavePageFormat format) +{ + Q_D(QWebEngineDownloadRequest); + if (d->savePageFormat != format) { + d->savePageFormat = format; + Q_EMIT savePageFormatChanged(); + } +} + +/*! + Returns \c true if this is a download request for saving a web page. + + \sa savePageFormat(), setSavePageFormat() + */ +bool QWebEngineDownloadRequest::isSavePageDownload() const +{ + Q_D(const QWebEngineDownloadRequest); + return d->isSavePageDownload; +} + +/*! + Returns the reason why the download was interrupted. + + \sa interruptReasonString() +*/ + +QWebEngineDownloadRequest::DownloadInterruptReason QWebEngineDownloadRequest::interruptReason() const +{ + Q_D(const QWebEngineDownloadRequest); + return d->interruptReason; +} + +/*! + Returns a human-readable description of the reason for interrupting the download. + + \sa interruptReason() +*/ + +QString QWebEngineDownloadRequest::interruptReasonString() const +{ + return ProfileAdapterClient::downloadInterruptReasonToString( + static_cast<ProfileAdapterClient::DownloadInterruptReason>(interruptReason())); +} + +/*! + Returns the page the download was requested on. If the download was not triggered by content in a page, + \c nullptr is returned. +*/ +QObject *QWebEngineDownloadRequest::page() const +{ + Q_D(const QWebEngineDownloadRequest); + return d->page; +} + +QWebEngineDownloadRequest::QWebEngineDownloadRequest(QWebEngineDownloadRequestPrivate *p, QObject *parent) + : QObject(parent) + , d_ptr(p) +{ + p->q_ptr = this; +} + +/*! \internal +*/ +QWebEngineDownloadRequest::~QWebEngineDownloadRequest() +{ + // MEMO Items are owned by profile by default and will be destroyed on profile's destruction + // It's not safe to access profile in that case, so we rely on profile to clean up items + if (!isFinished()) + cancel(); +} + +QT_END_NAMESPACE diff --git a/src/core/api/qwebenginedownloadrequest.h b/src/core/api/qwebenginedownloadrequest.h new file mode 100644 index 000000000..38d43cf1f --- /dev/null +++ b/src/core/api/qwebenginedownloadrequest.h @@ -0,0 +1,178 @@ +/**************************************************************************** +** +** Copyright (C) 2020 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 QWEBENGINEDOWNLOADREQUEST_H +#define QWEBENGINEDOWNLOADREQUEST_H + +#include <QtWebEngineCore/qtwebenginecoreglobal.h> + +#include <QtCore/qobject.h> +#include <QtCore/QUrl> + +QT_BEGIN_NAMESPACE + +//TODO: class QWebEnginePage; +class QWebEngineDownloadRequestPrivate; +class QWebEngineProfilePrivate; + +class Q_WEBENGINECORE_EXPORT QWebEngineDownloadRequest : public QObject +{ + Q_OBJECT +public: + Q_PROPERTY(quint32 id READ id CONSTANT FINAL) + Q_PROPERTY(DownloadState state READ state NOTIFY stateChanged FINAL) + Q_PROPERTY(SavePageFormat savePageFormat READ savePageFormat WRITE setSavePageFormat NOTIFY savePageFormatChanged FINAL) + Q_PROPERTY(qint64 totalBytes READ totalBytes NOTIFY totalBytesChanged FINAL) + Q_PROPERTY(qint64 receivedBytes READ receivedBytes NOTIFY receivedBytesChanged FINAL) + Q_PROPERTY(QString mimeType READ mimeType FINAL) + Q_PROPERTY(DownloadInterruptReason interruptReason READ interruptReason NOTIFY interruptReasonChanged FINAL) + Q_PROPERTY(QString interruptReasonString READ interruptReasonString NOTIFY interruptReasonChanged FINAL) + Q_PROPERTY(bool isFinished READ isFinished NOTIFY isFinishedChanged FINAL) + Q_PROPERTY(bool isPaused READ isPaused NOTIFY isPausedChanged FINAL) + Q_PROPERTY(bool isSavePageDownload READ isSavePageDownload CONSTANT FINAL) + //TODO: Q_PROPERTY(QQuickWebEngineView *view READ view CONSTANT REVISION 7 FINAL) + Q_PROPERTY(QUrl url READ url CONSTANT FINAL) + Q_PROPERTY(QString suggestedFileName READ suggestedFileName CONSTANT FINAL) + Q_PROPERTY(QString downloadDirectory READ downloadDirectory WRITE setDownloadDirectory NOTIFY downloadDirectoryChanged FINAL) + Q_PROPERTY(QString downloadFileName READ downloadFileName WRITE setDownloadFileName NOTIFY downloadFileNameChanged FINAL) + + ~QWebEngineDownloadRequest(); + + enum DownloadState { + DownloadRequested, + DownloadInProgress, + DownloadCompleted, + DownloadCancelled, + DownloadInterrupted + }; + Q_ENUM(DownloadState) + + enum SavePageFormat { + UnknownSaveFormat = -1, + SingleHtmlSaveFormat, + CompleteHtmlSaveFormat, + MimeHtmlSaveFormat + }; + Q_ENUM(SavePageFormat) + + enum DownloadInterruptReason { + NoReason = 0, + FileFailed = 1, + FileAccessDenied = 2, + FileNoSpace = 3, + FileNameTooLong = 5, + FileTooLarge = 6, + FileVirusInfected = 7, + FileTransientError = 10, + FileBlocked = 11, + FileSecurityCheckFailed = 12, + FileTooShort = 13, + FileHashMismatch = 14, + NetworkFailed = 20, + NetworkTimeout = 21, + NetworkDisconnected = 22, + NetworkServerDown = 23, + NetworkInvalidRequest = 24, + ServerFailed = 30, + //ServerNoRange = 31, + ServerBadContent = 33, + ServerUnauthorized = 34, + ServerCertProblem = 35, + ServerForbidden = 36, + ServerUnreachable = 37, + UserCanceled = 40, + //UserShutdown = 41, + //Crash = 50 + }; + Q_ENUM(DownloadInterruptReason) + + quint32 id() const; + DownloadState state() const; + qint64 totalBytes() const; + qint64 receivedBytes() const; + QUrl url() const; + QString mimeType() const; + bool isFinished() const; + bool isPaused() const; + SavePageFormat savePageFormat() const; + void setSavePageFormat(SavePageFormat format); + DownloadInterruptReason interruptReason() const; + QString interruptReasonString() const; + bool isSavePageDownload() const; + QString suggestedFileName() const; + QString downloadDirectory() const; + void setDownloadDirectory(const QString &directory); + QString downloadFileName() const; + void setDownloadFileName(const QString &fileName); + + //TODO: + QObject *page() const; + +public Q_SLOTS: + void accept(); + void cancel(); + void pause(); + void resume(); + +Q_SIGNALS: + void stateChanged(QWebEngineDownloadRequest::DownloadState state); + //TODO: fix it for qml + void downloadProgress(qint64 bytesReceived, qint64 bytesTotal); + void savePageFormatChanged(); + void receivedBytesChanged(); + void totalBytesChanged(); + void interruptReasonChanged(); + void isFinishedChanged(); + void isPausedChanged(); + void downloadDirectoryChanged(); + void downloadFileNameChanged(); + +private: + Q_DISABLE_COPY(QWebEngineDownloadRequest) + Q_DECLARE_PRIVATE(QWebEngineDownloadRequest) + + friend class QWebEngineProfilePrivate; + friend class QQuickWebEngineProfilePrivate; + QWebEngineDownloadRequest(QWebEngineDownloadRequestPrivate*, QObject *parent = Q_NULLPTR); + QScopedPointer<QWebEngineDownloadRequestPrivate> d_ptr; +}; + +QT_END_NAMESPACE + +#endif // QWEBENGINEDOWNLOADREQUEST_H diff --git a/src/core/api/qwebenginedownloadrequest_p.h b/src/core/api/qwebenginedownloadrequest_p.h new file mode 100644 index 000000000..bc172bd7b --- /dev/null +++ b/src/core/api/qwebenginedownloadrequest_p.h @@ -0,0 +1,100 @@ +/**************************************************************************** +** +** Copyright (C) 2016 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 QWEBENGINEDOWNLOADREQUEST_P_H +#define QWEBENGINEDOWNLOADREQUEST_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qtwebenginecoreglobal.h" +#include "qwebenginedownloadrequest.h" +#include "profile_adapter_client.h" +#include <QString> +#include <QPointer> + +namespace QtWebEngineCore { +class ProfileAdapter; +} + +QT_BEGIN_NAMESPACE + +class Q_WEBENGINECORE_PRIVATE_EXPORT QWebEngineDownloadRequestPrivate { +public: + QWebEngineDownloadRequestPrivate(QtWebEngineCore::ProfileAdapter *adapter, const QUrl &url); + ~QWebEngineDownloadRequestPrivate(); + + void update(const QtWebEngineCore::ProfileAdapterClient::DownloadItemInfo &info); + void setFinished(); + + bool downloadFinished; + quint32 downloadId; + qint64 startTime; + QWebEngineDownloadRequest::DownloadState downloadState; + QWebEngineDownloadRequest::SavePageFormat savePageFormat; + QWebEngineDownloadRequest::DownloadInterruptReason interruptReason; + QString downloadPath; + const QUrl downloadUrl; + QString mimeType; + bool downloadPaused; + QString suggestedFileName; + QString downloadDirectory; + QString downloadFileName; + bool isCustomFileName; + qint64 totalBytes; + qint64 receivedBytes; + bool isSavePageDownload; + QWebEngineDownloadRequest *q_ptr; + QPointer<QtWebEngineCore::ProfileAdapter> m_profileAdapter; + QObject *page; + Q_DECLARE_PUBLIC(QWebEngineDownloadRequest) +}; + +QT_END_NAMESPACE + +#endif // QWEBENGINEDOWNLOADREQUEST_P_H + diff --git a/src/core/api/qwebenginehttprequest.cpp b/src/core/api/qwebenginehttprequest.cpp index 3395cc99f..f5733cde4 100644 --- a/src/core/api/qwebenginehttprequest.cpp +++ b/src/core/api/qwebenginehttprequest.cpp @@ -72,7 +72,7 @@ public: QUrl url; QWebEngineHttpRequest::Method method; typedef QPair<QByteArray, QByteArray> HeaderPair; - typedef QVector<HeaderPair> Headers; + typedef QList<HeaderPair> Headers; Headers headers; QByteArray postData; @@ -96,7 +96,7 @@ public: Headers::ConstIterator findHeader(const QByteArray &key) const; Headers allHeaders() const; - QVector<QByteArray> headersKeys() const; + QList<QByteArray> headersKeys() const; void setHeader(const QByteArray &key, const QByteArray &value); void unsetHeader(const QByteArray &key); void setAllHeaders(const Headers &list); @@ -293,7 +293,7 @@ QByteArray QWebEngineHttpRequest::header(const QByteArray &headerName) const \sa setHeader(), header(), hasHeader(), unsetHeader() */ -QVector<QByteArray> QWebEngineHttpRequest::headers() const +QList<QByteArray> QWebEngineHttpRequest::headers() const { return d->headersKeys(); } @@ -339,9 +339,9 @@ QWebEngineHttpRequestPrivate::Headers QWebEngineHttpRequestPrivate::allHeaders() return headers; } -QVector<QByteArray> QWebEngineHttpRequestPrivate::headersKeys() const +QList<QByteArray> QWebEngineHttpRequestPrivate::headersKeys() const { - QVector<QByteArray> result; + QList<QByteArray> result; result.reserve(headers.size()); Headers::ConstIterator it = headers.constBegin(), end = headers.constEnd(); for (; it != end; ++it) diff --git a/src/core/api/qwebenginehttprequest.h b/src/core/api/qwebenginehttprequest.h index 1c4d7837b..ce77c04dd 100644 --- a/src/core/api/qwebenginehttprequest.h +++ b/src/core/api/qwebenginehttprequest.h @@ -41,9 +41,9 @@ #define QWEBENGINEHTTPREQUEST_H #include <QtWebEngineCore/qtwebenginecoreglobal.h> -#include <QtCore/qshareddata.h> -#include <QtCore/qvector.h> +#include <QtCore/qlist.h> #include <QtCore/qmap.h> +#include <QtCore/qshareddata.h> #include <QtCore/qstring.h> #include <QtCore/qurl.h> @@ -87,7 +87,7 @@ public: void setPostData(const QByteArray &postData); bool hasHeader(const QByteArray &headerName) const; - QVector<QByteArray> headers() const; + QList<QByteArray> headers() const; QByteArray header(const QByteArray &headerName) const; void setHeader(const QByteArray &headerName, const QByteArray &value); void unsetHeader(const QByteArray &headerName); diff --git a/src/core/api/qwebenginesettings.cpp b/src/core/api/qwebenginesettings.cpp new file mode 100644 index 000000000..c7c0a47b2 --- /dev/null +++ b/src/core/api/qwebenginesettings.cpp @@ -0,0 +1,142 @@ +/**************************************************************************** +** +** Copyright (C) 2020 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 "qwebenginesettings.h" +#include "web_engine_settings.h" + +QT_BEGIN_NAMESPACE + +using QtWebEngineCore::WebEngineSettings; + +QWebEngineSettings::QWebEngineSettings(QWebEngineSettings *parentSettings) + : d_ptr(new WebEngineSettings(parentSettings ? parentSettings->d_ptr.data() : nullptr)) +{ + d_ptr->scheduleApplyRecursively(); +} + +QWebEngineSettings::~QWebEngineSettings() { } + +/*! + Returns the settings for a web engine page that belongs to the default + profile. All web pages not specifically created with another profile belong + to the default profile. + +QWebEngineSettings *QWebEngineSettings::defaultSettings() +{ + return QWebEngineProfile::defaultProfile()->settings(); +} +*/ + +void QWebEngineSettings::setFontFamily(QWebEngineSettings::FontFamily which, const QString &family) +{ + d_ptr->setFontFamily(which, family); +} + +QString QWebEngineSettings::fontFamily(QWebEngineSettings::FontFamily which) const +{ + return d_ptr->fontFamily(which); +} + +void QWebEngineSettings::resetFontFamily(QWebEngineSettings::FontFamily which) +{ + d_ptr->resetFontFamily(which); +} + +void QWebEngineSettings::setFontSize(QWebEngineSettings::FontSize type, int size) +{ + d_ptr->setFontSize(type, size); +} + +int QWebEngineSettings::fontSize(QWebEngineSettings::FontSize type) const +{ + return d_ptr->fontSize(type); +} + +void QWebEngineSettings::resetFontSize(QWebEngineSettings::FontSize type) +{ + d_ptr->resetFontSize(type); +} + +QString QWebEngineSettings::defaultTextEncoding() const +{ + return d_ptr->defaultTextEncoding(); +} + +QWebEngineSettings::UnknownUrlSchemePolicy QWebEngineSettings::unknownUrlSchemePolicy() const +{ + return d_ptr->unknownUrlSchemePolicy(); +} + +void QWebEngineSettings::resetUnknownUrlSchemePolicy() +{ + d_ptr->setUnknownUrlSchemePolicy(QWebEngineSettings::InheritedUnknownUrlSchemePolicy); +} + +void QWebEngineSettings::setAttribute(QWebEngineSettings::WebAttribute attr, bool on) +{ + d_ptr->setAttribute(attr, on); +} + +bool QWebEngineSettings::testAttribute(QWebEngineSettings::WebAttribute attr) const +{ + return d_ptr->testAttribute(attr); +} + +void QWebEngineSettings::resetAttribute(QWebEngineSettings::WebAttribute attr) +{ + d_ptr->resetAttribute(attr); +} + +void QWebEngineSettings::setDefaultTextEncoding(const QString &encoding) +{ + d_ptr->setDefaultTextEncoding(encoding); +} + +void QWebEngineSettings::setUnknownUrlSchemePolicy( + QWebEngineSettings::UnknownUrlSchemePolicy policy) +{ + d_ptr->setUnknownUrlSchemePolicy(policy); +} + +void QWebEngineSettings::setParentSettings(QWebEngineSettings *parentSettings) +{ + d_ptr->setParentSettings(parentSettings->d_ptr.data()); +} + +QT_END_NAMESPACE diff --git a/src/core/api/qwebenginesettings.h b/src/core/api/qwebenginesettings.h new file mode 100644 index 000000000..f565f8ee2 --- /dev/null +++ b/src/core/api/qwebenginesettings.h @@ -0,0 +1,154 @@ +/**************************************************************************** +** +** Copyright (C) 2020 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 QWEBENGINESETTINGS_H +#define QWEBENGINESETTINGS_H + +#include <QtWebEngineCore/qtwebenginecoreglobal.h> +#include <QtCore/qscopedpointer.h> +#include <QtCore/qstring.h> + +namespace QtWebEngineCore { +class WebEngineSettings; +} + +QT_BEGIN_NAMESPACE + +class QIcon; +class QPixmap; +class QUrl; + +class Q_WEBENGINECORE_EXPORT QWebEngineSettings { +public: + enum FontFamily { + StandardFont, + FixedFont, + SerifFont, + SansSerifFont, + CursiveFont, + FantasyFont, + PictographFont + }; + + enum WebAttribute { + AutoLoadImages, + JavascriptEnabled, + JavascriptCanOpenWindows, + JavascriptCanAccessClipboard, + LinksIncludedInFocusChain, + LocalStorageEnabled, + LocalContentCanAccessRemoteUrls, + XSSAuditingEnabled, + SpatialNavigationEnabled, + LocalContentCanAccessFileUrls, + HyperlinkAuditingEnabled, + ScrollAnimatorEnabled, + ErrorPageEnabled, + PluginsEnabled, + FullScreenSupportEnabled, + ScreenCaptureEnabled, + WebGLEnabled, + Accelerated2dCanvasEnabled, + AutoLoadIconsForPage, + TouchIconsEnabled, + FocusOnNavigationEnabled, + PrintElementBackgrounds, + AllowRunningInsecureContent, + AllowGeolocationOnInsecureOrigins, + AllowWindowActivationFromJavaScript, + ShowScrollBars, + PlaybackRequiresUserGesture, + WebRTCPublicInterfacesOnly, + JavascriptCanPaste, + DnsPrefetchEnabled, + PdfViewerEnabled, + }; + + enum FontSize { + MinimumFontSize, + MinimumLogicalFontSize, + DefaultFontSize, + DefaultFixedFontSize + }; + + enum UnknownUrlSchemePolicy { + InheritedUnknownUrlSchemePolicy = 0, // TODO: hide + DisallowUnknownUrlSchemes = 1, + AllowUnknownUrlSchemesFromUserInteraction, + AllowAllUnknownUrlSchemes + }; + + //TODO: see if we still need it + //static QWebEngineSettings *defaultSettings(); +public: + ~QWebEngineSettings(); + void setFontFamily(FontFamily which, const QString &family); + QString fontFamily(FontFamily which) const; + void resetFontFamily(FontFamily which); + + void setFontSize(FontSize type, int size); + int fontSize(FontSize type) const; + void resetFontSize(FontSize type); + + void setAttribute(WebAttribute attr, bool on); + bool testAttribute(WebAttribute attr) const; + void resetAttribute(WebAttribute attr); + + void setDefaultTextEncoding(const QString &encoding); + QString defaultTextEncoding() const; + + UnknownUrlSchemePolicy unknownUrlSchemePolicy() const; + void setUnknownUrlSchemePolicy(UnknownUrlSchemePolicy policy); + void resetUnknownUrlSchemePolicy(); + +private: + explicit QWebEngineSettings(QWebEngineSettings *parentSettings = nullptr); + void setParentSettings(QWebEngineSettings *parentSettings); + Q_DISABLE_COPY(QWebEngineSettings) + typedef ::QtWebEngineCore::WebEngineSettings QWebEngineSettingsPrivate; + QScopedPointer<QWebEngineSettingsPrivate> d_ptr; + friend class QWebEnginePagePrivate; + friend class QWebEngineProfilePrivate; + friend class QQuickWebEngineSettings; + friend class QtWebEngineCore::WebEngineSettings; +}; + +QT_END_NAMESPACE + +#endif // QWEBENGINESETTINGS_H |