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

Unified Diff: content/browser/notifications/notification_message_filter.cc

Issue 1904163002: Move Web Notifications to use Mojo Base URL: https://chromium.googlesource.com/chromium/src.git@skbitmap-blink
Patch Set: it works \o/ Created 4 years, 8 months 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: content/browser/notifications/notification_message_filter.cc
diff --git a/content/browser/notifications/notification_message_filter.cc b/content/browser/notifications/notification_message_filter.cc
deleted file mode 100644
index 876a89c11e185cb0371b6a4d74294b913f108b19..0000000000000000000000000000000000000000
--- a/content/browser/notifications/notification_message_filter.cc
+++ /dev/null
@@ -1,346 +0,0 @@
-// Copyright 2014 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 "content/browser/notifications/notification_message_filter.h"
-
-#include <utility>
-
-#include "base/callback.h"
-#include "content/browser/bad_message.h"
-#include "content/browser/notifications/page_notification_delegate.h"
-#include "content/browser/notifications/platform_notification_context_impl.h"
-#include "content/common/platform_notification_messages.h"
-#include "content/public/browser/browser_context.h"
-#include "content/public/browser/browser_thread.h"
-#include "content/public/browser/content_browser_client.h"
-#include "content/public/browser/desktop_notification_delegate.h"
-#include "content/public/browser/notification_database_data.h"
-#include "content/public/browser/platform_notification_service.h"
-#include "content/public/browser/render_process_host.h"
-#include "content/public/common/content_client.h"
-#include "third_party/WebKit/public/platform/modules/notifications/WebNotificationConstants.h"
-
-namespace content {
-
-namespace {
-
-const int kMinimumVibrationDurationMs = 1; // 1 millisecond
-const int kMaximumVibrationDurationMs = 10000; // 10 seconds
-
-PlatformNotificationData SanitizeNotificationData(
- const PlatformNotificationData& notification_data) {
- PlatformNotificationData sanitized_data = notification_data;
-
- // Make sure that the vibration values are within reasonable bounds.
- for (int& pattern : sanitized_data.vibration_pattern) {
- pattern = std::min(kMaximumVibrationDurationMs,
- std::max(kMinimumVibrationDurationMs, pattern));
- }
-
- // Ensure there aren't more actions than supported.
- if (sanitized_data.actions.size() > blink::kWebNotificationMaxActions)
- sanitized_data.actions.resize(blink::kWebNotificationMaxActions);
-
- return sanitized_data;
-}
-
-// Returns true when |resources| looks ok, false otherwise.
-bool ValidateNotificationResources(const NotificationResources& resources) {
- if (resources.notification_icon.width() >
- blink::kWebNotificationMaxIconSizePx ||
- resources.notification_icon.height() >
- blink::kWebNotificationMaxIconSizePx) {
- return false;
- }
- if (resources.badge.width() > blink::kWebNotificationMaxBadgeSizePx ||
- resources.badge.height() > blink::kWebNotificationMaxBadgeSizePx) {
- return false;
- }
- for (const auto& action_icon : resources.action_icons) {
- if (action_icon.width() > blink::kWebNotificationMaxActionIconSizePx ||
- action_icon.height() > blink::kWebNotificationMaxActionIconSizePx) {
- return false;
- }
- }
- return true;
-}
-
-} // namespace
-
-NotificationMessageFilter::NotificationMessageFilter(
- int process_id,
- PlatformNotificationContextImpl* notification_context,
- ResourceContext* resource_context,
- BrowserContext* browser_context)
- : BrowserMessageFilter(PlatformNotificationMsgStart),
- process_id_(process_id),
- notification_context_(notification_context),
- resource_context_(resource_context),
- browser_context_(browser_context),
- weak_factory_io_(this) {}
-
-NotificationMessageFilter::~NotificationMessageFilter() {}
-
-void NotificationMessageFilter::DidCloseNotification(int notification_id) {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
-
- close_closures_.erase(notification_id);
-}
-
-void NotificationMessageFilter::OnDestruct() const {
- BrowserThread::DeleteOnIOThread::Destruct(this);
-}
-
-bool NotificationMessageFilter::OnMessageReceived(const IPC::Message& message) {
- bool handled = true;
- IPC_BEGIN_MESSAGE_MAP(NotificationMessageFilter, message)
- IPC_MESSAGE_HANDLER(PlatformNotificationHostMsg_CheckPermission,
- OnCheckNotificationPermission)
- IPC_MESSAGE_HANDLER(PlatformNotificationHostMsg_Show,
- OnShowPlatformNotification)
- IPC_MESSAGE_HANDLER(PlatformNotificationHostMsg_ShowPersistent,
- OnShowPersistentNotification)
- IPC_MESSAGE_HANDLER(PlatformNotificationHostMsg_GetNotifications,
- OnGetNotifications)
- IPC_MESSAGE_HANDLER(PlatformNotificationHostMsg_Close,
- OnClosePlatformNotification)
- IPC_MESSAGE_HANDLER(PlatformNotificationHostMsg_ClosePersistent,
- OnClosePersistentNotification)
- IPC_MESSAGE_UNHANDLED(handled = false)
- IPC_END_MESSAGE_MAP()
-
- return handled;
-}
-
-void NotificationMessageFilter::OverrideThreadForMessage(
- const IPC::Message& message,
- content::BrowserThread::ID* thread) {
- if (message.type() == PlatformNotificationHostMsg_Show::ID ||
- message.type() == PlatformNotificationHostMsg_Close::ID)
- *thread = BrowserThread::UI;
-}
-
-void NotificationMessageFilter::OnCheckNotificationPermission(
- const GURL& origin,
- blink::mojom::PermissionStatus* permission_status) {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
- *permission_status = GetPermissionForOriginOnIO(origin);
-}
-
-void NotificationMessageFilter::OnShowPlatformNotification(
- int notification_id,
- const GURL& origin,
- const PlatformNotificationData& notification_data,
- const NotificationResources& notification_resources) {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
- if (!RenderProcessHost::FromID(process_id_))
- return;
-
- if (!ValidateNotificationResources(notification_resources)) {
- bad_message::ReceivedBadMessage(this, bad_message::NMF_INVALID_ARGUMENT);
- return;
- }
-
- std::unique_ptr<DesktopNotificationDelegate> delegate(
- new PageNotificationDelegate(process_id_, notification_id));
-
- PlatformNotificationService* service =
- GetContentClient()->browser()->GetPlatformNotificationService();
- DCHECK(service);
-
- if (!VerifyNotificationPermissionGranted(service, origin))
- return;
-
- base::Closure close_closure;
- service->DisplayNotification(
- browser_context_, origin, SanitizeNotificationData(notification_data),
- notification_resources, std::move(delegate), &close_closure);
-
- if (!close_closure.is_null())
- close_closures_[notification_id] = close_closure;
-}
-
-void NotificationMessageFilter::OnShowPersistentNotification(
- int request_id,
- int64_t service_worker_registration_id,
- const GURL& origin,
- const PlatformNotificationData& notification_data,
- const NotificationResources& notification_resources) {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
- if (GetPermissionForOriginOnIO(origin) !=
- blink::mojom::PermissionStatus::GRANTED) {
- bad_message::ReceivedBadMessage(this, bad_message::NMF_NO_PERMISSION_SHOW);
- return;
- }
-
- if (!ValidateNotificationResources(notification_resources)) {
- bad_message::ReceivedBadMessage(this, bad_message::NMF_INVALID_ARGUMENT);
- return;
- }
-
- NotificationDatabaseData database_data;
- database_data.origin = origin;
- database_data.service_worker_registration_id = service_worker_registration_id;
-
- PlatformNotificationData sanitized_notification_data =
- SanitizeNotificationData(notification_data);
- database_data.notification_data = sanitized_notification_data;
-
- // TODO(peter): Significantly reduce the amount of information we need to
- // retain outside of the database for displaying notifications.
- notification_context_->WriteNotificationData(
- origin, database_data,
- base::Bind(&NotificationMessageFilter::DidWritePersistentNotificationData,
- weak_factory_io_.GetWeakPtr(), request_id, origin,
- sanitized_notification_data, notification_resources));
-}
-
-void NotificationMessageFilter::DidWritePersistentNotificationData(
- int request_id,
- const GURL& origin,
- const PlatformNotificationData& notification_data,
- const NotificationResources& notification_resources,
- bool success,
- int64_t persistent_notification_id) {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
- if (success) {
- PlatformNotificationService* service =
- GetContentClient()->browser()->GetPlatformNotificationService();
- DCHECK(service);
-
- BrowserThread::PostTask(
- BrowserThread::UI, FROM_HERE,
- base::Bind(&PlatformNotificationService::DisplayPersistentNotification,
- base::Unretained(service), // The service is a singleton.
- browser_context_, persistent_notification_id, origin,
- notification_data, notification_resources));
- }
-
- Send(new PlatformNotificationMsg_DidShowPersistent(request_id, success));
-}
-
-void NotificationMessageFilter::OnGetNotifications(
- int request_id,
- int64_t service_worker_registration_id,
- const GURL& origin,
- const std::string& filter_tag) {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
- if (GetPermissionForOriginOnIO(origin) !=
- blink::mojom::PermissionStatus::GRANTED) {
- // No permission has been granted for the given origin. It is harmless to
- // try to get notifications without permission, so return an empty vector
- // indicating that no (accessible) notifications exist at this time.
- Send(new PlatformNotificationMsg_DidGetNotifications(
- request_id, std::vector<PersistentNotificationInfo>()));
- return;
- }
-
- notification_context_->ReadAllNotificationDataForServiceWorkerRegistration(
- origin, service_worker_registration_id,
- base::Bind(&NotificationMessageFilter::DidGetNotifications,
- weak_factory_io_.GetWeakPtr(), request_id, filter_tag));
-}
-
-void NotificationMessageFilter::DidGetNotifications(
- int request_id,
- const std::string& filter_tag,
- bool success,
- const std::vector<NotificationDatabaseData>& notifications) {
- std::vector<PersistentNotificationInfo> persistent_notifications;
- for (const NotificationDatabaseData& database_data : notifications) {
- if (!filter_tag.empty()) {
- const std::string& tag = database_data.notification_data.tag;
- if (tag != filter_tag)
- continue;
- }
-
- persistent_notifications.push_back(std::make_pair(
- database_data.notification_id, database_data.notification_data));
- }
-
- Send(new PlatformNotificationMsg_DidGetNotifications(
- request_id, persistent_notifications));
-}
-
-void NotificationMessageFilter::OnClosePlatformNotification(
- int notification_id) {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
- if (!RenderProcessHost::FromID(process_id_))
- return;
-
- if (!close_closures_.count(notification_id))
- return;
-
- close_closures_[notification_id].Run();
- close_closures_.erase(notification_id);
-}
-
-void NotificationMessageFilter::OnClosePersistentNotification(
- const GURL& origin,
- int64_t persistent_notification_id) {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
- if (GetPermissionForOriginOnIO(origin) !=
- blink::mojom::PermissionStatus::GRANTED) {
- bad_message::ReceivedBadMessage(this, bad_message::NMF_NO_PERMISSION_CLOSE);
- return;
- }
-
- PlatformNotificationService* service =
- GetContentClient()->browser()->GetPlatformNotificationService();
- DCHECK(service);
-
- // There's no point in waiting until the database data has been removed before
- // closing the notification presented to the user. Post that task immediately.
- BrowserThread::PostTask(
- BrowserThread::UI, FROM_HERE,
- base::Bind(&PlatformNotificationService::ClosePersistentNotification,
- base::Unretained(service), // The service is a singleton.
- browser_context_, persistent_notification_id));
-
- notification_context_->DeleteNotificationData(
- persistent_notification_id, origin,
- base::Bind(
- &NotificationMessageFilter::DidDeletePersistentNotificationData,
- weak_factory_io_.GetWeakPtr()));
-}
-
-void NotificationMessageFilter::DidDeletePersistentNotificationData(
- bool success) {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
- // TODO(peter): Consider feeding back to the renderer that the notification
- // has been closed.
-}
-
-blink::mojom::PermissionStatus
-NotificationMessageFilter::GetPermissionForOriginOnIO(
- const GURL& origin) const {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
- PlatformNotificationService* service =
- GetContentClient()->browser()->GetPlatformNotificationService();
- if (!service)
- return blink::mojom::PermissionStatus::DENIED;
-
- return service->CheckPermissionOnIOThread(resource_context_, origin,
- process_id_);
-}
-
-bool NotificationMessageFilter::VerifyNotificationPermissionGranted(
- PlatformNotificationService* service,
- const GURL& origin) {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
-
- blink::mojom::PermissionStatus permission_status =
- service->CheckPermissionOnUIThread(browser_context_, origin, process_id_);
-
- if (permission_status == blink::mojom::PermissionStatus::GRANTED)
- return true;
-
- bad_message::ReceivedBadMessage(this, bad_message::NMF_NO_PERMISSION_VERIFY);
- return false;
-}
-
-} // namespace content

Powered by Google App Engine
This is Rietveld 408576698