]> spindle.queued.net Git - midori/commitdiff
Look for userscripts in system paths
authorArnaud Renevier <arenevier@fdn.fr>
Fri, 15 Aug 2008 00:20:05 +0000 (02:20 +0200)
committerChristian Dywan <christian@twotoasts.de>
Fri, 15 Aug 2008 00:20:05 +0000 (02:20 +0200)
midori/midori-addons.c

index bc7d835716ecd4ffd7e971579dde80e86edd21c6..50de6fae942fe64509be6fb607ea316b86349e08 100644 (file)
@@ -182,6 +182,63 @@ _addons_get_extension (MidoriAddons* addons)
     }
 }
 
+static GSList*
+_addons_get_files (MidoriAddons* addons)
+{
+    GSList* files;
+    GDir* addon_dir;
+    const gchar* addons_name;
+    const gchar* addons_extension;
+    const char* const *datadirs;
+    const gchar* filename;
+    gchar *dirname;
+    gchar *fullname;
+
+    files = NULL;
+    addons_name = _addons_get_folder (addons);
+    addons_extension = _addons_get_extension (addons);
+
+    /* system data dirs */
+    datadirs = g_get_system_data_dirs ();
+    while (*datadirs)
+    {
+        dirname = g_build_filename (*datadirs, PACKAGE_NAME, addons_name, NULL);
+        if ((addon_dir = g_dir_open (dirname, 0, NULL)))
+        {
+            while ((filename = g_dir_read_name (addon_dir)))
+            {
+                if (g_str_has_suffix (filename, addons_extension))
+                {
+                    fullname = g_build_filename (dirname, filename, NULL);
+                    files = g_slist_prepend (files, fullname);
+                }
+            }
+            g_dir_close (addon_dir);
+        }
+        g_free (dirname);
+        datadirs++;
+    }
+
+    /* user data dir */
+    dirname = g_build_filename (g_get_user_data_dir () , PACKAGE_NAME,
+                                addons_name, NULL);
+    if ((addon_dir = g_dir_open (dirname, 0, NULL)))
+    {
+        while ((filename = g_dir_read_name (addon_dir)))
+        {
+            if (g_str_has_suffix (filename, addons_extension))
+            {
+                fullname = g_build_filename (dirname, filename, NULL);
+                files = g_slist_prepend (files, fullname);
+            }
+        }
+        g_dir_close (addon_dir);
+    }
+    g_free (dirname);
+
+    return files;
+}
+
 static void
 midori_addons_button_add_clicked_cb (GtkToolItem*  toolitem,
                                      MidoriAddons* addons)
