blob: 626d82a4881c6cac6b142cbb6f80b71a586db1c4 [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;
peter679ad3482015-05-07 12:06:4728}
29
Han Leon96d6b6e8c22018-09-06 06:21:0630namespace blink {
31struct PlatformNotificationData;
32}
33
peter679ad3482015-05-07 12:06:4734// Developers may be required to display a Web Notification in response to an
35// incoming push message in order to clarify to the user that something has
36// happened in the background. When they forget to do so, a default notification
37// has to be displayed on their behalf.
38//
39// This class implements the heuristics for determining whether the default
40// notification is necessary, as well as the functionality of displaying the
41// default notification when it is.
42//
43// See the following document and bug for more context:
44// https://docs.google.com/document/d/13VxFdLJbMwxHrvnpDm8RXnU41W2ZlcP0mdWWe9zXQT8/edit
45// https://crbug.com/437277
46class PushMessagingNotificationManager {
47 public:
48 explicit PushMessagingNotificationManager(Profile* profile);
49 ~PushMessagingNotificationManager();
50
51 // Enforces the requirements implied for push subscriptions which must display
52 // a Web Notification in response to an incoming message.
53 void EnforceUserVisibleOnlyRequirements(
mvanouwerkerk90698562015-11-19 20:20:2554 const GURL& origin,
peter679ad3482015-05-07 12:06:4755 int64_t service_worker_registration_id,
Richard Knollc6383592019-01-28 18:06:5856 base::OnceClosure message_handled_closure);
peter679ad3482015-05-07 12:06:4757
58 private:
mvanouwerkerk0035b7a2015-11-23 15:07:3859 FRIEND_TEST_ALL_PREFIXES(PushMessagingNotificationManagerTest, IsTabVisible);
peter2d356322016-02-03 13:09:2360 FRIEND_TEST_ALL_PREFIXES(PushMessagingNotificationManagerTest,
61 IsTabVisibleViewSource);
Azeem Arshadf3f1bf82019-01-25 01:20:1462 FRIEND_TEST_ALL_PREFIXES(
63 PushMessagingNotificationManagerTest,
64 SkipEnforceUserVisibleOnlyRequirementsForAndroidMessages);
mvanouwerkerk0035b7a2015-11-23 15:07:3865
peter679ad3482015-05-07 12:06:4766 void DidGetNotificationsFromDatabase(
mvanouwerkerk90698562015-11-19 20:20:2567 const GURL& origin,
peter679ad3482015-05-07 12:06:4768 int64_t service_worker_registration_id,
Richard Knollc6383592019-01-28 18:06:5869 base::OnceClosure message_handled_closure,
peter679ad3482015-05-07 12:06:4770 bool success,
71 const std::vector<content::NotificationDatabaseData>& data);
72
mvanouwerkerk0035b7a2015-11-23 15:07:3873 // Checks whether |profile| is the one owning this instance,
74 // |active_web_contents| exists and its main frame is visible, and the URL
75 // currently visible to the user is for |origin|.
76 bool IsTabVisible(Profile* profile,
77 content::WebContents* active_web_contents,
78 const GURL& origin);
79
harkness6f6b41432016-09-08 09:17:2880 void ProcessSilentPush(const GURL& origin,
81 int64_t service_worker_registration_id,
Richard Knollc6383592019-01-28 18:06:5882 base::OnceClosure message_handled_closure,
harkness6f6b41432016-09-08 09:17:2883 bool silent_push_allowed);
peter679ad3482015-05-07 12:06:4784
peter679ad3482015-05-07 12:06:4785 void DidWriteNotificationData(
mvanouwerkerk90698562015-11-19 20:20:2586 const GURL& origin,
Han Leon96d6b6e8c22018-09-06 06:21:0687 const blink::PlatformNotificationData& notification_data,
Richard Knollc6383592019-01-28 18:06:5888 base::OnceClosure message_handled_closure,
peter679ad3482015-05-07 12:06:4789 bool success,
peterc45944c32016-09-13 14:35:5990 const std::string& notification_id);
peter679ad3482015-05-07 12:06:4791
Azeem Arshadf3f1bf82019-01-25 01:20:1492#if defined(OS_CHROMEOS)
93 bool ShouldSkipUserVisibleOnlyRequirements(const GURL& origin);
94
95 void SetTestMultiDeviceSetupClient(
96 chromeos::multidevice_setup::MultiDeviceSetupClient*
97 multidevice_setup_client);
98
99 void SetTestAndroidSmsAppManager(
100 chromeos::android_sms::AndroidSmsAppManager* android_sms_app_manager);
101#endif
102
peter679ad3482015-05-07 12:06:47103 // Weak. This manager is owned by a keyed service on this profile.
104 Profile* profile_;
105
Peter Beverlooafb1ab42018-08-20 13:03:45106 BudgetDatabase budget_database_;
107
Azeem Arshadf3f1bf82019-01-25 01:20:14108#if defined(OS_CHROMEOS)
109 chromeos::multidevice_setup::MultiDeviceSetupClient*
110 test_multidevice_setup_client_ = nullptr;
111
112 chromeos::android_sms::AndroidSmsAppManager* test_android_sms_app_manager_ =
113 nullptr;
114#endif
115
peter679ad3482015-05-07 12:06:47116 base::WeakPtrFactory<PushMessagingNotificationManager> weak_factory_;
117
118 DISALLOW_COPY_AND_ASSIGN(PushMessagingNotificationManager);
119};
120
121#endif // CHROME_BROWSER_PUSH_MESSAGING_PUSH_MESSAGING_NOTIFICATION_MANAGER_H_