// Copyright 2016 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_RENDERER_EVENT_EMITTER_H_ #define EXTENSIONS_RENDERER_EVENT_EMITTER_H_ #include #include "extensions/renderer/api_binding_types.h" #include "gin/wrappable.h" #include "v8/include/v8.h" namespace gin { class Arguments; } namespace extensions { // A gin::Wrappable Event object. One is expected to be created per event, per // context. Note: this object *does not* clear any events, so it must be // destroyed with the context to avoid leaking. class EventEmitter final : public gin::Wrappable { public: using Listeners = std::vector>; using ListenersChangedMethod = base::Callback)>; EventEmitter(const binding::RunJSFunction& run_js, const ListenersChangedMethod& listeners_changed); ~EventEmitter() override; static gin::WrapperInfo kWrapperInfo; // gin::Wrappable: gin::ObjectTemplateBuilder GetObjectTemplateBuilder( v8::Isolate* isolate) final; void Fire(v8::Local context, std::vector>* args); Listeners* listeners() { return &listeners_; } private: // Bound methods for the Event JS object. void AddListener(gin::Arguments* arguments); void RemoveListener(gin::Arguments* arguments); bool HasListener(v8::Local function); bool HasListeners(); void Dispatch(gin::Arguments* arguments); Listeners listeners_; binding::RunJSFunction run_js_; ListenersChangedMethod listeners_changed_; DISALLOW_COPY_AND_ASSIGN(EventEmitter); }; } // namespace extensions #endif // EXTENSIONS_RENDERER_EVENT_EMITTER_H_