LibWeb: Return a WindowProxy from document.defaultView

This aligns our implementation with the most recent specification steps.
This commit is contained in:
Tim Ledbetter 2024-09-21 06:25:26 +01:00 committed by Andreas Kling
commit 089139f09d
Notes: github-actions[bot] 2024-09-21 08:06:25 +00:00
6 changed files with 38 additions and 8 deletions

View file

@ -0,0 +1 @@
document.defaultView === window: true

View file

@ -0,0 +1,7 @@
<!DOCTYPE html>
<script src="../include.js"></script>
<script>
test(() => {
println(`document.defaultView === window: ${document.defaultView === window}`);
});
</script>

View file

@ -698,6 +698,22 @@ WebIDL::ExceptionOr<void> Document::close()
return {}; return {};
} }
// https://html.spec.whatwg.org/multipage/nav-history-apis.html#dom-document-defaultview
JS::GCPtr<HTML::WindowProxy> Document::default_view()
{
// If this's browsing context is null, then return null.
if (!browsing_context())
return {};
// 2. Return this's browsing context's WindowProxy object.
return browsing_context()->window_proxy();
}
JS::GCPtr<HTML::WindowProxy const> Document::default_view() const
{
return const_cast<Document*>(this)->default_view();
}
HTML::Origin Document::origin() const HTML::Origin Document::origin() const
{ {
return m_origin; return m_origin;

View file

@ -370,8 +370,8 @@ public:
WebIDL::ExceptionOr<JS::GCPtr<HTML::WindowProxy>> open(StringView url, StringView name, StringView features); WebIDL::ExceptionOr<JS::GCPtr<HTML::WindowProxy>> open(StringView url, StringView name, StringView features);
WebIDL::ExceptionOr<void> close(); WebIDL::ExceptionOr<void> close();
HTML::Window* default_view() { return m_window.ptr(); } JS::GCPtr<HTML::WindowProxy const> default_view() const;
HTML::Window const* default_view() const { return m_window.ptr(); } JS::GCPtr<HTML::WindowProxy> default_view();
String const& content_type() const { return m_content_type; } String const& content_type() const { return m_content_type; }
void set_content_type(String content_type) { m_content_type = move(content_type); } void set_content_type(String content_type) { m_content_type = move(content_type); }

View file

@ -48,7 +48,7 @@ interface Document : Node {
readonly attribute DOMString inputEncoding; readonly attribute DOMString inputEncoding;
readonly attribute DOMString contentType; readonly attribute DOMString contentType;
readonly attribute Window? defaultView; readonly attribute WindowProxy? defaultView;
[CEReactions] Document open(optional DOMString unused1, optional DOMString unused2); [CEReactions] Document open(optional DOMString unused1, optional DOMString unused2);
WindowProxy? open(USVString url, DOMString name, DOMString features); WindowProxy? open(USVString url, DOMString name, DOMString features);

View file

@ -1246,7 +1246,8 @@ double Element::scroll_top() const
return 0.0; return 0.0;
// 3. Let window be the value of documents defaultView attribute. // 3. Let window be the value of documents defaultView attribute.
auto* window = document.default_view(); // FIXME: The specification expects defaultView to be a Window object, but defaultView actually returns a WindowProxy object.
auto window = document.window();
// 4. If window is null, return zero and terminate these steps. // 4. If window is null, return zero and terminate these steps.
if (!window) if (!window)
@ -1276,6 +1277,7 @@ double Element::scroll_top() const
return paintable_box()->scroll_offset().y().to_double(); return paintable_box()->scroll_offset().y().to_double();
} }
// https://drafts.csswg.org/cssom-view/#dom-element-scrollleft
double Element::scroll_left() const double Element::scroll_left() const
{ {
// 1. Let document be the elements node document. // 1. Let document be the elements node document.
@ -1286,7 +1288,8 @@ double Element::scroll_left() const
return 0.0; return 0.0;
// 3. Let window be the value of documents defaultView attribute. // 3. Let window be the value of documents defaultView attribute.
auto* window = document.default_view(); // FIXME: The specification expects defaultView to be a Window object, but defaultView actually returns a WindowProxy object.
auto window = document.window();
// 4. If window is null, return zero and terminate these steps. // 4. If window is null, return zero and terminate these steps.
if (!window) if (!window)
@ -1332,7 +1335,8 @@ void Element::set_scroll_left(double x)
return; return;
// 5. Let window be the value of documents defaultView attribute. // 5. Let window be the value of documents defaultView attribute.
auto* window = document.default_view(); // FIXME: The specification expects defaultView to be a Window object, but defaultView actually returns a WindowProxy object.
auto window = document.window();
// 6. If window is null, terminate these steps. // 6. If window is null, terminate these steps.
if (!window) if (!window)
@ -1388,7 +1392,8 @@ void Element::set_scroll_top(double y)
return; return;
// 5. Let window be the value of documents defaultView attribute. // 5. Let window be the value of documents defaultView attribute.
auto* window = document.default_view(); // FIXME: The specification expects defaultView to be a Window object, but defaultView actually returns a WindowProxy object.
auto window = document.window();
// 6. If window is null, terminate these steps. // 6. If window is null, terminate these steps.
if (!window) if (!window)
@ -2347,7 +2352,8 @@ void Element::scroll(double x, double y)
return; return;
// 5. Let window be the value of documents defaultView attribute. // 5. Let window be the value of documents defaultView attribute.
auto* window = document.default_view(); // FIXME: The specification expects defaultView to be a Window object, but defaultView actually returns a WindowProxy object.
auto window = document.window();
// 6. If window is null, terminate these steps. // 6. If window is null, terminate these steps.
if (!window) if (!window)