910e62b5创建于 1月15日历史提交
// Copyright 2021 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_TEST_TEST_API_OBSERVER_REGISTRY_H_
#define EXTENSIONS_BROWSER_API_TEST_TEST_API_OBSERVER_REGISTRY_H_

#include <string>

#include "base/no_destructor.h"
#include "base/observer_list.h"
#include "extensions/browser/api/test/test_api_observer.h"

namespace base {
class Value;
}

namespace content {
class BrowserContext;
}

namespace extensions {

class TestSendMessageFunction;

class TestApiObserverRegistry {
 public:
  TestApiObserverRegistry(const TestApiObserverRegistry&) = delete;
  TestApiObserverRegistry& operator=(const TestApiObserverRegistry&) = delete;

  // Unfortunately, most existing observers do not specify a BrowserContext for
  // which they intend to listen for events, so we resort to having a global
  // registry. Observers in tests where multiple BrowserContexts exist should
  // check which BrowserContext is associated with an event.
  static TestApiObserverRegistry* GetInstance();

  void NotifyTestPassed(content::BrowserContext* browser_context);
  void NotifyTestFailed(content::BrowserContext* browser_context,
                        const std::string& message);

  // Returns true if one of the TestApiObservers has indicated that it will
  // respond to the message.
  bool NotifyTestMessage(TestSendMessageFunction* function,
                         const std::string& message);

  // Notifies observers of a result sent via sendScriptResult.
  void NotifyScriptResult(const base::Value& result_value);

  void AddObserver(TestApiObserver* observer);
  void RemoveObserver(TestApiObserver* observer);

 private:
  friend class base::NoDestructor<TestApiObserverRegistry>;

  TestApiObserverRegistry();
  ~TestApiObserverRegistry();

  base::ObserverList<TestApiObserver> observers_;
};

}  // namespace extensions

#endif  // EXTENSIONS_BROWSER_API_TEST_TEST_API_OBSERVER_REGISTRY_H_