Coverage Report

Created: 2025-12-18 07:52

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/serenity/Userland/Libraries/LibWeb/CSS/StyleValues/CSSMathValue.h
Line
Count
Source
1
/*
2
 * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
3
 * Copyright (c) 2021, Tobias Christiansen <tobyase@serenityos.org>
4
 * Copyright (c) 2021-2024, Sam Atkins <sam@ladybird.org>
5
 * Copyright (c) 2022-2023, MacDue <macdue@dueutil.tech>
6
 *
7
 * SPDX-License-Identifier: BSD-2-Clause
8
 */
9
10
#pragma once
11
12
#include <AK/Function.h>
13
#include <LibWeb/CSS/Angle.h>
14
#include <LibWeb/CSS/CSSNumericType.h>
15
#include <LibWeb/CSS/CSSStyleValue.h>
16
#include <LibWeb/CSS/Flex.h>
17
#include <LibWeb/CSS/Frequency.h>
18
#include <LibWeb/CSS/Length.h>
19
#include <LibWeb/CSS/Percentage.h>
20
#include <LibWeb/CSS/Resolution.h>
21
#include <LibWeb/CSS/Time.h>
22
23
namespace Web::CSS {
24
25
class CalculationNode;
26
27
class CSSMathValue : public CSSStyleValue {
28
public:
29
    enum class ResolvedType {
30
        Angle,
31
        Flex,
32
        Frequency,
33
        Integer,
34
        Length,
35
        Number,
36
        Percentage,
37
        Resolution,
38
        Time,
39
    };
40
41
    enum class SumOperation {
42
        Add,
43
        Subtract,
44
    };
45
    enum class ProductOperation {
46
        Multiply,
47
        Divide,
48
    };
49
50
    using PercentageBasis = Variant<Empty, Angle, Flex, Frequency, Length, Time>;
51
52
    class CalculationResult {
53
    public:
54
        using Value = Variant<Number, Angle, Flex, Frequency, Length, Percentage, Resolution, Time>;
55
        CalculationResult(Value value)
56
0
            : m_value(move(value))
57
0
        {
58
0
        }
59
        void add(CalculationResult const& other, Optional<Length::ResolutionContext const&>, PercentageBasis const& percentage_basis);
60
        void subtract(CalculationResult const& other, Optional<Length::ResolutionContext const&>, PercentageBasis const& percentage_basis);
61
        void multiply_by(CalculationResult const& other, Optional<Length::ResolutionContext const&>);
62
        void divide_by(CalculationResult const& other, Optional<Length::ResolutionContext const&>);
63
        void negate();
64
        void invert();
65
66
0
        Value const& value() const { return m_value; }
67
68
        ResolvedType resolved_type() const;
69
70
        [[nodiscard]] bool operator==(CalculationResult const&) const = default;
71
72
    private:
73
        void add_or_subtract_internal(SumOperation op, CalculationResult const& other, Optional<Length::ResolutionContext const&>, PercentageBasis const& percentage_basis);
74
        Value m_value;
75
    };
76
77
    static ValueComparingNonnullRefPtr<CSSMathValue> create(NonnullOwnPtr<CalculationNode> calculation, CSSNumericType resolved_type)
78
0
    {
79
0
        return adopt_ref(*new (nothrow) CSSMathValue(move(calculation), resolved_type));
80
0
    }
81
82
    String to_string() const override;
83
    virtual bool equals(CSSStyleValue const& other) const override;
84
85
0
    bool resolves_to_angle() const { return m_resolved_type.matches_angle(); }
86
0
    bool resolves_to_angle_percentage() const { return m_resolved_type.matches_angle_percentage(); }
87
    Optional<Angle> resolve_angle() const;
88
    Optional<Angle> resolve_angle(Layout::Node const& layout_node) const;
89
    Optional<Angle> resolve_angle(Length::ResolutionContext const& context) const;
90
    Optional<Angle> resolve_angle_percentage(Angle const& percentage_basis) const;
91
92
0
    bool resolves_to_flex() const { return m_resolved_type.matches_flex(); }
93
    Optional<Flex> resolve_flex() const;
94
95
0
    bool resolves_to_frequency() const { return m_resolved_type.matches_frequency(); }
96
0
    bool resolves_to_frequency_percentage() const { return m_resolved_type.matches_frequency_percentage(); }
97
    Optional<Frequency> resolve_frequency() const;
98
    Optional<Frequency> resolve_frequency_percentage(Frequency const& percentage_basis) const;
99
100
0
    bool resolves_to_length() const { return m_resolved_type.matches_length(); }
101
0
    bool resolves_to_length_percentage() const { return m_resolved_type.matches_length_percentage(); }
102
    [[nodiscard]] Optional<Length> resolve_length(Length::ResolutionContext const&) const;
103
    Optional<Length> resolve_length(Layout::Node const& layout_node) const;
104
    Optional<Length> resolve_length_percentage(Layout::Node const&, Length const& percentage_basis) const;
105
    Optional<Length> resolve_length_percentage(Layout::Node const&, CSSPixels percentage_basis) const;
106
    Optional<Length> resolve_length_percentage(Length::ResolutionContext const&, Length const& percentage_basis) const;
107
108
0
    bool resolves_to_percentage() const { return m_resolved_type.matches_percentage(); }
109
    Optional<Percentage> resolve_percentage() const;
110
111
0
    bool resolves_to_resolution() const { return m_resolved_type.matches_resolution(); }
112
    Optional<Resolution> resolve_resolution() const;
113
114
0
    bool resolves_to_time() const { return m_resolved_type.matches_time(); }
115
0
    bool resolves_to_time_percentage() const { return m_resolved_type.matches_time_percentage(); }
116
    Optional<Time> resolve_time() const;
117
    Optional<Time> resolve_time_percentage(Time const& percentage_basis) const;
118
119
0
    bool resolves_to_number() const { return m_resolved_type.matches_number(); }
120
0
    bool resolves_to_number_percentage() const { return m_resolved_type.matches_number_percentage(); }
121
    Optional<double> resolve_number() const;
122
    Optional<i64> resolve_integer() const;
123
124
0
    bool resolves_to_dimension() const { return m_resolved_type.matches_dimension(); }
125
126
    bool contains_percentage() const;
127
128
    String dump() const;
129
130
private:
131
    explicit CSSMathValue(NonnullOwnPtr<CalculationNode> calculation, CSSNumericType resolved_type)
132
0
        : CSSStyleValue(Type::Math)
133
0
        , m_resolved_type(resolved_type)
134
0
        , m_calculation(move(calculation))
135
0
    {
136
0
    }
137
138
    CSSNumericType m_resolved_type;
139
    NonnullOwnPtr<CalculationNode> m_calculation;
140
};
141
142
// https://www.w3.org/TR/css-values-4/#calculation-tree
143
class CalculationNode {
144
public:
145
    // https://drafts.csswg.org/css-values-4/#calc-constants
146
    // https://drafts.csswg.org/css-values-4/#calc-error-constants
147
    enum class ConstantType {
148
        E,
149
        Pi,
150
        NaN,
151
        Infinity,
152
        MinusInfinity,
153
    };
154
    static Optional<ConstantType> constant_type_from_string(StringView);
155
156
    enum class Type {
157
        Numeric,
158
        // NOTE: Currently, any value with a `var()` or `attr()` function in it is always an
159
        //       UnresolvedStyleValue so we do not have to implement a NonMathFunction type here.
160
161
        // Comparison function nodes, a sub-type of operator node
162
        // https://drafts.csswg.org/css-values-4/#comp-func
163
        Min,
164
        Max,
165
        Clamp,
166
167
        // Calc-operator nodes, a sub-type of operator node
168
        // https://www.w3.org/TR/css-values-4/#calculation-tree-calc-operator-nodes
169
        Sum,
170
        Product,
171
        Negate,
172
        Invert,
173
174
        // Sign-Related Functions, a sub-type of operator node
175
        // https://drafts.csswg.org/css-values-4/#sign-funcs
176
        Abs,
177
        Sign,
178
179
        // Constant Nodes
180
        // https://drafts.csswg.org/css-values-4/#calc-constants
181
        Constant,
182
183
        // Trigonometric functions, a sub-type of operator node
184
        // https://drafts.csswg.org/css-values-4/#trig-funcs
185
        Sin,
186
        Cos,
187
        Tan,
188
        Asin,
189
        Acos,
190
        Atan,
191
        Atan2,
192
193
        // Exponential functions, a sub-type of operator node
194
        // https://drafts.csswg.org/css-values-4/#exponent-funcs
195
        Pow,
196
        Sqrt,
197
        Hypot,
198
        Log,
199
        Exp,
200
201
        // Stepped value functions, a sub-type of operator node
202
        // https://drafts.csswg.org/css-values-4/#round-func
203
        Round,
204
        Mod,
205
        Rem,
206
207
        // This only exists during parsing.
208
        Unparsed,
209
    };
210
    using NumericValue = CSSMathValue::CalculationResult::Value;
211
212
    virtual ~CalculationNode();
213
214
0
    Type type() const { return m_type; }
215
216
    // https://www.w3.org/TR/css-values-4/#calculation-tree-operator-nodes
217
    bool is_operator_node() const
218
0
    {
219
0
        return is_calc_operator_node() || is_math_function_node();
220
0
    }
221
222
    bool is_math_function_node() const
223
0
    {
224
0
        switch (m_type) {
225
0
        case Type::Min:
226
0
        case Type::Max:
227
0
        case Type::Clamp:
228
0
        case Type::Abs:
229
0
        case Type::Sign:
230
0
        case Type::Sin:
231
0
        case Type::Cos:
232
0
        case Type::Tan:
233
0
        case Type::Asin:
234
0
        case Type::Acos:
235
0
        case Type::Atan:
236
0
        case Type::Atan2:
237
0
        case Type::Pow:
238
0
        case Type::Sqrt:
239
0
        case Type::Hypot:
240
0
        case Type::Log:
241
0
        case Type::Exp:
242
0
        case Type::Round:
243
0
        case Type::Mod:
244
0
        case Type::Rem:
245
0
            return true;
246
0
247
0
        default:
248
0
            return false;
249
0
        }
250
0
    }
251
252
    // https://www.w3.org/TR/css-values-4/#calculation-tree-calc-operator-nodes
253
    bool is_calc_operator_node() const
254
0
    {
255
0
        return first_is_one_of(m_type, Type::Sum, Type::Product, Type::Negate, Type::Invert);
256
0
    }
257
258
    virtual String to_string() const = 0;
259
    virtual Optional<CSSMathValue::ResolvedType> resolved_type() const = 0;
260
    virtual Optional<CSSNumericType> determine_type(PropertyID) const = 0;
261
    virtual bool contains_percentage() const = 0;
262
    virtual CSSMathValue::CalculationResult resolve(Optional<Length::ResolutionContext const&>, CSSMathValue::PercentageBasis const&) const = 0;
263
    virtual void for_each_child_node(Function<void(NonnullOwnPtr<CalculationNode>&)> const&) = 0;
264
265
    virtual void dump(StringBuilder&, int indent) const = 0;
266
    virtual bool equals(CalculationNode const&) const = 0;
267
268
protected:
269
    explicit CalculationNode(Type);
270
271
private:
272
    Type m_type;
273
};
274
275
class NumericCalculationNode final : public CalculationNode {
276
public:
277
    static NonnullOwnPtr<NumericCalculationNode> create(NumericValue);
278
    ~NumericCalculationNode();
279
280
    virtual String to_string() const override;
281
    virtual Optional<CSSMathValue::ResolvedType> resolved_type() const override;
282
    virtual Optional<CSSNumericType> determine_type(PropertyID) const override;
283
    virtual bool contains_percentage() const override;
284
    virtual CSSMathValue::CalculationResult resolve(Optional<Length::ResolutionContext const&>, CSSMathValue::PercentageBasis const&) const override;
285
0
    virtual void for_each_child_node(Function<void(NonnullOwnPtr<CalculationNode>&)> const&) override { }
286
287
    virtual void dump(StringBuilder&, int indent) const override;
288
    virtual bool equals(CalculationNode const&) const override;
289
290
private:
291
    explicit NumericCalculationNode(NumericValue);
292
    NumericValue m_value;
293
};
294
295
class SumCalculationNode final : public CalculationNode {
296
public:
297
    static NonnullOwnPtr<SumCalculationNode> create(Vector<NonnullOwnPtr<CalculationNode>>);
298
    ~SumCalculationNode();
299
300
    virtual String to_string() const override;
301
    virtual Optional<CSSMathValue::ResolvedType> resolved_type() const override;
302
    virtual Optional<CSSNumericType> determine_type(PropertyID) const override;
303
    virtual bool contains_percentage() const override;
304
    virtual CSSMathValue::CalculationResult resolve(Optional<Length::ResolutionContext const&>, CSSMathValue::PercentageBasis const&) const override;
305
    virtual void for_each_child_node(Function<void(NonnullOwnPtr<CalculationNode>&)> const&) override;
306
307
    virtual void dump(StringBuilder&, int indent) const override;
308
    virtual bool equals(CalculationNode const&) const override;
309
310
private:
311
    explicit SumCalculationNode(Vector<NonnullOwnPtr<CalculationNode>>);
312
    Vector<NonnullOwnPtr<CalculationNode>> m_values;
313
};
314
315
class ProductCalculationNode final : public CalculationNode {
316
public:
317
    static NonnullOwnPtr<ProductCalculationNode> create(Vector<NonnullOwnPtr<CalculationNode>>);
318
    ~ProductCalculationNode();
319
320
    virtual String to_string() const override;
321
    virtual Optional<CSSMathValue::ResolvedType> resolved_type() const override;
322
    virtual Optional<CSSNumericType> determine_type(PropertyID) const override;
323
    virtual bool contains_percentage() const override;
324
    virtual CSSMathValue::CalculationResult resolve(Optional<Length::ResolutionContext const&>, CSSMathValue::PercentageBasis const&) const override;
325
    virtual void for_each_child_node(Function<void(NonnullOwnPtr<CalculationNode>&)> const&) override;
326
327
    virtual void dump(StringBuilder&, int indent) const override;
328
    virtual bool equals(CalculationNode const&) const override;
329
330
private:
331
    explicit ProductCalculationNode(Vector<NonnullOwnPtr<CalculationNode>>);
332
    Vector<NonnullOwnPtr<CalculationNode>> m_values;
333
};
334
335
class NegateCalculationNode final : public CalculationNode {
336
public:
337
    static NonnullOwnPtr<NegateCalculationNode> create(NonnullOwnPtr<CalculationNode>);
338
    ~NegateCalculationNode();
339
340
    virtual String to_string() const override;
341
    virtual Optional<CSSMathValue::ResolvedType> resolved_type() const override;
342
    virtual Optional<CSSNumericType> determine_type(PropertyID) const override;
343
    virtual bool contains_percentage() const override;
344
    virtual CSSMathValue::CalculationResult resolve(Optional<Length::ResolutionContext const&>, CSSMathValue::PercentageBasis const&) const override;
345
    virtual void for_each_child_node(Function<void(NonnullOwnPtr<CalculationNode>&)> const&) override;
346
347
    virtual void dump(StringBuilder&, int indent) const override;
348
    virtual bool equals(CalculationNode const&) const override;
349
350
private:
351
    explicit NegateCalculationNode(NonnullOwnPtr<CalculationNode>);
352
    NonnullOwnPtr<CalculationNode> m_value;
353
};
354
355
class InvertCalculationNode final : public CalculationNode {
356
public:
357
    static NonnullOwnPtr<InvertCalculationNode> create(NonnullOwnPtr<CalculationNode>);
358
    ~InvertCalculationNode();
359
360
    virtual String to_string() const override;
361
    virtual Optional<CSSMathValue::ResolvedType> resolved_type() const override;
362
    virtual Optional<CSSNumericType> determine_type(PropertyID) const override;
363
    virtual bool contains_percentage() const override;
364
    virtual CSSMathValue::CalculationResult resolve(Optional<Length::ResolutionContext const&>, CSSMathValue::PercentageBasis const&) const override;
365
    virtual void for_each_child_node(Function<void(NonnullOwnPtr<CalculationNode>&)> const&) override;
366
367
    virtual void dump(StringBuilder&, int indent) const override;
368
    virtual bool equals(CalculationNode const&) const override;
369
370
private:
371
    explicit InvertCalculationNode(NonnullOwnPtr<CalculationNode>);
372
    NonnullOwnPtr<CalculationNode> m_value;
373
};
374
375
class MinCalculationNode final : public CalculationNode {
376
public:
377
    static NonnullOwnPtr<MinCalculationNode> create(Vector<NonnullOwnPtr<CalculationNode>>);
378
    ~MinCalculationNode();
379
380
    virtual String to_string() const override;
381
    virtual Optional<CSSMathValue::ResolvedType> resolved_type() const override;
382
    virtual Optional<CSSNumericType> determine_type(PropertyID) const override;
383
    virtual bool contains_percentage() const override;
384
    virtual CSSMathValue::CalculationResult resolve(Optional<Length::ResolutionContext const&>, CSSMathValue::PercentageBasis const&) const override;
385
    virtual void for_each_child_node(Function<void(NonnullOwnPtr<CalculationNode>&)> const&) override;
386
387
    virtual void dump(StringBuilder&, int indent) const override;
388
    virtual bool equals(CalculationNode const&) const override;
389
390
private:
391
    explicit MinCalculationNode(Vector<NonnullOwnPtr<CalculationNode>>);
392
    Vector<NonnullOwnPtr<CalculationNode>> m_values;
393
};
394
395
class MaxCalculationNode final : public CalculationNode {
396
public:
397
    static NonnullOwnPtr<MaxCalculationNode> create(Vector<NonnullOwnPtr<CalculationNode>>);
398
    ~MaxCalculationNode();
399
400
    virtual String to_string() const override;
401
    virtual Optional<CSSMathValue::ResolvedType> resolved_type() const override;
402
    virtual Optional<CSSNumericType> determine_type(PropertyID) const override;
403
    virtual bool contains_percentage() const override;
404
    virtual CSSMathValue::CalculationResult resolve(Optional<Length::ResolutionContext const&>, CSSMathValue::PercentageBasis const&) const override;
405
    virtual void for_each_child_node(Function<void(NonnullOwnPtr<CalculationNode>&)> const&) override;
406
407
    virtual void dump(StringBuilder&, int indent) const override;
408
    virtual bool equals(CalculationNode const&) const override;
409
410
private:
411
    explicit MaxCalculationNode(Vector<NonnullOwnPtr<CalculationNode>>);
412
    Vector<NonnullOwnPtr<CalculationNode>> m_values;
413
};
414
415
class ClampCalculationNode final : public CalculationNode {
416
public:
417
    static NonnullOwnPtr<ClampCalculationNode> create(NonnullOwnPtr<CalculationNode>, NonnullOwnPtr<CalculationNode>, NonnullOwnPtr<CalculationNode>);
418
    ~ClampCalculationNode();
419
420
    virtual String to_string() const override;
421
    virtual Optional<CSSMathValue::ResolvedType> resolved_type() const override;
422
    virtual Optional<CSSNumericType> determine_type(PropertyID) const override;
423
    virtual bool contains_percentage() const override;
424
    virtual CSSMathValue::CalculationResult resolve(Optional<Length::ResolutionContext const&>, CSSMathValue::PercentageBasis const&) const override;
425
    virtual void for_each_child_node(Function<void(NonnullOwnPtr<CalculationNode>&)> const&) override;
426
427
    virtual void dump(StringBuilder&, int indent) const override;
428
    virtual bool equals(CalculationNode const&) const override;
429
430
private:
431
    explicit ClampCalculationNode(NonnullOwnPtr<CalculationNode>, NonnullOwnPtr<CalculationNode>, NonnullOwnPtr<CalculationNode>);
432
    NonnullOwnPtr<CalculationNode> m_min_value;
433
    NonnullOwnPtr<CalculationNode> m_center_value;
434
    NonnullOwnPtr<CalculationNode> m_max_value;
435
};
436
437
class AbsCalculationNode final : public CalculationNode {
438
public:
439
    static NonnullOwnPtr<AbsCalculationNode> create(NonnullOwnPtr<CalculationNode>);
440
    ~AbsCalculationNode();
441
442
    virtual String to_string() const override;
443
    virtual Optional<CSSMathValue::ResolvedType> resolved_type() const override;
444
    virtual Optional<CSSNumericType> determine_type(PropertyID) const override;
445
    virtual bool contains_percentage() const override;
446
    virtual CSSMathValue::CalculationResult resolve(Optional<Length::ResolutionContext const&>, CSSMathValue::PercentageBasis const&) const override;
447
    virtual void for_each_child_node(Function<void(NonnullOwnPtr<CalculationNode>&)> const&) override;
448
449
    virtual void dump(StringBuilder&, int indent) const override;
450
    virtual bool equals(CalculationNode const&) const override;
451
452
private:
453
    AbsCalculationNode(NonnullOwnPtr<CalculationNode>);
454
    NonnullOwnPtr<CalculationNode> m_value;
455
};
456
457
class SignCalculationNode final : public CalculationNode {
458
public:
459
    static NonnullOwnPtr<SignCalculationNode> create(NonnullOwnPtr<CalculationNode>);
460
    ~SignCalculationNode();
461
462
    virtual String to_string() const override;
463
    virtual Optional<CSSMathValue::ResolvedType> resolved_type() const override;
464
    virtual Optional<CSSNumericType> determine_type(PropertyID) const override;
465
    virtual bool contains_percentage() const override;
466
    virtual CSSMathValue::CalculationResult resolve(Optional<Length::ResolutionContext const&>, CSSMathValue::PercentageBasis const&) const override;
467
    virtual void for_each_child_node(Function<void(NonnullOwnPtr<CalculationNode>&)> const&) override;
468
469
    virtual void dump(StringBuilder&, int indent) const override;
470
    virtual bool equals(CalculationNode const&) const override;
471
472
private:
473
    SignCalculationNode(NonnullOwnPtr<CalculationNode>);
474
    NonnullOwnPtr<CalculationNode> m_value;
475
};
476
477
class ConstantCalculationNode final : public CalculationNode {
478
public:
479
    static NonnullOwnPtr<ConstantCalculationNode> create(CalculationNode::ConstantType);
480
    ~ConstantCalculationNode();
481
482
    virtual String to_string() const override;
483
    virtual Optional<CSSMathValue::ResolvedType> resolved_type() const override;
484
    virtual Optional<CSSNumericType> determine_type(PropertyID) const override;
485
0
    virtual bool contains_percentage() const override { return false; }
486
    virtual CSSMathValue::CalculationResult resolve(Optional<Length::ResolutionContext const&> context, CSSMathValue::PercentageBasis const&) const override;
487
0
    virtual void for_each_child_node(Function<void(NonnullOwnPtr<CalculationNode>&)> const&) override { }
488
489
    virtual void dump(StringBuilder&, int indent) const override;
490
    virtual bool equals(CalculationNode const&) const override;
491
492
private:
493
    ConstantCalculationNode(ConstantType);
494
    CalculationNode::ConstantType m_constant;
495
};
496
497
class SinCalculationNode final : public CalculationNode {
498
public:
499
    static NonnullOwnPtr<SinCalculationNode> create(NonnullOwnPtr<CalculationNode>);
500
    ~SinCalculationNode();
501
502
    virtual String to_string() const override;
503
    virtual Optional<CSSMathValue::ResolvedType> resolved_type() const override;
504
    virtual Optional<CSSNumericType> determine_type(PropertyID) const override;
505
    virtual bool contains_percentage() const override;
506
    virtual CSSMathValue::CalculationResult resolve(Optional<Length::ResolutionContext const&>, CSSMathValue::PercentageBasis const&) const override;
507
    virtual void for_each_child_node(Function<void(NonnullOwnPtr<CalculationNode>&)> const&) override;
508
509
    virtual void dump(StringBuilder&, int indent) const override;
510
    virtual bool equals(CalculationNode const&) const override;
511
512
private:
513
    SinCalculationNode(NonnullOwnPtr<CalculationNode>);
514
    NonnullOwnPtr<CalculationNode> m_value;
515
};
516
517
class CosCalculationNode final : public CalculationNode {
518
public:
519
    static NonnullOwnPtr<CosCalculationNode> create(NonnullOwnPtr<CalculationNode>);
520
    ~CosCalculationNode();
521
522
    virtual String to_string() const override;
523
    virtual Optional<CSSMathValue::ResolvedType> resolved_type() const override;
524
    virtual Optional<CSSNumericType> determine_type(PropertyID) const override;
525
    virtual bool contains_percentage() const override;
526
    virtual CSSMathValue::CalculationResult resolve(Optional<Length::ResolutionContext const&>, CSSMathValue::PercentageBasis const&) const override;
527
    virtual void for_each_child_node(Function<void(NonnullOwnPtr<CalculationNode>&)> const&) override;
528
529
    virtual void dump(StringBuilder&, int indent) const override;
530
    virtual bool equals(CalculationNode const&) const override;
531
532
private:
533
    CosCalculationNode(NonnullOwnPtr<CalculationNode>);
534
    NonnullOwnPtr<CalculationNode> m_value;
535
};
536
537
class TanCalculationNode final : public CalculationNode {
538
public:
539
    static NonnullOwnPtr<TanCalculationNode> create(NonnullOwnPtr<CalculationNode>);
540
    ~TanCalculationNode();
541
542
    virtual String to_string() const override;
543
    virtual Optional<CSSMathValue::ResolvedType> resolved_type() const override;
544
    virtual Optional<CSSNumericType> determine_type(PropertyID) const override;
545
    virtual bool contains_percentage() const override;
546
    virtual CSSMathValue::CalculationResult resolve(Optional<Length::ResolutionContext const&>, CSSMathValue::PercentageBasis const&) const override;
547
    virtual void for_each_child_node(Function<void(NonnullOwnPtr<CalculationNode>&)> const&) override;
548
549
    virtual void dump(StringBuilder&, int indent) const override;
550
    virtual bool equals(CalculationNode const&) const override;
551
552
private:
553
    TanCalculationNode(NonnullOwnPtr<CalculationNode>);
554
    NonnullOwnPtr<CalculationNode> m_value;
555
};
556
557
class AsinCalculationNode final : public CalculationNode {
558
public:
559
    static NonnullOwnPtr<AsinCalculationNode> create(NonnullOwnPtr<CalculationNode>);
560
    ~AsinCalculationNode();
561
562
    virtual String to_string() const override;
563
    virtual Optional<CSSMathValue::ResolvedType> resolved_type() const override;
564
    virtual Optional<CSSNumericType> determine_type(PropertyID) const override;
565
    virtual bool contains_percentage() const override;
566
    virtual CSSMathValue::CalculationResult resolve(Optional<Length::ResolutionContext const&>, CSSMathValue::PercentageBasis const&) const override;
567
    virtual void for_each_child_node(Function<void(NonnullOwnPtr<CalculationNode>&)> const&) override;
568
569
    virtual void dump(StringBuilder&, int indent) const override;
570
    virtual bool equals(CalculationNode const&) const override;
571
572
private:
573
    AsinCalculationNode(NonnullOwnPtr<CalculationNode>);
574
    NonnullOwnPtr<CalculationNode> m_value;
575
};
576
577
class AcosCalculationNode final : public CalculationNode {
578
public:
579
    static NonnullOwnPtr<AcosCalculationNode> create(NonnullOwnPtr<CalculationNode>);
580
    ~AcosCalculationNode();
581
582
    virtual String to_string() const override;
583
    virtual Optional<CSSMathValue::ResolvedType> resolved_type() const override;
584
    virtual Optional<CSSNumericType> determine_type(PropertyID) const override;
585
    virtual bool contains_percentage() const override;
586
    virtual CSSMathValue::CalculationResult resolve(Optional<Length::ResolutionContext const&>, CSSMathValue::PercentageBasis const&) const override;
587
    virtual void for_each_child_node(Function<void(NonnullOwnPtr<CalculationNode>&)> const&) override;
588
589
    virtual void dump(StringBuilder&, int indent) const override;
590
    virtual bool equals(CalculationNode const&) const override;
591
592
private:
593
    AcosCalculationNode(NonnullOwnPtr<CalculationNode>);
594
    NonnullOwnPtr<CalculationNode> m_value;
595
};
596
597
class AtanCalculationNode final : public CalculationNode {
598
public:
599
    static NonnullOwnPtr<AtanCalculationNode> create(NonnullOwnPtr<CalculationNode>);
600
    ~AtanCalculationNode();
601
602
    virtual String to_string() const override;
603
    virtual Optional<CSSMathValue::ResolvedType> resolved_type() const override;
604
    virtual Optional<CSSNumericType> determine_type(PropertyID) const override;
605
    virtual bool contains_percentage() const override;
606
    virtual CSSMathValue::CalculationResult resolve(Optional<Length::ResolutionContext const&>, CSSMathValue::PercentageBasis const&) const override;
607
    virtual void for_each_child_node(Function<void(NonnullOwnPtr<CalculationNode>&)> const&) override;
608
609
    virtual void dump(StringBuilder&, int indent) const override;
610
    virtual bool equals(CalculationNode const&) const override;
611
612
private:
613
    AtanCalculationNode(NonnullOwnPtr<CalculationNode>);
614
    NonnullOwnPtr<CalculationNode> m_value;
615
};
616
617
class Atan2CalculationNode final : public CalculationNode {
618
public:
619
    static NonnullOwnPtr<Atan2CalculationNode> create(NonnullOwnPtr<CalculationNode>, NonnullOwnPtr<CalculationNode>);
620
    ~Atan2CalculationNode();
621
622
    virtual String to_string() const override;
623
    virtual Optional<CSSMathValue::ResolvedType> resolved_type() const override;
624
    virtual Optional<CSSNumericType> determine_type(PropertyID) const override;
625
    virtual bool contains_percentage() const override;
626
    virtual CSSMathValue::CalculationResult resolve(Optional<Length::ResolutionContext const&>, CSSMathValue::PercentageBasis const&) const override;
627
    virtual void for_each_child_node(Function<void(NonnullOwnPtr<CalculationNode>&)> const&) override;
628
629
    virtual void dump(StringBuilder&, int indent) const override;
630
    virtual bool equals(CalculationNode const&) const override;
631
632
private:
633
    Atan2CalculationNode(NonnullOwnPtr<CalculationNode>, NonnullOwnPtr<CalculationNode>);
634
    NonnullOwnPtr<CalculationNode> m_y;
635
    NonnullOwnPtr<CalculationNode> m_x;
636
};
637
638
class PowCalculationNode final : public CalculationNode {
639
public:
640
    static NonnullOwnPtr<PowCalculationNode> create(NonnullOwnPtr<CalculationNode>, NonnullOwnPtr<CalculationNode>);
641
    ~PowCalculationNode();
642
643
    virtual String to_string() const override;
644
    virtual Optional<CSSMathValue::ResolvedType> resolved_type() const override;
645
    virtual Optional<CSSNumericType> determine_type(PropertyID) const override;
646
0
    virtual bool contains_percentage() const override { return false; }
647
    virtual CSSMathValue::CalculationResult resolve(Optional<Length::ResolutionContext const&>, CSSMathValue::PercentageBasis const&) const override;
648
    virtual void for_each_child_node(Function<void(NonnullOwnPtr<CalculationNode>&)> const&) override;
649
650
    virtual void dump(StringBuilder&, int indent) const override;
651
    virtual bool equals(CalculationNode const&) const override;
652
653
private:
654
    explicit PowCalculationNode(NonnullOwnPtr<CalculationNode>, NonnullOwnPtr<CalculationNode>);
655
    NonnullOwnPtr<CalculationNode> m_x;
656
    NonnullOwnPtr<CalculationNode> m_y;
657
};
658
659
class SqrtCalculationNode final : public CalculationNode {
660
public:
661
    static NonnullOwnPtr<SqrtCalculationNode> create(NonnullOwnPtr<CalculationNode>);
662
    ~SqrtCalculationNode();
663
664
    virtual String to_string() const override;
665
    virtual Optional<CSSMathValue::ResolvedType> resolved_type() const override;
666
    virtual Optional<CSSNumericType> determine_type(PropertyID) const override;
667
0
    virtual bool contains_percentage() const override { return false; }
668
    virtual CSSMathValue::CalculationResult resolve(Optional<Length::ResolutionContext const&>, CSSMathValue::PercentageBasis const&) const override;
669
    virtual void for_each_child_node(Function<void(NonnullOwnPtr<CalculationNode>&)> const&) override;
670
671
    virtual void dump(StringBuilder&, int indent) const override;
672
    virtual bool equals(CalculationNode const&) const override;
673
674
private:
675
    SqrtCalculationNode(NonnullOwnPtr<CalculationNode>);
676
    NonnullOwnPtr<CalculationNode> m_value;
677
};
678
679
class HypotCalculationNode final : public CalculationNode {
680
public:
681
    static NonnullOwnPtr<HypotCalculationNode> create(Vector<NonnullOwnPtr<CalculationNode>>);
682
    ~HypotCalculationNode();
683
684
    virtual String to_string() const override;
685
    virtual Optional<CSSMathValue::ResolvedType> resolved_type() const override;
686
    virtual Optional<CSSNumericType> determine_type(PropertyID) const override;
687
    virtual bool contains_percentage() const override;
688
    virtual CSSMathValue::CalculationResult resolve(Optional<Length::ResolutionContext const&>, CSSMathValue::PercentageBasis const&) const override;
689
    virtual void for_each_child_node(Function<void(NonnullOwnPtr<CalculationNode>&)> const&) override;
690
691
    virtual void dump(StringBuilder&, int indent) const override;
692
    virtual bool equals(CalculationNode const&) const override;
693
694
private:
695
    explicit HypotCalculationNode(Vector<NonnullOwnPtr<CalculationNode>>);
696
    Vector<NonnullOwnPtr<CalculationNode>> m_values;
697
};
698
699
class LogCalculationNode final : public CalculationNode {
700
public:
701
    static NonnullOwnPtr<LogCalculationNode> create(NonnullOwnPtr<CalculationNode>, NonnullOwnPtr<CalculationNode>);
702
    ~LogCalculationNode();
703
704
    virtual String to_string() const override;
705
    virtual Optional<CSSMathValue::ResolvedType> resolved_type() const override;
706
    virtual Optional<CSSNumericType> determine_type(PropertyID) const override;
707
0
    virtual bool contains_percentage() const override { return false; }
708
    virtual CSSMathValue::CalculationResult resolve(Optional<Length::ResolutionContext const&>, CSSMathValue::PercentageBasis const&) const override;
709
    virtual void for_each_child_node(Function<void(NonnullOwnPtr<CalculationNode>&)> const&) override;
710
711
    virtual void dump(StringBuilder&, int indent) const override;
712
    virtual bool equals(CalculationNode const&) const override;
713
714
private:
715
    LogCalculationNode(NonnullOwnPtr<CalculationNode>, NonnullOwnPtr<CalculationNode>);
716
    NonnullOwnPtr<CalculationNode> m_x;
717
    NonnullOwnPtr<CalculationNode> m_y;
718
};
719
720
class ExpCalculationNode final : public CalculationNode {
721
public:
722
    static NonnullOwnPtr<ExpCalculationNode> create(NonnullOwnPtr<CalculationNode>);
723
    ~ExpCalculationNode();
724
725
    virtual String to_string() const override;
726
    virtual Optional<CSSMathValue::ResolvedType> resolved_type() const override;
727
    virtual Optional<CSSNumericType> determine_type(PropertyID) const override;
728
0
    virtual bool contains_percentage() const override { return false; }
729
    virtual CSSMathValue::CalculationResult resolve(Optional<Length::ResolutionContext const&>, CSSMathValue::PercentageBasis const&) const override;
730
    virtual void for_each_child_node(Function<void(NonnullOwnPtr<CalculationNode>&)> const&) override;
731
732
    virtual void dump(StringBuilder&, int indent) const override;
733
    virtual bool equals(CalculationNode const&) const override;
734
735
private:
736
    ExpCalculationNode(NonnullOwnPtr<CalculationNode>);
737
    NonnullOwnPtr<CalculationNode> m_value;
738
};
739
740
class RoundCalculationNode final : public CalculationNode {
741
public:
742
    static NonnullOwnPtr<RoundCalculationNode> create(RoundingStrategy, NonnullOwnPtr<CalculationNode>, NonnullOwnPtr<CalculationNode>);
743
    ~RoundCalculationNode();
744
745
    virtual String to_string() const override;
746
    virtual Optional<CSSMathValue::ResolvedType> resolved_type() const override;
747
    virtual Optional<CSSNumericType> determine_type(PropertyID) const override;
748
    virtual bool contains_percentage() const override;
749
    virtual CSSMathValue::CalculationResult resolve(Optional<Length::ResolutionContext const&>, CSSMathValue::PercentageBasis const&) const override;
750
    virtual void for_each_child_node(Function<void(NonnullOwnPtr<CalculationNode>&)> const&) override;
751
752
    virtual void dump(StringBuilder&, int indent) const override;
753
    virtual bool equals(CalculationNode const&) const override;
754
755
private:
756
    RoundCalculationNode(RoundingStrategy, NonnullOwnPtr<CalculationNode>, NonnullOwnPtr<CalculationNode>);
757
    RoundingStrategy m_strategy;
758
    NonnullOwnPtr<CalculationNode> m_x;
759
    NonnullOwnPtr<CalculationNode> m_y;
760
};
761
762
class ModCalculationNode final : public CalculationNode {
763
public:
764
    static NonnullOwnPtr<ModCalculationNode> create(NonnullOwnPtr<CalculationNode>, NonnullOwnPtr<CalculationNode>);
765
    ~ModCalculationNode();
766
767
    virtual String to_string() const override;
768
    virtual Optional<CSSMathValue::ResolvedType> resolved_type() const override;
769
    virtual Optional<CSSNumericType> determine_type(PropertyID) const override;
770
    virtual bool contains_percentage() const override;
771
    virtual CSSMathValue::CalculationResult resolve(Optional<Length::ResolutionContext const&>, CSSMathValue::PercentageBasis const&) const override;
772
    virtual void for_each_child_node(Function<void(NonnullOwnPtr<CalculationNode>&)> const&) override;
773
774
    virtual void dump(StringBuilder&, int indent) const override;
775
    virtual bool equals(CalculationNode const&) const override;
776
777
private:
778
    ModCalculationNode(NonnullOwnPtr<CalculationNode>, NonnullOwnPtr<CalculationNode>);
779
    NonnullOwnPtr<CalculationNode> m_x;
780
    NonnullOwnPtr<CalculationNode> m_y;
781
};
782
783
class RemCalculationNode final : public CalculationNode {
784
public:
785
    static NonnullOwnPtr<RemCalculationNode> create(NonnullOwnPtr<CalculationNode>, NonnullOwnPtr<CalculationNode>);
786
    ~RemCalculationNode();
787
788
    virtual String to_string() const override;
789
    virtual Optional<CSSMathValue::ResolvedType> resolved_type() const override;
790
    virtual Optional<CSSNumericType> determine_type(PropertyID) const override;
791
    virtual bool contains_percentage() const override;
792
    virtual CSSMathValue::CalculationResult resolve(Optional<Length::ResolutionContext const&>, CSSMathValue::PercentageBasis const&) const override;
793
    virtual void for_each_child_node(Function<void(NonnullOwnPtr<CalculationNode>&)> const&) override;
794
795
    virtual void dump(StringBuilder&, int indent) const override;
796
    virtual bool equals(CalculationNode const&) const override;
797
798
private:
799
    RemCalculationNode(NonnullOwnPtr<CalculationNode>, NonnullOwnPtr<CalculationNode>);
800
    NonnullOwnPtr<CalculationNode> m_x;
801
    NonnullOwnPtr<CalculationNode> m_y;
802
};
803
804
}