
    \jfU                        S SK Jr  S SK Jr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJ	r	  S SK
Jr  S S	KJr  S S
KJr  1 Skr\SS1-  r\ " S S5      5       r\ " S S5      5       rS\\   S\4S jrS\S\S\\   4S jrS\S\4S jrS\S\4S jrS\S\4S jrS\S\4S jrS\S\\   4S jrS\S\SS 4S! jrS\S\SS 4S" jrS\S#\\   SS 4S$ jrS\S#\\   SS 4S% jrS\S&\S#\\   SS 4S' jr S\S\S#\\   SS 4S( jr!S\S\SS 4S) jr"S\S*\SS 4S+ jr#S\S*\S,\\   SS 4S- jr$S\S*\S\SS 4S. jr%S\S\SS 4S/ jr&g )0    )	dataclass)field)List)Optional)Set)TextIO)#interface_supports_named_properties)title_case_to_snake_case)	Interface)Module>   AudioWorkletSharedWorkerServiceWorkerDedicatedWorkerWindowWorkletc                       \ rS rSr% \" \S9r\\   \	S'   \" \S9r
\\   \	S'   \" \S9r\\   \	S'   \" \S9r\\   \	S'   S\SS	4S
 jrSrg	)InterfaceSets   )default_factory
intrinsicswindow_exposeddedicated_worker_exposedshared_worker_exposed	interfacereturnNc                    UR                   R                  S5      nUc  [        SUR                   S35      e[	        UR                  U5      nU R
                  R                  U5        SU;   a  U R                  R                  U5        SU;   a  U R                  R                  U5        SU;   a  U R                  R                  U5        g g )NExposedz
Interface z& is missing extended attribute Exposedr   r   r   )
extended_attributesgetRuntimeErrornameparse_exposure_setr   appendr   r   r   )selfr   exposed_value	exposuress       X/mnt/mint/home/seanl/public/Repos/ladybird/Meta/Generators/libweb_bindings/intrinsics.pyadd_interfaceInterfaceSets.add_interface%   s    !5599)D INN+;;abcc&y~~}E	y)y &&y1	)))00;Y&&&--i8 '     )__name__
__module____qualname____firstlineno__r   listr   r   r   __annotations__r   r   r   r)   __static_attributes__r,   r+   r(   r   r      sc    "'"=JY=&+D&ANDOA05d0Kd9oK-24-H4	?H9y 9T 9r+   r   c                   *    \ rS rSr% \\S'   \\S'   Srg)LegacyConstructor8   r"   constructor_classr,   N)r-   r.   r/   r0   strr2   r3   r,   r+   r(   r5   r5   8   s    
Ir+   r5   modulesr   c                     [        5       nU  H7  nUR                  nUc  M  [        U5      (       d  M&  UR                  U5        M9     U$ N)r   r   should_have_interface_objectr)   )r9   interface_setsmoduler   s       r(   collect_interface_setsr?   >   sK    "_N$$	+I66$$Y/  r+   interface_namer&   c           	         UR                  5       nUS:X  a  [        [        5      $ US:X  a
  [        5       $ S[        S[        [
        [              4S jnU" U5      =nb  U$ UR                  S5      (       a  UR                  S5      (       ao  [        5       nUSS	 R                  S
5       HD  nUR                  5       nU" U5      =nc  [        SU SU< SU  35      eUR                  U5        MF     U(       a  U$ [        SU< SU  35      e)N*Nobody	candidater   c                     U S:X  a  S1$ U S:X  a  [        [        5      $ U S:X  a  S1$ U S:X  a  S1$ U S:X  a  S1$ U S:X  a  S1$ U S:X  a  S1$ U S:X  a  S1$ U S	:X  a  S	1$ g )
Nr   Workerr   r   r   r   LayoutWorkletPaintWorkletr   )setALL_WORKERS_EXPOSURE)rD   s    r(   parse_single_candidate2parse_exposure_set.<locals>.parse_single_candidateT   s     : +,,))%&&&"##'#$$&"##'#$$&"##	!;r+   ()   ,z$Unknown Exposed attribute candidate z in zUnknown Exposed attribute )striprI   ALL_EXPOSUREr8   r   r   
startswithendswithsplitr!   update)r@   r&   rK   parsed_candidater'   rD   candidate_names          r(   r#   r#   L   s'   !'')M<   u# (3s82D * 3=AAN$$)?)?)D)D!e	&q,2237I&__.N$:>$JJ S":>:J$}N__cdrcst  -. 8 
3M3DDHXY
ZZr+   r   c                 P    U R                   (       a  [        U R                  5      $ g)NT)is_callback_interfacebool	constantsr   s    r(   r<   r<   |   s    &&I''((r+   c                 T    U R                   (       + =(       a    U R                  (       + $ r;   )is_namespacer[   r^   s    r(   $can_use_shared_interface_constructorra      s    %%%Mi.M.M*MMr+   c                    U R                   (       + =(       a    U R                  (       + =(       a    SU R                  ;  =(       az    U R                  (       + =(       ab    U R                  S L =(       aM    U R
                  S L =(       a8    U R                  S L =(       a#    U R                  S L =(       a    U R                  S L $ )NGlobal)	r`   r[   r   has_special_membernamed_property_getterindexed_property_getternamed_property_setternamed_property_deleterindexed_property_setterr^   s    r(   "can_use_shared_interface_prototyperj      s    """ 	6///	6I999	6 ,,,	6 ++t3		6
 --5	6 ++t3	6 ,,4	6 --5
r+   c                 x    SU R                   ;   =(       d%    U R                  S:H  =(       d    U R                  S:H  $ )Nrc   WorkerGlobalScopeEventTarget)r   r"   r^   s    r(   +interface_prototype_has_immutable_prototypern      s:     	I111 	+>>00	+>>]*r+   c                    U R                   R                  S5      nU(       d  g UR                  5       n/ nU H1  nUR                  5       (       d  US:X  a    OUR	                  U5        M3     SR                  U5      n[        UU S3S9$ )NLegacyFactoryFunctionrM    Constructor)r"   r7   )r   r    lstripisspacer$   joinr5   )r   legacy_factory_functionr"   	characterconstructor_names        r(   lookup_legacy_constructorry      s    ';;??@WX"5<<>D,	)s"2I -
 wwt}-.k: r+   outr=   Nc                     U R                  S5        [        UR                  SS9 H'  u  p#U R                  SUR                   SU S35        M)     U R                  S5        g )Nzr#pragma once

#include <AK/Types.h>

namespace Web::Bindings {

enum class InterfaceName : u16 {
    Unknown = 0,
rO   )start    z = z,
z3};

bool is_exposed(InterfaceName, JS::Realm&);

}
)write	enumerater   r"   )rz   r=   indexr   s       r(   "write_intrinsic_definitions_headerr      sc    II	
 &n&?&?qI		D(E7#67 J II	r+   c                    U R                  S5        UR                   HQ  nU R                  SUR                   S35        [        U5      nUc  M2  U R                  SUR                   S35        MS     U R                  S5        [        XR                  5        [        XR                  5        [        U SUR                  5        [        U SUR                  5        [        U SUR                  5        U R                  S5        UR                   H7  nUR                  (       a  [        XUR                  5        M,  [        X5        M9     U R                  S	5        g )
Nad  #include <LibGC/DeferGC.h>
#include <LibJS/Runtime/Object.h>
#include <LibWeb/Bindings/InterfaceObject.h>
#include <LibWeb/Bindings/Intrinsics.h>
#include <LibWeb/Bindings/PrincipalHostDefined.h>
#include <LibWeb/Export.h>
#include <LibWeb/HTML/Window.h>
#include <LibWeb/HTML/DedicatedWorkerGlobalScope.h>
#include <LibWeb/HTML/SharedWorkerGlobalScope.h>
#include <LibWeb/Bindings/.h>
z
namespace Web::Bindings {
windowdedicated_workershared_workeru{  
// An interface, callback interface, namespace, or member construct is exposed in a given realm realm if the following steps return true:
bool is_exposed(InterfaceName name, JS::Realm& realm)
{
    auto const& global_object = realm.global_object();

    // 1. If construct’s exposure set is not *, and realm.[[GlobalObject]] does not implement an interface that is in construct’s exposure set, then return false.
    if (is<HTML::Window>(global_object)) {
       if (!is_window_exposed(name))
           return false;
    } else if (is<HTML::DedicatedWorkerGlobalScope>(global_object)) {
       if (!is_dedicated_worker_exposed(name))
           return false;
    } else if (is<HTML::SharedWorkerGlobalScope>(global_object)) {
        if (!is_shared_worker_exposed(name))
            return false;
    } else {
        TODO(); // FIXME: ServiceWorkerGlobalScope and WorkletGlobalScope.
    }

    // 2. If realm’s settings object is not a secure context, and construct is conditionally exposed on
    //    [SecureContext], then return false.
    if (is_secure_context_interface(name) && HTML::is_non_secure_context(principal_host_defined_environment_settings_object(realm)))
        return false;

    // AD-HOC: Do not expose experimental interfaces unless instructed to do so.
    if (!HTML::UniversalGlobalScopeMixin::expose_experimental_interfaces() && is_experimental_interface(name))
        return false;

    // FIXME: 3. If realm’s settings object’s cross-origin isolated capability is false, and construct is
    //           conditionally exposed on [CrossOriginIsolated], then return false.

    // 4. Return true.
    return true;
}

}
)r~   r   implemented_namery   r7   write_secure_context_switchwrite_experimental_switchwrite_global_exposed_switchr   r   r   r`   write_namespace_creationwrite_interface_creation)rz   r=   r   legacy_constructors       r(   *write_intrinsic_definitions_implementationr      s2   II		 $..			.y/I/I.J%PQ6yA)II23E3W3W2XX]^_ / II	  %>%>?c#<#<=X~/L/LM%79`9`a_n6Z6Z[II$	&P $..	!!$S^5N5NO$S4	 / II	r+   
interfacesc                     U R                  S5        U H4  nSUR                  ;  a  M  U R                  SUR                   S35        M6     U R                  S5        g )Nz\static constexpr bool is_secure_context_interface(InterfaceName name)
{
    switch (name) {
SecureContext    case InterfaceName:::
@        return true;
    default:
        return false;
    }
}
r~   r   r"   rz   r   r   s      r(   r   r     s^    II	  	)"?"??		,Y^^,<C@A  
 II	r+   c                     U R                  S5        U H4  nSUR                  ;  a  M  U R                  SUR                   S35        M6     U R                  S5        g )NzZstatic constexpr bool is_experimental_interface(InterfaceName name)
{
    switch (name) {
Experimentalr   r   r   r   r   s      r(   r   r   5  s^    II	  	!>!>>		,Y^^,<C@A  
 II	r+   global_namec                     U R                  SU S35        U H"  nU R                  SUR                   S35        M$     U R                  S5        g )Nzstatic constexpr bool is_z3_exposed(InterfaceName name)
{
    switch (name) {
r   r   r   )r~   r"   )rz   r   r   r   s       r(   r   r   K  sY    II%k] 3 	  			,Y^^,<C@A   II	r+   c                    U R                  SUR                   SUR                   SUR                   S35        U Ht  nUR                  R	                  S5      UR                  :w  a  M.  U R                  SUR                   SUR
                   SUR                   S	UR                   S
3	5        Mv     U R                  S5        g )Nz1template<>
void Intrinsics::create_web_namespace<z?>(JS::Realm& realm)
{
    auto namespace_object = realm.create<z >(realm);
    m_namespaces.set("z"_fly_string, namespace_object);

    [[maybe_unused]] static constexpr u8 attr = JS::Attribute::Writable | JS::Attribute::Configurable;
LegacyNamespacez1    namespace_object->define_intrinsic_accessor("zb"_utf16_fly_string, attr, [](auto& realm) -> JS::Value { return &Bindings::ensure_web_constructor<
>(realm, "."_fly_string); });
r   )r~   namespace_classr"   r   r    prototype_class)rz   r   r   owned_interfaces       r(   r   r   `  s   II''0'@'@&A B**3*C*C)D E ~~& '			 &..223DEW		A/BVBVAW  X{  |K  |[  |[  {\  \f  gp  gu  gu  fv  vw  xG  xL  xL  wM M 	
	 & II	r+   c                    UR                   (       aT  U R                  SUR                   SUR                   SUR                   SUR
                   SUR                   S35        g [        U5      (       GaC  U R                  SUR                   S35        SnSnUR                  (       a:  S	UR                   S
UR                   S3nSUR                   S
UR                   S3nU R                  SUR                   SUR                   SU SU SUR
                   SUR                   SUR                   SUR
                   S[        [        U5      5      R                  5        S35        [        U5      nUb,  U R                  SUR
                   SUR                   S35        U R                  S5        g [        U5      (       GaL  U R                  SUR                   S35        SnUR                  (       a  SUR                   S
UR                   S3nU R                  SUR                   SUR                   SU SUR
                   SUR
                   S35        [        U5      (       a,  U R                  SUR                   SUR                   S35        U R                  SUR                   S UR                   S!35        [        U5      nUb,  U R                  SUR
                   SUR                   S35        U R                  S5        g U R                  SUR                   S"35        [        U5      (       a,  U R                  SUR                   SUR                   S35        U R                  SUR                   S UR                   S#UR
                   SUR                   S$3	5        [        U5      nUb,  U R                  SUR
                   SUR                   S35        U R                  S5        g )%NzItemplate<>
WEB_API void Intrinsics::create_web_prototype_and_constructor<z_>(JS::Realm& realm)
{
    static constexpr InterfaceObjectMetadata metadata {
        .name = "z!"sv,
        .namespaced_name = "z("sv,
        .initialize_constructor = &z/::initialize,
        .initialize_prototype = &zR::initialize,
    };
    create_web_prototype_and_constructor(realm, metadata);
}
z>(JS::Realm& realm)
{
nullptrzQ[](JS::Realm& realm) -> JS::Object& { return Web::Bindings::ensure_web_prototype<zPrototype>(realm, "z"_fly_string); }z[[](JS::Realm& realm) -> JS::NativeFunction& { return Web::Bindings::ensure_web_constructor<zI    static constexpr InterfaceObjectMetadata metadata {
        .name = "z("sv,
        .ensure_parent_prototype = z',
        .ensure_parent_constructor = z%,
        .initialize_constructor = &z8::initialize,
        .define_unforgeable_attributes = &z7::define_unforgeable_attributes,
        .construct = &z0::construct,
        .has_immutable_prototype = zD,
    };
    create_web_prototype_and_constructor(realm, metadata);
z+    auto legacy_constructor = realm.create<z">(realm);
    m_constructors.set("z)"_fly_string, legacy_constructor.ptr());
r   z*"sv,
        .ensure_parent_constructor = z$::initialize,
        .construct = &z::construct,
    };

z0    auto named_properties_object = realm.create<z*Properties>(realm);
    m_prototypes.set("z3Properties"_fly_string, named_properties_object);

z"    auto prototype = realm.create<z >(realm);
    m_prototypes.set("zS"_fly_string, prototype);

    create_web_constructor(realm, metadata, prototype);
z2>(JS::Realm& realm)
{
    auto& vm = realm.vm();

z?"_fly_string, prototype);

    auto constructor = realm.create<z"_fly_string, constructor);

    prototype->define_direct_property(vm.names.constructor, constructor.ptr(), JS::Attribute::Writable | JS::Attribute::Configurable);
)r[   r~   r   r"   namespaced_namer7   rj   parent_namer8   rn   lowerry   ra   r	   )rz   r   ensure_parent_prototypeensure_parent_constructorr   s        r(   r   r   {  sz   &&		??H?X?X>Y Z ..! "&667 8$$-$?$?#@ A""+";";!< =	
 	))44		??H?X?X>Y Z	
 #,$-!  *|  ~G  ~S  ~S  }T  Tg  hq  h}  h}  g~  ~O  'R# -I  JS  J_  J_  I`  `s  t}  tI  tI  sJ  J[  )^%		..! "&667 8$$;#< =&&?%@ A$$-$?$?#@ A""+";";!< =++4+D+D*E F 223 4$$'(ST](^$_$e$e$g#h i	
  7yA)II?@R@d@d?e f+001 2 				
 	+I66		??H?X?X>Y Z	
 %.!   -I  JS  J_  J_  I`  `s  t}  tI  tI  sJ  J[  )^%		..! "&667 8&&?%@ A$$-$?$?#@ A 223 4
	
 /y99IIDY^^DT U ~~& ' 			293L3L2M N 001 2	
 7yA)II?@R@d@d?e f+001 2 				
 	II??H?X?X>Y Z	 +955		@@P Q ~~& '	
 II.y/H/H.I J 001 2%%.%@%@$A B"223 4			 39=%		;<N<`<`;a b+001 2	
 II	r+   
class_namec                 D    [        U5      nU R                  SU S35        g )NzN#pragma once

#include <LibJS/Forward.h>

namespace Web::Bindings {

void add_z%_exposed_interfaces(JS::Object&);

}
)r
   r~   )rz   r   
snake_names      r(   write_exposed_interface_headerr     s.    )*5JII
  		r+   exposed_interfacesc                    [        U5      nU R                  SU S35        U H"  nU R                  SUR                   S35        M$     U R                  SU S35        U Hc  nUR                  (       a  [	        X5        M!  SUR
                  ;   a  M3  SUR
                  ;   a  ME  [        U5      (       d  MW  [        XU5        Me     U R                  S	5        g )
Nzd#include <LibJS/Runtime/Object.h>
#include <LibWeb/Bindings/Intrinsics.h>
#include <LibWeb/Bindings/zsExposedInterfaces.h>
#include <LibWeb/HTML/Scripting/Environments.h>
#include <LibWeb/HTML/UniversalGlobalScope.h>
r   r   z%
namespace Web::Bindings {

void add_an  _exposed_interfaces(JS::Object& global)
{
    static constexpr u8 attr = JS::Attribute::Writable | JS::Attribute::Configurable;

    [[maybe_unused]] bool is_secure_context = HTML::is_secure_context(HTML::relevant_settings_object(global));
    [[maybe_unused]] bool expose_experimental_interfaces = HTML::UniversalGlobalScopeMixin::expose_experimental_interfaces();
r   LegacyNoInterfaceObjectz}

}
)r
   r~   r   r`   write_namespace_global_accessorr   r<   write_interface_global_accessor)rz   r   r   r   r   s        r(   &write_exposed_interface_implementationr   )  s    )*5JII%, '	 (			.y/I/I.J%PQ ( II
  		 (	!!+C;	 = ==$	(E(EE+I66'C (  II	r+   c                 f  ^ ^^ SmS[         S[         SS 4UUU 4S jjnSTR                  ;   a  T R                  S5        TS-  mSTR                  ;   a  T R                  T S	35        TS-  mU" TR                  TR                  5        US
:X  a  TR                  R	                  S5      nU(       a}  UR                  S5      (       aH  UR                  S5      (       a2  USS R                  S5       Vs/ s H  oUR                  5       PM     nnOU/nU H  nU" UTR                  5        M     [        T5      nUb  U" UR                  UR                  5        STR                  ;   a  TS S mT R                  T S35        STR                  ;   a  TS S mT R                  T S35        g g s  snf )Nr}   r"   rx   r   c           
      T   > TR                  T SU  STR                   SU S35        g )Nz"global.define_intrinsic_accessor("zX"_utf16_fly_string, attr, [](auto& realm) -> JS::Value { return &ensure_web_constructor<r   r   )r~   r   )r"   rx   indentationr   rz   s     r(   write_constructor_accessorCwrite_interface_global_accessor.<locals>.write_constructor_accessor_  s`    		m=dV  D]  ^g  ^w  ^w  ]x  xB  CS  BT  Ti  j	
r+   r   z    if (is_secure_context) {
r   z&if (expose_experimental_interfaces) {
r   LegacyWindowAliasrM   rN   rO   rP   rQ   r   )r8   r   r~   r   r    rT   rU   rV   rR   ry   r"   )	rz   r   r   r   legacy_window_aliasaliasaliasesr   r   s	   ` `     @r(   r   r   \  s   K
 
 
 
 

 )777			
 	v666		  	
 	vy88):S:STX';;??@ST"--c227J7S7STW7X7X6I!B6O6U6UVY6Z[6ZU;;=6Z[./ *5)2K2KL ! 39=%"#5#:#:<N<S<ST666!#2&		  	

 )777!#2&		  	
 8% \s   4F.c           	      v    U R                  SUR                   SUR                   SUR                   S35        g )Nz&    global.define_intrinsic_accessor("zV"_utf16_fly_string, attr, [](auto& realm) -> JS::Value { return &ensure_web_namespace<r   r   )r~   r"   r   )rz   r   s     r(   r   r     sk    II29>>2B  CZ  [d  [t  [t  Zu  u  @I  @N  @N  O O 	r+   )'dataclassesr   r   typingr   r   r   r   7Generators.libweb_bindings.named_and_indexed_propertiesr	   Utils.utilsr
   Utils.webidl_parserr   r   rJ   rS   r   r5   r?   r8   r#   r\   r<   ra   rj   rn   ry   r   r   r   r   r   r   r   r   r   r   r   r,   r+   r(   <module>r      s}  
 "      g 0 ) &  $'  9 9 92   
DL ] -[s -[3 -[3s8 -[`I $ NI N$ N)  9   x@Q7R &F M VZ 4RF RM R^b RjV i T ,6 tI 4 ,V # 4PY? _c *& Y DQZO `d 6[& [Y [4 [| C D  0 0C 0]abk]l 0qu 0f3
 3
S 3
Y 3
[_ 3
l I $ r+   