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
StringView.cpp
Time.cpp
URL.cpp
URLParser.cpp
UUID.cpp
Utf16View.cpp
Utf32View.cpp

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -106,17 +106,17 @@ enum class IsHistoryNavigation {
#pragma mark - Public methods
- (void)loadURL:(URL const&)url
- (void)loadURL:(URL::URL const&)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];
}
- (void)onLoadStart:(URL const&)url isRedirect:(BOOL)isRedirect
- (void)onLoadStart:(URL::URL const&)url isRedirect:(BOOL)isRedirect
{
if (isRedirect) {
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 cookie_jar = TRY(WebView::CookieJar::create(*database));
URL new_tab_page_url = Browser::default_new_tab_url;
Vector<URL> initial_urls;
URL::URL new_tab_page_url = Browser::default_new_tab_url;
Vector<URL::URL> initial_urls;
for (auto const& raw_url : raw_urls) {
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}
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 ${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 ${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)
include(cmake/AndroidExtras.cmake)

View file

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

View file

@ -42,7 +42,7 @@ static QIcon const& app_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_web_content_options(web_content_options)
, 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);
}
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);
tab.navigate(url);

View file

@ -28,7 +28,7 @@ class BrowserWindow : public QMainWindow {
Q_OBJECT
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(); }
@ -73,7 +73,7 @@ public slots:
void device_pixel_ratio_changed(qreal dpi);
void tab_title_changed(int index, QString const&);
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_child_tab(Web::HTML::ActivateTab, Tab& parent, Web::HTML::WebViewHints, Optional<u64> page_index);
void activate_tab(int index);

View file

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

View file

@ -26,7 +26,7 @@ void RequestManagerQt::reply_finished(QNetworkReply* reply)
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)) {
return nullptr;
@ -40,7 +40,7 @@ RefPtr<Web::ResourceLoaderConnectorRequest> RequestManagerQt::start_request(Byte
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()) };
request.setAttribute(QNetworkRequest::RedirectPolicyAttribute, QNetworkRequest::ManualRedirectPolicy);
@ -78,7 +78,7 @@ ErrorOr<NonnullRefPtr<RequestManagerQt::Request>> RequestManagerQt::Request::cre
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);
connection_info.set_origin(origin);

View file

@ -24,11 +24,11 @@ public:
virtual ~RequestManagerQt() override { }
virtual void prefetch_dns(URL const&) override { }
virtual void preconnect(URL const&) override { }
virtual void prefetch_dns(URL::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::WebSockets::WebSocketClientSocket> websocket_connect(const URL&, ByteString const& origin, Vector<ByteString> const& protocols) 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::URL&, ByteString const& origin, Vector<ByteString> const& protocols) override;
private slots:
void reply_finished(QNetworkReply*);
@ -39,7 +39,7 @@ private:
class Request
: public Web::ResourceLoaderConnectorRequest {
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;

View file

@ -8,7 +8,7 @@
#include "SettingsDialog.h"
#include "Settings.h"
#include "StringUtils.h"
#include <AK/URL.h>
#include <LibURL/URL.h>
#include <LibWebView/SearchEngine.h>
#include <QLabel>
#include <QMenu>
@ -39,11 +39,11 @@ SettingsDialog::SettingsDialog(QMainWindow* window)
m_new_tab_page->setText(Settings::the()->new_tab_page());
QObject::connect(m_new_tab_page, &QLineEdit::textChanged, this, [this] {
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] {
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());
});
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()));
}
URL ak_url_from_qstring(QString const& qstring)
URL::URL ak_url_from_qstring(QString const& qstring)
{
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());
}

View file

@ -10,12 +10,12 @@
#include <AK/Error.h>
#include <AK/String.h>
#include <AK/StringView.h>
#include <AK/URL.h>
#include <LibURL/URL.h>
#include <QString>
#include <QUrl>
AK::ByteString ak_byte_string_from_qstring(QString const&);
String ak_string_from_qstring(QString const&);
QString qstring_from_ak_string(StringView);
URL ak_url_from_qstring(QString const&);
URL ak_url_from_qurl(QUrl const&);
URL::URL ak_url_from_qstring(QString 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();
};
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
// with the loaded URL
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));
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)));
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) {
@ -733,7 +733,7 @@ void Tab::focus_location_editor()
m_location_edit->selectAll();
}
void Tab::navigate(URL const& url)
void Tab::navigate(URL::URL const& url)
{
view().load(url);
}
@ -772,17 +772,17 @@ void Tab::reload()
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);
}
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);
}
void Tab::copy_link_url(URL const& url)
void Tab::copy_link_url(URL::URL const& url)
{
auto* clipboard = QGuiApplication::clipboard();
clipboard->setText(qstring_from_ak_string(WebView::url_text_to_copy(url)));

View file

@ -33,7 +33,7 @@ public:
WebContentView& view() { return *m_view; }
void navigate(URL const&);
void navigate(URL::URL const&);
void load_html(StringView);
void back();
@ -69,9 +69,9 @@ private:
void recreate_toolbar_icons();
void update_hover_label();
void open_link(URL const&);
void open_link_in_new_tab(URL const&);
void copy_link_url(URL const&);
void open_link(URL::URL const&);
void open_link_in_new_tab(URL::URL const&);
void copy_link_url(URL::URL const&);
void close_sub_widgets();
@ -91,11 +91,11 @@ private:
QMenu* m_link_context_menu { 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 };
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_video_context_menu { nullptr };
@ -107,7 +107,7 @@ private:
QAction* m_media_context_menu_mute_unmute_action { nullptr };
QAction* m_media_context_menu_controls_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 };

