Browse Source

LibWeb: Implement the "close" algorithm for browsing contexts

This is used by window.close() programmatically, but of course the user
can also decide to close a top-level browsing context at any time by
closing the tab.
Andreas Kling 2 years ago
parent
commit
6c33dea6a6

+ 18 - 0
Userland/Libraries/LibWeb/HTML/BrowsingContext.cpp

@@ -1322,4 +1322,22 @@ void BrowsingContext::discard()
         parent()->remove_child(*this);
 }
 
+// https://html.spec.whatwg.org/multipage/window-object.html#close-a-browsing-context
+void BrowsingContext::close()
+{
+    VERIFY(active_document());
+
+    // FIXME: 1. If the result of calling prompt to unload with browsingContext's active document is "refuse", then return.
+
+    // 2. Unload browsingContext's active document.
+    active_document()->unload();
+
+    // 3. Remove browsingContext from the user interface (e.g., close or hide its tab in a tabbed browser).
+    if (m_page)
+        m_page->client().page_did_close_browsing_context(*this);
+
+    // 4. Discard browsingContext.
+    discard();
+}
+
 }

+ 3 - 0
Userland/Libraries/LibWeb/HTML/BrowsingContext.h

@@ -168,6 +168,9 @@ public:
     // https://html.spec.whatwg.org/multipage/window-object.html#a-browsing-context-is-discarded
     void discard();
 
+    // https://html.spec.whatwg.org/multipage/window-object.html#close-a-browsing-context
+    void close();
+
 private:
     explicit BrowsingContext(Page&, HTML::BrowsingContextContainer*);
 

+ 1 - 0
Userland/Libraries/LibWeb/Page/Page.h

@@ -110,6 +110,7 @@ public:
     virtual String page_did_request_cookie(const AK::URL&, Cookie::Source) { return {}; }
     virtual void page_did_set_cookie(const AK::URL&, Cookie::ParsedCookie const&, Cookie::Source) { }
     virtual void page_did_update_resource_count(i32) { }
+    virtual void page_did_close_browsing_context(HTML::BrowsingContext const&) { }
 
     virtual void request_file(NonnullRefPtr<FileRequest>&) = 0;