]> gitweb.stoutner.com Git - PrivacyBrowserPC.git/blobdiff - src/widgets/TabWidget.cpp
Move `applyDomainSettings()` to `PrivacyWebEngineView`. https://redmine.stoutner...
[PrivacyBrowserPC.git] / src / widgets / TabWidget.cpp
index 5ef7fc5aa5c36e1513c3b25bbc53dde44512dcc6..2e32cab37320efa2364d1921a54bcf6b3c4fb965 100644 (file)
 #include "ui_AddTabWidget.h"
 #include "ui_TabWidget.h"
 #include "databases/CookiesDatabase.h"
-#include "databases/DomainsDatabase.h"
 #include "dialogs/SaveDialog.h"
 #include "filters/MouseEventFilter.h"
 #include "helpers/SearchEngineHelper.h"
-#include "interceptors/UrlRequestInterceptor.h"
 #include "windows/BrowserWindow.h"
 
 // KDE Framework headers.
@@ -61,25 +59,25 @@ TabWidget::TabWidget(QWidget *parent) : QWidget(parent)
     tabWidgetUi.setupUi(this);
 
     // Get a handle for the tab widget.
-    tabWidgetPointer = tabWidgetUi.tabWidget;
+    qTabWidgetPointer = tabWidgetUi.tabWidget;
 
     // Setup the add tab UI.
-    addTabWidgetUi.setupUi(tabWidgetPointer);
+    addTabWidgetUi.setupUi(qTabWidgetPointer);
 
     // Get handles for the add tab widgets.
     QWidget *addTabWidgetPointer = addTabWidgetUi.addTabQWidget;
     QPushButton *addTabButtonPointer = addTabWidgetUi.addTabButton;
 
     // Display the add tab widget.
-    tabWidgetPointer->setCornerWidget(addTabWidgetPointer);
+    qTabWidgetPointer->setCornerWidget(addTabWidgetPointer);
 
     // Add the first tab.
     addFirstTab();
 
     // Process tab events.
-    connect(tabWidgetPointer, SIGNAL(currentChanged(int)), this, SLOT(updateUiWithTabSettings()));
+    connect(qTabWidgetPointer, SIGNAL(currentChanged(int)), this, SLOT(updateUiWithTabSettings()));
     connect(addTabButtonPointer, SIGNAL(clicked()), this, SLOT(addTab()));
-    connect(tabWidgetPointer, SIGNAL(tabCloseRequested(int)), this, SLOT(deleteTab(int)));
+    connect(qTabWidgetPointer, SIGNAL(tabCloseRequested(int)), this, SLOT(deleteTab(int)));
 
     // Store a copy of the WebEngine default user agent.
     webEngineDefaultUserAgent = currentWebEngineProfilePointer->httpUserAgent();
