aboutsummaryrefslogtreecommitdiff
path: root/spec/BrowserManagerSpec.cpp
diff options
context:
space:
mode:
authorAkshay Nair <phenax5@gmail.com>2025-03-09 18:15:12 +0530
committerAkshay Nair <phenax5@gmail.com>2025-03-09 19:42:39 +0530
commit1e2302be2b47fbeb340db7482ed8476c829a7f66 (patch)
treed71091727c79de4c800355c68c98107ba5237040 /spec/BrowserManagerSpec.cpp
parent0e276c49adc1ef38993f1a90b0f87c732331598c (diff)
downloadnull-browser-1e2302be2b47fbeb340db7482ed8476c829a7f66.tar.gz
null-browser-1e2302be2b47fbeb340db7482ed8476c829a7f66.zip
Add browser manager + add multitab management (next/prev/close/new)
Diffstat (limited to '')
-rw-r--r--spec/BrowserManagerSpec.cpp271
1 files changed, 271 insertions, 0 deletions
diff --git a/spec/BrowserManagerSpec.cpp b/spec/BrowserManagerSpec.cpp
new file mode 100644
index 0000000..f4af481
--- /dev/null
+++ b/spec/BrowserManagerSpec.cpp
@@ -0,0 +1,271 @@
+#include <QWebEngineNewWindowRequest>
+#include <QWebEngineProfile>
+#include <vector>
+
+#include "BrowserManager.hpp"
+#include "TestUtils.h"
+
+class BrowserManagerSpec : public QObject {
+ Q_OBJECT
+
+ class FakeNewWindowRequest : public QWebEngineNewWindowRequest {
+ public:
+ FakeNewWindowRequest(DestinationType t, const QRect &r, const QUrl &u,
+ bool b)
+ : QWebEngineNewWindowRequest(t, r, u, b, nullptr) {}
+ };
+
+private slots:
+ void testInitialState() {
+ context("when initialized");
+ it("opens a single tab") {
+ BrowserManager browserManager;
+
+ QCOMPARE(browserManager.webViewCount(), 1);
+ QCOMPARE(browserManager.currentUrl(), BrowserManager::NewtabURL);
+ browserManager.deleteLater();
+ }
+ }
+
+ void testCreateNewWebView() {
+ context("when creating a new background webview without a url");
+ it("opens new tab url as a background view") {
+ BrowserManager browserManager;
+
+ browserManager.createNewWebView();
+
+ QCOMPARE(browserManager.webViewCount(), 2);
+ std::vector<QUrl> urls = {QUrl(BrowserManager::NewtabURL),
+ QUrl(BrowserManager::NewtabURL)};
+ QCOMPARE(browserManager.webViewUrls(), urls);
+ QCOMPARE(browserManager.currentWebViewIndex(), 0);
+ QCOMPARE(browserManager.currentUrl(), BrowserManager::NewtabURL);
+ }
+
+ context("when creating a new webview with a url and focus is false");
+ it("opens the given url in background") {
+ BrowserManager browserManager;
+
+ browserManager.createNewWebView(QUrl("https://duckduckgo.com"), false);
+
+ QCOMPARE(browserManager.webViewCount(), 2);
+ std::vector<QUrl> urls = {QUrl(BrowserManager::NewtabURL),
+ QUrl("https://duckduckgo.com")};
+ QCOMPARE(browserManager.webViewUrls(), urls);
+ QCOMPARE(browserManager.currentWebViewIndex(), 0);
+ QCOMPARE(browserManager.currentUrl(), BrowserManager::NewtabURL);
+ }
+
+ context("when creating a new webview with a url and focus is true");
+ it("opens the given url as current view") {
+ BrowserManager browserManager;
+
+ browserManager.createNewWebView(QUrl("https://duckduckgo.com"), true);
+
+ QCOMPARE(browserManager.webViewCount(), 2);
+ std::vector<QUrl> urls = {QUrl(BrowserManager::NewtabURL),
+ QUrl("https://duckduckgo.com")};
+ QCOMPARE(browserManager.webViewUrls(), urls);
+ QCOMPARE(browserManager.currentWebViewIndex(), 1);
+ QCOMPARE(browserManager.currentUrl(), QUrl("https://duckduckgo.com"));
+ }
+ }
+
+ void testNextNavigation() {
+ context("when nextWebView is called");
+ context("- and there is only 1 tab");
+ it("does nothing") {
+ BrowserManager browserManager;
+
+ browserManager.nextWebView();
+
+ QCOMPARE(browserManager.currentWebViewIndex(), 0);
+ QCOMPARE(browserManager.currentUrl(), BrowserManager::NewtabURL);
+ }
+
+ context("when nextWebView is called");
+ context("- and there are tabs after the current tab");
+ it("goes to the next tab") {
+ BrowserManager browserManager;
+ browserManager.createNewWebView(QUrl("http://a1.com"));
+ browserManager.createNewWebView(QUrl("http://a2.com"));
+
+ browserManager.nextWebView();
+
+ QCOMPARE(browserManager.currentWebViewIndex(), 1);
+ QCOMPARE(browserManager.currentUrl(), QUrl("http://a1.com"));
+ }
+
+ context("when nextWebView is called");
+ context("- and current tab is the last tab");
+ it("jumps to the first tab") {
+ BrowserManager browserManager;
+ browserManager.createNewWebView(QUrl("http://a1.com"));
+ browserManager.createNewWebView(QUrl("http://a2.com"), true);
+ QCOMPARE(browserManager.currentWebViewIndex(), 2);
+
+ browserManager.nextWebView();
+
+ QCOMPARE(browserManager.currentWebViewIndex(), 0);
+ QCOMPARE(browserManager.currentUrl(), BrowserManager::NewtabURL);
+ }
+ }
+
+ void testPreviousNavigation() {
+ context("when previousWebView is called");
+ context("- and there is only 1 tab");
+ it("does nothing") {
+ BrowserManager browserManager;
+
+ browserManager.previousWebView();
+
+ QCOMPARE(browserManager.currentWebViewIndex(), 0);
+ QCOMPARE(browserManager.currentUrl(), BrowserManager::NewtabURL);
+ }
+
+ context("when previousWebView is called");
+ context("- and there are tabs before the current tab");
+ it("goes to the next tab") {
+ BrowserManager browserManager;
+ browserManager.createNewWebView(QUrl("http://a1.com"));
+ browserManager.createNewWebView(QUrl("http://a2.com"), true);
+ QCOMPARE(browserManager.currentWebViewIndex(), 2);
+
+ browserManager.previousWebView();
+
+ QCOMPARE(browserManager.currentWebViewIndex(), 1);
+ QCOMPARE(browserManager.currentUrl(), QUrl("http://a1.com"));
+ }
+
+ context("when previousWebView is called");
+ context("- and current tab is the last tab");
+ it("jumps to the last tab") {
+ BrowserManager browserManager;
+ browserManager.createNewWebView(QUrl("http://a1.com"));
+ browserManager.createNewWebView(QUrl("http://a2.com"));
+
+ browserManager.previousWebView();
+
+ QCOMPARE(browserManager.currentWebViewIndex(), 2);
+ QCOMPARE(browserManager.currentUrl(), QUrl("http://a2.com"));
+ }
+ }
+
+ void testCloseWebView() {
+ context("when closeWebView is called");
+ context("- with out of bounds index");
+ it("does nothing") {
+ BrowserManager browserManager;
+ browserManager.setCurrentUrl(QUrl("https://a.com"));
+
+ browserManager.closeWebView(1);
+
+ QCOMPARE(browserManager.webViewCount(), 1);
+ QCOMPARE(browserManager.webViewUrls(),
+ (std::vector<QUrl>{QUrl("https://a.com")}));
+ QCOMPARE(browserManager.currentWebViewIndex(), 0);
+ QCOMPARE(browserManager.currentUrl(), QUrl("https://a.com"));
+ }
+
+ context("when closeWebView is called");
+ context("- and there is only 1 tab");
+ it("closes the tab and opens empty tab in its place") {
+ BrowserManager browserManager;
+ browserManager.setCurrentUrl(QUrl("https://a.com"));
+ QCOMPARE(browserManager.webViewCount(), 1);
+
+ browserManager.closeWebView(0);
+
+ QCOMPARE(browserManager.webViewCount(), 1);
+ QCOMPARE(browserManager.webViewUrls(),
+ (std::vector<QUrl>{BrowserManager::NewtabURL}));
+ QCOMPARE(browserManager.currentWebViewIndex(), 0);
+ QCOMPARE(browserManager.currentUrl(), BrowserManager::NewtabURL);
+ }
+
+ context("when closeWebView is called");
+ context("- with the current tab index");
+ context("- and there are some tabs after");
+ it("closes the tab and focuses the next tab") {
+ BrowserManager browserManager;
+ browserManager.createNewWebView(QUrl("https://a1.com"), true);
+ browserManager.createNewWebView(QUrl("https://a2.com"));
+ QCOMPARE(browserManager.webViewCount(), 3);
+ QCOMPARE(browserManager.currentWebViewIndex(), 1);
+
+ browserManager.closeWebView(1);
+
+ QCOMPARE(browserManager.webViewCount(), 2);
+ QCOMPARE(browserManager.webViewUrls(),
+ (std::vector<QUrl>{BrowserManager::NewtabURL,
+ QUrl("https://a2.com")}));
+ QCOMPARE(browserManager.currentWebViewIndex(), 1);
+ QCOMPARE(browserManager.currentUrl(), QUrl("https://a2.com"));
+ }
+
+ context("when closeWebView is called");
+ context("- with the current tab index");
+ context("- which is the last tab");
+ it("closes the tab and focusses previous tab") {
+ BrowserManager browserManager;
+ browserManager.createNewWebView(QUrl("https://a1.com"));
+ browserManager.createNewWebView(QUrl("https://a2.com"), true);
+ QCOMPARE(browserManager.webViewCount(), 3);
+ QCOMPARE(browserManager.currentWebViewIndex(), 2);
+
+ browserManager.closeWebView(2);
+
+ QCOMPARE(browserManager.webViewCount(), 2);
+ QCOMPARE(browserManager.webViewUrls(),
+ (std::vector<QUrl>{BrowserManager::NewtabURL,
+ QUrl("https://a1.com")}));
+ QCOMPARE(browserManager.currentWebViewIndex(), 1);
+ QCOMPARE(browserManager.currentUrl(), QUrl("https://a1.com"));
+ }
+ }
+
+ void testNewWindowRequestSignal() {
+ context("when webview emits a newWindowRequested signal");
+ context("- of type new tab");
+ it("opens a new web view and focusses it") {
+ BrowserManager browserManager;
+ browserManager.setCurrentUrl(QUrl("https://a.com"));
+ auto webview = browserManager.findChild<QWebEngineView *>();
+
+ FakeNewWindowRequest windowRequest(
+ FakeNewWindowRequest::DestinationType::InNewTab, QRect(0, 0, 0, 0),
+ QUrl("https://new.com"), true);
+ emit webview->page()->newWindowRequested(windowRequest);
+
+ QCOMPARE(browserManager.webViewCount(), 2);
+ QCOMPARE(
+ browserManager.webViewUrls(),
+ (std::vector<QUrl>{QUrl("https://a.com"), QUrl("https://new.com")}));
+ QCOMPARE(browserManager.currentWebViewIndex(), 1);
+ QCOMPARE(browserManager.currentUrl(), QUrl("https://new.com"));
+ }
+
+ context("when webview emits a newWindowRequested signal");
+ context("- of type new background tab");
+ it("opens a new web view in the background") {
+ BrowserManager browserManager;
+ browserManager.setCurrentUrl(QUrl("https://a.com"));
+ auto webview = browserManager.findChild<QWebEngineView *>();
+
+ FakeNewWindowRequest windowRequest(
+ FakeNewWindowRequest::DestinationType::InNewBackgroundTab,
+ QRect(0, 0, 0, 0), QUrl("https://new.com"), true);
+ emit webview->page()->newWindowRequested(windowRequest);
+
+ QCOMPARE(browserManager.webViewCount(), 2);
+ QCOMPARE(
+ browserManager.webViewUrls(),
+ (std::vector<QUrl>{QUrl("https://a.com"), QUrl("https://new.com")}));
+ QCOMPARE(browserManager.currentWebViewIndex(), 0);
+ QCOMPARE(browserManager.currentUrl(), QUrl("https://a.com"));
+ }
+ }
+};
+
+QTEST_REGISTER(BrowserManagerSpec)
+#include "BrowserManagerSpec.moc"