diff options
author | Carlos Garcia Campos <cgarcia@igalia.com> | 2020-06-18 16:44:28 +0200 |
---|---|---|
committer | Carlos Garcia Campos <carlosgc@gnome.org> | 2020-07-09 08:48:42 +0200 |
commit | 61e39d94d60851bfb7d43d42b31759373dd7ba73 (patch) | |
tree | b1808fa29bc88ed717643a9b94f84a911b7b5e5e | |
parent | e83fb83f2eccb03a6ef37a1f98d3fe21bbd8156e (diff) | |
download | epiphany-61e39d94d60851bfb7d43d42b31759373dd7ba73.tar.gz |
Add support for Intelligent Tracking Prevention (ITP)
-rw-r--r-- | data/org.gnome.epiphany.gschema.xml | 5 | ||||
-rw-r--r-- | embed/ephy-embed-shell.c | 21 | ||||
-rw-r--r-- | embed/ephy-web-view.c | 79 | ||||
-rw-r--r-- | lib/ephy-prefs.h | 2 | ||||
-rw-r--r-- | src/preferences/clear-data-view.c | 6 | ||||
-rw-r--r-- | src/preferences/prefs-privacy-page.c | 8 | ||||
-rw-r--r-- | 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, @@ -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> |