/* * Copyright (C) 2012 Igalia S.L. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "config.h" #include "WebKitNavigationPolicyDecision.h" #include "WebEvent.h" #include "WebKitEnumTypes.h" #include "WebKitPolicyDecisionPrivate.h" #include "WebKitURIRequestPrivate.h" #include "WebURLRequest.h" #include #include #include using namespace WebKit; using namespace WebCore; /** * SECTION: WebKitNavigationPolicyDecision * @Short_description: A policy decision for navigation actions * @Title: WebKitNavigationPolicyDecision * @See_also: #WebKitPolicyDecision, #WebKitWebView * * WebKitNavigationPolicyDecision represents a policy decision for events associated with * navigations. If the value of #WebKitNavigationPolicyDecision:mouse-button is not 0, then * the navigation was triggered by a mouse event. */ struct _WebKitNavigationPolicyDecisionPrivate { WebKitNavigationType navigationType; unsigned modifiers; unsigned mouseButton; GRefPtr request; CString frameName; }; WEBKIT_DEFINE_TYPE(WebKitNavigationPolicyDecision, webkit_navigation_policy_decision, WEBKIT_TYPE_POLICY_DECISION) enum { PROP_0, PROP_NAVIGATION_TYPE, PROP_MOUSE_BUTTON, PROP_MODIFIERS, PROP_REQUEST, PROP_FRAME_NAME, }; static void webkitNavigationPolicyDecisionGetProperty(GObject* object, guint propId, GValue* value, GParamSpec* paramSpec) { WebKitNavigationPolicyDecision* decision = WEBKIT_NAVIGATION_POLICY_DECISION(object); switch (propId) { case PROP_NAVIGATION_TYPE: g_value_set_enum(value, webkit_navigation_policy_decision_get_navigation_type(decision)); break; case PROP_MOUSE_BUTTON: g_value_set_enum(value, webkit_navigation_policy_decision_get_mouse_button(decision)); break; case PROP_MODIFIERS: g_value_set_uint(value, webkit_navigation_policy_decision_get_modifiers(decision)); break; case PROP_REQUEST: g_value_set_object(value, webkit_navigation_policy_decision_get_request(decision)); break; case PROP_FRAME_NAME: g_value_set_string(value, webkit_navigation_policy_decision_get_frame_name(decision)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, propId, paramSpec); break; } } static void webkit_navigation_policy_decision_class_init(WebKitNavigationPolicyDecisionClass* decisionClass) { GObjectClass* objectClass = G_OBJECT_CLASS(decisionClass); objectClass->get_property = webkitNavigationPolicyDecisionGetProperty; /** * WebKitNavigationPolicyDecision:navigation-type: * * The type of navigation that triggered this policy decision. This is * useful for enacting different policies depending on what type of user * action caused the navigation. */ g_object_class_install_property(objectClass, PROP_NAVIGATION_TYPE, g_param_spec_enum("navigation-type", _("Navigation type"), _("The type of navigation triggering this decision"), WEBKIT_TYPE_NAVIGATION_TYPE, WEBKIT_NAVIGATION_TYPE_LINK_CLICKED, WEBKIT_PARAM_READABLE)); /** * WebKitNavigationPolicyDecision:mouse-button: * * If the navigation associated with this policy decision was originally * triggered by a mouse event, this property contains non-zero button number * of the button triggering that event. The button numbers match those from GDK. * If the navigation was not triggered by a mouse event, the value of this * property will be 0. */ g_object_class_install_property(objectClass, PROP_MOUSE_BUTTON, g_param_spec_uint("mouse-button", _("Mouse button"), _("The mouse button used if this decision was triggered by a mouse event"), 0, G_MAXUINT, 0, WEBKIT_PARAM_READABLE)); /** * WebKitNavigationPolicyDecision:modifiers: * * If the navigation associated with this policy decision was originally * triggered by a mouse event, this property contains a bitmask of various * #GdkModifierType values describing the modifiers used for that click. * If the navigation was not triggered by a mouse event or no modifiers * were active, the value of this property will be zero. */ g_object_class_install_property(objectClass, PROP_MODIFIERS, g_param_spec_uint("modifiers", _("Mouse event modifiers"), _("The modifiers active if this decision was triggered by a mouse event"), 0, G_MAXUINT, 0, WEBKIT_PARAM_READABLE)); /** * WebKitNavigationPolicyDecision:request: * * This property contains the #WebKitURIRequest associated with this * navigation. */ g_object_class_install_property(objectClass, PROP_REQUEST, g_param_spec_object("request", _("Navigation URI request"), _("The URI request that is associated with this navigation"), WEBKIT_TYPE_URI_REQUEST, WEBKIT_PARAM_READABLE)); /** * WebKitNavigationPolicyDecision:frame-name: * * If this navigation request targets a new frame, this property contains * the name of that frame. For example if the decision was triggered by clicking a * link with a target attribute equal to "_blank", this property will contain the * value of that attribute. In all other cases, this value will be %NULL. */ g_object_class_install_property(objectClass, PROP_FRAME_NAME, g_param_spec_string("frame-name", _("Frame name"), _("The name of the new frame this navigation action targets"), 0, WEBKIT_PARAM_READABLE)); } /** * webkit_navigation_policy_decision_get_navigation_type: * @decision: a #WebKitNavigationPolicyDecision * * Gets the value of the #WebKitNavigationPolicyDecision:navigation-type property. * * Returns: The type of navigation triggering this policy decision. */ WebKitNavigationType webkit_navigation_policy_decision_get_navigation_type(WebKitNavigationPolicyDecision* decision) { g_return_val_if_fail(WEBKIT_IS_NAVIGATION_POLICY_DECISION(decision), WEBKIT_NAVIGATION_TYPE_OTHER); return decision->priv->navigationType; } /** * webkit_navigation_policy_decision_get_mouse_button: * @decision: a #WebKitNavigationPolicyDecision * * Gets the value of the #WebKitNavigationPolicyDecision:mouse-button property. * * Returns: The mouse button used if this decision was triggered by a mouse event or 0 otherwise */ guint webkit_navigation_policy_decision_get_mouse_button(WebKitNavigationPolicyDecision* decision) { g_return_val_if_fail(WEBKIT_IS_NAVIGATION_POLICY_DECISION(decision), 0); return decision->priv->mouseButton; } /** * webkit_navigation_policy_decision_get_modifiers: * @decision: a #WebKitNavigationPolicyDecision * * Gets the value of the #WebKitNavigationPolicyDecision:modifiers property. * * Returns: The modifiers active if this decision was triggered by a mouse event */ unsigned webkit_navigation_policy_decision_get_modifiers(WebKitNavigationPolicyDecision* decision) { g_return_val_if_fail(WEBKIT_IS_NAVIGATION_POLICY_DECISION(decision), 0); return decision->priv->modifiers; } /** * webkit_navigation_policy_decision_get_request: * @decision: a #WebKitNavigationPolicyDecision * * Gets the value of the #WebKitNavigationPolicyDecision:request property. * * Returns: (transfer none): The URI request that is associated with this navigation */ WebKitURIRequest* webkit_navigation_policy_decision_get_request(WebKitNavigationPolicyDecision* decision) { g_return_val_if_fail(WEBKIT_IS_NAVIGATION_POLICY_DECISION(decision), 0); return decision->priv->request.get(); } /** * webkit_navigation_policy_decision_get_frame_name: * @decision: a #WebKitNavigationPolicyDecision * * Gets the value of the #WebKitNavigationPolicyDecision:frame-name property. * * Returns: The name of the new frame this navigation action targets or %NULL */ const char* webkit_navigation_policy_decision_get_frame_name(WebKitNavigationPolicyDecision* decision) { g_return_val_if_fail(WEBKIT_IS_NAVIGATION_POLICY_DECISION(decision), 0); return decision->priv->frameName.data(); } COMPILE_ASSERT_MATCHING_ENUM(WEBKIT_NAVIGATION_TYPE_LINK_CLICKED, NavigationTypeLinkClicked); COMPILE_ASSERT_MATCHING_ENUM(WEBKIT_NAVIGATION_TYPE_FORM_SUBMITTED, NavigationTypeFormSubmitted); COMPILE_ASSERT_MATCHING_ENUM(WEBKIT_NAVIGATION_TYPE_BACK_FORWARD, NavigationTypeBackForward); COMPILE_ASSERT_MATCHING_ENUM(WEBKIT_NAVIGATION_TYPE_RELOAD, NavigationTypeReload); COMPILE_ASSERT_MATCHING_ENUM(WEBKIT_NAVIGATION_TYPE_FORM_RESUBMITTED, NavigationTypeFormResubmitted); COMPILE_ASSERT_MATCHING_ENUM(WEBKIT_NAVIGATION_TYPE_OTHER, NavigationTypeOther); WebKitNavigationPolicyDecision* webkitNavigationPolicyDecisionCreate(WebKitNavigationType navigationType, unsigned mouseButton, unsigned modifiers, WebURLRequest* request, const char* frameName, WebFramePolicyListenerProxy* listener) { WebKitNavigationPolicyDecision* decision = WEBKIT_NAVIGATION_POLICY_DECISION(g_object_new(WEBKIT_TYPE_NAVIGATION_POLICY_DECISION, NULL)); decision->priv->navigationType = navigationType; decision->priv->mouseButton = mouseButton; decision->priv->modifiers = modifiers; decision->priv->request = adoptGRef(webkitURIRequestCreateForResourceRequest(request->resourceRequest())); decision->priv->frameName = frameName; webkitPolicyDecisionSetListener(WEBKIT_POLICY_DECISION(decision), listener); return decision; }