Shrink various loading-related enums to shrink CachedResource
[WebKit-https.git] / Source / WebKit / UIProcess / API / Cocoa / WKNavigationAction.mm
1 /*
2  * Copyright (C) 2014 Apple Inc. 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 #import "config.h"
27 #import "WKNavigationActionInternal.h"
28
29 #if WK_API_ENABLED
30
31 #import "NavigationActionData.h"
32 #import "WKFrameInfoInternal.h"
33 #import "_WKUserInitiatedActionInternal.h"
34 #import <WebCore/FloatPoint.h>
35 #import <wtf/RetainPtr.h>
36
37 @implementation WKNavigationAction
38
39 static WKNavigationType toWKNavigationType(WebCore::NavigationType navigationType)
40 {
41     switch (navigationType) {
42     case WebCore::NavigationType::LinkClicked:
43         return WKNavigationTypeLinkActivated;
44     case WebCore::NavigationType::FormSubmitted:
45         return WKNavigationTypeFormSubmitted;
46     case WebCore::NavigationType::BackForward:
47         return WKNavigationTypeBackForward;
48     case WebCore::NavigationType::Reload:
49         return WKNavigationTypeReload;
50     case WebCore::NavigationType::FormResubmitted:
51         return WKNavigationTypeFormResubmitted;
52     case WebCore::NavigationType::Other:
53         return WKNavigationTypeOther;
54     }
55
56     ASSERT_NOT_REACHED();
57     return WKNavigationTypeOther;
58 }
59
60 #if PLATFORM(IOS)
61 static WKSyntheticClickType toWKSyntheticClickType(WebKit::WebMouseEvent::SyntheticClickType syntheticClickType)
62 {
63     switch (syntheticClickType) {
64     case WebKit::WebMouseEvent::NoTap:
65         return WKSyntheticClickTypeNoTap;
66     case WebKit::WebMouseEvent::OneFingerTap:
67         return WKSyntheticClickTypeOneFingerTap;
68     case WebKit::WebMouseEvent::TwoFingerTap:
69         return WKSyntheticClickTypeTwoFingerTap;
70     }
71     ASSERT_NOT_REACHED();
72     return WKSyntheticClickTypeNoTap;
73 }
74 #endif
75
76 #if PLATFORM(MAC)
77
78 // FIXME: This really belongs in WebEventFactory.
79 static NSEventModifierFlags toNSEventModifierFlags(WebKit::WebEvent::Modifiers modifiers)
80 {
81     NSEventModifierFlags modifierFlags = 0;
82
83     if (modifiers & WebKit::WebEvent::CapsLockKey)
84         modifierFlags |= NSEventModifierFlagCapsLock;
85     if (modifiers & WebKit::WebEvent::ShiftKey)
86         modifierFlags |= NSEventModifierFlagShift;
87     if (modifiers & WebKit::WebEvent::ControlKey)
88         modifierFlags |= NSEventModifierFlagControl;
89     if (modifiers & WebKit::WebEvent::AltKey)
90         modifierFlags |= NSEventModifierFlagOption;
91     if (modifiers & WebKit::WebEvent::MetaKey)
92         modifierFlags |= NSEventModifierFlagCommand;
93
94     return modifierFlags;
95 }
96
97 static NSInteger toNSButtonNumber(WebKit::WebMouseEvent::Button mouseButton)
98 {
99     switch (mouseButton) {
100     case WebKit::WebMouseEvent::NoButton:
101         return 0;
102
103     case WebKit::WebMouseEvent::LeftButton:
104         return 1 << 0;
105
106     case WebKit::WebMouseEvent::RightButton:
107         return 1 << 1;
108
109     case WebKit::WebMouseEvent::MiddleButton:
110         return 1 << 2;
111
112     default:
113         return 0;
114     }
115 }
116 #endif
117
118 - (void)dealloc
119 {
120     _navigationAction->~NavigationAction();
121
122     [super dealloc];
123 }
124
125 - (NSString *)description
126 {
127     return [NSString stringWithFormat:@"<%@: %p; navigationType = %ld; syntheticClickType = %ld; position x = %.2f y = %.2f request = %@; sourceFrame = %@; targetFrame = %@>", NSStringFromClass(self.class), self,
128         (long)self.navigationType,
129 #if PLATFORM(IOS)
130         (long)self._syntheticClickType, self._clickLocationInRootViewCoordinates.x, self._clickLocationInRootViewCoordinates.y,
131 #else
132         0L, 0.0, 0.0,
133 #endif
134         self.request, self.sourceFrame, self.targetFrame];
135 }
136
137 - (WKFrameInfo *)sourceFrame
138 {
139     if (API::FrameInfo* frameInfo = _navigationAction->sourceFrame())
140         return wrapper(*frameInfo);
141     return nil;
142 }
143
144 - (WKFrameInfo *)targetFrame
145 {
146     if (API::FrameInfo* frameInfo = _navigationAction->targetFrame())
147         return wrapper(*frameInfo);
148     return nil;
149 }
150
151 - (WKNavigationType)navigationType
152 {
153     return toWKNavigationType(_navigationAction->navigationType());
154 }
155
156 - (NSURLRequest *)request
157 {
158     return _navigationAction->request().nsURLRequest(WebCore::HTTPBodyUpdatePolicy::DoNotUpdateHTTPBody);
159 }
160
161 #if PLATFORM(IOS)
162 - (WKSyntheticClickType)_syntheticClickType
163 {
164     return toWKSyntheticClickType(_navigationAction->syntheticClickType());
165 }
166
167 - (CGPoint)_clickLocationInRootViewCoordinates
168 {
169     return _navigationAction->clickLocationInRootViewCoordinates();
170 }
171 #endif
172
173 #if PLATFORM(MAC)
174 - (NSEventModifierFlags)modifierFlags
175 {
176     return toNSEventModifierFlags(_navigationAction->modifiers());
177 }
178
179 - (NSInteger)buttonNumber
180 {
181     return toNSButtonNumber(_navigationAction->mouseButton());
182 }
183 #endif
184
185 #pragma mark WKObject protocol implementation
186
187 - (API::Object&)_apiObject
188 {
189     return *_navigationAction;
190 }
191
192 @end
193
194 @implementation WKNavigationAction (WKPrivate)
195
196 - (NSURL *)_originalURL
197 {
198     return _navigationAction->originalURL();
199 }
200
201 - (BOOL)_isUserInitiated
202 {
203     return _navigationAction->isProcessingUserGesture();
204 }
205
206 - (BOOL)_canHandleRequest
207 {
208     return _navigationAction->canHandleRequest();
209 }
210
211 - (BOOL)_shouldOpenExternalSchemes
212 {
213     return _navigationAction->shouldOpenExternalSchemes();
214 }
215
216 - (BOOL)_shouldOpenAppLinks
217 {
218     return _navigationAction->shouldOpenAppLinks();
219 }
220
221 - (BOOL)_shouldOpenExternalURLs
222 {
223     return [self _shouldOpenExternalSchemes];
224 }
225
226 - (_WKUserInitiatedAction *)_userInitiatedAction
227 {
228     auto userInitiatedAction = _navigationAction->userInitiatedAction();
229     if (userInitiatedAction)
230         return wrapper(*userInitiatedAction);
231     return nil;
232 }
233
234 - (BOOL)_isRedirect
235 {
236     return _navigationAction->isRedirect();
237 }
238
239 @end
240
241 #endif