diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebCore/accessibility/AccessibilityScrollView.cpp | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/WebCore/accessibility/AccessibilityScrollView.cpp')
-rw-r--r-- | Source/WebCore/accessibility/AccessibilityScrollView.cpp | 108 |
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 |