blob: 37bf28a0b9801421a9191ad590180e4837c2b42d [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.
#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_CSS_PARSER_CSS_PARSER_IMPL_H_
#define THIRD_PARTY_BLINK_RENDERER_CORE_CSS_PARSER_CSS_PARSER_IMPL_H_
#include <memory>
#include "base/macros.h"
#include "third_party/blink/renderer/core/css/css_property_source_data.h"
#include "third_party/blink/renderer/core/css/css_property_value.h"
#include "third_party/blink/renderer/core/css/css_property_value_set.h"
#include "third_party/blink/renderer/core/css/parser/css_parser_token_range.h"
#include "third_party/blink/renderer/core/css_property_names.h"
#include "third_party/blink/renderer/platform/heap/handle.h"
#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
#include "third_party/blink/renderer/platform/wtf/vector.h"
namespace blink {
class CSSLazyParsingState;
class CSSParserContext;
class CSSParserObserver;
class CSSParserTokenStream;
class StyleRule;
class StyleRuleBase;
class StyleRuleCharset;
class StyleRuleFontFace;
class StyleRuleImport;
class StyleRuleKeyframe;
class StyleRuleKeyframes;
class StyleRuleMedia;
class StyleRuleNamespace;
class StyleRulePage;
class StyleRuleSupports;
class StyleRuleViewport;
class StyleSheetContents;
class Element;
enum class ParseSheetResult {
kSucceeded,
kHasUnallowedImportRule,
};
class CSSParserImpl {
STACK_ALLOCATED();
public:
CSSParserImpl(const CSSParserContext*, StyleSheetContents* = nullptr);
enum AllowedRulesType {
// As per css-syntax, css-cascade and css-namespaces, @charset rules
// must come first, followed by @import then @namespace.
// AllowImportRules actually means we allow @import and any rules thay
// may follow it, i.e. @namespace rules and regular rules.
// AllowCharsetRules and AllowNamespaceRules behave similarly.
kAllowCharsetRules,
kAllowImportRules,
kAllowNamespaceRules,
kRegularRules,
kKeyframeRules,
kNoRules, // For parsing at-rules inside declaration lists
};
// Represents the start and end offsets of a CSSParserTokenRange.
struct RangeOffset {
wtf_size_t start, end;
RangeOffset(wtf_size_t start, wtf_size_t end) : start(start), end(end) {
DCHECK(start <= end);
}
// Used when we don't care what the offset is (typically when we don't have
// an observer).
static RangeOffset Ignore() { return {0, 0}; }
};
static MutableCSSPropertyValueSet::SetResult ParseValue(
MutableCSSPropertyValueSet*,
CSSPropertyID,
const String&,
bool important,
const CSSParserContext*);
static MutableCSSPropertyValueSet::SetResult ParseVariableValue(
MutableCSSPropertyValueSet*,
const AtomicString& property_name,
const PropertyRegistry*,
const String&,
bool important,
const CSSParserContext*,
bool is_animation_tainted);
static ImmutableCSSPropertyValueSet* ParseInlineStyleDeclaration(
const String&,
Element*);
static bool ParseDeclarationList(MutableCSSPropertyValueSet*,
const String&,
const CSSParserContext*);
static StyleRuleBase* ParseRule(const String&,
const CSSParserContext*,
StyleSheetContents*,
AllowedRulesType);
static ParseSheetResult ParseStyleSheet(
const String&,
const CSSParserContext*,
StyleSheetContents*,
CSSDeferPropertyParsing = CSSDeferPropertyParsing::kNo,
bool allow_import_rules = true);
static CSSSelectorList ParsePageSelector(CSSParserTokenRange,
StyleSheetContents*);
static std::unique_ptr<Vector<double>> ParseKeyframeKeyList(const String&);
bool SupportsDeclaration(CSSParserTokenRange&);
static void ParseDeclarationListForInspector(const String&,
const CSSParserContext*,
CSSParserObserver&);
static void ParseStyleSheetForInspector(const String&,
const CSSParserContext*,
StyleSheetContents*,
CSSParserObserver&);
static CSSPropertyValueSet* ParseDeclarationListForLazyStyle(
const String&,
wtf_size_t offset,
const CSSParserContext*);
private:
enum RuleListType { kTopLevelRuleList, kRegularRuleList, kKeyframesRuleList };
// Returns whether the first encountered rule was valid
template <typename T>
bool ConsumeRuleList(CSSParserTokenStream&, RuleListType, T callback);
// These functions update the range/stream they're given
StyleRuleBase* ConsumeAtRule(CSSParserTokenStream&, AllowedRulesType);
StyleRuleBase* ConsumeQualifiedRule(CSSParserTokenStream&, AllowedRulesType);
static StyleRuleCharset* ConsumeCharsetRule(CSSParserTokenRange prelude);
StyleRuleImport* ConsumeImportRule(AtomicString prelude_uri,
CSSParserTokenRange prelude,
const RangeOffset& prelude_offset);
StyleRuleNamespace* ConsumeNamespaceRule(CSSParserTokenRange prelude);
StyleRuleMedia* ConsumeMediaRule(CSSParserTokenRange prelude,
const RangeOffset& prelude_offset,
CSSParserTokenStream& block);
StyleRuleSupports* ConsumeSupportsRule(CSSParserTokenRange prelude,
const RangeOffset& prelude_offset,
CSSParserTokenStream& block);
StyleRuleViewport* ConsumeViewportRule(CSSParserTokenRange prelude,
const RangeOffset& prelude_offset,
CSSParserTokenStream& block);
StyleRuleFontFace* ConsumeFontFaceRule(CSSParserTokenRange prelude,
const RangeOffset& prelude_offset,
CSSParserTokenStream& block);
StyleRuleKeyframes* ConsumeKeyframesRule(bool webkit_prefixed,
CSSParserTokenRange prelude,
const RangeOffset& prelude_offset,
CSSParserTokenStream& block);
StyleRulePage* ConsumePageRule(CSSParserTokenRange prelude,
const RangeOffset& prelude_offset,
CSSParserTokenStream& block);
StyleRuleKeyframe* ConsumeKeyframeStyleRule(CSSParserTokenRange prelude,
const RangeOffset& prelude_offset,
CSSParserTokenStream& block);
StyleRule* ConsumeStyleRule(CSSParserTokenStream&);
void ConsumeDeclarationList(CSSParserTokenStream&, StyleRule::RuleType);
void ConsumeDeclaration(CSSParserTokenRange,
const RangeOffset& decl_offset,
StyleRule::RuleType);
void ConsumeDeclarationValue(CSSParserTokenRange,
CSSPropertyID,
bool important,
StyleRule::RuleType);
void ConsumeVariableValue(CSSParserTokenRange,
const AtomicString& property_name,
bool important,
bool is_animation_tainted);
static std::unique_ptr<Vector<double>> ConsumeKeyframeKeyList(
CSSParserTokenRange);
// FIXME: Can we build CSSPropertyValueSets directly?
// FIXME: Investigate using a smaller inline buffer
HeapVector<CSSPropertyValue, 256> parsed_properties_;
Member<const CSSParserContext> context_;
Member<StyleSheetContents> style_sheet_;
// For the inspector
CSSParserObserver* observer_;
Member<CSSLazyParsingState> lazy_state_;
DISALLOW_COPY_AND_ASSIGN(CSSParserImpl);
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_CORE_CSS_PARSER_CSS_PARSER_IMPL_H_