mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 19:22:45 +00:00 
			
		
		
		
	LibWeb: Add DOMQuad and text tests
This commit is contained in:
		
							parent
							
								
									e4270bc01d
								
							
						
					
					
						commit
						c88f14902b
					
				
					 11 changed files with 218 additions and 0 deletions
				
			
		
							
								
								
									
										88
									
								
								Userland/Libraries/LibWeb/Geometry/DOMQuad.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								Userland/Libraries/LibWeb/Geometry/DOMQuad.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,88 @@ | |||
| /*
 | ||||
|  * Copyright (c) 2023, Bastiaan van der Plaat <bastiaan.v.d.plaat@gmail.com> | ||||
|  * | ||||
|  * SPDX-License-Identifier: BSD-2-Clause | ||||
|  */ | ||||
| 
 | ||||
| #include <LibWeb/Bindings/Intrinsics.h> | ||||
| #include <LibWeb/Geometry/DOMQuad.h> | ||||
| 
 | ||||
| namespace Web::Geometry { | ||||
| 
 | ||||
| JS::NonnullGCPtr<DOMQuad> DOMQuad::construct_impl(JS::Realm& realm, DOMPointInit const& p1, DOMPointInit const& p2, DOMPointInit const& p3, DOMPointInit const& p4) | ||||
| { | ||||
|     return realm.heap().allocate<DOMQuad>(realm, realm, p1, p2, p3, p4); | ||||
| } | ||||
| 
 | ||||
| DOMQuad::DOMQuad(JS::Realm& realm, DOMPointInit const& p1, DOMPointInit const& p2, DOMPointInit const& p3, DOMPointInit const& p4) | ||||
|     : PlatformObject(realm) | ||||
|     , m_p1(DOMPoint::from_point(realm.vm(), p1)) | ||||
|     , m_p2(DOMPoint::from_point(realm.vm(), p2)) | ||||
|     , m_p3(DOMPoint::from_point(realm.vm(), p3)) | ||||
|     , m_p4(DOMPoint::from_point(realm.vm(), p4)) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| DOMQuad::~DOMQuad() = default; | ||||
| 
 | ||||
| // https://drafts.fxtf.org/geometry/#dom-domquad-fromrect
 | ||||
| JS::NonnullGCPtr<DOMQuad> DOMQuad::from_rect(JS::VM& vm, DOMRectInit const& other) | ||||
| { | ||||
|     // The fromRect(other) static method on DOMQuad must create a DOMQuad from the DOMRectInit dictionary other.
 | ||||
|     return construct_impl(*vm.current_realm(), { other.x, other.y }, | ||||
|         { other.x + other.width, other.y }, | ||||
|         { other.x + other.width, other.y + other.height }, | ||||
|         { other.x, other.y + other.height }); | ||||
| } | ||||
| 
 | ||||
| // https://drafts.fxtf.org/geometry/#dom-domquad-fromquad
 | ||||
| JS::NonnullGCPtr<DOMQuad> DOMQuad::from_quad(JS::VM& vm, DOMQuadInit const& other) | ||||
| { | ||||
|     // The fromQuad(other) static method on DOMQuad must create a DOMQuad from the DOMQuadInit dictionary other.
 | ||||
|     return construct_impl(*vm.current_realm(), other.p1, other.p2, other.p3, other.p4); | ||||
| } | ||||
| 
 | ||||
| // https://drafts.fxtf.org/geometry/#dom-domquad-getbounds
 | ||||
| JS::NonnullGCPtr<DOMRect> DOMQuad::get_bounds() const | ||||
| { | ||||
|     // 1. Let bounds be a DOMRect object.
 | ||||
|     auto bounds = DOMRect::create(realm(), {}); | ||||
| 
 | ||||
|     // 2. Let left be the NaN-safe minimum of point 1’s x coordinate, point 2’s x coordinate, point 3’s x coordinate and point 4’s x coordinate.
 | ||||
|     auto left = min(m_p1->x(), min(m_p2->x(), min(m_p3->x(), m_p4->x()))); | ||||
| 
 | ||||
|     // 3. Let top be the NaN-safe minimum of point 1’s y coordinate, point 2’s y coordinate, point 3’s y coordinate and point 4’s y coordinate.
 | ||||
|     auto top = min(m_p1->y(), min(m_p2->y(), min(m_p3->y(), m_p4->y()))); | ||||
| 
 | ||||
|     // 4. Let right be the NaN-safe maximum of point 1’s x coordinate, point 2’s x coordinate, point 3’s x coordinate and point 4’s x coordinate.
 | ||||
|     auto right = max(m_p1->x(), max(m_p2->x(), max(m_p3->x(), m_p4->x()))); | ||||
| 
 | ||||
|     // 5. Let bottom be the NaN-safe maximum of point 1’s y coordinate, point 2’s y coordinate, point 3’s y coordinate and point 4’s y coordinate.
 | ||||
|     auto bottom = max(m_p1->y(), max(m_p2->y(), max(m_p3->y(), m_p4->y()))); | ||||
| 
 | ||||
|     // 6. Set x coordinate of bounds to left, y coordinate of bounds to top, width dimension of bounds to right - left and height dimension of bounds to bottom - top.
 | ||||
|     bounds->set_x(left); | ||||
|     bounds->set_y(top); | ||||
|     bounds->set_width(right - left); | ||||
|     bounds->set_height(bottom - top); | ||||
| 
 | ||||
|     // 7. Return bounds.
 | ||||
|     return bounds; | ||||
| } | ||||
| 
 | ||||
| void DOMQuad::initialize(JS::Realm& realm) | ||||
| { | ||||
|     Base::initialize(realm); | ||||
|     set_prototype(&Bindings::ensure_web_prototype<Bindings::DOMQuadPrototype>(realm, "DOMQuad")); | ||||
| } | ||||
| 
 | ||||
| void DOMQuad::visit_edges(Cell::Visitor& visitor) | ||||
| { | ||||
|     Base::visit_edges(visitor); | ||||
|     visitor.visit(m_p1.ptr()); | ||||
|     visitor.visit(m_p2.ptr()); | ||||
|     visitor.visit(m_p3.ptr()); | ||||
|     visitor.visit(m_p4.ptr()); | ||||
| } | ||||
| 
 | ||||
| } | ||||
							
								
								
									
										55
									
								
								Userland/Libraries/LibWeb/Geometry/DOMQuad.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								Userland/Libraries/LibWeb/Geometry/DOMQuad.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,55 @@ | |||
| /*
 | ||||
|  * Copyright (c) 2023, Bastiaan van der Plaat <bastiaan.v.d.plaat@gmail.com> | ||||
|  * | ||||
|  * SPDX-License-Identifier: BSD-2-Clause | ||||
|  */ | ||||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #include <LibWeb/Bindings/PlatformObject.h> | ||||
| #include <LibWeb/Geometry/DOMPoint.h> | ||||
| #include <LibWeb/Geometry/DOMRect.h> | ||||
| #include <LibWeb/Geometry/DOMRectReadOnly.h> | ||||
| 
 | ||||
| namespace Web::Geometry { | ||||
| 
 | ||||
| // https://drafts.fxtf.org/geometry/#dictdef-domquadinit
 | ||||
| struct DOMQuadInit { | ||||
|     DOMPointInit p1; | ||||
|     DOMPointInit p2; | ||||
|     DOMPointInit p3; | ||||
|     DOMPointInit p4; | ||||
| }; | ||||
| 
 | ||||
| // https://drafts.fxtf.org/geometry/#domquad
 | ||||
| class DOMQuad : public Bindings::PlatformObject { | ||||
|     WEB_PLATFORM_OBJECT(DOMQuad, Bindings::PlatformObject); | ||||
| 
 | ||||
| public: | ||||
|     static JS::NonnullGCPtr<DOMQuad> construct_impl(JS::Realm&, DOMPointInit const& p1, DOMPointInit const& p2, DOMPointInit const& p3, DOMPointInit const& p4); | ||||
| 
 | ||||
|     virtual ~DOMQuad() override; | ||||
| 
 | ||||
|     static JS::NonnullGCPtr<DOMQuad> from_rect(JS::VM&, DOMRectInit const&); | ||||
|     static JS::NonnullGCPtr<DOMQuad> from_quad(JS::VM&, DOMQuadInit const&); | ||||
| 
 | ||||
|     JS::NonnullGCPtr<DOMPoint> p1() const { return m_p1; } | ||||
|     JS::NonnullGCPtr<DOMPoint> p2() const { return m_p2; } | ||||
|     JS::NonnullGCPtr<DOMPoint> p3() const { return m_p3; } | ||||
|     JS::NonnullGCPtr<DOMPoint> p4() const { return m_p4; } | ||||
| 
 | ||||
|     JS::NonnullGCPtr<DOMRect> get_bounds() const; | ||||
| 
 | ||||
| private: | ||||
|     DOMQuad(JS::Realm&, DOMPointInit const& p1, DOMPointInit const& p2, DOMPointInit const& p3, DOMPointInit const& p4); | ||||
| 
 | ||||
|     virtual void initialize(JS::Realm&) override; | ||||
|     virtual void visit_edges(Cell::Visitor&) override; | ||||
| 
 | ||||
|     JS::NonnullGCPtr<DOMPoint> m_p1; | ||||
|     JS::NonnullGCPtr<DOMPoint> m_p2; | ||||
|     JS::NonnullGCPtr<DOMPoint> m_p3; | ||||
|     JS::NonnullGCPtr<DOMPoint> m_p4; | ||||
| }; | ||||
| 
 | ||||
| } | ||||
							
								
								
									
										28
									
								
								Userland/Libraries/LibWeb/Geometry/DOMQuad.idl
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								Userland/Libraries/LibWeb/Geometry/DOMQuad.idl
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,28 @@ | |||
| #import <Geometry/DOMPoint.idl> | ||||
| #import <Geometry/DOMRectReadOnly.idl> | ||||
| 
 | ||||
