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