Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "extensions/browser/api/display_source/display_source_event_router.h" | |
| 6 | |
| 7 #include "content/public/browser/browser_context.h" | |
| 8 #include "extensions/browser/api/display_source/display_source_api.h" | |
| 9 #include "extensions/browser/api/display_source/display_source_connection_delega te.h" | |
| 10 #include "extensions/browser/api/display_source/display_source_connection_delega te_factory.h" | |
| 11 #include "extensions/common/api/display_source.h" | |
| 12 | |
| 13 namespace extensions { | |
| 14 | |
| 15 class DisplaySourceEventRouterImpl | |
| 16 : public DisplaySourceEventRouter, | |
| 17 public DisplaySourceConnectionDelegate::Observer { | |
| 18 public: | |
| 19 explicit DisplaySourceEventRouterImpl( | |
| 20 content::BrowserContext* browser_context); | |
| 21 ~DisplaySourceEventRouterImpl() override; | |
| 22 | |
| 23 protected: | |
| 24 // KeyedService overrides: | |
| 25 void Shutdown() override; | |
| 26 | |
| 27 // EventRouter::Observer overrides: | |
| 28 void OnListenerAdded(const EventListenerInfo& details) override; | |
| 29 void OnListenerRemoved(const EventListenerInfo& details) override; | |
| 30 | |
| 31 // DisplaySourceConnectionDelegate::Observer overrides: | |
| 32 void OnSinksUpdated(const DisplaySourceSinkInfoList& sinks) override; | |
| 33 | |
| 34 private: | |
| 35 void StartOrStopListeningForSinksChanges(); | |
| 36 | |
| 37 content::BrowserContext* browser_context_; | |
| 38 bool listening_; | |
| 39 | |
| 40 DISALLOW_COPY_AND_ASSIGN(DisplaySourceEventRouterImpl); | |
| 41 }; | |
| 42 | |
| 43 DisplaySourceEventRouterImpl::DisplaySourceEventRouterImpl( | |
| 44 content::BrowserContext* browser_context) | |
| 45 : browser_context_(browser_context), listening_(false) { | |
| 46 EventRouter* event_router = EventRouter::Get(browser_context_); | |
| 47 if (!event_router) | |
| 48 return; | |
| 49 event_router->RegisterObserver( | |
| 50 this, api::display_source::OnSinksUpdated::kEventName); | |
| 51 } | |
| 52 | |
| 53 DisplaySourceEventRouterImpl::~DisplaySourceEventRouterImpl() { | |
| 54 DCHECK(!listening_); | |
| 55 } | |
| 56 | |
| 57 void DisplaySourceEventRouterImpl::Shutdown() { | |
| 58 EventRouter* event_router = EventRouter::Get(browser_context_); | |
| 59 if (event_router) | |
| 60 event_router->UnregisterObserver(this); | |
| 61 | |
| 62 if (!listening_) | |
| 63 return; | |
| 64 listening_ = false; | |
| 65 DisplaySourceConnectionDelegate* delegate = | |
| 66 DisplaySourceConnectionDelegateFactory::GetForBrowserContext( | |
| 67 browser_context_); | |
| 68 if (delegate) | |
| 69 delegate->RemoveObserver(this); | |
| 70 } | |
| 71 | |
| 72 void DisplaySourceEventRouterImpl::OnListenerAdded( | |
| 73 const EventListenerInfo& details) { | |
| 74 StartOrStopListeningForSinksChanges(); | |
| 75 } | |
| 76 | |
| 77 void DisplaySourceEventRouterImpl::OnListenerRemoved( | |
| 78 const EventListenerInfo& details) { | |
| 79 StartOrStopListeningForSinksChanges(); | |
| 80 } | |
| 81 | |
| 82 void DisplaySourceEventRouterImpl::StartOrStopListeningForSinksChanges() { | |
| 83 EventRouter* event_router = EventRouter::Get(browser_context_); | |
| 84 if (!event_router) | |
| 85 return; | |
| 86 | |
| 87 bool should_listen = event_router->HasEventListener( | |
| 88 api::display_source::OnSinksUpdated::kEventName); | |
| 89 if (should_listen && !listening_) { | |
| 90 DisplaySourceConnectionDelegate* delegate = | |
| 91 DisplaySourceConnectionDelegateFactory::GetForBrowserContext( | |
| 92 browser_context_); | |
| 93 if (delegate) { | |
| 94 delegate->AddObserver(this); | |
| 95 delegate->StartWatchingSinks(); | |
| 96 } | |
| 97 } | |
| 98 if (!should_listen && listening_) { | |
| 99 DisplaySourceConnectionDelegate* delegate = | |
| 100 DisplaySourceConnectionDelegateFactory::GetForBrowserContext( | |
| 101 browser_context_); | |
| 102 if (delegate) { | |
| 103 delegate->RemoveObserver(this); | |
| 104 delegate->StopWatchingSinks(); | |
| 105 } | |
| 106 } | |
| 107 | |
| 108 listening_ = should_listen; | |
| 109 } | |
| 110 | |
| 111 void DisplaySourceEventRouterImpl::OnSinksUpdated( | |
| 112 const DisplaySourceSinkInfoList& sinks) { | |
| 113 EventRouter* event_router = EventRouter::Get(browser_context_); | |
| 114 if (!event_router) | |
| 115 return; | |
| 116 scoped_ptr<base::ListValue> args( | |
| 117 api::display_source::OnSinksUpdated::Create(sinks)); | |
| 118 scoped_ptr<Event> sinks_updated_event( | |
| 119 new Event(events::DISPLAY_SOURCE_ON_SINKS_UPDATED, | |
| 120 api::display_source::OnSinksUpdated::kEventName, args.Pass())); | |
| 121 event_router->BroadcastEvent(sinks_updated_event.Pass()); | |
| 122 } | |
| 123 | |
| 124 DisplaySourceEventRouter* DisplaySourceEventRouter::Create( | |
| 125 content::BrowserContext* browser_context) { | |
| 126 return new DisplaySourceEventRouterImpl(browser_context); | |
|
asargent_no_longer_on_chrome
2015/11/17 00:51:56
Do we need to have the fancy extra indirection of
Mikhail
2015/11/17 14:07:42
It just hides out the implementation details, but
| |
| 127 } | |
| 128 | |
| 129 } // namespace extensions | |
| OLD | NEW |