Browse Source

LibWeb: Add BrowsingContext::container() to align with the spec

We already have a base class for frame elements that we call
BrowsingContextContainer. This patch makes BrowsingContext::container()
actually return one of those.

This makes us match the spec names, and also solves a FIXME about having
a shared base for <frame> and <iframe>. (We already had the shared base,
but the pointer we had there wasn't tightly typed enough.)
Andreas Kling 3 years ago
parent
commit
d1100dd6bc

+ 2 - 4
Userland/Libraries/LibWeb/Loader/FrameLoader.cpp

@@ -302,10 +302,8 @@ void FrameLoader::resource_did_load()
     else
         browsing_context().set_viewport_scroll_offset({ 0, 0 });
 
-    if (auto* host_element = browsing_context().host_element()) {
-        // FIXME: Perhaps in the future we'll have a better common base class for <frame> and <iframe>
-        verify_cast<HTML::HTMLIFrameElement>(*host_element).nested_browsing_context_did_load({});
-    }
+    if (auto* container = browsing_context().container())
+        container->nested_browsing_context_did_load({});
 
     if (auto* page = browsing_context().page())
         page->client().page_did_finish_loading(url);

+ 9 - 9
Userland/Libraries/LibWeb/Page/BrowsingContext.cpp

@@ -18,12 +18,12 @@
 
 namespace Web {
 
-BrowsingContext::BrowsingContext(Page& page, DOM::Element* host_element, BrowsingContext& top_level_browsing_context)
+BrowsingContext::BrowsingContext(Page& page, HTML::BrowsingContextContainer* container, BrowsingContext& top_level_browsing_context)
     : m_page(page)
     , m_top_level_browsing_context(top_level_browsing_context)
     , m_loader(*this)
     , m_event_handler({}, *this)
-    , m_host_element(host_element)
+    , m_container(container)
 {
     m_cursor_blink_timer = Core::Timer::construct(500, [this] {
         if (!is_focused_context())
@@ -35,8 +35,8 @@ BrowsingContext::BrowsingContext(Page& page, DOM::Element* host_element, Browsin
     });
 }
 
-BrowsingContext::BrowsingContext(DOM::Element& host_element, BrowsingContext& top_level_browsing_context)
-    : BrowsingContext(*top_level_browsing_context.page(), &host_element, top_level_browsing_context)
+BrowsingContext::BrowsingContext(HTML::BrowsingContextContainer& container, BrowsingContext& top_level_browsing_context)
+    : BrowsingContext(*top_level_browsing_context.page(), &container, top_level_browsing_context)
 {
 }
 
@@ -147,8 +147,8 @@ void BrowsingContext::set_needs_display(Gfx::IntRect const& rect)
         return;
     }
 
-    if (host_element() && host_element()->layout_node())
-        host_element()->layout_node()->set_needs_display();
+    if (container() && container()->layout_node())
+        container()->layout_node()->set_needs_display();
 }
 
 void BrowsingContext::scroll_to_anchor(String const& fragment)
@@ -199,11 +199,11 @@ Gfx::IntPoint BrowsingContext::to_top_level_position(Gfx::IntPoint const& a_posi
     for (auto* ancestor = parent(); ancestor; ancestor = ancestor->parent()) {
         if (ancestor->is_top_level())
             break;
-        if (!ancestor->host_element())
+        if (!ancestor->container())
             return {};
-        if (!ancestor->host_element()->layout_node())
+        if (!ancestor->container()->layout_node())
             return {};
-        position.translate_by(ancestor->host_element()->layout_node()->box_type_agnostic_position().to_type<int>());
+        position.translate_by(ancestor->container()->layout_node()->box_type_agnostic_position().to_type<int>());
     }
     return position;
 }

+ 7 - 6
Userland/Libraries/LibWeb/Page/BrowsingContext.h

@@ -15,6 +15,7 @@
 #include <LibGfx/Rect.h>
 #include <LibGfx/Size.h>
 #include <LibWeb/DOM/Position.h>
+#include <LibWeb/HTML/BrowsingContextContainer.h>
 #include <LibWeb/Loader/FrameLoader.h>
 #include <LibWeb/Page/EventHandler.h>
 #include <LibWeb/TreeNode.h>
@@ -23,7 +24,7 @@ namespace Web {
 
 class BrowsingContext : public TreeNode<BrowsingContext> {
 public:
-    static NonnullRefPtr<BrowsingContext> create_nested(DOM::Element& host_element, BrowsingContext& top_level_browsing_context) { return adopt_ref(*new BrowsingContext(host_element, top_level_browsing_context)); }
+    static NonnullRefPtr<BrowsingContext> create_nested(HTML::BrowsingContextContainer& container, BrowsingContext& top_level_browsing_context) { return adopt_ref(*new BrowsingContext(container, top_level_browsing_context)); }
     static NonnullRefPtr<BrowsingContext> create(Page& page) { return adopt_ref(*new BrowsingContext(page)); }
     ~BrowsingContext();
 
@@ -66,8 +67,8 @@ public:
     BrowsingContext& top_level_browsing_context() { return *m_top_level_browsing_context; }
     BrowsingContext const& top_level_browsing_context() const { return *m_top_level_browsing_context; }
 
-    DOM::Element* host_element() { return m_host_element; }
-    DOM::Element const* host_element() const { return m_host_element; }
+    HTML::BrowsingContextContainer* container() { return m_container; }
+    HTML::BrowsingContextContainer const* container() const { return m_container; }
 
     Gfx::IntPoint to_top_level_position(Gfx::IntPoint const&);
     Gfx::IntRect to_top_level_rect(Gfx::IntRect const&);
@@ -91,8 +92,8 @@ public:
     HashMap<URL, size_t> const& frame_nesting_levels() const { return m_frame_nesting_levels; }
 
 private:
-    explicit BrowsingContext(Page&, DOM::Element* host_element, BrowsingContext& top_level_browsing_context);
-    explicit BrowsingContext(DOM::Element& host_element, BrowsingContext& top_level_browsing_context);
+    explicit BrowsingContext(Page&, HTML::BrowsingContextContainer*, BrowsingContext& top_level_browsing_context);
+    explicit BrowsingContext(HTML::BrowsingContextContainer&, BrowsingContext& top_level_browsing_context);
     explicit BrowsingContext(Page&);
 
     void reset_cursor_blink_cycle();
@@ -106,7 +107,7 @@ private:
     FrameLoader m_loader;
     EventHandler m_event_handler;
 
-    WeakPtr<DOM::Element> m_host_element;
+    WeakPtr<HTML::BrowsingContextContainer> m_container;
     RefPtr<DOM::Document> m_document;
     Gfx::IntSize m_size;
     Gfx::IntPoint m_viewport_scroll_offset;