WeakPtr breaks vtables when upcasting to base classes
[WebKit-https.git] / Source / WebCore / platform / Widget.cpp
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
34 namespace WebCore {
35
36 void 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
45 ScrollView* Widget::parent() const
46 {
47     return m_parent.get();
48 }
49
50 void Widget::setParent(ScrollView* view)
51 {
52     ASSERT(!view || !m_parent);
53     if (!view || !view->isVisible())
54         setParentVisible(false);
55     m_parent = makeWeakPtr(view);
56     if (view && view->isVisible())
57         setParentVisible(true);
58 }
59
60 FrameView* Widget::root() const
61 {
62     const Widget* top = this;
63     while (top->parent())
64         top = top->parent();
65     if (is<FrameView>(*top))
66         return const_cast<FrameView*>(downcast<FrameView>(top));
67     return nullptr;
68 }
69     
70 void Widget::removeFromParent()
71 {
72     if (parent())
73         parent()->removeChild(*this);
74 }
75
76 IntRect Widget::convertFromRootView(const IntRect& rootRect) const
77 {
78     if (const ScrollView* parentScrollView = parent()) {
79         IntRect parentRect = parentScrollView->convertFromRootView(rootRect);
80         return convertFromContainingView(parentRect);
81     }
82     return rootRect;
83 }
84
85 FloatRect Widget::convertFromRootView(const FloatRect& rootRect) const
86 {
87     if (const ScrollView* parentScrollView = parent()) {
88         FloatRect parentRect = parentScrollView->convertFromRootView(rootRect);
89         return convertFromContainingView(parentRect);
90     }
91     return rootRect;
92 }
93
94 IntRect Widget::convertToRootView(const IntRect& localRect) const
95 {
96     if (const ScrollView* parentScrollView = parent()) {
97         IntRect parentRect = convertToContainingView(localRect);
98         return parentScrollView->convertToRootView(parentRect);
99     }
100     return localRect;
101 }
102
103 FloatRect Widget::convertToRootView(const FloatRect& localRect) const
104 {
105     if (const ScrollView* parentScrollView = parent()) {
106         FloatRect parentRect = convertToContainingView(localRect);
107         return parentScrollView->convertToRootView(parentRect);
108     }
109     return localRect;
110 }
111
112 IntPoint Widget::convertFromRootView(const IntPoint& rootPoint) const
113 {
114     if (const ScrollView* parentScrollView = parent()) {
115         IntPoint parentPoint = parentScrollView->convertFromRootView(rootPoint);
116         return convertFromContainingView(parentPoint);
117     }
118     return rootPoint;
119 }
120
121 IntPoint Widget::convertToRootView(const IntPoint& localPoint) const
122 {
123     if (const ScrollView* parentScrollView = parent()) {
124         IntPoint parentPoint = convertToContainingView(localPoint);
125         return parentScrollView->convertToRootView(parentPoint);
126     }
127     return localPoint;
128 }
129
130
131 FloatPoint Widget::convertFromRootView(const FloatPoint& rootPoint) const
132 {
133     if (const ScrollView* parentScrollView = parent()) {
134         FloatPoint parentPoint = parentScrollView->convertFromRootView(rootPoint);
135         return convertFromContainingView(parentPoint);
136     }
137     return rootPoint;
138 }
139
140 FloatPoint Widget::convertToRootView(const FloatPoint& localPoint) const
141 {
142     if (const ScrollView* parentScrollView = parent()) {
143         FloatPoint parentPoint = convertToContainingView(localPoint);
144         return parentScrollView->convertToRootView(parentPoint);
145     }
146     return localPoint;
147 }
148
149 IntRect Widget::convertFromContainingWindow(const IntRect& windowRect) const
150 {
151     if (const ScrollView* parentScrollView = parent()) {
152         IntRect parentRect = parentScrollView->convertFromContainingWindow(windowRect);
153         return convertFromContainingView(parentRect);
154     }
155     return convertFromContainingWindowToRoot(this, windowRect);
156 }
157
158 IntRect Widget::convertToContainingWindow(const IntRect& localRect) const
159 {
160     if (const ScrollView* parentScrollView = parent()) {
161         IntRect parentRect = convertToContainingView(localRect);
162         return parentScrollView->convertToContainingWindow(parentRect);
163     }
164     return convertFromRootToContainingWindow(this, localRect);
165 }
166
167 IntPoint Widget::convertFromContainingWindow(const IntPoint& windowPoint) const
168 {
169     if (const ScrollView* parentScrollView = parent()) {
170         IntPoint parentPoint = parentScrollView->convertFromContainingWindow(windowPoint);
171         return convertFromContainingView(parentPoint);
172     }
173     return convertFromContainingWindowToRoot(this, windowPoint);
174 }
175
176 IntPoint Widget::convertToContainingWindow(const IntPoint& localPoint) const
177 {
178     if (const ScrollView* parentScrollView = parent()) {
179         IntPoint parentPoint = convertToContainingView(localPoint);
180         return parentScrollView->convertToContainingWindow(parentPoint);
181     }
182     return convertFromRootToContainingWindow(this, localPoint);
183 }
184
185 #if !PLATFORM(COCOA)
186
187 Widget::Widget(PlatformWidget widget)
188 {
189     init(widget);
190 }
191
192 IntRect Widget::frameRect() const
193 {
194     return m_frame;
195 }
196
197 IntRect Widget::convertFromRootToContainingWindow(const Widget*, const IntRect& rect)
198 {
199     return rect;
200 }
201
202 IntRect Widget::convertFromContainingWindowToRoot(const Widget*, const IntRect& rect)
203 {
204     return rect;
205 }
206
207 IntPoint Widget::convertFromRootToContainingWindow(const Widget*, const IntPoint& point)
208 {
209     return point;
210 }
211
212 IntPoint Widget::convertFromContainingWindowToRoot(const Widget*, const IntPoint& point)
213 {
214     return point;
215 }
216
217 #endif // !PLATFORM(COCOA)
218
219 IntRect Widget::convertToContainingView(const IntRect& localRect) const
220 {
221     if (const ScrollView* parentScrollView = parent()) {
222         IntRect parentRect(localRect);
223         parentRect.setLocation(parentScrollView->convertChildToSelf(this, localRect.location()));
224         return parentRect;
225     }
226     return localRect;
227 }
228
229 IntRect Widget::convertFromContainingView(const IntRect& parentRect) const
230 {
231     if (const ScrollView* parentScrollView = parent()) {
232         IntRect localRect = parentRect;
233         localRect.setLocation(parentScrollView->convertSelfToChild(this, localRect.location()));
234         return localRect;
235     }
236
237     return parentRect;
238 }
239
240 FloatRect Widget::convertToContainingView(const FloatRect& localRect) const
241 {
242     return convertToContainingView(IntRect(localRect));
243 }
244
245 FloatRect Widget::convertFromContainingView(const FloatRect& parentRect) const
246 {
247     return convertFromContainingView(IntRect(parentRect));
248 }
249
250 IntPoint Widget::convertToContainingView(const IntPoint& localPoint) const
251 {
252     if (const ScrollView* parentScrollView = parent())
253         return parentScrollView->convertChildToSelf(this, localPoint);
254
255     return localPoint;
256 }
257
258 IntPoint Widget::convertFromContainingView(const IntPoint& parentPoint) const
259 {
260     if (const ScrollView* parentScrollView = parent())
261         return parentScrollView->convertSelfToChild(this, parentPoint);
262
263     return parentPoint;
264 }
265
266 FloatPoint Widget::convertToContainingView(const FloatPoint& localPoint) const
267 {
268     return convertToContainingView(IntPoint(localPoint));
269 }
270
271 FloatPoint Widget::convertFromContainingView(const FloatPoint& parentPoint) const
272 {
273     return convertFromContainingView(IntPoint(parentPoint));
274 }
275
276 #if !PLATFORM(COCOA) && !PLATFORM(GTK) && !PLATFORM(WIN)
277
278 Widget::~Widget()
279 {
280     ASSERT(!parent());
281     notImplemented();
282 }
283
284 void Widget::setFrameRect(const IntRect& rect)
285 {
286     m_frame = rect;
287     notImplemented();
288 }
289
290 void Widget::paint(GraphicsContext&, const IntRect&, SecurityOriginPaintPolicy)
291 {
292     notImplemented();
293 }
294
295 void Widget::setFocus(bool)
296 {
297     notImplemented();
298 }
299
300 void Widget::setCursor(const Cursor&)
301 {
302     notImplemented();
303 }
304
305 void Widget::show()
306 {
307     notImplemented();
308 }
309
310 void Widget::hide()
311 {
312     notImplemented();
313 }
314
315 void Widget::setIsSelected(bool)
316 {
317     notImplemented();
318 }
319
320 #endif // !PLATFORM(COCOA) && !PLATFORM(GTK) && !PLATFORM(WIN)
321
322 } // namespace WebCore