View file

@ -11,11 +11,11 @@
#include <AK/Function.h>
#include <AK/HashMap.h>
#include <AK/OwnPtr.h>
#include <AK/URL.h>
#include <Ladybird/Types.h>
#include <LibGfx/Forward.h>
#include <LibGfx/Rect.h>
#include <LibGfx/StandardCursor.h>
#include <LibURL/URL.h>
#include <LibWeb/CSS/PreferredColorScheme.h>
#include <LibWeb/CSS/Selector.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);
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 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
{
@ -133,7 +133,7 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
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) {
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 ${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")
# Solaris has socket and networking related functions in two extra libraries
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/)
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)
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/)
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)
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)
endif()
add_serenity_subdirectory(Userland/Libraries/LibURL)
# LibCore
add_serenity_subdirectory(Userland/Libraries/LibCore)
target_link_libraries(LibCore PRIVATE Threads::Threads)
@ -370,6 +372,7 @@ if (HAIKU)
# Haiku has networking related functions in the network library
target_link_libraries(LibCore PRIVATE network)
endif()
target_link_libraries(LibCore PRIVATE LibURL)
# LibMain
add_serenity_subdirectory(Userland/Libraries/LibMain)
@ -580,7 +583,7 @@ if (BUILD_LAGOM)
add_serenity_subdirectory(Meta/Lagom/Contrib/VideoPlayerSDL)
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(isobmff SOURCES ../../Userland/Utilities/isobmff.cpp LIBS LibGfx LibMain)
lagom_utility(ttfdisasm SOURCES ../../Userland/Utilities/ttfdisasm.cpp LIBS LibGfx LibMain)
@ -596,7 +599,7 @@ if (BUILD_LAGOM)
endif()
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)
if (NOT EMSCRIPTEN)
@ -626,7 +629,7 @@ if (BUILD_LAGOM)
endif()
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(fdtdump SOURCES ../../Userland/Utilities/fdtdump.cpp LIBS LibDeviceTree LibMain)

View file

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

View file

@ -4,12 +4,12 @@
* 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)
{
AK::set_debug_enabled(false);
auto string_view = StringView(data, size);
auto url = URL(string_view);
auto url = URL::URL(string_view);
return 0;
}

View file

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

View file

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

View file

