Serenity Operating System
1/*
2 * Copyright (c) 2022, Luke Wilde <lukew@serenityos.org>
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#include <LibJS/Runtime/Completion.h>
8#include <LibJS/Runtime/GlobalObject.h>
9#include <LibWeb/WebGL/WebGLContextAttributes.h>
10
11namespace Web::WebGL {
12
13JS::ThrowCompletionOr<WebGLContextAttributes> convert_value_to_context_attributes_dictionary(JS::VM& vm, JS::Value value)
14{
15 // NOTE: This code was generated by the IDL code generator and then cleaned up.
16 if (!value.is_nullish() && !value.is_object())
17 return vm.throw_completion<JS::TypeError>(JS::ErrorType::NotAnObjectOfType, "WebGLContextAttributes");
18
19 WebGLContextAttributes context_attributes {};
20
21 JS::Value alpha;
22 if (value.is_nullish())
23 alpha = JS::js_undefined();
24 else
25 alpha = TRY(value.as_object().get("alpha"));
26
27 bool alpha_value;
28 if (!alpha.is_undefined())
29 alpha_value = alpha.to_boolean();
30 else
31 alpha_value = true;
32
33 context_attributes.alpha = alpha_value;
34
35 JS::Value antialias;
36 if (value.is_nullish())
37 antialias = JS::js_undefined();
38 else
39 antialias = TRY(value.as_object().get("antialias"));
40
41 bool antialias_value;
42 if (!antialias.is_undefined())
43 antialias_value = antialias.to_boolean();
44 else
45 antialias_value = true;
46
47 context_attributes.antialias = antialias_value;
48
49 JS::Value depth;
50 if (value.is_nullish())
51 depth = JS::js_undefined();
52 else
53 depth = TRY(value.as_object().get("depth"));
54
55 bool depth_value;
56 if (!depth.is_undefined())
57 depth_value = depth.to_boolean();
58 else
59 depth_value = true;
60
61 context_attributes.depth = depth_value;
62
63 JS::Value desynchronized;
64 if (value.is_nullish())
65 desynchronized = JS::js_undefined();
66 else
67 desynchronized = TRY(value.as_object().get("desynchronized"));
68
69 bool desynchronized_value;
70
71 if (!desynchronized.is_undefined())
72 desynchronized_value = desynchronized.to_boolean();
73 else
74 desynchronized_value = false;
75
76 context_attributes.desynchronized = desynchronized_value;
77
78 JS::Value fail_if_major_performance_caveat;
79 if (value.is_nullish())
80 fail_if_major_performance_caveat = JS::js_undefined();
81 else
82 fail_if_major_performance_caveat = TRY(value.as_object().get("failIfMajorPerformanceCaveat"));
83
84 bool fail_if_major_performance_caveat_value;
85 if (!fail_if_major_performance_caveat.is_undefined())
86 fail_if_major_performance_caveat_value = fail_if_major_performance_caveat.to_boolean();
87 else
88 fail_if_major_performance_caveat_value = false;
89
90 context_attributes.fail_if_major_performance_caveat = fail_if_major_performance_caveat_value;
91
92 JS::Value power_preference;
93 if (value.is_nullish())
94 power_preference = JS::js_undefined();
95 else
96 power_preference = TRY(value.as_object().get("powerPreference"));
97
98 WebGLPowerPreference power_preference_value { WebGLPowerPreference::Default };
99
100 if (!power_preference.is_undefined()) {
101 auto power_preference_string = TRY(power_preference.to_deprecated_string(vm));
102
103 if (power_preference_string == "high-performance"sv)
104 power_preference_value = WebGLPowerPreference::HighPerformance;
105 else if (power_preference_string == "low-power"sv)
106 power_preference_value = WebGLPowerPreference::LowPower;
107 else if (power_preference_string == "default"sv)
108 power_preference_value = WebGLPowerPreference::Default;
109 else
110 return vm.throw_completion<JS::TypeError>(JS::ErrorType::InvalidEnumerationValue, power_preference_string, "WebGLPowerPreference");
111 }
112
113 context_attributes.power_preference = power_preference_value;
114
115 JS::Value premultiplied_alpha;
116 if (value.is_nullish())
117 premultiplied_alpha = JS::js_undefined();
118 else
119 premultiplied_alpha = TRY(value.as_object().get("premultipliedAlpha"));
120
121 bool premultiplied_alpha_value;
122
123 if (!premultiplied_alpha.is_undefined())
124 premultiplied_alpha_value = premultiplied_alpha.to_boolean();
125 else
126 premultiplied_alpha_value = true;
127
128 context_attributes.premultiplied_alpha = premultiplied_alpha_value;
129
130 JS::Value preserve_drawing_buffer;
131 if (value.is_nullish())
132 preserve_drawing_buffer = JS::js_undefined();
133 else
134 preserve_drawing_buffer = TRY(value.as_object().get("preserveDrawingBuffer"));
135
136 bool preserve_drawing_buffer_value;
137 if (!preserve_drawing_buffer.is_undefined())
138 preserve_drawing_buffer_value = preserve_drawing_buffer.to_boolean();
139 else
140 preserve_drawing_buffer_value = false;
141
142 context_attributes.preserve_drawing_buffer = preserve_drawing_buffer_value;
143
144 JS::Value stencil;
145 if (value.is_nullish())
146 stencil = JS::js_undefined();
147 else
148 stencil = TRY(value.as_object().get("stencil"));
149
150 bool stencil_value;
151
152 if (!stencil.is_undefined())
153 stencil_value = stencil.to_boolean();
154 else
155 stencil_value = false;
156
157 context_attributes.stencil = stencil_value;
158
159 return context_attributes;
160}
161
162}