1/*
2 * Copyright (C) 2004-2018 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. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#include "config.h"
27#include "Widget.h"
28
29#include "FrameView.h"
30#include "IntRect.h"
31#include "NotImplemented.h"
32#include <wtf/Assertions.h>
33
34namespace WebCore {
35
36void Widget::init(PlatformWidget widget)
37{
38 m_selfVisible = false;
39 m_parentVisible = false;
40 m_widget = widget;
41 if (m_widget)
42 retainPlatformWidget();
43}
44
45void Widget::setParent(ScrollView* view)
46{
47 ASSERT(!view || !m_parent);
48 if (!view || !view->isVisible())
49 setParentVisible(false);
50 m_parent = makeWeakPtr(view);
51 if (view && view->isVisible())
52 setParentVisible(true);
53}
54
55FrameView* Widget::root() const
56{
57 const Widget* top = this;
58 while (top->parent())
59 top = top->parent();
60 if (is<FrameView>(*top))
61 return const_cast<FrameView*>(downcast<FrameView>(top));
62 return nullptr;
63}
64
65void Widget::removeFromParent()
66{
67 if (parent())
68 parent()->removeChild(*this);
69}
70
71IntRect Widget::convertFromRootView(const IntRect& rootRect) const
72{
73 if (const ScrollView* parentScrollView = parent()) {
74 IntRect parentRect = parentScrollView->convertFromRootView(rootRect);
75 return convertFromContainingView(parentRect);
76 }
77 return rootRect;
78}
79
80FloatRect Widget::convertFromRootView(const FloatRect& rootRect) const
81{
82 if (const ScrollView* parentScrollView = parent()) {
83 FloatRect parentRect = parentScrollView->convertFromRootView(rootRect);
84 return convertFromContainingView(parentRect);
85 }
86 return rootRect;
87}
88
89IntRect Widget::convertToRootView(const IntRect& localRect) const
90{
91 if (const ScrollView* parentScrollView = parent()) {
92 IntRect parentRect = convertToContainingView(localRect);
93 return parentScrollView->convertToRootView(parentRect);
94 }
95 return localRect;
96}
97
98FloatRect Widget::convertToRootView(const FloatRect& localRect) const
99{
100 if (const ScrollView* parentScrollView = parent()) {
101 FloatRect parentRect = convertToContainingView(localRect);
102 return parentScrollView->convertToRootView(parentRect);
103 }
104 return localRect;
105}
106
107IntPoint Widget::convertFromRootView(const IntPoint& rootPoint) const
108{
109 if (const ScrollView* parentScrollView = parent()) {
110 IntPoint parentPoint = parentScrollView->convertFromRootView(rootPoint);
111 return convertFromContainingView(parentPoint);
112 }
113 return rootPoint;
114}
115
116IntPoint Widget::convertToRootView(const IntPoint& localPoint) const
117{
118 if (const ScrollView* parentScrollView = parent()) {
119 IntPoint parentPoint = convertToContainingView(localPoint);
120 return parentScrollView->convertToRootView(parentPoint);
121 }
122 return localPoint;
123}
124
125
126FloatPoint Widget::convertFromRootView(const FloatPoint& rootPoint) const
127{
128 if (const ScrollView* parentScrollView = parent()) {
129 FloatPoint parentPoint = parentScrollView->convertFromRootView(rootPoint);
130 return convertFromContainingView(parentPoint);
131 }
132 return rootPoint;
133}
134
135FloatPoint Widget::convertToRootView(const FloatPoint& localPoint) const
136{
137 if (const ScrollView* parentScrollView = parent()) {
138 FloatPoint parentPoint = convertToContainingView(localPoint);
139 return parentScrollView->convertToRootView(parentPoint);
140 }
141 return localPoint;
142}
143
144IntRect Widget::convertFromContainingWindow(const IntRect& windowRect) const
145{
146 if (const ScrollView* parentScrollView = parent()) {
147 IntRect parentRect = parentScrollView->convertFromContainingWindow(windowRect);
148 return convertFromContainingView(parentRect);
149 }
150 return convertFromContainingWindowToRoot(this, windowRect);
151}
152
153IntRect Widget::convertToContainingWindow(const IntRect& localRect) const
154{
155 if (const ScrollView* parentScrollView = parent()) {
156 IntRect parentRect = convertToContainingView(localRect);
157 return parentScrollView->convertToContainingWindow(parentRect);
158 }
159 return convertFromRootToContainingWindow(this, localRect);
160}
161
162IntPoint Widget::convertFromContainingWindow(const IntPoint& windowPoint) const
163{
164 if (const ScrollView* parentScrollView = parent()) {
165 IntPoint parentPoint = parentScrollView->convertFromContainingWindow(windowPoint);
166 return convertFromContainingView(parentPoint);
167 }
168 return convertFromContainingWindowToRoot(this, windowPoint);
169}
170
171IntPoint Widget::convertToContainingWindow(const IntPoint& localPoint) const
172{
173 if (const ScrollView* parentScrollView = parent()) {
174 IntPoint parentPoint = convertToContainingView(localPoint);
175 return parentScrollView->convertToContainingWindow(parentPoint);
176 }
177 return convertFromRootToContainingWindow(this, localPoint);
178}
179
180#if !PLATFORM(COCOA)
181
182Widget::Widget(PlatformWidget widget)
183{
184 init(widget);
185}
186
187IntRect Widget::frameRect() const
188{
189 return m_frame;
190}
191
192IntRect Widget::convertFromRootToContainingWindow(const Widget*, const IntRect& rect)
193{
194 return rect;
195}
196
197IntRect Widget::convertFromContainingWindowToRoot(const Widget*, const IntRect& rect)
198{
199 return rect;
200}
201
202IntPoint Widget::convertFromRootToContainingWindow(const Widget*, const IntPoint& point)
203{
204 return point;
205}
206
207IntPoint Widget::convertFromContainingWindowToRoot(const Widget*, const IntPoint& point)
208{
209 return point;
210}
211
212#endif // !PLATFORM(COCOA)
213
214IntRect Widget::convertToContainingView(const IntRect& localRect) const
215{
216 if (const ScrollView* parentScrollView = parent()) {
217 IntRect parentRect(localRect);
218 parentRect.setLocation(parentScrollView->convertChildToSelf(this, localRect.location()));
219 return parentRect;
220 }
221 return localRect;
222}
223
224IntRect Widget::convertFromContainingView(const IntRect& parentRect) const
225{
226 if (const ScrollView* parentScrollView = parent()) {
227 IntRect localRect = parentRect;
228 localRect.setLocation(parentScrollView->convertSelfToChild(this, localRect.location()));
229 return localRect;
230 }
231
232 return parentRect;
233}
234
235FloatRect Widget::convertToContainingView(const FloatRect& localRect) const
236{
237 return convertToContainingView(IntRect(localRect));
238}
239
240FloatRect Widget::convertFromContainingView(const FloatRect& parentRect) const
241{
242 return convertFromContainingView(IntRect(parentRect));
243}
244
245IntPoint Widget::convertToContainingView(const IntPoint& localPoint) const
246{
247 if (const ScrollView* parentScrollView = parent())
248 return parentScrollView->convertChildToSelf(this, localPoint);
249
250 return localPoint;
251}
252
253IntPoint Widget::convertFromContainingView(const IntPoint& parentPoint) const
254{
255 if (const ScrollView* parentScrollView = parent())
256 return parentScrollView->convertSelfToChild(this, parentPoint);
257
258 return parentPoint;
259}
260
261FloatPoint Widget::convertToContainingView(const FloatPoint& localPoint) const
262{
263 return convertToContainingView(IntPoint(localPoint));
264}
265
266FloatPoint Widget::convertFromContainingView(const FloatPoint& parentPoint) const
267{
268 return convertFromContainingView(IntPoint(parentPoint));
269}
270
271#if !PLATFORM(COCOA) && !PLATFORM(GTK) && !PLATFORM(WIN)
272
273Widget::~Widget()
274{
275 ASSERT(!parent());
276 notImplemented();
277}
278
279void Widget::setFrameRect(const IntRect& rect)
280{
281 m_frame = rect;
282 notImplemented();
283}
284
285void Widget::paint(GraphicsContext&, const IntRect&, SecurityOriginPaintPolicy)
286{
287 notImplemented();
288}
289
290void Widget::setFocus(bool)
291{
292 notImplemented();
293}
294
295void Widget::setCursor(const Cursor&)
296{
297 notImplemented();
298}
299
300void Widget::show()
301{
302 notImplemented();
303}
304
305void Widget::hide()
306{
307 notImplemented();
308}
309
310void Widget::setIsSelected(bool)
311{
312 notImplemented();
313}
314
315#endif // !PLATFORM(COCOA) && !PLATFORM(GTK) && !PLATFORM(WIN)
316
317} // namespace WebCore
318