ladybird/Libraries/LibWeb/Bindings/AudioConstructor.cpp
Andreas Kling b6bef6b688 Libraries: Use UTF-16 for JS-visible runtime strings
Produce JS-visible string results as UTF-16 at their source, including
numeric formatting, BigInt and BigFraction formatting, URI encoding,
console formatting, parser errors, regular expression errors, Intl and
Temporal records, LibUnicode locale boundaries, and LibWeb bindings.

Handle fractional radix formatting through the UTF-16 builder view.
2026-06-22 19:51:25 +02:00

72 lines
2.8 KiB
C++

/*
* Copyright (c) 2022, Luke Wilde <lukew@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <LibWeb/Bindings/AudioConstructor.h>
#include <LibWeb/Bindings/ExceptionOrUtils.h>
#include <LibWeb/Bindings/HTMLAudioElement.h>
#include <LibWeb/DOM/ElementFactory.h>
#include <LibWeb/HTML/Scripting/Environments.h>
#include <LibWeb/HTML/Window.h>
#include <LibWeb/Namespace.h>
#include <LibWeb/WebIDL/AbstractOperations.h>
namespace Web::Bindings {
GC_DEFINE_ALLOCATOR(AudioConstructor);
AudioConstructor::AudioConstructor(JS::Realm& realm)
: NativeFunction(realm.intrinsics().function_prototype())
{
}
void AudioConstructor::initialize(JS::Realm& realm)
{
auto& vm = this->vm();
Base::initialize(realm);
define_direct_property(vm.names.length, JS::Value(0), JS::Attribute::Configurable);
define_direct_property(vm.names.name, JS::PrimitiveString::create(vm, "Audio"_utf16_fly_string), JS::Attribute::Configurable);
define_direct_property(vm.names.prototype, &ensure_web_prototype<Bindings::HTMLAudioElementPrototype>(realm, "HTMLAudioElement"_fly_string), 0);
}
JS::ThrowCompletionOr<JS::Value> AudioConstructor::call()
{
return vm().throw_completion<JS::TypeError>(JS::ErrorType::ConstructorWithoutNew, "Audio");
}
// https://html.spec.whatwg.org/multipage/media.html#dom-audio
// https://webidl.spec.whatwg.org/#legacy-factory-functions
JS::ThrowCompletionOr<GC::Ref<JS::Object>> AudioConstructor::construct(FunctionObject& new_target)
{
auto& vm = this->vm();
// 1. Let document be the current global object's associated Document.
auto& window = as<HTML::Window>(HTML::current_global_object());
auto& document = window.associated_document();
// 2. Let audio be the result of creating an element given document, "audio", and the HTML namespace.
auto audio = TRY(Bindings::throw_dom_exception_if_needed(vm, [&]() { return DOM::create_element(document, HTML::TagNames::audio, Namespace::HTML); }));
// https://webidl.spec.whatwg.org/#internally-create-a-new-object-implementing-the-interface
TRY(WebIDL::set_prototype_from_new_target<HTMLAudioElementPrototype>(vm, new_target, "HTMLAudioElement"_fly_string, *audio));
// 3. Set an attribute value for audio using "preload" and "auto".
audio->set_attribute_value(HTML::AttributeNames::preload, "auto"_string);
auto src_value = vm.argument(0);
// 4. If src is given, then set an attribute value for audio using "src" and src.
// (This will cause the user agent to invoke the object's resource selection algorithm before returning.)
if (!src_value.is_undefined()) {
auto src = TRY(src_value.to_utf16_string(vm)).to_utf8_but_should_be_ported_to_utf16();
audio->set_attribute_value(HTML::AttributeNames::src, move(src));
}
// 5. Return audio.
return audio;
}
}