Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(469)

Unified Diff: third_party/WebKit/Source/core/css/AffectedByFocusTest.cpp

Issue 2850743003: Stop matching scrollbar pseudo element without a scrollbar. (Closed)
Patch Set: Added unit test. Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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
« no previous file with comments | « third_party/WebKit/Source/core/BUILD.gn ('k') | third_party/WebKit/Source/core/css/AffectedByPseudoTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698