blob: 2f3949f9d00652a6dcc35e42c8a5a6d1a8078cf5 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <memory>
#include <string>
#include <vector>
#include "base/component_export.h"
#include "base/macros.h"
#include "components/content_settings/core/common/content_settings.h"
#include "mojo/public/cpp/bindings/binding_set.h"
#include "net/cookies/cookie_change_dispatcher.h"
#include "net/cookies/cookie_deletion_info.h"
#include "services/network/cookie_settings.h"
#include "services/network/public/mojom/cookie_manager.mojom.h"
namespace net {
class CookieStore;
class GURL;
namespace network {
class SessionCleanupCookieStore;
// Wrap a cookie store in an implementation of the mojo cookie interface.
// This is an IO thread object; all methods on this object must be called on
// the IO thread. Note that this does not restrict the locations from which
// mojo messages may be sent to the object.
: public mojom::CookieManager {
// Construct a CookieService that can serve mojo requests for the underlying
// cookie store. |*cookie_store| must outlive this object.
net::CookieStore* cookie_store,
scoped_refptr<SessionCleanupCookieStore> session_cleanup_cookie_store,
mojom::CookieManagerParamsPtr params);
~CookieManager() override;
const CookieSettings& cookie_settings() const { return cookie_settings_; }
// Bind a cookie request to this object. Mojo messages
// coming through the associated pipe will be served by this object.
void AddRequest(mojom::CookieManagerRequest request);
// TODO(rdsmith): Add a verion of AddRequest that does renderer-appropriate
// security checks on bindings coming through that interface.
// mojom::CookieManager
void GetAllCookies(GetAllCookiesCallback callback) override;
void GetCookieList(const GURL& url,
const net::CookieOptions& cookie_options,
GetCookieListCallback callback) override;
void SetCanonicalCookie(const net::CanonicalCookie& cookie,
const std::string& source_scheme,
const net::CookieOptions& cookie_options,
SetCanonicalCookieCallback callback) override;
void DeleteCanonicalCookie(const net::CanonicalCookie& cookie,
DeleteCanonicalCookieCallback callback) override;
void SetContentSettings(const ContentSettingsForOneType& settings) override;
void DeleteCookies(mojom::CookieDeletionFilterPtr filter,
DeleteCookiesCallback callback) override;
void AddCookieChangeListener(
const GURL& url,
const std::string& name,
mojom::CookieChangeListenerPtr listener) override;
void AddGlobalChangeListener(
mojom::CookieChangeListenerPtr listener) override;
void CloneInterface(mojom::CookieManagerRequest new_interface) override;
size_t GetClientsBoundForTesting() const { return bindings_.size(); }
size_t GetListenersRegisteredForTesting() const {
return listener_registrations_.size();
void FlushCookieStore(FlushCookieStoreCallback callback) override;
void AllowFileSchemeCookies(bool allow,
AllowFileSchemeCookiesCallback callback) override;
void SetForceKeepSessionState() override;
void BlockThirdPartyCookies(bool block) override;
// Configures |out| based on |params|. (This doesn't honor
// allow_file_scheme_cookies, which affects the cookie store rather than the
// settings).
static void ConfigureCookieSettings(
const network::mojom::CookieManagerParams& params,
CookieSettings* out);
// Causes the next call to GetCookieList to crash the process.
static void CrashOnGetCookieList();
// State associated with a CookieChangeListener.
struct ListenerRegistration {
// Translates a CookieStore change callback to a CookieChangeListener call.
void DispatchCookieStoreChange(const net::CanonicalCookie& cookie,
net::CookieChangeCause cause);
// Owns the callback registration in the store.
std::unique_ptr<net::CookieChangeSubscription> subscription;
// The observer receiving change notifications.
mojom::CookieChangeListenerPtr listener;
// Handles connection errors on change listener pipes.
void RemoveChangeListener(ListenerRegistration* registration);
net::CookieStore* const cookie_store_;
scoped_refptr<SessionCleanupCookieStore> session_cleanup_cookie_store_;
mojo::BindingSet<mojom::CookieManager> bindings_;
std::vector<std::unique_ptr<ListenerRegistration>> listener_registrations_;
// Note: RestrictedCookieManager stores pointers to |cookie_settings_|.
CookieSettings cookie_settings_;
net::CookieDeletionInfo DeletionFilterToInfo(
mojom::CookieDeletionFilterPtr filter);
} // namespace network