]> gitweb.stoutner.com Git - PrivacyBrowserPC.git/blobdiff - src/windows/BrowserWindow.cpp
Enable spell checking. https://redmine.stoutner.com/issues/840
[PrivacyBrowserPC.git] / src / windows / BrowserWindow.cpp
index 064c7eda22b7a70c4152306250e4fcd257f8bb30..efa87ab0ea6fe57d710ea04a6984251a93cec00c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2022 Soren Stoutner <soren@stoutner.com>.
+ * Copyright 2022-2023 Soren Stoutner <soren@stoutner.com>.
  *
  * This file is part of Privacy Browser PC <https://www.stoutner.com/privacy-browser-pc>.
  *
@@ -20,8 +20,9 @@
 // Application headers.
 #include "BrowserWindow.h"
 #include "Settings.h"
-#include "ui_SettingsPrivacy.h"
 #include "ui_SettingsGeneral.h"
+#include "ui_SettingsPrivacy.h"
+#include "ui_SettingsSpellCheck.h"
 #include "dialogs/CookiesDialog.h"
 #include "dialogs/DomainSettingsDialog.h"
 #include "helpers/SearchEngineHelper.h"
@@ -29,6 +30,7 @@
 
 // KDE Frameworks headers.
 #include <KActionCollection>
+#include <KColorScheme>
 #include <KToolBar>
 
 // Qt toolkit headers.
@@ -38,6 +40,7 @@
 #include <QMenuBar>
 #include <QShortcut>
 #include <QStatusBar>
+#include <QWebEngineFindTextResult>
 
 // Construct the class.
 BrowserWindow::BrowserWindow(bool firstWindow) : KXmlGuiWindow()
@@ -66,6 +69,9 @@ BrowserWindow::BrowserWindow(bool firstWindow) : KXmlGuiWindow()
     QAction *forwardActionPointer = KStandardAction::forward(this, SLOT(forward()), actionCollectionPointer);
     KStandardAction::home(this, SLOT(home()), actionCollectionPointer);
     KStandardAction::preferences(this, SLOT(showSettingsDialog()), actionCollectionPointer);
+    KStandardAction::find(this, SLOT(focusFindLineEdit()), actionCollectionPointer);
+    QAction *findNextActionPointer = KStandardAction::findNext(this, SLOT(findNext()), actionCollectionPointer);
+    KStandardAction::findPrev(this, SLOT(findPrevious()), actionCollectionPointer);
 
     // Add the custom actions.
     userAgentPrivacyBrowserActionPointer = actionCollectionPointer->addAction(QStringLiteral("user_agent_privacy_browser"));
@@ -90,6 +96,7 @@ BrowserWindow::BrowserWindow(bool firstWindow) : KXmlGuiWindow()
     javaScriptActionPointer = actionCollectionPointer->addAction(QStringLiteral("javascript"));
     localStorageActionPointer = actionCollectionPointer->addAction(QStringLiteral("local_storage"));
     domStorageActionPointer = actionCollectionPointer->addAction(QStringLiteral("dom_storage"));
+    findCaseSensitiveActionPointer = actionCollectionPointer->addAction(QStringLiteral("find_case_sensitive"));
 
     // Create the action groups
     QActionGroup *userAgentActionGroupPointer = new QActionGroup(this);
@@ -117,6 +124,7 @@ BrowserWindow::BrowserWindow(bool firstWindow) : KXmlGuiWindow()
     javaScriptActionPointer->setCheckable(true);
     localStorageActionPointer->setCheckable(true);
     domStorageActionPointer->setCheckable(true);
+    findCaseSensitiveActionPointer->setCheckable(true);
     userAgentPrivacyBrowserActionPointer->setCheckable(true);
     userAgentWebEngineDefaultActionPointer->setCheckable(true);
     userAgentFirefoxLinuxActionPointer->setCheckable(true);
