ladybird/Userland/Libraries/LibWebView/URL.cpp
Timothy Flynn 191e20d639 LibWebView: Add a helper to sanitize a user-provided URL
We currently implement several forms of this method across the Ladybird
chromes. As such, we see commits to add special URL handling that only
affects a single chrome. Instead, let's consolidate all special handling
in a single location for all chromes to make use of.

This method can handle resolving file:// URLs, falling back to a search
engine query, and validation against the Public Suffix List. These cases
were gathered from the various chromes.
2023-10-13 13:37:11 -04:00

48 lines
1.3 KiB
C++

/*
* Copyright (c) 2023, Tim Flynn <trflynn89@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <LibCore/System.h>
#include <LibFileSystem/FileSystem.h>
#include <LibPublicSuffix/URL.h>
#include <LibWebView/URL.h>
namespace WebView {
Optional<URL> sanitize_url(StringView url, Optional<StringView> search_engine, AppendTLD append_tld)
{
if (FileSystem::exists(url)) {
auto path = FileSystem::real_path(url);
if (path.is_error())
return {};
return URL::create_with_file_scheme(path.value().to_deprecated_string());
}
auto format_search_engine = [&]() -> Optional<URL> {
if (!search_engine.has_value())
return {};
return MUST(String::formatted(*search_engine, URL::percent_decode(url)));
};
String url_buffer;
if (append_tld == AppendTLD::Yes) {
// FIXME: Expand the list of top level domains.
if (!url.ends_with(".com"sv) && !url.ends_with(".net"sv) && !url.ends_with(".org"sv)) {
url_buffer = MUST(String::formatted("{}.com", url));
url = url_buffer;
}
}
auto result = PublicSuffix::absolute_url(url);
if (result.is_error())
return format_search_engine();
return result.release_value();
}
}