| 
									
										
										
										
											2020-08-01 03:04:26 +01:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2021-04-28 22:46:44 +02:00
										 |  |  |  * Copyright (c) 2020, the SerenityOS developers. | 
					
						
							| 
									
										
										
										
											2020-08-01 03:04:26 +01:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2021-04-22 01:24:48 -07:00
										 |  |  |  * SPDX-License-Identifier: BSD-2-Clause | 
					
						
							| 
									
										
										
										
											2020-08-01 03:04:26 +01:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-27 12:09:58 +12:00
										 |  |  | #include <LibWeb/Bindings/HTMLAudioElementPrototype.h>
 | 
					
						
							| 
									
										
										
										
											2024-11-08 20:14:37 +08:00
										 |  |  | #include <LibWeb/CSS/StyleValues/DisplayStyleValue.h>
 | 
					
						
							| 
									
										
										
										
											2023-06-12 13:55:43 -04:00
										 |  |  | #include <LibWeb/HTML/AudioTrack.h>
 | 
					
						
							|  |  |  | #include <LibWeb/HTML/AudioTrackList.h>
 | 
					
						
							| 
									
										
										
										
											2020-08-01 03:04:26 +01:00
										 |  |  | #include <LibWeb/HTML/HTMLAudioElement.h>
 | 
					
						
							| 
									
										
										
										
											2022-08-28 13:42:07 +02:00
										 |  |  | #include <LibWeb/HTML/Window.h>
 | 
					
						
							| 
									
										
										
										
											2023-06-12 13:55:43 -04:00
										 |  |  | #include <LibWeb/Layout/AudioBox.h>
 | 
					
						
							| 
									
										
										
										
											2020-08-01 03:04:26 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace Web::HTML { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-15 04:01:23 +13:00
										 |  |  | GC_DEFINE_ALLOCATOR(HTMLAudioElement); | 
					
						
							| 
									
										
										
										
											2023-11-19 19:47:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-18 21:00:52 +01:00
										 |  |  | HTMLAudioElement::HTMLAudioElement(DOM::Document& document, DOM::QualifiedName qualified_name) | 
					
						
							| 
									
										
										
										
											2021-02-07 11:20:15 +01:00
										 |  |  |     : HTMLMediaElement(document, move(qualified_name)) | 
					
						
							| 
									
										
										
										
											2020-08-01 03:04:26 +01:00
										 |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-14 13:21:51 -06:00
										 |  |  | HTMLAudioElement::~HTMLAudioElement() = default; | 
					
						
							| 
									
										
										
										
											2023-01-10 06:28:20 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-07 08:41:28 +02:00
										 |  |  | void HTMLAudioElement::initialize(JS::Realm& realm) | 
					
						
							| 
									
										
										
										
											2023-01-10 06:28:20 -05:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2023-08-07 08:41:28 +02:00
										 |  |  |     Base::initialize(realm); | 
					
						
							| 
									
										
										
										
											2024-03-16 13:13:08 +01:00
										 |  |  |     WEB_SET_PROTOTYPE_FOR_INTERFACE(HTMLAudioElement); | 
					
						
							| 
									
										
										
										
											2023-01-10 06:28:20 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-20 16:35:12 +01:00
										 |  |  | GC::Ptr<Layout::Node> HTMLAudioElement::create_layout_node(GC::Ref<CSS::ComputedProperties> style) | 
					
						
							| 
									
										
										
										
											2023-06-12 13:55:43 -04:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2024-11-14 06:13:46 +13:00
										 |  |  |     return heap().allocate<Layout::AudioBox>(document(), *this, move(style)); | 
					
						
							| 
									
										
										
										
											2023-06-12 13:55:43 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-20 11:32:17 +01:00
										 |  |  | void HTMLAudioElement::adjust_computed_style(CSS::ComputedProperties& style) | 
					
						
							| 
									
										
										
										
											2024-11-08 20:14:37 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     // https://drafts.csswg.org/css-display-3/#unbox
 | 
					
						
							|  |  |  |     if (style.display().is_contents()) | 
					
						
							|  |  |  |         style.set_property(CSS::PropertyID::Display, CSS::DisplayStyleValue::create(CSS::Display::from_short(CSS::Display::Short::None))); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-12 13:55:43 -04:00
										 |  |  | Layout::AudioBox* HTMLAudioElement::layout_node() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return static_cast<Layout::AudioBox*>(Node::layout_node()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Layout::AudioBox const* HTMLAudioElement::layout_node() const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return static_cast<Layout::AudioBox const*>(Node::layout_node()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void HTMLAudioElement::on_playing() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     audio_tracks()->for_each_enabled_track([](auto& audio_track) { | 
					
						
							|  |  |  |         audio_track.play({}); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void HTMLAudioElement::on_paused() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     audio_tracks()->for_each_enabled_track([](auto& audio_track) { | 
					
						
							|  |  |  |         audio_track.pause({}); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-14 10:12:46 -04:00
										 |  |  | void HTMLAudioElement::on_seek(double position, MediaSeekMode seek_mode) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     audio_tracks()->for_each_enabled_track([&](auto& audio_track) { | 
					
						
							|  |  |  |         audio_track.seek(position, seek_mode); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-14 13:07:09 -04:00
										 |  |  | void HTMLAudioElement::on_volume_change() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     audio_tracks()->for_each_enabled_track([&](auto& audio_track) { | 
					
						
							|  |  |  |         audio_track.update_volume(); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-01 03:04:26 +01:00
										 |  |  | } |