@@ -134,15 +142,18 @@ BrowserWindow::BrowserWindow(bool firstWindow) : KXmlGuiWindow()
     searchEngineYahooActionPointer->setCheckable(true);
     searchEngineCustomActionPointer->setCheckable(true);
 
+    // Instantiate the user agent helper.
+    UserAgentHelper *userAgentHelperPointer = new UserAgentHelper();
+
     // Set the action text.
-    userAgentPrivacyBrowserActionPointer->setText(UserAgentHelper::PRIVACY_BROWSER_TRANSLATED);
-    userAgentWebEngineDefaultActionPointer->setText(UserAgentHelper::WEB_ENGINE_DEFAULT_TRANSLATED);
-    userAgentFirefoxLinuxActionPointer->setText(UserAgentHelper::FIREFOX_LINUX_TRANSLATED);
-    userAgentChromiumLinuxActionPointer->setText(UserAgentHelper::CHROMIUM_LINUX_TRANSLATED);
-    userAgentFirefoxWindowsActionPointer->setText(UserAgentHelper::FIREFOX_WINDOWS_TRANSLATED);
-    userAgentChromeWindowsActionPointer->setText(UserAgentHelper::CHROME_WINDOWS_TRANSLATED);
-    userAgentEdgeWindowsActionPointer->setText(UserAgentHelper::EDGE_WINDOWS_TRANSLATED);
-    userAgentSafariMacosActionPointer->setText(UserAgentHelper::SAFARI_MACOS_TRANSLATED);
+    userAgentPrivacyBrowserActionPointer->setText(userAgentHelperPointer->PRIVACY_BROWSER_TRANSLATED);
+    userAgentWebEngineDefaultActionPointer->setText(userAgentHelperPointer->WEB_ENGINE_DEFAULT_TRANSLATED);
+    userAgentFirefoxLinuxActionPointer->setText(userAgentHelperPointer->FIREFOX_LINUX_TRANSLATED);
+    userAgentChromiumLinuxActionPointer->setText(userAgentHelperPointer->CHROMIUM_LINUX_TRANSLATED);
+    userAgentFirefoxWindowsActionPointer->setText(userAgentHelperPointer->FIREFOX_WINDOWS_TRANSLATED);
+    userAgentChromeWindowsActionPointer->setText(userAgentHelperPointer->CHROME_WINDOWS_TRANSLATED);
+    userAgentEdgeWindowsActionPointer->setText(userAgentHelperPointer->EDGE_WINDOWS_TRANSLATED);
+    userAgentSafariMacosActionPointer->setText(userAgentHelperPointer->SAFARI_MACOS_TRANSLATED);
     searchEngineMojeekActionPointer->setText(i18nc("Search engine", "Mojeek"));
     searchEngineMonoclesActionPointer->setText(i18nc("Search engine", "Monocles"));
     searchEngineMetagerActionPointer->setText(i18nc("Search engine", "MetaGer"));
@@ -154,6 +165,7 @@ BrowserWindow::BrowserWindow(bool firstWindow) : KXmlGuiWindow()
     javaScriptActionPointer->setText(i18nc("JavaScript action", "JavaScript"));
     localStorageActionPointer->setText(i18nc("The Local Storage action", "Local Storage"));
     domStorageActionPointer->setText(i18nc("DOM Storage action", "DOM Storage"));
+    findCaseSensitiveActionPointer->setText(i18nc("Find Case Sensitive action", "Find Case Sensitive"));
 
     // Set the action icons.
     userAgentPrivacyBrowserActionPointer->setIcon(QIcon(":/icons/privacy-mode"));
@@ -176,6 +188,7 @@ BrowserWindow::BrowserWindow(bool firstWindow) : KXmlGuiWindow()
     domainSettingsActionPointer->setIcon(QIcon::fromTheme(QStringLiteral("settings-configure")));
     cookiesActionPointer->setIcon(QIcon::fromTheme(QStringLiteral("preferences-web-browser-cookies")));
     domStorageActionPointer->setIcon(QIcon::fromTheme(QStringLiteral("code-class")));
