diff --git a/CHANGELOG.md b/CHANGELOG.md index 8dd896f0115..77d227334ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unversioned +- 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) diff --git a/src/util/IncognitoBrowser.cpp b/src/util/IncognitoBrowser.cpp index 3d147b6f756..bb71e7e0c8c 100644 --- a/src/util/IncognitoBrowser.cpp +++ b/src/util/IncognitoBrowser.cpp @@ -5,6 +5,7 @@ # include "util/XDGHelper.hpp" #endif +#include #include #include @@ -12,52 +13,6 @@ namespace { using namespace chatterino; -QString getPrivateSwitch(const QString &browserExecutable) -{ - // list of command line switches to turn on private browsing in browsers - static auto switches = std::vector>{ - {"firefox", "-private-window"}, - {"librewolf", "-private-window"}, - {"waterfox", "-private-window"}, - {"icecat", "-private-window"}, - {"chrome", "-incognito"}, - {"google-chrome-stable", "-incognito"}, - {"vivaldi", "-incognito"}, - {"opera", "-newprivatetab"}, - {"opera\\launcher", "--private"}, - {"iexplore", "-private"}, - {"msedge", "-inprivate"}, - {"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(); - -#ifdef Q_OS_WINDOWS - if (lowercasedBrowserExecutable.endsWith(".exe")) - { - lowercasedBrowserExecutable.chop(4); - } -#endif - - for (const auto &switch_ : switches) - { - if (lowercasedBrowserExecutable.endsWith(switch_.first)) - { - return switch_.second; - } - } - - // couldn't match any browser -> unknown browser - return {}; -} - QString getDefaultBrowserExecutable() { #ifdef USEWINSDK @@ -102,9 +57,62 @@ QString getDefaultBrowserExecutable() } } // namespace +// + +namespace chatterino::incognitobrowser::detail { + +QString getPrivateSwitch(const QString &browserExecutable) +{ + static auto switches = std::vector>{ + {"librewolf", "-private-window"}, + {"waterfox", "-private-window"}, + {"icecat", "-private-window"}, + {"chrome", "-incognito"}, + {"google-chrome-stable", "-incognito"}, + {"vivaldi", "-incognito"}, + {"opera", "-newprivatetab"}, + {"iexplore", "-private"}, + {"msedge", "-inprivate"}, + {"chromium", "-incognito"}, + {"brave", "-incognito"}, + }; + + // the browser executable may be a full path, strip it to its basename and + // compare case insensitively + auto lowercasedBrowserExecutable = + QFileInfo(browserExecutable).baseName().toLower(); + +#ifdef Q_OS_WINDOWS + if (lowercasedBrowserExecutable.endsWith(".exe")) + { + lowercasedBrowserExecutable.chop(4); + } +#endif + + for (const auto &switch_ : switches) + { + if (lowercasedBrowserExecutable == switch_.first) + { + return switch_.second; + } + } + + // catch all mozilla distributed variants + if (lowercasedBrowserExecutable.startsWith("firefox")) + { + return "-private-window"; + } + + // couldn't match any browser -> unknown browser + return {}; +} + +} // 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..0eeea9623ae --- /dev/null +++ b/tests/src/IncognitoBrowser.cpp @@ -0,0 +1,21 @@ +#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("chrome.exe"), "-incognito"); + ASSERT_EQ(getPrivateSwitch("google-chrome-stable"), "-incognito"); + + ASSERT_EQ(getPrivateSwitch("opera.exe"), "-newprivatetab"); + + ASSERT_EQ(getPrivateSwitch("unsupportedBrowser.exe"), ""); +}