From 31f7296934777d97eae5386bfe42069cab1ea366 Mon Sep 17 00:00:00 2001 From: Luke Date: Sat, 20 Mar 2021 05:22:27 +0000 Subject: [PATCH] LibWeb: Add legacy Image factory function --- .../LibWeb/Bindings/ImageConstructor.cpp | 86 +++++++++++++++++++ .../LibWeb/Bindings/ImageConstructor.h | 47 ++++++++++ .../LibWeb/Bindings/WindowObjectHelper.h | 2 + Userland/Libraries/LibWeb/CMakeLists.txt | 1 + 4 files changed, 136 insertions(+) create mode 100644 Userland/Libraries/LibWeb/Bindings/ImageConstructor.cpp create mode 100644 Userland/Libraries/LibWeb/Bindings/ImageConstructor.h diff --git a/Userland/Libraries/LibWeb/Bindings/ImageConstructor.cpp b/Userland/Libraries/LibWeb/Bindings/ImageConstructor.cpp new file mode 100644 index 0000000000..75b2ef9382 --- /dev/null +++ b/Userland/Libraries/LibWeb/Bindings/ImageConstructor.cpp @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2021, the SerenityOS developers. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include +#include +#include + +namespace Web::Bindings { + +ImageConstructor::ImageConstructor(JS::GlobalObject& global_object) + : NativeFunction(*global_object.function_prototype()) +{ +} + +void ImageConstructor::initialize(JS::GlobalObject& global_object) +{ + auto& vm = this->vm(); + auto& window = static_cast(global_object); + NativeFunction::initialize(global_object); + + define_property(vm.names.prototype, &window.ensure_web_prototype("HTMLImageElement"), 0); + define_property(vm.names.length, JS::Value(0), JS::Attribute::Configurable); +} + +ImageConstructor::~ImageConstructor() +{ +} + +JS::Value ImageConstructor::call() +{ + vm().throw_exception(global_object(), JS::ErrorType::ConstructorWithoutNew, "Image"); + return {}; +} + +// https://html.spec.whatwg.org/multipage/embedded-content.html#dom-image +JS::Value ImageConstructor::construct(Function&) +{ + auto& window = static_cast(global_object()); + auto& document = window.impl().document(); + auto image_element = DOM::create_element(document, HTML::TagNames::img, Namespace::HTML); + + if (vm().argument_count() > 0) { + u32 width = vm().argument(0).to_u32(global_object()); + if (vm().exception()) + return {}; + image_element->set_attribute(HTML::AttributeNames::width, String::formatted("{}", width)); + } + + if (vm().argument_count() > 1) { + u32 height = vm().argument(1).to_u32(global_object()); + if (vm().exception()) + return {}; + image_element->set_attribute(HTML::AttributeNames::height, String::formatted("{}", height)); + } + + return wrap(global_object(), image_element); +} + +} diff --git a/Userland/Libraries/LibWeb/Bindings/ImageConstructor.h b/Userland/Libraries/LibWeb/Bindings/ImageConstructor.h new file mode 100644 index 0000000000..cbb528ad53 --- /dev/null +++ b/Userland/Libraries/LibWeb/Bindings/ImageConstructor.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2021, the SerenityOS developers. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + +#include + +namespace Web::Bindings { + +class ImageConstructor final : public JS::NativeFunction { +public: + explicit ImageConstructor(JS::GlobalObject&); + virtual void initialize(JS::GlobalObject&) override; + virtual ~ImageConstructor() override; + + virtual JS::Value call() override; + virtual JS::Value construct(JS::Function& new_target) override; + +private: + virtual bool has_constructor() const override { return true; } + virtual const char* class_name() const override { return "ImageConstructor"; } +}; + +} diff --git a/Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h b/Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h index 1ae6099f05..555322ddfc 100644 --- a/Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h +++ b/Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h @@ -194,6 +194,7 @@ #include #include #include +#include #include #include #include @@ -322,6 +323,7 @@ ADD_WINDOW_OBJECT_INTERFACE(HTMLUListElement) \ ADD_WINDOW_OBJECT_INTERFACE(HTMLUnknownElement) \ ADD_WINDOW_OBJECT_INTERFACE(HTMLVideoElement) \ + ADD_WINDOW_OBJECT_INTERFACE(Image) \ ADD_WINDOW_OBJECT_INTERFACE(ImageData) \ ADD_WINDOW_OBJECT_INTERFACE(MouseEvent) \ ADD_WINDOW_OBJECT_INTERFACE(Node) \ diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index f183d154aa..4e941ddbe4 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -3,6 +3,7 @@ set(SOURCES Bindings/EventListenerWrapper.cpp Bindings/EventWrapperFactory.cpp Bindings/EventTargetWrapperFactory.cpp + Bindings/ImageConstructor.cpp Bindings/LocationObject.cpp Bindings/MainThreadVM.cpp Bindings/NavigatorObject.cpp