From 2c14fd3329fc606bcc304629ba361fd47455bb1d Mon Sep 17 00:00:00 2001 From: teknsl Date: Wed, 8 Jan 2025 21:26:12 +0100 Subject: [PATCH 01/10] catch 'firefox-bin' and all mozilla browsers in one --- src/util/IncognitoBrowser.cpp | 41 +++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/src/util/IncognitoBrowser.cpp b/src/util/IncognitoBrowser.cpp index 3d147b6f756..92a06fc1766 100644 --- a/src/util/IncognitoBrowser.cpp +++ b/src/util/IncognitoBrowser.cpp @@ -5,6 +5,7 @@ # include "util/XDGHelper.hpp" #endif +#include #include #include @@ -12,11 +13,14 @@ namespace { using namespace chatterino; -QString getPrivateSwitch(const QString &browserExecutable) +QString getPrivateArg(const QString &exePath) { - // list of command line switches to turn on private browsing in browsers - static auto switches = std::vector>{ - {"firefox", "-private-window"}, + struct Entry { + QString exe{}; + QString arg{}; + }; + + static std::vector lut{ {"librewolf", "-private-window"}, {"waterfox", "-private-window"}, {"icecat", "-private-window"}, @@ -30,28 +34,27 @@ QString getPrivateSwitch(const QString &browserExecutable) {"firefox-esr", "-private-window"}, {"chromium", "-incognito"}, {"brave", "-incognito"}, - {"firefox-devedition", "-private-window"}, - {"firefox-developer-edition", "-private-window"}, - {"firefox-beta", "-private-window"}, - {"firefox-nightly", "-private-window"}, }; - // compare case-insensitively - auto lowercasedBrowserExecutable = browserExecutable.toLower(); + QString exe = QFileInfo(exePath).baseName().toLower(); #ifdef Q_OS_WINDOWS - if (lowercasedBrowserExecutable.endsWith(".exe")) + if (exe.endsWith(".exe")) { - lowercasedBrowserExecutable.chop(4); + exe.chop(4); } #endif - for (const auto &switch_ : switches) + for (const auto &entry : lut) { - if (lowercasedBrowserExecutable.endsWith(switch_.first)) - { - return switch_.second; - } + if (exe == entry.exe) + return entry.arg; + } + + // catch all mozilla distributed variants + if (exe.startsWith("firefox")) + { + return "-private-window"; } // couldn't match any browser -> unknown browser @@ -108,14 +111,14 @@ namespace chatterino { bool supportsIncognitoLinks() { auto browserExe = getDefaultBrowserExecutable(); - return !browserExe.isNull() && !getPrivateSwitch(browserExe).isNull(); + return !browserExe.isNull() && !getPrivateArg(browserExe).isNull(); } bool openLinkIncognito(const QString &link) { auto browserExe = getDefaultBrowserExecutable(); return QProcess::startDetached(browserExe, - {getPrivateSwitch(browserExe), link}); + {getPrivateArg(browserExe), link}); } } // namespace chatterino From 45865aa9da755b3396cb429df07e80129099b71f Mon Sep 17 00:00:00 2001 From: teknsl Date: Wed, 8 Jan 2025 22:01:39 +0100 Subject: [PATCH 02/10] make clang-tidy happy --- src/util/IncognitoBrowser.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/util/IncognitoBrowser.cpp b/src/util/IncognitoBrowser.cpp index 92a06fc1766..8fb17bd9807 100644 --- a/src/util/IncognitoBrowser.cpp +++ b/src/util/IncognitoBrowser.cpp @@ -16,8 +16,8 @@ using namespace chatterino; QString getPrivateArg(const QString &exePath) { struct Entry { - QString exe{}; - QString arg{}; + QString exe; + QString arg; }; static std::vector lut{ @@ -48,7 +48,9 @@ QString getPrivateArg(const QString &exePath) for (const auto &entry : lut) { if (exe == entry.exe) + { return entry.arg; + } } // catch all mozilla distributed variants From c90324f626f27679c4fea7cc3e8297c6963910d4 Mon Sep 17 00:00:00 2001 From: teknsl Date: Thu, 9 Jan 2025 01:00:33 +0100 Subject: [PATCH 03/10] also remove firefox-esr --- src/util/IncognitoBrowser.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/util/IncognitoBrowser.cpp b/src/util/IncognitoBrowser.cpp index 8fb17bd9807..ec2f7252057 100644 --- a/src/util/IncognitoBrowser.cpp +++ b/src/util/IncognitoBrowser.cpp @@ -31,7 +31,6 @@ QString getPrivateArg(const QString &exePath) {"opera\\launcher", "--private"}, {"iexplore", "-private"}, {"msedge", "-inprivate"}, - {"firefox-esr", "-private-window"}, {"chromium", "-incognito"}, {"brave", "-incognito"}, }; From 9b0c6ed0f1fecaf00172487506ca8614f710a588 Mon Sep 17 00:00:00 2001 From: teknsl Date: Thu, 9 Jan 2025 01:00:58 +0100 Subject: [PATCH 04/10] nits --- src/util/IncognitoBrowser.cpp | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/src/util/IncognitoBrowser.cpp b/src/util/IncognitoBrowser.cpp index ec2f7252057..cf639e0e500 100644 --- a/src/util/IncognitoBrowser.cpp +++ b/src/util/IncognitoBrowser.cpp @@ -13,14 +13,9 @@ namespace { using namespace chatterino; -QString getPrivateArg(const QString &exePath) +QString getPrivateSwitch(const QString &browserExecutable) { - struct Entry { - QString exe; - QString arg; - }; - - static std::vector lut{ + static auto switches = std::vector>{ {"librewolf", "-private-window"}, {"waterfox", "-private-window"}, {"icecat", "-private-window"}, @@ -35,25 +30,28 @@ QString getPrivateArg(const QString &exePath) {"brave", "-incognito"}, }; - QString exe = QFileInfo(exePath).baseName().toLower(); + // the browser executable may be a full path, strip it to its basename and + // compare case insensitively + auto lowercasedExecutable = + QFileInfo(browserExecutable).baseName().toLower(); #ifdef Q_OS_WINDOWS - if (exe.endsWith(".exe")) + if (lowercasedExecutable.endsWith(".exe")) { - exe.chop(4); + lowercasedExecutable.chop(4); } #endif - for (const auto &entry : lut) + for (const auto &switch_ : switches) { - if (exe == entry.exe) + if (lowercasedExecutable == switch_.first) { - return entry.arg; + return switch_.second; } } // catch all mozilla distributed variants - if (exe.startsWith("firefox")) + if (lowercasedExecutable.startsWith("firefox")) { return "-private-window"; } @@ -112,14 +110,14 @@ namespace chatterino { bool supportsIncognitoLinks() { auto browserExe = getDefaultBrowserExecutable(); - return !browserExe.isNull() && !getPrivateArg(browserExe).isNull(); + return !browserExe.isNull() && !getPrivateSwitch(browserExe).isNull(); } bool openLinkIncognito(const QString &link) { auto browserExe = getDefaultBrowserExecutable(); return QProcess::startDetached(browserExe, - {getPrivateArg(browserExe), link}); + {getPrivateSwitch(browserExe), link}); } } // namespace chatterino From 091054adfa3d5f90c7161c799d35b720acec37a9 Mon Sep 17 00:00:00 2001 From: teknsl Date: Thu, 9 Jan 2025 01:08:06 +0100 Subject: [PATCH 05/10] changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f38527c575d..e5950df2a2f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## Unversioned +- Minor: Treat all browsers starting with `firefox` as a Firefox browser (#5805) - Bugfix: Fixed a crash relating to Lua HTTP. (#5800) ## 2.5.2 From d2c124715833248aee8828ce32fe96dcca37289c Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Sat, 11 Jan 2025 11:32:57 +0100 Subject: [PATCH 06/10] nit: revert namechange of lowercasedBrowserExecutable [skip ci] --- src/util/IncognitoBrowser.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/util/IncognitoBrowser.cpp b/src/util/IncognitoBrowser.cpp index cf639e0e500..9819afcfb7f 100644 --- a/src/util/IncognitoBrowser.cpp +++ b/src/util/IncognitoBrowser.cpp @@ -32,26 +32,26 @@ QString getPrivateSwitch(const QString &browserExecutable) // the browser executable may be a full path, strip it to its basename and // compare case insensitively - auto lowercasedExecutable = + auto lowercasedBrowserExecutable = QFileInfo(browserExecutable).baseName().toLower(); #ifdef Q_OS_WINDOWS - if (lowercasedExecutable.endsWith(".exe")) + if (lowercasedBrowserExecutable.endsWith(".exe")) { - lowercasedExecutable.chop(4); + lowercasedBrowserExecutable.chop(4); } #endif for (const auto &switch_ : switches) { - if (lowercasedExecutable == switch_.first) + if (lowercasedBrowserExecutable == switch_.first) { return switch_.second; } } // catch all mozilla distributed variants - if (lowercasedExecutable.startsWith("firefox")) + if (lowercasedBrowserExecutable.startsWith("firefox")) { return "-private-window"; } From 10fb1e04edd20774e7ac395dcb000ffee3d9cd57 Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Sat, 11 Jan 2025 11:59:11 +0100 Subject: [PATCH 07/10] add unit tests --- src/util/IncognitoBrowser.cpp | 95 ++++++++++++++++++---------------- src/util/IncognitoBrowser.hpp | 6 +++ tests/CMakeLists.txt | 1 + tests/src/IncognitoBrowser.cpp | 27 ++++++++++ 4 files changed, 85 insertions(+), 44 deletions(-) create mode 100644 tests/src/IncognitoBrowser.cpp diff --git a/src/util/IncognitoBrowser.cpp b/src/util/IncognitoBrowser.cpp index 9819afcfb7f..45c72602100 100644 --- a/src/util/IncognitoBrowser.cpp +++ b/src/util/IncognitoBrowser.cpp @@ -13,6 +13,54 @@ namespace { using namespace chatterino; +QString getDefaultBrowserExecutable() +{ +#ifdef USEWINSDK + // get default browser start command, by protocol if possible, falling back to extension if not + QString command = + getAssociatedExecutable(AssociationQueryType::Protocol, L"http"); + + if (command.isNull()) + { + // failed to fetch default browser by protocol, try by file extension instead + command = getAssociatedExecutable(AssociationQueryType::FileExtension, + L".html"); + } + + if (command.isNull()) + { + // also try the equivalent .htm extension + command = getAssociatedExecutable(AssociationQueryType::FileExtension, + L".htm"); + } + + return command; +#elif defined(Q_OS_UNIX) && !defined(Q_OS_DARWIN) + static QString defaultBrowser = []() -> QString { + auto desktopFile = getDefaultBrowserDesktopFile(); + if (desktopFile.has_value()) + { + auto entry = desktopFile->getEntries("Desktop Entry"); + auto exec = entry.find("Exec"); + if (exec != entry.end()) + { + return parseDesktopExecProgram(exec->second.trimmed()); + } + } + return {}; + }(); + + return defaultBrowser; +#else + return {}; +#endif +} + +} // namespace +// + +namespace chatterino::incognitobrowser::detail { + QString getPrivateSwitch(const QString &browserExecutable) { static auto switches = std::vector>{ @@ -60,53 +108,12 @@ QString getPrivateSwitch(const QString &browserExecutable) return {}; } -QString getDefaultBrowserExecutable() -{ -#ifdef USEWINSDK - // get default browser start command, by protocol if possible, falling back to extension if not - QString command = - getAssociatedExecutable(AssociationQueryType::Protocol, L"http"); - - if (command.isNull()) - { - // failed to fetch default browser by protocol, try by file extension instead - command = getAssociatedExecutable(AssociationQueryType::FileExtension, - L".html"); - } - - if (command.isNull()) - { - // also try the equivalent .htm extension - command = getAssociatedExecutable(AssociationQueryType::FileExtension, - L".htm"); - } - - return command; -#elif defined(Q_OS_UNIX) && !defined(Q_OS_DARWIN) - static QString defaultBrowser = []() -> QString { - auto desktopFile = getDefaultBrowserDesktopFile(); - if (desktopFile.has_value()) - { - auto entry = desktopFile->getEntries("Desktop Entry"); - auto exec = entry.find("Exec"); - if (exec != entry.end()) - { - return parseDesktopExecProgram(exec->second.trimmed()); - } - } - return {}; - }(); - - return defaultBrowser; -#else - return {}; -#endif -} - -} // namespace +} // namespace chatterino::incognitobrowser::detail namespace chatterino { +using namespace chatterino::incognitobrowser::detail; + bool supportsIncognitoLinks() { auto browserExe = getDefaultBrowserExecutable(); diff --git a/src/util/IncognitoBrowser.hpp b/src/util/IncognitoBrowser.hpp index 9db1e800f4b..86908aa2d8d 100644 --- a/src/util/IncognitoBrowser.hpp +++ b/src/util/IncognitoBrowser.hpp @@ -2,6 +2,12 @@ #include +namespace chatterino::incognitobrowser::detail { + +QString getPrivateSwitch(const QString &browserExecutable); + +} // namespace chatterino::incognitobrowser::detail + namespace chatterino { bool supportsIncognitoLinks(); diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 06349c0e0a4..65e619c0402 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -52,6 +52,7 @@ set(test_SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/TwitchIrc.cpp ${CMAKE_CURRENT_LIST_DIR}/src/IgnoreController.cpp ${CMAKE_CURRENT_LIST_DIR}/src/OnceFlag.cpp + ${CMAKE_CURRENT_LIST_DIR}/src/IncognitoBrowser.cpp ${CMAKE_CURRENT_LIST_DIR}/src/lib/Snapshot.cpp ${CMAKE_CURRENT_LIST_DIR}/src/lib/Snapshot.hpp # Add your new file above this line! diff --git a/tests/src/IncognitoBrowser.cpp b/tests/src/IncognitoBrowser.cpp new file mode 100644 index 00000000000..7cafa3b875b --- /dev/null +++ b/tests/src/IncognitoBrowser.cpp @@ -0,0 +1,27 @@ +#include "util/IncognitoBrowser.hpp" + +#include "Test.hpp" + +using namespace chatterino; + +TEST(IncognitoBrowser, getPrivateSwitch) +{ + using namespace chatterino::incognitobrowser::detail; + + ASSERT_EQ(getPrivateSwitch("firefox.exe"), "-private-window"); + ASSERT_EQ(getPrivateSwitch("firefox"), "-private-window"); + ASSERT_EQ(getPrivateSwitch("firefox-forsen-version"), "-private-window"); + ASSERT_EQ(getPrivateSwitch("C:/Program Files/Firefox/firefox.exe"), + "-private-window"); + + ASSERT_EQ(getPrivateSwitch("chrome.exe"), "-incognito"); + ASSERT_EQ(getPrivateSwitch("google-chrome-stable"), "-incognito"); + + ASSERT_EQ(getPrivateSwitch( + "C:/Users/pajlada/AppData/Local/Programs/Opera GX/opera.exe"), + "-newprivatetab"); + ASSERT_EQ(getPrivateSwitch("C:/Opera/opera.exe"), "-newprivatetab"); + ASSERT_EQ(getPrivateSwitch("C:/Opera/opera\\launcher.exe"), "--private"); + + ASSERT_EQ(getPrivateSwitch("unsupportedBrowser.exe"), ""); +} From 263d6a60aecef32731fe34667fa25c45729e9ba9 Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Sat, 11 Jan 2025 12:49:26 +0100 Subject: [PATCH 08/10] don't test big paths for now because i'm lazy --- tests/src/IncognitoBrowser.cpp | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/tests/src/IncognitoBrowser.cpp b/tests/src/IncognitoBrowser.cpp index 7cafa3b875b..c445eb45b80 100644 --- a/tests/src/IncognitoBrowser.cpp +++ b/tests/src/IncognitoBrowser.cpp @@ -11,17 +11,12 @@ TEST(IncognitoBrowser, getPrivateSwitch) ASSERT_EQ(getPrivateSwitch("firefox.exe"), "-private-window"); ASSERT_EQ(getPrivateSwitch("firefox"), "-private-window"); ASSERT_EQ(getPrivateSwitch("firefox-forsen-version"), "-private-window"); - ASSERT_EQ(getPrivateSwitch("C:/Program Files/Firefox/firefox.exe"), - "-private-window"); ASSERT_EQ(getPrivateSwitch("chrome.exe"), "-incognito"); ASSERT_EQ(getPrivateSwitch("google-chrome-stable"), "-incognito"); - ASSERT_EQ(getPrivateSwitch( - "C:/Users/pajlada/AppData/Local/Programs/Opera GX/opera.exe"), - "-newprivatetab"); - ASSERT_EQ(getPrivateSwitch("C:/Opera/opera.exe"), "-newprivatetab"); - ASSERT_EQ(getPrivateSwitch("C:/Opera/opera\\launcher.exe"), "--private"); + ASSERT_EQ(getPrivateSwitch("opera.exe"), "-newprivatetab"); + ASSERT_EQ(getPrivateSwitch("opera\\launcher.exe"), "--private"); ASSERT_EQ(getPrivateSwitch("unsupportedBrowser.exe"), ""); } From 80d7e2e37fc6bb506969809c6367b5ae32b1b984 Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Sat, 11 Jan 2025 13:19:23 +0100 Subject: [PATCH 09/10] remove opera/launcher support (this is no longer a thing) --- src/util/IncognitoBrowser.cpp | 1 - tests/src/IncognitoBrowser.cpp | 1 - 2 files changed, 2 deletions(-) diff --git a/src/util/IncognitoBrowser.cpp b/src/util/IncognitoBrowser.cpp index 45c72602100..bb71e7e0c8c 100644 --- a/src/util/IncognitoBrowser.cpp +++ b/src/util/IncognitoBrowser.cpp @@ -71,7 +71,6 @@ QString getPrivateSwitch(const QString &browserExecutable) {"google-chrome-stable", "-incognito"}, {"vivaldi", "-incognito"}, {"opera", "-newprivatetab"}, - {"opera\\launcher", "--private"}, {"iexplore", "-private"}, {"msedge", "-inprivate"}, {"chromium", "-incognito"}, diff --git a/tests/src/IncognitoBrowser.cpp b/tests/src/IncognitoBrowser.cpp index c445eb45b80..0eeea9623ae 100644 --- a/tests/src/IncognitoBrowser.cpp +++ b/tests/src/IncognitoBrowser.cpp @@ -16,7 +16,6 @@ TEST(IncognitoBrowser, getPrivateSwitch) ASSERT_EQ(getPrivateSwitch("google-chrome-stable"), "-incognito"); ASSERT_EQ(getPrivateSwitch("opera.exe"), "-newprivatetab"); - ASSERT_EQ(getPrivateSwitch("opera\\launcher.exe"), "--private"); ASSERT_EQ(getPrivateSwitch("unsupportedBrowser.exe"), ""); } From be36db03612a77720bb8cfd968f703a921cf4f06 Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Sat, 11 Jan 2025 13:20:02 +0100 Subject: [PATCH 10/10] update changelog entry --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1a5b5c61614..77d227334ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,8 @@ ## Unversioned -- Minor: Treat all browsers starting with `firefox` as a Firefox browser (#5805) +- Minor: Treat all browsers starting with `firefox` as a Firefox browser. (#5805) +- Minor: Remove incognito browser support for `opera/launcher` (this should no longer be a thing). (#5805) - Bugfix: Fixed a crash relating to Lua HTTP. (#5800) - Dev: Updated Conan dependencies. (#5776)