+    findCaseSensitiveActionPointer->setIcon(QIcon::fromTheme(QStringLiteral("format-text-lowercase")));
 
     // Update the on-the-fly menus.
     connect(tabWidgetPointer, SIGNAL(updateUserAgentActions(QString, bool)), this, SLOT(updateUserAgentActions(QString, bool)));
@@ -206,8 +219,11 @@ BrowserWindow::BrowserWindow(bool firstWindow) : KXmlGuiWindow()
     connect(tabWidgetPointer, SIGNAL(updateLocalStorageAction(bool)), this, SLOT(updateLocalStorageAction(bool)));
     connect(tabWidgetPointer, SIGNAL(updateDomStorageAction(bool)), this, SLOT(updateDomStorageAction(bool)));
 
-    // Setup the GUI based on the browser_ui.rc file.
-    setupGUI(StandardWindowOption::Default, ("browser_ui.rc"));
+    // Connect the find text actions.
+    connect(findCaseSensitiveActionPointer, SIGNAL(triggered()), this, SLOT(toggleFindCaseSensitive()));
+
+    // Setup the GUI based on the browser_window_ui.rc file.
+    setupGUI(StandardWindowOption::Default, ("browserwindowui.rc"));
 
     // Get lists of the actions' associated widgets.
     QList<QWidget*> userAgentAssociatedWidgetsPointerList = userAgentPrivacyBrowserActionPointer->associatedWidgets();
@@ -229,8 +245,33 @@ BrowserWindow::BrowserWindow(bool firstWindow) : KXmlGuiWindow()
     navigationToolBarPointer = toolBar(QStringLiteral("navigation_toolbar"));
     urlToolBarPointer = toolBar(QStringLiteral("url_toolbar"));
 
-    // Create a URL line edit.
+    // Create the line edits.
     urlLineEditPointer = new KLineEdit();
+    findTextLineEditPointer = new KLineEdit();
+
+    // Get the line edit size policies.
+    QSizePolicy urlLineEditSizePolicy = urlLineEditPointer->sizePolicy();
+    QSizePolicy findTextLineEditSizePolicy = findTextLineEditPointer->sizePolicy();
+
+    // Set the URL line edit horizontal stretch to be five times the find text line edit stretch.
+    urlLineEditSizePolicy.setHorizontalStretch(5);
+    findTextLineEditSizePolicy.setHorizontalStretch(1);
+
+    // Set the policies.
+    urlLineEditPointer->setSizePolicy(urlLineEditSizePolicy);
+    findTextLineEditPointer->setSizePolicy(findTextLineEditSizePolicy);
+
+    // Set the widths.
+    urlLineEditPointer->setMinimumWidth(350);
+    findTextLineEditPointer->setMinimumWidth(200);
+    findTextLineEditPointer->setMaximumWidth(350);
+
+    // Set the placehold text.
+    urlLineEditPointer->setPlaceholderText(i18nc("The URL line edit placeholder text", "URL or Search Terms"));
+    findTextLineEditPointer->setPlaceholderText(i18nc("The find line edit placeholder text", "Find Text"));
+
+    // Show the clear button on the find line edit.
+    findTextLineEditPointer->setClearButtonEnabled(true);
 
     // Add an edit or add domain settings action to the URL line edit.
     QAction *addOrEditDomainSettingsActionPointer = urlLineEditPointer->addAction(QIcon::fromTheme("settings-configure"), QLineEdit::TrailingPosition);
@@ -238,12 +279,32 @@ BrowserWindow::BrowserWindow(bool firstWindow) : KXmlGuiWindow()
     // Add or edit the current domain settings.
     connect(addOrEditDomainSettingsActionPointer, SIGNAL(triggered()), this, SLOT(addOrEditDomainSettings()));
 
