[GTK] Expose WebKitSecurityOrigin API
[WebKit-https.git] / Source / WebKit2 / UIProcess / API / gtk / WebKitSecurityOrigin.cpp
1 /*
2  * Copyright (C) 2017 Igalia S.L.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "WebKitSecurityOrigin.h"
28
29 #include "WebKitSecurityOriginPrivate.h"
30 #include <WebCore/URL.h>
31 #include <wtf/text/CString.h>
32
33 using namespace WebKit;
34
35 /**
36  * SECTION: WebKitSecurityOrigin
37  * @Short_description: A security boundary for websites
38  * @Title: WebKitSecurityOrigin
39  *
40  * #WebKitSecurityOrigin is a representation of a security domain
41  * defined by websites. A security origin normally consists of a
42  * protocol, a hostname, and a port number. It is also possible for a
43  * security origin to be opaque, as defined by the HTML standard, in
44  * which case it has no associated protocol, host, or port.
45  *
46  * Websites with the same security origin can access each other's
47  * resources for client-side scripting or database access.
48  *
49  * Since: 2.16
50  */
51
52 struct _WebKitSecurityOrigin {
53     _WebKitSecurityOrigin(Ref<WebCore::SecurityOrigin>&& coreSecurityOrigin)
54         : securityOrigin(WTFMove(coreSecurityOrigin))
55     {
56     }
57
58     Ref<WebCore::SecurityOrigin> securityOrigin;
59     CString protocol;
60     CString host;
61     int referenceCount { 1 };
62 };
63
64 G_DEFINE_BOXED_TYPE(WebKitSecurityOrigin, webkit_security_origin, webkit_security_origin_ref, webkit_security_origin_unref)
65
66 WebKitSecurityOrigin* webkitSecurityOriginCreate(Ref<WebCore::SecurityOrigin>&& coreSecurityOrigin)
67 {
68     WebKitSecurityOrigin* origin = static_cast<WebKitSecurityOrigin*>(fastMalloc(sizeof(WebKitSecurityOrigin)));
69     new (origin) WebKitSecurityOrigin(WTFMove(coreSecurityOrigin));
70     return origin;
71 }
72
73 /**
74  * webkit_security_origin_new:
75  * @protocol: The protocol for the new origin
76  * @host: The host for the new origin
77  * @port: The port number for the new origin, or 0 to indicate the
78  *        default port for @protocol
79  *
80  * Create a new security origin from the provided protocol, host and
81  * port.
82  *
83  * Returns: (transfer full): A #WebKitSecurityOrigin.
84  *
85  * Since: 2.16
86  */
87 WebKitSecurityOrigin* webkit_security_origin_new(const gchar* protocol, const gchar* host, guint16 port)
88 {
89     g_return_val_if_fail(protocol, nullptr);
90     g_return_val_if_fail(host, nullptr);
91
92     std::optional<uint16_t> optionalPort;
93     if (port)
94         optionalPort = port;
95
96     return webkitSecurityOriginCreate(WebCore::SecurityOrigin::create(String::fromUTF8(protocol), String::fromUTF8(host), optionalPort));
97 }
98
99 /**
100  * webkit_security_origin_new_for_uri:
101  * @uri: The URI for the new origin
102  *
103  * Create a new security origin from the provided URI. Components of
104  * @uri other than protocol, host, and port do not affect the created
105  * #WebKitSecurityOrigin.
106  *
107  * Returns: (transfer full): A #WebKitSecurityOrigin.
108  *
109  * Since: 2.16
110  */
111 WebKitSecurityOrigin* webkit_security_origin_new_for_uri(const gchar* uri)
112 {
113     g_return_val_if_fail(uri, nullptr);
114
115     return webkitSecurityOriginCreate(WebCore::SecurityOrigin::create(WebCore::URL(WebCore::URL(), String::fromUTF8(uri))));
116 }
117
118 /**
119  * webkit_security_origin_ref:
120  * @origin: a #WebKitSecurityOrigin
121  *
122  * Atomically increments the reference count of @origin by one.
123  * This function is MT-safe and may be called from any thread.
124  *
125  * Returns: The passed #WebKitSecurityOrigin
126  *
127  * Since: 2.16
128  */
129 WebKitSecurityOrigin* webkit_security_origin_ref(WebKitSecurityOrigin* origin)
130 {
131     g_return_val_if_fail(origin, nullptr);
132
133     g_atomic_int_inc(&origin->referenceCount);
134     return origin;
135 }
136
137 /**
138  * webkit_security_origin_unref:
139  * @origin: A #WebKitSecurityOrigin
140  *
141  * Atomically decrements the reference count of @origin by one.
142  * If the reference count drops to 0, all memory allocated by
143  * #WebKitSecurityOrigin is released. This function is MT-safe and may be
144  * called from any thread.
145  *
146  * Since: 2.16
147  */
148 void webkit_security_origin_unref(WebKitSecurityOrigin* origin)
149 {
150     g_return_if_fail(origin);
151
152     if (g_atomic_int_dec_and_test(&origin->referenceCount)) {
153         origin->~WebKitSecurityOrigin();
154         fastFree(origin);
155     }
156 }
157
158 /**
159  * webkit_security_origin_get_protocol:
160  * @origin: a #WebKitSecurityOrigin
161  *
162  * Gets the protocol of @origin, or %NULL if @origin is opaque.
163  *
164  * Returns (allow-none): The protocol of the #WebKitSecurityOrigin
165  *
166  * Since: 2.16
167  */
168 const gchar* webkit_security_origin_get_protocol(WebKitSecurityOrigin* origin)
169 {
170     g_return_val_if_fail(origin, nullptr);
171
172     if (origin->securityOrigin->protocol().isEmpty())
173         return nullptr;
174
175     if (origin->protocol.isNull())
176         origin->protocol = origin->securityOrigin->protocol().utf8();
177     return origin->protocol.data();
178 }
179
180 /**
181  * webkit_security_origin_get_host:
182  * @origin: a #WebKitSecurityOrigin
183  *
184  * Gets the hostname of @origin, or %NULL if @origin is opaque or if its
185  * protocol does not require a host component.
186  *
187  * Returns: (allow-none): The host of the #WebKitSecurityOrigin
188  *
189  * Since: 2.16
190  */
191 const gchar* webkit_security_origin_get_host(WebKitSecurityOrigin* origin)
192 {
193     g_return_val_if_fail(origin, nullptr);
194
195     if (origin->securityOrigin->host().isEmpty())
196         return nullptr;
197
198     if (origin->host.isNull())
199         origin->host = origin->securityOrigin->host().utf8();
200     return origin->host.data();
201 }
202
203 /**
204  * webkit_security_origin_get_port:
205  * @origin: a #WebKitSecurityOrigin
206  *
207  * Gets the port of @origin. This function will always return 0 if the
208  * port is the default port for the given protocol. For example,
209  * http://example.com has the same security origin as
210  * http://example.com:80, and this function will return 0 for a
211  * #WebKitSecurityOrigin constructed from either URI. It will also
212  * return 0 if @origin is opaque.
213  *
214  * Returns: The port of the #WebKitSecurityOrigin.
215  *
216  * Since: 2.16
217  */
218 guint16 webkit_security_origin_get_port(WebKitSecurityOrigin* origin)
219 {
220     g_return_val_if_fail(origin, 0);
221
222     return origin->securityOrigin->port().value_or(0);
223 }
224
225 /**
226  * webkit_security_origin_is_opaque:
227  * @origin: a #WebKitSecurityOrigin
228  *
229  * Gets whether @origin is an opaque security origin, which does not
230  * possess an associated protocol, host, or port.
231  *
232  * Returns: %TRUE if @origin is opaque.
233  *
234  * Since: 2.16
235  */
236 gboolean webkit_security_origin_is_opaque(WebKitSecurityOrigin* origin)
237 {
238     g_return_val_if_fail(origin, TRUE);
239
240     return origin->securityOrigin->isUnique();
241 }
242
243 /**
244  * webkit_security_origin_to_string:
245  * @origin: a #WebKitSecurityOrigin
246  *
247  * Gets a string representation of @origin. The string representation
248  * is a valid URI with only protocol, host, and port components. It may
249  * be %NULL, but usually only if @origin is opaque.
250  *
251  * Returns: (allow-none) (transfer full): a URI representing @origin.
252  *
253  * Since: 2.16
254  */
255 gchar* webkit_security_origin_to_string(WebKitSecurityOrigin* origin)
256 {
257     g_return_val_if_fail(origin, nullptr);
258
259     CString cstring = origin->securityOrigin->toString().utf8();
260     return cstring == "null" ? nullptr : g_strdup (cstring.data());
261 }