1 /*
2 * Copyright (C) 2008 Collabora Ltd.
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
13 *
14 * You should have received a copy of the GNU Library General Public License
15 * along with this library; see the file COPYING.LIB. If not, write to
16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
18 */
19
20 #include "config.h"
21 #include "webkitwebnavigationaction.h"
22
23 #include "FrameLoaderTypes.h"
24 #include "webkitenumtypes.h"
25 #include "webkitglobalsprivate.h"
26 #include <glib/gi18n-lib.h>
27 #include <string.h>
28 #include <wtf/Assertions.h>
29
30 static void webkit_web_navigation_action_set_target_frame(WebKitWebNavigationAction* navigationAction, const gchar* targetFrame);
31
32 /**
33 * SECTION:webkitwebnavigationaction
34 * @short_description: Object used to report details of navigation actions
35 *
36 * #WebKitWebNavigationAction is used in signals to provide details about
37 * what led the navigation to happen. This includes, for instance, if the user
38 * clicked a link to start that navigation, and what mouse button was used.
39 */
40
41 struct _WebKitWebNavigationActionPrivate {
42 WebKitWebNavigationReason reason;
43 gchar* originalUri;
44 gint button;
45 gint modifier_state;
46 gchar* targetFrame;
47 };
48
49 enum {
50 PROP_0,
51
52 PROP_REASON,
53 PROP_ORIGINAL_URI,
54 PROP_BUTTON,
55 PROP_MODIFIER_STATE,
56 PROP_TARGET_FRAME
57 };
58
G_DEFINE_TYPE(WebKitWebNavigationAction,webkit_web_navigation_action,G_TYPE_OBJECT)59 G_DEFINE_TYPE(WebKitWebNavigationAction, webkit_web_navigation_action, G_TYPE_OBJECT)
60
61
62 static void webkit_web_navigation_action_get_property(GObject* object, guint propertyId, GValue* value, GParamSpec* pspec)
63 {
64 WebKitWebNavigationAction* navigationAction = WEBKIT_WEB_NAVIGATION_ACTION(object);
65
66 switch(propertyId) {
67 case PROP_REASON:
68 g_value_set_enum(value, webkit_web_navigation_action_get_reason(navigationAction));
69 break;
70 case PROP_ORIGINAL_URI:
71 g_value_set_string(value, webkit_web_navigation_action_get_original_uri(navigationAction));
72 break;
73 case PROP_BUTTON:
74 g_value_set_int(value, webkit_web_navigation_action_get_button(navigationAction));
75 break;
76 case PROP_MODIFIER_STATE:
77 g_value_set_int(value, webkit_web_navigation_action_get_modifier_state(navigationAction));
78 break;
79 case PROP_TARGET_FRAME:
80 g_value_set_string(value, webkit_web_navigation_action_get_target_frame(navigationAction));
81 break;
82 default:
83 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, propertyId, pspec);
84 break;
85 }
86 }
87
webkit_web_navigation_action_set_property(GObject * object,guint propertyId,const GValue * value,GParamSpec * pspec)88 static void webkit_web_navigation_action_set_property(GObject* object, guint propertyId, const GValue* value, GParamSpec* pspec)
89 {
90 WebKitWebNavigationAction* navigationAction = WEBKIT_WEB_NAVIGATION_ACTION(object);
91 WebKitWebNavigationActionPrivate* priv = navigationAction->priv;
92
93 switch(propertyId) {
94 case PROP_REASON:
95 webkit_web_navigation_action_set_reason(navigationAction, (WebKitWebNavigationReason)g_value_get_enum(value));
96 break;
97 case PROP_ORIGINAL_URI:
98 webkit_web_navigation_action_set_original_uri(navigationAction, g_value_get_string(value));
99 break;
100 case PROP_BUTTON:
101 priv->button = g_value_get_int(value);
102 break;
103 case PROP_MODIFIER_STATE:
104 priv->modifier_state = g_value_get_int(value);
105 break;
106 case PROP_TARGET_FRAME:
107 webkit_web_navigation_action_set_target_frame(navigationAction, g_value_get_string(value));
108 break;
109 default:
110 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, propertyId, pspec);
111 break;
112 }
113 }
114
webkit_web_navigation_action_init(WebKitWebNavigationAction * navigationAction)115 static void webkit_web_navigation_action_init(WebKitWebNavigationAction* navigationAction)
116 {
117 navigationAction->priv = G_TYPE_INSTANCE_GET_PRIVATE(navigationAction, WEBKIT_TYPE_WEB_NAVIGATION_ACTION, WebKitWebNavigationActionPrivate);
118 }
119
webkit_web_navigation_action_finalize(GObject * obj)120 static void webkit_web_navigation_action_finalize(GObject* obj)
121 {
122 WebKitWebNavigationAction* navigationAction = WEBKIT_WEB_NAVIGATION_ACTION(obj);
123 WebKitWebNavigationActionPrivate* priv = navigationAction->priv;
124
125 g_free(priv->originalUri);
126
127 G_OBJECT_CLASS(webkit_web_navigation_action_parent_class)->finalize(obj);
128 }
129
webkit_web_navigation_action_class_init(WebKitWebNavigationActionClass * requestClass)130 static void webkit_web_navigation_action_class_init(WebKitWebNavigationActionClass* requestClass)
131 {
132 GObjectClass* objectClass = G_OBJECT_CLASS(requestClass);
133
134 objectClass->get_property = webkit_web_navigation_action_get_property;
135 objectClass->set_property = webkit_web_navigation_action_set_property;
136 objectClass->dispose = webkit_web_navigation_action_finalize;
137
138 /**
139 * WebKitWebNavigationAction:reason:
140 *
141 * The reason why this navigation is occuring.
142 *
143 * Since: 1.0.3
144 */
145 g_object_class_install_property(objectClass, PROP_REASON,
146 g_param_spec_enum("reason",
147 _("Reason"),
148 _("The reason why this navigation is occurring"),
149 WEBKIT_TYPE_WEB_NAVIGATION_REASON,
150 WEBKIT_WEB_NAVIGATION_REASON_OTHER,
151 (GParamFlags)(WEBKIT_PARAM_READWRITE | G_PARAM_CONSTRUCT)));
152
153 /**
154 * WebKitWebNavigationAction:original-uri:
155 *
156 * The URI that was requested as the target for the navigation.
157 *
158 * Since: 1.0.3
159 */
160 g_object_class_install_property(objectClass, PROP_ORIGINAL_URI,
161 g_param_spec_string("original-uri",
162 _("Original URI"),
163 _("The URI that was requested as the target for the navigation"),
164 "",
165 (GParamFlags)(WEBKIT_PARAM_READWRITE | G_PARAM_CONSTRUCT)));
166 /**
167 * WebKitWebNavigationAction:button:
168 *
169 * The GTK+ identifier for the mouse button used to click. Notice that GTK+ button values
170 * are 1, 2 and 3 for left, middle and right buttons, so they are DOM button values +1. If the action was not
171 * initiated by a mouse click the value will be -1.
172 *
173 * Since: 1.0.3
174 */
175 g_object_class_install_property(objectClass, PROP_BUTTON,
176 g_param_spec_int("button",
177 _("Button"),
178 _("The button used to click"),
179 -1,
180 G_MAXINT,
181 -1,
182 (GParamFlags)(WEBKIT_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)));
183
184 /**
185 * WebKitWebNavigationAction:modifier-state:
186 *
187 * The state of the modifier keys when the action was requested.
188 *
189 * Since: 1.0.3
190 */
191 g_object_class_install_property(objectClass, PROP_MODIFIER_STATE,
192 g_param_spec_int("modifier-state",
193 _("Modifier state"),
194 _("A bitmask representing the state of the modifier keys"),
195 0,
196 G_MAXINT,
197 0,
198 (GParamFlags)(WEBKIT_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)));
199
200 /**
201 * WebKitWebNavigationAction:target-frame:
202 *
203 * The target frame for the navigation.
204 *
205 * Since: 1.1.13
206 */
207 g_object_class_install_property(objectClass, PROP_TARGET_FRAME,
208 g_param_spec_string("target-frame",
209 _("Target frame"),
210 _("The target frame for the navigation"),
211 NULL,
212 (GParamFlags)(WEBKIT_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)));
213
214
215
216 g_type_class_add_private(requestClass, sizeof(WebKitWebNavigationActionPrivate));
217 }
218
219 /**
220 * webkit_web_navigation_action_get_reason:
221 * @navigationAction: a #WebKitWebNavigationAction
222 *
223 * Returns the reason why WebKit is requesting a navigation.
224 *
225 * Return value: a #WebKitWebNavigationReason
226 *
227 * Since: 1.0.3
228 */
webkit_web_navigation_action_get_reason(WebKitWebNavigationAction * navigationAction)229 WebKitWebNavigationReason webkit_web_navigation_action_get_reason(WebKitWebNavigationAction* navigationAction)
230 {
231 g_return_val_if_fail(WEBKIT_IS_WEB_NAVIGATION_ACTION(navigationAction), WEBKIT_WEB_NAVIGATION_REASON_OTHER);
232
233 return navigationAction->priv->reason;
234 }
235
236 /**
237 * webkit_web_navigation_action_set_reason:
238 * @navigationAction: a #WebKitWebNavigationAction
239 * @reason: a #WebKitWebNavigationReason
240 *
241 * Sets the reason why WebKit is requesting a navigation.
242 *
243 * Since: 1.0.3
244 */
webkit_web_navigation_action_set_reason(WebKitWebNavigationAction * navigationAction,WebKitWebNavigationReason reason)245 void webkit_web_navigation_action_set_reason(WebKitWebNavigationAction* navigationAction, WebKitWebNavigationReason reason)
246 {
247 g_return_if_fail(WEBKIT_IS_WEB_NAVIGATION_ACTION(navigationAction));
248
249 if (navigationAction->priv->reason == reason)
250 return;
251
252 navigationAction->priv->reason = reason;
253 g_object_notify(G_OBJECT(navigationAction), "reason");
254 }
255
256 /**
257 * webkit_web_navigation_action_get_original_uri:
258 * @navigationAction: a #WebKitWebNavigationAction
259 *
260 * Returns the URI that was originally requested. This may differ from the
261 * navigation target, for instance because of a redirect.
262 *
263 * Return value: the originally requested URI
264 *
265 * Since: 1.0.3
266 */
webkit_web_navigation_action_get_original_uri(WebKitWebNavigationAction * navigationAction)267 const gchar* webkit_web_navigation_action_get_original_uri(WebKitWebNavigationAction* navigationAction)
268 {
269 g_return_val_if_fail(WEBKIT_IS_WEB_NAVIGATION_ACTION(navigationAction), NULL);
270
271 return navigationAction->priv->originalUri;
272 }
273
274 /**
275 * webkit_web_navigation_action_set_original_uri:
276 * @navigationAction: a #WebKitWebNavigationAction
277 * @originalUri: a URI
278 *
279 * Sets the URI that was originally requested. This may differ from the
280 * navigation target, for instance because of a redirect.
281 *
282 * Since: 1.0.3
283 */
webkit_web_navigation_action_set_original_uri(WebKitWebNavigationAction * navigationAction,const gchar * originalUri)284 void webkit_web_navigation_action_set_original_uri(WebKitWebNavigationAction* navigationAction, const gchar* originalUri)
285 {
286 g_return_if_fail(WEBKIT_IS_WEB_NAVIGATION_ACTION(navigationAction));
287 g_return_if_fail(originalUri);
288
289 if (navigationAction->priv->originalUri &&
290 (!strcmp(navigationAction->priv->originalUri, originalUri)))
291 return;
292
293 g_free(navigationAction->priv->originalUri);
294 navigationAction->priv->originalUri = g_strdup(originalUri);
295 g_object_notify(G_OBJECT(navigationAction), "original-uri");
296 }
297
298 /**
299 * webkit_web_navigation_action_get_button:
300 * @navigationAction: a #WebKitWebNavigationAction
301 *
302 * The GTK+ identifier for the mouse button used to click. Notice that GTK+ button values
303 * are 1, 2 and 3 for left, middle and right buttons, so they are DOM button values +1. If the action was not
304 * initiated by a mouse click the value will be -1.
305 *
306 * Return value: the mouse button used to click
307 *
308 * Since: 1.0.3
309 */
webkit_web_navigation_action_get_button(WebKitWebNavigationAction * navigationAction)310 gint webkit_web_navigation_action_get_button(WebKitWebNavigationAction* navigationAction)
311 {
312 g_return_val_if_fail(WEBKIT_IS_WEB_NAVIGATION_ACTION(navigationAction), -1);
313
314 return navigationAction->priv->button;
315 }
316
317 /**
318 * webkit_web_navigation_action_get_modifier_state:
319 * @navigationAction: a #WebKitWebNavigationAction
320 *
321 * Returns a bitmask with the the state of the modifier keys.
322 *
323 * Return value: a bitmask with the state of the modifier keys
324 *
325 * Since: 1.0.3
326 */
webkit_web_navigation_action_get_modifier_state(WebKitWebNavigationAction * navigationAction)327 gint webkit_web_navigation_action_get_modifier_state(WebKitWebNavigationAction* navigationAction)
328 {
329 g_return_val_if_fail(WEBKIT_IS_WEB_NAVIGATION_ACTION(navigationAction), 0);
330
331 return navigationAction->priv->modifier_state;
332 }
333
334 /**
335 * webkit_web_navigation_action_get_target_frame:
336 * @navigationAction: a #WebKitWebNavigationAction
337 *
338 * Returns the target frame of the action.
339 *
340 * Return value: the target frame of the action or NULL
341 * if there is no target.
342 *
343 * Since: 1.1.13
344 */
webkit_web_navigation_action_get_target_frame(WebKitWebNavigationAction * navigationAction)345 G_CONST_RETURN gchar* webkit_web_navigation_action_get_target_frame(WebKitWebNavigationAction* navigationAction)
346 {
347 g_return_val_if_fail(WEBKIT_IS_WEB_NAVIGATION_ACTION(navigationAction), NULL);
348
349 return navigationAction->priv->targetFrame;
350 }
351
webkit_web_navigation_action_set_target_frame(WebKitWebNavigationAction * navigationAction,const gchar * targetFrame)352 static void webkit_web_navigation_action_set_target_frame(WebKitWebNavigationAction* navigationAction, const gchar* targetFrame)
353 {
354 if (!g_strcmp0(navigationAction->priv->targetFrame, targetFrame))
355 return;
356
357 g_free(navigationAction->priv->targetFrame);
358 navigationAction->priv->targetFrame = g_strdup(targetFrame);
359 g_object_notify(G_OBJECT(navigationAction), "target-frame");
360 }
361
362 namespace WebKit {
363
kit(WebCore::NavigationType type)364 WebKitWebNavigationReason kit(WebCore::NavigationType type)
365 {
366 return (WebKitWebNavigationReason)type;
367 }
368
core(WebKitWebNavigationReason type)369 WebCore::NavigationType core(WebKitWebNavigationReason type)
370 {
371 return static_cast<WebCore::NavigationType>(type);
372 }
373
374 }
375