浏览代码

LibWeb: Implement Document::make_active()

Implementation of "make active" algorithm from the spec for Document.

Co-authored-by: Andreas Kling <kling@serenityos.org>
Aliaksandr Kalenik 2 年之前
父节点
当前提交
3225c39191

+ 20 - 0
Userland/Libraries/LibWeb/DOM/Document.cpp

@@ -58,11 +58,13 @@
 #include <LibWeb/HTML/HTMLTitleElement.h>
 #include <LibWeb/HTML/HTMLTitleElement.h>
 #include <LibWeb/HTML/Location.h>
 #include <LibWeb/HTML/Location.h>
 #include <LibWeb/HTML/MessageEvent.h>
 #include <LibWeb/HTML/MessageEvent.h>
+#include <LibWeb/HTML/Navigable.h>
 #include <LibWeb/HTML/NavigationParams.h>
 #include <LibWeb/HTML/NavigationParams.h>
 #include <LibWeb/HTML/Origin.h>
 #include <LibWeb/HTML/Origin.h>
 #include <LibWeb/HTML/Parser/HTMLParser.h>
 #include <LibWeb/HTML/Parser/HTMLParser.h>
 #include <LibWeb/HTML/Scripting/ExceptionReporter.h>
 #include <LibWeb/HTML/Scripting/ExceptionReporter.h>
 #include <LibWeb/HTML/Scripting/WindowEnvironmentSettingsObject.h>
 #include <LibWeb/HTML/Scripting/WindowEnvironmentSettingsObject.h>
+#include <LibWeb/HTML/TraversableNavigable.h>
 #include <LibWeb/HTML/Window.h>
 #include <LibWeb/HTML/Window.h>
 #include <LibWeb/HTML/WindowProxy.h>
 #include <LibWeb/HTML/WindowProxy.h>
 #include <LibWeb/HighResolutionTime/TimeOrigin.h>
 #include <LibWeb/HighResolutionTime/TimeOrigin.h>
@@ -2514,4 +2516,22 @@ WebIDL::ExceptionOr<JS::NonnullGCPtr<Attr>> Document::create_attribute_ns(Deprec
     return Attr::create(*this, extracted_qualified_name);
     return Attr::create(*this, extracted_qualified_name);
 }
 }
 
 
+// https://html.spec.whatwg.org/multipage/browsing-the-web.html#make-active
+void Document::make_active()
+{
+    // 1. Let window be document's relevant global object.
+    auto& window = verify_cast<HTML::Window>(HTML::relevant_global_object(*this));
+
+    // 2. Set document's browsing context's WindowProxy's [[Window]] internal slot value to window.
+    m_browsing_context->window_proxy()->set_window(window);
+
+    // 3. Set document's visibility state to document's node navigable's traversable navigable's system visibility state.
+    if (navigable()) {
+        m_visibility_state = navigable()->traversable_navigable()->system_visibility_state();
+    }
+
+    // 4. Set window's relevant settings object's execution ready flag.
+    HTML::relevant_settings_object(window).execution_ready = true;
+}
+
 }
 }

+ 2 - 0
Userland/Libraries/LibWeb/DOM/Document.h

@@ -468,6 +468,8 @@ public:
 
 
     DeprecatedString dump_accessibility_tree_as_json();
     DeprecatedString dump_accessibility_tree_as_json();
 
 
+    void make_active();
+
 protected:
 protected:
     virtual JS::ThrowCompletionOr<void> initialize(JS::Realm&) override;
     virtual JS::ThrowCompletionOr<void> initialize(JS::Realm&) override;
     virtual void visit_edges(Cell::Visitor&) override;
     virtual void visit_edges(Cell::Visitor&) override;

+ 2 - 2
Userland/Libraries/LibWeb/HTML/WindowProxy.cpp

@@ -256,9 +256,9 @@ void WindowProxy::visit_edges(JS::Cell::Visitor& visitor)
     visitor.visit(m_window.ptr());
     visitor.visit(m_window.ptr());
 }
 }
 
 
-void WindowProxy::set_window(Badge<BrowsingContext>, JS::NonnullGCPtr<Window> window)
+void WindowProxy::set_window(JS::NonnullGCPtr<Window> window)
 {
 {
-    m_window = window;
+    m_window = move(window);
 }
 }
 
 
 JS::NonnullGCPtr<BrowsingContext> WindowProxy::associated_browsing_context() const
 JS::NonnullGCPtr<BrowsingContext> WindowProxy::associated_browsing_context() const

+ 1 - 1
Userland/Libraries/LibWeb/HTML/WindowProxy.h

@@ -32,7 +32,7 @@ public:
     virtual JS::ThrowCompletionOr<JS::MarkedVector<JS::Value>> internal_own_property_keys() const override;
     virtual JS::ThrowCompletionOr<JS::MarkedVector<JS::Value>> internal_own_property_keys() const override;
 
 
     JS::GCPtr<Window> window() const { return m_window; }
     JS::GCPtr<Window> window() const { return m_window; }
-    void set_window(Badge<BrowsingContext>, JS::NonnullGCPtr<Window>);
+    void set_window(JS::NonnullGCPtr<Window>);
 
 
     JS::NonnullGCPtr<BrowsingContext> associated_browsing_context() const;
     JS::NonnullGCPtr<BrowsingContext> associated_browsing_context() const;