diff --git a/src/windeployqt/main.cpp b/src/windeployqt/main.cpp index ee007f093080d81aa2d155c4847e207db4b8bfb7..11fda24367f1b435c5884828944bdbaf382435c9 100644 --- a/src/windeployqt/main.cpp +++ b/src/windeployqt/main.cpp @@ -89,7 +89,10 @@ enum QtModule QtWebKitWidgetsModule = 0x200000000, QtQuickWidgetsModule = 0x400000000, QtWebSocketsModule = 0x800000000, - QtEnginioModule = 0x1000000000 + QtEnginioModule = 0x1000000000, + QtWebEngineCoreModule = 0x2000000000, + QtWebEngineModule = 0x4000000000, + QtWebEngineWidgetsModule = 0x8000000000 }; struct QtModuleEntry { @@ -135,14 +138,18 @@ QtModuleEntry qtModuleEntries[] = { { QtWidgetsModule, "widgets", "Qt5Widgets", "qtbase" }, { QtWinExtrasModule, "winextras", "Qt5WinExtras", 0 }, { QtXmlModule, "xml", "Qt5Xml", "qtbase" }, - { QtXmlPatternsModule, "xmlpatterns", "Qt5XmlPatterns", "qtxmlpatterns" } + { QtXmlPatternsModule, "xmlpatterns", "Qt5XmlPatterns", "qtxmlpatterns" }, + { QtWebEngineCoreModule, "webenginecore", "Qt5WebEngineCore", 0 }, + { QtWebEngineModule, "webengine", "Qt5WebEngine", 0 }, + { QtWebEngineWidgetsModule, "webenginewidgets", "Qt5WebEngineWidgets", 0 } }; -static const char webProcessC[] = "QtWebProcess"; +static const char webKitProcessC[] = "QtWebProcess"; +static const char webEngineProcessC[] = "QtWebEngineProcess"; -static inline QString webProcessBinary(Platform p) +static inline QString webProcessBinary(const char *binaryName, Platform p) { - const QString webProcess = QLatin1String(webProcessC); + const QString webProcess = QLatin1String(binaryName); return (p & WindowsBased) ? webProcess + QStringLiteral(".exe") : webProcess; } @@ -248,9 +255,12 @@ static inline QString findBinary(const QString &directory, Platform platform) const QStringList nameFilters = (platform & WindowsBased) ? QStringList(QStringLiteral("*.exe")) : QStringList(); - foreach (const QString &binary, dir.entryList(nameFilters, QDir::Files | QDir::Executable)) - if (!binary.contains(QLatin1String(webProcessC), Qt::CaseInsensitive)) + foreach (const QString &binary, dir.entryList(nameFilters, QDir::Files | QDir::Executable)) { + if (!binary.contains(QLatin1String(webKitProcessC), Qt::CaseInsensitive) + && !binary.contains(QLatin1String(webEngineProcessC), Qt::CaseInsensitive)) { return dir.filePath(binary); + } + } return QString(); } @@ -671,6 +681,8 @@ static inline quint64 qtModuleForPlugin(const QString &subDirName) return QtPositioningModule; if (subDirName == QLatin1String("sensors") || subDirName == QLatin1String("sensorgestures")) return QtSensorsModule; + if (subDirName == QLatin1String("qtwebengine")) + return QtWebEngineModule | QtWebEngineCoreModule | QtWebEngineWidgetsModule; return 0; // "designer" } @@ -1204,11 +1216,12 @@ static DeployResult deploy(const Options &options, return result; } -static bool deployWebKit2(const QMap<QString, QString> &qmakeVariables, - const Options &sourceOptions, QString *errorMessage) +static bool deployWebProcess(const QMap<QString, QString> &qmakeVariables, + const char *binaryName, + const Options &sourceOptions, QString *errorMessage) { // Copy the web process and its dependencies - const QString webProcess = webProcessBinary(sourceOptions.platform); + const QString webProcess = webProcessBinary(binaryName, sourceOptions.platform); const QString webProcessSource = qmakeVariables.value(QStringLiteral("QT_INSTALL_LIBEXECS")) + QLatin1Char('/') + webProcess; if (!updateFile(webProcessSource, sourceOptions.directory, sourceOptions.updateFileFlags, sourceOptions.json, errorMessage)) @@ -1220,6 +1233,28 @@ static bool deployWebKit2(const QMap<QString, QString> &qmakeVariables, return deploy(options, qmakeVariables, errorMessage); } +static bool deployWebEngine(const QMap<QString, QString> &qmakeVariables, + const Options &options, QString *errorMessage) +{ + static const char *installDataFiles[] = {"icudtl.dat", "qtwebengine_resources.pak"}; + + std::wcout << "Deploying: " << webEngineProcessC << "...\n"; + if (!deployWebProcess(qmakeVariables, webEngineProcessC, options, errorMessage)) { + std::wcerr << errorMessage << '\n'; + return false; + } + const QString installData + = qmakeVariables.value(QStringLiteral("QT_INSTALL_DATA")) + QLatin1Char('/'); + for (size_t i = 0; i < sizeof(installDataFiles)/sizeof(installDataFiles[0]); ++i) { + if (!updateFile(installData + QLatin1String(installDataFiles[i]), + options.directory, options.updateFileFlags, options.json, errorMessage)) { + std::wcerr << errorMessage << '\n'; + return false; + } + } + return true; +} + int main(int argc, char **argv) { QCoreApplication a(argc, argv); @@ -1283,8 +1318,15 @@ int main(int argc, char **argv) || ((result.deployedQtLibraries & QtWebKitModule) && (result.directlyUsedQtLibraries & QtQuickModule)))) { if (optVerboseLevel) - std::wcout << "Deploying: " << webProcessC << "...\n"; - if (!deployWebKit2(qmakeVariables, options, &errorMessage)) { + std::wcout << "Deploying: " << webKitProcessC << "...\n"; + if (!deployWebProcess(qmakeVariables, webKitProcessC, options, &errorMessage)) { + std::wcerr << errorMessage << '\n'; + return 1; + } + } + + if (result.deployedQtLibraries & QtWebEngineModule) { + if (!deployWebEngine(qmakeVariables, options, &errorMessage)) { std::wcerr << errorMessage << '\n'; return 1; }