| // 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/layout/LayoutTheme.h" |
| |
| #include "core/dom/Document.h" |
| #include "core/dom/NodeComputedStyle.h" |
| #include "core/frame/FrameView.h" |
| #include "core/html/HTMLElement.h" |
| #include "core/page/FocusController.h" |
| #include "core/page/Page.h" |
| #include "core/style/ComputedStyle.h" |
| #include "core/testing/DummyPageHolder.h" |
| #include "platform/graphics/Color.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include <memory> |
| |
| namespace blink { |
| |
| class LayoutThemeTest : public ::testing::Test { |
| protected: |
| void SetUp() override; |
| Document& document() const { return *m_document; } |
| void setHtmlInnerHTML(const char* htmlContent); |
| |
| private: |
| std::unique_ptr<DummyPageHolder> m_dummyPageHolder; |
| Persistent<Document> m_document; |
| }; |
| |
| void LayoutThemeTest::SetUp() |
| { |
| m_dummyPageHolder = DummyPageHolder::create(IntSize(800, 600)); |
| m_document = &m_dummyPageHolder->document(); |
| ASSERT(m_document); |
| } |
| |
| void LayoutThemeTest::setHtmlInnerHTML(const char* htmlContent) |
| { |
| document().documentElement()->setInnerHTML(String::fromUTF8(htmlContent), ASSERT_NO_EXCEPTION); |
| document().view()->updateAllLifecyclePhases(); |
| } |
| |
| inline Color outlineColor(Element* element) |
| { |
| return element->computedStyle()->visitedDependentColor(CSSPropertyOutlineColor); |
| } |
| |
| inline EBorderStyle outlineStyle(Element* element) |
| { |
| return element->computedStyle()->outlineStyle(); |
| } |
| |
| TEST_F(LayoutThemeTest, ChangeFocusRingColor) |
| { |
| setHtmlInnerHTML("<span id=span tabIndex=0>Span</span>"); |
| |
| Element* span = document().getElementById(AtomicString("span")); |
| EXPECT_NE(nullptr, span); |
| EXPECT_NE(nullptr, span->layoutObject()); |
| |
| Color customColor = makeRGB(123, 145, 167); |
| |
| // Checking unfocused style. |
| EXPECT_EQ(BorderStyleNone, outlineStyle(span)); |
| EXPECT_NE(customColor, outlineColor(span)); |
| |
| // Do focus. |
| document().page()->focusController().setActive(true); |
| document().page()->focusController().setFocused(true); |
| span->focus(); |
| document().view()->updateAllLifecyclePhases(); |
| |
| // Checking focused style. |
| EXPECT_NE(BorderStyleNone, outlineStyle(span)); |
| EXPECT_NE(customColor, outlineColor(span)); |
| |
| // Change focus ring color. |
| LayoutTheme::theme().setCustomFocusRingColor(customColor); |
| Page::platformColorsChanged(); |
| document().view()->updateAllLifecyclePhases(); |
| |
| // Check that the focus ring color is updated. |
| EXPECT_NE(BorderStyleNone, outlineStyle(span)); |
| EXPECT_EQ(customColor, outlineColor(span)); |
| } |
| |
| TEST_F(LayoutThemeTest, FormatMediaTime) |
| { |
| struct { |
| bool newUi; |
| float time; |
| float duration; |
| String expectedResult; |
| } tests[] = { |
| {false, 1, 1, "0:01" }, |
| {false, 1, 15, "0:01" }, |
| {false, 1, 600, "00:01" }, |
| {false, 1, 3600, "0:00:01"}, |
| {false, 1, 7200, "0:00:01"}, |
| {false, 15, 15, "0:15" }, |
| {false, 15, 600, "00:15" }, |
| {false, 15, 3600, "0:00:15"}, |
| {false, 15, 7200, "0:00:15"}, |
| {false, 600, 600, "10:00" }, |
| {false, 600, 3600, "0:10:00"}, |
| {false, 600, 7200, "0:10:00"}, |
| {false, 3600, 3600, "1:00:00"}, |
| {false, 3600, 7200, "1:00:00"}, |
| {false, 7200, 7200, "2:00:00"}, |
| |
| {true, 1, 1, "0:01" }, |
| {true, 1, 15, "0:01" }, |
| {true, 1, 600, "0:01" }, |
| {true, 1, 3600, "00:01" }, |
| {true, 1, 7200, "000:01" }, |
| {true, 15, 15, "0:15" }, |
| {true, 15, 600, "0:15" }, |
| {true, 15, 3600, "00:15" }, |
| {true, 15, 7200, "000:15" }, |
| {true, 600, 600, "10:00" }, |
| {true, 600, 3600, "10:00" }, |
| {true, 600, 7200, "010:00" }, |
| {true, 3600, 3600, "60:00" }, |
| {true, 3600, 7200, "060:00" }, |
| {true, 7200, 7200, "120:00" }, |
| }; |
| |
| const bool newUi = RuntimeEnabledFeatures::newMediaPlaybackUiEnabled(); |
| |
| for (const auto& testcase : tests) { |
| RuntimeEnabledFeatures::setNewMediaPlaybackUiEnabled(testcase.newUi); |
| EXPECT_EQ(testcase.expectedResult, |
| LayoutTheme::theme().formatMediaControlsCurrentTime(testcase.time, testcase.duration)); |
| } |
| RuntimeEnabledFeatures::setNewMediaPlaybackUiEnabled(newUi); |
| } |
| |
| } // namespace blink |