@ -25,6 +25,7 @@ add_subdirectory(LibTextCodec)
add_subdirectory(LibThreading)
add_subdirectory(LibTimeZone)
add_subdirectory(LibUnicode)
add_subdirectory(LibURL)
add_subdirectory(LibVideo)
add_subdirectory(LibWasm)
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 <AK/URL.h>
#include <AK/URLParser.h>
#include <LibURL/Parser.h>
#include <LibURL/URL.h>
TEST_CASE(construct)
{
EXPECT_EQ(URL().is_valid(), false);
EXPECT_EQ(URL::URL().is_valid(), false);
}
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.scheme(), "http");
EXPECT_EQ(MUST(url.serialized_host()), "www.serenityos.org");
@ -28,7 +28,7 @@ TEST_CASE(basic)
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.scheme(), "https");
EXPECT_EQ(MUST(url.serialized_host()), "www.serenityos.org");
@ -38,7 +38,7 @@ TEST_CASE(basic)
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.scheme(), "https");
EXPECT_EQ(MUST(url.serialized_host()), "www.serenityos.org1");
@ -48,7 +48,7 @@ TEST_CASE(basic)
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.scheme(), "https");
EXPECT_EQ(MUST(url.serialized_host()), "localhost");
@ -58,7 +58,7 @@ TEST_CASE(basic)
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.scheme(), "http");
EXPECT_EQ(MUST(url.serialized_host()), "www.serenityos.org");
@ -68,7 +68,7 @@ TEST_CASE(basic)
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.scheme(), "http");
EXPECT_EQ(MUST(url.serialized_host()), "www.serenityos.org");
@ -78,7 +78,7 @@ TEST_CASE(basic)
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.scheme(), "http");
EXPECT_EQ(MUST(url.serialized_host()), "www.serenityos.org");
@ -88,7 +88,7 @@ TEST_CASE(basic)
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.scheme(), "http");
EXPECT_EQ(MUST(url.serialized_host()), "www.serenityos.org");
@ -101,29 +101,29 @@ TEST_CASE(basic)
TEST_CASE(some_bad_urls)
{
EXPECT_EQ(URL("http//serenityos.org"sv).is_valid(), false);
EXPECT_EQ(URL("serenityos.org"sv).is_valid(), false);
EXPECT_EQ(URL("://serenityos.org"sv).is_valid(), false);
EXPECT_EQ(URL("://:80"sv).is_valid(), false);
EXPECT_EQ(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("http://serenityos.org:abc"sv).is_valid(), false);
EXPECT_EQ(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"sv).is_valid(), false);
EXPECT_EQ(URL::URL("serenityos.org"sv).is_valid(), false);
EXPECT_EQ(URL::URL("://serenityos.org"sv).is_valid(), false);
EXPECT_EQ(URL::URL("://:80"sv).is_valid(), false);
EXPECT_EQ(URL::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::URL("http://serenityos.org:abc"sv).is_valid(), false);
EXPECT_EQ(URL::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)
{
EXPECT_EQ(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("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("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("http://www.serenityos.org/"sv).serialize(), "http://www.serenityos.org/");
EXPECT_EQ(URL::URL("http://www.serenityos.org:0/"sv).serialize(), "http://www.serenityos.org:0/");
EXPECT_EQ(URL::URL("http://www.serenityos.org:80/"sv).serialize(), "http://www.serenityos.org/");
EXPECT_EQ(URL::URL("http://www.serenityos.org:81/"sv).serialize(), "http://www.serenityos.org:81/");
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)
{
URL url("file://courage/my/file"sv);
URL::URL url("file://courage/my/file"sv);
EXPECT(url.is_valid());
EXPECT_EQ(url.scheme(), "file");
EXPECT_EQ(MUST(url.serialized_host()), "courage");
@ -136,7 +136,7 @@ TEST_CASE(file_url_with_hostname)
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_EQ(url.scheme(), "file");
EXPECT_EQ(MUST(url.serialized_host()), "");
@ -146,7 +146,7 @@ TEST_CASE(file_url_with_localhost)
TEST_CASE(file_url_without_hostname)
{
URL url("file:///my/file"sv);
URL::URL url("file:///my/file"sv);
EXPECT(url.is_valid());
EXPECT_EQ(url.scheme(), "file");
EXPECT_EQ(MUST(url.serialized_host()), "");
@ -156,7 +156,7 @@ TEST_CASE(file_url_without_hostname)
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_EQ(url.scheme(), "file");
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)
{
URL url("file:///my/file#fragment"sv);
URL::URL url("file:///my/file#fragment"sv);
EXPECT(url.is_valid());
EXPECT_EQ(url.scheme(), "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)
{
URL url("file:///"sv);
URL::URL url("file:///"sv);
EXPECT(url.is_valid());
EXPECT_EQ(url.scheme(), "file");
EXPECT_EQ(url.serialize_path(), "/");
@ -184,23 +184,23 @@ TEST_CASE(file_url_with_root_path)
TEST_CASE(file_url_serialization)
{
EXPECT_EQ(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("file:///my/file"sv).serialize(), "file:///my/file");
EXPECT_EQ(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("file:///my/file#fragment"sv).serialize(), "file:///my/file#fragment");
EXPECT_EQ(URL::URL("file://courage/my/file"sv).serialize(), "file://courage/my/file");
EXPECT_EQ(URL::URL("file://localhost/my/file"sv).serialize(), "file:///my/file");
EXPECT_EQ(URL::URL("file:///my/file"sv).serialize(), "file:///my/file");
EXPECT_EQ(URL::URL("file:///my/directory/"sv).serialize(), "file:///my/directory/");
EXPECT_EQ(URL::URL("file:///my/file%23test"sv).serialize(), "file:///my/file%23test");
EXPECT_EQ(URL::URL("file:///my/file#fragment"sv).serialize(), "file:///my/file#fragment");
}
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("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("https://vkoskiv.com/index.html"sv).complete_url("/static/foo.js"sv).serialize(), "https://vkoskiv.com/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)
{
URL url("about:blank"sv);
URL::URL url("about:blank"sv);
EXPECT(url.is_valid());
EXPECT_EQ(url.scheme(), "about");
EXPECT(url.host().has<Empty>());
@ -212,7 +212,7 @@ TEST_CASE(about_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_EQ(url.scheme(), "mailto");
EXPECT(url.host().has<Empty>());
@ -226,7 +226,7 @@ TEST_CASE(mailto_url)
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_EQ(url.scheme(), "mailto");
EXPECT(url.host().has<Empty>());
@ -240,7 +240,7 @@ TEST_CASE(mailto_url_with_subject)
TEST_CASE(data_url)
{
URL url("data:text/html,test"sv);
URL::URL url("data:text/html,test"sv);
EXPECT(url.is_valid());
EXPECT_EQ(url.scheme(), "data");
EXPECT(url.host().has<Empty>());
@ -253,7 +253,7 @@ TEST_CASE(data_url)
TEST_CASE(data_url_default_mime_type)
{
URL url("data:,test"sv);
URL::URL url("data:,test"sv);
EXPECT(url.is_valid());
EXPECT_EQ(url.scheme(), "data");
EXPECT(url.host().has<Empty>());
@ -266,7 +266,7 @@ TEST_CASE(data_url_default_mime_type)
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_EQ(url.scheme(), "data");
EXPECT(url.host().has<Empty>());
@ -279,7 +279,7 @@ TEST_CASE(data_url_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_EQ(url.scheme(), "data");
EXPECT(url.host().has<Empty>());
@ -292,7 +292,7 @@ TEST_CASE(data_url_base64_encoded)
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_EQ(url.scheme(), "data");
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)
{
URL url("data: text/html ; bAsE64 , dGVz dA== "sv);
URL::URL url("data: text/html ; bAsE64 , dGVz dA== "sv);
EXPECT(url.is_valid());
EXPECT_EQ(url.scheme(), "data");
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)
{
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_EQ(url.scheme(), "data");
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)
{
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_EQ(url.scheme(), "data");
EXPECT_EQ(url.fragment(), "a");
@ -343,29 +343,29 @@ TEST_CASE(data_url_completed_with_fragment)
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("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("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/b/c/");
EXPECT_EQ(URL::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/c/");
EXPECT_EQ(URL::URL("http://a/b"sv).complete_url("c"sv).serialize(), "http://a/c");
}
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);
}
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)
{
EXPECT(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("file:///my/file"sv), URL("file://localhost/my/file"sv));
EXPECT_NE(URL("http://serenityos.org/index.html"sv), URL("http://serenityos.org/test.html"sv));
EXPECT(URL::URL("http://serenityos.org"sv).equals("http://serenityos.org#test"sv, URL::ExcludeFragment::Yes));
EXPECT_EQ(URL::URL("http://example.com/index.html"sv), URL::URL("http://ex%61mple.com/index.html"sv));
EXPECT_EQ(URL::URL("file:///my/file"sv), URL::URL("file://localhost/my/file"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)
@ -390,14 +390,14 @@ TEST_CASE(create_with_file_scheme)
EXPECT_EQ(url.path_segment_at_index(2), "");
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/");
}
TEST_CASE(complete_url)
{
URL base_url("http://serenityos.org/index.html#fragment"sv);
URL url = base_url.complete_url("test.html"sv);
URL::URL base_url("http://serenityos.org/index.html#fragment"sv);
URL::URL url = base_url.complete_url("test.html"sv);
EXPECT(url.is_valid());
EXPECT_EQ(url.scheme(), "http");
EXPECT_EQ(MUST(url.serialized_host()), "serenityos.org");
@ -410,28 +410,28 @@ TEST_CASE(complete_url)
TEST_CASE(leading_whitespace)
{
URL url { " https://foo.com/"sv };
URL::URL url { " https://foo.com/"sv };
EXPECT(url.is_valid());
EXPECT_EQ(url.to_byte_string(), "https://foo.com/");
}
TEST_CASE(trailing_whitespace)
{
URL url { "https://foo.com/ "sv };
URL::URL url { "https://foo.com/ "sv };
EXPECT(url.is_valid());
EXPECT_EQ(url.to_byte_string(), "https://foo.com/");
}
TEST_CASE(leading_and_trailing_whitespace)
{
URL url { " https://foo.com/ "sv };
URL::URL url { " https://foo.com/ "sv };
EXPECT(url.is_valid());
EXPECT_EQ(url.to_byte_string(), "https://foo.com/");
}
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_EQ(url.serialize_path(), "/_ünicöde_téxt_©");
EXPECT(!url.query().has_value());
@ -440,7 +440,7 @@ TEST_CASE(unicode)
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_EQ(url.serialize_path(), "/"sv);
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)
{
URL url { "file:///home/index.html" };
URL::URL url { "file:///home/index.html" };
EXPECT(url.is_valid());
EXPECT_EQ(url.serialize_path(), "/home/index.html");
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)
{
URL base_url { "https://foo.com/"sv };
URL parsed_url = URLParser::basic_parse(""sv, base_url);
URL::URL base_url { "https://foo.com/"sv };
URL::URL parsed_url = URL::Parser::basic_parse(""sv, base_url);
EXPECT_EQ(parsed_url.is_valid(), true);
EXPECT(base_url.equals(parsed_url));
}
@ -472,7 +472,7 @@ TEST_CASE(empty_url_with_base_url)
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";
URL url(streetview_url);
URL::URL url(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;
URL url(ipv6_url);
URL::URL url(ipv6_url);
EXPECT(url.is_valid());
EXPECT_EQ(MUST(url.serialized_host()), "[::1]"sv);
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;
URL url(ipv6_url);
URL::URL url(ipv6_url);
EXPECT(url.is_valid());
EXPECT_EQ(MUST(url.serialized_host()), "[0:f::f:f:0:0]"sv);
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;
URL url(ipv6_url);
URL::URL url(ipv6_url);
EXPECT(url.is_valid());
EXPECT_EQ(MUST(url.serialized_host()), "[2001:db8:85a3::8a2e:370:7334]"sv);
EXPECT_EQ(url, ipv6_url);
@ -504,7 +504,7 @@ TEST_CASE(ipv6_address)
{
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);
}
}
@ -513,41 +513,41 @@ TEST_CASE(ipv4_address)
{
{
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_EQ(MUST(url.serialized_host()), "127.0.0.1"sv);
}
{
constexpr auto ipv4_url = "http://0x.0x.0"sv;
URL url(ipv4_url);
URL::URL url(ipv4_url);
EXPECT(url.is_valid());
EXPECT_EQ(MUST(url.serialized_host()), "0.0.0.0"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());
}
{
constexpr auto ipv4_url = "http://256"sv;
URL url(ipv4_url);
URL::URL url(ipv4_url);
EXPECT(url.is_valid());
EXPECT_EQ(MUST(url.serialized_host()), "0.0.1.0"sv);
}
{
constexpr auto ipv4_url = "http://888888888"sv;
URL url(ipv4_url);
URL::URL url(ipv4_url);
EXPECT(url.is_valid());
EXPECT_EQ(MUST(url.serialized_host()), "52.251.94.56"sv);
}
{
constexpr auto ipv4_url = "http://9111111111"sv;
URL url(ipv4_url);
URL::URL url(ipv4_url);
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;
URL url(url_with_username_and_password);
URL::URL url(url_with_username_and_password);
EXPECT(url.is_valid());
EXPECT_EQ(MUST(url.serialized_host()), "test.com"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;
URL url(url_with_percent_encoded_credentials);
URL::URL url(url_with_percent_encoded_credentials);
EXPECT(url.is_valid());
EXPECT_EQ(MUST(url.serialized_host()), "test.com"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& 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_EQ(MUST(url.serialized_host()), "test.com"sv);
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& 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_EQ(MUST(url.serialized_host()), "test.com"sv);
EXPECT(MUST(url.username()).is_empty());

View file

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

View file

@ -12,4 +12,4 @@ set(SOURCES
)
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)
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/FuzzyMatch.h>
#include <AK/LexicalPath.h>
#include <AK/URL.h>
#include <LibCore/Directory.h>
#include <LibCore/ElapsedTimer.h>
#include <LibCore/StandardPaths.h>
@ -20,6 +19,7 @@
#include <LibJS/Runtime/GlobalObject.h>
#include <LibJS/Runtime/ValueInlines.h>
#include <LibJS/Script.h>
#include <LibURL/URL.h>
#include <errno.h>
#include <fcntl.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('$'))
return;
URL url = URL(query);
URL::URL url = URL::URL(query);
if (url.scheme().is_empty())
url.set_scheme("http"_string);

View file

@ -8,12 +8,12 @@
#include <AK/ByteString.h>
#include <AK/Queue.h>
#include <AK/URL.h>
#include <LibDesktop/AppFile.h>
#include <LibGUI/Desktop.h>
#include <LibGUI/Window.h>
#include <LibJS/Runtime/VM.h>
#include <LibThreading/BackgroundAction.h>
#include <LibURL/URL.h>
#include <typeinfo>
namespace Assistant {
@ -118,7 +118,7 @@ private:
class URLResult final : public Result {
public:
explicit URLResult(const URL& url)
explicit URLResult(const URL::URL& url)
: Result(url.to_byte_string(), "Open URL in Browser"_string, 50)
, 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();
}
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_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&) {
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 (URL(homepage_url).is_valid()) {
if (URL::URL(homepage_url).is_valid()) {
Config::write_string("Browser"sv, "Preferences"sv, "Home"sv, homepage_url);
Browser::g_home_url = homepage_url.to_byte_string();
} 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));
}
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);
@ -618,7 +618,7 @@ Tab& BrowserWindow::create_new_tab(URL const& url, Web::HTML::ActivateTab activa
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() });
}

View file

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

View file

@ -37,5 +37,5 @@ set(GENERATED_SOURCES
)
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)

View file

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

View file

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

View file

@ -18,7 +18,6 @@
#include "InspectorWidget.h"
#include "StorageWidget.h"
#include <AK/StringBuilder.h>
#include <AK/URL.h>
#include <Applications/Browser/TabGML.h>
#include <Applications/Browser/URLBox.h>
#include <Applications/BrowserSettings/Defaults.h>
@ -42,6 +41,7 @@
#include <LibGUI/Toolbar.h>
#include <LibGUI/ToolbarContainer.h>
#include <LibGUI/Window.h>
#include <LibURL/URL.h>
#include <LibWeb/HTML/BrowsingContext.h>
#include <LibWeb/HTML/SelectedFile.h>
#include <LibWeb/HTML/SyntaxHighlighter/SyntaxHighlighter.h>
@ -59,7 +59,7 @@ Tab::~Tab()
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());
window->resize(300, 170);
@ -69,7 +69,7 @@ void Tab::start_download(const URL& url)
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 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) {
// 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();
};
@ -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_web_content_view->load(url);
m_location_box->set_focus(false);
}
URL Tab::url() const
URL::URL Tab::url() const
{
return m_web_content_view->url();
}

View file

@ -8,11 +8,11 @@
#pragma once
#include <AK/Optional.h>
#include <AK/URL.h>
#include <LibGUI/ActionGroup.h>
#include <LibGUI/Widget.h>
#include <LibGfx/ShareableBitmap.h>
#include <LibHTTP/Job.h>
#include <LibURL/URL.h>
#include <LibWeb/Forward.h>
#include <LibWebView/History.h>
#include <LibWebView/ViewImplementation.h>
@ -38,14 +38,14 @@ class Tab final : public GUI::Widget {
public:
virtual ~Tab() override;
URL url() const;
URL::URL url() const;
enum class LoadType {
Normal,
HistoryNavigation,
};
void load(URL const&, LoadType = LoadType::Normal);
void load(URL::URL const&, LoadType = LoadType::Normal);
void reload();
void go_back(int steps = 1);
@ -64,11 +64,11 @@ public:
void window_size_changed(Gfx::IntSize);
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_tab_close_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<Vector<Web::Cookie::Cookie>()> on_get_cookies_entries;
Function<OrderedHashMap<String, String>()> on_get_local_storage_entries;
@ -104,8 +104,8 @@ private:
void update_actions();
ErrorOr<void> bookmark_current_url();
void update_bookmark_button(StringView url);
void start_download(const URL& url);
void view_source(const URL& url, ByteString const& source);
void start_download(const URL::URL& url);
void view_source(const URL::URL& url, ByteString const& source);
void update_status(Optional<String> text_override = {}, i32 count_waiting = 0);
void close_sub_widgets();
@ -129,11 +129,11 @@ private:
RefPtr<GUI::Menu> m_link_context_menu;
RefPtr<GUI::Action> m_link_context_menu_default_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;
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_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_controls_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;
@ -157,7 +157,7 @@ private:
ByteString m_title;
RefPtr<Gfx::Bitmap const> m_icon;
Optional<URL> m_navigating_url;
Optional<URL::URL> m_navigating_url;
bool m_loaded { false };
bool m_is_history_navigation { false };

View file

@ -4,10 +4,10 @@
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <AK/URL.h>
#include <Applications/Browser/URLBox.h>
#include <LibGfx/Palette.h>
#include <LibGfx/TextAttributes.h>
#include <LibURL/URL.h>
#include <LibWebView/URL.h>
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) {
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()
{
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);
m_homepage_url_textbox->select_all();
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);
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);
m_new_tab_url_textbox->select_all();
m_new_tab_url_textbox->set_focus(true);

View file

@ -19,4 +19,4 @@ set(SOURCES
)
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)
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 <AK/URL.h>
#include <LibCore/System.h>
#include <LibCrypto/NumberTheory/ModularFunctions.h>
#include <LibDesktop/Launcher.h>
@ -20,6 +19,7 @@
#include <LibGUI/Window.h>
#include <LibGfx/Bitmap.h>
#include <LibMain/Main.h>
#include <LibURL/URL.h>
ErrorOr<int> serenity_main(Main::Arguments arguments)
{

View file

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

View file

@ -13,4 +13,4 @@ set(SOURCES
)
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/StringBuilder.h>
#include <AK/Types.h>
#include <AK/URL.h>
#include <LibCore/ArgsParser.h>
#include <LibCore/System.h>
#include <LibCoredump/Backtrace.h>
@ -37,6 +36,7 @@
#include <LibGUI/Window.h>
#include <LibMain/Main.h>
#include <LibThreading/BackgroundAction.h>
#include <LibURL/URL.h>
#include <mallocdefs.h>
#include <serenity.h>
#include <spawn.h>

View file

@ -33,4 +33,4 @@ set(GENERATED_SOURCES
)
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)
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 {};
}
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;
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);
}
void DirectoryView::launch(URL const&, LauncherHandler const& launcher_handler) const
void DirectoryView::launch(URL::URL const&, LauncherHandler const& launcher_handler) const
{
pid_t child;

View file

@ -6,7 +6,6 @@
#pragma once
#include <AK/URL.h>
#include <AK/Vector.h>
#include <LibConfig/Listener.h>
#include <LibDesktop/Launcher.h>
@ -16,6 +15,7 @@
#include <LibGUI/IconView.h>
#include <LibGUI/StackWidget.h>
#include <LibGUI/TableView.h>
#include <LibURL/URL.h>
#include <fcntl.h>
#include <sys/stat.h>
@ -59,12 +59,12 @@ public:
int path_history_size() const { return m_path_history.size(); }
int path_history_position() const { return m_path_history_position; }
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);
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(GUI::AbstractView&)> on_selection_change;

View file

@ -14,7 +14,6 @@
#include <AK/LexicalPath.h>
#include <AK/StringBuilder.h>
#include <AK/Try.h>
#include <AK/URL.h>
#include <Applications/FileManager/FileManagerWindowGML.h>
#include <LibConfig/Client.h>
#include <LibConfig/Listener.h>
@ -49,6 +48,7 @@
#include <LibGUI/Window.h>
#include <LibGfx/Palette.h>
#include <LibMain/Main.h>
#include <LibURL/URL.h>
#include <pthread.h>
#include <signal.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) {
if (uri_as_string.is_empty())
continue;
URL url = uri_as_string;
URL::URL url = uri_as_string;
if (!url.is_valid() || url.scheme() != "file") {
dbgln("Cannot paste URI {}", uri_as_string);
continue;

View file

@ -25,4 +25,4 @@ set(GENERATED_SOURCES
)
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 <AK/URL.h>
#include <LibConfig/Client.h>
#include <LibCore/ArgsParser.h>
#include <LibCore/System.h>
@ -15,6 +14,7 @@
#include <LibGUI/Icon.h>
#include <LibGUI/Window.h>
#include <LibMain/Main.h>
#include <LibURL/URL.h>
ErrorOr<int> serenity_main(Main::Arguments arguments)
{

View file

@ -16,5 +16,5 @@ set(SOURCES
)
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)

View file

@ -11,7 +11,6 @@
#include <AK/LexicalPath.h>
#include <AK/String.h>
#include <AK/StringView.h>
#include <AK/URL.h>
#include <LibCore/ArgsParser.h>
#include <LibCore/System.h>
#include <LibDesktop/Launcher.h>
@ -35,6 +34,7 @@
#include <LibManual/Path.h>
#include <LibManual/SectionNode.h>
#include <LibMarkdown/Document.h>
#include <LibURL/URL.h>
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_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())
m_statusbar->set_text(String::from_byte_string(url.to_byte_string()).release_value_but_fixme_should_propagate_errors());
else
@ -245,7 +245,7 @@ ErrorOr<void> MainWidget::initialize(GUI::Window& window)
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_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))
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:
MainWidget();
void open_url(URL const&);
void open_url(URL::URL const&);
void open_page(Optional<String> const& path);
void open_external(URL const&);
void open_external(URL::URL const&);
History m_history;
RefPtr<GUI::Menu> m_context_menu;

