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

Unified 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 side-by-side diff with in-line comments
Download patch
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);
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
+}
+
+} // namespace extensions

Powered by Google App Engine
This is Rietveld 408576698