Skip to content

Commit 9915fa7

Browse files
networkExceptionlinusg
authored andcommitted
AK+Everywhere: Use Optional for URLParser::parse's base_url parameter
1 parent 38bdf4d commit 9915fa7

File tree

12 files changed

+31
-32
lines changed

12 files changed

+31
-32
lines changed

AK/URL.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ URL URL::complete_url(StringView relative_url) const
4444
if (!is_valid())
4545
return {};
4646

47-
return URLParser::parse(relative_url, this);
47+
return URLParser::parse(relative_url, *this);
4848
}
4949

5050
void URL::set_scheme(DeprecatedString scheme)

AK/URLParser.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -197,11 +197,11 @@ Optional<URL> URLParser::parse_data_url(StringView raw_input)
197197
// NOTE: Since the URL class's member variables contain percent decoded data, we have to deviate from the URL parser specification when setting
198198
// some of those values. Because the specification leaves all values percent encoded in their URL data structure, we have to percent decode
199199
// everything before setting the member variables.
200-
URL URLParser::parse(StringView raw_input, URL const* base_url, Optional<URL> url, Optional<State> state_override)
200+
URL URLParser::parse(StringView raw_input, Optional<URL> const& base_url, Optional<URL> url, Optional<State> state_override)
201201
{
202202
dbgln_if(URL_PARSER_DEBUG, "URLParser::parse: Parsing '{}'", raw_input);
203203
if (raw_input.is_empty())
204-
return base_url ? *base_url : URL {};
204+
return base_url.has_value() ? *base_url : URL {};
205205

206206
if (raw_input.starts_with("data:"sv)) {
207207
auto maybe_url = parse_data_url(raw_input);
@@ -301,7 +301,7 @@ URL URLParser::parse(StringView raw_input, URL const* base_url, Optional<URL> ur
301301
}
302302
state = State::File;
303303
} else if (url->is_special()) {
304-
if (base_url && base_url->m_scheme == url->m_scheme)
304+
if (base_url.has_value() && base_url->m_scheme == url->m_scheme)
305305
state = State::SpecialRelativeOrAuthority;
306306
else
307307
state = State::SpecialAuthoritySlashes;
@@ -321,7 +321,7 @@ URL URLParser::parse(StringView raw_input, URL const* base_url, Optional<URL> ur
321321
}
322322
break;
323323
case State::NoScheme:
324-
if (!base_url || (base_url->m_cannot_be_a_base_url && code_point != '#')) {
324+
if (!base_url.has_value() || (base_url->m_cannot_be_a_base_url && code_point != '#')) {
325325
report_validation_error();
326326
return {};
327327
} else if (base_url->m_cannot_be_a_base_url && code_point == '#') {
@@ -527,7 +527,7 @@ URL URLParser::parse(StringView raw_input, URL const* base_url, Optional<URL> ur
527527
if (code_point == '\\')
528528
report_validation_error();
529529
state = State::FileSlash;
530-
} else if (base_url && base_url->m_scheme == "file") {
530+
} else if (base_url.has_value() && base_url->m_scheme == "file") {
531531
url->m_host = base_url->m_host;
532532
url->m_paths = base_url->m_paths;
533533
url->m_query = base_url->m_query;
@@ -557,7 +557,7 @@ URL URLParser::parse(StringView raw_input, URL const* base_url, Optional<URL> ur
557557
if (code_point == '\\')
558558
report_validation_error();
559559
state = State::FileHost;
560-
} else if (base_url && base_url->m_scheme == "file") {
560+
} else if (base_url.has_value() && base_url->m_scheme == "file") {
561561
url->m_host = base_url->m_host;
562562
auto substring_from_pointer = input.substring_view(iterator - input.begin()).as_string();
563563
if (!starts_with_windows_drive_letter(substring_from_pointer) && is_normalized_windows_drive_letter(base_url->m_paths[0]))

AK/URLParser.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ class URLParser {
5555
VERIFY_NOT_REACHED();
5656
}
5757

58-
static URL parse(StringView input, URL const* base_url = nullptr, Optional<URL> url = {}, Optional<State> state_override = {});
58+
static URL parse(StringView input, Optional<URL> const& base_url = {}, Optional<URL> url = {}, Optional<State> state_override = {});
5959

6060
private:
6161
static Optional<URL> parse_data_url(StringView raw_input);

Tests/AK/TestURL.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -411,7 +411,7 @@ TEST_CASE(complete_file_url_with_base)
411411
TEST_CASE(empty_url_with_base_url)
412412
{
413413
URL base_url { "https://foo.com/"sv };
414-
URL parsed_url = URLParser::parse(""sv, &base_url);
414+
URL parsed_url = URLParser::parse(""sv, base_url);
415415
EXPECT_EQ(parsed_url.is_valid(), true);
416416
EXPECT(base_url.equals(parsed_url));
417417
}

Userland/Libraries/LibWeb/Fetch/Infrastructure/HTTP/Responses.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,7 @@ ErrorOr<Optional<AK::URL>> Response::location_url(Optional<String> const& reques
113113
return Optional<AK::URL> {};
114114

115115
// 3. If location is a header value, then set location to the result of parsing location with response’s URL.
116-
auto base_url = *url();
117-
auto location = AK::URLParser::parse(location_values.first(), &base_url);
116+
auto location = AK::URLParser::parse(location_values.first(), url());
118117
if (!location.is_valid())
119118
return Error::from_string_view("Invalid 'Location' header URL"sv);
120119

Userland/Libraries/LibWeb/Fetch/Request.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ WebIDL::ExceptionOr<JS::NonnullGCPtr<Request>> Request::construct_impl(JS::Realm
121121
// 5. If input is a string, then:
122122
if (input.has<String>()) {
123123
// 1. Let parsedURL be the result of parsing input with baseURL.
124-
auto parsed_url = URLParser::parse(input.get<String>(), &base_url);
124+
auto parsed_url = URLParser::parse(input.get<String>(), base_url);
125125

126126
// 2. If parsedURL is failure, then throw a TypeError.
127127
if (!parsed_url.is_valid())
@@ -299,7 +299,7 @@ WebIDL::ExceptionOr<JS::NonnullGCPtr<Request>> Request::construct_impl(JS::Realm
299299
// 3. Otherwise:
300300
else {
301301
// 1. Let parsedReferrer be the result of parsing referrer with baseURL.
302-
auto parsed_referrer = URLParser::parse(referrer, &base_url);
302+
auto parsed_referrer = URLParser::parse(referrer, base_url);
303303

304304
// 2. If parsedReferrer is failure, then throw a TypeError.
305305
if (!parsed_referrer.is_valid())

Userland/Libraries/LibWeb/Fetch/Response.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ WebIDL::ExceptionOr<JS::NonnullGCPtr<Response>> Response::redirect(JS::VM& vm, S
174174

175175
// 1. Let parsedURL be the result of parsing url with current settings object’s API base URL.
176176
auto api_base_url = HTML::current_settings_object().api_base_url();
177-
auto parsed_url = URLParser::parse(url, &api_base_url);
177+
auto parsed_url = URLParser::parse(url, api_base_url);
178178

179179
// 2. If parsedURL is failure, then throw a TypeError.
180180
if (!parsed_url.is_valid())

Userland/Libraries/LibWeb/HTML/HTMLHyperlinkElementUtils.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ void HTMLHyperlinkElementUtils::set_protocol(DeprecatedString protocol)
8080
return;
8181

8282
// 3. Basic URL parse the given value, followed by ":", with this element's url as url and scheme start state as state override.
83-
auto result_url = URLParser::parse(DeprecatedString::formatted("{}:", protocol), nullptr, m_url, URLParser::State::SchemeStart);
83+
auto result_url = URLParser::parse(DeprecatedString::formatted("{}:", protocol), {}, m_url, URLParser::State::SchemeStart);
8484
if (result_url.is_valid())
8585
m_url = move(result_url);
8686

@@ -194,7 +194,7 @@ void HTMLHyperlinkElementUtils::set_host(DeprecatedString host)
194194
return;
195195

196196
// 4. Basic URL parse the given value, with url as url and host state as state override.
197-
auto result_url = URLParser::parse(host, nullptr, url, URLParser::State::Host);
197+
auto result_url = URLParser::parse(host, {}, url, URLParser::State::Host);
198198
if (result_url.is_valid())
199199
m_url = move(result_url);
200200

@@ -227,7 +227,7 @@ void HTMLHyperlinkElementUtils::set_hostname(DeprecatedString hostname)
227227
return;
228228

229229
// 4. Basic URL parse the given value, with url as url and hostname state as state override.
230-
auto result_url = URLParser::parse(hostname, nullptr, m_url, URLParser::State::Hostname);
230+
auto result_url = URLParser::parse(hostname, {}, m_url, URLParser::State::Hostname);
231231
if (result_url.is_valid())
232232
m_url = move(result_url);
233233

@@ -269,7 +269,7 @@ void HTMLHyperlinkElementUtils::set_port(DeprecatedString port)
269269
m_url->set_port({});
270270
} else {
271271
// 5. Otherwise, basic URL parse the given value, with url as url and port state as state override.
272-
auto result_url = URLParser::parse(port, nullptr, m_url, URLParser::State::Port);
272+
auto result_url = URLParser::parse(port, {}, m_url, URLParser::State::Port);
273273
if (result_url.is_valid())
274274
m_url = move(result_url);
275275
}
@@ -313,7 +313,7 @@ void HTMLHyperlinkElementUtils::set_pathname(DeprecatedString pathname)
313313
url->set_paths({});
314314

315315
// 5. Basic URL parse the given value, with url as url and path start state as state override.
316-
auto result_url = URLParser::parse(pathname, nullptr, move(url), URLParser::State::PathStart);
316+
auto result_url = URLParser::parse(pathname, {}, move(url), URLParser::State::PathStart);
317317
if (result_url.is_valid())
318318
m_url = move(result_url);
319319

@@ -360,7 +360,7 @@ void HTMLHyperlinkElementUtils::set_search(DeprecatedString search)
360360
url_copy->set_query(DeprecatedString::empty());
361361

362362
// 3. Basic URL parse input, with null, this element's node document's document's character encoding, url as url, and query state as state override.
363-
auto result_url = URLParser::parse(input, nullptr, move(url_copy), URLParser::State::Query);
363+
auto result_url = URLParser::parse(input, {}, move(url_copy), URLParser::State::Query);
364364
if (result_url.is_valid())
365365
m_url = move(result_url);
366366
}
@@ -408,7 +408,7 @@ void HTMLHyperlinkElementUtils::set_hash(DeprecatedString hash)
408408
url_copy->set_fragment(DeprecatedString::empty());
409409

410410
// 3. Basic URL parse input, with url as url and fragment state as state override.
411-
auto result_url = URLParser::parse(input, nullptr, move(url_copy), URLParser::State::Fragment);
411+
auto result_url = URLParser::parse(input, {}, move(url_copy), URLParser::State::Fragment);
412412
if (result_url.is_valid())
413413
m_url = move(result_url);
414414
}

Userland/Libraries/LibWeb/HTML/Location.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ WebIDL::ExceptionOr<void> Location::set_hash(String const& value)
312312
copy_url.set_fragment("");
313313

314314
// 6. Basic URL parse input, with copyURL as url and fragment state as state override.
315-
auto result_url = URLParser::parse(input, nullptr, copy_url, URLParser::State::Fragment);
315+
auto result_url = URLParser::parse(input, {}, copy_url, URLParser::State::Fragment);
316316

317317
// 7. If copyURL's fragment is this's url's fragment, then return.
318318
if (copy_url.fragment() == this->url().fragment())

Userland/Libraries/LibWeb/HTML/Scripting/Fetching.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ WebIDL::ExceptionOr<Optional<AK::URL>> resolve_imports_match(DeprecatedString co
159159
VERIFY(resolution_result->serialize().ends_with("/"sv));
160160

161161
// 5. Let url be the result of URL parsing afterPrefix with resolutionResult.
162-
auto url = URLParser::parse(after_prefix, &*resolution_result);
162+
auto url = URLParser::parse(after_prefix, *resolution_result);
163163

164164
// 6. If url is failure, then throw a TypeError indicating that resolution of normalizedSpecifier was blocked since the afterPrefix portion
165165
// could not be URL-parsed relative to the resolutionResult mapped to by the specifierKey prefix.
@@ -189,7 +189,7 @@ Optional<AK::URL> resolve_url_like_module_specifier(DeprecatedString const& spec
189189
// 1. If specifier starts with "/", "./", or "../", then:
190190
if (specifier.starts_with("/"sv) || specifier.starts_with("./"sv) || specifier.starts_with("../"sv)) {
191191
// 1. Let url be the result of URL parsing specifier with baseURL.
192-
auto url = URLParser::parse(specifier, &base_url);
192+
auto url = URLParser::parse(specifier, base_url);
193193

194194
// 2. If url is failure, then return null.
195195
if (!url.is_valid())

0 commit comments

Comments
 (0)