File indexing completed on 2024-05-19 16:30:24

0001 /*
0002     SPDX-FileCopyrightText: 2022 Aditya Mehra <aix.m@outlook.com>
0003     SPDX-License-Identifier: LGPL-2.0-or-later
0004 */
0005 
0006 #include <QGuiApplication>
0007 #include <QQmlApplicationEngine>
0008 //#include <qtwebengineglobal.h>
0009 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
0010 #include <QtWebEngine/QQuickWebEngineProfile>
0011 #else
0012 #include <QtWebEngineQuick/QQuickWebEngineProfile>
0013 #endif
0014 #include <QtWebEngineCore/qwebengineurlrequestinterceptor.h>
0015 #include "plugins/virtualMouse.h"
0016 #include "plugins/virtualKeypress.h"
0017 #include "plugins/globalSettings.h"
0018 #include "plugins/audiorecorder.h"
0019 #include <QQmlContext>
0020 #include <QCommandLineParser>
0021 #include <QCommandLineOption>
0022 
0023 #include <KLocalizedContext>
0024 #include <KLocalizedString>
0025 
0026 
0027 // Add Adblock Implementation
0028 #include <QThread>
0029 #include <QFile>
0030 #include <QDebug>
0031 #include "third-party/ad-block/ad_block_client.h"
0032 
0033 class WebIntercept : public QWebEngineUrlRequestInterceptor
0034 {
0035     Q_OBJECT
0036 public:
0037     WebIntercept(QObject *parent = nullptr) : QWebEngineUrlRequestInterceptor(parent)
0038     {
0039         QThread *thread = QThread::create([this]{
0040             QFile file(":/third-party/easylist.txt");
0041             QString easyListTxt;
0042 
0043             if(!file.exists()) {
0044                 qDebug() << "No easylist.txt file found.";
0045             } else {
0046                 if (file.open(QIODevice::ReadOnly | QIODevice::Text)){
0047                     easyListTxt = file.readAll();
0048                 }
0049                 file.close();
0050                 client.parse(easyListTxt.toStdString().c_str());
0051             }
0052         });
0053         thread->start();
0054     }
0055 
0056     void interceptRequest(QWebEngineUrlRequestInfo &info) override
0057     {
0058         if (client.matches(info.requestUrl().toString().toStdString().c_str(),
0059                            FONoFilterOption, info.requestUrl().host().toStdString().c_str())) {
0060             qDebug() << "Blocked: " << info.requestUrl();
0061             info.block(true);
0062         }
0063     }
0064 
0065 private:
0066     AdBlockClient client;
0067 };
0068 
0069 static QObject *globalSettingsSingletonProvider(QQmlEngine *engine, QJSEngine *scriptEngine)
0070 {
0071     Q_UNUSED(engine)
0072     Q_UNUSED(scriptEngine)
0073 
0074     return new GlobalSettings;
0075 }
0076 
0077 static QObject *audioRecorderSingletonProvider(QQmlEngine *engine, QJSEngine *scriptEngine)
0078 {
0079     Q_UNUSED(engine)
0080     Q_UNUSED(scriptEngine)
0081 
0082     return new AudioRecorder;
0083 }
0084 
0085 int main(int argc, char *argv[])
0086 {
0087     QStringList arguments;
0088     for (int a = 0; a < argc; ++a) {
0089         arguments << QString::fromLocal8Bit(argv[a]);
0090     }
0091 
0092     QCommandLineParser parser;
0093     auto urlOption = QCommandLineOption(QStringLiteral("url"), QStringLiteral("Single url to load in sandbox"), QStringLiteral("url"));
0094     auto sandboxOption = QCommandLineOption(QStringLiteral("sandbox"), QStringLiteral("Sandbox Mode"));
0095     auto helpOption = QCommandLineOption(QStringLiteral("help"), QStringLiteral("Show this help message"));
0096     parser.addOptions({urlOption, sandboxOption, helpOption});
0097     parser.process(arguments);
0098 
0099     qputenv("QT_VIRTUALKEYBOARD_DESKTOP_DISABLE", QByteArray("0"));
0100     qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard"));
0101     QCoreApplication::setOrganizationName("AuraBrowser");
0102     QCoreApplication::setApplicationName("AuraBrowser");
0103 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
0104     QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
0105 #endif
0106     QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts);
0107 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
0108     QtWebEngine::initialize();
0109 #else
0110     QtWebEngineQuick::initialize();
0111 #endif
0112     QGuiApplication app(argc, argv);
0113     app.setWindowIcon(QIcon(":/qml/images/logo-small.png"));
0114     KLocalizedString::setApplicationDomain("aura-browser");
0115 
0116     if (parser.isSet(helpOption)) {
0117         parser.showHelp();
0118         return 0;
0119     }
0120 
0121     QQmlApplicationEngine engine;
0122     engine.rootContext()->setContextObject(new KLocalizedContext(&engine));
0123 
0124     // Adblock Implementation
0125     WebIntercept interceptor;
0126     QQuickWebEngineProfile adblockProfile;
0127     adblockProfile.setUrlRequestInterceptor(&interceptor);
0128     adblockProfile.setHttpUserAgent("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36");
0129     adblockProfile.setStorageName("Profile");
0130     adblockProfile.setOffTheRecord(false);
0131     engine.rootContext()->setContextProperty("adblockProfile", &adblockProfile);
0132 
0133     FakeCursor fakeCursor;
0134     engine.rootContext()->setContextProperty("Cursor", &fakeCursor);
0135     QQmlContext* ctx = engine.rootContext();
0136     VirtualKeyPress virtualKeyPress;
0137     ctx->setContextProperty("keyEmitter", &virtualKeyPress);
0138     auto offlineStoragePath = QUrl::fromLocalFile(engine.offlineStoragePath());
0139     engine.rootContext()->setContextProperty("offlineStoragePath", offlineStoragePath);
0140     qmlRegisterSingletonType<GlobalSettings>("Aura", 1, 0, "GlobalSettings", globalSettingsSingletonProvider);
0141     qmlRegisterSingletonType<AudioRecorder>("Aura", 1, 0, "AudioRecorder", audioRecorderSingletonProvider);
0142     qmlRegisterSingletonType(QUrl(QStringLiteral("qrc:/qml/NavigationSoundEffects.qml")), "Aura", 1, 0, "NavigationSoundEffects");
0143 
0144     QString sandboxURL = parser.value(urlOption);
0145     bool sandboxMode = parser.isSet(sandboxOption);
0146     
0147     if (arguments.count() > 1) {
0148         QUrl url = QUrl::fromUserInput(arguments.at(1));
0149         if (url.isValid()) {
0150             sandboxURL = url.toString();
0151             sandboxMode = true;
0152         }
0153     }
0154 
0155     engine.rootContext()->setContextProperty(QStringLiteral("sandboxURL"), sandboxURL);
0156     engine.rootContext()->setContextProperty(QStringLiteral("sandboxMode"), sandboxMode);
0157 
0158     // Define const QUrl url here, if the user is in sandbox mode, we want to load the sandbox qml file, if not, we want to load the main qml file
0159     QUrl url;
0160     if (sandboxMode) {
0161         url = QUrl(QStringLiteral("qrc:/qml/mainSandbox.qml"));
0162     } else {
0163         url = QUrl(QStringLiteral("qrc:/qml/main.qml"));
0164     }
0165 
0166     QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
0167                      &app, [url](QObject *obj, const QUrl &objUrl) {
0168         if (!obj && url == objUrl)
0169             QCoreApplication::exit(-1);
0170     }, Qt::QueuedConnection);
0171     engine.load(url);
0172 
0173     return app.exec();
0174 }
0175 
0176 #include "main.moc"