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

content / browser / interest_group / auction_shared_storage_host.h [blame]

// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CONTENT_BROWSER_INTEREST_GROUP_AUCTION_SHARED_STORAGE_HOST_H_
#define CONTENT_BROWSER_INTEREST_GROUP_AUCTION_SHARED_STORAGE_HOST_H_

#include "content/common/content_export.h"
#include "content/services/auction_worklet/public/mojom/auction_shared_storage_host.mojom.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/receiver_set.h"

namespace storage {
class SharedStorageManager;
}  // namespace storage

namespace content {

class RenderFrameHostImpl;

// Implements the mojo interface used by the auction worklets, to receive
// shared storage requests and then pass them on to `SharedStorageManager` to
// write to the database.
class CONTENT_EXPORT AuctionSharedStorageHost
    : public auction_worklet::mojom::AuctionSharedStorageHost {
 public:
  explicit AuctionSharedStorageHost(
      storage::SharedStorageManager* shared_storage_manager);

  AuctionSharedStorageHost(const AuctionSharedStorageHost&) = delete;
  AuctionSharedStorageHost& operator=(const AuctionSharedStorageHost&) = delete;
  ~AuctionSharedStorageHost() override;

  // Binds a new pending receiver for a worklet, allowing messages to be sent
  // and processed.
  void BindNewReceiver(
      RenderFrameHostImpl* auction_runner_rfh,
      const url::Origin& worklet_origin,
      mojo::PendingReceiver<auction_worklet::mojom::AuctionSharedStorageHost>
          receiver);

  // auction_worklet::mojom::AuctionSharedStorageHost:
  void Set(const std::u16string& key,
           const std::u16string& value,
           bool ignore_if_present,
           auction_worklet::mojom::AuctionWorkletFunction
               source_auction_worklet_function) override;
  void Append(const std::u16string& key,
              const std::u16string& value,
              auction_worklet::mojom::AuctionWorkletFunction
                  source_auction_worklet_function) override;
  void Delete(const std::u16string& key,
              auction_worklet::mojom::AuctionWorkletFunction
                  source_auction_worklet_function) override;
  void Clear(auction_worklet::mojom::AuctionWorkletFunction
                 source_auction_worklet_function) override;

 private:
  struct ReceiverContext;

  mojo::ReceiverSet<auction_worklet::mojom::AuctionSharedStorageHost,
                    ReceiverContext>
      receiver_set_;

  // `this` is owned by a `DocumentService`, and `shared_storage_manager_` is
  // owned by the `StoragePartitionImpl`. Thus, `shared_storage_manager_` must
  // outlive `this`.
  raw_ptr<storage::SharedStorageManager> shared_storage_manager_;
};

}  // namespace content

#endif  // CONTENT_BROWSER_INTEREST_GROUP_AUCTION_SHARED_STORAGE_HOST_H_