blob: 7f6dcad1a8eee3df20b6558a9641c2f71c0df1ef [file] [log] [blame]
// Copyright 2019 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.
#ifndef COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_EVENT_HANDLER_H_
#define COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_EVENT_HANDLER_H_
#include <string>
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "components/autofill_assistant/browser/service.pb.h"
#include "components/autofill_assistant/browser/user_model.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
namespace autofill_assistant {
// Receives incoming events and notifies a list of observers.
//
// - It is safe to add/remove observers at any time.
// - Observers are allowed to fire new events, take care to avoid infinite
// loops!
// - This class is NOT thread-safe!
class EventHandler {
public:
// The unique event key consists of the event type and the event source ID.
using EventKey = std::pair<EventProto::KindCase, std::string>;
// Interface for observers of the event handler.
class Observer : public base::CheckedObserver {
public:
virtual void OnEvent(const EventKey& key) = 0;
};
EventHandler();
~EventHandler();
void DispatchEvent(const EventKey& key);
static absl::optional<EventKey> CreateEventKeyFromProto(
const EventProto& proto);
void AddObserver(Observer* observer);
void RemoveObserver(const Observer* observer);
private:
base::ReentrantObserverList<Observer> observers_{
base::ObserverListPolicy::EXISTING_ONLY};
DISALLOW_COPY_AND_ASSIGN(EventHandler);
};
// Intended for debugging.
std::ostream& operator<<(std::ostream& out,
const EventProto::KindCase& event_case);
std::ostream& operator<<(std::ostream& out, const EventHandler::EventKey& key);
} // namespace autofill_assistant
#endif // COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_EVENT_HANDLER_H_