| 
									
										
										
										
											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/DOM/ElementFactory.h>
 | 
					
						
							| 
									
										
										
										
											2022-08-28 13:42:07 +02:00
										 |  |  | #include <LibWeb/HTML/Scripting/Environments.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) | 
					
						
							| 
									
										
										
										
											2022-08-27 00:54:55 +01:00
										 |  |  |     : NativeFunction(*realm.intrinsics().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
										 |  |  |     NativeFunction::initialize(realm); | 
					
						
							| 
									
										
										
										
											2022-02-26 10:34:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-10 07:01:57 -05:00
										 |  |  |     define_direct_property(vm.names.prototype, &ensure_web_prototype<Bindings::HTMLAudioElementPrototype>(realm, "HTMLAudioElement"), 0); | 
					
						
							| 
									
										
										
										
											2022-02-26 10:34:08 +00:00
										 |  |  |     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
 | 
					
						
							| 
									
										
										
										
											2022-12-14 19:18:10 +00:00
										 |  |  | JS::ThrowCompletionOr<JS::NonnullGCPtr<JS::Object>> AudioConstructor::construct(FunctionObject&) | 
					
						
							| 
									
										
										
										
											2022-02-26 10:34:08 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2022-08-21 14:00:56 +01:00
										 |  |  |     auto& vm = this->vm(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-26 10:34:08 +00:00
										 |  |  |     // 1. Let document be the current global object's associated Document.
 | 
					
						
							| 
									
										
										
										
											2022-08-28 13:42:07 +02:00
										 |  |  |     auto& window = verify_cast<HTML::Window>(HTML::current_global_object()); | 
					
						
							| 
									
										
										
										
											2022-09-21 17:45:18 +01:00
										 |  |  |     auto& document = window.associated_document(); | 
					
						
							| 
									
										
										
										
											2022-02-26 10:34:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // 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".
 | 
					
						
							| 
									
										
										
										
											2022-10-30 17:50:04 +00:00
										 |  |  |     MUST(audio->set_attribute(HTML::AttributeNames::preload, "auto"sv)); | 
					
						
							| 
									
										
										
										
											2022-02-26 10:34:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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-10-30 17:50:04 +00:00
										 |  |  |         MUST(audio->set_attribute(HTML::AttributeNames::src, move(src))); | 
					
						
							| 
									
										
										
										
											2022-02-26 10:34:08 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // 5. Return audio.
 | 
					
						
							| 
									
										
										
										
											2022-12-14 19:18:10 +00:00
										 |  |  |     return audio; | 
					
						
							| 
									
										
										
										
											2022-02-26 10:34:08 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |