Safe Exam Browser for Linux with `.seb` file loading, `seb://` and `sebs://` protocol handling, remote configuration loading, and a Qt WebEngine runtime.
+Safe Exam Browser for Linux with `.seb` file loading, `seb://` and `sebs://` protocol handling, remote configuration loading, and a Qt WebEngine runtime when that browser engine is available.
This build can still load SEB configuration, start the protected shell, and exercise the Linux UI, " + "but it cannot render exam pages because Qt WebEngine is disabled for this target.
" + "Current target URL: %1
"
+ "Configured home URL: %2
This compatibility mode is intended for architectures such as riscv64 until a supported " + "embedded browser engine becomes available.
") + .arg(targetUrl.toHtmlEscaped(), homeUrl.toHtmlEscaped())); +#endif +} + void BrowserWindow::configureShortcuts() { auto *reloadAction = new QAction(this); @@ -439,7 +492,11 @@ void BrowserWindow::configureShortcuts() auto *devToolsAction = new QAction(this); devToolsAction->setShortcut(QKeySequence(Qt::Key_F12)); addAction(devToolsAction); - connect(devToolsAction, &QAction::triggered, this, &BrowserWindow::openDevTools); + connect(devToolsAction, &QAction::triggered, this, [this] { + if (windowSettings_.allowDeveloperConsole && view_) { + view_->openDevTools(); + } + }); if (windowSettings_.allowAddressBar && addressBar_) { auto *focusAddressBar = new QAction(this); @@ -461,17 +518,21 @@ void BrowserWindow::findInPage() bool accepted = false; const QString text = QInputDialog::getText( this, - QStringLiteral("Find in Page"), - QStringLiteral("Search text:"), + tr("Find in Page"), + tr("Search text:"), QLineEdit::Normal, QString(), &accepted); + if (!accepted || text.isEmpty()) { return; } - page_->findText(QString()); - page_->findText(text); + if (view_) { + // First clear selection then search + view_->findText(QString()); + view_->findText(text); + } } void BrowserWindow::navigateHome() @@ -485,49 +546,47 @@ void BrowserWindow::navigateHome() return; } - view_->setUrl(home); + if (view_) { + view_->setUrl(home); + updateAddressBar(home); + } } -void BrowserWindow::openDevTools() -{ - if (!windowSettings_.allowDeveloperConsole) { - return; - } - auto *devTools = new QWebEngineView(); - auto *devPage = new QWebEnginePage(session_.profile(), devTools); - page_->setDevToolsPage(devPage); - devTools->setPage(devPage); - devTools->setAttribute(Qt::WA_DeleteOnClose); - devTools->resize(1100, 700); - devTools->show(); -} -void BrowserWindow::handleNewWindowRequest(QWebEngineNewWindowRequest &request) +void BrowserWindow::handleNewWindowRequest(const QUrl &target, bool &handled) { bool openInSameWindow = false; - const QUrl target = request.requestedUrl(); const QUrl opener = view_->url(); const QString scheme = target.scheme().toLower(); if (scheme == QStringLiteral("seb") || scheme == QStringLiteral("sebs") || target.path().endsWith(QStringLiteral(".seb"), Qt::CaseInsensitive)) { session_.openSebResource(target, this); + handled = true; return; } if (!session_.isPopupAllowed(opener, target, &openInSameWindow)) { + handled = true; // Blocked popup return; } if (openInSameWindow) { - request.openIn(page_); + if (view_) { + view_->setUrl(target); + } else { + // Unlikely to hit this branch unless we are in the compat window + } + handled = true; return; } auto *window = session_.createWindow(target, false); - window->show(); - request.openIn(window->page()); + if (window) { + window->show(); + } + handled = true; } void BrowserWindow::reloadPage() @@ -540,7 +599,9 @@ void BrowserWindow::reloadPage() return; } - view_->reload(); + if (view_) { + view_->reload(); + } } void BrowserWindow::updateAddressBar(const QUrl &url) diff --git a/src/browser_window.h b/src/browser_window.h index 051e45c..02a0afe 100644 --- a/src/browser_window.h +++ b/src/browser_window.h @@ -3,43 +3,38 @@ #include "seb_settings.h" #include