1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
From a7d2f8757919b4db63867ecbb4fb64c11d64f453 Mon Sep 17 00:00:00 2001
From: David Rosca <nowrep@gmail.com>
Date: Sun, 22 Jul 2018 15:17:04 +0200
Subject: FalkonSchemeHandler: Make sure to load data on main thread
QIODevice::read is called on WebEngine IO thread.
---
.../network/schemehandlers/falkonschemehandler.cpp | 41 +++++++++++-----------
.../network/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 5706c04..4e01897 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 2c071a7..b92969d 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 <QMutex>
#include <QBuffer>
#include <QIODevice>
#include <QWebEngineUrlSchemeHandler>
@@ -60,6 +61,7 @@ private:
QBuffer m_buffer;
QString m_pageName;
QWebEngineUrlRequestJob *m_job;
+ mutable QMutex m_mutex;
};
#endif // FALKONSCHEMEHANDLER_H
--
cgit v1.1
|