Home | History | Annotate | Download | only in webkit
      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