| Index: third_party/WebKit/Source/core/dom/custom/CustomElementUpgradeSorterTest.cpp
|
| diff --git a/third_party/WebKit/Source/core/dom/custom/CustomElementUpgradeSorterTest.cpp b/third_party/WebKit/Source/core/dom/custom/CustomElementUpgradeSorterTest.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..03d5ffd5b6ccb7b3e871e33d8725b3ec2748936f
|
| --- /dev/null
|
| +++ b/third_party/WebKit/Source/core/dom/custom/CustomElementUpgradeSorterTest.cpp
|
| @@ -0,0 +1,228 @@
|
| +// Copyright 2016 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 "core/dom/custom/CustomElementUpgradeSorter.h"
|
| +
|
| +#include "bindings/core/v8/ExceptionState.h"
|
| +#include "core/HTMLNames.h"
|
| +#include "core/dom/Document.h"
|
| +#include "core/dom/Element.h"
|
| +#include "core/dom/shadow/ShadowRoot.h"
|
| +#include "core/dom/shadow/ShadowRootInit.h"
|
| +#include "core/html/HTMLDocument.h"
|
| +#include "core/testing/DummyPageHolder.h"
|
| +#include "platform/heap/Handle.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +#include "wtf/OwnPtr.h"
|
| +#include "wtf/text/AtomicString.h"
|
| +
|
| +namespace blink {
|
| +
|
| +class CustomElementUpgradeSorterTest : public ::testing::Test {
|
| +public:
|
| + Element* createElementWithId(const char* localName, const char* id)
|
| + {
|
| + NonThrowableExceptionState noExceptions;
|
| + Element* element =
|
| + document()->createElement(localName, AtomicString(), noExceptions);
|
| + element->setAttribute(HTMLNames::idAttr, id);
|
| + return element;
|
| + }
|
| +
|
| + Document* document() { return &m_page->document(); }
|
| +
|
| + ScriptState* scriptState()
|
| + {
|
| + return ScriptState::forMainWorld(&m_page->frame());
|
| + }
|
| +
|
| + ShadowRoot* attachShadowTo(Element* element)
|
| + {
|
| + NonThrowableExceptionState noExceptions;
|
| + ShadowRootInit shadowRootInit;
|
| + return
|
| + element->attachShadow(scriptState(), shadowRootInit, noExceptions);
|
| + }
|
| +
|
| +protected:
|
| + void SetUp() override
|
| + {
|
| + m_page = DummyPageHolder::create(IntSize(1, 1));
|
| + }
|
| +
|
| + void TearDown() override
|
| + {
|
| + m_page = nullptr;
|
| + }
|
| +
|
| +private:
|
| + OwnPtr<DummyPageHolder> m_page;
|
| +};
|
| +
|
| +TEST_F(CustomElementUpgradeSorterTest, inOtherDocument_notInSet)
|
| +{
|
| + NonThrowableExceptionState noExceptions;
|
| + Element* element =
|
| + document()->createElement("a-a", AtomicString(), noExceptions);
|
| +
|
| + Document* otherDocument = HTMLDocument::create();
|
| + otherDocument->appendChild(element);
|
| + EXPECT_EQ(otherDocument, element->ownerDocument())
|
| + << "sanity: another document should have adopted an element on append";
|
| +
|
| + CustomElementUpgradeSorter sorter;
|
| + sorter.add(element);
|
| +
|
| + HeapVector<Member<Element>> elements;
|
| + sorter.sorted(&elements, document());
|
| + EXPECT_EQ(0u, elements.size())
|
| + << "the adopted-away candidate should not have been included";
|
| +}
|
| +
|
| +TEST_F(CustomElementUpgradeSorterTest, oneCandidate)
|
| +{
|
| + NonThrowableExceptionState noExceptions;
|
| + Element* element =
|
| + document()->createElement("a-a", AtomicString(), noExceptions);
|
| + document()->documentElement()->appendChild(element);
|
| +
|
| + CustomElementUpgradeSorter sorter;
|
| + sorter.add(element);
|
| +
|
| + HeapVector<Member<Element>> elements;
|
| + sorter.sorted(&elements, document());
|
| + EXPECT_EQ(1u, elements.size())
|
| + << "exactly one candidate should be in the result set";
|
| + EXPECT_TRUE(elements.contains(element))
|
| + << "the candidate should be the element that was added";
|
| +}
|
| +
|
| +TEST_F(CustomElementUpgradeSorterTest, candidatesInDocumentOrder)
|
| +{
|
| + Element* a = createElementWithId("a-a", "a");
|
| + Element* b = createElementWithId("a-a", "b");
|
| + Element* c = createElementWithId("a-a", "c");
|
| +
|
| + document()->documentElement()->appendChild(a);
|
| + a->appendChild(b);
|
| + document()->documentElement()->appendChild(c);
|
| +
|
| + CustomElementUpgradeSorter sorter;
|
| + sorter.add(b);
|
| + sorter.add(a);
|
| + sorter.add(c);
|
| +
|
| + HeapVector<Member<Element>> elements;
|
| + sorter.sorted(&elements, document());
|
| + EXPECT_EQ(3u, elements.size());
|
| + EXPECT_EQ(a, elements[0].get());
|
| + EXPECT_EQ(b, elements[1].get());
|
| + EXPECT_EQ(c, elements[2].get());
|
| +}
|
| +
|
| +TEST_F(CustomElementUpgradeSorterTest, sorter_ancestorInSet)
|
| +{
|
| + // A*
|
| + // + B
|
| + // + C*
|
| + Element* a = createElementWithId("a-a", "a");
|
| + Element* b = createElementWithId("a-a", "b");
|
| + Element* c = createElementWithId("a-a", "c");
|
| +
|
| + document()->documentElement()->appendChild(a);
|
| + a->appendChild(b);
|
| + b->appendChild(c);
|
| +
|
| + CustomElementUpgradeSorter sort;
|
| + sort.add(c);
|
| + sort.add(a);
|
| +
|
| + HeapVector<Member<Element>> elements;
|
| + sort.sorted(&elements, document());
|
| + EXPECT_EQ(2u, elements.size());
|
| + EXPECT_EQ(a, elements[0].get());
|
| + EXPECT_EQ(c, elements[1].get());
|
| +}
|
| +
|
| +TEST_F(CustomElementUpgradeSorterTest, sorter_deepShallow)
|
| +{
|
| + // A
|
| + // + B*
|
| + // C*
|
| + Element* a = createElementWithId("a-a", "a");
|
| + Element* b = createElementWithId("a-a", "b");
|
| + Element* c = createElementWithId("a-a", "c");
|
| +
|
| + document()->documentElement()->appendChild(a);
|
| + a->appendChild(b);
|
| + document()->documentElement()->appendChild(c);
|
| +
|
| + CustomElementUpgradeSorter sort;
|
| + sort.add(b);
|
| + sort.add(c);
|
| +
|
| + HeapVector<Member<Element>> elements;
|
| + sort.sorted(&elements, document());
|
| + EXPECT_EQ(2u, elements.size());
|
| + EXPECT_EQ(b, elements[0].get());
|
| + EXPECT_EQ(c, elements[1].get());
|
| +}
|
| +
|
| +TEST_F(CustomElementUpgradeSorterTest, sorter_shallowDeep)
|
| +{
|
| + // A*
|
| + // B
|
| + // + C*
|
| + Element* a = createElementWithId("a-a", "a");
|
| + Element* b = createElementWithId("a-a", "b");
|
| + Element* c = createElementWithId("a-a", "c");
|
| +
|
| + document()->documentElement()->appendChild(a);
|
| + document()->documentElement()->appendChild(b);
|
| + b->appendChild(c);
|
| +
|
| + CustomElementUpgradeSorter sort;
|
| + sort.add(a);
|
| + sort.add(c);
|
| +
|
| + HeapVector<Member<Element>> elements;
|
| + sort.sorted(&elements, document());
|
| + EXPECT_EQ(2u, elements.size());
|
| + EXPECT_EQ(a, elements[0].get());
|
| + EXPECT_EQ(c, elements[1].get());
|
| +}
|
| +
|
| +TEST_F(CustomElementUpgradeSorterTest, sorter_shadow)
|
| +{
|
| + // A*
|
| + // + {ShadowRoot}
|
| + // | + B
|
| + // | + C*
|
| + // + D*
|
| + Element* a = createElementWithId("a-a", "a");
|
| + Element* b = createElementWithId("a-a", "b");
|
| + Element* c = createElementWithId("a-a", "c");
|
| + Element* d = createElementWithId("a-a", "d");
|
| +
|
| + document()->documentElement()->appendChild(a);
|
| + ShadowRoot* s = attachShadowTo(a);
|
| + a->appendChild(d);
|
| +
|
| + s->appendChild(b);
|
| + b->appendChild(c);
|
| +
|
| + CustomElementUpgradeSorter sort;
|
| + sort.add(a);
|
| + sort.add(c);
|
| + sort.add(d);
|
| +
|
| + HeapVector<Member<Element>> elements;
|
| + sort.sorted(&elements, document());
|
| + EXPECT_EQ(3u, elements.size());
|
| + EXPECT_EQ(a, elements[0].get());
|
| + EXPECT_EQ(c, elements[1].get());
|
| + EXPECT_EQ(d, elements[2].get());
|
| +}
|
| +
|
| +} // namespace blink
|
|
|