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 
     22 #include "webkitwebpolicydecision.h"
     23 
     24 #include "FrameLoaderTypes.h"
     25 #include "webkitprivate.h"
     26 
     27 using namespace WebKit;
     28 using namespace WebCore;
     29 
     30 /**
     31  * SECTION:webkitwebpolicydecision
     32  * @short_description: Liason between WebKit and the application regarding asynchronous policy decisions
     33  *
     34  * #WebKitWebPolicyDecision objects are given to the application on
     35  * signal emissions that deal with policy decisions, such as if a new
     36  * window should be opened, or if a given navigation should be
     37  * allowed. The application uses it to tell the engine what to do.
     38  */
     39 
     40 G_DEFINE_TYPE(WebKitWebPolicyDecision, webkit_web_policy_decision, G_TYPE_OBJECT);
     41 
     42 struct _WebKitWebPolicyDecisionPrivate {
     43     WebKitWebFrame* frame;
     44     FramePolicyFunction framePolicyFunction;
     45     gboolean isCancelled;
     46 };
     47 
     48 #define WEBKIT_WEB_POLICY_DECISION_GET_PRIVATE(obj)    (G_TYPE_INSTANCE_GET_PRIVATE((obj), WEBKIT_TYPE_WEB_POLICY_DECISION, WebKitWebPolicyDecisionPrivate))
     49 
     50 static void webkit_web_policy_decision_class_init(WebKitWebPolicyDecisionClass* decisionClass)
     51 {
     52     g_type_class_add_private(decisionClass, sizeof(WebKitWebPolicyDecisionPrivate));
     53 }
     54 
     55 static void webkit_web_policy_decision_init(WebKitWebPolicyDecision* decision)
     56 {
     57     decision->priv = WEBKIT_WEB_POLICY_DECISION_GET_PRIVATE(decision);
     58 }
     59 
     60 WebKitWebPolicyDecision* webkit_web_policy_decision_new(WebKitWebFrame* frame, WebCore::FramePolicyFunction function)
     61 {
     62     g_return_val_if_fail(frame, NULL);
     63 
     64     WebKitWebPolicyDecision* decision = WEBKIT_WEB_POLICY_DECISION(g_object_new(WEBKIT_TYPE_WEB_POLICY_DECISION, NULL));
     65     WebKitWebPolicyDecisionPrivate* priv = decision->priv;
     66 
     67     priv->frame = frame;
     68     priv->framePolicyFunction = function;
     69     priv->isCancelled = FALSE;
     70 
     71     return decision;
     72 }
     73 
     74 /**
     75  * webkit_web_policy_decision_use
     76  * @decision: a #WebKitWebPolicyDecision
     77  *
     78  * Will send the USE decision to the policy implementer.
     79  *
     80  * Since: 1.0.3
     81  */
     82 void webkit_web_policy_decision_use(WebKitWebPolicyDecision* decision)
     83 {
     84     g_return_if_fail(WEBKIT_IS_WEB_POLICY_DECISION(decision));
     85 
     86     WebKitWebPolicyDecisionPrivate* priv = decision->priv;
     87 
     88     if (!priv->isCancelled)
     89         (core(priv->frame)->loader()->policyChecker()->*(priv->framePolicyFunction))(WebCore::PolicyUse);
     90 }
     91 
     92 /**
     93  * webkit_web_policy_decision_ignore
     94  * @decision: a #WebKitWebPolicyDecision
     95  *
     96  * Will send the IGNORE decision to the policy implementer.
     97  *
     98  * Since: 1.0.3
     99  */
    100 void webkit_web_policy_decision_ignore(WebKitWebPolicyDecision* decision)
    101 {
    102     g_return_if_fail(WEBKIT_IS_WEB_POLICY_DECISION(decision));
    103 
    104     WebKitWebPolicyDecisionPrivate* priv = decision->priv;
    105 
    106     if (!priv->isCancelled)
    107         (core(priv->frame)->loader()->policyChecker()->*(priv->framePolicyFunction))(WebCore::PolicyIgnore);
    108 }
    109 
    110 /**
    111  * webkit_web_policy_decision_download
    112  * @decision: a #WebKitWebPolicyDecision
    113  *
    114  * Will send the DOWNLOAD decision to the policy implementer.
    115  *
    116  * Since: 1.0.3
    117  */
    118 void webkit_web_policy_decision_download(WebKitWebPolicyDecision* decision)
    119 {
    120     g_return_if_fail(WEBKIT_IS_WEB_POLICY_DECISION(decision));
    121 
    122     WebKitWebPolicyDecisionPrivate* priv = decision->priv;
    123 
    124     if (!priv->isCancelled)
    125         (core(priv->frame)->loader()->policyChecker()->*(priv->framePolicyFunction))(WebCore::PolicyDownload);
    126 }
    127 
    128 void webkit_web_policy_decision_cancel(WebKitWebPolicyDecision* decision)
    129 {
    130     g_return_if_fail(WEBKIT_IS_WEB_POLICY_DECISION(decision));
    131 
    132     WebKitWebPolicyDecisionPrivate* priv = decision->priv;
    133 
    134     priv->isCancelled = TRUE;
    135 }
    136