diff options
author | Allan Sandfeld Jensen <allan.jensen@theqtcompany.com> | 2016-04-25 11:47:47 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@theqtcompany.com> | 2016-04-25 12:40:00 +0200 |
commit | 658a964cf2593e6da3b1a822124e796bbe354d36 (patch) | |
tree | 8c35a964023069a974f1c54cd679490593e485f2 /src | |
parent | 63cf26268996ae5580c77095a252696fa549b593 (diff) | |
parent | a3318c84b022282a5a4a2babc51d1e3ca634e25b (diff) |
Merge remote-tracking branch 'origin/5.6' into 5.7
Change-Id: I329397621f19ba3890be5daf44a6bb2d668ad2d8
Diffstat (limited to 'src')
31 files changed, 211 insertions, 119 deletions
diff --git a/src/core/api/qtwebenginecoreglobal.cpp b/src/core/api/qtwebenginecoreglobal.cpp index 116f39c68..8f004777f 100644 --- a/src/core/api/qtwebenginecoreglobal.cpp +++ b/src/core/api/qtwebenginecoreglobal.cpp @@ -78,6 +78,11 @@ QWEBENGINE_PRIVATE_EXPORT void initialize() qFatal("QtWebEngine::initialize() must be called after the construction of the application object."); 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; diff --git a/src/core/browser_context_adapter.cpp b/src/core/browser_context_adapter.cpp index 193c49e34..e0f933562 100644 --- a/src/core/browser_context_adapter.cpp +++ b/src/core/browser_context_adapter.cpp @@ -168,7 +168,7 @@ void BrowserContextAdapter::cancelDownload(quint32 downloadId) downloadManagerDelegate()->cancelDownload(downloadId); } -BrowserContextAdapter* BrowserContextAdapter::defaultContext() +QSharedPointer<BrowserContextAdapter> BrowserContextAdapter::defaultContext() { return WebEngineContext::current()->defaultBrowserContext(); } @@ -354,11 +354,16 @@ void BrowserContextAdapter::setHttpCacheMaxSize(int maxSize) m_browserContext->url_request_getter_->updateHttpCache(); } -QHash<QByteArray, QWebEngineUrlSchemeHandler *> &BrowserContextAdapter::customUrlSchemeHandlers() +const QHash<QByteArray, QWebEngineUrlSchemeHandler *> &BrowserContextAdapter::customUrlSchemeHandlers() const { return m_customUrlSchemeHandlers; } +const QList<QByteArray> BrowserContextAdapter::customUrlSchemes() const +{ + return m_customUrlSchemeHandlers.keys(); +} + void BrowserContextAdapter::updateCustomUrlSchemeHandlers() { if (m_browserContext->url_request_getter_.get()) @@ -396,6 +401,12 @@ void BrowserContextAdapter::addCustomUrlSchemeHandler(const QByteArray &scheme, updateCustomUrlSchemeHandlers(); } +void BrowserContextAdapter::clearCustomUrlSchemeHandlers() +{ + m_customUrlSchemeHandlers.clear(); + updateCustomUrlSchemeHandlers(); +} + UserResourceControllerHost *BrowserContextAdapter::userResourceController() { if (!m_userResourceController) @@ -432,7 +443,21 @@ QString BrowserContextAdapter::httpAcceptLanguage() const void BrowserContextAdapter::setHttpAcceptLanguage(const QString &httpAcceptLanguage) { + if (m_httpAcceptLanguage == httpAcceptLanguage) + return; m_httpAcceptLanguage = httpAcceptLanguage; + + std::vector<content::WebContentsImpl *> list = content::WebContentsImpl::GetAllWebContents(); + Q_FOREACH (content::WebContentsImpl *web_contents, list) { + if (web_contents->GetBrowserContext() == m_browserContext.data()) { + content::RendererPreferences* rendererPrefs = web_contents->GetMutableRendererPrefs(); + rendererPrefs->accept_languages = httpAcceptLanguageWithoutQualities().toStdString(); + web_contents->GetRenderViewHost()->SyncRendererPrefs(); + } + } + + if (m_browserContext->url_request_getter_.get()) + m_browserContext->url_request_getter_->updateUserAgent(); } void BrowserContextAdapter::clearHttpCache() diff --git a/src/core/browser_context_adapter.h b/src/core/browser_context_adapter.h index 3e1e6389c..c3c3f153d 100644 --- a/src/core/browser_context_adapter.h +++ b/src/core/browser_context_adapter.h @@ -42,10 +42,10 @@ #include "qtwebenginecoreglobal.h" +#include <QEnableSharedFromThis> #include <QList> #include <QPointer> #include <QScopedPointer> -#include <QSharedData> #include <QString> #include <QVector> @@ -63,14 +63,14 @@ class DownloadManagerDelegateQt; class UserResourceControllerHost; class WebEngineVisitedLinksManager; -class QWEBENGINE_EXPORT BrowserContextAdapter : public QSharedData +class QWEBENGINE_EXPORT BrowserContextAdapter : public QEnableSharedFromThis<BrowserContextAdapter> { public: explicit BrowserContextAdapter(bool offTheRecord = false); explicit BrowserContextAdapter(const QString &storagePrefix); virtual ~BrowserContextAdapter(); - static BrowserContextAdapter* defaultContext(); + static QSharedPointer<BrowserContextAdapter> defaultContext(); static QObject* globalQObjectRoot(); WebEngineVisitedLinksManager *visitedLinksManager(); @@ -156,8 +156,9 @@ public: bool trackVisitedLinks() const; bool persistVisitedLinks() const; - QHash<QByteArray, QWebEngineUrlSchemeHandler *> &customUrlSchemeHandlers(); - void updateCustomUrlSchemeHandlers(); + const QHash<QByteArray, QWebEngineUrlSchemeHandler *> &customUrlSchemeHandlers() const; + const QList<QByteArray> customUrlSchemes() const; + void clearCustomUrlSchemeHandlers(); void addCustomUrlSchemeHandler(const QByteArray &, QWebEngineUrlSchemeHandler *); bool removeCustomUrlSchemeHandler(QWebEngineUrlSchemeHandler *); QWebEngineUrlSchemeHandler *takeCustomUrlSchemeHandler(const QByteArray &); @@ -173,6 +174,8 @@ public: void clearHttpCache(); private: + void updateCustomUrlSchemeHandlers(); + QString m_name; bool m_offTheRecord; QScopedPointer<BrowserContextQt> m_browserContext; diff --git a/src/core/browser_context_qt.cpp b/src/core/browser_context_qt.cpp index dc337493e..5b3115530 100644 --- a/src/core/browser_context_qt.cpp +++ b/src/core/browser_context_qt.cpp @@ -174,7 +174,7 @@ content::PushMessagingService *BrowserContextQt::GetPushMessagingService() content::SSLHostStateDelegate* BrowserContextQt::GetSSLHostStateDelegate() { if (!sslHostStateDelegate) - sslHostStateDelegate.reset(new SSLHostStateDelegateQt(m_adapter)); + sslHostStateDelegate.reset(new SSLHostStateDelegateQt()); return sslHostStateDelegate.get(); } @@ -191,13 +191,13 @@ content::BackgroundSyncController* BrowserContextQt::GetBackgroundSyncController content::PermissionManager *BrowserContextQt::GetPermissionManager() { if (!permissionManager) - permissionManager.reset(new PermissionManagerQt(m_adapter)); + permissionManager.reset(new PermissionManagerQt()); return permissionManager.get(); } net::URLRequestContextGetter *BrowserContextQt::CreateRequestContext(content::ProtocolHandlerMap *protocol_handlers, content::URLRequestInterceptorScopedVector request_interceptors) { - url_request_getter_ = new URLRequestContextGetterQt(m_adapter, protocol_handlers, std::move(request_interceptors)); + url_request_getter_ = new URLRequestContextGetterQt(m_adapter->sharedFromThis(), protocol_handlers, std::move(request_interceptors)); return url_request_getter_.get(); } diff --git a/src/core/clipboard_qt.cpp b/src/core/clipboard_qt.cpp index 3b3248559..cd57995ea 100644 --- a/src/core/clipboard_qt.cpp +++ b/src/core/clipboard_qt.cpp @@ -243,8 +243,7 @@ void ClipboardQt::WriteWebSmartPaste() void ClipboardQt::WriteBitmap(const SkBitmap& bitmap) { - QImage image(reinterpret_cast<const uchar *>(bitmap.getPixels()), bitmap.width(), bitmap.height(), QImage::Format_ARGB32); - getUncommittedData()->setImageData(image.copy()); + getUncommittedData()->setImageData(toQImage(bitmap).copy()); } void ClipboardQt::WriteBookmark(const char* title_data, size_t title_len, const char* url_data, size_t url_len) diff --git a/src/core/custom_protocol_handler.cpp b/src/core/custom_protocol_handler.cpp index 15eb82db1..402df04ba 100644 --- a/src/core/custom_protocol_handler.cpp +++ b/src/core/custom_protocol_handler.cpp @@ -46,8 +46,8 @@ namespace QtWebEngineCore { -CustomProtocolHandler::CustomProtocolHandler(QWebEngineUrlSchemeHandler *schemeHandler) - : m_schemeHandler(schemeHandler) +CustomProtocolHandler::CustomProtocolHandler(QWeakPointer<const BrowserContextAdapter> adapter) + : m_adapter(adapter) { } @@ -56,7 +56,7 @@ net::URLRequestJob *CustomProtocolHandler::MaybeCreateJob(net::URLRequest *reque if (!networkDelegate) return new net::URLRequestErrorJob(request, Q_NULLPTR, net::ERR_ACCESS_DENIED); - return new URLRequestCustomJob(request, networkDelegate, m_schemeHandler); + return new URLRequestCustomJob(request, networkDelegate, request->url().scheme(), m_adapter); } } // namespace diff --git a/src/core/custom_protocol_handler.h b/src/core/custom_protocol_handler.h index c56a983f8..38e17ffaf 100644 --- a/src/core/custom_protocol_handler.h +++ b/src/core/custom_protocol_handler.h @@ -45,10 +45,9 @@ #include <QtCore/QByteArray> #include <QtCore/QObject> -#include <QtCore/qcompilerdetection.h> // Needed for Q_DECL_OVERRIDE +#include <QtCore/QWeakPointer> QT_FORWARD_DECLARE_CLASS(QIODevice) -QT_FORWARD_DECLARE_CLASS(QWebEngineUrlSchemeHandler) namespace net { class NetworkDelegate; @@ -64,13 +63,13 @@ class BrowserContextAdapter; class QWEBENGINE_EXPORT CustomProtocolHandler : public net::URLRequestJobFactory::ProtocolHandler { public: - CustomProtocolHandler(QWebEngineUrlSchemeHandler *); + CustomProtocolHandler(QWeakPointer<const BrowserContextAdapter> adapter); virtual net::URLRequestJob *MaybeCreateJob(net::URLRequest *request, net::NetworkDelegate *networkDelegate) const Q_DECL_OVERRIDE; private: DISALLOW_COPY_AND_ASSIGN(CustomProtocolHandler); - QWebEngineUrlSchemeHandler *m_schemeHandler; + QWeakPointer<const BrowserContextAdapter> m_adapter; }; } // namespace diff --git a/src/core/permission_manager_qt.cpp b/src/core/permission_manager_qt.cpp index fd57ad7b8..36ce476cd 100644 --- a/src/core/permission_manager_qt.cpp +++ b/src/core/permission_manager_qt.cpp @@ -69,9 +69,8 @@ BrowserContextAdapter::PermissionType toQt(content::PermissionType type) return BrowserContextAdapter::UnsupportedPermission; } -PermissionManagerQt::PermissionManagerQt(BrowserContextAdapter *contextAdapter) - : m_contextAdapter(contextAdapter) - , m_requestIdCount(0) +PermissionManagerQt::PermissionManagerQt() + : m_requestIdCount(0) , m_subscriberIdCount(0) { } diff --git a/src/core/permission_manager_qt.h b/src/core/permission_manager_qt.h index 928f11c65..ff35357d8 100644 --- a/src/core/permission_manager_qt.h +++ b/src/core/permission_manager_qt.h @@ -52,7 +52,7 @@ namespace QtWebEngineCore { class PermissionManagerQt : public content::PermissionManager { public: - PermissionManagerQt(BrowserContextAdapter *); + PermissionManagerQt(); ~PermissionManagerQt(); typedef BrowserContextAdapter::PermissionType PermissionType; @@ -101,7 +101,6 @@ public: void UnsubscribePermissionStatusChange(int subscription_id) override; private: - BrowserContextAdapter *m_contextAdapter; QHash<QPair<QUrl, PermissionType>, bool> m_permissions; struct RequestOrSubscription { PermissionType type; diff --git a/src/core/ssl_host_state_delegate_qt.cpp b/src/core/ssl_host_state_delegate_qt.cpp index cf17b944c..506172aaa 100644 --- a/src/core/ssl_host_state_delegate_qt.cpp +++ b/src/core/ssl_host_state_delegate_qt.cpp @@ -72,8 +72,7 @@ void CertPolicy::Allow(const net::X509Certificate& cert, net::CertStatus error) m_allowed[fingerprint] |= error; } -SSLHostStateDelegateQt::SSLHostStateDelegateQt(BrowserContextAdapter *contextAdapter) - : m_contextAdapter(contextAdapter) +SSLHostStateDelegateQt::SSLHostStateDelegateQt() { } diff --git a/src/core/ssl_host_state_delegate_qt.h b/src/core/ssl_host_state_delegate_qt.h index 7c91fcb2d..64a430094 100644 --- a/src/core/ssl_host_state_delegate_qt.h +++ b/src/core/ssl_host_state_delegate_qt.h @@ -57,7 +57,7 @@ private: class SSLHostStateDelegateQt : public content::SSLHostStateDelegate { public: - SSLHostStateDelegateQt(BrowserContextAdapter *); + SSLHostStateDelegateQt(); ~SSLHostStateDelegateQt(); // content::SSLHostStateDelegate implementation: @@ -71,7 +71,6 @@ public: virtual bool HasAllowException(const std::string &host) const override; private: - BrowserContextAdapter *m_contextAdapter; std::map<std::string, CertPolicy> m_certPolicyforHost; }; diff --git a/src/core/type_conversion.cpp b/src/core/type_conversion.cpp index ccfc2fdc6..ef220b86c 100644 --- a/src/core/type_conversion.cpp +++ b/src/core/type_conversion.cpp @@ -197,5 +197,4 @@ FaviconInfo toFaviconInfo(const content::FaviconURL &favicon_url) return info; } - } // namespace QtWebEngineCore diff --git a/src/core/type_conversion.h b/src/core/type_conversion.h index 84f91ec3e..e96a544e5 100644 --- a/src/core/type_conversion.h +++ b/src/core/type_conversion.h @@ -85,6 +85,11 @@ inline QString toQt(const std::string &string) return QString::fromStdString(string); } +inline QByteArray toQByteArray(const std::string &string) +{ + return QByteArray::fromStdString(string); +} + inline base::string16 toString16(const QString &qString) { #if defined(OS_WIN) diff --git a/src/core/url_request_context_getter_qt.cpp b/src/core/url_request_context_getter_qt.cpp index f80aa194b..afbb66b95 100644 --- a/src/core/url_request_context_getter_qt.cpp +++ b/src/core/url_request_context_getter_qt.cpp @@ -89,24 +89,28 @@ static const char kQrcSchemeQt[] = "qrc"; using content::BrowserThread; -URLRequestContextGetterQt::URLRequestContextGetterQt(BrowserContextAdapter *browserContext, content::ProtocolHandlerMap *protocolHandlers, content::URLRequestInterceptorScopedVector request_interceptors) +URLRequestContextGetterQt::URLRequestContextGetterQt(QSharedPointer<BrowserContextAdapter> browserContext, content::ProtocolHandlerMap *protocolHandlers, content::URLRequestInterceptorScopedVector request_interceptors) : m_ignoreCertificateErrors(false) , m_browserContext(browserContext) + , m_baseJobFactory(0) , m_cookieDelegate(new CookieMonsterDelegateQt()) , m_requestInterceptors(std::move(request_interceptors)) { std::swap(m_protocolHandlers, *protocolHandlers); + m_cookieDelegate->setClient(m_browserContext->cookieStore()); updateStorageSettings(); } URLRequestContextGetterQt::~URLRequestContextGetterQt() { + m_cookieDelegate->setCookieMonster(0); // this will let CookieMonsterDelegateQt be deleted delete m_proxyConfigService.fetchAndStoreAcquire(0); } net::URLRequestContext *URLRequestContextGetterQt::GetURLRequestContext() { + Q_ASSERT(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); if (!m_urlRequestContext) { m_urlRequestContext.reset(new net::URLRequestContext()); @@ -123,14 +127,16 @@ net::URLRequestContext *URLRequestContextGetterQt::GetURLRequestContext() void URLRequestContextGetterQt::updateStorageSettings() { Q_ASSERT(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); + // m_proxyConfigService having a non-null value is used to indicate + // storage is already being updated. if (!m_proxyConfigService.loadAcquire()) { // We must create the proxy config service on the UI loop on Linux because it // must synchronously run on the glib message loop. This will be passed to // the URLRequestContextStorage on the IO thread in GetURLRequestContext(). - m_proxyConfigService = new ProxyConfigServiceQt(net::ProxyService::CreateSystemProxyConfigService( + m_proxyConfigService.storeRelease(new ProxyConfigServiceQt(net::ProxyService::CreateSystemProxyConfigService( content::BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO), content::BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE) - )); + ))); if (m_storage) { content::BrowserThread::PostTask(content::BrowserThread::IO, FROM_HERE, base::Bind(&URLRequestContextGetterQt::generateStorage, this)); } @@ -154,6 +160,7 @@ void URLRequestContextGetterQt::cancelAllUrlRequests() void URLRequestContextGetterQt::generateStorage() { + Q_ASSERT(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); Q_ASSERT(m_urlRequestContext); // We must stop all requests before deleting their backends. @@ -206,14 +213,15 @@ void URLRequestContextGetterQt::generateStorage() void URLRequestContextGetterQt::updateCookieStore() { - if (m_urlRequestContext && !m_updateCookieStore && !m_proxyConfigService) { - m_updateCookieStore = 1; + Q_ASSERT(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); + // Do not trigger an update if another is already triggered, or we are not yet initialized. + if (m_urlRequestContext && !m_proxyConfigService && !m_updateCookieStore.fetchAndStoreRelaxed(1)) content::BrowserThread::PostTask(content::BrowserThread::IO, FROM_HERE, base::Bind(&URLRequestContextGetterQt::generateCookieStore, this)); - } } void URLRequestContextGetterQt::generateCookieStore() { + Q_ASSERT(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); Q_ASSERT(m_urlRequestContext); Q_ASSERT(m_storage); m_updateCookieStore = 0; @@ -221,7 +229,6 @@ void URLRequestContextGetterQt::generateCookieStore() // Unset it first to get a chance to destroy and flush the old cookie store before opening a new on possibly the same file. m_storage->set_cookie_store(0); m_cookieDelegate->setCookieMonster(0); - m_cookieDelegate->setClient(m_browserContext->cookieStore()); net::CookieStore* cookieStore = 0; switch (m_browserContext->persistentCookiesPolicy()) { @@ -262,51 +269,38 @@ void URLRequestContextGetterQt::generateCookieStore() void URLRequestContextGetterQt::updateUserAgent() { + Q_ASSERT(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); + // Do not trigger an update if all storage settings are already being updated if (m_urlRequestContext && !m_proxyConfigService) content::BrowserThread::PostTask(content::BrowserThread::IO, FROM_HERE, base::Bind(&URLRequestContextGetterQt::generateUserAgent, this)); } -class HttpUserAgentSettingsQt : public net::HttpUserAgentSettings -{ - const BrowserContextAdapter *m_browserContext; -public: - HttpUserAgentSettingsQt(const BrowserContextAdapter *ctx) - : m_browserContext(ctx) - { - } - - std::string GetAcceptLanguage() const Q_DECL_OVERRIDE - { - return m_browserContext->httpAcceptLanguage().toStdString(); - } - - std::string GetUserAgent() const Q_DECL_OVERRIDE - { - return m_browserContext->httpUserAgent().toStdString(); - } -}; - void URLRequestContextGetterQt::generateUserAgent() { + Q_ASSERT(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); Q_ASSERT(m_urlRequestContext); Q_ASSERT(m_storage); - m_storage->set_http_user_agent_settings(scoped_ptr<net::HttpUserAgentSettings>(new HttpUserAgentSettingsQt(m_browserContext.constData()))); + m_storage->set_http_user_agent_settings(scoped_ptr<net::HttpUserAgentSettings>( + new net::StaticHttpUserAgentSettings(m_browserContext->httpAcceptLanguage().toStdString(), m_browserContext->httpUserAgent().toStdString()))); } void URLRequestContextGetterQt::updateHttpCache() { - if (m_urlRequestContext && !m_updateHttpCache && !m_proxyConfigService) { - m_updateHttpCache = 1; + Q_ASSERT(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); + // Do not trigger a new update if another is already triggered + if (m_urlRequestContext && !m_proxyConfigService && !m_updateHttpCache.fetchAndStoreRelaxed(1)) content::BrowserThread::PostTask(content::BrowserThread::IO, FROM_HERE, base::Bind(&URLRequestContextGetterQt::generateHttpCache, this)); - } } void URLRequestContextGetterQt::updateJobFactory() { - Q_ASSERT(m_jobFactory); + Q_ASSERT(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); - content::BrowserThread::PostTask(content::BrowserThread::IO, FROM_HERE, base::Bind(&URLRequestContextGetterQt::generateJobFactory, this)); + if (m_urlRequestContext && !m_updateJobFactory.fetchAndStoreRelaxed(1)) + content::BrowserThread::PostTask(content::BrowserThread::IO, FROM_HERE, + base::Bind(&URLRequestContextGetterQt::regenerateJobFactory, + this, m_browserContext->customUrlSchemes())); } static bool doNetworkSessionParamsMatch(const net::HttpNetworkSession::Params &first, const net::HttpNetworkSession::Params &second) @@ -357,6 +351,7 @@ net::HttpNetworkSession::Params URLRequestContextGetterQt::generateNetworkSessio void URLRequestContextGetterQt::generateHttpCache() { + Q_ASSERT(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); Q_ASSERT(m_urlRequestContext); Q_ASSERT(m_storage); @@ -420,9 +415,10 @@ void URLRequestContextGetterQt::clearCurrentCacheBackend() void URLRequestContextGetterQt::generateJobFactory() { + Q_ASSERT(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); Q_ASSERT(m_urlRequestContext); + Q_ASSERT(!m_jobFactory); - m_jobFactory.reset(); scoped_ptr<net::URLRequestJobFactoryImpl> jobFactory(new net::URLRequestJobFactoryImpl()); { @@ -430,6 +426,7 @@ void URLRequestContextGetterQt::generateJobFactory() content::ProtocolHandlerMap::iterator it = m_protocolHandlers.find(url::kBlobScheme); Q_ASSERT(it != m_protocolHandlers.end()); jobFactory->SetProtocolHandler(it->first, scoped_ptr<net::URLRequestJobFactory::ProtocolHandler>(it->second.release())); + m_protocolHandlers.clear(); } jobFactory->SetProtocolHandler(url::kDataScheme, scoped_ptr<net::URLRequestJobFactory::ProtocolHandler>(new net::DataProtocolHandler())); @@ -440,10 +437,12 @@ void URLRequestContextGetterQt::generateJobFactory() jobFactory->SetProtocolHandler(url::kFtpScheme, scoped_ptr<net::URLRequestJobFactory::ProtocolHandler>(new net::FtpProtocolHandler(new net::FtpNetworkLayer(m_urlRequestContext->host_resolver())))); - QHash<QByteArray, QWebEngineUrlSchemeHandler*>::const_iterator it = m_browserContext->customUrlSchemeHandlers().constBegin(); - const QHash<QByteArray, QWebEngineUrlSchemeHandler*>::const_iterator end = m_browserContext->customUrlSchemeHandlers().constEnd(); - for (; it != end; ++it) - jobFactory->SetProtocolHandler(it.key().toStdString(), scoped_ptr<net::URLRequestJobFactory::ProtocolHandler>(new CustomProtocolHandler(it.value()))); + m_installedCustomSchemes = m_browserContext->customUrlSchemes(); + Q_FOREACH (const QByteArray &scheme, m_installedCustomSchemes) { + jobFactory->SetProtocolHandler(scheme.toStdString(), scoped_ptr<net::URLRequestJobFactory::ProtocolHandler>(new CustomProtocolHandler(m_browserContext))); + } + + m_baseJobFactory = jobFactory.get(); // Set up interceptors in the reverse order. scoped_ptr<net::URLRequestJobFactory> topJobFactory = std::move(jobFactory); @@ -458,6 +457,27 @@ void URLRequestContextGetterQt::generateJobFactory() m_urlRequestContext->set_job_factory(m_jobFactory.get()); } +void URLRequestContextGetterQt::regenerateJobFactory(const QList<QByteArray> customSchemes) +{ + Q_ASSERT(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); + Q_ASSERT(m_urlRequestContext); + Q_ASSERT(m_jobFactory); + Q_ASSERT(m_baseJobFactory); + + m_updateJobFactory.storeRelease(0); + if (customSchemes == m_installedCustomSchemes) + return; + + Q_FOREACH (const QByteArray &scheme, m_installedCustomSchemes) { + m_baseJobFactory->SetProtocolHandler(scheme.toStdString(), nullptr); + } + + m_installedCustomSchemes = customSchemes; + Q_FOREACH (const QByteArray &scheme, m_installedCustomSchemes) { + m_baseJobFactory->SetProtocolHandler(scheme.toStdString(), scoped_ptr<net::URLRequestJobFactory::ProtocolHandler>(new CustomProtocolHandler(m_browserContext))); + } +} + scoped_refptr<base::SingleThreadTaskRunner> URLRequestContextGetterQt::GetNetworkTaskRunner() const { return content::BrowserThread::GetMessageLoopProxyForThread(content::BrowserThread::IO); diff --git a/src/core/url_request_context_getter_qt.h b/src/core/url_request_context_getter_qt.h index 13d6e2f72..7078c7a44 100644 --- a/src/core/url_request_context_getter_qt.h +++ b/src/core/url_request_context_getter_qt.h @@ -56,8 +56,9 @@ #include "cookie_monster_delegate_qt.h" #include "network_delegate_qt.h" -#include "qglobal.h" -#include <qatomic.h> +#include <QtCore/qglobal.h> +#include <QtCore/qatomic.h> +#include <QtCore/qsharedpointer.h> namespace net { class MappedHostResolver; @@ -70,7 +71,7 @@ class BrowserContextAdapter; class URLRequestContextGetterQt : public net::URLRequestContextGetter { public: - explicit URLRequestContextGetterQt(BrowserContextAdapter *browserContext, content::ProtocolHandlerMap *protocolHandlers, content::URLRequestInterceptorScopedVector request_interceptors); + URLRequestContextGetterQt(QSharedPointer<BrowserContextAdapter> browserContext, content::ProtocolHandlerMap *protocolHandlers, content::URLRequestInterceptorScopedVector request_interceptors); virtual net::URLRequestContext *GetURLRequestContext() Q_DECL_OVERRIDE; virtual scoped_refptr<base::SingleThreadTaskRunner> GetNetworkTaskRunner() const Q_DECL_OVERRIDE; @@ -92,6 +93,7 @@ private: void generateHttpCache(); void generateUserAgent(); void generateJobFactory(); + void regenerateJobFactory(const QList<QByteArray> customSchemes); void clearCurrentCacheBackend(); void cancelAllUrlRequests(); net::HttpNetworkSession::Params generateNetworkSessionParams(); @@ -99,7 +101,8 @@ private: bool m_ignoreCertificateErrors; QAtomicInt m_updateCookieStore; QAtomicInt m_updateHttpCache; - QExplicitlySharedDataPointer<BrowserContextAdapter> m_browserContext; + QAtomicInt m_updateJobFactory; + QSharedPointer<BrowserContextAdapter> m_browserContext; content::ProtocolHandlerMap m_protocolHandlers; QAtomicPointer<net::ProxyConfigService> m_proxyConfigService; @@ -107,10 +110,12 @@ private: scoped_ptr<NetworkDelegateQt> m_networkDelegate; scoped_ptr<net::URLRequestContextStorage> m_storage; scoped_ptr<net::URLRequestJobFactory> m_jobFactory; + net::URLRequestJobFactoryImpl *m_baseJobFactory; scoped_ptr<net::DhcpProxyScriptFetcherFactory> m_dhcpProxyScriptFetcherFactory; scoped_refptr<CookieMonsterDelegateQt> m_cookieDelegate; content::URLRequestInterceptorScopedVector m_requestInterceptors; scoped_ptr<net::HttpNetworkSession> m_httpNetworkSession; + QList<QByteArray> m_installedCustomSchemes; friend class NetworkDelegateQt; }; diff --git a/src/core/url_request_custom_job.cpp b/src/core/url_request_custom_job.cpp index 79a54650c..921be0b41 100644 --- a/src/core/url_request_custom_job.cpp +++ b/src/core/url_request_custom_job.cpp @@ -42,6 +42,7 @@ #include "api/qwebengineurlrequestjob.h" #include "api/qwebengineurlschemehandler.h" +#include "browser_context_adapter.h" #include "type_conversion.h" #include "content/public/browser/browser_thread.h" @@ -57,9 +58,11 @@ using namespace net; namespace QtWebEngineCore { -URLRequestCustomJob::URLRequestCustomJob(URLRequest *request, NetworkDelegate *networkDelegate, QWebEngineUrlSchemeHandler *schemeHandler) +URLRequestCustomJob::URLRequestCustomJob(URLRequest *request, NetworkDelegate *networkDelegate, + const std::string &scheme, QWeakPointer<const BrowserContextAdapter> adapter) : URLRequestJob(request, networkDelegate) - , m_schemeHandler(schemeHandler) + , m_scheme(scheme) + , m_adapter(adapter) , m_shared(new URLRequestCustomJobShared(this)) { } @@ -328,11 +331,22 @@ void URLRequestCustomJobShared::startAsync() delete this; return; } - m_delegate = new URLRequestCustomJobDelegate(this); - m_asyncInitialized = true; - QWebEngineUrlRequestJob *requestJob = new QWebEngineUrlRequestJob(m_delegate); - if (m_job) - m_job->m_schemeHandler->requestStarted(requestJob); + + QWebEngineUrlSchemeHandler *schemeHandler = 0; + QSharedPointer<const BrowserContextAdapter> browserContext = m_job->m_adapter.toStrongRef(); + if (browserContext) + schemeHandler = browserContext->customUrlSchemeHandlers()[toQByteArray(m_job->m_scheme)]; + if (schemeHandler) { + m_delegate = new URLRequestCustomJobDelegate(this); + m_asyncInitialized = true; + QWebEngineUrlRequestJob *requestJob = new QWebEngineUrlRequestJob(m_delegate); + schemeHandler->requestStarted(requestJob); + } else { + lock.unlock(); + abort(); + delete this; + return; + } } } // namespace diff --git a/src/core/url_request_custom_job.h b/src/core/url_request_custom_job.h index e9f48216b..226c39e68 100644 --- a/src/core/url_request_custom_job.h +++ b/src/core/url_request_custom_job.h @@ -48,17 +48,17 @@ #include <QtCore/QPointer> QT_FORWARD_DECLARE_CLASS(QIODevice) -QT_FORWARD_DECLARE_CLASS(QWebEngineUrlSchemeHandler) namespace QtWebEngineCore { +class BrowserContextAdapter; class URLRequestCustomJobDelegate; class URLRequestCustomJobShared; // A request job that handles reading custom URL schemes class URLRequestCustomJob : public net::URLRequestJob { public: - URLRequestCustomJob(net::URLRequest *request, net::NetworkDelegate *networkDelegate, QWebEngineUrlSchemeHandler *schemeHandler); + URLRequestCustomJob(net::URLRequest *request, net::NetworkDelegate *networkDelegate, const std::string &scheme, QWeakPointer<const BrowserContextAdapter> adapter); virtual void Start() Q_DECL_OVERRIDE; virtual void Kill() Q_DECL_OVERRIDE; virtual int ReadRawData(net::IOBuffer* buf, int buf_size) Q_DECL_OVERRIDE;; @@ -70,7 +70,8 @@ protected: virtual ~URLRequestCustomJob(); private: - QWebEngineUrlSchemeHandler *m_schemeHandler; + std::string m_scheme; + QWeakPointer<const BrowserContextAdapter> m_adapter; URLRequestCustomJobShared *m_shared; friend class URLRequestCustomJobShared; diff --git a/src/core/web_contents_adapter.cpp b/src/core/web_contents_adapter.cpp index 1d937b62d..116cd704e 100644 --- a/src/core/web_contents_adapter.cpp +++ b/src/core/web_contents_adapter.cpp @@ -517,6 +517,7 @@ void WebContentsAdapter::setContent(const QByteArray &data, const QString &mimeT params.virtual_url_for_data_url = baseUrl.isEmpty() ? GURL(url::kAboutBlankURL) : toGurl(baseUrl); params.can_load_local_resources = true; params.transition_type = ui::PageTransitionFromInt(ui::PAGE_TRANSITION_TYPED | ui::PAGE_TRANSITION_FROM_API); + params.override_user_agent = content::NavigationController::UA_OVERRIDE_TRUE; d->webContents->GetController().LoadURLWithParams(params); d->webContents->Focus(); } @@ -708,7 +709,15 @@ void WebContentsAdapter::setZoomFactor(qreal factor) Q_D(WebContentsAdapter); if (factor < content::kMinimumZoomFactor || factor > content::kMaximumZoomFactor) return; - content::HostZoomMap::SetZoomLevel(d->webContents.get(), content::ZoomFactorToZoomLevel(static_cast<double>(factor))); + + double zoomLevel = content::ZoomFactorToZoomLevel(static_cast<double>(factor)); + content::HostZoomMap *zoomMap = content::HostZoomMap::GetForWebContents(d->webContents.get()); + + if (zoomMap) { + int render_process_id = d->webContents->GetRenderProcessHost()->GetID(); + int render_view_id = d->webContents->GetRenderViewHost()->GetRoutingID(); + zoomMap->SetTemporaryZoomLevel(render_process_id, render_view_id, zoomLevel); + } } qreal WebContentsAdapter::currentZoomFactor() const diff --git a/src/core/web_contents_adapter_client.h b/src/core/web_contents_adapter_client.h index f99cedcad..80aabaa4d 100644 --- a/src/core/web_contents_adapter_client.h +++ b/src/core/web_contents_adapter_client.h @@ -258,8 +258,9 @@ public: virtual void startDragging(const content::DropData &dropData, Qt::DropActions allowedActions, const QPixmap &pixmap, const QPoint &offset) = 0; - virtual BrowserContextAdapter* browserContextAdapter() = 0; + virtual QSharedPointer<BrowserContextAdapter> browserContextAdapter() = 0; virtual WebContentsAdapter* webContentsAdapter() = 0; + }; } // namespace QtWebEngineCore diff --git a/src/core/web_contents_adapter_p.h b/src/core/web_contents_adapter_p.h index 0507ebf4a..5c0e83298 100644 --- a/src/core/web_contents_adapter_p.h +++ b/src/core/web_contents_adapter_p.h @@ -57,8 +57,8 @@ #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" -#include <QExplicitlySharedDataPointer> #include <QScopedPointer> +#include <QSharedPointer> QT_FORWARD_DECLARE_CLASS(QTimer) QT_FORWARD_DECLARE_CLASS(QWebChannel) @@ -83,7 +83,7 @@ public: WebContentsAdapterPrivate(); ~WebContentsAdapterPrivate(); scoped_refptr<WebEngineContext> engineContext; - QExplicitlySharedDataPointer<BrowserContextAdapter> browserContextAdapter; + QSharedPointer<BrowserContextAdapter> browserContextAdapter; scoped_ptr<content::WebContents> webContents; scoped_ptr<WebContentsDelegateQt> webContentsDelegate; scoped_ptr<RenderViewObserverHostQt> renderViewObserverHost; diff --git a/src/core/web_engine_context.cpp b/src/core/web_engine_context.cpp index b3bfc432b..6da80e94d 100644 --- a/src/core/web_engine_context.cpp +++ b/src/core/web_engine_context.cpp @@ -164,7 +164,7 @@ namespace QtWebEngineCore { void WebEngineContext::destroyBrowserContext() { - m_defaultBrowserContext = 0; + m_defaultBrowserContext.reset(); } void WebEngineContext::destroy() @@ -198,11 +198,11 @@ scoped_refptr<WebEngineContext> WebEngineContext::current() return sContext; } -BrowserContextAdapter* WebEngineContext::defaultBrowserContext() +QSharedPointer<BrowserContextAdapter> WebEngineContext::defaultBrowserContext() { if (!m_defaultBrowserContext) - m_defaultBrowserContext = new BrowserContextAdapter(QStringLiteral("Default")); - return m_defaultBrowserContext.data(); + m_defaultBrowserContext = QSharedPointer<BrowserContextAdapter>::create(QStringLiteral("Default")); + return m_defaultBrowserContext; } QObject *WebEngineContext::globalQObject() diff --git a/src/core/web_engine_context.h b/src/core/web_engine_context.h index 3c69d87ca..960f8ed47 100644 --- a/src/core/web_engine_context.h +++ b/src/core/web_engine_context.h @@ -47,7 +47,7 @@ #include "base/values.h" #include "components/devtools_http_handler/devtools_http_handler.h" -#include <QExplicitlySharedDataPointer> +#include <QSharedPointer> namespace base { class RunLoop; @@ -76,7 +76,7 @@ class WebEngineContext : public base::RefCounted<WebEngineContext> { public: static scoped_refptr<WebEngineContext> current(); - QtWebEngineCore::BrowserContextAdapter *defaultBrowserContext(); + QSharedPointer<QtWebEngineCore::BrowserContextAdapter> defaultBrowserContext(); QObject *globalQObject(); #if defined(ENABLE_BASIC_PRINTING) printing::PrintJobManager* getPrintJobManager(); @@ -94,7 +94,7 @@ private: scoped_ptr<content::ContentMainRunner> m_contentRunner; scoped_ptr<content::BrowserMainRunner> m_browserRunner; QObject* m_globalQObject; - QExplicitlySharedDataPointer<BrowserContextAdapter> m_defaultBrowserContext; + QSharedPointer<QtWebEngineCore::BrowserContextAdapter> m_defaultBrowserContext; scoped_ptr<devtools_http_handler::DevToolsHttpHandler> m_devtools; #if defined(ENABLE_BASIC_PRINTING) scoped_ptr<printing::PrintJobManager> m_printJobManager; diff --git a/src/webengine/api/qquickwebenginehistory.cpp b/src/webengine/api/qquickwebenginehistory.cpp index 96a4415e0..8c7662028 100644 --- a/src/webengine/api/qquickwebenginehistory.cpp +++ b/src/webengine/api/qquickwebenginehistory.cpp @@ -223,7 +223,7 @@ QQuickWebEngineHistoryPrivate::~QQuickWebEngineHistoryPrivate() The WebEngineHistory type can be accessed by using the \l{WebEngineView::navigationHistory}{WebEngineView.navigationHistory} property. - The WebEngineHistory type providess the following WebEngineHistoryListModel data model objects: + The WebEngineHistory type provides the following WebEngineHistoryListModel data model objects: \list \li \c backItems, which contains the URLs of visited pages. @@ -283,9 +283,8 @@ QQuickWebEngineHistory::~QQuickWebEngineHistory() } /*! - \qmlproperty QQuickWebEngineHistoryListModel WebEngineHistory::items + \qmlproperty WebEngineHistoryListModel WebEngineHistory::items \readonly - \since QtWebEngine 1.1 URLs of back items, forward items, and the current item in the history. */ @@ -298,9 +297,8 @@ QQuickWebEngineHistoryListModel *QQuickWebEngineHistory::items() const } /*! - \qmlproperty QQuickWebEngineHistoryListModel WebEngineHistory::backItems + \qmlproperty WebEngineHistoryListModel WebEngineHistory::backItems \readonly - \since QtWebEngine 1.1 URLs of visited pages. */ @@ -313,9 +311,8 @@ QQuickWebEngineHistoryListModel *QQuickWebEngineHistory::backItems() const } /*! - \qmlproperty QQuickWebEngineHistoryListModel WebEngineHistory::forwardItems + \qmlproperty WebEngineHistoryListModel WebEngineHistory::forwardItems \readonly - \since QtWebEngine 1.1 URLs of the pages that were visited after visiting the current page. */ diff --git a/src/webengine/api/qquickwebengineprofile.cpp b/src/webengine/api/qquickwebengineprofile.cpp index f38422966..d7a84c106 100644 --- a/src/webengine/api/qquickwebengineprofile.cpp +++ b/src/webengine/api/qquickwebengineprofile.cpp @@ -134,7 +134,7 @@ ASSERT_ENUMS_MATCH(QQuickWebEngineDownloadItem::MimeHtmlSaveFormat, QtWebEngineC The \a download argument holds the state of the finished download instance. */ -QQuickWebEngineProfilePrivate::QQuickWebEngineProfilePrivate(BrowserContextAdapter* browserContext) +QQuickWebEngineProfilePrivate::QQuickWebEngineProfilePrivate(QSharedPointer<BrowserContextAdapter> browserContext) : m_settings(new QQuickWebEngineSettings()) , m_browserContextRef(browserContext) { @@ -261,7 +261,7 @@ void QQuickWebEngineProfilePrivate::downloadUpdated(const DownloadItemInfo &info */ QQuickWebEngineProfile::QQuickWebEngineProfile(QObject *parent) : QObject(parent), - d_ptr(new QQuickWebEngineProfilePrivate(new BrowserContextAdapter(false))) + d_ptr(new QQuickWebEngineProfilePrivate(QSharedPointer<BrowserContextAdapter>::create(false))) { // Sets up the global WebEngineContext QQuickWebEngineProfile::defaultProfile(); @@ -822,8 +822,7 @@ void QQuickWebEngineProfile::removeUrlScheme(const QByteArray &scheme) void QQuickWebEngineProfile::removeAllUrlSchemeHandlers() { Q_D(QQuickWebEngineProfile); - d->browserContext()->customUrlSchemeHandlers().clear(); - d->browserContext()->updateCustomUrlSchemeHandlers(); + d->browserContext()->clearCustomUrlSchemeHandlers(); } void QQuickWebEngineProfile::destroyedUrlSchemeHandler(QWebEngineUrlSchemeHandler *obj) diff --git a/src/webengine/api/qquickwebengineprofile_p.h b/src/webengine/api/qquickwebengineprofile_p.h index f9bb08500..1ba1eb53f 100644 --- a/src/webengine/api/qquickwebengineprofile_p.h +++ b/src/webengine/api/qquickwebengineprofile_p.h @@ -58,6 +58,7 @@ #include <QExplicitlySharedDataPointer> #include <QMap> #include <QPointer> +#include <QSharedPointer> QT_BEGIN_NAMESPACE @@ -67,10 +68,10 @@ class QQuickWebEngineSettings; class QQuickWebEngineProfilePrivate : public QtWebEngineCore::BrowserContextAdapterClient { public: Q_DECLARE_PUBLIC(QQuickWebEngineProfile) - QQuickWebEngineProfilePrivate(QtWebEngineCore::BrowserContextAdapter* browserContext); + QQuickWebEngineProfilePrivate(QSharedPointer<QtWebEngineCore::BrowserContextAdapter> browserContext); ~QQuickWebEngineProfilePrivate(); - QtWebEngineCore::BrowserContextAdapter *browserContext() const { return m_browserContextRef.data(); } + QSharedPointer<QtWebEngineCore::BrowserContextAdapter> browserContext() const { return m_browserContextRef; } QQuickWebEngineSettings *settings() const { return m_settings.data(); } void cancelDownload(quint32 downloadId); @@ -83,7 +84,7 @@ private: friend class QQuickWebEngineViewPrivate; QQuickWebEngineProfile *q_ptr; QScopedPointer<QQuickWebEngineSettings> m_settings; - QExplicitlySharedDataPointer<QtWebEngineCore::BrowserContextAdapter> m_browserContextRef; + QSharedPointer<QtWebEngineCore::BrowserContextAdapter> m_browserContextRef; QMap<quint32, QPointer<QQuickWebEngineDownloadItem> > m_ongoingDownloads; }; diff --git a/src/webengine/api/qquickwebengineview.cpp b/src/webengine/api/qquickwebengineview.cpp index 122ae2350..0f50328e6 100644 --- a/src/webengine/api/qquickwebengineview.cpp +++ b/src/webengine/api/qquickwebengineview.cpp @@ -123,6 +123,7 @@ QQuickWebEngineViewPrivate::QQuickWebEngineViewPrivate() , m_webChannelWorld(0) , m_dpiScale(1.0) , m_backgroundColor(Qt::white) + , m_defaultZoomFactor(1.0) { // The gold standard for mobile web content is 160 dpi, and the devicePixelRatio expected // is the (possibly quantized) ratio of device dpi to 160 dpi. @@ -652,7 +653,7 @@ QObject *QQuickWebEngineViewPrivate::accessibilityParentObject() } #endif // QT_NO_ACCESSIBILITY -BrowserContextAdapter *QQuickWebEngineViewPrivate::browserContextAdapter() +QSharedPointer<BrowserContextAdapter> QQuickWebEngineViewPrivate::browserContextAdapter() { return m_profile->d_ptr->browserContext(); } @@ -771,6 +772,10 @@ void QQuickWebEngineViewPrivate::adoptWebContents(WebContentsAdapter *webContent Q_FOREACH (QQuickWebEngineScript *script, m_userScripts) script->d_func()->bind(browserContextAdapter()->userResourceController(), adapter.data()); + // set the zoomFactor if it had been changed on the old adapter. + if (!qFuzzyCompare(adapter->currentZoomFactor(), m_defaultZoomFactor)) + q->setZoomFactor(m_defaultZoomFactor); + // Emit signals for values that might be different from the previous WebContentsAdapter. emit q->titleChanged(); emit q->urlChanged(); @@ -807,6 +812,7 @@ QQuickWebEngineView::~QQuickWebEngineView() void QQuickWebEngineViewPrivate::ensureContentsAdapter() { + Q_Q(QQuickWebEngineView); if (!adapter) { adapter = new WebContentsAdapter(); adapter->initialize(this); @@ -819,6 +825,10 @@ void QQuickWebEngineViewPrivate::ensureContentsAdapter() // push down the page's user scripts Q_FOREACH (QQuickWebEngineScript *script, m_userScripts) script->d_func()->bind(browserContextAdapter()->userResourceController(), adapter.data()); + // set the zoomFactor if it had been changed on the old adapter. + if (!qFuzzyCompare(adapter->currentZoomFactor(), m_defaultZoomFactor)) + q->setZoomFactor(m_defaultZoomFactor); + } } @@ -910,8 +920,11 @@ void QQuickWebEngineView::stop() void QQuickWebEngineView::setZoomFactor(qreal arg) { Q_D(QQuickWebEngineView); + d->m_defaultZoomFactor = arg; + if (!d->adapter) return; + qreal oldFactor = d->adapter->currentZoomFactor(); d->adapter->setZoomFactor(arg); if (qFuzzyCompare(oldFactor, d->adapter->currentZoomFactor())) @@ -1139,7 +1152,7 @@ qreal QQuickWebEngineView::zoomFactor() const { Q_D(const QQuickWebEngineView); if (!d->adapter) - return 1.0; + return d->m_defaultZoomFactor; return d->adapter->currentZoomFactor(); } diff --git a/src/webengine/api/qquickwebengineview_p_p.h b/src/webengine/api/qquickwebengineview_p_p.h index 892e99cb9..82a9e9612 100644 --- a/src/webengine/api/qquickwebengineview_p_p.h +++ b/src/webengine/api/qquickwebengineview_p_p.h @@ -188,7 +188,7 @@ public: void startDragging(const content::DropData &dropData, Qt::DropActions allowedActions, const QPixmap &pixmap, const QPoint &offset) Q_DECL_OVERRIDE; - virtual QtWebEngineCore::BrowserContextAdapter *browserContextAdapter() Q_DECL_OVERRIDE; + virtual QSharedPointer<QtWebEngineCore::BrowserContextAdapter> browserContextAdapter() Q_DECL_OVERRIDE; QtWebEngineCore::WebContentsAdapter *webContentsAdapter() Q_DECL_OVERRIDE; void setDevicePixelRatio(qreal); @@ -232,6 +232,7 @@ private: QList<QQuickWebEngineScript *> m_userScripts; qreal m_dpiScale; QColor m_backgroundColor; + qreal m_defaultZoomFactor; }; #ifndef QT_NO_ACCESSIBILITY diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp index 8ba6c8770..54989caaf 100644 --- a/src/webenginewidgets/api/qwebenginepage.cpp +++ b/src/webenginewidgets/api/qwebenginepage.cpp @@ -484,7 +484,7 @@ void QWebEnginePagePrivate::setFullScreenMode(bool fullscreen) } } -BrowserContextAdapter *QWebEnginePagePrivate::browserContextAdapter() +QSharedPointer<BrowserContextAdapter> QWebEnginePagePrivate::browserContextAdapter() { return profile->d_ptr->browserContext(); } diff --git a/src/webenginewidgets/api/qwebenginepage_p.h b/src/webenginewidgets/api/qwebenginepage_p.h index 58515bfbe..22bfaff95 100644 --- a/src/webenginewidgets/api/qwebenginepage_p.h +++ b/src/webenginewidgets/api/qwebenginepage_p.h @@ -136,7 +136,7 @@ public: void startDragging(const content::DropData &dropData, Qt::DropActions allowedActions, const QPixmap &pixmap, const QPoint &offset) Q_DECL_OVERRIDE; - virtual QtWebEngineCore::BrowserContextAdapter *browserContextAdapter() Q_DECL_OVERRIDE; + virtual QSharedPointer<QtWebEngineCore::BrowserContextAdapter> browserContextAdapter() Q_DECL_OVERRIDE; QtWebEngineCore::WebContentsAdapter *webContentsAdapter() Q_DECL_OVERRIDE; void updateAction(QWebEnginePage::WebAction) const; diff --git a/src/webenginewidgets/api/qwebengineprofile.cpp b/src/webenginewidgets/api/qwebengineprofile.cpp index 3a2254427..2dab0aa08 100644 --- a/src/webenginewidgets/api/qwebengineprofile.cpp +++ b/src/webenginewidgets/api/qwebengineprofile.cpp @@ -140,7 +140,7 @@ using QtWebEngineCore::BrowserContextAdapter; \sa QWebEngineDownloadItem */ -QWebEngineProfilePrivate::QWebEngineProfilePrivate(BrowserContextAdapter* browserContext) +QWebEngineProfilePrivate::QWebEngineProfilePrivate(QSharedPointer<BrowserContextAdapter> browserContext) : m_settings(new QWebEngineSettings()) , m_scriptCollection(new QWebEngineScriptCollection(new QWebEngineScriptCollectionPrivate(browserContext->userResourceController()))) , m_browserContextRef(browserContext) @@ -235,7 +235,7 @@ void QWebEngineProfilePrivate::downloadUpdated(const DownloadItemInfo &info) */ QWebEngineProfile::QWebEngineProfile(QObject *parent) : QObject(parent) - , d_ptr(new QWebEngineProfilePrivate(new BrowserContextAdapter(true))) + , d_ptr(new QWebEngineProfilePrivate(QSharedPointer<BrowserContextAdapter>::create(true))) { d_ptr->q_ptr = this; } @@ -252,7 +252,7 @@ QWebEngineProfile::QWebEngineProfile(QObject *parent) */ QWebEngineProfile::QWebEngineProfile(const QString &storageName, QObject *parent) : QObject(parent) - , d_ptr(new QWebEngineProfilePrivate(new BrowserContextAdapter(storageName))) + , d_ptr(new QWebEngineProfilePrivate(QSharedPointer<BrowserContextAdapter>::create(storageName))) { d_ptr->q_ptr = this; } @@ -712,8 +712,7 @@ void QWebEngineProfile::removeUrlScheme(const QByteArray &scheme) void QWebEngineProfile::removeAllUrlSchemeHandlers() { Q_D(QWebEngineProfile); - d->browserContext()->customUrlSchemeHandlers().clear(); - d->browserContext()->updateCustomUrlSchemeHandlers(); + d->browserContext()->clearCustomUrlSchemeHandlers(); } void QWebEngineProfile::destroyedUrlSchemeHandler(QWebEngineUrlSchemeHandler *obj) diff --git a/src/webenginewidgets/api/qwebengineprofile_p.h b/src/webenginewidgets/api/qwebengineprofile_p.h index 9809da42e..4d31c5a81 100644 --- a/src/webenginewidgets/api/qwebengineprofile_p.h +++ b/src/webenginewidgets/api/qwebengineprofile_p.h @@ -57,6 +57,7 @@ #include <QMap> #include <QPointer> #include <QScopedPointer> +#include <QSharedPointer> namespace QtWebEngineCore { class BrowserContextAdapter; @@ -69,10 +70,10 @@ class QWebEngineSettings; class QWebEngineProfilePrivate : public QtWebEngineCore::BrowserContextAdapterClient { public: Q_DECLARE_PUBLIC(QWebEngineProfile) - QWebEngineProfilePrivate(QtWebEngineCore::BrowserContextAdapter* browserContext); + QWebEngineProfilePrivate(QSharedPointer<QtWebEngineCore::BrowserContextAdapter> browserContext); ~QWebEngineProfilePrivate(); - QtWebEngineCore::BrowserContextAdapter *browserContext() const { return m_browserContextRef.data(); } + QSharedPointer<QtWebEngineCore::BrowserContextAdapter> browserContext() const { return m_browserContextRef; } QWebEngineSettings *settings() const { return m_settings; } void cancelDownload(quint32 downloadId); @@ -85,7 +86,7 @@ private: QWebEngineProfile *q_ptr; QWebEngineSettings *m_settings; QScopedPointer<QWebEngineScriptCollection> m_scriptCollection; - QExplicitlySharedDataPointer<QtWebEngineCore::BrowserContextAdapter> m_browserContextRef; + QSharedPointer<QtWebEngineCore::BrowserContextAdapter> m_browserContextRef; QMap<quint32, QPointer<QWebEngineDownloadItem> > m_ongoingDownloads; }; |