summaryrefslogtreecommitdiff
path: root/Applications/Help/main.cpp
diff options
context:
space:
mode:
authorLinus Groh <mail@linusgroh.de>2020-07-07 13:55:10 +0100
committerAndreas Kling <kling@serenityos.org>2020-07-07 17:42:50 +0200
commit87465f7c541b33aa70c25d5fb0edb5e56269558c (patch)
tree2ce59207359e54d837b35139ee8990b7c88b5ab9 /Applications/Help/main.cpp
parent787673b743a9c976918b705745307a461d8eaa44 (diff)
downloadserenity-87465f7c541b33aa70c25d5fb0edb5e56269558c.zip
Help: Handle external links
Links which do not have the "file" protocol (most commonly links to external websites - http and https) are now not treated as file paths anymore but instead handled by Desktop::Launcher. The same applies to files outside of /usr/share/man. Fixes #2727.
Diffstat (limited to 'Applications/Help/main.cpp')
-rw-r--r--Applications/Help/main.cpp32
1 files changed, 27 insertions, 5 deletions
diff --git a/Applications/Help/main.cpp b/Applications/Help/main.cpp
index 105584915d..145fdd0acf 100644
--- a/Applications/Help/main.cpp
+++ b/Applications/Help/main.cpp
@@ -29,6 +29,7 @@
#include <AK/ByteBuffer.h>
#include <AK/URL.h>
#include <LibCore/File.h>
+#include <LibDesktop/Launcher.h>
#include <LibGUI/AboutDialog.h>
#include <LibGUI/Action.h>
#include <LibGUI/Application.h>
@@ -58,7 +59,7 @@ int main(int argc, char* argv[])
auto app = GUI::Application::construct(argc, argv);
- if (pledge("stdio shared_buffer accept rpath", nullptr) < 0) {
+ if (pledge("stdio shared_buffer accept rpath unix", nullptr) < 0) {
perror("pledge");
return 1;
}
@@ -73,6 +74,11 @@ int main(int argc, char* argv[])
return 1;
}
+ if (unveil("/tmp/portal/launch", "rw") < 0) {
+ perror("unveil");
+ return 1;
+ }
+
unveil(nullptr, nullptr);
auto app_icon = GUI::Icon::default_icon("app-help");
@@ -159,10 +165,27 @@ int main(int argc, char* argv[])
model->update_section_node_on_toggle(index, open);
};
+ auto open_external = [&](auto& url) {
+ if (!Desktop::Launcher::open(url)) {
+ GUI::MessageBox::show(
+ String::format("The link to '%s' could not be opened.", url.to_string().characters()),
+ "Failed to open link",
+ GUI::MessageBox::Type::Error,
+ GUI::MessageBox::InputType::OK,
+ window);
+ }
+ };
+
page_view.on_link_click = [&](auto& url, auto&, unsigned) {
- char* current_path = strdup(history.current().characters());
- char* path = realpath(url.path().characters(), nullptr);
- free(current_path);
+ if (url.protocol() != "file") {
+ open_external(url);
+ return;
+ }
+ auto path = Core::File::real_path_for(url.path());
+ if (!path.starts_with("/usr/share/man/")) {
+ open_external(url);
+ return;
+ }
auto tree_view_index = model->index_from_path(path);
if (tree_view_index.has_value()) {
dbg() << "Found path _" << path << "_ in model at index " << tree_view_index.value();
@@ -172,7 +195,6 @@ int main(int argc, char* argv[])
history.push(path);
update_actions();
open_page(path);
- free(path);
};
go_back_action = GUI::CommonActions::make_go_back_action([&](auto&) {