blob: f5df797d2bcf2b3b57016deae3d217f4e7419666 [file] [log] [blame]
// 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