summaryrefslogtreecommitdiff
path: root/www-client/falkon/files/falkon-3.0.1-qiodevice-main-thread.patch
blob: 2606dc5088577070d529ae8ec4ae3b0ffc78e299 (plain)
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