blob: fe054ef0c1f1b523b39230d4fb3c5648eb24f5cc [file] [log] [blame]
peter679ad3482015-05-07 12:06:471// 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#ifndef CHROME_BROWSER_PUSH_MESSAGING_PUSH_MESSAGING_NOTIFICATION_MANAGER_H_
6#define CHROME_BROWSER_PUSH_MESSAGING_PUSH_MESSAGING_NOTIFICATION_MANAGER_H_
7
8#include <stdint.h>
9#include <vector>
10
11#include "base/callback_forward.h"
mvanouwerkerk0035b7a2015-11-23 15:07:3812#include "base/gtest_prod_util.h"
peter679ad3482015-05-07 12:06:4713#include "base/macros.h"
14#include "base/memory/weak_ptr.h"
Peter Beverlooafb1ab42018-08-20 13:03:4515#include "chrome/browser/push_messaging/budget_database.h"
peter679ad3482015-05-07 12:06:4716
Azeem Arshadf3f1bf82019-01-25 01:20:1417#if defined(OS_CHROMEOS)
18#include "chrome/browser/chromeos/android_sms/android_sms_app_manager.h"
19#include "chromeos/services/multidevice_setup/public/cpp/multidevice_setup_client.h"
20#endif
21
peter679ad3482015-05-07 12:06:4722class GURL;
23class Profile;
24
25namespace content {
26struct NotificationDatabaseData;
mvanouwerkerk0035b7a2015-11-23 15:07:3827class WebContents;
Richard Knollca55419a2019-03-22 15:41:2728} // namespace content
Han Leon96d6b6e8c22018-09-06 06:21:0629
peter679ad3482015-05-07 12:06:4730// Developers may be required to display a Web Notification in response to an
31// incoming push message in order to clarify to the user that something has
32// happened in the background. When they forget to do so, a default notification
33// has to be displayed on their behalf.
34//
35// This class implements the heuristics for determining whether the default
36// notification is necessary, as well as the functionality of displaying the
37// default notification when it is.
38//
39// See the following document and bug for more context:
40// https://docs.google.com/document/d/13VxFdLJbMwxHrvnpDm8RXnU41W2ZlcP0mdWWe9zXQT8/edit
41// https://crbug.com/437277
42class PushMessagingNotificationManager {
43 public:
44 explicit PushMessagingNotificationManager(Profile* profile);
45 ~PushMessagingNotificationManager();
46
47 // Enforces the requirements implied for push subscriptions which must display
48 // a Web Notification in response to an incoming message.
49 void EnforceUserVisibleOnlyRequirements(
mvanouwerkerk90698562015-11-19 20:20:2550 const GURL& origin,
peter679ad3482015-05-07 12:06:4751 int64_t service_worker_registration_id,
Richard Knollc6383592019-01-28 18:06:5852 base::OnceClosure message_handled_closure);
peter679ad3482015-05-07 12:06:4753
54 private:
mvanouwerkerk0035b7a2015-11-23 15:07:3855 FRIEND_TEST_ALL_PREFIXES(PushMessagingNotificationManagerTest, IsTabVisible);
peter2d356322016-02-03 13:09:2356 FRIEND_TEST_ALL_PREFIXES(PushMessagingNotificationManagerTest,
57 IsTabVisibleViewSource);
Azeem Arshadf3f1bf82019-01-25 01:20:1458 FRIEND_TEST_ALL_PREFIXES(
59 PushMessagingNotificationManagerTest,
60 SkipEnforceUserVisibleOnlyRequirementsForAndroidMessages);
mvanouwerkerk0035b7a2015-11-23 15:07:3861
peter679ad3482015-05-07 12:06:4762 void DidGetNotificationsFromDatabase(
mvanouwerkerk90698562015-11-19 20:20:2563 const GURL& origin,
peter679ad3482015-05-07 12:06:4764 int64_t service_worker_registration_id,
Richard Knollc6383592019-01-28 18:06:5865 base::OnceClosure message_handled_closure,
peter679ad3482015-05-07 12:06:4766 bool success,
67 const std::vector<content::NotificationDatabaseData>& data);
68
mvanouwerkerk0035b7a2015-11-23 15:07:3869 // Checks whether |profile| is the one owning this instance,
70 // |active_web_contents| exists and its main frame is visible, and the URL
71 // currently visible to the user is for |origin|.
72 bool IsTabVisible(Profile* profile,
73 content::WebContents* active_web_contents,
74 const GURL& origin);
75
harkness6f6b41432016-09-08 09:17:2876 void ProcessSilentPush(const GURL& origin,
77 int64_t service_worker_registration_id,
Richard Knollc6383592019-01-28 18:06:5878 base::OnceClosure message_handled_closure,
harkness6f6b41432016-09-08 09:17:2879 bool silent_push_allowed);
peter679ad3482015-05-07 12:06:4780
Richard Knollca55419a2019-03-22 15:41:2781 void DidWriteNotificationData(base::OnceClosure message_handled_closure,
82 bool success,
83 const std::string& notification_id);
peter679ad3482015-05-07 12:06:4784
Azeem Arshadf3f1bf82019-01-25 01:20:1485#if defined(OS_CHROMEOS)
86 bool ShouldSkipUserVisibleOnlyRequirements(const GURL& origin);
87
88 void SetTestMultiDeviceSetupClient(
89 chromeos::multidevice_setup::MultiDeviceSetupClient*
90 multidevice_setup_client);
91
92 void SetTestAndroidSmsAppManager(
93 chromeos::android_sms::AndroidSmsAppManager* android_sms_app_manager);
94#endif
95
peter679ad3482015-05-07 12:06:4796 // Weak. This manager is owned by a keyed service on this profile.
97 Profile* profile_;
98
Peter Beverlooafb1ab42018-08-20 13:03:4599 BudgetDatabase budget_database_;
100
Azeem Arshadf3f1bf82019-01-25 01:20:14101#if defined(OS_CHROMEOS)
102 chromeos::multidevice_setup::MultiDeviceSetupClient*
103 test_multidevice_setup_client_ = nullptr;
104
105 chromeos::android_sms::AndroidSmsAppManager* test_android_sms_app_manager_ =
106 nullptr;
107#endif
108
peter679ad3482015-05-07 12:06:47109 base::WeakPtrFactory<PushMessagingNotificationManager> weak_factory_;
110
111 DISALLOW_COPY_AND_ASSIGN(PushMessagingNotificationManager);
112};
113
114#endif // CHROME_BROWSER_PUSH_MESSAGING_PUSH_MESSAGING_NOTIFICATION_MANAGER_H_