diff options
Diffstat (limited to 'chromium/third_party/WebKit/Source/core/css/CSSDefaultStyleSheets.cpp')
-rw-r--r-- | chromium/third_party/WebKit/Source/core/css/CSSDefaultStyleSheets.cpp | 175 |
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 |