2020-04-01 18:53:28 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								/*
 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-08 19:38:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								 *  Copyright  ( c )  2020 - 2022 ,  Andreas  Kling  < kling @ serenityos . org > 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-16 17:14:20 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								 *  Copyright  ( c )  2021 - 2022 ,  Sam  Atkins  < atkinssj @ serenityos . org > 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-01 18:53:28 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-22 01:24:48 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								 *  SPDX - License - Identifier :  BSD - 2 - Clause 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-01 18:53:28 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  <AK/Base64.h> 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  <AK/String.h> 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  <AK/Utf8View.h> 
 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-23 02:12:26 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  <LibJS/Runtime/AbstractOperations.h> 
 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  <LibJS/Runtime/Completion.h> 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  <LibJS/Runtime/Error.h> 
 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-27 21:48:34 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  <LibJS/Runtime/FunctionObject.h> 
 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  <LibJS/Runtime/Shape.h> 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  <LibTextCodec/Decoder.h> 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  <LibWeb/Bindings/CSSNamespace.h> 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  <LibWeb/Bindings/CryptoWrapper.h> 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  <LibWeb/Bindings/EventTargetConstructor.h> 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  <LibWeb/Bindings/EventTargetPrototype.h> 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  <LibWeb/Bindings/ExceptionOrUtils.h> 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  <LibWeb/Bindings/HistoryWrapper.h> 
 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-14 18:03:08 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  <LibWeb/Bindings/IDLAbstractOperations.h> 
 
							 
						 
					
						
							
								
									
										
										
										
											2022-04-01 19:46:29 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  <LibWeb/Bindings/IdleDeadlineWrapper.h> 
 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  <LibWeb/Bindings/LocationObject.h> 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  <LibWeb/Bindings/NavigatorObject.h> 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  <LibWeb/Bindings/Replaceable.h> 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  <LibWeb/Bindings/SelectionWrapper.h> 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  <LibWeb/Bindings/StorageWrapper.h> 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  <LibWeb/Bindings/WindowObjectHelper.h> 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  <LibWeb/Bindings/WindowPrototype.h> 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  <LibWeb/CSS/MediaQueryList.h> 
 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-29 12:58:22 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  <LibWeb/CSS/Parser/Parser.h> 
 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-23 12:35:56 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  <LibWeb/CSS/ResolvedCSSStyleDeclaration.h> 
 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-31 18:52:54 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  <LibWeb/CSS/Screen.h> 
 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-30 20:02:55 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  <LibWeb/Crypto/Crypto.h> 
 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-18 21:52:50 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  <LibWeb/DOM/Document.h> 
 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-18 13:43:44 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  <LibWeb/DOM/Event.h> 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  <LibWeb/DOM/EventDispatcher.h> 
 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-18 15:01:28 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  <LibWeb/HTML/BrowsingContext.h> 
 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  <LibWeb/HTML/EventHandler.h> 
 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-26 14:36:20 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  <LibWeb/HTML/EventLoop/EventLoop.h> 
 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-26 17:21:40 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  <LibWeb/HTML/MessageEvent.h> 
 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  <LibWeb/HTML/Origin.h> 
 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-26 12:39:27 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  <LibWeb/HTML/PageTransitionEvent.h> 
 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-04 10:41:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  <LibWeb/HTML/Scripting/ClassicScript.h> 
 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  <LibWeb/HTML/Scripting/Environments.h> 
 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-07 15:12:41 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  <LibWeb/HTML/Scripting/ExceptionReporter.h> 
 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-08 19:38:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  <LibWeb/HTML/Storage.h> 
 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-07 23:54:56 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  <LibWeb/HTML/Timer.h> 
 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-07 23:08:26 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  <LibWeb/HTML/Window.h> 
 
							 
						 
					
						
							
								
									
										
										
										
											2020-09-29 18:19:18 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  <LibWeb/HighResolutionTime/Performance.h> 
 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-08 11:27:46 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  <LibWeb/Layout/InitialContainingBlock.h> 
 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-24 16:28:08 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  <LibWeb/Page/Page.h> 
 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-31 21:55:01 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  <LibWeb/RequestIdleCallback/IdleDeadline.h> 
 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-10 19:12:32 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  <LibWeb/Selection/Selection.h> 
 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  <LibWeb/WebAssembly/WebAssemblyObject.h> 
 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-01 18:53:28 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-07 23:08:26 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								namespace  Web : : HTML  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-01 18:53:28 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-10-03 16:28:14 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// https://html.spec.whatwg.org/#run-the-animation-frame-callbacks
 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-05 20:08:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  run_animation_frame_callbacks ( DOM : : Document &  document ,  double ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-03 16:28:14 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // FIXME: Bring this closer to the spec.
 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-05 20:08:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    document . window ( ) . animation_frame_callback_driver ( ) . run ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-03 16:28:14 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-31 21:55:01 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								class  IdleCallback  :  public  RefCounted < IdleCallback >  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								public : 
							 
						 
					
						
							
								
									
										
										
										
											2022-04-01 19:46:29 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    explicit  IdleCallback ( Function < JS : : Completion ( NonnullRefPtr < RequestIdleCallback : : IdleDeadline > ) >  handler ,  u32  handle ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-31 21:55:01 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        :  m_handler ( move ( handler ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-04-01 19:46:29 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        ,  m_handle ( handle ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-31 21:55:01 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    ~ IdleCallback ( )  =  default ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    JS : : Completion  invoke ( NonnullRefPtr < RequestIdleCallback : : IdleDeadline >  deadline )  {  return  m_handler ( move ( deadline ) ) ;  } 
							 
						 
					
						
							
								
									
										
										
										
											2022-04-01 19:46:29 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    u32  handle ( )  const  {  return  m_handle ;  } 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-31 21:55:01 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								private : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    Function < JS : : Completion ( NonnullRefPtr < RequestIdleCallback : : IdleDeadline > ) >  m_handler ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-04-01 19:46:29 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    u32  m_handle  {  0  } ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-31 21:55:01 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								JS : : NonnullGCPtr < Window >  Window : : create ( JS : : Realm &  realm ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-04 21:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    return  * realm . heap ( ) . allocate < Window > ( realm ,  realm ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-04 21:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								JS : : NonnullGCPtr < Window >  Window : : create_with_document ( DOM : : Document &  document ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-01 18:53:28 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    return  * document . heap ( ) . allocate < Window > ( document . shape ( ) . realm ( ) ,  document ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-01 18:53:28 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Window : : Window ( JS : : Realm &  realm ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    :  DOM : : EventTarget ( realm ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-04 21:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    ,  m_crypto ( Crypto : : Crypto : : create ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    // FIXME: Should this be WindowPrototype?
 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-04 21:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-07 23:08:26 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Window : : Window ( DOM : : Document &  document ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    :  DOM : : EventTarget ( document . shape ( ) . realm ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-09 13:55:31 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    ,  m_associated_document ( document ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-30 20:02:55 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    ,  m_crypto ( Crypto : : Crypto : : create ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-01 18:53:28 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  Window : : visit_edges ( JS : : Cell : : Visitor &  visitor ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    Base : : visit_edges ( visitor ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    visitor . visit ( m_associated_document . ptr ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    visitor . visit ( m_current_event . ptr ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    visitor . visit ( m_performance . ptr ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-31 18:52:54 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    visitor . visit ( m_screen . ptr ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    visitor . visit ( m_location_object ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    for  ( auto &  it  :  m_prototypes ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        visitor . visit ( it . value ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    for  ( auto &  it  :  m_constructors ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        visitor . visit ( it . value ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-01 12:21:47 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    for  ( auto &  it  :  m_timers ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        visitor . visit ( it . value . ptr ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-14 13:21:51 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Window : : ~ Window ( )  =  default ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-01 18:53:28 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-03 18:38:47 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								JS : : Object &  Window : : cached_web_prototype ( String  const &  class_name ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto  it  =  m_prototypes . find ( class_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( it  = =  m_prototypes . end ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        dbgln ( " Missing prototype: {} " ,  class_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    VERIFY ( it  ! =  m_prototypes . end ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  * it - > value ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								HighResolutionTime : : Performance &  Window : : performance ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-06-20 17:45:27 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    if  ( ! m_performance ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        m_performance  =  heap ( ) . allocate < HighResolutionTime : : Performance > ( realm ( ) ,  * this ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  * m_performance ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-06-20 17:45:27 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-31 18:52:54 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								CSS : : Screen &  Window : : screen ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( ! m_screen ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        m_screen  =  heap ( ) . allocate < CSS : : Screen > ( realm ( ) ,  * this ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  * m_screen ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  Window : : alert_impl ( String  const &  message ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-01 18:53:28 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-09 13:45:03 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    if  ( auto *  page  =  this - > page ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-12 18:23:05 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        page - > client ( ) . page_did_request_alert ( message ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-01 18:53:28 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								bool  Window : : confirm_impl ( String  const &  message ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-16 21:29:26 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-09 13:45:03 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    if  ( auto *  page  =  this - > page ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-10 08:37:13 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        return  page - > client ( ) . page_did_request_confirm ( message ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-16 21:29:26 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								String  Window : : prompt_impl ( String  const &  message ,  String  const &  default_ ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-20 12:05:18 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-09 13:45:03 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    if  ( auto *  page  =  this - > page ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-20 12:05:18 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        return  page - > client ( ) . page_did_request_prompt ( message ,  default_ ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-04 10:41:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-settimeout
 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								i32  Window : : set_timeout_impl ( TimerHandler  handler ,  i32  timeout ,  JS : : MarkedVector < JS : : Value >  arguments ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-01 18:53:28 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-04 10:41:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    return  run_timer_initialization_steps ( move ( handler ) ,  timeout ,  move ( arguments ) ,  Repeat : : No ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-01 18:53:28 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-04 10:41:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-setinterval
 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								i32  Window : : set_interval_impl ( TimerHandler  handler ,  i32  timeout ,  JS : : MarkedVector < JS : : Value >  arguments ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-05 00:56:16 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-04 10:41:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    return  run_timer_initialization_steps ( move ( handler ) ,  timeout ,  move ( arguments ) ,  Repeat : : Yes ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-06-27 18:30:29 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-04 10:41:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-cleartimeout
 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  Window : : clear_timeout_impl ( i32  id ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-06-27 18:30:29 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-04 10:41:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    m_timers . remove ( id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-06-27 18:30:29 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-04 10:41:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-clearinterval
 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  Window : : clear_interval_impl ( i32  id ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-06-27 18:30:29 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-04 10:41:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    m_timers . remove ( id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-06-27 18:30:29 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-07 23:54:56 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  Window : : deallocate_timer_id ( Badge < Timer > ,  i32  id ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-30 08:03:13 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    m_timer_id_allocator . deallocate ( id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-04 10:41:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#timer-initialisation-steps
 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								i32  Window : : run_timer_initialization_steps ( TimerHandler  handler ,  i32  timeout ,  JS : : MarkedVector < JS : : Value >  arguments ,  Repeat  repeat ,  Optional < i32 >  previous_id ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-06-27 18:30:29 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-04 10:41:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    // 1. Let thisArg be global if that is a WorkerGlobalScope object; otherwise let thisArg be the WindowProxy that corresponds to global.
 
							 
						 
					
						
							
								
									
										
										
										
											2020-06-27 18:30:29 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-04 10:41:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    // 2. If previousId was given, let id be previousId; otherwise, let id be an implementation-defined integer that is greater than zero and does not already exist in global's map of active timers.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto  id  =  previous_id . has_value ( )  ?  previous_id . value ( )  :  m_timer_id_allocator . allocate ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-04-20 19:48:48 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    // FIXME: 3. If the surrounding agent's event loop's currently running task is a task that was created by this algorithm, then let nesting level be the task's timer nesting level. Otherwise, let nesting level be zero.
 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-04 10:41:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // 4. If timeout is less than 0, then set timeout to 0.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( timeout  <  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        timeout  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-04-20 19:48:48 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    // FIXME: 5. If nesting level is greater than 5, and timeout is less than 4, then set timeout to 4.
 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-04 10:41:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // 6. Let callerRealm be the current Realm Record, and calleeRealm be global's relevant Realm.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // FIXME: Implement this when step 9.2 is implemented.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // 7. Let initiating script be the active script.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // 8. Assert: initiating script is not null, since this algorithm is always called from some script.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // 9. Let task be a task that runs the following substeps:
 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    auto  task  =  [ weak_window  =  make_weak_ptr < Window > ( ) ,  handler  =  move ( handler ) ,  timeout ,  arguments  =  move ( arguments ) ,  repeat ,  id ] ( )  mutable  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        JS : : GCPtr < Window >  window  =  weak_window . ptr ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-24 16:09:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        if  ( ! window ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-04 10:41:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        // 1. If id does not exist in global's map of active timers, then abort these steps.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        if  ( ! window - > m_timers . contains ( id ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        handler . visit ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            // 2. If handler is a Function, then invoke handler given arguments with the callback this value set to thisArg. If this throws an exception, catch it, and report the exception.
 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-08 14:12:01 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            [ & ] ( JS : : Handle < Bindings : : CallbackType >  callback )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                if  ( auto  result  =  Bindings : : IDL : : invoke_callback ( * callback ,  window . ptr ( ) ,  arguments ) ;  result . is_error ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-04 10:41:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    HTML : : report_exception ( result ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            // 3. Otherwise:
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            [ & ] ( String  const &  source )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                // 1. Assert: handler is a string.
 
							 
						 
					
						
							
								
									
										
										
										
											2022-04-20 19:48:48 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                // FIXME: 2. Perform HostEnsureCanCompileStrings(callerRealm, calleeRealm). If this throws an exception, catch it, report the exception, and abort these steps.
 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-04 10:41:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                // 3. Let settings object be global's relevant settings object.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                auto &  settings_object  =  window - > associated_document ( ) . relevant_settings_object ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                // 4. Let base URL be initiating script's base URL.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                auto  url  =  window - > associated_document ( ) . url ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                // 5. Assert: base URL is not null, as initiating script is a classic script or a JavaScript module script.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                // 6. Let fetch options be a script fetch options whose cryptographic nonce is initiating script's fetch options's cryptographic nonce, integrity metadata is the empty string, parser metadata is "not-parser-inserted", credentials mode is initiating script's fetch options's credentials mode, and referrer policy is initiating script's fetch options's referrer policy.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                // 7. Let script be the result of creating a classic script given handler, settings object, base URL, and fetch options.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                auto  script  =  HTML : : ClassicScript : : create ( url . basename ( ) ,  source ,  settings_object ,  url ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                // 8. Run the classic script script.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                ( void ) script - > run ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        // 4. If id does not exist in global's map of active timers, then abort these steps.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        if  ( ! window - > m_timers . contains ( id ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        switch  ( repeat )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        // 5. If repeat is true, then perform the timer initialization steps again, given global, handler, timeout, arguments, true, and id.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        case  Repeat : : Yes : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            window - > run_timer_initialization_steps ( handler ,  timeout ,  move ( arguments ) ,  repeat ,  id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        // 6. Otherwise, remove global's map of active timers[id].
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        case  Repeat : : No : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            window - > m_timers . remove ( id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-04-20 19:48:48 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    // FIXME: 10. Increment nesting level by one.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // FIXME: 11. Set task's timer nesting level to nesting level.
 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-04 10:41:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // 12. Let completionStep be an algorithm step which queues a global task on the timer task source given global to run task.
 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    auto  completion_step  =  [ weak_window  =  make_weak_ptr < Window > ( ) ,  task  =  move ( task ) ] ( )  mutable  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        JS : : GCPtr < Window >  window  =  weak_window . ptr ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-24 16:09:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        if  ( ! window ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        HTML : : queue_global_task ( HTML : : Task : : Source : : TimerTask ,  * window ,  move ( task ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-04 10:41:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // 13. Run steps after a timeout given global, "setTimeout/setInterval", timeout, completionStep, and id.
 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-07 23:54:56 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    auto  timer  =  Timer : : create ( * this ,  timeout ,  move ( completion_step ) ,  id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-04 10:41:12 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    m_timers . set ( id ,  timer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    timer - > start ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // 14. Return id.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  id ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-05 00:56:16 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-02-07 15:12:41 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#run-the-animation-frame-callbacks
 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								i32  Window : : request_animation_frame_impl ( Bindings : : CallbackType &  js_callback ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-01 18:53:28 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-08 14:12:01 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    return  m_animation_frame_callback_driver . add ( [ this ,  js_callback  =  JS : : make_handle ( js_callback ) ] ( auto )  mutable  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-07 15:12:41 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        // 3. Invoke callback, passing now as the only argument,
 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-14 18:03:08 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        auto  result  =  Bindings : : IDL : : invoke_callback ( * js_callback ,  { } ,  JS : : Value ( performance ( ) . now ( ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-07 15:12:41 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        // and if an exception is thrown, report the exception.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        if  ( result . is_error ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            HTML : : report_exception ( result ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-01 18:53:28 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								    } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  Window : : cancel_animation_frame_impl ( i32  id ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-01 18:53:28 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-05 20:08:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    m_animation_frame_callback_driver . remove ( id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-01 18:53:28 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-13 00:33:23 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  Window : : did_set_location_href ( Badge < Bindings : : LocationObject > ,  AK : : URL  const &  new_href ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-18 21:52:50 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-06 14:41:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    auto *  browsing_context  =  associated_document ( ) . browsing_context ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( ! browsing_context ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-18 21:52:50 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        return ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-06 14:41:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    browsing_context - > loader ( ) . load ( new_href ,  FrameLoader : : Type : : Navigation ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-18 21:52:50 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-18 22:05:13 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  Window : : did_call_location_reload ( Badge < Bindings : : LocationObject > ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-06 14:41:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    auto *  browsing_context  =  associated_document ( ) . browsing_context ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( ! browsing_context ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-18 22:05:13 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        return ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-06 14:41:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    browsing_context - > loader ( ) . load ( associated_document ( ) . url ( ) ,  FrameLoader : : Type : : Reload ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-18 22:05:13 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-10-03 23:31:52 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  Window : : did_call_location_replace ( Badge < Bindings : : LocationObject > ,  String  url ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-06 14:41:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    auto *  browsing_context  =  associated_document ( ) . browsing_context ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( ! browsing_context ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-03 23:31:52 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto  new_url  =  associated_document ( ) . parse_url ( url ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-06 14:41:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    browsing_context - > loader ( ) . load ( move ( new_url ) ,  FrameLoader : : Type : : Navigation ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-03 23:31:52 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-08 22:29:40 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								bool  Window : : dispatch_event ( DOM : : Event &  event ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-18 13:43:44 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-07 23:08:26 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    return  DOM : : EventDispatcher : : dispatch ( * this ,  event ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-18 13:43:44 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-02-06 01:12:57 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// https://www.w3.org/TR/cssom-view-1/#dom-window-innerwidth
 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-16 17:22:01 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								int  Window : : inner_width ( )  const 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-06 01:12:57 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    // The innerWidth attribute must return the viewport width including the size of a rendered scroll bar (if any),
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // or zero if there is no viewport.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( auto  const *  browsing_context  =  associated_document ( ) . browsing_context ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  browsing_context - > viewport_rect ( ) . width ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-16 17:22:01 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-02-06 01:12:57 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// https://www.w3.org/TR/cssom-view-1/#dom-window-innerheight
 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-16 17:22:01 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								int  Window : : inner_height ( )  const 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-06 01:12:57 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    // The innerHeight attribute must return the viewport height including the size of a rendered scroll bar (if any),
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // or zero if there is no viewport.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( auto  const *  browsing_context  =  associated_document ( ) . browsing_context ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  browsing_context - > viewport_rect ( ) . height ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-16 17:22:01 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-09 13:45:03 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Page *  Window : : page ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-09 13:55:31 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    return  associated_document ( ) . page ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-09 13:45:03 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Page  const *  Window : : page ( )  const 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-09 13:55:31 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    return  associated_document ( ) . page ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-09 13:45:03 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								CSS : : CSSStyleDeclaration *  Window : : get_computed_style_impl ( DOM : : Element &  element )  const 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-11 00:33:30 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-23 12:35:56 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    return  CSS : : ResolvedCSSStyleDeclaration : : create ( element ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-11 00:33:30 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								JS : : NonnullGCPtr < CSS : : MediaQueryList >  Window : : match_media_impl ( String  media ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-12 17:10:27 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2022-04-12 12:00:07 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    auto  media_query_list  =  CSS : : MediaQueryList : : create ( associated_document ( ) ,  parse_media_query_list ( CSS : : Parser : : ParsingContext ( associated_document ( ) ) ,  media ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    associated_document ( ) . add_media_query_list ( * media_query_list ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-04 17:41:35 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    return  media_query_list ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-12 17:10:27 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-08 16:51:33 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Optional < CSS : : MediaFeatureValue >  Window : : query_media_feature ( CSS : : MediaFeatureID  media_feature )  const 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-03 19:26:17 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // FIXME: Many of these should be dependent on the hardware
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-16 17:14:20 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    // https://www.w3.org/TR/mediaqueries-5/#media-descriptor-table
 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-08 16:51:33 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    switch  ( media_feature )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    case  CSS : : MediaFeatureID : : AnyHover : 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-08 17:57:37 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        return  CSS : : MediaFeatureValue ( CSS : : ValueID : : Hover ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-08 16:51:33 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    case  CSS : : MediaFeatureID : : AnyPointer : 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-08 17:57:37 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        return  CSS : : MediaFeatureValue ( CSS : : ValueID : : Fine ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-08 16:51:33 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    case  CSS : : MediaFeatureID : : AspectRatio : 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-06 17:50:56 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        return  CSS : : MediaFeatureValue ( CSS : : Ratio ( inner_width ( ) ,  inner_height ( ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-08 16:51:33 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    case  CSS : : MediaFeatureID : : Color : 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-05 22:31:46 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        return  CSS : : MediaFeatureValue ( 8 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-08 16:51:33 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    case  CSS : : MediaFeatureID : : ColorGamut : 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-08 17:57:37 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        return  CSS : : MediaFeatureValue ( CSS : : ValueID : : Srgb ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-08 16:51:33 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    case  CSS : : MediaFeatureID : : ColorIndex : 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-29 17:52:14 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        return  CSS : : MediaFeatureValue ( 0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-03 19:26:17 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    // FIXME: device-aspect-ratio
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // FIXME: device-height
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // FIXME: device-width
 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-16 17:14:20 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    case  CSS : : MediaFeatureID : : DisplayMode : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        // FIXME: Detect if window is fullscreen
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  CSS : : MediaFeatureValue ( CSS : : ValueID : : Browser ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    case  CSS : : MediaFeatureID : : DynamicRange : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  CSS : : MediaFeatureValue ( CSS : : ValueID : : Standard ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    case  CSS : : MediaFeatureID : : EnvironmentBlending : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  CSS : : MediaFeatureValue ( CSS : : ValueID : : Opaque ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    case  CSS : : MediaFeatureID : : ForcedColors : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  CSS : : MediaFeatureValue ( CSS : : ValueID : : None ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-08 16:51:33 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    case  CSS : : MediaFeatureID : : Grid : 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-29 17:52:14 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        return  CSS : : MediaFeatureValue ( 0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-08 16:51:33 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    case  CSS : : MediaFeatureID : : Height : 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-29 17:52:14 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        return  CSS : : MediaFeatureValue ( CSS : : Length : : make_px ( inner_height ( ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-16 17:14:20 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    case  CSS : : MediaFeatureID : : HorizontalViewportSegments : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  CSS : : MediaFeatureValue ( 1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-08 16:51:33 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    case  CSS : : MediaFeatureID : : Hover : 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-08 17:57:37 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        return  CSS : : MediaFeatureValue ( CSS : : ValueID : : Hover ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-16 17:14:20 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    case  CSS : : MediaFeatureID : : InvertedColors : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  CSS : : MediaFeatureValue ( CSS : : ValueID : : None ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-08 16:51:33 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    case  CSS : : MediaFeatureID : : Monochrome : 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-29 17:52:14 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        return  CSS : : MediaFeatureValue ( 0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-16 17:14:20 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    case  CSS : : MediaFeatureID : : NavControls : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  CSS : : MediaFeatureValue ( CSS : : ValueID : : Back ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-08 16:51:33 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    case  CSS : : MediaFeatureID : : Orientation : 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-08 17:57:37 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        return  CSS : : MediaFeatureValue ( inner_height ( )  > =  inner_width ( )  ?  CSS : : ValueID : : Portrait  :  CSS : : ValueID : : Landscape ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-08 16:51:33 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    case  CSS : : MediaFeatureID : : OverflowBlock : 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-08 17:57:37 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        return  CSS : : MediaFeatureValue ( CSS : : ValueID : : Scroll ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-08 16:51:33 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    case  CSS : : MediaFeatureID : : OverflowInline : 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-08 17:57:37 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        return  CSS : : MediaFeatureValue ( CSS : : ValueID : : Scroll ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-08 16:51:33 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    case  CSS : : MediaFeatureID : : Pointer : 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-08 17:57:37 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        return  CSS : : MediaFeatureValue ( CSS : : ValueID : : Fine ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-08 16:51:33 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    case  CSS : : MediaFeatureID : : PrefersColorScheme :  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-23 17:36:43 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        if  ( auto *  page  =  this - > page ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            switch  ( page - > preferred_color_scheme ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            case  CSS : : PreferredColorScheme : : Light : 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-08 17:57:37 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                return  CSS : : MediaFeatureValue ( CSS : : ValueID : : Light ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-23 17:36:43 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            case  CSS : : PreferredColorScheme : : Dark : 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-08 17:57:37 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                return  CSS : : MediaFeatureValue ( CSS : : ValueID : : Dark ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-23 17:36:43 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            case  CSS : : PreferredColorScheme : : Auto : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            default : 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-08 17:57:37 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                return  CSS : : MediaFeatureValue ( page - > palette ( ) . is_dark ( )  ?  CSS : : ValueID : : Dark  :  CSS : : ValueID : : Light ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-23 17:36:43 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-08 16:51:33 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        return  CSS : : MediaFeatureValue ( CSS : : ValueID : : Light ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-16 17:14:20 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    case  CSS : : MediaFeatureID : : PrefersContrast : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        // FIXME: Make this a preference
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  CSS : : MediaFeatureValue ( CSS : : ValueID : : NoPreference ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    case  CSS : : MediaFeatureID : : PrefersReducedData : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        // FIXME: Make this a preference
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  CSS : : MediaFeatureValue ( CSS : : ValueID : : NoPreference ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    case  CSS : : MediaFeatureID : : PrefersReducedMotion : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        // FIXME: Make this a preference
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  CSS : : MediaFeatureValue ( CSS : : ValueID : : NoPreference ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    case  CSS : : MediaFeatureID : : PrefersReducedTransparency : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        // FIXME: Make this a preference
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  CSS : : MediaFeatureValue ( CSS : : ValueID : : NoPreference ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // FIXME: resolution
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    case  CSS : : MediaFeatureID : : Scan : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  CSS : : MediaFeatureValue ( CSS : : ValueID : : Progressive ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    case  CSS : : MediaFeatureID : : Scripting : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        if  ( associated_document ( ) . is_scripting_enabled ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            return  CSS : : MediaFeatureValue ( CSS : : ValueID : : Enabled ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  CSS : : MediaFeatureValue ( CSS : : ValueID : : None ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    case  CSS : : MediaFeatureID : : Update : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  CSS : : MediaFeatureValue ( CSS : : ValueID : : Fast ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    case  CSS : : MediaFeatureID : : VerticalViewportSegments : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  CSS : : MediaFeatureValue ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    case  CSS : : MediaFeatureID : : VideoColorGamut : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  CSS : : MediaFeatureValue ( CSS : : ValueID : : Srgb ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    case  CSS : : MediaFeatureID : : VideoDynamicRange : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  CSS : : MediaFeatureValue ( CSS : : ValueID : : Standard ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    case  CSS : : MediaFeatureID : : Width : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  CSS : : MediaFeatureValue ( CSS : : Length : : make_px ( inner_width ( ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-08 16:51:33 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    default : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        break ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-23 17:36:43 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-10-03 19:26:17 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    return  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-24 21:49:31 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// https://www.w3.org/TR/cssom-view/#dom-window-scrollx
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								float  Window : : scroll_x ( )  const 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( auto *  page  =  this - > page ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  page - > top_level_browsing_context ( ) . viewport_scroll_offset ( ) . x ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// https://www.w3.org/TR/cssom-view/#dom-window-scrolly
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								float  Window : : scroll_y ( )  const 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( auto *  page  =  this - > page ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  page - > top_level_browsing_context ( ) . viewport_scroll_offset ( ) . y ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-26 12:39:27 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// https://html.spec.whatwg.org/#fire-a-page-transition-event
 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-01 19:05:28 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  Window : : fire_a_page_transition_event ( FlyString  const &  event_name ,  bool  persisted ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-26 12:39:27 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // To fire a page transition event named eventName at a Window window with a boolean persisted,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // fire an event named eventName at window, using PageTransitionEvent,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // with the persisted attribute initialized to persisted,
 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-01 19:05:28 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    HTML : : PageTransitionEventInit  event_init  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    event_init . persisted  =  persisted ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    auto  event  =  HTML : : PageTransitionEvent : : create ( associated_document ( ) . window ( ) ,  event_name ,  event_init ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-26 12:39:27 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-30 20:11:27 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    // ...the cancelable attribute initialized to true,
 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-26 12:39:27 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    event - > set_cancelable ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // the bubbles attribute initialized to true,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    event - > set_bubbles ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // and legacy target override flag set.
 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-08 22:29:40 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    dispatch_event ( * event ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-26 12:39:27 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-26 14:36:20 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// https://html.spec.whatwg.org/#dom-queuemicrotask
 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  Window : : queue_microtask_impl ( Bindings : : CallbackType &  callback ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-26 14:36:20 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-14 18:03:08 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    // The queueMicrotask(callback) method must queue a microtask to invoke callback,
 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-08 14:12:01 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    HTML : : queue_a_microtask ( & associated_document ( ) ,  [ callback  =  JS : : make_handle ( callback ) ] ( )  mutable  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-14 18:03:08 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        auto  result  =  Bindings : : IDL : : invoke_callback ( * callback ,  { } ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-07 15:12:41 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        // and if callback throws an exception, report the exception.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        if  ( result . is_error ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            HTML : : report_exception ( result ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-26 14:36:20 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-27 16:34:06 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								float  Window : : device_pixel_ratio ( )  const 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // FIXME: Return 2.0f if we're in HiDPI mode!
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  1.0f ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-29 00:15:26 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// https://drafts.csswg.org/cssom-view/#dom-window-screenx
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								int  Window : : screen_x ( )  const 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // The screenX and screenLeft attributes must return the x-coordinate, relative to the origin of the Web-exposed screen area,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // of the left of the client window as number of CSS pixels, or zero if there is no such thing.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// https://drafts.csswg.org/cssom-view/#dom-window-screeny
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								int  Window : : screen_y ( )  const 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // The screenY and screenTop attributes must return the y-coordinate, relative to the origin of the screen of the Web-exposed screen area,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // of the top of the client window as number of CSS pixels, or zero if there is no such thing.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-10-10 19:12:32 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// https://w3c.github.io/selection-api/#dom-window-getselection
 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Selection : : Selection *  Window : : get_selection_impl ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-10 19:12:32 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // FIXME: Implement.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  nullptr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-02-08 19:38:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// https://html.spec.whatwg.org/multipage/webstorage.html#dom-localstorage
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								RefPtr < HTML : : Storage >  Window : : local_storage ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // FIXME: Implement according to spec.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    static  HashMap < Origin ,  NonnullRefPtr < HTML : : Storage > >  local_storage_per_origin ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  local_storage_per_origin . ensure ( associated_document ( ) . origin ( ) ,  [ ]  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  HTML : : Storage : : create ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-08 04:39:44 +13:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// https://html.spec.whatwg.org/multipage/webstorage.html#dom-sessionstorage
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								RefPtr < HTML : : Storage >  Window : : session_storage ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // FIXME: Implement according to spec.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    static  HashMap < Origin ,  NonnullRefPtr < HTML : : Storage > >  session_storage_per_origin ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  session_storage_per_origin . ensure ( associated_document ( ) . origin ( ) ,  [ ]  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  HTML : : Storage : : create ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-02-26 15:55:45 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// https://html.spec.whatwg.org/multipage/browsers.html#dom-parent
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Window *  Window : : parent ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // 1. Let current be this Window object's browsing context.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  current  =  associated_document ( ) . browsing_context ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // 2. If current is null, then return null.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( ! current ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  nullptr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // 3. If current is a child browsing context of another browsing context parent,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    //    then return parent's WindowProxy object.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( current - > parent ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        VERIFY ( current - > parent ( ) - > active_document ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  & current - > parent ( ) - > active_document ( ) - > window ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // 4. Assert: current is a top-level browsing context.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    VERIFY ( current - > is_top_level ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // FIXME: 5. Return current's WindowProxy object.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    VERIFY ( current - > active_document ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  & current - > active_document ( ) - > window ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-02-26 17:21:40 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// https://html.spec.whatwg.org/multipage/web-messaging.html#window-post-message-steps
 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								DOM : : ExceptionOr < void >  Window : : post_message_impl ( JS : : Value  message ,  String  const & ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-26 17:21:40 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // FIXME: This is an ad-hoc hack implementation instead, since we don't currently
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    //        have serialization and deserialization of messages.
 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    HTML : : queue_global_task ( HTML : : Task : : Source : : PostedMessage ,  * this ,  [ strong_this  =  JS : : make_handle ( * this ) ,  message ] ( )  mutable  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-26 17:21:40 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        HTML : : MessageEventInit  event_init  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        event_init . data  =  message ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        event_init . origin  =  " <origin> " ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        strong_this - > dispatch_event ( * HTML : : MessageEvent : : create ( * strong_this ,  HTML : : EventNames : : message ,  event_init ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-26 17:21:40 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-16 17:15:11 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// https://html.spec.whatwg.org/multipage/window-object.html#dom-name
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								String  Window : : name ( )  const 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // 1. If this's browsing context is null, then return the empty string.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( ! browsing_context ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  String : : empty ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // 2. Return this's browsing context's name.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  browsing_context ( ) - > name ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// https://html.spec.whatwg.org/multipage/window-object.html#dom-name
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								void  Window : : set_name ( String  const &  name ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // 1. If this's browsing context is null, then return.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( ! browsing_context ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // 2. Set this's browsing context's name to the given value.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    browsing_context ( ) - > set_name ( name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-31 21:55:01 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// https://w3c.github.io/requestidlecallback/#start-an-idle-period-algorithm
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								void  Window : : start_an_idle_period ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // 1. Optionally, if the user agent determines the idle period should be delayed, return from this algorithm.
 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-31 21:55:01 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    // 2. Let pending_list be window's list of idle request callbacks.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto &  pending_list  =  m_idle_request_callbacks ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // 3. Let run_list be window's list of runnable idle callbacks.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto &  run_list  =  m_runnable_idle_callbacks ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    run_list . extend ( pending_list ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // 4. Clear pending_list.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    pending_list . clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // FIXME: This might not agree with the spec, but currently we use 100% CPU if we keep queueing tasks
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( run_list . is_empty ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // 5. Queue a task on the queue associated with the idle-task task source,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    //    which performs the steps defined in the invoke idle callbacks algorithm with window and getDeadline as parameters.
 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    HTML : : queue_global_task ( HTML : : Task : : Source : : IdleTask ,  * this ,  [ window  =  JS : : make_handle ( * this ) ] ( )  mutable  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-31 21:55:01 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        window - > invoke_idle_callbacks ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// https://w3c.github.io/requestidlecallback/#invoke-idle-callbacks-algorithm
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								void  Window : : invoke_idle_callbacks ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto &  event_loop  =  main_thread_event_loop ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // 1. If the user-agent believes it should end the idle period early due to newly scheduled high-priority work, return from the algorithm.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // 2. Let now be the current time.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto  now  =  event_loop . unsafe_shared_current_time ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // 3. If now is less than the result of calling getDeadline and the window's list of runnable idle callbacks is not empty:
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( now  <  event_loop . compute_deadline ( )  & &  ! m_runnable_idle_callbacks . is_empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        // 1. Pop the top callback from window's list of runnable idle callbacks.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        auto  callback  =  m_runnable_idle_callbacks . take_first ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        // 2. Let deadlineArg be a new IdleDeadline whose [get deadline time algorithm] is getDeadline.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        auto  deadline_arg  =  RequestIdleCallback : : IdleDeadline : : create ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        // 3. Call callback with deadlineArg as its argument. If an uncaught runtime script error occurs, then report the exception.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        auto  result  =  callback - > invoke ( deadline_arg ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        if  ( result . is_error ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            HTML : : report_exception ( result ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        // 4. If window's list of runnable idle callbacks is not empty, queue a task which performs the steps
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        //    in the invoke idle callbacks algorithm with getDeadline and window as a parameters and return from this algorithm
 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        HTML : : queue_global_task ( HTML : : Task : : Source : : IdleTask ,  * this ,  [ window  =  JS : : make_handle ( * this ) ] ( )  mutable  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-31 21:55:01 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            window - > invoke_idle_callbacks ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-04-01 19:46:29 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// https://w3c.github.io/requestidlecallback/#the-requestidlecallback-method
 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								u32  Window : : request_idle_callback_impl ( Bindings : : CallbackType &  callback ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-04-01 19:46:29 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // 1. Let window be this Window object.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto &  window  =  * this ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // 2. Increment the window's idle callback identifier by one.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    window . m_idle_callback_identifier + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // 3. Let handle be the current value of window's idle callback identifier.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto  handle  =  window . m_idle_callback_identifier ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // 4. Push callback to the end of window's list of idle request callbacks, associated with handle.
 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-08 14:12:01 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    auto  handler  =  [ callback  =  JS : : make_handle ( callback ) ] ( NonnullRefPtr < RequestIdleCallback : : IdleDeadline >  deadline )  - >  JS : : Completion  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        auto &  realm  =  callback - > callback . shape ( ) . realm ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-22 18:31:08 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        auto *  wrapped_deadline  =  Bindings : : wrap ( realm ,  * deadline ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-04-01 19:46:29 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        return  Bindings : : IDL : : invoke_callback ( const_cast < Bindings : : CallbackType & > ( * callback ) ,  { } ,  JS : : Value ( wrapped_deadline ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    window . m_idle_request_callbacks . append ( adopt_ref ( * new  IdleCallback ( move ( handler ) ,  handle ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // 5. Return handle and then continue running this algorithm asynchronously.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  handle ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // FIXME: 6. If the timeout property is present in options and has a positive value:
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // FIXME:    1. Wait for timeout milliseconds.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // FIXME:    2. Wait until all invocations of this algorithm, whose timeout added to their posted time occurred before this one's, have completed.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // FIXME:    3. Optionally, wait a further user-agent defined length of time.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // FIXME:    4. Queue a task on the queue associated with the idle-task task source, which performs the invoke idle callback timeout algorithm, passing handle and window as arguments.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// https://w3c.github.io/requestidlecallback/#the-cancelidlecallback-method
 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  Window : : cancel_idle_callback_impl ( u32  handle ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-04-01 19:46:29 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // 1. Let window be this Window object.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto &  window  =  * this ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // 2. Find the entry in either the window's list of idle request callbacks or list of runnable idle callbacks
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    //    that is associated with the value handle.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // 3. If there is such an entry, remove it from both window's list of idle request callbacks and the list of runnable idle callbacks.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    window . m_idle_request_callbacks . remove_first_matching ( [ handle ] ( auto &  callback )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  callback - > handle ( )  = =  handle ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    window . m_runnable_idle_callbacks . remove_first_matching ( [ handle ] ( auto &  callback )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  callback - > handle ( )  = =  handle ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-04 21:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  Window : : set_associated_document ( DOM : : Document &  document ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    m_associated_document  =  & document ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-04 21:19:30 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-08 22:29:40 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  Window : : set_current_event ( DOM : : Event *  event ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    m_current_event  =  event ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								HTML : : BrowsingContext  const *  Window : : browsing_context ( )  const 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  m_associated_document - > browsing_context ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								HTML : : BrowsingContext *  Window : : browsing_context ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  m_associated_document - > browsing_context ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								void  Window : : initialize ( JS : : Realm &  realm ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    Base : : initialize ( realm ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // FIXME: This is a hack..
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    realm . set_global_object ( this ,  this ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    ADD_WINDOW_OBJECT_INTERFACES ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    Object : : set_prototype ( & ensure_web_prototype < Bindings : : WindowPrototype > ( " Window " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // FIXME: These should be native accessors, not properties
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_direct_property ( " window " ,  this ,  JS : : Attribute : : Enumerable ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_direct_property ( " frames " ,  this ,  JS : : Attribute : : Enumerable ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_direct_property ( " self " ,  this ,  JS : : Attribute : : Enumerable ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_accessor ( realm ,  " top " ,  top_getter ,  nullptr ,  JS : : Attribute : : Enumerable ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_accessor ( realm ,  " parent " ,  parent_getter ,  { } ,  JS : : Attribute : : Enumerable ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_accessor ( realm ,  " document " ,  document_getter ,  { } ,  JS : : Attribute : : Enumerable ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_accessor ( realm ,  " name " ,  name_getter ,  name_setter ,  JS : : Attribute : : Enumerable ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_accessor ( realm ,  " history " ,  history_getter ,  { } ,  JS : : Attribute : : Enumerable ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_accessor ( realm ,  " performance " ,  performance_getter ,  performance_setter ,  JS : : Attribute : : Enumerable  |  JS : : Attribute : : Configurable ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_accessor ( realm ,  " crypto " ,  crypto_getter ,  { } ,  JS : : Attribute : : Enumerable ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_accessor ( realm ,  " screen " ,  screen_getter ,  { } ,  JS : : Attribute : : Enumerable ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_accessor ( realm ,  " innerWidth " ,  inner_width_getter ,  { } ,  JS : : Attribute : : Enumerable ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_accessor ( realm ,  " innerHeight " ,  inner_height_getter ,  { } ,  JS : : Attribute : : Enumerable ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_accessor ( realm ,  " devicePixelRatio " ,  device_pixel_ratio_getter ,  { } ,  JS : : Attribute : : Enumerable  |  JS : : Attribute : : Configurable ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    u8  attr  =  JS : : Attribute : : Writable  |  JS : : Attribute : : Enumerable  |  JS : : Attribute : : Configurable ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_function ( realm ,  " alert " ,  alert ,  0 ,  attr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_function ( realm ,  " confirm " ,  confirm ,  0 ,  attr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_function ( realm ,  " prompt " ,  prompt ,  0 ,  attr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_function ( realm ,  " setInterval " ,  set_interval ,  1 ,  attr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_function ( realm ,  " setTimeout " ,  set_timeout ,  1 ,  attr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_function ( realm ,  " clearInterval " ,  clear_interval ,  1 ,  attr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_function ( realm ,  " clearTimeout " ,  clear_timeout ,  1 ,  attr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_function ( realm ,  " requestAnimationFrame " ,  request_animation_frame ,  1 ,  attr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_function ( realm ,  " cancelAnimationFrame " ,  cancel_animation_frame ,  1 ,  attr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_function ( realm ,  " atob " ,  atob ,  1 ,  attr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_function ( realm ,  " btoa " ,  btoa ,  1 ,  attr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_function ( realm ,  " queueMicrotask " ,  queue_microtask ,  1 ,  attr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_function ( realm ,  " requestIdleCallback " ,  request_idle_callback ,  1 ,  attr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_function ( realm ,  " cancelIdleCallback " ,  cancel_idle_callback ,  1 ,  attr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_function ( realm ,  " getComputedStyle " ,  get_computed_style ,  1 ,  attr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_function ( realm ,  " matchMedia " ,  match_media ,  1 ,  attr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_function ( realm ,  " getSelection " ,  get_selection ,  0 ,  attr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_function ( realm ,  " postMessage " ,  post_message ,  1 ,  attr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // FIXME: These properties should be [Replaceable] according to the spec, but [Writable+Configurable] is the closest we have.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_accessor ( realm ,  " scrollX " ,  scroll_x_getter ,  { } ,  attr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_accessor ( realm ,  " pageXOffset " ,  scroll_x_getter ,  { } ,  attr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_accessor ( realm ,  " scrollY " ,  scroll_y_getter ,  { } ,  attr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_accessor ( realm ,  " pageYOffset " ,  scroll_y_getter ,  { } ,  attr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_function ( realm ,  " scroll " ,  scroll ,  2 ,  attr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_function ( realm ,  " scrollTo " ,  scroll ,  2 ,  attr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_function ( realm ,  " scrollBy " ,  scroll_by ,  2 ,  attr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_accessor ( realm ,  " screenX " ,  screen_x_getter ,  { } ,  attr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_accessor ( realm ,  " screenY " ,  screen_y_getter ,  { } ,  attr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_accessor ( realm ,  " screenLeft " ,  screen_left_getter ,  { } ,  attr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_accessor ( realm ,  " screenTop " ,  screen_top_getter ,  { } ,  attr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_direct_property ( " CSS " ,  heap ( ) . allocate < Bindings : : CSSNamespace > ( realm ,  realm ) ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_accessor ( realm ,  " localStorage " ,  local_storage_getter ,  { } ,  attr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_accessor ( realm ,  " sessionStorage " ,  session_storage_getter ,  { } ,  attr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_accessor ( realm ,  " origin " ,  origin_getter ,  { } ,  attr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // Legacy
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_accessor ( realm ,  " event " ,  event_getter ,  event_setter ,  JS : : Attribute : : Enumerable ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    m_location_object  =  heap ( ) . allocate < Bindings : : LocationObject > ( realm ,  realm ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  m_navigator_object  =  heap ( ) . allocate < Bindings : : NavigatorObject > ( realm ,  realm ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_direct_property ( " navigator " ,  m_navigator_object ,  JS : : Attribute : : Enumerable  |  JS : : Attribute : : Configurable ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_direct_property ( " clientInformation " ,  m_navigator_object ,  JS : : Attribute : : Enumerable  |  JS : : Attribute : : Configurable ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // NOTE: location is marked as [LegacyUnforgeable], meaning it isn't configurable.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_accessor ( realm ,  " location " ,  location_getter ,  location_setter ,  JS : : Attribute : : Enumerable ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // WebAssembly "namespace"
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_direct_property ( " WebAssembly " ,  heap ( ) . allocate < Bindings : : WebAssemblyObject > ( realm ,  realm ) ,  JS : : Attribute : : Enumerable  |  JS : : Attribute : : Configurable ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // HTML::GlobalEventHandlers and HTML::WindowEventHandlers
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# define __ENUMERATE(attribute, event_name) \ 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    define_native_accessor ( realm ,  # attribute ,  attribute # # _getter ,  attribute # # _setter ,  attr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    ENUMERATE_GLOBAL_EVENT_HANDLERS ( __ENUMERATE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    ENUMERATE_WINDOW_EVENT_HANDLERS ( __ENUMERATE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# undef __ENUMERATE 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								HTML : : Origin  Window : : origin ( )  const 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  impl ( ) . associated_document ( ) . origin ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// https://webidl.spec.whatwg.org/#platform-object-setprototypeof
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS : : ThrowCompletionOr < bool >  Window : : internal_set_prototype_of ( JS : : Object *  prototype ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // 1. Return ? SetImmutablePrototype(O, V).
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  set_immutable_prototype ( prototype ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								static  JS : : ThrowCompletionOr < HTML : : Window * >  impl_from ( JS : : VM &  vm ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // Since this is a non built-in function we must treat it as non-strict mode
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // this means that a nullish this_value should be converted to the
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // global_object. Generally this does not matter as we try to convert the
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // this_value to a specific object type in the bindings. But since window is
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // the global object we make an exception here.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // This allows calls like `setTimeout(f, 10)` to work.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto  this_value  =  vm . this_value ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( this_value . is_nullish ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        this_value  =  & vm . current_realm ( ) - > global_object ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  this_object  =  MUST ( this_value . to_object ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( ! is < Window > ( * this_object ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  vm . throw_completion < JS : : TypeError > ( JS : : ErrorType : : NotAnObjectOfType ,  " Window " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  & static_cast < Window * > ( this_object ) - > impl ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : alert ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#simple-dialogs
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // Note: This method is defined using two overloads, instead of using an optional argument,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    //       for historical reasons. The practical impact of this is that alert(undefined) is
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    //       treated as alert("undefined"), but alert() is treated as alert("").
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  impl  =  TRY ( impl_from ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    String  message  =  " " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( vm . argument_count ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        message  =  TRY ( vm . argument ( 0 ) . to_string ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    impl - > alert_impl ( message ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  JS : : js_undefined ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : confirm ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  impl  =  TRY ( impl_from ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    String  message  =  " " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( ! vm . argument ( 0 ) . is_undefined ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        message  =  TRY ( vm . argument ( 0 ) . to_string ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  JS : : Value ( impl - > confirm_impl ( message ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : prompt ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  impl  =  TRY ( impl_from ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    String  message  =  " " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    String  default_  =  " " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( ! vm . argument ( 0 ) . is_undefined ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        message  =  TRY ( vm . argument ( 0 ) . to_string ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( ! vm . argument ( 1 ) . is_undefined ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        default_  =  TRY ( vm . argument ( 1 ) . to_string ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto  response  =  impl - > prompt_impl ( message ,  default_ ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( response . is_null ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  JS : : js_null ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  JS : : js_string ( vm ,  response ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								static  JS : : ThrowCompletionOr < TimerHandler >  make_timer_handler ( JS : : VM &  vm ,  JS : : Value  handler ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( handler . is_function ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  JS : : make_handle ( vm . heap ( ) . allocate_without_realm < Bindings : : CallbackType > ( handler . as_function ( ) ,  HTML : : incumbent_settings_object ( ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  TRY ( handler . to_string ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-settimeout
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : set_timeout ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  impl  =  TRY ( impl_from ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( ! vm . argument_count ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  vm . throw_completion < JS : : TypeError > ( JS : : ErrorType : : BadArgCountAtLeastOne ,  " setTimeout " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto  handler  =  TRY ( make_timer_handler ( vm ,  vm . argument ( 0 ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    i32  timeout  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( vm . argument_count ( )  > =  2 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        timeout  =  TRY ( vm . argument ( 1 ) . to_i32 ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    JS : : MarkedVector < JS : : Value >  arguments  {  vm . heap ( )  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    for  ( size_t  i  =  2 ;  i  <  vm . argument_count ( ) ;  + + i ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        arguments . append ( vm . argument ( i ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto  id  =  impl - > set_timeout_impl ( move ( handler ) ,  timeout ,  move ( arguments ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  JS : : Value ( id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-setinterval
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : set_interval ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  impl  =  TRY ( impl_from ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( ! vm . argument_count ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  vm . throw_completion < JS : : TypeError > ( JS : : ErrorType : : BadArgCountAtLeastOne ,  " setInterval " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto  handler  =  TRY ( make_timer_handler ( vm ,  vm . argument ( 0 ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    i32  timeout  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( vm . argument_count ( )  > =  2 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        timeout  =  TRY ( vm . argument ( 1 ) . to_i32 ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    JS : : MarkedVector < JS : : Value >  arguments  {  vm . heap ( )  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    for  ( size_t  i  =  2 ;  i  <  vm . argument_count ( ) ;  + + i ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        arguments . append ( vm . argument ( i ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto  id  =  impl - > set_interval_impl ( move ( handler ) ,  timeout ,  move ( arguments ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  JS : : Value ( id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-cleartimeout
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : clear_timeout ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  impl  =  TRY ( impl_from ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    i32  id  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( vm . argument_count ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        id  =  TRY ( vm . argument ( 0 ) . to_i32 ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    impl - > clear_timeout_impl ( id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  JS : : js_undefined ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-clearinterval
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : clear_interval ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  impl  =  TRY ( impl_from ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    i32  id  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( vm . argument_count ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        id  =  TRY ( vm . argument ( 0 ) . to_i32 ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    impl - > clear_interval_impl ( id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  JS : : js_undefined ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : request_animation_frame ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  impl  =  TRY ( impl_from ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( ! vm . argument_count ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  vm . throw_completion < JS : : TypeError > ( JS : : ErrorType : : BadArgCountOne ,  " requestAnimationFrame " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  callback_object  =  TRY ( vm . argument ( 0 ) . to_object ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( ! callback_object - > is_function ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  vm . throw_completion < JS : : TypeError > ( JS : : ErrorType : : NotAFunctionNoParam ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  callback  =  vm . heap ( ) . allocate_without_realm < Bindings : : CallbackType > ( * callback_object ,  HTML : : incumbent_settings_object ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  JS : : Value ( impl - > request_animation_frame_impl ( * callback ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : cancel_animation_frame ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  impl  =  TRY ( impl_from ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( ! vm . argument_count ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  vm . throw_completion < JS : : TypeError > ( JS : : ErrorType : : BadArgCountOne ,  " cancelAnimationFrame " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto  id  =  TRY ( vm . argument ( 0 ) . to_i32 ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    impl - > cancel_animation_frame_impl ( id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  JS : : js_undefined ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : queue_microtask ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  impl  =  TRY ( impl_from ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( ! vm . argument_count ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  vm . throw_completion < JS : : TypeError > ( JS : : ErrorType : : BadArgCountAtLeastOne ,  " queueMicrotask " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  callback_object  =  TRY ( vm . argument ( 0 ) . to_object ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( ! callback_object - > is_function ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  vm . throw_completion < JS : : TypeError > ( JS : : ErrorType : : NotAFunctionNoParam ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  callback  =  vm . heap ( ) . allocate_without_realm < Bindings : : CallbackType > ( * callback_object ,  HTML : : incumbent_settings_object ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    impl - > queue_microtask_impl ( * callback ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  JS : : js_undefined ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : request_idle_callback ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  impl  =  TRY ( impl_from ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( ! vm . argument_count ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  vm . throw_completion < JS : : TypeError > ( JS : : ErrorType : : BadArgCountAtLeastOne ,  " requestIdleCallback " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  callback_object  =  TRY ( vm . argument ( 0 ) . to_object ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( ! callback_object - > is_function ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  vm . throw_completion < JS : : TypeError > ( JS : : ErrorType : : NotAFunctionNoParam ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // FIXME: accept options object
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  callback  =  vm . heap ( ) . allocate_without_realm < Bindings : : CallbackType > ( * callback_object ,  HTML : : incumbent_settings_object ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  JS : : Value ( impl - > request_idle_callback_impl ( * callback ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : cancel_idle_callback ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  impl  =  TRY ( impl_from ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( ! vm . argument_count ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  vm . throw_completion < JS : : TypeError > ( JS : : ErrorType : : BadArgCountOne ,  " cancelIdleCallback " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto  id  =  TRY ( vm . argument ( 0 ) . to_u32 ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    impl - > cancel_idle_callback_impl ( id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  JS : : js_undefined ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : atob ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( ! vm . argument_count ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  vm . throw_completion < JS : : TypeError > ( JS : : ErrorType : : BadArgCountOne ,  " atob " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto  string  =  TRY ( vm . argument ( 0 ) . to_string ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto  decoded  =  decode_base64 ( StringView ( string ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( decoded . is_error ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  vm . throw_completion < JS : : TypeError > ( JS : : ErrorType : : InvalidFormat ,  " Base64 " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // decode_base64() returns a byte string. LibJS uses UTF-8 for strings. Use Latin1Decoder to convert bytes 128-255 to UTF-8.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto  decoder  =  TextCodec : : decoder_for ( " windows-1252 " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    VERIFY ( decoder ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  JS : : js_string ( vm ,  decoder - > to_utf8 ( decoded . value ( ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : btoa ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( ! vm . argument_count ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  vm . throw_completion < JS : : TypeError > ( JS : : ErrorType : : BadArgCountOne ,  " btoa " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto  string  =  TRY ( vm . argument ( 0 ) . to_string ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    Vector < u8 >  byte_string ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    byte_string . ensure_capacity ( string . length ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    for  ( u32  code_point  :  Utf8View ( string ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        if  ( code_point  >  0xff )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            return  Bindings : : throw_dom_exception_if_needed ( vm ,  [ ]  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                return  DOM : : InvalidCharacterError : : create ( " Data contains characters outside the range U+0000 and U+00FF " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            } ) . release_error ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        byte_string . append ( code_point ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto  encoded  =  encode_base64 ( byte_string . span ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  JS : : js_string ( vm ,  move ( encoded ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// https://html.spec.whatwg.org/multipage/browsers.html#dom-top
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : top_getter ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  impl  =  TRY ( impl_from ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  this_browsing_context  =  impl - > associated_document ( ) . browsing_context ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( ! this_browsing_context ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  JS : : js_null ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    VERIFY ( this_browsing_context - > top_level_browsing_context ( ) . active_document ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto &  top_window  =  this_browsing_context - > top_level_browsing_context ( ) . active_document ( ) - > window ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  & top_window ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : parent_getter ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  impl  =  TRY ( impl_from ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  parent  =  impl - > parent ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( ! parent ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  JS : : js_null ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  parent ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : document_getter ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto &  realm  =  * vm . current_realm ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  impl  =  TRY ( impl_from ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  wrap ( realm ,  impl - > associated_document ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : performance_getter ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto &  realm  =  * vm . current_realm ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  impl  =  TRY ( impl_from ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  wrap ( realm ,  impl - > performance ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-08 22:29:40 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-28 13:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : performance_setter ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // https://webidl.spec.whatwg.org/#dfn-attribute-setter
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // 4.1. If no arguments were passed, then throw a TypeError.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( vm . argument_count ( )  = =  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  vm . throw_completion < JS : : TypeError > ( JS : : ErrorType : : BadArgCountOne ,  " set performance " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  impl  =  TRY ( impl_from ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // 5. If attribute is declared with the [Replaceable] extended attribute, then:
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // 1. Perform ? CreateDataProperty(esValue, id, V).
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    TRY ( impl - > create_data_property ( " performance " ,  vm . argument ( 0 ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // 2. Return undefined.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  JS : : js_undefined ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : screen_getter ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto &  realm  =  * vm . current_realm ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  impl  =  TRY ( impl_from ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  wrap ( realm ,  impl - > screen ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : event_getter ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto &  realm  =  * vm . current_realm ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  impl  =  TRY ( impl_from ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( ! impl - > current_event ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  JS : : js_undefined ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  wrap ( realm ,  const_cast < DOM : : Event & > ( * impl - > current_event ( ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : event_setter ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    REPLACEABLE_PROPERTY_SETTER ( Window ,  event ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : location_getter ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  impl  =  TRY ( impl_from ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  impl - > m_location_object ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : location_setter ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  impl  =  TRY ( impl_from ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    TRY ( impl - > m_location_object - > set ( JS : : PropertyKey ( " href " ) ,  vm . argument ( 0 ) ,  JS : : Object : : ShouldThrowExceptions : : Yes ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  JS : : js_undefined ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : crypto_getter ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto &  realm  =  * vm . current_realm ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  impl  =  TRY ( impl_from ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  wrap ( realm ,  impl - > crypto ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : inner_width_getter ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  impl  =  TRY ( impl_from ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  JS : : Value ( impl - > inner_width ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : inner_height_getter ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  impl  =  TRY ( impl_from ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  JS : : Value ( impl - > inner_height ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : device_pixel_ratio_getter ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  impl  =  TRY ( impl_from ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  JS : : Value ( impl - > device_pixel_ratio ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : get_computed_style ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto &  realm  =  * vm . current_realm ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  impl  =  TRY ( impl_from ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  object  =  TRY ( vm . argument ( 0 ) . to_object ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( ! is < DOM : : Element > ( object ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  vm . throw_completion < JS : : TypeError > ( JS : : ErrorType : : NotAnObjectOfType ,  " DOM element " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  wrap ( realm ,  * impl - > get_computed_style_impl ( * static_cast < DOM : : Element * > ( object ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : get_selection ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto &  realm  =  * vm . current_realm ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  impl  =  TRY ( impl_from ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  selection  =  impl - > get_selection_impl ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( ! selection ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  JS : : js_null ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  wrap ( realm ,  * selection ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : match_media ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  impl  =  TRY ( impl_from ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto  media  =  TRY ( vm . argument ( 0 ) . to_string ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  impl - > match_media_impl ( move ( media ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// https://www.w3.org/TR/cssom-view/#dom-window-scrollx
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : scroll_x_getter ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  impl  =  TRY ( impl_from ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  JS : : Value ( impl - > scroll_x ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// https://www.w3.org/TR/cssom-view/#dom-window-scrolly
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : scroll_y_getter ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  impl  =  TRY ( impl_from ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  JS : : Value ( impl - > scroll_y ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								enum  class  ScrollBehavior  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    Auto , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    Smooth 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// https://www.w3.org/TR/cssom-view/#perform-a-scroll
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								static  void  perform_a_scroll ( Page &  page ,  double  x ,  double  y ,  ScrollBehavior ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // FIXME: Stop any existing smooth-scrolls
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // FIXME: Implement smooth-scroll
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    page . client ( ) . page_did_request_scroll_to ( {  x ,  y  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// https://www.w3.org/TR/cssom-view/#dom-window-scroll
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : scroll ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  impl  =  TRY ( impl_from ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( ! impl - > page ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  JS : : js_undefined ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto &  page  =  * impl - > page ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto  viewport_rect  =  page . top_level_browsing_context ( ) . viewport_rect ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto  x_value  =  JS : : Value ( viewport_rect . x ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto  y_value  =  JS : : Value ( viewport_rect . y ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    String  behavior_string  =  " auto " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( vm . argument_count ( )  = =  1 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        auto *  options  =  TRY ( vm . argument ( 0 ) . to_object ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        auto  left  =  TRY ( options - > get ( " left " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        if  ( ! left . is_undefined ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            x_value  =  left ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        auto  top  =  TRY ( options - > get ( " top " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        if  ( ! top . is_undefined ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            y_value  =  top ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        auto  behavior_string_value  =  TRY ( options - > get ( " behavior " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        if  ( ! behavior_string_value . is_undefined ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            behavior_string  =  TRY ( behavior_string_value . to_string ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        if  ( behavior_string  ! =  " smooth "  & &  behavior_string  ! =  " auto " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            return  vm . throw_completion < JS : : TypeError > ( " Behavior is not one of 'smooth' or 'auto' " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    }  else  if  ( vm . argument_count ( )  > =  2 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        // We ignore arguments 2+ in line with behavior of Chrome and Firefox
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        x_value  =  vm . argument ( 0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        y_value  =  vm . argument ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    ScrollBehavior  behavior  =  ( behavior_string  = =  " smooth " )  ?  ScrollBehavior : : Smooth  :  ScrollBehavior : : Auto ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    double  x  =  TRY ( x_value . to_double ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    x  =  JS : : Value ( x ) . is_finite_number ( )  ?  x  :  0.0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    double  y  =  TRY ( y_value . to_double ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    y  =  JS : : Value ( y ) . is_finite_number ( )  ?  y  :  0.0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // FIXME: Are we calculating the viewport in the way this function expects?
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // FIXME: Handle overflow-directions other than top-left to bottom-right
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    perform_a_scroll ( page ,  x ,  y ,  behavior ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  JS : : js_undefined ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// https://www.w3.org/TR/cssom-view/#dom-window-scrollby
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : scroll_by ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto &  realm  =  * vm . current_realm ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  impl  =  TRY ( impl_from ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( ! impl - > page ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  JS : : js_undefined ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto &  page  =  * impl - > page ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    JS : : Object *  options  =  nullptr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( vm . argument_count ( )  = =  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        options  =  JS : : Object : : create ( realm ,  nullptr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    }  else  if  ( vm . argument_count ( )  = =  1 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        options  =  TRY ( vm . argument ( 0 ) . to_object ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    }  else  if  ( vm . argument_count ( )  > =  2 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        // We ignore arguments 2+ in line with behavior of Chrome and Firefox
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        options  =  JS : : Object : : create ( realm ,  nullptr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        MUST ( options - > set ( " left " ,  vm . argument ( 0 ) ,  ShouldThrowExceptions : : No ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        MUST ( options - > set ( " top " ,  vm . argument ( 1 ) ,  ShouldThrowExceptions : : No ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        MUST ( options - > set ( " behavior " ,  JS : : js_string ( vm ,  " auto " ) ,  ShouldThrowExceptions : : No ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto  left_value  =  TRY ( options - > get ( " left " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto  left  =  TRY ( left_value . to_double ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto  top_value  =  TRY ( options - > get ( " top " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto  top  =  TRY ( top_value . to_double ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    left  =  JS : : Value ( left ) . is_finite_number ( )  ?  left  :  0.0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    top  =  JS : : Value ( top ) . is_finite_number ( )  ?  top  :  0.0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto  current_scroll_position  =  page . top_level_browsing_context ( ) . viewport_scroll_offset ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    left  =  left  +  current_scroll_position . x ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    top  =  top  +  current_scroll_position . y ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto  behavior_string_value  =  TRY ( options - > get ( " behavior " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto  behavior_string  =  behavior_string_value . is_undefined ( )  ?  " auto "  :  TRY ( behavior_string_value . to_string ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( behavior_string  ! =  " smooth "  & &  behavior_string  ! =  " auto " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  vm . throw_completion < JS : : TypeError > ( " Behavior is not one of 'smooth' or 'auto' " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    ScrollBehavior  behavior  =  ( behavior_string  = =  " smooth " )  ?  ScrollBehavior : : Smooth  :  ScrollBehavior : : Auto ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // FIXME: Spec wants us to call scroll(options) here.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    //        The only difference is that would invoke the viewport calculations that scroll()
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    //        is not actually doing yet, so this is the same for now.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    perform_a_scroll ( page ,  left ,  top ,  behavior ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  JS : : js_undefined ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : history_getter ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto &  realm  =  * vm . current_realm ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  impl  =  TRY ( impl_from ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  wrap ( realm ,  impl - > associated_document ( ) . history ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : screen_left_getter ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  impl  =  TRY ( impl_from ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  JS : : Value ( impl - > screen_x ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : screen_top_getter ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  impl  =  TRY ( impl_from ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  JS : : Value ( impl - > screen_y ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : screen_x_getter ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  impl  =  TRY ( impl_from ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  JS : : Value ( impl - > screen_x ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : screen_y_getter ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  impl  =  TRY ( impl_from ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  JS : : Value ( impl - > screen_y ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : post_message ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  impl  =  TRY ( impl_from ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto  target_origin  =  TRY ( vm . argument ( 1 ) . to_string ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    impl - > post_message_impl ( vm . argument ( 0 ) ,  target_origin ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  JS : : js_undefined ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// https://html.spec.whatwg.org/multipage/webappapis.html#dom-origin
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : origin_getter ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  impl  =  TRY ( impl_from ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  JS : : js_string ( vm ,  impl - > associated_document ( ) . origin ( ) . serialize ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : local_storage_getter ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto &  realm  =  * vm . current_realm ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  impl  =  TRY ( impl_from ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // FIXME: localStorage may throw. We have to deal with that here.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  wrap ( realm ,  * impl - > local_storage ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : session_storage_getter ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto &  realm  =  * vm . current_realm ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  impl  =  TRY ( impl_from ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // FIXME: sessionStorage may throw. We have to deal with that here.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  wrap ( realm ,  * impl - > session_storage ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : name_getter ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  impl  =  TRY ( impl_from ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  JS : : js_string ( vm ,  impl - > name ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								JS_DEFINE_NATIVE_FUNCTION ( Window : : name_setter ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    auto *  impl  =  TRY ( impl_from ( vm ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    impl - > set_name ( TRY ( vm . argument ( 0 ) . to_string ( vm ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  JS : : js_undefined ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# define __ENUMERATE(attribute, event_name)                                        \ 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    JS_DEFINE_NATIVE_FUNCTION ( Window : : attribute # # _getter )                          \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    {                                                                              \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        auto *  impl  =  TRY ( impl_from ( vm ) ) ;                                           \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        auto  retval  =  impl - > attribute ( ) ;                                           \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        if  ( ! retval )                                                               \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            return  JS : : js_null ( ) ;                                                  \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  & retval - > callback ;                                                  \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    }                                                                              \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    JS_DEFINE_NATIVE_FUNCTION ( Window : : attribute # # _setter )                          \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    {                                                                              \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        auto *  impl  =  TRY ( impl_from ( vm ) ) ;                                           \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        auto  value  =  vm . argument ( 0 ) ;                                               \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        Bindings : : CallbackType *  cpp_value  =  nullptr ;                               \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        if  ( value . is_object ( ) )  {                                                   \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            cpp_value  =  vm . heap ( ) . allocate_without_realm < Bindings : : CallbackType > (  \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                value . as_object ( ) ,  HTML : : incumbent_settings_object ( ) ) ;             \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        }                                                                          \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        impl - > set_ # # attribute ( cpp_value ) ;                                          \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  JS : : js_undefined ( ) ;                                                 \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								ENUMERATE_GLOBAL_EVENT_HANDLERS ( __ENUMERATE ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								ENUMERATE_WINDOW_EVENT_HANDLERS ( __ENUMERATE ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# undef __ENUMERATE 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-04-01 18:53:28 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								}