dom/xslt/base/txList.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.

     1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
     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 "txList.h"
     8   //----------------------------/
     9  //- Implementation of txList -/
    10 //----------------------------/
    12 /**
    13  * Default constructor for a txList;
    14 **/
    16 txList::txList() {
    17    firstItem  = 0;
    18    lastItem   = 0;
    19    itemCount  = 0;
    20 } //-- txList;
    22 /**
    23  * txList destructor, cleans up ListItems, but will not delete the Object
    24  * references
    25 */
    26 txList::~txList() {
    27     clear();
    28 } //-- ~txList
    30 nsresult txList::add(void* objPtr)
    31 {
    32     return insertBefore(objPtr, 0);
    33 } //-- add
    35 /**
    36  * Returns the number of items in this txList
    37 **/
    38 int32_t List::getLength() {
    39    return itemCount;
    40 } //-- getLength
    43 /**
    44  * Inserts the given Object pointer as the item just after refItem.
    45  * If refItem is a null pointer the Object will be inserted at the
    46  * beginning of the txList (ie, insert after nothing).
    47  * This method assumes refItem is a member of this list, and since this
    48  * is a private method, I feel that's a valid assumption
    49 **/
    50 nsresult txList::insertAfter(void* objPtr, ListItem* refItem)
    51 {
    52     //-- if refItem == null insert at front
    53     if (!refItem)
    54         return insertBefore(objPtr, firstItem);
    55     return insertBefore(objPtr, refItem->nextItem);
    56 } //-- insertAfter
    58 /**
    59  * Inserts the given Object pointer as the item just before refItem.
    60  * If refItem is a null pointer the Object will be inserted at the
    61  * end of the txList (ie, insert before nothing).
    62  * This method assumes refItem is a member of this list, and since this
    63  * is a private method, I feel that's a valid assumption
    64 **/
    65 nsresult txList::insertBefore(void* objPtr, ListItem* refItem)
    66 {
    67     ListItem* item = new ListItem;
    68     NS_ENSURE_TRUE(item, NS_ERROR_OUT_OF_MEMORY);
    70     item->objPtr = objPtr;
    71     item->nextItem = 0;
    72     item->prevItem = 0;
    74     //-- if refItem == null insert at end
    75     if (!refItem) {
    76         //-- add to back of list
    77         if (lastItem) {
    78             lastItem->nextItem = item;
    79             item->prevItem = lastItem;
    80         }
    81         lastItem = item;
    82         if (!firstItem)
    83             firstItem = item;
    84     }
    85     else {
    86         //-- insert before given item
    87         item->nextItem = refItem;
    88         item->prevItem = refItem->prevItem;
    89         refItem->prevItem = item;
    91         if (item->prevItem)
    92             item->prevItem->nextItem = item;
    93         else
    94             firstItem = item;
    95     }
    97     // increase the item count
    98     ++itemCount;
   100     return NS_OK;
   101 } //-- insertBefore
   103 txList::ListItem* txList::remove(ListItem* item) {
   105     if (!item)
   106         return item;
   108     //-- adjust the previous item's next pointer
   109     if (item->prevItem) {
   110         item->prevItem->nextItem = item->nextItem;
   111     }
   112     //-- adjust the next item's previous pointer
   113     if (item->nextItem) {
   114         item->nextItem->prevItem = item->prevItem;
   115     }
   117     //-- adjust first and last items
   118     if (item == firstItem)
   119         firstItem = item->nextItem;
   120     if (item == lastItem)
   121         lastItem = item->prevItem;
   123     //-- decrease Item count
   124     --itemCount;
   125     return item;
   126 } //-- remove
   128 void txList::clear()
   129 {
   130     ListItem* item = firstItem;
   131     while (item) {
   132         ListItem* tItem = item;
   133         item = item->nextItem;
   134         delete tItem;
   135     }
   136     firstItem  = 0;
   137     lastItem   = 0;
   138     itemCount  = 0;
   139 }
   141   //------------------------------------/
   142  //- Implementation of txListIterator -/
   143 //------------------------------------/
   146 /**
   147  * Creates a new txListIterator for the given txList
   148  * @param list, the txList to create an Iterator for
   149 **/
   150 txListIterator::txListIterator(txList* list) {
   151    this->list   = list;
   152    currentItem  = 0;
   153    atEndOfList  = false;
   154 } //-- txListIterator
   156 /**
   157  * Adds the Object pointer to the txList pointed to by this txListIterator.
   158  * The Object pointer is inserted as the next item in the txList
   159  * based on the current position within the txList
   160  * @param objPtr the Object pointer to add to the list
   161 **/
   162 nsresult txListIterator::addAfter(void* objPtr)
   163 {
   164     if (currentItem || !atEndOfList)
   165         return list->insertAfter(objPtr, currentItem);
   166     return list->insertBefore(objPtr, 0);
   168 } //-- addAfter
   170 /**
   171  * Adds the Object pointer to the txList pointed to by this txListIterator.
   172  * The Object pointer is inserted as the previous item in the txList
   173  * based on the current position within the txList
   174  * @param objPtr the Object pointer to add to the list
   175 **/
   176 nsresult txListIterator::addBefore(void* objPtr)
   177 {
   178     if (currentItem || atEndOfList)
   179         return list->insertBefore(objPtr, currentItem);
   180     return list->insertAfter(objPtr, 0);
   182 } //-- addBefore
   184 /**
   185  * Returns true if a successful call to the next() method can be made
   186  * @return true if a successful call to the next() method can be made,
   187  * otherwise false
   188 **/
   189 bool txListIterator::hasNext() {
   190     bool hasNext = false;
   191     if (currentItem)
   192         hasNext = (currentItem->nextItem != 0);
   193     else if (!atEndOfList)
   194         hasNext = (list->firstItem != 0);
   196     return hasNext;
   197 } //-- hasNext
   199 /**
   200  * Returns the next Object pointer in the list
   201 **/
   202 void* txListIterator::next() {
   204     void* obj = 0;
   205     if (currentItem)
   206         currentItem = currentItem->nextItem;
   207     else if (!atEndOfList)
   208         currentItem = list->firstItem;
   210     if (currentItem)
   211         obj = currentItem->objPtr;
   212     else
   213         atEndOfList = true;
   215     return obj;
   216 } //-- next
   218 /**
   219  * Returns the previous Object in the list
   220 **/
   221 void* txListIterator::previous() {
   223     void* obj = 0;
   225     if (currentItem)
   226         currentItem = currentItem->prevItem;
   227     else if (atEndOfList)
   228         currentItem = list->lastItem;
   230     if (currentItem)
   231         obj = currentItem->objPtr;
   233     atEndOfList = false;
   235     return obj;
   236 } //-- previous
   238 /**
   239  * Returns the current Object
   240 **/
   241 void* txListIterator::current() {
   243     if (currentItem)
   244         return currentItem->objPtr;
   246     return 0;
   247 } //-- current
   249 /**
   250  * Removes the Object last returned by the next() or previous() methods;
   251  * @return the removed Object pointer
   252 **/
   253 void* txListIterator::remove() {
   255     void* obj = 0;
   256     if (currentItem) {
   257         obj = currentItem->objPtr;
   258         txList::ListItem* item = currentItem;
   259         previous(); //-- make previous item the current item
   260         list->remove(item);
   261         delete item;
   262     }
   263     return obj;
   264 } //-- remove
   266 /**
   267  * Resets the current location within the txList to the beginning of the txList
   268 **/
   269 void txListIterator::reset() {
   270    atEndOfList = false;
   271    currentItem = 0;
   272 } //-- reset
   274 /**
   275  * Move the iterator to right after the last element
   276 **/
   277 void txListIterator::resetToEnd() {
   278    atEndOfList = true;
   279    currentItem = 0;
   280 } //-- moveToEnd

mercurial