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"