blob: 98b7798fa7e07a9d0a76f97c11cb2b2931f4ae64 [file] [log] [blame]
/*
* Copyright (C) 2008 Apple Inc. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_STORAGE_STORAGE_NAMESPACE_H_
#define THIRD_PARTY_BLINK_RENDERER_MODULES_STORAGE_STORAGE_NAMESPACE_H_
#include <memory>
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "third_party/blink/public/mojom/dom_storage/dom_storage.mojom-blink-forward.h"
#include "third_party/blink/public/mojom/dom_storage/session_storage_namespace.mojom-blink.h"
#include "third_party/blink/public/mojom/dom_storage/storage_area.mojom-blink-forward.h"
#include "third_party/blink/renderer/core/page/page.h"
#include "third_party/blink/renderer/modules/modules_export.h"
#include "third_party/blink/renderer/platform/heap/handle.h"
#include "third_party/blink/renderer/platform/heap/heap_allocator.h"
#include "third_party/blink/renderer/platform/mojo/heap_mojo_remote.h"
#include "third_party/blink/renderer/platform/mojo/heap_mojo_wrapper_mode.h"
#include "third_party/blink/renderer/platform/supplementable.h"
#include "third_party/blink/renderer/platform/weborigin/security_origin_hash.h"
#include "third_party/blink/renderer/platform/wtf/hash_map.h"
#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
namespace blink {
class CachedStorageArea;
class InspectorDOMStorageAgent;
class StorageController;
class SecurityOrigin;
class WebViewClient;
// Contains DOMStorage storage areas for origins & handles inspector agents. A
// namespace is either a SessionStorage namespace with a namespace_id, or a
// LocalStorage namespace with no (or an empty) namespace_id. The LocalStorage
// version of the StorageNamespace lives in the StorageController.
// InspectorDOMStorageAgents that are registered on this object are notified
// through |DidDispatchStorageEvent|.
//
// With the kOnionSoupDOMStorage flag off:
// The StorageNamespace basically delegates calls to GetWebStorageArea to the
// internal WebStorageNamespace. |GetWebStorageArea| is used to get the storage
// area for an origin.
//
// With the kOnionSoupDOMStorage flag on:
// The StorageNamespace for SessioStorage supplement the Page. |GetCachedArea|
// is used to get the storage area for an origin.
class MODULES_EXPORT StorageNamespace final
: public GarbageCollected<StorageNamespace>,
public Supplement<Page> {
public:
static const char kSupplementName[];
static void ProvideSessionStorageNamespaceTo(Page&, WebViewClient*);
static StorageNamespace* From(Page* page) {
return Supplement<Page>::From<StorageNamespace>(page);
}
// Creates a namespace for LocalStorage.
StorageNamespace(StorageController*);
// Creates a namespace for SessionStorage.
StorageNamespace(StorageController*, const String& namespace_id);
scoped_refptr<CachedStorageArea> GetCachedArea(const SecurityOrigin* origin);
// Only valid to call this if |this| and |target| are session storage
// namespaces.
void CloneTo(const String& target);
size_t TotalCacheSize() const;
// Removes any CachedStorageAreas that aren't referenced by any source.
void CleanUpUnusedAreas();
bool IsSessionStorage() const { return !namespace_id_.IsEmpty(); }
void AddInspectorStorageAgent(InspectorDOMStorageAgent* agent);
void RemoveInspectorStorageAgent(InspectorDOMStorageAgent* agent);
void Trace(Visitor* visitor) const override;
// Iterates all of the inspector agents and calls
// |DidDispatchDOMStorageEvent|.
void DidDispatchStorageEvent(const SecurityOrigin* origin,
const String& key,
const String& old_value,
const String& new_value);
// Called by areas in |cached_areas_| to bind/rebind their StorageArea
// interface.
void BindStorageArea(
const scoped_refptr<const SecurityOrigin>& origin,
mojo::PendingReceiver<mojom::blink::StorageArea> receiver);
// If this StorageNamespace was previously connected to the backend, this
// forcibly disconnects it so that it reconnects lazily when next needed.
// Also forces all owned CachedStorageAreas to be reconnected.
void ResetStorageAreaAndNamespaceConnections();
private:
void EnsureConnected();
HeapHashSet<WeakMember<InspectorDOMStorageAgent>> inspector_agents_;
// Lives globally.
StorageController* controller_;
String namespace_id_;
// |StorageNamespace| is a per-Page object and doesn't have any
// |ExecutionContext|.
HeapMojoRemote<mojom::blink::SessionStorageNamespace,
HeapMojoWrapperMode::kWithoutContextObserver>
namespace_{nullptr};
HashMap<scoped_refptr<const SecurityOrigin>,
scoped_refptr<CachedStorageArea>,
SecurityOriginHash>
cached_areas_;
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_STORAGE_STORAGE_NAMESPACE_H_