Title: [238734] trunk/Tools
Revision
238734
Author
[email protected]
Date
2018-11-30 06:52:43 -0800 (Fri, 30 Nov 2018)

Log Message

[GTK][MiniBrowser] Handle Device Info permission requests
https://bugs.webkit.org/show_bug.cgi?id=191585

Patch by Thibault Saunier <[email protected]> on 2018-11-30
Reviewed by Carlos Garcia Campos.

* MiniBrowser/gtk/BrowserTab.c:
(permissionRequestDataNew):
(permissionRequestDataFree):
(permissionRequestDialogResponse):
(decidePermissionRequest):
(browserTabConstructed):

Modified Paths

Diff

Modified: trunk/Tools/ChangeLog (238733 => 238734)


--- trunk/Tools/ChangeLog	2018-11-30 13:25:52 UTC (rev 238733)
+++ trunk/Tools/ChangeLog	2018-11-30 14:52:43 UTC (rev 238734)
@@ -1,3 +1,17 @@
+2018-11-30  Thibault Saunier  <[email protected]>
+
+        [GTK][MiniBrowser] Handle Device Info permission requests
+        https://bugs.webkit.org/show_bug.cgi?id=191585
+
+        Reviewed by Carlos Garcia Campos.
+
+        * MiniBrowser/gtk/BrowserTab.c:
+        (permissionRequestDataNew):
+        (permissionRequestDataFree):
+        (permissionRequestDialogResponse):
+        (decidePermissionRequest):
+        (browserTabConstructed):
+
 2018-11-30  Carlos Garcia Campos  <[email protected]>
 
         Unreviewed GTK+ gardening. Stop running tests without complex text enforced

Modified: trunk/Tools/MiniBrowser/gtk/BrowserTab.c (238733 => 238734)


--- trunk/Tools/MiniBrowser/gtk/BrowserTab.c	2018-11-30 13:25:52 UTC (rev 238733)
+++ trunk/Tools/MiniBrowser/gtk/BrowserTab.c	2018-11-30 14:52:43 UTC (rev 238734)
@@ -56,6 +56,7 @@
     GtkWidget *titleCloseButton;
 };
 
+static GHashTable *userMediaPermissionGrantedOrigins;
 struct _BrowserTabClass {
     GtkBoxClass parent;
 };
@@ -62,6 +63,37 @@
 
 G_DEFINE_TYPE(BrowserTab, browser_tab, GTK_TYPE_BOX)
 
+typedef struct {
+    WebKitPermissionRequest *request;
+    gchar *origin;
+} PermissionRequestData;
+
+static PermissionRequestData *permissionRequestDataNew(WebKitPermissionRequest *request, gchar *origin)
+{
+    PermissionRequestData *data = ""
+
+    data->request = g_object_ref(request);
+    data->origin = origin;
+
+    return data;
+}
+
+static void permissionRequestDataFree(PermissionRequestData *data)
+{
+    g_clear_object(&data->request);
+    g_clear_pointer(&data->origin, g_free);
+    g_free(data);
+}
+
+static gchar *getWebViewOrigin(WebKitWebView *webView)
+{
+    WebKitSecurityOrigin *origin = webkit_security_origin_new_for_uri(webkit_web_view_get_uri(webView));
+    gchar *originStr = webkit_security_origin_to_string(origin);
+    webkit_security_origin_unref(origin);
+
+    return originStr;
+}
+
 static void titleChanged(WebKitWebView *webView, GParamSpec *pspec, BrowserTab *tab)
 {
     const char *title = webkit_web_view_get_title(webView);
@@ -172,19 +204,25 @@
     return TRUE;
 }
 
-static void permissionRequestDialogResponse(GtkWidget *dialog, gint response, WebKitPermissionRequest *request)
+static void permissionRequestDialogResponse(GtkWidget *dialog, gint response, PermissionRequestData *requestData)
 {
     switch (response) {
     case GTK_RESPONSE_YES:
-        webkit_permission_request_allow(request);
+        if (WEBKIT_IS_USER_MEDIA_PERMISSION_REQUEST(requestData->request))
+            g_hash_table_add(userMediaPermissionGrantedOrigins, g_strdup(requestData->origin));
+
+        webkit_permission_request_allow(requestData->request);
         break;
     default:
-        webkit_permission_request_deny(request);
+        if (WEBKIT_IS_USER_MEDIA_PERMISSION_REQUEST(requestData->request))
+            g_hash_table_remove(userMediaPermissionGrantedOrigins, requestData->origin);
+
+        webkit_permission_request_deny(requestData->request);
         break;
     }
 
     gtk_widget_destroy(dialog);
-    g_object_unref(request);
+    g_clear_pointer(&requestData, permissionRequestDataFree);
 }
 
 static gboolean decidePermissionRequest(WebKitWebView *webView, WebKitPermissionRequest *request, BrowserTab *tab)
@@ -215,12 +253,24 @@
         title = "Media plugin missing request";
         text = g_strdup_printf("The media backend was unable to find a plugin to play the requested media:\n%s.\nAllow to search and install the missing plugin?",
             webkit_install_missing_media_plugins_permission_request_get_description(WEBKIT_INSTALL_MISSING_MEDIA_PLUGINS_PERMISSION_REQUEST(request)));
-    } else
+    } else if (WEBKIT_IS_DEVICE_INFO_PERMISSION_REQUEST(request)) {
+        char* origin = getWebViewOrigin(webView);
+        if (g_hash_table_contains(userMediaPermissionGrantedOrigins, origin)) {
+            webkit_permission_request_allow(request);
+            g_free(origin);
+            return TRUE;
+        }
+        g_free(origin);
         return FALSE;
+    } else {
+        g_print("%s request not handled\n", G_OBJECT_TYPE_NAME(request));
+        return FALSE;
+    }
 
     GtkWidget *dialog = createInfoBarQuestionMessage(title, text);
     g_free(text);
-    g_signal_connect(dialog, "response", G_CALLBACK(permissionRequestDialogResponse), g_object_ref(request));
+    g_signal_connect(dialog, "response", G_CALLBACK(permissionRequestDialogResponse), permissionRequestDataNew(request,
+        getWebViewOrigin(webView)));
 
     gtk_box_pack_start(GTK_BOX(tab), dialog, FALSE, FALSE, 0);
     gtk_box_reorder_child(GTK_BOX(tab), dialog, 0);
@@ -400,6 +450,9 @@
     gobjectClass->set_property = browserTabSetProperty;
     gobjectClass->finalize = browserTabFinalize;
 
+    if (!userMediaPermissionGrantedOrigins)
+        userMediaPermissionGrantedOrigins = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
+
     g_object_class_install_property(
         gobjectClass,
         PROP_VIEW,
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to