2 * Copyright (C) 2009 Jan Michael C. Alonzo
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public License
15 * along with this library; see the file COPYING.LIB. If not, write to
16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
21 #include "webkitwebresource.h"
23 #include "ArchiveResource.h"
25 #include "PlatformString.h"
26 #include "SharedBuffer.h"
27 #include "webkitenumtypes.h"
28 #include "webkitglobalsprivate.h"
29 #include "webkitmarshal.h"
30 #include "webkitnetworkresponse.h"
31 #include "webkitwebresourceprivate.h"
33 #include <glib/gi18n-lib.h>
34 #include <wtf/Assertions.h>
35 #include <wtf/text/CString.h>
38 * SECTION:webkitwebresource
39 * @short_description: Represents a downloaded URI.
40 * @see_also: #WebKitWebDataSource
42 * A web resource encapsulates the data of the download as well as the URI,
43 * MIME type and frame name of the resource.
46 using namespace WebCore;
52 CONTENT_LENGTH_RECEIVED,
66 static guint webkit_web_resource_signals[LAST_SIGNAL] = { 0, };
68 G_DEFINE_TYPE(WebKitWebResource, webkit_web_resource, G_TYPE_OBJECT);
70 static void webkit_web_resource_get_property(GObject* object, guint prop_id, GValue* value, GParamSpec* pspec);
71 static void webkit_web_resource_set_property(GObject* object, guint prop_id, const GValue* value, GParamSpec* pspec);
73 static void webkit_web_resource_cleanup(WebKitWebResource* webResource)
75 WebKitWebResourcePrivate* priv = webResource->priv;
80 g_free(priv->mimeType);
81 priv->mimeType = NULL;
83 g_free(priv->textEncoding);
84 priv->textEncoding = NULL;
86 g_free(priv->frameName);
87 priv->frameName = NULL;
90 g_string_free(priv->data, TRUE);
94 static void webkit_web_resource_dispose(GObject* object)
96 WebKitWebResource* webResource = WEBKIT_WEB_RESOURCE(object);
97 WebKitWebResourcePrivate* priv = webResource->priv;
100 priv->resource->deref();
104 G_OBJECT_CLASS(webkit_web_resource_parent_class)->dispose(object);
107 static void webkit_web_resource_finalize(GObject* object)
109 WebKitWebResource* webResource = WEBKIT_WEB_RESOURCE(object);
111 webkit_web_resource_cleanup(webResource);
113 G_OBJECT_CLASS(webkit_web_resource_parent_class)->finalize(object);
116 static void webkit_web_resource_class_init(WebKitWebResourceClass* webResourceClass)
118 GObjectClass* gobject_class = G_OBJECT_CLASS(webResourceClass);
120 gobject_class->dispose = webkit_web_resource_dispose;
121 gobject_class->finalize = webkit_web_resource_finalize;
122 gobject_class->get_property = webkit_web_resource_get_property;
123 gobject_class->set_property = webkit_web_resource_set_property;
126 * WebKitWebResource::response-received:
127 * @web_resource: the #WebKitWebResource being loaded
128 * @response: the #WebKitNetworkResponse that was received
130 * Emitted when the response is received from the server.
134 webkit_web_resource_signals[RESPONSE_RECEIVED] = g_signal_new("response-received",
135 G_TYPE_FROM_CLASS(webResourceClass),
139 g_cclosure_marshal_VOID__OBJECT,
141 WEBKIT_TYPE_NETWORK_RESPONSE);
144 * WebKitWebResource::load-failed:
145 * @web_resource: the #WebKitWebResource that was loaded
146 * @error: the #GError that was triggered
148 * Invoked when the @web_resource failed to load
152 webkit_web_resource_signals[LOAD_FAILED] = g_signal_new("load-failed",
153 G_TYPE_FROM_CLASS(webResourceClass),
157 g_cclosure_marshal_VOID__POINTER,
162 * WebKitWebResource::load-finished:
163 * @web_resource: the #WebKitWebResource being loaded
165 * Emitted when all the data for the resource was loaded
169 webkit_web_resource_signals[LOAD_FINISHED] = g_signal_new("load-finished",
170 G_TYPE_FROM_CLASS(webResourceClass),
174 g_cclosure_marshal_VOID__VOID,
178 * WebKitWebResource::content-length-received:
179 * @web_resource: the #WebKitWebResource that was loaded
180 * @length_received: the amount of data received since the last signal emission
182 * Emitted when new resource data has been received. The
183 * @length_received variable stores the amount of bytes received
184 * since the last time this signal was emitted. This is useful to
185 * provide progress information about the resource load operation.
189 webkit_web_resource_signals[CONTENT_LENGTH_RECEIVED] = g_signal_new("content-length-received",
190 G_TYPE_FROM_CLASS(webResourceClass),
194 g_cclosure_marshal_VOID__INT,
199 * WebKitWebResource:uri:
201 * The URI of the web resource
205 g_object_class_install_property(gobject_class,
210 _("The uri of the resource"),
212 (GParamFlags)(WEBKIT_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY)));
214 * WebKitWebResource:mime-type:
216 * The MIME type of the web resource.
220 g_object_class_install_property(gobject_class,
225 _("The MIME type of the resource"),
227 WEBKIT_PARAM_READABLE));
229 * WebKitWebResource:encoding:
231 * The encoding name to which the web resource was encoded in.
235 g_object_class_install_property(gobject_class,
240 _("The text encoding name of the resource"),
242 WEBKIT_PARAM_READABLE));
245 * WebKitWebResource:frame-name:
247 * The frame name for the web resource.
251 g_object_class_install_property(gobject_class,
256 _("The frame name of the resource"),
258 WEBKIT_PARAM_READABLE));
260 g_type_class_add_private(gobject_class, sizeof(WebKitWebResourcePrivate));
263 static void webkit_web_resource_get_property(GObject* object, guint prop_id, GValue* value, GParamSpec* pspec)
265 WebKitWebResource* webResource = WEBKIT_WEB_RESOURCE(object);
269 g_value_set_string(value, webkit_web_resource_get_uri(webResource));
272 g_value_set_string(value, webkit_web_resource_get_mime_type(webResource));
275 g_value_set_string(value, webkit_web_resource_get_encoding(webResource));
277 case PROP_FRAME_NAME:
278 g_value_set_string(value, webkit_web_resource_get_frame_name(webResource));
281 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
286 static void webkit_web_resource_set_property(GObject* object, guint prop_id, const GValue* value, GParamSpec* pspec)
288 WebKitWebResource* webResource = WEBKIT_WEB_RESOURCE(object);
292 g_free(webResource->priv->uri);
293 webResource->priv->uri = g_value_dup_string(value);
296 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
301 static void webkit_web_resource_init(WebKitWebResource* webResource)
303 webResource->priv = G_TYPE_INSTANCE_GET_PRIVATE(webResource, WEBKIT_TYPE_WEB_RESOURCE, WebKitWebResourcePrivate);
307 WebKitWebResource* webkit_web_resource_new_with_core_resource(PassRefPtr<ArchiveResource> resource)
309 WebKitWebResource* webResource = WEBKIT_WEB_RESOURCE(g_object_new(WEBKIT_TYPE_WEB_RESOURCE, NULL));
310 WebKitWebResourcePrivate* priv = webResource->priv;
311 priv->resource = resource.leakRef();
316 void webkit_web_resource_init_with_core_resource(WebKitWebResource* webResource, PassRefPtr<ArchiveResource> resource)
320 WebKitWebResourcePrivate* priv = webResource->priv;
323 priv->resource->deref();
325 priv->resource = resource.leakRef();
329 * webkit_web_resource_new:
330 * @data: the data to initialize the #WebKitWebResource
331 * @size: the length of @data
332 * @uri: the uri of the #WebKitWebResource
333 * @mime_type: the MIME type of the #WebKitWebResource
334 * @encoding: the text encoding name of the #WebKitWebResource
335 * @frame_name: the frame name of the #WebKitWebResource
337 * Returns a new #WebKitWebResource. The @encoding can be %NULL. The
338 * @frame_name argument can be used if the resource represents contents of an
339 * entire HTML frame, otherwise pass %NULL.
341 * Return value: a new #WebKitWebResource
345 WebKitWebResource* webkit_web_resource_new(const gchar* data,
348 const gchar* mimeType,
349 const gchar* encoding,
350 const gchar* frameName)
352 g_return_val_if_fail(data, NULL);
353 g_return_val_if_fail(uri, NULL);
354 g_return_val_if_fail(mimeType, NULL);
359 RefPtr<SharedBuffer> buffer = SharedBuffer::create(data, size);
360 WebKitWebResource* webResource = webkit_web_resource_new_with_core_resource(ArchiveResource::create(buffer, KURL(KURL(), String::fromUTF8(uri)), String::fromUTF8(mimeType), String::fromUTF8(encoding), String::fromUTF8(frameName)));
366 * webkit_web_resource_get_data:
367 * @web_resource: a #WebKitWebResource
369 * Returns the data of the @webResource.
371 * Return value: (transfer none): a #GString containing the character
372 * data of the @webResource. The string is owned by WebKit and should
373 * not be freed or destroyed.
377 GString* webkit_web_resource_get_data(WebKitWebResource* webResource)
379 g_return_val_if_fail(WEBKIT_IS_WEB_RESOURCE(webResource), NULL);
381 WebKitWebResourcePrivate* priv = webResource->priv;
387 priv->data = g_string_new_len(priv->resource->data()->data(), priv->resource->data()->size());
393 * webkit_web_resource_get_uri:
394 * @web_resource: a #WebKitWebResource
396 * Return value: the URI of the resource
400 const gchar* webkit_web_resource_get_uri(WebKitWebResource* webResource)
402 g_return_val_if_fail(WEBKIT_IS_WEB_RESOURCE(webResource), NULL);
404 WebKitWebResourcePrivate* priv = webResource->priv;
407 // We may have an URI without having a resource assigned to us (e.g., if the
408 // FrameLoaderClient only had a ResourceRequest when we got created
415 priv->uri = g_strdup(priv->resource->url().string().utf8().data());
421 * webkit_web_resource_get_mime_type:
422 * @web_resource: a #WebKitWebResource
424 * Return value: the MIME type of the resource
428 const gchar* webkit_web_resource_get_mime_type(WebKitWebResource* webResource)
430 g_return_val_if_fail(WEBKIT_IS_WEB_RESOURCE(webResource), NULL);
432 WebKitWebResourcePrivate* priv = webResource->priv;
437 priv->mimeType = g_strdup(priv->resource->mimeType().utf8().data());
439 return priv->mimeType;
443 * webkit_web_resource_get_encoding:
444 * @web_resource: a #WebKitWebResource
446 * Return value: the encoding name of the resource
450 const gchar* webkit_web_resource_get_encoding(WebKitWebResource* webResource)
452 g_return_val_if_fail(WEBKIT_IS_WEB_RESOURCE(webResource), NULL);
454 WebKitWebResourcePrivate* priv = webResource->priv;
458 if (!priv->textEncoding)
459 priv->textEncoding = g_strdup(priv->resource->textEncoding().utf8().data());
461 return priv->textEncoding;
465 * webkit_web_resource_get_frame_name:
466 * @web_resource: a #WebKitWebResource
468 * Return value: the frame name of the resource.
472 const gchar* webkit_web_resource_get_frame_name(WebKitWebResource* webResource)
474 g_return_val_if_fail(WEBKIT_IS_WEB_RESOURCE(webResource), NULL);
476 WebKitWebResourcePrivate* priv = webResource->priv;
480 if (!priv->frameName)
481 priv->frameName = g_strdup(priv->resource->frameName().utf8().data());
483 return priv->frameName;