[a486e5558353d0a590552ea5e0b0ccf4d2d9a1ea92d319b2ad5711e9ba10deb1/carlosgc/itp: 53/53] Add support for Intelligent Tracking Prevention (ITP)



commit fb6991603f6977e79d67ad673074307ee59e0d20
Author: Carlos Garcia Campos <cgarcia igalia com>
Date:   Thu Jun 18 16:44:28 2020 +0200

    Add support for Intelligent Tracking Prevention (ITP)

 data/org.gnome.epiphany.gschema.xml     |  5 +++
 embed/ephy-embed-shell.c                | 21 +++++++++
 embed/ephy-web-view.c                   | 79 +++++++++++++++++++++++++++++++++
 lib/ephy-prefs.h                        |  2 +
 src/preferences/clear-data-view.c       |  6 ++-
 src/preferences/prefs-privacy-page.c    |  8 ++++
 src/resources/gtk/prefs-privacy-page.ui | 14 ++++++
 7 files changed, 133 insertions(+), 2 deletions(-)
---
diff --git a/data/org.gnome.epiphany.gschema.xml b/data/org.gnome.epiphany.gschema.xml
index f5e0c256f..f4d613e89 100644
--- a/data/org.gnome.epiphany.gschema.xml
+++ b/data/org.gnome.epiphany.gschema.xml
@@ -191,6 +191,11 @@
                        <summary>Enable safe browsing</summary>
                        <description>Whether to enable safe browsing. Safe browsing operates via Google Safe 
Browsing API v4.</description>
                </key>
+               <key type="b" name="enable-itp">
+                       <default>true</default>
+                       <summary>Enable Intelligent Tracking Prevention (ITP)</summary>
+                       <description>Whether to enable Intelligent Tracking Prevention.</description>
+               </key>
                <key type="s" name="gsb-api-key">
                        <default>'AIzaSyAtuURrRblYXvwCyDC5ZFq0mEw1x4VN6KA'</default>
                        <summary>Google Safe Browsing API key</summary>
diff --git a/embed/ephy-embed-shell.c b/embed/ephy-embed-shell.c
index bdcfae349..eea168a83 100644
--- a/embed/ephy-embed-shell.c
+++ b/embed/ephy-embed-shell.c
@@ -783,6 +783,10 @@ ephy_embed_shell_create_web_context (EphyEmbedShell *shell)
                                                NULL);
   }
 
+  webkit_website_data_manager_set_itp_enabled (manager,
+                                               g_settings_get_boolean (EPHY_SETTINGS_WEB,
+                                                                       EPHY_PREFS_WEB_ENABLE_ITP));
+
   priv->web_context = g_object_new (WEBKIT_TYPE_WEB_CONTEXT,
                                     "website-data-manager", manager,
                                     "process-swap-on-cross-site-navigation-enabled", TRUE,
@@ -844,6 +848,20 @@ remember_passwords_setting_changed_cb (GSettings      *settings,
                                                                               g_variant_new ("b", 
should_remember_passwords)));
 }
 
+static void
+enable_itp_setting_changed_cb (GSettings      *settings,
+                               char           *key,
+                               EphyEmbedShell *shell)
+{
+  EphyEmbedShellPrivate *priv = ephy_embed_shell_get_instance_private (shell);
+  WebKitWebsiteDataManager *manager;
+
+  manager = webkit_web_context_get_website_data_manager (priv->web_context);
+  webkit_website_data_manager_set_itp_enabled (manager,
+                                               g_settings_get_boolean (EPHY_SETTINGS_WEB,
+                                                                       EPHY_PREFS_WEB_ENABLE_ITP));
+}
+
 static void
 ephy_embed_shell_startup (GApplication *application)
 {
@@ -941,6 +959,9 @@ ephy_embed_shell_startup (GApplication *application)
 
   g_signal_connect_object (EPHY_SETTINGS_WEB, "changed::remember-passwords",
                            G_CALLBACK (remember_passwords_setting_changed_cb), shell, 0);
+
+  g_signal_connect_object (EPHY_SETTINGS_WEB, "changed::enable-itp",
+                           G_CALLBACK (enable_itp_setting_changed_cb), shell, 0);
 }
 
 static void