View file

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

View file

@ -25,4 +25,4 @@ set(SOURCES
)
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
)
serenity_app(ImageViewer ICON app-image-viewer)
target_link_libraries(ImageViewer PRIVATE LibCore LibDesktop LibFileSystemAccessClient LibGUI LibGfx LibConfig LibImageDecoderClient LibMain)
serenity_app(ImageViewer ICON filetype-image)
target_link_libraries(ImageViewer PRIVATE LibCore LibDesktop LibFileSystemAccessClient LibGUI LibGfx LibConfig LibImageDecoderClient LibMain LibURL)

View file

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

View file

@ -10,4 +10,4 @@ set(SOURCES
)
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)
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::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;
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;
};

View file

@ -21,4 +21,4 @@ set(SOURCES
)
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 <AK/URL.h>
#include <Applications/MapsSettings/Defaults.h>
#include <LibConfig/Client.h>
#include <LibDesktop/Launcher.h>
@ -15,6 +14,7 @@
#include <LibGUI/Clipboard.h>
#include <LibGfx/ImageFormats/ImageDecoder.h>
#include <LibProtocol/Request.h>
#include <LibURL/URL.h>
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();
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))));
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 });
}
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
for (auto& panel : m_panels) {
if (panel.name == "attribution") {
panel.url = URL(value);
panel.url = URL::URL(value);
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));
m_context_menu->add_action(GUI::Action::create(
"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(
"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(
"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(
"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_action(GUI::Action::create(
@ -318,7 +318,7 @@ void MapWidget::process_tile_queue()
HashMap<ByteString, ByteString> headers;
headers.set("User-Agent", "SerenityOS Maps");
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, {});
VERIFY(!request.is_null());

View file

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

View file

@ -55,7 +55,7 @@ void SearchPanel::search(StringView query)
HashMap<ByteString, ByteString> headers;
headers.set("User-Agent", "SerenityOS Maps");
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, {});
VERIFY(!request.is_null());
m_request = request;

