[epiphany] Add adblocker option to security popover



commit b506f6e14b280b15bd1ec8e775bbfcdca3357bdd
Author: Jan-Michael Brummer <jan brummer tabos org>
Date:   Thu Feb 28 22:44:44 2019 +0100

    Add adblocker option to security popover
    
    Allow per site blocking of advertisements.
    
    Fixes: https://gitlab.gnome.org/GNOME/epiphany/issues/467

 data/org.gnome.epiphany.gschema.xml      |  5 ++
 embed/web-extension/ephy-web-extension.c | 23 +++++++--
 lib/ephy-permissions-manager.c           |  5 ++
 lib/ephy-permissions-manager.h           |  3 +-
 lib/widgets/ephy-security-popover.c      | 81 ++++++++++++++++++++++++++++++++
 5 files changed, 111 insertions(+), 6 deletions(-)
---
diff --git a/data/org.gnome.epiphany.gschema.xml b/data/org.gnome.epiphany.gschema.xml
index a9db58e96..87ae4a6d8 100644
--- a/data/org.gnome.epiphany.gschema.xml
+++ b/data/org.gnome.epiphany.gschema.xml
@@ -409,5 +409,10 @@
                        <summary>Decision to apply when webcam permission is requested for this host</summary>
                        <description>This option is used to save whether a given host has been given 
permission to access the user’s webcam. The “undecided” default means the browser needs to ask the user for 
permission, while “allow” and “deny” tell it to automatically make the decision upon request.</description>
                </key>
+               <key name="advertisement-permission" enum="org.gnome.Epiphany.Permission">
+                       <default>'undecided'</default>
+                       <summary>Decision to apply when advertisement permission is requested for this 
host</summary>
+                       <description>This option is used to save whether a given host has been given 
permission to allow advertisements. The “undecided” default means the browser global setting is used, while 
“allow” and “deny” tell it to automatically make the decision upon request.</description>
+               </key>
        </schema>
 </schemalist>
diff --git a/embed/web-extension/ephy-web-extension.c b/embed/web-extension/ephy-web-extension.c
index 645afa7ff..493356212 100644
--- a/embed/web-extension/ephy-web-extension.c
+++ b/embed/web-extension/ephy-web-extension.c
@@ -100,11 +100,24 @@ static const char introspection_xml[] =
 G_DEFINE_TYPE (EphyWebExtension, ephy_web_extension, G_TYPE_OBJECT)
 
 static gboolean
