Changeset 44263 in webkit


Ignore:
Timestamp:
May 29, 2009 7:48:33 AM (15 years ago)
Author:
kov@webkit.org
Message:

2009-05-29 Gustavo Noronha Silva <Gustavo Noronha Silva>

Reviewed by Jan Alonzo.

Add a test-case for our HTTP backend, currently checking the
ref-counting of the SoupMessage.

  • GNUmakefile.am:

WebCore:

2009-05-29 Gustavo Noronha Silva <Gustavo Noronha Silva>

Reviewed by Jan Alonzo.

Make SoupMessage a member of ResourceRequest, instead of creating
it in startHttp. Implement updating of ResourceRequest from
SoupMessage, and vice versa.

  • GNUmakefile.am:
  • platform/network/soup/ResourceHandleSoup.cpp: (WebCore::ResourceHandle::~ResourceHandle): (WebCore::gotHeadersCallback): (WebCore::ResourceHandle::startHttp):
  • platform/network/soup/ResourceRequest.h: (WebCore::ResourceRequest::ResourceRequest): (WebCore::ResourceRequest::~ResourceRequest):
  • platform/network/soup/ResourceRequestSoup.cpp: Added. (WTF::SoupURI): (WebCore::ResourceRequest::soupMessage): (WebCore::ResourceRequest::ResourceRequest): (WebCore::ResourceRequest::doUpdateResourceRequest): (WebCore::ResourceRequest::doUpdatePlatformRequest):

WebKit/gtk:

2009-05-29 Gustavo Noronha Silva <Gustavo Noronha Silva>

Reviewed by Jan Alonzo.

Make NetworkRequest carry a reference of the SoupMessage used by
ResourceRequest, and use that to create new ResourceRequests where
needed, so that no information is lost while passing around
NetworkRequest objects.

  • WebCoreSupport/FrameLoaderClientGtk.cpp: (WebKit::FrameLoaderClient::dispatchDecidePolicyForMIMEType): (WebKit::FrameLoaderClient::dispatchDecidePolicyForNavigationAction): (WebKit::FrameLoaderClient::startDownload):
  • webkit/webkitdownload.cpp: (webkit_download_start):
  • webkit/webkitnetworkrequest.cpp: (webkit_network_request_finalize): (webkit_network_request_new_with_core_request): (webkit_network_request_new): (webkit_network_request_get_message):
  • webkit/webkitprivate.h:
  • webkit/webkitwebframe.cpp: (webkit_web_frame_load_request):
