#ifndef CHROME_RENDERER_ACTOR_JOURNAL_H_
#define CHROME_RENDERER_ACTOR_JOURNAL_H_
#include "base/memory/safe_ref.h"
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
#include "base/types/pass_key.h"
#include "chrome/common/actor.mojom.h"
#include "chrome/common/actor/task_id.h"
#include "mojo/public/cpp/bindings/associated_remote.h"
#include "mojo/public/cpp/bindings/pending_associated_remote.h"
namespace actor {
class Journal {
public:
Journal();
~Journal();
class PendingAsyncEntry {
public:
PendingAsyncEntry(base::PassKey<Journal>,
base::SafeRef<Journal> journal,
TaskId task_id,
std::string_view event_name);
~PendingAsyncEntry();
void EndEntry(std::vector<mojom::JournalDetailsPtr> details);
void Log(std::string_view event_name);
void Log(std::string_view event_name,
std::vector<mojom::JournalDetailsPtr> details);
private:
base::PassKey<Journal> pass_key_;
bool terminated_ = false;
base::SafeRef<Journal> journal_;
TaskId task_id_;
std::string event_name_;
};
void Bind(mojo::PendingAssociatedRemote<mojom::JournalClient> client);
void Log(TaskId task_id,
std::string_view event,
std::vector<mojom::JournalDetailsPtr> details);
std::unique_ptr<PendingAsyncEntry> CreatePendingAsyncEntry(
TaskId task_id,
std::string_view event_name,
std::vector<mojom::JournalDetailsPtr> details);
void AddEndEvent(base::PassKey<Journal>,
TaskId task_id,
const std::string& event_name,
std::vector<mojom::JournalDetailsPtr> details);
void SendLogBuffer();
private:
void AddJournalEntry(mojom::JournalEntryPtr journal_entry);
mojo::AssociatedRemote<mojom::JournalClient> client_;
std::vector<mojom::JournalEntryPtr> log_buffer_;
base::TimeTicks last_log_buffer_send_;
base::WeakPtrFactory<Journal> weak_factory_{this};
};
}
#endif