Chromium Code Reviews| Index: chrome/browser/notifications/notification_display_service_proxy.cc |
| diff --git a/chrome/browser/notifications/notification_display_service_proxy.cc b/chrome/browser/notifications/notification_display_service_proxy.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..fb82e7e0aa4e7b4c1ccb3263268b833963ea6794 |
| --- /dev/null |
| +++ b/chrome/browser/notifications/notification_display_service_proxy.cc |
| @@ -0,0 +1,102 @@ |
| +// Copyright 2017 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 "chrome/browser/notifications/notification_display_service_proxy.h" |
| + |
| +#include "base/bind.h" |
| +#include "base/memory/ptr_util.h" |
| +#include "chrome/browser/browser_process.h" |
| +#include "chrome/browser/notifications/message_center_display_service.h" |
| +#include "chrome/browser/notifications/native_notification_display_service.h" |
| +#include "chrome/browser/notifications/notification.h" |
| +#include "chrome/browser/notifications/notification_platform_bridge_linux.h" |
| + |
| +NotificationDisplayServiceProxy::NotificationDisplayServiceProxy( |
| + Profile* profile) |
| + : profile_(profile) { |
| + // TODO(thomasanderson): Add interface to avoid this cast? |
| + auto* npbl = static_cast<NotificationPlatformBridgeLinux*>( |
|
Peter Beverloo
2017/04/19 13:26:41
Here and elsewhere (impls, nds, etc) - Chromium st
Tom (Use chromium acct)
2017/04/20 01:43:46
Done.
|
| + g_browser_process->notification_platform_bridge()); |
| + npbl->IsConnected(base::Bind( |
| + &NotificationDisplayServiceProxy::OnNotificationPlatformBridgeInitialized, |
| + base::Unretained(this))); |
|
Peter Beverloo
2017/04/19 13:26:41
There's two race conditions here:
(1) We can hi
Tom (Use chromium acct)
2017/04/20 01:43:46
Good catch, fixed!
|
| +} |
| + |
| +NotificationDisplayServiceProxy::~NotificationDisplayServiceProxy() = default; |
| + |
| +NotificationDisplayService* |
| +NotificationDisplayServiceProxy::GetNotificationDisplayService() const { |
| + // Can't have both impls at once. |
| + DCHECK(!native_notification_display_service_ || |
| + !message_center_display_service_); |
| + |
| + if (native_notification_display_service_) { |
| + return native_notification_display_service_.get(); |
| + } else if (message_center_display_service_) { |
| + return message_center_display_service_.get(); |
| + } |
| + |
| + return nullptr; |
| +} |
| + |
| +void NotificationDisplayServiceProxy::OnNotificationPlatformBridgeInitialized( |
| + bool success) { |
| + if (success) { |
| + native_notification_display_service_ = |
| + base::MakeUnique<NativeNotificationDisplayService>( |
| + profile_, g_browser_process->notification_platform_bridge()); |
| + } else { |
| + // TODO(thomasanderson): clean up |g_browser_process->notification_bridge_|? |
|
Peter Beverloo
2017/04/19 13:26:41
Can the NPBL just stop its own thread when it iden
Tom (Use chromium acct)
2017/04/20 01:43:46
Done.
|
| + message_center_display_service_ = |
| + base::MakeUnique<MessageCenterDisplayService>( |
| + profile_, g_browser_process->notification_ui_manager()); |
| + } |
| + |
| + NotificationDisplayService* nds = GetNotificationDisplayService(); |
| + while (!actions_.empty()) { |
| + actions_.front().Run(nds); |
| + actions_.pop(); |
| + } |
| +} |
| + |
| +void NotificationDisplayServiceProxy::RunAction( |
| + base::Callback<void(NotificationDisplayService*)> action) { |
| + NotificationDisplayService* nds = GetNotificationDisplayService(); |
| + if (nds) |
| + action.Run(nds); |
| + else |
| + actions_.push(action); |
| +} |
| + |
| +void NotificationDisplayServiceProxy::Display( |
| + NotificationCommon::Type notification_type, |
| + const std::string& notification_id, |
| + const Notification& notification) { |
| + RunAction(base::Bind( |
| + [](NotificationCommon::Type notification_type, |
| + const std::string& notification_id, const Notification& notification, |
| + NotificationDisplayService* nds) { |
| + nds->Display(notification_type, notification_id, notification); |
| + }, |
| + notification_type, notification_id, notification)); |
|
Peter Beverloo
2017/04/19 13:26:41
Instead of this pattern, consider something like:
Tom (Use chromium acct)
2017/04/20 01:43:46
Done.
|
| +} |
| + |
| +void NotificationDisplayServiceProxy::Close( |
| + NotificationCommon::Type notification_type, |
| + const std::string& notification_id) { |
| + RunAction(base::Bind( |
| + [](NotificationCommon::Type notification_type, |
| + const std::string& notification_id, NotificationDisplayService* nds) { |
| + nds->Close(notification_type, notification_id); |
| + }, |
| + notification_type, notification_id)); |
| +} |
| + |
| +void NotificationDisplayServiceProxy::GetDisplayed( |
| + const DisplayedNotificationsCallback& callback) { |
| + RunAction(base::Bind( |
| + [](const DisplayedNotificationsCallback& callback, |
| + NotificationDisplayService* nds) { nds->GetDisplayed(callback); }, |
| + callback)); |
| +} |