910e62b5创建于 1月15日历史提交
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "ui/message_center/views/message_popup_view.h"

#include <memory>

#include "testing/gmock/include/gmock/gmock.h"
#include "ui/message_center/message_center.h"
#include "ui/message_center/public/cpp/message_center_constants.h"
#include "ui/message_center/public/cpp/notification_types.h"
#include "ui/message_center/views/desktop_message_popup_collection.h"
#include "ui/message_center/views/message_popup_collection.h"
#include "ui/message_center/views/message_view.h"
#include "ui/views/accessibility/view_accessibility.h"
#include "ui/views/test/views_test_base.h"

using message_center::MessageCenter;
using message_center::Notification;

namespace message_center {

namespace {

class MockMessagePopupView;

class TestMessageView : public MessageView {
 public:
  explicit TestMessageView(const Notification& notification)
      : MessageView(notification) {}
  TestMessageView(const TestMessageView&) = delete;
  TestMessageView& operator=(const TestMessageView&) = delete;
  ~TestMessageView() override = default;

  NotificationControlButtonsView* GetControlButtonsView() const override {
    return nullptr;
  }
};

class MockMessagePopupCollection : public DesktopMessagePopupCollection {
 public:
  MockMessagePopupCollection() = default;

  MockMessagePopupCollection(const MockMessagePopupCollection&) = delete;
  MockMessagePopupCollection& operator=(const MockMessagePopupCollection&) =
      delete;

  ~MockMessagePopupCollection() override = default;

  MessagePopupView* CreatePopup(const Notification& notification) override;
};

class MockMessagePopupView : public MessagePopupView {
 public:
  MockMessagePopupView(MockMessagePopupCollection* popup_collection,
                       MessageView* message_view)
      : MessagePopupView(message_view, popup_collection, false) {}

  ~MockMessagePopupView() override = default;

  void Close() override { delete this; }
};

MessagePopupView* MockMessagePopupCollection::CreatePopup(
    const Notification& notification) {
  TestMessageView* message_view = new TestMessageView(notification);
  auto* popup = new MockMessagePopupView(this, message_view);
  return popup;
}

}  // namespace

class MessagePopupViewTest : public views::ViewsTestBase {
 public:
  MessagePopupViewTest() = default;

  MessagePopupViewTest(const MessagePopupViewTest&) = delete;
  MessagePopupViewTest& operator=(const MessagePopupViewTest&) = delete;

  ~MessagePopupViewTest() override = default;

  // Overridden from ViewsTestBase:
  void SetUp() override {
    views::ViewsTestBase::SetUp();
    MessageCenter::Initialize();
    MessageCenter::Get()->DisableTimersForTest();
  }

  void TearDown() override {
    notification_.reset();

    MessageCenter::Get()->RemoveAllNotifications(
        false /* by_user */, MessageCenter::RemoveType::ALL);
    MessageCenter::Shutdown();
    views::ViewsTestBase::TearDown();
  }

 private:
  std::unique_ptr<Notification> notification_ = nullptr;
};

TEST_F(MessagePopupViewTest, AccessibleAttributes) {
  Notification notification(
      NOTIFICATION_TYPE_SIMPLE, "id", u"title", u"message", ui::ImageModel(),
      /*display_source=*/std::u16string(), GURL(), NotifierId(),
      RichNotificationData(), /*delegate=*/nullptr);

  MockMessagePopupCollection popup_collection;
  MessagePopupView* popup = popup_collection.CreatePopup(notification);
  MessageView* message_view = popup->message_view();

  ui::AXNodeData popup_data;
  popup->GetViewAccessibility().GetAccessibleNodeData(&popup_data);
  EXPECT_EQ(popup_data.role, ax::mojom::Role::kAlertDialog);

  ui::AXNodeData message_data;
  message_view->GetViewAccessibility().GetAccessibleNodeData(&message_data);

  EXPECT_FALSE(
      popup_data.GetString16Attribute(ax::mojom::StringAttribute::kName)
          .empty());
  EXPECT_FALSE(
      message_data.GetString16Attribute(ax::mojom::StringAttribute::kName)
          .empty());
  EXPECT_EQ(
      popup_data.GetString16Attribute(ax::mojom::StringAttribute::kName),
      message_data.GetString16Attribute(ax::mojom::StringAttribute::kName));
  EXPECT_EQ(popup_data.GetString16Attribute(
                ax::mojom::StringAttribute::kRoleDescription),
            message_data.GetString16Attribute(
                ax::mojom::StringAttribute::kRoleDescription));

  Notification new_notification(
      NOTIFICATION_TYPE_SIMPLE, "id", u"new title", u"new message",
      ui::ImageModel(), /*display_source=*/std::u16string(), GURL(),
      NotifierId(), RichNotificationData(), /*delegate=*/nullptr);

  popup_data = ui::AXNodeData();
  message_data = ui::AXNodeData();
  message_view->UpdateWithNotification(new_notification);
  popup->GetViewAccessibility().GetAccessibleNodeData(&popup_data);
  message_view->GetViewAccessibility().GetAccessibleNodeData(&message_data);

  EXPECT_EQ(
      popup_data.GetString16Attribute(ax::mojom::StringAttribute::kName),
      message_data.GetString16Attribute(ax::mojom::StringAttribute::kName));

  popup->Close();
}

}  // namespace message_center