73b42ee9e240fbda5e7366d28d570252b654c0dc
[WebKit-https.git] / Source / WebKit / gtk / webkit / webkitwebplugin.cpp
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
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
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_slist_foreach(priv->mimeTypes, (GFunc)freeMIMEType, 0);
67     g_slist_free(priv->mimeTypes);
68
69     delete plugin->priv;
70
71     G_OBJECT_CLASS(webkit_web_plugin_parent_class)->finalize(object);
72 }
73
74 static void webkit_web_plugin_get_property(GObject* object, guint prop_id, GValue* value, GParamSpec* paramSpec)
75 {
76     WebKitWebPlugin* plugin = WEBKIT_WEB_PLUGIN(object);
77
78     switch (prop_id) {
79     case PROP_ENABLED:
80         g_value_set_boolean(value, webkit_web_plugin_get_enabled(plugin));
81         break;
82     default:
83         G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, paramSpec);
84     }
85 }
86
87 static void webkit_web_plugin_set_property(GObject* object, guint prop_id, const GValue* value, GParamSpec* paramSpec)
88 {
89     WebKitWebPlugin* plugin = WEBKIT_WEB_PLUGIN(object);
90
91     switch (prop_id) {
92     case PROP_ENABLED:
93         webkit_web_plugin_set_enabled(plugin, g_value_get_boolean(value));
94         break;
95     default:
96         G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, paramSpec);
97     }
98 }
99
100 static void webkit_web_plugin_class_init(WebKitWebPluginClass* klass)
101 {
102     webkitInit();
103
104     GObjectClass* gobjectClass = reinterpret_cast<GObjectClass*>(klass);
105
106     gobjectClass->finalize = webkit_web_plugin_finalize;
107     gobjectClass->get_property = webkit_web_plugin_get_property;
108     gobjectClass->set_property = webkit_web_plugin_set_property;
109
110     g_object_class_install_property(gobjectClass,
111                                     PROP_ENABLED,
112                                     g_param_spec_boolean("enabled",
113                                                          _("Enabled"),
114                                                          _("Whether the plugin is enabled"),
115                                                          FALSE,
116                                                          WEBKIT_PARAM_READWRITE));
117 }
118
119 static void webkit_web_plugin_init(WebKitWebPlugin *plugin)
120 {
121     plugin->priv = new WebKitWebPluginPrivate();
122     plugin->priv->mimeTypes = 0;
123 }
124
125 namespace WebKit {
126 WebKitWebPlugin* kitNew(WebCore::PluginPackage* package)
127 {
128     WebKitWebPlugin* plugin = WEBKIT_WEB_PLUGIN(g_object_new(WEBKIT_TYPE_WEB_PLUGIN, 0));
129
130     plugin->priv->corePlugin = package;
131
132     return plugin;
133 }
134 }
135
136 /**
137  * webkit_web_plugin_get_name:
138  * @plugin: a #WebKitWebPlugin
139  *
140  * Returns: the name string for @plugin.
141  *
142  * Since: 1.3.8
143  */
144 const char* webkit_web_plugin_get_name(WebKitWebPlugin* plugin)
145 {
146     g_return_val_if_fail(WEBKIT_IS_WEB_PLUGIN(plugin), 0);
147
148     WebKitWebPluginPrivate* priv = plugin->priv;
149
150     if (!priv->name.length())
151         priv->name = priv->corePlugin->name().utf8();
152
153     return priv->name.data();
154 }
155
156 /**
157  * webkit_web_plugin_get_description:
158  * @plugin: a #WebKitWebPlugin
159  *
160  * Returns: the description string for @plugin.
161  *
162  * Since: 1.3.8
163  */
164 const char* webkit_web_plugin_get_description(WebKitWebPlugin* plugin)
165 {
166     g_return_val_if_fail(WEBKIT_IS_WEB_PLUGIN(plugin), 0);
167
168     WebKitWebPluginPrivate* priv = plugin->priv;
169
170     if (!priv->description.length())
171         priv->description = priv->corePlugin->description().utf8();
172
173     return priv->description.data();
174 }
175
176 /**
177  * webkit_web_plugin_get_path:
178  * @plugin: a #WebKitWebPlugin
179  *
180  * Returns: the absolute path to @plugin in system filename encoding
181  * or %NULL on failure to convert the filename from UTF-8.
182  *
183  * Since: 1.4.0
184  */
185 const char* webkit_web_plugin_get_path(WebKitWebPlugin* plugin)
186 {
187     g_return_val_if_fail(WEBKIT_IS_WEB_PLUGIN(plugin), 0);
188
189     WebKitWebPluginPrivate* priv = plugin->priv;
190
191     if (priv->path)
192         return priv->path.get();
193
194     GOwnPtr<GError> error;
195     priv->path.set(g_filename_from_utf8(priv->corePlugin->path().utf8().data(), -1, 0, 0, &error.outPtr()));
196
197     if (!error)
198         return priv->path.get();
199
200     // In the unlikely case the convertion fails, report the error and make sure we free
201     // any partial convertion that ended up in the variable.
202     priv->path.clear();
203
204     g_warning("Failed to convert '%s' to system filename encoding: %s", priv->corePlugin->path().utf8().data(), error->message);
205
206     return 0;
207 }
208
209
210 /**
211  * webkit_web_plugin_get_mimetypes: (skip)
212  * @plugin: a #WebKitWebPlugin
213  *
214  * Returns all the #WebKitWebPluginMIMEType that @plugin is handling
215  * at the moment.
216  *
217  * Returns:  a #GSList of #WebKitWebPluginMIMEType
218  *
219  * Since: 1.3.8
220  */
221 GSList* webkit_web_plugin_get_mimetypes(WebKitWebPlugin* plugin)
222 {
223     g_return_val_if_fail(WEBKIT_IS_WEB_PLUGIN(plugin), 0);
224
225     WebKitWebPluginPrivate* priv = plugin->priv;
226
227     if (priv->mimeTypes)
228         return priv->mimeTypes;
229
230     const MIMEToDescriptionsMap& mimeToDescriptions = priv->corePlugin->mimeToDescriptions();
231     MIMEToDescriptionsMap::const_iterator end = mimeToDescriptions.end();
232
233     for (MIMEToDescriptionsMap::const_iterator it = mimeToDescriptions.begin(); it != end; ++it) {
234         WebKitWebPluginMIMEType* mimeType = g_slice_new0(WebKitWebPluginMIMEType);
235         mimeType->name = g_strdup(it->key.utf8().data());
236         mimeType->description = g_strdup(it->value.utf8().data());
237
238         Vector<String> extensions = priv->corePlugin->mimeToExtensions().get(it->key);
239         mimeType->extensions = static_cast<gchar**>(g_malloc0(sizeof(char*) * (extensions.size() + 1)));
240         for (unsigned i = 0; i < extensions.size(); i++)
241             mimeType->extensions[i] = g_strdup(extensions[i].utf8().data());
242
243         priv->mimeTypes = g_slist_append(priv->mimeTypes, mimeType);
244     }
245
246     return priv->mimeTypes;
247 }
248
249 /**
250  * webkit_web_plugin_set_enabled:
251  * @plugin: a #WebKitWebPlugin
252  * @enabled: whether to enable the plugin
253  *
254  * Sets the enabled status of the @plugin.
255  *
256  * Since: 1.3.8
257  */
258 void webkit_web_plugin_set_enabled(WebKitWebPlugin* plugin, gboolean enabled)
259 {
260     g_return_if_fail(WEBKIT_IS_WEB_PLUGIN(plugin));
261     WebKitWebPluginPrivate* priv = plugin->priv;
262
263     ASSERT(priv->corePlugin);
264     if (priv->corePlugin->isEnabled() == enabled)
265         return;
266
267     priv->corePlugin->setEnabled(enabled);
268
269     g_object_notify(G_OBJECT(plugin), "enabled");
270 }
271
272 /**
273  * webkit_web_plugin_get_enabled:
274  * @plugin: a #WebKitWebPlugin
275  *
276  * Returns: %TRUE if the plugin is enabled, %FALSE otherwise
277  *
278  * Since: 1.3.8
279  */
280 gboolean webkit_web_plugin_get_enabled(WebKitWebPlugin* plugin)
281 {
282     g_return_val_if_fail(WEBKIT_IS_WEB_PLUGIN(plugin), FALSE);
283
284     ASSERT(plugin->priv->corePlugin);
285     return plugin->priv->corePlugin->isEnabled();
286 }