diff options
author | Michal Klocek <michal.klocek@qt.io> | 2017-09-04 16:35:08 +0200 |
---|---|---|
committer | Michal Klocek <michal.klocek@qt.io> | 2017-09-11 09:58:55 +0000 |
commit | 7a7f5276cc7bbb5138054886b1eadd5d334988a0 (patch) | |
tree | dd62ea073f302e8368710386cf1de3d77d9c9da5 /src/core/url_request_custom_job.cpp | |
parent | cccde2776eb261af6af62bf04140a09b533252ff (diff) |
Refactor URLRequestCustomJob
Move URLRequestCustomJobShared to separate file
and rename class to URLRequestCustomJobProxy.
This commit is a groundwork for following one.
Change-Id: I122b2101789e91186a3bffa9a07eed43b7340418
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'src/core/url_request_custom_job.cpp')
-rw-r--r-- | src/core/url_request_custom_job.cpp | 283 |
1 files changed, 35 insertions, 248 deletions
diff --git a/src/core/url_request_custom_job.cpp b/src/core/url_request_custom_job.cpp index d093efd0a..724a879e0 100644 --- a/src/core/url_request_custom_job.cpp +++ b/src/core/url_request_custom_job.cpp @@ -38,57 +38,50 @@ ****************************************************************************/ #include "url_request_custom_job.h" -#include "url_request_custom_job_delegate.h" - -#include "api/qwebengineurlrequestjob.h" -#include "api/qwebengineurlschemehandler.h" -#include "browser_context_adapter.h" -#include "type_conversion.h" - +#include "url_request_custom_job_proxy.h" #include "content/public/browser/browser_thread.h" -#include "net/base/net_errors.h" #include "net/base/io_buffer.h" -#include <QFileInfo> -#include <QMimeDatabase> -#include <QMimeType> -#include <QUrl> +#include <QIODevice> using namespace net; namespace QtWebEngineCore { -URLRequestCustomJob::URLRequestCustomJob(URLRequest *request, NetworkDelegate *networkDelegate, - const std::string &scheme, QWeakPointer<const BrowserContextAdapter> adapter) +URLRequestCustomJob::URLRequestCustomJob(URLRequest *request, + NetworkDelegate *networkDelegate, + const std::string &scheme, + QWeakPointer<const BrowserContextAdapter> adapter) : URLRequestJob(request, networkDelegate) , m_scheme(scheme) , m_adapter(adapter) - , m_shared(new URLRequestCustomJobShared(this)) + , m_proxy(new URLRequestCustomJobProxy(this)) { } URLRequestCustomJob::~URLRequestCustomJob() { - if (m_shared) - m_shared->killJob(); + if (m_proxy) + m_proxy->killJob(); } -static void startAsync(URLRequestCustomJobShared *shared) +static void startAsync(URLRequestCustomJobProxy *proxy) { - shared->startAsync(); + proxy->startAsync(); } void URLRequestCustomJob::Start() { DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE, base::Bind(&startAsync, m_shared)); + content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE, + base::Bind(&startAsync, m_proxy)); } void URLRequestCustomJob::Kill() { - if (m_shared) - m_shared->killJob(); - m_shared = 0; + if (m_proxy) + m_proxy->killJob(); + m_proxy = 0; URLRequestJob::Kill(); } @@ -96,11 +89,11 @@ void URLRequestCustomJob::Kill() bool URLRequestCustomJob::GetMimeType(std::string *mimeType) const { DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - if (!m_shared) + if (!m_proxy) return false; - QMutexLocker lock(&m_shared->m_mutex); - if (m_shared->m_mimeType.size() > 0) { - *mimeType = m_shared->m_mimeType; + QMutexLocker lock(&m_proxy->m_mutex); + if (m_proxy->m_mimeType.size() > 0) { + *mimeType = m_proxy->m_mimeType; return true; } return false; @@ -109,11 +102,11 @@ bool URLRequestCustomJob::GetMimeType(std::string *mimeType) const bool URLRequestCustomJob::GetCharset(std::string* charset) { DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - if (!m_shared) + if (!m_proxy) return false; - QMutexLocker lock(&m_shared->m_mutex); - if (m_shared->m_charset.size() > 0) { - *charset = m_shared->m_charset; + QMutexLocker lock(&m_proxy->m_mutex); + if (m_proxy->m_charset.size() > 0) { + *charset = m_proxy->m_charset; return true; } return false; @@ -122,11 +115,11 @@ bool URLRequestCustomJob::GetCharset(std::string* charset) bool URLRequestCustomJob::IsRedirectResponse(GURL* location, int* http_status_code) { DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - if (!m_shared) + if (!m_proxy) return false; - QMutexLocker lock(&m_shared->m_mutex); - if (m_shared->m_redirect.is_valid()) { - *location = m_shared->m_redirect; + QMutexLocker lock(&m_proxy->m_mutex); + if (m_proxy->m_redirect.is_valid()) { + *location = m_proxy->m_redirect; *http_status_code = 303; return true; } @@ -136,224 +129,18 @@ bool URLRequestCustomJob::IsRedirectResponse(GURL* location, int* http_status_co int URLRequestCustomJob::ReadRawData(IOBuffer *buf, int bufSize) { DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - Q_ASSERT(m_shared); - QMutexLocker lock(&m_shared->m_mutex); - if (m_shared->m_error) - return m_shared->m_error; - qint64 rv = m_shared->m_device ? m_shared->m_device->read(buf->data(), bufSize) : -1; + Q_ASSERT(m_proxy); + QMutexLocker lock(&m_proxy->m_mutex); + if (m_proxy->m_error) + return m_proxy->m_error; + qint64 rv = m_proxy->m_device ? m_proxy->m_device->read(buf->data(), bufSize) : -1; if (rv >= 0) return static_cast<int>(rv); else { // QIODevice::read might have called fail on us. - if (m_shared->m_error) - return m_shared->m_error; + if (m_proxy->m_error) + return m_proxy->m_error; return ERR_FAILED; } } - - -URLRequestCustomJobShared::URLRequestCustomJobShared(URLRequestCustomJob *job) - : m_mutex(QMutex::Recursive) - , m_job(job) - , m_delegate(0) - , m_error(0) - , m_started(false) - , m_asyncInitialized(false) - , m_weakFactory(this) -{ -} - -URLRequestCustomJobShared::~URLRequestCustomJobShared() -{ - Q_ASSERT(!m_job); - Q_ASSERT(!m_delegate); -} - -void URLRequestCustomJobShared::killJob() -{ - DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - QMutexLocker lock(&m_mutex); - m_job = 0; - bool doDelete = false; - if (m_delegate) { - m_delegate->deleteLater(); - } else { - // Do not delete yet if startAsync has not yet run. - doDelete = m_asyncInitialized; - } - if (m_device && m_device->isOpen()) - m_device->close(); - m_device = 0; - m_weakFactory.InvalidateWeakPtrs(); - lock.unlock(); - if (doDelete) - delete this; -} - -void URLRequestCustomJobShared::unsetJobDelegate() -{ - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - QMutexLocker lock(&m_mutex); - m_delegate = 0; - bool doDelete = false; - if (m_job) - abort(); - else - doDelete = true; - lock.unlock(); - if (doDelete) - delete this; -} - -void URLRequestCustomJobShared::setReplyMimeType(const std::string &mimeType) -{ - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - QMutexLocker lock(&m_mutex); - m_mimeType = mimeType; -} - -void URLRequestCustomJobShared::setReplyCharset(const std::string &charset) -{ - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - QMutexLocker lock(&m_mutex); - m_charset = charset; -} - -void URLRequestCustomJobShared::setReplyDevice(QIODevice *device) -{ - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - QMutexLocker lock(&m_mutex); - if (!m_job) - return; - m_device = device; - if (m_device && !m_device->isReadable()) - m_device->open(QIODevice::ReadOnly); - - qint64 size = m_device ? m_device->size() : -1; - if (size > 0) - m_job->set_expected_content_size(size); - if (m_device && m_device->isReadable()) - content::BrowserThread::PostTask(content::BrowserThread::IO, FROM_HERE, base::Bind(&URLRequestCustomJobShared::notifyStarted, m_weakFactory.GetWeakPtr())); - else - fail(ERR_INVALID_URL); -} - -void URLRequestCustomJobShared::redirect(const GURL &url) -{ - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - - QMutexLocker lock(&m_mutex); - if (m_device || m_error) - return; - if (!m_job) - return; - m_redirect = url; - content::BrowserThread::PostTask(content::BrowserThread::IO, FROM_HERE, base::Bind(&URLRequestCustomJobShared::notifyStarted, m_weakFactory.GetWeakPtr())); -} - -void URLRequestCustomJobShared::abort() -{ - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - QMutexLocker lock(&m_mutex); - if (m_device && m_device->isOpen()) - m_device->close(); - m_device = 0; - if (!m_job) - return; - content::BrowserThread::PostTask(content::BrowserThread::IO, FROM_HERE, base::Bind(&URLRequestCustomJobShared::notifyCanceled, m_weakFactory.GetWeakPtr())); -} - -void URLRequestCustomJobShared::notifyCanceled() -{ - DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - QMutexLocker lock(&m_mutex); - if (!m_job) - return; - if (m_started) - m_job->NotifyCanceled(); - else - m_job->NotifyStartError(URLRequestStatus(URLRequestStatus::CANCELED, ERR_ABORTED)); -} - -void URLRequestCustomJobShared::notifyStarted() -{ - DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - QMutexLocker lock(&m_mutex); - if (!m_job) - return; - Q_ASSERT(!m_started); - m_started = true; - m_job->NotifyHeadersComplete(); -} - -void URLRequestCustomJobShared::fail(int error) -{ - QMutexLocker lock(&m_mutex); - m_error = error; - if (content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)) - return; - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - if (!m_job) - return; - content::BrowserThread::PostTask(content::BrowserThread::IO, FROM_HERE, base::Bind(&URLRequestCustomJobShared::notifyFailure, m_weakFactory.GetWeakPtr())); -} - -void URLRequestCustomJobShared::notifyFailure() -{ - DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - QMutexLocker lock(&m_mutex); - if (!m_job) - return; - if (m_device) - m_device->close(); - if (!m_started) - m_job->NotifyStartError(URLRequestStatus::FromError(m_error)); - // else we fail on the next read, or the read that might already be in progress -} - -GURL URLRequestCustomJobShared::requestUrl() -{ - QMutexLocker lock(&m_mutex); - if (!m_job) - return GURL(); - return m_job->request()->url(); -} - -std::string URLRequestCustomJobShared::requestMethod() -{ - QMutexLocker lock(&m_mutex); - if (!m_job) - return std::string(); - return m_job->request()->method(); -} - -void URLRequestCustomJobShared::startAsync() -{ - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - Q_ASSERT(!m_started); - Q_ASSERT(!m_delegate); - QMutexLocker lock(&m_mutex); - if (!m_job) { - lock.unlock(); - delete this; - return; - } - - 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 |