• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright (C) 2010 Igalia S.L.
3  *  Copyright (C) 2011 Gustavo Noronha Silva <gns@gnome.org>
4  *
5  *  This library is free software; you can redistribute it and/or
6  *  modify it under the terms of the GNU Lesser General Public
7  *  License as published by the Free Software Foundation; either
8  *  version 2 of the License, or (at your option) any later version.
9  *
10  *  This library is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  *  Lesser General Public License for more details.
14  *
15  *  You should have received a copy of the GNU Lesser General Public
16  *  License along with this library; if not, write to the Free Software
17  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
18  */
19 
20 #include "config.h"
21 #include "webkitwebplugin.h"
22 
23 #include "PluginPackage.h"
24 #include "webkitglobalsprivate.h"
25 #include "webkitwebpluginprivate.h"
26 #include <glib/gi18n-lib.h>
27 
28 /**
29  * SECTION:webkitwebplugin
30  * @short_description: Represents a plugin, enabling fine-grained control
31  * @see_also: #WebKitWebPluginDatabase
32  *
33  * This object represents a single plugin, found by WebKitGTK+ while
34  * scanning the various usual directories. This object can be used to
35  * get more information about a plugin, and enable/disable it,
36  * allowing fine-grained control of plugins. The list of available
37  * plugins can be obtained from the #WebKitWebPluginDatabase object.
38  */
39 
40 using namespace WebCore;
41 
42 enum {
43     PROP_0,
44 
45     PROP_ENABLED
46 };
47 
G_DEFINE_TYPE(WebKitWebPlugin,webkit_web_plugin,G_TYPE_OBJECT)48 G_DEFINE_TYPE(WebKitWebPlugin, webkit_web_plugin, G_TYPE_OBJECT)
49 
50 static void freeMIMEType(WebKitWebPluginMIMEType* mimeType)
51 {
52     if (mimeType->name)
53         g_free(mimeType->name);
54     if (mimeType->description)
55         g_free(mimeType->description);
56     if (mimeType->extensions)
57         g_strfreev(mimeType->extensions);
58     g_slice_free(WebKitWebPluginMIMEType, mimeType);
59 }
60 
webkit_web_plugin_finalize(GObject * object)61 static void webkit_web_plugin_finalize(GObject* object)
62 {
63     WebKitWebPlugin* plugin = WEBKIT_WEB_PLUGIN(object);
64     WebKitWebPluginPrivate* priv = plugin->priv;
65 
66     g_free(priv->path);
67 
68     g_slist_foreach(priv->mimeTypes, (GFunc)freeMIMEType, 0);
69     g_slist_free(priv->mimeTypes);
70 
71     delete plugin->priv;
72 
73     G_OBJECT_CLASS(webkit_web_plugin_parent_class)->finalize(object);
74 }
75 
webkit_web_plugin_get_property(GObject * object,guint prop_id,GValue * value,GParamSpec * paramSpec)76 static void webkit_web_plugin_get_property(GObject* object, guint prop_id, GValue* value, GParamSpec* paramSpec)
77 {
78     WebKitWebPlugin* plugin = WEBKIT_WEB_PLUGIN(object);
79 
80     switch (prop_id) {
81     case PROP_ENABLED:
82         g_value_set_boolean(value, webkit_web_plugin_get_enabled(plugin));
83         break;
84     default:
85         G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, paramSpec);
86     }
87 }
88 
webkit_web_plugin_set_property(GObject * object,guint prop_id,const GValue * value,GParamSpec * paramSpec)89 static void webkit_web_plugin_set_property(GObject* object, guint prop_id, const GValue* value, GParamSpec* paramSpec)
90 {
91     WebKitWebPlugin* plugin = WEBKIT_WEB_PLUGIN(object);
92 
93     switch (prop_id) {
94     case PROP_ENABLED:
95         webkit_web_plugin_set_enabled(plugin, g_value_get_boolean(value));
96         break;
97     default:
98         G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, paramSpec);
99     }
100 }
101 
webkit_web_plugin_class_init(WebKitWebPluginClass * klass)102 static void webkit_web_plugin_class_init(WebKitWebPluginClass* klass)
103 {
104     webkitInit();
105 
106     GObjectClass* gobjectClass = reinterpret_cast<GObjectClass*>(klass);
107 
108     gobjectClass->finalize = webkit_web_plugin_finalize;
109     gobjectClass->get_property = webkit_web_plugin_get_property;
110     gobjectClass->set_property = webkit_web_plugin_set_property;
111 
112     g_object_class_install_property(gobjectClass,
113                                     PROP_ENABLED,
114                                     g_param_spec_boolean("enabled",
115                                                          _("Enabled"),
116                                                          _("Whether the plugin is enabled"),
117                                                          FALSE,
118                                                          WEBKIT_PARAM_READWRITE));
119 }
120 
webkit_web_plugin_init(WebKitWebPlugin * plugin)121 static void webkit_web_plugin_init(WebKitWebPlugin *plugin)
122 {
123     plugin->priv = new WebKitWebPluginPrivate();
124     plugin->priv->mimeTypes = 0;
125 }
126 
127 namespace WebKit {
kitNew(WebCore::PluginPackage * package)128 WebKitWebPlugin* kitNew(WebCore::PluginPackage* package)
129 {
130     WebKitWebPlugin* plugin = WEBKIT_WEB_PLUGIN(g_object_new(WEBKIT_TYPE_WEB_PLUGIN, 0));
131 
132     plugin->priv->corePlugin = package;
133 
134     return plugin;
135 }
136 }
137 
138 /**
139  * webkit_web_plugin_get_name:
140  * @plugin: a #WebKitWebPlugin
141  *
142  * Returns: the name string for @plugin.
143  *
144  * Since: 1.3.8
145  */
webkit_web_plugin_get_name(WebKitWebPlugin * plugin)146 const char* webkit_web_plugin_get_name(WebKitWebPlugin* plugin)
147 {
148     g_return_val_if_fail(WEBKIT_IS_WEB_PLUGIN(plugin), 0);
149 
150     WebKitWebPluginPrivate* priv = plugin->priv;
151 
152     if (!priv->name.length())
153         priv->name = priv->corePlugin->name().utf8();
154 
155     return priv->name.data();
156 }
157 
158 /**
159  * webkit_web_plugin_get_description:
160  * @plugin: a #WebKitWebPlugin
161  *
162  * Returns: the description string for @plugin.
163  *
164  * Since: 1.3.8
165  */
webkit_web_plugin_get_description(WebKitWebPlugin * plugin)166 const char* webkit_web_plugin_get_description(WebKitWebPlugin* plugin)
167 {
168     g_return_val_if_fail(WEBKIT_IS_WEB_PLUGIN(plugin), 0);
169 
170     WebKitWebPluginPrivate* priv = plugin->priv;
171 
172     if (!priv->description.length())
173         priv->description = priv->corePlugin->description().utf8();
174 
175     return priv->description.data();
176 }
177 
178 /**
179  * webkit_web_plugin_get_path:
180  * @plugin: a #WebKitWebPlugin
181  *
182  * Returns: the absolute path to @plugin in system filename encoding
183  * or %NULL on failure to convert the filename from UTF-8.
184  *
185  * Since: 1.4.0
186  */
webkit_web_plugin_get_path(WebKitWebPlugin * plugin)187 const char* webkit_web_plugin_get_path(WebKitWebPlugin* plugin)
188 {
189     g_return_val_if_fail(WEBKIT_IS_WEB_PLUGIN(plugin), 0);
190 
191     WebKitWebPluginPrivate* priv = plugin->priv;
192 
193     if (priv->path)
194         return priv->path;
195 
196     GError* error = 0;
197     priv->path = g_filename_from_utf8(priv->corePlugin->path().utf8().data(), -1, 0, 0, &error);
198 
199     if (!error)
200         return priv->path;
201 
202     // In the unlikely case the convertion fails, report the error and make sure we free
203     // any partial convertion that ended up in the variable.
204     g_free(priv->path);
205     priv->path = 0;
206 
207     g_warning("Failed to convert '%s' to system filename encoding: %s", priv->corePlugin->path().utf8().data(), error->message);
208 
209     g_clear_error(&error);
210 
211     return 0;
212 }
213 
214 
215 /**
216  * webkit_web_plugin_get_mimetypes:
217  * @plugin: a #WebKitWebPlugin
218  *
219  * Returns all the #WebKitWebPluginMIMEType that @plugin is handling
220  * at the moment.
221  *
222  * Returns: (transfer none) (element-type WebKitWebPluginMIMEType): a #GSList of #WebKitWebPluginMIMEType
223  *
224  * Since: 1.3.8
225  */
webkit_web_plugin_get_mimetypes(WebKitWebPlugin * plugin)226 GSList* webkit_web_plugin_get_mimetypes(WebKitWebPlugin* plugin)
227 {
228     g_return_val_if_fail(WEBKIT_IS_WEB_PLUGIN(plugin), 0);
229 
230     WebKitWebPluginPrivate* priv = plugin->priv;
231 
232     if (priv->mimeTypes)
233         return priv->mimeTypes;
234 
235     const MIMEToDescriptionsMap& mimeToDescriptions = priv->corePlugin->mimeToDescriptions();
236     MIMEToDescriptionsMap::const_iterator end = mimeToDescriptions.end();
237 
238     for (MIMEToDescriptionsMap::const_iterator it = mimeToDescriptions.begin(); it != end; ++it) {
239         WebKitWebPluginMIMEType* mimeType = g_slice_new0(WebKitWebPluginMIMEType);
240         mimeType->name = g_strdup(it->first.utf8().data());
241         mimeType->description = g_strdup(it->second.utf8().data());
242 
243         Vector<String> extensions = priv->corePlugin->mimeToExtensions().get(it->first);
244         mimeType->extensions = static_cast<gchar**>(g_malloc0(extensions.size() + 1));
245         for (unsigned i = 0; i < extensions.size(); i++)
246             mimeType->extensions[i] = g_strdup(extensions[i].utf8().data());
247 
248         priv->mimeTypes = g_slist_append(priv->mimeTypes, mimeType);
249     }
250 
251     return priv->mimeTypes;
252 }
253 
254 /**
255  * webkit_web_plugin_set_enabled:
256  * @plugin: a #WebKitWebPlugin
257  * @enabled: whether to enable the plugin
258  *
259  * Sets the enabled status of the @plugin.
260  *
261  * Since: 1.3.8
262  */
webkit_web_plugin_set_enabled(WebKitWebPlugin * plugin,gboolean enabled)263 void webkit_web_plugin_set_enabled(WebKitWebPlugin* plugin, gboolean enabled)
264 {
265     g_return_if_fail(WEBKIT_IS_WEB_PLUGIN(plugin));
266     WebKitWebPluginPrivate* priv = plugin->priv;
267 
268     ASSERT(priv->corePlugin);
269     if (priv->corePlugin->isEnabled() == enabled)
270         return;
271 
272     priv->corePlugin->setEnabled(enabled);
273 
274     g_object_notify(G_OBJECT(plugin), "enabled");
275 }
276 
277 /**
278  * webkit_web_plugin_get_enabled:
279  * @plugin: a #WebKitWebPlugin
280  *
281  * Returns: %TRUE if the plugin is enabled, %FALSE otherwise
282  *
283  * Since: 1.3.8
284  */
webkit_web_plugin_get_enabled(WebKitWebPlugin * plugin)285 gboolean webkit_web_plugin_get_enabled(WebKitWebPlugin* plugin)
286 {
287     g_return_val_if_fail(WEBKIT_IS_WEB_PLUGIN(plugin), FALSE);
288 
289     ASSERT(plugin->priv->corePlugin);
290     return plugin->priv->corePlugin->isEnabled();
291 }
292