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