-    // Populate the URL toolbar.
+    // Create a find text label pointer.
+    findTextLabelPointer = new QLabel();
+
+    // Set the default label text.
+    findTextLabelPointer->setText(QStringLiteral("  ") + i18nc("Default find results.", "0/0") + QStringLiteral("  "));
+
+    // Insert the widgets into the toolbars.
     urlToolBarPointer->insertWidget(javaScriptActionPointer, urlLineEditPointer);
+    urlToolBarPointer->insertWidget(findNextActionPointer, findTextLineEditPointer);
+    urlToolBarPointer->insertWidget(findNextActionPointer, findTextLabelPointer);
 
     // Load a new URL from the URL line edit.
     connect(urlLineEditPointer, SIGNAL(returnKeyPressed(const QString)), this, SLOT(loadUrlFromLineEdit(const QString)));
 
+    // Find text as it is typed.
+    connect(findTextLineEditPointer, SIGNAL(textEdited(const QString &)), tabWidgetPointer, SLOT(findText(const QString &)));
+
+    // Find next if the enter key is pressed.
+    connect(findTextLineEditPointer, SIGNAL(returnKeyPressed(const QString &)), tabWidgetPointer, SLOT(findText(const QString &)));
+
+    // Update find text when switching tabs.
+    connect(tabWidgetPointer, SIGNAL(updateFindText(const QString &, const bool)), this, SLOT(updateFindText(const QString &, const bool)));
+
+    // Update the find text results.
+    connect(tabWidgetPointer, SIGNAL(updateFindTextResults(const QWebEngineFindTextResult &)), this, SLOT(updateFindTextResults(const QWebEngineFindTextResult &)));
+
     // Update the URL line edit on page loads.
     connect(tabWidgetPointer, SIGNAL(updateUrlLineEdit(QUrl)), this, SLOT(updateUrlLineEdit(QUrl)));
 
@@ -270,11 +331,13 @@ BrowserWindow::BrowserWindow(bool firstWindow) : KXmlGuiWindow()
     connect(tabWidgetPointer, SIGNAL(clearUrlLineEditFocus()), this, SLOT(clearUrlLineEditFocus()));
 
     // Get the URL line edit palettes.
-    noDomainSettingsPalette = urlLineEditPointer->palette();
-    domainSettingsPalette = urlLineEditPointer->palette();
+    normalBackgroundPalette = urlLineEditPointer->palette();
+    negativeBackgroundPalette = normalBackgroundPalette;
+    positiveBackgroundPalette = normalBackgroundPalette;
 
-    // Modify the domain settings palette.
-    domainSettingsPalette.setColor(QPalette::Base, QColor("#C8E6C9"));
+    // Modify the palettes.
+    KColorScheme::adjustBackground(negativeBackgroundPalette, KColorScheme::NegativeBackground);
+    KColorScheme::adjustBackground(positiveBackgroundPalette, KColorScheme::PositiveBackground);
 
     // Update the applied palette.
     connect(tabWidgetPointer, SIGNAL(updateDomainSettingsIndicator(const bool)), this, SLOT(updateDomainSettingsIndicator(const bool)));
@@ -292,6 +355,14 @@ BrowserWindow::BrowserWindow(bool firstWindow) : KXmlGuiWindow()
     connect(f11ShortcutPointer, SIGNAL(activated()), fullScreenActionPointer, SLOT(trigger()));
     connect(escapeShortcutPointer, SIGNAL(activated()), this, SLOT(escape()));
 
+    // Populate the UI.
+    // This must be done here, because otherwise, if a URL is loaded, like a local file, that does not trigger a call to TabWidget::applyDomainSettings, the UI will not be fully populated.
+    updateJavaScriptAction(Settings::javaScriptEnabled());
+    updateLocalStorageAction(Settings::localStorageEnabled());
+    updateDomStorageAction(Settings::domStorageEnabled());
+    updateUserAgentActions(UserAgentHelper::getUserAgentFromDatabaseName(Settings::userAgent()), true);
+    updateZoomFactorAction(Settings::zoomFactor());
+
     // Load the initial website if this is the first window.
     if (firstWindow)
         tabWidgetPointer->loadInitialWebsite();
