• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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