mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-22 15:40:19 +00:00
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:
parent
e06762f312
commit
41ae0c0216
Notes:
sideshowbarker
2024-07-18 03:25:55 +09:00
Author: https://github.com/Lubrsi Commit: https://github.com/SerenityOS/serenity/commit/41ae0c02169 Pull-request: https://github.com/SerenityOS/serenity/pull/10219
4 changed files with 1014 additions and 5 deletions
File diff suppressed because it is too large
Load diff
53
Userland/Libraries/LibWeb/Bindings/IDLAbstractOperations.cpp
Normal file
53
Userland/Libraries/LibWeb/Bindings/IDLAbstractOperations.cpp
Normal 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;
|
||||
}
|
||||
|
||||
}
|
15
Userland/Libraries/LibWeb/Bindings/IDLAbstractOperations.h
Normal file
15
Userland/Libraries/LibWeb/Bindings/IDLAbstractOperations.h
Normal 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&);
|
||||
|
||||
}
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue