Allow retrieving the Soup session and modify the code to take
authorchristian@webkit.org <christian@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 23 Feb 2009 11:24:02 +0000 (11:24 +0000)
committerchristian@webkit.org <christian@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 23 Feb 2009 11:24:02 +0000 (11:24 +0000)
into account users changing features on it.

https://bugs.webkit.org/show_bug.cgi?id=22624
[SOUP][GTK] Need API to get SoupSession from WebKit.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@41139 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog
WebCore/platform/network/ResourceHandle.h
WebCore/platform/network/soup/CookieJarSoup.cpp
WebCore/platform/network/soup/CookieJarSoup.h
WebCore/platform/network/soup/ResourceHandleSoup.cpp
WebKit/gtk/ChangeLog
WebKit/gtk/webkit/webkitwebview.cpp
WebKit/gtk/webkit/webkitwebview.h

index 021bb41..961bc0f 100644 (file)
@@ -5,6 +5,28 @@
         https://bugs.webkit.org/show_bug.cgi?id=22624
         [SOUP][GTK] Need API to get SoupSession from WebKit.
 
+        Allow to retrieve the Soup session and modify the code to take
+        into account users changing features on it.
+
+        * platform/network/ResourceHandle.h:
+        * platform/network/soup/CookieJarSoup.cpp:
+        (WebCore::defaultCookieJar):
+        (WebCore::setDefaultCookieJar):
+        * platform/network/soup/CookieJarSoup.h:
+        * platform/network/soup/ResourceHandleSoup.cpp:
+        (WebCore::createSoupSession):
+        (WebCore::ensureSessionIsInitialized):
+        (WebCore::ResourceHandle::startHttp):
+        (WebCore::ResourceHandle::cancel):
+        (WebCore::ResourceHandle::defaultSession):
+
+2009-02-23  Xan Lopez  <xan@gnome.org>
+
+        Reviewed by Alexey Proskuryakov.
+
+        https://bugs.webkit.org/show_bug.cgi?id=22624
+        [SOUP][GTK] Need API to get SoupSession from WebKit.
+
         Remove CURL support.
 
         * GNUmakefile.am:
index ee937f1..14f50cd 100644 (file)
 #include "HTTPHeaderMap.h"
 #include <wtf/OwnPtr.h>
 
+#if USE(SOUP)
+typedef struct _SoupSession SoupSession;
+#endif
+
 #if PLATFORM(CF)
 typedef const struct __CFData * CFDataRef;
 #endif
@@ -159,6 +163,10 @@ public:
     ResourceHandleInternal* getInternal() { return d.get(); }
 #endif
 
+#if USE(SOUP)
+    static SoupSession* defaultSession();
+#endif
+
     // Used to work around the fact that you don't get any more NSURLConnection callbacks until you return from the one you're in.
     static bool loadsBlocked();    
     
