#include "third_party/blink/renderer/core/editing/editing_style.h"
#include "base/memory/values_equivalent.h"
#include "base/stl_util.h"
#include "mojo/public/mojom/base/text_direction.mojom-blink.h"
#include "third_party/blink/renderer/core/css/css_color.h"
#include "third_party/blink/renderer/core/css/css_computed_style_declaration.h"
#include "third_party/blink/renderer/core/css/css_identifier_value.h"
#include "third_party/blink/renderer/core/css/css_numeric_literal_value.h"
#include "third_party/blink/renderer/core/css/css_primitive_value.h"
#include "third_party/blink/renderer/core/css/css_primitive_value_mappings.h"
#include "third_party/blink/renderer/core/css/css_property_value_set.h"
#include "third_party/blink/renderer/core/css/css_rule_list.h"
#include "third_party/blink/renderer/core/css/css_style_rule.h"
#include "third_party/blink/renderer/core/css/css_value_list.h"
#include "third_party/blink/renderer/core/css/font_size_functions.h"
#include "third_party/blink/renderer/core/css/parser/css_parser.h"
#include "third_party/blink/renderer/core/css/properties/css_property.h"
#include "third_party/blink/renderer/core/css/properties/longhands.h"
#include "third_party/blink/renderer/core/css/properties/shorthands.h"
#include "third_party/blink/renderer/core/css/resolver/style_resolver.h"
#include "third_party/blink/renderer/core/css/style_rule.h"
#include "third_party/blink/renderer/core/dom/document.h"
#include "third_party/blink/renderer/core/dom/element.h"
#include "third_party/blink/renderer/core/dom/node.h"
#include "third_party/blink/renderer/core/dom/node_computed_style.h"
#include "third_party/blink/renderer/core/dom/node_traversal.h"
#include "third_party/blink/renderer/core/dom/qualified_name.h"
#include "third_party/blink/renderer/core/editing/commands/apply_style_command.h"
#include "third_party/blink/renderer/core/editing/editing_style_utilities.h"
#include "third_party/blink/renderer/core/editing/editing_tri_state.h"
#include "third_party/blink/renderer/core/editing/editing_utilities.h"
#include "third_party/blink/renderer/core/editing/editor.h"
#include "third_party/blink/renderer/core/editing/frame_selection.h"
#include "third_party/blink/renderer/core/editing/position.h"
#include "third_party/blink/renderer/core/editing/serializers/html_interchange.h"
#include "third_party/blink/renderer/core/editing/visible_selection.h"
#include "third_party/blink/renderer/core/frame/local_dom_window.h"
#include "third_party/blink/renderer/core/frame/local_frame.h"
#include "third_party/blink/renderer/core/html/html_font_element.h"
#include "third_party/blink/renderer/core/html/html_span_element.h"
#include "third_party/blink/renderer/core/html_names.h"
#include "third_party/blink/renderer/core/layout/layout_object.h"
#include "third_party/blink/renderer/core/style/computed_style.h"
#include "third_party/blink/renderer/core/style_property_shorthand.h"
#include "third_party/blink/renderer/platform/bindings/exception_state.h"
#include "third_party/blink/renderer/platform/heap/garbage_collected.h"
#include "third_party/blink/renderer/platform/wtf/std_lib_extras.h"
namespace blink {
static const CSSPropertyID kStaticEditingProperties[] = …;
enum EditingPropertiesType { … };
static const Vector<const CSSProperty*>& AllEditingProperties(
const ExecutionContext* execution_context) { … }
static const Vector<const CSSProperty*>& InheritableEditingProperties(
const ExecutionContext* execution_context) { … }
template <class StyleDeclarationType>
static MutableCSSPropertyValueSet* CopyEditingProperties(
const ExecutionContext* execution_context,
StyleDeclarationType* style,
EditingPropertiesType type = kOnlyInheritableEditingProperties) { … }
static inline bool IsEditingProperty(ExecutionContext* execution_context,
CSSPropertyID id) { … }
static MutableCSSPropertyValueSet* GetPropertiesNotIn(
CSSPropertyValueSet* style_with_redundant_properties,
Node*,
CSSStyleDeclaration* base_style,
SecureContextMode);
enum LegacyFontSizeMode { … };
static int LegacyFontSizeFromCSSValue(Document*,
const CSSValue*,
bool,
LegacyFontSizeMode);
class HTMLElementEquivalent : public GarbageCollected<HTMLElementEquivalent> { … };
HTMLElementEquivalent::HTMLElementEquivalent(CSSPropertyID id)
: … { … }
HTMLElementEquivalent::HTMLElementEquivalent(CSSPropertyID id,
const HTMLQualifiedName& tag_name)
: … { … }
HTMLElementEquivalent::HTMLElementEquivalent(CSSPropertyID id,
CSSValueID value_id,
const HTMLQualifiedName& tag_name)
: … { … }
bool HTMLElementEquivalent::ValueIsPresentInStyle(
HTMLElement* element,
CSSPropertyValueSet* style) const { … }
void HTMLElementEquivalent::AddToStyle(Element* element,
EditingStyle* style) const { … }
class HTMLTextDecorationEquivalent final : public HTMLElementEquivalent { … };
HTMLTextDecorationEquivalent::HTMLTextDecorationEquivalent(
CSSValueID primitive_value,
const HTMLQualifiedName& tag_name)
: … { … }
bool HTMLTextDecorationEquivalent::PropertyExistsInStyle(
const CSSPropertyValueSet* style) const { … }
bool HTMLTextDecorationEquivalent::ValueIsPresentInStyle(
HTMLElement* element,
CSSPropertyValueSet* style) const { … }
class HTMLAttributeEquivalent : public HTMLElementEquivalent { … };
HTMLAttributeEquivalent::HTMLAttributeEquivalent(
CSSPropertyID id,
const HTMLQualifiedName& tag_name,
const QualifiedName& attr_name)
: … { … }
HTMLAttributeEquivalent::HTMLAttributeEquivalent(CSSPropertyID id,
const QualifiedName& attr_name)
: … { … }
bool HTMLAttributeEquivalent::ValueIsPresentInStyle(
HTMLElement* element,
CSSPropertyValueSet* style) const { … }
void HTMLAttributeEquivalent::AddToStyle(Element* element,
EditingStyle* style) const { … }
const CSSValue* HTMLAttributeEquivalent::AttributeValueAsCSSValue(
Element* element) const { … }
class HTMLFontSizeEquivalent final : public HTMLAttributeEquivalent { … };
HTMLFontSizeEquivalent::HTMLFontSizeEquivalent()
: … { … }
const CSSValue* HTMLFontSizeEquivalent::AttributeValueAsCSSValue(
Element* element) const { … }
EditingStyle::EditingStyle(Element* element,
PropertiesToInclude properties_to_include) { … }
EditingStyle::EditingStyle(const Position& position,
PropertiesToInclude properties_to_include) { … }
EditingStyle::EditingStyle(const CSSPropertyValueSet* style)
: … { … }
EditingStyle::EditingStyle(CSSPropertyID property_id,
const String& value,
SecureContextMode secure_context_mode)
: … { … }
static Color CssValueToColor(const CSSValue* value) { … }
static inline Color GetFontColor(CSSStyleDeclaration* style) { … }
static inline Color GetFontColor(CSSPropertyValueSet* style) { … }
static inline Color GetBackgroundColor(CSSStyleDeclaration* style) { … }
static inline Color GetBackgroundColor(CSSPropertyValueSet* style) { … }
static inline Color BackgroundColorInEffect(Node* node) { … }
static CSSValueID NormalizeTextAlign(CSSValueID text_align) { … }
static CSSValueID TextAlignResolvingStartAndEnd(CSSValueID text_align,
TextDirection direction) { … }
template <typename T>
static bool IsRedundantTextAlign(MutableCSSPropertyValueSet* style,
T* base_style,
Node* node) { … }
namespace {
Element* ElementFromStyledNode(Node* node) { … }
}
void EditingStyle::Init(Node* node, PropertiesToInclude properties_to_include) { … }
void EditingStyle::RemoveForcedColorsIfNeeded(
const ComputedStyle* computed_style) { … }
void EditingStyle::RemoveInheritedColorsIfNeeded(
const ComputedStyle* computed_style) { … }
CSSValueID EditingStyle::GetProperty(CSSPropertyID property_id) const { … }
void EditingStyle::SetProperty(CSSPropertyID property_id,
const String& value,
bool important,
SecureContextMode secure_context_mode) { … }
void EditingStyle::ReplaceFontSizeByKeywordIfPossible(
const ComputedStyle* computed_style,
SecureContextMode secure_context_mode,
CSSComputedStyleDeclaration* css_computed_style) { … }
void EditingStyle::ExtractFontSizeDelta() { … }
bool EditingStyle::IsEmpty() const { … }
bool EditingStyle::GetTextDirection(
mojo_base::mojom::blink::TextDirection& writing_direction) const { … }
void EditingStyle::OverrideWithStyle(const CSSPropertyValueSet* style) { … }
void EditingStyle::Clear() { … }
EditingStyle* EditingStyle::Copy() const { … }
static const CSSPropertyID kStaticBlockProperties[] = …;
static const Vector<const CSSProperty*>& BlockPropertiesVector(
const ExecutionContext* execution_context) { … }
EditingStyle* EditingStyle::ExtractAndRemoveBlockProperties(
const ExecutionContext* execution_context) { … }
EditingStyle* EditingStyle::ExtractAndRemoveTextDirection(
SecureContextMode secure_context_mode) { … }
void EditingStyle::RemoveBlockProperties(
const ExecutionContext* execution_context) { … }
void EditingStyle::RemoveStyleAddedByElement(Element* element) { … }
void EditingStyle::RemoveStyleConflictingWithStyleOfElement(Element* element) { … }
void EditingStyle::CollapseTextDecorationProperties(
SecureContextMode secure_context_mode) { … }
EditingTriState EditingStyle::TriStateOfStyle(
ExecutionContext* execution_context,
EditingStyle* style,
SecureContextMode secure_context_mode) const { … }
EditingTriState EditingStyle::TriStateOfStyle(
CSSStyleDeclaration* style_to_compare,
Node* node,
ShouldIgnoreTextOnlyProperties should_ignore_text_only_properties,
SecureContextMode secure_context_mode) const { … }
EditingTriState EditingStyle::TriStateOfStyle(
const VisibleSelection& selection,
SecureContextMode secure_context_mode) const { … }
bool EditingStyle::ConflictsWithInlineStyleOfElement(
HTMLElement* element,
EditingStyle* extracted_style,
Vector<CSSPropertyID>* conflicting_properties) const { … }
static const HeapVector<Member<HTMLElementEquivalent>>&
HtmlElementEquivalents() { … }
bool EditingStyle::ConflictsWithImplicitStyleOfElement(
HTMLElement* element,
EditingStyle* extracted_style,
ShouldExtractMatchingStyle should_extract_matching_style) const { … }
static const HeapVector<Member<HTMLAttributeEquivalent>>&
HtmlAttributeEquivalents() { … }
bool EditingStyle::ConflictsWithImplicitStyleOfAttributes(
HTMLElement* element) const { … }
bool EditingStyle::ExtractConflictingImplicitStyleOfAttributes(
HTMLElement* element,
ShouldPreserveWritingDirection should_preserve_writing_direction,
EditingStyle* extracted_style,
Vector<QualifiedName>& conflicting_attributes,
ShouldExtractMatchingStyle should_extract_matching_style) const { … }
bool EditingStyle::StyleIsPresentInComputedStyleOfNode(Node* node) const { … }
bool EditingStyle::ElementIsStyledSpanOrHTMLEquivalent(
const HTMLElement* element) { … }
void EditingStyle::PrepareToApplyAt(
const Position& position,
ShouldPreserveWritingDirection should_preserve_writing_direction) { … }
void EditingStyle::MergeTypingStyle(Document* document) { … }
void EditingStyle::MergeInlineStyleOfElement(
HTMLElement* element,
CSSPropertyOverrideMode mode,
PropertiesToInclude properties_to_include) { … }
static inline bool ElementMatchesAndPropertyIsNotInInlineStyleDecl(
const HTMLElementEquivalent* equivalent,
const Element* element,
EditingStyle::CSSPropertyOverrideMode mode,
CSSPropertyValueSet* style) { … }
static MutableCSSPropertyValueSet* ExtractEditingProperties(
const ExecutionContext* execution_context,
const CSSPropertyValueSet* style,
EditingStyle::PropertiesToInclude properties_to_include) { … }
void EditingStyle::MergeInlineAndImplicitStyleOfElement(
Element* element,
CSSPropertyOverrideMode mode,
PropertiesToInclude properties_to_include) { … }
static const CSSValueList& MergeTextDecorationValues(
const CSSValueList& merged_value,
const CSSValueList& value_to_merge) { … }
void EditingStyle::MergeStyle(const CSSPropertyValueSet* style,
CSSPropertyOverrideMode mode) { … }
static MutableCSSPropertyValueSet* StyleFromMatchedRulesForElement(
Element* element,
unsigned rules_to_include) { … }
void EditingStyle::MergeStyleFromRules(Element* element) { … }
void EditingStyle::MergeStyleFromRulesForSerialization(Element* element) { … }
static void RemovePropertiesInStyle(
MutableCSSPropertyValueSet* style_to_remove_properties_from,
CSSPropertyValueSet* style) { … }
void EditingStyle::RemoveStyleFromRulesAndContext(Element* element,
Element* context) { … }
void EditingStyle::RemovePropertiesInElementDefaultStyle(Element* element) { … }
void EditingStyle::ForceInline() { … }
int EditingStyle::LegacyFontSize(Document* document) const { … }
void EditingStyle::Trace(Visitor* visitor) const { … }
static void ReconcileTextDecorationProperties(
MutableCSSPropertyValueSet* style,
SecureContextMode secure_context_mode) { … }
StyleChange::StyleChange(EditingStyle* style, const Position& position)
: … { … }
static void SetTextDecorationProperty(MutableCSSPropertyValueSet* style,
const CSSValueList* new_text_decoration,
CSSPropertyID property_id,
SecureContextMode secure_context_mode) { … }
static bool GetPrimitiveValueNumber(CSSPropertyValueSet* style,
CSSPropertyID property_id,
float& number) { … }
void StyleChange::ExtractTextStyles(Document* document,
MutableCSSPropertyValueSet* style,
bool is_monospace_font) { … }
static void DiffTextDecorations(MutableCSSPropertyValueSet* style,
CSSPropertyID property_id,
const CSSValue* ref_text_decoration,
SecureContextMode secure_context_mode) { … }
static bool FontWeightIsBold(const CSSValue* font_weight) { … }
static bool FontWeightNeedsResolving(const CSSValue* font_weight) { … }
MutableCSSPropertyValueSet* GetPropertiesNotIn(
CSSPropertyValueSet* style_with_redundant_properties,
Node* node,
CSSStyleDeclaration* base_style,
SecureContextMode secure_context_mode) { … }
CSSValueID GetIdentifierValue(CSSPropertyValueSet* style,
CSSPropertyID property_id) { … }
CSSValueID GetIdentifierValue(CSSStyleDeclaration* style,
CSSPropertyID property_id) { … }
int LegacyFontSizeFromCSSValue(Document* document,
const CSSValue* value,
bool is_monospace_font,
LegacyFontSizeMode mode) { … }
EditingTriState EditingStyle::SelectionHasStyle(const LocalFrame& frame,
CSSPropertyID property_id,
const String& value) { … }
}