// 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 { class APIEventListeners; class EventFilteringInfo; // 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: EventEmitter(bool supports_filters, std::unique_ptr listeners, const binding::RunJSFunction& run_js); ~EventEmitter() override; static gin::WrapperInfo kWrapperInfo; // gin::Wrappable: gin::ObjectTemplateBuilder GetObjectTemplateBuilder( v8::Isolate* isolate) final; void Fire(v8::Local context, std::vector>* args, const EventFilteringInfo* filter); // Removes all listeners and marks this object as invalid so that no more // are added. void Invalidate(v8::Local context); size_t GetNumListeners() const; 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); // Whether or not this object is still valid; false upon context release. // When invalid, no listeners can be added or removed. bool valid_ = true; // Whether the event supports filters. bool supports_filters_ = false; std::unique_ptr listeners_; binding::RunJSFunction run_js_; DISALLOW_COPY_AND_ASSIGN(EventEmitter); }; } // namespace extensions #endif // EXTENSIONS_RENDERER_EVENT_EMITTER_H_