diff options
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/api/qwebengineloadinginfo.cpp | 23 | ||||
-rw-r--r-- | src/core/api/qwebengineloadinginfo.h | 15 | ||||
-rw-r--r-- | src/core/api/qwebenginepage.cpp | 21 | ||||
-rw-r--r-- | src/core/api/qwebenginepage_p.h | 4 | ||||
-rw-r--r-- | src/core/web_contents_adapter.cpp | 13 | ||||
-rw-r--r-- | src/core/web_contents_adapter_client.h | 5 | ||||
-rw-r--r-- | src/core/web_contents_delegate_qt.cpp | 33 | ||||
-rw-r--r-- | src/core/web_contents_delegate_qt.h | 1 |
8 files changed, 70 insertions, 45 deletions
diff --git a/src/core/api/qwebengineloadinginfo.cpp b/src/core/api/qwebengineloadinginfo.cpp index fcbb2ce7a..03a31ab72 100644 --- a/src/core/api/qwebengineloadinginfo.cpp +++ b/src/core/api/qwebengineloadinginfo.cpp @@ -56,9 +56,11 @@ Q_STATIC_ASSERT(static_cast<int>(WebEngineError::DnsErrorDomain) == static_cast< class QWebEngineLoadingInfo::QWebEngineLoadingInfoPrivate : public QSharedData { public: - QWebEngineLoadingInfoPrivate(const QUrl& url, LoadStatus status, const QString& errorString, int errorCode, ErrorDomain errorDomain) + QWebEngineLoadingInfoPrivate(const QUrl& url, LoadStatus status, bool isErrorPage, + const QString& errorString, int errorCode, ErrorDomain errorDomain) : url(url) , status(status) + , isErrorPage(isErrorPage) , errorString(errorString) , errorCode(errorCode) , errorDomain(errorDomain) @@ -67,6 +69,7 @@ public: QUrl url; LoadStatus status; + bool isErrorPage; QString errorString; int errorCode; ErrorDomain errorDomain; @@ -83,9 +86,9 @@ public: \sa QWebEnginePage::loadStarted, QWebEnginePage::loadFinished, WebEngineView::loadingChanged */ -QWebEngineLoadingInfo::QWebEngineLoadingInfo(const QUrl& url, LoadStatus status, const QString& errorString, - int errorCode, ErrorDomain errorDomain) - : d_ptr(new QWebEngineLoadingInfoPrivate(url, status, errorString, errorCode, errorDomain)) +QWebEngineLoadingInfo::QWebEngineLoadingInfo(const QUrl& url, LoadStatus status, bool isErrorPage, + const QString& errorString, int errorCode, ErrorDomain errorDomain) + : d_ptr(new QWebEngineLoadingInfoPrivate(url, status, isErrorPage, errorString, errorCode, errorDomain)) { } @@ -133,6 +136,18 @@ LoadStatus QWebEngineLoadingInfo::status() const return d->status; } /*! + \property QWebEngineLoadingInfo::isErrorPage + \property Indicates if the load's resulted in an error page. +*/ +/*! + Returns true if the load's resulted is an error page. +*/ +bool QWebEngineLoadingInfo::isErrorPage() const +{ + Q_D(const QWebEngineLoadingInfo); + return d->isErrorPage; +} +/*! \property QWebEngineLoadingInfo::errorString \brief Holds the error message. */ diff --git a/src/core/api/qwebengineloadinginfo.h b/src/core/api/qwebengineloadinginfo.h index bd07d52a3..8aacb0281 100644 --- a/src/core/api/qwebengineloadinginfo.h +++ b/src/core/api/qwebengineloadinginfo.h @@ -45,12 +45,18 @@ #include <QObject> #include <QUrl> +namespace QtWebEngineCore { +class WebContentsAdapter; +class WebContentsDelegateQt; +} + QT_BEGIN_NAMESPACE class Q_WEBENGINECORE_EXPORT QWebEngineLoadingInfo { Q_GADGET Q_PROPERTY(QUrl url READ url CONSTANT FINAL) + Q_PROPERTY(bool isErrorPage READ isErrorPage CONSTANT FINAL) Q_PROPERTY(LoadStatus status READ status CONSTANT FINAL) Q_PROPERTY(QString errorString READ errorString CONSTANT FINAL) Q_PROPERTY(ErrorDomain errorDomain READ errorDomain CONSTANT FINAL) @@ -83,19 +89,22 @@ public: ~QWebEngineLoadingInfo(); QUrl url() const; + bool isErrorPage() const; LoadStatus status() const; QString errorString() const; ErrorDomain errorDomain() const; int errorCode() const; private: - QWebEngineLoadingInfo(const QUrl& url, LoadStatus status, const QString& errorString = QString(), - int errorCode = 0, ErrorDomain errorDomain = NoErrorDomain); + QWebEngineLoadingInfo(const QUrl& url, LoadStatus status, + bool isErrorPage = false, const QString& errorString = QString(), + int errorCode = 0, ErrorDomain errorDomain = NoErrorDomain); class QWebEngineLoadingInfoPrivate; Q_DECLARE_PRIVATE(QWebEngineLoadingInfo) QExplicitlySharedDataPointer<QWebEngineLoadingInfoPrivate> d_ptr; friend class QQuickWebEngineViewPrivate; - friend class QQuickWebEngineErrorPage; + friend class QtWebEngineCore::WebContentsAdapter; + friend class QtWebEngineCore::WebContentsDelegateQt; }; QT_END_NAMESPACE diff --git a/src/core/api/qwebenginepage.cpp b/src/core/api/qwebenginepage.cpp index 460b5a351..5298849f8 100644 --- a/src/core/api/qwebenginepage.cpp +++ b/src/core/api/qwebenginepage.cpp @@ -52,6 +52,7 @@ #include "qwebenginefullscreenrequest.h" #include "qwebenginehistory.h" #include "qwebenginehistory_p.h" +#include "qwebengineloadinginfo.h" #include "qwebenginenavigationrequest.h" #include "qwebenginenewwindowrequest.h" #include "qwebenginenotification.h" @@ -300,31 +301,19 @@ QColor QWebEnginePagePrivate::backgroundColor() const return m_backgroundColor; } -void QWebEnginePagePrivate::loadStarted(const QUrl &provisionalUrl, bool isErrorPage) +void QWebEnginePagePrivate::loadStarted(QWebEngineLoadingInfo /* info */) { - Q_UNUSED(provisionalUrl); Q_Q(QWebEnginePage); - - if (isErrorPage) - return; - isLoading = true; - QTimer::singleShot(0, q, &QWebEnginePage::loadStarted); } -void QWebEnginePagePrivate::loadFinished(bool success, const QUrl &url, bool isErrorPage, int errorCode, const QString &errorDescription) +void QWebEnginePagePrivate::loadFinished(QWebEngineLoadingInfo info) { Q_Q(QWebEnginePage); - Q_UNUSED(url); - Q_UNUSED(errorCode); - Q_UNUSED(errorDescription); - - if (isErrorPage) - return; - isLoading = false; - QTimer::singleShot(0, q, [q, success](){ + bool success = info.status() == QWebEngineLoadingInfo::LoadSucceededStatus; + QTimer::singleShot(0, q, [q, success] () { emit q->loadFinished(success); }); } diff --git a/src/core/api/qwebenginepage_p.h b/src/core/api/qwebenginepage_p.h index a830028f8..46dcf2ce8 100644 --- a/src/core/api/qwebenginepage_p.h +++ b/src/core/api/qwebenginepage_p.h @@ -134,10 +134,10 @@ public: void renderProcessPidChanged(qint64 pid) override; QRectF viewportRect() const override; QColor backgroundColor() const override; - void loadStarted(const QUrl &provisionalUrl, bool isErrorPage = false) override; + void loadStarted(QWebEngineLoadingInfo info) override; void loadCommitted() override { } void didFirstVisuallyNonEmptyPaint() override { } - void loadFinished(bool success, const QUrl &url, bool isErrorPage, int errorCode, const QString &errorDescription) override; + void loadFinished(QWebEngineLoadingInfo info) override; void focusContainer() override; void unhandledKeyEvent(QKeyEvent *event) override; QSharedPointer<QtWebEngineCore::WebContentsAdapter> diff --git a/src/core/web_contents_adapter.cpp b/src/core/web_contents_adapter.cpp index 16e91e6c7..4c156644d 100644 --- a/src/core/web_contents_adapter.cpp +++ b/src/core/web_contents_adapter.cpp @@ -55,6 +55,7 @@ #include "profile_adapter.h" #include "profile_qt.h" #include "qwebenginecallback_p.h" +#include "qwebengineloadinginfo.h" #include "renderer_host/web_engine_page_host.h" #include "render_widget_host_view_qt.h" #include "type_conversion.h" @@ -721,10 +722,11 @@ void WebContentsAdapter::load(const QWebEngineHttpRequest &request) params.load_type = content::NavigationController::LOAD_TYPE_HTTP_POST; // chromium accepts LOAD_TYPE_HTTP_POST only for the HTTP and HTTPS protocols if (!params.url.SchemeIsHTTPOrHTTPS()) { - m_adapterClient->loadFinished(false, request.url(), false, - net::ERR_DISALLOWED_URL_SCHEME, - QCoreApplication::translate("WebContentsAdapter", - "HTTP-POST data can only be sent over HTTP(S) protocol")); + m_adapterClient->loadFinished(QWebEngineLoadingInfo( + request.url(), QWebEngineLoadingInfo::LoadFailedStatus, false, + QCoreApplication::translate("WebContentsAdapter", + "HTTP-POST data can only be sent over HTTP(S) protocol"), + net::ERR_DISALLOWED_URL_SCHEME)); return; } params.post_data = network::ResourceRequestBody::CreateFromBytes( @@ -779,7 +781,8 @@ void WebContentsAdapter::setContent(const QByteArray &data, const QString &mimeT GURL dataUrlToLoad(urlString); if (dataUrlToLoad.spec().size() > url::kMaxURLChars) { - m_adapterClient->loadFinished(false, baseUrl, false, net::ERR_ABORTED, QString()); + m_adapterClient->loadFinished(QWebEngineLoadingInfo(baseUrl, QWebEngineLoadingInfo::LoadFailedStatus, + false, QString(), net::ERR_ABORTED)); return; } content::NavigationController::LoadURLParams params((dataUrlToLoad)); diff --git a/src/core/web_contents_adapter_client.h b/src/core/web_contents_adapter_client.h index b0bddf5b8..42a5a3ab0 100644 --- a/src/core/web_contents_adapter_client.h +++ b/src/core/web_contents_adapter_client.h @@ -64,6 +64,7 @@ QT_FORWARD_DECLARE_CLASS(QKeyEvent) QT_FORWARD_DECLARE_CLASS(QVariant) QT_FORWARD_DECLARE_CLASS(QWebEngineFindTextResult) +QT_FORWARD_DECLARE_CLASS(QWebEngineLoadingInfo) QT_FORWARD_DECLARE_CLASS(QWebEngineQuotaRequest) QT_FORWARD_DECLARE_CLASS(QWebEngineRegisterProtocolHandlerRequest) QT_FORWARD_DECLARE_CLASS(QWebEngineUrlRequestInfo) @@ -192,10 +193,10 @@ public: virtual void renderProcessPidChanged(qint64 pid) = 0; virtual QRectF viewportRect() const = 0; virtual QColor backgroundColor() const = 0; - virtual void loadStarted(const QUrl &provisionalUrl, bool isErrorPage = false) = 0; + virtual void loadStarted(QWebEngineLoadingInfo info) = 0; virtual void loadCommitted() = 0; virtual void didFirstVisuallyNonEmptyPaint() = 0; - virtual void loadFinished(bool success, const QUrl &url, bool isErrorPage, int errorCode, const QString &errorDescription) = 0; + virtual void loadFinished(QWebEngineLoadingInfo info) = 0; virtual void focusContainer() = 0; virtual void unhandledKeyEvent(QKeyEvent *event) = 0; virtual QSharedPointer<WebContentsAdapter> diff --git a/src/core/web_contents_delegate_qt.cpp b/src/core/web_contents_delegate_qt.cpp index 34e1f7ad1..a04ef700b 100644 --- a/src/core/web_contents_delegate_qt.cpp +++ b/src/core/web_contents_delegate_qt.cpp @@ -49,6 +49,7 @@ #include "file_picker_controller.h" #include "media_capture_devices_dispatcher.h" #include "profile_qt.h" +#include "qwebengineloadinginfo.h" #include "qwebengineregisterprotocolhandlerrequest.h" #include "register_protocol_handler_request_controller_impl.h" #include "render_widget_host_view_qt.h" @@ -58,6 +59,7 @@ #include "web_contents_adapter.h" #include "web_contents_view_qt.h" #include "web_engine_context.h" +#include "web_engine_error.h" #include "web_engine_settings.h" #include "certificate_error_controller.h" #include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h" @@ -344,11 +346,9 @@ void WebContentsDelegateQt::emitLoadStarted(bool isErrorPage) m_isDocumentEmpty = true; // reset to default which may only be overridden on actual resource load complete if (!isErrorPage) { m_loadingInfo.progress = 0; - m_viewClient->loadStarted(m_loadingInfo.url, false); + m_viewClient->loadStarted(QWebEngineLoadingInfo(m_loadingInfo.url, QWebEngineLoadingInfo::LoadStartedStatus)); m_viewClient->updateNavigationActions(); m_viewClient->loadProgressChanged(0); - } else { - m_viewClient->loadStarted(toQt(GURL(content::kUnreachableWebDataURL)), true); } } @@ -374,17 +374,25 @@ void WebContentsDelegateQt::emitLoadFinished(bool isErrorPage) Q_ASSERT(!isErrorPage || webEngineSettings()->testAttribute(QWebEngineSettings::ErrorPageEnabled)); Q_ASSERT((m_loadingInfo.triggersErrorPage && webEngineSettings()->testAttribute(QWebEngineSettings::ErrorPageEnabled)) || !m_loadingInfo.triggersErrorPage); - if (!isErrorPage) { - if (m_loadingInfo.progress < 100) { - m_loadingInfo.progress = 100; - m_viewClient->loadProgressChanged(100); - } + if (isErrorPage) { + m_loadingInfo.isErrorPage = isErrorPage; + return; + } - m_viewClient->loadFinished(m_loadingInfo.success, m_loadingInfo.url, false, m_loadingInfo.errorCode, m_loadingInfo.errorDescription); - m_viewClient->updateNavigationActions(); - } else { - m_viewClient->loadFinished(false, toQt(GURL(content::kUnreachableWebDataURL)), true, 0, QString()); + if (m_loadingInfo.progress < 100) { + m_loadingInfo.progress = 100; + m_viewClient->loadProgressChanged(100); } + + auto loadStatus = m_loadingInfo.success + ? QWebEngineLoadingInfo::LoadSucceededStatus + : (m_loadingInfo.errorCode == WebEngineError::UserAbortedError + ? QWebEngineLoadingInfo::LoadStoppedStatus : QWebEngineLoadingInfo::LoadFailedStatus); + auto errorDomain = static_cast<QWebEngineLoadingInfo::ErrorDomain>(WebEngineError::toQtErrorDomain(m_loadingInfo.errorCode)); + QWebEngineLoadingInfo info(m_loadingInfo.url, loadStatus, m_loadingInfo.isErrorPage, + m_loadingInfo.errorDescription, m_loadingInfo.errorCode, errorDomain); + m_viewClient->loadFinished(std::move(info)); + m_viewClient->updateNavigationActions(); } void WebContentsDelegateQt::emitLoadCommitted() @@ -422,7 +430,6 @@ void WebContentsDelegateQt::DidFinishNavigation(content::NavigationHandle *navig // The load will succede as an error-page load later, and we reported the original error above if (navigation_handle->IsErrorPage()) { // Now report we are starting to load an error-page. - emitLoadStarted(true); // If it is already committed we will not see another DidFinishNavigation call or a DidFinishLoad call. if (navigation_handle->HasCommitted()) diff --git a/src/core/web_contents_delegate_qt.h b/src/core/web_contents_delegate_qt.h index d6adcd77c..9ddd1d192 100644 --- a/src/core/web_contents_delegate_qt.h +++ b/src/core/web_contents_delegate_qt.h @@ -237,6 +237,7 @@ private: int progress = -1; bool isLoading() const { return progress >= 0; } QUrl url; + bool isErrorPage = false; int errorCode = 0; QString errorDescription; bool triggersErrorPage = false; |