View file

@ -22,7 +22,7 @@ void UsersMapWidget::get_users()
HashMap<ByteString, ByteString> headers;
headers.set("User-Agent", "SerenityOS Maps");
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, {});
VERIFY(!request.is_null());
m_request = request;

View file

@ -13,4 +13,4 @@ set(SOURCES
)
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)
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)
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
)
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 "Presentation.h"
#include <AK/JsonObject.h>
#include <AK/URL.h>
#include <LibGUI/PropertyDeserializer.h>
#include <LibGfx/Font/FontStyleMapping.h>
#include <LibGfx/Rect.h>
#include <LibURL/URL.h>
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)
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 "MainWidget.h"
#include <AK/LexicalPath.h>
#include <AK/URL.h>
#include <LibCore/Process.h>
#include <LibCore/StandardPaths.h>
#include <LibDesktop/Launcher.h>
@ -20,6 +19,7 @@
#include <LibGUI/ImageWidget.h>
#include <LibGUI/MessageBox.h>
#include <LibGUI/Widget.h>
#include <LibURL/URL.h>
#include <spawn.h>
#include <stdio.h>
#include <string.h>

View file

@ -19,4 +19,4 @@ set(SOURCES
)
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)
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 <AK/LexicalPath.h>
#include <AK/String.h>
#include <AK/URL.h>
#include <LibDesktop/Launcher.h>
#include <LibFileSystem/FileSystem.h>
#include <LibGUI/Application.h>
@ -25,6 +24,7 @@
#include <LibGUI/Statusbar.h>
#include <LibGfx/Bitmap.h>
#include <LibMain/Main.h>
#include <LibURL/URL.h>
static auto const APP_NAME = "Space Analyzer"_string;

