1/* 2 * Copyright (C) 2012 Intel Corporation. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' 14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 23 * THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#include "config.h" 27#include "ewk_navigation_policy_decision.h" 28 29#include "ewk_navigation_policy_decision_private.h" 30#include "ewk_private.h" 31#include "ewk_url_request_private.h" 32 33using namespace WebKit; 34 35inline static Ewk_Navigation_Type toEwkNavigationType(WKFrameNavigationType navigationType) 36{ 37 switch (navigationType) { 38 case kWKFrameNavigationTypeLinkClicked: 39 return EWK_NAVIGATION_TYPE_LINK_ACTIVATED; 40 case kWKFrameNavigationTypeFormSubmitted: 41 return EWK_NAVIGATION_TYPE_FORM_SUBMITTED; 42 case kWKFrameNavigationTypeBackForward: 43 return EWK_NAVIGATION_TYPE_BACK_FORWARD; 44 case kWKFrameNavigationTypeReload: 45 return EWK_NAVIGATION_TYPE_RELOAD; 46 case kWKFrameNavigationTypeFormResubmitted: 47 return EWK_NAVIGATION_TYPE_FORM_RESUBMITTED; 48 case kWKFrameNavigationTypeOther: 49 return EWK_NAVIGATION_TYPE_OTHER; 50 } 51 ASSERT_NOT_REACHED(); 52 53 return EWK_NAVIGATION_TYPE_LINK_ACTIVATED; 54} 55 56inline static Event_Mouse_Button toEventMouseButton(WKEventMouseButton mouseButton) 57{ 58 switch (mouseButton) { 59 case kWKEventMouseButtonNoButton: 60 return EVENT_MOUSE_BUTTON_NONE; 61 case kWKEventMouseButtonLeftButton: 62 return EVENT_MOUSE_BUTTON_LEFT; 63 case kWKEventMouseButtonMiddleButton: 64 return EVENT_MOUSE_BUTTON_MIDDLE; 65 case kWKEventMouseButtonRightButton: 66 return EVENT_MOUSE_BUTTON_RIGHT; 67 } 68 ASSERT_NOT_REACHED(); 69 70 return EVENT_MOUSE_BUTTON_NONE; 71} 72 73inline static Event_Modifier_Keys toEventModifierKeys(WKEventModifiers modifiers) 74{ 75 unsigned keys = 0; 76 if (modifiers & kWKEventModifiersShiftKey) 77 keys |= EVENT_MODIFIER_KEY_SHIFT; 78 if (modifiers & kWKEventModifiersControlKey) 79 keys |= kWKEventModifiersControlKey; 80 if (modifiers & kWKEventModifiersAltKey) 81 keys |= EVENT_MODIFIER_KEY_ALT; 82 if (modifiers & kWKEventModifiersMetaKey) 83 keys |= EVENT_MODIFIER_KEY_META; 84 return static_cast<Event_Modifier_Keys>(keys); 85} 86 87EwkNavigationPolicyDecision::EwkNavigationPolicyDecision(WKFramePolicyListenerRef listener, WKFrameNavigationType navigationType, WKEventMouseButton mouseButton, WKEventModifiers modifiers, PassRefPtr<EwkUrlRequest> request, const char* frameName) 88 : m_listener(listener) 89 , m_actedUponByClient(false) 90 , m_navigationType(navigationType) 91 , m_mouseButton(mouseButton) 92 , m_modifiers(modifiers) 93 , m_request(request) 94 , m_frameName(frameName) 95{ } 96 97EwkNavigationPolicyDecision::~EwkNavigationPolicyDecision() 98{ 99 // This is the default choice for all policy decisions in WebPageProxy.cpp. 100 if (!m_actedUponByClient) 101 WKFramePolicyListenerUse(m_listener.get()); 102} 103 104Ewk_Navigation_Type EwkNavigationPolicyDecision::navigationType() const 105{ 106 return toEwkNavigationType(m_navigationType); 107} 108 109Event_Mouse_Button EwkNavigationPolicyDecision::mouseButton() const 110{ 111 return toEventMouseButton(m_mouseButton); 112} 113 114Event_Modifier_Keys EwkNavigationPolicyDecision::modifiers() const 115{ 116 return toEventModifierKeys(m_modifiers); 117} 118 119const char* EwkNavigationPolicyDecision::frameName() const 120{ 121 return m_frameName; 122} 123 124EwkUrlRequest* EwkNavigationPolicyDecision::request() const 125{ 126 return m_request.get(); 127} 128 129void EwkNavigationPolicyDecision::accept() 130{ 131 WKFramePolicyListenerUse(m_listener.get()); 132 m_actedUponByClient = true; 133} 134 135void EwkNavigationPolicyDecision::reject() 136{ 137 WKFramePolicyListenerIgnore(m_listener.get()); 138 m_actedUponByClient = true; 139} 140 141void EwkNavigationPolicyDecision::download() 142{ 143 WKFramePolicyListenerDownload(m_listener.get()); 144 m_actedUponByClient = true; 145} 146 147Ewk_Navigation_Type ewk_navigation_policy_navigation_type_get(const Ewk_Navigation_Policy_Decision* decision) 148{ 149 EWK_OBJ_GET_IMPL_OR_RETURN(const EwkNavigationPolicyDecision, decision, impl, EWK_NAVIGATION_TYPE_OTHER); 150 151 return impl->navigationType(); 152} 153 154Event_Mouse_Button ewk_navigation_policy_mouse_button_get(const Ewk_Navigation_Policy_Decision* decision) 155{ 156 EWK_OBJ_GET_IMPL_OR_RETURN(const EwkNavigationPolicyDecision, decision, impl, EVENT_MOUSE_BUTTON_NONE); 157 158 return impl->mouseButton(); 159} 160 161Event_Modifier_Keys ewk_navigation_policy_modifiers_get(const Ewk_Navigation_Policy_Decision* decision) 162{ 163 EWK_OBJ_GET_IMPL_OR_RETURN(const EwkNavigationPolicyDecision, decision, impl, static_cast<Event_Modifier_Keys>(0)); 164 165 return impl->modifiers(); 166} 167 168const char* ewk_navigation_policy_frame_name_get(const Ewk_Navigation_Policy_Decision* decision) 169{ 170 EWK_OBJ_GET_IMPL_OR_RETURN(const EwkNavigationPolicyDecision, decision, impl, nullptr); 171 172 return impl->frameName(); 173} 174 175Ewk_Url_Request* ewk_navigation_policy_request_get(const Ewk_Navigation_Policy_Decision* decision) 176{ 177 EWK_OBJ_GET_IMPL_OR_RETURN(const EwkNavigationPolicyDecision, decision, impl, nullptr); 178 179 return impl->request(); 180} 181 182void ewk_navigation_policy_decision_accept(Ewk_Navigation_Policy_Decision* decision) 183{ 184 EWK_OBJ_GET_IMPL_OR_RETURN(EwkNavigationPolicyDecision, decision, impl); 185 186 impl->accept(); 187} 188 189void ewk_navigation_policy_decision_reject(Ewk_Navigation_Policy_Decision* decision) 190{ 191 EWK_OBJ_GET_IMPL_OR_RETURN(EwkNavigationPolicyDecision, decision, impl); 192 193 impl->reject(); 194} 195 196void ewk_navigation_policy_decision_download(Ewk_Navigation_Policy_Decision* decision) 197{ 198 EWK_OBJ_GET_IMPL_OR_RETURN(EwkNavigationPolicyDecision, decision, impl); 199 200 impl->download(); 201} 202