#ifdef UNSAFE_BUFFERS_BUILD
#pragma allow_unsafe_buffers
#endif
#include <stddef.h>
#include <stdint.h>
#include <map>
#include <memory>
#include <string>
#include "base/barrier_closure.h"
#include "base/base64url.h"
#include "base/command_line.h"
#include "base/functional/bind.h"
#include "base/memory/raw_ptr.h"
#include "base/run_loop.h"
#include "base/strings/utf_string_conversions.h"
#include "base/test/bind.h"
#include "base/test/metrics/histogram_tester.h"
#include "base/test/scoped_feature_list.h"
#include "build/build_config.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/browsing_data/chrome_browsing_data_remover_constants.h"
#include "chrome/browser/content_settings/cookie_settings_factory.h"
#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
#include "chrome/browser/gcm/gcm_profile_service_factory.h"
#include "chrome/browser/gcm/instance_id/instance_id_profile_service_factory.h"
#include "chrome/browser/notifications/notification_display_service_tester.h"
#include "chrome/browser/notifications/notification_handler.h"
#include "chrome/browser/permissions/crowd_deny_fake_safe_browsing_database_manager.h"
#include "chrome/browser/permissions/crowd_deny_preload_data.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/push_messaging/push_messaging_app_identifier.h"
#include "chrome/browser/push_messaging/push_messaging_constants.h"
#include "chrome/browser/push_messaging/push_messaging_features.h"
#include "chrome/browser/push_messaging/push_messaging_service_factory.h"
#include "chrome/browser/push_messaging/push_messaging_service_impl.h"
#include "chrome/browser/push_messaging/push_messaging_utils.h"
#include "chrome/browser/safe_browsing/test_safe_browsing_service.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/common/buildflags.h"
#include "chrome/common/channel_info.h"
#include "chrome/common/chrome_features.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "components/browsing_data/content/browsing_data_helper.h"
#include "components/content_settings/core/browser/cookie_settings.h"
#include "components/content_settings/core/browser/host_content_settings_map.h"
#include "components/content_settings/core/common/content_settings.h"
#include "components/content_settings/core/common/content_settings_types.h"
#include "components/gcm_driver/common/gcm_message.h"
#include "components/gcm_driver/fake_gcm_profile_service.h"
#include "components/gcm_driver/gcm_client.h"
#include "components/gcm_driver/instance_id/fake_gcm_driver_for_instance_id.h"
#include "components/gcm_driver/instance_id/instance_id_driver.h"
#include "components/gcm_driver/instance_id/instance_id_profile_service.h"
#include "components/keep_alive_registry/keep_alive_registry.h"
#include "components/keep_alive_registry/keep_alive_types.h"
#include "components/network_session_configurator/common/network_switches.h"
#include "components/permissions/permission_request_manager.h"
#include "components/site_engagement/content/site_engagement_score.h"
#include "components/site_engagement/content/site_engagement_service.h"
#include "content/public/browser/browsing_data_remover.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/content_features.h"
#include "content/public/common/content_switches.h"
#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/browsing_data_remover_test_util.h"
#include "content/public/test/prerender_test_util.h"
#include "content/public/test/test_utils.h"
#include "net/base/features.h"
#include "net/dns/mock_host_resolver.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "third_party/blink/public/mojom/push_messaging/push_messaging.mojom.h"
#include "third_party/blink/public/mojom/push_messaging/push_messaging_status.mojom.h"
#include "ui/base/window_open_disposition.h"
#include "ui/message_center/public/cpp/notification.h"
#if BUILDFLAG(ENABLE_BACKGROUND_MODE)
#include "chrome/browser/background/background_mode_manager.h"
#endif
namespace {
const char kManifestSenderId[] = …;
const int32_t kApplicationServerKeyLength = …;
enum class PushSubscriptionKeyFormat { … };
const uint8_t kApplicationServerKey[kApplicationServerKeyLength] = …;
const char kEncodedApplicationServerKey[] = …;
const char* kIncognitoWarningPattern = …;
std::string GetTestApplicationServerKey(bool base64_url_encoded = false) { … }
void LegacyRegisterCallback(base::OnceClosure done_callback,
std::string* out_registration_id,
gcm::GCMClient::Result* out_result,
const std::string& registration_id,
gcm::GCMClient::Result result) { … }
void DidRegister(base::OnceClosure done_callback,
const std::string& registration_id,
const GURL& endpoint,
const std::optional<base::Time>& expiration_time,
const std::vector<uint8_t>& p256dh,
const std::vector<uint8_t>& auth,
blink::mojom::PushRegistrationStatus status) { … }
void InstanceIDResultCallback(base::OnceClosure done_callback,
instance_id::InstanceID::Result* out_result,
instance_id::InstanceID::Result result) { … }
}
class PushMessagingBrowserTestBase : public InProcessBrowserTest { … };
void PushMessagingBrowserTestBase::RequestAndAcceptPermission() { … }
void PushMessagingBrowserTestBase::RequestAndDenyPermission() { … }
void PushMessagingBrowserTestBase::SubscribeSuccessfully(
PushSubscriptionKeyFormat key_format,
std::string* out_token) { … }
void PushMessagingBrowserTestBase::SetupOrphanedPushSubscription(
std::string* out_app_id) { … }
void PushMessagingBrowserTestBase::LegacySubscribeSuccessfully(
std::string* out_subscription_id) { … }
void PushMessagingBrowserTestBase::EndpointToToken(const std::string& endpoint,
bool standard_protocol,
std::string* out_token) { … }
PushMessagingAppIdentifier
PushMessagingBrowserTestBase::GetAppIdentifierForServiceWorkerRegistration(
int64_t service_worker_registration_id) { … }
void PushMessagingBrowserTestBase::DeleteInstanceIDAsIfGCMStoreReset(
const std::string& app_id) { … }
void PushMessagingBrowserTestBase::SendMessageAndWaitUntilHandled(
const PushMessagingAppIdentifier& app_identifier,
const gcm::IncomingMessage& message) { … }
class PushMessagingBrowserTest : public PushMessagingBrowserTestBase { … };
class PushMessagingPartitionedBrowserTest
: public PushMessagingBrowserTest,
public testing::WithParamInterface<bool> { … };
INSTANTIATE_TEST_SUITE_P(…);
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest,
SubscribeWithoutKeySuccessNotificationsGranted) { … }
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest,
SubscribeSuccessNotificationsGranted) { … }
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest,
SubscribeSuccessNotificationsGrantedWithBase64URLKey) { … }
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest,
SubscribeSuccessNotificationsPrompt) { … }
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest,
SubscribeFailureNotificationsBlocked) { … }
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, SubscribeFailureNoManifest) { … }
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, SubscribeFailureNoSenderId) { … }
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest,
RegisterFailureEmptyPushSubscriptionOptions) { … }
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, SubscribeWithInvalidation) { … }
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, SubscribeWorker) { … }
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest,
SubscribeWorkerWithBase64URLEncodedString) { … }
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest,
ResubscribeWithoutKeyAfterSubscribingWithKeyInManifest) { … }
IN_PROC_BROWSER_TEST_F(
PushMessagingBrowserTest,
ResubscribeWithoutKeyAfterSubscribingFromDocumentWithP256Key) { … }
IN_PROC_BROWSER_TEST_F(
PushMessagingBrowserTest,
ResubscribeWithoutKeyAfterSubscribingFromWorkerWithP256Key) { … }
IN_PROC_BROWSER_TEST_F(
PushMessagingBrowserTest,
ResubscribeWithoutKeyAfterSubscribingFromDocumentWithNumber) { … }
IN_PROC_BROWSER_TEST_F(
PushMessagingBrowserTest,
ResubscribeWithoutKeyAfterSubscribingFromWorkerWithNumber) { … }
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, ResubscribeWithMismatchedKey) { … }
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, SubscribePersisted) { … }
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, AppHandlerOnlyIfSubscribed) { … }
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, PushEventSuccess) { … }
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, PushEventOnShutdown) { … }
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, PushEventWithoutPayload) { … }
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, LegacyPushEvent) { … }
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, PushEventNoServiceWorker) { … }
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, NoSubscription) { … }
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, PushEventWithoutPermission) { … }
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest,
PushEventEnforcesUserVisibleNotification) { … }
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest,
PushEventAllowSilentPushCommandLineFlag) { … }
class PushMessagingBrowserTestWithAbusiveOriginPermissionRevocation
: public PushMessagingBrowserTestBase { … };
IN_PROC_BROWSER_TEST_F(
PushMessagingBrowserTestWithAbusiveOriginPermissionRevocation,
PushEventPermissionRevoked) { … }
IN_PROC_BROWSER_TEST_F(
PushMessagingBrowserTestWithAbusiveOriginPermissionRevocation,
OriginIsNotOnSafeBrowsingBlockingList) { … }
class PushMessagingBrowserTestWithNotificationTriggersEnabled
: public PushMessagingBrowserTestBase { … };
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTestWithNotificationTriggersEnabled,
PushEventIgnoresScheduledNotificationsForEnforcement) { … }
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest,
PushEventEnforcesUserVisibleNotificationAfterQueue) { … }
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest,
PushEventNotificationWithoutEventWaitUntil) { … }
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, PermissionStateSaysPrompt) { … }
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, PermissionStateSaysGranted) { … }
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, PermissionStateSaysDenied) { … }
IN_PROC_BROWSER_TEST_P(PushMessagingPartitionedBrowserTest, CrossOriginFrame) { … }
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, UnsubscribeSuccess) { … }
#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
#define MAYBE_LegacyUnsubscribeSuccess …
#else
#define MAYBE_LegacyUnsubscribeSuccess …
#endif
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest,
MAYBE_LegacyUnsubscribeSuccess) { … }
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, UnsubscribeOffline) { … }
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest,
UnregisteringServiceWorkerUnsubscribes) { … }
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest,
ServiceWorkerDatabaseDeletionUnsubscribes) { … }
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest,
InvalidGetSubscriptionUnsubscribes) { … }
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest,
GlobalResetPushPermissionUnsubscribes) { … }
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest,
LocalResetPushPermissionUnsubscribes) { … }
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest,
DenyPushPermissionUnsubscribes) { … }
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest,
GlobalResetNotificationsPermissionUnsubscribes) { … }
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest,
LocalResetNotificationsPermissionUnsubscribes) { … }
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest,
DenyNotificationsPermissionUnsubscribes) { … }
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest,
GrantAlreadyGrantedPermissionDoesNotUnsubscribe) { … }
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest,
AutomaticUnsubscriptionFollowsContentSettingRules) { … }
IN_PROC_BROWSER_TEST_F(
PushMessagingBrowserTest,
ResetPushPermissionAfterClearingSiteDataUnderLegacyConditions) { … }
IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, EncryptionKeyUniqueness) { … }
class PushMessagingIncognitoBrowserTest : public PushMessagingBrowserTestBase { … };
IN_PROC_BROWSER_TEST_F(PushMessagingIncognitoBrowserTest,
IncognitoGetSubscriptionDoesNotHang) { … }
IN_PROC_BROWSER_TEST_F(PushMessagingIncognitoBrowserTest, WarningToCorrectRFH) { … }
IN_PROC_BROWSER_TEST_F(PushMessagingIncognitoBrowserTest,
DISABLED_WarningToCorrectRFH_Prerender) { … }
class PushMessagingDisallowSenderIdsBrowserTest
: public PushMessagingBrowserTestBase { … };
IN_PROC_BROWSER_TEST_F(PushMessagingDisallowSenderIdsBrowserTest,
SubscriptionWithSenderIdFails) { … }
class PushSubscriptionWithExpirationTimeTest
: public PushMessagingBrowserTestBase { … };
bool PushSubscriptionWithExpirationTimeTest::IsExpirationTimeValid(
const std::string& expiration_time) { … }
IN_PROC_BROWSER_TEST_F(PushSubscriptionWithExpirationTimeTest,
SubscribeGetSubscriptionWithExpirationTime) { … }
IN_PROC_BROWSER_TEST_F(PushSubscriptionWithExpirationTimeTest,
GetSubscriptionWithExpirationTime) { … }
class PushSubscriptionWithoutExpirationTimeTest
: public PushMessagingBrowserTestBase { … };
IN_PROC_BROWSER_TEST_F(PushSubscriptionWithoutExpirationTimeTest,
SubscribeDocumentExpirationTimeNull) { … }
class PushSubscriptionChangeEventTest : public PushMessagingBrowserTestBase { … };
IN_PROC_BROWSER_TEST_F(PushSubscriptionChangeEventTest,
PushSubscriptionChangeEventSuccess) { … }
IN_PROC_BROWSER_TEST_F(PushSubscriptionChangeEventTest,
FiredAfterPermissionRevoked) { … }
IN_PROC_BROWSER_TEST_F(PushSubscriptionChangeEventTest, OnInvalidation) { … }