Fully support <input type=color> (#36992)

This change adds a shadow-tree widget for `<input type=color>` elements.
It also involves some changes to the way layout interacts with the DOM,
because currently all `input` and `textarea` elements are rendered as
plain text and their descendants are ignored. This obviously doesn't
work for `<input type={color, date, range, etc}>`.


![image](https://github.com/user-attachments/assets/4f16c3b0-1f79-4095-b19d-1153f5853dd5)

<details><summary>HTML used for the screenshot above</summary>

```html
<input type=color>
```

</details>



Testing: I doubt that this affects WPT tests, because the appearance and
behaviour of the widget is almost entirely unspecified.

---------

Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>
This commit is contained in:
Simon Wülker 2025-05-15 19:30:38 +02:00 committed by GitHub
parent f9382fcaa0
commit b100a98e1d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
14 changed files with 469 additions and 100 deletions

View file

@ -364,16 +364,8 @@ pub enum EmbedderMsg {
ShutdownComplete,
/// Request to display a notification.
ShowNotification(Option<WebViewId>, Notification),
/// Indicates that the user has activated a `<select>` element.
///
/// The embedder should respond with the new state of the `<select>` element.
ShowSelectElementMenu(
WebViewId,
Vec<SelectElementOptionOrOptgroup>,
Option<usize>,
DeviceIntRect,
IpcSender<Option<usize>>,
),
/// Request to display a form control to the embedder.
ShowFormControl(WebViewId, DeviceIntRect, FormControl),
/// Inform the embedding layer that a JavaScript evaluation has
/// finished with the given result.
FinishJavaScriptEvaluation(
@ -389,6 +381,18 @@ impl Debug for EmbedderMsg {
}
}
#[derive(Deserialize, Serialize)]
pub enum FormControl {
/// Indicates that the user has activated a `<select>` element.
SelectElement(
Vec<SelectElementOptionOrOptgroup>,
Option<usize>,
IpcSender<Option<usize>>,
),
/// Indicates that the user has activated a `<input type=color>` element.
ColorPicker(RgbColor, IpcSender<Option<RgbColor>>),
}
/// Filter for file selection;
/// the `String` content is expected to be extension (e.g, "doc", without the prefixing ".")
#[derive(Clone, Debug, Deserialize, Serialize)]
@ -921,3 +925,10 @@ pub enum JavaScriptEvaluationError {
/// value into a [`JSValue`].
SerializationError,
}
#[derive(Clone, Copy, Debug, Deserialize, Serialize)]
pub struct RgbColor {
pub red: u8,
pub green: u8,
pub blue: u8,
}