2010-07-13 Rafael Antognolli <antognolli@profusion.mobi>
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 13 Jul 2010 20:24:18 +0000 (20:24 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 13 Jul 2010 20:24:18 +0000 (20:24 +0000)
        Reviewed by Antonio Gomes.

        This commit implements an API for configuring a path to the cookie
        file in the Mozilla "cookies.txt" format, and functions to deal with it
        in a more EFL like API.

        [EFL] Add API for dealing with cookies in EFL port.
        https://bugs.webkit.org/show_bug.cgi?id=41770

        * CMakeListsEfl.txt:
        * efl/ewk/EWebKit.h:
        * efl/ewk/ewk_cookies.cpp: Added.
        (ewk_cookies_file_set): Set a path to the file storing cookies.
        (ewk_cookies_clear): Clear all the cookies from the current cookie jar.
        (ewk_cookies_get_all): Get all the cookies from the current cookie jar.
        (ewk_cookies_cookie_del): Delete a specific cookie from the cookie jar.
        (ewk_cookies_cookie_free): Free memory used by a cookie.
        (ewk_cookies_policy_set): Set which acceptance policy will be used.
        (ewk_cookies_policy_get): Get current acceptance policy being used.
        * efl/ewk/ewk_cookies.h: Added.
        (_Ewk_Cookie::):

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

WebKit/CMakeListsEfl.txt
WebKit/ChangeLog
WebKit/efl/ewk/EWebKit.h
WebKit/efl/ewk/ewk_cookies.cpp [new file with mode: 0644]
WebKit/efl/ewk/ewk_cookies.h [new file with mode: 0644]

index 2fc964b..ee67d71 100644 (file)
@@ -32,6 +32,7 @@ LIST(APPEND WebKit_SOURCES
     efl/WebCoreSupport/InspectorClientEfl.cpp
 
     efl/ewk/ewk_contextmenu.cpp
+    efl/ewk/ewk_cookies.cpp
     efl/ewk/ewk_frame.cpp
     efl/ewk/ewk_history.cpp
     efl/ewk/ewk_main.cpp
index bbf5170..38b1c43 100644 (file)
@@ -1,3 +1,27 @@
+2010-07-13  Rafael Antognolli  <antognolli@profusion.mobi>
+
+        Reviewed by Antonio Gomes.
+
+        This commit implements an API for configuring a path to the cookie
+        file in the Mozilla "cookies.txt" format, and functions to deal with it
+        in a more EFL like API.
+
+        [EFL] Add API for dealing with cookies in EFL port.
+        https://bugs.webkit.org/show_bug.cgi?id=41770
+
+        * CMakeListsEfl.txt:
+        * efl/ewk/EWebKit.h:
+        * efl/ewk/ewk_cookies.cpp: Added.
+        (ewk_cookies_file_set): Set a path to the file storing cookies.
+        (ewk_cookies_clear): Clear all the cookies from the current cookie jar.
+        (ewk_cookies_get_all): Get all the cookies from the current cookie jar.
+        (ewk_cookies_cookie_del): Delete a specific cookie from the cookie jar.
+        (ewk_cookies_cookie_free): Free memory used by a cookie.
+        (ewk_cookies_policy_set): Set which acceptance policy will be used.
+        (ewk_cookies_policy_get): Get current acceptance policy being used.
+        * efl/ewk/ewk_cookies.h: Added.
+        (_Ewk_Cookie::):
+
 2010-07-12  Lucas De Marchi  <lucas.demarchi@profusion.mobi>
 
         Unreviewed build fix after r60050.
index e08c4a5..183e9dc 100644 (file)
@@ -23,6 +23,7 @@
 #define EWebKit_h
 
 #include "ewk_contextmenu.h"
+#include "ewk_cookies.h"
 #include "ewk_eapi.h"
 #include "ewk_frame.h"
 #include "ewk_history.h"
diff --git a/WebKit/efl/ewk/ewk_cookies.cpp b/WebKit/efl/ewk/ewk_cookies.cpp
new file mode 100644 (file)
index 0000000..3b4949e
--- /dev/null
@@ -0,0 +1,221 @@
+/*
+    Copyright (C) 2010 ProFUSION embedded systems
+    Copyright (C) 2010 Samsung Electronics
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Library General Public
+    License as published by the Free Software Foundation; either
+    version 2 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Library General Public License for more details.
+
+    You should have received a copy of the GNU Library General Public License
+    along with this library; see the file COPYING.LIB.  If not, write to
+    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+    Boston, MA 02110-1301, USA.
+*/
+
+#include "config.h"
+#include "ewk_cookies.h"
+
+#include "CookieJarSoup.h"
+#include "EWebKit.h"
+#include "ResourceHandle.h"
+
+#include <Eina.h>
+#include <eina_safety_checks.h>
+#include <glib.h>
+#include <libsoup/soup.h>
+#include <wtf/text/CString.h>
+
+
+/**
+ * Set the path where the cookies are going to be stored. Use NULL for keep
+ * them just in memory.
+ *
+ * @param filename path to the cookies.txt file.
+ *
+ * @returns EINA_FALSE if it wasn't possible to create the cookie jar,
+ *          EINA_FALSE otherwise.
+ */
+EAPI Eina_Bool ewk_cookies_file_set(const char *filename)
+{
+    SoupCookieJar* cookieJar = 0;
+    if (filename)
+        cookieJar = soup_cookie_jar_text_new(filename, FALSE);
+    else
+        cookieJar = soup_cookie_jar_new();
+
+    if (!cookieJar)
+        return EINA_FALSE;
+
+#ifdef HAVE_LIBSOUP_2_29_90
+    soup_cookie_jar_set_accept_policy(cookieJar, SOUP_COOKIE_JAR_ACCEPT_NO_THIRD_PARTY);
+#endif
+
+    SoupSession* session = WebCore::ResourceHandle::defaultSession();
+    SoupSessionFeature* oldjar = soup_session_get_feature(session, SOUP_TYPE_COOKIE_JAR);
+    if (oldjar)
+        soup_session_remove_feature(session, oldjar);
+
+    WebCore::setDefaultCookieJar(cookieJar);
+    soup_session_add_feature(session, SOUP_SESSION_FEATURE(cookieJar));
+
+    return EINA_TRUE;
+}
+
+/**
+ * Clear all the cookies from the cookie jar.
+ */
+EAPI void ewk_cookies_clear()
+{
+    GSList* l;
+    GSList* p;
+    SoupCookieJar* cookieJar = WebCore::defaultCookieJar();
+
+    l = soup_cookie_jar_all_cookies(cookieJar);
+    for (p = l; p; p = p->next)
+        soup_cookie_jar_delete_cookie(cookieJar, (SoupCookie*)p->data);
+
+    soup_cookies_free(l);
+}
+
+/**
+ * Returns a list of cookies in the cookie jar.
+ *
+ * @returns an Eina_List with all the cookies in the cookie jar.
+ */
+EAPI Eina_List* ewk_cookies_get_all(void)
+{
+    GSList* l;
+    GSList* p;
+    Eina_List* el = 0;
+    SoupCookieJar* cookieJar = WebCore::defaultCookieJar();
+
+    l = soup_cookie_jar_all_cookies(cookieJar);
+    for (p = l; p; p = p->next) {
+        SoupCookie* cookie = static_cast<SoupCookie*>(p->data);
+        Ewk_Cookie* c = static_cast<Ewk_Cookie*>(malloc(sizeof(*c)));
+        c->name = strdup(cookie->name);
+        c->value = strdup(cookie->value);
+        c->domain = strdup(cookie->domain);
+        c->path = strdup(cookie->path);
+        c->expires = soup_date_to_time_t(cookie->expires);
+        c->secure = static_cast<Eina_Bool>(cookie->secure);
+        c->http_only = static_cast<Eina_Bool>(cookie->http_only);
+        el = eina_list_append(el, c);
+    }
+
+    soup_cookies_free(l);
+    return el;
+}
+
+/*
+ * Deletes a cookie from the cookie jar.
+ *
+ * Note that the fields name, value, domain and path are used to match this
+ * cookie in the cookie jar.
+ *
+ * @param cookie an Ewk_Cookie that has the info relative to that cookie.
+ */
+EAPI void ewk_cookies_cookie_del(Ewk_Cookie *cookie)
+{
+    EINA_SAFETY_ON_NULL_RETURN(cookie);
+    GSList* l;
+    GSList* p;
+    SoupCookieJar* cookieJar = WebCore::defaultCookieJar();
+    SoupCookie* c1 = soup_cookie_new(
+        cookie->name, cookie->value, cookie->domain, cookie->path, -1);
+
+    l = soup_cookie_jar_all_cookies(cookieJar);
+    for (p = l; p; p = p->next) {
+        SoupCookie* c2 = static_cast<SoupCookie*>(p->data);
+        if (soup_cookie_equal(c1, c2)) {
+            soup_cookie_jar_delete_cookie(cookieJar, c2);
+            break;
+        }
+    }
+
+    soup_cookie_free(c1);
+    soup_cookies_free(l);
+}
+
+/*
+ * Free the memory used by a cookie.
+ *
+ * @param cookie the Ewk_Cookie struct that will be freed.
+ */
+EAPI void ewk_cookies_cookie_free(Ewk_Cookie *cookie)
+{
+    EINA_SAFETY_ON_NULL_RETURN(cookie);
+    free(cookie->name);
+    free(cookie->value);
+    free(cookie->domain);
+    free(cookie->path);
+    free(cookie);
+}
+
+/*
+ * Set the cookies accept policy.
+ *
+ * Possible values are: EWK_COOKIE_JAR_ACCEPT_ALWAYS, which accepts every
+ * cookie sent from any page; EWK_COOKIE_JAR_ACCEPT_NO_THIRD_PARTY, which
+ * accepts cookies only from the main page; and EWK_COOKIE_JAR_ACCEPT_NEVER,
+ * which rejects all cookies.
+ *
+ * @param p the acceptance policy
+ */
+EAPI void ewk_cookies_policy_set(Ewk_Cookie_Policy p)
+{
+#ifdef HAVE_LIBSOUP_2_29_90
+    SoupCookieJar* cookieJar = WebCore::defaultCookieJar();
+    SoupCookieJarAcceptPolicy policy;
+
+    policy = SOUP_COOKIE_JAR_ACCEPT_ALWAYS;
+    switch (p) {
+    case EWK_COOKIE_JAR_ACCEPT_NEVER:
+        policy = SOUP_COOKIE_JAR_ACCEPT_NEVER;
+        break;
+    case EWK_COOKIE_JAR_ACCEPT_ALWAYS:
+        policy = SOUP_COOKIE_JAR_ACCEPT_ALWAYS;
+        break;
+    case EWK_COOKIE_JAR_ACCEPT_NO_THIRD_PARTY:
+        policy = SOUP_COOKIE_JAR_ACCEPT_NO_THIRD_PARTY;
+        break;
+    }
+
+    soup_cookie_jar_set_accept_policy(cookieJar, policy);
+#endif
+}
+
+/*
+ * Gets the acceptance policy used in the current cookie jar.
+ *
+ * @returns the current acceptance policy
+ */
+EAPI Ewk_Cookie_Policy ewk_cookies_policy_get()
+{
+    Ewk_Cookie_Policy ewk_policy = EWK_COOKIE_JAR_ACCEPT_ALWAYS;
+#ifdef HAVE_LIBSOUP_2_29_90
+    SoupCookieJar* cookieJar = WebCore::defaultCookieJar();
+    SoupCookieJarAcceptPolicy policy;
+
+    policy = soup_cookie_jar_get_accept_policy(cookieJar);
+    switch (policy) {
+    case SOUP_COOKIE_JAR_ACCEPT_NEVER:
+        ewk_policy = EWK_COOKIE_JAR_ACCEPT_NEVER;
+        break;
+    case SOUP_COOKIE_JAR_ACCEPT_ALWAYS:
+        ewk_policy = EWK_COOKIE_JAR_ACCEPT_ALWAYS;
+        break;
+    case SOUP_COOKIE_JAR_ACCEPT_NO_THIRD_PARTY:
+        ewk_policy = EWK_COOKIE_JAR_ACCEPT_NO_THIRD_PARTY;
+        break;
+    }
+#endif
+
+    return ewk_policy;
+}
diff --git a/WebKit/efl/ewk/ewk_cookies.h b/WebKit/efl/ewk/ewk_cookies.h
new file mode 100644 (file)
index 0000000..6ba3c9a
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+    Copyright (C) 2010 ProFUSION embedded systems
+    Copyright (C) 2010 Samsung Electronics
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Library General Public
+    License as published by the Free Software Foundation; either
+    version 2 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Library General Public License for more details.
+
+    You should have received a copy of the GNU Library General Public License
+    along with this library; see the file COPYING.LIB.  If not, write to
+    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+    Boston, MA 02110-1301, USA.
+*/
+
+#ifndef ewk_cookies_h
+#define ewk_cookies_h
+
+#include "ewk_eapi.h"
+#include <Eina.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct _Ewk_Cookie {
+    char *name;
+    char *value;
+    char *domain;
+    char *path;
+    time_t expires;
+    Eina_Bool secure;
+    Eina_Bool http_only;
+};
+
+typedef struct _Ewk_Cookie Ewk_Cookie;
+
+enum _Ewk_Cookie_Policy {
+    EWK_COOKIE_JAR_ACCEPT_NEVER,
+    EWK_COOKIE_JAR_ACCEPT_ALWAYS,
+    EWK_COOKIE_JAR_ACCEPT_NO_THIRD_PARTY
+};
+
+typedef enum _Ewk_Cookie_Policy Ewk_Cookie_Policy;
+
+/************************** Exported functions ***********************/
+
+EAPI Eina_Bool          ewk_cookies_file_set(const char *filename);
+EAPI void               ewk_cookies_clear();
+EAPI Eina_List*         ewk_cookies_get_all();
+EAPI void               ewk_cookies_cookie_del(Ewk_Cookie *cookie);
+EAPI void               ewk_cookies_cookie_free(Ewk_Cookie *cookie);
+EAPI void               ewk_cookies_policy_set(Ewk_Cookie_Policy p);
+EAPI Ewk_Cookie_Policy  ewk_cookies_policy_get();
+
+#ifdef __cplusplus
+}
+#endif
+#endif // ewk_cookies_h