Parcourir la source

LibWeb: Save begin/end timestamps for load and DOMContentLoaded events

Andreas Kling il y a 2 ans
Parent
commit
797d28adca

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

@@ -424,11 +424,13 @@ public:
     RefPtr<HTML::HTMLParser> active_parser();
 
     // https://html.spec.whatwg.org/multipage/dom.html#load-timing-info
-    DocumentLoadTimingInfo const& load_timing_info() { return m_load_timing_info; }
+    DocumentLoadTimingInfo& load_timing_info() { return m_load_timing_info; }
+    DocumentLoadTimingInfo const& load_timing_info() const { return m_load_timing_info; }
     void set_load_timing_info(DocumentLoadTimingInfo const& load_timing_info) { m_load_timing_info = load_timing_info; }
 
     // https://html.spec.whatwg.org/multipage/dom.html#previous-document-unload-timing
-    DocumentUnloadTimingInfo const& previous_document_unload_timing() { return m_previous_document_unload_timing; }
+    DocumentUnloadTimingInfo& previous_document_unload_timing() { return m_previous_document_unload_timing; }
+    DocumentUnloadTimingInfo const& previous_document_unload_timing() const { return m_previous_document_unload_timing; }
     void set_previous_document_unload_timing(DocumentUnloadTimingInfo const& previous_document_unload_timing) { m_previous_document_unload_timing = previous_document_unload_timing; }
 
 protected:

+ 8 - 4
Userland/Libraries/LibWeb/HTML/Parser/HTMLParser.cpp

@@ -234,14 +234,16 @@ void HTMLParser::the_end()
 
     // 6. Queue a global task on the DOM manipulation task source given the Document's relevant global object to run the following substeps:
     old_queue_global_task_with_document(HTML::Task::Source::DOMManipulation, *m_document, [document = m_document]() mutable {
-        // FIXME: 1. Set the Document's load timing info's DOM content loaded event start time to the current high resolution time given the Document's relevant global object.
+        // 1. Set the Document's load timing info's DOM content loaded event start time to the current high resolution time given the Document's relevant global object.
+        document->load_timing_info().dom_content_loaded_event_start_time = main_thread_event_loop().unsafe_shared_current_time();
 
         // 2. Fire an event named DOMContentLoaded at the Document object, with its bubbles attribute initialized to true.
         auto content_loaded_event = DOM::Event::create(document->window(), HTML::EventNames::DOMContentLoaded);
         content_loaded_event->set_bubbles(true);
         document->dispatch_event(*content_loaded_event);
 
-        // FIXME: 3. Set the Document's load timing info's DOM content loaded event end time to the current high resolution time given the Document's relevant global object.
+        // 3. Set the Document's load timing info's DOM content loaded event end time to the current high resolution time given the Document's relevant global object.
+        document->load_timing_info().dom_content_loaded_event_end_time = main_thread_event_loop().unsafe_shared_current_time();
 
         // FIXME: 4. Enable the client message queue of the ServiceWorkerContainer object whose associated service worker client is the Document object's relevant settings object.
 
@@ -271,7 +273,8 @@ void HTMLParser::the_end()
         // 3. Let window be the Document's relevant global object.
         JS::NonnullGCPtr<Window> window = document->window();
 
-        // FIXME: 4. Set the Document's load timing info's load event start time to the current high resolution time given window.
+        // 4. Set the Document's load timing info's load event start time to the current high resolution time given window.
+        document->load_timing_info().load_event_start_time = main_thread_event_loop().unsafe_shared_current_time();
 
         // 5. Fire an event named load at window, with legacy target override flag set.
         // FIXME: The legacy target override flag is currently set by a virtual override of dispatch_event()
@@ -282,7 +285,8 @@ void HTMLParser::the_end()
 
         // FIXME: 7. Set the Document object's navigation id to null.
 
-        // FIXME: 8. Set the Document's load timing info's load event end time to the current high resolution time given window.
+        // 8. Set the Document's load timing info's load event end time to the current high resolution time given window.
+        document->load_timing_info().load_event_end_time = main_thread_event_loop().unsafe_shared_current_time();
 
         // 9. Assert: Document's page showing is false.
         VERIFY(!document->page_showing());

+ 8 - 4
Userland/Libraries/LibWeb/XML/XMLDocumentBuilder.cpp

@@ -173,14 +173,16 @@ void XMLDocumentBuilder::document_end()
     }
     // Queue a global task on the DOM manipulation task source given the Document's relevant global object to run the following substeps:
     old_queue_global_task_with_document(HTML::Task::Source::DOMManipulation, m_document, [document = JS::make_handle(m_document)]() mutable {
-        // FIXME: Set the Document's load timing info's DOM content loaded event start time to the current high resolution time given the Document's relevant global object.
+        // Set the Document's load timing info's DOM content loaded event start time to the current high resolution time given the Document's relevant global object.
+        document->load_timing_info().dom_content_loaded_event_start_time = HTML::main_thread_event_loop().unsafe_shared_current_time();
 
         // Fire an event named DOMContentLoaded at the Document object, with its bubbles attribute initialized to true.
         auto content_loaded_event = DOM::Event::create(document->window(), HTML::EventNames::DOMContentLoaded);
         content_loaded_event->set_bubbles(true);
         document->dispatch_event(*content_loaded_event);
 
-        // FIXME: Set the Document's load timing info's DOM content loaded event end time to the current high resolution time given the Document's relevant global object.
+        // Set the Document's load timing info's DOM content loaded event end time to the current high resolution time given the Document's relevant global object.
+        document->load_timing_info().dom_content_loaded_event_end_time = HTML::main_thread_event_loop().unsafe_shared_current_time();
 
         // FIXME: Enable the client message queue of the ServiceWorkerContainer object whose associated service worker client is the Document object's relevant settings object.
 
@@ -209,7 +211,8 @@ void XMLDocumentBuilder::document_end()
         // Let window be the Document's relevant global object.
         JS::NonnullGCPtr<HTML::Window> window = document->window();
 
-        // FIXME: Set the Document's load timing info's load event start time to the current high resolution time given window.
+        // Set the Document's load timing info's load event start time to the current high resolution time given window.
+        document->load_timing_info().load_event_start_time = HTML::main_thread_event_loop().unsafe_shared_current_time();
 
         // Fire an event named load at window, with legacy target override flag set.
         // FIXME: The legacy target override flag is currently set by a virtual override of dispatch_event()
@@ -220,7 +223,8 @@ void XMLDocumentBuilder::document_end()
 
         // FIXME: Set the Document object's navigation id to null.
 
-        // FIXME: Set the Document's load timing info's load event end time to the current high resolution time given window.
+        // Set the Document's load timing info's load event end time to the current high resolution time given window.
+        document->load_timing_info().dom_content_loaded_event_end_time = HTML::main_thread_event_loop().unsafe_shared_current_time();
 
         // Assert: Document's page showing is false.
         VERIFY(!document->page_showing());