From a7d2f8757919b4db63867ecbb4fb64c11d64f453 Mon Sep 17 00:00:00 2001 From: David Rosca Date: Sun, 22 Jul 2018 15:17:04 +0200 Subject: [PATCH] FalkonSchemeHandler: Make sure to load data on main thread QIODevice::read is called on WebEngine IO thread. --- .../schemehandlers/falkonschemehandler.cpp | 41 ++++++++++--------- .../schemehandlers/falkonschemehandler.h | 2 + 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/src/lib/network/schemehandlers/falkonschemehandler.cpp b/src/lib/network/schemehandlers/falkonschemehandler.cpp index 5706c04cf..4e01897db 100644 --- a/src/lib/network/schemehandlers/falkonschemehandler.cpp +++ b/src/lib/network/schemehandlers/falkonschemehandler.cpp @@ -89,8 +89,7 @@ FalkonSchemeReply::FalkonSchemeReply(QWebEngineUrlRequestJob *job, QObject *pare { m_pageName = m_job->requestUrl().path(); - open(QIODevice::ReadOnly); - m_buffer.open(QIODevice::ReadWrite); + QTimer::singleShot(0, this, &FalkonSchemeReply::loadPage); } void FalkonSchemeReply::loadPage() @@ -98,38 +97,40 @@ void FalkonSchemeReply::loadPage() if (m_loaded) return; - QTextStream stream(&m_buffer); - stream.setCodec("UTF-8"); + QString contents; if (m_pageName == QLatin1String("about")) { - stream << aboutPage(); - } - else if (m_pageName == QLatin1String("start")) { - stream << startPage(); - } - else if (m_pageName == QLatin1String("speeddial")) { - stream << speeddialPage(); - } - else if (m_pageName == QLatin1String("config")) { - stream << configPage(); - } - else if (m_pageName == QLatin1String("restore")) { - stream << restorePage(); + contents = aboutPage(); + } else if (m_pageName == QLatin1String("start")) { + contents = startPage(); + } else if (m_pageName == QLatin1String("speeddial")) { + contents = speeddialPage(); + } else if (m_pageName == QLatin1String("config")) { + contents = configPage(); + } else if (m_pageName == QLatin1String("restore")) { + contents = restorePage(); } - stream.flush(); - m_buffer.reset(); + QMutexLocker lock(&m_mutex); + m_buffer.setData(contents.toUtf8()); + m_buffer.open(QIODevice::ReadOnly); + lock.unlock(); + + open(QIODevice::ReadOnly); + emit readyRead(); + m_loaded = true; } qint64 FalkonSchemeReply::bytesAvailable() const { + QMutexLocker lock(&m_mutex); return m_buffer.bytesAvailable(); } qint64 FalkonSchemeReply::readData(char *data, qint64 maxSize) { - loadPage(); + QMutexLocker lock(&m_mutex); return m_buffer.read(data, maxSize); } diff --git a/src/lib/network/schemehandlers/falkonschemehandler.h b/src/lib/network/schemehandlers/falkonschemehandler.h index 2c071a737..b92969dfd 100644 --- a/src/lib/network/schemehandlers/falkonschemehandler.h +++ b/src/lib/network/schemehandlers/falkonschemehandler.h @@ -18,6 +18,7 @@ #ifndef FALKONSCHEMEHANDLER_H #define FALKONSCHEMEHANDLER_H +#include #include #include #include @@ -60,6 +61,7 @@ private: QBuffer m_buffer; QString m_pageName; QWebEngineUrlRequestJob *m_job; + mutable QMutex m_mutex; }; #endif // FALKONSCHEMEHANDLER_H