summaryrefslogtreecommitdiff
path: root/Source/WebCore/accessibility/AccessibilityScrollView.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/accessibility/AccessibilityScrollView.cpp')
-rw-r--r--Source/WebCore/accessibility/AccessibilityScrollView.cpp108
1 files changed, 64 insertions, 44 deletions
diff --git a/Source/WebCore/accessibility/AccessibilityScrollView.cpp b/Source/WebCore/accessibility/AccessibilityScrollView.cpp
index f158506b3..ed5aa5844 100644
--- a/Source/WebCore/accessibility/AccessibilityScrollView.cpp
+++ b/Source/WebCore/accessibility/AccessibilityScrollView.cpp
@@ -51,12 +51,12 @@ AccessibilityScrollView::~AccessibilityScrollView()
void AccessibilityScrollView::detach(AccessibilityDetachmentType detachmentType, AXObjectCache* cache)
{
AccessibilityObject::detach(detachmentType, cache);
- m_scrollView = 0;
+ m_scrollView = nullptr;
}
-PassRefPtr<AccessibilityScrollView> AccessibilityScrollView::create(ScrollView* view)
+Ref<AccessibilityScrollView> AccessibilityScrollView::create(ScrollView* view)
{
- return adoptRef(new AccessibilityScrollView(view));
+ return adoptRef(*new AccessibilityScrollView(view));
}
AccessibilityObject* AccessibilityScrollView::scrollBar(AccessibilityOrientation orientation)
@@ -64,13 +64,15 @@ AccessibilityObject* AccessibilityScrollView::scrollBar(AccessibilityOrientation
updateScrollbars();
switch (orientation) {
+ // ARIA 1.1 Elements with the role scrollbar have an implicit aria-orientation value of vertical.
+ case AccessibilityOrientationUndefined:
case AccessibilityOrientationVertical:
- return m_verticalScrollbar ? m_verticalScrollbar.get() : 0;
+ return m_verticalScrollbar ? m_verticalScrollbar.get() : nullptr;
case AccessibilityOrientationHorizontal:
- return m_horizontalScrollbar ? m_horizontalScrollbar.get() : 0;
+ return m_horizontalScrollbar ? m_horizontalScrollbar.get() : nullptr;
}
- return 0;
+ return nullptr;
}
// If this is WebKit1 then the native scroll view needs to return the
@@ -106,13 +108,11 @@ void AccessibilityScrollView::setFocused(bool focused)
void AccessibilityScrollView::updateChildrenIfNecessary()
{
- if (m_childrenDirty)
- clearChildren();
-
- if (!m_haveChildren)
- addChildren();
-
- updateScrollbars();
+ // Always update our children when asked for them so that we don't inadvertently cache them after
+ // a new web area has been created for this scroll view (like when moving back and forth through history).
+ // Since a ScrollViews children will always be relatively small and limited this should not be a performance problem.
+ clearChildren();
+ addChildren();
}
void AccessibilityScrollView::updateScrollbars()
@@ -124,14 +124,14 @@ void AccessibilityScrollView::updateScrollbars()
m_horizontalScrollbar = addChildScrollbar(m_scrollView->horizontalScrollbar());
else if (!m_scrollView->horizontalScrollbar() && m_horizontalScrollbar) {
removeChildScrollbar(m_horizontalScrollbar.get());
- m_horizontalScrollbar = 0;
+ m_horizontalScrollbar = nullptr;
}
if (m_scrollView->verticalScrollbar() && !m_verticalScrollbar)
m_verticalScrollbar = addChildScrollbar(m_scrollView->verticalScrollbar());
else if (!m_scrollView->verticalScrollbar() && m_verticalScrollbar) {
removeChildScrollbar(m_verticalScrollbar.get());
- m_verticalScrollbar = 0;
+ m_verticalScrollbar = nullptr;
}
}
@@ -147,19 +147,23 @@ void AccessibilityScrollView::removeChildScrollbar(AccessibilityObject* scrollba
AccessibilityScrollbar* AccessibilityScrollView::addChildScrollbar(Scrollbar* scrollbar)
{
if (!scrollbar)
- return 0;
+ return nullptr;
- AccessibilityScrollbar* scrollBarObject = toAccessibilityScrollbar(axObjectCache()->getOrCreate(scrollbar));
- scrollBarObject->setParent(this);
- m_children.append(scrollBarObject);
- return scrollBarObject;
+ AXObjectCache* cache = axObjectCache();
+ if (!cache)
+ return nullptr;
+
+ auto& scrollBarObject = downcast<AccessibilityScrollbar>(*cache->getOrCreate(scrollbar));
+ scrollBarObject.setParent(this);
+ m_children.append(&scrollBarObject);
+ return &scrollBarObject;
}
void AccessibilityScrollView::clearChildren()
{
AccessibilityObject::clearChildren();
- m_verticalScrollbar = 0;
- m_horizontalScrollbar = 0;
+ m_verticalScrollbar = nullptr;
+ m_horizontalScrollbar = nullptr;
}
bool AccessibilityScrollView::computeAccessibilityIsIgnored() const
@@ -185,21 +189,24 @@ void AccessibilityScrollView::addChildren()
AccessibilityObject* AccessibilityScrollView::webAreaObject() const
{
- if (!m_scrollView || !m_scrollView->isFrameView())
- return 0;
+ if (!is<FrameView>(m_scrollView))
+ return nullptr;
- Document* doc = toFrameView(m_scrollView)->frame().document();
- if (!doc || !doc->hasLivingRenderTree())
- return 0;
+ Document* document = downcast<FrameView>(*m_scrollView).frame().document();
+ if (!document || !document->hasLivingRenderTree())
+ return nullptr;
- return axObjectCache()->getOrCreate(doc);
+ if (AXObjectCache* cache = axObjectCache())
+ return cache->getOrCreate(document);
+
+ return nullptr;
}
AccessibilityObject* AccessibilityScrollView::accessibilityHitTest(const IntPoint& point) const
{
AccessibilityObject* webArea = webAreaObject();
if (!webArea)
- return 0;
+ return nullptr;
if (m_horizontalScrollbar && m_horizontalScrollbar->elementRect().contains(point))
return m_horizontalScrollbar.get();
@@ -214,39 +221,52 @@ LayoutRect AccessibilityScrollView::elementRect() const
if (!m_scrollView)
return LayoutRect();
- return m_scrollView->frameRect();
+ LayoutRect rect = m_scrollView->frameRect();
+ float topContentInset = m_scrollView->topContentInset();
+ // Top content inset pushes the frame down and shrinks it.
+ rect.move(0, topContentInset);
+ rect.contract(0, topContentInset);
+ return rect;
}
FrameView* AccessibilityScrollView::documentFrameView() const
{
- if (!m_scrollView || !m_scrollView->isFrameView())
- return 0;
+ if (!is<FrameView>(m_scrollView))
+ return nullptr;
- return toFrameView(m_scrollView);
+ return downcast<FrameView>(m_scrollView);
}
AccessibilityObject* AccessibilityScrollView::parentObject() const
{
- if (!m_scrollView || !m_scrollView->isFrameView())
- return 0;
-
- HTMLFrameOwnerElement* owner = toFrameView(m_scrollView)->frame().ownerElement();
+ if (!is<FrameView>(m_scrollView))
+ return nullptr;
+
+ AXObjectCache* cache = axObjectCache();
+ if (!cache)
+ return nullptr;
+
+ HTMLFrameOwnerElement* owner = downcast<FrameView>(*m_scrollView).frame().ownerElement();
if (owner && owner->renderer())
- return axObjectCache()->getOrCreate(owner);
+ return cache->getOrCreate(owner);
- return 0;
+ return nullptr;
}
AccessibilityObject* AccessibilityScrollView::parentObjectIfExists() const
{
- if (!m_scrollView || !m_scrollView->isFrameView())
- return 0;
+ if (!is<FrameView>(m_scrollView))
+ return nullptr;
- HTMLFrameOwnerElement* owner = toFrameView(m_scrollView)->frame().ownerElement();
+ AXObjectCache* cache = axObjectCache();
+ if (!cache)
+ return nullptr;
+
+ HTMLFrameOwnerElement* owner = downcast<FrameView>(m_scrollView)->frame().ownerElement();
if (owner && owner->renderer())
- return axObjectCache()->get(owner);
+ return cache->get(owner);
- return 0;
+ return nullptr;
}
ScrollableArea* AccessibilityScrollView::getScrollableAreaIfScrollable() const