LibWeb: Add support for IDL legacy platform objects

A legacy platform object is a non-global platform object that
implements a special operation. A special operation is a getter, setter
and/or deleter. This is particularly used for old collection types,
such as HTMLCollection, NodeList, etc.

This will be used to make these spec-compliant and remove their custom
wrappers. Additionally, it will be used to implement collections that
we don't have yet, such as DOMStringMap.
This commit is contained in:
Luke Wilde 2021-09-26 14:53:28 +01:00 committed by Andreas Kling
parent e06762f312
commit 41ae0c0216
Notes: sideshowbarker 2024-07-18 03:25:55 +09:00
4 changed files with 1014 additions and 5 deletions

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,53 @@
/*
* Copyright (c) 2021, Luke Wilde <lukew@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <AK/NumericLimits.h>
#include <LibJS/Runtime/AbstractOperations.h>
#include <LibJS/Runtime/PropertyName.h>
#include <LibWeb/Bindings/IDLAbstractOperations.h>
namespace Web::Bindings::IDL {
// https://heycam.github.io/webidl/#is-an-array-index
bool is_an_array_index(JS::GlobalObject& global_object, JS::PropertyName const& property_name)
{
// 1. If Type(P) is not String, then return false.
if (!property_name.is_number())
return false;
// 2. Let index be ! CanonicalNumericIndexString(P).
auto index = JS::canonical_numeric_index_string(global_object, property_name);
// 3. If index is undefined, then return false.
if (index.is_undefined())
return false;
// 4. If IsInteger(index) is false, then return false.
// NOTE: IsInteger is the old name of IsIntegralNumber.
if (!index.is_integral_number())
return false;
// 5. If index is 0, then return false.
if (index.is_negative_zero())
return false;
// FIXME: I'm not sure if this is correct.
auto index_as_double = index.as_double();
// 6. If index < 0, then return false.
if (index_as_double < 0)
return false;
// 7. If index ≥ 2 ** 32 1, then return false.
// Note: 2 ** 32 1 is the maximum array length allowed by ECMAScript.
if (index_as_double >= NumericLimits<u32>::max())
return false;
// 8. Return true.
return true;
}
}

View file

@ -0,0 +1,15 @@
/*
* Copyright (c) 2021, Luke Wilde <lukew@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <LibJS/Forward.h>
namespace Web::Bindings::IDL {
bool is_an_array_index(JS::GlobalObject&, JS::PropertyName const&);
}

View file

@ -4,6 +4,7 @@ set(SOURCES
Bindings/EventTargetWrapperFactory.cpp
Bindings/EventWrapperFactory.cpp
Bindings/HTMLCollectionWrapperCustom.cpp
Bindings/IDLAbstractOperations.cpp
Bindings/ImageConstructor.cpp
Bindings/LocationObject.cpp
Bindings/MainThreadVM.cpp