summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2020-06-21 15:14:02 +0200
committerAndreas Kling <kling@serenityos.org>2020-06-21 15:15:52 +0200
commitaf51dc105a1ab91a01cb8e343980e96167350f5b (patch)
treea1b524d14b566e9cb294be29a08314ccef9c2f51
parent1914f52371bbd846bf3d154493e3fb993a202a6e (diff)
downloadserenity-af51dc105a1ab91a01cb8e343980e96167350f5b.zip
LibJS+LibWeb: Add JS::Object::inherits(class_name)
To allow implementing the DOM class hierarchy in JS bindings, this patch adds an inherits() function that can be used to ask an Object if it inherits from a specific C++ class (by name). The necessary overrides are baked into each Object subclass by the new JS_OBJECT macro, which works similarly to C_OBJECT in LibCore. Thanks to @Dexesttp for suggesting this approach. :^)
-rw-r--r--Libraries/LibJS/Runtime/Array.h3
-rw-r--r--Libraries/LibJS/Runtime/ArrayConstructor.h3
-rw-r--r--Libraries/LibJS/Runtime/ArrayPrototype.h4
-rw-r--r--Libraries/LibJS/Runtime/BigIntConstructor.h3
-rw-r--r--Libraries/LibJS/Runtime/BigIntObject.h3
-rw-r--r--Libraries/LibJS/Runtime/BigIntPrototype.h4
-rw-r--r--Libraries/LibJS/Runtime/BooleanConstructor.h3
-rw-r--r--Libraries/LibJS/Runtime/BooleanObject.h3
-rw-r--r--Libraries/LibJS/Runtime/BooleanPrototype.h4
-rw-r--r--Libraries/LibJS/Runtime/BoundFunction.h3
-rw-r--r--Libraries/LibJS/Runtime/ConsoleObject.h4
-rw-r--r--Libraries/LibJS/Runtime/Date.h3
-rw-r--r--Libraries/LibJS/Runtime/DateConstructor.h3
-rw-r--r--Libraries/LibJS/Runtime/DatePrototype.h3
-rw-r--r--Libraries/LibJS/Runtime/Error.cpp1
-rw-r--r--Libraries/LibJS/Runtime/Error.h8
-rw-r--r--Libraries/LibJS/Runtime/ErrorConstructor.h6
-rw-r--r--Libraries/LibJS/Runtime/ErrorPrototype.cpp3
-rw-r--r--Libraries/LibJS/Runtime/ErrorPrototype.h9
-rw-r--r--Libraries/LibJS/Runtime/Function.h3
-rw-r--r--Libraries/LibJS/Runtime/FunctionConstructor.h3
-rw-r--r--Libraries/LibJS/Runtime/FunctionPrototype.h4
-rw-r--r--Libraries/LibJS/Runtime/GlobalObject.h4
-rw-r--r--Libraries/LibJS/Runtime/JSONObject.h4
-rw-r--r--Libraries/LibJS/Runtime/MathObject.h4
-rw-r--r--Libraries/LibJS/Runtime/NativeFunction.h3
-rw-r--r--Libraries/LibJS/Runtime/NativeProperty.h3
-rw-r--r--Libraries/LibJS/Runtime/NumberConstructor.h3
-rw-r--r--Libraries/LibJS/Runtime/NumberObject.h4
-rw-r--r--Libraries/LibJS/Runtime/NumberPrototype.h5
-rw-r--r--Libraries/LibJS/Runtime/Object.h10
-rw-r--r--Libraries/LibJS/Runtime/ObjectConstructor.h3
-rw-r--r--Libraries/LibJS/Runtime/ObjectPrototype.h4
-rw-r--r--Libraries/LibJS/Runtime/ProxyConstructor.h3
-rw-r--r--Libraries/LibJS/Runtime/ProxyObject.h3
-rw-r--r--Libraries/LibJS/Runtime/ProxyPrototype.h5
-rw-r--r--Libraries/LibJS/Runtime/ReflectObject.h4
-rw-r--r--Libraries/LibJS/Runtime/RegExpConstructor.h3
-rw-r--r--Libraries/LibJS/Runtime/RegExpObject.h3
-rw-r--r--Libraries/LibJS/Runtime/RegExpPrototype.h5
-rw-r--r--Libraries/LibJS/Runtime/ScriptFunction.h3
-rw-r--r--Libraries/LibJS/Runtime/StringConstructor.h3
-rw-r--r--Libraries/LibJS/Runtime/StringObject.h3
-rw-r--r--Libraries/LibJS/Runtime/StringPrototype.h4
-rw-r--r--Libraries/LibJS/Runtime/SymbolConstructor.h3
-rw-r--r--Libraries/LibJS/Runtime/SymbolObject.h3
-rw-r--r--Libraries/LibJS/Runtime/SymbolPrototype.h4
-rw-r--r--Libraries/LibJS/Runtime/Uint8ClampedArray.h4
-rw-r--r--Libraries/LibWeb/Bindings/CanvasRenderingContext2DWrapper.h3
-rw-r--r--Libraries/LibWeb/Bindings/EventListenerWrapper.h4
-rw-r--r--Libraries/LibWeb/Bindings/EventWrapper.h4
-rw-r--r--Libraries/LibWeb/Bindings/ImageDataWrapper.h4
-rw-r--r--Libraries/LibWeb/Bindings/LocationObject.h4
-rw-r--r--Libraries/LibWeb/Bindings/NavigatorObject.h4
-rw-r--r--Libraries/LibWeb/Bindings/Wrapper.h10
-rw-r--r--Libraries/LibWeb/Bindings/XMLHttpRequestPrototype.h4
-rw-r--r--Libraries/LibWeb/CodeGenerators/WrapperGenerator.cpp8
57 files changed, 122 insertions, 106 deletions
diff --git a/Libraries/LibJS/Runtime/Array.h b/Libraries/LibJS/Runtime/Array.h
index 3abf4262ae..20a9ed30d9 100644
--- a/Libraries/LibJS/Runtime/Array.h
+++ b/Libraries/LibJS/Runtime/Array.h
@@ -31,6 +31,8 @@
namespace JS {
class Array final : public Object {
+ JS_OBJECT(Array, Object);
+
public:
static Array* create(GlobalObject&);
@@ -40,7 +42,6 @@ public:
static Array* typed_this(Interpreter&, GlobalObject&);
private:
- virtual const char* class_name() const override { return "Array"; }
virtual bool is_array() const override { return true; }
JS_DECLARE_NATIVE_GETTER(length_getter);
diff --git a/Libraries/LibJS/Runtime/ArrayConstructor.h b/Libraries/LibJS/Runtime/ArrayConstructor.h
index 182b2a3e2a..dd8df2db03 100644
--- a/Libraries/LibJS/Runtime/ArrayConstructor.h
+++ b/Libraries/LibJS/Runtime/ArrayConstructor.h
@@ -31,6 +31,8 @@
namespace JS {
class ArrayConstructor final : public NativeFunction {
+ JS_OBJECT(ArrayConstructor, NativeFunction);
+
public:
explicit ArrayConstructor(GlobalObject&);
virtual void initialize(Interpreter&, GlobalObject&) override;
@@ -41,7 +43,6 @@ public:
private:
virtual bool has_constructor() const override { return true; }
- virtual const char* class_name() const override { return "ArrayConstructor"; }
JS_DECLARE_NATIVE_FUNCTION(is_array);
JS_DECLARE_NATIVE_FUNCTION(of);
diff --git a/Libraries/LibJS/Runtime/ArrayPrototype.h b/Libraries/LibJS/Runtime/ArrayPrototype.h
index 2a1969ab08..989603dafa 100644
--- a/Libraries/LibJS/Runtime/ArrayPrototype.h
+++ b/Libraries/LibJS/Runtime/ArrayPrototype.h
@@ -32,14 +32,14 @@
namespace JS {
class ArrayPrototype final : public Object {
+ JS_OBJECT(ArrayPrototype, Object);
+
public:
ArrayPrototype(GlobalObject&);
virtual void initialize(Interpreter&, GlobalObject&) override;
virtual ~ArrayPrototype() override;
private:
- virtual const char* class_name() const override { return "ArrayPrototype"; }
-
JS_DECLARE_NATIVE_FUNCTION(filter);
JS_DECLARE_NATIVE_FUNCTION(for_each);
JS_DECLARE_NATIVE_FUNCTION(map);
diff --git a/Libraries/LibJS/Runtime/BigIntConstructor.h b/Libraries/LibJS/Runtime/BigIntConstructor.h
index 4a9adcf6a1..25a81625e5 100644
--- a/Libraries/LibJS/Runtime/BigIntConstructor.h
+++ b/Libraries/LibJS/Runtime/BigIntConstructor.h
@@ -31,6 +31,8 @@
namespace JS {
class BigIntConstructor final : public NativeFunction {
+ JS_OBJECT(BigIntConstructor, NativeFunction);
+
public:
explicit BigIntConstructor(GlobalObject&);
virtual void initialize(Interpreter&, GlobalObject&) override;
@@ -41,7 +43,6 @@ public:
private:
virtual bool has_constructor() const override { return true; }
- virtual const char* class_name() const override { return "BigIntConstructor"; }
JS_DECLARE_NATIVE_FUNCTION(as_int_n);
JS_DECLARE_NATIVE_FUNCTION(as_uint_n);
diff --git a/Libraries/LibJS/Runtime/BigIntObject.h b/Libraries/LibJS/Runtime/BigIntObject.h
index 5c5a273400..05a3e9db6b 100644
--- a/Libraries/LibJS/Runtime/BigIntObject.h
+++ b/Libraries/LibJS/Runtime/BigIntObject.h
@@ -32,6 +32,8 @@
namespace JS {
class BigIntObject final : public Object {
+ JS_OBJECT(BigIntObject, Object);
+
public:
static BigIntObject* create(GlobalObject&, BigInt&);
@@ -46,7 +48,6 @@ public:
private:
virtual void visit_children(Visitor&) override;
- virtual const char* class_name() const override { return "BigIntObject"; }
virtual bool is_bigint_object() const override { return true; }
BigInt& m_bigint;
diff --git a/Libraries/LibJS/Runtime/BigIntPrototype.h b/Libraries/LibJS/Runtime/BigIntPrototype.h
index b1aa29c81f..28e838fee3 100644
--- a/Libraries/LibJS/Runtime/BigIntPrototype.h
+++ b/Libraries/LibJS/Runtime/BigIntPrototype.h
@@ -31,14 +31,14 @@
namespace JS {
class BigIntPrototype final : public Object {
+ JS_OBJECT(BigIntPrototype, Object);
+
public:
explicit BigIntPrototype(GlobalObject&);
virtual void initialize(Interpreter&, GlobalObject&) override;
virtual ~BigIntPrototype() override;
private:
- virtual const char* class_name() const override { return "BigIntPrototype"; }
-
JS_DECLARE_NATIVE_FUNCTION(to_string);
JS_DECLARE_NATIVE_FUNCTION(to_locale_string);
JS_DECLARE_NATIVE_FUNCTION(value_of);
diff --git a/Libraries/LibJS/Runtime/BooleanConstructor.h b/Libraries/LibJS/Runtime/BooleanConstructor.h
index 22b559cd2b..1755123157 100644
--- a/Libraries/LibJS/Runtime/BooleanConstructor.h
+++ b/Libraries/LibJS/Runtime/BooleanConstructor.h
@@ -31,6 +31,8 @@
namespace JS {
class BooleanConstructor final : public NativeFunction {
+ JS_OBJECT(BooleanConstructor, NativeFunction);
+
public:
explicit BooleanConstructor(GlobalObject&);
virtual void initialize(Interpreter&, GlobalObject&) override;
@@ -41,7 +43,6 @@ public:
private:
virtual bool has_constructor() const override { return true; }
- virtual const char* class_name() const override { return "BooleanConstructor"; }
};
}
diff --git a/Libraries/LibJS/Runtime/BooleanObject.h b/Libraries/LibJS/Runtime/BooleanObject.h
index 4ecaaec3a5..eade92c275 100644
--- a/Libraries/LibJS/Runtime/BooleanObject.h
+++ b/Libraries/LibJS/Runtime/BooleanObject.h
@@ -30,6 +30,8 @@
namespace JS {
class BooleanObject : public Object {
+ JS_OBJECT(BooleanObject, Object);
+
public:
static BooleanObject* create(GlobalObject&, bool);
@@ -42,7 +44,6 @@ public:
}
private:
- virtual const char* class_name() const override { return "BooleanObject"; }
virtual bool is_boolean_object() const override { return true; }
bool m_value { false };
};
diff --git a/Libraries/LibJS/Runtime/BooleanPrototype.h b/Libraries/LibJS/Runtime/BooleanPrototype.h
index 1995b51129..03367971ed 100644
--- a/Libraries/LibJS/Runtime/BooleanPrototype.h
+++ b/Libraries/LibJS/Runtime/BooleanPrototype.h
@@ -31,14 +31,14 @@
namespace JS {
class BooleanPrototype final : public BooleanObject {
+ JS_OBJECT(BooleanPrototype, BooleanObject);
+
public:
explicit BooleanPrototype(GlobalObject&);
virtual void initialize(Interpreter&, GlobalObject&) override;
virtual ~BooleanPrototype() override;
private:
- virtual const char* class_name() const override { return "BooleanPrototype"; }
-
JS_DECLARE_NATIVE_FUNCTION(to_string);
JS_DECLARE_NATIVE_FUNCTION(value_of);
};
diff --git a/Libraries/LibJS/Runtime/BoundFunction.h b/Libraries/LibJS/Runtime/BoundFunction.h
index 67252ff360..1ee964e566 100644
--- a/Libraries/LibJS/Runtime/BoundFunction.h
+++ b/Libraries/LibJS/Runtime/BoundFunction.h
@@ -31,6 +31,8 @@
namespace JS {
class BoundFunction final : public Function {
+ JS_OBJECT(BoundFunction, Function);
+
public:
BoundFunction(GlobalObject&, Function& target_function, Value bound_this, Vector<Value> arguments, i32 length, Object* constructor_prototype);
virtual void initialize(Interpreter&, GlobalObject&) override;
@@ -56,7 +58,6 @@ public:
private:
virtual bool is_bound_function() const override { return true; }
- virtual const char* class_name() const override { return "BoundFunction"; }
Function* m_target_function = nullptr;
Object* m_constructor_prototype = nullptr;
diff --git a/Libraries/LibJS/Runtime/ConsoleObject.h b/Libraries/LibJS/Runtime/ConsoleObject.h
index 77a764bd6a..83a2b6bcd2 100644
--- a/Libraries/LibJS/Runtime/ConsoleObject.h
+++ b/Libraries/LibJS/Runtime/ConsoleObject.h
@@ -31,14 +31,14 @@
namespace JS {
class ConsoleObject final : public Object {
+ JS_OBJECT(ConsoleObject, Object);
+
public:
explicit ConsoleObject(GlobalObject&);
virtual void initialize(Interpreter&, GlobalObject&) override;
virtual ~ConsoleObject() override;
private:
- virtual const char* class_name() const override { return "ConsoleObject"; }
-
JS_DECLARE_NATIVE_FUNCTION(log);
JS_DECLARE_NATIVE_FUNCTION(debug);
JS_DECLARE_NATIVE_FUNCTION(info);
diff --git a/Libraries/LibJS/Runtime/Date.h b/Libraries/LibJS/Runtime/Date.h
index 7770f438f8..ec816b1a01 100644
--- a/Libraries/LibJS/Runtime/Date.h
+++ b/Libraries/LibJS/Runtime/Date.h
@@ -32,6 +32,8 @@
namespace JS {
class Date final : public Object {
+ JS_OBJECT(Date, Object);
+
public:
static Date* create(GlobalObject&, Core::DateTime, u16 milliseconds);
@@ -57,7 +59,6 @@ public:
private:
virtual bool is_date() const final { return true; }
- virtual const char* class_name() const override { return "Date"; }
Core::DateTime m_datetime;
u16 m_milliseconds;
diff --git a/Libraries/LibJS/Runtime/DateConstructor.h b/Libraries/LibJS/Runtime/DateConstructor.h
index 68b8dd6305..fcb2b022df 100644
--- a/Libraries/LibJS/Runtime/DateConstructor.h
+++ b/Libraries/LibJS/Runtime/DateConstructor.h
@@ -31,6 +31,8 @@
namespace JS {
class DateConstructor final : public NativeFunction {
+ JS_OBJECT(DateConstructor, NativeFunction);
+
public:
explicit DateConstructor(GlobalObject&);
virtual void initialize(Interpreter&, GlobalObject&) override;
@@ -41,7 +43,6 @@ public:
private:
virtual bool has_constructor() const override { return true; }
- virtual const char* class_name() const override { return "DateConstructor"; }
JS_DECLARE_NATIVE_FUNCTION(now);
};
diff --git a/Libraries/LibJS/Runtime/DatePrototype.h b/Libraries/LibJS/Runtime/DatePrototype.h
index 2e10ebb00a..40c6667d11 100644
--- a/Libraries/LibJS/Runtime/DatePrototype.h
+++ b/Libraries/LibJS/Runtime/DatePrototype.h
@@ -31,14 +31,13 @@
namespace JS {
class DatePrototype final : public Object {
+ JS_OBJECT(DatePrototype, Object);
public:
explicit DatePrototype(GlobalObject&);
virtual void initialize(Interpreter&, GlobalObject&) override;
virtual ~DatePrototype() override;
private:
- virtual const char* class_name() const override { return "DatePrototype"; }
-
JS_DECLARE_NATIVE_FUNCTION(get_date);
JS_DECLARE_NATIVE_FUNCTION(get_day);
JS_DECLARE_NATIVE_FUNCTION(get_full_year);
diff --git a/Libraries/LibJS/Runtime/Error.cpp b/Libraries/LibJS/Runtime/Error.cpp
index 3056fee031..df2a79eec6 100644
--- a/Libraries/LibJS/Runtime/Error.cpp
+++ b/Libraries/LibJS/Runtime/Error.cpp
@@ -57,7 +57,6 @@ Error::~Error()
{ \
} \
ClassName::~ClassName() { } \
- const char* ClassName::class_name() const { return #ClassName; }
JS_ENUMERATE_ERROR_SUBCLASSES
#undef __JS_ENUMERATE
diff --git a/Libraries/LibJS/Runtime/Error.h b/Libraries/LibJS/Runtime/Error.h
index 785541ac0a..7ec5c67ac2 100644
--- a/Libraries/LibJS/Runtime/Error.h
+++ b/Libraries/LibJS/Runtime/Error.h
@@ -32,6 +32,8 @@
namespace JS {
class Error : public Object {
+ JS_OBJECT(Error, Object);
+
public:
static Error* create(GlobalObject&, const FlyString& name, const String& message);
@@ -45,7 +47,6 @@ public:
private:
virtual bool is_error() const final { return true; }
- virtual const char* class_name() const override { return "Error"; }
FlyString m_name;
String m_message;
@@ -53,14 +54,13 @@ private:
#define DECLARE_ERROR_SUBCLASS(ClassName, snake_name, PrototypeName, ConstructorName) \
class ClassName final : public Error { \
+ JS_OBJECT(ClassName, Error); \
+ \
public: \
static ClassName* create(GlobalObject&, const String& message); \
\
ClassName(const String& message, Object& prototype); \
virtual ~ClassName() override; \
- \
- private: \
- virtual const char* class_name() const override; \
};
#define __JS_ENUMERATE(ClassName, snake_name, PrototypeName, ConstructorName) \
diff --git a/Libraries/LibJS/Runtime/ErrorConstructor.h b/Libraries/LibJS/Runtime/ErrorConstructor.h
index fcc610b08d..2208020a61 100644
--- a/Libraries/LibJS/Runtime/ErrorConstructor.h
+++ b/Libraries/LibJS/Runtime/ErrorConstructor.h
@@ -32,6 +32,8 @@
namespace JS {
class ErrorConstructor final : public NativeFunction {
+ JS_OBJECT(ErrorConstructor, NativeFunction);
+
public:
explicit ErrorConstructor(GlobalObject&);
virtual void initialize(Interpreter&, GlobalObject&) override;
@@ -42,11 +44,12 @@ public:
private:
virtual bool has_constructor() const override { return true; }
- virtual const char* class_name() const override { return "ErrorConstructor"; }
};
#define DECLARE_ERROR_SUBCLASS_CONSTRUCTOR(ClassName, snake_name, PrototypeName, ConstructorName) \
class ConstructorName final : public NativeFunction { \
+ JS_OBJECT(ConstructorName, NativeFunction); \
+ \
public: \
explicit ConstructorName(GlobalObject&); \
virtual void initialize(Interpreter&, GlobalObject&) override; \
@@ -56,7 +59,6 @@ private:
\
private: \
virtual bool has_constructor() const override { return true; } \
- virtual const char* class_name() const override { return #ClassName "Constructor"; } \
};
#define __JS_ENUMERATE(ClassName, snake_name, PrototypeName, ConstructorName) \
diff --git a/Libraries/LibJS/Runtime/ErrorPrototype.cpp b/Libraries/LibJS/Runtime/ErrorPrototype.cpp
index 64127c9ab8..1c597b8762 100644
--- a/Libraries/LibJS/Runtime/ErrorPrototype.cpp
+++ b/Libraries/LibJS/Runtime/ErrorPrototype.cpp
@@ -126,8 +126,7 @@ JS_DEFINE_NATIVE_FUNCTION(ErrorPrototype::to_string)
: Object(global_object.error_prototype()) \
{ \
} \
- PrototypeName::~PrototypeName() { } \
- const char* PrototypeName::class_name() const { return #PrototypeName; }
+ PrototypeName::~PrototypeName() { }
JS_ENUMERATE_ERROR_SUBCLASSES
#undef __JS_ENUMERATE
diff --git a/Libraries/LibJS/Runtime/ErrorPrototype.h b/Libraries/LibJS/Runtime/ErrorPrototype.h
index a70fe4f9df..8dc6b88cdb 100644
--- a/Libraries/LibJS/Runtime/ErrorPrototype.h
+++ b/Libraries/LibJS/Runtime/ErrorPrototype.h
@@ -31,14 +31,14 @@
namespace JS {
class ErrorPrototype final : public Object {
+ JS_OBJECT(ErrorPrototype, Object);
+
public:
explicit ErrorPrototype(GlobalObject&);
virtual void initialize(Interpreter&, GlobalObject&) override;
virtual ~ErrorPrototype() override;
private:
- virtual const char* class_name() const override { return "ErrorPrototype"; }
-
JS_DECLARE_NATIVE_FUNCTION(to_string);
JS_DECLARE_NATIVE_GETTER(name_getter);
@@ -49,13 +49,12 @@ private:
#define DECLARE_ERROR_SUBCLASS_PROTOTYPE(ClassName, snake_name, PrototypeName, ConstructorName) \
class PrototypeName final : public Object { \
+ JS_OBJECT(PrototypeName, Object); \
+ \
public: \
explicit PrototypeName(GlobalObject&); \
virtual void initialize(Interpreter&, GlobalObject&) override { } \
virtual ~PrototypeName() override; \
- \
- private: \
- virtual const char* class_name() const override; \
};
#define __JS_ENUMERATE(ClassName, snake_name, PrototypeName, ConstructorName) \
diff --git a/Libraries/LibJS/Runtime/Function.h b/Libraries/LibJS/Runtime/Function.h
index 9e254f4bf6..8e19472fcc 100644
--- a/Libraries/LibJS/Runtime/Function.h
+++ b/Libraries/LibJS/Runtime/Function.h
@@ -32,6 +32,8 @@
namespace JS {
class Function : public Object {
+ JS_OBJECT(Function, Object);
+
public:
virtual ~Function();
virtual void initialize(Interpreter&, GlobalObject&) override { }
@@ -60,7 +62,6 @@ public:
protected:
explicit Function(Object& prototype);
Function(Object& prototype, Value bound_this, Vector<Value> bound_arguments);
- virtual const char* class_name() const override { return "Function"; }
private:
virtual bool is_function() const final { return true; }
diff --git a/Libraries/LibJS/Runtime/FunctionConstructor.h b/Libraries/LibJS/Runtime/FunctionConstructor.h
index e84e7cddba..97b0aa9001 100644
--- a/Libraries/LibJS/Runtime/FunctionConstructor.h
+++ b/Libraries/LibJS/Runtime/FunctionConstructor.h
@@ -31,6 +31,8 @@
namespace JS {
class FunctionConstructor final : public NativeFunction {
+ JS_OBJECT(FunctionConstructor, NativeFunction);
+
public:
explicit FunctionConstructor(GlobalObject&);
virtual void initialize(Interpreter&, GlobalObject&) override;
@@ -41,7 +43,6 @@ public:
private:
virtual bool has_constructor() const override { return true; }
- virtual const char* class_name() const override { return "FunctionConstructor"; }
};
}
diff --git a/Libraries/LibJS/Runtime/FunctionPrototype.h b/Libraries/LibJS/Runtime/FunctionPrototype.h
index bb5c3f6072..5e744004ea 100644
--- a/Libraries/LibJS/Runtime/FunctionPrototype.h
+++ b/Libraries/LibJS/Runtime/FunctionPrototype.h
@@ -31,14 +31,14 @@
namespace JS {
class FunctionPrototype final : public Object {
+ JS_OBJECT(FunctionPrototype, Object);
+
public:
explicit FunctionPrototype(GlobalObject&);
virtual void initialize(Interpreter&, GlobalObject&) override;
virtual ~FunctionPrototype() override;
private:
- virtual const char* class_name() const override { return "FunctionPrototype"; }
-
JS_DECLARE_NATIVE_FUNCTION(apply);
JS_DECLARE_NATIVE_FUNCTION(bind);
JS_DECLARE_NATIVE_FUNCTION(call);
diff --git a/Libraries/LibJS/Runtime/GlobalObject.h b/Libraries/LibJS/Runtime/GlobalObject.h
index f4ca8ce59c..0801d712c3 100644
--- a/Libraries/LibJS/Runtime/GlobalObject.h
+++ b/Libraries/LibJS/Runtime/GlobalObject.h
@@ -32,6 +32,8 @@
namespace JS {
class GlobalObject : public Object {
+ JS_OBJECT(GlobalObject, Object);
+
public:
explicit GlobalObject();
virtual void initialize();
@@ -53,8 +55,6 @@ protected:
void add_constructor(const FlyString& property_name, ConstructorType*&, Object& prototype);
private:
- virtual const char* class_name() const override { return "GlobalObject"; }
-
JS_DECLARE_NATIVE_FUNCTION(gc);
JS_DECLARE_NATIVE_FUNCTION(is_nan);
JS_DECLARE_NATIVE_FUNCTION(is_finite);
diff --git a/Libraries/LibJS/Runtime/JSONObject.h b/Libraries/LibJS/Runtime/JSONObject.h
index 3ce62280a2..eac7aa2e5b 100644
--- a/Libraries/LibJS/Runtime/JSONObject.h
+++ b/Libraries/LibJS/Runtime/JSONObject.h
@@ -31,6 +31,8 @@
namespace JS {
class JSONObject final : public Object {
+ JS_OBJECT(JSONObject, Object);
+
public:
explicit JSONObject(GlobalObject&);
virtual void initialize(Interpreter&, GlobalObject&) override;
@@ -45,8 +47,6 @@ private:
Optional<Vector<String>> property_list;
};
- virtual const char* class_name() const override { return "JSONObject"; }
-
// Stringify helpers
static String serialize_json_property(Interpreter&, StringifyState&, const PropertyName& key, Object* holder);
static String serialize_json_object(Interpreter&, StringifyState&, Object&);
diff --git a/Libraries/LibJS/Runtime/MathObject.h b/Libraries/LibJS/Runtime/MathObject.h
index c5a5868a0b..2455ead29c 100644
--- a/Libraries/LibJS/Runtime/MathObject.h
+++ b/Libraries/LibJS/Runtime/MathObject.h
@@ -31,14 +31,14 @@
namespace JS {
class MathObject final : public Object {
+ JS_OBJECT(MathObject, Object);
+
public:
explicit MathObject(GlobalObject&);
virtual void initialize(Interpreter&, GlobalObject&) override;
virtual ~MathObject() override;
private:
- virtual const char* class_name() const override { return "MathObject"; }
-
JS_DECLARE_NATIVE_FUNCTION(abs);
JS_DECLARE_NATIVE_FUNCTION(random);
JS_DECLARE_NATIVE_FUNCTION(sqrt);
diff --git a/Libraries/LibJS/Runtime/NativeFunction.h b/Libraries/LibJS/Runtime/NativeFunction.h
index c8478171fc..f569e382ac 100644
--- a/Libraries/LibJS/Runtime/NativeFunction.h
+++ b/Libraries/LibJS/Runtime/NativeFunction.h
@@ -32,6 +32,8 @@
namespace JS {
class NativeFunction : public Function {
+ JS_OBJECT(NativeFunction, Function);
+
public:
static NativeFunction* create(Interpreter&, GlobalObject&, const FlyString& name, AK::Function<Value(Interpreter&, GlobalObject&)>);
@@ -51,7 +53,6 @@ protected:
private:
virtual bool is_native_function() const override { return true; }
- virtual const char* class_name() const override { return "NativeFunction"; }
virtual LexicalEnvironment* create_environment() override final { return nullptr; }
FlyString m_name;
diff --git a/Libraries/LibJS/Runtime/NativeProperty.h b/Libraries/LibJS/Runtime/NativeProperty.h
index 52bd5cc125..05e0102bc7 100644
--- a/Libraries/LibJS/Runtime/NativeProperty.h
+++ b/Libraries/LibJS/Runtime/NativeProperty.h
@@ -32,6 +32,8 @@
namespace JS {
class NativeProperty final : public Object {
+ JS_OBJECT(NativeProperty, Object);
+
public:
NativeProperty(AK::Function<Value(Interpreter&, GlobalObject&)> getter, AK::Function<void(Interpreter&, GlobalObject&, Value)> setter);
virtual ~NativeProperty() override;
@@ -41,7 +43,6 @@ public:
private:
virtual bool is_native_property() const override { return true; }
- virtual const char* class_name() const override { return "NativeProperty"; }
AK::Function<Value(Interpreter&, GlobalObject&)> m_getter;
AK::Function<void(Interpreter&, GlobalObject&, Value)> m_setter;
diff --git a/Libraries/LibJS/Runtime/NumberConstructor.h b/Libraries/LibJS/Runtime/NumberConstructor.h
index bcaff30162..ebde71db0b 100644
--- a/Libraries/LibJS/Runtime/NumberConstructor.h
+++ b/Libraries/LibJS/Runtime/NumberConstructor.h
@@ -31,6 +31,8 @@
namespace JS {
class NumberConstructor final : public NativeFunction {
+ JS_OBJECT(NumberConstructor, NativeFunction);
+
public:
explicit NumberConstructor(GlobalObject&);
virtual void initialize(Interpreter&, GlobalObject&) override;
@@ -41,7 +43,6 @@ public:
private:
virtual bool has_constructor() const override { return true; }
- virtual const char* class_name() const override { return "NumberConstructor"; }
JS_DECLARE_NATIVE_FUNCTION(is_finite);
JS_DECLARE_NATIVE_FUNCTION(is_integer);
diff --git a/Libraries/LibJS/Runtime/NumberObject.h b/Libraries/LibJS/Runtime/NumberObject.h
index c316505d66..d5574a4de3 100644
--- a/Libraries/LibJS/Runtime/NumberObject.h
+++ b/Libraries/LibJS/Runtime/NumberObject.h
@@ -31,6 +31,8 @@
namespace JS {
class NumberObject : public Object {
+ JS_OBJECT(NumberObject, Object);
+
public:
static NumberObject* create(GlobalObject&, double);
@@ -41,8 +43,6 @@ public:
virtual Value value_of() const override { return Value(m_value); }
private:
- virtual const char* class_name() const override { return "NumberObject"; }
-
double m_value { 0 };
};
diff --git a/Libraries/LibJS/Runtime/NumberPrototype.h b/Libraries/LibJS/Runtime/NumberPrototype.h
index 3b1e224dac..bf571ba75a 100644
--- a/Libraries/LibJS/Runtime/NumberPrototype.h
+++ b/Libraries/LibJS/Runtime/NumberPrototype.h
@@ -31,12 +31,11 @@
namespace JS {
class NumberPrototype final : public NumberObject {
+ JS_OBJECT(NumberPrototype, NumberObject);
+
public:
explicit NumberPrototype(GlobalObject&);
virtual ~NumberPrototype() override;
-
-private:
- virtual const char* class_name() const override { return "NumberPrototype"; }
};
}
diff --git a/Libraries/LibJS/Runtime/Object.h b/Libraries/LibJS/Runtime/Object.h
index ebb40cb310..ec434bf05b 100644
--- a/Libraries/LibJS/Runtime/Object.h
+++ b/Libraries/LibJS/Runtime/Object.h
@@ -39,6 +39,12 @@
namespace JS {
+#define JS_OBJECT(class_, base_class) \
+public: \
+ using Base = base_class; \
+ virtual const char* class_name() const override { return #class_; } \
+ virtual bool inherits(const StringView& class_name) const override { return class_name == #class_ || Base::inherits(class_name); }
+
struct PropertyDescriptor {
PropertyAttributes attributes;
Value value;
@@ -60,6 +66,8 @@ public:
virtual void initialize(Interpreter&, GlobalObject&) override;
virtual ~Object();
+ virtual bool inherits(const StringView& class_name) const { return class_name == this->class_name(); }
+
enum class GetOwnPropertyMode {
Key,
Value,
@@ -111,8 +119,6 @@ public:
virtual bool is_symbol_object() const { return false; }
virtual bool is_bigint_object() const { return false; }
- virtual bool is_web_wrapper() const { return false; }
-
virtual const char* class_name() const override { return "Object"; }
virtual void visit_children(Cell::Visitor&) override;
diff --git a/Libraries/LibJS/Runtime/ObjectConstructor.h b/Libraries/LibJS/Runtime/ObjectConstructor.h
index 57eafb5282..782946eb3f 100644
--- a/Libraries/LibJS/Runtime/ObjectConstructor.h
+++ b/Libraries/LibJS/Runtime/ObjectConstructor.h
@@ -31,6 +31,8 @@
namespace JS {
class ObjectConstructor final : public NativeFunction {
+ JS_OBJECT(ObjectConstructor, NativeFunction);
+
public:
explicit ObjectConstructor(GlobalObject&);
virtual void initialize(Interpreter&, GlobalObject&) override;
@@ -41,7 +43,6 @@ public:
private:
virtual bool has_constructor() const override { return true; }
- virtual const char* class_name() const override { return "ObjectConstructor"; }
JS_DECLARE_NATIVE_FUNCTION(define_property_);
JS_DECLARE_NATIVE_FUNCTION(is);
diff --git a/Libraries/LibJS/Runtime/ObjectPrototype.h b/Libraries/LibJS/Runtime/ObjectPrototype.h
index 4f0c6ca4bb..2f9775dbcf 100644
--- a/Libraries/LibJS/Runtime/ObjectPrototype.h
+++ b/Libraries/LibJS/Runtime/ObjectPrototype.h
@@ -31,6 +31,8 @@
namespace JS {
class ObjectPrototype final : public Object {
+ JS_OBJECT(ObjectPrototype, Object);
+
public:
explicit ObjectPrototype(GlobalObject&);
virtual void initialize(Interpreter&, GlobalObject&) override;
@@ -40,8 +42,6 @@ public:
JS_DECLARE_NATIVE_FUNCTION(to_string);
private:
- virtual const char* class_name() const override { return "ObjectPrototype"; }
-
JS_DECLARE_NATIVE_FUNCTION(has_own_property);
JS_DECLARE_NATIVE_FUNCTION(to_locale_string);
JS_DECLARE_NATIVE_FUNCTION(value_of);
diff --git a/Libraries/LibJS/Runtime/ProxyConstructor.h b/Libraries/LibJS/Runtime/ProxyConstructor.h
index 10d9277280..e914f2e3cc 100644
--- a/Libraries/LibJS/Runtime/ProxyConstructor.h
+++ b/Libraries/LibJS/Runtime/ProxyConstructor.h
@@ -31,6 +31,8 @@
namespace JS {
class ProxyConstructor final : public NativeFunction {
+ JS_OBJECT(ProxyConstructor, NativeFunction);
+
public:
explicit ProxyConstructor(GlobalObject&);
virtual void initialize(Interpreter&, GlobalObject&) override;
@@ -41,7 +43,6 @@ public:
private:
virtual bool has_constructor() const override { return true; }
- virtual const char* class_name() const override { return "ProxyConstructor"; }
};
}
diff --git a/Libraries/LibJS/Runtime/ProxyObject.h b/Libraries/LibJS/Runtime/ProxyObject.h
index 9d57f885d6..ce8c3ef69d 100644
--- a/Libraries/LibJS/Runtime/ProxyObject.h
+++ b/Libraries/LibJS/Runtime/ProxyObject.h
@@ -31,6 +31,8 @@
namespace JS {
class ProxyObject : public Object {
+ JS_OBJECT(ProxyObject, Object);
+
public:
static ProxyObject* create(GlobalObject&, Object& target, Object& handler);
@@ -56,7 +58,6 @@ public:
private:
virtual void visit_children(Visitor&) override;
- virtual const char* class_name() const override { return "ProxyObject"; }
virtual bool is_proxy_object() const override { return true; }
virtual bool is_array() const override { return m_target.is_array(); };
diff --git a/Libraries/LibJS/Runtime/ProxyPrototype.h b/Libraries/LibJS/Runtime/ProxyPrototype.h
index e0ec6f23a1..b680f6dacb 100644
--- a/Libraries/LibJS/Runtime/ProxyPrototype.h
+++ b/Libraries/LibJS/Runtime/ProxyPrototype.h
@@ -31,12 +31,11 @@
namespace JS {
class ProxyPrototype final : public Object {
+ JS_OBJECT(ProxyPrototype, Object);
+
public:
explicit ProxyPrototype(GlobalObject&);
virtual ~ProxyPrototype() override;
-
-private:
- virtual const char* class_name() const override { return "ProxyPrototype"; }
};
}
diff --git a/Libraries/LibJS/Runtime/ReflectObject.h b/Libraries/LibJS/Runtime/ReflectObject.h
index eeae86f308..8cc129fe83 100644
--- a/Libraries/LibJS/Runtime/ReflectObject.h
+++ b/Libraries/LibJS/Runtime/ReflectObject.h
@@ -31,14 +31,14 @@
namespace JS {
class ReflectObject final : public Object {
+ JS_OBJECT(ReflectObject, Object);
+
public:
explicit ReflectObject(GlobalObject&);
virtual void initialize(Interpreter&, GlobalObject&) override;
virtual ~ReflectObject() override;
private:
- virtual const char* class_name() const override { return "ReflectObject"; }
-
JS_DECLARE_NATIVE_FUNCTION(apply);
JS_DECLARE_NATIVE_FUNCTION(construct);
JS_DECLARE_NATIVE_FUNCTION(define_property);
diff --git a/Libraries/LibJS/Runtime/RegExpConstructor.h b/Libraries/LibJS/Runtime/RegExpConstructor.h
index 7da95a71d0..4c09b13b60 100644
--- a/Libraries/LibJS/Runtime/RegExpConstructor.h
+++ b/Libraries/LibJS/Runtime/RegExpConstructor.h
@@ -31,6 +31,8 @@
namespace JS {
class RegExpConstructor final : public NativeFunction {
+ JS_OBJECT(RegExpConstructor, NativeFunction);
+
public:
explicit RegExpConstructor(GlobalObject&);
virtual void initialize(Interpreter&, GlobalObject&) override;
@@ -41,7 +43,6 @@ public:
private:
virtual bool has_constructor() const override { return true; }
- virtual const char* class_name() const override { return "RegExpConstructor"; }
};
}
diff --git a/Libraries/LibJS/Runtime/RegExpObject.h b/Libraries/LibJS/Runtime/RegExpObject.h
index 5acc72b4ce..61d44b2a6f 100644
--- a/Libraries/LibJS/Runtime/RegExpObject.h
+++ b/Libraries/LibJS/Runtime/RegExpObject.h
@@ -32,6 +32,8 @@
namespace JS {
class RegExpObject : public Object {
+ JS_OBJECT(RegExpObject, Object);
+
public:
static RegExpObject* create(GlobalObject&, String content, String flags);
@@ -44,7 +46,6 @@ public:
Value to_string() const override;
private:
- virtual const char* class_name() const override { return "RegExpObject"; }
virtual bool is_regexp_object() const override { return true; }
String m_content;
diff --git a/Libraries/LibJS/Runtime/RegExpPrototype.h b/Libraries/LibJS/Runtime/RegExpPrototype.h
index cab917e6e3..bfd42abd16 100644
--- a/Libraries/LibJS/Runtime/RegExpPrototype.h
+++ b/Libraries/LibJS/Runtime/RegExpPrototype.h
@@ -31,12 +31,11 @@
namespace JS {
class RegExpPrototype final : public RegExpObject {
+ JS_OBJECT(RegExpPrototype, RegExpObject);
+
public:
explicit RegExpPrototype(GlobalObject&);
virtual ~RegExpPrototype() override;
-
-private:
- virtual const char* class_name() const override { return "RegExpPrototype"; }
};
}
diff --git a/Libraries/LibJS/Runtime/ScriptFunction.h b/Libraries/LibJS/Runtime/ScriptFunction.h
index 201e5d1af3..304c229b04 100644
--- a/Libraries/LibJS/Runtime/ScriptFunction.h
+++ b/Libraries/LibJS/Runtime/ScriptFunction.h
@@ -32,6 +32,8 @@
namespace JS {
class ScriptFunction final : public Function {
+ JS_OBJECT(ScriptFunction, Function);
+
public:
static ScriptFunction* create(GlobalObject&, const FlyString& name, const Statement& body, Vector<FunctionNode::Parameter> parameters, i32 m_function_length, LexicalEnvironment* parent_environment, bool is_arrow_function = false);
@@ -50,7 +52,6 @@ public:
private:
virtual bool is_script_function() const override { return true; }
- virtual const char* class_name() const override { return "ScriptFunction"; }
virtual LexicalEnvironment* create_environment() override;
virtual void visit_children(Visitor&) override;
diff --git a/Libraries/LibJS/Runtime/StringConstructor.h b/Libraries/LibJS/Runtime/StringConstructor.h
index b6c651bde5..3e7608920b 100644
--- a/Libraries/LibJS/Runtime/StringConstructor.h
+++ b/Libraries/LibJS/Runtime/StringConstructor.h
@@ -31,6 +31,8 @@
namespace JS {
class StringConstructor final : public NativeFunction {
+ JS_OBJECT(StringConstructor, NativeFunction);
+
public:
explicit StringConstructor(GlobalObject&);
virtual void initialize(Interpreter&, GlobalObject&) override;
@@ -41,7 +43,6 @@ public:
private:
virtual bool has_constructor() const override { return true; }
- virtual const char* class_name() const override { return "StringConstructor"; }
JS_DECLARE_NATIVE_FUNCTION(raw);
JS_DECLARE_NATIVE_FUNCTION(from_char_code);
diff --git a/Libraries/LibJS/Runtime/StringObject.h b/Libraries/LibJS/Runtime/StringObject.h
index 23e8f8f1dd..d01de70306 100644
--- a/Libraries/LibJS/Runtime/StringObject.h
+++ b/Libraries/LibJS/Runtime/StringObject.h
@@ -31,6 +31,8 @@
namespace JS {
class StringObject : public Object {
+ JS_OBJECT(StringObject, Object);
+
public:
static StringObject* create(GlobalObject&, PrimitiveString&);
@@ -45,7 +47,6 @@ public:
private:
virtual void visit_children(Visitor&) override;
- virtual const char* class_name() const override { return "StringObject"; }
virtual bool is_string_object() const override { return true; }
PrimitiveString& m_string;
diff --git a/Libraries/LibJS/Runtime/StringPrototype.h b/Libraries/LibJS/Runtime/StringPrototype.h
index 6df4c469de..841b41b301 100644
--- a/Libraries/LibJS/Runtime/StringPrototype.h
+++ b/Libraries/LibJS/Runtime/StringPrototype.h
@@ -31,14 +31,14 @@
namespace JS {
class StringPrototype final : public StringObject {
+ JS_OBJECT(StringPrototype, StringObject);
+
public:
explicit StringPrototype(GlobalObject&);
virtual void initialize(Interpreter&, GlobalObject&) override;
virtual ~StringPrototype() override;
private:
- virtual const char* class_name() const override { return "StringPrototype"; }
-
JS_DECLARE_NATIVE_FUNCTION(char_at);
JS_DECLARE_NATIVE_FUNCTION(repeat);
JS_DECLARE_NATIVE_FUNCTION(starts_with);
diff --git a/Libraries/LibJS/Runtime/SymbolConstructor.h b/Libraries/LibJS/Runtime/SymbolConstructor.h
index c5e39774b6..6e495cae4d 100644
--- a/Libraries/LibJS/Runtime/SymbolConstructor.h
+++ b/Libraries/LibJS/Runtime/SymbolConstructor.h
@@ -31,6 +31,8 @@
namespace JS {
class SymbolConstructor final : public NativeFunction {
+ JS_OBJECT(SymbolConstructor, NativeFunction);
+
public:
explicit SymbolConstructor(GlobalObject&);
virtual void initialize(Interpreter&, GlobalObject&) override;
@@ -41,7 +43,6 @@ public:
private:
virtual bool has_constructor() const override { return true; }
- virtual const char* class_name() const override { return "SymbolConstructor"; }
JS_DECLARE_NATIVE_FUNCTION(for_);
JS_DECLARE_NATIVE_FUNCTION(key_for);
diff --git a/Libraries/LibJS/Runtime/SymbolObject.h b/Libraries/LibJS/Runtime/SymbolObject.h
index 33c726cde0..763354b233 100644
--- a/Libraries/LibJS/Runtime/SymbolObject.h
+++ b/Libraries/LibJS/Runtime/SymbolObject.h
@@ -32,6 +32,8 @@
namespace JS {
class SymbolObject : public Object {
+ JS_OBJECT(SymbolObject, Object);
+
public:
static SymbolObject* create(GlobalObject&, Symbol&);
@@ -70,7 +72,6 @@ public:
private:
virtual void visit_children(Visitor&) override;
- virtual const char* class_name() const override { return "SymbolObject"; }
virtual bool is_symbol_object() const override { return true; }
Symbol& m_symbol;
diff --git a/Libraries/LibJS/Runtime/SymbolPrototype.h b/Libraries/LibJS/Runtime/SymbolPrototype.h
index 392c26a914..f8f5730b43 100644
--- a/Libraries/LibJS/Runtime/SymbolPrototype.h
+++ b/Libraries/LibJS/Runtime/SymbolPrototype.h
@@ -31,14 +31,14 @@
namespace JS {
class SymbolPrototype final : public Object {
+ JS_OBJECT(SymbolPrototype, Object);
+
public:
explicit SymbolPrototype(GlobalObject&);
virtual void initialize(Interpreter&, GlobalObject&) override;
virtual ~SymbolPrototype() override;
private:
- virtual const char* class_name() const override { return "SymbolPrototype"; }
-
JS_DECLARE_NATIVE_GETTER(description_getter);
JS_DECLARE_NATIVE_FUNCTION(to_string);
diff --git a/Libraries/LibJS/Runtime/Uint8ClampedArray.h b/Libraries/LibJS/Runtime/Uint8ClampedArray.h
index bf2351789a..056d490eab 100644
--- a/Libraries/LibJS/Runtime/Uint8ClampedArray.h
+++ b/Libraries/LibJS/Runtime/Uint8ClampedArray.h
@@ -31,6 +31,8 @@
namespace JS {
class Uint8ClampedArray final : public Object {
+ JS_OBJECT(Uint8ClampedArray, Object);
+
public:
static Uint8ClampedArray* create(GlobalObject&, u32 length);
@@ -46,8 +48,6 @@ public:
const u8* data() const { return m_data; }
private:
- virtual const char* class_name() const override { return "Uint8ClampedArray"; }
-
JS_DECLARE_NATIVE_GETTER(length_getter);
u8* m_data { nullptr };
diff --git a/Libraries/LibWeb/Bindings/CanvasRenderingContext2DWrapper.h b/Libraries/LibWeb/Bindings/CanvasRenderingContext2DWrapper.h
index 7595a63d1c..2fe903858b 100644
--- a/Libraries/LibWeb/Bindings/CanvasRenderingContext2DWrapper.h
+++ b/Libraries/LibWeb/Bindings/CanvasRenderingContext2DWrapper.h
@@ -32,6 +32,7 @@ namespace Web {
namespace Bindings {
class CanvasRenderingContext2DWrapper final : public Wrapper {
+ JS_OBJECT(CanvasRenderingContext2DWrapper, Wrapper);
public:
CanvasRenderingContext2DWrapper(JS::GlobalObject&, CanvasRenderingContext2D&);
virtual void initialize(JS::Interpreter&, JS::GlobalObject&) override;
@@ -41,8 +42,6 @@ public:
const CanvasRenderingContext2D& impl() const { return m_impl; }
private:
- virtual const char* class_name() const override { return "CanvasRenderingContext2DWrapper"; }
-
JS_DECLARE_NATIVE_FUNCTION(fill_rect);
JS_DECLARE_NATIVE_FUNCTION(stroke_rect);
JS_DECLARE_NATIVE_FUNCTION(draw_image);
diff --git a/Libraries/LibWeb/Bindings/EventListenerWrapper.h b/Libraries/LibWeb/Bindings/EventListenerWrapper.h
index 4aeb0cfec1..6fad8eaff2 100644
--- a/Libraries/LibWeb/Bindings/EventListenerWrapper.h
+++ b/Libraries/LibWeb/Bindings/EventListenerWrapper.h
@@ -32,6 +32,8 @@ namespace Web {
namespace Bindings {
class EventListenerWrapper final : public Wrapper {
+ JS_OBJECT(EventListenerWrapper, Wrapper);
+
public:
EventListenerWrapper(JS::GlobalObject&, EventListener&);
virtual ~EventListenerWrapper() override;
@@ -40,8 +42,6 @@ public:
const EventListener& impl() const { return *m_impl; }
private:
- virtual const char* class_name() const override { return "EventListenerWrapper"; }
-
NonnullRefPtr<EventListener> m_impl;
};
diff --git a/Libraries/LibWeb/Bindings/EventWrapper.h b/Libraries/LibWeb/Bindings/EventWrapper.h
index baf7ef56ad..1e9f4b04b2 100644
--- a/Libraries/LibWeb/Bindings/EventWrapper.h
+++ b/Libraries/LibWeb/Bindings/EventWrapper.h
@@ -32,6 +32,8 @@ namespace Web {
namespace Bindings {
class EventWrapper : public Wrapper {
+ JS_OBJECT(EventWrapper, Wrapper);
+
public:
EventWrapper(JS::GlobalObject&, Event&);
virtual ~EventWrapper() override;
@@ -40,8 +42,6 @@ public:
const Event& event() const { return m_event; }
private:
- virtual const char* class_name() const override { return "EventWrapper"; }
-
NonnullRefPtr<Event> m_event;
};
diff --git a/Libraries/LibWeb/Bindings/ImageDataWrapper.h b/Libraries/LibWeb/Bindings/ImageDataWrapper.h
index 97868071ce..059b28d0eb 100644
--- a/Libraries/LibWeb/Bindings/ImageDataWrapper.h
+++ b/Libraries/LibWeb/Bindings/ImageDataWrapper.h
@@ -32,6 +32,8 @@ namespace Web {
namespace Bindings {
class ImageDataWrapper : public Wrapper {
+ JS_OBJECT(ImageDataWrapper, Wrapper);
+
public:
ImageDataWrapper(JS::GlobalObject&, ImageData&);
virtual void initialize(JS::Interpreter&, JS::GlobalObject&) override;
@@ -41,8 +43,6 @@ public:
const ImageData& impl() const { return m_impl; }
private:
- virtual const char* class_name() const override { return "ImageDataWrapper"; }
-
JS_DECLARE_NATIVE_GETTER(width_getter);
JS_DECLARE_NATIVE_GETTER(height_getter);
JS_DECLARE_NATIVE_GETTER(data_getter);
diff --git a/Libraries/LibWeb/Bindings/LocationObject.h b/Libraries/LibWeb/Bindings/LocationObject.h
index 97133efafc..e0ebb55f32 100644
--- a/Libraries/LibWeb/Bindings/LocationObject.h
+++ b/Libraries/LibWeb/Bindings/LocationObject.h
@@ -33,14 +33,14 @@ namespace Web {
namespace Bindings {
class LocationObject final : public JS::Object {
+ JS_OBJECT(LocationObject, JS::Object);
+
public:
explicit LocationObject(JS::GlobalObject&);
virtual void initialize(JS::Interpreter&, JS::GlobalObject&) override;
virtual ~LocationObject() override;
private:
- virtual const char* class_name() const override { return "LocationObject"; }
-
JS_DECLARE_NATIVE_FUNCTION(reload);
JS_DECLARE_NATIVE_GETTER(href_getter);
diff --git a/Libraries/LibWeb/Bindings/NavigatorObject.h b/Libraries/LibWeb/Bindings/NavigatorObject.h
index ddef82f8f7..b05ecc26cd 100644
--- a/Libraries/LibWeb/Bindings/NavigatorObject.h
+++ b/Libraries/LibWeb/Bindings/NavigatorObject.h
@@ -33,14 +33,14 @@ namespace Web {
namespace Bindings {
class NavigatorObject final : public JS::Object {
+ JS_OBJECT(NavigatorObject, JS::Object);
+
public:
NavigatorObject(JS::GlobalObject&);
virtual void initialize(JS::Interpreter&, JS::GlobalObject&) override;
virtual ~NavigatorObject() override;
private:
- virtual const char* class_name() const override { return "NavigatorObject"; }
-
JS_DECLARE_NATIVE_GETTER(user_agent_getter);
};
diff --git a/Libraries/LibWeb/Bindings/Wrapper.h b/Libraries/LibWeb/Bindings/Wrapper.h
index bcb72bb440..5fc5abc606 100644
--- a/Libraries/LibWeb/Bindings/Wrapper.h
+++ b/Libraries/LibWeb/Bindings/Wrapper.h
@@ -37,20 +37,14 @@ namespace Bindings {
class Wrapper
: public JS::Object
, public Weakable<Wrapper> {
-public:
- virtual bool is_event_target_wrapper() const { return false; }
- virtual bool is_node_wrapper() const { return false; }
- virtual bool is_document_wrapper() const { return false; }
- virtual bool is_element_wrapper() const { return false; }
- virtual bool is_htmlelement_wrapper() const { return false; }
+ JS_OBJECT(Wrapper, JS::Object);
+public:
protected:
explicit Wrapper(Object& prototype)
: Object(&prototype)
{
}
-
- virtual bool is_web_wrapper() const final { return true; }
};
}
diff --git a/Libraries/LibWeb/Bindings/XMLHttpRequestPrototype.h b/Libraries/LibWeb/Bindings/XMLHttpRequestPrototype.h
index dcc2fdfe48..8667825a50 100644
--- a/Libraries/LibWeb/Bindings/XMLHttpRequestPrototype.h
+++ b/Libraries/LibWeb/Bindings/XMLHttpRequestPrototype.h
@@ -32,14 +32,14 @@ namespace Web {
namespace Bindings {
class XMLHttpRequestPrototype final : public JS::Object {
+ JS_OBJECT(XMLHttpRequestPrototype, JS::Object);
+
public:
explicit XMLHttpRequestPrototype(JS::GlobalObject&);
virtual void initialize(JS::Interpreter&, JS::GlobalObject&) override;
virtual ~XMLHttpRequestPrototype() override;
private:
- virtual const char* class_name() const override { return "XMLHttpRequestPrototype"; }
-
JS_DECLARE_NATIVE_FUNCTION(open);
JS_DECLARE_NATIVE_FUNCTION(send);
diff --git a/Libraries/LibWeb/CodeGenerators/WrapperGenerator.cpp b/Libraries/LibWeb/CodeGenerators/WrapperGenerator.cpp
index 324d7c3ab4..0f52953e03 100644
--- a/Libraries/LibWeb/CodeGenerators/WrapperGenerator.cpp
+++ b/Libraries/LibWeb/CodeGenerators/WrapperGenerator.cpp
@@ -315,6 +315,7 @@ static void generate_header(const IDL::Interface& interface)
out() << "namespace Bindings {";
out() << "class " << wrapper_class << " : public " << wrapper_base_class << " {";
+ out() << " JS_OBJECT(" << wrapper_class << ", " << wrapper_base_class << ");";
out() << "public:";
out() << " " << wrapper_class << "(JS::GlobalObject&, " << interface.name << "&);";
out() << " virtual void initialize(JS::Interpreter&, JS::GlobalObject&) override;";
@@ -332,7 +333,6 @@ static void generate_header(const IDL::Interface& interface)
out() << " virtual bool " << is_foo_wrapper_name << "() const final { return true; }";
out() << "private:";
- out() << " virtual const char* class_name() const override { return \"" << interface.name << "\"; }";
for (auto& function : interface.functions) {
out() << " JS_DECLARE_NATIVE_FUNCTION(" << snake_name(function.name) << ");";
@@ -412,8 +412,7 @@ void generate_implementation(const IDL::Interface& interface)
out() << " auto* this_object = interpreter.this_value(global_object).to_object(interpreter, global_object);";
out() << " if (!this_object)";
out() << " return {};";
- auto is_foo_wrapper_name = snake_name(String::format("Is%s", wrapper_class.characters()));
- out() << " if (!this_object->is_web_wrapper() || !static_cast<Wrapper*>(this_object)->" << is_foo_wrapper_name << "()) {";
+ out() << " if (!this_object->inherits(\"" << wrapper_class << "\")) {";
out() << " interpreter.throw_exception<JS::TypeError>(JS::ErrorType::NotA, \"" << interface.name << "\");";
out() << " return nullptr;";
out() << " }";
@@ -441,8 +440,7 @@ void generate_implementation(const IDL::Interface& interface)
out() << " auto " << cpp_name << "_object = " << js_name << js_suffix << ".to_object(interpreter, global_object);";
out() << " if (interpreter.exception())";
generate_return();
- auto is_foo_wrapper_name = snake_name(String::format("Is%sWrapper", parameter.type.name.characters()));
- out() << " if (!" << cpp_name << "_object->is_web_wrapper() || !static_cast<Wrapper*>(" << cpp_name << "_object)->" << is_foo_wrapper_name << "()) {";
+ out() << " if (!" << cpp_name << "_object->inherits(\"" << parameter.type.name << "Wrapper\")) {";
out() << " interpreter.throw_exception<JS::TypeError>(JS::ErrorType::NotA, \"" << parameter.type.name << "\");";
generate_return();
out() << " }";