View file

@ -42,7 +42,7 @@ set(GENERATED_SOURCES
)
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)

View file

@ -8,7 +8,7 @@
#include <AK/ByteString.h>
#include <AK/Types.h>
#include <AK/URL.h>
#include <LibURL/URL.h>
namespace Spreadsheet {
@ -38,7 +38,7 @@ struct Position {
}
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 row { 0 };

View file

@ -15,13 +15,13 @@
#include <AK/JsonParser.h>
#include <AK/ScopeGuard.h>
#include <AK/TemporaryChange.h>
#include <AK/URL.h>
#include <LibCore/File.h>
#include <LibJS/Bytecode/Interpreter.h>
#include <LibJS/Heap/DeferGC.h>
#include <LibJS/Parser.h>
#include <LibJS/Runtime/AbstractOperations.h>
#include <LibJS/Runtime/FunctionObject.h>
#include <LibURL/URL.h>
#include <ctype.h>
#include <unistd.h>
@ -243,7 +243,7 @@ Optional<ByteString> Sheet::column_arithmetic(StringView column_name, int offset
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);
if (!maybe_position.has_value())
@ -252,7 +252,7 @@ Cell* Sheet::from_url(const URL& url)
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()) {
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);
}
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_host("cell"_string);
url.set_paths({ ByteString::number(getpid()) });

