6a1f47a1ac1de7a3ac1c7eda308f8bf47fdc98c8
[WebKit-https.git] / Tools / WebKitTestRunner / ios / PlatformWebViewIOS.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 #include "config.h"
27 #include "PlatformWebView.h"
28 #include "TestController.h"
29
30 #import <WebKit/WKImageCG.h>
31 #import <WebKit/WKPreferencesPrivate.h>
32 #import <WebKit/WKWebViewConfiguration.h>
33 #import <WebKit/WKWebViewPrivate.h>
34 #import <wtf/RetainPtr.h>
35
36 @interface WKWebView (Details)
37 - (WKPageRef)_pageForTesting;
38 @end
39
40 @interface WebKitTestRunnerWindow : UIWindow {
41     WTR::PlatformWebView* _platformWebView;
42     CGPoint _fakeOrigin;
43     BOOL _initialized;
44 }
45 @property (nonatomic, assign) WTR::PlatformWebView* platformWebView;
46 @end
47
48 @implementation WebKitTestRunnerWindow
49 @synthesize platformWebView = _platformWebView;
50
51 - (id)initWithFrame:(CGRect)frame
52 {
53     if ((self = [super initWithFrame:frame]))
54         _initialized = YES;
55
56     return self;
57 }
58 - (BOOL)isKeyWindow
59 {
60     return _platformWebView ? _platformWebView->windowIsKey() : YES;
61 }
62
63 - (void)setFrameOrigin:(CGPoint)point
64 {
65     _fakeOrigin = point;
66 }
67
68 - (void)setFrame:(CGRect)windowFrame
69 {
70     if (!_initialized) {
71         [super setFrame:windowFrame];
72         return;
73     }
74
75     CGRect currentFrame = [super frame];
76
77     _fakeOrigin = windowFrame.origin;
78
79     [super setFrame:CGRectMake(currentFrame.origin.x, currentFrame.origin.y, windowFrame.size.width, windowFrame.size.height)];
80 }
81
82 - (CGRect)frameRespectingFakeOrigin
83 {
84     CGRect currentFrame = [self frame];
85     return CGRectMake(_fakeOrigin.x, _fakeOrigin.y, currentFrame.size.width, currentFrame.size.height);
86 }
87
88 - (CGFloat)backingScaleFactor
89 {
90     return 1;
91 }
92
93 @end
94
95 @interface UIWindow ()
96
97 - (void)_setWindowResolution:(CGFloat)resolution displayIfChanged:(BOOL)displayIfChanged;
98
99 @end
100
101 namespace WTR {
102
103 PlatformWebView::PlatformWebView(WKWebViewConfiguration* configuration, const TestOptions& options)
104     : m_windowIsKey(true)
105     , m_options(options)
106 {
107     CGRect rect = CGRectMake(0, 0, TestController::viewWidth, TestController::viewHeight);
108     m_view = [[WKWebView alloc] initWithFrame:rect configuration:configuration];
109
110     CGRect windowRect = rect;
111     m_window = [[WebKitTestRunnerWindow alloc] initWithFrame:windowRect];
112     m_window.platformWebView = this;
113
114     [m_window addSubview:m_view];
115     [m_window makeKeyAndVisible];
116 }
117
118 void PlatformWebView::resizeTo(unsigned width, unsigned height)
119 {
120     WKRect frame = windowFrame();
121     frame.size.width = width;
122     frame.size.height = height;
123     setWindowFrame(frame);
124 }
125
126 PlatformWebView::~PlatformWebView()
127 {
128     m_window.platformWebView = 0;
129     [m_view release];
130     [m_window release];
131 }
132
133 WKPageRef PlatformWebView::page()
134 {
135     return [m_view _pageForTesting];
136 }
137
138 void PlatformWebView::focus()
139 {
140     makeWebViewFirstResponder();
141     setWindowIsKey(true);
142 }
143
144 WKRect PlatformWebView::windowFrame()
145 {
146     CGRect frame = [m_window frameRespectingFakeOrigin];
147
148     WKRect wkFrame;
149     wkFrame.origin.x = frame.origin.x;
150     wkFrame.origin.y = frame.origin.y;
151     wkFrame.size.width = frame.size.width;
152     wkFrame.size.height = frame.size.height;
153     return wkFrame;
154 }
155
156 void PlatformWebView::setWindowFrame(WKRect frame)
157 {
158     [m_window setFrame:CGRectMake(frame.origin.x, frame.origin.y, frame.size.width, frame.size.height)];
159     [platformView() setFrame:CGRectMake(0, 0, frame.size.width, frame.size.height)];
160 }
161
162 void PlatformWebView::didInitializeClients()
163 {
164     // Set a temporary 1x1 window frame to force a WindowAndViewFramesChanged notification. <rdar://problem/13380145>
165     WKRect wkFrame = windowFrame();
166     [m_window setFrame:CGRectMake(0, 0, 1, 1)];
167     setWindowFrame(wkFrame);
168 }
169
170 void PlatformWebView::addChromeInputField()
171 {
172     UITextField* textField = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 100, 20)];
173     textField.tag = 1;
174     [m_window addSubview:textField];
175     [textField release];
176 }
177
178 void PlatformWebView::removeChromeInputField()
179 {
180     UITextField* textField = (UITextField*)[m_window viewWithTag:1];
181     if (textField) {
182         [textField removeFromSuperview];
183         makeWebViewFirstResponder();
184         [textField release];
185     }
186 }
187
188 void PlatformWebView::makeWebViewFirstResponder()
189 {
190     // FIXME: iOS equivalent?
191     // [m_window makeFirstResponder:m_view];
192 }
193
194 void PlatformWebView::changeWindowScaleIfNeeded(float)
195 {
196     // Retina only surface.
197 }
198
199 WKRetainPtr<WKImageRef> PlatformWebView::windowSnapshotImage()
200 {
201     // FIXME: Need an implementation of this, or we're depending on software paints!
202     return nullptr;
203 }
204
205 bool PlatformWebView::viewSupportsOptions(const TestOptions& options) const
206 {
207     return true;
208 }
209
210 void PlatformWebView::setNavigationGesturesEnabled(bool enabled)
211 {
212 }
213
214 } // namespace WTR