diff --git a/Userland/Libraries/LibWeb/HTML/Window.cpp b/Userland/Libraries/LibWeb/HTML/Window.cpp index 403951ead28..066e8ff2c2f 100644 --- a/Userland/Libraries/LibWeb/HTML/Window.cpp +++ b/Userland/Libraries/LibWeb/HTML/Window.cpp @@ -867,29 +867,6 @@ JS::NonnullGCPtr Window::session_storage() return *storage; } -// https://html.spec.whatwg.org/multipage/browsers.html#dom-parent -WindowProxy* Window::parent() -{ - // 1. Let current be this Window object's browsing context. - auto* current = browsing_context(); - - // 2. If current is null, then return null. - if (!current) - return nullptr; - - // 3. If current is a child browsing context of another browsing context parent, - // then return parent's WindowProxy object. - if (current->parent()) { - return current->parent()->window_proxy(); - } - - // 4. Assert: current is a top-level browsing context. - VERIFY(current->is_top_level()); - - // 5. Return current's WindowProxy object. - return current->window_proxy(); -} - // https://html.spec.whatwg.org/multipage/structured-data.html#dom-structuredclone WebIDL::ExceptionOr Window::structured_clone_impl(JS::VM& vm, JS::Value message) { @@ -1073,7 +1050,6 @@ WebIDL::ExceptionOr Window::initialize_web_interfaces(Badge Window::top() const return browsing_context->top_level_browsing_context().window_proxy(); } +// https://html.spec.whatwg.org/multipage/nav-history-apis.html#dom-parent +JS::GCPtr Window::parent() const +{ + // 1. Let navigable be this's navigable. + auto* navigable = browsing_context(); + + // 2. If navigable is null, then return null. + if (!navigable) + return {}; + + // 3. If navigable's parent is not null, then set navigable to navigable's parent. + if (auto parent = navigable->parent()) + navigable = parent; + + // 4. Return navigable's active WindowProxy. + return navigable->window_proxy(); +} + // https://html.spec.whatwg.org/multipage/system-state.html#dom-navigator JS::NonnullGCPtr Window::navigator() const { @@ -1559,15 +1553,6 @@ size_t Window::document_tree_child_browsing_context_count() const return this_browsing_context->document_tree_child_browsing_context_count(); } -JS_DEFINE_NATIVE_FUNCTION(Window::parent_getter) -{ - auto* impl = TRY(impl_from(vm)); - auto* parent = impl->parent(); - if (!parent) - return JS::js_null(); - return parent; -} - // https://html.spec.whatwg.org/multipage/browsers.html#dom-frameelement JS_DEFINE_NATIVE_FUNCTION(Window::frame_element_getter) { diff --git a/Userland/Libraries/LibWeb/HTML/Window.h b/Userland/Libraries/LibWeb/HTML/Window.h index e75db1c3bd1..7b58ed8d05a 100644 --- a/Userland/Libraries/LibWeb/HTML/Window.h +++ b/Userland/Libraries/LibWeb/HTML/Window.h @@ -116,9 +116,6 @@ public: JS::NonnullGCPtr local_storage(); JS::NonnullGCPtr session_storage(); - // https://html.spec.whatwg.org/multipage/browsers.html#dom-parent - WindowProxy* parent(); - WebIDL::ExceptionOr structured_clone_impl(JS::VM& vm, JS::Value); void start_an_idle_period(); @@ -148,6 +145,7 @@ public: JS::NonnullGCPtr frames() const; u32 length() const; JS::GCPtr top() const; + JS::GCPtr parent() const; JS::NonnullGCPtr navigator() const; @@ -235,8 +233,6 @@ private: JS_DECLARE_NATIVE_FUNCTION(inner_width_getter); JS_DECLARE_NATIVE_FUNCTION(inner_height_getter); - JS_DECLARE_NATIVE_FUNCTION(parent_getter); - JS_DECLARE_NATIVE_FUNCTION(device_pixel_ratio_getter); JS_DECLARE_NATIVE_FUNCTION(scroll_x_getter); diff --git a/Userland/Libraries/LibWeb/HTML/Window.idl b/Userland/Libraries/LibWeb/HTML/Window.idl index b589298c799..209ba197897 100644 --- a/Userland/Libraries/LibWeb/HTML/Window.idl +++ b/Userland/Libraries/LibWeb/HTML/Window.idl @@ -18,6 +18,7 @@ interface Window : EventTarget { [Replaceable] readonly attribute WindowProxy frames; [Replaceable] readonly attribute unsigned long length; [LegacyUnforgeable] readonly attribute WindowProxy? top; + [Replaceable] readonly attribute WindowProxy? parent; // the user agent readonly attribute Navigator navigator;