summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/WebKit/Source/core/css/CSSDefaultStyleSheets.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/WebKit/Source/core/css/CSSDefaultStyleSheets.cpp')
-rw-r--r--chromium/third_party/WebKit/Source/core/css/CSSDefaultStyleSheets.cpp175
1 files changed, 113 insertions, 62 deletions
diff --git a/chromium/third_party/WebKit/Source/core/css/CSSDefaultStyleSheets.cpp b/chromium/third_party/WebKit/Source/core/css/CSSDefaultStyleSheets.cpp
index cdd794828a7..1137f9b7ad9 100644
--- a/chromium/third_party/WebKit/Source/core/css/CSSDefaultStyleSheets.cpp
+++ b/chromium/third_party/WebKit/Source/core/css/CSSDefaultStyleSheets.cpp
@@ -29,33 +29,31 @@
#include "config.h"
#include "core/css/CSSDefaultStyleSheets.h"
-#include "UserAgentStyleSheets.h"
+#include "core/MathMLNames.h"
+#include "core/UserAgentStyleSheets.h"
#include "core/css/MediaQueryEvaluator.h"
#include "core/css/RuleSet.h"
#include "core/css/StyleSheetContents.h"
#include "core/dom/FullscreenElementStack.h"
#include "core/html/HTMLAnchorElement.h"
#include "core/html/HTMLHtmlElement.h"
-#include "core/html/HTMLVideoElement.h"
#include "core/rendering/RenderTheme.h"
+#include "wtf/LeakAnnotations.h"
namespace WebCore {
using namespace HTMLNames;
-RuleSet* CSSDefaultStyleSheets::defaultStyle;
-RuleSet* CSSDefaultStyleSheets::defaultViewportStyle;
-RuleSet* CSSDefaultStyleSheets::defaultQuirksStyle;
-RuleSet* CSSDefaultStyleSheets::defaultPrintStyle;
-RuleSet* CSSDefaultStyleSheets::defaultViewSourceStyle;
-RuleSet* CSSDefaultStyleSheets::defaultXHTMLMobileProfileStyle;
-
-StyleSheetContents* CSSDefaultStyleSheets::defaultStyleSheet;
-StyleSheetContents* CSSDefaultStyleSheets::viewportStyleSheet;
-StyleSheetContents* CSSDefaultStyleSheets::quirksStyleSheet;
-StyleSheetContents* CSSDefaultStyleSheets::svgStyleSheet;
-StyleSheetContents* CSSDefaultStyleSheets::mediaControlsStyleSheet;
-StyleSheetContents* CSSDefaultStyleSheets::fullscreenStyleSheet;
+CSSDefaultStyleSheets& CSSDefaultStyleSheets::instance()
+{
+#if ENABLE(OILPAN)
+ DEFINE_STATIC_LOCAL(Persistent<CSSDefaultStyleSheets>, cssDefaultStyleSheets, (new CSSDefaultStyleSheets()));
+ return *cssDefaultStyleSheets;
+#else
+ DEFINE_STATIC_LOCAL(CSSDefaultStyleSheets, cssDefaultStyleSheets, ());
+ return cssDefaultStyleSheets;
+#endif
+}
static const MediaQueryEvaluator& screenEval()
{
@@ -69,100 +67,153 @@ static const MediaQueryEvaluator& printEval()
return staticPrintEval;
}
-static StyleSheetContents* parseUASheet(const String& str)
+static PassRefPtrWillBeRawPtr<StyleSheetContents> parseUASheet(const String& str)
{
- StyleSheetContents* sheet = StyleSheetContents::create(CSSParserContext(UASheetMode)).leakRef(); // leak the sheet on purpose
+ RefPtrWillBeRawPtr<StyleSheetContents> sheet = StyleSheetContents::create(CSSParserContext(UASheetMode, 0));
sheet->parseString(str);
- return sheet;
+ // User Agent stylesheets are parsed once for the lifetime of the renderer
+ // and are intentionally leaked.
+ WTF_ANNOTATE_LEAKING_OBJECT_PTR(sheet.get());
+ return sheet.release();
}
-static StyleSheetContents* parseUASheet(const char* characters, unsigned size)
+static PassRefPtrWillBeRawPtr<StyleSheetContents> parseUASheet(const char* characters, unsigned size)
{
return parseUASheet(String(characters, size));
}
-void CSSDefaultStyleSheets::loadDefaultStylesheetIfNecessary()
+CSSDefaultStyleSheets::CSSDefaultStyleSheets()
+ : m_defaultStyle(nullptr)
+ , m_defaultViewportStyle(nullptr)
+ , m_defaultQuirksStyle(nullptr)
+ , m_defaultPrintStyle(nullptr)
+ , m_defaultViewSourceStyle(nullptr)
+ , m_defaultXHTMLMobileProfileStyle(nullptr)
+ , m_defaultTransitionStyle(nullptr)
+ , m_defaultStyleSheet(nullptr)
+ , m_viewportStyleSheet(nullptr)
+ , m_quirksStyleSheet(nullptr)
+ , m_svgStyleSheet(nullptr)
+ , m_mathmlStyleSheet(nullptr)
+ , m_mediaControlsStyleSheet(nullptr)
+ , m_fullscreenStyleSheet(nullptr)
{
- if (!defaultStyle)
- loadDefaultStyle();
-}
-
-void CSSDefaultStyleSheets::loadDefaultStyle()
-{
- ASSERT(!defaultStyle);
- defaultStyle = RuleSet::create().leakPtr();
- defaultViewportStyle = RuleSet::create().leakPtr();
- defaultPrintStyle = RuleSet::create().leakPtr();
- defaultQuirksStyle = RuleSet::create().leakPtr();
+ m_defaultStyle = RuleSet::create();
+ m_defaultViewportStyle = RuleSet::create();
+ m_defaultPrintStyle = RuleSet::create();
+ m_defaultQuirksStyle = RuleSet::create();
// Strict-mode rules.
String defaultRules = String(htmlUserAgentStyleSheet, sizeof(htmlUserAgentStyleSheet)) + RenderTheme::theme().extraDefaultStyleSheet();
- defaultStyleSheet = parseUASheet(defaultRules);
- defaultStyle->addRulesFromSheet(defaultStyleSheet, screenEval());
+ m_defaultStyleSheet = parseUASheet(defaultRules);
+ m_defaultStyle->addRulesFromSheet(defaultStyleSheet(), screenEval());
#if OS(ANDROID)
String viewportRules(viewportAndroidUserAgentStyleSheet, sizeof(viewportAndroidUserAgentStyleSheet));
#else
String viewportRules;
#endif
- viewportStyleSheet = parseUASheet(viewportRules);
- defaultViewportStyle->addRulesFromSheet(viewportStyleSheet, screenEval());
- defaultPrintStyle->addRulesFromSheet(defaultStyleSheet, printEval());
+ m_viewportStyleSheet = parseUASheet(viewportRules);
+ m_defaultViewportStyle->addRulesFromSheet(viewportStyleSheet(), screenEval());
+ m_defaultPrintStyle->addRulesFromSheet(defaultStyleSheet(), printEval());
// Quirks-mode rules.
String quirksRules = String(quirksUserAgentStyleSheet, sizeof(quirksUserAgentStyleSheet)) + RenderTheme::theme().extraQuirksStyleSheet();
- quirksStyleSheet = parseUASheet(quirksRules);
- defaultQuirksStyle->addRulesFromSheet(quirksStyleSheet, screenEval());
+ m_quirksStyleSheet = parseUASheet(quirksRules);
+ m_defaultQuirksStyle->addRulesFromSheet(quirksStyleSheet(), screenEval());
+}
+
+RuleSet* CSSDefaultStyleSheets::defaultViewSourceStyle()
+{
+ if (!m_defaultViewSourceStyle) {
+ m_defaultViewSourceStyle = RuleSet::create();
+ // Loaded stylesheet is leaked on purpose.
+ RefPtrWillBeRawPtr<StyleSheetContents> stylesheet = parseUASheet(sourceUserAgentStyleSheet, sizeof(sourceUserAgentStyleSheet));
+ m_defaultViewSourceStyle->addRulesFromSheet(stylesheet.release().leakRef(), screenEval());
+ }
+ return m_defaultViewSourceStyle.get();
}
-RuleSet* CSSDefaultStyleSheets::viewSourceStyle()
+RuleSet* CSSDefaultStyleSheets::defaultTransitionStyle()
{
- if (!defaultViewSourceStyle) {
- defaultViewSourceStyle = RuleSet::create().leakPtr();
- defaultViewSourceStyle->addRulesFromSheet(parseUASheet(sourceUserAgentStyleSheet, sizeof(sourceUserAgentStyleSheet)), screenEval());
+ if (!m_defaultTransitionStyle) {
+ m_defaultTransitionStyle = RuleSet::create();
+ // Loaded stylesheet is leaked on purpose.
+ RefPtrWillBeRawPtr<StyleSheetContents> stylesheet = parseUASheet(navigationTransitionsUserAgentStyleSheet, sizeof(navigationTransitionsUserAgentStyleSheet));
+ m_defaultTransitionStyle->addRulesFromSheet(stylesheet.release().leakRef(), screenEval());
}
- return defaultViewSourceStyle;
+ return m_defaultTransitionStyle.get();
}
-RuleSet* CSSDefaultStyleSheets::xhtmlMobileProfileStyle()
+RuleSet* CSSDefaultStyleSheets::defaultXHTMLMobileProfileStyle()
{
- if (!defaultXHTMLMobileProfileStyle) {
- defaultXHTMLMobileProfileStyle = RuleSet::create().leakPtr();
- defaultXHTMLMobileProfileStyle->addRulesFromSheet(parseUASheet(xhtmlmpUserAgentStyleSheet, sizeof(xhtmlmpUserAgentStyleSheet)), screenEval());
+ if (!m_defaultXHTMLMobileProfileStyle) {
+ m_defaultXHTMLMobileProfileStyle = RuleSet::create();
+ // Loaded stylesheet is leaked on purpose.
+ RefPtrWillBeRawPtr<StyleSheetContents> stylesheet = parseUASheet(xhtmlmpUserAgentStyleSheet, sizeof(xhtmlmpUserAgentStyleSheet));
+ m_defaultXHTMLMobileProfileStyle->addRulesFromSheet(stylesheet.release().leakRef(), screenEval());
}
- return defaultXHTMLMobileProfileStyle;
+ return m_defaultXHTMLMobileProfileStyle.get();
}
void CSSDefaultStyleSheets::ensureDefaultStyleSheetsForElement(Element* element, bool& changedDefaultStyle)
{
// FIXME: We should assert that the sheet only styles SVG elements.
- if (element->isSVGElement() && !svgStyleSheet) {
- svgStyleSheet = parseUASheet(svgUserAgentStyleSheet, sizeof(svgUserAgentStyleSheet));
- defaultStyle->addRulesFromSheet(svgStyleSheet, screenEval());
- defaultPrintStyle->addRulesFromSheet(svgStyleSheet, printEval());
+ if (element->isSVGElement() && !m_svgStyleSheet) {
+ m_svgStyleSheet = parseUASheet(svgUserAgentStyleSheet, sizeof(svgUserAgentStyleSheet));
+ m_defaultStyle->addRulesFromSheet(svgStyleSheet(), screenEval());
+ m_defaultPrintStyle->addRulesFromSheet(svgStyleSheet(), printEval());
+ changedDefaultStyle = true;
+ }
+
+ // FIXME: We should assert that the sheet only styles MathML elements.
+ if (element->namespaceURI() == MathMLNames::mathmlNamespaceURI
+ && !m_mathmlStyleSheet) {
+ m_mathmlStyleSheet = parseUASheet(mathmlUserAgentStyleSheet,
+ sizeof(mathmlUserAgentStyleSheet));
+ m_defaultStyle->addRulesFromSheet(mathmlStyleSheet(), screenEval());
+ m_defaultPrintStyle->addRulesFromSheet(mathmlStyleSheet(), printEval());
changedDefaultStyle = true;
}
// FIXME: We should assert that this sheet only contains rules for <video> and <audio>.
- if (!mediaControlsStyleSheet && (isHTMLVideoElement(element) || element->hasTagName(audioTag))) {
+ if (!m_mediaControlsStyleSheet && (isHTMLVideoElement(*element) || isHTMLAudioElement(*element))) {
String mediaRules = String(mediaControlsUserAgentStyleSheet, sizeof(mediaControlsUserAgentStyleSheet)) + RenderTheme::theme().extraMediaControlsStyleSheet();
- mediaControlsStyleSheet = parseUASheet(mediaRules);
- defaultStyle->addRulesFromSheet(mediaControlsStyleSheet, screenEval());
- defaultPrintStyle->addRulesFromSheet(mediaControlsStyleSheet, printEval());
+ m_mediaControlsStyleSheet = parseUASheet(mediaRules);
+ m_defaultStyle->addRulesFromSheet(mediaControlsStyleSheet(), screenEval());
+ m_defaultPrintStyle->addRulesFromSheet(mediaControlsStyleSheet(), printEval());
changedDefaultStyle = true;
}
// FIXME: This only works because we Force recalc the entire document so the new sheet
// is loaded for <html> and the correct styles apply to everyone.
- if (!fullscreenStyleSheet && FullscreenElementStack::isFullScreen(&element->document())) {
+ if (!m_fullscreenStyleSheet && FullscreenElementStack::isFullScreen(element->document())) {
String fullscreenRules = String(fullscreenUserAgentStyleSheet, sizeof(fullscreenUserAgentStyleSheet)) + RenderTheme::theme().extraFullScreenStyleSheet();
- fullscreenStyleSheet = parseUASheet(fullscreenRules);
- defaultStyle->addRulesFromSheet(fullscreenStyleSheet, screenEval());
- defaultQuirksStyle->addRulesFromSheet(fullscreenStyleSheet, screenEval());
+ m_fullscreenStyleSheet = parseUASheet(fullscreenRules);
+ m_defaultStyle->addRulesFromSheet(fullscreenStyleSheet(), screenEval());
+ m_defaultQuirksStyle->addRulesFromSheet(fullscreenStyleSheet(), screenEval());
changedDefaultStyle = true;
}
- ASSERT(defaultStyle->features().idsInRules.isEmpty());
- ASSERT(defaultStyle->features().siblingRules.isEmpty());
+ ASSERT(!m_defaultStyle->features().hasIdsInSelectors());
+ ASSERT(m_defaultStyle->features().siblingRules.isEmpty());
+}
+
+void CSSDefaultStyleSheets::trace(Visitor* visitor)
+{
+ visitor->trace(m_defaultStyle);
+ visitor->trace(m_defaultViewportStyle);
+ visitor->trace(m_defaultQuirksStyle);
+ visitor->trace(m_defaultPrintStyle);
+ visitor->trace(m_defaultViewSourceStyle);
+ visitor->trace(m_defaultXHTMLMobileProfileStyle);
+ visitor->trace(m_defaultTransitionStyle);
+ visitor->trace(m_defaultStyleSheet);
+ visitor->trace(m_viewportStyleSheet);
+ visitor->trace(m_quirksStyleSheet);
+ visitor->trace(m_svgStyleSheet);
+ visitor->trace(m_mathmlStyleSheet);
+ visitor->trace(m_mediaControlsStyleSheet);
+ visitor->trace(m_fullscreenStyleSheet);
}
} // namespace WebCore