OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2010 Apple Inc. All Rights Reserved. | 2 * Copyright (C) 2010 Apple Inc. All Rights Reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 17 matching lines...) Expand all Loading... |
28 | 28 |
29 #include "core/html/HTMLSelectElement.h" | 29 #include "core/html/HTMLSelectElement.h" |
30 #include "modules/accessibility/AXMenuListOption.h" | 30 #include "modules/accessibility/AXMenuListOption.h" |
31 #include "modules/accessibility/AXObjectCacheImpl.h" | 31 #include "modules/accessibility/AXObjectCacheImpl.h" |
32 | 32 |
33 namespace blink { | 33 namespace blink { |
34 | 34 |
35 using namespace HTMLNames; | 35 using namespace HTMLNames; |
36 | 36 |
37 AXMenuListPopup::AXMenuListPopup(AXObjectCacheImpl* axObjectCache) | 37 AXMenuListPopup::AXMenuListPopup(AXObjectCacheImpl* axObjectCache) |
38 : AXMockObject(axObjectCache) | 38 : AXMockObject(axObjectCache), m_activeIndex(-1) |
39 { | 39 { |
40 } | 40 } |
41 | 41 |
42 bool AXMenuListPopup::isVisible() const | 42 bool AXMenuListPopup::isVisible() const |
43 { | 43 { |
44 return false; | 44 return false; |
45 } | 45 } |
46 | 46 |
47 bool AXMenuListPopup::isOffScreen() const | 47 bool AXMenuListPopup::isOffScreen() const |
48 { | 48 { |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
93 { | 93 { |
94 if (!m_parent) | 94 if (!m_parent) |
95 return; | 95 return; |
96 | 96 |
97 Node* selectNode = m_parent->node(); | 97 Node* selectNode = m_parent->node(); |
98 if (!selectNode) | 98 if (!selectNode) |
99 return; | 99 return; |
100 | 100 |
101 m_haveChildren = true; | 101 m_haveChildren = true; |
102 | 102 |
103 const WillBeHeapVector<RawPtrWillBeMember<HTMLElement>>& listItems = toHTMLS
electElement(selectNode)->listItems(); | 103 HTMLSelectElement* htmlSelectElement = toHTMLSelectElement(selectNode); |
| 104 m_activeIndex = htmlSelectElement->selectedIndex(); |
| 105 const WillBeHeapVector<RawPtrWillBeMember<HTMLElement>>& listItems = htmlSel
ectElement->listItems(); |
104 unsigned length = listItems.size(); | 106 unsigned length = listItems.size(); |
105 for (unsigned i = 0; i < length; i++) { | 107 for (unsigned i = 0; i < length; i++) { |
106 AXMenuListOption* option = menuListOptionAXObject(listItems[i]); | 108 AXMenuListOption* option = menuListOptionAXObject(listItems[i]); |
107 if (option) { | 109 if (option) { |
108 option->setParent(this); | 110 option->setParent(this); |
109 m_children.append(option); | 111 m_children.append(option); |
110 } | 112 } |
111 } | 113 } |
112 } | 114 } |
113 | 115 |
(...skipping 20 matching lines...) Expand all Loading... |
134 { | 136 { |
135 // We defer creation of the children until updating the active option so tha
t we don't | 137 // We defer creation of the children until updating the active option so tha
t we don't |
136 // create AXObjects for <option> elements while they're in the middle of rem
oval. | 138 // create AXObjects for <option> elements while they're in the middle of rem
oval. |
137 if (!m_haveChildren) | 139 if (!m_haveChildren) |
138 addChildren(); | 140 addChildren(); |
139 | 141 |
140 ASSERT_ARG(optionIndex, optionIndex >= 0); | 142 ASSERT_ARG(optionIndex, optionIndex >= 0); |
141 ASSERT_ARG(optionIndex, optionIndex < static_cast<int>(m_children.size())); | 143 ASSERT_ARG(optionIndex, optionIndex < static_cast<int>(m_children.size())); |
142 | 144 |
143 AXObjectCacheImpl* cache = axObjectCache(); | 145 AXObjectCacheImpl* cache = axObjectCache(); |
| 146 if (m_activeIndex >= 0 && m_activeIndex < static_cast<int>(m_children.size()
)) { |
| 147 RefPtr<AXObject> previousChild = m_children[m_activeIndex].get(); |
| 148 cache->postNotification(previousChild.get(), document(), AXObjectCacheIm
pl::AXMenuListItemUnselected, true); |
| 149 } |
| 150 |
144 RefPtr<AXObject> child = m_children[optionIndex].get(); | 151 RefPtr<AXObject> child = m_children[optionIndex].get(); |
145 | |
146 cache->postNotification(child.get(), document(), AXObjectCacheImpl::AXFocuse
dUIElementChanged, true); | 152 cache->postNotification(child.get(), document(), AXObjectCacheImpl::AXFocuse
dUIElementChanged, true); |
147 cache->postNotification(child.get(), document(), AXObjectCacheImpl::AXMenuLi
stItemSelected, true); | 153 cache->postNotification(child.get(), document(), AXObjectCacheImpl::AXMenuLi
stItemSelected, true); |
| 154 m_activeIndex = optionIndex; |
148 } | 155 } |
149 | 156 |
150 } // namespace blink | 157 } // namespace blink |
OLD | NEW |