@@ -350,9 +421,20 @@ void BrowserWindow::clearUrlLineEditFocus() const
 
 void BrowserWindow::escape() const
 {
-    // Exit full screen browsing if it is enabled.
-    if (fullScreenActionPointer->isChecked())
+    // Process the excape according to the status of the browser.
+    if (fullScreenActionPointer->isChecked())  // Full screen browsing is enabled.
+    {
+        // Exit full screen browsing.
         fullScreenActionPointer->trigger();
+    }
+    else if (!findTextLineEditPointer->text().isEmpty())  // Find text is activated.
+    {
+        // Clear the text in the line edit.
+        findTextLineEditPointer->clear();
+
+        // Clear the search in the WebEngine.
+        tabWidgetPointer->findText(QStringLiteral(""));
+    }
 }
 
 void BrowserWindow::fileNew() const
@@ -361,6 +443,35 @@ void BrowserWindow::fileNew() const
     (new BrowserWindow)->show();
 }
 
+void BrowserWindow::findNext() const
+{
+    // Get the find string.
+    const QString findString = findTextLineEditPointer->text();
+
+    // Search for the text if it is not empty.
+    if (!findString.isEmpty())
+        tabWidgetPointer->findText(findString);
+}
+
+void BrowserWindow::findPrevious() const
+{
+    // Get the find string.
+    const QString findString = findTextLineEditPointer->text();
+
+    // Search for the text if it is not empty.
+    if (!findString.isEmpty())
+        tabWidgetPointer->findPrevious(findString);
+}
+
+void BrowserWindow::focusFindLineEdit() const
+{
+    // Set the focus on the find line edit.
+    findTextLineEditPointer->setFocus();
+
+    // Select all the text in the find line edit.
+    findTextLineEditPointer->selectAll();
+}
+
 void BrowserWindow::forward() const
 {
     // Remove the focus from the URL line edit.
@@ -521,14 +632,17 @@ void BrowserWindow::showSettingsDialog()
     // Create the settings widgets.
     QWidget *privacySettingsWidgetPointer = new QWidget;
     QWidget *generalSettingsWidgetPointer = new QWidget;
+    QWidget *spellCheckSettingsWidgetPointer = new QWidget;
 
     // Instantiate the settings UI.
     Ui::PrivacySettings privacySettingsUi;
     Ui::GeneralSettings generalSettingsUi;
+    Ui::SpellCheckSettings spellCheckSettingsUi;
 
     // Setup the UI to display the settings widgets.
     privacySettingsUi.setupUi(privacySettingsWidgetPointer);
     generalSettingsUi.setupUi(generalSettingsWidgetPointer);
+    spellCheckSettingsUi.setupUi(spellCheckSettingsWidgetPointer);
 
     // Get handles for the widgets.
     QComboBox *userAgentComboBoxPointer = privacySettingsUi.kcfg_userAgent;
@@ -537,6 +651,7 @@ void BrowserWindow::showSettingsDialog()
     searchEngineLabelPointer = generalSettingsUi.searchEngineLabel;
     downloadLocationComboBoxPointer = generalSettingsUi.kcfg_downloadLocation;
     QPushButton *browseButtonPointer = generalSettingsUi.browseButton;
+    QListWidget *spellCheckListWidgetPointer = spellCheckSettingsUi.spellCheckListWidget;
 
     // Populate the combo box labels.
     updateUserAgentLabel(userAgentComboBoxPointer->currentText());
@@ -549,12 +664,51 @@ void BrowserWindow::showSettingsDialog()
     // Connect the download location directory browse button.
     connect(browseButtonPointer, SIGNAL(clicked()), this, SLOT(showDownloadLocationBrowseDialog()));
 
+    // Create a dictionaries QDir from the `QTWEBENGINE_DICTIONARIES_PATH` environment variable.
+    QDir dictionariesDir = QDir(qEnvironmentVariable("QTWEBENGINE_DICTIONARIES_PATH"));
+
+    // Get a dictionaries string list.
+    QStringList dictionariesStringList = dictionariesDir.entryList(QStringList(QLatin1String("*.bdic")), QDir::Files | QDir::NoSymLinks);
+
+    // Remove the `.bdic` file extensions from the dictionaries list.
+    dictionariesStringList.replaceInStrings(QLatin1String(".bdic"), QLatin1String(""));
+
+    // Get a list of the enabled spell check languages.
+    QStringList enabledSpellCheckLanguagesList = Settings::spellCheckLanguages();
+
+    // Add each dictionary to the spell check list widget.
+    foreach(QString dictionaryString, dictionariesStringList)
+    {
+        // Create a new list widget item pointer named after the dictionary string.
+        QListWidgetItem *listWidgetItemPointer = new QListWidgetItem(dictionaryString, spellCheckListWidgetPointer);
+
+        // Set the list widget item pointer to be checkable.
+        listWidgetItemPointer->setFlags(listWidgetItemPointer->flags() | Qt::ItemIsUserCheckable);
+
+        // Check the language if it is currently enabled.
+        if (enabledSpellCheckLanguagesList.contains(dictionaryString))
+            listWidgetItemPointer->setCheckState(Qt::Checked);
+        else
+            listWidgetItemPointer->setCheckState(Qt::Unchecked);
+
+        // Add the list widget item to the widget.
+        spellCheckListWidgetPointer->addItem(listWidgetItemPointer);
+    }
+
+    // Get a handle for the KConfig skeleton.
+    KConfigSkeleton *kConfigSkeletonPointer = Settings::self();
+
     // Instantiate a settings config dialog from the settings.kcfg file.
-    configDialogPointer = new KConfigDialog(this, QStringLiteral("settings"), Settings::self());
+    configDialogPointer = new KConfigDialog(this, QLatin1String("settings"), kConfigSkeletonPointer);
 
     // Add the settings widgets as config dialog pages.
-    configDialogPointer->addPage(privacySettingsWidgetPointer, i18nc("@title:tab", "Privacy"), QStringLiteral("privacy-browser"));
-    configDialogPointer->addPage(generalSettingsWidgetPointer, i18nc("@title:tab", "General"), QStringLiteral("breeze-settings"));
+    configDialogPointer->addPage(privacySettingsWidgetPointer, i18nc("Settings tab title", "Privacy"), QLatin1String("privacy-browser"));
+    configDialogPointer->addPage(generalSettingsWidgetPointer, i18nc("Settings tab title", "General"), QLatin1String("breeze-settings"));
+    configDialogPointer->addPage(spellCheckSettingsWidgetPointer, i18nc("Settings tab title", "Spell Check"), QLatin1String("tools-check-spelling"));
+
+    // Get handles for the buttons.
+    QPushButton *applyButtonPointer = configDialogPointer->button(QDialogButtonBox::Apply);
+    QPushButton *okButtonPointer = configDialogPointer->button(QDialogButtonBox::Ok);
 
     // Prevent interaction with the parent window while the dialog is open.
     configDialogPointer->setWindowModality(Qt::WindowModal);
@@ -571,7 +725,44 @@ void BrowserWindow::showSettingsDialog()
     // Expand the config dialog.
     configDialogPointer->resize(1000, 500);
 
-    // Apply the settings when they are updated.
+    // Create a save spell check languages lambda.
+    auto saveSpellCheckLanguages = [spellCheckListWidgetPointer, kConfigSkeletonPointer, this] ()
+    {
+        // Create a list of enabled languages.
+        QStringList newSpellCheckLanguages = QStringList();
+
+        // Get a count of all the languages.
+        int allLanguagesCount = spellCheckListWidgetPointer->count();
+
+        // Get a list of all the checked languages.
+        for (int i = 0; i < allLanguagesCount; ++i) {
+            // Get the language item.
+            QListWidgetItem *languageItemPointer = spellCheckListWidgetPointer->item(i);
+
+            // Add the item to the enabled languages if it is checked.
+            if (languageItemPointer->checkState() == Qt::Checked)
+                newSpellCheckLanguages.append(languageItemPointer->text());
+        }
+
+        // Update the spell check languages.
+        if (Settings::spellCheckLanguages() != newSpellCheckLanguages)
+        {
+            // Update the spell check languages.
+            Settings::setSpellCheckLanguages(newSpellCheckLanguages);
+
+            // Write the settings to disk.
+            kConfigSkeletonPointer->save();
+        }
+
+        // Apply the spell check languages.
+        tabWidgetPointer->applySpellCheckLanguages();
+    };
+
+    // Process
+    connect(applyButtonPointer, &QPushButton::clicked, this, saveSpellCheckLanguages);
+    connect(okButtonPointer, &QPushButton::clicked, this, saveSpellCheckLanguages);
+
+    // Apply the settings handled by KConfig.
     connect(configDialogPointer, SIGNAL(settingsChanged(QString)), tabWidgetPointer, SLOT(applyApplicationSettings()));
     connect(configDialogPointer, SIGNAL(settingsChanged(QString)), tabWidgetPointer, SLOT(applyDomainSettingsAndReload()));
 }
