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 /* vim: set ts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #include "XULSelectControlAccessible.h"
9 #include "nsAccessibilityService.h"
10 #include "DocAccessible.h"
12 #include "nsIDOMXULContainerElement.h"
13 #include "nsIDOMXULSelectCntrlItemEl.h"
14 #include "nsIDOMXULMultSelectCntrlEl.h"
15 #include "nsIDOMKeyEvent.h"
16 #include "nsIDOMElement.h"
17 #include "nsIDOMXULElement.h"
18 #include "nsIMutableArray.h"
19 #include "nsIServiceManager.h"
21 #include "mozilla/dom/Element.h"
23 using namespace mozilla;
24 using namespace mozilla::a11y;
26 ////////////////////////////////////////////////////////////////////////////////
27 // XULSelectControlAccessible
28 ////////////////////////////////////////////////////////////////////////////////
30 XULSelectControlAccessible::
31 XULSelectControlAccessible(nsIContent* aContent, DocAccessible* aDoc) :
32 AccessibleWrap(aContent, aDoc)
33 {
34 mGenericTypes |= eSelect;
35 mSelectControl = do_QueryInterface(aContent);
36 }
38 ////////////////////////////////////////////////////////////////////////////////
39 // XULSelectControlAccessible: Accessible
41 void
42 XULSelectControlAccessible::Shutdown()
43 {
44 mSelectControl = nullptr;
45 AccessibleWrap::Shutdown();
46 }
48 ////////////////////////////////////////////////////////////////////////////////
49 // XULSelectControlAccessible: SelectAccessible
51 already_AddRefed<nsIArray>
52 XULSelectControlAccessible::SelectedItems()
53 {
54 nsCOMPtr<nsIMutableArray> selectedItems =
55 do_CreateInstance(NS_ARRAY_CONTRACTID);
56 if (!selectedItems || !mDoc)
57 return nullptr;
59 // For XUL multi-select control
60 nsCOMPtr<nsIDOMXULMultiSelectControlElement> xulMultiSelect =
61 do_QueryInterface(mSelectControl);
62 if (xulMultiSelect) {
63 int32_t length = 0;
64 xulMultiSelect->GetSelectedCount(&length);
65 for (int32_t index = 0; index < length; index++) {
66 nsCOMPtr<nsIDOMXULSelectControlItemElement> itemElm;
67 xulMultiSelect->MultiGetSelectedItem(index, getter_AddRefs(itemElm));
68 nsCOMPtr<nsINode> itemNode(do_QueryInterface(itemElm));
69 Accessible* item = mDoc->GetAccessible(itemNode);
70 if (item)
71 selectedItems->AppendElement(static_cast<nsIAccessible*>(item),
72 false);
73 }
74 } else { // Single select?
75 nsCOMPtr<nsIDOMXULSelectControlItemElement> itemElm;
76 mSelectControl->GetSelectedItem(getter_AddRefs(itemElm));
77 nsCOMPtr<nsINode> itemNode(do_QueryInterface(itemElm));
78 if (itemNode) {
79 Accessible* item = mDoc->GetAccessible(itemNode);
80 if (item)
81 selectedItems->AppendElement(static_cast<nsIAccessible*>(item),
82 false);
83 }
84 }
86 return selectedItems.forget();
87 }
89 Accessible*
90 XULSelectControlAccessible::GetSelectedItem(uint32_t aIndex)
91 {
92 nsCOMPtr<nsIDOMXULMultiSelectControlElement> multiSelectControl =
93 do_QueryInterface(mSelectControl);
95 nsCOMPtr<nsIDOMXULSelectControlItemElement> itemElm;
96 if (multiSelectControl)
97 multiSelectControl->MultiGetSelectedItem(aIndex, getter_AddRefs(itemElm));
98 else if (aIndex == 0)
99 mSelectControl->GetSelectedItem(getter_AddRefs(itemElm));
101 nsCOMPtr<nsINode> itemNode(do_QueryInterface(itemElm));
102 return itemNode && mDoc ? mDoc->GetAccessible(itemNode) : nullptr;
103 }
105 uint32_t
106 XULSelectControlAccessible::SelectedItemCount()
107 {
108 // For XUL multi-select control
109 nsCOMPtr<nsIDOMXULMultiSelectControlElement> multiSelectControl =
110 do_QueryInterface(mSelectControl);
111 if (multiSelectControl) {
112 int32_t count = 0;
113 multiSelectControl->GetSelectedCount(&count);
114 return count;
115 }
117 // For XUL single-select control/menulist
118 int32_t index;
119 mSelectControl->GetSelectedIndex(&index);
120 return (index >= 0) ? 1 : 0;
121 }
123 bool
124 XULSelectControlAccessible::AddItemToSelection(uint32_t aIndex)
125 {
126 Accessible* item = GetChildAt(aIndex);
127 if (!item)
128 return false;
130 nsCOMPtr<nsIDOMXULSelectControlItemElement> itemElm =
131 do_QueryInterface(item->GetContent());
132 if (!itemElm)
133 return false;
135 bool isItemSelected = false;
136 itemElm->GetSelected(&isItemSelected);
137 if (isItemSelected)
138 return true;
140 nsCOMPtr<nsIDOMXULMultiSelectControlElement> multiSelectControl =
141 do_QueryInterface(mSelectControl);
143 if (multiSelectControl)
144 multiSelectControl->AddItemToSelection(itemElm);
145 else
146 mSelectControl->SetSelectedItem(itemElm);
148 return true;
149 }
151 bool
152 XULSelectControlAccessible::RemoveItemFromSelection(uint32_t aIndex)
153 {
154 Accessible* item = GetChildAt(aIndex);
155 if (!item)
156 return false;
158 nsCOMPtr<nsIDOMXULSelectControlItemElement> itemElm =
159 do_QueryInterface(item->GetContent());
160 if (!itemElm)
161 return false;
163 bool isItemSelected = false;
164 itemElm->GetSelected(&isItemSelected);
165 if (!isItemSelected)
166 return true;
168 nsCOMPtr<nsIDOMXULMultiSelectControlElement> multiSelectControl =
169 do_QueryInterface(mSelectControl);
171 if (multiSelectControl)
172 multiSelectControl->RemoveItemFromSelection(itemElm);
173 else
174 mSelectControl->SetSelectedItem(nullptr);
176 return true;
177 }
179 bool
180 XULSelectControlAccessible::IsItemSelected(uint32_t aIndex)
181 {
182 Accessible* item = GetChildAt(aIndex);
183 if (!item)
184 return false;
186 nsCOMPtr<nsIDOMXULSelectControlItemElement> itemElm =
187 do_QueryInterface(item->GetContent());
188 if (!itemElm)
189 return false;
191 bool isItemSelected = false;
192 itemElm->GetSelected(&isItemSelected);
193 return isItemSelected;
194 }
196 bool
197 XULSelectControlAccessible::UnselectAll()
198 {
199 nsCOMPtr<nsIDOMXULMultiSelectControlElement> multiSelectControl =
200 do_QueryInterface(mSelectControl);
201 multiSelectControl ?
202 multiSelectControl->ClearSelection() : mSelectControl->SetSelectedIndex(-1);
204 return true;
205 }
207 bool
208 XULSelectControlAccessible::SelectAll()
209 {
210 nsCOMPtr<nsIDOMXULMultiSelectControlElement> multiSelectControl =
211 do_QueryInterface(mSelectControl);
212 if (multiSelectControl) {
213 multiSelectControl->SelectAll();
214 return true;
215 }
217 // otherwise, don't support this method
218 return false;
219 }
221 ////////////////////////////////////////////////////////////////////////////////
222 // XULSelectControlAccessible: Widgets
224 Accessible*
225 XULSelectControlAccessible::CurrentItem()
226 {
227 if (!mSelectControl)
228 return nullptr;
230 nsCOMPtr<nsIDOMXULSelectControlItemElement> currentItemElm;
231 nsCOMPtr<nsIDOMXULMultiSelectControlElement> multiSelectControl =
232 do_QueryInterface(mSelectControl);
233 if (multiSelectControl)
234 multiSelectControl->GetCurrentItem(getter_AddRefs(currentItemElm));
235 else
236 mSelectControl->GetSelectedItem(getter_AddRefs(currentItemElm));
238 nsCOMPtr<nsINode> DOMNode;
239 if (currentItemElm)
240 DOMNode = do_QueryInterface(currentItemElm);
242 if (DOMNode) {
243 DocAccessible* document = Document();
244 if (document)
245 return document->GetAccessible(DOMNode);
246 }
248 return nullptr;
249 }
251 void
252 XULSelectControlAccessible::SetCurrentItem(Accessible* aItem)
253 {
254 if (!mSelectControl)
255 return;
257 nsCOMPtr<nsIDOMXULSelectControlItemElement> itemElm =
258 do_QueryInterface(aItem->GetContent());
259 nsCOMPtr<nsIDOMXULMultiSelectControlElement> multiSelectControl =
260 do_QueryInterface(mSelectControl);
261 if (multiSelectControl)
262 multiSelectControl->SetCurrentItem(itemElm);
263 else
264 mSelectControl->SetSelectedItem(itemElm);
265 }