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 file,
5 * You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #include "xpcAccessibleSelectable.h"
9 #include "Accessible-inl.h"
11 using namespace mozilla::a11y;
13 NS_IMETHODIMP
14 xpcAccessibleSelectable::GetSelectedItems(nsIArray** aSelectedItems)
15 {
16 NS_ENSURE_ARG_POINTER(aSelectedItems);
17 *aSelectedItems = nullptr;
19 Accessible* acc = static_cast<Accessible*>(this);
20 if (acc->IsDefunct())
21 return NS_ERROR_FAILURE;
22 NS_PRECONDITION(acc->IsSelect(), "Called on non selectable widget!");
24 nsCOMPtr<nsIArray> items = acc->SelectedItems();
25 if (items) {
26 uint32_t length = 0;
27 items->GetLength(&length);
28 if (length)
29 items.swap(*aSelectedItems);
30 }
32 return NS_OK;
33 }
35 NS_IMETHODIMP
36 xpcAccessibleSelectable::GetSelectedItemCount(uint32_t* aSelectionCount)
37 {
38 NS_ENSURE_ARG_POINTER(aSelectionCount);
39 *aSelectionCount = 0;
41 Accessible* acc = static_cast<Accessible*>(this);
42 if (acc->IsDefunct())
43 return NS_ERROR_FAILURE;
44 NS_PRECONDITION(acc->IsSelect(), "Called on non selectable widget!");
46 *aSelectionCount = acc->SelectedItemCount();
47 return NS_OK;
48 }
50 NS_IMETHODIMP
51 xpcAccessibleSelectable::GetSelectedItemAt(uint32_t aIndex,
52 nsIAccessible** aSelected)
53 {
54 NS_ENSURE_ARG_POINTER(aSelected);
55 *aSelected = nullptr;
57 Accessible* acc = static_cast<Accessible*>(this);
58 if (acc->IsDefunct())
59 return NS_ERROR_FAILURE;
60 NS_PRECONDITION(acc->IsSelect(), "Called on non selectable widget!");
62 *aSelected = acc->GetSelectedItem(aIndex);
63 if (*aSelected) {
64 NS_ADDREF(*aSelected);
65 return NS_OK;
66 }
68 return NS_ERROR_INVALID_ARG;
69 }
71 NS_IMETHODIMP
72 xpcAccessibleSelectable::ScriptableIsItemSelected(uint32_t aIndex,
73 bool* aIsSelected)
74 {
75 NS_ENSURE_ARG_POINTER(aIsSelected);
76 *aIsSelected = false;
78 Accessible* acc = static_cast<Accessible*>(this);
79 if (acc->IsDefunct())
80 return NS_ERROR_FAILURE;
81 NS_PRECONDITION(acc->IsSelect(), "Called on non selectable widget!");
83 *aIsSelected = acc->IsItemSelected(aIndex);
84 return NS_OK;
85 }
87 NS_IMETHODIMP
88 xpcAccessibleSelectable::ScriptableAddItemToSelection(uint32_t aIndex)
89 {
90 Accessible* acc = static_cast<Accessible*>(this);
91 if (acc->IsDefunct())
92 return NS_ERROR_FAILURE;
93 NS_PRECONDITION(acc->IsSelect(), "Called on non selectable widget!");
95 return acc->AddItemToSelection(aIndex) ? NS_OK : NS_ERROR_INVALID_ARG;
96 }
98 NS_IMETHODIMP
99 xpcAccessibleSelectable::ScriptableRemoveItemFromSelection(uint32_t aIndex)
100 {
101 Accessible* acc = static_cast<Accessible*>(this);
102 if (acc->IsDefunct())
103 return NS_ERROR_FAILURE;
104 NS_PRECONDITION(acc->IsSelect(), "Called on non selectable widget!");
106 return acc->RemoveItemFromSelection(aIndex) ? NS_OK : NS_ERROR_INVALID_ARG;
107 }
109 NS_IMETHODIMP
110 xpcAccessibleSelectable::ScriptableSelectAll(bool* aIsMultiSelect)
111 {
112 NS_ENSURE_ARG_POINTER(aIsMultiSelect);
113 *aIsMultiSelect = false;
115 Accessible* acc = static_cast<Accessible*>(this);
116 if (acc->IsDefunct())
117 return NS_ERROR_FAILURE;
118 NS_PRECONDITION(acc->IsSelect(), "Called on non selectable widget!");
120 *aIsMultiSelect = acc->SelectAll();
121 return NS_OK;
122 }
124 NS_IMETHODIMP
125 xpcAccessibleSelectable::ScriptableUnselectAll()
126 {
127 Accessible* acc = static_cast<Accessible*>(this);
128 if (acc->IsDefunct())
129 return NS_ERROR_FAILURE;
130 NS_PRECONDITION(acc->IsSelect(), "Called on non selectable widget!");
132 acc->UnselectAll();
133 return NS_OK;
134 }