@@ -591,6 +782,15 @@ void BrowserWindow::toggleDomStorage() const
     tabWidgetPointer->toggleDomStorage();
 }
 
+void BrowserWindow::toggleFindCaseSensitive() const
+{
+    // Get the current find string.
+    const QString findString = findTextLineEditPointer->text();
+
+    // Toggle find case sensitive.
+    tabWidgetPointer->toggleFindCaseSensitive(findString);
+}
+
 void BrowserWindow::toggleJavaScript() const
 {
     // Remove the focus from the URL line edit.
@@ -672,9 +872,32 @@ void BrowserWindow::updateDomainSettingsIndicator(const bool status)
 {
     // Set the domain palette according to the status.
     if (status)
-        urlLineEditPointer->setPalette(domainSettingsPalette);
+        urlLineEditPointer->setPalette(positiveBackgroundPalette);
+    else
+        urlLineEditPointer->setPalette(normalBackgroundPalette);
+}
+
+void BrowserWindow::updateFindText(const QString &text, const bool findCaseSensitive) const
+{
+    // Set the text.
+    findTextLineEditPointer->setText(text);
+
+    // Set the find case sensitive action checked status.
+    findCaseSensitiveActionPointer->setChecked(findCaseSensitive);
+}
+
+void BrowserWindow::updateFindTextResults(const QWebEngineFindTextResult &findTextResult) const
+{
+    // Update the find text label.
+    findTextLabelPointer->setText(QStringLiteral("  %1/%2  ").arg(findTextResult.activeMatch()).arg(findTextResult.numberOfMatches()));
+
+    // Set the background color according to the find status.
+    if (findTextLineEditPointer->text().isEmpty())
+        findTextLineEditPointer->setPalette(normalBackgroundPalette);
+    else if (findTextResult.numberOfMatches() == 0)
+        findTextLineEditPointer->setPalette(negativeBackgroundPalette);
     else
-        urlLineEditPointer->setPalette(noDomainSettingsPalette);
+        findTextLineEditPointer->setPalette(positiveBackgroundPalette);
 }
 
 void BrowserWindow::updateJavaScriptAction(const bool &isEnabled)
@@ -887,6 +1110,7 @@ void BrowserWindow::updateUserAgentActions(const QString &userAgent, const bool
     }
 
     // Update the custom user agent enabled boolean.
+    // This is not done when the current user agent is a custom one but it is temporarially being changed via on-the-fly settings so that the user can switch back to the custom user agent.
     if (updateCustomUserAgentStatus)
         customUserAgentEnabled = customUserAgent;