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 |