LibWeb: Expose crypto object to workers

This change moves the `crypto()` getter from `Window` to
`WorkerOrWindowGlobalScope`. This aligns our implementation with the
WebCrypto specification.
This commit is contained in:
Tim Ledbetter 2024-09-17 16:44:42 +01:00 committed by Andreas Kling
parent d6a31d80c0
commit 89b6cd3fb1
Notes: github-actions[bot] 2024-09-18 08:09:56 +00:00
9 changed files with 33 additions and 19 deletions

View file

@ -0,0 +1 @@
Type of self.crypto: [object Crypto]

View file

@ -0,0 +1,10 @@
<script src="../include.js"></script>
<script>
asyncTest(done => {
let work = new Worker("worker-crypto.js");
work.onmessage = (evt) => {
println(`Type of self.crypto: ${evt.data}`);
done();
};
});
</script>

View file

@ -0,0 +1 @@
postMessage(self.crypto.toString());

View file

@ -24,7 +24,6 @@
#include <LibWeb/CSS/Parser/Parser.h>
#include <LibWeb/CSS/ResolvedCSSStyleDeclaration.h>
#include <LibWeb/CSS/Screen.h>
#include <LibWeb/Crypto/Crypto.h>
#include <LibWeb/DOM/Document.h>
#include <LibWeb/DOM/Element.h>
#include <LibWeb/DOM/Event.h>
@ -120,7 +119,6 @@ void Window::visit_edges(JS::Cell::Visitor& visitor)
visitor.visit(m_current_event);
visitor.visit(m_screen);
visitor.visit(m_location);
visitor.visit(m_crypto);
visitor.visit(m_navigator);
visitor.visit(m_navigation);
visitor.visit(m_custom_element_registry);
@ -1553,16 +1551,6 @@ JS::GCPtr<Selection::Selection> Window::get_selection() const
return associated_document().get_selection();
}
// https://w3c.github.io/webcrypto/#dom-windoworworkerglobalscope-crypto
JS::NonnullGCPtr<Crypto::Crypto> Window::crypto()
{
auto& realm = this->realm();
if (!m_crypto)
m_crypto = heap().allocate<Crypto::Crypto>(realm, realm);
return JS::NonnullGCPtr { *m_crypto };
}
// https://html.spec.whatwg.org/multipage/obsolete.html#dom-window-captureevents
void Window::capture_events()
{

View file

@ -210,8 +210,6 @@ public:
JS::GCPtr<Selection::Selection> get_selection() const;
[[nodiscard]] JS::NonnullGCPtr<Crypto::Crypto> crypto();
void capture_events();
void release_events();
@ -270,7 +268,6 @@ private:
// https://html.spec.whatwg.org/multipage/webappapis.html#import-maps-allowed
bool m_import_maps_allowed { true };
JS::GCPtr<Crypto::Crypto> m_crypto;
JS::GCPtr<CSS::Screen> m_screen;
JS::GCPtr<Navigator> m_navigator;
JS::GCPtr<Location> m_location;

View file

@ -1,4 +1,3 @@
#import <Crypto/Crypto.idl>
#import <CSS/MediaQueryList.idl>
#import <CSS/Screen.idl>
#import <CSS/VisualViewport.idl>
@ -108,9 +107,6 @@ interface Window : EventTarget {
// https://w3c.github.io/selection-api/#extensions-to-window-interface
Selection? getSelection();
// https://w3c.github.io/webcrypto/#crypto-interface
[SameObject] readonly attribute Crypto crypto;
undefined captureEvents();
undefined releaseEvents();

View file

@ -15,6 +15,7 @@
#include <LibJS/Runtime/Array.h>
#include <LibTextCodec/Decoder.h>
#include <LibWeb/Bindings/MainThreadVM.h>
#include <LibWeb/Crypto/Crypto.h>
#include <LibWeb/Fetch/FetchMethod.h>
#include <LibWeb/HTML/CanvasRenderingContext2D.h>
#include <LibWeb/HTML/ErrorEvent.h>
@ -72,6 +73,7 @@ void WindowOrWorkerGlobalScopeMixin::visit_edges(JS::Cell::Visitor& visitor)
for (auto& entry : m_performance_entry_buffer_map)
entry.value.visit_edges(visitor);
visitor.visit(m_registered_event_sources);
visitor.visit(m_crypto);
}
void WindowOrWorkerGlobalScopeMixin::finalize()
@ -838,4 +840,15 @@ void WindowOrWorkerGlobalScopeMixin::report_error(JS::Value e)
}
}
// https://w3c.github.io/webcrypto/#dom-windoworworkerglobalscope-crypto
JS::NonnullGCPtr<Crypto::Crypto> WindowOrWorkerGlobalScopeMixin::crypto()
{
auto& platform_object = this_impl();
auto& realm = platform_object.realm();
if (!m_crypto)
m_crypto = platform_object.heap().allocate<Crypto::Crypto>(realm, realm);
return JS::NonnullGCPtr { *m_crypto };
}
}

View file

@ -78,6 +78,8 @@ public:
void report_error(JS::Value e);
[[nodiscard]] JS::NonnullGCPtr<Crypto::Crypto> crypto();
protected:
void initialize(JS::Realm&);
void visit_edges(JS::Cell::Visitor&);
@ -117,6 +119,8 @@ private:
mutable JS::GCPtr<JS::Object> m_supported_entry_types_array;
JS::GCPtr<Crypto::Crypto> m_crypto;
bool m_error_reporting_mode { false };
};

View file

@ -1,3 +1,4 @@
#import <Crypto/Crypto.idl>
#import <Fetch/Request.idl>
#import <Fetch/Response.idl>
#import <HighResolutionTime/Performance.idl>
@ -48,4 +49,7 @@ interface mixin WindowOrWorkerGlobalScope {
// https://w3c.github.io/IndexedDB/#factory-interface
[SameObject] readonly attribute IDBFactory indexedDB;
// https://w3c.github.io/webcrypto/#crypto-interface
[SameObject] readonly attribute Crypto crypto;
};