// Copyright 2015 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 EXTENSIONS_BROWSER_EXTENSION_HOST_OBSERVER_H_
#define EXTENSIONS_BROWSER_EXTENSION_HOST_OBSERVER_H_

#include <stdint.h>

#include <string>

namespace extensions {
class ExtensionHost;

class ExtensionHostObserver {
 public:
  virtual ~ExtensionHostObserver() {}

  // TODO(kalman): Why do these all return const ExtensionHosts? It seems
  // perfectly reasonable for an Observer implementation to mutate any
  // ExtensionHost it's given.

  // Called when an ExtensionHost is destroyed.
  virtual void OnExtensionHostDestroyed(const ExtensionHost* host) {}

  // Called when a message has been disptached to the event page corresponding
  // to |host|.
  virtual void OnBackgroundEventDispatched(const ExtensionHost* host,
                                           const std::string& event_name,
                                           int event_id) {}

  // Called when a previously dispatched message has been acked by the
  // event page for |host|.
  virtual void OnBackgroundEventAcked(const ExtensionHost* host, int event_id) {
  }

  // Called when the extension associated with |host| starts a new network
  // request.
  virtual void OnNetworkRequestStarted(const ExtensionHost* host,
                                       uint64_t request_id) {}

  // Called when the network request with |request_id| is done.
  virtual void OnNetworkRequestDone(const ExtensionHost* host,
                                    uint64_t request_id) {}
};

}  // namespace extensions

#endif /* EXTENSIONS_BROWSER_EXTENSION_HOST_OBSERVER_H_ */
