fc941f470412e9b5363b9d1d57a61fbc7209192e
[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 void 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
55 FrameView* 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     
65 void Widget::removeFromParent()
66 {
67     if (parent())
68         parent()->removeChild(*this);
69 }
70
71 IntRect 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
80 FloatRect 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
89 IntRect 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
98 IntPoint Widget::convertFromRootView(const IntPoint& rootPoint) const
99 {
100     if (const ScrollView* parentScrollView = parent()) {
101         IntPoint parentPoint = parentScrollView->convertFromRootView(rootPoint);
102         return convertFromContainingView(parentPoint);
103     }
104     return rootPoint;
105 }
106
107 IntPoint Widget::convertToRootView(const IntPoint& localPoint) const
108 {
109     if (const ScrollView* parentScrollView = parent()) {
110         IntPoint parentPoint = convertToContainingView(localPoint);
111         return parentScrollView->convertToRootView(parentPoint);
112     }
113     return localPoint;
114 }
115
116 IntRect Widget::convertFromContainingWindow(const IntRect& windowRect) const
117 {
118     if (const ScrollView* parentScrollView = parent()) {
119         IntRect parentRect = parentScrollView->convertFromContainingWindow(windowRect);
120         return convertFromContainingView(parentRect);
121     }
122     return convertFromContainingWindowToRoot(this, windowRect);
123 }
124
125 IntRect Widget::convertToContainingWindow(const IntRect& localRect) const
126 {
127     if (const ScrollView* parentScrollView = parent()) {
128         IntRect parentRect = convertToContainingView(localRect);
129         return parentScrollView->convertToContainingWindow(parentRect);
130     }
131     return convertFromRootToContainingWindow(this, localRect);
132 }
133
134 IntPoint Widget::convertFromContainingWindow(const IntPoint& windowPoint) const
135 {
136     if (const ScrollView* parentScrollView = parent()) {
137         IntPoint parentPoint = parentScrollView->convertFromContainingWindow(windowPoint);
138         return convertFromContainingView(parentPoint);
139     }
140     return convertFromContainingWindowToRoot(this, windowPoint);
141 }
142
143 IntPoint Widget::convertToContainingWindow(const IntPoint& localPoint) const
144 {
145     if (const ScrollView* parentScrollView = parent()) {
146         IntPoint parentPoint = convertToContainingView(localPoint);
147         return parentScrollView->convertToContainingWindow(parentPoint);
148     }
149     return convertFromRootToContainingWindow(this, localPoint);
150 }
151
152 #if !PLATFORM(COCOA)
153
154 Widget::Widget(PlatformWidget widget)
155 {
156     init(widget);
157 }
158
159 IntRect Widget::frameRect() const
160 {
161     return m_frame;
162 }
163
164 IntRect Widget::convertFromRootToContainingWindow(const Widget*, const IntRect& rect)
165 {
166     return rect;
167 }
168
169 IntRect Widget::convertFromContainingWindowToRoot(const Widget*, const IntRect& rect)
170 {
171     return rect;
172 }
173
174 IntPoint Widget::convertFromRootToContainingWindow(const Widget*, const IntPoint& point)
175 {
176     return point;
177 }
178
179 IntPoint Widget::convertFromContainingWindowToRoot(const Widget*, const IntPoint& point)
180 {
181     return point;
182 }
183
184 #endif // !PLATFORM(COCOA)
185
186 IntRect Widget::convertToContainingView(const IntRect& localRect) const
187 {
188     if (const ScrollView* parentScrollView = parent()) {
189         IntRect parentRect(localRect);
190         parentRect.setLocation(parentScrollView->convertChildToSelf(this, localRect.location()));
191         return parentRect;
192     }
193     return localRect;
194 }
195
196 IntRect Widget::convertFromContainingView(const IntRect& parentRect) const
197 {
198     if (const ScrollView* parentScrollView = parent()) {
199         IntRect localRect = parentRect;
200         localRect.setLocation(parentScrollView->convertSelfToChild(this, localRect.location()));
201         return localRect;
202     }
203
204     return parentRect;
205 }
206
207 FloatRect Widget::convertFromContainingView(const FloatRect& parentRect) const
208 {
209     return convertFromContainingView(IntRect(parentRect));
210 }
211
212 IntPoint Widget::convertToContainingView(const IntPoint& localPoint) const
213 {
214     if (const ScrollView* parentScrollView = parent())
215         return parentScrollView->convertChildToSelf(this, localPoint);
216
217     return localPoint;
218 }
219
220 IntPoint Widget::convertFromContainingView(const IntPoint& parentPoint) const
221 {
222     if (const ScrollView* parentScrollView = parent())
223         return parentScrollView->convertSelfToChild(this, parentPoint);
224
225     return parentPoint;
226 }
227
228 #if !PLATFORM(COCOA) && !PLATFORM(GTK) && !PLATFORM(WIN)
229
230 Widget::~Widget()
231 {
232     ASSERT(!parent());
233     notImplemented();
234 }
235
236 void Widget::setFrameRect(const IntRect& rect)
237 {
238     m_frame = rect;
239     notImplemented();
240 }
241
242 void Widget::paint(GraphicsContext&, const IntRect&, SecurityOriginPaintPolicy)
243 {
244     notImplemented();
245 }
246
247 void Widget::setFocus(bool)
248 {
249     notImplemented();
250 }
251
252 void Widget::setCursor(const Cursor&)
253 {
254     notImplemented();
255 }
256
257 void Widget::show()
258 {
259     notImplemented();
260 }
261
262 void Widget::hide()
263 {
264     notImplemented();
265 }
266
267 void Widget::setIsSelected(bool)
268 {
269     notImplemented();
270 }
271
272 #endif // !PLATFORM(COCOA) && !PLATFORM(GTK) && !PLATFORM(WIN)
273
274 } // namespace WebCore