Index: third_party/WebKit/Source/core/css/AffectedByFocusTest.cpp |
diff --git a/third_party/WebKit/Source/core/css/AffectedByFocusTest.cpp b/third_party/WebKit/Source/core/css/AffectedByFocusTest.cpp |
deleted file mode 100644 |
index 7e3d6bb67ce99580ada6fc42d105c9f34baa081c..0000000000000000000000000000000000000000 |
--- a/third_party/WebKit/Source/core/css/AffectedByFocusTest.cpp |
+++ /dev/null |
@@ -1,353 +0,0 @@ |
-// Copyright 2014 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/HTMLNames.h" |
-#include "core/dom/Document.h" |
-#include "core/dom/Element.h" |
-#include "core/dom/ElementTraversal.h" |
-#include "core/dom/NodeComputedStyle.h" |
-#include "core/dom/StyleEngine.h" |
-#include "core/frame/FrameView.h" |
-#include "core/html/HTMLElement.h" |
-#include "core/testing/DummyPageHolder.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
-#include <memory> |
- |
-namespace blink { |
- |
-using namespace HTMLNames; |
- |
-class AffectedByFocusTest : public ::testing::Test { |
- protected: |
- struct ElementResult { |
- const blink::HTMLQualifiedName tag; |
- bool affected_by; |
- bool children_or_siblings_affected_by; |
- }; |
- |
- void SetUp() override; |
- |
- Document& GetDocument() const { return *document_; } |
- |
- void SetHtmlInnerHTML(const char* html_content); |
- |
- void CheckElements(ElementResult expected[], unsigned expected_count) const; |
- |
- private: |
- std::unique_ptr<DummyPageHolder> dummy_page_holder_; |
- |
- Persistent<Document> document_; |
-}; |
- |
-void AffectedByFocusTest::SetUp() { |
- dummy_page_holder_ = DummyPageHolder::Create(IntSize(800, 600)); |
- document_ = &dummy_page_holder_->GetDocument(); |
- DCHECK(document_); |
-} |
- |
-void AffectedByFocusTest::SetHtmlInnerHTML(const char* html_content) { |
- GetDocument().documentElement()->setInnerHTML(String::FromUTF8(html_content)); |
- GetDocument().View()->UpdateAllLifecyclePhases(); |
-} |
- |
-void AffectedByFocusTest::CheckElements(ElementResult expected[], |
- unsigned expected_count) const { |
- unsigned i = 0; |
- HTMLElement* element = GetDocument().body(); |
- |
- for (; element && i < expected_count; |
- element = Traversal<HTMLElement>::Next(*element), ++i) { |
- ASSERT_TRUE(element->HasTagName(expected[i].tag)); |
- DCHECK(element->GetComputedStyle()); |
- ASSERT_EQ(expected[i].affected_by, |
- element->GetComputedStyle()->AffectedByFocus()); |
- ASSERT_EQ(expected[i].children_or_siblings_affected_by, |
- element->ChildrenOrSiblingsAffectedByFocus()); |
- } |
- |
- DCHECK(!element); |
- DCHECK_EQ(i, expected_count); |
-} |
- |
-// A global :focus rule in html.css currently causes every single element to be |
-// affectedByFocus. Check that all elements in a document with no :focus rules |
-// gets the affectedByFocus set on ComputedStyle and not |
-// childrenOrSiblingsAffectedByFocus. |
-TEST_F(AffectedByFocusTest, UAUniversalFocusRule) { |
- ElementResult expected[] = {{bodyTag, true, false}, |
- {divTag, true, false}, |
- {divTag, true, false}, |
- {divTag, true, false}, |
- {spanTag, true, false}}; |
- |
- SetHtmlInnerHTML( |
- "<body>" |
- "<div><div></div></div>" |
- "<div><span></span></div>" |
- "</body>"); |
- |
- CheckElements(expected, sizeof(expected) / sizeof(ElementResult)); |
-} |
- |
-// ":focus div" will mark ascendants of all divs with |
-// childrenOrSiblingsAffectedByFocus. |
-TEST_F(AffectedByFocusTest, FocusedAscendant) { |
- ElementResult expected[] = {{bodyTag, true, true}, |
- {divTag, true, true}, |
- {divTag, true, false}, |
- {divTag, true, false}, |
- {spanTag, true, false}}; |
- |
- SetHtmlInnerHTML( |
- "<head>" |
- "<style>:focus div { background-color: pink }</style>" |
- "</head>" |
- "<body>" |
- "<div><div></div></div>" |
- "<div><span></span></div>" |
- "</body>"); |
- |
- CheckElements(expected, sizeof(expected) / sizeof(ElementResult)); |
-} |
- |
-// "body:focus div" will mark the body element with |
-// childrenOrSiblingsAffectedByFocus. |
-TEST_F(AffectedByFocusTest, FocusedAscendantWithType) { |
- ElementResult expected[] = {{bodyTag, true, true}, |
- {divTag, true, false}, |
- {divTag, true, false}, |
- {divTag, true, false}, |
- {spanTag, true, false}}; |
- |
- SetHtmlInnerHTML( |
- "<head>" |
- "<style>body:focus div { background-color: pink }</style>" |
- "</head>" |
- "<body>" |
- "<div><div></div></div>" |
- "<div><span></span></div>" |
- "</body>"); |
- |
- CheckElements(expected, sizeof(expected) / sizeof(ElementResult)); |
-} |
- |
-// ":not(body):focus div" should not mark the body element with |
-// childrenOrSiblingsAffectedByFocus. |
-// Note that currently ":focus:not(body)" does not do the same. Then the :focus |
-// is checked and the childrenOrSiblingsAffectedByFocus flag set before the |
-// negated type selector is found. |
-TEST_F(AffectedByFocusTest, FocusedAscendantWithNegatedType) { |
- ElementResult expected[] = {{bodyTag, true, false}, |
- {divTag, true, true}, |
- {divTag, true, false}, |
- {divTag, true, false}, |
- {spanTag, true, false}}; |
- |
- SetHtmlInnerHTML( |
- "<head>" |
- "<style>:not(body):focus div { background-color: pink }</style>" |
- "</head>" |
- "<body>" |
- "<div><div></div></div>" |
- "<div><span></span></div>" |
- "</body>"); |
- |
- CheckElements(expected, sizeof(expected) / sizeof(ElementResult)); |
-} |
- |
-// Checking current behavior for ":focus + div", but this is a BUG or at best |
-// sub-optimal. The focused element will also in this case get |
-// childrenOrSiblingsAffectedByFocus even if it's really a sibling. Effectively, |
-// the whole sub-tree of the focused element will have styles recalculated even |
-// though none of the children are affected. There are other mechanisms that |
-// makes sure the sibling also gets its styles recalculated. |
-TEST_F(AffectedByFocusTest, FocusedSibling) { |
- ElementResult expected[] = {{bodyTag, true, false}, |
- {divTag, true, true}, |
- {spanTag, true, false}, |
- {divTag, true, false}}; |
- |
- SetHtmlInnerHTML( |
- "<head>" |
- "<style>:focus + div { background-color: pink }</style>" |
- "</head>" |
- "<body>" |
- "<div>" |
- " <span></span>" |
- "</div>" |
- "<div></div>" |
- "</body>"); |
- |
- CheckElements(expected, sizeof(expected) / sizeof(ElementResult)); |
-} |
- |
-TEST_F(AffectedByFocusTest, AffectedByFocusUpdate) { |
- // Check that when focussing the outer div in the document below, you only |
- // get a single element style recalc. |
- |
- SetHtmlInnerHTML( |
- "<style>:focus { border: 1px solid lime; }</style>" |
- "<div id=d tabIndex=1>" |
- "<div></div>" |
- "<div></div>" |
- "<div></div>" |
- "<div></div>" |
- "<div></div>" |
- "<div></div>" |
- "<div></div>" |
- "<div></div>" |
- "<div></div>" |
- "<div></div>" |
- "</div>"); |
- |
- GetDocument().View()->UpdateAllLifecyclePhases(); |
- |
- unsigned start_count = GetDocument().GetStyleEngine().StyleForElementCount(); |
- |
- GetDocument().getElementById("d")->focus(); |
- GetDocument().View()->UpdateAllLifecyclePhases(); |
- |
- unsigned element_count = |
- GetDocument().GetStyleEngine().StyleForElementCount() - start_count; |
- |
- ASSERT_EQ(1U, element_count); |
-} |
- |
-TEST_F(AffectedByFocusTest, ChildrenOrSiblingsAffectedByFocusUpdate) { |
- // Check that when focussing the outer div in the document below, you get a |
- // style recalc for the whole subtree. |
- |
- SetHtmlInnerHTML( |
- "<style>:focus div { border: 1px solid lime; }</style>" |
- "<div id=d tabIndex=1>" |
- "<div></div>" |
- "<div></div>" |
- "<div></div>" |
- "<div></div>" |
- "<div></div>" |
- "<div></div>" |
- "<div></div>" |
- "<div></div>" |
- "<div></div>" |
- "<div></div>" |
- "</div>"); |
- |
- GetDocument().View()->UpdateAllLifecyclePhases(); |
- |
- unsigned start_count = GetDocument().GetStyleEngine().StyleForElementCount(); |
- |
- GetDocument().getElementById("d")->focus(); |
- GetDocument().View()->UpdateAllLifecyclePhases(); |
- |
- unsigned element_count = |
- GetDocument().GetStyleEngine().StyleForElementCount() - start_count; |
- |
- ASSERT_EQ(11U, element_count); |
-} |
- |
-TEST_F(AffectedByFocusTest, InvalidationSetFocusUpdate) { |
- // Check that when focussing the outer div in the document below, you get a |
- // style recalc for the outer div and the class=a div only. |
- |
- SetHtmlInnerHTML( |
- "<style>:focus .a { border: 1px solid lime; }</style>" |
- "<div id=d tabIndex=1>" |
- "<div></div>" |
- "<div></div>" |
- "<div></div>" |
- "<div></div>" |
- "<div></div>" |
- "<div></div>" |
- "<div></div>" |
- "<div></div>" |
- "<div></div>" |
- "<div class='a'></div>" |
- "</div>"); |
- |
- GetDocument().View()->UpdateAllLifecyclePhases(); |
- |
- unsigned start_count = GetDocument().GetStyleEngine().StyleForElementCount(); |
- |
- GetDocument().getElementById("d")->focus(); |
- GetDocument().View()->UpdateAllLifecyclePhases(); |
- |
- unsigned element_count = |
- GetDocument().GetStyleEngine().StyleForElementCount() - start_count; |
- |
- ASSERT_EQ(2U, element_count); |
-} |
- |
-TEST_F(AffectedByFocusTest, NoInvalidationSetFocusUpdate) { |
- // Check that when focussing the outer div in the document below, you get a |
- // style recalc for the outer div only. The invalidation set for :focus will |
- // include 'a', but the id=d div should be affectedByFocus, not |
- // childrenOrSiblingsAffectedByFocus. |
- |
- SetHtmlInnerHTML( |
- "<style>#nomatch:focus .a { border: 1px solid lime; }</style>" |
- "<div id=d tabIndex=1>" |
- "<div></div>" |
- "<div></div>" |
- "<div></div>" |
- "<div></div>" |
- "<div></div>" |
- "<div></div>" |
- "<div></div>" |
- "<div></div>" |
- "<div></div>" |
- "<div class='a'></div>" |
- "</div>"); |
- |
- GetDocument().View()->UpdateAllLifecyclePhases(); |
- |
- unsigned start_count = GetDocument().GetStyleEngine().StyleForElementCount(); |
- |
- GetDocument().getElementById("d")->focus(); |
- GetDocument().View()->UpdateAllLifecyclePhases(); |
- |
- unsigned element_count = |
- GetDocument().GetStyleEngine().StyleForElementCount() - start_count; |
- |
- ASSERT_EQ(1U, element_count); |
-} |
- |
-TEST_F(AffectedByFocusTest, FocusWithinCommonAncestor) { |
- // Check that when changing the focus between 2 elements we don't need a style |
- // recalc for all the ancestors affected by ":focus-within". |
- |
- SetHtmlInnerHTML( |
- "<style>div:focus-within { background-color: lime; }</style>" |
- "<div>" |
- " <div>" |
- " <div id=focusme1 tabIndex=1></div>" |
- " <div id=focusme2 tabIndex=2></div>" |
- " <div>" |
- "</div>"); |
- |
- GetDocument().View()->UpdateAllLifecyclePhases(); |
- |
- unsigned start_count = GetDocument().GetStyleEngine().StyleForElementCount(); |
- |
- GetDocument().getElementById("focusme1")->focus(); |
- GetDocument().View()->UpdateAllLifecyclePhases(); |
- |
- unsigned element_count = |
- GetDocument().GetStyleEngine().StyleForElementCount() - start_count; |
- |
- EXPECT_EQ(3U, element_count); |
- |
- start_count += element_count; |
- |
- GetDocument().getElementById("focusme2")->focus(); |
- GetDocument().View()->UpdateAllLifecyclePhases(); |
- |
- element_count = |
- GetDocument().GetStyleEngine().StyleForElementCount() - start_count; |
- |
- // Only "focusme1" & "focusme2" elements need a recalc thanks to the common |
- // ancestor strategy. |
- EXPECT_EQ(2U, element_count); |
-} |
- |
-} // namespace blink |