/*
- * Copyright 2022-2023 Soren Stoutner <soren@stoutner.com>.
+ * Copyright 2022-2024 Soren Stoutner <soren@stoutner.com>.
*
- * This file is part of Privacy Browser PC <https://www.stoutner.com/privacy-browser-pc>.
+ * This file is part of Privacy Browser PC <https://www.stoutner.com/privacy-browser-pc/>.
*
* Privacy Browser PC is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
#include "TabWidget.h"
#include "Settings.h"
#include "ui_AddTabWidget.h"
-#include "ui_Tab.h"
#include "ui_TabWidget.h"
#include "databases/CookiesDatabase.h"
#include "dialogs/SaveDialog.h"
#include <QPrintDialog>
#include <QPrintPreviewDialog>
#include <QPrinter>
+#include <QSplitter>
// Initialize the public static variables.
QString TabWidget::webEngineDefaultUserAgent = QLatin1String("");
qTabWidgetPointer->currentWidget()->setFocus();
}
-PrivacyWebEngineView* TabWidget::addTab(const bool removeUrlLineEditFocus, const bool backgroundTab, const QString urlString)
+PrivacyWebEngineView* TabWidget::addTab(const bool removeUrlLineEditFocus, const bool adjacent, const bool backgroundTab, const QString urlString)
{
// Create a splitter widget.
QSplitter *splitterPointer = new QSplitter();
splitterPointer->addWidget(privacyWebEngineViewPointer);
splitterPointer->addWidget(devToolsWebEngineViewPointer);
+ // Initialize the new tab index.
+ int newTabIndex = 0;
+
// Add a new tab.
- int newTabIndex = qTabWidgetPointer->addTab(splitterPointer, i18nc("New tab label.", "New Tab"));
+ if (adjacent) // Add the new tab adjacent to the current tab.
+ newTabIndex = qTabWidgetPointer->insertTab((qTabWidgetPointer->currentIndex() + 1), splitterPointer, i18nc("New tab label.", "New Tab"));
+ else // Add the new tab at the end of the list.
+ newTabIndex = qTabWidgetPointer->addTab(splitterPointer, i18nc("New tab label.", "New Tab"));
// Set the default tab icon.
qTabWidgetPointer->setTabIcon(newTabIndex, defaultFavoriteIcon);
// Plugins must be enabled for the PDF viewer to work. <https://doc.qt.io/qt-5/qtwebengine-features.html#pdf-file-viewing>
webEngineSettingsPointer->setAttribute(QWebEngineSettings::PluginsEnabled, true);
+ // Update the blocked requests action.
+ connect(privacyWebEngineViewPointer, &PrivacyWebEngineView::requestBlocked, [this, privacyWebEngineViewPointer] (const QVector<int> blockedRequestsVector)
+ {
+ // Update the blocked requests action if the specified privacy WebEngine view is the current privacy WebEngine view.
+ if (privacyWebEngineViewPointer == currentPrivacyWebEngineViewPointer)
+ emit blockedRequestsUpdated(blockedRequestsVector);
+ });
+
// Update the cookies action.
- connect(privacyWebEngineViewPointer, &PrivacyWebEngineView::updateCookiesAction, [this, privacyWebEngineViewPointer] (const int numberOfCookies)
+ connect(privacyWebEngineViewPointer, &PrivacyWebEngineView::numberOfCookiesChanged, [this, privacyWebEngineViewPointer] (const int numberOfCookies)
{
// Update the cookie action if the specified privacy WebEngine view is the current privacy WebEngine view.
if (privacyWebEngineViewPointer == currentPrivacyWebEngineViewPointer)
- emit updateCookiesAction(numberOfCookies);
+ emit cookiesChanged(numberOfCookies);
});
// Process cookie changes.
currentPrivacyWebEngineViewPointer->reload();
}
-void TabWidget::applyOnTheFlyZoomFactor(const double &zoomFactor) const
+void TabWidget::applyOnTheFlyZoomFactor(const double zoomFactorDouble) const
{
// Set the zoom factor.
- currentPrivacyWebEngineViewPointer->setZoomFactor(zoomFactor);
+ currentPrivacyWebEngineViewPointer->setZoomFactor(zoomFactorDouble);
}
void TabWidget::applySpellCheckLanguages() const
return currentPrivacyWebEngineViewPointer->url().toString();
}
+QString TabWidget::getCurrentUserAgent() const
+{
+ // Return the current WebEngine user agent.
+ return currentWebEngineProfilePointer->httpUserAgent();
+}
+
QString& TabWidget::getDomainSettingsName() const
{
// Return the domain settings name.
void TabWidget::refresh() const
{
+ // Reset the HTTP authentication dialog counter.
+ currentPrivacyWebEngineViewPointer->httpAuthenticationDialogsDisplayed = 0;
+
// Reload the website.
currentPrivacyWebEngineViewPointer->reload();
}
void TabWidget::saveArchive()
{
// Get the suggested file name.
- QString suggestedFileName = currentPrivacyWebEngineViewPointer->url().host() + ".mht";
+ QString suggestedFileName = currentPrivacyWebEngineViewPointer->title() + ".mht";
// Get the download directory.
- QString downloadDirectory = Settings::downloadLocation();
+ QString downloadDirectory = Settings::downloadDirectory();
// Resolve the system download directory if specified.
if (downloadDirectory == QLatin1String("System Download Directory"))
// Save the webpage as an archive if the file save path is populated.
if (!saveFilePath.isEmpty())
{
+ // Update the download directory if specified.
+ if (Settings::autoUpateDownloadDirectory())
+ updateDownloadDirectory(saveFilePath);
+
// Set the saving archive flag. Otherwise, a second download tries to run.
savingArchive = true;
if (!isRunningKde || currentPrivacyWebEngineViewPointer->localStorageEnabled) // KDE is not running or local storage (cookies) is enabled. Use WebEngine's downloader.
{
// Instantiate the save dialog.
- SaveDialog *saveDialogPointer = new SaveDialog(downloadUrl, mimeTypeString, totalBytes);
+ SaveDialog *saveDialogPointer = new SaveDialog(this, downloadUrl, mimeTypeString, totalBytes);
// Display the save dialog.
int saveDialogResult = saveDialogPointer->exec();
if (saveDialogResult == QDialog::Accepted) // Save was selected.
{
// Get the download directory.
- QString downloadDirectory = Settings::downloadLocation();
+ QString downloadDirectory = Settings::downloadDirectory();
// Resolve the system download directory if specified.
if (downloadDirectory == QLatin1String("System Download Directory"))
// Process the save file path.
if (!saveFilePath.isEmpty()) // The file save path is populated.
{
+ // Update the download directory if specified.
+ if (Settings::autoUpateDownloadDirectory())
+ updateDownloadDirectory(saveFilePath);
+
// Create a save file path file info.
QFileInfo saveFilePathFileInfo = QFileInfo(saveFilePath);
// This must use the show command to launch a separate dialog which cancels WebEngine's automatic background download of the file to a temporary location.
{
// Instantiate the save dialog. `true` instructs it to use the native downloader
- SaveDialog *saveDialogPointer = new SaveDialog(downloadUrl, mimeTypeString, totalBytes, suggestedFileName, true);
+ SaveDialog *saveDialogPointer = new SaveDialog(this, downloadUrl, mimeTypeString, totalBytes, suggestedFileName, true);
// Connect the save button.
connect(saveDialogPointer, SIGNAL(useNativeKdeDownloader(QUrl &, QString &)), this, SLOT(useNativeKdeDownloader(QUrl &, QString &)));
savingArchive = false;
}
+void TabWidget::stop() const
+{
+ // Stop the loading of the current privacy WebEngine.
+ currentPrivacyWebEngineViewPointer->stop();
+}
+
void TabWidget::toggleDeveloperTools(const bool enabled) const
{
// Get a handle for the current developer tools WebEngine.
currentPrivacyWebEngineViewPointer->reload();
}
+void TabWidget::toggleEasyList() const
+{
+ // Toggle EasyList.
+ currentPrivacyWebEngineViewPointer->easyListEnabled = !currentPrivacyWebEngineViewPointer->easyListEnabled;
+
+ // Reload the website.
+ currentPrivacyWebEngineViewPointer->reload();
+}
+
+void TabWidget::toggleEasyPrivacy() const
+{
+ // Toggle EasyPrivacy.
+ currentPrivacyWebEngineViewPointer->easyPrivacyEnabled = !currentPrivacyWebEngineViewPointer->easyPrivacyEnabled;
+
+ // Reload the website.
+ currentPrivacyWebEngineViewPointer->reload();
+}
+
+void TabWidget::toggleFanboysAnnoyanceList() const
+{
+ // Toggle Fanboy's Annoyance List.
+ currentPrivacyWebEngineViewPointer->fanboysAnnoyanceListEnabled = !currentPrivacyWebEngineViewPointer->fanboysAnnoyanceListEnabled;
+
+ // Reload the website.
+ currentPrivacyWebEngineViewPointer->reload();
+}
+
void TabWidget::toggleFindCaseSensitive(const QString &text)
{
// Toggle find case sensitive.
currentPrivacyWebEngineViewPointer->reload();
}
+void TabWidget::toggleUltraList() const
+{
+ // Toggle UltraList.
+ currentPrivacyWebEngineViewPointer->ultraListEnabled = !currentPrivacyWebEngineViewPointer->ultraListEnabled;
+
+ // Reload the website.
+ currentPrivacyWebEngineViewPointer->reload();
+}
+
+void TabWidget::toggleUltraPrivacy() const
+{
+ // Toggle UltraPrivacy.
+ currentPrivacyWebEngineViewPointer->ultraPrivacyEnabled = !currentPrivacyWebEngineViewPointer->ultraPrivacyEnabled;
+
+ // Reload the website.
+ currentPrivacyWebEngineViewPointer->reload();
+}
+
+void TabWidget::updateDownloadDirectory(QString newDownloadDirectory) const
+{
+ // Remove the file name from the save file path.
+ newDownloadDirectory.truncate(newDownloadDirectory.lastIndexOf(QLatin1Char('/')));
+
+ // Update the download location.
+ Settings::setDownloadDirectory(newDownloadDirectory);
+
+ // Get a handle for the KConfig skeleton.
+ KConfigSkeleton *kConfigSkeletonPointer = Settings::self();
+
+ // Write the settings to disk.
+ kConfigSkeletonPointer->save();
+}
+
void TabWidget::updateUiFromWebEngineView(const PrivacyWebEngineView *privacyWebEngineViewPointer) const
{
// Only update the UI if the signal was emitted from the current privacy WebEngine.
if (privacyWebEngineViewPointer == currentPrivacyWebEngineViewPointer)
{
// Update the UI.
+ emit easyListStatusChanged(currentPrivacyWebEngineViewPointer->easyListEnabled);
+ emit easyPrivacyStatusChanged(currentPrivacyWebEngineViewPointer->easyPrivacyEnabled);
+ emit fanboysAnnoyanceListStatusChanged(currentPrivacyWebEngineViewPointer->fanboysAnnoyanceListEnabled);
+ emit ultraListStatusChanged(currentPrivacyWebEngineViewPointer->ultraListEnabled);
+ emit ultraPrivacyStatusChanged(currentPrivacyWebEngineViewPointer->ultraPrivacyEnabled);
emit updateDefaultZoomFactor(currentPrivacyWebEngineViewPointer->defaultZoomFactor);
emit updateDomainSettingsIndicator(currentPrivacyWebEngineViewPointer->domainSettingsName != QLatin1String(""));
emit updateJavaScriptAction(currentWebEngineSettingsPointer->testAttribute(QWebEngineSettings::JavascriptEnabled));
DevToolsWebEngineView *devToolsWebEngineViewPointer = qTabWidgetPointer->currentWidget()->findChild<DevToolsWebEngineView *>();
// Update the actions.
- emit updateDefaultZoomFactor(currentPrivacyWebEngineViewPointer->defaultZoomFactor);
+ emit easyListStatusChanged(currentPrivacyWebEngineViewPointer->easyListEnabled);
+ emit easyPrivacyStatusChanged(currentPrivacyWebEngineViewPointer->easyPrivacyEnabled);
+ emit fanboysAnnoyanceListStatusChanged(currentPrivacyWebEngineViewPointer->fanboysAnnoyanceListEnabled);
+ emit ultraListStatusChanged(currentPrivacyWebEngineViewPointer->ultraListEnabled);
+ emit ultraPrivacyStatusChanged(currentPrivacyWebEngineViewPointer->ultraPrivacyEnabled);
+ emit blockedRequestsUpdated(currentPrivacyWebEngineViewPointer->blockedRequestsVector);
+ emit cookiesChanged(currentPrivacyWebEngineViewPointer->cookieListPointer->size());
emit updateBackAction(currentWebEngineHistoryPointer->canGoBack());
- emit updateCookiesAction(currentPrivacyWebEngineViewPointer->cookieListPointer->size());
+ emit updateDefaultZoomFactor(currentPrivacyWebEngineViewPointer->defaultZoomFactor);
emit updateDeveloperToolsAction(devToolsWebEngineViewPointer->isVisible());
emit updateDomStorageAction(currentWebEngineSettingsPointer->testAttribute(QWebEngineSettings::LocalStorageEnabled));
emit updateForwardAction(currentWebEngineHistoryPointer->canGoForward());
void TabWidget::useNativeKdeDownloader(QUrl &downloadUrl, QString &suggestedFileName)
{
// Get the download directory.
- QString downloadDirectory = Settings::downloadLocation();
+ QString downloadDirectory = Settings::downloadDirectory();
// Resolve the system download directory if specified.
if (downloadDirectory == QLatin1String("System Download Directory"))
saveFileDialogPointer->setWindowModality(Qt::WindowModal);
// Process the saving of the file. The save file dialog pointer must be captured directly instead of by reference or nasty crashes occur.
- auto saveFile = [saveFileDialogPointer, downloadUrl] ()
+ auto saveFile = [saveFileDialogPointer, downloadUrl, this] ()
{
// Get the save location. The dialog box should only allow the selecting of one file location.
QUrl saveLocation = saveFileDialogPointer->selectedUrls().value(0);
+ // Update the download directory if specified.
+ if (Settings::autoUpateDownloadDirectory())
+ updateDownloadDirectory(saveLocation.toLocalFile());
+
// Create a file copy job. `-1` creates the file with default permissions.
KIO::FileCopyJob *fileCopyJobPointer = KIO::file_copy(downloadUrl, saveLocation, -1, KIO::Overwrite);
// Show the dialog.
saveFileDialogPointer->show();
}
+