AK+LibURL: Move AK::URL into a new URL library

This URL library ends up being a relatively fundamental base library of
the system, as LibCore depends on LibURL.

This change has two main benefits:
 * Moving AK back more towards being an agnostic library that can
   be used between the kernel and userspace. URL has never really fit
   that description - and is not used in the kernel.
 * URL _should_ depend on LibUnicode, as it needs punnycode support.
   However, it's not really possible to do this inside of AK as it can't
   depend on any external library. This change brings us a little closer
   to being able to do that, but unfortunately we aren't there quite
   yet, as the code generators depend on LibCore.
This commit is contained in:
Shannon Booth 2024-03-18 16:22:27 +13:00 committed by Tim Flynn
parent 21bfa001b1
commit e800605ad3
Notes: sideshowbarker 2024-07-17 04:41:05 +09:00
403 changed files with 1336 additions and 1305 deletions

View file

@ -35,8 +35,6 @@ set(AK_SOURCES
StringUtils.cpp StringUtils.cpp
StringView.cpp StringView.cpp
Time.cpp Time.cpp
URL.cpp
URLParser.cpp
UUID.cpp UUID.cpp
Utf16View.cpp Utf16View.cpp
Utf32View.cpp Utf32View.cpp

View file

@ -49,7 +49,6 @@ class String;
class StringBuilder; class StringBuilder;
class StringImpl; class StringImpl;
class StringView; class StringView;
class URL;
class UnixDateTime; class UnixDateTime;
class Utf16View; class Utf16View;
class Utf32CodePointIterator; class Utf32CodePointIterator;
@ -204,7 +203,6 @@ using AK::StringView;
using AK::TrailingCodePointTransformation; using AK::TrailingCodePointTransformation;
using AK::Traits; using AK::Traits;
using AK::UnixDateTime; using AK::UnixDateTime;
using AK::URL;
using AK::Utf16View; using AK::Utf16View;
using AK::Utf32CodePointIterator; using AK::Utf32CodePointIterator;
using AK::Utf32View; using AK::Utf32View;

View file

@ -8,9 +8,9 @@
#include <AK/Optional.h> #include <AK/Optional.h>
#include <AK/StringView.h> #include <AK/StringView.h>
#include <AK/URL.h>
#include <AK/Vector.h> #include <AK/Vector.h>
#include <Ladybird/Types.h> #include <Ladybird/Types.h>
#include <LibURL/URL.h>
#include <LibWeb/CSS/PreferredColorScheme.h> #include <LibWeb/CSS/PreferredColorScheme.h>
#include <LibWeb/HTML/ActivateTab.h> #include <LibWeb/HTML/ActivateTab.h>
#include <LibWebView/CookieJar.h> #include <LibWebView/CookieJar.h>
@ -22,18 +22,18 @@
@interface ApplicationDelegate : NSObject <NSApplicationDelegate> @interface ApplicationDelegate : NSObject <NSApplicationDelegate>
- (nullable instancetype)init:(Vector<URL>)initial_urls - (nullable instancetype)init:(Vector<URL::URL>)initial_urls
newTabPageURL:(URL)new_tab_page_url newTabPageURL:(URL::URL)new_tab_page_url
withCookieJar:(WebView::CookieJar)cookie_jar withCookieJar:(WebView::CookieJar)cookie_jar
webContentOptions:(Ladybird::WebContentOptions const&)web_content_options webContentOptions:(Ladybird::WebContentOptions const&)web_content_options
webdriverContentIPCPath:(StringView)webdriver_content_ipc_path; webdriverContentIPCPath:(StringView)webdriver_content_ipc_path;
- (nonnull TabController*)createNewTab:(Optional<URL> const&)url - (nonnull TabController*)createNewTab:(Optional<URL::URL> const&)url
fromTab:(nullable Tab*)tab fromTab:(nullable Tab*)tab
activateTab:(Web::HTML::ActivateTab)activate_tab; activateTab:(Web::HTML::ActivateTab)activate_tab;
- (nonnull TabController*)createNewTab:(StringView)html - (nonnull TabController*)createNewTab:(StringView)html
url:(URL const&)url url:(URL::URL const&)url
fromTab:(nullable Tab*)tab fromTab:(nullable Tab*)tab
activateTab:(Web::HTML::ActivateTab)activate_tab; activateTab:(Web::HTML::ActivateTab)activate_tab;

View file

@ -19,8 +19,8 @@
@interface ApplicationDelegate () @interface ApplicationDelegate ()
{ {
Vector<URL> m_initial_urls; Vector<URL::URL> m_initial_urls;
URL m_new_tab_page_url; URL::URL m_new_tab_page_url;
// This will always be populated, but we cannot have a non-default constructible instance variable. // This will always be populated, but we cannot have a non-default constructible instance variable.
Optional<WebView::CookieJar> m_cookie_jar; Optional<WebView::CookieJar> m_cookie_jar;
@ -50,8 +50,8 @@
@implementation ApplicationDelegate @implementation ApplicationDelegate
- (instancetype)init:(Vector<URL>)initial_urls - (instancetype)init:(Vector<URL::URL>)initial_urls
newTabPageURL:(URL)new_tab_page_url newTabPageURL:(URL::URL)new_tab_page_url
withCookieJar:(WebView::CookieJar)cookie_jar withCookieJar:(WebView::CookieJar)cookie_jar
webContentOptions:(Ladybird::WebContentOptions const&)web_content_options webContentOptions:(Ladybird::WebContentOptions const&)web_content_options
webdriverContentIPCPath:(StringView)webdriver_content_ipc_path webdriverContentIPCPath:(StringView)webdriver_content_ipc_path
@ -95,7 +95,7 @@
#pragma mark - Public methods #pragma mark - Public methods
- (TabController*)createNewTab:(Optional<URL> const&)url - (TabController*)createNewTab:(Optional<URL::URL> const&)url
fromTab:(Tab*)tab fromTab:(Tab*)tab
activateTab:(Web::HTML::ActivateTab)activate_tab activateTab:(Web::HTML::ActivateTab)activate_tab
{ {
@ -106,7 +106,7 @@
} }
- (nonnull TabController*)createNewTab:(StringView)html - (nonnull TabController*)createNewTab:(StringView)html
url:(URL const&)url url:(URL::URL const&)url
fromTab:(nullable Tab*)tab fromTab:(nullable Tab*)tab
activateTab:(Web::HTML::ActivateTab)activate_tab activateTab:(Web::HTML::ActivateTab)activate_tab
{ {
@ -155,7 +155,7 @@
return; return;
} }
[self createNewTab:URL("about:version"sv) [self createNewTab:URL::URL("about:version"sv)
fromTab:(Tab*)current_tab fromTab:(Tab*)current_tab
activateTab:Web::HTML::ActivateTab::Yes]; activateTab:Web::HTML::ActivateTab::Yes];
} }

View file

@ -8,6 +8,7 @@
#include <AK/Forward.h> #include <AK/Forward.h>
#include <LibGfx/Forward.h> #include <LibGfx/Forward.h>
#include <LibURL/Forward.h>
#include <LibWeb/CSS/PreferredColorScheme.h> #include <LibWeb/CSS/PreferredColorScheme.h>
#include <LibWeb/HTML/ActivateTab.h> #include <LibWeb/HTML/ActivateTab.h>
#include <LibWebView/Forward.h> #include <LibWebView/Forward.h>
@ -16,16 +17,16 @@
@protocol LadybirdWebViewObserver <NSObject> @protocol LadybirdWebViewObserver <NSObject>
- (String const&)onCreateNewTab:(URL const&)url - (String const&)onCreateNewTab:(URL::URL const&)url
activateTab:(Web::HTML::ActivateTab)activate_tab; activateTab:(Web::HTML::ActivateTab)activate_tab;
- (String const&)onCreateNewTab:(StringView)html - (String const&)onCreateNewTab:(StringView)html
url:(URL const&)url url:(URL::URL const&)url
activateTab:(Web::HTML::ActivateTab)activate_tab; activateTab:(Web::HTML::ActivateTab)activate_tab;
- (void)loadURL:(URL const&)url; - (void)loadURL:(URL::URL const&)url;
- (void)onLoadStart:(URL const&)url isRedirect:(BOOL)is_redirect; - (void)onLoadStart:(URL::URL const&)url isRedirect:(BOOL)is_redirect;
- (void)onLoadFinish:(URL const&)url; - (void)onLoadFinish:(URL::URL const&)url;
- (void)onTitleChange:(ByteString const&)title; - (void)onTitleChange:(ByteString const&)title;
- (void)onFaviconChange:(Gfx::Bitmap const&)bitmap; - (void)onFaviconChange:(Gfx::Bitmap const&)bitmap;
@ -40,7 +41,7 @@
- (instancetype)init:(id<LadybirdWebViewObserver>)observer; - (instancetype)init:(id<LadybirdWebViewObserver>)observer;
- (void)loadURL:(URL const&)url; - (void)loadURL:(URL::URL const&)url;
- (void)loadHTML:(StringView)html; - (void)loadHTML:(StringView)html;
- (WebView::ViewImplementation&)view; - (WebView::ViewImplementation&)view;

View file

@ -6,9 +6,9 @@
#include <AK/Optional.h> #include <AK/Optional.h>
#include <AK/TemporaryChange.h> #include <AK/TemporaryChange.h>
#include <AK/URL.h>
#include <LibGfx/ImageFormats/PNGWriter.h> #include <LibGfx/ImageFormats/PNGWriter.h>
#include <LibGfx/ShareableBitmap.h> #include <LibGfx/ShareableBitmap.h>
#include <LibURL/URL.h>
#include <LibWeb/HTML/SelectedFile.h> #include <LibWeb/HTML/SelectedFile.h>
#include <LibWebView/SearchEngine.h> #include <LibWebView/SearchEngine.h>
#include <LibWebView/SourceHighlighter.h> #include <LibWebView/SourceHighlighter.h>
@ -51,7 +51,7 @@ struct HideCursor {
{ {
OwnPtr<Ladybird::WebViewBridge> m_web_view_bridge; OwnPtr<Ladybird::WebViewBridge> m_web_view_bridge;
URL m_context_menu_url; URL::URL m_context_menu_url;
Gfx::ShareableBitmap m_context_menu_bitmap; Gfx::ShareableBitmap m_context_menu_bitmap;
Optional<String> m_context_menu_search_text; Optional<String> m_context_menu_search_text;
@ -118,7 +118,7 @@ struct HideCursor {
#pragma mark - Public methods #pragma mark - Public methods
- (void)loadURL:(URL const&)url - (void)loadURL:(URL::URL const&)url
{ {
m_web_view_bridge->load(url); m_web_view_bridge->load(url);
} }

View file

@ -6,11 +6,11 @@
#include <AK/ByteString.h> #include <AK/ByteString.h>
#include <AK/String.h> #include <AK/String.h>
#include <AK/URL.h>
#include <Ladybird/Utilities.h> #include <Ladybird/Utilities.h>
#include <LibCore/Resource.h> #include <LibCore/Resource.h>
#include <LibGfx/ImageFormats/PNGWriter.h> #include <LibGfx/ImageFormats/PNGWriter.h>
#include <LibGfx/ShareableBitmap.h> #include <LibGfx/ShareableBitmap.h>
#include <LibURL/URL.h>
#import <Application/ApplicationDelegate.h> #import <Application/ApplicationDelegate.h>
#import <UI/Inspector.h> #import <UI/Inspector.h>
@ -34,7 +34,7 @@ static constexpr CGFloat const WINDOW_HEIGHT = 800;
@property (nonatomic, strong) InspectorController* inspector_controller; @property (nonatomic, strong) InspectorController* inspector_controller;
@property (nonatomic, assign) URL last_url; @property (nonatomic, assign) URL::URL last_url;
@end @end
@ -188,7 +188,7 @@ static constexpr CGFloat const WINDOW_HEIGHT = 800;
#pragma mark - LadybirdWebViewObserver #pragma mark - LadybirdWebViewObserver
- (String const&)onCreateNewTab:(URL const&)url - (String const&)onCreateNewTab:(URL::URL const&)url
activateTab:(Web::HTML::ActivateTab)activate_tab activateTab:(Web::HTML::ActivateTab)activate_tab
{ {
auto* delegate = (ApplicationDelegate*)[NSApp delegate]; auto* delegate = (ApplicationDelegate*)[NSApp delegate];
@ -202,7 +202,7 @@ static constexpr CGFloat const WINDOW_HEIGHT = 800;
} }
- (String const&)onCreateNewTab:(StringView)html - (String const&)onCreateNewTab:(StringView)html
url:(URL const&)url url:(URL::URL const&)url
activateTab:(Web::HTML::ActivateTab)activate_tab activateTab:(Web::HTML::ActivateTab)activate_tab
{ {
auto* delegate = (ApplicationDelegate*)[NSApp delegate]; auto* delegate = (ApplicationDelegate*)[NSApp delegate];
@ -216,12 +216,12 @@ static constexpr CGFloat const WINDOW_HEIGHT = 800;
return [[tab web_view] handle]; return [[tab web_view] handle];
} }
- (void)loadURL:(URL const&)url - (void)loadURL:(URL::URL const&)url
{ {
[[self tabController] loadURL:url]; [[self tabController] loadURL:url];
} }
- (void)onLoadStart:(URL const&)url isRedirect:(BOOL)is_redirect - (void)onLoadStart:(URL::URL const&)url isRedirect:(BOOL)is_redirect
{ {
if (url != self.last_url) { if (url != self.last_url) {
self.last_url = url; self.last_url = url;
@ -239,7 +239,7 @@ static constexpr CGFloat const WINDOW_HEIGHT = 800;
} }
} }
- (void)onLoadFinish:(URL const&)url - (void)onLoadFinish:(URL::URL const&)url
{ {
if (self.inspector_controller != nil) { if (self.inspector_controller != nil) {
auto* inspector = (Inspector*)[self.inspector_controller window]; auto* inspector = (Inspector*)[self.inspector_controller window];

View file

@ -7,7 +7,7 @@
#pragma once #pragma once
#include <AK/Forward.h> #include <AK/Forward.h>
#include <AK/URL.h> #include <LibURL/URL.h>
#import <System/Cocoa.h> #import <System/Cocoa.h>
@ -23,10 +23,10 @@ struct TabSettings {
- (instancetype)init; - (instancetype)init;
- (void)loadURL:(URL const&)url; - (void)loadURL:(URL::URL const&)url;
- (void)loadHTML:(StringView)html url:(URL const&)url; - (void)loadHTML:(StringView)html url:(URL::URL const&)url;
- (void)onLoadStart:(URL const&)url isRedirect:(BOOL)isRedirect; - (void)onLoadStart:(URL::URL const&)url isRedirect:(BOOL)isRedirect;
- (void)onTitleChange:(ByteString const&)title; - (void)onTitleChange:(ByteString const&)title;
- (void)navigateBack:(id)sender; - (void)navigateBack:(id)sender;

View file

@ -106,17 +106,17 @@ enum class IsHistoryNavigation {
#pragma mark - Public methods #pragma mark - Public methods
- (void)loadURL:(URL const&)url - (void)loadURL:(URL::URL const&)url
{ {
[[self tab].web_view loadURL:url]; [[self tab].web_view loadURL:url];
} }
- (void)loadHTML:(StringView)html url:(URL const&)url - (void)loadHTML:(StringView)html url:(URL::URL const&)url
{ {
[[self tab].web_view loadHTML:html]; [[self tab].web_view loadHTML:html];
} }
- (void)onLoadStart:(URL const&)url isRedirect:(BOOL)isRedirect - (void)onLoadStart:(URL::URL const&)url isRedirect:(BOOL)isRedirect
{ {
if (isRedirect) { if (isRedirect) {
m_history.replace_current(url, m_title); m_history.replace_current(url, m_title);

View file

@ -59,8 +59,8 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
auto database = TRY(WebView::Database::create(move(sql_server_paths))); auto database = TRY(WebView::Database::create(move(sql_server_paths)));
auto cookie_jar = TRY(WebView::CookieJar::create(*database)); auto cookie_jar = TRY(WebView::CookieJar::create(*database));
URL new_tab_page_url = Browser::default_new_tab_url; URL::URL new_tab_page_url = Browser::default_new_tab_url;
Vector<URL> initial_urls; Vector<URL::URL> initial_urls;
for (auto const& raw_url : raw_urls) { for (auto const& raw_url : raw_urls) {
if (auto url = WebView::sanitize_url(raw_url); url.has_value()) if (auto url = WebView::sanitize_url(raw_url); url.has_value())

View file

@ -175,7 +175,7 @@ target_sources(ladybird PUBLIC FILE_SET ladybird TYPE HEADERS
BASE_DIRS ${SERENITY_SOURCE_DIR} BASE_DIRS ${SERENITY_SOURCE_DIR}
FILES ${LADYBIRD_HEADERS} FILES ${LADYBIRD_HEADERS}
) )
target_link_libraries(ladybird PRIVATE AK LibCore LibFileSystem LibGfx LibImageDecoderClient LibIPC LibJS LibMain LibWeb LibWebView LibProtocol) target_link_libraries(ladybird PRIVATE AK LibCore LibFileSystem LibGfx LibImageDecoderClient LibIPC LibJS LibMain LibWeb LibWebView LibProtocol LibURL)
target_include_directories(ladybird PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) target_include_directories(ladybird PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
target_include_directories(ladybird PRIVATE ${SERENITY_SOURCE_DIR}/Userland/) target_include_directories(ladybird PRIVATE ${SERENITY_SOURCE_DIR}/Userland/)
@ -204,7 +204,7 @@ add_executable(headless-browser
target_include_directories(headless-browser PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) target_include_directories(headless-browser PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
target_include_directories(headless-browser PRIVATE ${SERENITY_SOURCE_DIR}/Userland/) target_include_directories(headless-browser PRIVATE ${SERENITY_SOURCE_DIR}/Userland/)
target_link_libraries(headless-browser PRIVATE AK LibCore LibWeb LibWebView LibWebSocket LibCrypto LibFileSystem LibGemini LibHTTP LibImageDecoderClient LibJS LibGfx LibMain LibTLS LibIPC LibDiff LibProtocol) target_link_libraries(headless-browser PRIVATE AK LibCore LibWeb LibWebView LibWebSocket LibCrypto LibFileSystem LibGemini LibHTTP LibImageDecoderClient LibJS LibGfx LibMain LibTLS LibIPC LibDiff LibProtocol LibURL)
if (ANDROID) if (ANDROID)
include(cmake/AndroidExtras.cmake) include(cmake/AndroidExtras.cmake)

View file

@ -9,7 +9,7 @@
#include <AK/JsonArray.h> #include <AK/JsonArray.h>
#include <AK/JsonObject.h> #include <AK/JsonObject.h>
#include <AK/JsonParser.h> #include <AK/JsonParser.h>
#include <AK/URL.h> #include <LibURL/URL.h>
namespace Ladybird { namespace Ladybird {

View file

@ -42,7 +42,7 @@ static QIcon const& app_icon()
return icon; return icon;
} }
BrowserWindow::BrowserWindow(Vector<URL> const& initial_urls, WebView::CookieJar& cookie_jar, WebContentOptions const& web_content_options, StringView webdriver_content_ipc_path) BrowserWindow::BrowserWindow(Vector<URL::URL> const& initial_urls, WebView::CookieJar& cookie_jar, WebContentOptions const& web_content_options, StringView webdriver_content_ipc_path)
: m_cookie_jar(cookie_jar) : m_cookie_jar(cookie_jar)
, m_web_content_options(web_content_options) , m_web_content_options(web_content_options)
, m_webdriver_content_ipc_path(webdriver_content_ipc_path) , m_webdriver_content_ipc_path(webdriver_content_ipc_path)
@ -471,7 +471,7 @@ void BrowserWindow::debug_request(ByteString const& request, ByteString const& a
m_current_tab->debug_request(request, argument); m_current_tab->debug_request(request, argument);
} }
Tab& BrowserWindow::new_tab_from_url(URL const& url, Web::HTML::ActivateTab activate_tab) Tab& BrowserWindow::new_tab_from_url(URL::URL const& url, Web::HTML::ActivateTab activate_tab)
{ {
auto& tab = create_new_tab(activate_tab); auto& tab = create_new_tab(activate_tab);
tab.navigate(url); tab.navigate(url);

View file

@ -28,7 +28,7 @@ class BrowserWindow : public QMainWindow {
Q_OBJECT Q_OBJECT
public: public:
BrowserWindow(Vector<URL> const& initial_urls, WebView::CookieJar&, WebContentOptions const&, StringView webdriver_content_ipc_path); BrowserWindow(Vector<URL::URL> const& initial_urls, WebView::CookieJar&, WebContentOptions const&, StringView webdriver_content_ipc_path);
WebContentView& view() const { return m_current_tab->view(); } WebContentView& view() const { return m_current_tab->view(); }
@ -73,7 +73,7 @@ public slots:
void device_pixel_ratio_changed(qreal dpi); void device_pixel_ratio_changed(qreal dpi);
void tab_title_changed(int index, QString const&); void tab_title_changed(int index, QString const&);
void tab_favicon_changed(int index, QIcon const& icon); void tab_favicon_changed(int index, QIcon const& icon);
Tab& new_tab_from_url(URL const&, Web::HTML::ActivateTab); Tab& new_tab_from_url(URL::URL const&, Web::HTML::ActivateTab);
Tab& new_tab_from_content(StringView html, Web::HTML::ActivateTab); Tab& new_tab_from_content(StringView html, Web::HTML::ActivateTab);
Tab& new_child_tab(Web::HTML::ActivateTab, Tab& parent, Web::HTML::WebViewHints, Optional<u64> page_index); Tab& new_child_tab(Web::HTML::ActivateTab, Tab& parent, Web::HTML::WebViewHints, Optional<u64> page_index);
void activate_tab(int index); void activate_tab(int index);

View file

@ -7,7 +7,7 @@
#include "LocationEdit.h" #include "LocationEdit.h"
#include "Settings.h" #include "Settings.h"
#include "StringUtils.h" #include "StringUtils.h"
#include <AK/URL.h> #include <LibURL/URL.h>
#include <LibWebView/URL.h> #include <LibWebView/URL.h>
#include <QApplication> #include <QApplication>
#include <QPalette> #include <QPalette>

View file

@ -26,7 +26,7 @@ void RequestManagerQt::reply_finished(QNetworkReply* reply)
request->did_finish(); request->did_finish();
} }
RefPtr<Web::ResourceLoaderConnectorRequest> RequestManagerQt::start_request(ByteString const& method, URL const& url, HashMap<ByteString, ByteString> const& request_headers, ReadonlyBytes request_body, Core::ProxyData const& proxy) RefPtr<Web::ResourceLoaderConnectorRequest> RequestManagerQt::start_request(ByteString const& method, URL::URL const& url, HashMap<ByteString, ByteString> const& request_headers, ReadonlyBytes request_body, Core::ProxyData const& proxy)
{ {
if (!url.scheme().bytes_as_string_view().is_one_of_ignoring_ascii_case("http"sv, "https"sv)) { if (!url.scheme().bytes_as_string_view().is_one_of_ignoring_ascii_case("http"sv, "https"sv)) {
return nullptr; return nullptr;
@ -40,7 +40,7 @@ RefPtr<Web::ResourceLoaderConnectorRequest> RequestManagerQt::start_request(Byte
return request; return request;
} }
ErrorOr<NonnullRefPtr<RequestManagerQt::Request>> RequestManagerQt::Request::create(QNetworkAccessManager& qnam, ByteString const& method, URL const& url, HashMap<ByteString, ByteString> const& request_headers, ReadonlyBytes request_body, Core::ProxyData const&) ErrorOr<NonnullRefPtr<RequestManagerQt::Request>> RequestManagerQt::Request::create(QNetworkAccessManager& qnam, ByteString const& method, URL::URL const& url, HashMap<ByteString, ByteString> const& request_headers, ReadonlyBytes request_body, Core::ProxyData const&)
{ {
QNetworkRequest request { QString(url.to_byte_string().characters()) }; QNetworkRequest request { QString(url.to_byte_string().characters()) };
request.setAttribute(QNetworkRequest::RedirectPolicyAttribute, QNetworkRequest::ManualRedirectPolicy); request.setAttribute(QNetworkRequest::RedirectPolicyAttribute, QNetworkRequest::ManualRedirectPolicy);
@ -78,7 +78,7 @@ ErrorOr<NonnullRefPtr<RequestManagerQt::Request>> RequestManagerQt::Request::cre
return adopt_ref(*new Request(*reply)); return adopt_ref(*new Request(*reply));
} }
RefPtr<Web::WebSockets::WebSocketClientSocket> RequestManagerQt::websocket_connect(AK::URL const& url, AK::ByteString const& origin, Vector<AK::ByteString> const& protocols) RefPtr<Web::WebSockets::WebSocketClientSocket> RequestManagerQt::websocket_connect(URL::URL const& url, AK::ByteString const& origin, Vector<AK::ByteString> const& protocols)
{ {
WebSocket::ConnectionInfo connection_info(url); WebSocket::ConnectionInfo connection_info(url);
connection_info.set_origin(origin); connection_info.set_origin(origin);

View file

@ -24,11 +24,11 @@ public:
virtual ~RequestManagerQt() override { } virtual ~RequestManagerQt() override { }
virtual void prefetch_dns(URL const&) override { } virtual void prefetch_dns(URL::URL const&) override { }
virtual void preconnect(URL const&) override { } virtual void preconnect(URL::URL const&) override { }
virtual RefPtr<Web::ResourceLoaderConnectorRequest> start_request(ByteString const& method, URL const&, HashMap<ByteString, ByteString> const& request_headers, ReadonlyBytes request_body, Core::ProxyData const&) override; virtual RefPtr<Web::ResourceLoaderConnectorRequest> start_request(ByteString const& method, URL::URL const&, HashMap<ByteString, ByteString> const& request_headers, ReadonlyBytes request_body, Core::ProxyData const&) override;
virtual RefPtr<Web::WebSockets::WebSocketClientSocket> websocket_connect(const URL&, ByteString const& origin, Vector<ByteString> const& protocols) override; virtual RefPtr<Web::WebSockets::WebSocketClientSocket> websocket_connect(const URL::URL&, ByteString const& origin, Vector<ByteString> const& protocols) override;
private slots: private slots:
void reply_finished(QNetworkReply*); void reply_finished(QNetworkReply*);
@ -39,7 +39,7 @@ private:
class Request class Request
: public Web::ResourceLoaderConnectorRequest { : public Web::ResourceLoaderConnectorRequest {
public: public:
static ErrorOr<NonnullRefPtr<Request>> create(QNetworkAccessManager& qnam, ByteString const& method, URL const& url, HashMap<ByteString, ByteString> const& request_headers, ReadonlyBytes request_body, Core::ProxyData const&); static ErrorOr<NonnullRefPtr<Request>> create(QNetworkAccessManager& qnam, ByteString const& method, URL::URL const& url, HashMap<ByteString, ByteString> const& request_headers, ReadonlyBytes request_body, Core::ProxyData const&);
virtual ~Request() override; virtual ~Request() override;

View file

@ -8,7 +8,7 @@
#include "SettingsDialog.h" #include "SettingsDialog.h"
#include "Settings.h" #include "Settings.h"
#include "StringUtils.h" #include "StringUtils.h"
#include <AK/URL.h> #include <LibURL/URL.h>
#include <LibWebView/SearchEngine.h> #include <LibWebView/SearchEngine.h>
#include <QLabel> #include <QLabel>
#include <QMenu> #include <QMenu>
@ -39,11 +39,11 @@ SettingsDialog::SettingsDialog(QMainWindow* window)
m_new_tab_page->setText(Settings::the()->new_tab_page()); m_new_tab_page->setText(Settings::the()->new_tab_page());
QObject::connect(m_new_tab_page, &QLineEdit::textChanged, this, [this] { QObject::connect(m_new_tab_page, &QLineEdit::textChanged, this, [this] {
auto url_string = ak_string_from_qstring(m_new_tab_page->text()); auto url_string = ak_string_from_qstring(m_new_tab_page->text());
m_new_tab_page->setStyleSheet(URL(url_string).is_valid() ? "" : "border: 1px solid red;"); m_new_tab_page->setStyleSheet(URL::URL(url_string).is_valid() ? "" : "border: 1px solid red;");
}); });
QObject::connect(m_new_tab_page, &QLineEdit::editingFinished, this, [this] { QObject::connect(m_new_tab_page, &QLineEdit::editingFinished, this, [this] {
auto url_string = ak_string_from_qstring(m_new_tab_page->text()); auto url_string = ak_string_from_qstring(m_new_tab_page->text());
if (URL(url_string).is_valid()) if (URL::URL(url_string).is_valid())
Settings::the()->set_new_tab_page(m_new_tab_page->text()); Settings::the()->set_new_tab_page(m_new_tab_page->text());
}); });
QObject::connect(m_new_tab_page, &QLineEdit::returnPressed, this, [this] { QObject::connect(m_new_tab_page, &QLineEdit::returnPressed, this, [this] {

View file

@ -23,13 +23,13 @@ QString qstring_from_ak_string(StringView ak_string)
return QString::fromUtf8(ak_string.characters_without_null_termination(), static_cast<qsizetype>(ak_string.length())); return QString::fromUtf8(ak_string.characters_without_null_termination(), static_cast<qsizetype>(ak_string.length()));
} }
URL ak_url_from_qstring(QString const& qstring) URL::URL ak_url_from_qstring(QString const& qstring)
{ {
auto utf8_data = qstring.toUtf8(); auto utf8_data = qstring.toUtf8();
return URL(StringView(utf8_data.data(), utf8_data.size())); return URL::URL(StringView(utf8_data.data(), utf8_data.size()));
} }
URL ak_url_from_qurl(QUrl const& qurl) URL::URL ak_url_from_qurl(QUrl const& qurl)
{ {
return ak_url_from_qstring(qurl.toString()); return ak_url_from_qstring(qurl.toString());
} }

View file

@ -10,12 +10,12 @@
#include <AK/Error.h> #include <AK/Error.h>
#include <AK/String.h> #include <AK/String.h>
#include <AK/StringView.h> #include <AK/StringView.h>
#include <AK/URL.h> #include <LibURL/URL.h>
#include <QString> #include <QString>
#include <QUrl> #include <QUrl>
AK::ByteString ak_byte_string_from_qstring(QString const&); AK::ByteString ak_byte_string_from_qstring(QString const&);
String ak_string_from_qstring(QString const&); String ak_string_from_qstring(QString const&);
QString qstring_from_ak_string(StringView); QString qstring_from_ak_string(StringView);
URL ak_url_from_qstring(QString const&); URL::URL ak_url_from_qstring(QString const&);
URL ak_url_from_qurl(QUrl const&); URL::URL ak_url_from_qurl(QUrl const&);

View file

@ -121,7 +121,7 @@ Tab::Tab(BrowserWindow* window, WebContentOptions const& web_content_options, St
m_hover_label->hide(); m_hover_label->hide();
}; };
view().on_load_start = [this](const URL& url, bool is_redirect) { view().on_load_start = [this](const URL::URL& url, bool is_redirect) {
// If we are loading due to a redirect, we replace the current history entry // If we are loading due to a redirect, we replace the current history entry
// with the loaded URL // with the loaded URL
if (is_redirect) { if (is_redirect) {
@ -384,7 +384,7 @@ Tab::Tab(BrowserWindow* window, WebContentOptions const& web_content_options, St
search_selected_text_action->setIcon(load_icon_from_uri("resource://icons/16x16/find.png"sv)); search_selected_text_action->setIcon(load_icon_from_uri("resource://icons/16x16/find.png"sv));
QObject::connect(search_selected_text_action, &QAction::triggered, this, [this]() { QObject::connect(search_selected_text_action, &QAction::triggered, this, [this]() {
auto url = MUST(String::formatted(Settings::the()->search_engine().query_url, URL::percent_encode(*m_page_context_menu_search_text))); auto url = MUST(String::formatted(Settings::the()->search_engine().query_url, URL::percent_encode(*m_page_context_menu_search_text)));
m_window->new_tab_from_url(URL(url), Web::HTML::ActivateTab::Yes); m_window->new_tab_from_url(URL::URL(url), Web::HTML::ActivateTab::Yes);
}); });
auto take_screenshot = [this](auto type) { auto take_screenshot = [this](auto type) {
@ -733,7 +733,7 @@ void Tab::focus_location_editor()
m_location_edit->selectAll(); m_location_edit->selectAll();
} }
void Tab::navigate(URL const& url) void Tab::navigate(URL::URL const& url)
{ {
view().load(url); view().load(url);
} }
@ -772,17 +772,17 @@ void Tab::reload()
view().load(m_history.current().url.to_byte_string()); view().load(m_history.current().url.to_byte_string());
} }
void Tab::open_link(URL const& url) void Tab::open_link(URL::URL const& url)
{ {
view().on_link_click(url, "", 0); view().on_link_click(url, "", 0);
} }
void Tab::open_link_in_new_tab(URL const& url) void Tab::open_link_in_new_tab(URL::URL const& url)
{ {
view().on_link_click(url, "_blank", 0); view().on_link_click(url, "_blank", 0);
} }
void Tab::copy_link_url(URL const& url) void Tab::copy_link_url(URL::URL const& url)
{ {
auto* clipboard = QGuiApplication::clipboard(); auto* clipboard = QGuiApplication::clipboard();
clipboard->setText(qstring_from_ak_string(WebView::url_text_to_copy(url))); clipboard->setText(qstring_from_ak_string(WebView::url_text_to_copy(url)));

View file

@ -33,7 +33,7 @@ public:
WebContentView& view() { return *m_view; } WebContentView& view() { return *m_view; }
void navigate(URL const&); void navigate(URL::URL const&);
void load_html(StringView); void load_html(StringView);
void back(); void back();
@ -69,9 +69,9 @@ private:
void recreate_toolbar_icons(); void recreate_toolbar_icons();
void update_hover_label(); void update_hover_label();
void open_link(URL const&); void open_link(URL::URL const&);
void open_link_in_new_tab(URL const&); void open_link_in_new_tab(URL::URL const&);
void copy_link_url(URL const&); void copy_link_url(URL::URL const&);
void close_sub_widgets(); void close_sub_widgets();
@ -91,11 +91,11 @@ private:
QMenu* m_link_context_menu { nullptr }; QMenu* m_link_context_menu { nullptr };
QAction* m_link_context_menu_copy_url_action { nullptr }; QAction* m_link_context_menu_copy_url_action { nullptr };
URL m_link_context_menu_url; URL::URL m_link_context_menu_url;
QMenu* m_image_context_menu { nullptr }; QMenu* m_image_context_menu { nullptr };
Gfx::ShareableBitmap m_image_context_menu_bitmap; Gfx::ShareableBitmap m_image_context_menu_bitmap;
URL m_image_context_menu_url; URL::URL m_image_context_menu_url;
QMenu* m_audio_context_menu { nullptr }; QMenu* m_audio_context_menu { nullptr };
QMenu* m_video_context_menu { nullptr }; QMenu* m_video_context_menu { nullptr };
@ -107,7 +107,7 @@ private:
QAction* m_media_context_menu_mute_unmute_action { nullptr }; QAction* m_media_context_menu_mute_unmute_action { nullptr };
QAction* m_media_context_menu_controls_action { nullptr }; QAction* m_media_context_menu_controls_action { nullptr };
QAction* m_media_context_menu_loop_action { nullptr }; QAction* m_media_context_menu_loop_action { nullptr };
URL m_media_context_menu_url; URL::URL m_media_context_menu_url;
QMenu* m_select_dropdown { nullptr }; QMenu* m_select_dropdown { nullptr };

View file

@ -11,11 +11,11 @@
#include <AK/Function.h> #include <AK/Function.h>
#include <AK/HashMap.h> #include <AK/HashMap.h>
#include <AK/OwnPtr.h> #include <AK/OwnPtr.h>
#include <AK/URL.h>
#include <Ladybird/Types.h> #include <Ladybird/Types.h>
#include <LibGfx/Forward.h> #include <LibGfx/Forward.h>
#include <LibGfx/Rect.h> #include <LibGfx/Rect.h>
#include <LibGfx/StandardCursor.h> #include <LibGfx/StandardCursor.h>
#include <LibURL/URL.h>
#include <LibWeb/CSS/PreferredColorScheme.h> #include <LibWeb/CSS/PreferredColorScheme.h>
#include <LibWeb/CSS/Selector.h> #include <LibWeb/CSS/Selector.h>
#include <LibWeb/Forward.h> #include <LibWeb/Forward.h>
@ -47,7 +47,7 @@ public:
WebContentView(QWidget* window, WebContentOptions const&, StringView webdriver_content_ipc_path, RefPtr<WebView::WebContentClient> parent_client = nullptr, size_t page_index = 0); WebContentView(QWidget* window, WebContentOptions const&, StringView webdriver_content_ipc_path, RefPtr<WebView::WebContentClient> parent_client = nullptr, size_t page_index = 0);
virtual ~WebContentView() override; virtual ~WebContentView() override;
Function<String(const URL&, Web::HTML::ActivateTab)> on_tab_open_request; Function<String(const URL::URL&, Web::HTML::ActivateTab)> on_tab_open_request;
virtual void paintEvent(QPaintEvent*) override; virtual void paintEvent(QPaintEvent*) override;
virtual void resizeEvent(QResizeEvent*) override; virtual void resizeEvent(QResizeEvent*) override;

View file

@ -61,7 +61,7 @@ public:
{ {
} }
Function<void(URL)> on_open_file; Function<void(URL::URL)> on_open_file;
bool event(QEvent* event) override bool event(QEvent* event) override
{ {
@ -133,7 +133,7 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
auto cookie_jar = database ? TRY(WebView::CookieJar::create(*database)) : WebView::CookieJar::create(); auto cookie_jar = database ? TRY(WebView::CookieJar::create(*database)) : WebView::CookieJar::create();
Vector<URL> initial_urls; Vector<URL::URL> initial_urls;
for (auto const& raw_url : raw_urls) { for (auto const& raw_url : raw_urls) {
if (auto url = WebView::sanitize_url(raw_url); url.has_value()) if (auto url = WebView::sanitize_url(raw_url); url.has_value())

View file

@ -33,7 +33,7 @@ target_link_libraries(RequestServer PRIVATE requestserver)
target_include_directories(requestserver PRIVATE ${SERENITY_SOURCE_DIR}/Userland/Services/) target_include_directories(requestserver PRIVATE ${SERENITY_SOURCE_DIR}/Userland/Services/)
target_include_directories(requestserver PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/..) target_include_directories(requestserver PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/..)
target_link_libraries(requestserver PUBLIC LibCore LibMain LibCrypto LibFileSystem LibGemini LibHTTP LibIPC LibMain LibTLS LibWebView LibWebSocket) target_link_libraries(requestserver PUBLIC LibCore LibMain LibCrypto LibFileSystem LibGemini LibHTTP LibIPC LibMain LibTLS LibWebView LibWebSocket LibURL)
if (${CMAKE_SYSTEM_NAME} MATCHES "SunOS") if (${CMAKE_SYSTEM_NAME} MATCHES "SunOS")
# Solaris has socket and networking related functions in two extra libraries # Solaris has socket and networking related functions in two extra libraries
target_link_libraries(requestserver PUBLIC nsl socket) target_link_libraries(requestserver PUBLIC nsl socket)

View file

@ -81,7 +81,7 @@ endif()
target_include_directories(WebContent PRIVATE ${SERENITY_SOURCE_DIR}/Userland/Services/) target_include_directories(WebContent PRIVATE ${SERENITY_SOURCE_DIR}/Userland/Services/)
target_include_directories(WebContent PRIVATE ${SERENITY_SOURCE_DIR}/Userland/) target_include_directories(WebContent PRIVATE ${SERENITY_SOURCE_DIR}/Userland/)
target_include_directories(WebContent PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/..) target_include_directories(WebContent PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/..)
target_link_libraries(WebContent PRIVATE LibAudio LibCore LibFileSystem LibGfx LibImageDecoderClient LibIPC LibJS LibMain LibWeb LibWebSocket LibProtocol LibWebView) target_link_libraries(WebContent PRIVATE LibAudio LibCore LibFileSystem LibGfx LibImageDecoderClient LibIPC LibJS LibMain LibWeb LibWebSocket LibProtocol LibWebView LibURL)
if (HAVE_PULSEAUDIO) if (HAVE_PULSEAUDIO)
target_compile_definitions(WebContent PRIVATE HAVE_PULSEAUDIO=1) target_compile_definitions(WebContent PRIVATE HAVE_PULSEAUDIO=1)

View file

@ -19,7 +19,7 @@ add_library(webworker STATIC ${WEBWORKER_SOURCES})
target_include_directories(webworker PRIVATE ${SERENITY_SOURCE_DIR}/Userland/Services/) target_include_directories(webworker PRIVATE ${SERENITY_SOURCE_DIR}/Userland/Services/)
target_include_directories(webworker PRIVATE ${SERENITY_SOURCE_DIR}/Userland/) target_include_directories(webworker PRIVATE ${SERENITY_SOURCE_DIR}/Userland/)
target_include_directories(webworker PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/..) target_include_directories(webworker PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/..)
target_link_libraries(webworker PUBLIC LibCore LibFileSystem LibGfx LibIPC LibJS LibProtocol LibWeb LibWebView LibLocale LibImageDecoderClient LibMain) target_link_libraries(webworker PUBLIC LibCore LibFileSystem LibGfx LibIPC LibJS LibProtocol LibWeb LibWebView LibLocale LibImageDecoderClient LibMain LibURL)
add_executable(WebWorker main.cpp) add_executable(WebWorker main.cpp)
target_include_directories(WebWorker PRIVATE ${SERENITY_SOURCE_DIR}/Userland/) target_include_directories(WebWorker PRIVATE ${SERENITY_SOURCE_DIR}/Userland/)

View file

@ -355,6 +355,8 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "BSD$" OR HAIKU)
target_link_libraries(AK PRIVATE execinfo) target_link_libraries(AK PRIVATE execinfo)
endif() endif()
add_serenity_subdirectory(Userland/Libraries/LibURL)
# LibCore # LibCore
add_serenity_subdirectory(Userland/Libraries/LibCore) add_serenity_subdirectory(Userland/Libraries/LibCore)
target_link_libraries(LibCore PRIVATE Threads::Threads) target_link_libraries(LibCore PRIVATE Threads::Threads)
@ -370,6 +372,7 @@ if (HAIKU)
# Haiku has networking related functions in the network library # Haiku has networking related functions in the network library
target_link_libraries(LibCore PRIVATE network) target_link_libraries(LibCore PRIVATE network)
endif() endif()
target_link_libraries(LibCore PRIVATE LibURL)
# LibMain # LibMain
add_serenity_subdirectory(Userland/Libraries/LibMain) add_serenity_subdirectory(Userland/Libraries/LibMain)
@ -580,7 +583,7 @@ if (BUILD_LAGOM)
add_serenity_subdirectory(Meta/Lagom/Contrib/VideoPlayerSDL) add_serenity_subdirectory(Meta/Lagom/Contrib/VideoPlayerSDL)
endif() endif()
lagom_utility(icc SOURCES ../../Userland/Utilities/icc.cpp LIBS LibGfx LibMain) lagom_utility(icc SOURCES ../../Userland/Utilities/icc.cpp LIBS LibGfx LibMain LibURL)
lagom_utility(image SOURCES ../../Userland/Utilities/image.cpp LIBS LibGfx LibMain) lagom_utility(image SOURCES ../../Userland/Utilities/image.cpp LIBS LibGfx LibMain)
lagom_utility(isobmff SOURCES ../../Userland/Utilities/isobmff.cpp LIBS LibGfx LibMain) lagom_utility(isobmff SOURCES ../../Userland/Utilities/isobmff.cpp LIBS LibGfx LibMain)
lagom_utility(ttfdisasm SOURCES ../../Userland/Utilities/ttfdisasm.cpp LIBS LibGfx LibMain) lagom_utility(ttfdisasm SOURCES ../../Userland/Utilities/ttfdisasm.cpp LIBS LibGfx LibMain)
@ -596,7 +599,7 @@ if (BUILD_LAGOM)
endif() endif()
lagom_utility(lzcat SOURCES ../../Userland/Utilities/lzcat.cpp LIBS LibCompress LibMain) lagom_utility(lzcat SOURCES ../../Userland/Utilities/lzcat.cpp LIBS LibCompress LibMain)
lagom_utility(markdown-check SOURCES ../../Userland/Utilities/markdown-check.cpp LIBS LibFileSystem LibMarkdown LibMain LibManual) lagom_utility(markdown-check SOURCES ../../Userland/Utilities/markdown-check.cpp LIBS LibFileSystem LibMarkdown LibMain LibManual LibURL)
lagom_utility(mkfs.fat SOURCES ../../Userland/Utilities/mkfs.fat.cpp LIBS LibFileSystem LibMain) lagom_utility(mkfs.fat SOURCES ../../Userland/Utilities/mkfs.fat.cpp LIBS LibFileSystem LibMain)
if (NOT EMSCRIPTEN) if (NOT EMSCRIPTEN)
@ -626,7 +629,7 @@ if (BUILD_LAGOM)
endif() endif()
lagom_utility(wasm SOURCES ../../Userland/Utilities/wasm.cpp LIBS LibFileSystem LibWasm LibLine LibMain LibJS) lagom_utility(wasm SOURCES ../../Userland/Utilities/wasm.cpp LIBS LibFileSystem LibWasm LibLine LibMain LibJS)
lagom_utility(xml SOURCES ../../Userland/Utilities/xml.cpp LIBS LibFileSystem LibMain LibXML) lagom_utility(xml SOURCES ../../Userland/Utilities/xml.cpp LIBS LibFileSystem LibMain LibXML LibURL)
lagom_utility(xzcat SOURCES ../../Userland/Utilities/xzcat.cpp LIBS LibCompress LibMain) lagom_utility(xzcat SOURCES ../../Userland/Utilities/xzcat.cpp LIBS LibCompress LibMain)
lagom_utility(fdtdump SOURCES ../../Userland/Utilities/fdtdump.cpp LIBS LibDeviceTree LibMain) lagom_utility(fdtdump SOURCES ../../Userland/Utilities/fdtdump.cpp LIBS LibDeviceTree LibMain)

View file

@ -5,7 +5,6 @@
*/ */
#include <AK/StringView.h> #include <AK/StringView.h>
#include <AK/URL.h>
#include <LibGemini/Document.h> #include <LibGemini/Document.h>
#include <stddef.h> #include <stddef.h>
#include <stdint.h> #include <stdint.h>

View file

@ -4,12 +4,12 @@
* SPDX-License-Identifier: BSD-2-Clause * SPDX-License-Identifier: BSD-2-Clause
*/ */
#include <AK/URL.h> #include <LibURL/URL.h>
extern "C" int LLVMFuzzerTestOneInput(uint8_t const* data, size_t size) extern "C" int LLVMFuzzerTestOneInput(uint8_t const* data, size_t size)
{ {
AK::set_debug_enabled(false); AK::set_debug_enabled(false);
auto string_view = StringView(data, size); auto string_view = StringView(data, size);
auto url = URL(string_view); auto url = URL::URL(string_view);
return 0; return 0;
} }

View file

@ -130,6 +130,7 @@ set(FUZZER_DEPENDENCIES_TGALoader LibGfx)
set(FUZZER_DEPENDENCIES_TIFFLoader LibGfx) set(FUZZER_DEPENDENCIES_TIFFLoader LibGfx)
set(FUZZER_DEPENDENCIES_TTF LibGfx) set(FUZZER_DEPENDENCIES_TTF LibGfx)
set(FUZZER_DEPENDENCIES_TinyVGLoader LibGfx) set(FUZZER_DEPENDENCIES_TinyVGLoader LibGfx)
set(FUZZER_DEPENDENCIES_URL LibURL)
set(FUZZER_DEPENDENCIES_VP9Decoder LibVideo) set(FUZZER_DEPENDENCIES_VP9Decoder LibVideo)
set(FUZZER_DEPENDENCIES_WasmParser LibWasm) set(FUZZER_DEPENDENCIES_WasmParser LibWasm)
set(FUZZER_DEPENDENCIES_WAVLoader LibAudio) set(FUZZER_DEPENDENCIES_WAVLoader LibAudio)

View file

@ -84,7 +84,6 @@ set(AK_TEST_SOURCES
TestTypeTraits.cpp TestTypeTraits.cpp
TestTypedTransfer.cpp TestTypedTransfer.cpp
TestUFixedBigInt.cpp TestUFixedBigInt.cpp
TestURL.cpp
TestUtf16.cpp TestUtf16.cpp
TestUtf8.cpp TestUtf8.cpp
TestVariant.cpp TestVariant.cpp

View file

@ -25,6 +25,7 @@ add_subdirectory(LibTextCodec)
add_subdirectory(LibThreading) add_subdirectory(LibThreading)
add_subdirectory(LibTimeZone) add_subdirectory(LibTimeZone)
add_subdirectory(LibUnicode) add_subdirectory(LibUnicode)
add_subdirectory(LibURL)
add_subdirectory(LibVideo) add_subdirectory(LibVideo)
add_subdirectory(LibWasm) add_subdirectory(LibWasm)
add_subdirectory(LibWeb) add_subdirectory(LibWeb)

View file

@ -0,0 +1,7 @@
set(URL_TEST_SOURCES
TestURL.cpp
)
foreach(source IN LISTS URL_TEST_SOURCES)
serenity_test("${source}" LibURL LIBS LibURL)
endforeach()

View file

@ -7,18 +7,18 @@
#include <LibTest/TestCase.h> #include <LibTest/TestCase.h>
#include <AK/URL.h> #include <LibURL/Parser.h>
#include <AK/URLParser.h> #include <LibURL/URL.h>
TEST_CASE(construct) TEST_CASE(construct)
{ {
EXPECT_EQ(URL().is_valid(), false); EXPECT_EQ(URL::URL().is_valid(), false);
} }
TEST_CASE(basic) TEST_CASE(basic)
{ {
{ {
URL url("http://www.serenityos.org"sv); URL::URL url("http://www.serenityos.org"sv);
EXPECT_EQ(url.is_valid(), true); EXPECT_EQ(url.is_valid(), true);
EXPECT_EQ(url.scheme(), "http"); EXPECT_EQ(url.scheme(), "http");
EXPECT_EQ(MUST(url.serialized_host()), "www.serenityos.org"); EXPECT_EQ(MUST(url.serialized_host()), "www.serenityos.org");
@ -28,7 +28,7 @@ TEST_CASE(basic)
EXPECT(!url.fragment().has_value()); EXPECT(!url.fragment().has_value());
} }
{ {
URL url("https://www.serenityos.org/index.html"sv); URL::URL url("https://www.serenityos.org/index.html"sv);
EXPECT_EQ(url.is_valid(), true); EXPECT_EQ(url.is_valid(), true);
EXPECT_EQ(url.scheme(), "https"); EXPECT_EQ(url.scheme(), "https");
EXPECT_EQ(MUST(url.serialized_host()), "www.serenityos.org"); EXPECT_EQ(MUST(url.serialized_host()), "www.serenityos.org");
@ -38,7 +38,7 @@ TEST_CASE(basic)
EXPECT(!url.fragment().has_value()); EXPECT(!url.fragment().has_value());
} }
{ {
URL url("https://www.serenityos.org1/index.html"sv); URL::URL url("https://www.serenityos.org1/index.html"sv);
EXPECT_EQ(url.is_valid(), true); EXPECT_EQ(url.is_valid(), true);
EXPECT_EQ(url.scheme(), "https"); EXPECT_EQ(url.scheme(), "https");
EXPECT_EQ(MUST(url.serialized_host()), "www.serenityos.org1"); EXPECT_EQ(MUST(url.serialized_host()), "www.serenityos.org1");
@ -48,7 +48,7 @@ TEST_CASE(basic)
EXPECT(!url.fragment().has_value()); EXPECT(!url.fragment().has_value());
} }
{ {
URL url("https://localhost:1234/~anon/test/page.html"sv); URL::URL url("https://localhost:1234/~anon/test/page.html"sv);
EXPECT_EQ(url.is_valid(), true); EXPECT_EQ(url.is_valid(), true);
EXPECT_EQ(url.scheme(), "https"); EXPECT_EQ(url.scheme(), "https");
EXPECT_EQ(MUST(url.serialized_host()), "localhost"); EXPECT_EQ(MUST(url.serialized_host()), "localhost");
@ -58,7 +58,7 @@ TEST_CASE(basic)
EXPECT(!url.fragment().has_value()); EXPECT(!url.fragment().has_value());
} }
{ {
URL url("http://www.serenityos.org/index.html?#"sv); URL::URL url("http://www.serenityos.org/index.html?#"sv);
EXPECT_EQ(url.is_valid(), true); EXPECT_EQ(url.is_valid(), true);
EXPECT_EQ(url.scheme(), "http"); EXPECT_EQ(url.scheme(), "http");
EXPECT_EQ(MUST(url.serialized_host()), "www.serenityos.org"); EXPECT_EQ(MUST(url.serialized_host()), "www.serenityos.org");
@ -68,7 +68,7 @@ TEST_CASE(basic)
EXPECT_EQ(url.fragment(), ""); EXPECT_EQ(url.fragment(), "");
} }
{ {
URL url("http://www.serenityos.org/index.html?foo=1&bar=2"sv); URL::URL url("http://www.serenityos.org/index.html?foo=1&bar=2"sv);
EXPECT_EQ(url.is_valid(), true); EXPECT_EQ(url.is_valid(), true);
EXPECT_EQ(url.scheme(), "http"); EXPECT_EQ(url.scheme(), "http");
EXPECT_EQ(MUST(url.serialized_host()), "www.serenityos.org"); EXPECT_EQ(MUST(url.serialized_host()), "www.serenityos.org");
@ -78,7 +78,7 @@ TEST_CASE(basic)
EXPECT(!url.fragment().has_value()); EXPECT(!url.fragment().has_value());
} }
{ {
URL url("http://www.serenityos.org/index.html#fragment"sv); URL::URL url("http://www.serenityos.org/index.html#fragment"sv);
EXPECT_EQ(url.is_valid(), true); EXPECT_EQ(url.is_valid(), true);
EXPECT_EQ(url.scheme(), "http"); EXPECT_EQ(url.scheme(), "http");
EXPECT_EQ(MUST(url.serialized_host()), "www.serenityos.org"); EXPECT_EQ(MUST(url.serialized_host()), "www.serenityos.org");
@ -88,7 +88,7 @@ TEST_CASE(basic)
EXPECT_EQ(url.fragment(), "fragment"); EXPECT_EQ(url.fragment(), "fragment");
} }
{ {
URL url("http://www.serenityos.org/index.html?foo=1&bar=2&baz=/?#frag/ment?test#"sv); URL::URL url("http://www.serenityos.org/index.html?foo=1&bar=2&baz=/?#frag/ment?test#"sv);
EXPECT_EQ(url.is_valid(), true); EXPECT_EQ(url.is_valid(), true);
EXPECT_EQ(url.scheme(), "http"); EXPECT_EQ(url.scheme(), "http");
EXPECT_EQ(MUST(url.serialized_host()), "www.serenityos.org"); EXPECT_EQ(MUST(url.serialized_host()), "www.serenityos.org");
@ -101,29 +101,29 @@ TEST_CASE(basic)
TEST_CASE(some_bad_urls) TEST_CASE(some_bad_urls)
{ {
EXPECT_EQ(URL("http//serenityos.org"sv).is_valid(), false); EXPECT_EQ(URL::URL("http//serenityos.org"sv).is_valid(), false);
EXPECT_EQ(URL("serenityos.org"sv).is_valid(), false); EXPECT_EQ(URL::URL("serenityos.org"sv).is_valid(), false);
EXPECT_EQ(URL("://serenityos.org"sv).is_valid(), false); EXPECT_EQ(URL::URL("://serenityos.org"sv).is_valid(), false);
EXPECT_EQ(URL("://:80"sv).is_valid(), false); EXPECT_EQ(URL::URL("://:80"sv).is_valid(), false);
EXPECT_EQ(URL("http://serenityos.org:80:80/"sv).is_valid(), false); EXPECT_EQ(URL::URL("http://serenityos.org:80:80/"sv).is_valid(), false);
EXPECT_EQ(URL("http://serenityos.org:80:80"sv).is_valid(), false); EXPECT_EQ(URL::URL("http://serenityos.org:80:80"sv).is_valid(), false);
EXPECT_EQ(URL("http://serenityos.org:abc"sv).is_valid(), false); EXPECT_EQ(URL::URL("http://serenityos.org:abc"sv).is_valid(), false);
EXPECT_EQ(URL("http://serenityos.org:abc:80"sv).is_valid(), false); EXPECT_EQ(URL::URL("http://serenityos.org:abc:80"sv).is_valid(), false);
EXPECT_EQ(URL("http://serenityos.org:abc:80/"sv).is_valid(), false); EXPECT_EQ(URL::URL("http://serenityos.org:abc:80/"sv).is_valid(), false);
} }
TEST_CASE(serialization) TEST_CASE(serialization)
{ {
EXPECT_EQ(URL("http://www.serenityos.org/"sv).serialize(), "http://www.serenityos.org/"); EXPECT_EQ(URL::URL("http://www.serenityos.org/"sv).serialize(), "http://www.serenityos.org/");
EXPECT_EQ(URL("http://www.serenityos.org:0/"sv).serialize(), "http://www.serenityos.org:0/"); EXPECT_EQ(URL::URL("http://www.serenityos.org:0/"sv).serialize(), "http://www.serenityos.org:0/");
EXPECT_EQ(URL("http://www.serenityos.org:80/"sv).serialize(), "http://www.serenityos.org/"); EXPECT_EQ(URL::URL("http://www.serenityos.org:80/"sv).serialize(), "http://www.serenityos.org/");
EXPECT_EQ(URL("http://www.serenityos.org:81/"sv).serialize(), "http://www.serenityos.org:81/"); EXPECT_EQ(URL::URL("http://www.serenityos.org:81/"sv).serialize(), "http://www.serenityos.org:81/");
EXPECT_EQ(URL("https://www.serenityos.org:443/foo/bar.html?query#fragment"sv).serialize(), "https://www.serenityos.org/foo/bar.html?query#fragment"); EXPECT_EQ(URL::URL("https://www.serenityos.org:443/foo/bar.html?query#fragment"sv).serialize(), "https://www.serenityos.org/foo/bar.html?query#fragment");
} }
TEST_CASE(file_url_with_hostname) TEST_CASE(file_url_with_hostname)
{ {
URL url("file://courage/my/file"sv); URL::URL url("file://courage/my/file"sv);
EXPECT(url.is_valid()); EXPECT(url.is_valid());
EXPECT_EQ(url.scheme(), "file"); EXPECT_EQ(url.scheme(), "file");
EXPECT_EQ(MUST(url.serialized_host()), "courage"); EXPECT_EQ(MUST(url.serialized_host()), "courage");
@ -136,7 +136,7 @@ TEST_CASE(file_url_with_hostname)
TEST_CASE(file_url_with_localhost) TEST_CASE(file_url_with_localhost)
{ {
URL url("file://localhost/my/file"sv); URL::URL url("file://localhost/my/file"sv);
EXPECT(url.is_valid()); EXPECT(url.is_valid());
EXPECT_EQ(url.scheme(), "file"); EXPECT_EQ(url.scheme(), "file");
EXPECT_EQ(MUST(url.serialized_host()), ""); EXPECT_EQ(MUST(url.serialized_host()), "");
@ -146,7 +146,7 @@ TEST_CASE(file_url_with_localhost)
TEST_CASE(file_url_without_hostname) TEST_CASE(file_url_without_hostname)
{ {
URL url("file:///my/file"sv); URL::URL url("file:///my/file"sv);
EXPECT(url.is_valid()); EXPECT(url.is_valid());
EXPECT_EQ(url.scheme(), "file"); EXPECT_EQ(url.scheme(), "file");
EXPECT_EQ(MUST(url.serialized_host()), ""); EXPECT_EQ(MUST(url.serialized_host()), "");
@ -156,7 +156,7 @@ TEST_CASE(file_url_without_hostname)
TEST_CASE(file_url_with_encoded_characters) TEST_CASE(file_url_with_encoded_characters)
{ {
URL url("file:///my/file/test%23file.txt"sv); URL::URL url("file:///my/file/test%23file.txt"sv);
EXPECT(url.is_valid()); EXPECT(url.is_valid());
EXPECT_EQ(url.scheme(), "file"); EXPECT_EQ(url.scheme(), "file");
EXPECT_EQ(url.serialize_path(), "/my/file/test#file.txt"); EXPECT_EQ(url.serialize_path(), "/my/file/test#file.txt");
@ -166,7 +166,7 @@ TEST_CASE(file_url_with_encoded_characters)
TEST_CASE(file_url_with_fragment) TEST_CASE(file_url_with_fragment)
{ {
URL url("file:///my/file#fragment"sv); URL::URL url("file:///my/file#fragment"sv);
EXPECT(url.is_valid()); EXPECT(url.is_valid());
EXPECT_EQ(url.scheme(), "file"); EXPECT_EQ(url.scheme(), "file");
EXPECT_EQ(url.serialize_path(), "/my/file"); EXPECT_EQ(url.serialize_path(), "/my/file");
@ -176,7 +176,7 @@ TEST_CASE(file_url_with_fragment)
TEST_CASE(file_url_with_root_path) TEST_CASE(file_url_with_root_path)
{ {
URL url("file:///"sv); URL::URL url("file:///"sv);
EXPECT(url.is_valid()); EXPECT(url.is_valid());
EXPECT_EQ(url.scheme(), "file"); EXPECT_EQ(url.scheme(), "file");
EXPECT_EQ(url.serialize_path(), "/"); EXPECT_EQ(url.serialize_path(), "/");
@ -184,23 +184,23 @@ TEST_CASE(file_url_with_root_path)
TEST_CASE(file_url_serialization) TEST_CASE(file_url_serialization)
{ {
EXPECT_EQ(URL("file://courage/my/file"sv).serialize(), "file://courage/my/file"); EXPECT_EQ(URL::URL("file://courage/my/file"sv).serialize(), "file://courage/my/file");
EXPECT_EQ(URL("file://localhost/my/file"sv).serialize(), "file:///my/file"); EXPECT_EQ(URL::URL("file://localhost/my/file"sv).serialize(), "file:///my/file");
EXPECT_EQ(URL("file:///my/file"sv).serialize(), "file:///my/file"); EXPECT_EQ(URL::URL("file:///my/file"sv).serialize(), "file:///my/file");
EXPECT_EQ(URL("file:///my/directory/"sv).serialize(), "file:///my/directory/"); EXPECT_EQ(URL::URL("file:///my/directory/"sv).serialize(), "file:///my/directory/");
EXPECT_EQ(URL("file:///my/file%23test"sv).serialize(), "file:///my/file%23test"); EXPECT_EQ(URL::URL("file:///my/file%23test"sv).serialize(), "file:///my/file%23test");
EXPECT_EQ(URL("file:///my/file#fragment"sv).serialize(), "file:///my/file#fragment"); EXPECT_EQ(URL::URL("file:///my/file#fragment"sv).serialize(), "file:///my/file#fragment");
} }
TEST_CASE(file_url_relative) TEST_CASE(file_url_relative)
{ {
EXPECT_EQ(URL("https://vkoskiv.com/index.html"sv).complete_url("/static/foo.js"sv).serialize(), "https://vkoskiv.com/static/foo.js"); EXPECT_EQ(URL::URL("https://vkoskiv.com/index.html"sv).complete_url("/static/foo.js"sv).serialize(), "https://vkoskiv.com/static/foo.js");
EXPECT_EQ(URL("file:///home/vkoskiv/test/index.html"sv).complete_url("/static/foo.js"sv).serialize(), "file:///home/vkoskiv/test/static/foo.js"); EXPECT_EQ(URL::URL("file:///home/vkoskiv/test/index.html"sv).complete_url("/static/foo.js"sv).serialize(), "file:///home/vkoskiv/test/static/foo.js");
} }
TEST_CASE(about_url) TEST_CASE(about_url)
{ {
URL url("about:blank"sv); URL::URL url("about:blank"sv);
EXPECT(url.is_valid()); EXPECT(url.is_valid());
EXPECT_EQ(url.scheme(), "about"); EXPECT_EQ(url.scheme(), "about");
EXPECT(url.host().has<Empty>()); EXPECT(url.host().has<Empty>());
@ -212,7 +212,7 @@ TEST_CASE(about_url)
TEST_CASE(mailto_url) TEST_CASE(mailto_url)
{ {
URL url("mailto:mail@example.com"sv); URL::URL url("mailto:mail@example.com"sv);
EXPECT(url.is_valid()); EXPECT(url.is_valid());
EXPECT_EQ(url.scheme(), "mailto"); EXPECT_EQ(url.scheme(), "mailto");
EXPECT(url.host().has<Empty>()); EXPECT(url.host().has<Empty>());
@ -226,7 +226,7 @@ TEST_CASE(mailto_url)
TEST_CASE(mailto_url_with_subject) TEST_CASE(mailto_url_with_subject)
{ {
URL url("mailto:mail@example.com?subject=test"sv); URL::URL url("mailto:mail@example.com?subject=test"sv);
EXPECT(url.is_valid()); EXPECT(url.is_valid());
EXPECT_EQ(url.scheme(), "mailto"); EXPECT_EQ(url.scheme(), "mailto");
EXPECT(url.host().has<Empty>()); EXPECT(url.host().has<Empty>());
@ -240,7 +240,7 @@ TEST_CASE(mailto_url_with_subject)
TEST_CASE(data_url) TEST_CASE(data_url)
{ {
URL url("data:text/html,test"sv); URL::URL url("data:text/html,test"sv);
EXPECT(url.is_valid()); EXPECT(url.is_valid());
EXPECT_EQ(url.scheme(), "data"); EXPECT_EQ(url.scheme(), "data");
EXPECT(url.host().has<Empty>()); EXPECT(url.host().has<Empty>());
@ -253,7 +253,7 @@ TEST_CASE(data_url)
TEST_CASE(data_url_default_mime_type) TEST_CASE(data_url_default_mime_type)
{ {
URL url("data:,test"sv); URL::URL url("data:,test"sv);
EXPECT(url.is_valid()); EXPECT(url.is_valid());
EXPECT_EQ(url.scheme(), "data"); EXPECT_EQ(url.scheme(), "data");
EXPECT(url.host().has<Empty>()); EXPECT(url.host().has<Empty>());
@ -266,7 +266,7 @@ TEST_CASE(data_url_default_mime_type)
TEST_CASE(data_url_encoded) TEST_CASE(data_url_encoded)
{ {
URL url("data:text/html,Hello%20friends%2C%0X%X0"sv); URL::URL url("data:text/html,Hello%20friends%2C%0X%X0"sv);
EXPECT(url.is_valid()); EXPECT(url.is_valid());
EXPECT_EQ(url.scheme(), "data"); EXPECT_EQ(url.scheme(), "data");
EXPECT(url.host().has<Empty>()); EXPECT(url.host().has<Empty>());
@ -279,7 +279,7 @@ TEST_CASE(data_url_encoded)
TEST_CASE(data_url_base64_encoded) TEST_CASE(data_url_base64_encoded)
{ {
URL url("data:text/html;base64,dGVzdA=="sv); URL::URL url("data:text/html;base64,dGVzdA=="sv);
EXPECT(url.is_valid()); EXPECT(url.is_valid());
EXPECT_EQ(url.scheme(), "data"); EXPECT_EQ(url.scheme(), "data");
EXPECT(url.host().has<Empty>()); EXPECT(url.host().has<Empty>());
@ -292,7 +292,7 @@ TEST_CASE(data_url_base64_encoded)
TEST_CASE(data_url_base64_encoded_default_mime_type) TEST_CASE(data_url_base64_encoded_default_mime_type)
{ {
URL url("data:;base64,dGVzdA=="sv); URL::URL url("data:;base64,dGVzdA=="sv);
EXPECT(url.is_valid()); EXPECT(url.is_valid());
EXPECT_EQ(url.scheme(), "data"); EXPECT_EQ(url.scheme(), "data");
EXPECT(url.host().has<Empty>()); EXPECT(url.host().has<Empty>());
@ -305,7 +305,7 @@ TEST_CASE(data_url_base64_encoded_default_mime_type)
TEST_CASE(data_url_base64_encoded_with_whitespace) TEST_CASE(data_url_base64_encoded_with_whitespace)
{ {
URL url("data: text/html ; bAsE64 , dGVz dA== "sv); URL::URL url("data: text/html ; bAsE64 , dGVz dA== "sv);
EXPECT(url.is_valid()); EXPECT(url.is_valid());
EXPECT_EQ(url.scheme(), "data"); EXPECT_EQ(url.scheme(), "data");
EXPECT(url.host().has<Empty>()); EXPECT(url.host().has<Empty>());
@ -318,7 +318,7 @@ TEST_CASE(data_url_base64_encoded_with_whitespace)
TEST_CASE(data_url_base64_encoded_with_inline_whitespace) TEST_CASE(data_url_base64_encoded_with_inline_whitespace)
{ {
URL url("data:text/javascript;base64,%20ZD%20Qg%0D%0APS%20An%20Zm91cic%0D%0A%207%20"sv); URL::URL url("data:text/javascript;base64,%20ZD%20Qg%0D%0APS%20An%20Zm91cic%0D%0A%207%20"sv);
EXPECT(url.is_valid()); EXPECT(url.is_valid());
EXPECT_EQ(url.scheme(), "data"); EXPECT_EQ(url.scheme(), "data");
EXPECT(url.host().has<Empty>()); EXPECT(url.host().has<Empty>());
@ -330,7 +330,7 @@ TEST_CASE(data_url_base64_encoded_with_inline_whitespace)
TEST_CASE(data_url_completed_with_fragment) TEST_CASE(data_url_completed_with_fragment)
{ {
auto url = URL("data:text/plain,test"sv).complete_url("#a"sv); auto url = URL::URL("data:text/plain,test"sv).complete_url("#a"sv);
EXPECT(url.is_valid()); EXPECT(url.is_valid());
EXPECT_EQ(url.scheme(), "data"); EXPECT_EQ(url.scheme(), "data");
EXPECT_EQ(url.fragment(), "a"); EXPECT_EQ(url.fragment(), "a");
@ -343,29 +343,29 @@ TEST_CASE(data_url_completed_with_fragment)
TEST_CASE(trailing_slash_with_complete_url) TEST_CASE(trailing_slash_with_complete_url)
{ {
EXPECT_EQ(URL("http://a/b/"sv).complete_url("c/"sv).serialize(), "http://a/b/c/"); EXPECT_EQ(URL::URL("http://a/b/"sv).complete_url("c/"sv).serialize(), "http://a/b/c/");
EXPECT_EQ(URL("http://a/b/"sv).complete_url("c"sv).serialize(), "http://a/b/c"); EXPECT_EQ(URL::URL("http://a/b/"sv).complete_url("c"sv).serialize(), "http://a/b/c");
EXPECT_EQ(URL("http://a/b"sv).complete_url("c/"sv).serialize(), "http://a/c/"); EXPECT_EQ(URL::URL("http://a/b"sv).complete_url("c/"sv).serialize(), "http://a/c/");
EXPECT_EQ(URL("http://a/b"sv).complete_url("c"sv).serialize(), "http://a/c"); EXPECT_EQ(URL::URL("http://a/b"sv).complete_url("c"sv).serialize(), "http://a/c");
} }
TEST_CASE(trailing_port) TEST_CASE(trailing_port)
{ {
URL url("http://example.com:8086"sv); URL::URL url("http://example.com:8086"sv);
EXPECT_EQ(url.port_or_default(), 8086); EXPECT_EQ(url.port_or_default(), 8086);
} }
TEST_CASE(port_overflow) TEST_CASE(port_overflow)
{ {
EXPECT_EQ(URL("http://example.com:123456789/"sv).is_valid(), false); EXPECT_EQ(URL::URL("http://example.com:123456789/"sv).is_valid(), false);
} }
TEST_CASE(equality) TEST_CASE(equality)
{ {
EXPECT(URL("http://serenityos.org"sv).equals("http://serenityos.org#test"sv, URL::ExcludeFragment::Yes)); EXPECT(URL::URL("http://serenityos.org"sv).equals("http://serenityos.org#test"sv, URL::ExcludeFragment::Yes));
EXPECT_EQ(URL("http://example.com/index.html"sv), URL("http://ex%61mple.com/index.html"sv)); EXPECT_EQ(URL::URL("http://example.com/index.html"sv), URL::URL("http://ex%61mple.com/index.html"sv));
EXPECT_EQ(URL("file:///my/file"sv), URL("file://localhost/my/file"sv)); EXPECT_EQ(URL::URL("file:///my/file"sv), URL::URL("file://localhost/my/file"sv));
EXPECT_NE(URL("http://serenityos.org/index.html"sv), URL("http://serenityos.org/test.html"sv)); EXPECT_NE(URL::URL("http://serenityos.org/index.html"sv), URL::URL("http://serenityos.org/test.html"sv));
} }
TEST_CASE(create_with_file_scheme) TEST_CASE(create_with_file_scheme)
@ -390,14 +390,14 @@ TEST_CASE(create_with_file_scheme)
EXPECT_EQ(url.path_segment_at_index(2), ""); EXPECT_EQ(url.path_segment_at_index(2), "");
EXPECT_EQ(url.serialize_path(), "/home/anon/"); EXPECT_EQ(url.serialize_path(), "/home/anon/");
url = URL("file:///home/anon/"sv); url = URL::URL("file:///home/anon/"sv);
EXPECT_EQ(url.serialize_path(), "/home/anon/"); EXPECT_EQ(url.serialize_path(), "/home/anon/");
} }
TEST_CASE(complete_url) TEST_CASE(complete_url)
{ {
URL base_url("http://serenityos.org/index.html#fragment"sv); URL::URL base_url("http://serenityos.org/index.html#fragment"sv);
URL url = base_url.complete_url("test.html"sv); URL::URL url = base_url.complete_url("test.html"sv);
EXPECT(url.is_valid()); EXPECT(url.is_valid());
EXPECT_EQ(url.scheme(), "http"); EXPECT_EQ(url.scheme(), "http");
EXPECT_EQ(MUST(url.serialized_host()), "serenityos.org"); EXPECT_EQ(MUST(url.serialized_host()), "serenityos.org");
@ -410,28 +410,28 @@ TEST_CASE(complete_url)
TEST_CASE(leading_whitespace) TEST_CASE(leading_whitespace)
{ {
URL url { " https://foo.com/"sv }; URL::URL url { " https://foo.com/"sv };
EXPECT(url.is_valid()); EXPECT(url.is_valid());
EXPECT_EQ(url.to_byte_string(), "https://foo.com/"); EXPECT_EQ(url.to_byte_string(), "https://foo.com/");
} }
TEST_CASE(trailing_whitespace) TEST_CASE(trailing_whitespace)
{ {
URL url { "https://foo.com/ "sv }; URL::URL url { "https://foo.com/ "sv };
EXPECT(url.is_valid()); EXPECT(url.is_valid());
EXPECT_EQ(url.to_byte_string(), "https://foo.com/"); EXPECT_EQ(url.to_byte_string(), "https://foo.com/");
} }
TEST_CASE(leading_and_trailing_whitespace) TEST_CASE(leading_and_trailing_whitespace)
{ {
URL url { " https://foo.com/ "sv }; URL::URL url { " https://foo.com/ "sv };
EXPECT(url.is_valid()); EXPECT(url.is_valid());
EXPECT_EQ(url.to_byte_string(), "https://foo.com/"); EXPECT_EQ(url.to_byte_string(), "https://foo.com/");
} }
TEST_CASE(unicode) TEST_CASE(unicode)
{ {
URL url { "http://example.com/_ünicöde_téxt_©"sv }; URL::URL url { "http://example.com/_ünicöde_téxt_©"sv };
EXPECT(url.is_valid()); EXPECT(url.is_valid());
EXPECT_EQ(url.serialize_path(), "/_ünicöde_téxt_©"); EXPECT_EQ(url.serialize_path(), "/_ünicöde_téxt_©");
EXPECT(!url.query().has_value()); EXPECT(!url.query().has_value());
@ -440,7 +440,7 @@ TEST_CASE(unicode)
TEST_CASE(query_with_non_ascii) TEST_CASE(query_with_non_ascii)
{ {
URL url { "http://example.com/?utf8=✓"sv }; URL::URL url { "http://example.com/?utf8=✓"sv };
EXPECT(url.is_valid()); EXPECT(url.is_valid());
EXPECT_EQ(url.serialize_path(), "/"sv); EXPECT_EQ(url.serialize_path(), "/"sv);
EXPECT_EQ(url.query(), "utf8=%E2%9C%93"); EXPECT_EQ(url.query(), "utf8=%E2%9C%93");
@ -449,7 +449,7 @@ TEST_CASE(query_with_non_ascii)
TEST_CASE(complete_file_url_with_base) TEST_CASE(complete_file_url_with_base)
{ {
URL url { "file:///home/index.html" }; URL::URL url { "file:///home/index.html" };
EXPECT(url.is_valid()); EXPECT(url.is_valid());
EXPECT_EQ(url.serialize_path(), "/home/index.html"); EXPECT_EQ(url.serialize_path(), "/home/index.html");
EXPECT_EQ(url.path_segment_count(), 2u); EXPECT_EQ(url.path_segment_count(), 2u);
@ -463,8 +463,8 @@ TEST_CASE(complete_file_url_with_base)
TEST_CASE(empty_url_with_base_url) TEST_CASE(empty_url_with_base_url)
{ {
URL base_url { "https://foo.com/"sv }; URL::URL base_url { "https://foo.com/"sv };
URL parsed_url = URLParser::basic_parse(""sv, base_url); URL::URL parsed_url = URL::Parser::basic_parse(""sv, base_url);
EXPECT_EQ(parsed_url.is_valid(), true); EXPECT_EQ(parsed_url.is_valid(), true);
EXPECT(base_url.equals(parsed_url)); EXPECT(base_url.equals(parsed_url));
} }
@ -472,7 +472,7 @@ TEST_CASE(empty_url_with_base_url)
TEST_CASE(google_street_view) TEST_CASE(google_street_view)
{ {
constexpr auto streetview_url = "https://www.google.co.uk/maps/@53.3354159,-1.9573545,3a,75y,121.1h,75.67t/data=!3m7!1e1!3m5!1sSY8xCv17jAX4S7SRdV38hg!2e0!6shttps:%2F%2Fstreetviewpixels-pa.googleapis.com%2Fv1%2Fthumbnail%3Fpanoid%3DSY8xCv17jAX4S7SRdV38hg%26cb_client%3Dmaps_sv.tactile.gps%26w%3D203%26h%3D100%26yaw%3D188.13148%26pitch%3D0%26thumbfov%3D100!7i13312!8i6656"; constexpr auto streetview_url = "https://www.google.co.uk/maps/@53.3354159,-1.9573545,3a,75y,121.1h,75.67t/data=!3m7!1e1!3m5!1sSY8xCv17jAX4S7SRdV38hg!2e0!6shttps:%2F%2Fstreetviewpixels-pa.googleapis.com%2Fv1%2Fthumbnail%3Fpanoid%3DSY8xCv17jAX4S7SRdV38hg%26cb_client%3Dmaps_sv.tactile.gps%26w%3D203%26h%3D100%26yaw%3D188.13148%26pitch%3D0%26thumbfov%3D100!7i13312!8i6656";
URL url(streetview_url); URL::URL url(streetview_url);
EXPECT_EQ(url.serialize(), streetview_url); EXPECT_EQ(url.serialize(), streetview_url);
} }
@ -480,7 +480,7 @@ TEST_CASE(ipv6_address)
{ {
{ {
constexpr auto ipv6_url = "http://[::1]/index.html"sv; constexpr auto ipv6_url = "http://[::1]/index.html"sv;
URL url(ipv6_url); URL::URL url(ipv6_url);
EXPECT(url.is_valid()); EXPECT(url.is_valid());
EXPECT_EQ(MUST(url.serialized_host()), "[::1]"sv); EXPECT_EQ(MUST(url.serialized_host()), "[::1]"sv);
EXPECT_EQ(url, ipv6_url); EXPECT_EQ(url, ipv6_url);
@ -488,7 +488,7 @@ TEST_CASE(ipv6_address)
{ {
constexpr auto ipv6_url = "http://[0:f:0:0:f:f:0:0]/index.html"sv; constexpr auto ipv6_url = "http://[0:f:0:0:f:f:0:0]/index.html"sv;
URL url(ipv6_url); URL::URL url(ipv6_url);
EXPECT(url.is_valid()); EXPECT(url.is_valid());
EXPECT_EQ(MUST(url.serialized_host()), "[0:f::f:f:0:0]"sv); EXPECT_EQ(MUST(url.serialized_host()), "[0:f::f:f:0:0]"sv);
EXPECT_EQ(url, ipv6_url); EXPECT_EQ(url, ipv6_url);
@ -496,7 +496,7 @@ TEST_CASE(ipv6_address)
{ {
constexpr auto ipv6_url = "https://[2001:0db8:85a3:0000:0000:8a2e:0370:7334]/index.html"sv; constexpr auto ipv6_url = "https://[2001:0db8:85a3:0000:0000:8a2e:0370:7334]/index.html"sv;
URL url(ipv6_url); URL::URL url(ipv6_url);
EXPECT(url.is_valid()); EXPECT(url.is_valid());
EXPECT_EQ(MUST(url.serialized_host()), "[2001:db8:85a3::8a2e:370:7334]"sv); EXPECT_EQ(MUST(url.serialized_host()), "[2001:db8:85a3::8a2e:370:7334]"sv);
EXPECT_EQ(url, ipv6_url); EXPECT_EQ(url, ipv6_url);
@ -504,7 +504,7 @@ TEST_CASE(ipv6_address)
{ {
constexpr auto bad_ipv6_url = "https://[oops]/index.html"sv; constexpr auto bad_ipv6_url = "https://[oops]/index.html"sv;
URL url(bad_ipv6_url); URL::URL url(bad_ipv6_url);
EXPECT_EQ(url.is_valid(), false); EXPECT_EQ(url.is_valid(), false);
} }
} }
@ -513,41 +513,41 @@ TEST_CASE(ipv4_address)
{ {
{ {
constexpr auto ipv4_url = "http://127.0.0.1/index.html"sv; constexpr auto ipv4_url = "http://127.0.0.1/index.html"sv;
URL url(ipv4_url); URL::URL url(ipv4_url);
EXPECT(url.is_valid()); EXPECT(url.is_valid());
EXPECT_EQ(MUST(url.serialized_host()), "127.0.0.1"sv); EXPECT_EQ(MUST(url.serialized_host()), "127.0.0.1"sv);
} }
{ {
constexpr auto ipv4_url = "http://0x.0x.0"sv; constexpr auto ipv4_url = "http://0x.0x.0"sv;
URL url(ipv4_url); URL::URL url(ipv4_url);
EXPECT(url.is_valid()); EXPECT(url.is_valid());
EXPECT_EQ(MUST(url.serialized_host()), "0.0.0.0"sv); EXPECT_EQ(MUST(url.serialized_host()), "0.0.0.0"sv);
} }
{ {
constexpr auto bad_ipv4_url = "https://127..0.0.1"sv; constexpr auto bad_ipv4_url = "https://127..0.0.1"sv;
URL url(bad_ipv4_url); URL::URL url(bad_ipv4_url);
EXPECT(!url.is_valid()); EXPECT(!url.is_valid());
} }
{ {
constexpr auto ipv4_url = "http://256"sv; constexpr auto ipv4_url = "http://256"sv;
URL url(ipv4_url); URL::URL url(ipv4_url);
EXPECT(url.is_valid()); EXPECT(url.is_valid());
EXPECT_EQ(MUST(url.serialized_host()), "0.0.1.0"sv); EXPECT_EQ(MUST(url.serialized_host()), "0.0.1.0"sv);
} }
{ {
constexpr auto ipv4_url = "http://888888888"sv; constexpr auto ipv4_url = "http://888888888"sv;
URL url(ipv4_url); URL::URL url(ipv4_url);
EXPECT(url.is_valid()); EXPECT(url.is_valid());
EXPECT_EQ(MUST(url.serialized_host()), "52.251.94.56"sv); EXPECT_EQ(MUST(url.serialized_host()), "52.251.94.56"sv);
} }
{ {
constexpr auto ipv4_url = "http://9111111111"sv; constexpr auto ipv4_url = "http://9111111111"sv;
URL url(ipv4_url); URL::URL url(ipv4_url);
EXPECT(!url.is_valid()); EXPECT(!url.is_valid());
} }
} }
@ -556,7 +556,7 @@ TEST_CASE(username_and_password)
{ {
{ {
constexpr auto url_with_username_and_password = "http://username:password@test.com/index.html"sv; constexpr auto url_with_username_and_password = "http://username:password@test.com/index.html"sv;
URL url(url_with_username_and_password); URL::URL url(url_with_username_and_password);
EXPECT(url.is_valid()); EXPECT(url.is_valid());
EXPECT_EQ(MUST(url.serialized_host()), "test.com"sv); EXPECT_EQ(MUST(url.serialized_host()), "test.com"sv);
EXPECT_EQ(MUST(url.username()), "username"sv); EXPECT_EQ(MUST(url.username()), "username"sv);
@ -565,7 +565,7 @@ TEST_CASE(username_and_password)
{ {
constexpr auto url_with_percent_encoded_credentials = "http://username%21%24%25:password%21%24%25@test.com/index.html"sv; constexpr auto url_with_percent_encoded_credentials = "http://username%21%24%25:password%21%24%25@test.com/index.html"sv;
URL url(url_with_percent_encoded_credentials); URL::URL url(url_with_percent_encoded_credentials);
EXPECT(url.is_valid()); EXPECT(url.is_valid());
EXPECT_EQ(MUST(url.serialized_host()), "test.com"sv); EXPECT_EQ(MUST(url.serialized_host()), "test.com"sv);
EXPECT_EQ(MUST(url.username()), "username!$%"sv); EXPECT_EQ(MUST(url.username()), "username!$%"sv);
@ -575,7 +575,7 @@ TEST_CASE(username_and_password)
{ {
auto const& username = MUST(String::repeated('a', 50000)); auto const& username = MUST(String::repeated('a', 50000));
auto const& url_with_long_username = MUST(String::formatted("http://{}:@test.com/index.html", username)); auto const& url_with_long_username = MUST(String::formatted("http://{}:@test.com/index.html", username));
URL url(url_with_long_username); URL::URL url(url_with_long_username);
EXPECT(url.is_valid()); EXPECT(url.is_valid());
EXPECT_EQ(MUST(url.serialized_host()), "test.com"sv); EXPECT_EQ(MUST(url.serialized_host()), "test.com"sv);
EXPECT_EQ(MUST(url.username()), username); EXPECT_EQ(MUST(url.username()), username);
@ -585,7 +585,7 @@ TEST_CASE(username_and_password)
{ {
auto const& password = MUST(String::repeated('a', 50000)); auto const& password = MUST(String::repeated('a', 50000));
auto const& url_with_long_password = MUST(String::formatted("http://:{}@test.com/index.html", password)); auto const& url_with_long_password = MUST(String::formatted("http://:{}@test.com/index.html", password));
URL url(url_with_long_password); URL::URL url(url_with_long_password);
EXPECT(url.is_valid()); EXPECT(url.is_valid());
EXPECT_EQ(MUST(url.serialized_host()), "test.com"sv); EXPECT_EQ(MUST(url.serialized_host()), "test.com"sv);
EXPECT(MUST(url.username()).is_empty()); EXPECT(MUST(url.username()).is_empty());

View file

@ -3,5 +3,5 @@ set(TEST_SOURCES
) )
foreach(source IN LISTS TEST_SOURCES) foreach(source IN LISTS TEST_SOURCES)
serenity_test("${source}" LibWebView LIBS LibWebView) serenity_test("${source}" LibWebView LIBS LibWebView LibURL)
endforeach() endforeach()

View file

@ -12,4 +12,4 @@ set(SOURCES
) )
serenity_app(3DFileViewer ICON app-3d-file-viewer) serenity_app(3DFileViewer ICON app-3d-file-viewer)
target_link_libraries(3DFileViewer PRIVATE LibCore LibDesktop LibGfx LibGUI LibGL LibFileSystemAccessClient LibMain) target_link_libraries(3DFileViewer PRIVATE LibCore LibDesktop LibGfx LibGUI LibGL LibFileSystemAccessClient LibMain LibURL)

View file

@ -10,4 +10,4 @@ set(SOURCES
) )
serenity_app(Assistant ICON app-assistant) serenity_app(Assistant ICON app-assistant)
target_link_libraries(Assistant PRIVATE LibCore LibDesktop LibGfx LibGUI LibJS LibMain LibThreading) target_link_libraries(Assistant PRIVATE LibCore LibDesktop LibGfx LibGUI LibJS LibMain LibThreading LibURL)

View file

@ -8,7 +8,6 @@
#include <AK/BinaryHeap.h> #include <AK/BinaryHeap.h>
#include <AK/FuzzyMatch.h> #include <AK/FuzzyMatch.h>
#include <AK/LexicalPath.h> #include <AK/LexicalPath.h>
#include <AK/URL.h>
#include <LibCore/Directory.h> #include <LibCore/Directory.h>
#include <LibCore/ElapsedTimer.h> #include <LibCore/ElapsedTimer.h>
#include <LibCore/StandardPaths.h> #include <LibCore/StandardPaths.h>
@ -20,6 +19,7 @@
#include <LibJS/Runtime/GlobalObject.h> #include <LibJS/Runtime/GlobalObject.h>
#include <LibJS/Runtime/ValueInlines.h> #include <LibJS/Runtime/ValueInlines.h>
#include <LibJS/Script.h> #include <LibJS/Script.h>
#include <LibURL/URL.h>
#include <errno.h> #include <errno.h>
#include <fcntl.h> #include <fcntl.h>
#include <serenity.h> #include <serenity.h>
@ -261,7 +261,7 @@ void URLProvider::query(ByteString const& query, Function<void(Vector<NonnullRef
if (query.is_empty() || query.starts_with('=') || query.starts_with('$')) if (query.is_empty() || query.starts_with('=') || query.starts_with('$'))
return; return;
URL url = URL(query); URL::URL url = URL::URL(query);
if (url.scheme().is_empty()) if (url.scheme().is_empty())
url.set_scheme("http"_string); url.set_scheme("http"_string);

View file

@ -8,12 +8,12 @@
#include <AK/ByteString.h> #include <AK/ByteString.h>
#include <AK/Queue.h> #include <AK/Queue.h>
#include <AK/URL.h>
#include <LibDesktop/AppFile.h> #include <LibDesktop/AppFile.h>
#include <LibGUI/Desktop.h> #include <LibGUI/Desktop.h>
#include <LibGUI/Window.h> #include <LibGUI/Window.h>
#include <LibJS/Runtime/VM.h> #include <LibJS/Runtime/VM.h>
#include <LibThreading/BackgroundAction.h> #include <LibThreading/BackgroundAction.h>
#include <LibURL/URL.h>
#include <typeinfo> #include <typeinfo>
namespace Assistant { namespace Assistant {
@ -118,7 +118,7 @@ private:
class URLResult final : public Result { class URLResult final : public Result {
public: public:
explicit URLResult(const URL& url) explicit URLResult(const URL::URL& url)
: Result(url.to_byte_string(), "Open URL in Browser"_string, 50) : Result(url.to_byte_string(), "Open URL in Browser"_string, 50)
, m_bitmap(GUI::Icon::default_icon("app-browser"sv).bitmap_for_size(16)) , m_bitmap(GUI::Icon::default_icon("app-browser"sv).bitmap_for_size(16))
{ {

View file

@ -50,7 +50,7 @@ static ByteString bookmarks_file_path()
return builder.to_byte_string(); return builder.to_byte_string();
} }
BrowserWindow::BrowserWindow(WebView::CookieJar& cookie_jar, Vector<URL> const& initial_urls, StringView const man_file) BrowserWindow::BrowserWindow(WebView::CookieJar& cookie_jar, Vector<URL::URL> const& initial_urls, StringView const man_file)
: m_cookie_jar(cookie_jar) : m_cookie_jar(cookie_jar)
, m_window_actions(*this) , m_window_actions(*this)
{ {
@ -278,7 +278,7 @@ void BrowserWindow::build_menus(StringView const man_file)
"Set Homepage URL...", g_icon_bag.go_home, [this](auto&) { "Set Homepage URL...", g_icon_bag.go_home, [this](auto&) {
String homepage_url = String::from_byte_string(Config::read_string("Browser"sv, "Preferences"sv, "Home"sv, Browser::default_homepage_url)).release_value_but_fixme_should_propagate_errors(); String homepage_url = String::from_byte_string(Config::read_string("Browser"sv, "Preferences"sv, "Home"sv, Browser::default_homepage_url)).release_value_but_fixme_should_propagate_errors();
if (GUI::InputBox::show(this, homepage_url, "Enter a URL:"sv, "Change Homepage"sv) == GUI::InputBox::ExecResult::OK) { if (GUI::InputBox::show(this, homepage_url, "Enter a URL:"sv, "Change Homepage"sv) == GUI::InputBox::ExecResult::OK) {
if (URL(homepage_url).is_valid()) { if (URL::URL(homepage_url).is_valid()) {
Config::write_string("Browser"sv, "Preferences"sv, "Home"sv, homepage_url); Config::write_string("Browser"sv, "Preferences"sv, "Home"sv, homepage_url);
Browser::g_home_url = homepage_url.to_byte_string(); Browser::g_home_url = homepage_url.to_byte_string();
} else { } else {
@ -531,7 +531,7 @@ void BrowserWindow::set_window_title_for_tab(Tab const& tab)
set_title(ByteString::formatted("{} - Ladybird", title.is_empty() ? url.to_byte_string() : title)); set_title(ByteString::formatted("{} - Ladybird", title.is_empty() ? url.to_byte_string() : title));
} }
Tab& BrowserWindow::create_new_tab(URL const& url, Web::HTML::ActivateTab activate) Tab& BrowserWindow::create_new_tab(URL::URL const& url, Web::HTML::ActivateTab activate)
{ {
auto& new_tab = m_tab_widget->add_tab<Browser::Tab>("New tab"_string, *this); auto& new_tab = m_tab_widget->add_tab<Browser::Tab>("New tab"_string, *this);
@ -618,7 +618,7 @@ Tab& BrowserWindow::create_new_tab(URL const& url, Web::HTML::ActivateTab activa
return new_tab; return new_tab;
} }
void BrowserWindow::create_new_window(URL const& url) void BrowserWindow::create_new_window(URL::URL const& url)
{ {
GUI::Process::spawn_or_show_error(this, "/bin/Browser"sv, Array { url.to_byte_string() }); GUI::Process::spawn_or_show_error(this, "/bin/Browser"sv, Array { url.to_byte_string() });
} }

View file

@ -29,8 +29,8 @@ public:
GUI::TabWidget& tab_widget(); GUI::TabWidget& tab_widget();
Tab& active_tab(); Tab& active_tab();
Tab& create_new_tab(URL const&, Web::HTML::ActivateTab activate); Tab& create_new_tab(URL::URL const&, Web::HTML::ActivateTab activate);
void create_new_window(URL const&); void create_new_window(URL::URL const&);
GUI::Action& go_back_action() { return *m_go_back_action; } GUI::Action& go_back_action() { return *m_go_back_action; }
GUI::Action& go_forward_action() { return *m_go_forward_action; } GUI::Action& go_forward_action() { return *m_go_forward_action; }
@ -51,7 +51,7 @@ public:
void broadcast_window_size(Gfx::IntSize); void broadcast_window_size(Gfx::IntSize);
private: private:
BrowserWindow(WebView::CookieJar&, Vector<URL> const&, StringView const); BrowserWindow(WebView::CookieJar&, Vector<URL::URL> const&, StringView const);
void build_menus(StringView const); void build_menus(StringView const);
ErrorOr<void> load_search_engines(GUI::Menu& settings_menu); ErrorOr<void> load_search_engines(GUI::Menu& settings_menu);

View file

@ -37,5 +37,5 @@ set(GENERATED_SOURCES
) )
serenity_app(Browser ICON app-browser) serenity_app(Browser ICON app-browser)
target_link_libraries(Browser PRIVATE LibCore LibWebView LibWeb LibProtocol LibGUI LibDesktop LibConfig LibGfx LibIPC LibJS LibLocale LibMain LibSyntax) target_link_libraries(Browser PRIVATE LibCore LibWebView LibWeb LibProtocol LibGUI LibDesktop LibConfig LibGfx LibIPC LibJS LibLocale LibMain LibSyntax LibURL)
link_with_locale_data(Browser) link_with_locale_data(Browser)

View file

@ -27,7 +27,7 @@
namespace Browser { namespace Browser {
DownloadWidget::DownloadWidget(const URL& url) DownloadWidget::DownloadWidget(const URL::URL& url)
: m_url(url) : m_url(url)
{ {
{ {

View file

@ -7,11 +7,11 @@
#pragma once #pragma once
#include <AK/URL.h>
#include <LibCore/ElapsedTimer.h> #include <LibCore/ElapsedTimer.h>
#include <LibGUI/ImageWidget.h> #include <LibGUI/ImageWidget.h>
#include <LibGUI/Progressbar.h> #include <LibGUI/Progressbar.h>
#include <LibGUI/Widget.h> #include <LibGUI/Widget.h>
#include <LibURL/URL.h>
#include <LibWeb/Loader/ResourceLoader.h> #include <LibWeb/Loader/ResourceLoader.h>
namespace Browser { namespace Browser {
@ -23,12 +23,12 @@ public:
virtual ~DownloadWidget() override = default; virtual ~DownloadWidget() override = default;
private: private:
explicit DownloadWidget(const URL&); explicit DownloadWidget(const URL::URL&);
void did_progress(Optional<u64> total_size, u64 downloaded_size); void did_progress(Optional<u64> total_size, u64 downloaded_size);
void did_finish(bool success); void did_finish(bool success);
URL m_url; URL::URL m_url;
ByteString m_destination_path; ByteString m_destination_path;
RefPtr<Web::ResourceLoaderConnectorRequest> m_download; RefPtr<Web::ResourceLoaderConnectorRequest> m_download;
RefPtr<GUI::Progressbar> m_progressbar; RefPtr<GUI::Progressbar> m_progressbar;

View file

@ -18,7 +18,6 @@
#include "InspectorWidget.h" #include "InspectorWidget.h"
#include "StorageWidget.h" #include "StorageWidget.h"
#include <AK/StringBuilder.h> #include <AK/StringBuilder.h>
#include <AK/URL.h>
#include <Applications/Browser/TabGML.h> #include <Applications/Browser/TabGML.h>
#include <Applications/Browser/URLBox.h> #include <Applications/Browser/URLBox.h>
#include <Applications/BrowserSettings/Defaults.h> #include <Applications/BrowserSettings/Defaults.h>
@ -42,6 +41,7 @@
#include <LibGUI/Toolbar.h> #include <LibGUI/Toolbar.h>
#include <LibGUI/ToolbarContainer.h> #include <LibGUI/ToolbarContainer.h>
#include <LibGUI/Window.h> #include <LibGUI/Window.h>
#include <LibURL/URL.h>
#include <LibWeb/HTML/BrowsingContext.h> #include <LibWeb/HTML/BrowsingContext.h>
#include <LibWeb/HTML/SelectedFile.h> #include <LibWeb/HTML/SelectedFile.h>
#include <LibWeb/HTML/SyntaxHighlighter/SyntaxHighlighter.h> #include <LibWeb/HTML/SyntaxHighlighter/SyntaxHighlighter.h>
@ -59,7 +59,7 @@ Tab::~Tab()
close_sub_widgets(); close_sub_widgets();
} }
void Tab::start_download(const URL& url) void Tab::start_download(const URL::URL& url)
{ {
auto window = GUI::Window::construct(&this->window()); auto window = GUI::Window::construct(&this->window());
window->resize(300, 170); window->resize(300, 170);
@ -69,7 +69,7 @@ void Tab::start_download(const URL& url)
window->show(); window->show();
} }
void Tab::view_source(const URL& url, ByteString const& source) void Tab::view_source(const URL::URL& url, ByteString const& source)
{ {
auto window = GUI::Window::construct(&this->window()); auto window = GUI::Window::construct(&this->window());
auto editor = window->set_main_widget<GUI::TextEditor>(); auto editor = window->set_main_widget<GUI::TextEditor>();
@ -654,7 +654,7 @@ Tab::Tab(BrowserWindow& window)
view().on_new_web_view = [this](auto activate_tab, auto, auto) { view().on_new_web_view = [this](auto activate_tab, auto, auto) {
// FIXME: Create a child tab that re-uses the ConnectionFromClient of the parent tab // FIXME: Create a child tab that re-uses the ConnectionFromClient of the parent tab
auto& tab = this->window().create_new_tab(URL("about:blank"), activate_tab); auto& tab = this->window().create_new_tab(URL::URL("about:blank"), activate_tab);
return tab.view().handle(); return tab.view().handle();
}; };
@ -799,14 +799,14 @@ void Tab::update_reset_zoom_button()
} }
} }
void Tab::load(URL const& url, LoadType load_type) void Tab::load(URL::URL const& url, LoadType load_type)
{ {
m_is_history_navigation = (load_type == LoadType::HistoryNavigation); m_is_history_navigation = (load_type == LoadType::HistoryNavigation);
m_web_content_view->load(url); m_web_content_view->load(url);
m_location_box->set_focus(false); m_location_box->set_focus(false);
} }
URL Tab::url() const URL::URL Tab::url() const
{ {
return m_web_content_view->url(); return m_web_content_view->url();
} }

View file

@ -8,11 +8,11 @@
#pragma once #pragma once
#include <AK/Optional.h> #include <AK/Optional.h>
#include <AK/URL.h>
#include <LibGUI/ActionGroup.h> #include <LibGUI/ActionGroup.h>
#include <LibGUI/Widget.h> #include <LibGUI/Widget.h>
#include <LibGfx/ShareableBitmap.h> #include <LibGfx/ShareableBitmap.h>
#include <LibHTTP/Job.h> #include <LibHTTP/Job.h>
#include <LibURL/URL.h>
#include <LibWeb/Forward.h> #include <LibWeb/Forward.h>
#include <LibWebView/History.h> #include <LibWebView/History.h>
#include <LibWebView/ViewImplementation.h> #include <LibWebView/ViewImplementation.h>
@ -38,14 +38,14 @@ class Tab final : public GUI::Widget {
public: public:
virtual ~Tab() override; virtual ~Tab() override;
URL url() const; URL::URL url() const;
enum class LoadType { enum class LoadType {
Normal, Normal,
HistoryNavigation, HistoryNavigation,
}; };
void load(URL const&, LoadType = LoadType::Normal); void load(URL::URL const&, LoadType = LoadType::Normal);
void reload(); void reload();
void go_back(int steps = 1); void go_back(int steps = 1);
@ -64,11 +64,11 @@ public:
void window_size_changed(Gfx::IntSize); void window_size_changed(Gfx::IntSize);
Function<void(ByteString const&)> on_title_change; Function<void(ByteString const&)> on_title_change;
Function<void(const URL&)> on_tab_open_request; Function<void(const URL::URL&)> on_tab_open_request;
Function<void(Tab&)> on_activate_tab_request; Function<void(Tab&)> on_activate_tab_request;
Function<void(Tab&)> on_tab_close_request; Function<void(Tab&)> on_tab_close_request;
Function<void(Tab&)> on_tab_close_other_request; Function<void(Tab&)> on_tab_close_other_request;
Function<void(const URL&)> on_window_open_request; Function<void(const URL::URL&)> on_window_open_request;
Function<void(Gfx::Bitmap const&)> on_favicon_change; Function<void(Gfx::Bitmap const&)> on_favicon_change;
Function<Vector<Web::Cookie::Cookie>()> on_get_cookies_entries; Function<Vector<Web::Cookie::Cookie>()> on_get_cookies_entries;
Function<OrderedHashMap<String, String>()> on_get_local_storage_entries; Function<OrderedHashMap<String, String>()> on_get_local_storage_entries;
@ -104,8 +104,8 @@ private:
void update_actions(); void update_actions();
ErrorOr<void> bookmark_current_url(); ErrorOr<void> bookmark_current_url();
void update_bookmark_button(StringView url); void update_bookmark_button(StringView url);
void start_download(const URL& url); void start_download(const URL::URL& url);
void view_source(const URL& url, ByteString const& source); void view_source(const URL::URL& url, ByteString const& source);
void update_status(Optional<String> text_override = {}, i32 count_waiting = 0); void update_status(Optional<String> text_override = {}, i32 count_waiting = 0);
void close_sub_widgets(); void close_sub_widgets();
@ -129,11 +129,11 @@ private:
RefPtr<GUI::Menu> m_link_context_menu; RefPtr<GUI::Menu> m_link_context_menu;
RefPtr<GUI::Action> m_link_context_menu_default_action; RefPtr<GUI::Action> m_link_context_menu_default_action;
RefPtr<GUI::Action> m_link_copy_action; RefPtr<GUI::Action> m_link_copy_action;
URL m_link_context_menu_url; URL::URL m_link_context_menu_url;
RefPtr<GUI::Menu> m_image_context_menu; RefPtr<GUI::Menu> m_image_context_menu;
Gfx::ShareableBitmap m_image_context_menu_bitmap; Gfx::ShareableBitmap m_image_context_menu_bitmap;
URL m_image_context_menu_url; URL::URL m_image_context_menu_url;
RefPtr<GUI::Menu> m_audio_context_menu; RefPtr<GUI::Menu> m_audio_context_menu;
RefPtr<GUI::Menu> m_video_context_menu; RefPtr<GUI::Menu> m_video_context_menu;
@ -141,7 +141,7 @@ private:
RefPtr<GUI::Action> m_media_context_menu_mute_unmute_action; RefPtr<GUI::Action> m_media_context_menu_mute_unmute_action;
RefPtr<GUI::Action> m_media_context_menu_controls_action; RefPtr<GUI::Action> m_media_context_menu_controls_action;
RefPtr<GUI::Action> m_media_context_menu_loop_action; RefPtr<GUI::Action> m_media_context_menu_loop_action;
URL m_media_context_menu_url; URL::URL m_media_context_menu_url;
RefPtr<GUI::Menu> m_tab_context_menu; RefPtr<GUI::Menu> m_tab_context_menu;
@ -157,7 +157,7 @@ private:
ByteString m_title; ByteString m_title;
RefPtr<Gfx::Bitmap const> m_icon; RefPtr<Gfx::Bitmap const> m_icon;
Optional<URL> m_navigating_url; Optional<URL::URL> m_navigating_url;
bool m_loaded { false }; bool m_loaded { false };
bool m_is_history_navigation { false }; bool m_is_history_navigation { false };

View file

@ -4,10 +4,10 @@
* SPDX-License-Identifier: BSD-2-Clause * SPDX-License-Identifier: BSD-2-Clause
*/ */
#include <AK/URL.h>
#include <Applications/Browser/URLBox.h> #include <Applications/Browser/URLBox.h>
#include <LibGfx/Palette.h> #include <LibGfx/Palette.h>
#include <LibGfx/TextAttributes.h> #include <LibGfx/TextAttributes.h>
#include <LibURL/URL.h>
#include <LibWebView/URL.h> #include <LibWebView/URL.h>
namespace Browser { namespace Browser {

View file

@ -164,7 +164,7 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
} }
} }
Vector<URL> initial_urls; Vector<URL::URL> initial_urls;
for (auto specified_url : specified_urls) { for (auto specified_url : specified_urls) {
if (auto url = WebView::sanitize_url(specified_url); url.has_value()) if (auto url = WebView::sanitize_url(specified_url); url.has_value())

View file

@ -197,7 +197,7 @@ void BrowserSettingsWidget::set_search_engine_url(StringView url)
void BrowserSettingsWidget::apply_settings() void BrowserSettingsWidget::apply_settings()
{ {
auto homepage_url = m_homepage_url_textbox->text(); auto homepage_url = m_homepage_url_textbox->text();
if (!URL(homepage_url).is_valid()) { if (!URL::URL(homepage_url).is_valid()) {
GUI::MessageBox::show_error(this->window(), "The homepage URL you have entered is not valid"sv); GUI::MessageBox::show_error(this->window(), "The homepage URL you have entered is not valid"sv);
m_homepage_url_textbox->select_all(); m_homepage_url_textbox->select_all();
m_homepage_url_textbox->set_focus(true); m_homepage_url_textbox->set_focus(true);
@ -206,7 +206,7 @@ void BrowserSettingsWidget::apply_settings()
Config::write_string("Browser"sv, "Preferences"sv, "Home"sv, homepage_url); Config::write_string("Browser"sv, "Preferences"sv, "Home"sv, homepage_url);
auto new_tab_url = m_new_tab_url_textbox->text(); auto new_tab_url = m_new_tab_url_textbox->text();
if (!URL(new_tab_url).is_valid()) { if (!URL::URL(new_tab_url).is_valid()) {
GUI::MessageBox::show_error(this->window(), "The new tab URL you have entered is not valid"sv); GUI::MessageBox::show_error(this->window(), "The new tab URL you have entered is not valid"sv);
m_new_tab_url_textbox->select_all(); m_new_tab_url_textbox->select_all();
m_new_tab_url_textbox->set_focus(true); m_new_tab_url_textbox->set_focus(true);

View file

@ -19,4 +19,4 @@ set(SOURCES
) )
serenity_app(BrowserSettings ICON app-browser) serenity_app(BrowserSettings ICON app-browser)
target_link_libraries(BrowserSettings PRIVATE LibCore LibGfx LibGUI LibConfig LibMain LibWebView) target_link_libraries(BrowserSettings PRIVATE LibCore LibGfx LibGUI LibConfig LibMain LibWebView LibURL)

View file

@ -15,4 +15,4 @@ set(SOURCES
) )
serenity_app(Calculator ICON app-calculator) serenity_app(Calculator ICON app-calculator)
target_link_libraries(Calculator PRIVATE LibCore LibCrypto LibDesktop LibGfx LibGUI LibMain) target_link_libraries(Calculator PRIVATE LibCore LibCrypto LibDesktop LibGfx LibGUI LibMain LibURL)

View file

@ -5,7 +5,6 @@
*/ */
#include "CalculatorWidget.h" #include "CalculatorWidget.h"
#include <AK/URL.h>
#include <LibCore/System.h> #include <LibCore/System.h>
#include <LibCrypto/NumberTheory/ModularFunctions.h> #include <LibCrypto/NumberTheory/ModularFunctions.h>
#include <LibDesktop/Launcher.h> #include <LibDesktop/Launcher.h>
@ -20,6 +19,7 @@
#include <LibGUI/Window.h> #include <LibGUI/Window.h>
#include <LibGfx/Bitmap.h> #include <LibGfx/Bitmap.h>
#include <LibMain/Main.h> #include <LibMain/Main.h>
#include <LibURL/URL.h>
ErrorOr<int> serenity_main(Main::Arguments arguments) ErrorOr<int> serenity_main(Main::Arguments arguments)
{ {

View file

@ -22,4 +22,4 @@ set(SOURCES
) )
serenity_app(Calendar ICON app-calendar) serenity_app(Calendar ICON app-calendar)
target_link_libraries(Calendar PRIVATE LibConfig LibCore LibFileSystem LibFileSystemAccessClient LibGfx LibGUI LibMain LibDesktop) target_link_libraries(Calendar PRIVATE LibConfig LibCore LibFileSystem LibFileSystemAccessClient LibGfx LibGUI LibMain LibDesktop LibURL)

View file

@ -20,4 +20,4 @@ set(GENERATED_SOURCES
) )
serenity_app(CharacterMap ICON app-character-map) serenity_app(CharacterMap ICON app-character-map)
target_link_libraries(CharacterMap PRIVATE LibConfig LibCore LibDesktop LibGfx LibGUI LibMain LibUnicode) target_link_libraries(CharacterMap PRIVATE LibConfig LibCore LibDesktop LibGfx LibGUI LibMain LibUnicode LibURL)

View file

@ -6,7 +6,6 @@
#include "CharacterMapWidget.h" #include "CharacterMapWidget.h"
#include "SearchCharacters.h" #include "SearchCharacters.h"
#include <AK/URL.h>
#include <LibConfig/Client.h> #include <LibConfig/Client.h>
#include <LibCore/ArgsParser.h> #include <LibCore/ArgsParser.h>
#include <LibCore/System.h> #include <LibCore/System.h>
@ -16,6 +15,7 @@
#include <LibGUI/Window.h> #include <LibGUI/Window.h>
#include <LibGfx/Font/FontDatabase.h> #include <LibGfx/Font/FontDatabase.h>
#include <LibMain/Main.h> #include <LibMain/Main.h>
#include <LibURL/URL.h>
static void search_and_print_results(ByteString const& query) static void search_and_print_results(ByteString const& query)
{ {

View file

@ -13,4 +13,4 @@ set(SOURCES
) )
serenity_app(CrashReporter ICON app-crash-reporter) serenity_app(CrashReporter ICON app-crash-reporter)
target_link_libraries(CrashReporter PRIVATE LibCore LibCoredump LibDebug LibDesktop LibFileSystem LibFileSystemAccessClient LibGfx LibGUI LibMain LibThreading) target_link_libraries(CrashReporter PRIVATE LibCore LibCoredump LibDebug LibDesktop LibFileSystem LibFileSystemAccessClient LibGfx LibGUI LibMain LibThreading LibURL)

View file

@ -10,7 +10,6 @@
#include <AK/LexicalPath.h> #include <AK/LexicalPath.h>
#include <AK/StringBuilder.h> #include <AK/StringBuilder.h>
#include <AK/Types.h> #include <AK/Types.h>
#include <AK/URL.h>
#include <LibCore/ArgsParser.h> #include <LibCore/ArgsParser.h>
#include <LibCore/System.h> #include <LibCore/System.h>
#include <LibCoredump/Backtrace.h> #include <LibCoredump/Backtrace.h>
@ -37,6 +36,7 @@
#include <LibGUI/Window.h> #include <LibGUI/Window.h>
#include <LibMain/Main.h> #include <LibMain/Main.h>
#include <LibThreading/BackgroundAction.h> #include <LibThreading/BackgroundAction.h>
#include <LibURL/URL.h>
#include <mallocdefs.h> #include <mallocdefs.h>
#include <serenity.h> #include <serenity.h>
#include <spawn.h> #include <spawn.h>

View file

@ -33,4 +33,4 @@ set(GENERATED_SOURCES
) )
serenity_app(DisplaySettings ICON app-display-settings) serenity_app(DisplaySettings ICON app-display-settings)
target_link_libraries(DisplaySettings PRIVATE LibCore LibDesktop LibGfx LibGUI LibConfig LibIPC LibMain LibEDID LibThreading LibFileSystemAccessClient) target_link_libraries(DisplaySettings PRIVATE LibCore LibDesktop LibGfx LibGUI LibConfig LibIPC LibMain LibEDID LibThreading LibFileSystemAccessClient LibURL)

View file

@ -35,4 +35,4 @@ set(GENERATED_SOURCES
) )
serenity_app(FileManager ICON app-file-manager) serenity_app(FileManager ICON app-file-manager)
target_link_libraries(FileManager PRIVATE LibArchive LibAudio LibConfig LibCore LibDesktop LibFileSystem LibGfx LibGUI LibMain LibPDF LibThreading) target_link_libraries(FileManager PRIVATE LibArchive LibAudio LibConfig LibCore LibDesktop LibFileSystem LibGfx LibGUI LibMain LibPDF LibThreading LibURL)

View file

@ -67,7 +67,7 @@ RefPtr<LauncherHandler> DirectoryView::get_default_launch_handler(Vector<Nonnull
return {}; return {};
} }
Vector<NonnullRefPtr<LauncherHandler>> DirectoryView::get_launch_handlers(URL const& url) Vector<NonnullRefPtr<LauncherHandler>> DirectoryView::get_launch_handlers(URL::URL const& url)
{ {
Vector<NonnullRefPtr<LauncherHandler>> handlers; Vector<NonnullRefPtr<LauncherHandler>> handlers;
for (auto& h : Desktop::Launcher::get_handlers_with_details_for_url(url)) { for (auto& h : Desktop::Launcher::get_handlers_with_details_for_url(url)) {
@ -491,7 +491,7 @@ void DirectoryView::set_should_show_dotfiles(bool show_dotfiles)
m_model->set_should_show_dotfiles(show_dotfiles); m_model->set_should_show_dotfiles(show_dotfiles);
} }
void DirectoryView::launch(URL const&, LauncherHandler const& launcher_handler) const void DirectoryView::launch(URL::URL const&, LauncherHandler const& launcher_handler) const
{ {
pid_t child; pid_t child;

View file

@ -6,7 +6,6 @@
#pragma once #pragma once
#include <AK/URL.h>
#include <AK/Vector.h> #include <AK/Vector.h>
#include <LibConfig/Listener.h> #include <LibConfig/Listener.h>
#include <LibDesktop/Launcher.h> #include <LibDesktop/Launcher.h>
@ -16,6 +15,7 @@
#include <LibGUI/IconView.h> #include <LibGUI/IconView.h>
#include <LibGUI/StackWidget.h> #include <LibGUI/StackWidget.h>
#include <LibGUI/TableView.h> #include <LibGUI/TableView.h>
#include <LibURL/URL.h>
#include <fcntl.h> #include <fcntl.h>
#include <sys/stat.h> #include <sys/stat.h>
@ -59,12 +59,12 @@ public:
int path_history_size() const { return m_path_history.size(); } int path_history_size() const { return m_path_history.size(); }
int path_history_position() const { return m_path_history_position; } int path_history_position() const { return m_path_history_position; }
static RefPtr<LauncherHandler> get_default_launch_handler(Vector<NonnullRefPtr<LauncherHandler>> const& handlers); static RefPtr<LauncherHandler> get_default_launch_handler(Vector<NonnullRefPtr<LauncherHandler>> const& handlers);
static Vector<NonnullRefPtr<LauncherHandler>> get_launch_handlers(URL const& url); static Vector<NonnullRefPtr<LauncherHandler>> get_launch_handlers(URL::URL const& url);
static Vector<NonnullRefPtr<LauncherHandler>> get_launch_handlers(ByteString const& path); static Vector<NonnullRefPtr<LauncherHandler>> get_launch_handlers(ByteString const& path);
void refresh(); void refresh();
void launch(URL const&, LauncherHandler const&) const; void launch(URL::URL const&, LauncherHandler const&) const;
Function<void(StringView path, bool can_read_in_path, bool can_write_in_path)> on_path_change; Function<void(StringView path, bool can_read_in_path, bool can_write_in_path)> on_path_change;
Function<void(GUI::AbstractView&)> on_selection_change; Function<void(GUI::AbstractView&)> on_selection_change;

View file

@ -14,7 +14,6 @@
#include <AK/LexicalPath.h> #include <AK/LexicalPath.h>
#include <AK/StringBuilder.h> #include <AK/StringBuilder.h>
#include <AK/Try.h> #include <AK/Try.h>
#include <AK/URL.h>
#include <Applications/FileManager/FileManagerWindowGML.h> #include <Applications/FileManager/FileManagerWindowGML.h>
#include <LibConfig/Client.h> #include <LibConfig/Client.h>
#include <LibConfig/Listener.h> #include <LibConfig/Listener.h>
@ -49,6 +48,7 @@
#include <LibGUI/Window.h> #include <LibGUI/Window.h>
#include <LibGfx/Palette.h> #include <LibGfx/Palette.h>
#include <LibMain/Main.h> #include <LibMain/Main.h>
#include <LibURL/URL.h>
#include <pthread.h> #include <pthread.h>
#include <signal.h> #include <signal.h>
#include <stdio.h> #include <stdio.h>
@ -197,7 +197,7 @@ void do_paste(ByteString const& target_directory, GUI::Window* window)
for (auto& uri_as_string : copied_lines) { for (auto& uri_as_string : copied_lines) {
if (uri_as_string.is_empty()) if (uri_as_string.is_empty())
continue; continue;
URL url = uri_as_string; URL::URL url = uri_as_string;
if (!url.is_valid() || url.scheme() != "file") { if (!url.is_valid() || url.scheme() != "file") {
dbgln("Cannot paste URI {}", uri_as_string); dbgln("Cannot paste URI {}", uri_as_string);
continue; continue;

View file

@ -25,4 +25,4 @@ set(GENERATED_SOURCES
) )
serenity_app(FontEditor ICON app-font-editor) serenity_app(FontEditor ICON app-font-editor)
target_link_libraries(FontEditor PRIVATE LibConfig LibCore LibFileSystemAccessClient LibGUI LibDesktop LibGfx LibMain LibUnicode) target_link_libraries(FontEditor PRIVATE LibConfig LibCore LibFileSystemAccessClient LibGUI LibDesktop LibGfx LibMain LibUnicode LibURL)

View file

@ -5,7 +5,6 @@
*/ */
#include "MainWidget.h" #include "MainWidget.h"
#include <AK/URL.h>
#include <LibConfig/Client.h> #include <LibConfig/Client.h>
#include <LibCore/ArgsParser.h> #include <LibCore/ArgsParser.h>
#include <LibCore/System.h> #include <LibCore/System.h>
@ -15,6 +14,7 @@
#include <LibGUI/Icon.h> #include <LibGUI/Icon.h>
#include <LibGUI/Window.h> #include <LibGUI/Window.h>
#include <LibMain/Main.h> #include <LibMain/Main.h>
#include <LibURL/URL.h>
ErrorOr<int> serenity_main(Main::Arguments arguments) ErrorOr<int> serenity_main(Main::Arguments arguments)
{ {

View file

@ -16,5 +16,5 @@ set(SOURCES
) )
serenity_app(Help ICON app-help) serenity_app(Help ICON app-help)
target_link_libraries(Help PRIVATE LibCore LibWebView LibWeb LibMarkdown LibGfx LibGUI LibDesktop LibMain LibManual LibLocale) target_link_libraries(Help PRIVATE LibCore LibWebView LibWeb LibMarkdown LibGfx LibGUI LibDesktop LibMain LibManual LibLocale LibURL)
link_with_locale_data(Help) link_with_locale_data(Help)

View file

@ -11,7 +11,6 @@
#include <AK/LexicalPath.h> #include <AK/LexicalPath.h>
#include <AK/String.h> #include <AK/String.h>
#include <AK/StringView.h> #include <AK/StringView.h>
#include <AK/URL.h>
#include <LibCore/ArgsParser.h> #include <LibCore/ArgsParser.h>
#include <LibCore/System.h> #include <LibCore/System.h>
#include <LibDesktop/Launcher.h> #include <LibDesktop/Launcher.h>
@ -35,6 +34,7 @@
#include <LibManual/Path.h> #include <LibManual/Path.h>
#include <LibManual/SectionNode.h> #include <LibManual/SectionNode.h>
#include <LibMarkdown/Document.h> #include <LibMarkdown/Document.h>
#include <LibURL/URL.h>
namespace Help { namespace Help {
@ -154,7 +154,7 @@ ErrorOr<void> MainWidget::initialize(GUI::Window& window)
m_copy_action->set_enabled(!m_web_view->selected_text().is_empty()); m_copy_action->set_enabled(!m_web_view->selected_text().is_empty());
m_context_menu->popup(screen_position); m_context_menu->popup(screen_position);
}; };
m_web_view->on_link_hover = [this](URL const& url) { m_web_view->on_link_hover = [this](URL::URL const& url) {
if (url.is_valid()) if (url.is_valid())
m_statusbar->set_text(String::from_byte_string(url.to_byte_string()).release_value_but_fixme_should_propagate_errors()); m_statusbar->set_text(String::from_byte_string(url.to_byte_string()).release_value_but_fixme_should_propagate_errors());
else else
@ -245,7 +245,7 @@ ErrorOr<void> MainWidget::initialize(GUI::Window& window)
return {}; return {};
} }
void MainWidget::open_url(URL const& url) void MainWidget::open_url(URL::URL const& url)
{ {
m_go_back_action->set_enabled(m_history.can_go_back()); m_go_back_action->set_enabled(m_history.can_go_back());
m_go_forward_action->set_enabled(m_history.can_go_forward()); m_go_forward_action->set_enabled(m_history.can_go_forward());
@ -273,7 +273,7 @@ void MainWidget::open_url(URL const& url)
} }
} }
void MainWidget::open_external(URL const& url) void MainWidget::open_external(URL::URL const& url)
{ {
if (!Desktop::Launcher::open(url)) if (!Desktop::Launcher::open(url))
GUI::MessageBox::show(window(), ByteString::formatted("The link to '{}' could not be opened.", url), "Failed to open link"sv, GUI::MessageBox::Type::Error); GUI::MessageBox::show(window(), ByteString::formatted("The link to '{}' could not be opened.", url), "Failed to open link"sv, GUI::MessageBox::Type::Error);

View file

@ -27,9 +27,9 @@ public:
private: private:
MainWidget(); MainWidget();
void open_url(URL const&); void open_url(URL::URL const&);
void open_page(Optional<String> const& path); void open_page(Optional<String> const& path);
void open_external(URL const&); void open_external(URL::URL const&);
History m_history; History m_history;
RefPtr<GUI::Menu> m_context_menu; RefPtr<GUI::Menu> m_context_menu;

View file

@ -8,13 +8,13 @@
*/ */
#include "MainWidget.h" #include "MainWidget.h"
#include <AK/URL.h>
#include <LibCore/ArgsParser.h> #include <LibCore/ArgsParser.h>
#include <LibCore/System.h> #include <LibCore/System.h>
#include <LibGUI/Application.h> #include <LibGUI/Application.h>
#include <LibGUI/Icon.h> #include <LibGUI/Icon.h>
#include <LibGUI/Window.h> #include <LibGUI/Window.h>
#include <LibMain/Main.h> #include <LibMain/Main.h>
#include <LibURL/URL.h>
using namespace Help; using namespace Help;

View file

@ -25,4 +25,4 @@ set(SOURCES
) )
serenity_app(HexEditor ICON app-hex-editor) serenity_app(HexEditor ICON app-hex-editor)
target_link_libraries(HexEditor PRIVATE LibCore LibGfx LibGUI LibConfig LibDesktop LibFileSystemAccessClient LibMain LibTextCodec) target_link_libraries(HexEditor PRIVATE LibCore LibGfx LibGUI LibConfig LibDesktop LibFileSystemAccessClient LibMain LibTextCodec LibURL)

View file

@ -11,5 +11,5 @@ set(SOURCES
ViewWidget.cpp ViewWidget.cpp
) )
serenity_app(ImageViewer ICON app-image-viewer) serenity_app(ImageViewer ICON filetype-image)
target_link_libraries(ImageViewer PRIVATE LibCore LibDesktop LibFileSystemAccessClient LibGUI LibGfx LibConfig LibImageDecoderClient LibMain) target_link_libraries(ImageViewer PRIVATE LibCore LibDesktop LibFileSystemAccessClient LibGUI LibGfx LibConfig LibImageDecoderClient LibMain LibURL)

View file

@ -8,7 +8,6 @@
#include "MainWidget.h" #include "MainWidget.h"
#include "ViewWidget.h" #include "ViewWidget.h"
#include <AK/URL.h>
#include <LibConfig/Client.h> #include <LibConfig/Client.h>
#include <LibCore/ArgsParser.h> #include <LibCore/ArgsParser.h>
#include <LibCore/System.h> #include <LibCore/System.h>
@ -32,6 +31,7 @@
#include <LibGfx/Palette.h> #include <LibGfx/Palette.h>
#include <LibGfx/Rect.h> #include <LibGfx/Rect.h>
#include <LibMain/Main.h> #include <LibMain/Main.h>
#include <LibURL/URL.h>
#include <serenity.h> #include <serenity.h>
#include <string.h> #include <string.h>

View file

@ -10,4 +10,4 @@ set(SOURCES
) )
serenity_app(Magnifier ICON app-magnifier) serenity_app(Magnifier ICON app-magnifier)
target_link_libraries(Magnifier PRIVATE LibConfig LibCore LibDesktop LibGfx LibGUI LibIPC LibMain LibFileSystemAccessClient) target_link_libraries(Magnifier PRIVATE LibConfig LibCore LibDesktop LibGfx LibGUI LibIPC LibMain LibFileSystemAccessClient LibURL)

View file

@ -20,4 +20,4 @@ set(GENERATED_SOURCES
) )
serenity_app(Mail ICON app-mail) serenity_app(Mail ICON app-mail)
target_link_libraries(Mail PRIVATE LibConfig LibCore LibDesktop LibGfx LibGUI LibIMAP LibWebView LibWeb LibMain) target_link_libraries(Mail PRIVATE LibConfig LibCore LibDesktop LibGfx LibGUI LibIMAP LibWebView LibWeb LibMain LibURL)

View file

@ -49,11 +49,11 @@ private:
RefPtr<GUI::Menu> m_link_context_menu; RefPtr<GUI::Menu> m_link_context_menu;
RefPtr<GUI::Action> m_link_context_menu_default_action; RefPtr<GUI::Action> m_link_context_menu_default_action;
URL m_link_context_menu_url; URL::URL m_link_context_menu_url;
RefPtr<GUI::Menu> m_image_context_menu; RefPtr<GUI::Menu> m_image_context_menu;
Gfx::ShareableBitmap m_image_context_menu_bitmap; Gfx::ShareableBitmap m_image_context_menu_bitmap;
URL m_image_context_menu_url; URL::URL m_image_context_menu_url;
OwnPtr<AccountHolder> m_account_holder; OwnPtr<AccountHolder> m_account_holder;
}; };

View file

@ -21,4 +21,4 @@ set(SOURCES
) )
serenity_app(Maps ICON app-maps) serenity_app(Maps ICON app-maps)
target_link_libraries(Maps PRIVATE LibConfig LibCore LibDesktop LibGfx LibGUI LibMain LibProtocol) target_link_libraries(Maps PRIVATE LibConfig LibCore LibDesktop LibGfx LibGUI LibMain LibProtocol LibURL)

View file

@ -6,7 +6,6 @@
*/ */
#include "MapWidget.h" #include "MapWidget.h"
#include <AK/URL.h>
#include <Applications/MapsSettings/Defaults.h> #include <Applications/MapsSettings/Defaults.h>
#include <LibConfig/Client.h> #include <LibConfig/Client.h>
#include <LibDesktop/Launcher.h> #include <LibDesktop/Launcher.h>
@ -15,6 +14,7 @@
#include <LibGUI/Clipboard.h> #include <LibGUI/Clipboard.h>
#include <LibGfx/ImageFormats/ImageDecoder.h> #include <LibGfx/ImageFormats/ImageDecoder.h>
#include <LibProtocol/Request.h> #include <LibProtocol/Request.h>
#include <LibURL/URL.h>
namespace Maps { namespace Maps {
@ -74,7 +74,7 @@ MapWidget::MapWidget(Options const& options)
m_request_client = Protocol::RequestClient::try_create().release_value_but_fixme_should_propagate_errors(); m_request_client = Protocol::RequestClient::try_create().release_value_but_fixme_should_propagate_errors();
if (options.attribution_enabled) { if (options.attribution_enabled) {
auto attribution_text = options.attribution_text.value_or(MUST(String::from_byte_string(Config::read_string("Maps"sv, "MapWidget"sv, "TileProviderAttributionText"sv, Maps::default_tile_provider_attribution_text)))); auto attribution_text = options.attribution_text.value_or(MUST(String::from_byte_string(Config::read_string("Maps"sv, "MapWidget"sv, "TileProviderAttributionText"sv, Maps::default_tile_provider_attribution_text))));
URL attribution_url = options.attribution_url.value_or(URL(Config::read_string("Maps"sv, "MapWidget"sv, "TileProviderAttributionUrl"sv, Maps::default_tile_provider_attribution_url))); URL::URL attribution_url = options.attribution_url.value_or(URL::URL(Config::read_string("Maps"sv, "MapWidget"sv, "TileProviderAttributionUrl"sv, Maps::default_tile_provider_attribution_url)));
add_panel({ attribution_text, Panel::Position::BottomRight, attribution_url, "attribution"_string }); add_panel({ attribution_text, Panel::Position::BottomRight, attribution_url, "attribution"_string });
} }
m_marker_image = Gfx::Bitmap::load_from_file("/res/graphics/maps/marker-blue.png"sv).release_value_but_fixme_should_propagate_errors(); m_marker_image = Gfx::Bitmap::load_from_file("/res/graphics/maps/marker-blue.png"sv).release_value_but_fixme_should_propagate_errors();
@ -117,7 +117,7 @@ void MapWidget::config_string_did_change(StringView domain, StringView group, St
// Update attribution panel url when it exists // Update attribution panel url when it exists
for (auto& panel : m_panels) { for (auto& panel : m_panels) {
if (panel.name == "attribution") { if (panel.name == "attribution") {
panel.url = URL(value); panel.url = URL::URL(value);
return; return;
} }
} }
@ -248,19 +248,19 @@ void MapWidget::context_menu_event(GUI::ContextMenuEvent& event)
auto link_icon = MUST(Gfx::Bitmap::load_from_file("/res/icons/16x16/filetype-symlink.png"sv)); auto link_icon = MUST(Gfx::Bitmap::load_from_file("/res/icons/16x16/filetype-symlink.png"sv));
m_context_menu->add_action(GUI::Action::create( m_context_menu->add_action(GUI::Action::create(
"Open in &OpenStreetMap", link_icon, [this](auto&) { "Open in &OpenStreetMap", link_icon, [this](auto&) {
Desktop::Launcher::open(URL(MUST(String::formatted("https://www.openstreetmap.org/#map={}/{}/{}", m_zoom, m_context_menu_latlng.latitude, m_context_menu_latlng.longitude)))); Desktop::Launcher::open(URL::URL(MUST(String::formatted("https://www.openstreetmap.org/#map={}/{}/{}", m_zoom, m_context_menu_latlng.latitude, m_context_menu_latlng.longitude))));
})); }));
m_context_menu->add_action(GUI::Action::create( m_context_menu->add_action(GUI::Action::create(
"Open in &Google Maps", link_icon, [this](auto&) { "Open in &Google Maps", link_icon, [this](auto&) {
Desktop::Launcher::open(URL(MUST(String::formatted("https://www.google.com/maps/@{},{},{}z", m_context_menu_latlng.latitude, m_context_menu_latlng.longitude, m_zoom)))); Desktop::Launcher::open(URL::URL(MUST(String::formatted("https://www.google.com/maps/@{},{},{}z", m_context_menu_latlng.latitude, m_context_menu_latlng.longitude, m_zoom))));
})); }));
m_context_menu->add_action(GUI::Action::create( m_context_menu->add_action(GUI::Action::create(
"Open in &Bing Maps", link_icon, [this](auto&) { "Open in &Bing Maps", link_icon, [this](auto&) {
Desktop::Launcher::open(URL(MUST(String::formatted("https://www.bing.com/maps/?cp={}~{}&lvl={}", m_context_menu_latlng.latitude, m_context_menu_latlng.longitude, m_zoom)))); Desktop::Launcher::open(URL::URL(MUST(String::formatted("https://www.bing.com/maps/?cp={}~{}&lvl={}", m_context_menu_latlng.latitude, m_context_menu_latlng.longitude, m_zoom))));
})); }));
m_context_menu->add_action(GUI::Action::create( m_context_menu->add_action(GUI::Action::create(
"Open in &DuckDuckGo Maps", link_icon, [this](auto&) { "Open in &DuckDuckGo Maps", link_icon, [this](auto&) {
Desktop::Launcher::open(URL(MUST(String::formatted("https://duckduckgo.com/?q={},+{}&ia=web&iaxm=maps", m_context_menu_latlng.latitude, m_context_menu_latlng.longitude)))); Desktop::Launcher::open(URL::URL(MUST(String::formatted("https://duckduckgo.com/?q={},+{}&ia=web&iaxm=maps", m_context_menu_latlng.latitude, m_context_menu_latlng.longitude))));
})); }));
m_context_menu->add_separator(); m_context_menu->add_separator();
m_context_menu->add_action(GUI::Action::create( m_context_menu->add_action(GUI::Action::create(
@ -318,7 +318,7 @@ void MapWidget::process_tile_queue()
HashMap<ByteString, ByteString> headers; HashMap<ByteString, ByteString> headers;
headers.set("User-Agent", "SerenityOS Maps"); headers.set("User-Agent", "SerenityOS Maps");
headers.set("Accept", "image/png"); headers.set("Accept", "image/png");
URL url(MUST(String::formatted(m_tile_provider.value_or(m_default_tile_provider), tile_key.zoom, tile_key.x, tile_key.y))); URL::URL url(MUST(String::formatted(m_tile_provider.value_or(m_default_tile_provider), tile_key.zoom, tile_key.x, tile_key.y)));
auto request = m_request_client->start_request("GET", url, headers, {}); auto request = m_request_client->start_request("GET", url, headers, {});
VERIFY(!request.is_null()); VERIFY(!request.is_null());

View file

@ -48,7 +48,7 @@ public:
int scale_max_width { 100 }; int scale_max_width { 100 };
bool attribution_enabled { true }; bool attribution_enabled { true };
Optional<String> attribution_text {}; Optional<String> attribution_text {};
Optional<URL> attribution_url {}; Optional<URL::URL> attribution_url {};
}; };
LatLng center() const { return m_center; } LatLng center() const { return m_center; }
@ -90,7 +90,7 @@ public:
}; };
String text; String text;
Position position; Position position;
Optional<URL> url {}; Optional<URL::URL> url {};
Optional<String> name {}; Optional<String> name {};
Gfx::IntRect rect { 0, 0, 0, 0 }; Gfx::IntRect rect { 0, 0, 0, 0 };
}; };
@ -188,7 +188,7 @@ private:
bool m_scale_enabled {}; bool m_scale_enabled {};
int m_scale_max_width {}; int m_scale_max_width {};
bool m_attribution_enabled {}; bool m_attribution_enabled {};
URL m_attribution_url; URL::URL m_attribution_url;
bool m_dragging { false }; bool m_dragging { false };
int m_last_mouse_x { 0 }; int m_last_mouse_x { 0 };
int m_last_mouse_y { 0 }; int m_last_mouse_y { 0 };

View file

@ -55,7 +55,7 @@ void SearchPanel::search(StringView query)
HashMap<ByteString, ByteString> headers; HashMap<ByteString, ByteString> headers;
headers.set("User-Agent", "SerenityOS Maps"); headers.set("User-Agent", "SerenityOS Maps");
headers.set("Accept", "application/json"); headers.set("Accept", "application/json");
URL url(MUST(String::formatted("https://nominatim.openstreetmap.org/search?q={}&format=json", URL::percent_encode(query, URL::PercentEncodeSet::Query)))); URL::URL url(MUST(String::formatted("https://nominatim.openstreetmap.org/search?q={}&format=json", URL::percent_encode(query, URL::PercentEncodeSet::Query))));
auto request = m_request_client->start_request("GET", url, headers, {}); auto request = m_request_client->start_request("GET", url, headers, {});
VERIFY(!request.is_null()); VERIFY(!request.is_null());
m_request = request; m_request = request;

View file

@ -22,7 +22,7 @@ void UsersMapWidget::get_users()
HashMap<ByteString, ByteString> headers; HashMap<ByteString, ByteString> headers;
headers.set("User-Agent", "SerenityOS Maps"); headers.set("User-Agent", "SerenityOS Maps");
headers.set("Accept", "application/json"); headers.set("Accept", "application/json");
URL url("https://usermap.serenityos.org/people.json"); URL::URL url("https://usermap.serenityos.org/people.json");
auto request = request_client()->start_request("GET", url, headers, {}); auto request = request_client()->start_request("GET", url, headers, {});
VERIFY(!request.is_null()); VERIFY(!request.is_null());
m_request = request; m_request = request;

View file

@ -13,4 +13,4 @@ set(SOURCES
) )
serenity_app(MapsSettings ICON app-maps) serenity_app(MapsSettings ICON app-maps)
target_link_libraries(MapsSettings PRIVATE LibConfig LibCore LibGfx LibGUI LibMain) target_link_libraries(MapsSettings PRIVATE LibConfig LibCore LibGfx LibGUI LibMain LibURL)

View file

@ -12,4 +12,4 @@ set(SOURCES
) )
serenity_app(PDFViewer ICON app-pdf-viewer) serenity_app(PDFViewer ICON app-pdf-viewer)
target_link_libraries(PDFViewer PRIVATE LibCore LibGfx LibGUI LibPDF LibFileSystemAccessClient LibConfig LibMain) target_link_libraries(PDFViewer PRIVATE LibCore LibGfx LibGUI LibPDF LibFileSystemAccessClient LibConfig LibMain LibURL)

View file

@ -91,4 +91,4 @@ set(GENERATED_SOURCES
) )
serenity_app(PixelPaint ICON app-pixel-paint) serenity_app(PixelPaint ICON app-pixel-paint)
target_link_libraries(PixelPaint PRIVATE LibCore LibImageDecoderClient LibGUI LibGfx LibFileSystemAccessClient LibConfig LibDesktop LibMain LibThreading) target_link_libraries(PixelPaint PRIVATE LibCore LibImageDecoderClient LibGUI LibGfx LibFileSystemAccessClient LibConfig LibDesktop LibMain LibThreading LibURL)

View file

@ -14,4 +14,4 @@ set(SOURCES
SlideObject.cpp SlideObject.cpp
) )
serenity_app(Presenter ICON app-presenter) serenity_app(Presenter ICON app-presenter)
target_link_libraries(Presenter PRIVATE LibWebView LibGUI LibGfx LibFileSystemAccessClient LibCore LibDesktop LibMain) target_link_libraries(Presenter PRIVATE LibWebView LibGUI LibGfx LibFileSystemAccessClient LibCore LibDesktop LibMain LibURL)

View file

@ -7,10 +7,10 @@
#include "SlideObject.h" #include "SlideObject.h"
#include "Presentation.h" #include "Presentation.h"
#include <AK/JsonObject.h> #include <AK/JsonObject.h>
#include <AK/URL.h>
#include <LibGUI/PropertyDeserializer.h> #include <LibGUI/PropertyDeserializer.h>
#include <LibGfx/Font/FontStyleMapping.h> #include <LibGfx/Font/FontStyleMapping.h>
#include <LibGfx/Rect.h> #include <LibGfx/Rect.h>
#include <LibURL/URL.h>
static ByteString to_css_length(float design_value, Presentation const& presentation) static ByteString to_css_length(float design_value, Presentation const& presentation)
{ {

View file

@ -13,4 +13,4 @@ set(SOURCES
) )
serenity_app(Run ICON app-run) serenity_app(Run ICON app-run)
target_link_libraries(Run PRIVATE LibCore LibFileSystem LibDesktop LibGfx LibGUI LibMain) target_link_libraries(Run PRIVATE LibCore LibFileSystem LibDesktop LibGfx LibGUI LibMain LibURL)

View file

@ -8,7 +8,6 @@
#include "RunWindow.h" #include "RunWindow.h"
#include "MainWidget.h" #include "MainWidget.h"
#include <AK/LexicalPath.h> #include <AK/LexicalPath.h>
#include <AK/URL.h>
#include <LibCore/Process.h> #include <LibCore/Process.h>
#include <LibCore/StandardPaths.h> #include <LibCore/StandardPaths.h>
#include <LibDesktop/Launcher.h> #include <LibDesktop/Launcher.h>
@ -20,6 +19,7 @@
#include <LibGUI/ImageWidget.h> #include <LibGUI/ImageWidget.h>
#include <LibGUI/MessageBox.h> #include <LibGUI/MessageBox.h>
#include <LibGUI/Widget.h> #include <LibGUI/Widget.h>
#include <LibURL/URL.h>
#include <spawn.h> #include <spawn.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>

View file

@ -19,4 +19,4 @@ set(SOURCES
) )
serenity_app(SoundPlayer ICON app-sound-player) serenity_app(SoundPlayer ICON app-sound-player)
target_link_libraries(SoundPlayer PRIVATE LibAudio LibConfig LibCore LibFileSystem LibDSP LibGfx LibGUI LibIPC LibMain LibThreading LibImageDecoderClient) target_link_libraries(SoundPlayer PRIVATE LibAudio LibConfig LibCore LibFileSystem LibDSP LibGfx LibGUI LibIPC LibMain LibThreading LibImageDecoderClient LibURL)

View file

@ -14,4 +14,4 @@ set(SOURCES
) )
serenity_app(SpaceAnalyzer ICON app-space-analyzer) serenity_app(SpaceAnalyzer ICON app-space-analyzer)
target_link_libraries(SpaceAnalyzer PRIVATE LibCore LibDesktop LibFileSystem LibGfx LibGUI LibIPC LibMain) target_link_libraries(SpaceAnalyzer PRIVATE LibCore LibDesktop LibFileSystem LibGfx LibGUI LibIPC LibMain LibURL)

View file

@ -10,7 +10,6 @@
#include "TreeMapWidget.h" #include "TreeMapWidget.h"
#include <AK/LexicalPath.h> #include <AK/LexicalPath.h>
#include <AK/String.h> #include <AK/String.h>
#include <AK/URL.h>
#include <LibDesktop/Launcher.h> #include <LibDesktop/Launcher.h>
#include <LibFileSystem/FileSystem.h> #include <LibFileSystem/FileSystem.h>
#include <LibGUI/Application.h> #include <LibGUI/Application.h>
@ -25,6 +24,7 @@
#include <LibGUI/Statusbar.h> #include <LibGUI/Statusbar.h>
#include <LibGfx/Bitmap.h> #include <LibGfx/Bitmap.h>
#include <LibMain/Main.h> #include <LibMain/Main.h>
#include <LibURL/URL.h>
static auto const APP_NAME = "Space Analyzer"_string; static auto const APP_NAME = "Space Analyzer"_string;

View file

@ -42,7 +42,7 @@ set(GENERATED_SOURCES
) )
serenity_app(Spreadsheet ICON app-spreadsheet) serenity_app(Spreadsheet ICON app-spreadsheet)
target_link_libraries(Spreadsheet PRIVATE LibConfig LibCore LibFileSystem LibFileSystemAccessClient LibGfx LibGUI LibJS LibMain LibMarkdown LibSyntax LibWebView LibWeb) target_link_libraries(Spreadsheet PRIVATE LibConfig LibCore LibFileSystem LibFileSystemAccessClient LibGfx LibGUI LibJS LibMain LibMarkdown LibSyntax LibWebView LibWeb LibURL)
serenity_test(Writers/Test/TestXSVWriter.cpp Spreadsheet) serenity_test(Writers/Test/TestXSVWriter.cpp Spreadsheet)

View file

@ -8,7 +8,7 @@
#include <AK/ByteString.h> #include <AK/ByteString.h>
#include <AK/Types.h> #include <AK/Types.h>
#include <AK/URL.h> #include <LibURL/URL.h>
namespace Spreadsheet { namespace Spreadsheet {
@ -38,7 +38,7 @@ struct Position {
} }
ByteString to_cell_identifier(Sheet const& sheet) const; ByteString to_cell_identifier(Sheet const& sheet) const;
URL to_url(Sheet const& sheet) const; URL::URL to_url(Sheet const& sheet) const;
size_t column { 0 }; size_t column { 0 };
size_t row { 0 }; size_t row { 0 };

View file

@ -15,13 +15,13 @@
#include <AK/JsonParser.h> #include <AK/JsonParser.h>
#include <AK/ScopeGuard.h> #include <AK/ScopeGuard.h>
#include <AK/TemporaryChange.h> #include <AK/TemporaryChange.h>
#include <AK/URL.h>
#include <LibCore/File.h> #include <LibCore/File.h>
#include <LibJS/Bytecode/Interpreter.h> #include <LibJS/Bytecode/Interpreter.h>
#include <LibJS/Heap/DeferGC.h> #include <LibJS/Heap/DeferGC.h>
#include <LibJS/Parser.h> #include <LibJS/Parser.h>
#include <LibJS/Runtime/AbstractOperations.h> #include <LibJS/Runtime/AbstractOperations.h>
#include <LibJS/Runtime/FunctionObject.h> #include <LibJS/Runtime/FunctionObject.h>
#include <LibURL/URL.h>
#include <ctype.h> #include <ctype.h>
#include <unistd.h> #include <unistd.h>
@ -243,7 +243,7 @@ Optional<ByteString> Sheet::column_arithmetic(StringView column_name, int offset
return m_columns.last(); return m_columns.last();
} }
Cell* Sheet::from_url(const URL& url) Cell* Sheet::from_url(const URL::URL& url)
{ {
auto maybe_position = position_from_url(url); auto maybe_position = position_from_url(url);
if (!maybe_position.has_value()) if (!maybe_position.has_value())
@ -252,7 +252,7 @@ Cell* Sheet::from_url(const URL& url)
return at(maybe_position.value()); return at(maybe_position.value());
} }
Optional<Position> Sheet::position_from_url(const URL& url) const Optional<Position> Sheet::position_from_url(const URL::URL& url) const
{ {
if (!url.is_valid()) { if (!url.is_valid()) {
dbgln("Invalid url: {}", url.to_byte_string()); dbgln("Invalid url: {}", url.to_byte_string());
@ -747,9 +747,9 @@ ByteString Position::to_cell_identifier(Sheet const& sheet) const
return ByteString::formatted("{}{}", sheet.column(column), row); return ByteString::formatted("{}{}", sheet.column(column), row);
} }
URL Position::to_url(Sheet const& sheet) const URL::URL Position::to_url(Sheet const& sheet) const
{ {
URL url; URL::URL url;
url.set_scheme("spreadsheet"_string); url.set_scheme("spreadsheet"_string);
url.set_host("cell"_string); url.set_host("cell"_string);
url.set_paths({ ByteString::number(getpid()) }); url.set_paths({ ByteString::number(getpid()) });

View file

@ -53,9 +53,9 @@ public:
Optional<size_t> column_index(StringView column_name) const; Optional<size_t> column_index(StringView column_name) const;
Optional<ByteString> column_arithmetic(StringView column_name, int offset); Optional<ByteString> column_arithmetic(StringView column_name, int offset);
Cell* from_url(const URL&); Cell* from_url(const URL::URL&);
Cell const* from_url(const URL& url) const { return const_cast<Sheet*>(this)->from_url(url); } Cell const* from_url(const URL::URL& url) const { return const_cast<Sheet*>(this)->from_url(url); }
Optional<Position> position_from_url(const URL& url) const; Optional<Position> position_from_url(const URL::URL& url) const;
/// Resolve 'offset' to an absolute position assuming 'base' is at 'offset_base'. /// Resolve 'offset' to an absolute position assuming 'base' is at 'offset_base'.
/// Effectively, "Walk the distance between 'offset' and 'offset_base' away from 'base'". /// Effectively, "Walk the distance between 'offset' and 'offset_base' away from 'base'".

View file

@ -6,10 +6,10 @@
#include "SpreadsheetModel.h" #include "SpreadsheetModel.h"
#include "ConditionalFormatting.h" #include "ConditionalFormatting.h"
#include <AK/URL.h>
#include <LibGUI/AbstractView.h> #include <LibGUI/AbstractView.h>
#include <LibJS/Runtime/Error.h> #include <LibJS/Runtime/Error.h>
#include <LibJS/Runtime/Object.h> #include <LibJS/Runtime/Object.h>
#include <LibURL/URL.h>
namespace Spreadsheet { namespace Spreadsheet {

View file

@ -7,7 +7,6 @@
#include "SpreadsheetView.h" #include "SpreadsheetView.h"
#include "CellTypeDialog.h" #include "CellTypeDialog.h"
#include <AK/ScopeGuard.h> #include <AK/ScopeGuard.h>
#include <AK/URL.h>
#include <LibCore/MimeData.h> #include <LibCore/MimeData.h>
#include <LibGUI/BoxLayout.h> #include <LibGUI/BoxLayout.h>
#include <LibGUI/HeaderView.h> #include <LibGUI/HeaderView.h>
@ -17,6 +16,7 @@
#include <LibGUI/Scrollbar.h> #include <LibGUI/Scrollbar.h>
#include <LibGUI/TableView.h> #include <LibGUI/TableView.h>
#include <LibGfx/Palette.h> #include <LibGfx/Palette.h>
#include <LibURL/URL.h>
namespace Spreadsheet { namespace Spreadsheet {

View file

@ -9,4 +9,4 @@ set(SOURCES
) )
serenity_app(Terminal ICON app-terminal) serenity_app(Terminal ICON app-terminal)
target_link_libraries(Terminal PRIVATE LibConfig LibCore LibFileSystem LibDesktop LibGfx LibGUI LibVT LibMain) target_link_libraries(Terminal PRIVATE LibConfig LibCore LibFileSystem LibDesktop LibGfx LibGUI LibVT LibMain LibURL)

View file

@ -7,7 +7,6 @@
#include <AK/FixedArray.h> #include <AK/FixedArray.h>
#include <AK/QuickSort.h> #include <AK/QuickSort.h>
#include <AK/TypedTransfer.h> #include <AK/TypedTransfer.h>
#include <AK/URL.h>
#include <LibConfig/Client.h> #include <LibConfig/Client.h>
#include <LibConfig/Listener.h> #include <LibConfig/Listener.h>
#include <LibCore/Account.h> #include <LibCore/Account.h>
@ -36,6 +35,7 @@
#include <LibGfx/Font/FontDatabase.h> #include <LibGfx/Font/FontDatabase.h>
#include <LibGfx/Palette.h> #include <LibGfx/Palette.h>
#include <LibMain/Main.h> #include <LibMain/Main.h>
#include <LibURL/URL.h>
#include <LibVT/TerminalWidget.h> #include <LibVT/TerminalWidget.h>
#include <pty.h> #include <pty.h>

View file

@ -18,4 +18,4 @@ set(GENERATED_SOURCES
) )
serenity_app(TextEditor ICON app-text-editor) serenity_app(TextEditor ICON app-text-editor)
target_link_libraries(TextEditor PRIVATE LibCore LibWebView LibWeb LibMarkdown LibGfx LibGUI LibShell LibRegex LibDesktop LibCpp LibCMake LibJS LibSQL LibSyntax LibFileSystemAccessClient LibConfig LibMain) target_link_libraries(TextEditor PRIVATE LibCore LibWebView LibWeb LibMarkdown LibGfx LibGUI LibShell LibRegex LibDesktop LibCpp LibCMake LibJS LibSQL LibSyntax LibFileSystemAccessClient LibConfig LibMain LibURL)

View file

@ -8,7 +8,6 @@
#include "MainWidget.h" #include "MainWidget.h"
#include <AK/Optional.h> #include <AK/Optional.h>
#include <AK/StringBuilder.h> #include <AK/StringBuilder.h>
#include <AK/URL.h>
#include <Applications/TextEditor/TextEditorWindowGML.h> #include <Applications/TextEditor/TextEditorWindowGML.h>
#include <LibCMake/CMakeCache/SyntaxHighlighter.h> #include <LibCMake/CMakeCache/SyntaxHighlighter.h>
#include <LibCMake/SyntaxHighlighter.h> #include <LibCMake/SyntaxHighlighter.h>
@ -41,6 +40,7 @@
#include <LibMarkdown/Document.h> #include <LibMarkdown/Document.h>
#include <LibMarkdown/SyntaxHighlighter.h> #include <LibMarkdown/SyntaxHighlighter.h>
#include <LibSQL/AST/SyntaxHighlighter.h> #include <LibSQL/AST/SyntaxHighlighter.h>
#include <LibURL/URL.h>
#include <LibWeb/CSS/SyntaxHighlighter/SyntaxHighlighter.h> #include <LibWeb/CSS/SyntaxHighlighter/SyntaxHighlighter.h>
#include <LibWeb/HTML/SyntaxHighlighter/SyntaxHighlighter.h> #include <LibWeb/HTML/SyntaxHighlighter/SyntaxHighlighter.h>
#include <LibWebView/OutOfProcessWebView.h> #include <LibWebView/OutOfProcessWebView.h>

Some files were not shown because too many files have changed in this diff Show more