blob: 0531421b4e0743ce5c11af808165a761ba12e064 [file] [log] [blame]
/*
* Copyright 2015 Google Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef COBALT_DOM_PSEUDO_ELEMENT_H_
#define COBALT_DOM_PSEUDO_ELEMENT_H_
#include "base/memory/ref_counted.h"
#include "base/optional.h"
#include "cobalt/cssom/animation_set.h"
#include "cobalt/cssom/css_computed_style_declaration.h"
#include "cobalt/cssom/css_style_rule.h"
#include "cobalt/cssom/css_transition_set.h"
#include "cobalt/dom/css_animations_adapter.h"
#include "cobalt/dom/css_transitions_adapter.h"
namespace cobalt {
namespace dom {
class HTMLElement;
// Pseudo-elements create abstractions about the document tree beyond those
// specified by the document language.
// Pseudo elements are css selectors that can be applied to a DOM element and
// then cause sub-elements to be created that have their own style and/or
// content, but that do not exist in the DOM tree.
// Examples are generated content elements with '::after' and '::before', or
// styles that affect parts of the DOM element they are attached to, such as
// '::first-line'.
// https://www.w3.org/TR/selectors4/#pseudo-elements
// https://www.w3.org/TR/CSS21/generate.html#before-after-content
// This class adds a container for the DOM state needed for pseudo elements.
class PseudoElement {
public:
explicit PseudoElement(HTMLElement* parent_element);
~PseudoElement() {}
// Used by layout engine to cache the computed values.
// See https://www.w3.org/TR/css-cascade-3/#computed for the definition of
// computed value.
scoped_refptr<cssom::CSSComputedStyleDeclaration>&
css_computed_style_declaration() {
return css_computed_style_declaration_;
}
scoped_refptr<const cssom::CSSComputedStyleData> computed_style() const {
return css_computed_style_declaration_->data();
}
void set_computed_style(
const scoped_refptr<const cssom::CSSComputedStyleData>& computed_style) {
css_computed_style_declaration_->set_data(computed_style);
}
cssom::RulesWithCascadePrecedence* matching_rules() {
return &matching_rules_;
}
cssom::TransitionSet* css_transitions() { return &css_transitions_.value(); }
cssom::AnimationSet* css_animations() { return &css_animations_.value(); }
const scoped_refptr<web_animations::AnimationSet>& animations() {
return animations_;
}
HTMLElement* parent_element() { return parent_element_; }
void ClearMatchingRules() { matching_rules_.clear(); }
private:
HTMLElement* parent_element_;
scoped_refptr<web_animations::AnimationSet> animations_;
scoped_refptr<cssom::CSSComputedStyleDeclaration>
css_computed_style_declaration_;
base::optional<CSSTransitionsAdapter> transitions_adapter_;
base::optional<cssom::TransitionSet> css_transitions_;
base::optional<CSSAnimationsAdapter> animations_adapter_;
base::optional<cssom::AnimationSet> css_animations_;
cssom::RulesWithCascadePrecedence matching_rules_;
// PseudoElement is a friend of Animatable so that animatable can insert and
// remove animations into PseudoElement's set of animations.
friend class DOMAnimatable;
};
} // namespace dom
} // namespace cobalt
#endif // COBALT_DOM_PSEUDO_ELEMENT_H_