| 
									
										
										
										
											2023-04-04 18:32:09 -04:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright (c) 2023, Tim Flynn <trflynn89@serenityos.org> | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * SPDX-License-Identifier: BSD-2-Clause | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <LibWeb/HTML/HTMLVideoElement.h>
 | 
					
						
							|  |  |  | #include <LibWeb/Layout/VideoBox.h>
 | 
					
						
							|  |  |  | #include <LibWeb/Painting/VideoPaintable.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace Web::Layout { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-06 10:16:04 -07:00
										 |  |  | JS_DEFINE_ALLOCATOR(VideoBox); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-26 17:42:27 +02:00
										 |  |  | VideoBox::VideoBox(DOM::Document& document, DOM::Element& element, CSS::StyleProperties style) | 
					
						
							| 
									
										
										
										
											2023-04-04 18:32:09 -04:00
										 |  |  |     : ReplacedBox(document, element, move(style)) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2023-08-23 18:58:42 +02:00
										 |  |  |     document.register_viewport_client(*this); | 
					
						
							| 
									
										
										
										
											2023-04-04 18:32:09 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void VideoBox::finalize() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     Base::finalize(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-23 18:58:42 +02:00
										 |  |  |     // NOTE: We unregister from the document in finalize() to avoid trouble
 | 
					
						
							|  |  |  |     //       in the scenario where our Document has already been swept by GC.
 | 
					
						
							|  |  |  |     document().unregister_viewport_client(*this); | 
					
						
							| 
									
										
										
										
											2023-04-04 18:32:09 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | HTML::HTMLVideoElement& VideoBox::dom_node() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return static_cast<HTML::HTMLVideoElement&>(ReplacedBox::dom_node()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | HTML::HTMLVideoElement const& VideoBox::dom_node() const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return static_cast<HTML::HTMLVideoElement const&>(ReplacedBox::dom_node()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void VideoBox::prepare_for_replaced_layout() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2023-09-03 17:33:58 -05:00
										 |  |  |     CSSPixels width = dom_node().video_width(); | 
					
						
							|  |  |  |     set_natural_width(width); | 
					
						
							| 
									
										
										
										
											2023-04-04 18:32:09 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-03 17:33:58 -05:00
										 |  |  |     CSSPixels height = dom_node().video_height(); | 
					
						
							|  |  |  |     set_natural_height(height); | 
					
						
							| 
									
										
										
										
											2023-04-04 18:32:09 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (width != 0 && height != 0) | 
					
						
							| 
									
										
										
										
											2023-06-08 15:56:28 +01:00
										 |  |  |         set_natural_aspect_ratio(width / height); | 
					
						
							| 
									
										
										
										
											2023-04-04 18:32:09 -04:00
										 |  |  |     else | 
					
						
							| 
									
										
										
										
											2023-06-08 15:56:28 +01:00
										 |  |  |         set_natural_aspect_ratio({}); | 
					
						
							| 
									
										
										
										
											2023-04-04 18:32:09 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-23 18:58:42 +02:00
										 |  |  | void VideoBox::did_set_viewport_rect(CSSPixelRect const&) | 
					
						
							| 
									
										
										
										
											2023-04-04 18:32:09 -04:00
										 |  |  | { | 
					
						
							|  |  |  |     // FIXME: Several steps in HTMLMediaElement indicate we may optionally handle whether the media object
 | 
					
						
							|  |  |  |     //        is in view. Implement those steps.
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | JS::GCPtr<Painting::Paintable> VideoBox::create_paintable() const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return Painting::VideoPaintable::create(*this); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |