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 "SharedBuffer.h"
26
#include "webkitenumtypes.h"
27
#include "webkitglobalsprivate.h"
28
#include "webkitmarshal.h"
29
#include "webkitnetworkresponse.h"
30
#include "webkitwebresourceprivate.h"
32
#include <glib/gi18n-lib.h>
33
#include <wtf/Assertions.h>
34
#include <wtf/text/CString.h>
35
#include <wtf/text/WTFString.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;