blob: ad2f6d8fafa117ca82fb5afbcbd2bca262645b05 [file] [log] [blame]
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/renderer/core/svg/animation/svg_smil_element.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/renderer/core/dom/document.h"
#include "third_party/blink/renderer/core/dom/events/native_event_listener.h"
#include "third_party/blink/renderer/core/testing/dummy_page_holder.h"
namespace blink {
namespace {
Vector<std::pair<SMILTime, SMILTimeOrigin>> ExtractListContents(
const SMILInstanceTimeList& list) {
Vector<std::pair<SMILTime, SMILTimeOrigin>> times;
for (const auto& item : list)
times.push_back(std::make_pair(item.Time(), item.Origin()));
return times;
}
TEST(SMILInstanceTimeListTest, Sort) {
SMILInstanceTimeList list;
list.Append(SMILTime::FromSecondsD(1), SMILTimeOrigin::kAttribute);
list.Append(SMILTime::FromSecondsD(5), SMILTimeOrigin::kAttribute);
list.Append(SMILTime::FromSecondsD(4), SMILTimeOrigin::kAttribute);
list.Append(SMILTime::FromSecondsD(2), SMILTimeOrigin::kAttribute);
list.Append(SMILTime::FromSecondsD(3), SMILTimeOrigin::kAttribute);
ASSERT_EQ(list.size(), 5u);
list.Sort();
Vector<std::pair<SMILTime, SMILTimeOrigin>> expected_times(
{{SMILTime::FromSecondsD(1), SMILTimeOrigin::kAttribute},
{SMILTime::FromSecondsD(2), SMILTimeOrigin::kAttribute},
{SMILTime::FromSecondsD(3), SMILTimeOrigin::kAttribute},
{SMILTime::FromSecondsD(4), SMILTimeOrigin::kAttribute},
{SMILTime::FromSecondsD(5), SMILTimeOrigin::kAttribute}});
ASSERT_EQ(ExtractListContents(list), expected_times);
}
TEST(SMILInstanceTimeListTest, InsertSortedAndUnique) {
SMILInstanceTimeList list;
list.Append(SMILTime::FromSecondsD(1), SMILTimeOrigin::kAttribute);
list.Append(SMILTime::FromSecondsD(2), SMILTimeOrigin::kScript);
list.Append(SMILTime::FromSecondsD(3), SMILTimeOrigin::kAttribute);
ASSERT_EQ(list.size(), 3u);
// Unique time/item.
list.InsertSortedAndUnique(SMILTime::FromSecondsD(4),
SMILTimeOrigin::kScript);
ASSERT_EQ(list.size(), 4u);
Vector<std::pair<SMILTime, SMILTimeOrigin>> expected_times1(
{{SMILTime::FromSecondsD(1), SMILTimeOrigin::kAttribute},
{SMILTime::FromSecondsD(2), SMILTimeOrigin::kScript},
{SMILTime::FromSecondsD(3), SMILTimeOrigin::kAttribute},
{SMILTime::FromSecondsD(4), SMILTimeOrigin::kScript}});
ASSERT_EQ(ExtractListContents(list), expected_times1);
// Non-unique item.
list.InsertSortedAndUnique(SMILTime::FromSecondsD(2),
SMILTimeOrigin::kScript);
ASSERT_EQ(list.size(), 4u);
ASSERT_EQ(ExtractListContents(list), expected_times1);
// Same time but different origin.
list.InsertSortedAndUnique(SMILTime::FromSecondsD(2),
SMILTimeOrigin::kAttribute);
ASSERT_EQ(list.size(), 5u);
Vector<std::pair<SMILTime, SMILTimeOrigin>> expected_times2(
{{SMILTime::FromSecondsD(1), SMILTimeOrigin::kAttribute},
{SMILTime::FromSecondsD(2), SMILTimeOrigin::kAttribute},
{SMILTime::FromSecondsD(2), SMILTimeOrigin::kScript},
{SMILTime::FromSecondsD(3), SMILTimeOrigin::kAttribute},
{SMILTime::FromSecondsD(4), SMILTimeOrigin::kScript}});
ASSERT_EQ(ExtractListContents(list), expected_times2);
}
TEST(SMILInstanceTimeListTest, RemoveWithOrigin) {
SMILInstanceTimeList list;
list.Append(SMILTime::FromSecondsD(1), SMILTimeOrigin::kScript);
list.Append(SMILTime::FromSecondsD(2), SMILTimeOrigin::kAttribute);
list.Append(SMILTime::FromSecondsD(3), SMILTimeOrigin::kAttribute);
list.Append(SMILTime::FromSecondsD(4), SMILTimeOrigin::kScript);
list.Append(SMILTime::FromSecondsD(5), SMILTimeOrigin::kAttribute);
ASSERT_EQ(list.size(), 5u);
list.RemoveWithOrigin(SMILTimeOrigin::kScript);
ASSERT_EQ(list.size(), 3u);
Vector<std::pair<SMILTime, SMILTimeOrigin>> expected_times(
{{SMILTime::FromSecondsD(2), SMILTimeOrigin::kAttribute},
{SMILTime::FromSecondsD(3), SMILTimeOrigin::kAttribute},
{SMILTime::FromSecondsD(5), SMILTimeOrigin::kAttribute}});
ASSERT_EQ(ExtractListContents(list), expected_times);
}
TEST(SMILInstanceTimeListTest, NextAfter) {
SMILInstanceTimeList list;
list.Append(SMILTime::FromSecondsD(1), SMILTimeOrigin::kScript);
list.Append(SMILTime::FromSecondsD(2), SMILTimeOrigin::kAttribute);
list.Append(SMILTime::FromSecondsD(3), SMILTimeOrigin::kAttribute);
list.Append(SMILTime::FromSecondsD(4), SMILTimeOrigin::kScript);
list.Append(SMILTime::FromSecondsD(5), SMILTimeOrigin::kAttribute);
ASSERT_EQ(list.size(), 5u);
// Just before an entry in the list.
EXPECT_EQ(list.NextAfter(SMILTime::FromSecondsD(2) - SMILTime::Epsilon()),
SMILTime::FromSecondsD(2));
// Equal to an entry in the list.
EXPECT_EQ(list.NextAfter(SMILTime::FromSecondsD(2)),
SMILTime::FromSecondsD(3));
// Just after an entry in the list.
EXPECT_EQ(list.NextAfter(SMILTime::FromSecondsD(2) + SMILTime::Epsilon()),
SMILTime::FromSecondsD(3));
// Equal to the last entry in the the list.
EXPECT_EQ(list.NextAfter(SMILTime::FromSecondsD(5)), SMILTime::Unresolved());
// After the last entry in the the list.
EXPECT_EQ(list.NextAfter(SMILTime::FromSecondsD(6)), SMILTime::Unresolved());
}
class EmptyEventListener : public NativeEventListener {
public:
void Invoke(ExecutionContext*, Event*) override {}
};
TEST(SVGSMILElementTest, RepeatNEventListenerUseCounted) {
auto dummy_page_holder = std::make_unique<DummyPageHolder>(IntSize(800, 600));
Document& document = dummy_page_holder->GetDocument();
Page::InsertOrdinaryPageForTesting(&dummy_page_holder->GetPage());
WebFeature feature = WebFeature::kSMILElementHasRepeatNEventListener;
EXPECT_FALSE(document.IsUseCounted(feature));
document.documentElement()->setInnerHTML("<svg><set/></svg>");
Element* set = document.QuerySelector("set");
ASSERT_TRUE(set);
set->addEventListener("repeatn", MakeGarbageCollected<EmptyEventListener>());
EXPECT_TRUE(document.IsUseCounted(feature));
}
} // namespace
} // namespace blink