| 
									
										
										
										
											2022-02-26 10:34:08 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright (c) 2022, Luke Wilde <lukew@serenityos.org> | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * SPDX-License-Identifier: BSD-2-Clause | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <LibWeb/Bindings/AudioConstructor.h>
 | 
					
						
							|  |  |  | #include <LibWeb/Bindings/HTMLAudioElementPrototype.h>
 | 
					
						
							|  |  |  | #include <LibWeb/Bindings/HTMLAudioElementWrapper.h>
 | 
					
						
							|  |  |  | #include <LibWeb/Bindings/NodeWrapperFactory.h>
 | 
					
						
							|  |  |  | #include <LibWeb/DOM/ElementFactory.h>
 | 
					
						
							| 
									
										
										
										
											2022-03-07 23:08:26 +01:00
										 |  |  | #include <LibWeb/HTML/Window.h>
 | 
					
						
							| 
									
										
										
										
											2022-02-26 10:34:08 +00:00
										 |  |  | #include <LibWeb/Namespace.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace Web::Bindings { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-16 00:20:49 +01:00
										 |  |  | AudioConstructor::AudioConstructor(JS::Realm& realm) | 
					
						
							|  |  |  |     : NativeFunction(*realm.global_object().function_prototype()) | 
					
						
							| 
									
										
										
										
											2022-02-26 10:34:08 +00:00
										 |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-16 00:20:49 +01:00
										 |  |  | void AudioConstructor::initialize(JS::Realm& realm) | 
					
						
							| 
									
										
										
										
											2022-02-26 10:34:08 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     auto& vm = this->vm(); | 
					
						
							| 
									
										
										
										
											2022-08-16 00:20:49 +01:00
										 |  |  |     auto& window = static_cast<WindowObject&>(realm.global_object()); | 
					
						
							|  |  |  |     NativeFunction::initialize(realm); | 
					
						
							| 
									
										
										
										
											2022-02-26 10:34:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     define_direct_property(vm.names.prototype, &window.ensure_web_prototype<HTMLAudioElementPrototype>("HTMLAudioElement"), 0); | 
					
						
							|  |  |  |     define_direct_property(vm.names.length, JS::Value(0), JS::Attribute::Configurable); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | JS::ThrowCompletionOr<JS::Value> AudioConstructor::call() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2022-08-16 20:33:17 +01:00
										 |  |  |     return vm().throw_completion<JS::TypeError>(JS::ErrorType::ConstructorWithoutNew, "Audio"); | 
					
						
							| 
									
										
										
										
											2022-02-26 10:34:08 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // https://html.spec.whatwg.org/multipage/media.html#dom-audio
 | 
					
						
							|  |  |  | JS::ThrowCompletionOr<JS::Object*> AudioConstructor::construct(FunctionObject&) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2022-08-21 14:00:56 +01:00
										 |  |  |     auto& vm = this->vm(); | 
					
						
							| 
									
										
										
										
											2022-08-22 18:31:08 +01:00
										 |  |  |     auto& realm = *vm.current_realm(); | 
					
						
							| 
									
										
										
										
											2022-08-21 14:00:56 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-26 10:34:08 +00:00
										 |  |  |     // 1. Let document be the current global object's associated Document.
 | 
					
						
							| 
									
										
										
										
											2022-04-04 10:12:19 -03:00
										 |  |  |     auto& window = static_cast<WindowObject&>(HTML::current_global_object()); | 
					
						
							| 
									
										
										
										
											2022-02-26 10:34:08 +00:00
										 |  |  |     auto& document = window.impl().associated_document(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // 2. Let audio be the result of creating an element given document, audio, and the HTML namespace.
 | 
					
						
							|  |  |  |     auto audio = DOM::create_element(document, HTML::TagNames::audio, Namespace::HTML); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // 3. Set an attribute value for audio using "preload" and "auto".
 | 
					
						
							|  |  |  |     audio->set_attribute(HTML::AttributeNames::preload, "auto"sv); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-21 14:00:56 +01:00
										 |  |  |     auto src_value = vm.argument(0); | 
					
						
							| 
									
										
										
										
											2022-02-26 10:34:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // 4. If src is given, then set an attribute value for audio using "src" and src.
 | 
					
						
							|  |  |  |     //    (This will cause the user agent to invoke the object's resource selection algorithm before returning.)
 | 
					
						
							|  |  |  |     if (!src_value.is_undefined()) { | 
					
						
							| 
									
										
										
										
											2022-08-21 14:00:56 +01:00
										 |  |  |         auto src = TRY(src_value.to_string(vm)); | 
					
						
							| 
									
										
										
										
											2022-02-26 10:34:08 +00:00
										 |  |  |         audio->set_attribute(HTML::AttributeNames::src, move(src)); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // 5. Return audio.
 | 
					
						
							| 
									
										
										
										
											2022-08-22 18:31:08 +01:00
										 |  |  |     return wrap(realm, audio); | 
					
						
							| 
									
										
										
										
											2022-02-26 10:34:08 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |