Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions Userland/Libraries/LibWeb/Bindings/WindowProxy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,8 +72,8 @@ JS::ThrowCompletionOr<Optional<JS::PropertyDescriptor>> WindowProxy::internal_ge
// 1. Let index be ! ToUint32(P).
auto index = property_key.as_number();

// FIXME: 2. Let maxProperties be the number of document-tree child browsing contexts of W.
size_t max_properties = 0;
// 2. Let maxProperties be the number of document-tree child browsing contexts of W.
auto max_properties = TRY(m_window->document_tree_child_browsing_context_count());

// 3. Let value be undefined.
Optional<JS::Value> value;
Expand Down Expand Up @@ -227,8 +227,8 @@ JS::ThrowCompletionOr<JS::MarkedVector<JS::Value>> WindowProxy::internal_own_pro
// 2. Let keys be a new empty List.
auto keys = JS::MarkedVector<JS::Value> { vm.heap() };

// FIXME: 3. Let maxProperties be the number of document-tree child browsing contexts of W.
size_t max_properties = 0;
// 3. Let maxProperties be the number of document-tree child browsing contexts of W.
auto max_properties = TRY(m_window->document_tree_child_browsing_context_count());

// 4. Let index be 0.
// 5. Repeat while index < maxProperties,
Expand Down
22 changes: 22 additions & 0 deletions Userland/Libraries/LibWeb/HTML/BrowsingContext.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -742,6 +742,28 @@ BrowsingContext* BrowsingContext::choose_a_browsing_context(StringView name, boo
return chosen;
}

// https://html.spec.whatwg.org/multipage/browsers.html#document-tree-child-browsing-context
size_t BrowsingContext::document_tree_child_browsing_context_count() const
{
size_t count = 0;

// A browsing context child is a document-tree child browsing context of parent if child is a child browsing context and child's container is in a document tree.
for_each_child([this, &count](BrowsingContext const& child) {
if (child.is_child_of(*this) && child.container()->in_a_document_tree())
++count;
});

return count;
}

// https://html.spec.whatwg.org/multipage/browsers.html#child-browsing-context
bool BrowsingContext::is_child_of(BrowsingContext const& parent) const
{
// A browsing context child is said to be a child browsing context of another browsing context parent,
// if child's container document is non-null and child's container document's browsing context is parent.
return container_document() && container_document()->browsing_context() == &parent;
}

// https://html.spec.whatwg.org/multipage/dom.html#still-on-its-initial-about:blank-document
bool BrowsingContext::still_on_its_initial_about_blank_document() const
{
Expand Down
4 changes: 4 additions & 0 deletions Userland/Libraries/LibWeb/HTML/BrowsingContext.h
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,10 @@ class BrowsingContext : public TreeNode<BrowsingContext> {

BrowsingContext* choose_a_browsing_context(StringView name, bool noopener);

size_t document_tree_child_browsing_context_count() const;

bool is_child_of(BrowsingContext const&) const;

HTML::BrowsingContextContainer* container() { return m_container; }
HTML::BrowsingContextContainer const* container() const { return m_container; }

Expand Down
24 changes: 24 additions & 0 deletions Userland/Libraries/LibWeb/HTML/Window.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -794,6 +794,7 @@ void Window::initialize(JS::Realm& realm)
define_native_accessor(realm, "pageXOffset", scroll_x_getter, {}, attr);
define_native_accessor(realm, "scrollY", scroll_y_getter, {}, attr);
define_native_accessor(realm, "pageYOffset", scroll_y_getter, {}, attr);
define_native_accessor(realm, "length", length_getter, {}, attr);

define_native_function(realm, "scroll", scroll, 2, attr);
define_native_function(realm, "scrollTo", scroll, 2, attr);
Expand Down Expand Up @@ -1074,6 +1075,29 @@ JS_DEFINE_NATIVE_FUNCTION(Window::btoa)
return JS::js_string(vm, move(encoded));
}

// https://html.spec.whatwg.org/multipage/window-object.html#number-of-document-tree-child-browsing-contexts
JS::ThrowCompletionOr<size_t> Window::document_tree_child_browsing_context_count() const
{
auto* impl = TRY(impl_from(vm()));

// 1. If W's browsing context is null, then return 0.
auto* this_browsing_context = impl->associated_document().browsing_context();
if (!this_browsing_context)
return 0;

// 2. Return the number of document-tree child browsing contexts of W's browsing context.
return this_browsing_context->document_tree_child_browsing_context_count();
}

// https://html.spec.whatwg.org/multipage/window-object.html#dom-length
JS_DEFINE_NATIVE_FUNCTION(Window::length_getter)
{
auto* impl = TRY(impl_from(vm));

// The length getter steps are to return the number of document-tree child browsing contexts of this.
return TRY(impl->document_tree_child_browsing_context_count());
}

// https://html.spec.whatwg.org/multipage/browsers.html#dom-top
JS_DEFINE_NATIVE_FUNCTION(Window::top_getter)
{
Expand Down
3 changes: 3 additions & 0 deletions Userland/Libraries/LibWeb/HTML/Window.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ class Window final
HTML::BrowsingContext const* browsing_context() const;
HTML::BrowsingContext* browsing_context();

JS::ThrowCompletionOr<size_t> document_tree_child_browsing_context_count() const;

void alert_impl(String const&);
bool confirm_impl(String const&);
String prompt_impl(String const&, String const&);
Expand Down Expand Up @@ -199,6 +201,7 @@ class Window final
Bindings::CrossOriginPropertyDescriptorMap& cross_origin_property_descriptor_map() { return m_cross_origin_property_descriptor_map; }

private:
JS_DECLARE_NATIVE_FUNCTION(length_getter);
JS_DECLARE_NATIVE_FUNCTION(top_getter);

JS_DECLARE_NATIVE_FUNCTION(document_getter);
Expand Down