blob: f33042fdfcfc071b12941bf518463ae025d5696f [file] [log] [blame]
Ben Murdochbb1529c2013-08-08 10:24:53 +01001// Copyright 2013 The Chromium Authors. All rights reserved.
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +01002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Ben Murdochbb1529c2013-08-08 10:24:53 +01005#ifndef CONTENT_BROWSER_DOM_STORAGE_DOM_STORAGE_NAMESPACE_H_
6#define CONTENT_BROWSER_DOM_STORAGE_DOM_STORAGE_NAMESPACE_H_
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +01007
8#include <map>
9
10#include "base/basictypes.h"
11#include "base/files/file_path.h"
12#include "base/memory/ref_counted.h"
Ben Murdochbb1529c2013-08-08 10:24:53 +010013#include "content/common/content_export.h"
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010014
15class GURL;
16
Ben Murdochbb1529c2013-08-08 10:24:53 +010017namespace content {
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010018
Ben Murdochbb1529c2013-08-08 10:24:53 +010019class DOMStorageArea;
20class DOMStorageTaskRunner;
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010021class SessionStorageDatabase;
22
23// Container for the set of per-origin Areas.
Ben Murdochbb1529c2013-08-08 10:24:53 +010024// See class comments for DOMStorageContextImpl for a larger overview.
25class CONTENT_EXPORT DOMStorageNamespace
26 : public base::RefCountedThreadSafe<DOMStorageNamespace> {
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010027 public:
28 // Option for PurgeMemory.
29 enum PurgeOption {
30 // Purge unopened areas only.
31 PURGE_UNOPENED,
32
33 // Purge aggressively, i.e. discard cache even for areas that have
34 // non-zero open count.
35 PURGE_AGGRESSIVE,
36 };
37
38 // Constructor for a LocalStorage namespace with id of 0
39 // and an optional backing directory on disk.
Ben Murdochbb1529c2013-08-08 10:24:53 +010040 DOMStorageNamespace(const base::FilePath& directory, // may be empty
41 DOMStorageTaskRunner* task_runner);
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010042
43 // Constructor for a SessionStorage namespace with a non-zero id and an
44 // optional backing on disk via |session_storage_database| (may be NULL).
Ben Murdochbb1529c2013-08-08 10:24:53 +010045 DOMStorageNamespace(int64 namespace_id,
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010046 const std::string& persistent_namespace_id,
47 SessionStorageDatabase* session_storage_database,
Ben Murdochbb1529c2013-08-08 10:24:53 +010048 DOMStorageTaskRunner* task_runner);
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010049
50 int64 namespace_id() const { return namespace_id_; }
51 const std::string& persistent_namespace_id() const {
52 return persistent_namespace_id_;
53 }
54
55 // Returns the storage area for the given origin,
56 // creating instance if needed. Each call to open
57 // must be balanced with a call to CloseStorageArea.
Ben Murdochbb1529c2013-08-08 10:24:53 +010058 DOMStorageArea* OpenStorageArea(const GURL& origin);
59 void CloseStorageArea(DOMStorageArea* area);
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010060
61 // Returns the area for |origin| if it's open, otherwise NULL.
Ben Murdochbb1529c2013-08-08 10:24:53 +010062 DOMStorageArea* GetOpenStorageArea(const GURL& origin);
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010063
64 // Creates a clone of |this| namespace including
65 // shallow copies of all contained areas.
66 // Should only be called for session storage namespaces.
Ben Murdochbb1529c2013-08-08 10:24:53 +010067 DOMStorageNamespace* Clone(int64 clone_namespace_id,
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010068 const std::string& clone_persistent_namespace_id);
69
70 void DeleteLocalStorageOrigin(const GURL& origin);
71 void DeleteSessionStorageOrigin(const GURL& origin);
72 void PurgeMemory(PurgeOption purge);
73 void Shutdown();
74
75 unsigned int CountInMemoryAreas() const;
76
77 private:
Ben Murdochbb1529c2013-08-08 10:24:53 +010078 friend class base::RefCountedThreadSafe<DOMStorageNamespace>;
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010079
80 // Struct to hold references to our contained areas and
81 // to keep track of how many tabs have a given area open.
82 struct AreaHolder {
Ben Murdochbb1529c2013-08-08 10:24:53 +010083 scoped_refptr<DOMStorageArea> area_;
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010084 int open_count_;
85 AreaHolder();
Ben Murdochbb1529c2013-08-08 10:24:53 +010086 AreaHolder(DOMStorageArea* area, int count);
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010087 ~AreaHolder();
88 };
89 typedef std::map<GURL, AreaHolder> AreaMap;
90
Ben Murdochbb1529c2013-08-08 10:24:53 +010091 ~DOMStorageNamespace();
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010092
93 // Returns a pointer to the area holder in our map or NULL.
94 AreaHolder* GetAreaHolder(const GURL& origin);
95
96 int64 namespace_id_;
97 std::string persistent_namespace_id_;
98 base::FilePath directory_;
99 AreaMap areas_;
Ben Murdochbb1529c2013-08-08 10:24:53 +0100100 scoped_refptr<DOMStorageTaskRunner> task_runner_;
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100101 scoped_refptr<SessionStorageDatabase> session_storage_database_;
102};
103
Ben Murdochbb1529c2013-08-08 10:24:53 +0100104} // namespace content
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100105
106
Ben Murdochbb1529c2013-08-08 10:24:53 +0100107#endif // CONTENT_BROWSER_DOM_STORAGE_DOM_STORAGE_NAMESPACE_H_