@@ -98,10 +96,10 @@ TabWidget::TabWidget(QWidget *parent) : QWidget(parent)
 TabWidget::~TabWidget()
 {
     // Manually delete each WebEngine page.
-    for (int i = 0; i < tabWidgetPointer->count(); ++i)
+    for (int i = 0; i < qTabWidgetPointer->count(); ++i)
     {
         // Get the privacy WebEngine view.
-        PrivacyWebEngineView *privacyWebEngineViewPointer = qobject_cast<PrivacyWebEngineView *>(tabWidgetPointer->widget(i));
+        PrivacyWebEngineView *privacyWebEngineViewPointer = qobject_cast<PrivacyWebEngineView *>(qTabWidgetPointer->widget(i));
 
         // Deletion the WebEngine page to prevent the following error:  `Release of profile requested but WebEnginePage still not deleted. Expect troubles !`
         delete privacyWebEngineViewPointer->page();
@@ -111,7 +109,7 @@ TabWidget::~TabWidget()
 // The cookie is copied instead of referenced so that changes made to the cookie do not create a race condition with the display of the cookie in the dialog.
 void TabWidget::addCookieToStore(QNetworkCookie cookie, QWebEngineCookieStore *webEngineCookieStorePointer) const
 {
-    // Create a url.
+    // Create a URL.
     QUrl url;
 
     // Check to see if the domain does not start with a `.` because Qt makes this harder than it should be.  <https://doc.qt.io/qt-5/qwebenginecookiestore.html#setCookie>
@@ -141,7 +139,7 @@ void TabWidget::addFirstTab()
     updateUiWithTabSettings();
 
     // Set the focus on the current tab widget.  This prevents the tab bar from showing a blue bar under the label of the first tab.
-    tabWidgetPointer->currentWidget()->setFocus();
+    qTabWidgetPointer->currentWidget()->setFocus();
 }
 
 PrivacyWebEngineView* TabWidget::addTab(const bool removeUrlLineEditFocus, const bool backgroundTab)
@@ -150,19 +148,14 @@ PrivacyWebEngineView* TabWidget::addTab(const bool removeUrlLineEditFocus, const
     PrivacyWebEngineView *privacyWebEngineViewPointer = new PrivacyWebEngineView();
 
     // Add a new tab.
-    int newTabIndex = tabWidgetPointer->addTab(privacyWebEngineViewPointer, i18nc("New tab label.", "New Tab"));
+    int newTabIndex = qTabWidgetPointer->addTab(privacyWebEngineViewPointer, i18nc("New tab label.", "New Tab"));
 
     // Set the default tab icon.
-    tabWidgetPointer->setTabIcon(newTabIndex, defaultTabIcon);
+    qTabWidgetPointer->setTabIcon(newTabIndex, defaultTabIcon);
 
-    // Create an off-the-record profile (the default when no profile name is specified).
-    QWebEngineProfile *webEngineProfilePointer = new QWebEngineProfile(QLatin1String(""));
-
-    // Create a WebEngine page.
-    QWebEnginePage *webEnginePagePointer = new QWebEnginePage(webEngineProfilePointer);
-
-    // Set the WebEngine page.
-    privacyWebEngineViewPointer->setPage(webEnginePagePointer);
+    // Get handles for the WebEngine page and profile.
+    QWebEnginePage *webEnginePagePointer = privacyWebEngineViewPointer->page();
+    QWebEngineProfile *webEngineProfilePointer = webEnginePagePointer->profile();
 
     // Get handles for the web engine elements.
     QWebEngineCookieStore *webEngineCookieStorePointer = webEngineProfilePointer->cookieStore();
@@ -181,9 +174,6 @@ PrivacyWebEngineView* TabWidget::addTab(const bool removeUrlLineEditFocus, const
             emit updateBackAction(currentWebEngineHistoryPointer->canGoBack());
             emit updateForwardAction(currentWebEngineHistoryPointer->canGoForward());
         }
-
-        // Reapply the zoom factor.  This is a bug in QWebEngineView that resets the zoom with every load.  It can be removed once <https://redmine.stoutner.com/issues/799> is fixed.
-        privacyWebEngineViewPointer->setZoomFactor(currentZoomFactor);
     });
 
     // Update the progress bar when a load is started.
@@ -239,15 +229,6 @@ PrivacyWebEngineView* TabWidget::addTab(const bool removeUrlLineEditFocus, const
     // Handle file downloads.
     connect(webEngineProfilePointer, SIGNAL(downloadRequested(QWebEngineDownloadItem *)), this, SLOT(showSaveDialog(QWebEngineDownloadItem *)));
 
-    // 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)));
-
     // Set the local storage filter.
     webEngineCookieStorePointer->setCookieFilter([privacyWebEngineViewPointer](const QWebEngineCookieStore::FilterRequest &filterRequest)
     {
@@ -322,13 +303,13 @@ PrivacyWebEngineView* TabWidget::addTab(const bool removeUrlLineEditFocus, const
     connect(privacyWebEngineViewPointer, &PrivacyWebEngineView::titleChanged, [this, privacyWebEngineViewPointer] (const QString &title)
     {
         // Get the index for this tab.
-        int tabIndex = tabWidgetPointer->indexOf(privacyWebEngineViewPointer);
+        int tabIndex = qTabWidgetPointer->indexOf(privacyWebEngineViewPointer);
 
         // Update the title for this tab.
-        tabWidgetPointer->setTabText(tabIndex, title);
+        qTabWidgetPointer->setTabText(tabIndex, title);
 
         // Update the window title if this is the current tab.
-        if (tabIndex == tabWidgetPointer->currentIndex())
+        if (tabIndex == qTabWidgetPointer->currentIndex())
             emit updateWindowTitle(title);
     });
 
@@ -336,13 +317,13 @@ PrivacyWebEngineView* TabWidget::addTab(const bool removeUrlLineEditFocus, const
     connect(privacyWebEngineViewPointer, &PrivacyWebEngineView::iconChanged, [privacyWebEngineViewPointer, this] (const QIcon &icon)
     {
         // Get the index for this tab.
-        int tabIndex = tabWidgetPointer->indexOf(privacyWebEngineViewPointer);
+        int tabIndex = qTabWidgetPointer->indexOf(privacyWebEngineViewPointer);
 
         // Update the icon for this tab.
         if (icon.isNull())
-            tabWidgetPointer->setTabIcon(tabIndex, defaultTabIcon);
+            qTabWidgetPointer->setTabIcon(tabIndex, defaultTabIcon);
         else
-            tabWidgetPointer->setTabIcon(tabIndex, icon);
+            qTabWidgetPointer->setTabIcon(tabIndex, icon);
     });
 
     // Enable spell checking.
@@ -354,9 +335,12 @@ PrivacyWebEngineView* TabWidget::addTab(const bool removeUrlLineEditFocus, const
     // Populate the zoom factor.  This is necessary if a URL is being loaded, like a local URL, that does not trigger `applyDomainSettings()`.
     privacyWebEngineViewPointer->setZoomFactor(Settings::zoomFactor());
 
+    // Update the UI when domain settings are applied.
+    connect(privacyWebEngineViewPointer, SIGNAL(updateUi(const PrivacyWebEngineView*)), this, SLOT(updateUiFromWebEngineView(const PrivacyWebEngineView*)));
+
     // Move to the new tab if it is not a background tab.
     if (!backgroundTab)
-        tabWidgetPointer->setCurrentIndex(newTabIndex);
+        qTabWidgetPointer->setCurrentIndex(newTabIndex);
 
     // Clear the URL line edit focus so that it populates correctly when opening a new tab from the context menu.
     if (removeUrlLineEditFocus)
@@ -370,9 +354,9 @@ void TabWidget::applyApplicationSettings()
 {
     // Set the tab position.
     if (Settings::tabsOnTop())
-        tabWidgetPointer->setTabPosition(QTabWidget::North);
+        qTabWidgetPointer->setTabPosition(QTabWidget::North);
     else
-        tabWidgetPointer->setTabPosition(QTabWidget::South);
+        qTabWidgetPointer->setTabPosition(QTabWidget::South);
 
     // Set the search engine URL.
     searchEngineUrl = SearchEngineHelper::getSearchUrl(Settings::searchEngine());
@@ -381,174 +365,10 @@ void TabWidget::applyApplicationSettings()
     emit updateSearchEngineActions(Settings::searchEngine(), true);
 }
 
-// This exists as a separate function from `applyDomainSettings()` so it can be listed as a slot and function without the need for a boolean argument.
-// Once <https://redmine.stoutner.com/issues/799> has been resolved this can be `const`.
 void TabWidget::applyDomainSettingsAndReload()
 {
     // Apply the domain settings.  `true` reloads the website.
-    applyDomainSettings(currentPrivacyWebEngineViewPointer->url().host(), true);
-}
-
-// This exists as a separate function from `applyDomainSettings()` so it can be listed as a slot and function without the need for a boolean argument.
-// Once <https://redmine.stoutner.com/issues/799> has been resolved this can be `const`.
-void TabWidget::applyDomainSettingsWithoutReloading(const QString &hostname)
-{
-    // Apply the domain settings  `false` does not reload the website.
-    applyDomainSettings(hostname, false);
-}
-
-// Once <https://redmine.stoutner.com/issues/799> has been resolved this can be `const`.
-void TabWidget::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.
-        currentPrivacyWebEngineViewPointer->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):
-            {
-                currentWebEngineSettingsPointer->setAttribute(QWebEngineSettings::JavascriptEnabled, Settings::javaScriptEnabled());
-
-                break;
-            }
-
-            // Disable JavaScript.
-            case (DomainsDatabase::DISABLED):
-            {
-                currentWebEngineSettingsPointer->setAttribute(QWebEngineSettings::JavascriptEnabled, false);
-
-                break;
-            }
-
-            // Enable JavaScript.
-            case (DomainsDatabase::ENABLED):
-            {
-                currentWebEngineSettingsPointer->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):
-            {
-                currentPrivacyWebEngineViewPointer->localStorageEnabled = Settings::localStorageEnabled();
-
-                break;
-            }
-
-            // Disable local storage.
-            case (DomainsDatabase::DISABLED):
-            {
-                currentPrivacyWebEngineViewPointer->localStorageEnabled = false;
-
-                break;
-            }
-
-            // Enable local storage.
-            case (DomainsDatabase::ENABLED):
-            {
-                currentPrivacyWebEngineViewPointer->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):
-            {
-                currentWebEngineSettingsPointer->setAttribute(QWebEngineSettings::LocalStorageEnabled, Settings::domStorageEnabled());
-
-                break;
-            }
-
-            // Disable DOM storage.  QWebEngineSettings confusingly calls this local storage.
-            case (DomainsDatabase::DISABLED):
-            {
-                currentWebEngineSettingsPointer->setAttribute(QWebEngineSettings::LocalStorageEnabled, false);
-
-                break;
-            }
-
-            // Enable DOM storage.  QWebEngineSettings confusingly calls this local storage.
-            case (DomainsDatabase::ENABLED):
-            {
-                currentWebEngineSettingsPointer->setAttribute(QWebEngineSettings::LocalStorageEnabled, true);
-
-                break;
-            }
-        }
-
-        // Set the user agent.
-        currentWebEngineProfilePointer->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.
-            currentZoomFactor = domainRecord.field(DomainsDatabase::CUSTOM_ZOOM_FACTOR).value().toDouble();
-        }
-        else
-        {
-            // Reset the current zoom factor.
-            currentZoomFactor = Settings::zoomFactor();
-        }
-
-        // Set the zoom factor.    The use of `currentZoomFactor` can be removed once <https://redmine.stoutner.com/issues/799> has been resolved.
-        currentPrivacyWebEngineViewPointer->setZoomFactor(currentZoomFactor);
-    }
-    else  // The hostname does not have domain settings.
-    {
-        // Reset the domain settings name.
-        currentPrivacyWebEngineViewPointer->domainSettingsName = QLatin1String("");
-
-        // Set the JavaScript status.
-        currentWebEngineSettingsPointer->setAttribute(QWebEngineSettings::JavascriptEnabled, Settings::javaScriptEnabled());
-
-        // Set the local storage status.
-        currentPrivacyWebEngineViewPointer->localStorageEnabled = Settings::localStorageEnabled();
-
-        // Set DOM storage.  In QWebEngineSettings it is called Local Storage.
-        currentWebEngineSettingsPointer->setAttribute(QWebEngineSettings::LocalStorageEnabled, Settings::domStorageEnabled());
-
-        // Set the user agent.
-        currentWebEngineProfilePointer->setHttpUserAgent(UserAgentHelper::getUserAgentFromDatabaseName(Settings::userAgent()));
-
-        // Store the current zoom factor.  This can be removed once <https://redmine.stoutner.com/issues/799> has been resolved.
-        currentZoomFactor = Settings::zoomFactor();
-
-        // Set the zoom factor.
-        currentPrivacyWebEngineViewPointer->setZoomFactor(Settings::zoomFactor());
-    }
-
-    // Update the UI.
-    emit updateDomainSettingsIndicator(currentPrivacyWebEngineViewPointer->domainSettingsName != QLatin1String(""));
-    emit updateJavaScriptAction(currentWebEngineSettingsPointer->testAttribute(QWebEngineSettings::JavascriptEnabled));
-    emit updateLocalStorageAction(currentPrivacyWebEngineViewPointer->localStorageEnabled);
-    emit updateDomStorageAction(currentWebEngineSettingsPointer->testAttribute(QWebEngineSettings::LocalStorageEnabled));
-    emit updateUserAgentActions(currentWebEngineProfilePointer->httpUserAgent(), true);
-    emit updateZoomFactorAction(currentPrivacyWebEngineViewPointer->zoomFactor());
-
-    // Reload the website if requested.
-    if (reloadWebsite)
-        currentPrivacyWebEngineViewPointer->reload();
+    currentPrivacyWebEngineViewPointer->applyDomainSettings(currentPrivacyWebEngineViewPointer->url().host(), true);
 }
 
 void TabWidget::applyOnTheFlySearchEngine(QAction *searchEngineActionPointer)
@@ -584,12 +404,8 @@ void TabWidget::applyOnTheFlyUserAgent(QAction *userAgentActionPointer) const
     currentPrivacyWebEngineViewPointer->reload();
 }
 
-// This can be const once <https://redmine.stoutner.com/issues/799> has been resolved.
-void TabWidget::applyOnTheFlyZoomFactor(const double &zoomFactor)
+void TabWidget::applyOnTheFlyZoomFactor(const double &zoomFactor) const
 {
-    // Update the current zoom factor.  This can be removed once <https://redmine.stoutner.com/issues/799> has been resolved.
-    currentZoomFactor = zoomFactor;
-
     // Set the zoom factor.
     currentPrivacyWebEngineViewPointer->setZoomFactor(zoomFactor);
 }
@@ -597,13 +413,13 @@ void TabWidget::applyOnTheFlyZoomFactor(const double &zoomFactor)
 void TabWidget::applySpellCheckLanguages() const
 {
     // Get the number of tab.
-    int numberOfTabs = tabWidgetPointer->count();
+    int numberOfTabs = qTabWidgetPointer->count();
 
     // Set the spell check languages for each tab.
     for (int i = 0; i < numberOfTabs; ++i)
     {
         // Get the WebEngine view pointer.
-        PrivacyWebEngineView *webEngineViewPointer = qobject_cast<PrivacyWebEngineView *>(tabWidgetPointer->currentWidget());
+        PrivacyWebEngineView *webEngineViewPointer = qobject_cast<PrivacyWebEngineView *>(qTabWidgetPointer->currentWidget());
 
         // Get the WebEngine page pointer.
         QWebEnginePage *webEnginePagePointer = webEngineViewPointer->page();
@@ -637,13 +453,13 @@ void TabWidget::deleteCookieFromStore(const QNetworkCookie &cookie) const
 void TabWidget::deleteTab(const int tabIndex)
 {
     // Get the privacy WebEngine view.
-    PrivacyWebEngineView *privacyWebEngineViewPointer = qobject_cast<PrivacyWebEngineView *>(tabWidgetPointer->widget(tabIndex));
+    PrivacyWebEngineView *privacyWebEngineViewPointer = qobject_cast<PrivacyWebEngineView *>(qTabWidgetPointer->widget(tabIndex));
 
-    // Proccess the tab delete according to the number of tabs.
-    if (tabWidgetPointer->count() > 1)  // There is more than one tab.
+    // Process the tab delete according to the number of tabs.
+    if (qTabWidgetPointer->count() > 1)  // There is more than one tab.
     {
         // Delete the tab.
-        tabWidgetPointer->removeTab(tabIndex);
+        qTabWidgetPointer->removeTab(tabIndex);
 
         // Delete the WebEngine page to prevent the following error:  `Release of profile requested but WebEnginePage still not deleted. Expect troubles !`
         delete privacyWebEngineViewPointer->page();
@@ -889,7 +705,7 @@ void TabWidget::refresh() const
 void TabWidget::setTabBarVisible(const bool visible) const
 {
     // Set the tab bar visibility.
-    tabWidgetPointer->tabBar()->setVisible(visible);
+    qTabWidgetPointer->tabBar()->setVisible(visible);
 }
 
 void TabWidget::showSaveDialog(QWebEngineDownloadItem *webEngineDownloadItemPointer)
@@ -1104,10 +920,25 @@ void TabWidget::toggleLocalStorage()
     currentPrivacyWebEngineViewPointer->reload();
 }
 
+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 updateDomainSettingsIndicator(currentPrivacyWebEngineViewPointer->domainSettingsName != QLatin1String(""));
+        emit updateJavaScriptAction(currentWebEngineSettingsPointer->testAttribute(QWebEngineSettings::JavascriptEnabled));
+        emit updateLocalStorageAction(currentPrivacyWebEngineViewPointer->localStorageEnabled);
+        emit updateDomStorageAction(currentWebEngineSettingsPointer->testAttribute(QWebEngineSettings::LocalStorageEnabled));
+        emit updateUserAgentActions(currentWebEngineProfilePointer->httpUserAgent(), true);
+        emit updateZoomFactorAction(currentPrivacyWebEngineViewPointer->zoomFactor());
+    }
+}
+
 void TabWidget::updateUiWithTabSettings()
 {
     // Update the current WebEngine pointers.
-    currentPrivacyWebEngineViewPointer = qobject_cast<PrivacyWebEngineView *>(tabWidgetPointer->currentWidget());
+    currentPrivacyWebEngineViewPointer = qobject_cast<PrivacyWebEngineView *>(qTabWidgetPointer->currentWidget());
     currentWebEngineSettingsPointer = currentPrivacyWebEngineViewPointer->settings();
     currentWebEnginePagePointer = currentPrivacyWebEngineViewPointer->page();
     currentWebEngineProfilePointer = currentWebEnginePagePointer->profile();