Home | History | Annotate | Download | only in webkit
      1 /*
      2  * Copyright (C) 2009 Jan Michael C. Alonzo
      3  *
      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.
      8  *
      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.
     13  *
     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.
     18  */
     19 
     20 #include "config.h"
     21 
     22 #include "webkitwebresource.h"
     23 #include "webkitprivate.h"
     24 
     25 #include "ArchiveResource.h"
     26 #include "CString.h"
     27 #include "KURL.h"
     28 #include "PlatformString.h"
     29 #include "SharedBuffer.h"
     30 #include "webkitenumtypes.h"
     31 #include "webkitmarshal.h"
     32 #include "wtf/Assertions.h"
     33 
     34 #include <glib.h>
     35 #include <glib/gi18n-lib.h>
     36 
     37 /**
     38  * SECTION:webkitwebresource
     39  * @short_description: Represents a downloaded URI.
     40  * @see_also: #WebKitWebDataSource
     41  *
     42  * A web resource encapsulates the data of the download as well as the URI,
     43  * MIME type and frame name of the resource.
     44  */
     45 
     46 using namespace WebCore;
     47 using namespace WebKit;
     48 
     49 enum {
     50     PROP_0,
     51 
     52     PROP_URI,
     53     PROP_MIME_TYPE,
     54     PROP_ENCODING,
     55     PROP_FRAME_NAME
     56 };
     57 
     58 G_DEFINE_TYPE(WebKitWebResource, webkit_web_resource, G_TYPE_OBJECT);
     59 
     60 static void webkit_web_resource_get_property(GObject* object, guint prop_id, GValue* value, GParamSpec* pspec);
     61 static void webkit_web_resource_set_property(GObject* object, guint prop_id, const GValue* value, GParamSpec* pspec);
     62 
     63 static void webkit_web_resource_cleanup(WebKitWebResource* webResource)
     64 {
     65     WebKitWebResourcePrivate* priv = webResource->priv;
     66 
     67     g_free(priv->uri);
     68     priv->uri = NULL;
     69 
     70     g_free(priv->mimeType);
     71     priv->mimeType = NULL;
     72 
     73     g_free(priv->textEncoding);
     74     priv->textEncoding = NULL;
     75 
     76     g_free(priv->frameName);
     77     priv->frameName = NULL;
     78 
     79     if (priv->data)
     80         g_string_free(priv->data, TRUE);
     81     priv->data = NULL;
     82 }
     83 
     84 static void webkit_web_resource_dispose(GObject* object)
     85 {
     86     WebKitWebResource* webResource = WEBKIT_WEB_RESOURCE(object);
     87     WebKitWebResourcePrivate* priv = webResource->priv;
     88 
     89     if (priv->resource) {
     90         priv->resource->deref();
     91         priv->resource = 0;
     92     }
     93 
     94     G_OBJECT_CLASS(webkit_web_resource_parent_class)->dispose(object);
     95 }
     96 
     97 static void webkit_web_resource_finalize(GObject* object)
     98 {
     99     WebKitWebResource* webResource = WEBKIT_WEB_RESOURCE(object);
    100 
    101     webkit_web_resource_cleanup(webResource);
    102 
    103     G_OBJECT_CLASS(webkit_web_resource_parent_class)->finalize(object);
    104 }
    105 
    106 static void webkit_web_resource_class_init(WebKitWebResourceClass* klass)
    107 {
    108     GObjectClass* gobject_class = G_OBJECT_CLASS(klass);
    109 
    110     gobject_class->dispose = webkit_web_resource_dispose;
    111     gobject_class->finalize = webkit_web_resource_finalize;
    112     gobject_class->get_property = webkit_web_resource_get_property;
    113     gobject_class->set_property = webkit_web_resource_set_property;
    114 
    115     /**
    116      * WebKitWebResource:uri:
    117      *
    118      * The URI of the web resource
    119      *
    120      * Since: 1.1.14
    121      */
    122     g_object_class_install_property(gobject_class,
    123                                     PROP_URI,
    124                                     g_param_spec_string(
    125                                     "uri",
    126                                     _("URI"),
    127                                     _("The uri of the resource"),
    128                                     NULL,
    129                                     (GParamFlags)(WEBKIT_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY)));
    130     /**
    131      * WebKitWebResource:mime-type:
    132      *
    133      * The MIME type of the web resource.
    134      *
    135      * Since: 1.1.14
    136      */
    137     g_object_class_install_property(gobject_class,
    138                                     PROP_MIME_TYPE,
    139                                     g_param_spec_string(
    140                                     "mime-type",
    141                                     _("MIME Type"),
    142                                     _("The MIME type of the resource"),
    143                                     NULL,
    144                                     WEBKIT_PARAM_READABLE));
    145     /**
    146      * WebKitWebResource:encoding:
    147      *
    148      * The encoding name to which the web resource was encoded in.
    149      *
    150      * Since: 1.1.14
    151      */
    152     g_object_class_install_property(gobject_class,
    153                                     PROP_ENCODING,
    154                                     g_param_spec_string(
    155                                     "encoding",
    156                                     _("Encoding"),
    157                                     _("The text encoding name of the resource"),
    158                                     NULL,
    159                                     WEBKIT_PARAM_READABLE));
    160 
    161     /**
    162      * WebKitWebResource:frame-name:
    163      *
    164      * The frame name for the web resource.
    165      *
    166      * Since: 1.1.14
    167      */
    168     g_object_class_install_property(gobject_class,
    169                                     PROP_FRAME_NAME,
    170                                     g_param_spec_string(
    171                                     "frame-name",
    172                                     _("Frame Name"),
    173                                     _("The frame name of the resource"),
    174                                     NULL,
    175                                     WEBKIT_PARAM_READABLE));
    176 
    177     g_type_class_add_private(gobject_class, sizeof(WebKitWebResourcePrivate));
    178 }
    179 
    180 static void webkit_web_resource_get_property(GObject* object, guint prop_id, GValue* value, GParamSpec* pspec)
    181 {
    182     WebKitWebResource* webResource = WEBKIT_WEB_RESOURCE(object);
    183 
    184     switch (prop_id) {
    185     case PROP_URI:
    186         g_value_set_string(value, webkit_web_resource_get_uri(webResource));
    187         break;
    188     case PROP_MIME_TYPE:
    189         g_value_set_string(value, webkit_web_resource_get_mime_type(webResource));
    190         break;
    191     case PROP_ENCODING:
    192         g_value_set_string(value, webkit_web_resource_get_encoding(webResource));
    193         break;
    194     case PROP_FRAME_NAME:
    195         g_value_set_string(value, webkit_web_resource_get_frame_name(webResource));
    196         break;
    197     default:
    198         G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
    199         break;
    200     }
    201 }
    202 
    203 static void webkit_web_resource_set_property(GObject* object, guint prop_id, const GValue* value, GParamSpec* pspec)
    204 {
    205     WebKitWebResource* webResource = WEBKIT_WEB_RESOURCE(object);
    206 
    207     switch (prop_id) {
    208     case PROP_URI:
    209         g_free(webResource->priv->uri);
    210         webResource->priv->uri = g_value_dup_string(value);
    211         break;
    212     default:
    213         G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
    214         break;
    215     }
    216 }
    217 
    218 static void webkit_web_resource_init(WebKitWebResource* webResource)
    219 {
    220     webResource->priv = WEBKIT_WEB_RESOURCE_GET_PRIVATE(webResource);
    221 }
    222 
    223 // internal use only
    224 WebKitWebResource* webkit_web_resource_new_with_core_resource(PassRefPtr<ArchiveResource> resource)
    225 {
    226     WebKitWebResource* webResource = WEBKIT_WEB_RESOURCE(g_object_new(WEBKIT_TYPE_WEB_RESOURCE, NULL));
    227     WebKitWebResourcePrivate* priv = webResource->priv;
    228     priv->resource = resource.releaseRef();
    229 
    230     return webResource;
    231 }
    232 
    233 void webkit_web_resource_init_with_core_resource(WebKitWebResource* webResource, PassRefPtr<ArchiveResource> resource)
    234 {
    235     ASSERT(resource);
    236 
    237     WebKitWebResourcePrivate* priv = webResource->priv;
    238 
    239     if (priv->resource)
    240         priv->resource->deref();
    241 
    242     priv->resource = resource.releaseRef();
    243 }
    244 
    245 /**
    246  * webkit_web_resource_new:
    247  * @data: the data to initialize the #WebKitWebResource
    248  * @size: the length of @data
    249  * @uri: the uri of the #WebKitWebResource
    250  * @mime_type: the MIME type of the #WebKitWebResource
    251  * @encoding: the text encoding name of the #WebKitWebResource
    252  * @frame_name: the frame name of the #WebKitWebResource
    253  *
    254  * Returns a new #WebKitWebResource. The @encoding can be %NULL. The
    255  * @frame_name argument can be used if the resource represents contents of an
    256  * entire HTML frame, otherwise pass %NULL.
    257  *
    258  * Return value: a new #WebKitWebResource
    259  *
    260  * Since: 1.1.14
    261  */
    262 WebKitWebResource* webkit_web_resource_new(const gchar* data,
    263                                            gssize size,
    264                                            const gchar* uri,
    265                                            const gchar* mimeType,
    266                                            const gchar* encoding,
    267                                            const gchar* frameName)
    268 {
    269     g_return_val_if_fail(data, NULL);
    270     g_return_val_if_fail(uri, NULL);
    271     g_return_val_if_fail(mimeType, NULL);
    272 
    273     if (size < 0)
    274         size = strlen(data);
    275 
    276     RefPtr<SharedBuffer> buffer = SharedBuffer::create(data, size);
    277     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)));
    278 
    279     return webResource;
    280 }
    281 
    282 /**
    283  * webkit_web_resource_get_data:
    284  * @web_resource: a #WebKitWebResource
    285  *
    286  * Returns the data of the @webResource.
    287  *
    288  * Return value: a #GString containing the character data of the @webResource.
    289  * The string is owned by WebKit and should not be freed or destroyed.
    290  *
    291  * Since: 1.1.14
    292  */
    293 GString* webkit_web_resource_get_data(WebKitWebResource* webResource)
    294 {
    295     g_return_val_if_fail(WEBKIT_IS_WEB_RESOURCE(webResource), NULL);
    296 
    297     WebKitWebResourcePrivate* priv = webResource->priv;
    298 
    299     if (!priv->resource)
    300         return NULL;
    301 
    302     if (!priv->data)
    303         priv->data = g_string_new_len(priv->resource->data()->data(), priv->resource->data()->size());
    304 
    305     return priv->data;
    306 }
    307 
    308 /**
    309  * webkit_web_resource_get_uri:
    310  * @web_resource: a #WebKitWebResource
    311  *
    312  * Return value: the URI of the resource
    313  *
    314  * Since: 1.1.14
    315  */
    316 G_CONST_RETURN gchar* webkit_web_resource_get_uri(WebKitWebResource* webResource)
    317 {
    318     g_return_val_if_fail(WEBKIT_IS_WEB_RESOURCE(webResource), NULL);
    319 
    320     WebKitWebResourcePrivate* priv = webResource->priv;
    321 
    322 
    323     // We may have an URI without having a resource assigned to us (e.g., if the
    324     // FrameLoaderClient only had a ResourceRequest when we got created
    325     if (priv->uri)
    326         return priv->uri;
    327 
    328     if (!priv->resource)
    329         return NULL;
    330 
    331     priv->uri = g_strdup(priv->resource->url().string().utf8().data());
    332 
    333     return priv->uri;
    334 }
    335 
    336 /**
    337  * webkit_web_resource_get_mime_type:
    338  * @web_resource: a #WebKitWebResource
    339  *
    340  * Return value: the MIME type of the resource
    341  *
    342  * Since: 1.1.14
    343  */
    344 G_CONST_RETURN gchar* webkit_web_resource_get_mime_type(WebKitWebResource* webResource)
    345 {
    346     g_return_val_if_fail(WEBKIT_IS_WEB_RESOURCE(webResource), NULL);
    347 
    348     WebKitWebResourcePrivate* priv = webResource->priv;
    349     if (!priv->resource)
    350         return NULL;
    351 
    352     if (!priv->mimeType)
    353         priv->mimeType = g_strdup(priv->resource->mimeType().utf8().data());
    354 
    355     return priv->mimeType;
    356 }
    357 
    358 /**
    359  * webkit_web_resource_get_encoding:
    360  * @web_resource: a #WebKitWebResource
    361  *
    362  * Return value: the encoding name of the resource
    363  *
    364  * Since: 1.1.14
    365  */
    366 G_CONST_RETURN gchar* webkit_web_resource_get_encoding(WebKitWebResource* webResource)
    367 {
    368     g_return_val_if_fail(WEBKIT_IS_WEB_RESOURCE(webResource), NULL);
    369 
    370     WebKitWebResourcePrivate* priv = webResource->priv;
    371     if (!priv->resource)
    372         return NULL;
    373 
    374     if (!priv->textEncoding)
    375         priv->textEncoding = g_strdup(priv->resource->textEncoding().utf8().data());
    376 
    377     return priv->textEncoding;
    378 }
    379 
    380 /**
    381  * webkit_web_resource_get_frame_name:
    382  * @web_resource: a #WebKitWebResource
    383  *
    384  * Return value: the frame name of the resource.
    385  *
    386  * Since: 1.1.14
    387  */
    388 G_CONST_RETURN gchar* webkit_web_resource_get_frame_name(WebKitWebResource* webResource)
    389 {
    390     g_return_val_if_fail(WEBKIT_IS_WEB_RESOURCE(webResource), NULL);
    391 
    392     WebKitWebResourcePrivate* priv = webResource->priv;
    393     if (!priv->resource)
    394         return NULL;
    395 
    396     if (!priv->frameName)
    397         priv->frameName = g_strdup(priv->resource->frameName().utf8().data());
    398 
    399     return priv->frameName;
    400 }
    401 
    402