Tue, 06 Jan 2015 21:39:09 +0100
Conditionally force memory storage according to privacy.thirdparty.isolate;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #include "XULTabAccessible.h"
8 #include "nsAccUtils.h"
9 #include "Relation.h"
10 #include "Role.h"
11 #include "States.h"
13 // NOTE: alphabetically ordered
14 #include "nsIAccessibleRelation.h"
15 #include "nsIDocument.h"
16 #include "nsIDOMXULSelectCntrlEl.h"
17 #include "nsIDOMXULSelectCntrlItemEl.h"
18 #include "nsIDOMXULRelatedElement.h"
20 using namespace mozilla::a11y;
22 ////////////////////////////////////////////////////////////////////////////////
23 // XULTabAccessible
24 ////////////////////////////////////////////////////////////////////////////////
26 XULTabAccessible::
27 XULTabAccessible(nsIContent* aContent, DocAccessible* aDoc) :
28 AccessibleWrap(aContent, aDoc)
29 {
30 }
32 ////////////////////////////////////////////////////////////////////////////////
33 // XULTabAccessible: nsIAccessible
35 uint8_t
36 XULTabAccessible::ActionCount()
37 {
38 return 1;
39 }
41 /** Return the name of our only action */
42 NS_IMETHODIMP
43 XULTabAccessible::GetActionName(uint8_t aIndex, nsAString& aName)
44 {
45 if (aIndex == eAction_Switch) {
46 aName.AssignLiteral("switch");
47 return NS_OK;
48 }
49 return NS_ERROR_INVALID_ARG;
50 }
52 /** Tell the tab to do its action */
53 NS_IMETHODIMP
54 XULTabAccessible::DoAction(uint8_t index)
55 {
56 if (index == eAction_Switch) {
57 nsCOMPtr<nsIDOMXULElement> tab(do_QueryInterface(mContent));
58 if ( tab )
59 {
60 tab->Click();
61 return NS_OK;
62 }
63 return NS_ERROR_FAILURE;
64 }
65 return NS_ERROR_INVALID_ARG;
66 }
68 ////////////////////////////////////////////////////////////////////////////////
69 // XULTabAccessible: Accessible
71 role
72 XULTabAccessible::NativeRole()
73 {
74 return roles::PAGETAB;
75 }
77 uint64_t
78 XULTabAccessible::NativeState()
79 {
80 // Possible states: focused, focusable, unavailable(disabled), offscreen.
82 // get focus and disable status from base class
83 uint64_t state = AccessibleWrap::NativeState();
85 // Check whether the tab is selected and/or pinned
86 nsCOMPtr<nsIDOMXULSelectControlItemElement> tab(do_QueryInterface(mContent));
87 if (tab) {
88 bool selected = false;
89 if (NS_SUCCEEDED(tab->GetSelected(&selected)) && selected)
90 state |= states::SELECTED;
92 if (mContent->AttrValueIs(kNameSpaceID_None, nsGkAtoms::pinned,
93 nsGkAtoms::_true, eCaseMatters))
94 state |= states::PINNED;
96 }
98 return state;
99 }
101 uint64_t
102 XULTabAccessible::NativeInteractiveState() const
103 {
104 uint64_t state = Accessible::NativeInteractiveState();
105 return (state & states::UNAVAILABLE) ? state : state | states::SELECTABLE;
106 }
108 // nsIAccessible
109 Relation
110 XULTabAccessible::RelationByType(RelationType aType)
111 {
112 Relation rel = AccessibleWrap::RelationByType(aType);
113 if (aType != RelationType::LABEL_FOR)
114 return rel;
116 // Expose 'LABEL_FOR' relation on tab accessible for tabpanel accessible.
117 nsCOMPtr<nsIDOMXULRelatedElement> tabsElm =
118 do_QueryInterface(mContent->GetParent());
119 if (!tabsElm)
120 return rel;
122 nsCOMPtr<nsIDOMNode> domNode(DOMNode());
123 nsCOMPtr<nsIDOMNode> tabpanelNode;
124 tabsElm->GetRelatedElement(domNode, getter_AddRefs(tabpanelNode));
125 if (!tabpanelNode)
126 return rel;
128 nsCOMPtr<nsIContent> tabpanelContent(do_QueryInterface(tabpanelNode));
129 rel.AppendTarget(mDoc, tabpanelContent);
130 return rel;
131 }
134 ////////////////////////////////////////////////////////////////////////////////
135 // XULTabsAccessible
136 ////////////////////////////////////////////////////////////////////////////////
138 XULTabsAccessible::
139 XULTabsAccessible(nsIContent* aContent, DocAccessible* aDoc) :
140 XULSelectControlAccessible(aContent, aDoc)
141 {
142 }
144 role
145 XULTabsAccessible::NativeRole()
146 {
147 return roles::PAGETABLIST;
148 }
150 uint8_t
151 XULTabsAccessible::ActionCount()
152 {
153 return 0;
154 }
156 void
157 XULTabsAccessible::Value(nsString& aValue)
158 {
159 aValue.Truncate();
160 }
162 ENameValueFlag
163 XULTabsAccessible::NativeName(nsString& aName)
164 {
165 // no name
166 return eNameOK;
167 }
170 ////////////////////////////////////////////////////////////////////////////////
171 // XULTabpanelsAccessible
172 ////////////////////////////////////////////////////////////////////////////////
174 role
175 XULTabpanelsAccessible::NativeRole()
176 {
177 return roles::PANE;
178 }
180 ////////////////////////////////////////////////////////////////////////////////
181 // XULTabpanelAccessible
182 ////////////////////////////////////////////////////////////////////////////////
184 XULTabpanelAccessible::
185 XULTabpanelAccessible(nsIContent* aContent, DocAccessible* aDoc) :
186 AccessibleWrap(aContent, aDoc)
187 {
188 }
190 role
191 XULTabpanelAccessible::NativeRole()
192 {
193 return roles::PROPERTYPAGE;
194 }
196 Relation
197 XULTabpanelAccessible::RelationByType(RelationType aType)
198 {
199 Relation rel = AccessibleWrap::RelationByType(aType);
200 if (aType != RelationType::LABELLED_BY)
201 return rel;
203 // Expose 'LABELLED_BY' relation on tabpanel accessible for tab accessible.
204 nsCOMPtr<nsIDOMXULRelatedElement> tabpanelsElm =
205 do_QueryInterface(mContent->GetParent());
206 if (!tabpanelsElm)
207 return rel;
209 nsCOMPtr<nsIDOMNode> domNode(DOMNode());
210 nsCOMPtr<nsIDOMNode> tabNode;
211 tabpanelsElm->GetRelatedElement(domNode, getter_AddRefs(tabNode));
212 if (!tabNode)
213 return rel;
215 nsCOMPtr<nsIContent> tabContent(do_QueryInterface(tabNode));
216 rel.AppendTarget(mDoc, tabContent);
217 return rel;
218 }