1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
|
// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_COOKIE_STORE_COOKIE_STORE_H_
#define THIRD_PARTY_BLINK_RENDERER_MODULES_COOKIE_STORE_COOKIE_STORE_H_
#include "mojo/public/cpp/bindings/remote.h"
#include "net/cookies/site_for_cookies.h"
#include "services/network/public/mojom/cookie_manager.mojom-blink.h"
#include "services/network/public/mojom/restricted_cookie_manager.mojom-blink.h"
#include "third_party/blink/public/mojom/cookie_store/cookie_store.mojom-blink.h"
#include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
#include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
#include "third_party/blink/renderer/core/dom/events/event_target.h"
#include "third_party/blink/renderer/core/execution_context/execution_context.h"
#include "third_party/blink/renderer/core/execution_context/execution_context_lifecycle_observer.h"
#include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
#include "third_party/blink/renderer/platform/heap/garbage_collected.h"
#include "third_party/blink/renderer/platform/mojo/heap_mojo_receiver.h"
#include "third_party/blink/renderer/platform/mojo/heap_mojo_remote.h"
#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
#include "third_party/blink/renderer/platform/wtf/vector.h"
namespace blink {
class CookieInit;
class CookieListItem;
class CookieStoreDeleteOptions;
class CookieStoreGetOptions;
class ExceptionState;
class ScriptState;
class CookieStore final : public EventTarget,
public ExecutionContextClient,
public network::mojom::blink::CookieChangeListener {
DEFINE_WRAPPERTYPEINFO();
public:
CookieStore(
ExecutionContext*,
HeapMojoRemote<network::mojom::blink::RestrictedCookieManager> backend);
// Needed because of the
// mojo::Remote<network::mojom::blink::RestrictedCookieManager>
~CookieStore() override;
ScriptPromise<IDLSequence<CookieListItem>> getAll(ScriptState*,
const String& name,
ExceptionState&);
ScriptPromise<IDLSequence<CookieListItem>>
getAll(ScriptState*, const CookieStoreGetOptions*, ExceptionState&);
ScriptPromise<IDLNullable<CookieListItem>> get(ScriptState*,
const String& name,
ExceptionState&);
ScriptPromise<IDLNullable<CookieListItem>> get(ScriptState*,
const CookieStoreGetOptions*,
ExceptionState&);
ScriptPromise<IDLUndefined> set(ScriptState*,
const String& name,
const String& value,
ExceptionState&);
ScriptPromise<IDLUndefined> set(ScriptState*,
const CookieInit*,
ExceptionState&);
ScriptPromise<IDLUndefined> Delete(ScriptState*,
const String& name,
ExceptionState&);
ScriptPromise<IDLUndefined> Delete(ScriptState*,
const CookieStoreDeleteOptions*,
ExceptionState&);
// GarbageCollected
void Trace(Visitor* visitor) const override;
// EventTarget
DEFINE_ATTRIBUTE_EVENT_LISTENER(change, kChange)
const AtomicString& InterfaceName() const override;
ExecutionContext* GetExecutionContext() const override;
void RemoveAllEventListeners() override;
// network::mojom::blink::CookieChangeListener
void OnCookieChange(
network::mojom::blink::CookieChangeInfoPtr change) override;
protected:
// EventTarget overrides.
void AddedEventListener(const AtomicString& event_type,
RegisteredEventListener&) final;
void RemovedEventListener(const AtomicString& event_type,
const RegisteredEventListener&) final;
private:
// Common code in CookieStore::{get,getAll}.
//
// All cookie-reading methods use the same RestrictedCookieManager API, and
// only differ in how they present the returned data. The difference is
// captured in the base::OnceClosure argument, which should point
// to one of the static methods below.
using GetAllForUrlCallback =
network::mojom::blink::RestrictedCookieManager::GetAllForUrlCallback;
void DoRead(ScriptState*,
const CookieStoreGetOptions*,
GetAllForUrlCallback backend_result_converter,
ExceptionState&);
// Converts the result of a RestrictedCookieManager::GetAllForUrl mojo call to
// the promise result expected by CookieStore.getAll.
static void GetAllForUrlToGetAllResult(
ScriptPromiseResolver<IDLSequence<CookieListItem>>*,
const Vector<network::mojom::blink::CookieWithAccessResultPtr>
backend_result);
// Converts the result of a RestrictedCookieManager::GetAllForUrl mojo call to
// the promise result expected by CookieStore.get.
static void GetAllForUrlToGetResult(
ScriptPromiseResolver<IDLNullable<CookieListItem>>*,
const Vector<network::mojom::blink::CookieWithAccessResultPtr>
backend_result);
// Common code in CookieStore::delete and CookieStore::set.
ScriptPromise<IDLUndefined> DoWrite(ScriptState*,
const CookieInit*,
ExceptionState&);
static void OnSetCanonicalCookieResult(ScriptPromiseResolver<IDLUndefined>*,
bool backend_result);
// Called when a change event listener is added.
//
// This is idempotent during the time intervals between StopObserving() calls.
void StartObserving();
// Called when all the change event listeners have been removed.
void StopObserving();
// Wraps an always-on Mojo pipe for sending requests to the Network Service.
HeapMojoRemote<network::mojom::blink::RestrictedCookieManager> backend_;
// Wraps a Mojo pipe used to receive cookie change notifications.
//
// This receiver is set up on-demand, when the cookie store has at least one
// change event listener. If all the listeners are unregistered, the receiver
// is torn down.
HeapMojoReceiver<network::mojom::blink::CookieChangeListener, CookieStore>
change_listener_receiver_;
// Default for cookie_url in CookieStoreGetOptions.
//
// This is the current document's URL. API calls coming from a document
// context are not allowed to specify a different cookie_url, whereas Service
// Workers may specify any URL that falls under their registration.
const KURL default_cookie_url_;
// The RFC 6265bis "site for cookies" for this store's ExecutionContext.
const net::SiteForCookies default_site_for_cookies_;
// The context in which cookies are accessed.
const scoped_refptr<const SecurityOrigin> default_top_frame_origin_;
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_COOKIE_STORE_COOKIE_STORE_H_
|