RenderTheme does not need to be per-page
https://bugs.webkit.org/show_bug.cgi?id=172116
<rdar://problem/30426457>
Reviewed by Zalan Bujtas.
There are no implementations of RenderTheme::themeForPage that actually care about the page.
It can be replaced with a singleton, simplifying a bunch of code.
* Modules/mediacontrols/MediaControlsHost.cpp:
(WebCore::MediaControlsHost::shadowRootCSSText):
(WebCore::MediaControlsHost::base64StringForIconNameAndType):
* css/CSSDefaultStyleSheets.cpp:
(WebCore::CSSDefaultStyleSheets::loadFullDefaultStyle):
(WebCore::CSSDefaultStyleSheets::ensureDefaultStyleSheetsForElement):
Fix a potential crash if we get here when page is null (though it doesn't appear to repro on trunk).
* css/StyleColor.cpp:
(WebCore::StyleColor::colorFromKeyword):
* css/StyleResolver.cpp:
(WebCore::StyleResolver::adjustRenderStyle):
* css/parser/CSSParser.cpp:
(WebCore::CSSParser::parseSystemColor):
* css/parser/CSSParser.h:
* css/parser/CSSPropertyParser.cpp:
(WebCore::CSSPropertyParser::consumeSystemFont):
* editing/FrameSelection.cpp:
(WebCore::FrameSelection::updateAppearance):
* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::ensureMediaControlsInjectedScript):
* html/HTMLMeterElement.cpp:
(WebCore::HTMLMeterElement::createElementRenderer):
* html/HTMLSelectElement.cpp:
(WebCore::HTMLSelectElement::usesMenuList):
(WebCore::HTMLSelectElement::platformHandleKeydownEvent):
(WebCore::HTMLSelectElement::menuListDefaultEventHandler):
* html/HTMLTextFormControlElement.cpp:
(WebCore::HTMLTextFormControlElement::adjustInnerTextStyle):
* html/InputType.cpp:
(WebCore::InputType::themeSupportsDataListUI):
* html/TextFieldInputType.cpp:
(WebCore::TextFieldInputType::shouldHaveSpinButton):
(WebCore::TextFieldInputType::shouldHaveCapsLockIndicator):
* html/canvas/CanvasRenderingContext2D.cpp:
(WebCore::CanvasRenderingContext2D::setStrokeColor):
(WebCore::CanvasRenderingContext2D::setFillColor):
* html/canvas/CanvasStyle.cpp:
(WebCore::parseColor):
(WebCore::parseColorOrCurrentColor):
(WebCore::CanvasStyle::createFromString):
* html/canvas/CanvasStyle.h:
* html/shadow/MediaControlElements.cpp:
(WebCore::MediaControlPanelElement::startTimer):
(WebCore::MediaControlPanelElement::makeOpaque):
(WebCore::MediaControlPanelElement::makeTransparent):
* html/shadow/MediaControls.cpp:
(WebCore::MediaControls::reset):
(WebCore::MediaControls::reportedError):
(WebCore::MediaControls::updateCurrentTimeDisplay):
* html/shadow/mac/ImageControlsButtonElementMac.cpp:
(WebCore::ImageControlsButtonElementMac::tryCreate):
* page/MemoryRelease.cpp:
(WebCore::releaseNoncriticalMemory):
* page/Page.cpp:
(WebCore::Page::Page):
* page/Page.h:
(WebCore::Page::theme): Deleted.
* platform/wpe/RenderThemeWPE.cpp:
(WebCore::RenderTheme::singleton):
(WebCore::RenderTheme::themeForPage): Deleted.
* rendering/RenderEmbeddedObject.cpp:
(WebCore::RenderEmbeddedObject::getReplacementTextGeometry):
* rendering/RenderObject.cpp:
(WebCore::RenderObject::theme):
* rendering/RenderTheme.cpp:
(WebCore::RenderTheme::focusRingColor):
* rendering/RenderTheme.h:
(WebCore::RenderTheme::defaultTheme): Deleted.
* rendering/RenderThemeGtk.cpp:
(WebCore::RenderTheme::singleton):
(WebCore::RenderTheme::themeForPage): Deleted.
* rendering/RenderThemeIOS.mm:
(WebCore::RenderTheme::singleton):
(WebCore::RenderTheme::themeForPage): Deleted.
* rendering/RenderThemeMac.mm:
(WebCore::RenderTheme::singleton):
(WebCore::RenderTheme::themeForPage): Deleted.
* rendering/RenderThemeWin.cpp:
(WebCore::RenderTheme::singleton):
(WebCore::RenderTheme::themeForPage): Deleted.
* rendering/TextPaintStyle.cpp:
(WebCore::computeTextPaintStyle):
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@216902 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog
index 1182ea2..84d1e4c 100644
--- a/Source/WebCore/ChangeLog
+++ b/Source/WebCore/ChangeLog
@@ -1,3 +1,99 @@
+2017-05-15 Antti Koivisto <antti@apple.com>
+
+ RenderTheme does not need to be per-page
+ https://bugs.webkit.org/show_bug.cgi?id=172116
+ <rdar://problem/30426457>
+
+ Reviewed by Zalan Bujtas.
+
+ There are no implementations of RenderTheme::themeForPage that actually care about the page.
+ It can be replaced with a singleton, simplifying a bunch of code.
+
+ * Modules/mediacontrols/MediaControlsHost.cpp:
+ (WebCore::MediaControlsHost::shadowRootCSSText):
+ (WebCore::MediaControlsHost::base64StringForIconNameAndType):
+ * css/CSSDefaultStyleSheets.cpp:
+ (WebCore::CSSDefaultStyleSheets::loadFullDefaultStyle):
+ (WebCore::CSSDefaultStyleSheets::ensureDefaultStyleSheetsForElement):
+
+ Fix a potential crash if we get here when page is null (though it doesn't appear to repro on trunk).
+
+ * css/StyleColor.cpp:
+ (WebCore::StyleColor::colorFromKeyword):
+ * css/StyleResolver.cpp:
+ (WebCore::StyleResolver::adjustRenderStyle):
+ * css/parser/CSSParser.cpp:
+ (WebCore::CSSParser::parseSystemColor):
+ * css/parser/CSSParser.h:
+ * css/parser/CSSPropertyParser.cpp:
+ (WebCore::CSSPropertyParser::consumeSystemFont):
+ * editing/FrameSelection.cpp:
+ (WebCore::FrameSelection::updateAppearance):
+ * html/HTMLMediaElement.cpp:
+ (WebCore::HTMLMediaElement::ensureMediaControlsInjectedScript):
+ * html/HTMLMeterElement.cpp:
+ (WebCore::HTMLMeterElement::createElementRenderer):
+ * html/HTMLSelectElement.cpp:
+ (WebCore::HTMLSelectElement::usesMenuList):
+ (WebCore::HTMLSelectElement::platformHandleKeydownEvent):
+ (WebCore::HTMLSelectElement::menuListDefaultEventHandler):
+ * html/HTMLTextFormControlElement.cpp:
+ (WebCore::HTMLTextFormControlElement::adjustInnerTextStyle):
+ * html/InputType.cpp:
+ (WebCore::InputType::themeSupportsDataListUI):
+ * html/TextFieldInputType.cpp:
+ (WebCore::TextFieldInputType::shouldHaveSpinButton):
+ (WebCore::TextFieldInputType::shouldHaveCapsLockIndicator):
+ * html/canvas/CanvasRenderingContext2D.cpp:
+ (WebCore::CanvasRenderingContext2D::setStrokeColor):
+ (WebCore::CanvasRenderingContext2D::setFillColor):
+ * html/canvas/CanvasStyle.cpp:
+ (WebCore::parseColor):
+ (WebCore::parseColorOrCurrentColor):
+ (WebCore::CanvasStyle::createFromString):
+ * html/canvas/CanvasStyle.h:
+ * html/shadow/MediaControlElements.cpp:
+ (WebCore::MediaControlPanelElement::startTimer):
+ (WebCore::MediaControlPanelElement::makeOpaque):
+ (WebCore::MediaControlPanelElement::makeTransparent):
+ * html/shadow/MediaControls.cpp:
+ (WebCore::MediaControls::reset):
+ (WebCore::MediaControls::reportedError):
+ (WebCore::MediaControls::updateCurrentTimeDisplay):
+ * html/shadow/mac/ImageControlsButtonElementMac.cpp:
+ (WebCore::ImageControlsButtonElementMac::tryCreate):
+ * page/MemoryRelease.cpp:
+ (WebCore::releaseNoncriticalMemory):
+ * page/Page.cpp:
+ (WebCore::Page::Page):
+ * page/Page.h:
+ (WebCore::Page::theme): Deleted.
+ * platform/wpe/RenderThemeWPE.cpp:
+ (WebCore::RenderTheme::singleton):
+ (WebCore::RenderTheme::themeForPage): Deleted.
+ * rendering/RenderEmbeddedObject.cpp:
+ (WebCore::RenderEmbeddedObject::getReplacementTextGeometry):
+ * rendering/RenderObject.cpp:
+ (WebCore::RenderObject::theme):
+ * rendering/RenderTheme.cpp:
+ (WebCore::RenderTheme::focusRingColor):
+ * rendering/RenderTheme.h:
+ (WebCore::RenderTheme::defaultTheme): Deleted.
+ * rendering/RenderThemeGtk.cpp:
+ (WebCore::RenderTheme::singleton):
+ (WebCore::RenderTheme::themeForPage): Deleted.
+ * rendering/RenderThemeIOS.mm:
+ (WebCore::RenderTheme::singleton):
+ (WebCore::RenderTheme::themeForPage): Deleted.
+ * rendering/RenderThemeMac.mm:
+ (WebCore::RenderTheme::singleton):
+ (WebCore::RenderTheme::themeForPage): Deleted.
+ * rendering/RenderThemeWin.cpp:
+ (WebCore::RenderTheme::singleton):
+ (WebCore::RenderTheme::themeForPage): Deleted.
+ * rendering/TextPaintStyle.cpp:
+ (WebCore::computeTextPaintStyle):
+
2017-05-15 Said Abou-Hallawa <sabouhallawa@apple.com>
Do not delete asynchronously decoded frames for large images if their clients are in the viewport
diff --git a/Source/WebCore/Modules/mediacontrols/MediaControlsHost.cpp b/Source/WebCore/Modules/mediacontrols/MediaControlsHost.cpp
index 9b37687..a655a7d 100644
--- a/Source/WebCore/Modules/mediacontrols/MediaControlsHost.cpp
+++ b/Source/WebCore/Modules/mediacontrols/MediaControlsHost.cpp
@@ -280,18 +280,13 @@
String MediaControlsHost::shadowRootCSSText() const
{
- Page* page = m_mediaElement->document().page();
- if (!page)
- return emptyString();
- return RenderTheme::themeForPage(page)->modernMediaControlsStyleSheet();
+ return RenderTheme::singleton().modernMediaControlsStyleSheet();
}
String MediaControlsHost::base64StringForIconNameAndType(const String& iconName, const String& iconType) const
{
- Page* page = m_mediaElement->document().page();
- if (!page)
- return emptyString();
- return RenderTheme::themeForPage(page)->mediaControlsBase64StringForIconNameAndType(iconName, iconType);
+
+ return RenderTheme::singleton().mediaControlsBase64StringForIconNameAndType(iconName, iconType);
}
}
diff --git a/Source/WebCore/css/CSSDefaultStyleSheets.cpp b/Source/WebCore/css/CSSDefaultStyleSheets.cpp
index cb6ad28..c313684 100644
--- a/Source/WebCore/css/CSSDefaultStyleSheets.cpp
+++ b/Source/WebCore/css/CSSDefaultStyleSheets.cpp
@@ -134,13 +134,13 @@
}
// Strict-mode rules.
- String defaultRules = String(htmlUserAgentStyleSheet, sizeof(htmlUserAgentStyleSheet)) + RenderTheme::defaultTheme()->extraDefaultStyleSheet();
+ String defaultRules = String(htmlUserAgentStyleSheet, sizeof(htmlUserAgentStyleSheet)) + RenderTheme::singleton().extraDefaultStyleSheet();
defaultStyleSheet = parseUASheet(defaultRules);
defaultStyle->addRulesFromSheet(*defaultStyleSheet, screenEval());
defaultPrintStyle->addRulesFromSheet(*defaultStyleSheet, printEval());
// Quirks-mode rules.
- String quirksRules = String(quirksUserAgentStyleSheet, sizeof(quirksUserAgentStyleSheet)) + RenderTheme::defaultTheme()->extraQuirksStyleSheet();
+ String quirksRules = String(quirksUserAgentStyleSheet, sizeof(quirksUserAgentStyleSheet)) + RenderTheme::singleton().extraQuirksStyleSheet();
quirksStyleSheet = parseUASheet(quirksRules);
defaultQuirksStyle->addRulesFromSheet(*quirksStyleSheet, screenEval());
}
@@ -170,8 +170,8 @@
if (is<HTMLElement>(element)) {
if (is<HTMLObjectElement>(element) || is<HTMLEmbedElement>(element)) {
- if (!plugInsStyleSheet) {
- String plugInsRules = RenderTheme::themeForPage(element.document().page())->extraPlugInsStyleSheet() + element.document().page()->chrome().client().plugInExtraStyleSheet();
+ if (!plugInsStyleSheet && element.document().page()) {
+ String plugInsRules = RenderTheme::singleton().extraPlugInsStyleSheet() + element.document().page()->chrome().client().plugInExtraStyleSheet();
if (plugInsRules.isEmpty())
plugInsRules = String(plugInsUserAgentStyleSheet, sizeof(plugInsUserAgentStyleSheet));
plugInsStyleSheet = parseUASheet(plugInsRules);
@@ -182,9 +182,9 @@
#if ENABLE(VIDEO)
else if (is<HTMLMediaElement>(element)) {
if (!mediaControlsStyleSheet) {
- String mediaRules = RenderTheme::themeForPage(element.document().page())->mediaControlsStyleSheet();
+ String mediaRules = RenderTheme::singleton().mediaControlsStyleSheet();
if (mediaRules.isEmpty())
- mediaRules = String(mediaControlsUserAgentStyleSheet, sizeof(mediaControlsUserAgentStyleSheet)) + RenderTheme::themeForPage(element.document().page())->extraMediaControlsStyleSheet();
+ mediaRules = String(mediaControlsUserAgentStyleSheet, sizeof(mediaControlsUserAgentStyleSheet)) + RenderTheme::singleton().extraMediaControlsStyleSheet();
mediaControlsStyleSheet = parseUASheet(mediaRules);
defaultStyle->addRulesFromSheet(*mediaControlsStyleSheet, screenEval());
defaultPrintStyle->addRulesFromSheet(*mediaControlsStyleSheet, printEval());
@@ -195,7 +195,7 @@
#if ENABLE(SERVICE_CONTROLS)
else if (is<HTMLDivElement>(element) && element.isImageControlsRootElement()) {
if (!imageControlsStyleSheet) {
- String imageControlsRules = RenderTheme::themeForPage(element.document().page())->imageControlsStyleSheet();
+ String imageControlsRules = RenderTheme::singleton().imageControlsStyleSheet();
imageControlsStyleSheet = parseUASheet(imageControlsRules);
defaultStyle->addRulesFromSheet(*imageControlsStyleSheet, screenEval());
defaultPrintStyle->addRulesFromSheet(*imageControlsStyleSheet, printEval());
@@ -226,7 +226,7 @@
#if ENABLE(FULLSCREEN_API)
if (!fullscreenStyleSheet && element.document().webkitIsFullScreen()) {
- String fullscreenRules = String(fullscreenUserAgentStyleSheet, sizeof(fullscreenUserAgentStyleSheet)) + RenderTheme::defaultTheme()->extraFullScreenStyleSheet();
+ String fullscreenRules = String(fullscreenUserAgentStyleSheet, sizeof(fullscreenUserAgentStyleSheet)) + RenderTheme::singleton().extraFullScreenStyleSheet();
fullscreenStyleSheet = parseUASheet(fullscreenRules);
defaultStyle->addRulesFromSheet(*fullscreenStyleSheet, screenEval());
defaultQuirksStyle->addRulesFromSheet(*fullscreenStyleSheet, screenEval());
diff --git a/Source/WebCore/css/StyleColor.cpp b/Source/WebCore/css/StyleColor.cpp
index 6403dbb..ba869ad 100644
--- a/Source/WebCore/css/StyleColor.cpp
+++ b/Source/WebCore/css/StyleColor.cpp
@@ -43,7 +43,7 @@
if (const NamedColor* namedColor = findColor(valueName, strlen(valueName)))
return Color(namedColor->ARGBValue);
}
- return RenderTheme::defaultTheme()->systemColor(keyword);
+ return RenderTheme::singleton().systemColor(keyword);
}
bool StyleColor::isColorKeyword(CSSValueID id)
diff --git a/Source/WebCore/css/StyleResolver.cpp b/Source/WebCore/css/StyleResolver.cpp
index d7e8af0..ad027b4 100644
--- a/Source/WebCore/css/StyleResolver.cpp
+++ b/Source/WebCore/css/StyleResolver.cpp
@@ -998,7 +998,7 @@
// Let the theme also have a crack at adjusting the style.
if (style.hasAppearance())
- RenderTheme::defaultTheme()->adjustStyle(*this, style, element, m_state.hasUAAppearance(), m_state.borderData(), m_state.backgroundData(), m_state.backgroundColor());
+ RenderTheme::singleton().adjustStyle(*this, style, element, m_state.hasUAAppearance(), m_state.borderData(), m_state.backgroundData(), m_state.backgroundColor());
// If we have first-letter pseudo style, do not share this style.
if (style.hasPseudoStyle(FIRST_LETTER))
diff --git a/Source/WebCore/css/parser/CSSParser.cpp b/Source/WebCore/css/parser/CSSParser.cpp
index 1cd2072..69f9d95 100644
--- a/Source/WebCore/css/parser/CSSParser.cpp
+++ b/Source/WebCore/css/parser/CSSParser.cpp
@@ -173,16 +173,13 @@
return primitiveValue.color();
}
-Color CSSParser::parseSystemColor(const String& string, Document* document)
+Color CSSParser::parseSystemColor(const String& string)
{
- if (!document || !document->page())
- return Color();
-
CSSValueID id = cssValueKeywordID(string);
if (!StyleColor::isSystemColor(id))
return Color();
- return document->page()->theme().systemColor(id);
+ return RenderTheme::singleton().systemColor(id);
}
RefPtr<CSSValue> CSSParser::parseSingleValue(CSSPropertyID propertyID, const String& string, const CSSParserContext& context)
diff --git a/Source/WebCore/css/parser/CSSParser.h b/Source/WebCore/css/parser/CSSParser.h
index 0991dff..3610dbf 100644
--- a/Source/WebCore/css/parser/CSSParser.h
+++ b/Source/WebCore/css/parser/CSSParser.h
@@ -78,7 +78,7 @@
RefPtr<CSSValue> parseValueWithVariableReferences(CSSPropertyID, const CSSValue&, const CustomPropertyValueMap& customProperties, TextDirection, WritingMode);
static Color parseColor(const String&, bool strict = false);
- static Color parseSystemColor(const String&, Document*);
+ static Color parseSystemColor(const String&);
private:
ParseResult parseValue(MutableStyleProperties&, CSSPropertyID, const String&, bool important);
diff --git a/Source/WebCore/css/parser/CSSPropertyParser.cpp b/Source/WebCore/css/parser/CSSPropertyParser.cpp
index 977a3a4b1..3e08726 100644
--- a/Source/WebCore/css/parser/CSSPropertyParser.cpp
+++ b/Source/WebCore/css/parser/CSSPropertyParser.cpp
@@ -4429,7 +4429,7 @@
return false;
FontCascadeDescription fontDescription;
- RenderTheme::defaultTheme()->systemFont(systemFontID, fontDescription);
+ RenderTheme::singleton().systemFont(systemFontID, fontDescription);
if (!fontDescription.isAbsoluteSize())
return false;
diff --git a/Source/WebCore/editing/FrameSelection.cpp b/Source/WebCore/editing/FrameSelection.cpp
index e91b4c2..8bb00db 100644
--- a/Source/WebCore/editing/FrameSelection.cpp
+++ b/Source/WebCore/editing/FrameSelection.cpp
@@ -2057,7 +2057,7 @@
// Start blinking with a black caret. Be sure not to restart if we're
// already blinking in the right location.
if (shouldBlink && !m_caretBlinkTimer.isActive()) {
- if (Seconds blinkInterval = m_frame->page()->theme().caretBlinkInterval())
+ if (Seconds blinkInterval = RenderTheme::singleton().caretBlinkInterval())
m_caretBlinkTimer.startRepeating(blinkInterval);
if (!m_caretPaint) {
diff --git a/Source/WebCore/html/HTMLMediaElement.cpp b/Source/WebCore/html/HTMLMediaElement.cpp
index 1d863c5..15fa7a43 100644
--- a/Source/WebCore/html/HTMLMediaElement.cpp
+++ b/Source/WebCore/html/HTMLMediaElement.cpp
@@ -6698,7 +6698,7 @@
if (!page)
return false;
- String mediaControlsScript = RenderTheme::themeForPage(page)->mediaControlsScript();
+ String mediaControlsScript = RenderTheme::singleton().mediaControlsScript();
if (!mediaControlsScript.length())
return false;
diff --git a/Source/WebCore/html/HTMLMeterElement.cpp b/Source/WebCore/html/HTMLMeterElement.cpp
index 52c88e7..0239b33 100644
--- a/Source/WebCore/html/HTMLMeterElement.cpp
+++ b/Source/WebCore/html/HTMLMeterElement.cpp
@@ -60,7 +60,7 @@
RenderPtr<RenderElement> HTMLMeterElement::createElementRenderer(RenderStyle&& style, const RenderTreePosition&)
{
- if (!document().page()->theme().supportsMeter(style.appearance()))
+ if (!RenderTheme::singleton().supportsMeter(style.appearance()))
return RenderElement::createFor(*this, WTFMove(style));
return createRenderer<RenderMeter>(*this, WTFMove(style));
diff --git a/Source/WebCore/html/HTMLSelectElement.cpp b/Source/WebCore/html/HTMLSelectElement.cpp
index f19756b..f4c6143 100644
--- a/Source/WebCore/html/HTMLSelectElement.cpp
+++ b/Source/WebCore/html/HTMLSelectElement.cpp
@@ -193,7 +193,7 @@
bool HTMLSelectElement::usesMenuList() const
{
#if !PLATFORM(IOS)
- if (RenderTheme::themeForPage(document().page())->delegatesMenuListRendering())
+ if (RenderTheme::singleton().delegatesMenuListRendering())
return true;
return !m_multiple && m_size <= 1;
@@ -1085,7 +1085,7 @@
bool HTMLSelectElement::platformHandleKeydownEvent(KeyboardEvent* event)
{
- if (!RenderTheme::themeForPage(document().page())->popsMenuByArrowKeys())
+ if (!RenderTheme::singleton().popsMenuByArrowKeys())
return false;
if (!isSpatialNavigationEnabled(document().frame())) {
@@ -1119,8 +1119,6 @@
ASSERT(renderer());
ASSERT(renderer()->isMenuList());
- RefPtr<RenderTheme> renderTheme = RenderTheme::themeForPage(document().page());
-
if (event.type() == eventNames().keydownEvent) {
if (!is<KeyboardEvent>(event))
return;
@@ -1188,7 +1186,7 @@
return;
}
- if (renderTheme->popsMenuBySpaceOrReturn()) {
+ if (RenderTheme::singleton().popsMenuBySpaceOrReturn()) {
if (keyCode == ' ' || keyCode == '\r') {
focus();
@@ -1205,7 +1203,7 @@
downcast<RenderMenuList>(*renderer).showPopup();
handled = true;
}
- } else if (renderTheme->popsMenuByArrowKeys()) {
+ } else if (RenderTheme::singleton().popsMenuByArrowKeys()) {
if (keyCode == ' ') {
focus();
diff --git a/Source/WebCore/html/HTMLTextFormControlElement.cpp b/Source/WebCore/html/HTMLTextFormControlElement.cpp
index 6e8bec4..d04c390 100644
--- a/Source/WebCore/html/HTMLTextFormControlElement.cpp
+++ b/Source/WebCore/html/HTMLTextFormControlElement.cpp
@@ -805,7 +805,7 @@
}
if (isDisabledFormControl())
- textBlockStyle.setColor(document().page()->theme().disabledTextColor(textBlockStyle.visitedDependentColor(CSSPropertyColor), parentStyle.visitedDependentColor(CSSPropertyBackgroundColor)));
+ textBlockStyle.setColor(RenderTheme::singleton().disabledTextColor(textBlockStyle.visitedDependentColor(CSSPropertyColor), parentStyle.visitedDependentColor(CSSPropertyBackgroundColor)));
#if PLATFORM(IOS)
if (textBlockStyle.textSecurity() != TSNONE && !textBlockStyle.isLeftToRightDirection()) {
// Preserve the alignment but force the direction to LTR so that the last-typed, unmasked character
diff --git a/Source/WebCore/html/InputType.cpp b/Source/WebCore/html/InputType.cpp
index bcd9638..ee47a57 100644
--- a/Source/WebCore/html/InputType.cpp
+++ b/Source/WebCore/html/InputType.cpp
@@ -171,8 +171,7 @@
bool InputType::themeSupportsDataListUI(InputType* type)
{
- Document& document = type->element().document();
- return RenderTheme::themeForPage(document.page())->supportsDataListUI(type->formControlType());
+ return RenderTheme::singleton().supportsDataListUI(type->formControlType());
}
bool InputType::isTextField() const
diff --git a/Source/WebCore/html/TextFieldInputType.cpp b/Source/WebCore/html/TextFieldInputType.cpp
index f35fb4c..87b38b9 100644
--- a/Source/WebCore/html/TextFieldInputType.cpp
+++ b/Source/WebCore/html/TextFieldInputType.cpp
@@ -244,12 +244,12 @@
bool TextFieldInputType::shouldHaveSpinButton() const
{
- return RenderTheme::themeForPage(element().document().page())->shouldHaveSpinButton(element());
+ return RenderTheme::singleton().shouldHaveSpinButton(element());
}
bool TextFieldInputType::shouldHaveCapsLockIndicator() const
{
- return RenderTheme::themeForPage(element().document().page())->shouldHaveCapsLockIndicator(element());
+ return RenderTheme::singleton().shouldHaveCapsLockIndicator(element());
}
void TextFieldInputType::createShadowSubtree()
diff --git a/Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp b/Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp
index 1314e48..4bc4a41 100644
--- a/Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp
+++ b/Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp
@@ -839,7 +839,7 @@
return;
realizeSaves();
- setStrokeStyle(CanvasStyle::createFromString(color, &canvas().document()));
+ setStrokeStyle(CanvasStyle::createFromString(color));
modifiableState().unparsedStrokeColor = color;
}
@@ -875,7 +875,7 @@
return;
realizeSaves();
- setFillStyle(CanvasStyle::createFromString(color, &canvas().document()));
+ setFillStyle(CanvasStyle::createFromString(color));
modifiableState().unparsedFillColor = color;
}
diff --git a/Source/WebCore/html/canvas/CanvasStyle.cpp b/Source/WebCore/html/canvas/CanvasStyle.cpp
index 052fa31..791568c 100644
--- a/Source/WebCore/html/canvas/CanvasStyle.cpp
+++ b/Source/WebCore/html/canvas/CanvasStyle.cpp
@@ -48,12 +48,12 @@
return equalLettersIgnoringASCIICase(colorString, "currentcolor");
}
-static Color parseColor(const String& colorString, Document* document = nullptr)
+static Color parseColor(const String& colorString)
{
Color color = CSSParser::parseColor(colorString);
if (color.isValid())
return color;
- return CSSParser::parseSystemColor(colorString, document);
+ return CSSParser::parseSystemColor(colorString);
}
Color currentColor(HTMLCanvasElement* canvas)
@@ -71,7 +71,7 @@
if (isCurrentColorString(colorString))
return currentColor(canvas);
- return parseColor(colorString, canvas ? &canvas->document() : nullptr);
+ return parseColor(colorString);
}
CanvasStyle::CanvasStyle(Color color)
@@ -109,12 +109,12 @@
{
}
-CanvasStyle CanvasStyle::createFromString(const String& colorString, Document* document)
+CanvasStyle CanvasStyle::createFromString(const String& colorString)
{
if (isCurrentColorString(colorString))
return CurrentColor { std::nullopt };
- Color color = parseColor(colorString, document);
+ Color color = parseColor(colorString);
if (!color.isValid())
return { };
diff --git a/Source/WebCore/html/canvas/CanvasStyle.h b/Source/WebCore/html/canvas/CanvasStyle.h
index d78030a..09ba2ff 100644
--- a/Source/WebCore/html/canvas/CanvasStyle.h
+++ b/Source/WebCore/html/canvas/CanvasStyle.h
@@ -47,7 +47,7 @@
CanvasStyle(CanvasGradient&);
CanvasStyle(CanvasPattern&);
- static CanvasStyle createFromString(const String& color, Document* = nullptr);
+ static CanvasStyle createFromString(const String& color);
static CanvasStyle createFromStringWithOverrideAlpha(const String& color, float alpha);
bool isValid() const { return !WTF::holds_alternative<Invalid>(m_style); }
diff --git a/Source/WebCore/html/shadow/MediaControlElements.cpp b/Source/WebCore/html/shadow/MediaControlElements.cpp
index 5f3b3c3..3a1e58f 100644
--- a/Source/WebCore/html/shadow/MediaControlElements.cpp
+++ b/Source/WebCore/html/shadow/MediaControlElements.cpp
@@ -137,7 +137,7 @@
// The timer is required to set the property display:'none' on the panel,
// such that captions are correctly displayed at the bottom of the video
// at the end of the fadeout transition.
- Seconds duration = document().page() ? document().page()->theme().mediaControlsFadeOutDuration() : 0_s;
+ Seconds duration = RenderTheme::singleton().mediaControlsFadeOutDuration();
m_transitionTimer.startOneShot(duration);
}
@@ -188,7 +188,7 @@
if (m_opaque)
return;
- double duration = document().page() ? document().page()->theme().mediaControlsFadeInDuration() : 0;
+ double duration = RenderTheme::singleton().mediaControlsFadeInDuration();
setInlineStyleProperty(CSSPropertyTransitionProperty, CSSPropertyOpacity);
setInlineStyleProperty(CSSPropertyTransitionDuration, duration, CSSPrimitiveValue::CSS_S);
@@ -205,7 +205,7 @@
if (!m_opaque)
return;
- Seconds duration = document().page() ? document().page()->theme().mediaControlsFadeOutDuration() : 0_s;
+ Seconds duration = RenderTheme::singleton().mediaControlsFadeOutDuration();
setInlineStyleProperty(CSSPropertyTransitionProperty, CSSPropertyOpacity);
setInlineStyleProperty(CSSPropertyTransitionDuration, duration.value(), CSSPrimitiveValue::CSS_S);
diff --git a/Source/WebCore/html/shadow/MediaControls.cpp b/Source/WebCore/html/shadow/MediaControls.cpp
index 2228f49..3e18a10 100644
--- a/Source/WebCore/html/shadow/MediaControls.cpp
+++ b/Source/WebCore/html/shadow/MediaControls.cpp
@@ -87,21 +87,17 @@
void MediaControls::reset()
{
- Page* page = document().page();
- if (!page)
- return;
-
m_playButton->updateDisplayType();
updateCurrentTimeDisplay();
double duration = m_mediaController->duration();
- if (std::isfinite(duration) || page->theme().hasOwnDisabledStateHandlingFor(MediaSliderPart)) {
+ if (std::isfinite(duration) || RenderTheme::singleton().hasOwnDisabledStateHandlingFor(MediaSliderPart)) {
m_timeline->setDuration(duration);
m_timeline->setPosition(m_mediaController->currentTime());
}
- if (m_mediaController->hasAudio() || page->theme().hasOwnDisabledStateHandlingFor(MediaMuteButtonPart))
+ if (m_mediaController->hasAudio() || RenderTheme::singleton().hasOwnDisabledStateHandlingFor(MediaMuteButtonPart))
m_panelMuteButton->show();
else
m_panelMuteButton->hide();
@@ -129,19 +125,16 @@
void MediaControls::reportedError()
{
- Page* page = document().page();
- if (!page)
- return;
-
- if (!page->theme().hasOwnDisabledStateHandlingFor(MediaMuteButtonPart)) {
+ auto& theme = RenderTheme::singleton();
+ if (!theme.hasOwnDisabledStateHandlingFor(MediaMuteButtonPart)) {
m_panelMuteButton->hide();
m_volumeSlider->hide();
}
- if (m_toggleClosedCaptionsButton && !page->theme().hasOwnDisabledStateHandlingFor(MediaToggleClosedCaptionsButtonPart))
+ if (m_toggleClosedCaptionsButton && !theme.hasOwnDisabledStateHandlingFor(MediaToggleClosedCaptionsButtonPart))
m_toggleClosedCaptionsButton->hide();
- if (m_fullScreenButton && !page->theme().hasOwnDisabledStateHandlingFor(MediaEnterFullscreenButtonPart))
+ if (m_fullScreenButton && !theme.hasOwnDisabledStateHandlingFor(MediaEnterFullscreenButtonPart))
m_fullScreenButton->hide();
}
@@ -218,12 +211,7 @@
void MediaControls::updateCurrentTimeDisplay()
{
double now = m_mediaController->currentTime();
-
- Page* page = document().page();
- if (!page)
- return;
-
- m_currentTimeDisplay->setInnerText(page->theme().formatMediaControlsTime(now));
+ m_currentTimeDisplay->setInnerText(RenderTheme::singleton().formatMediaControlsTime(now));
m_currentTimeDisplay->setCurrentValue(now);
}
diff --git a/Source/WebCore/html/shadow/mac/ImageControlsButtonElementMac.cpp b/Source/WebCore/html/shadow/mac/ImageControlsButtonElementMac.cpp
index ba9badf..2cd6504 100644
--- a/Source/WebCore/html/shadow/mac/ImageControlsButtonElementMac.cpp
+++ b/Source/WebCore/html/shadow/mac/ImageControlsButtonElementMac.cpp
@@ -97,7 +97,7 @@
auto button = adoptRef(*new ImageControlsButtonElementMac(document));
button->setAttributeWithoutSynchronization(HTMLNames::classAttr, AtomicString("x-webkit-image-controls-button", AtomicString::ConstructFromLiteral));
- IntSize positionOffset = document.page()->theme().imageControlsButtonPositionOffset();
+ IntSize positionOffset = RenderTheme::singleton().imageControlsButtonPositionOffset();
button->setInlineStyleProperty(CSSPropertyTop, positionOffset.height(), CSSPrimitiveValue::CSS_PX);
// FIXME: Why is right: 0px off the right edge of the parent?
diff --git a/Source/WebCore/page/MemoryRelease.cpp b/Source/WebCore/page/MemoryRelease.cpp
index 214e9d3..373088b 100644
--- a/Source/WebCore/page/MemoryRelease.cpp
+++ b/Source/WebCore/page/MemoryRelease.cpp
@@ -57,7 +57,7 @@
static void releaseNoncriticalMemory()
{
- RenderTheme::defaultTheme()->purgeCaches();
+ RenderTheme::singleton().purgeCaches();
FontCache::singleton().purgeInactiveFontData();
diff --git a/Source/WebCore/page/Page.cpp b/Source/WebCore/page/Page.cpp
index 90af4df..04fa066 100644
--- a/Source/WebCore/page/Page.cpp
+++ b/Source/WebCore/page/Page.cpp
@@ -205,7 +205,6 @@
, m_progress(std::make_unique<ProgressTracker>(*pageConfiguration.progressTrackerClient))
, m_backForwardController(std::make_unique<BackForwardController>(*this, *WTFMove(pageConfiguration.backForwardClient)))
, m_mainFrame(MainFrame::create(*this, pageConfiguration))
- , m_theme(RenderTheme::themeForPage(this))
, m_editorClient(WTFMove(pageConfiguration.editorClient))
, m_plugInClient(pageConfiguration.plugInClient)
, m_validationMessageClient(WTFMove(pageConfiguration.validationMessageClient))
diff --git a/Source/WebCore/page/Page.h b/Source/WebCore/page/Page.h
index 1942961..7bef50c 100644
--- a/Source/WebCore/page/Page.h
+++ b/Source/WebCore/page/Page.h
@@ -166,8 +166,6 @@
void setNeedsRecalcStyleInAllFrames();
- RenderTheme& theme() const { return *m_theme; }
-
WEBCORE_EXPORT ViewportArguments viewportArguments() const;
static void refreshPlugins(bool reload);
@@ -666,8 +664,6 @@
RefPtr<PluginData> m_pluginData;
- RefPtr<RenderTheme> m_theme;
-
UniqueRef<EditorClient> m_editorClient;
PlugInClient* m_plugInClient;
std::unique_ptr<ValidationMessageClient> m_validationMessageClient;
diff --git a/Source/WebCore/page/linux/ResourceUsageOverlayLinux.cpp b/Source/WebCore/page/linux/ResourceUsageOverlayLinux.cpp
index dd78ca0..07d88a2 100644
--- a/Source/WebCore/page/linux/ResourceUsageOverlayLinux.cpp
+++ b/Source/WebCore/page/linux/ResourceUsageOverlayLinux.cpp
@@ -74,7 +74,7 @@
: m_overlay(overlay)
{
FontCascadeDescription fontDescription;
- RenderTheme::defaultTheme()->systemFont(CSSValueMessageBox, fontDescription);
+ RenderTheme::singleton().systemFont(CSSValueMessageBox, fontDescription);
fontDescription.setComputedSize(gFontSize);
m_textFont = FontCascade(fontDescription, 0, 0);
m_textFont.update(nullptr);
diff --git a/Source/WebCore/platform/win/PopupMenuWin.cpp b/Source/WebCore/platform/win/PopupMenuWin.cpp
index 758eebf..6d079d8 100644
--- a/Source/WebCore/platform/win/PopupMenuWin.cpp
+++ b/Source/WebCore/platform/win/PopupMenuWin.cpp
@@ -622,8 +622,8 @@
Color optionBackgroundColor, optionTextColor;
PopupMenuStyle itemStyle = client()->itemStyle(index);
if (index == focusedIndex()) {
- optionBackgroundColor = RenderTheme::defaultTheme()->activeListBoxSelectionBackgroundColor();
- optionTextColor = RenderTheme::defaultTheme()->activeListBoxSelectionForegroundColor();
+ optionBackgroundColor = RenderTheme::singleton().activeListBoxSelectionBackgroundColor();
+ optionTextColor = RenderTheme::singleton().activeListBoxSelectionForegroundColor();
} else {
optionBackgroundColor = itemStyle.backgroundColor();
optionTextColor = itemStyle.foregroundColor();
@@ -660,12 +660,12 @@
int textX = 0;
if (client()->menuStyle().textDirection() == LTR) {
textX = std::max<int>(0, client()->clientPaddingLeft() - client()->clientInsetLeft());
- if (RenderTheme::defaultTheme()->popupOptionSupportsTextIndent())
+ if (RenderTheme::singleton().popupOptionSupportsTextIndent())
textX += minimumIntValueForLength(itemStyle.textIndent(), itemRect.width());
} else {
textX = itemRect.width() - client()->menuStyle().font().width(textRun);
textX = std::min<int>(textX, textX - client()->clientPaddingRight() + client()->clientInsetRight());
- if (RenderTheme::defaultTheme()->popupOptionSupportsTextIndent())
+ if (RenderTheme::singleton().popupOptionSupportsTextIndent())
textX -= minimumIntValueForLength(itemStyle.textIndent(), itemRect.width());
}
int textY = itemRect.y() + itemFont.fontMetrics().ascent() + (itemRect.height() - itemFont.fontMetrics().height()) / 2;
diff --git a/Source/WebCore/platform/wpe/RenderThemeWPE.cpp b/Source/WebCore/platform/wpe/RenderThemeWPE.cpp
index b59e33b..4d293d8 100644
--- a/Source/WebCore/platform/wpe/RenderThemeWPE.cpp
+++ b/Source/WebCore/platform/wpe/RenderThemeWPE.cpp
@@ -33,10 +33,10 @@
namespace WebCore {
-Ref<RenderTheme> RenderTheme::themeForPage(Page*)
+RenderTheme& RenderTheme::singleton()
{
- static RenderTheme& theme = RenderThemeWPE::create().leakRef();
- return theme;
+ static NeverDestroyed<Ref<RenderTheme>> theme(RenderThemeWPE::create());
+ return theme.get();
}
void RenderThemeWPE::updateCachedSystemFontDescription(CSSValueID, FontCascadeDescription&) const
diff --git a/Source/WebCore/rendering/RenderEmbeddedObject.cpp b/Source/WebCore/rendering/RenderEmbeddedObject.cpp
index 755bc07..5bc1b34 100644
--- a/Source/WebCore/rendering/RenderEmbeddedObject.cpp
+++ b/Source/WebCore/rendering/RenderEmbeddedObject.cpp
@@ -357,7 +357,7 @@
contentRect.moveBy(roundedIntPoint(accumulatedOffset));
FontCascadeDescription fontDescription;
- RenderTheme::defaultTheme()->systemFont(CSSValueWebkitSmallControl, fontDescription);
+ RenderTheme::singleton().systemFont(CSSValueWebkitSmallControl, fontDescription);
fontDescription.setWeight(boldWeightValue());
fontDescription.setRenderingMode(settings().fontRenderingMode());
fontDescription.setComputedSize(12);
diff --git a/Source/WebCore/rendering/RenderObject.cpp b/Source/WebCore/rendering/RenderObject.cpp
index 1169d92..269ac97 100644
--- a/Source/WebCore/rendering/RenderObject.cpp
+++ b/Source/WebCore/rendering/RenderObject.cpp
@@ -141,7 +141,7 @@
RenderTheme& RenderObject::theme() const
{
- return page().theme();
+ return RenderTheme::singleton();
}
bool RenderObject::isDescendantOf(const RenderObject* ancestor) const
diff --git a/Source/WebCore/rendering/RenderTheme.cpp b/Source/WebCore/rendering/RenderTheme.cpp
index db4d808..308e0df 100644
--- a/Source/WebCore/rendering/RenderTheme.cpp
+++ b/Source/WebCore/rendering/RenderTheme.cpp
@@ -1278,7 +1278,7 @@
#if ENABLE(TOUCH_EVENTS)
Color RenderTheme::tapHighlightColor()
{
- return defaultTheme()->platformTapHighlightColor();
+ return singleton().platformTapHighlightColor();
}
#endif
@@ -1313,7 +1313,7 @@
Color RenderTheme::focusRingColor()
{
- return customFocusRingColor().isValid() ? customFocusRingColor() : defaultTheme()->platformFocusRingColor();
+ return customFocusRingColor().isValid() ? customFocusRingColor() : RenderTheme::singleton().platformFocusRingColor();
}
String RenderTheme::fileListDefaultLabel(bool multipleFilesAllowed) const
diff --git a/Source/WebCore/rendering/RenderTheme.h b/Source/WebCore/rendering/RenderTheme.h
index 873c1b0..11757ea 100644
--- a/Source/WebCore/rendering/RenderTheme.h
+++ b/Source/WebCore/rendering/RenderTheme.h
@@ -62,15 +62,8 @@
virtual ~RenderTheme() { }
// This function is to be implemented in your platform-specific theme implementation to hand back the
- // appropriate platform theme. When the theme is needed in non-page dependent code, a default theme is
- // used as fallback, which is returned for a nulled page, so the platform code needs to account for this.
- static Ref<RenderTheme> themeForPage(Page*);
-
- // When the theme is needed in non-page dependent code, the defaultTheme() is used as fallback.
- static inline Ref<RenderTheme> defaultTheme()
- {
- return themeForPage(nullptr);
- };
+ // appropriate platform theme.
+ static RenderTheme& singleton();
virtual void purgeCaches() { }
diff --git a/Source/WebCore/rendering/RenderThemeGtk.cpp b/Source/WebCore/rendering/RenderThemeGtk.cpp
index b069754..be15df6 100644
--- a/Source/WebCore/rendering/RenderThemeGtk.cpp
+++ b/Source/WebCore/rendering/RenderThemeGtk.cpp
@@ -66,10 +66,10 @@
return adoptRef(*new RenderThemeGtk());
}
-Ref<RenderTheme> RenderTheme::themeForPage(Page*)
+RenderTheme& RenderTheme::singleton()
{
- static RenderTheme& rt = RenderThemeGtk::create().leakRef();
- return rt;
+ static NeverDestroyed<Ref<RenderTheme>> theme(RenderThemeGtk::create());
+ return theme.get();
}
static double getScreenDPI()
diff --git a/Source/WebCore/rendering/RenderThemeIOS.mm b/Source/WebCore/rendering/RenderThemeIOS.mm
index d62c39f..768a5c5 100644
--- a/Source/WebCore/rendering/RenderThemeIOS.mm
+++ b/Source/WebCore/rendering/RenderThemeIOS.mm
@@ -295,10 +295,10 @@
CFNotificationCenterAddObserver(CFNotificationCenterGetLocalCenter(), this, contentSizeCategoryDidChange, UIContentSizeCategoryDidChangeNotification, 0, CFNotificationSuspensionBehaviorDeliverImmediately);
}
-Ref<RenderTheme> RenderTheme::themeForPage(Page*)
+RenderTheme& RenderTheme::singleton()
{
- static RenderTheme& renderTheme = RenderThemeIOS::create().leakRef();
- return renderTheme;
+ static NeverDestroyed<Ref<RenderTheme>> theme(RenderThemeIOS::create());
+ return theme.get();
}
Ref<RenderTheme> RenderThemeIOS::create()
diff --git a/Source/WebCore/rendering/RenderThemeMac.mm b/Source/WebCore/rendering/RenderThemeMac.mm
index b7c6f35..5c9d78f 100644
--- a/Source/WebCore/rendering/RenderThemeMac.mm
+++ b/Source/WebCore/rendering/RenderThemeMac.mm
@@ -195,10 +195,10 @@
leftPadding
};
-Ref<RenderTheme> RenderTheme::themeForPage(Page*)
+RenderTheme& RenderTheme::singleton()
{
- static RenderTheme& rt = RenderThemeMac::create().leakRef();
- return rt;
+ static NeverDestroyed<Ref<RenderTheme>> theme(RenderThemeMac::create());
+ return theme.get();
}
Ref<RenderTheme> RenderThemeMac::create()
diff --git a/Source/WebCore/rendering/RenderThemeWin.cpp b/Source/WebCore/rendering/RenderThemeWin.cpp
index 5222090..75f10ea 100644
--- a/Source/WebCore/rendering/RenderThemeWin.cpp
+++ b/Source/WebCore/rendering/RenderThemeWin.cpp
@@ -188,10 +188,10 @@
return adoptRef(*new RenderThemeWin);
}
-Ref<RenderTheme> RenderTheme::themeForPage(Page* page)
+RenderTheme& RenderTheme::singleton()
{
- static RenderTheme& winTheme = RenderThemeWin::create().leakRef();
- return winTheme;
+ static NeverDestroyed<Ref<RenderTheme>> theme(RenderThemeWin::create());
+ return theme.get();
}
RenderThemeWin::RenderThemeWin()
diff --git a/Source/WebCore/rendering/TextPaintStyle.cpp b/Source/WebCore/rendering/TextPaintStyle.cpp
index db20ebb..be4c84a 100644
--- a/Source/WebCore/rendering/TextPaintStyle.cpp
+++ b/Source/WebCore/rendering/TextPaintStyle.cpp
@@ -84,7 +84,7 @@
if (lineStyle.insideDefaultButton()) {
Page* page = frame.page();
if (page && page->focusController().isActive()) {
- paintStyle.fillColor = page->theme().systemColor(CSSValueActivebuttontext);
+ paintStyle.fillColor = RenderTheme::singleton().systemColor(CSSValueActivebuttontext);
return paintStyle;
}
}
diff --git a/Source/WebKit/win/WebView.cpp b/Source/WebKit/win/WebView.cpp
index 00120f8..611ab55 100644
--- a/Source/WebKit/win/WebView.cpp
+++ b/Source/WebKit/win/WebView.cpp
@@ -2725,7 +2725,7 @@
case WM_XP_THEMECHANGED:
if (Frame* coreFrame = core(mainFrameImpl)) {
webView->deleteBackingStore();
- coreFrame->page()->theme().themeChanged();
+ RenderTheme::singleton().themeChanged();
ScrollbarTheme::theme().themeChanged();
RECT windowRect;
::GetClientRect(hWnd, &windowRect);