X-Git-Url: https://gitweb.stoutner.com/?a=blobdiff_plain;f=src%2Fwidgets%2FPrivacyWebEngineView.cpp;h=20ae259c96ebd1f4a3310093a4d18f535ad7cba0;hb=1fad3b82b55991122434b7a69dd0a80928a732e2;hp=28fb66da18f32d7b66420a3cf361b960b873f0d9;hpb=0d23ee5e9b43b247cdda0a4cbb73f8b1a70f4500;p=PrivacyBrowserPC.git diff --git a/src/widgets/PrivacyWebEngineView.cpp b/src/widgets/PrivacyWebEngineView.cpp index 28fb66d..20ae259 100644 --- a/src/widgets/PrivacyWebEngineView.cpp +++ b/src/widgets/PrivacyWebEngineView.cpp @@ -1,5 +1,5 @@ /* - * Copyright © 2022 Soren Stoutner . + * Copyright 2022-2023 Soren Stoutner . * * This file is part of Privacy Browser PC . * @@ -19,10 +19,40 @@ // Application headers. #include "PrivacyWebEngineView.h" +#include "Settings.h" #include "databases/CookiesDatabase.h" +#include "databases/DomainsDatabase.h" +#include "interceptors/UrlRequestInterceptor.h" +#include "windows/BrowserWindow.h" + +// Qt toolkit headers. +#include +#include // Construct the class. -PrivacyWebEngineView::PrivacyWebEngineView() : QWebEngineView(nullptr) {} +PrivacyWebEngineView::PrivacyWebEngineView() : QWebEngineView(nullptr) +{ + // Create an off-the-record profile (the default when no profile name is specified). + webEngineProfilePointer = new QWebEngineProfile(QLatin1String("")); + + // Create a WebEngine page. + QWebEnginePage *webEnginePagePointer = new QWebEnginePage(webEngineProfilePointer); + + // Set the WebEngine page. + setPage(webEnginePagePointer); + + // Get handles for the various aspects of the WebEngine. + webEngineSettingsPointer = webEnginePagePointer->settings(); + + // Instantiate the URL request interceptor. + UrlRequestInterceptor *urlRequestInterceptorPointer = new UrlRequestInterceptor(); + + // Set the URL request interceptor. + webEngineProfilePointer->setUrlRequestInterceptor(urlRequestInterceptorPointer); + + // Reapply the domain settings when the host changes. + connect(urlRequestInterceptorPointer, SIGNAL(applyDomainSettings(QString)), this, SLOT(applyDomainSettingsWithoutReloading(QString))); +} void PrivacyWebEngineView::addCookieToList(const QNetworkCookie &cookie) const { @@ -39,6 +69,225 @@ void PrivacyWebEngineView::addCookieToList(const QNetworkCookie &cookie) const emit updateCookiesAction(cookieListPointer->size()); } +void PrivacyWebEngineView::applyDomainSettingsWithoutReloading(const QString &hostname) +{ + // Apply the domain settings `false` does not reload the website. + applyDomainSettings(hostname, false); +} + +void PrivacyWebEngineView::applyDomainSettings(const QString &hostname, const bool reloadWebsite) +{ + // Get the record for the hostname. + QSqlQuery domainQuery = DomainsDatabase::getDomainQuery(hostname); + + // Check if the hostname has domain settings. + if (domainQuery.isValid()) // The hostname has domain settings. + { + // Get the domain record. + QSqlRecord domainRecord = domainQuery.record(); + + // Store the domain settings name. + domainSettingsName = domainRecord.field(DomainsDatabase::DOMAIN_NAME).value().toString(); + + // Set the JavaScript status. + switch (domainRecord.field(DomainsDatabase::JAVASCRIPT).value().toInt()) + { + // Set the default JavaScript status. + case (DomainsDatabase::SYSTEM_DEFAULT): + { + webEngineSettingsPointer->setAttribute(QWebEngineSettings::JavascriptEnabled, Settings::javaScriptEnabled()); + + break; + } + + // Disable JavaScript. + case (DomainsDatabase::DISABLED): + { + webEngineSettingsPointer->setAttribute(QWebEngineSettings::JavascriptEnabled, false); + + break; + } + + // Enable JavaScript. + case (DomainsDatabase::ENABLED): + { + webEngineSettingsPointer->setAttribute(QWebEngineSettings::JavascriptEnabled, true); + + break; + } + } + + // Set the local storage status. + switch (domainRecord.field(DomainsDatabase::LOCAL_STORAGE).value().toInt()) + { + // Set the default local storage status. + case (DomainsDatabase::SYSTEM_DEFAULT): + { + localStorageEnabled = Settings::localStorageEnabled(); + + break; + } + + // Disable local storage. + case (DomainsDatabase::DISABLED): + { + localStorageEnabled = false; + + break; + } + + // Enable local storage. + case (DomainsDatabase::ENABLED): + { + localStorageEnabled = true; + + break; + } + } + + // Set the DOM storage status. + switch (domainRecord.field(DomainsDatabase::DOM_STORAGE).value().toInt()) + { + // Set the default DOM storage status. QWebEngineSettings confusingly calls this local storage. + case (DomainsDatabase::SYSTEM_DEFAULT): + { + webEngineSettingsPointer->setAttribute(QWebEngineSettings::LocalStorageEnabled, Settings::domStorageEnabled()); + + break; + } + + // Disable DOM storage. QWebEngineSettings confusingly calls this local storage. + case (DomainsDatabase::DISABLED): + { + webEngineSettingsPointer->setAttribute(QWebEngineSettings::LocalStorageEnabled, false); + + break; + } + + // Enable DOM storage. QWebEngineSettings confusingly calls this local storage. + case (DomainsDatabase::ENABLED): + { + webEngineSettingsPointer->setAttribute(QWebEngineSettings::LocalStorageEnabled, true); + + break; + } + } + + // Set the user agent. + webEngineProfilePointer->setHttpUserAgent(UserAgentHelper::getResultingDomainSettingsUserAgent(domainRecord.field(DomainsDatabase::USER_AGENT).value().toString())); + + // Check if a custom zoom factor is set. + if (domainRecord.field(DomainsDatabase::ZOOM_FACTOR).value().toInt()) + { + // Store the current zoom factor. + setZoomFactor(domainRecord.field(DomainsDatabase::CUSTOM_ZOOM_FACTOR).value().toDouble()); + } + else + { + // Reset the current zoom factor. + setZoomFactor(Settings::zoomFactor()); + } + } + else // The hostname does not have domain settings. + { + // Reset the domain settings name. + domainSettingsName = QLatin1String(""); + + // Set the JavaScript status. + webEngineSettingsPointer->setAttribute(QWebEngineSettings::JavascriptEnabled, Settings::javaScriptEnabled()); + + // Set the local storage status. + localStorageEnabled = Settings::localStorageEnabled(); + + // Set DOM storage. In QWebEngineSettings it is called Local Storage. + webEngineSettingsPointer->setAttribute(QWebEngineSettings::LocalStorageEnabled, Settings::domStorageEnabled()); + + // Set the user agent. + webEngineProfilePointer->setHttpUserAgent(UserAgentHelper::getUserAgentFromDatabaseName(Settings::userAgent())); + + // Set the zoom factor. + setZoomFactor(Settings::zoomFactor()); + } + + // Reload the website if requested. + if (reloadWebsite) + reload(); + + // Update the UI. + emit updateUi(this); +} + +void PrivacyWebEngineView::contextMenuEvent(QContextMenuEvent *contextMenuEvent) { + // Get a handle for the + QWebEnginePage *webEnginePagePointer = page(); + + // Get a handle for the menu. + QMenu *contextMenu = webEnginePagePointer->createStandardContextMenu(); + + // Get the list of context menu actions. + const QList contextMenuActionsList = contextMenu->actions(); + + // Add the open link in new background tab action if the context menu already contains the open link in new window action. + if (contextMenuActionsList.contains(webEnginePagePointer->action(QWebEnginePage::OpenLinkInNewWindow))) + { + // Move the open in new tab action to the top of the list. + contextMenu->insertAction(webEnginePagePointer->action(QWebEnginePage::Back), webEnginePagePointer->action(QWebEnginePage::OpenLinkInNewTab)); + + // Add the open link in background tab action below the open in new tab action. + contextMenu->insertAction(webEnginePagePointer->action(QWebEnginePage::Back), webEnginePagePointer->action(QWebEnginePage::OpenLinkInNewBackgroundTab)); + + // Move the open in new window action below the open in background tab action. + contextMenu->insertAction(webEnginePagePointer->action(QWebEnginePage::Back), webEnginePagePointer->action(QWebEnginePage::OpenLinkInNewWindow)); + + // Add a separator below the open in new window action. + contextMenu->insertSeparator(webEnginePagePointer->action(QWebEnginePage::Back)); + } + + // Display the menu using the location in the context menu event. + contextMenu->popup(contextMenuEvent->globalPos()); +} + +QWebEngineView* PrivacyWebEngineView::createWindow(QWebEnginePage::WebWindowType webWindowType) { + // Get a handle for the browser window. + BrowserWindow *browserWindowPointer = qobject_cast(window()); + + // Create the requested window type. + switch (webWindowType) + { + case QWebEnginePage::WebBrowserTab: + { + // Create the new tab and return the privacy WebEngine view pointer. `true` removes the focus from the blank URL line edit. + // The new privacy WebEngine view pointer is returned so it can be populated with the link from the context menu. + return browserWindowPointer->tabWidgetPointer->addTab(true); + } + + case QWebEnginePage::WebBrowserWindow: + { + // Create a new browser window. + BrowserWindow *newBrowserWindowPointer = new BrowserWindow(); + + // Show the new browser window. + newBrowserWindowPointer->show(); + + // The new privacy WebEngine view pointer is returned so it can be populated with the link from the context menu. + return newBrowserWindowPointer->tabWidgetPointer->loadBlankInitialWebsite(); + } + + case QWebEnginePage::WebBrowserBackgroundTab: + { + // Create the new tab and return the privacy WebEngine view pointer. `false` does not clear the URL line edit. `true` creates a background tab. + // The new privacy WebEngine view pointer is returned so it can be populated with the link from the context menu. + return browserWindowPointer->tabWidgetPointer->addTab(false, true); + } + + default: + { + // Return a null pointer for opening a web dialog. + return nullptr; + } + } +} + void PrivacyWebEngineView::removeCookieFromList(const QNetworkCookie &cookie) const { //qDebug() << "Remove cookie: " << cookie.toRawForm();