Changeset 51825 in webkit


Ignore:
Timestamp:
Dec 7, 2009 6:44:05 PM (14 years ago)
Author:
kov@webkit.org
Message:

WebCore

Reviewed by Xan Lopez.

[GTK] Doesn't respect Content-Disposition for downloads, and provides no way for apps to do that
https://bugs.webkit.org/show_bug.cgi?id=32247

Allow creating a ResourceResponse from a SoupMessage.

Covered by API test.

  • platform/network/soup/ResourceResponse.h: (WebCore::ResourceResponse::ResourceResponse):
  • platform/network/soup/ResourceResponseSoup.cpp: (WebCore::ResourceResponse::updateFromSoupMessage):

WebKit/gtk

Reviewed by Xan Lopez.

[GTK] Doesn't respect Content-Disposition for downloads, and provides no way for apps to do that
https://bugs.webkit.org/show_bug.cgi?id=32247

Provide a way for applications to respect Content-Disposition, by
fetching the WebKitNetworkResponse from the frame during
mime-type-policy-decision-requested.

  • WebCoreSupport/FrameLoaderClientGtk.cpp: (WebKit::FrameLoaderClient::dispatchDecidePolicyForMIMEType): Download content when Content-Disposition is attachment.
  • tests/testmimehandling.c: (server_callback): (mime_type_policy_decision_requested_cb):
  • tests/testwebframe.c: (test_webkit_web_frame_response): (main):
  • webkit/webkitprivate.cpp: (WebKit::core):
  • webkit/webkitwebframe.cpp: (webkit_web_frame_get_network_response):
  • webkit/webkitwebframe.h:
