summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garcia Campos <cgarcia@igalia.com>2020-06-18 16:44:28 +0200
committerCarlos Garcia Campos <carlosgc@gnome.org>2020-07-09 08:48:42 +0200
commit61e39d94d60851bfb7d43d42b31759373dd7ba73 (patch)
treeb1808fa29bc88ed717643a9b94f84a911b7b5e5e
parente83fb83f2eccb03a6ef37a1f98d3fe21bbd8156e (diff)
downloadepiphany-61e39d94d60851bfb7d43d42b31759373dd7ba73.tar.gz
Add support for Intelligent Tracking Prevention (ITP)
-rw-r--r--data/org.gnome.epiphany.gschema.xml5
-rw-r--r--embed/ephy-embed-shell.c21
-rw-r--r--embed/ephy-web-view.c79
-rw-r--r--lib/ephy-prefs.h2
-rw-r--r--src/preferences/clear-data-view.c6
-rw-r--r--src/preferences/prefs-privacy-page.c8
-rw-r--r--src/resources/gtk/prefs-privacy-page.ui14
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,
@@ -845,6 +849,20 @@ remember_passwords_setting_changed_cb (GSettings *settings,
}
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)
{
EphyEmbedShell *shell = EPHY_EMBED_SHELL (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..60cbb85ac 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>