content/xul/document/src/nsXULControllers.cpp

Tue, 06 Jan 2015 21:39:09 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Tue, 06 Jan 2015 21:39:09 +0100
branch
TOR_BUG_9701
changeset 8
97036ab72558
permissions
-rw-r--r--

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.

michael@0 1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
michael@0 2 /* This Source Code Form is subject to the terms of the Mozilla Public
michael@0 3 * License, v. 2.0. If a copy of the MPL was not distributed with this
michael@0 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
michael@0 5
michael@0 6 /*
michael@0 7
michael@0 8 This file provides the implementation for the XUL "controllers"
michael@0 9 object.
michael@0 10
michael@0 11 */
michael@0 12
michael@0 13 #include "nsString.h"
michael@0 14
michael@0 15 #include "nsIControllers.h"
michael@0 16 #include "nsIDOMElement.h"
michael@0 17 #include "nsXULControllers.h"
michael@0 18 #include "nsDOMClassInfoID.h"
michael@0 19 #include "nsIController.h"
michael@0 20
michael@0 21 //----------------------------------------------------------------------
michael@0 22
michael@0 23 nsXULControllers::nsXULControllers()
michael@0 24 : mCurControllerID(0)
michael@0 25 {
michael@0 26 }
michael@0 27
michael@0 28 nsXULControllers::~nsXULControllers(void)
michael@0 29 {
michael@0 30 DeleteControllers();
michael@0 31 }
michael@0 32
michael@0 33 void
michael@0 34 nsXULControllers::DeleteControllers()
michael@0 35 {
michael@0 36 uint32_t count = mControllers.Length();
michael@0 37 for (uint32_t i = 0; i < count; i++)
michael@0 38 {
michael@0 39 nsXULControllerData* controllerData = mControllers.ElementAt(i);
michael@0 40 delete controllerData; // releases the nsIController
michael@0 41 }
michael@0 42
michael@0 43 mControllers.Clear();
michael@0 44 }
michael@0 45
michael@0 46
michael@0 47 nsresult
michael@0 48 NS_NewXULControllers(nsISupports* aOuter, REFNSIID aIID, void** aResult)
michael@0 49 {
michael@0 50 NS_PRECONDITION(aOuter == nullptr, "no aggregation");
michael@0 51 if (aOuter)
michael@0 52 return NS_ERROR_NO_AGGREGATION;
michael@0 53
michael@0 54 nsXULControllers* controllers = new nsXULControllers();
michael@0 55 if (! controllers)
michael@0 56 return NS_ERROR_OUT_OF_MEMORY;
michael@0 57
michael@0 58 nsresult rv;
michael@0 59 NS_ADDREF(controllers);
michael@0 60 rv = controllers->QueryInterface(aIID, aResult);
michael@0 61 NS_RELEASE(controllers);
michael@0 62 return rv;
michael@0 63 }
michael@0 64
michael@0 65 NS_IMPL_CYCLE_COLLECTION_CLASS(nsXULControllers)
michael@0 66
michael@0 67 NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsXULControllers)
michael@0 68 tmp->DeleteControllers();
michael@0 69 NS_IMPL_CYCLE_COLLECTION_UNLINK_END
michael@0 70 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsXULControllers)
michael@0 71 {
michael@0 72 uint32_t i, count = tmp->mControllers.Length();
michael@0 73 for (i = 0; i < count; ++i) {
michael@0 74 nsXULControllerData* controllerData = tmp->mControllers[i];
michael@0 75 if (controllerData) {
michael@0 76 cb.NoteXPCOMChild(controllerData->mController);
michael@0 77 }
michael@0 78 }
michael@0 79 }
michael@0 80 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
michael@0 81
michael@0 82 DOMCI_DATA(XULControllers, nsXULControllers)
michael@0 83
michael@0 84 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsXULControllers)
michael@0 85 NS_INTERFACE_MAP_ENTRY(nsIControllers)
michael@0 86 NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIControllers)
michael@0 87 NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(XULControllers)
michael@0 88 NS_INTERFACE_MAP_END
michael@0 89
michael@0 90 NS_IMPL_CYCLE_COLLECTING_ADDREF(nsXULControllers)
michael@0 91 NS_IMPL_CYCLE_COLLECTING_RELEASE(nsXULControllers)
michael@0 92
michael@0 93 NS_IMETHODIMP
michael@0 94 nsXULControllers::GetControllerForCommand(const char *aCommand, nsIController** _retval)
michael@0 95 {
michael@0 96 NS_ENSURE_ARG_POINTER(_retval);
michael@0 97 *_retval = nullptr;
michael@0 98
michael@0 99 uint32_t count = mControllers.Length();
michael@0 100 for (uint32_t i=0; i < count; i++)
michael@0 101 {
michael@0 102 nsXULControllerData* controllerData = mControllers.ElementAt(i);
michael@0 103 if (controllerData)
michael@0 104 {
michael@0 105 nsCOMPtr<nsIController> controller;
michael@0 106 controllerData->GetController(getter_AddRefs(controller));
michael@0 107 if (controller)
michael@0 108 {
michael@0 109 bool supportsCommand;
michael@0 110 controller->SupportsCommand(aCommand, &supportsCommand);
michael@0 111 if (supportsCommand) {
michael@0 112 *_retval = controller;
michael@0 113 NS_ADDREF(*_retval);
michael@0 114 return NS_OK;
michael@0 115 }
michael@0 116 }
michael@0 117 }
michael@0 118 }
michael@0 119
michael@0 120 return NS_OK;
michael@0 121 }
michael@0 122
michael@0 123 NS_IMETHODIMP
michael@0 124 nsXULControllers::InsertControllerAt(uint32_t aIndex, nsIController *controller)
michael@0 125 {
michael@0 126 nsXULControllerData* controllerData = new nsXULControllerData(++mCurControllerID, controller);
michael@0 127 if (!controllerData) return NS_ERROR_OUT_OF_MEMORY;
michael@0 128 #ifdef DEBUG
michael@0 129 nsXULControllerData** inserted =
michael@0 130 #endif
michael@0 131 mControllers.InsertElementAt(aIndex, controllerData);
michael@0 132 NS_ASSERTION(inserted != nullptr, "Insertion of controller failed");
michael@0 133 return NS_OK;
michael@0 134 }
michael@0 135
michael@0 136 NS_IMETHODIMP
michael@0 137 nsXULControllers::RemoveControllerAt(uint32_t aIndex, nsIController **_retval)
michael@0 138 {
michael@0 139 NS_ENSURE_ARG_POINTER(_retval);
michael@0 140 *_retval = nullptr;
michael@0 141
michael@0 142 nsXULControllerData* controllerData = mControllers.SafeElementAt(aIndex);
michael@0 143 if (!controllerData) return NS_ERROR_FAILURE;
michael@0 144
michael@0 145 mControllers.RemoveElementAt(aIndex);
michael@0 146
michael@0 147 controllerData->GetController(_retval);
michael@0 148 delete controllerData;
michael@0 149
michael@0 150 return NS_OK;
michael@0 151 }
michael@0 152
michael@0 153
michael@0 154 NS_IMETHODIMP
michael@0 155 nsXULControllers::GetControllerAt(uint32_t aIndex, nsIController **_retval)
michael@0 156 {
michael@0 157 NS_ENSURE_ARG_POINTER(_retval);
michael@0 158 *_retval = nullptr;
michael@0 159
michael@0 160 nsXULControllerData* controllerData = mControllers.SafeElementAt(aIndex);
michael@0 161 if (!controllerData) return NS_ERROR_FAILURE;
michael@0 162
michael@0 163 return controllerData->GetController(_retval); // does the addref
michael@0 164 }
michael@0 165
michael@0 166 NS_IMETHODIMP
michael@0 167 nsXULControllers::AppendController(nsIController *controller)
michael@0 168 {
michael@0 169 // This assigns controller IDs starting at 1 so we can use 0 to test if an ID was obtained
michael@0 170 nsXULControllerData* controllerData = new nsXULControllerData(++mCurControllerID, controller);
michael@0 171 if (!controllerData) return NS_ERROR_OUT_OF_MEMORY;
michael@0 172
michael@0 173 #ifdef DEBUG
michael@0 174 nsXULControllerData** appended =
michael@0 175 #endif
michael@0 176 mControllers.AppendElement(controllerData);
michael@0 177 NS_ASSERTION(appended != nullptr, "Appending controller failed");
michael@0 178 return NS_OK;
michael@0 179 }
michael@0 180
michael@0 181 NS_IMETHODIMP
michael@0 182 nsXULControllers::RemoveController(nsIController *controller)
michael@0 183 {
michael@0 184 // first get the identity pointer
michael@0 185 nsCOMPtr<nsISupports> controllerSup(do_QueryInterface(controller));
michael@0 186 // then find it
michael@0 187 uint32_t count = mControllers.Length();
michael@0 188 for (uint32_t i = 0; i < count; i++)
michael@0 189 {
michael@0 190 nsXULControllerData* controllerData = mControllers.ElementAt(i);
michael@0 191 if (controllerData)
michael@0 192 {
michael@0 193 nsCOMPtr<nsIController> thisController;
michael@0 194 controllerData->GetController(getter_AddRefs(thisController));
michael@0 195 nsCOMPtr<nsISupports> thisControllerSup(do_QueryInterface(thisController)); // get identity
michael@0 196 if (thisControllerSup == controllerSup)
michael@0 197 {
michael@0 198 mControllers.RemoveElementAt(i);
michael@0 199 delete controllerData;
michael@0 200 return NS_OK;
michael@0 201 }
michael@0 202 }
michael@0 203 }
michael@0 204 return NS_ERROR_FAILURE; // right thing to return if no controller found?
michael@0 205 }
michael@0 206
michael@0 207 /* unsigned long getControllerId (in nsIController controller); */
michael@0 208 NS_IMETHODIMP
michael@0 209 nsXULControllers::GetControllerId(nsIController *controller, uint32_t *_retval)
michael@0 210 {
michael@0 211 NS_ENSURE_ARG_POINTER(_retval);
michael@0 212
michael@0 213 uint32_t count = mControllers.Length();
michael@0 214 for (uint32_t i = 0; i < count; i++)
michael@0 215 {
michael@0 216 nsXULControllerData* controllerData = mControllers.ElementAt(i);
michael@0 217 if (controllerData)
michael@0 218 {
michael@0 219 nsCOMPtr<nsIController> thisController;
michael@0 220 controllerData->GetController(getter_AddRefs(thisController));
michael@0 221 if (thisController.get() == controller)
michael@0 222 {
michael@0 223 *_retval = controllerData->GetControllerID();
michael@0 224 return NS_OK;
michael@0 225 }
michael@0 226 }
michael@0 227 }
michael@0 228 return NS_ERROR_FAILURE; // none found
michael@0 229 }
michael@0 230
michael@0 231 /* nsIController getControllerById (in unsigned long controllerID); */
michael@0 232 NS_IMETHODIMP
michael@0 233 nsXULControllers::GetControllerById(uint32_t controllerID, nsIController **_retval)
michael@0 234 {
michael@0 235 NS_ENSURE_ARG_POINTER(_retval);
michael@0 236
michael@0 237 uint32_t count = mControllers.Length();
michael@0 238 for (uint32_t i = 0; i < count; i++)
michael@0 239 {
michael@0 240 nsXULControllerData* controllerData = mControllers.ElementAt(i);
michael@0 241 if (controllerData && controllerData->GetControllerID() == controllerID)
michael@0 242 {
michael@0 243 return controllerData->GetController(_retval);
michael@0 244 }
michael@0 245 }
michael@0 246 return NS_ERROR_FAILURE; // none found
michael@0 247 }
michael@0 248
michael@0 249 NS_IMETHODIMP
michael@0 250 nsXULControllers::GetControllerCount(uint32_t *_retval)
michael@0 251 {
michael@0 252 NS_ENSURE_ARG_POINTER(_retval);
michael@0 253 *_retval = mControllers.Length();
michael@0 254 return NS_OK;
michael@0 255 }
michael@0 256

mercurial