View file

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

View file

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

View file

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

View file

@ -9,4 +9,4 @@ set(SOURCES
)
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/QuickSort.h>
#include <AK/TypedTransfer.h>
#include <AK/URL.h>
#include <LibConfig/Client.h>
#include <LibConfig/Listener.h>
#include <LibCore/Account.h>
@ -36,6 +35,7 @@
#include <LibGfx/Font/FontDatabase.h>
#include <LibGfx/Palette.h>
#include <LibMain/Main.h>
#include <LibURL/URL.h>
#include <LibVT/TerminalWidget.h>
#include <pty.h>

View file

@ -18,4 +18,4 @@ set(GENERATED_SOURCES
)
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 <AK/Optional.h>
#include <AK/StringBuilder.h>
#include <AK/URL.h>
#include <Applications/TextEditor/TextEditorWindowGML.h>
#include <LibCMake/CMakeCache/SyntaxHighlighter.h>
#include <LibCMake/SyntaxHighlighter.h>
@ -41,6 +40,7 @@
#include <LibMarkdown/Document.h>
#include <LibMarkdown/SyntaxHighlighter.h>
#include <LibSQL/AST/SyntaxHighlighter.h>
#include <LibURL/URL.h>
#include <LibWeb/CSS/SyntaxHighlighter/SyntaxHighlighter.h>
#include <LibWeb/HTML/SyntaxHighlighter/SyntaxHighlighter.h>
#include <LibWebView/OutOfProcessWebView.h>

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