2 * Copyright (C) 2011 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
18 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
21 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 #include "core/accessibility/AXScrollView.h"
29 #include "core/accessibility/AXObjectCacheImpl.h"
30 #include "core/accessibility/AXScrollbar.h"
31 #include "core/frame/FrameView.h"
32 #include "core/frame/LocalFrame.h"
33 #include "core/html/HTMLFrameOwnerElement.h"
37 AXScrollView::AXScrollView(FrameView* view)
39 , m_childrenDirty(false)
43 AXScrollView::~AXScrollView()
48 void AXScrollView::detach()
54 PassRefPtr<AXScrollView> AXScrollView::create(FrameView* view)
56 return adoptRef(new AXScrollView(view));
59 AXObject* AXScrollView::scrollBar(AccessibilityOrientation orientation)
63 switch (orientation) {
64 case AccessibilityOrientationVertical:
65 return m_verticalScrollbar ? m_verticalScrollbar.get() : 0;
66 case AccessibilityOrientationHorizontal:
67 return m_horizontalScrollbar ? m_horizontalScrollbar.get() : 0;
73 // If this is WebKit1 then the native scroll view needs to return the
74 // AX information (because there are no scroll bar children in the FrameView object in WK1).
75 // In WebKit2, the FrameView object will return the AX information (because there are no platform widgets).
76 bool AXScrollView::isAttachment() const
81 Widget* AXScrollView::widgetForAttachmentView() const
86 void AXScrollView::updateChildrenIfNecessary()
97 void AXScrollView::updateScrollbars()
102 if (m_scrollView->horizontalScrollbar() && !m_horizontalScrollbar) {
103 m_horizontalScrollbar = addChildScrollbar(m_scrollView->horizontalScrollbar());
104 } else if (!m_scrollView->horizontalScrollbar() && m_horizontalScrollbar) {
105 removeChildScrollbar(m_horizontalScrollbar.get());
106 m_horizontalScrollbar = nullptr;
109 if (m_scrollView->verticalScrollbar() && !m_verticalScrollbar) {
110 m_verticalScrollbar = addChildScrollbar(m_scrollView->verticalScrollbar());
111 } else if (!m_scrollView->verticalScrollbar() && m_verticalScrollbar) {
112 removeChildScrollbar(m_verticalScrollbar.get());
113 m_verticalScrollbar = nullptr;
117 void AXScrollView::removeChildScrollbar(AXObject* scrollbar)
119 size_t pos = m_children.find(scrollbar);
120 if (pos != kNotFound) {
121 m_children[pos]->detachFromParent();
122 m_children.remove(pos);
126 AXScrollbar* AXScrollView::addChildScrollbar(Scrollbar* scrollbar)
131 AXScrollbar* scrollBarObject = toAXScrollbar(axObjectCache()->getOrCreate(scrollbar));
132 scrollBarObject->setParent(this);
133 m_children.append(scrollBarObject);
134 return scrollBarObject;
137 void AXScrollView::clearChildren()
139 AXObject::clearChildren();
140 m_verticalScrollbar = nullptr;
141 m_horizontalScrollbar = nullptr;
144 bool AXScrollView::computeAccessibilityIsIgnored() const
146 // We just want to match whatever's returned by our web area, which is a child of this
147 // object. Normally cached attribute values may only search up the tree. We can't just
148 // call accessibilityIsIgnored on the web area, because the web area may search up its
149 // ancestors and call this function recursively, and we'd loop until a stack overflow.
151 // Instead, we first update the cached accessibilityIsIgnored value for this node to
152 // false, call accessibilityIsIgnored on the web area, then return the mathcing value.
153 m_cachedIsIgnored = false;
154 m_lastModificationCount = axObjectCache()->modificationCount();
156 AXObject* webArea = webAreaObject();
158 return webArea->accessibilityIsIgnored();
163 void AXScrollView::addChildren()
165 ASSERT(!m_haveChildren);
166 m_haveChildren = true;
168 AXObject* webArea = webAreaObject();
169 if (webArea && !webArea->accessibilityIsIgnored())
170 m_children.append(webArea);
175 AXObject* AXScrollView::webAreaObject() const
177 if (!m_scrollView || !m_scrollView->isFrameView())
180 Document* doc = m_scrollView->frame().document();
181 if (!doc || !doc->renderView())
184 return axObjectCache()->getOrCreate(doc);
187 AXObject* AXScrollView::accessibilityHitTest(const IntPoint& point) const
189 AXObject* webArea = webAreaObject();
193 if (m_horizontalScrollbar && m_horizontalScrollbar->elementRect().contains(point))
194 return m_horizontalScrollbar.get();
195 if (m_verticalScrollbar && m_verticalScrollbar->elementRect().contains(point))
196 return m_verticalScrollbar.get();
198 return webArea->accessibilityHitTest(point);
201 LayoutRect AXScrollView::elementRect() const
206 return m_scrollView->frameRect();
209 FrameView* AXScrollView::documentFrameView() const
211 if (!m_scrollView || !m_scrollView->isFrameView())
217 AXObject* AXScrollView::computeParent() const
219 if (!m_scrollView || !m_scrollView->isFrameView())
222 // FIXME: Broken for OOPI.
223 HTMLFrameOwnerElement* owner = m_scrollView->frame().deprecatedLocalOwner();
224 if (owner && owner->renderer())
225 return axObjectCache()->getOrCreate(owner);
227 return axObjectCache()->getOrCreate(m_scrollView->frame().pagePopupOwner());
230 AXObject* AXScrollView::computeParentIfExists() const
232 if (!m_scrollView || !m_scrollView->isFrameView())
235 HTMLFrameOwnerElement* owner = m_scrollView->frame().deprecatedLocalOwner();
236 if (owner && owner->renderer())
237 return axObjectCache()->get(owner);
239 return axObjectCache()->get(m_scrollView->frame().pagePopupOwner());
242 ScrollableArea* AXScrollView::getScrollableAreaIfScrollable() const
247 void AXScrollView::scrollTo(const IntPoint& point) const
250 m_scrollView->setScrollPosition(point);