From d5dfc255edf3f67d32cd83cb63445fab76f451f8 Mon Sep 17 00:00:00 2001 From: Edwin Hoksberg Date: Fri, 2 Jul 2021 23:24:19 +0200 Subject: [PATCH] Assistant: Add new URLProvider to open URL's in the browser --- Userland/Applications/Assistant/Providers.cpp | 24 +++++++++++++++++++ Userland/Applications/Assistant/Providers.h | 16 +++++++++++++ Userland/Applications/Assistant/main.cpp | 5 ++++ 3 files changed, 45 insertions(+) diff --git a/Userland/Applications/Assistant/Providers.cpp b/Userland/Applications/Assistant/Providers.cpp index c4cd58e6c3..a133f2a3de 100644 --- a/Userland/Applications/Assistant/Providers.cpp +++ b/Userland/Applications/Assistant/Providers.cpp @@ -41,6 +41,11 @@ void FileResult::activate() const Desktop::Launcher::open(URL::create_with_file_protocol(title())); } +void URLResult::activate() const +{ + Desktop::Launcher::open(URL::create_with_url_or_path(title())); +} + void AppProvider::query(String const& query, Function>)> on_complete) { if (query.starts_with("=")) @@ -151,4 +156,23 @@ void FileProvider::build_filesystem_cache() return 0; }, [this](auto) { m_building_cache = false; }); } +void URLProvider::query(String const& query, Function>)> on_complete) +{ + URL url = URL(query); + + if (url.scheme().is_empty()) + url.set_scheme("http"); + if (url.host().is_empty()) + url.set_host(query); + if (url.paths().is_empty()) + url.set_paths({ "" }); + + if (!url.is_valid()) + return; + + Vector> results; + results.append(adopt_ref(*new URLResult(url))); + on_complete(results); +} + } diff --git a/Userland/Applications/Assistant/Providers.h b/Userland/Applications/Assistant/Providers.h index 538568d0ad..edc1af19f6 100644 --- a/Userland/Applications/Assistant/Providers.h +++ b/Userland/Applications/Assistant/Providers.h @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -84,6 +85,16 @@ public: void activate() const override; }; +class URLResult : public Result { +public: + explicit URLResult(const URL& url) + : Result(GUI::Icon::default_icon("app-browser").bitmap_for_size(16), url.to_string(), "'Enter' will open this URL in the browser"sv, 50) + { + } + ~URLResult() override = default; + void activate() const override; +}; + class Provider { public: virtual ~Provider() = default; @@ -113,4 +124,9 @@ private: Queue m_work_queue; }; +class URLProvider : public Provider { +public: + void query(String const& query, Function>)> on_complete) override; +}; + } diff --git a/Userland/Applications/Assistant/main.cpp b/Userland/Applications/Assistant/main.cpp index 783ccc819f..6427fe1c3e 100644 --- a/Userland/Applications/Assistant/main.cpp +++ b/Userland/Applications/Assistant/main.cpp @@ -138,6 +138,10 @@ public: m_calculator_provider.query(query, [=, this](auto results) { recv_results(query, results); }); + + m_url_provider.query(query, [=, this](auto results) { + recv_results(query, results); + }); } private: @@ -178,6 +182,7 @@ private: AppProvider m_app_provider; CalculatorProvider m_calculator_provider; FileProvider m_file_provider; + URLProvider m_url_provider; Threading::Lock m_lock; HashMap>> m_result_cache;