diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 52db00a5..1e2c0b4a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -33,3 +33,5 @@ add_subdirectory(services) if (BLUETOOTH) add_subdirectory(bluetooth) endif() + +add_subdirectory(webengine) \ No newline at end of file diff --git a/src/launch/launch.cpp b/src/launch/launch.cpp index f269f61d..4c617cc8 100644 --- a/src/launch/launch.cpp +++ b/src/launch/launch.cpp @@ -24,6 +24,7 @@ #include "../core/plugin.hpp" #include "../core/rootwrapper.hpp" #include "../ipc/ipc.hpp" +#include "../webengine/webengine.hpp" #include "build.hpp" #include "launch_p.hpp" @@ -74,6 +75,7 @@ int launch(const LaunchArgs& args, char** argv, QCoreApplication* coreApplicatio bool nativeTextRendering = false; bool desktopSettingsAware = true; bool useSystemStyle = false; + bool useQtWebEngineQuick = false; QString iconTheme = qEnvironmentVariable("QS_ICON_THEME"); QHash envOverrides; QString dataDir; @@ -91,6 +93,7 @@ int launch(const LaunchArgs& args, char** argv, QCoreApplication* coreApplicatio else if (pragma == "NativeTextRendering") pragmas.nativeTextRendering = true; else if (pragma == "IgnoreSystemSettings") pragmas.desktopSettingsAware = false; else if (pragma == "RespectSystemStyle") pragmas.useSystemStyle = true; + else if (pragma == "EnableQtWebEngineQuick") pragmas.useQtWebEngineQuick = true; else if (pragma.startsWith("IconTheme ")) pragmas.iconTheme = pragma.sliced(10); else if (pragma.startsWith("Env ")) { auto envPragma = pragma.sliced(4); @@ -222,7 +225,11 @@ int launch(const LaunchArgs& args, char** argv, QCoreApplication* coreApplicatio delete coreApplication; QGuiApplication* app = nullptr; - auto qArgC = 0; + auto qArgC = 1; + + if (pragmas.useQtWebEngineQuick) { + web_engine::init(); + } if (pragmas.useQApplication) { app = new QApplication(qArgC, argv); diff --git a/src/webengine/CMakeLists.txt b/src/webengine/CMakeLists.txt new file mode 100644 index 00000000..66f4cd80 --- /dev/null +++ b/src/webengine/CMakeLists.txt @@ -0,0 +1,3 @@ +if (BUILD_TESTING) + add_subdirectory(test) +endif() \ No newline at end of file diff --git a/src/webengine/test/CMakeLists.txt b/src/webengine/test/CMakeLists.txt new file mode 100644 index 00000000..1d0c7769 --- /dev/null +++ b/src/webengine/test/CMakeLists.txt @@ -0,0 +1,3 @@ +add_executable(webengine webengine.cpp) +target_link_libraries(webengine PRIVATE Qt::Core Qt::Test) +add_test(NAME webengine WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" COMMAND $) \ No newline at end of file diff --git a/src/webengine/test/webengine.cpp b/src/webengine/test/webengine.cpp new file mode 100644 index 00000000..aa726a60 --- /dev/null +++ b/src/webengine/test/webengine.cpp @@ -0,0 +1,10 @@ +#include "webengine.hpp" + +#include +#include + +#include "../webengine.hpp" + +void WebEngineInitTest::init() { QVERIFY(qs::web_engine::init()); } + +QTEST_MAIN(WebEngineInitTest) \ No newline at end of file diff --git a/src/webengine/test/webengine.hpp b/src/webengine/test/webengine.hpp new file mode 100644 index 00000000..458e344c --- /dev/null +++ b/src/webengine/test/webengine.hpp @@ -0,0 +1,8 @@ +#include + +class WebEngineInitTest: public QObject { + Q_OBJECT + +private slots: + static void init(); +}; \ No newline at end of file diff --git a/src/webengine/webengine.hpp b/src/webengine/webengine.hpp new file mode 100644 index 00000000..5b932c62 --- /dev/null +++ b/src/webengine/webengine.hpp @@ -0,0 +1,54 @@ +#include +#include +#include +#include + +namespace qs::web_engine { + +inline void printNotLoaded() { + qWarning() << "QtWebEngineQuick is not Loaded. Using the qml type WebEngineView from " + "QtWebEngine might lead to undefined behaviour!"; +} + +inline bool init() { + using InitializeFunc = void (*)(); + + QLibrary lib("Qt6WebEngineQuick"); + if (!lib.load()) { + qWarning() << "Failed to load library:" << lib.errorString(); + qWarning() << "You might need to install the necessary package for Qt6WebEngineQuick."; + printNotLoaded(); + return false; + } + + qDebug() << "Loaded library Qt6WebEngineQuick"; + + auto initialize = + reinterpret_cast(lib.resolve("_ZN16QtWebEngineQuick10initializeEv")); + if (!initialize) { + qWarning() << "Failed to resolve symbol 'void QtWebEngineQuick::initialize()' in lib " + "Qt6WebEngineQuick. This should not happen"; + + printNotLoaded(); + return false; + } + + qDebug() << "Found symbol QtWebEngineQuick::initialize(). Initializing WebEngine..."; + + try { + initialize(); + qDebug() << "Successfully initialized QtWebEngineQuick"; + } catch (const std::exception& e) { + qWarning() << "Exception while calling QtWebEngineQuick::initialize()" << e.what(); + printNotLoaded(); + return false; + } catch (...) { + qWarning() << "Unknown Exception while calling QtWebEngineQuick::initialize()"; + printNotLoaded(); + return false; + } + + return true; +} + +} // namespace qs::web_engine \ No newline at end of file