Skip to content

Commit 68e83d0

Browse files
committed
LibWeb: Add support for interfaces being exposed for shadow realm
1 parent 48ff50a commit 68e83d0

File tree

7 files changed

+31
-8
lines changed

7 files changed

+31
-8
lines changed

Meta/CMake/libweb_generators.cmake

+3
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ function (generate_js_bindings target)
195195
IntrinsicDefinitions.cpp
196196
DedicatedWorkerExposedInterfaces.cpp DedicatedWorkerExposedInterfaces.h
197197
SharedWorkerExposedInterfaces.cpp SharedWorkerExposedInterfaces.h
198+
ShadowRealmExposedInterfaces.cpp ShadowRealmExposedInterfaces.h
198199
WindowExposedInterfaces.cpp WindowExposedInterfaces.h)
199200
list(TRANSFORM exposed_interface_sources PREPEND "Bindings/")
200201
add_custom_command(
@@ -206,6 +207,8 @@ function (generate_js_bindings target)
206207
COMMAND "${CMAKE_COMMAND}" -E copy_if_different tmp/DedicatedWorkerExposedInterfaces.cpp "Bindings/DedicatedWorkerExposedInterfaces.cpp"
207208
COMMAND "${CMAKE_COMMAND}" -E copy_if_different tmp/SharedWorkerExposedInterfaces.h "Bindings/SharedWorkerExposedInterfaces.h"
208209
COMMAND "${CMAKE_COMMAND}" -E copy_if_different tmp/SharedWorkerExposedInterfaces.cpp "Bindings/SharedWorkerExposedInterfaces.cpp"
210+
COMMAND "${CMAKE_COMMAND}" -E copy_if_different tmp/ShadowRealmExposedInterfaces.h "Bindings/ShadowRealmExposedInterfaces.h"
211+
COMMAND "${CMAKE_COMMAND}" -E copy_if_different tmp/ShadowRealmExposedInterfaces.cpp "Bindings/ShadowRealmExposedInterfaces.cpp"
209212
COMMAND "${CMAKE_COMMAND}" -E copy_if_different tmp/WindowExposedInterfaces.h "Bindings/WindowExposedInterfaces.h"
210213
COMMAND "${CMAKE_COMMAND}" -E copy_if_different tmp/WindowExposedInterfaces.cpp "Bindings/WindowExposedInterfaces.cpp"
211214
COMMAND "${CMAKE_COMMAND}" -E remove_directory "${CMAKE_CURRENT_BINARY_DIR}/tmp"

Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateWindowOrWorkerInterfaces.cpp

+16-5
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
#include <LibIDL/Types.h>
1515
#include <LibMain/Main.h>
1616

17-
static ErrorOr<void> add_to_interface_sets(IDL::Interface&, Vector<IDL::Interface&>& intrinsics, Vector<IDL::Interface&>& window_exposed, Vector<IDL::Interface&>& dedicated_worker_exposed, Vector<IDL::Interface&>& shared_worker_exposed);
17+
static ErrorOr<void> add_to_interface_sets(IDL::Interface&, Vector<IDL::Interface&>& intrinsics, Vector<IDL::Interface&>& window_exposed, Vector<IDL::Interface&>& dedicated_worker_exposed, Vector<IDL::Interface&>& shared_worker_exposed, Vector<IDL::Interface&>& shadow_realm_exposed);
1818
static ByteString s_error_string;
1919

2020
struct LegacyConstructor {
@@ -367,6 +367,7 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
367367
Vector<IDL::Interface&> window_exposed;
368368
Vector<IDL::Interface&> dedicated_worker_exposed;
369369
Vector<IDL::Interface&> shared_worker_exposed;
370+
Vector<IDL::Interface&> shadow_realm_exposed;
370371
// TODO: service_worker_exposed
371372

372373
for (size_t i = 0; i < paths.size(); ++i) {
@@ -378,7 +379,7 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
378379
return Error::from_string_view(s_error_string.view());
379380
}
380381

381-
TRY(add_to_interface_sets(interface, intrinsics, window_exposed, dedicated_worker_exposed, shared_worker_exposed));
382+
TRY(add_to_interface_sets(interface, intrinsics, window_exposed, dedicated_worker_exposed, shared_worker_exposed, shadow_realm_exposed));
382383
parsers.append(move(parser));
383384
}
384385

@@ -387,11 +388,13 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
387388
TRY(generate_exposed_interface_header("Window"sv, output_path));
388389
TRY(generate_exposed_interface_header("DedicatedWorker"sv, output_path));
389390
TRY(generate_exposed_interface_header("SharedWorker"sv, output_path));
391+
TRY(generate_exposed_interface_header("ShadowRealm"sv, output_path));
390392
// TODO: ServiceWorkerExposed.h
391393

392394
TRY(generate_exposed_interface_implementation("Window"sv, output_path, window_exposed));
393395
TRY(generate_exposed_interface_implementation("DedicatedWorker"sv, output_path, dedicated_worker_exposed));
394396
TRY(generate_exposed_interface_implementation("SharedWorker"sv, output_path, shared_worker_exposed));
397+
TRY(generate_exposed_interface_implementation("ShadowRealm"sv, output_path, shadow_realm_exposed));
395398
// TODO: ServiceWorkerExposed.cpp
396399

397400
return 0;
@@ -404,8 +407,9 @@ enum ExposedTo {
404407
ServiceWorker = 0x4,
405408
AudioWorklet = 0x8,
406409
Window = 0x10,
407-
AllWorkers = 0xF, // FIXME: Is "AudioWorklet" a Worker? We'll assume it is for now
408-
All = 0x1F,
410+
ShadowRealm = 0x20,
411+
AllWorkers = DedicatedWorker | SharedWorker | ServiceWorker | AudioWorklet, // FIXME: Is "AudioWorklet" a Worker? We'll assume it is for now (here, and line below)
412+
All = AllWorkers | Window | ShadowRealm
409413
};
410414
AK_ENUM_BITWISE_OPERATORS(ExposedTo);
411415

@@ -436,6 +440,8 @@ static ErrorOr<ExposedTo> parse_exposure_set(IDL::Interface& interface)
436440
return ExposedTo::ServiceWorker;
437441
if (exposed == "AudioWorklet"sv)
438442
return ExposedTo::AudioWorklet;
443+
if (exposed == "ShadowRealm"sv)
444+
return ExposedTo::ShadowRealm;
439445

440446
if (exposed[0] == '(') {
441447
ExposedTo whom = Nobody;
@@ -453,6 +459,8 @@ static ErrorOr<ExposedTo> parse_exposure_set(IDL::Interface& interface)
453459
whom |= ExposedTo::ServiceWorker;
454460
} else if (candidate == "AudioWorklet"sv) {
455461
whom |= ExposedTo::AudioWorklet;
462+
} else if (candidate == "ShadowRealm"sv) {
463+
whom |= ExposedTo::ShadowRealm;
456464
} else {
457465
s_error_string = ByteString::formatted("Unknown Exposed attribute candidate {} in {} in {}", candidate, exposed, interface.name);
458466
return Error::from_string_view(s_error_string.view());
@@ -469,7 +477,7 @@ static ErrorOr<ExposedTo> parse_exposure_set(IDL::Interface& interface)
469477
return Error::from_string_view(s_error_string.view());
470478
}
471479

472-
ErrorOr<void> add_to_interface_sets(IDL::Interface& interface, Vector<IDL::Interface&>& intrinsics, Vector<IDL::Interface&>& window_exposed, Vector<IDL::Interface&>& dedicated_worker_exposed, Vector<IDL::Interface&>& shared_worker_exposed)
480+
ErrorOr<void> add_to_interface_sets(IDL::Interface& interface, Vector<IDL::Interface&>& intrinsics, Vector<IDL::Interface&>& window_exposed, Vector<IDL::Interface&>& dedicated_worker_exposed, Vector<IDL::Interface&>& shared_worker_exposed, Vector<IDL::Interface&>& shadow_realm_exposed)
473481
{
474482
// TODO: Add service worker exposed and audio worklet exposed
475483
auto whom = TRY(parse_exposure_set(interface));
@@ -485,5 +493,8 @@ ErrorOr<void> add_to_interface_sets(IDL::Interface& interface, Vector<IDL::Inter
485493
if (whom & ExposedTo::SharedWorker)
486494
shared_worker_exposed.append(interface);
487495

496+
if (whom & ExposedTo::ShadowRealm)
497+
shadow_realm_exposed.append(interface);
498+
488499
return {};
489500
}

Tests/LibWeb/Text/expected/all-window-properties.txt

-1
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,6 @@ ServiceWorkerContainer
338338
ServiceWorkerRegistration
339339
Set
340340
ShadowRealm
341-
ShadowRealmGlobalScope
342341
ShadowRoot
343342
SharedArrayBuffer
344343
SourceBuffer

Userland/Libraries/LibWeb/Bindings/MainThreadVM.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -603,6 +603,9 @@ ErrorOr<void> initialize_main_thread_vm(HTML::EventLoop::Type type)
603603
// 11. Perform ? SetDefaultGlobalBindings(realm).
604604
set_default_global_bindings(realm);
605605

606+
// NOTE: This needs to be done after initialization so that the realm has a intrinsics in it's [[HostDefined]]
607+
global_object->initialize_web_interfaces();
608+
606609
// 12. Return NormalCompletion(unused).
607610
return {};
608611
};

Userland/Libraries/LibWeb/HTML/ShadowRealmGlobalScope.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
* SPDX-License-Identifier: BSD-2-Clause
55
*/
66

7+
#include <LibWeb/Bindings/ShadowRealmExposedInterfaces.h>
78
#include <LibWeb/Bindings/ShadowRealmGlobalScopePrototype.h>
89
#include <LibWeb/HTML/ShadowRealmGlobalScope.h>
910

@@ -30,6 +31,11 @@ void ShadowRealmGlobalScope::initialize(JS::Realm&)
3031
// WEB_SET_PROTOTYPE_FOR_INTERFACE(ShadowRealmGlobalScope);
3132
}
3233

34+
void ShadowRealmGlobalScope::initialize_web_interfaces()
35+
{
36+
add_shadow_realm_exposed_interfaces(*this);
37+
}
38+
3339
void ShadowRealmGlobalScope::visit_edges(Cell::Visitor& visitor)
3440
{
3541
Base::visit_edges(visitor);

Userland/Libraries/LibWeb/HTML/ShadowRealmGlobalScope.h

+2
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ class ShadowRealmGlobalScope : public DOM::EventTarget {
2828
return *this;
2929
}
3030

31+
void initialize_web_interfaces();
32+
3133
protected:
3234
explicit ShadowRealmGlobalScope(JS::Realm&);
3335

Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
// https://whatpr.org/html/9893/webappapis.html#shadowrealmglobalscope
2-
// FIXME: This is not correct! We should not have Exposed=Window here.
3-
[Global, Exposed=Window]
2+
[Global, Exposed=ShadowRealm]
43
interface ShadowRealmGlobalScope : EventTarget {
54
readonly attribute ShadowRealmGlobalScope self;
65
};

0 commit comments

Comments
 (0)