Files
ladybird/Libraries/LibWeb/Serial/Serial.cpp
Shannon Booth fd44da6829 LibWeb/Bindings: Emit one bindings header and cpp per IDL
Previously, the LibWeb bindings generator would output multiple per
interface files like Prototype/Constructor/Namespace/GlobalMixin
depending on the contents of that IDL file.

This complicates the build system as it means that it does not know
what files will be generated without knowledge of the contents of that
IDL file.

Instead, for each IDL file only generate a single Bindings/<IDLFile>.h
and Bindings/<IDLFile>.cpp.
2026-04-21 07:36:13 +02:00

124 lines
4.5 KiB
C++

/*
* Copyright (c) 2025, Edwin Hoksberg <mail@edwinhoksberg.nl>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <LibWeb/Bindings/Intrinsics.h>
#include <LibWeb/Bindings/Serial.h>
#include <LibWeb/HTML/EventNames.h>
#include <LibWeb/HTML/Scripting/Environments.h>
#include <LibWeb/HTML/Scripting/TemporaryExecutionContext.h>
#include <LibWeb/HTML/Window.h>
#include <LibWeb/Platform/EventLoopPlugin.h>
#include <LibWeb/Serial/Serial.h>
#include <LibWeb/Serial/SerialPort.h>
#include <LibWeb/WebIDL/Promise.h>
namespace Web::Serial {
GC_DEFINE_ALLOCATOR(Serial);
Serial::Serial(JS::Realm& realm)
: DOM::EventTarget(realm)
{
}
void Serial::initialize(JS::Realm& realm)
{
WEB_SET_PROTOTYPE_FOR_INTERFACE(Serial);
Base::initialize(realm);
}
// https://wicg.github.io/serial/#requestport-method
WebIDL::ExceptionOr<GC::Ref<WebIDL::Promise>> Serial::request_port(SerialPortRequestOptions const)
{
auto& realm = this->realm();
// FIXME: 1. Let promise be a new promise.
// FIXME: 2. If this's relevant global object's associated Document is not allowed to use the policy-controlled feature named "serial",
// reject promise with a "SecurityError" DOMException and return promise.
// FIXME: 3. If the relevant global object of this does not have transient activation, reject promise with a "SecurityError" DOMException and return promise.
// FIXME: 4. If options["filters"] is present, then for each filter in options["filters"] run the following steps:
// FIXME: 5. Run the following steps in parallel:
{
// FIXME: 1. Let allPorts be an empty list.
// FIXME: 2. For each Bluetooth device registered with the system:
// FIXME: 3. For each available non-Bluetooth serial port:
{
// FIXME: 1. Let port be a SerialPort representing the port.
// FIXME: 2. Append port to allPorts.
}
// FIXME: 4. Prompt the user to grant the site access to a serial port by presenting them with a list of ports
// in allPorts that match any filter in options["filters"] if present and allPorts otherwise.
// FIXME: 5. If the user does not choose a port, queue a global task on the relevant global object of this using the
// serial port task source to reject promise with a "NotFoundError" DOMException and abort these steps.
// FIXME: 6. Let port be a SerialPort representing the port chosen by the user.
// FIXME: 7. Queue a global task on the relevant global object of this using the serial port task source to resolve promise with port.
}
// 6. Return promise.
dbgln("FIXME: Unimplemented Serial::request_port()");
return WebIDL::create_rejected_promise(realm, WebIDL::UnknownError::create(realm, Utf16String {}));
}
// https://wicg.github.io/serial/#getports-method
GC::Ref<WebIDL::Promise> Serial::get_ports()
{
auto& realm = this->realm();
// FIXME: 1. Let promise be a new promise.
// FIXME: 2. If this's relevant global object's associated Document is not allowed to use the policy-controlled feature named "serial",
// reject promise with a "SecurityError" DOMException and return promise.
// FIXME: 3. Run the following steps in parallel:
{
// FIXME: 1. Let availablePorts be the sequence of available serial ports which the user has allowed the site to
// access as the result of a previous call to requestPort().
// FIXME: 2. Let ports be the sequence of the SerialPorts representing the ports in availablePorts.
// FIXME: 3. Queue a global task on the relevant global object of this using the serial port task source to resolve promise with ports.
}
// 4. Return promise.
dbgln("FIXME: Unimplemented Serial::get_ports()");
return WebIDL::create_rejected_promise(realm, WebIDL::UnknownError::create(realm, Utf16String {}));
}
// https://wicg.github.io/serial/#onconnect-attribute
void Serial::set_onconnect(WebIDL::CallbackType* event_handler)
{
set_event_handler_attribute(HTML::EventNames::connect, event_handler);
}
WebIDL::CallbackType* Serial::onconnect()
{
return event_handler_attribute(HTML::EventNames::connect);
}
// https://wicg.github.io/serial/#ondisconnect-attribute
void Serial::set_ondisconnect(WebIDL::CallbackType* event_handler)
{
set_event_handler_attribute(HTML::EventNames::disconnect, event_handler);
}
WebIDL::CallbackType* Serial::ondisconnect()
{
return event_handler_attribute(HTML::EventNames::disconnect);
}
}