diff options
Diffstat (limited to 'src/core/api/qwebenginedownloadrequest.cpp')
-rw-r--r-- | src/core/api/qwebenginedownloadrequest.cpp | 163 |
1 files changed, 59 insertions, 104 deletions
diff --git a/src/core/api/qwebenginedownloadrequest.cpp b/src/core/api/qwebenginedownloadrequest.cpp index 58f02ee4f..cbf46b448 100644 --- a/src/core/api/qwebenginedownloadrequest.cpp +++ b/src/core/api/qwebenginedownloadrequest.cpp @@ -1,49 +1,15 @@ -/**************************************************************************** -** -** 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$ -** -****************************************************************************/ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #include "qwebenginedownloadrequest.h" #include "qwebenginedownloadrequest_p.h" +#include "qwebenginepage.h" + #include "profile_adapter.h" +#include "web_contents_adapter_client.h" -#include <QDir> -#include "QFileInfo" +#include <QFileInfo> QT_BEGIN_NAMESPACE @@ -157,20 +123,9 @@ static inline QWebEngineDownloadRequest::DownloadInterruptReason toDownloadInter 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) - , m_adapterClient(nullptr) +QWebEngineDownloadRequestPrivate::QWebEngineDownloadRequestPrivate( + QtWebEngineCore::ProfileAdapter *adapter) + : profileAdapter(adapter) { } @@ -203,7 +158,6 @@ void QWebEngineDownloadRequestPrivate::update(const ProfileAdapterClient::Downlo totalBytes = info.totalBytes; Q_EMIT q->totalBytesChanged(); } - Q_EMIT q->downloadProgress(receivedBytes, totalBytes); } if (info.done) @@ -231,7 +185,7 @@ void QWebEngineDownloadRequestPrivate::setFinished() 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() + \sa isFinished, stateChanged() */ void QWebEngineDownloadRequest::accept() @@ -256,7 +210,7 @@ void QWebEngineDownloadRequest::accept() If the item is in any other state, then it will transition into the \l DownloadCancelled state without further effect. - \sa finished(), stateChanged() + \sa isFinished, stateChanged() */ void QWebEngineDownloadRequest::cancel() @@ -265,16 +219,22 @@ void QWebEngineDownloadRequest::cancel() QWebEngineDownloadRequest::DownloadState state = d->downloadState; - if (state == QWebEngineDownloadRequest::DownloadCompleted - || state == QWebEngineDownloadRequest::DownloadCancelled) + if (state == QWebEngineDownloadRequest::DownloadCompleted) + return; + + bool cancelled = state == QWebEngineDownloadRequest::DownloadCancelled; + if (cancelled) return; - // We directly cancel the download request if the user cancels - // before it even started, so no need to notify the profile here. + // Check if the download manager has a DownloadItem for this ID + // (network downloads or in progress page/resource saves) if (state == QWebEngineDownloadRequest::DownloadInProgress) { - if (d->m_profileAdapter) - d->m_profileAdapter->cancelDownload(d->downloadId); - } else { + if (d->profileAdapter) + cancelled = d->profileAdapter->cancelDownload(d->downloadId); + } + + // Not cancelled downloads are not even started yet at this point + if (!cancelled) { d->downloadState = QWebEngineDownloadRequest::DownloadCancelled; Q_EMIT stateChanged(d->downloadState); d->setFinished(); @@ -299,8 +259,8 @@ void QWebEngineDownloadRequest::pause() if (state != QWebEngineDownloadRequest::DownloadInProgress) return; - if (d->m_profileAdapter) - d->m_profileAdapter->pauseDownload(d->downloadId); + if (d->profileAdapter) + d->profileAdapter->pauseDownload(d->downloadId); } /*! @@ -319,8 +279,8 @@ void QWebEngineDownloadRequest::resume() if (d->downloadFinished || (state != QWebEngineDownloadRequest::DownloadInProgress && state != QWebEngineDownloadRequest::DownloadInterrupted)) return; - if (d->m_profileAdapter) - d->m_profileAdapter->resumeDownload(d->downloadId); + if (d->profileAdapter) + d->profileAdapter->resumeDownload(d->downloadId); } /*! @@ -334,19 +294,11 @@ quint32 QWebEngineDownloadRequest::id() const } /*! - \fn void QWebEngineDownloadRequest::finished() + \fn void QWebEngineDownloadRequest::isPausedChanged() - This signal is emitted when the download finishes. + This signal is emitted whenever isPaused changes. - \sa state(), isFinished() -*/ - -/*! - \fn void QWebEngineDownloadRequest::isPausedChanged(bool isPaused) - - This signal is emitted whenever \a isPaused changes. - - \sa pause(), isPaused() + \sa pause(), isPaused */ /*! @@ -358,19 +310,6 @@ quint32 QWebEngineDownloadRequest::id() const */ /*! - \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: @@ -447,7 +386,7 @@ QWebEngineDownloadRequest::DownloadState QWebEngineDownloadRequest::state() cons } /*! - Returns the the total amount of data to download in bytes. + Returns the total amount of data to download in bytes. \c -1 means the size is unknown. */ @@ -516,13 +455,20 @@ void QWebEngineDownloadRequest::setDownloadDirectory(const QString &directory) return; } - if (!directory.isEmpty() && d->downloadDirectory != directory) + if (!directory.isEmpty() && d->downloadDirectory != directory) { d->downloadDirectory = directory; + Q_EMIT downloadDirectoryChanged(); + } - if (!d->isCustomFileName && d->m_profileAdapter) - d->downloadFileName = QFileInfo(d->m_profileAdapter->determineDownloadPath(d->downloadDirectory, - d->suggestedFileName, - d->startTime)).fileName(); + if (!d->isCustomFileName && d->profileAdapter) { + QString newFileName = QFileInfo(d->profileAdapter->determineDownloadPath(d->downloadDirectory, + d->suggestedFileName, + d->startTime)).fileName(); + if (d->downloadFileName != newFileName) { + d->downloadFileName = newFileName; + Q_EMIT downloadFileNameChanged(); + } + } } /*! @@ -554,6 +500,7 @@ void QWebEngineDownloadRequest::setDownloadFileName(const QString &fileName) if (!fileName.isEmpty()) { d->downloadFileName = fileName; d->isCustomFileName = true; + Q_EMIT downloadFileNameChanged(); } } @@ -568,9 +515,11 @@ QString QWebEngineDownloadRequest::suggestedFileName() const } /*! - Returns whether this download is finished (completed, cancelled, or non-resumable interrupted state). + \property QWebEngineDownloadRequest::isFinished + \brief Whether this download is finished (completed, cancelled, + or non-resumable interrupted state). - \sa finished(), state(), + \sa state() */ bool QWebEngineDownloadRequest::isFinished() const @@ -580,7 +529,8 @@ bool QWebEngineDownloadRequest::isFinished() const } /*! - Returns whether this download is paused. + \property QWebEngineDownloadRequest::isPaused + \brief Whether this download is paused. \sa pause(), resume() */ @@ -654,14 +604,17 @@ QString QWebEngineDownloadRequest::interruptReasonString() const 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 +QWebEnginePage *QWebEngineDownloadRequest::page() const { Q_D(const QWebEngineDownloadRequest); - //TODO: come back here when page is in core - Q_UNREACHABLE(); + if (d->adapterClient && d->adapterClient->clientType() == QtWebEngineCore::WebContentsAdapterClient::WidgetsClient) + return const_cast<QWebEnginePage *>(static_cast<const QWebEnginePage *>(d->adapterClient->holdingQObject())); return nullptr; } + +/*! \internal +*/ QWebEngineDownloadRequest::QWebEngineDownloadRequest(QWebEngineDownloadRequestPrivate *p, QObject *parent) : QObject(parent) , d_ptr(p) @@ -680,3 +633,5 @@ QWebEngineDownloadRequest::~QWebEngineDownloadRequest() } QT_END_NAMESPACE + +#include "moc_qwebenginedownloadrequest.cpp" |