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