Location:
trunk
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r51823 r51825  
     12009-12-08  Gustavo Noronha Silva  <gustavo.noronha@collabora.co.uk>
     2
     3        Reviewed by Xan Lopez.
     4
     5        [GTK] Doesn't respect Content-Disposition for downloads, and provides no way for apps to do that
     6        https://bugs.webkit.org/show_bug.cgi?id=32247
     7
     8        Allow creating a ResourceResponse from a SoupMessage.
     9
     10        Covered by API test.
     11
     12        * platform/network/soup/ResourceResponse.h:
     13        (WebCore::ResourceResponse::ResourceResponse):
     14        * platform/network/soup/ResourceResponseSoup.cpp:
     15        (WebCore::ResourceResponse::updateFromSoupMessage):
     16
    1172009-12-07  Nikolas Zimmermann  <nzimmermann@rim.com>
    218
  • trunk/WebCore/platform/network/soup/ResourceResponse.h

    r48118 r51825  
    4545    }
    4646
     47    ResourceResponse(SoupMessage* soupMessage)
     48        : ResourceResponseBase()
     49    {
     50        updateFromSoupMessage(soupMessage);
     51    }
     52
    4753    SoupMessage* toSoupMessage() const;
     54    void updateFromSoupMessage(SoupMessage* soupMessage);
    4855
    4956private:
  • trunk/WebCore/platform/network/soup/ResourceResponseSoup.cpp

    r48118 r51825  
    2323
    2424#include "CString.h"
     25#include "GOwnPtr.h"
    2526#include "PlatformString.h"
    2627
     
    5051}
    5152
     53void ResourceResponse::updateFromSoupMessage(SoupMessage* soupMessage)
     54{
     55    SoupURI* soupURI = soup_message_get_uri(soupMessage);
     56    GOwnPtr<gchar> uri(soup_uri_to_string(soupURI, FALSE));
     57    m_url = KURL(KURL(), String::fromUTF8(uri.get()));
     58
     59    m_httpStatusCode = soupMessage->status_code;
     60
     61    SoupMessageHeadersIter headersIter;
     62    const char* headerName;
     63    const char* headerValue;
     64
     65    soup_message_headers_iter_init(&headersIter, soupMessage->response_headers);
     66    while (soup_message_headers_iter_next(&headersIter, &headerName, &headerValue))
     67        m_httpHeaderFields.set(String::fromUTF8(headerName), String::fromUTF8(headerValue));
    5268}
     69
     70}
  • trunk/WebKit/gtk/ChangeLog

    r51783 r51825  
     12009-12-07  Gustavo Noronha Silva  <gustavo.noronha@collabora.co.uk>
     2
     3        Reviewed by Xan Lopez.
     4
     5        [GTK] Doesn't respect Content-Disposition for downloads, and provides no way for apps to do that
     6        https://bugs.webkit.org/show_bug.cgi?id=32247
     7
     8        Provide a way for applications to respect Content-Disposition, by
     9        fetching the WebKitNetworkResponse from the frame during
     10        mime-type-policy-decision-requested.
     11
     12        * WebCoreSupport/FrameLoaderClientGtk.cpp:
     13        (WebKit::FrameLoaderClient::dispatchDecidePolicyForMIMEType): Download
     14        content when Content-Disposition is attachment.
     15        * tests/testmimehandling.c:
     16        (server_callback):
     17        (mime_type_policy_decision_requested_cb):
     18        * tests/testwebframe.c:
     19        (test_webkit_web_frame_response):
     20        (main):
     21        * webkit/webkitprivate.cpp:
     22        (WebKit::core):
     23        * webkit/webkitwebframe.cpp:
     24        (webkit_web_frame_get_network_response):
     25        * webkit/webkitwebframe.h:
     26
    1272009-12-07  Gyuyoung Kim  <gyuyoung@gmail.com>
    228
  • trunk/WebKit/gtk/WebCoreSupport/FrameLoaderClientGtk.cpp

    r51644 r51825  
    306306        return;
    307307
     308    GOwnPtr<WebKitNetworkResponse> networkResponse(webkit_web_frame_get_network_response(m_frame));
     309    if (networkResponse) {
     310        ResourceResponse response = core(networkResponse.get());
     311        if (response.isAttachment()) {
     312            webkit_web_policy_decision_download(policyDecision);
     313            return;
     314        }
     315    }
     316
    308317    if (canShowMIMEType(mimeType))
    309         webkit_web_policy_decision_use (policyDecision);
     318        webkit_web_policy_decision_use(policyDecision);
    310319    else
    311         webkit_web_policy_decision_ignore (policyDecision);
     320        webkit_web_policy_decision_ignore(policyDecision);
    312321}
    313322
  • trunk/WebKit/gtk/tests/testmimehandling.c

    r51764 r51825  
    6868        GError* error = NULL;
    6969
     70        soup_message_headers_append(msg->response_headers, "Content-Disposition", "attachment; filename=test.txt");
     71
    7072        g_file_get_contents("test.txt", &contents, &length, &error);
    7173        g_assert(!error);
     
    105107        g_assert(webkit_web_view_can_show_mime_type(view, mime_type));
    106108    } else if (g_str_equal(type, "text")) {
     109        WebKitNetworkResponse* response = webkit_web_frame_get_network_response(frame);
     110        SoupMessage* message = webkit_network_response_get_message(response);
     111        char* disposition;
     112
     113        g_assert(message);
     114        soup_message_headers_get_content_disposition(message->response_headers,
     115                                                     &disposition, NULL);
     116        g_object_unref(response);
     117
     118        g_assert_cmpstr(disposition, ==, "attachment");
     119        g_free(disposition);
     120
    107121        g_assert_cmpstr(mime_type, ==, "text/plain");
    108122        g_assert(webkit_web_view_can_show_mime_type(view, mime_type));
  • trunk/WebKit/gtk/tests/testwebframe.c

    r43530 r51825  
    156156}
    157157
     158static void test_webkit_web_frame_response()
     159{
     160    WebKitWebFrame* frame = g_object_new(WEBKIT_TYPE_WEB_FRAME, NULL);
     161    WebKitNetworkResponse* response = webkit_web_frame_get_network_response(frame);
     162    g_assert(!response);
     163    g_object_unref(frame);
     164}
     165
    158166int main(int argc, char** argv)
    159167{
     
    165173    g_test_add_func("/webkit/webframe/lifetime", test_webkit_web_frame_lifetime);
    166174    g_test_add_func("/webkit/webview/printing", test_webkit_web_frame_printing);
     175    g_test_add_func("/webkit/webview/response", test_webkit_web_frame_response);
    167176    return g_test_run ();
    168177}
  • trunk/WebKit/gtk/webkit/webkitprivate.cpp

    r50507 r51825  
    3838#include "ResourceHandleClient.h"
    3939#include "ResourceHandleInternal.h"
     40#include "ResourceResponse.h"
    4041#include <runtime/InitializeThreading.h>
    4142#include "SecurityOrigin.h"
     43#include "webkitnetworkresponse.h"
    4244
    4345#if ENABLE(DATABASE)
     
    111113    KURL url = KURL(KURL(), String::fromUTF8(webkit_network_request_get_uri(request)));
    112114    return ResourceRequest(url);
     115}
     116
     117WebCore::ResourceResponse core(WebKitNetworkResponse* response)
     118{
     119    SoupMessage* soupMessage = webkit_network_response_get_message(response);
     120    if (soupMessage)
     121        return ResourceResponse(soupMessage);
     122
     123    return ResourceResponse();
    113124}
    114125
  • trunk/WebKit/gtk/webkit/webkitwebframe.cpp

    r51567 r51825  
    11421142    view->layout();
    11431143}
     1144
     1145/**
     1146 * webkit_web_frame_get_network_response:
     1147 * @frame: a #WebKitWebFrame
     1148 *
     1149 * Returns a #WebKitNetworkResponse object representing the response
     1150 * that was given to the request for the given frame, or NULL if the
     1151 * frame was not created by a load. You must unref the object when you
     1152 * are done with it.
     1153 *
     1154 * Return value: a #WebKitNetworkResponse object
     1155 *
     1156 * Since: 1.1.18
     1157 */
     1158WebKitNetworkResponse* webkit_web_frame_get_network_response(WebKitWebFrame* frame)
     1159{
     1160    Frame* coreFrame = core(frame);
     1161    if (!coreFrame)
     1162        return NULL;
     1163
     1164    WebCore::DocumentLoader* loader = coreFrame->loader()->activeDocumentLoader();
     1165    if (!loader)
     1166        return NULL;
     1167
     1168    return webkit_network_response_new_with_core_response(loader->response());
     1169}
  • trunk/WebKit/gtk/webkit/webkitwebframe.h

    r49168 r51825  
    173173webkit_web_frame_get_security_origin         (WebKitWebFrame       *frame);
    174174
     175WEBKIT_API WebKitNetworkResponse*
     176webkit_web_frame_get_network_response        (WebKitWebFrame       *frame);
     177
    175178G_END_DECLS
    176179
Note: See TracChangeset for help on using the changeset viewer.