2021-09-12 16:55:10 +01:00
/*
* Copyright ( c ) 2021 , Linus Groh < linusg @ serenityos . org >
2021-10-03 19:39:48 +01:00
* Copyright ( c ) 2021 , Sam Atkins < atkinssj @ serenityos . org >
2021-09-12 16:55:10 +01:00
*
* SPDX - License - Identifier : BSD - 2 - Clause
*/
# include <LibWeb/Bindings/MediaQueryListWrapper.h>
# include <LibWeb/CSS/MediaQueryList.h>
# include <LibWeb/DOM/Document.h>
# include <LibWeb/DOM/EventDispatcher.h>
2021-09-13 00:18:28 +01:00
# include <LibWeb/DOM/EventListener.h>
2021-10-01 01:33:10 +01:00
# include <LibWeb/HTML/EventHandler.h>
2021-09-12 16:55:10 +01:00
namespace Web : : CSS {
2021-09-29 12:58:22 +01:00
MediaQueryList : : MediaQueryList ( DOM : : Document & document , NonnullRefPtrVector < MediaQuery > & & media )
2021-09-12 16:55:10 +01:00
: DOM : : EventTarget ( static_cast < Bindings : : ScriptExecutionContext & > ( document ) )
, m_document ( document )
, m_media ( move ( media ) )
{
2021-10-03 19:39:48 +01:00
evaluate ( ) ;
2021-09-12 16:55:10 +01:00
}
MediaQueryList : : ~ MediaQueryList ( )
{
}
// https://drafts.csswg.org/cssom-view/#dom-mediaquerylist-media
String MediaQueryList : : media ( ) const
{
2021-10-15 16:40:44 +01:00
return serialize_a_media_query_list ( m_media ) ;
2021-09-12 16:55:10 +01:00
}
// https://drafts.csswg.org/cssom-view/#dom-mediaquerylist-matches
bool MediaQueryList : : matches ( ) const
{
2021-10-03 19:39:48 +01:00
for ( auto & media : m_media ) {
if ( media . matches ( ) )
return true ;
}
2021-09-12 16:55:10 +01:00
return false ;
}
2021-10-03 19:39:48 +01:00
bool MediaQueryList : : evaluate ( )
{
2021-12-06 16:27:57 +01:00
if ( ! m_document )
return false ;
2021-10-03 19:39:48 +01:00
bool now_matches = false ;
for ( auto & media : m_media ) {
2021-12-06 16:27:57 +01:00
now_matches = now_matches | | media . evaluate ( m_document - > window ( ) ) ;
2021-10-03 19:39:48 +01:00
}
return now_matches ;
}
2021-09-12 16:55:10 +01:00
JS : : Object * MediaQueryList : : create_wrapper ( JS : : GlobalObject & global_object )
{
return wrap ( global_object , * this ) ;
}
2021-09-13 00:18:28 +01:00
// https://www.w3.org/TR/cssom-view/#dom-mediaquerylist-addlistener
void MediaQueryList : : add_listener ( RefPtr < DOM : : EventListener > listener )
{
// 1. If listener is null, terminate these steps.
if ( ! listener )
return ;
// 2. Append an event listener to the associated list of event listeners with type set to change,
// callback set to listener, and capture set to false, unless there already is an event listener
// in that list with the same type, callback, and capture.
// (NOTE: capture is set to false by default)
add_event_listener ( HTML : : EventNames : : change , listener ) ;
}
// https://www.w3.org/TR/cssom-view/#dom-mediaquerylist-removelistener
void MediaQueryList : : remove_listener ( RefPtr < DOM : : EventListener > listener )
{
// 1. Remove an event listener from the associated list of event listeners, whose type is change, callback is listener, and capture is false.
// NOTE: While the spec doesn't technically use remove_event_listener and instead manipulates the list directly, every major engine uses remove_event_listener.
// This means if an event listener removes another event listener that comes after it, the removed event listener will not be invoked.
remove_event_listener ( HTML : : EventNames : : change , listener ) ;
}
2021-10-01 01:33:10 +01:00
void MediaQueryList : : set_onchange ( HTML : : EventHandler event_handler )
{
set_event_handler_attribute ( HTML : : EventNames : : change , event_handler ) ;
}
HTML : : EventHandler MediaQueryList : : onchange ( )
{
return event_handler_attribute ( HTML : : EventNames : : change ) ;
}
2021-09-12 16:55:10 +01:00
}