index 88109e8..e3064e1 100644 (file)
@@ -1,5 +1,6 @@
 /*
  *  Copyright (C) 2008 Xan Lopez <xan@gnome.org>
+ *  Copyright (C) 2009 Igalia S.L.
  *  Copyright (C) 2008 Apple Inc. All rights reserved.
  *
  *  This library is free software; you can redistribute it and/or
 
 namespace WebCore {
 
-SoupCookieJar* getCookieJar()
+static bool cookiesInitialized;
+static SoupCookieJar* cookieJar;
+
+SoupCookieJar* defaultCookieJar()
+{
+    if (!cookiesInitialized) {
+        cookiesInitialized = true;
+        setDefaultCookieJar(soup_cookie_jar_new());
+    }
+
+    return cookieJar;
+}
+
+void setDefaultCookieJar(SoupCookieJar* jar)
 {
-    static SoupCookieJar* jar = soup_cookie_jar_new();
-    return jar;
+    cookiesInitialized = true;
+
+    if (cookieJar)
+        g_object_unref(cookieJar);
+
+    cookieJar = jar;
+
+    if (cookieJar)
+        g_object_ref(cookieJar);
 }
 
 void setCookies(Document* /*document*/, const KURL& url, const KURL& /*policyURL*/, const String& value)
 {
-    SoupCookieJar* jar = getCookieJar();
+    SoupCookieJar* jar = defaultCookieJar();
     if (!jar)
         return;
 
@@ -45,7 +66,7 @@ void setCookies(Document* /*document*/, const KURL& url, const KURL& /*policyURL
 
 String cookies(const Document* /*document*/, const KURL& url)
 {
-    SoupCookieJar* jar = getCookieJar();
+    SoupCookieJar* jar = defaultCookieJar();
     if (!jar)
         return String();
 
@@ -61,7 +82,7 @@ String cookies(const Document* /*document*/, const KURL& url)
 
 bool cookiesEnabled(const Document* /*document*/)
 {
-    return getCookieJar();
+    return defaultCookieJar();
 }
 
 }
index 61179ae..ab1f95c 100644 (file)
@@ -31,7 +31,8 @@
 #include <libsoup/soup.h>
 
 namespace WebCore {
-    SoupCookieJar* getCookieJar();
+    SoupCookieJar* defaultCookieJar();
+    void setDefaultCookieJar(SoupCookieJar* jar);
 }
 
 #endif
index 3c48052..882fb19 100644 (file)
@@ -4,6 +4,8 @@
  * Copyright (C) 2008 Collabora Ltd.
  * Copyright (C) 2009 Holger Hans Peter Freyther
  * Copyright (C) 2009 Gustavo Noronha Silva <gns@gnome.org>
+ * Copyright (C) 2009 Christian Dywan <christian@imendio.com>
+ * Copyright (C) 2009 Igalia S.L.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -55,8 +57,6 @@
 
 namespace WebCore {
 
-static SoupSession* session = 0;
-
 class WebCoreSynchronousLoader : public ResourceHandleClient, Noncopyable {
 public:
     WebCoreSynchronousLoader(ResourceError&, ResourceResponse &, Vector<char>&);
@@ -365,22 +365,37 @@ bool ResourceHandle::startData(String urlString)
     return true;
 }
 
-bool ResourceHandle::startHttp(String urlString)
+static SoupSession* createSoupSession()
 {
-    if (!session) {
-        session = soup_session_async_new();
-
-        soup_session_add_feature(session, SOUP_SESSION_FEATURE(getCookieJar()));
-
-        const char* soup_debug = g_getenv("WEBKIT_SOUP_LOGGING");
-        if (soup_debug) {
-            int soup_debug_level = atoi(soup_debug);
+    return soup_session_async_new();
+}
 
-            SoupLogger* logger = soup_logger_new(static_cast<SoupLoggerLogLevel>(soup_debug_level), -1);
-            soup_logger_attach(logger, session);
-            g_object_unref(logger);
-        }
+static void ensureSessionIsInitialized(SoupSession* session)
+{
+    if (g_object_get_data(G_OBJECT(session), "webkit-init"))
+        return;
+    SoupCookieJar* jar = reinterpret_cast<SoupCookieJar*>(soup_session_get_feature(session, SOUP_TYPE_COOKIE_JAR));
+    if (!jar)
+        soup_session_add_feature(session, SOUP_SESSION_FEATURE(defaultCookieJar()));
+    else
+        setDefaultCookieJar(jar);
+
+    const char* webkit_debug = g_getenv("WEBKIT_DEBUG"); 
+    if (!soup_session_get_feature(session, SOUP_TYPE_LOGGER)
+        && webkit_debug && !strcmp(webkit_debug, "network")) {
+        SoupLogger* logger = soup_logger_new(static_cast<SoupLoggerLogLevel>(SOUP_LOGGER_LOG_BODY), -1);
+        soup_logger_attach(logger, session);
+        g_object_unref(logger);
     }
+    g_object_set_data(G_OBJECT(session), "webkit-init", reinterpret_cast<void*>(0xdeadbeef));
+}
+
+bool ResourceHandle::startHttp(String urlString)
+{
+    SoupSession* session = defaultSession();
+    ensureSessionIsInitialized(session);
 
     SoupMessage* msg;
     msg = soup_message_new(request().httpMethod().utf8().data(), urlString.utf8().data());
@@ -505,7 +520,7 @@ void ResourceHandle::cancel()
 {
     d->m_cancelled = true;
     if (d->m_msg) {
-        soup_session_cancel_message(session, d->m_msg, SOUP_STATUS_CANCELLED);
+        soup_session_cancel_message(defaultSession(), d->m_msg, SOUP_STATUS_CANCELLED);
         // For re-entrancy troubles we call didFinishLoading when the message hasn't been handled yet.
         if (client())
             client()->didFinishLoading(this);
@@ -773,5 +788,12 @@ bool ResourceHandle::startGio(KURL url)
     return true;
 }
 
+SoupSession* ResourceHandle::defaultSession()
+{
+    static SoupSession* session = createSoupSession();;
+
+    return session;
+}
+
 }
 
index d131e01..1a4a92d 100644 (file)
@@ -5,6 +5,18 @@
         https://bugs.webkit.org/show_bug.cgi?id=22624
         [SOUP][GTK] Need API to get SoupSession from WebKit.
 
+        Add API to get the default soup session.
+
+        * webkit/webkitwebview.cpp:
+        * webkit/webkitwebview.h:
+
+2009-02-23  Xan Lopez  <xan@gnome.org>
+
+        Reviewed by Alexey Proskuryakov.
+
+        https://bugs.webkit.org/show_bug.cgi?id=22624
+        [SOUP][GTK] Need API to get SoupSession from WebKit.
+
         Add soup dependency to pc file.
 
         * webkit.pc.in:
index 494a26f..b04ef05 100644 (file)
@@ -1,12 +1,13 @@
 /*
  *  Copyright (C) 2007, 2008 Holger Hans Peter Freyther
- *  Copyright (C) 2007, 2008 Christian Dywan <christian@imendio.com>
+ *  Copyright (C) 2007, 2008, 2009 Christian Dywan <christian@imendio.com>
  *  Copyright (C) 2007 Xan Lopez <xan@gnome.org>
  *  Copyright (C) 2007, 2008 Alp Toker <alp@atoker.com>
  *  Copyright (C) 2008 Jan Alonzo <jmalonzo@unpluggable.com>
  *  Copyright (C) 2008 Gustavo Noronha Silva <gns@gnome.org>
  *  Copyright (C) 2008 Nuanti Ltd.
  *  Copyright (C) 2008 Collabora Ltd.
+ *  Copyright (C) 2009 Igalia S.L.
  *
  *  This library is free software; you can redistribute it and/or
  *  modify it under the terms of the GNU Lesser General Public
 #include "InspectorClientGtk.h"
 #include "FrameLoader.h"
 #include "FrameView.h"
-#include "Editor.h"
 #include "PasteboardHelper.h"
 #include "PlatformKeyboardEvent.h"
 #include "PlatformWheelEvent.h"
+#include "ResourceHandle.h"
 #include "ScriptValue.h"
 #include "Scrollbar.h"
 #include <wtf/GOwnPtr.h>
@@ -2738,4 +2739,21 @@ void webkit_web_view_set_full_content_zoom(WebKitWebView* webView, gboolean zoom
     g_object_notify(G_OBJECT(webView), "full-content-zoom");
 }
 
+/**
+ * webkit_get_default_session:
+ *
+ * Retrieves the default #SoupSession used by all web views.
+ * Note that the session features are added by WebKit on demand,
+ * so if you insert your own #SoupCookieJar before any network
+ * traffic occurs, WebKit will use it instead of the default.
+ *
+ * Return value: the default #SoupSession
+ *
+ * Since: 1.1.1
+ */
+SoupSession* webkit_get_default_session ()
+{
+    return ResourceHandle::defaultSession();
+}
+
 }
index 860c0d0..4cc3569 100644 (file)
@@ -23,6 +23,7 @@
 #define WEBKIT_WEB_VIEW_H
 
 #include <gtk/gtk.h>
+#include <libsoup/soup.h>
 #include <JavaScriptCore/JSBase.h>
 
 #include <webkit/webkitdefines.h>
@@ -304,6 +305,9 @@ WEBKIT_API void
 webkit_web_view_set_full_content_zoom           (WebKitWebView        *web_view,
                                                  gboolean              full_content_zoom);
 
+WEBKIT_API SoupSession*
+webkit_get_default_session                      (void);
+
 G_END_DECLS
 
 #endif