| Index: extensions/browser/api/display_source/display_source_event_router.cc
|
| diff --git a/extensions/browser/api/display_source/display_source_event_router.cc b/extensions/browser/api/display_source/display_source_event_router.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..a15ae204f3593923361a3d2cba8feee344cf6166
|
| --- /dev/null
|
| +++ b/extensions/browser/api/display_source/display_source_event_router.cc
|
| @@ -0,0 +1,129 @@
|
| +// 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.
|
| +
|
| +#include "extensions/browser/api/display_source/display_source_event_router.h"
|
| +
|
| +#include "content/public/browser/browser_context.h"
|
| +#include "extensions/browser/api/display_source/display_source_api.h"
|
| +#include "extensions/browser/api/display_source/display_source_connection_delegate.h"
|
| +#include "extensions/browser/api/display_source/display_source_connection_delegate_factory.h"
|
| +#include "extensions/common/api/display_source.h"
|
| +
|
| +namespace extensions {
|
| +
|
| +class DisplaySourceEventRouterImpl
|
| + : public DisplaySourceEventRouter,
|
| + public DisplaySourceConnectionDelegate::Observer {
|
| + public:
|
| + explicit DisplaySourceEventRouterImpl(
|
| + content::BrowserContext* browser_context);
|
| + ~DisplaySourceEventRouterImpl() override;
|
| +
|
| + protected:
|
| + // KeyedService overrides:
|
| + void Shutdown() override;
|
| +
|
| + // EventRouter::Observer overrides:
|
| + void OnListenerAdded(const EventListenerInfo& details) override;
|
| + void OnListenerRemoved(const EventListenerInfo& details) override;
|
| +
|
| + // DisplaySourceConnectionDelegate::Observer overrides:
|
| + void OnSinksUpdated(const DisplaySourceSinkInfoList& sinks) override;
|
| +
|
| + private:
|
| + void StartOrStopListeningForSinksChanges();
|
| +
|
| + content::BrowserContext* browser_context_;
|
| + bool listening_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(DisplaySourceEventRouterImpl);
|
| +};
|
| +
|
| +DisplaySourceEventRouterImpl::DisplaySourceEventRouterImpl(
|
| + content::BrowserContext* browser_context)
|
| + : browser_context_(browser_context), listening_(false) {
|
| + EventRouter* event_router = EventRouter::Get(browser_context_);
|
| + if (!event_router)
|
| + return;
|
| + event_router->RegisterObserver(
|
| + this, api::display_source::OnSinksUpdated::kEventName);
|
| +}
|
| +
|
| +DisplaySourceEventRouterImpl::~DisplaySourceEventRouterImpl() {
|
| + DCHECK(!listening_);
|
| +}
|
| +
|
| +void DisplaySourceEventRouterImpl::Shutdown() {
|
| + EventRouter* event_router = EventRouter::Get(browser_context_);
|
| + if (event_router)
|
| + event_router->UnregisterObserver(this);
|
| +
|
| + if (!listening_)
|
| + return;
|
| + listening_ = false;
|
| + DisplaySourceConnectionDelegate* delegate =
|
| + DisplaySourceConnectionDelegateFactory::GetForBrowserContext(
|
| + browser_context_);
|
| + if (delegate)
|
| + delegate->RemoveObserver(this);
|
| +}
|
| +
|
| +void DisplaySourceEventRouterImpl::OnListenerAdded(
|
| + const EventListenerInfo& details) {
|
| + StartOrStopListeningForSinksChanges();
|
| +}
|
| +
|
| +void DisplaySourceEventRouterImpl::OnListenerRemoved(
|
| + const EventListenerInfo& details) {
|
| + StartOrStopListeningForSinksChanges();
|
| +}
|
| +
|
| +void DisplaySourceEventRouterImpl::StartOrStopListeningForSinksChanges() {
|
| + EventRouter* event_router = EventRouter::Get(browser_context_);
|
| + if (!event_router)
|
| + return;
|
| +
|
| + bool should_listen = event_router->HasEventListener(
|
| + api::display_source::OnSinksUpdated::kEventName);
|
| + if (should_listen && !listening_) {
|
| + DisplaySourceConnectionDelegate* delegate =
|
| + DisplaySourceConnectionDelegateFactory::GetForBrowserContext(
|
| + browser_context_);
|
| + if (delegate) {
|
| + delegate->AddObserver(this);
|
| + delegate->StartWatchingSinks();
|
| + }
|
| + }
|
| + if (!should_listen && listening_) {
|
| + DisplaySourceConnectionDelegate* delegate =
|
| + DisplaySourceConnectionDelegateFactory::GetForBrowserContext(
|
| + browser_context_);
|
| + if (delegate) {
|
| + delegate->RemoveObserver(this);
|
| + delegate->StopWatchingSinks();
|
| + }
|
| + }
|
| +
|
| + listening_ = should_listen;
|
| +}
|
| +
|
| +void DisplaySourceEventRouterImpl::OnSinksUpdated(
|
| + const DisplaySourceSinkInfoList& sinks) {
|
| + EventRouter* event_router = EventRouter::Get(browser_context_);
|
| + if (!event_router)
|
| + return;
|
| + scoped_ptr<base::ListValue> args(
|
| + api::display_source::OnSinksUpdated::Create(sinks));
|
| + scoped_ptr<Event> sinks_updated_event(
|
| + new Event(events::DISPLAY_SOURCE_ON_SINKS_UPDATED,
|
| + api::display_source::OnSinksUpdated::kEventName, args.Pass()));
|
| + event_router->BroadcastEvent(sinks_updated_event.Pass());
|
| +}
|
| +
|
| +DisplaySourceEventRouter* DisplaySourceEventRouter::Create(
|
| + content::BrowserContext* browser_context) {
|
| + return new DisplaySourceEventRouterImpl(browser_context);
|
| +}
|
| +
|
| +} // namespace extensions
|
|
|