Add CSS -webkit-appearance property for Apple Pay buttons
[WebKit-https.git] / Source / WebCore / platform / Widget.cpp
1 /*
2  * Copyright (C) 2004, 2005, 2006, 2010 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 <wtf/Assertions.h>
32
33 namespace WebCore {
34
35 void Widget::init(PlatformWidget widget)
36 {
37     m_parent = 0;
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 = 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 IntRect Widget::convertToRootView(const IntRect& localRect) const
81 {
82     if (const ScrollView* parentScrollView = parent()) {
83         IntRect parentRect = convertToContainingView(localRect);
84         return parentScrollView->convertToRootView(parentRect);
85     }
86     return localRect;
87 }
88
89 IntPoint Widget::convertFromRootView(const IntPoint& rootPoint) const
90 {
91     if (const ScrollView* parentScrollView = parent()) {
92         IntPoint parentPoint = parentScrollView->convertFromRootView(rootPoint);
93         return convertFromContainingView(parentPoint);
94     }
95     return rootPoint;
96 }
97
98 IntPoint Widget::convertToRootView(const IntPoint& localPoint) const
99 {
100     if (const ScrollView* parentScrollView = parent()) {
101         IntPoint parentPoint = convertToContainingView(localPoint);
102         return parentScrollView->convertToRootView(parentPoint);
103     }
104     return localPoint;
105 }
106
107 IntRect Widget::convertFromContainingWindow(const IntRect& windowRect) const
108 {
109     if (const ScrollView* parentScrollView = parent()) {
110         IntRect parentRect = parentScrollView->convertFromContainingWindow(windowRect);
111         return convertFromContainingView(parentRect);
112     }
113     return convertFromContainingWindowToRoot(this, windowRect);
114 }
115
116 IntRect Widget::convertToContainingWindow(const IntRect& localRect) const
117 {
118     if (const ScrollView* parentScrollView = parent()) {
119         IntRect parentRect = convertToContainingView(localRect);
120         return parentScrollView->convertToContainingWindow(parentRect);
121     }
122     return convertFromRootToContainingWindow(this, localRect);
123 }
124
125 IntPoint Widget::convertFromContainingWindow(const IntPoint& windowPoint) const
126 {
127     if (const ScrollView* parentScrollView = parent()) {
128         IntPoint parentPoint = parentScrollView->convertFromContainingWindow(windowPoint);
129         return convertFromContainingView(parentPoint);
130     }
131     return convertFromContainingWindowToRoot(this, windowPoint);
132 }
133
134 IntPoint Widget::convertToContainingWindow(const IntPoint& localPoint) const
135 {
136     if (const ScrollView* parentScrollView = parent()) {
137         IntPoint parentPoint = convertToContainingView(localPoint);
138         return parentScrollView->convertToContainingWindow(parentPoint);
139     }
140     return convertFromRootToContainingWindow(this, localPoint);
141 }
142
143 #if !PLATFORM(COCOA)
144 IntRect Widget::convertFromRootToContainingWindow(const Widget*, const IntRect& rect)
145 {
146     return rect;
147 }
148
149 IntRect Widget::convertFromContainingWindowToRoot(const Widget*, const IntRect& rect)
150 {
151     return rect;
152 }
153
154 IntPoint Widget::convertFromRootToContainingWindow(const Widget*, const IntPoint& point)
155 {
156     return point;
157 }
158
159 IntPoint Widget::convertFromContainingWindowToRoot(const Widget*, const IntPoint& point)
160 {
161     return point;
162 }
163 #endif
164
165 IntRect Widget::convertToContainingView(const IntRect& localRect) const
166 {
167     if (const ScrollView* parentScrollView = parent()) {
168         IntRect parentRect(localRect);
169         parentRect.setLocation(parentScrollView->convertChildToSelf(this, localRect.location()));
170         return parentRect;
171     }
172     return localRect;
173 }
174
175 IntRect Widget::convertFromContainingView(const IntRect& parentRect) const
176 {
177     if (const ScrollView* parentScrollView = parent()) {
178         IntRect localRect = parentRect;
179         localRect.setLocation(parentScrollView->convertSelfToChild(this, localRect.location()));
180         return localRect;
181     }
182
183     return parentRect;
184 }
185
186 IntPoint Widget::convertToContainingView(const IntPoint& localPoint) const
187 {
188     if (const ScrollView* parentScrollView = parent())
189         return parentScrollView->convertChildToSelf(this, localPoint);
190
191     return localPoint;
192 }
193
194 IntPoint Widget::convertFromContainingView(const IntPoint& parentPoint) const
195 {
196     if (const ScrollView* parentScrollView = parent())
197         return parentScrollView->convertSelfToChild(this, parentPoint);
198
199     return parentPoint;
200 }
201
202 } // namespace WebCore