Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(403)

Side by Side Diff: extensions/browser/api/display_source/display_source_event_router.cc

Issue 1410093008: Introduce chrome.displaySource API (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Comments from Antony Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698