Chrysalis - CLO3D Extensions Test Coverage


integrations/clo3d/
File: integrations/clo3d/src/ExtensionsManager.cpp
Date: 2026-08-27 18:36:08
Lines:
10/130
7.7%
Functions:
3/17
17.6%
Branches:
12/282
4.3%
Decisions:
1/44
2.3%
Calls:
51/791
6.4%

Line Branch Decision Call Exec Source
1 #include "ExtensionsManager.h"
2
3 #include "Logging.h"
4 #define LOGGER_NAME "Extensions Manager"
5
6 #include <QApplication>
7 #include <QCheckBox>
8 #include <QMenuBar>
9 #include <QMenu>
10 #include <QDoubleSpinBox>
11
12 #include <QDesktopServices>
13 #include <QLayout>
14 #include <QPointer>
15 #include <QUrl>
16
17 // #include <QtCore/private/qobject_p.h>
18 // #include <QtCore/private/qfiledevice_p.h>
19 // #include <QtCore/qobjectdefs.h>
20 // #include <QtWidgets/QOpe>
21
22 #include <CLOAPIInterface.h>
23 #include <iso646.h>
24 #include <QDockWidget>
25
26 #include "ExtensionsSettingsDialog.h"
27
28 #include "HooksManager.h"
29
30 #include <QToolButton>
31 #include <QOpenGLWidget>
32 #include <QGraphicsView>
33 #include <QOpenGLContext>
34 #include <QWindow>
35 #include <QAbstractNativeEventFilter>
36 #include <private/qhooks_p.h>
37
38 #include "BaseNativeShortcutHandler.h"
39
40 using namespace CLO3D;
41
42 class OpenGLWidget: public QOpenGLWidget {
43 public:
44 using QOpenGLWidget::paintGL;
45 };
46
47 #ifdef EXTEND_WITH_AUTHENTICATOR
48 // Moved here from AuthenticatorExtension - HooksManager is a template with static
49 // state, and a separate plugin DLL linking HooksLibrary privately would get its own
50 // disconnected copy of the hook registry. Installing these hooks from ExtensionsManager
51 // (which already owns HooksManager calls) keeps a single, shared registry.
52 namespace {
53 QWidget* loginDialog = nullptr;
54 QObject* authenticationProcessor = nullptr;
55 QVector<QPointer<QObject>> constructionQueue;
56
57 bool isObjectOfClass(const QObject* object, const QString& className) {
58 return className == object->metaObject()->className();
59 }
60 }
61 #endif
62
63 ✗ void ExtensionsManager::addExtension(std::unique_ptr<BaseExtension> extension) {
64
0/3
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ extensions.push_front(std::move(extension));
65 ✗ }
66
67 class PaintFilter : public QObject
68 {
69 public:
70
0/10
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 4 not invoked.
✗ Call 5 not invoked.
✗ Call 6 not invoked.
✗ Call 7 not invoked.
✗ Call 8 not invoked.
✗ Call 9 not invoked.
✗ explicit PaintFilter(QObject* original, QObject* parent = nullptr) : QObject(parent), original(original) {};
71 ✗ bool eventFilter(QObject* watched, QEvent* event) override
72 {
73
0/23
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 4 not invoked.
✗ Call 5 not invoked.
✗ Call 6 not invoked.
✗ Call 7 not invoked.
✗ Call 8 not invoked.
✗ Call 9 not invoked.
✗ Call 10 not invoked.
✗ Call 11 not invoked.
✗ Call 12 not invoked.
✗ Call 13 not invoked.
✗ Call 14 not invoked.
✗ Call 15 not invoked.
✗ Call 16 not invoked.
✗ Call 17 not invoked.
✗ Call 18 not invoked.
✗ Call 19 not invoked.
✗ Call 20 not invoked.
✗ Call 21 not invoked.
✗ Call 22 not invoked.
✗ original->eventFilter(watched, event);
74
0/2
✗ Decision 'true' not taken.
✗ Decision 'false' not taken.
0/19
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 6 not invoked.
✗ Call 7 not invoked.
✗ Call 10 not invoked.
✗ Call 11 not invoked.
✗ Call 12 not invoked.
✗ Call 15 not invoked.
✗ Call 16 not invoked.
✗ Call 23 not invoked.
✗ Call 26 not invoked.
✗ Call 29 not invoked.
✗ Call 32 not invoked.
✗ Call 37 not invoked.
✗ Call 40 not invoked.
✗ Call 43 not invoked.
✗ Call 46 not invoked.
✗ if (event->type() == QEvent::Paint && watched->objectName().contains("widget2d"))
75 {
76
0/1
✗ Call 0 not invoked.
✗ glPushAttrib(GL_ALL_ATTRIB_BITS);
77
78
0/1
✗ Call 0 not invoked.
✗ glDisable(GL_DEPTH_TEST);
79
80
0/1
✗ Call 0 not invoked.
✗ glMatrixMode(GL_PROJECTION);
81
0/1
✗ Call 0 not invoked.
✗ glPushMatrix();
82
0/1
✗ Call 0 not invoked.
✗ glLoadIdentity();
83
84
0/1
✗ Call 0 not invoked.
✗ glMatrixMode(GL_MODELVIEW);
85
0/1
✗ Call 0 not invoked.
✗ glPushMatrix();
86
0/1
✗ Call 0 not invoked.
✗ glLoadIdentity();
87
88
0/1
✗ Call 0 not invoked.
✗ glBegin(GL_TRIANGLES);
89
90
0/1
✗ Call 0 not invoked.
✗ glColor3f(1.0f, 0.0f, 0.0f);
91
92
0/1
✗ Call 0 not invoked.
✗ glVertex2f(0.0f, 0.1f);
93
0/1
✗ Call 0 not invoked.
✗ glVertex2f(-0.1f, -0.1f);
94
0/1
✗ Call 0 not invoked.
✗ glVertex2f(0.1f, -0.1f);
95
96
0/1
✗ Call 0 not invoked.
✗ glEnd();
97
98
0/1
✗ Call 0 not invoked.
✗ glPopMatrix();
99
100
0/1
✗ Call 0 not invoked.
✗ glMatrixMode(GL_PROJECTION);
101
0/1
✗ Call 0 not invoked.
✗ glPopMatrix();
102
103
0/1
✗ Call 0 not invoked.
✗ glPopAttrib();
104
105
0/1
✗ Call 0 not invoked.
✗ glFlush();
106 }
107
0/5
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 4 not invoked.
✗ return QObject::eventFilter(watched, event);
108 }
109 private:
110 QObject* original;
111 };
112
113 ✗ void ExtensionsManager::install() {
114
0/18
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 6 not invoked.
✗ Call 7 not invoked.
✗ Call 8 not invoked.
✗ Call 11 not invoked.
✗ Call 12 not invoked.
✗ Call 15 not invoked.
✗ Call 16 not invoked.
✗ Call 17 not invoked.
✗ Call 18 not invoked.
✗ Call 19 not invoked.
✗ Call 20 not invoked.
✗ Call 21 not invoked.
✗ Call 22 not invoked.
✗ Call 25 not invoked.
✗ const auto settings = new QSettings("eemilee.me", "CLO3D Extensions");
115
0/4
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 7 not invoked.
✗ extensionsSettings = new ExtensionsSettings(settings);
116
0/2
✗ Decision 'true' not taken.
✗ Decision 'false' not taken.
0/10
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 4 not invoked.
✗ Call 5 not invoked.
✗ Call 6 not invoked.
✗ Call 7 not invoked.
✗ Call 8 not invoked.
✗ Call 9 not invoked.
✗ for (const auto& extension: extensions) {
117
0/9
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 4 not invoked.
✗ Call 5 not invoked.
✗ Call 6 not invoked.
✗ Call 7 not invoked.
✗ Call 8 not invoked.
✗ extension->install();
118
0/9
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 4 not invoked.
✗ Call 5 not invoked.
✗ Call 6 not invoked.
✗ Call 7 not invoked.
✗ Call 8 not invoked.
✗ extension->configureSettings(extensionsSettings);
119 }
120
0/2
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ extensionsSettings->read();
121
122
0/3
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ executor_ = new TaskExecutor();
123
124
0/3
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ qtHookData[QHooks::Startup] = reinterpret_cast<quintptr>(+[] {
125
0/1
✗ Call 0 not invoked.
✗ BaseNativeShortcutHandler::registerShortcuts();
126
0/1
✗ Call 0 not invoked.
✗ BaseNativeShortcutHandler::startListening();
127
0/2
✗ Decision 'true' not taken.
✗ Decision 'false' not taken.
0/10
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 4 not invoked.
✗ Call 5 not invoked.
✗ Call 6 not invoked.
✗ Call 7 not invoked.
✗ Call 8 not invoked.
✗ Call 9 not invoked.
✗ for (const auto& extension: extensions) {
128
0/9
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 4 not invoked.
✗ Call 5 not invoked.
✗ Call 6 not invoked.
✗ Call 7 not invoked.
✗ Call 8 not invoked.
✗ extension->startup();
129 }
130
0/3
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 6 not invoked.
✗ localServer_ = new LocalServer();
131
0/2
✗ Decision 'true' not taken.
✗ Decision 'false' not taken.
0/10
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 4 not invoked.
✗ Call 5 not invoked.
✗ Call 6 not invoked.
✗ Call 7 not invoked.
✗ Call 8 not invoked.
✗ Call 9 not invoked.
✗ for (const auto& extension: extensions) {
132
0/9
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 4 not invoked.
✗ Call 5 not invoked.
✗ Call 6 not invoked.
✗ Call 7 not invoked.
✗ Call 8 not invoked.
✗ extension->configureLocalServer(localServer_);
133 }
134
0/1
✗ Call 0 not invoked.
✗ });
135
136
0/8
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 6 not invoked.
✗ Call 7 not invoked.
✗ Call 8 not invoked.
✗ Call 9 not invoked.
✗ HooksManager::addBefore<&qInstallMessageHandler>([&](const HookHandle&, QtMessageHandler& handler) {
137
0/4
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ handler = [](const QtMsgType type, const QMessageLogContext&, const QString& msg) {
138 static constexpr spdlog::level::level_enum LEVELS[] = {
139 spdlog::level::debug,
140 spdlog::level::warn,
141 spdlog::level::critical,
142 spdlog::level::critical,
143 spdlog::level::info
144 };
145
0/14
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 4 not invoked.
✗ Call 7 not invoked.
✗ Call 8 not invoked.
✗ Call 9 not invoked.
✗ Call 10 not invoked.
✗ Call 11 not invoked.
✗ Call 14 not invoked.
✗ Call 15 not invoked.
✗ Call 16 not invoked.
✗ Call 17 not invoked.
✗ LOG_TO("Qt", LEVELS[static_cast<int>(type)], "{}", msg.toStdString());
146 ✗ };
147 ✗ });
148
149
0/9
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 4 not invoked.
✗ Call 7 not invoked.
✗ Call 8 not invoked.
✗ Call 9 not invoked.
✗ Call 10 not invoked.
✗ HooksManager::addAfter<&QWidget::show>([settings](const HookHandle& handle, QWidget* this_) {
150
0/2
✗ Decision 'true' not taken.
✗ Decision 'false' not taken.
0/9
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 5 not invoked.
✗ Call 6 not invoked.
✗ Call 9 not invoked.
✗ Call 10 not invoked.
✗ Call 13 not invoked.
✗ Call 14 not invoked.
✗ if (this_->objectName() == " TitleFrame") {
151
0/4
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ LOG_INFO("Main window has been detected by Extensions Manager. Setting up UI.");
152 ✗ mainWindow = dynamic_cast<QFrame*>(this_);
153
0/1
? Decision couldn't be analyzed.
0/10
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 4 not invoked.
✗ Call 5 not invoked.
✗ Call 8 not invoked.
✗ Call 9 not invoked.
✗ Call 12 not invoked.
✗ Call 15 not invoked.
✗ Call 16 not invoked.
✗ Call 17 not invoked.
✗ for (const auto widget: QApplication::allWidgets()) {
154
0/2
✗ Decision 'true' not taken.
✗ Decision 'false' not taken.
0/10
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 4 not invoked.
✗ Call 5 not invoked.
✗ Call 6 not invoked.
✗ Call 7 not invoked.
✗ Call 8 not invoked.
✗ Call 9 not invoked.
✗ for (const auto& extension: extensions) {
155
0/9
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 4 not invoked.
✗ Call 5 not invoked.
✗ Call 6 not invoked.
✗ Call 7 not invoked.
✗ Call 8 not invoked.
✗ extension->configure(widget);
156 }
157
0/2
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ }
158
0/2
✗ Decision 'true' not taken.
✗ Decision 'false' not taken.
0/9
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 5 not invoked.
✗ Call 6 not invoked.
✗ Call 9 not invoked.
✗ Call 10 not invoked.
✗ Call 13 not invoked.
✗ Call 14 not invoked.
✗ } else if (this_->objectName() == "myMenuBar") {
159
0/4
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ LOG_INFO("Configuring \"Extensions\" menu.");
160
0/1
✗ Call 0 not invoked.
✗ const auto menuBar = qobject_cast<QMenuBar *>(this_);
161
0/11
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 4 not invoked.
✗ Call 7 not invoked.
✗ Call 8 not invoked.
✗ Call 11 not invoked.
✗ Call 12 not invoked.
✗ Call 13 not invoked.
✗ Call 14 not invoked.
✗ const auto extensionsMenu = menuBar->addMenu("Extensions");
162
163
0/11
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 4 not invoked.
✗ Call 7 not invoked.
✗ Call 8 not invoked.
✗ Call 11 not invoked.
✗ Call 12 not invoked.
✗ Call 13 not invoked.
✗ Call 14 not invoked.
✗ const QAction *extensionsSettingsMenu = extensionsMenu->addAction("Extensions Settings");
164
0/5
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 4 not invoked.
✗ Call 5 not invoked.
✗ Call 6 not invoked.
✗ QObject::connect(extensionsSettingsMenu, &QAction::triggered, [&]() {
165
0/4
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 7 not invoked.
✗ const auto extensionsSettingsDialog = new UI::ExtensionsSettingsDialog(extensionsSettings);
166
0/2
✗ Decision 'true' not taken.
✗ Decision 'false' not taken.
0/10
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 4 not invoked.
✗ Call 5 not invoked.
✗ Call 6 not invoked.
✗ Call 7 not invoked.
✗ Call 8 not invoked.
✗ Call 9 not invoked.
✗ for (const auto& extension: extensions) {
167
0/9
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 4 not invoked.
✗ Call 5 not invoked.
✗ Call 6 not invoked.
✗ Call 7 not invoked.
✗ Call 8 not invoked.
✗ extension->configureSettingsUI(extensionsSettingsDialog);
168 }
169
0/7
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 4 not invoked.
✗ Call 5 not invoked.
✗ Call 6 not invoked.
✗ extensionsSettingsDialog->exec();
170 ✗ });
171
172
0/16
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 4 not invoked.
✗ Call 5 not invoked.
✗ Call 6 not invoked.
✗ Call 9 not invoked.
✗ Call 10 not invoked.
✗ Call 13 not invoked.
✗ Call 14 not invoked.
✗ Call 17 not invoked.
✗ Call 18 not invoked.
✗ Call 19 not invoked.
✗ Call 20 not invoked.
✗ Call 23 not invoked.
✗ commandRunner_ = new CommandRunner(settings, extensionsMenu->addMenu("Commands"));
173
0/2
✗ Decision 'true' not taken.
✗ Decision 'false' not taken.
0/10
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 4 not invoked.
✗ Call 5 not invoked.
✗ Call 6 not invoked.
✗ Call 7 not invoked.
✗ Call 8 not invoked.
✗ Call 9 not invoked.
✗ for (const auto& extension: extensions) {
174
0/9
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 4 not invoked.
✗ Call 5 not invoked.
✗ Call 6 not invoked.
✗ Call 7 not invoked.
✗ Call 8 not invoked.
✗ extension->configureMenu(extensionsMenu);
175
0/9
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 4 not invoked.
✗ Call 5 not invoked.
✗ Call 6 not invoked.
✗ Call 7 not invoked.
✗ Call 8 not invoked.
✗ extension->configureCommands(commandRunner_);
176 }
177
0/2
✗ Decision 'true' not taken.
✗ Decision 'false' not taken.
0/16
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 4 not invoked.
✗ Call 5 not invoked.
✗ Call 6 not invoked.
✗ Call 9 not invoked.
✗ Call 10 not invoked.
✗ Call 13 not invoked.
✗ Call 16 not invoked.
✗ Call 17 not invoked.
✗ Call 20 not invoked.
✗ Call 21 not invoked.
✗ Call 24 not invoked.
✗ Call 25 not invoked.
✗ } else if (QString(this_->metaObject()->className()) == "MVStatusBar") {
178
0/4
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ LOG_INFO("Configuring status bar.");
179
0/2
✗ Decision 'true' not taken.
✗ Decision 'false' not taken.
✗ for (const auto statusBar = dynamic_cast<QDockWidget*>(this_);
180
0/14
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 4 not invoked.
✗ Call 5 not invoked.
✗ Call 6 not invoked.
✗ Call 7 not invoked.
✗ Call 8 not invoked.
✗ Call 9 not invoked.
✗ Call 10 not invoked.
✗ Call 13 not invoked.
✗ Call 14 not invoked.
✗ Call 15 not invoked.
✗ const auto child: statusBar->children()) {
181
0/2
✗ Decision 'true' not taken.
✗ Decision 'false' not taken.
0/12
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 4 not invoked.
✗ Call 5 not invoked.
✗ Call 10 not invoked.
✗ Call 11 not invoked.
✗ Call 12 not invoked.
✗ Call 13 not invoked.
✗ Call 14 not invoked.
✗ Call 15 not invoked.
✗ if (child->metaObject() == &QWidget::staticMetaObject && !child->children().empty()) {
182
0/1
✗ Call 0 not invoked.
✗ const auto parent = qobject_cast<QWidget *>(child);
183
184
0/8
✗ Call 0 not invoked.
✗ Call 3 not invoked.
✗ Call 4 not invoked.
✗ Call 5 not invoked.
✗ Call 6 not invoked.
✗ Call 9 not invoked.
✗ Call 10 not invoked.
✗ Call 13 not invoked.
✗ backgroundMessage_ = new QLabel(parent);
185
0/10
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 4 not invoked.
✗ Call 5 not invoked.
✗ Call 6 not invoked.
✗ Call 7 not invoked.
✗ Call 8 not invoked.
✗ Call 9 not invoked.
✗ backgroundMessage_->setGeometry(statusBar->width() / 2, 2, 500, 20);
186
0/12
✗ Call 0 not invoked.
✗ Call 3 not invoked.
✗ Call 4 not invoked.
✗ Call 5 not invoked.
✗ Call 6 not invoked.
✗ Call 9 not invoked.
✗ Call 10 not invoked.
✗ Call 11 not invoked.
✗ Call 12 not invoked.
✗ Call 13 not invoked.
✗ Call 14 not invoked.
✗ Call 15 not invoked.
✗ UTILITY_API->UpdateCloStyleForPlugIn(backgroundMessage_);
187
0/5
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 4 not invoked.
✗ backgroundMessage_->show();
188
189
0/4
✗ Call 0 not invoked.
✗ Call 3 not invoked.
✗ Call 4 not invoked.
✗ Call 9 not invoked.
✗ backgroundMessageTimer_ = new QTimer(backgroundMessage_);
190
0/4
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ backgroundMessageTimer_->setSingleShot(true);
191
0/5
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 4 not invoked.
✗ Call 5 not invoked.
✗ Call 6 not invoked.
✗ QObject::connect(backgroundMessageTimer_, &QTimer::timeout, &ExtensionsManager::clearMessage);
192
193
0/2
✗ Decision 'true' not taken.
✗ Decision 'false' not taken.
0/10
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 4 not invoked.
✗ Call 5 not invoked.
✗ Call 6 not invoked.
✗ Call 7 not invoked.
✗ Call 8 not invoked.
✗ Call 9 not invoked.
✗ for (const auto& extension: extensions) {
194
0/9
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 4 not invoked.
✗ Call 5 not invoked.
✗ Call 6 not invoked.
✗ Call 7 not invoked.
✗ Call 8 not invoked.
✗ extension->configureStatusBar(parent);
195 }
196 }
197 }
198
0/2
✗ Decision 'true' not taken.
✗ Decision 'false' not taken.
0/1
✗ Call 0 not invoked.
✗ } else if (const auto openGL = qobject_cast<QOpenGLWidget*>(this_)) {
199
0/18
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 4 not invoked.
✗ Call 5 not invoked.
✗ Call 6 not invoked.
✗ Call 9 not invoked.
✗ Call 12 not invoked.
✗ Call 13 not invoked.
✗ Call 16 not invoked.
✗ Call 17 not invoked.
✗ Call 18 not invoked.
✗ Call 19 not invoked.
✗ Call 20 not invoked.
✗ Call 21 not invoked.
✗ Call 22 not invoked.
✗ Call 23 not invoked.
✗ LOG_DEBUG("OpenGL widget: {}", openGL->objectName().toStdString());
200
0/2
✗ Decision 'true' not taken.
✗ Decision 'false' not taken.
0/9
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 5 not invoked.
✗ Call 6 not invoked.
✗ Call 9 not invoked.
✗ Call 10 not invoked.
✗ Call 13 not invoked.
✗ Call 14 not invoked.
✗ } else if (this_->objectName() == "dummyWidget2d") {
201
0/1
? Decision couldn't be analyzed.
0/22
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 4 not invoked.
✗ Call 5 not invoked.
✗ Call 6 not invoked.
✗ Call 7 not invoked.
✗ Call 10 not invoked.
✗ Call 11 not invoked.
✗ Call 12 not invoked.
✗ Call 13 not invoked.
✗ Call 14 not invoked.
✗ Call 17 not invoked.
✗ Call 18 not invoked.
✗ Call 21 not invoked.
✗ Call 24 not invoked.
✗ Call 25 not invoked.
✗ Call 26 not invoked.
✗ Call 29 not invoked.
✗ Call 30 not invoked.
✗ Call 31 not invoked.
✗ for (const auto child: this_->findChildren<QGraphicsView*>()) {
202
0/18
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 4 not invoked.
✗ Call 5 not invoked.
✗ Call 6 not invoked.
✗ Call 7 not invoked.
✗ Call 8 not invoked.
✗ Call 11 not invoked.
✗ Call 14 not invoked.
✗ Call 15 not invoked.
✗ Call 18 not invoked.
✗ Call 19 not invoked.
✗ Call 20 not invoked.
✗ Call 21 not invoked.
✗ Call 22 not invoked.
✗ Call 23 not invoked.
✗ Call 24 not invoked.
✗ Call 25 not invoked.
✗ LOG_INFO("QGraphicsView: {}", child->objectName().toStdString());
203
0/2
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ }
204 }
205 ✗ });
206
207
0/8
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 6 not invoked.
✗ Call 7 not invoked.
✗ Call 8 not invoked.
✗ Call 9 not invoked.
✗ HooksManager::addBefore<&QObject::installEventFilter>([](const HookHandle& handle, QObject* object, QObject*& receiver) {
208
0/2
✗ Decision 'true' not taken.
✗ Decision 'false' not taken.
0/1
✗ Call 0 not invoked.
✗ if (const auto openGL = qobject_cast<QOpenGLWidget*>(object)) {
209
0/2
✗ Decision 'true' not taken.
✗ Decision 'false' not taken.
0/47
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 4 not invoked.
✗ Call 5 not invoked.
✗ Call 6 not invoked.
✗ Call 7 not invoked.
✗ Call 8 not invoked.
✗ Call 11 not invoked.
✗ Call 12 not invoked.
✗ Call 13 not invoked.
✗ Call 14 not invoked.
✗ Call 15 not invoked.
✗ Call 16 not invoked.
✗ Call 17 not invoked.
✗ Call 18 not invoked.
✗ Call 19 not invoked.
✗ Call 20 not invoked.
✗ Call 21 not invoked.
✗ Call 22 not invoked.
✗ Call 23 not invoked.
✗ Call 24 not invoked.
✗ Call 25 not invoked.
✗ Call 26 not invoked.
✗ Call 27 not invoked.
✗ Call 28 not invoked.
✗ Call 31 not invoked.
✗ Call 32 not invoked.
✗ Call 35 not invoked.
✗ Call 36 not invoked.
✗ Call 37 not invoked.
✗ Call 38 not invoked.
✗ Call 39 not invoked.
✗ Call 42 not invoked.
✗ Call 45 not invoked.
✗ Call 46 not invoked.
✗ Call 49 not invoked.
✗ Call 50 not invoked.
✗ Call 51 not invoked.
✗ Call 52 not invoked.
✗ Call 53 not invoked.
✗ Call 54 not invoked.
✗ Call 55 not invoked.
✗ Call 56 not invoked.
✗ Call 57 not invoked.
✗ Call 58 not invoked.
✗ if (openGL->parent()->parent()) LOG_DEBUG("Installing event filter on QOpenGLWidget: {}. Parent: {}.", openGL->objectName().toStdString(), object->parent()->parent()->metaObject()->className());
210
0/1
✗ Call 0 not invoked.
✗ QObject* original = receiver;
211
0/5
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 5 not invoked.
✗ Call 8 not invoked.
✗ receiver = new PaintFilter(original);
212 }
213 ✗ });
214
215 // HooksManager::addAfter<&QGraphicsView::installEventFilter>([](const HookHandle& handle, QObject* this_, QObject* filter) {
216 // LOG_DEBUG("Installing event on class: {} object name: {}", this_->metaObject()->className(), this_->objectName().toStdString());
217 // });
218
219
0/8
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 6 not invoked.
✗ Call 7 not invoked.
✗ Call 8 not invoked.
✗ Call 9 not invoked.
✗ HooksManager::addAfter<&QObject::setObjectName>([](const HookHandle&, QObject* this_, const QString& name) {
220
0/2
✗ Decision 'true' not taken.
✗ Decision 'false' not taken.
0/9
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 5 not invoked.
✗ Call 6 not invoked.
✗ Call 9 not invoked.
✗ Call 10 not invoked.
✗ Call 13 not invoked.
✗ Call 14 not invoked.
✗ if (name.contains("MeasureID")) {
221
0/23
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 4 not invoked.
✗ Call 5 not invoked.
✗ Call 6 not invoked.
✗ Call 7 not invoked.
✗ Call 8 not invoked.
✗ Call 9 not invoked.
✗ Call 12 not invoked.
✗ Call 13 not invoked.
✗ Call 16 not invoked.
✗ Call 17 not invoked.
✗ Call 18 not invoked.
✗ Call 21 not invoked.
✗ Call 22 not invoked.
✗ Call 25 not invoked.
✗ Call 26 not invoked.
✗ Call 27 not invoked.
✗ Call 28 not invoked.
✗ Call 29 not invoked.
✗ Call 30 not invoked.
✗ LOG_INFO("Measure: {}. Class: {}", name.toStdString(), this_->metaObject()->className());
222
0/2
✗ Decision 'true' not taken.
✗ Decision 'false' not taken.
0/1
✗ Call 0 not invoked.
✗ if (const auto spinBox = qobject_cast<QDoubleSpinBox*>(this_)) {
223
0/6
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 4 not invoked.
✗ Call 5 not invoked.
✗ const auto parent = qobject_cast<QWidget*>(spinBox->parent());
224
0/12
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 4 not invoked.
✗ Call 5 not invoked.
✗ Call 6 not invoked.
✗ Call 7 not invoked.
✗ Call 8 not invoked.
✗ Call 9 not invoked.
✗ Call 12 not invoked.
✗ Call 17 not invoked.
✗ parent->layout()->addWidget(new QCheckBox(parent));
225
0/7
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 6 not invoked.
✗ Call 7 not invoked.
✗ Call 8 not invoked.
✗ spinBox->connect(spinBox, qOverload<double>(&QDoubleSpinBox::valueChanged), [spinBox](double value) {
226
0/4
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ LOG_INFO("new value: {}", value);
227 // qDebug() << "Layout: " << spinBox->layout()->count();
228 ✗ });
229 }
230 }
231 ✗ });
232 // HooksManager::addBefore<&fwrite>([](const HookHandle&, void const* _Buffer, size_t _ElementSize, size_t _ElementCount, FILE *) {
233 // size_t total = _ElementSize * _ElementCount;
234 //
235 // if (!_Buffer || total == 0)
236 // return;
237 //
238 // const char *data = static_cast<const char *>(_Buffer);
239 //
240 // QByteArray arr(data, static_cast<int>(total));
241 //
242 // // Try as text
243 // qDebug() << "fwrite text:" << arr;
244 //
245 // // Always safe: hex dump
246 // qDebug() << "fwrite hex:" << arr.toHex();
247 // });
248
249 // using Fn = std::basic_ostream<char>& (std::basic_ostream<char>::*)(char);
250 // Fn fn = [](std::basic_ostream<char>& os, char c) -> std::basic_ostream<char>& {
251 // return os.operator<<(c);
252 //
253
254 //.text:00007FFB1D6BB4B0 msvcp140.dll:$B4B0 #A8B0 <public: class std::basic_streambuf<wchar_t, struct std::char_traits<wchar_t>> * __cdecl std::basic_ios<wchar_t, struct std::char_traits<wchar_t>>::rdbuf(void) const>
255
256 // .text:00007FFB1D6BB4B0 msvcp140.dll:$B4B0 #A8B0 <public: class std::basic_streambuf<wchar_t, struct std::char_traits<wchar_t>> * __cdecl std::basic_ios<wchar_t, struct std::char_traits<wchar_t>>::rdbuf(void) const>
257 // HooksManager::addBefore<static_cast<std::basic_ostream<char, struct std::char_traits<char>>& (std::basic_ostream<char, struct std::char_traits<char>>::*)(float)>(&std::basic_ostream<char, struct std::char_traits<char>>::operator<<)>(
258 // [](const HookHandle &, std::basic_ostream<char, struct std::char_traits<char>>*, float _Val) {
259 // qDebug() << _Val;
260 // });
261
262 // HooksManager::addBefore<&std::basic_ostream<char>::put>(
263 // [](const HookHandle &, std::basic_ostream<char>* this_, char c) {
264 // qDebug() << "Char" << static_cast<int>(c);
265 // });
266
267 // HooksManager::addBefore<&std::basic_streambuf<unsigned short>::getloc>(
268 // [](const HookHandle &, const std::basic_streambuf<unsigned short>*) {
269 // qDebug() << "Get LOCALE";
270 // });
271
272 // public: __cdecl std::basic_ostream<char, struct std::char_traits<char>>::basic_ostream<char, struct std::char_traits<char>>(class std::basic_streambuf<char, struct std::char_traits<char>> *, bool)
273 // public: class std::locale __cdecl std::basic_streambuf<unsigned short, struct std::char_traits<unsigned short>>::getloc(void) const
274 // public: __int64 __cdecl std::basic_streambuf<char, struct std::char_traits<char>>::sputn(char const *, __int64)
275 // HooksManager::addBefore<&std::basic_streambuf<char>::sputn>(
276 // [](const HookHandle &, std::basic_streambuf<char>*, char const * text, std::streamsize size) {
277 // // if (text) qDebug() << "TEXT" << ret;
278 // });
279
280 //public: char __cdecl std::basic_ios<char, struct std::char_traits<char>>::widen(char) const
281
282 // HooksManager::addBefore<&std::basic_ios<char>::widen>(
283 // [](const HookHandle &, const std::basic_ios<char>*, char c) {
284 // qDebug() << "WIDEN " << c;
285 // });
286
287 // HooksManager::addBefore<&QString::~QString>(
288 // [](const HookHandle &, QString* this_) {
289 // qDebug() << "WIDEN " << c;
290 // });
291
292 // HooksManager::addBefore<&std::basic_ostream<char, struct std::char_traits<char>>::init>(
293 // [](const HookHandle &, std::basic_streambuf<char>*, char const * text, std::streamsize size) {
294 // // qDebug() << "TEXT" << text;
295 // });
296
297 // public: class std::basic_ostream<unsigned short, struct std::char_traits<unsigned short>> & __cdecl std::basic_ostream<unsigned short, struct std::char_traits<unsigned short>>::operator<<(class std::basic_ostream<unsigned short, struct std::char_traits<un
298
299 // HooksManager::addBefore<&std::basic_ostream<wchar_t>::flush>(
300 // [](const HookHandle &, std::basic_ostream<wchar_t>* this_) {
301 // const auto buf = this_->rdbuf();
302 // if (buf) {
303 // std::wstring data;
304 // for (auto ch = buf->sgetc(); ch != WEOF; ch = buf->snextc()) {
305 // data += static_cast<wchar_t>(ch);
306 // }
307 // std::wcout << data;
308 // }
309 // });
310
311 //public: class std::basic_ostream<wchar_t, struct std::char_traits<wchar_t>> & __cdecl std::basic_ostream<wchar_t, struct std::char_traits<wchar_t>>::flush(void)
312 //public: class std::basic_ostream<char, struct std::char_traits<char>> & __cdecl std::basic_ostream<char, struct std::char_traits<char>>::put(char)
313 // public: class std::basic_ostream<char, struct std::char_traits<char>> & __cdecl std::basic_ostream<char, struct std::char_traits<char>>::operator<<(class std::basic_ostream<char, struct std::char_traits<char>> & (__cdecl *)(class std::basic_ostream<char,
314 // public: class std::basic_streambuf<wchar_t, struct std::char_traits<wchar_t>> * __cdecl std::basic_ios<wchar_t, struct std::char_traits<wchar_t>>::rdbuf(void) const
315 // (rdbuf<wchar_t> hook installed above via raw PLH::x64Detour — see s_rdbufWDetour)
316
317 // HooksManager::addBefore<&vfprintf>([](const HookHandle &,
318 // FILE* const _Stream,
319 // char const* const _Format,
320 // va_list _ArgList) {
321 // qDebug() << "vprintf:" << _Format;
322 // });
323
324 // HooksManager::addBefore<&vfprintf>([](const HookHandle&, FILE* const _Stream, char const* const _Format, ...) {
325 // qDebug() << "fprintf format:" << _Format;
326 // });
327
328 // HooksManager::addBefore<&QObjectPrivate::addConnection>([&](const HookHandle& handle, const QObjectPrivate* obj, const int signal, const QObjectPrivate::Connection *c) {
329 // if (c->sender &&
330 // (!QString(c->sender->metaObject()->className()).startsWith("Q")
331 // || QString(c->sender->metaObject()->className()) == "QAction"
332 // || QString(c->sender->metaObject()->className()) == "QMenu")
333 // ) {
334 // const QMetaObject *mo = c->sender->metaObject();
335 // // Resolve signal name: signalIdx is 0-based counting only Signal methods
336 // // across the full metaobject hierarchy (including inherited).
337 // int sigCount = 0;
338 // for (int i = 0; i < mo->methodCount(); ++i) {
339 // if (mo->method(i).methodType() == QMetaMethod::Signal) {
340 // if (sigCount == signal) {
341 // LOG_DEBUG("addConnection {}({})::{} → {}({})",
342 // mo->className(),
343 // c->sender->objectName().toStdString(),
344 // mo->method(i).methodSignature().constData(),
345 // c->receiver ? c->receiver.loadAcquire()->metaObject()->className() : "<null>",
346 // c->receiver ? c->receiver.loadAcquire()->objectName().toStdString() : "");
347 //
348 // for (const QMetaObject *m = mo; m != nullptr; m = m->superClass()) {
349 // if (QString(m->className()).startsWith("Q")) continue;
350 // LOG_DEBUG("=== {} === Parent: {}", m->className(), obj->parent ? obj->parent->metaObject()->className() : "NULL");
351 //
352 // for (int j = m->methodOffset(); j < m->methodOffset() + m->methodCount(); ++j) {
353 // const QMetaMethod method = m->method(j);
354 //
355 // const char *typeLabel = nullptr;
356 // switch (method.methodType()) {
357 // case QMetaMethod::Signal: typeLabel = "SIGNAL";
358 // break;
359 // case QMetaMethod::Slot: typeLabel = "SLOT ";
360 // break;
361 // default: continue; // skip QMetaMethod::Method and Constructor
362 // }
363 //
364 // LOG_DEBUG(" [{}] {}", typeLabel, method.methodSignature().constData());
365 // }
366 // }
367 //
368 // if (QString("CloUICommon::CVFSignOnWorker") == mo->className()) {
369 // LOG_INFO("FOUND CloUICommon::CVFSignOnWorker");
370 // test = c->sender;
371 // } else if (QString("AuthenticationProcessor") == mo->className()) {
372 // LOG_INFO("FOUND AuthenticationProcessor");
373 // ap = c->sender;
374 // }
375 //
376 // QString h = mo->className();
377 // do {
378 // mo = mo->superClass();
379 // h.append(" ").append(mo->className());
380 // } while (mo->superClass());
381 // LOG_DEBUG(" --- {}", h.toStdString());
382 //
383 // break;
384 // }
385 // ++sigCount;
386 // }
387 // }
388 // }
389 // });
390 //
391 // HooksManager::addBefore<static_cast<void(*)(QObject*, const QMetaObject*, int, void**)>(&QMetaObject::activate)>([&](const HookHandle& handle, QObject *sender, const QMetaObject *m, int local_signal_index, void **argv) {
392 // if (sender && m &&
393 // (!QString(sender->metaObject()->className()).startsWith("Q")
394 // || QString(sender->metaObject()->className()) == "QAction"
395 // || QString(sender->metaObject()->className()) == "QMenu")
396 // || QString(
397 // sender->metaObject()->className()).contains("Network")
398 // ) {
399 // const int absIdx = m->methodOffset() + local_signal_index;
400 // const QMetaMethod sig = sender->metaObject()->method(absIdx);
401 // const auto sigName = sig.methodSignature();
402 //
403 // const QByteArray macroSig = QByteArray("2") + sigName;
404 // const auto modifiedSender = static_cast<Hack *>(sender);
405 // const auto numOfReceivers = modifiedSender->receivers(macroSig.constData());
406 //
407 // if (numOfReceivers > 0 && sender->objectName() != "actionMove_Pattern") {
408 // LOG_DEBUG("emit {}({})::{} receivers: {}",
409 // sender->metaObject()->className(),
410 // sender->objectName().toStdString(),
411 // sigName.constData(), numOfReceivers);
412 // }
413 // }
414 // });
415
0/8
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 6 not invoked.
✗ Call 7 not invoked.
✗ Call 8 not invoked.
✗ Call 9 not invoked.
✗ HooksManager::addBefore<&QApplication::exit>([](const HookHandle& handle, int returnCode) {
416
0/6
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 4 not invoked.
✗ Call 5 not invoked.
✗ std::cout << "Canceling" << std::endl;
417
0/3
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 4 not invoked.
✗ delete executor_;
418 ✗ executor_ = nullptr;
419 ✗ });
420 ✗ }
421
422 14 void ExtensionsManager::setMessage(const QString &message) {
423
1/2
✓ Branch 3 taken 14 times.
✗ Branch 4 not taken.
5/7
✓ Call 0 invoked.
✓ Call 1 invoked.
✓ Call 2 invoked.
✓ Call 5 invoked.
✓ Call 6 invoked.
✗ Call 7 not invoked.
✗ Call 8 not invoked.
14 QMetaObject::invokeMethod(backgroundMessage_, [message] {
424
0/5
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 4 not invoked.
✗ backgroundMessage_->setText(message);
425
0/5
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ Call 4 not invoked.
✗ backgroundMessage_->repaint();
426
0/4
✗ Call 0 not invoked.
✗ Call 1 not invoked.
✗ Call 2 not invoked.
✗ Call 3 not invoked.
✗ backgroundMessageTimer_->start(1000);
427 ✗ });
428 14 }
429
430 13 void ExtensionsManager::setMessage(const char* extensionName, const QString &message, const bool logMessage) {
431 // TODO: limit message length
432
4/6
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 9 times.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 11 taken 4 times.
✗ Branch 12 not taken.
1/2
✓ Decision 'true' taken 13 times.
✗ Decision 'false' not taken.
9/11
✓ Call 2 invoked.
✓ Call 3 invoked.
✓ Call 4 invoked.
✓ Call 5 invoked.
✓ Call 6 invoked.
✓ Call 9 invoked.
✓ Call 10 invoked.
✓ Call 13 invoked.
✓ Call 14 invoked.
✗ Call 15 not invoked.
✗ Call 16 not invoked.
13 if (logMessage) LOG_INFO_TO(extensionName, "{}", message.toStdString());
433
5/10
✓ Branch 4 taken 13 times.
✗ Branch 5 not taken.
✓ Branch 12 taken 13 times.
✗ Branch 13 not taken.
✓ Branch 16 taken 13 times.
✗ Branch 17 not taken.
✓ Branch 23 taken 13 times.
✗ Branch 24 not taken.
✓ Branch 27 taken 13 times.
✗ Branch 28 not taken.
31/43
✓ Call 0 invoked.
✓ Call 1 invoked.
✓ Call 2 invoked.
✓ Call 3 invoked.
✓ Call 6 invoked.
✓ Call 7 invoked.
✓ Call 8 invoked.
✓ Call 9 invoked.
✓ Call 10 invoked.
✓ Call 11 invoked.
✓ Call 14 invoked.
✓ Call 15 invoked.
✓ Call 18 invoked.
✓ Call 19 invoked.
✓ Call 20 invoked.
✓ Call 21 invoked.
✓ Call 22 invoked.
✓ Call 25 invoked.
✓ Call 26 invoked.
✓ Call 29 invoked.
✓ Call 30 invoked.
✓ Call 31 invoked.
✓ Call 32 invoked.
✓ Call 33 invoked.
✓ Call 34 invoked.
✓ Call 35 invoked.
✓ Call 36 invoked.
✓ Call 37 invoked.
✓ Call 38 invoked.
✓ Call 39 invoked.
✓ Call 40 invoked.
✗ Call 41 not invoked.
✗ Call 42 not invoked.
✗ Call 43 not invoked.
✗ Call 44 not invoked.
✗ Call 45 not invoked.
✗ Call 46 not invoked.
✗ Call 47 not invoked.
✗ Call 48 not invoked.
✗ Call 49 not invoked.
✗ Call 50 not invoked.
✗ Call 51 not invoked.
✗ Call 52 not invoked.
13 setMessage(QString("<img src=':/Resources/CommonIcon/Title Bullet Secondary.svg' width='11' height='11'><b>%1:</b> %2").arg(extensionName).arg(message));
434 13 }
435
436 1 void ExtensionsManager::clearMessage() {
437
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
6/8
✓ Call 0 invoked.
✓ Call 1 invoked.
✓ Call 4 invoked.
✓ Call 5 invoked.
✓ Call 8 invoked.
✓ Call 9 invoked.
✗ Call 10 not invoked.
✗ Call 11 not invoked.
1 setMessage("");
438 1 }
439