#include "fuchsia_web/webinstance_host/fuchsia_web_debug_proxy.h"
#include <lib/fidl/cpp/binding.h>
#include "base/check.h"
#include "base/containers/flat_set.h"
#include "base/containers/unique_ptr_adapters.h"
#include "base/fuchsia/fuchsia_logging.h"
#include "base/logging.h"
namespace {
class PerContextListenerProxy final
: public fuchsia::web::DevToolsPerContextListener {
public:
PerContextListenerProxy(
fidl::InterfaceRequest<fuchsia::web::DevToolsPerContextListener> request,
const fidl::InterfacePtrSet<fuchsia::web::DevToolsListener>& clients)
: binding_(this, std::move(request)) {
for (const auto& client : clients.ptrs()) {
fidl::InterfaceHandle<fuchsia::web::DevToolsPerContextListener> handle;
(*client)->OnContextDevToolsAvailable(handle.NewRequest());
auto ptr = std::make_unique<
fidl::InterfacePtr<fuchsia::web::DevToolsPerContextListener>>(
handle.Bind());
ptr->set_error_handler([this, client = ptr.get()](zx_status_t status) {
ZX_LOG_IF(ERROR, status != ZX_ERR_PEER_CLOSED, status);
clients_.erase(client);
if (clients_.empty())
delete this;
});
clients_.insert(std::move(ptr));
}
binding_.set_error_handler([this](zx_status_t status) {
ZX_LOG_IF(ERROR, status != ZX_ERR_PEER_CLOSED, status);
delete this;
});
}
~PerContextListenerProxy() override = default;
void OnHttpPortOpen(uint16_t port) override {
for (const auto& client : clients_) {
(*client)->OnHttpPortOpen(port);
}
}
private:
fidl::Binding<fuchsia::web::DevToolsPerContextListener> binding_;
base::flat_set<std::unique_ptr<fidl::InterfacePtr<
fuchsia::web::DevToolsPerContextListener>>,
base::UniquePtrComparator>
clients_;
};
}
FuchsiaWebDebugProxy::FuchsiaWebDebugProxy() = default;
FuchsiaWebDebugProxy::~FuchsiaWebDebugProxy() = default;
void FuchsiaWebDebugProxy::EnableDevTools(
fidl::InterfaceHandle<fuchsia::web::DevToolsListener> listener,
EnableDevToolsCallback callback) {
devtools_listeners_.AddInterfacePtr(listener.Bind());
callback();
}
void FuchsiaWebDebugProxy::RegisterInstance(
fidl::InterfaceHandle<fuchsia::web::Debug> debug) {
DCHECK(has_clients());
fidl::InterfaceHandle<fuchsia::web::DevToolsListener> handle;
instance_bindings_.AddBinding(this, handle.NewRequest());
debug.Bind()->EnableDevTools(std::move(handle), {});
}
void FuchsiaWebDebugProxy::OnContextDevToolsAvailable(
fidl::InterfaceRequest<fuchsia::web::DevToolsPerContextListener> request) {
new PerContextListenerProxy(std::move(request), devtools_listeners_);
}