910e62b5创建于 1月15日历史提交
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef EXTENSIONS_BROWSER_API_SOCKET_WRITE_QUOTA_CHECKER_H_
#define EXTENSIONS_BROWSER_API_SOCKET_WRITE_QUOTA_CHECKER_H_

#include <stddef.h>

#include <map>

#include "base/auto_reset.h"
#include "extensions/browser/browser_context_keyed_api_factory.h"
#include "extensions/common/extension_id.h"

namespace extensions {

// Tracks bytes quota per extension.
class WriteQuotaChecker : public BrowserContextKeyedAPI {
 public:
  class ScopedBytesLimitForTest {
   public:
    ScopedBytesLimitForTest(WriteQuotaChecker* checker, size_t new_bytes_limit);
    ~ScopedBytesLimitForTest();

   private:
    base::AutoReset<size_t> scoped_bytes_limit_;
  };

  static WriteQuotaChecker* Get(content::BrowserContext* context);

  // BrowserContextKeyedAPI:
  static BrowserContextKeyedAPIFactory<WriteQuotaChecker>* GetFactoryInstance();
  static const char* service_name() { return "WriteQuotaChecker"; }

  explicit WriteQuotaChecker(content::BrowserContext* context);
  ~WriteQuotaChecker() override;

  // Attempts to take more bytes to write. Returns false if the attempt would
  // exceed the limit.
  bool TakeBytes(const ExtensionId& extension_id, size_t bytes);

  // Puts bytes back to the pool after done with writing.
  void ReturnBytes(const ExtensionId& extension_id, size_t bytes);

 private:
  friend class BrowserContextKeyedAPIFactory<WriteQuotaChecker>;

  // Max pending write bytes.
  size_t bytes_limit_ = 0;

  // Tracked writing bytes per extension.
  std::map<ExtensionId, size_t> bytes_used_map_;
};

}  // namespace extensions

#endif  // EXTENSIONS_BROWSER_API_SOCKET_WRITE_QUOTA_CHECKER_H_