diff --git a/embed/ephy-web-view.c b/embed/ephy-web-view.c
index 9b0d0565c..eabd13f55 100644
--- a/embed/ephy-web-view.c
+++ b/embed/ephy-web-view.c
@@ -103,6 +103,7 @@ struct _EphyWebView {
   GtkWidget *webcam_info_bar;
   GtkWidget *password_info_bar;
   GtkWidget *password_form_info_bar;
+  GtkWidget *itp_info_bar;
 
   EphyHistoryService *history_service;
 
@@ -1074,6 +1075,79 @@ show_permission_request_info_bar (WebKitWebView           *web_view,
   g_free (bold_origin);
 }
 
+static void
+decide_on_itp_permission_request (GtkWidget               *info_bar,
+                                  int                      response,
+                                  WebKitPermissionRequest *request)
+{
+  switch (response) {
+    case GTK_RESPONSE_YES:
+      webkit_permission_request_allow (request);
+      break;
+    default:
+      webkit_permission_request_deny (request);
+      break;
+  }
+
+  g_object_set_data (G_OBJECT (info_bar), "ephy-itp-decision", NULL);
+  gtk_widget_destroy (info_bar);
+}
+
+static void
+ephy_web_view_show_itp_permission_info_bar (EphyWebView                              *web_view,
+                                            WebKitWebsiteDataAccessPermissionRequest *decision)
+{
+  GtkWidget *info_bar;
+  GtkWidget *content_area;
+  GtkWidget *box;
+  GtkWidget *label;
+  g_autofree char *message = NULL;
+  g_autofree char *secondary_message = NULL;
+  g_autofree char *markup = NULL;
+  const char *requesting_domain;
+  const char *current_domain;
+
+  info_bar = gtk_info_bar_new_with_buttons (_("Deny"), GTK_RESPONSE_NO,
+                                            _("Allow"), GTK_RESPONSE_YES,
+                                            NULL);
+
+  box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+
+  requesting_domain = webkit_website_data_access_permission_request_get_requesting_domain (decision);
+  current_domain = webkit_website_data_access_permission_request_get_current_domain (decision);
+  message = g_strdup_printf (_("Do you want to allow “%s“ to use cookies while browsing “%s“?"), 
requesting_domain, current_domain);
+  markup = g_strdup_printf ("<span size='xx-large' weight='bold'>%s</span>", message);
+  label = gtk_label_new (NULL);
+  gtk_label_set_markup (GTK_LABEL (label), markup);
+  gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
+  gtk_label_set_xalign (GTK_LABEL (label), 0);
+  gtk_container_add (GTK_CONTAINER (box), label);
+  gtk_widget_show (label);
+
+  secondary_message = g_strdup_printf (_("This will allow “%s“ to track your activity"), requesting_domain);
+  label = gtk_label_new (secondary_message);
+  gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
+  gtk_label_set_xalign (GTK_LABEL (label), 0);
+  gtk_container_add (GTK_CONTAINER (box), label);
+  gtk_widget_show (label);
+
+  content_area = gtk_info_bar_get_content_area (GTK_INFO_BAR (info_bar));
+  gtk_container_add (GTK_CONTAINER (content_area), box);
+  gtk_widget_show (box);
+
+  track_info_bar (info_bar, &web_view->itp_info_bar);
+
+  g_signal_connect (info_bar, "response",
+                    G_CALLBACK (decide_on_itp_permission_request),
+                    decision);
+  g_object_set_data_full (G_OBJECT (info_bar), "ephy-itp-decision", decision, g_object_unref);
+
+  ephy_embed_add_top_widget (EPHY_GET_EMBED_FROM_EPHY_WEB_VIEW (web_view),
+                             info_bar,
+                             EPHY_EMBED_TOP_WIDGET_POLICY_DESTROY_ON_TRANSITION);
+  gtk_widget_show (info_bar);
+}
+
 static gboolean
 permission_request_cb (WebKitWebView           *web_view,
                        WebKitPermissionRequest *decision)
@@ -1096,6 +1170,10 @@ permission_request_cb (WebKitWebView           *web_view,
       permission_type = EPHY_PERMISSION_TYPE_ACCESS_WEBCAM;
     else
       permission_type = EPHY_PERMISSION_TYPE_ACCESS_MICROPHONE;
+  } else if (WEBKIT_IS_WEBSITE_DATA_ACCESS_PERMISSION_REQUEST (decision)) {
+    ephy_web_view_show_itp_permission_info_bar (EPHY_WEB_VIEW (web_view),
+                                                WEBKIT_WEBSITE_DATA_ACCESS_PERMISSION_REQUEST (decision));
+    return TRUE;
   } else {
     return FALSE;
   }
@@ -3463,6 +3541,7 @@ ephy_web_view_dispose (GObject *object)
   untrack_info_bar (&view->webcam_info_bar);
   untrack_info_bar (&view->password_info_bar);
   untrack_info_bar (&view->password_form_info_bar);
+  untrack_info_bar (&view->itp_info_bar);
 
   g_clear_object (&view->certificate);
   g_clear_object (&view->file_monitor);
diff --git a/lib/ephy-prefs.h b/lib/ephy-prefs.h
index ac0a87682..05bbb2399 100644
--- a/lib/ephy-prefs.h
+++ b/lib/ephy-prefs.h
@@ -115,6 +115,7 @@ static const char * const ephy_prefs_state_schema[] = {
 #define EPHY_PREFS_WEB_REMEMBER_PASSWORDS           "remember-passwords"
 #define EPHY_PREFS_WEB_ENABLE_SITE_SPECIFIC_QUIRKS  "enable-site-specific-quirks"
 #define EPHY_PREFS_WEB_ENABLE_SAFE_BROWSING         "enable-safe-browsing"
+#define EPHY_PREFS_WEB_ENABLE_ITP                   "enable-itp"
 #define EPHY_PREFS_WEB_GSB_API_KEY                  "gsb-api-key"
 #define EPHY_PREFS_WEB_DEFAULT_ZOOM_LEVEL           "default-zoom-level"
 #define EPHY_PREFS_WEB_ENABLE_AUTOSEARCH            "enable-autosearch"
@@ -144,6 +145,7 @@ static const char * const ephy_prefs_web_schema[] = {
   EPHY_PREFS_WEB_REMEMBER_PASSWORDS,
   EPHY_PREFS_WEB_ENABLE_SITE_SPECIFIC_QUIRKS,
   EPHY_PREFS_WEB_ENABLE_SAFE_BROWSING,
+  EPHY_PREFS_WEB_ENABLE_ITP,
   EPHY_PREFS_WEB_GSB_API_KEY,
   EPHY_PREFS_WEB_DEFAULT_ZOOM_LEVEL,
   EPHY_PREFS_WEB_ENABLE_AUTOSEARCH,
diff --git a/src/preferences/clear-data-view.c b/src/preferences/clear-data-view.c
index 47dabd685..dc73c377a 100644
--- a/src/preferences/clear-data-view.c
+++ b/src/preferences/clear-data-view.c
@@ -56,7 +56,8 @@ G_DEFINE_TYPE (ClearDataView, clear_data_view, EPHY_TYPE_DATA_VIEW)
   WEBKIT_WEBSITE_DATA_WEBSQL_DATABASES | \
   WEBKIT_WEBSITE_DATA_INDEXEDDB_DATABASES | \
   WEBKIT_WEBSITE_DATA_PLUGIN_DATA | \
-  WEBKIT_WEBSITE_DATA_HSTS_CACHE
+  WEBKIT_WEBSITE_DATA_HSTS_CACHE | \
+  WEBKIT_WEBSITE_DATA_ITP
 
 typedef struct {
   WebKitWebsiteDataTypes type;
@@ -72,7 +73,8 @@ static const DataEntry data_entries[] = {
   { WEBKIT_WEBSITE_DATA_INDEXEDDB_DATABASES, FALSE, N_("IndexedDB databases") },
   { WEBKIT_WEBSITE_DATA_WEBSQL_DATABASES, FALSE, N_("WebSQL databases") },
   { WEBKIT_WEBSITE_DATA_PLUGIN_DATA, FALSE, N_("Plugins data") },
-  { WEBKIT_WEBSITE_DATA_HSTS_CACHE, FALSE, N_("HSTS policies cache") }
+  { WEBKIT_WEBSITE_DATA_HSTS_CACHE, FALSE, N_("HSTS policies cache") },
+  { WEBKIT_WEBSITE_DATA_ITP, FALSE, N_("Intelligent Tracking Prevention data") }
 };
 
 static WebKitWebsiteDataManager *
diff --git a/src/preferences/prefs-privacy-page.c b/src/preferences/prefs-privacy-page.c
index fd2feba3b..a0b843979 100644
--- a/src/preferences/prefs-privacy-page.c
+++ b/src/preferences/prefs-privacy-page.c
@@ -39,6 +39,7 @@ struct _PrefsPrivacyPage {
   GtkWidget *popups_allow_switch;
   GtkWidget *adblock_allow_switch;
   GtkWidget *enable_safe_browsing_switch;
+  GtkWidget *enable_itp_switch;
 
   /* Cookies */
   GtkWidget *always;
@@ -135,6 +136,12 @@ setup_privacy_page (PrefsPrivacyPage *privacy_page)
                    "active",
                    G_SETTINGS_BIND_DEFAULT);
 
+  g_settings_bind (web_settings,
+                   EPHY_PREFS_WEB_ENABLE_ITP,
+                   privacy_page->enable_itp_switch,
+                   "active",
+                   G_SETTINGS_BIND_DEFAULT);
+
   /* ======================================================================== */
   /* ========================== Cookies ===================================== */
   /* ======================================================================== */
@@ -204,6 +211,7 @@ prefs_privacy_page_class_init (PrefsPrivacyPageClass *klass)
   gtk_widget_class_bind_template_child (widget_class, PrefsPrivacyPage, popups_allow_switch);
   gtk_widget_class_bind_template_child (widget_class, PrefsPrivacyPage, adblock_allow_switch);
   gtk_widget_class_bind_template_child (widget_class, PrefsPrivacyPage, enable_safe_browsing_switch);
+  gtk_widget_class_bind_template_child (widget_class, PrefsPrivacyPage, enable_itp_switch);
 
   /* Cookies */
   gtk_widget_class_bind_template_child (widget_class, PrefsPrivacyPage, always);
diff --git a/src/resources/gtk/prefs-privacy-page.ui b/src/resources/gtk/prefs-privacy-page.ui
index 919e9c4c1..ad3980f0e 100644
--- a/src/resources/gtk/prefs-privacy-page.ui
+++ b/src/resources/gtk/prefs-privacy-page.ui
@@ -54,6 +54,20 @@
             </child>
           </object>
         </child>
+        <child>
+          <object class="HdyActionRow">
+            <property name="activatable_widget">enable_itp_switch</property>
+            <property name="title" translatable="yes">Intelligent _Tracking Prevention</property>
+            <property name="use_underline">True</property>
+            <property name="visible">True</property>
+            <child>
+              <object class="GtkSwitch" id="enable_itp_switch">
+                <property name="valign">center</property>
+                <property name="visible">True</property>
+              </object>
+            </child>
+          </object>
+        </child>
       </object>
     </child>
     <child>


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