1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/accessible/src/xul/XULTabAccessible.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,218 @@ 1.4 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 + 1.9 +#include "XULTabAccessible.h" 1.10 + 1.11 +#include "nsAccUtils.h" 1.12 +#include "Relation.h" 1.13 +#include "Role.h" 1.14 +#include "States.h" 1.15 + 1.16 +// NOTE: alphabetically ordered 1.17 +#include "nsIAccessibleRelation.h" 1.18 +#include "nsIDocument.h" 1.19 +#include "nsIDOMXULSelectCntrlEl.h" 1.20 +#include "nsIDOMXULSelectCntrlItemEl.h" 1.21 +#include "nsIDOMXULRelatedElement.h" 1.22 + 1.23 +using namespace mozilla::a11y; 1.24 + 1.25 +//////////////////////////////////////////////////////////////////////////////// 1.26 +// XULTabAccessible 1.27 +//////////////////////////////////////////////////////////////////////////////// 1.28 + 1.29 +XULTabAccessible:: 1.30 + XULTabAccessible(nsIContent* aContent, DocAccessible* aDoc) : 1.31 + AccessibleWrap(aContent, aDoc) 1.32 +{ 1.33 +} 1.34 + 1.35 +//////////////////////////////////////////////////////////////////////////////// 1.36 +// XULTabAccessible: nsIAccessible 1.37 + 1.38 +uint8_t 1.39 +XULTabAccessible::ActionCount() 1.40 +{ 1.41 + return 1; 1.42 +} 1.43 + 1.44 +/** Return the name of our only action */ 1.45 +NS_IMETHODIMP 1.46 +XULTabAccessible::GetActionName(uint8_t aIndex, nsAString& aName) 1.47 +{ 1.48 + if (aIndex == eAction_Switch) { 1.49 + aName.AssignLiteral("switch"); 1.50 + return NS_OK; 1.51 + } 1.52 + return NS_ERROR_INVALID_ARG; 1.53 +} 1.54 + 1.55 +/** Tell the tab to do its action */ 1.56 +NS_IMETHODIMP 1.57 +XULTabAccessible::DoAction(uint8_t index) 1.58 +{ 1.59 + if (index == eAction_Switch) { 1.60 + nsCOMPtr<nsIDOMXULElement> tab(do_QueryInterface(mContent)); 1.61 + if ( tab ) 1.62 + { 1.63 + tab->Click(); 1.64 + return NS_OK; 1.65 + } 1.66 + return NS_ERROR_FAILURE; 1.67 + } 1.68 + return NS_ERROR_INVALID_ARG; 1.69 +} 1.70 + 1.71 +//////////////////////////////////////////////////////////////////////////////// 1.72 +// XULTabAccessible: Accessible 1.73 + 1.74 +role 1.75 +XULTabAccessible::NativeRole() 1.76 +{ 1.77 + return roles::PAGETAB; 1.78 +} 1.79 + 1.80 +uint64_t 1.81 +XULTabAccessible::NativeState() 1.82 +{ 1.83 + // Possible states: focused, focusable, unavailable(disabled), offscreen. 1.84 + 1.85 + // get focus and disable status from base class 1.86 + uint64_t state = AccessibleWrap::NativeState(); 1.87 + 1.88 + // Check whether the tab is selected and/or pinned 1.89 + nsCOMPtr<nsIDOMXULSelectControlItemElement> tab(do_QueryInterface(mContent)); 1.90 + if (tab) { 1.91 + bool selected = false; 1.92 + if (NS_SUCCEEDED(tab->GetSelected(&selected)) && selected) 1.93 + state |= states::SELECTED; 1.94 + 1.95 + if (mContent->AttrValueIs(kNameSpaceID_None, nsGkAtoms::pinned, 1.96 + nsGkAtoms::_true, eCaseMatters)) 1.97 + state |= states::PINNED; 1.98 + 1.99 + } 1.100 + 1.101 + return state; 1.102 +} 1.103 + 1.104 +uint64_t 1.105 +XULTabAccessible::NativeInteractiveState() const 1.106 +{ 1.107 + uint64_t state = Accessible::NativeInteractiveState(); 1.108 + return (state & states::UNAVAILABLE) ? state : state | states::SELECTABLE; 1.109 +} 1.110 + 1.111 +// nsIAccessible 1.112 +Relation 1.113 +XULTabAccessible::RelationByType(RelationType aType) 1.114 +{ 1.115 + Relation rel = AccessibleWrap::RelationByType(aType); 1.116 + if (aType != RelationType::LABEL_FOR) 1.117 + return rel; 1.118 + 1.119 + // Expose 'LABEL_FOR' relation on tab accessible for tabpanel accessible. 1.120 + nsCOMPtr<nsIDOMXULRelatedElement> tabsElm = 1.121 + do_QueryInterface(mContent->GetParent()); 1.122 + if (!tabsElm) 1.123 + return rel; 1.124 + 1.125 + nsCOMPtr<nsIDOMNode> domNode(DOMNode()); 1.126 + nsCOMPtr<nsIDOMNode> tabpanelNode; 1.127 + tabsElm->GetRelatedElement(domNode, getter_AddRefs(tabpanelNode)); 1.128 + if (!tabpanelNode) 1.129 + return rel; 1.130 + 1.131 + nsCOMPtr<nsIContent> tabpanelContent(do_QueryInterface(tabpanelNode)); 1.132 + rel.AppendTarget(mDoc, tabpanelContent); 1.133 + return rel; 1.134 +} 1.135 + 1.136 + 1.137 +//////////////////////////////////////////////////////////////////////////////// 1.138 +// XULTabsAccessible 1.139 +//////////////////////////////////////////////////////////////////////////////// 1.140 + 1.141 +XULTabsAccessible:: 1.142 + XULTabsAccessible(nsIContent* aContent, DocAccessible* aDoc) : 1.143 + XULSelectControlAccessible(aContent, aDoc) 1.144 +{ 1.145 +} 1.146 + 1.147 +role 1.148 +XULTabsAccessible::NativeRole() 1.149 +{ 1.150 + return roles::PAGETABLIST; 1.151 +} 1.152 + 1.153 +uint8_t 1.154 +XULTabsAccessible::ActionCount() 1.155 +{ 1.156 + return 0; 1.157 +} 1.158 + 1.159 +void 1.160 +XULTabsAccessible::Value(nsString& aValue) 1.161 +{ 1.162 + aValue.Truncate(); 1.163 +} 1.164 + 1.165 +ENameValueFlag 1.166 +XULTabsAccessible::NativeName(nsString& aName) 1.167 +{ 1.168 + // no name 1.169 + return eNameOK; 1.170 +} 1.171 + 1.172 + 1.173 +//////////////////////////////////////////////////////////////////////////////// 1.174 +// XULTabpanelsAccessible 1.175 +//////////////////////////////////////////////////////////////////////////////// 1.176 + 1.177 +role 1.178 +XULTabpanelsAccessible::NativeRole() 1.179 +{ 1.180 + return roles::PANE; 1.181 +} 1.182 + 1.183 +//////////////////////////////////////////////////////////////////////////////// 1.184 +// XULTabpanelAccessible 1.185 +//////////////////////////////////////////////////////////////////////////////// 1.186 + 1.187 +XULTabpanelAccessible:: 1.188 + XULTabpanelAccessible(nsIContent* aContent, DocAccessible* aDoc) : 1.189 + AccessibleWrap(aContent, aDoc) 1.190 +{ 1.191 +} 1.192 + 1.193 +role 1.194 +XULTabpanelAccessible::NativeRole() 1.195 +{ 1.196 + return roles::PROPERTYPAGE; 1.197 +} 1.198 + 1.199 +Relation 1.200 +XULTabpanelAccessible::RelationByType(RelationType aType) 1.201 +{ 1.202 + Relation rel = AccessibleWrap::RelationByType(aType); 1.203 + if (aType != RelationType::LABELLED_BY) 1.204 + return rel; 1.205 + 1.206 + // Expose 'LABELLED_BY' relation on tabpanel accessible for tab accessible. 1.207 + nsCOMPtr<nsIDOMXULRelatedElement> tabpanelsElm = 1.208 + do_QueryInterface(mContent->GetParent()); 1.209 + if (!tabpanelsElm) 1.210 + return rel; 1.211 + 1.212 + nsCOMPtr<nsIDOMNode> domNode(DOMNode()); 1.213 + nsCOMPtr<nsIDOMNode> tabNode; 1.214 + tabpanelsElm->GetRelatedElement(domNode, getter_AddRefs(tabNode)); 1.215 + if (!tabNode) 1.216 + return rel; 1.217 + 1.218 + nsCOMPtr<nsIContent> tabContent(do_QueryInterface(tabNode)); 1.219 + rel.AppendTarget(mDoc, tabContent); 1.220 + return rel; 1.221 +}