/* * Copyright (c) 2021, Idan Horowitz * Copyright (c) 2021, the SerenityOS developers. * Copyright (c) 2023, networkException * Copyright (c) 2024-2025, Shannon Booth * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include namespace Web::DOMURL { class DOMURL : public Bindings::PlatformObject { WEB_PLATFORM_OBJECT(DOMURL, Bindings::PlatformObject); GC_DECLARE_ALLOCATOR(DOMURL); public: [[nodiscard]] static GC::Ref create(JS::Realm&, URL::URL, GC::Ref query); static WebIDL::ExceptionOr> construct_impl(JS::Realm&, String const& url, Optional const& base = {}); virtual ~DOMURL() override; static WebIDL::ExceptionOr create_object_url(JS::VM&, GC::Ref object); static void revoke_object_url(JS::VM&, StringView url); static GC::Ptr parse_for_bindings(JS::VM&, String const& url, Optional const& base = {}); static bool can_parse(JS::VM&, String const& url, Optional const& base = {}); String href() const; WebIDL::ExceptionOr set_href(String const&); String origin() const; String protocol() const; void set_protocol(String const&); String const& username() const; void set_username(String const&); String const& password() const; void set_password(String const&); String host() const; void set_host(String const&); String hostname() const; void set_hostname(String const&); String port() const; void set_port(String const&); String pathname() const; void set_pathname(String const&); Optional const& fragment() const { return m_url.fragment(); } ByteString path_segment_at_index(size_t index) const { return m_url.path_segment_at_index(index); } void set_paths(Vector const& paths) { return m_url.set_paths(paths); } bool has_an_opaque_path() const { return m_url.has_an_opaque_path(); } String search() const; void set_search(String const&); GC::Ref search_params() const; String hash() const; void set_hash(String const&); String to_json() const; Optional const& query() const { return m_url.query(); } void set_query(Badge, Optional query) { m_url.set_query(move(query)); } private: DOMURL(JS::Realm&, URL::URL, GC::Ref query); static GC::Ref initialize_a_url(JS::Realm&, URL::URL const&); virtual void initialize(JS::Realm&) override; virtual void visit_edges(Cell::Visitor&) override; URL::URL m_url; GC::Ref m_query; }; // https://url.spec.whatwg.org/#concept-url-parser Optional parse(StringView input, Optional base_url = {}, Optional encoding = {}); }