From aa9a6b20db5e2c808b390b62704f28bd649e283c Mon Sep 17 00:00:00 2001 From: Soren Stoutner Date: Fri, 26 Aug 2022 13:03:07 -0700 Subject: [PATCH] Implement finding of text withing a page. --- src/ui.rcs/CMakeLists.txt | 2 +- .../{browser_ui.rc => browser_window_ui.rc} | 4 + src/widgets/PrivacyWebEngineView.h | 4 + src/widgets/TabWidget.cpp | 78 ++++++++- src/widgets/TabWidget.h | 7 + src/windows/BrowserWindow.cpp | 155 ++++++++++++++++-- src/windows/BrowserWindow.h | 14 +- 7 files changed, 245 insertions(+), 19 deletions(-) rename src/ui.rcs/{browser_ui.rc => browser_window_ui.rc} (92%) diff --git a/src/ui.rcs/CMakeLists.txt b/src/ui.rcs/CMakeLists.txt index 2c8c30e..2ac4766 100644 --- a/src/ui.rcs/CMakeLists.txt +++ b/src/ui.rcs/CMakeLists.txt @@ -18,5 +18,5 @@ # Install Privacy Browser's RC (Runtime Configuration) files. install(FILES - browser_ui.rc + browser_window_ui.rc DESTINATION ${KDE_INSTALL_KXMLGUI5DIR}/privacybrowser) diff --git a/src/ui.rcs/browser_ui.rc b/src/ui.rcs/browser_window_ui.rc similarity index 92% rename from src/ui.rcs/browser_ui.rc rename to src/ui.rcs/browser_window_ui.rc index 0526147..6722426 100644 --- a/src/ui.rcs/browser_ui.rc +++ b/src/ui.rcs/browser_window_ui.rc @@ -20,6 +20,7 @@ + + + + diff --git a/src/widgets/PrivacyWebEngineView.h b/src/widgets/PrivacyWebEngineView.h index 863cf5d..c227f42 100644 --- a/src/widgets/PrivacyWebEngineView.h +++ b/src/widgets/PrivacyWebEngineView.h @@ -22,6 +22,7 @@ // Qt toolkit headers. #include +#include #include class PrivacyWebEngineView : public QWebEngineView @@ -36,6 +37,9 @@ public: // The public variables. std::list *cookieListPointer = new std::list; QString domainSettingsName = QStringLiteral(""); + bool findCaseSensitive = false; + QString findString = QStringLiteral(""); + QWebEngineFindTextResult findTextResult = QWebEngineFindTextResult(); int loadProgressInt = -1; bool localStorageEnabled = false; diff --git a/src/widgets/TabWidget.cpp b/src/widgets/TabWidget.cpp index 4a3c145..3a1b54f 100644 --- a/src/widgets/TabWidget.cpp +++ b/src/widgets/TabWidget.cpp @@ -216,6 +216,9 @@ PrivacyWebEngineView* TabWidget::addTab(const bool focusNewWebEngineView) emit hideProgressBar(); }); + // Display find text results. + connect(webEnginePagePointer, SIGNAL(findTextFinished(const QWebEngineFindTextResult &)), this, SLOT(findTextFinished(const QWebEngineFindTextResult &))); + // Handle full screen requests. connect(webEnginePagePointer, SIGNAL(fullScreenRequested(QWebEngineFullScreenRequest)), this, SLOT(fullScreenRequested(QWebEngineFullScreenRequest))); @@ -612,6 +615,52 @@ void TabWidget::deleteTab(const int tabIndex) } } +void TabWidget::findPrevious(const QString &text) const +{ + // Store the current text. + currentPrivacyWebEngineViewPointer->findString = text; + + // Find the previous text in the current privacy WebEngine. + if (currentPrivacyWebEngineViewPointer->findCaseSensitive) + currentPrivacyWebEngineViewPointer->findText(text, QWebEnginePage::FindCaseSensitively|QWebEnginePage::FindBackward); + else + currentPrivacyWebEngineViewPointer->findText(text, QWebEnginePage::FindBackward); +} + +void TabWidget::findText(const QString &text) const +{ + // Store the current text. + currentPrivacyWebEngineViewPointer->findString = text; + + // Find the text in the current privacy WebEngine. + if (currentPrivacyWebEngineViewPointer->findCaseSensitive) + currentPrivacyWebEngineViewPointer->findText(text, QWebEnginePage::FindCaseSensitively); + else + currentPrivacyWebEngineViewPointer->findText(text); + + // Clear the currently selected text in the WebEngine page if the find text is empty. + if (text.isEmpty()) + currentWebEnginePagePointer->action(QWebEnginePage::Unselect)->activate(QAction::Trigger); +} + +void TabWidget::findTextFinished(const QWebEngineFindTextResult &findTextResult) +{ + // Update the find text UI if it wasn't simply wiping the current find text selection. Otherwise the UI temporarially flashes `0/0`. + if (wipingCurrentFindTextSelection) // The current selection is being wiped. + { + // Reset the flag. + wipingCurrentFindTextSelection = false; + } + else // A new search has been performed. + { + // Store the result. + currentPrivacyWebEngineViewPointer->findTextResult = findTextResult; + + // Update the UI. + emit updateFindTextResults(findTextResult); + } +} + void TabWidget::forward() const { // Go forward. @@ -867,6 +916,21 @@ void TabWidget::toggleDomStorage() const currentPrivacyWebEngineViewPointer->reload(); } +void TabWidget::toggleFindCaseSensitive(const QString &text) +{ + // Toggle find case sensitive. + currentPrivacyWebEngineViewPointer->findCaseSensitive = !currentPrivacyWebEngineViewPointer->findCaseSensitive; + + // Set the wiping current find text selection flag. + wipingCurrentFindTextSelection = true; + + // Wipe the previous search. Otherwise currently highlighted words will remain highlighted. + findText(QStringLiteral("")); + + // Update the find text. + findText(text); +} + void TabWidget::toggleJavaScript() const { // Toggle JavaScript. @@ -904,19 +968,25 @@ void TabWidget::updateUiWithTabSettings() // Clear the URL line edit focus. emit clearUrlLineEditFocus(); - // Update the UI. + // Update the actions. emit updateBackAction(currentWebEngineHistoryPointer->canGoBack()); emit updateCookiesAction(currentPrivacyWebEngineViewPointer->cookieListPointer->size()); - emit updateDomainSettingsIndicator(currentPrivacyWebEngineViewPointer->domainSettingsName != QStringLiteral("")); emit updateDomStorageAction(currentWebEngineSettingsPointer->testAttribute(QWebEngineSettings::LocalStorageEnabled)); emit updateForwardAction(currentWebEngineHistoryPointer->canGoForward()); emit updateJavaScriptAction(currentWebEngineSettingsPointer->testAttribute(QWebEngineSettings::JavascriptEnabled)); emit updateLocalStorageAction(currentPrivacyWebEngineViewPointer->localStorageEnabled); - emit updateWindowTitle(currentPrivacyWebEngineViewPointer->title()); - emit updateUrlLineEdit(currentPrivacyWebEngineViewPointer->url()); emit updateUserAgentActions(currentWebEngineProfilePointer->httpUserAgent(), true); emit updateZoomFactorAction(currentPrivacyWebEngineViewPointer->zoomFactor()); + // Update the URL. + emit updateWindowTitle(currentPrivacyWebEngineViewPointer->title()); + emit updateDomainSettingsIndicator(currentPrivacyWebEngineViewPointer->domainSettingsName != QStringLiteral("")); + emit updateUrlLineEdit(currentPrivacyWebEngineViewPointer->url()); + + // Update the find text. + emit updateFindText(currentPrivacyWebEngineViewPointer->findString, currentPrivacyWebEngineViewPointer->findCaseSensitive); + emit updateFindTextResults(currentPrivacyWebEngineViewPointer->findTextResult); + // Update the progress bar. if (currentPrivacyWebEngineViewPointer->loadProgressInt >= 0) emit showProgressBar(currentPrivacyWebEngineViewPointer->loadProgressInt); diff --git a/src/widgets/TabWidget.h b/src/widgets/TabWidget.h index ed9ad03..bd857b0 100644 --- a/src/widgets/TabWidget.h +++ b/src/widgets/TabWidget.h @@ -52,10 +52,12 @@ public: void applyOnTheFlyZoomFactor(const double &zoomFactor); PrivacyWebEngineView* loadBlankInitialWebsite(); void loadInitialWebsite(); + void findPrevious(const QString &text) const; std::list* getCookieList() const; QString& getDomainSettingsName() const; void setTabBarVisible(const bool visible) const; void toggleDomStorage() const; + void toggleFindCaseSensitive(const QString &text); void toggleJavaScript() const; void toggleLocalStorage(); @@ -75,6 +77,8 @@ signals: void updateCookiesAction(const int numberOfCookies) const; void updateDomStorageAction(const bool &isEnabled) const; void updateDomainSettingsIndicator(const bool status) const; + void updateFindText(const QString &text, const bool findCaseSensitive) const; + void updateFindTextResults(const QWebEngineFindTextResult &findTextResult) const; void updateForwardAction(const bool &isEnabled) const; void updateJavaScriptAction(const bool &isEnabled) const; void updateLocalStorageAction(const bool &isEnabled) const; @@ -96,6 +100,7 @@ public Q_SLOTS: void back() const; void deleteAllCookies() const; void deleteCookieFromStore(const QNetworkCookie &cookie) const; + void findText(const QString &text) const; void forward() const; void home() const; void loadUrlFromLineEdit(QString url) const; @@ -109,6 +114,7 @@ private Q_SLOTS: // The private slots. void addFirstTab(); void deleteTab(const int tabIndex); + void findTextFinished(const QWebEngineFindTextResult &findTextResult); void fullScreenRequested(QWebEngineFullScreenRequest fullScreenRequest) const; void pageLinkHovered(const QString &linkUrl) const; void printWebpage(QPrinter *printerPointer) const; @@ -128,6 +134,7 @@ private: QIcon defaultTabIcon = QIcon::fromTheme(QStringLiteral("globe")); QString searchEngineUrl; QTabWidget *tabWidgetPointer; + bool wipingCurrentFindTextSelection = false; // The private functions. void applyDomainSettings(const QString &hostname, const bool reloadWebsite); diff --git a/src/windows/BrowserWindow.cpp b/src/windows/BrowserWindow.cpp index 064c7ed..716f2e0 100644 --- a/src/windows/BrowserWindow.cpp +++ b/src/windows/BrowserWindow.cpp @@ -29,6 +29,7 @@ // KDE Frameworks headers. #include +#include #include // Qt toolkit headers. @@ -38,6 +39,7 @@ #include #include #include +#include // Construct the class. BrowserWindow::BrowserWindow(bool firstWindow) : KXmlGuiWindow() @@ -66,6 +68,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 +95,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 +123,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); @@ -154,6 +161,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 +184,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 +215,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, ("browser_window_ui.rc")); // Get lists of the actions' associated widgets. QList userAgentAssociatedWidgetsPointerList = userAgentPrivacyBrowserActionPointer->associatedWidgets(); @@ -229,8 +241,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 +275,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 +327,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))); @@ -350,9 +409,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 +431,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. @@ -591,6 +690,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 +780,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) diff --git a/src/windows/BrowserWindow.h b/src/windows/BrowserWindow.h index a131a44..4c043d2 100644 --- a/src/windows/BrowserWindow.h +++ b/src/windows/BrowserWindow.h @@ -55,6 +55,9 @@ private Q_SLOTS: void clearUrlLineEditFocus() const; void escape() const; void fileNew() const; + void findNext() const; + void findPrevious() const; + void focusFindLineEdit() const; void forward() const; void fullScreenRequested(const bool toggleOn); void getZoomFactorFromUser(); @@ -67,12 +70,15 @@ private Q_SLOTS: void showProgressBar(const int &progress) const; void showSettingsDialog(); void toggleDomStorage() const; + void toggleFindCaseSensitive() const; void toggleJavaScript() const; void toggleLocalStorage() const; void toggleFullScreen(); void updateCookiesAction(const int numberOfCookies) const; void updateDomStorageAction(const bool &isEnabled) const; void updateDomainSettingsIndicator(const bool status); + void updateFindText(const QString &text, const bool findCaseSensitive) const; + void updateFindTextResults(const QWebEngineFindTextResult &findTextResult) const; void updateJavaScriptAction(const bool &isEnabled); void updateLocalStorageAction(const bool &isEnabled); void updateSearchEngineActions(const QString &searchEngine, const bool &updateCustomSearchEngineStatus); @@ -92,15 +98,19 @@ private: bool customSearchEngineEnabled; bool customUserAgentEnabled; QAction *domStorageActionPointer; - QPalette domainSettingsPalette; QComboBox *downloadLocationComboBoxPointer; + QAction *findCaseSensitiveActionPointer; + QLabel *findTextLabelPointer; + KLineEdit *findTextLineEditPointer; KToggleFullScreenAction *fullScreenActionPointer; QAction *javaScriptActionPointer; bool javaScriptEnabled; QAction *localStorageActionPointer; bool localStorageEnabled; KToolBar *navigationToolBarPointer; - QPalette noDomainSettingsPalette; + QPalette negativeBackgroundPalette; + QPalette normalBackgroundPalette; + QPalette positiveBackgroundPalette; QProgressBar *progressBarPointer; QLabel *searchEngineLabelPointer; QAction *searchEngineMenuActionPointer; -- 2.43.0