File indexing completed on 2024-06-02 05:30:37

0001 /*
0002    SPDX-FileCopyrightText: 2016-2024 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "webengineexporthtmlpagejob.h"
0008 #include <QTemporaryFile>
0009 #include <QWebEngineView>
0010 
0011 using namespace WebEngineViewer;
0012 template<typename Arg, typename R, typename C>
0013 struct InvokeWrapper {
0014     R *receiver;
0015     void (C::*memberFun)(Arg);
0016     void operator()(Arg result)
0017     {
0018         (receiver->*memberFun)(result);
0019     }
0020 };
0021 
0022 template<typename Arg, typename R, typename C>
0023 InvokeWrapper<Arg, R, C> invokeWebEngineExportHtml(R *receiver, void (C::*memberFun)(Arg))
0024 {
0025     InvokeWrapper<Arg, R, C> wrapper = {receiver, memberFun};
0026     return wrapper;
0027 }
0028 
0029 WebEngineExportHtmlPageJob::WebEngineExportHtmlPageJob(QObject *parent)
0030     : QObject(parent)
0031 {
0032 }
0033 
0034 WebEngineExportHtmlPageJob::~WebEngineExportHtmlPageJob() = default;
0035 
0036 void WebEngineExportHtmlPageJob::start()
0037 {
0038     if (!mEngineView) {
0039         Q_EMIT failed();
0040         deleteLater();
0041         return;
0042     }
0043     mEngineView->page()->toHtml(invokeWebEngineExportHtml(this, &WebEngineExportHtmlPageJob::slotSaveHtmlToPage));
0044 }
0045 
0046 void WebEngineExportHtmlPageJob::slotSaveHtmlToPage(const QString &text)
0047 {
0048     QTemporaryFile temporaryFile;
0049     temporaryFile.setAutoRemove(false);
0050     if (!temporaryFile.open()) {
0051         Q_EMIT failed();
0052         deleteLater();
0053         return;
0054     }
0055     QTextStream stream(&temporaryFile);
0056     QString newText = text;
0057     newText.replace(QLatin1StringView("<head>"), QLatin1StringView("<head><meta charset=\"UTF-8\">"));
0058     stream << newText;
0059     temporaryFile.close();
0060     // We need to remove this temporary file
0061     Q_EMIT success(temporaryFile.fileName());
0062     deleteLater();
0063 }
0064 
0065 QWebEngineView *WebEngineExportHtmlPageJob::engineView() const
0066 {
0067     return mEngineView;
0068 }
0069 
0070 void WebEngineExportHtmlPageJob::setEngineView(QWebEngineView *engineView)
0071 {
0072     mEngineView = engineView;
0073 }
0074 
0075 #include "moc_webengineexporthtmlpagejob.cpp"