summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibWeb/HTML/WorkerLocation.cpp
blob: 7ac70edf6b312f0eaf18e9658ed12624a74c7439 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
/*
 * Copyright (c) 2022, Andrew Kaster <akaster@serenityos.org>
 *
 * SPDX-License-Identifier: BSD-2-Clause
 */

#include <LibWeb/HTML/WorkerGlobalScope.h>
#include <LibWeb/HTML/WorkerLocation.h>

namespace Web::HTML {

// https://html.spec.whatwg.org/multipage/workers.html#dom-workerlocation-href
WebIDL::ExceptionOr<String> WorkerLocation::href() const
{
    auto& vm = realm().vm();
    // The href getter steps are to return this's WorkerGlobalScope object's url, serialized.
    return TRY_OR_THROW_OOM(vm, String::from_deprecated_string(m_global_scope->url().serialize()));
}

// https://html.spec.whatwg.org/multipage/workers.html#dom-workerlocation-origin
WebIDL::ExceptionOr<String> WorkerLocation::origin() const
{
    auto& vm = realm().vm();
    // The origin getter steps are to return the serialization of this's WorkerGlobalScope object's url's origin.
    return TRY_OR_THROW_OOM(vm, String::from_deprecated_string(m_global_scope->url().serialize_origin()));
}

// https://html.spec.whatwg.org/multipage/workers.html#dom-workerlocation-protocol
WebIDL::ExceptionOr<String> WorkerLocation::protocol() const
{
    auto& vm = realm().vm();
    // The protocol getter steps are to return this's WorkerGlobalScope object's url's scheme, followed by ":".
    return TRY_OR_THROW_OOM(vm, String::formatted("{}:", m_global_scope->url().scheme().view()));
}

// https://html.spec.whatwg.org/multipage/workers.html#dom-workerlocation-host
WebIDL::ExceptionOr<String> WorkerLocation::host() const
{
    auto& vm = realm().vm();

    // The host getter steps are:
    // 1. Let url be this's WorkerGlobalScope object's url.
    auto const& url = m_global_scope->url();

    // 2. If url's host is null, return the empty string.
    if (url.host().is_empty())
        return String {};

    // 3. If url's port is null, return url's host, serialized.
    if (!url.port().has_value())
        return TRY_OR_THROW_OOM(vm, String::from_deprecated_string(url.host()));

    // 4. Return url's host, serialized, followed by ":" and url's port, serialized.
    return TRY_OR_THROW_OOM(vm, String::formatted("{}:{}", url.host().view(), url.port().value()));
}

// https://html.spec.whatwg.org/multipage/workers.html#dom-workerlocation-hostname
WebIDL::ExceptionOr<String> WorkerLocation::hostname() const
{
    auto& vm = realm().vm();

    // The hostname getter steps are:
    // 1. Let host be this's WorkerGlobalScope object's url's host.
    auto const& host = m_global_scope->url().host();

    // 2. If host is null, return the empty string.
    if (host.is_empty())
        return String {};

    // 3. Return host, serialized.
    return TRY_OR_THROW_OOM(vm, String::from_deprecated_string(host));
}

// https://html.spec.whatwg.org/multipage/workers.html#dom-workerlocation-port
WebIDL::ExceptionOr<String> WorkerLocation::port() const
{
    auto& vm = realm().vm();

    // The port getter steps are:
    // 1. Let port be this's WorkerGlobalScope object's url's port.
    auto const& port = m_global_scope->url().port();

    // 2. If port is null, return the empty string.
    if (!port.has_value())
        return String {};
    // 3. Return port, serialized.
    return TRY_OR_THROW_OOM(vm, String::number(port.value()));
}

// https://html.spec.whatwg.org/multipage/workers.html#dom-workerlocation-pathname
WebIDL::ExceptionOr<String> WorkerLocation::pathname() const
{
    auto& vm = realm().vm();
    // The pathname getter steps are to return the result of URL path serializing this's WorkerGlobalScope object's url.
    return TRY_OR_THROW_OOM(vm, String::from_deprecated_string(m_global_scope->url().serialize_path()));
}

// https://html.spec.whatwg.org/multipage/workers.html#dom-workerlocation-search
WebIDL::ExceptionOr<String> WorkerLocation::search() const
{
    auto& vm = realm().vm();

    // The search getter steps are:
    // 1. Let query be this's WorkerGlobalScope object's url's query.
    auto const& query = m_global_scope->url().query();

    // 2. If query is either null or the empty string, return the empty string.
    if (query.is_empty())
        return String {};

    // 3. Return "?", followed by query.
    return TRY_OR_THROW_OOM(vm, String::formatted("?{}", query.view()));
}

// https://html.spec.whatwg.org/multipage/workers.html#dom-workerlocation-hash
WebIDL::ExceptionOr<String> WorkerLocation::hash() const
{
    auto& vm = realm().vm();

    // The hash getter steps are:
    // 1. Let fragment be this's WorkerGlobalScope object's url's fragment.
    auto const& fragment = m_global_scope->url().fragment();

    // 2. If fragment is either null or the empty string, return the empty string.
    if (fragment.is_empty())
        return String {};

    // 3. Return "#", followed by fragment.
    return TRY_OR_THROW_OOM(vm, String::formatted("#{}", fragment.view()));
}

WorkerLocation::WorkerLocation(WorkerGlobalScope& global_scope)
    : PlatformObject(global_scope.realm())
    , m_global_scope(global_scope)
{
    // FIXME: Set prototype once we can get to worker scope prototypes.
}

WorkerLocation::~WorkerLocation() = default;

void WorkerLocation::visit_edges(Cell::Visitor& visitor)
{
    Base::visit_edges(visitor);
    visitor.visit(m_global_scope);
}

}