#ifdef UNSAFE_BUFFERS_BUILD
#pragma allow_unsafe_buffers
#endif
#include <stdint.h>
#include <memory>
#include <optional>
#include <utility>
#include "base/feature_list.h"
#include "base/functional/bind.h"
#include "base/functional/callback_helpers.h"
#include "base/memory/raw_ptr.h"
#include "base/strings/utf_string_conversions.h"
#include "base/test/bind.h"
#include "base/test/scoped_feature_list.h"
#include "base/test/test_future.h"
#include "base/time/time.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#include "chrome/browser/browser_features.h"
#include "chrome/browser/history/history_service_factory.h"
#include "chrome/browser/notifications/metrics/mock_notification_metrics_logger.h"
#include "chrome/browser/notifications/metrics/notification_metrics_logger_factory.h"
#include "chrome/browser/notifications/notification_display_service_impl.h"
#include "chrome/browser/notifications/notification_display_service_tester.h"
#include "chrome/browser/notifications/platform_notification_service_factory.h"
#include "chrome/browser/notifications/platform_notification_service_impl.h"
#include "chrome/common/chrome_features.h"
#include "chrome/test/base/testing_profile.h"
#include "components/history/core/browser/history_service.h"
#include "components/history/core/test/test_history_database.h"
#include "components/ukm/test_ukm_recorder.h"
#include "content/public/test/browser_task_environment.h"
#include "extensions/buildflags/buildflags.h"
#include "services/metrics/public/cpp/ukm_builders.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/public/common/notifications/notification_resources.h"
#include "third_party/blink/public/common/notifications/platform_notification_data.h"
#include "third_party/blink/public/mojom/notifications/notification.mojom.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "third_party/skia/include/core/SkColor.h"
#include "ui/gfx/image/image_skia_rep.h"
#include "url/gurl.h"
#if BUILDFLAG(ENABLE_EXTENSIONS)
#include "base/values.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/extensions/test_extension_system.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/common/extension.h"
#include "extensions/common/extension_builder.h"
#endif
#if !BUILDFLAG(IS_ANDROID)
#include "chrome/browser/web_applications/proto/web_app_install_state.pb.h"
#include "chrome/browser/web_applications/test/fake_web_app_provider.h"
#include "chrome/browser/web_applications/test/os_integration_test_override_impl.h"
#include "chrome/browser/web_applications/test/web_app_icon_test_utils.h"
#include "chrome/browser/web_applications/test/web_app_install_test_utils.h"
#include "chrome/browser/web_applications/test/web_app_test_utils.h"
#include "chrome/browser/web_applications/web_app_command_scheduler.h"
#include "chrome/browser/web_applications/web_app_icon_generator.h"
#include "chrome/browser/web_applications/web_app_icon_manager.h"
#include "chrome/browser/web_applications/web_app_install_info.h"
#include "chrome/browser/web_applications/web_app_install_params.h"
#include "chrome/browser/web_applications/web_app_provider.h"
#include "chrome/browser/web_applications/web_app_registrar.h"
#include "components/webapps/browser/install_result_code.h"
#include "components/webapps/browser/installable/installable_metrics.h"
#endif
NotificationResources;
PlatformNotificationData;
NotificationDatabaseData;
Notification;
namespace {
const int kNotificationVibrationPattern[] = …;
const char kNotificationId[] = …;
const char kClosedReason[] = …;
const char kDidReplaceAnotherNotification[] = …;
const char kHasBadge[] = …;
const char kHasImage[] = …;
const char kHasIcon[] = …;
const char kHasRenotify[] = …;
const char kHasTag[] = …;
const char kIsSilent[] = …;
const char kNumActions[] = …;
const char kNumClicks[] = …;
const char kNumActionButtonClicks[] = …;
const char kRequireInteraction[] = …;
const char kTimeUntilCloseMillis[] = …;
const char kTimeUntilFirstClickMillis[] = …;
const char kTimeUntilLastClickMillis[] = …;
}
class PlatformNotificationServiceTest : public testing::Test { … };
TEST_F(PlatformNotificationServiceTest, DisplayNonPersistentThenClose) { … }
TEST_F(PlatformNotificationServiceTest, DisplayPersistentThenClose) { … }
TEST_F(PlatformNotificationServiceTest, DisplayNonPersistentPropertiesMatch) { … }
TEST_F(PlatformNotificationServiceTest, DisplayPersistentPropertiesMatch) { … }
TEST_F(PlatformNotificationServiceTest, RecordNotificationUkmEvent) { … }
TEST_F(PlatformNotificationServiceTest, NextPersistentNotificationId) { … }
#if !BUILDFLAG(IS_ANDROID)
class PlatformNotificationServiceTest_WebApps
: public PlatformNotificationServiceTest { … };
TEST_F(PlatformNotificationServiceTest_WebApps, IncomingCallWebApp) { … }
TEST_F(PlatformNotificationServiceTest_WebApps, CreateNotificationFromData) { … }
TEST_F(PlatformNotificationServiceTest_WebApps, PopulateWebAppId_MatchesScope) { … }
TEST_F(PlatformNotificationServiceTest_WebApps,
PopulateWebAppId_InNestedScope) { … }
TEST_F(PlatformNotificationServiceTest_WebApps, PopulateWebAppId_NotInScope) { … }
#endif
#if BUILDFLAG(ENABLE_EXTENSIONS)
TEST_F(PlatformNotificationServiceTest, DisplayNameForContextMessage) { … }
TEST_F(PlatformNotificationServiceTest, CreateNotificationFromData) { … }
#endif
#if BUILDFLAG(IS_CHROMEOS)
using PlatformNotificationServiceTest_WebAppNotificationIconAndTitle =
PlatformNotificationServiceTest;
TEST_F(PlatformNotificationServiceTest_WebAppNotificationIconAndTitle,
FindWebAppIconAndTitle_NoApp) {
web_app::FakeWebAppProvider* provider =
web_app::FakeWebAppProvider::Get(profile_.get());
provider->Start();
const GURL web_app_url{"https://example.org/"};
EXPECT_FALSE(service()->FindWebAppIconAndTitle(web_app_url).has_value());
}
TEST_F(PlatformNotificationServiceTest_WebAppNotificationIconAndTitle,
FindWebAppIconAndTitle) {
web_app::FakeWebAppProvider* provider =
web_app::FakeWebAppProvider::Get(profile_.get());
web_app::WebAppIconManager& icon_manager = provider->GetIconManager();
std::unique_ptr<web_app::WebApp> web_app = web_app::test::CreateWebApp();
const GURL web_app_url = web_app->start_url();
const webapps::AppId app_id = web_app->app_id();
web_app->SetName("Web App Title");
IconManagerWriteGeneratedIcons(icon_manager, app_id,
{{web_app::IconPurpose::MONOCHROME,
{web_app::icon_size::k16},
{SK_ColorTRANSPARENT}}});
web_app->SetDownloadedIconSizes(web_app::IconPurpose::MONOCHROME,
{web_app::icon_size::k16});
provider->GetRegistrarMutable().registry().emplace(app_id,
std::move(web_app));
base::RunLoop run_loop;
icon_manager.SetFaviconMonochromeReadCallbackForTesting(
base::BindLambdaForTesting(
[&](const webapps::AppId& cached_app_id) { run_loop.Quit(); }));
icon_manager.Start();
run_loop.Run();
provider->Start();
std::optional<PlatformNotificationServiceImpl::WebAppIconAndTitle>
icon_and_title = service()->FindWebAppIconAndTitle(web_app_url);
ASSERT_TRUE(icon_and_title.has_value());
EXPECT_EQ(u"Web App Title", icon_and_title->title);
EXPECT_FALSE(icon_and_title->icon.isNull());
EXPECT_EQ(
SK_ColorTRANSPARENT,
icon_and_title->icon.GetRepresentation(1.0f).GetBitmap().getColor(0, 0));
}
#endif