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++; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40; -*- */
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 "SurfaceFactory.h"
8 #include "SharedSurface.h"
10 namespace mozilla {
11 namespace gfx {
13 SurfaceFactory::~SurfaceFactory()
14 {
15 while (!mScraps.empty()) {
16 SharedSurface* cur = mScraps.front();
17 mScraps.pop();
19 delete cur;
20 }
21 }
23 SharedSurface*
24 SurfaceFactory::NewSharedSurface(const gfx::IntSize& size)
25 {
26 // Attempt to reuse an old surface.
27 while (!mScraps.empty()) {
28 SharedSurface* cur = mScraps.front();
29 mScraps.pop();
30 if (cur->Size() == size)
31 return cur;
33 // Destroy old surfaces of the wrong size.
34 delete cur;
35 }
37 SharedSurface* ret = CreateShared(size);
39 return ret;
40 }
42 // Auto-deletes surfs of the wrong type.
43 void
44 SurfaceFactory::Recycle(SharedSurface*& surf)
45 {
46 if (!surf)
47 return;
49 if (surf->Type() == mType) {
50 mScraps.push(surf);
51 } else {
52 delete surf;
53 }
55 surf = nullptr;
56 }
58 } /* namespace gfx */
59 } /* namespace mozilla */