-should_use_adblocker (const char *request_uri,
-                      const char *page_uri,
-                      const char *redirected_request_uri)
+should_use_adblocker (const char       *request_uri,
+                      const char       *page_uri,
+                      const char       *redirected_request_uri,
+                      EphyWebExtension *extension)
 {
-  if (!g_settings_get_boolean (EPHY_SETTINGS_WEB_EXTENSION_WEB, EPHY_PREFS_WEB_ENABLE_ADBLOCK))
+  g_autofree gchar *origin = ephy_uri_to_security_origin (page_uri);
+  EphyPermission permission = EPHY_PERMISSION_UNDECIDED;
+
+  /* Check page setting first in case it overwrites global setting */
+  if (origin) {
+    permission = ephy_permissions_manager_get_permission (extension->permissions_manager,
+                                                          EPHY_PERMISSION_TYPE_SHOW_ADS,
+                                                          origin);
+    if (permission == EPHY_PERMISSION_PERMIT)
+      return FALSE;
+  }
+
+  if (permission == EPHY_PERMISSION_UNDECIDED && !g_settings_get_boolean (EPHY_SETTINGS_WEB_EXTENSION_WEB, 
EPHY_PREFS_WEB_ENABLE_ADBLOCK))
     return FALSE;
 
   /* Always load the main resource... */
@@ -154,7 +167,7 @@ web_page_send_request (WebKitWebPage     *web_page,
   if (g_settings_get_boolean (EPHY_SETTINGS_WEB_EXTENSION_WEB, EPHY_PREFS_WEB_DO_NOT_TRACK))
     modified_uri = ephy_remove_tracking_from_uri (request_uri);
 
-  if (should_use_adblocker (request_uri, page_uri, redirected_response_uri)) {
+  if (should_use_adblocker (request_uri, page_uri, redirected_response_uri, extension)) {
     char *result;
 
     ephy_uri_tester_load (extension->uri_tester);
diff --git a/lib/ephy-permissions-manager.c b/lib/ephy-permissions-manager.c
index 7b0e77557..153aef800 100644
--- a/lib/ephy-permissions-manager.c
+++ b/lib/ephy-permissions-manager.c
@@ -164,6 +164,8 @@ permission_type_to_string (EphyPermissionType type)
     return "audio-device-permission";
   case EPHY_PERMISSION_TYPE_ACCESS_WEBCAM:
     return "video-device-permission";
+  case EPHY_PERMISSION_TYPE_SHOW_ADS:
+    return "advertisement-permission";
   default:
     g_assert_not_reached ();
   }
@@ -475,6 +477,9 @@ ephy_permissions_manager_export_to_js_context (EphyPermissionsManager *manager,
   js_enum_value = jsc_value_new_number (js_context, EPHY_PERMISSION_TYPE_ACCESS_WEBCAM);
   jsc_value_object_set_property (js_enum, "ACCESS_WEBCAM", js_enum_value);
   g_object_unref (js_enum_value);
+  js_enum_value = jsc_value_new_number (js_context, EPHY_PERMISSION_TYPE_SHOW_ADS);
+  jsc_value_object_set_property (js_enum, "SHOW_ADS", js_enum_value);
+  g_object_unref (js_enum_value);
   jsc_value_object_set_property (js_namespace, "PermissionType", js_enum);
   g_object_unref (js_enum);
 }
diff --git a/lib/ephy-permissions-manager.h b/lib/ephy-permissions-manager.h
index a9f1a60d1..caba693cc 100644
--- a/lib/ephy-permissions-manager.h
+++ b/lib/ephy-permissions-manager.h
@@ -41,7 +41,8 @@ typedef enum {
   EPHY_PERMISSION_TYPE_SAVE_PASSWORD,
   EPHY_PERMISSION_TYPE_ACCESS_LOCATION,
   EPHY_PERMISSION_TYPE_ACCESS_MICROPHONE,
-  EPHY_PERMISSION_TYPE_ACCESS_WEBCAM
+  EPHY_PERMISSION_TYPE_ACCESS_WEBCAM,
+  EPHY_PERMISSION_TYPE_SHOW_ADS,
 } EphyPermissionType;
 
 EphyPermissionsManager *ephy_permissions_manager_new            (void);
diff --git a/lib/widgets/ephy-security-popover.c b/lib/widgets/ephy-security-popover.c
index 1347ae6f7..3386bdced 100644
--- a/lib/widgets/ephy-security-popover.c
+++ b/lib/widgets/ephy-security-popover.c
@@ -25,7 +25,11 @@
 #include <libsoup/soup.h>
 
 #include "ephy-certificate-dialog.h"
+#include "ephy-embed-shell.h"
 #include "ephy-lib-type-builtins.h"
+#include "ephy-permissions-manager.h"
+#include "ephy-settings.h"
+#include "ephy-uri-helpers.h"
 
 /**
  * SECTION:ephy-security-popover
@@ -54,6 +58,7 @@ struct _EphySecurityPopover {
   GtkWidget *lock_image;
   GtkWidget *host_label;
   GtkWidget *security_label;
+  GtkWidget *ad_switch;
   GtkWidget *grid;
   GTlsCertificate *certificate;
   GTlsCertificateFlags tls_errors;
@@ -66,7 +71,11 @@ static void
 ephy_security_popover_set_address (EphySecurityPopover *popover,
                                    const char          *address)
 {
+  EphyPermissionsManager *permissions_manager;
+  EphyPermission permission;
+  GSettings *web_settings = ephy_settings_get (EPHY_PREFS_WEB_SCHEMA);
   SoupURI *uri;
+  g_autofree gchar *origin = NULL;
   g_autofree gchar *uri_text = NULL;
 
   uri = soup_uri_new (address);
@@ -78,6 +87,28 @@ ephy_security_popover_set_address (EphySecurityPopover *popover,
   popover->hostname = g_strdup (uri->host);
 
   soup_uri_free (uri);
+
+  origin = ephy_uri_to_security_origin (address);
+  if (!origin)
+    return;
+
+  permissions_manager = ephy_embed_shell_get_permissions_manager (ephy_embed_shell_get_default ());
+  permission = ephy_permissions_manager_get_permission (permissions_manager,
+                                                        EPHY_PERMISSION_TYPE_SHOW_ADS,
+                                                        origin);
+
+  switch (permission) {
+    case EPHY_PERMISSION_UNDECIDED:
+      gtk_switch_set_active (GTK_SWITCH (popover->ad_switch),
+                             !g_settings_get_boolean (web_settings, EPHY_PREFS_WEB_ENABLE_ADBLOCK));
+      break;
+    case EPHY_PERMISSION_DENY:
+      gtk_switch_set_active (GTK_SWITCH (popover->ad_switch), FALSE);
+      break;
+    case EPHY_PERMISSION_PERMIT:
+      gtk_switch_set_active (GTK_SWITCH (popover->ad_switch), TRUE);
+      break;
+  }
 }
 
 static void
@@ -308,9 +339,40 @@ ephy_security_popover_class_init (EphySecurityPopoverClass *klass)
   g_object_class_install_properties (object_class, LAST_PROP, obj_properties);
 }
 
+static gboolean
+on_ad_switch_state_set (GtkSwitch           *widget,
+                        gboolean             state,
+                        EphySecurityPopover *popover)
+{
+  GSettings *web_settings = ephy_settings_get (EPHY_PREFS_WEB_SCHEMA);
+  EphyPermissionsManager *permissions_manager;
+  EphyPermission permission = EPHY_PERMISSION_UNDECIDED;
+  gboolean global_flag = !g_settings_get_boolean (web_settings, EPHY_PREFS_WEB_ENABLE_ADBLOCK);
+  g_autofree gchar *origin = NULL;
+
+  origin = ephy_uri_to_security_origin (popover->address);
+  if (!origin)
+    return FALSE;
+
+  permissions_manager = ephy_embed_shell_get_permissions_manager (ephy_embed_shell_get_default ());
+
+  if (global_flag != state)
+    permission = state ? EPHY_PERMISSION_PERMIT : EPHY_PERMISSION_DENY;
+
+  ephy_permissions_manager_set_permission (permissions_manager,
+                                           EPHY_PERMISSION_TYPE_SHOW_ADS,
+                                           origin,
+                                           permission);
+
+  return FALSE;
+}
+
 static void
 ephy_security_popover_init (EphySecurityPopover *popover)
 {
+  GtkWidget *adblocker;
+  GtkWidget *adblock_desc;
+  GtkWidget *hbox;
   GtkWidget *box;
 
   popover->grid = gtk_grid_new ();
@@ -338,6 +400,25 @@ ephy_security_popover_init (EphySecurityPopover *popover)
   gtk_grid_attach (GTK_GRID (popover->grid), box, 0, 0, 2, 1);
   gtk_grid_attach (GTK_GRID (popover->grid), popover->security_label, 0, 1, 2, 1);
 
+  gtk_grid_attach (GTK_GRID (popover->grid), gtk_separator_new (GTK_ORIENTATION_HORIZONTAL), 0, 3, 2, 1);
+
+  /* Permissions */
+  adblocker = gtk_label_new (NULL);
+  gtk_label_set_markup (GTK_LABEL (adblocker), _("<b>Permissions</b>"));
+  gtk_label_set_xalign (GTK_LABEL (adblocker), 0.0);
+  gtk_grid_attach (GTK_GRID (popover->grid), adblocker, 0, 4, 2, 1);
+
+  hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
+  gtk_grid_attach (GTK_GRID (popover->grid), hbox, 0, 5, 2, 1);
+
+  adblock_desc = gtk_label_new (_("Allow advertisements"));
+  gtk_label_set_xalign (GTK_LABEL (adblock_desc), 0.0);
+  gtk_box_pack_start (GTK_BOX (hbox), adblock_desc, TRUE, TRUE, 6);
+
+  popover->ad_switch = gtk_switch_new ();
+  gtk_box_pack_start (GTK_BOX (hbox), popover->ad_switch, FALSE, FALSE, 6);
+  g_signal_connect (popover->ad_switch, "state-set", G_CALLBACK (on_ad_switch_state_set), popover);
+
   gtk_container_add (GTK_CONTAINER (popover), popover->grid);
   gtk_widget_show_all (popover->grid);
 }


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