[epiphany] Port persistent cookies to WebKit2



commit 86d659967dac6e46d639729ce8a3571d87591310
Author: Carlos Garcia Campos <cgarcia igalia com>
Date:   Thu Jul 12 11:35:28 2012 +0200

    Port persistent cookies to WebKit2
    
    https://bugzilla.gnome.org/show_bug.cgi?id=679369

 embed/ephy-embed-single.c |   15 ++++++++++++---
 lib/ephy-web-app-utils.c  |   44 +++++++++++++++++++++++++++++++++-----------
 2 files changed, 45 insertions(+), 14 deletions(-)
---
diff --git a/embed/ephy-embed-single.c b/embed/ephy-embed-single.c
index da47042..fbea9bc 100644
--- a/embed/ephy-embed-single.c
+++ b/embed/ephy-embed-single.c
@@ -406,18 +406,27 @@ ephy_embed_single_initialize (EphyEmbedSingle *single)
 {
 #ifdef HAVE_WEBKIT2
   WebKitWebContext *web_context;
+  WebKitCookieManager *cookie_manager;
+  char *filename;
   char *cookie_policy;
 
-  /* TODO: Network features */
+  /* TODO: SoupCache, SSL, favicons */
 
   web_context = webkit_web_context_get_default ();
 
+  /* Store cookies in moz-compatible SQLite format */
+  cookie_manager = webkit_web_context_get_cookie_manager (web_context);
+  filename = g_build_filename (ephy_dot_dir (), "cookies.sqlite", NULL);
+  webkit_cookie_manager_set_persistent_storage (cookie_manager, filename,
+                                                WEBKIT_COOKIE_PERSISTENT_STORAGE_SQLITE);
+  g_free (filename);
+
   cookie_policy = g_settings_get_string (EPHY_SETTINGS_WEB,
                                          EPHY_PREFS_WEB_COOKIES_POLICY);
-  ephy_embed_prefs_set_cookie_accept_policy (webkit_web_context_get_cookie_manager (web_context),
-                                             cookie_policy);
+  ephy_embed_prefs_set_cookie_accept_policy (cookie_manager, cookie_policy);
   g_free (cookie_policy);
 
+  /* about: URIs handler */
   webkit_web_context_register_uri_scheme (web_context,
                                           EPHY_ABOUT_SCHEME,
                                           about_request_cb,
diff --git a/lib/ephy-web-app-utils.c b/lib/ephy-web-app-utils.c
index 57ba356..c686f95 100644
--- a/lib/ephy-web-app-utils.c
+++ b/lib/ephy-web-app-utils.c
@@ -257,13 +257,39 @@ out:
   return desktop_file_path;
 }
 
+#ifdef HAVE_WEBKIT2
+static SoupCookieJar *get_current_cookie_jar ()
+{
+  char *filename;
+  SoupCookieJar *jar;
+
+  /* FIXME: There's no API in WebKit2 to get all cookies, so we create a
+   * temp read-only jar for the current cookies to read from it.
+   * It would be better to have an API in WebKit to get the cookies instead.
+   */
+  filename = g_build_filename (ephy_dot_dir (), "cookies.sqlite", NULL);
+  jar = (SoupCookieJar*)soup_cookie_jar_sqlite_new (filename, TRUE);
+  g_free (filename);
+
+  return jar;
+}
+#else
+static SoupCookieJar *get_current_cookie_jar ()
+{
+  SoupSession *session = webkit_get_default_session ();
+  SoupCookieJar *jar;
+
+  jar = (SoupCookieJar*)soup_session_get_feature (session, SOUP_TYPE_COOKIE_JAR);
+
+  /* WebKit might not have a cookie jar yet, if it has not needed one
+   * and none has been set by Epiphany. */
+  return jar ? g_object_ref (jar) : NULL;
+}
+#endif
+
 static void
 create_cookie_jar_for_domain (const char *address, const char *directory)
 {
-#ifdef HAVE_WEBKIT2
-  /* TODO: Cookies */
-#else
-  SoupSession *session;
   GSList *cookies, *p;
   SoupCookieJar *current_jar, *new_jar;
   char *domain, *filename;
@@ -279,12 +305,8 @@ create_cookie_jar_for_domain (const char *address, const char *directory)
   domain = uri->host;
 
   /* The current cookies */
-  session = webkit_get_default_session ();
-  current_jar = (SoupCookieJar*)soup_session_get_feature (session, SOUP_TYPE_COOKIE_JAR);
-
-  /* WebKit might not have a cookie jar yet, if it has not needed one
-   * and none has been set by Epiphany. */
-  if (current_jar == NULL) {
+  current_jar = get_current_cookie_jar ();
+  if (!current_jar) {
     soup_uri_free (uri);
     return;
   }
@@ -302,7 +324,7 @@ create_cookie_jar_for_domain (const char *address, const char *directory)
 
   soup_uri_free (uri);
   g_slist_free (cookies);
-#endif
+  g_object_unref (current_jar);
   g_object_unref (new_jar);
 }
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]