15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CONTENT_PUBLIC_BROWSER_SESSION_STORAGE_NAMESPACE_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_PUBLIC_BROWSER_SESSION_STORAGE_NAMESPACE_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include <map>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/callback.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is a ref-counted class that represents a SessionStorageNamespace.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// On destruction it ensures that the storage namespace is destroyed.
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SessionStorageNamespace
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public base::RefCountedThreadSafe<SessionStorageNamespace> {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the ID of the |SessionStorageNamespace|. The ID is unique among all
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SessionStorageNamespace objects, but not unique across browser runs.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int64 id() const = 0;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the persistent ID for the |SessionStorageNamespace|. The ID is
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // unique across browser runs.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual const std::string& persistent_id() const = 0;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For marking that the sessionStorage will be needed or won't be needed by
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // session restore.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetShouldPersist(bool should_persist) = 0;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool should_persist() const = 0;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // SessionStorageNamespaces can be merged. These merges happen based on
374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // a transaction log of operations on the session storage namespace since
384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // this function has been called. Transaction logging will be restricted
394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // to the processes indicated.
404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void AddTransactionLogProcessId(int process_id) = 0;
41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // When transaction logging for a process is no longer required, the log
434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // can be removed to save space.
444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void RemoveTransactionLogProcessId(int process_id) = 0;
454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Creates a new session storage namespace which is an alias of the current
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // instance.
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual SessionStorageNamespace* CreateAlias() = 0;
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  enum MergeResult {
514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    MERGE_RESULT_NAMESPACE_NOT_FOUND,
52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    MERGE_RESULT_NAMESPACE_NOT_ALIAS,
534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    MERGE_RESULT_NOT_LOGGING,
544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    MERGE_RESULT_NO_TRANSACTIONS,
554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    MERGE_RESULT_TOO_MANY_TRANSACTIONS,
564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    MERGE_RESULT_NOT_MERGEABLE,
574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    MERGE_RESULT_MERGEABLE,
584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    MERGE_RESULT_MAX_VALUE
594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  };
604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  typedef base::Callback<void(MergeResult)> MergeResultCallback;
624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Determines whether the transaction log for the process specified can
644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // be merged into the other session storage namespace supplied.
65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // If actually_merge is set to true, the merge will actually be performed,
66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // if possible, and the result of the merge will be returned.
67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // If actually_merge is set to false, the result of whether a merge would be
68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // possible is returned.
69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void Merge(bool actually_merge,
70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                     int process_id,
71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                     SessionStorageNamespace* other,
72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                     const MergeResultCallback& callback) = 0;
73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Indicates whether this SessionStorageNamespace is an alias of |other|,
75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // i.e. whether they point to the same underlying data.
76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual bool IsAliasOf(SessionStorageNamespace* other) = 0;
774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::RefCountedThreadSafe<SessionStorageNamespace>;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SessionStorageNamespace() {}
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Used to store mappings of StoragePartition id to SessionStorageNamespace.
8446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)typedef std::map<std::string, scoped_refptr<SessionStorageNamespace> >
8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    SessionStorageNamespaceMap;
8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CONTENT_PUBLIC_BROWSER_SESSION_STORAGE_NAMESPACE_H_
90