1 // Copyright 2019 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_CSS_PROPERTIES_CSS_DIRECTION_AWARE_RESOLVER_H_
6 #define THIRD_PARTY_BLINK_RENDERER_CORE_CSS_PROPERTIES_CSS_DIRECTION_AWARE_RESOLVER_H_
7 
8 #include "third_party/blink/renderer/platform/text/text_direction.h"
9 #include "third_party/blink/renderer/platform/text/writing_mode.h"
10 #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
11 
12 namespace blink {
13 
14 class CSSProperty;
15 class StylePropertyShorthand;
16 
17 class CSSDirectionAwareResolver {
18   STATIC_ONLY(CSSDirectionAwareResolver);
19 
20  public:
21   // A group of physical properties that's used by the 'Resolve*' functions
22   // to convert a direction-aware property into a physical property.
23   template <size_t size>
24   class PhysicalGroup {
25    public:
26     PhysicalGroup(const StylePropertyShorthand&);
27     PhysicalGroup(const CSSProperty* (&properties)[size]);
28     const CSSProperty& GetProperty(size_t index) const;
29 
30    private:
31     const CSSProperty** properties_;
32   };
33 
34   static PhysicalGroup<4> BorderGroup();
35   static PhysicalGroup<4> BorderColorGroup();
36   static PhysicalGroup<4> BorderStyleGroup();
37   static PhysicalGroup<4> BorderWidthGroup();
38   static PhysicalGroup<4> InsetGroup();
39   static PhysicalGroup<4> MarginGroup();
40   static PhysicalGroup<2> MaxSizeGroup();
41   static PhysicalGroup<2> MinSizeGroup();
42   static PhysicalGroup<2> OverflowGroup();
43   static PhysicalGroup<2> OverscrollBehaviorGroup();
44   static PhysicalGroup<4> PaddingGroup();
45   static PhysicalGroup<4> ScrollMarginGroup();
46   static PhysicalGroup<4> ScrollPaddingGroup();
47   static PhysicalGroup<2> SizeGroup();
48   static PhysicalGroup<4> VisitedBorderColorGroup();
49 
50   // These resolvers expect a PhysicalGroup with box sides, in the following
51   // order: top, right, bottom, left.
52   static const CSSProperty& ResolveInlineStart(TextDirection,
53                                                WritingMode,
54                                                const PhysicalGroup<4>&);
55   static const CSSProperty& ResolveInlineEnd(TextDirection,
56                                              WritingMode,
57                                              const PhysicalGroup<4>&);
58   static const CSSProperty& ResolveBlockStart(TextDirection,
59                                               WritingMode,
60                                               const PhysicalGroup<4>&);
61   static const CSSProperty& ResolveBlockEnd(TextDirection,
62                                             WritingMode,
63                                             const PhysicalGroup<4>&);
64 
65   // These resolvers expect a PhysicalGroup with dimensions, in the following
66   // order: horizontal, vertical.
67   static const CSSProperty& ResolveInline(TextDirection,
68                                           WritingMode,
69                                           const PhysicalGroup<2>&);
70   static const CSSProperty& ResolveBlock(TextDirection,
71                                          WritingMode,
72                                          const PhysicalGroup<2>&);
73 };
74 
75 }  // namespace blink
76 
77 #endif  // THIRD_PARTY_BLINK_RENDERER_CORE_CSS_PROPERTIES_CSS_DIRECTION_AWARE_RESOLVER_H_
78