| // https://drafts.fxtf.org/geometry/#domquad | ||||
| [Exposed=(Window,Worker), Serializable] | ||||
| interface DOMQuad { | ||||
|     constructor(optional DOMPointInit p1 = {}, optional DOMPointInit p2 = {}, | ||||
|                 optional DOMPointInit p3 = {}, optional DOMPointInit p4 = {}); | ||||
| 
 | ||||
|     [NewObject] static DOMQuad fromRect(optional DOMRectInit other = {}); | ||||
|     [NewObject] static DOMQuad fromQuad(optional DOMQuadInit other = {}); | ||||
| 
 | ||||
|     [SameObject] readonly attribute DOMPoint p1; | ||||
|     [SameObject] readonly attribute DOMPoint p2; | ||||
|     [SameObject] readonly attribute DOMPoint p3; | ||||
|     [SameObject] readonly attribute DOMPoint p4; | ||||
|     [NewObject] DOMRect getBounds(); | ||||
| 
 | ||||
|     [Default] object toJSON(); | ||||
| }; | ||||
| 
 | ||||
| // https://drafts.fxtf.org/geometry/#dictdef-domquadinit | ||||
| dictionary DOMQuadInit { | ||||
|     DOMPointInit p1; | ||||
|     DOMPointInit p2; | ||||
|     DOMPointInit p3; | ||||
|     DOMPointInit p4; | ||||
| }; | ||||
|  | @ -16,6 +16,8 @@ interface DOMRectReadOnly { | |||
|     readonly attribute double bottom; | ||||
|     readonly attribute double left; | ||||
| 
 | ||||
|     [Default] object toJSON(); | ||||
| 
 | ||||
| }; | ||||
| 
 | ||||
| dictionary DOMRectInit { | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Bastiaan van der Plaat
						Bastiaan van der Plaat