@@ -547,59 +604,50 @@ midori_web_widget_window_object_cleared_cb (GtkWidget*         web_widget,
                                             JSObjectRef        js_window,
                                             MidoriAddons*      addons)
 {
-    gchar* addon_path;
-    GDir* addon_dir;
-    const gchar* filename;
     gchar* fullname;
     GSList* includes;
     GSList* excludes;
     const gchar* uri;
     gchar* exception;
     gchar* message;
+    GSList* addon_files;
+    GSList* list;
 
     uri = webkit_web_frame_get_uri (web_frame);
     if (!uri)
         return;
 
-    /* FIXME: We want to honor system installed addons as well */
-    addon_path = g_build_filename (g_get_user_data_dir (), PACKAGE_NAME,
-                                   _addons_get_folder (addons), NULL);
-    if ((addon_dir = g_dir_open (addon_path, 0, NULL)))
+    addon_files = _addons_get_files(addons);
+    list = addon_files;
+    while (addon_files)
     {
-        while ((filename = g_dir_read_name (addon_dir)))
+        fullname = addon_files->data;
+        includes = NULL;
+        excludes = NULL;
+        if (!_metadata_from_file (fullname, &includes, &excludes, NULL, NULL))
         {
-            if (!g_str_has_suffix (filename, _addons_get_extension (addons)))
-                continue;
-
-            fullname = g_build_filename (addon_path, filename, NULL);
-            includes = NULL;
-            excludes = NULL;
-            if (!_metadata_from_file (fullname,
-                &includes, &excludes, NULL, NULL))
+            addon_files = addon_files->next;
+            continue;
+        }
+        if (includes || excludes)
+            if (!_may_load_script (uri, &includes, &excludes))
             {
-                g_free (fullname);
+                addon_files = addon_files->next;
                 continue;
             }
-            if (includes || excludes)
-                if (!_may_load_script (uri, &includes, &excludes))
-                {
-                    g_free (fullname);
-                    continue;
-                }
-            g_slist_free (includes);
-            g_slist_free (excludes);
-            exception = NULL;
-            if (!_js_script_from_file (js_context, fullname, &exception))
-            {
-                message = g_strdup_printf ("console.error ('%s');", exception);
-                gjs_script_eval (js_context, message, NULL);
-                g_free (message);
-                g_free (exception);
-            }
-            g_free (fullname);
+        g_slist_free (includes);
+        g_slist_free (excludes);
+        exception = NULL;
+        if (!_js_script_from_file (js_context, fullname, &exception))
+        {
+            message = g_strdup_printf ("console.error ('%s');", exception);
+            gjs_script_eval (js_context, message, NULL);
+            g_free (message);
+            g_free (exception);
         }
-        g_dir_close (addon_dir);
+        addon_files = addon_files->next;
     }
+    g_slist_free (list);
 }
 
 /**
@@ -680,13 +728,12 @@ midori_addons_set_kind (MidoriAddons*   addons,
                         MidoriAddonKind kind)
 {
     GtkListStore* liststore;
-    gchar* addon_path;
-    GDir* addon_dir;
-    const gchar* filename;
-    const gchar* displayname;
     gchar* fullname;
+    gchar* displayname;
     gchar* name;
     GtkTreeIter iter;
+    GSList* addon_files;
+    GSList* list;
 
     g_return_if_fail (MIDORI_IS_ADDONS (addons));
     g_return_if_fail (addons->kind == MIDORI_ADDON_NONE);
@@ -705,45 +752,35 @@ midori_addons_set_kind (MidoriAddons*   addons,
     liststore = gtk_list_store_new (3, G_TYPE_STRING,
                                     G_TYPE_INT,
                                     G_TYPE_STRING);
-    /* FIXME: We want to honor system installed addons as well */
-    addon_path = g_build_filename (g_get_user_data_dir (), PACKAGE_NAME,
-                                   _addons_get_folder (addons), NULL);
-    addon_dir = g_dir_open (addon_path, 0, NULL);
-    if (addon_dir)
+
+    addon_files = _addons_get_files (addons);
+    list = addon_files;
+    while (addon_files)
     {
-        while ((filename = g_dir_read_name (addon_dir)))
+        fullname = addon_files->data;
+        displayname =  g_filename_display_basename (fullname);
+
+        if (kind == MIDORI_ADDON_USER_SCRIPTS)
         {
-            if (!g_str_has_suffix (filename, _addons_get_extension (addons)))
+            name = NULL;
+            if (!_metadata_from_file (fullname, NULL, NULL, &name, NULL))
                 continue;
-
-            displayname = g_filename_to_utf8 (filename, -1, NULL, NULL, NULL);
-            if (!displayname)
-                displayname = filename;
-
-            if (kind == MIDORI_ADDON_USER_SCRIPTS)
+            if (name)
             {
-                fullname = g_build_filename (addon_path, filename, NULL);
-                name = NULL;
-                if (!_metadata_from_file (fullname, NULL, NULL,
-                    &name, NULL))
-                {
-                    g_free (fullname);
-                    continue;
-                }
-                if (name)
-                    displayname = name;
-                g_free (fullname);
+                g_free (displayname);
+                displayname = name;
             }
-
-            gtk_list_store_append (liststore, &iter);
-            gtk_list_store_set (liststore, &iter,
-                0, displayname, 1, 0, 2, "", -1);
         }
-        g_dir_close (addon_dir);
+
+        gtk_list_store_append (liststore, &iter);
+        gtk_list_store_set (liststore, &iter, 0, displayname, 1, 0, 2, "", -1);
+        addon_files = addon_files->next;
     }
+
+    g_slist_free (list);
+
     gtk_tree_view_set_model (GTK_TREE_VIEW (addons->treeview),
                              GTK_TREE_MODEL (liststore));
-
     g_object_notify (G_OBJECT (addons), "kind");
 }