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 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 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 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 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 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 */ 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 */ 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 */ 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 */ 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 */ 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 */ 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 */ 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 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 364 WebKitWebNavigationReason kit(WebCore::NavigationType type) 365 { 366 return (WebKitWebNavigationReason)type; 367 } 368 369 WebCore::NavigationType core(WebKitWebNavigationReason type) 370 { 371 return static_cast<WebCore::NavigationType>(type); 372 } 373 374 } 375