Location:
trunk
Files:
2 added
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/ChangeLog

    r44253 r44263  
     12009-05-29  Gustavo Noronha Silva  <gns@gnome.org>
     2
     3        Reviewed by Jan Alonzo.
     4
     5        Add a test-case for our HTTP backend, currently checking the
     6        ref-counting of the SoupMessage.
     7
     8        * GNUmakefile.am:
     9
    1102009-05-28  Dirk Schulze  <krit@webkit.org>
    211
  • trunk/GNUmakefile.am

    r44246 r44263  
    524524        -no-fast-install
    525525
    526 TEST_PROGS += Programs/unittests/testwebframe \
     526TEST_PROGS += Programs/unittests/testhttpbackend \
     527        Programs/unittests/testwebframe \
    527528        Programs/unittests/testwebbackforwardlist \
    528529        Programs/unittests/testwebhistoryitem \
     
    531532
    532533# Add additional tests here
     534Programs_unittests_testhttpbackend_SOURCES = WebKit/gtk/tests/testhttpbackend.c
     535Programs_unittests_testhttpbackend_CFLAGS = $(webkit_tests_cflags)
     536Programs_unittests_testhttpbackend_LDADD = $(webkit_tests_ldadd)
     537Programs_unittests_testhttpbackend_LDFLAGS = $(webkit_tests_ldflags)
     538
    533539Programs_unittests_testwebframe_SOURCES = WebKit/gtk/tests/testwebframe.c
    534540Programs_unittests_testwebframe_CFLAGS = $(webkit_tests_cflags)
  • trunk/WebCore/ChangeLog

    r44256 r44263  
     12009-05-29  Gustavo Noronha Silva  <gns@gnome.org>
     2
     3        Reviewed by Jan Alonzo.
     4
     5        Make SoupMessage a member of ResourceRequest, instead of creating
     6        it in startHttp. Implement updating of ResourceRequest from
     7        SoupMessage, and vice versa.
     8
     9        * GNUmakefile.am:
     10        * platform/network/soup/ResourceHandleSoup.cpp:
     11        (WebCore::ResourceHandle::~ResourceHandle):
     12        (WebCore::gotHeadersCallback):
     13        (WebCore::ResourceHandle::startHttp):
     14        * platform/network/soup/ResourceRequest.h:
     15        (WebCore::ResourceRequest::ResourceRequest):
     16        (WebCore::ResourceRequest::~ResourceRequest):
     17        * platform/network/soup/ResourceRequestSoup.cpp: Added.
     18        (WTF::SoupURI):
     19        (WebCore::ResourceRequest::soupMessage):
     20        (WebCore::ResourceRequest::ResourceRequest):
     21        (WebCore::ResourceRequest::doUpdateResourceRequest):
     22        (WebCore::ResourceRequest::doUpdatePlatformRequest):
     23
    1242009-05-28  Dmitry Titov  <dimich@chromium.org>
    225
  • trunk/WebCore/GNUmakefile.am

    r44253 r44263  
    18801880        WebCore/platform/network/soup/ResourceError.h \
    18811881        WebCore/platform/network/soup/ResourceHandleSoup.cpp \
     1882        WebCore/platform/network/soup/ResourceRequestSoup.cpp \
    18821883        WebCore/platform/network/soup/ResourceRequest.h \
    18831884        WebCore/platform/network/soup/ResourceResponse.h \
  • trunk/WebCore/platform/network/soup/ResourceHandleSoup.cpp

    r44254 r44263  
    137137ResourceHandle::~ResourceHandle()
    138138{
     139    if (d->m_msg)
     140        g_signal_handlers_disconnect_matched(d->m_msg, G_SIGNAL_MATCH_DATA,
     141                                             0, 0, 0, 0, this);
    139142}
    140143
     
    257260        return;
    258261
    259     ResourceHandle* handle = static_cast<ResourceHandle*>(data);
     262    RefPtr<ResourceHandle> handle = static_cast<ResourceHandle*>(data);
    260263    if (!handle)
    261264        return;
     
    268271
    269272    fillResponseFromMessage(msg, &d->m_response);
    270     client->didReceiveResponse(handle, d->m_response);
    271273    d->m_reportedHeaders = true;
     274    client->didReceiveResponse(handle.get(), d->m_response);
    272275}
    273276
     
    466469    ensureSessionIsInitialized(session);
    467470
    468     SoupMessage* msg;
    469     msg = soup_message_new(request().httpMethod().utf8().data(), urlString.utf8().data());
    470     g_signal_connect(msg, "restarted", G_CALLBACK(restartedCallback), this);
    471     g_signal_connect(msg, "got-headers", G_CALLBACK(gotHeadersCallback), this);
    472     g_signal_connect(msg, "got-chunk", G_CALLBACK(gotChunkCallback), this);
    473 
    474     g_object_set_data(G_OBJECT(msg), "resourceHandle", reinterpret_cast<void*>(this));
    475 
    476     HTTPHeaderMap customHeaders = d->m_request.httpHeaderFields();
    477     if (!customHeaders.isEmpty()) {
    478         HTTPHeaderMap::const_iterator end = customHeaders.end();
    479         for (HTTPHeaderMap::const_iterator it = customHeaders.begin(); it != end; ++it)
    480             soup_message_headers_append(msg->request_headers, it->first.string().utf8().data(), it->second.utf8().data());
    481     }
     471    d->m_msg = static_cast<SoupMessage*>(g_object_ref(request().soupMessage()));
     472    g_signal_connect(d->m_msg, "restarted", G_CALLBACK(restartedCallback), this);
     473    g_signal_connect(d->m_msg, "got-headers", G_CALLBACK(gotHeadersCallback), this);
     474    g_signal_connect(d->m_msg, "got-chunk", G_CALLBACK(gotChunkCallback), this);
     475
     476    g_object_set_data(G_OBJECT(d->m_msg), "resourceHandle", reinterpret_cast<void*>(this));
    482477
    483478    FormData* httpBody = d->m_request.httpBody();
     
    489484            Vector<char> body;
    490485            httpBody->flatten(body);
    491             soup_message_set_request(msg, d->m_request.httpContentType().utf8().data(),
     486            soup_message_set_request(d->m_msg, d->m_request.httpContentType().utf8().data(),
    492487                                     SOUP_MEMORY_COPY, body.data(), body.size());
    493488        } else {
     
    498493             * (think sftp://) files by using GIO?
    499494             */
    500             soup_message_body_set_accumulate(msg->request_body, FALSE);
     495            soup_message_body_set_accumulate(d->m_msg->request_body, FALSE);
    501496            for (size_t i = 0; i < numElements; i++) {
    502497                const FormDataElement& element = httpBody->elements()[i];
    503498
    504499                if (element.m_type == FormDataElement::data)
    505                     soup_message_body_append(msg->request_body, SOUP_MEMORY_TEMPORARY, element.m_data.data(), element.m_data.size());
     500                    soup_message_body_append(d->m_msg->request_body, SOUP_MEMORY_TEMPORARY, element.m_data.data(), element.m_data.size());
    506501                else {
    507502                    /*
     
    517512                    if (error) {
    518513                        ResourceError resourceError(g_quark_to_string(SOUP_HTTP_ERROR),
    519                                                     msg->status_code,
     514                                                    d->m_msg->status_code,
    520515                                                    urlString,
    521516                                                    String::fromUTF8(error->message));
     
    524519                        d->client()->didFail(this, resourceError);
    525520
    526                         g_object_unref(msg);
     521                        g_signal_handlers_disconnect_matched(d->m_msg, G_SIGNAL_MATCH_DATA,
     522                                                             0, 0, 0, 0, this);
     523                        g_object_unref(d->m_msg);
     524                        d->m_msg = 0;
     525
    527526                        return false;
    528527                    }
     
    531530                                                                        g_mapped_file_get_length(fileMapping),
    532531                                                                        fileMapping, reinterpret_cast<GDestroyNotify>(g_mapped_file_free));
    533                     soup_message_body_append_buffer(msg->request_body, soupBuffer);
     532                    soup_message_body_append_buffer(d->m_msg->request_body, soupBuffer);
    534533                    soup_buffer_free(soupBuffer);
    535534                }
     
    538537    }
    539538
    540     d->m_msg = static_cast<SoupMessage*>(g_object_ref(msg));
    541539    // balanced by a deref() in finishedCallback, which should always run
    542540    ref();
     
    547545    // use it here instead.
    548546    soup_message_headers_replace(d->m_msg->request_headers, "Accept-Encoding", "identity");
     547
     548    // Balanced in ResourceRequest's destructor; we need to keep our
     549    // own ref, because after queueing the message, the session owns
     550    // the initial reference. We cannot ref the message in
     551    // ResourceRequest because not all request objects are queued.
     552    g_object_ref(d->m_msg);
    549553    soup_session_queue_message(session, d->m_msg, finishedCallback, this);
    550554
  • trunk/WebCore/platform/network/soup/ResourceRequest.h

    r35900 r44263  
    3030#include "ResourceRequestBase.h"
    3131
     32#include <libsoup/soup.h>
     33
    3234namespace WebCore {
    3335
     
    3638        ResourceRequest(const String& url)
    3739            : ResourceRequestBase(KURL(url), UseProtocolCachePolicy)
     40            , m_soupMessage(0)
    3841        {
    3942        }
     
    4144        ResourceRequest(const KURL& url)
    4245            : ResourceRequestBase(url, UseProtocolCachePolicy)
     46            , m_soupMessage(0)
    4347        {
    4448        }
     
    4650        ResourceRequest(const KURL& url, const String& referrer, ResourceRequestCachePolicy policy = UseProtocolCachePolicy)
    4751            : ResourceRequestBase(url, policy)
     52            , m_soupMessage(0)
    4853        {
    4954            setHTTPReferrer(referrer);
     
    5257        ResourceRequest()
    5358            : ResourceRequestBase(KURL(), UseProtocolCachePolicy)
     59            , m_soupMessage(0)
    5460        {
    5561        }
    5662
     63        ResourceRequest(SoupMessage* soupMessage)
     64            : ResourceRequestBase()
     65            , m_soupMessage(soupMessage)
     66        {
     67            g_object_ref(soupMessage);
     68        }
     69
     70        // We force copies of ResourceRequest to create their own
     71        // SoupMessage, if needed.
     72        ResourceRequest(const ResourceRequest& resourceRequest);
     73
     74        ~ResourceRequest()
     75        {
     76            if (m_soupMessage) {
     77                g_object_unref(m_soupMessage);
     78                m_soupMessage = 0;
     79            }
     80        }
     81
     82        SoupMessage* soupMessage() const;
     83
    5784    private:
     85        SoupMessage* m_soupMessage;
    5886        friend class ResourceRequestBase;
    5987
    60         void doUpdatePlatformRequest() {}
    61         void doUpdateResourceRequest() {}
     88        void doUpdatePlatformRequest();
     89        void doUpdateResourceRequest();
    6290    };
    6391
  • trunk/WebKit/gtk/ChangeLog

    r44248 r44263  
     12009-05-29  Gustavo Noronha Silva  <gns@gnome.org>
     2
     3        Reviewed by Jan Alonzo.
     4
     5        Make NetworkRequest carry a reference of the SoupMessage used by
     6        ResourceRequest, and use that to create new ResourceRequests where
     7        needed, so that no information is lost while passing around
     8        NetworkRequest objects.
     9
     10        * WebCoreSupport/FrameLoaderClientGtk.cpp:
     11        (WebKit::FrameLoaderClient::dispatchDecidePolicyForMIMEType):
     12        (WebKit::FrameLoaderClient::dispatchDecidePolicyForNavigationAction):
     13        (WebKit::FrameLoaderClient::startDownload):
     14        * webkit/webkitdownload.cpp:
     15        (webkit_download_start):
     16        * webkit/webkitnetworkrequest.cpp:
     17        (webkit_network_request_finalize):
     18        (webkit_network_request_new_with_core_request):
     19        (webkit_network_request_new):
     20        (webkit_network_request_get_message):
     21        * webkit/webkitprivate.h:
     22        * webkit/webkitwebframe.cpp:
     23        (webkit_web_frame_load_request):
     24
    1252009-05-28  Gustavo Noronha Silva  <gustavo.noronha@collabora.co.uk>
    226
  • trunk/WebKit/gtk/WebCoreSupport/FrameLoaderClientGtk.cpp

    r44183 r44263  
    312312
    313313    WebKitWebView* page = getViewFromFrame(m_frame);
    314     WebKitNetworkRequest* request = webkit_network_request_new(resourceRequest.url().string().utf8().data());
     314    WebKitNetworkRequest* request = webkit_network_request_new_with_core_request(resourceRequest);
    315315
    316316    WebKitWebPolicyDecision* policyDecision = webkit_web_policy_decision_new(m_frame, policyFunction);
     
    411411
    412412    WebKitWebView* webView = getViewFromFrame(m_frame);
    413     WebKitNetworkRequest* request = webkit_network_request_new(resourceRequest.url().string().utf8().data());
     413    WebKitNetworkRequest* request = webkit_network_request_new_with_core_request(resourceRequest);
    414414    WebKitNavigationResponse response;
    415415    /*
     
    10321032void FrameLoaderClient::startDownload(const ResourceRequest& request)
    10331033{
    1034     WebKitNetworkRequest* networkRequest = webkit_network_request_new(request.url().string().utf8().data());
     1034    WebKitNetworkRequest* networkRequest = webkit_network_request_new_with_core_request(request);
    10351035    WebKitWebView* view = getViewFromFrame(m_frame);
    10361036
  • trunk/WebKit/gtk/webkit/webkitdownload.cpp

    r43319 r44263  
    422422    if (priv->resourceHandle)
    423423        priv->resourceHandle->setClient(priv->downloadClient);
    424     else {
    425         // FIXME: Use the actual request object when WebKitNetworkRequest is finished.
    426         ResourceRequest request(webkit_network_request_get_uri(priv->networkRequest));
    427         priv->resourceHandle = ResourceHandle::create(request, priv->downloadClient, 0, false, false, false);
    428     }
     424    else
     425        priv->resourceHandle = ResourceHandle::create(ResourceRequest(webkit_network_request_get_message(priv->networkRequest)), priv->downloadClient, 0, false, false, false);
    429426
    430427    priv->timer = g_timer_new();
  • trunk/WebKit/gtk/webkit/webkitnetworkrequest.cpp

    r44077 r44263  
    11/*
    22 * Copyright (C) 2007, 2008 Holger Hans Peter Freyther
     3 * Copyright (C) 2009 Gustavo Noronha Silva
    34 *
    45 * This library is free software; you can redistribute it and/or
     
    1920
    2021#include "config.h"
     22#include "webkitnetworkrequest.h"
    2123
    22 #include "webkitnetworkrequest.h"
     24#include "CString.h"
     25#include "ResourceRequest.h"
     26#include "webkitprivate.h"
    2327
    2428/**
     
    3943struct _WebKitNetworkRequestPrivate {
    4044    gchar* uri;
     45    SoupMessage* message;
    4146};
    4247
     
    4954
    5055    g_free(priv->uri);
     56
     57    if (priv->message) {
     58        g_object_unref(priv->message);
     59        priv->message = NULL;
     60    }
    5161
    5262    G_OBJECT_CLASS(webkit_network_request_parent_class)->finalize(object);
     
    6676}
    6777
     78// for internal use only
     79WebKitNetworkRequest* webkit_network_request_new_with_core_request(const WebCore::ResourceRequest& resourceRequest)
     80{
     81    WebKitNetworkRequest* request = WEBKIT_NETWORK_REQUEST(g_object_new(WEBKIT_TYPE_NETWORK_REQUEST, NULL));
     82    WebKitNetworkRequestPrivate* priv = request->priv;
     83
     84    SoupMessage* soupMessage = resourceRequest.soupMessage();
     85    if (soupMessage)
     86        priv->message = SOUP_MESSAGE(g_object_ref(soupMessage));
     87    priv->uri = g_strdup(resourceRequest.url().string().utf8().data());
     88
     89    return request;
     90}
     91
    6892/**
    6993 * webkit_network_request_new:
     
    7296 * Creates a new #WebKitNetworkRequest initialized with an URI.
    7397 *
    74  * Returns: a new #WebKitNetworkRequest
     98 * Returns: a new #WebKitNetworkRequest, or %NULL if the URI is
     99 * invalid.
    75100 */
    76101WebKitNetworkRequest* webkit_network_request_new(const gchar* uri)
     
    80105    WebKitNetworkRequest* request = WEBKIT_NETWORK_REQUEST(g_object_new(WEBKIT_TYPE_NETWORK_REQUEST, NULL));
    81106    WebKitNetworkRequestPrivate* priv = request->priv;
     107
     108    priv->message = soup_message_new("GET", uri);
     109    if (!priv->message)
     110        return NULL;
    82111
    83112    priv->uri = g_strdup(uri);
     
    119148    return priv->uri;
    120149}
     150
     151// NOT YET API; For internal use only, for now
     152// webkit_network_request_get_soup_message:
     153// @request: a #WebKitNetworkRequest
     154//
     155// Obtains the #SoupMessage held and used by the given request. Notice
     156// that modification of the SoupMessage of a request by signal
     157// handlers is only supported where explicitly documented.
     158//
     159// Returns: the #SoupMessage
     160SoupMessage* webkit_network_request_get_message(WebKitNetworkRequest* request)
     161{
     162    g_return_val_if_fail(WEBKIT_IS_NETWORK_REQUEST(request), NULL);
     163
     164    WebKitNetworkRequestPrivate* priv = request->priv;
     165
     166    return priv->message;
     167}
  • trunk/WebKit/gtk/webkit/webkitprivate.h

    r44228 r44263  
    2424
    2525/*
    26  * This file knows the shared secret of WebKitWebView and WebKitWebFrame.
     26 * This file knows the shared secret of WebKitWebView, WebKitWebFrame,
     27 * and WebKitNetworkRequest.
    2728 * They are using WebCore which musn't be exposed to the outer world.
    2829 */
     
    3839#include <webkit/webkitwebwindowfeatures.h>
    3940#include <webkit/webkitwebbackforwardlist.h>
     41#include <webkit/webkitnetworkrequest.h>
    4042
    4143#include "BackForwardList.h"
     
    4850#include "FrameLoaderClient.h"
    4951#include "ResourceHandle.h"
     52#include "ResourceRequest.h"
    5053#include "ResourceResponse.h"
    5154#include "WindowFeatures.h"
    5255
    5356#include <glib.h>
     57#include <libsoup/soup.h>
    5458
    5559class DownloadClient;
     
    181185    webkit_web_policy_decision_cancel (WebKitWebPolicyDecision* decision);
    182186
     187    WebKitNetworkRequest*
     188    webkit_network_request_new_with_core_request(const WebCore::ResourceRequest& resourceRequest);
     189
     190    // FIXME: move this to webkitnetworkrequest.h once the API is agreed upon.
     191    WEBKIT_API SoupMessage*
     192    webkit_network_request_get_message(WebKitNetworkRequest* request);
     193
    183194    // FIXME: move this functionality into a 'WebKitWebDataSource' once implemented
    184195    WEBKIT_API gchar*
  • trunk/WebKit/gtk/webkit/webkitwebframe.cpp

    r43302 r44263  
    511511        return;
    512512
    513     // TODO: Use the ResourceRequest carried by WebKitNetworkRequest when it is implemented.
    514     String string = String::fromUTF8(webkit_network_request_get_uri(request));
    515     coreFrame->loader()->load(ResourceRequest(KURL(KURL(), string)), false);
     513    coreFrame->loader()->load(ResourceRequest(webkit_network_request_get_message(request)), false);
    516514}
    517515
Note: See TracChangeset for help on using the changeset viewer.