Josh Matthews
a433b20259
script: Make callbacks generic over DOM interfaces. ( #35459 )
...
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
2025-02-21 12:17:11 +00:00
Josh Matthews
1192ae32b0
script: Refer to DOM interfaces with generic types in generated bindings. ( #35457 )
...
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
2025-02-21 11:10:00 +00:00
Gregory Terzian
df6d636168
dom: Implement WritableStream
( #34844 )
...
* add basic interface for writable stream
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* add stubs for pipeTo and pipeThrough methods
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* add stubs for writable stream defautl writer
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* add stubs for writable stream controller
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* add underlying source dict
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* add underlying source dict
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* implement constructor
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* implement init writable stream
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* impl setup default controller
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* implement controller setup
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* implement controller advance queue if neededd
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* implement stream finish erroring
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* implement stream reject close and closed promise if needed
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* finish implementation of stream finish erroring
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* call into controller setup from stream constructor
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* implement stream mark first write request in flight
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* implement controller process write
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* call into advance queue if needed at various points
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* implement stream deal with rejection, use from_safe_context
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* implement controller clear algorithms
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* remove unused todo
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* implement stream start erroring
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* finish writer ensure ready promise rejected
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* implement stream finish in flight write request
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* implement write constructor and setup
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* implement controller error
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* remove unnecessary unsafe code
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* finish implementing process write
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* implement close sentinel
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* implement public locked
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* implement stream abort
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* implement stream close
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* implement controller close
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* fix use of crown
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* remove unnecessary options around writer promises
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* implement writer get desired size
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* implement writer ready
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* implement writer abort
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* implement writer close
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* implement writer release lock
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* implement writer public write
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* implement private writer write
Uses ai
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* implement writer release.
Uses ai
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* impl controller process close
Uses ai
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* finish controller process close
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* root promise handlers
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* handler errors in stream and writer constructor
finish implementation of stream finish in flight close
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* fix warnings
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* implement controller get chunk size
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* tidy the webidls
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* implement stream get writer
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* fix assertion of stream state when advancing queue if needed
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* add docs for value with size
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* use reject_error in abort
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* remove unnecessary allowances of unsafe code
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* turn writable-streams test suite on
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* update encodings test expectations
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* properly check if type is set on sink in stream constructor
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* fix double borrow in controller advance queue if needed
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* make the queue aware of the close sentinel when dequeuing a value
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* fix assertion of no backpressure in update backpressure
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* also clear strategy size when clearing algorithms
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* remove this object arg when calling into strategy size
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* fix has operations marked in flight
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* fix typo in has in flight write request
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* turn error into no-op when aborting a stream, if the stream is closed or errored.
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* fix error handling of calling into abort algorithm
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* fix error handling of calling into close and write algorithms
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* fix double borrow on queue
fix logic in update_backpressure
fix logic in get_desired_size
fix logic in writer setup
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* update test expectations for aborting suite
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* fix controller get_backpressure
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* fix clippy
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* update test expectations to expect errors in tests using unsupported apis
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* fix error handling of calling into start algo in controller setup
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* update test expectations for test checking for undefined this in strategy size call
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* update test expectation to timeout for response-stream-with-broken-then.any.worker
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* update interfaces
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* fix use of global() and error to_jsval
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* fix use of crown for promise handlers
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* remove fail expectation from worker interface objects test
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* remove fail expectation for test expecting this to be undefined in callback
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* fix documentation link for writablestream state
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* refactor write_requests to use a vec deque
uses ai
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* remove unnecessary doc
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* refactor reject_close_and_closed_promise_if_needed to take a safe js context as argument
uses ai
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* pass globals and contexts by ref where possible
uses ai
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* fix doc link for controller
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* remove unnecessary comment
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* change update_backpressure to be a method of the writablestream
uses ai
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* rename writer method that resolve closed and ready promise for clarity
uses ai
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* add comments for steps in peek queue value
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* fix doc link for the abort algorihtm fulfillment handler
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* fix step doc and variable name in abort algo rejection handler
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* Add must_root to pending abort request
Co-authored-by: Josh Matthews <josh@joshmatthews.net>
Signed-off-by: Gregory Terzian <2792687+gterzian@users.noreply.github.com>
* limit visibility to crate for has_operations_marked_inflight
Co-authored-by: Josh Matthews <josh@joshmatthews.net>
Signed-off-by: Gregory Terzian <2792687+gterzian@users.noreply.github.com>
* limit visibility to crate for get_stored_error
Co-authored-by: Josh Matthews <josh@joshmatthews.net>
Signed-off-by: Gregory Terzian <2792687+gterzian@users.noreply.github.com>
* remove potention re-borrow risk in reject loop on write requests in finish_erroring
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* remove potential re-borrow risk when taking pending abort request in finish_erroring
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* remove potential re-borrow risk when taking close request in reject_close_and_closed_promise_if_needed
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* remove re-borrow risks in finish_in_flight_close
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* remove re-borrow risk on in_flight_close_request in finish_in_flight_close_with_error
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* remove unnecessary clone of of reason in abort
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* fix condition on backpressure and a writable state in close
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* limit visibility to crate for update_backpressure
Co-authored-by: Josh Matthews <josh@joshmatthews.net>
Signed-off-by: Gregory Terzian <2792687+gterzian@users.noreply.github.com>
* remove mutability of reason in abort workflow
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* remove unnecessary use of ignore_malloc_size_of around Dom in controller
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* fix ignore malloc size of comment for strategy size
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* reduce visibility of public methods to crate in controller
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* remove use of JS_GetPendingException in controller get_chunk_size
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* return early on error in write
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* use is_some_and in assertion that stream.witer is writer in release
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* root pending abort request
uses ai
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
* fix mutable re-borrow risk in writer
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
---------
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
Signed-off-by: Gregory Terzian <2792687+gterzian@users.noreply.github.com>
Co-authored-by: Josh Matthews <josh@joshmatthews.net>
2025-02-19 13:02:14 +00:00
Mukilan Thiyagarajan
56840e0a35
script: add skeleton implementation of FontFace
API ( #35262 )
...
This patch implements the `FontFace` interface, but with some caveats
1. The interface is only exposed on `Window`. Support for Workers will
be handled in the future.
2. The concept of `css-connected` `FontFace` is not implemented, so
`@font-face` rules in stylesheets will not be represented in the DOM.
3. The constructor only supports using `url()` strings as source
and `ArrayBuffer` and `ArrayBufferView` are not supported yet.
A skeleton implementation of the `load` method of `FontFaceSet` is also
implemented in this patch. The intention is to support some web pages
that don't load without this method.
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
2025-02-19 05:50:01 +00:00
Jason Tsai
22c3a63737
feat: add Notification
Web API binding ( #34842 )
...
* feat: add Notification Web API binding
Signed-off-by: Jason Tsai <git@pews.dev>
* chore: update spec link
Signed-off-by: Jason Tsai <git@pews.dev>
* chore: fix clippy
Signed-off-by: Jason Tsai <git@pews.dev>
* fix: index overflow
Signed-off-by: Jason Tsai <git@pews.dev>
* test(tidy): add notification WebIDL standard URL
Signed-off-by: Jason Tsai <git@pews.dev>
* fix: allow crown::unrooted_must_root
Signed-off-by: Jason Tsai <git@pews.dev>
* implement GetPermission
Signed-off-by: Jason Tsai <git@pews.dev>
* fix silent type
Signed-off-by: Jason Tsai <git@pews.dev>
* add all properties
Signed-off-by: Jason Tsai <git@pews.dev>
* test: add Notification to global
Signed-off-by: Jason Tsai <git@pews.dev>
* chore: update wpt manifest and fix clippy
Signed-off-by: Jason Tsai <git@pews.dev>
* test: temp skip notifications
Signed-off-by: Jason Tsai <git@pews.dev>
* add vibration and apply suggestions
Signed-off-by: Jason Tsai <git@pews.dev>
* partially implement RequestPermission
Signed-off-by: Jason Tsai <git@pews.dev>
* call Permission request permission algorithm
Signed-off-by: Jason Tsai <git@pews.dev>
* chore: pub crate Notification
Signed-off-by: Jason Tsai <git@pews.dev>
* chore: fix clippy
Signed-off-by: Jason Tsai <git@pews.dev>
* chore: crown attribute
Signed-off-by: Jason Tsai <git@pews.dev>
* fix part of suggestions
Signed-off-by: Jason Tsai <git@pews.dev>
* fix: store private `Action` structure
Signed-off-by: Jason Tsai <git@pews.dev>
* chore: fix typo
Signed-off-by: Jason Tsai <git@pews.dev>
* fix: serialize images URL
Signed-off-by: Jason Tsai <git@pews.dev>
* fix: use globalscope as environment settings object
Signed-off-by: Jason Tsai <git@pews.dev>
* chore: add pref `dom_notification_enabled` and default to disabled
Signed-off-by: Jason Tsai <git@pews.dev>
* fix: use `descriptor_permission_state`
Signed-off-by: Jason Tsai <git@pews.dev>
* apply suggestions
Signed-off-by: Jason Tsai <git@pews.dev>
Co-authored-by: Josh Matthews <josh@joshmatthews.net>
* test: remove passed meta
Signed-off-by: Jason Tsai <git@pews.dev>
* test: enable notification prefs in mozilla tests
Signed-off-by: Jason Tsai <git@pews.dev>
---------
Signed-off-by: Jason Tsai <git@pews.dev>
Co-authored-by: Josh Matthews <josh@joshmatthews.net>
2025-02-18 16:56:57 +00:00
shanehandley
5ab3641a8e
script: implement HTMLHyperlinkElementUtils for HTMLAreaElement ( #35482 )
...
This makes some common functionality in HTMLAreaElement and
HTMLAnchorElement shared code.
Signed-off-by: Shane Handley <shanehandley@fastmail.com>
2025-02-16 09:54:31 +00:00
Kingsley Yung
b4f48c561b
script: Take away Fallible from new_resolved and new_rejected ( #35473 )
...
* script: Take away Fallible from new_resolved and new_rejected
Both Promise::new_resolved and new_rejected only return `Ok`. We don't
need them to be fallible. Simply return `Rc<Promise>`, instead of
`Fallible<Rc<Promise>>`. Also, clean up relevant code.
Signed-off-by: Kingsley Yung <kingsley@kkoyung.dev>
* script: pull_algorithm becomes infallible
The method pull_algorithm only returns `Some(Ok(_))`, which means it is
infallible. Clean up the returned type.
Signed-off-by: Kingsley Yung <kingsley@kkoyung.dev>
* script: generic_initialize becomes infallible
The method generic_initialize only returns `Ok(())`, which means it is
infallible. Clean up the returned type.
Signed-off-by: Kingsley Yung <kingsley@kkoyung.dev>
---------
Signed-off-by: Kingsley Yung <kingsley@kkoyung.dev>
2025-02-15 21:29:34 +00:00
Steven Novaryo
becd097585
dom: IntersectionObserver initialization ( #35314 )
...
* Add internal slot definition
Signed-off-by: stevennovaryo <steven.novaryo@gmail.com>
* Add initialization for new IntersectionObserver
Signed-off-by: stevennovaryo <steven.novaryo@gmail.com>
* Move observer initialization
Signed-off-by: stevennovaryo <steven.novaryo@gmail.com>
* Update WPT tests
Signed-off-by: stevennovaryo <steven.novaryo@gmail.com>
* Make a copy of style IntersectionObserverRootMargin
Signed-off-by: stevennovaryo <steven.novaryo@gmail.com>
* Move initialization to account for rooted expression
Signed-off-by: stevennovaryo <steven.novaryo@gmail.com>
* Fix some fields typing
Signed-off-by: stevennovaryo <steven.novaryo@gmail.com>
* Impl rest of IntersectionObserver interface
Signed-off-by: stevennovaryo <steven.novaryo@gmail.com>
* Fix tidy issue
Signed-off-by: stevennovaryo <steven.novaryo@gmail.com>
* Apply types logic and tidy fix from suggestions
Signed-off-by: stevennovaryo <steven.novaryo@gmail.com>
* Add allow unrooted for add registration to element
Signed-off-by: stevennovaryo <steven.novaryo@gmail.com>
---------
Signed-off-by: stevennovaryo <steven.novaryo@gmail.com>
2025-02-13 07:47:29 +00:00
Josh Matthews
cb3ecd4417
bindings: Support non-object this values for callbacks. ( #35427 )
...
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
2025-02-12 05:41:00 +00:00
Martin Robinson
f51a5661f8
libservo: Flesh out permissions API ( #35396 )
...
- Update the script crate to better reflect the modern Permission
specifcation -- removing the necessity for an `Insecure` variant of
the permissions prompt.
- Have all allow/deny type requests in the internal API use an
`AllowOrDeny` enum for clarity.
- Expose `PermissionsRequest` and `PermissionFeature` data types to the
API and use them in the delegate method.
- Update both servoshell implementations to use the API.
Signed-off-by: Martin Robinson <mrobinson@igalia.com>
Co-authored-by: Mukilan Thiyagarajan <mukilan@igalia.com>
2025-02-10 15:50:33 +00:00
Josh Matthews
2bd96633d4
Make generated proxy handlers and DOM object hooks generic ( #35292 )
...
* script: Make DOM proxy handlers generic over DOM types.
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
* script: Make finalize and trace hooks generic over DOM types.
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
---------
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
2025-02-05 12:51:34 +00:00
Josh Matthews
c0cef69108
Move more foundational types to script_bindings ( #35280 )
...
* script: Move DOMClass to script_bindings.
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
* script: Move DOMJSClass and get_dom_class to script_bindings.
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
* script: Move Castable/DerivedFrom/IDLInterface to script_bindings.
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
---------
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
2025-02-04 10:36:30 +00:00
Simon Wülker
eaaad757e8
Specify C ABI for generated extern functions in CodegenRust.py ( #35278 )
...
Extern functions without an explicit abi are deprecated
in future versions of rust.
Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>
2025-02-04 08:40:46 +00:00
Josh Matthews
c94ac5bccb
Move various reflector types and traits to script_bindings ( #35279 )
...
* script: Move Reflector to script_bindings.
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
* script: Extract global() helper from DomObject into new trait. Move DomObject and related traits to script_bindings.
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
---------
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
2025-02-04 06:58:08 +00:00
shanehandley
938baf6bf3
script: Implement the Bytes() method on Request and Response ( #35250 )
...
* Implement the Bytes() method on Request and Response
Signed-off-by: Shane Handley <shanehandley@fastmail.com>
* avoid unsafe code during buffer creation
Signed-off-by: Shane Handley <shanehandley@fastmail.com>
---------
Signed-off-by: Shane Handley <shanehandley@fastmail.com>
2025-02-02 07:49:48 +00:00
Josh Matthews
d5d7b0d34f
Make generated bindings generic over DOM types ( #35169 )
...
* bindings: Start making generated bindings methods generic over DOM trait.
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
* bindings: Make binding initialization generic over the DOM types trait.
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
* bindings: Start making proxyhandler code generic over DOM types.
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
---------
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
2025-01-25 05:08:49 +00:00
Josh Matthews
af8d7c2de7
script: Move code generation and webidl files to new script_bindings crate. ( #35157 )
...
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
2025-01-24 20:47:43 +00:00