blob: d025d1be8809b2cc09f0eaa5d0538a50259e4794 [file] [log] [blame]
/*
* Copyright (C) 2008 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "modules/accessibility/AXListBox.h"
#include "core/html/HTMLOptionElement.h"
#include "core/html/HTMLSelectElement.h"
#include "core/layout/LayoutListBox.h"
#include "modules/accessibility/AXListBoxOption.h"
#include "modules/accessibility/AXObjectCacheImpl.h"
namespace blink {
using namespace HTMLNames;
AXListBox::AXListBox(LayoutObject* layoutObject, AXObjectCacheImpl& axObjectCache)
: AXLayoutObject(layoutObject, axObjectCache)
, m_activeIndex(-1)
{
activeIndexChanged();
}
AXListBox::~AXListBox()
{
}
AXListBox* AXListBox::create(LayoutObject* layoutObject, AXObjectCacheImpl& axObjectCache)
{
return new AXListBox(layoutObject, axObjectCache);
}
AccessibilityRole AXListBox::determineAccessibilityRole()
{
if ((m_ariaRole = determineAriaRoleAttribute()) != UnknownRole)
return m_ariaRole;
return ListBoxRole;
}
AXObject* AXListBox::activeDescendant() const
{
if (!isHTMLSelectElement(node()))
return nullptr;
HTMLSelectElement* select = toHTMLSelectElement(node());
int activeIndex = select->activeSelectionEndListIndex();
if (activeIndex >= 0 && activeIndex < static_cast<int>(select->length())) {
HTMLOptionElement* option = select->item(m_activeIndex);
return axObjectCache().get(option);
}
return nullptr;
}
void AXListBox::activeIndexChanged()
{
if (!isHTMLSelectElement(node()))
return;
HTMLSelectElement* select = toHTMLSelectElement(node());
int activeIndex = select->activeSelectionEndListIndex();
if (activeIndex == m_activeIndex)
return;
m_activeIndex = activeIndex;
if (!select->focused())
return;
if (m_activeIndex >= 0 && m_activeIndex < static_cast<int>(select->length())) {
HTMLOptionElement* option = select->item(m_activeIndex);
axObjectCache().postNotification(option, AXObjectCacheImpl::AXFocusedUIElementChanged);
} else {
axObjectCache().postNotification(this, AXObjectCacheImpl::AXFocusedUIElementChanged);
}
}
} // namespace blink