From 8963e62a5e34555afacdd837c8bd4e527f15d343 Mon Sep 17 00:00:00 2001 From: Tim Ledbetter Date: Tue, 7 Jan 2025 10:08:14 +0000 Subject: [PATCH] LibWeb: Add a time origin property for all ESOs This acts as a baseline for performance related timestamps. --- .../HTML/Scripting/EnvironmentSettingsSnapshot.cpp | 2 +- .../HTML/Scripting/EnvironmentSettingsSnapshot.h | 2 ++ Libraries/LibWeb/HTML/Scripting/Environments.h | 3 +++ .../Scripting/SerializedEnvironmentSettingsObject.cpp | 2 ++ .../Scripting/SerializedEnvironmentSettingsObject.h | 1 + .../HTML/Scripting/WindowEnvironmentSettingsObject.cpp | 7 +++++++ .../HTML/Scripting/WindowEnvironmentSettingsObject.h | 1 + .../HTML/Scripting/WorkerEnvironmentSettingsObject.cpp | 10 +++++++--- .../HTML/Scripting/WorkerEnvironmentSettingsObject.h | 6 +++++- 9 files changed, 29 insertions(+), 5 deletions(-) diff --git a/Libraries/LibWeb/HTML/Scripting/EnvironmentSettingsSnapshot.cpp b/Libraries/LibWeb/HTML/Scripting/EnvironmentSettingsSnapshot.cpp index 7ea34b4b3cb..c0998753fd8 100644 --- a/Libraries/LibWeb/HTML/Scripting/EnvironmentSettingsSnapshot.cpp +++ b/Libraries/LibWeb/HTML/Scripting/EnvironmentSettingsSnapshot.cpp @@ -16,12 +16,12 @@ EnvironmentSettingsSnapshot::EnvironmentSettingsSnapshot(NonnullOwnPtrid = serialized_settings.id; this->creation_url = serialized_settings.creation_url; this->top_level_creation_url = serialized_settings.top_level_creation_url; - this->top_level_creation_url = serialized_settings.top_level_creation_url; } // Out of line to ensure this class has a key function diff --git a/Libraries/LibWeb/HTML/Scripting/EnvironmentSettingsSnapshot.h b/Libraries/LibWeb/HTML/Scripting/EnvironmentSettingsSnapshot.h index 9a32fca23de..bb0e97e68b7 100644 --- a/Libraries/LibWeb/HTML/Scripting/EnvironmentSettingsSnapshot.h +++ b/Libraries/LibWeb/HTML/Scripting/EnvironmentSettingsSnapshot.h @@ -28,12 +28,14 @@ public: URL::Origin origin() const override { return m_origin; } PolicyContainer policy_container() const override { return m_policy_container; } CanUseCrossOriginIsolatedAPIs cross_origin_isolated_capability() const override { return CanUseCrossOriginIsolatedAPIs::No; } + double time_origin() const override { return m_time_origin; } private: String m_api_url_character_encoding; URL::URL m_url; URL::Origin m_origin; HTML::PolicyContainer m_policy_container; + double m_time_origin { 0 }; }; } diff --git a/Libraries/LibWeb/HTML/Scripting/Environments.h b/Libraries/LibWeb/HTML/Scripting/Environments.h index 532d1dc36d7..4757942f33a 100644 --- a/Libraries/LibWeb/HTML/Scripting/Environments.h +++ b/Libraries/LibWeb/HTML/Scripting/Environments.h @@ -87,6 +87,9 @@ public: // https://html.spec.whatwg.org/multipage/webappapis.html#concept-settings-object-cross-origin-isolated-capability virtual CanUseCrossOriginIsolatedAPIs cross_origin_isolated_capability() const = 0; + // https://html.spec.whatwg.org/multipage/webappapis.html#concept-settings-object-time-origin + virtual double time_origin() const = 0; + URL::URL parse_url(StringView); URL::URL encoding_parse_url(StringView); Optional encoding_parse_and_serialize_url(StringView); diff --git a/Libraries/LibWeb/HTML/Scripting/SerializedEnvironmentSettingsObject.cpp b/Libraries/LibWeb/HTML/Scripting/SerializedEnvironmentSettingsObject.cpp index 02acfefc343..1365a06f180 100644 --- a/Libraries/LibWeb/HTML/Scripting/SerializedEnvironmentSettingsObject.cpp +++ b/Libraries/LibWeb/HTML/Scripting/SerializedEnvironmentSettingsObject.cpp @@ -22,6 +22,7 @@ ErrorOr encode(Encoder& encoder, Web::HTML::SerializedEnvironmentSettingsO TRY(encoder.encode(object.origin)); TRY(encoder.encode(object.policy_container)); TRY(encoder.encode(object.cross_origin_isolated_capability)); + TRY(encoder.encode(object.time_origin)); return {}; } @@ -40,6 +41,7 @@ ErrorOr decode(Decoder& decoder) object.origin = TRY(decoder.decode()); object.policy_container = TRY(decoder.decode()); object.cross_origin_isolated_capability = TRY(decoder.decode()); + object.time_origin = TRY(decoder.decode()); return object; } diff --git a/Libraries/LibWeb/HTML/Scripting/SerializedEnvironmentSettingsObject.h b/Libraries/LibWeb/HTML/Scripting/SerializedEnvironmentSettingsObject.h index 6e107490bd1..fb03d051d67 100644 --- a/Libraries/LibWeb/HTML/Scripting/SerializedEnvironmentSettingsObject.h +++ b/Libraries/LibWeb/HTML/Scripting/SerializedEnvironmentSettingsObject.h @@ -30,6 +30,7 @@ struct SerializedEnvironmentSettingsObject { URL::Origin origin; PolicyContainer policy_container; CanUseCrossOriginIsolatedAPIs cross_origin_isolated_capability; + double time_origin; }; } diff --git a/Libraries/LibWeb/HTML/Scripting/WindowEnvironmentSettingsObject.cpp b/Libraries/LibWeb/HTML/Scripting/WindowEnvironmentSettingsObject.cpp index 58de96d361e..6e4f7b9f28d 100644 --- a/Libraries/LibWeb/HTML/Scripting/WindowEnvironmentSettingsObject.cpp +++ b/Libraries/LibWeb/HTML/Scripting/WindowEnvironmentSettingsObject.cpp @@ -117,6 +117,13 @@ PolicyContainer WindowEnvironmentSettingsObject::policy_container() const return m_window->associated_document().policy_container(); } +// https://html.spec.whatwg.org/multipage/nav-history-apis.html#script-settings-for-window-objects:concept-settings-object-time-origin +double WindowEnvironmentSettingsObject::time_origin() const +{ + // Return window's associated Document's load timing info's navigation start time. + return m_window->associated_document().load_timing_info().navigation_start_time; +} + // https://html.spec.whatwg.org/multipage/window-object.html#script-settings-for-window-objects:concept-settings-object-cross-origin-isolated-capability CanUseCrossOriginIsolatedAPIs WindowEnvironmentSettingsObject::cross_origin_isolated_capability() const { diff --git a/Libraries/LibWeb/HTML/Scripting/WindowEnvironmentSettingsObject.h b/Libraries/LibWeb/HTML/Scripting/WindowEnvironmentSettingsObject.h index 030cd8d8fc0..8dab2734d65 100644 --- a/Libraries/LibWeb/HTML/Scripting/WindowEnvironmentSettingsObject.h +++ b/Libraries/LibWeb/HTML/Scripting/WindowEnvironmentSettingsObject.h @@ -26,6 +26,7 @@ public: virtual URL::Origin origin() const override; virtual PolicyContainer policy_container() const override; virtual CanUseCrossOriginIsolatedAPIs cross_origin_isolated_capability() const override; + virtual double time_origin() const override; private: WindowEnvironmentSettingsObject(Window&, NonnullOwnPtr); diff --git a/Libraries/LibWeb/HTML/Scripting/WorkerEnvironmentSettingsObject.cpp b/Libraries/LibWeb/HTML/Scripting/WorkerEnvironmentSettingsObject.cpp index b23596ed527..d6f6aef0d86 100644 --- a/Libraries/LibWeb/HTML/Scripting/WorkerEnvironmentSettingsObject.cpp +++ b/Libraries/LibWeb/HTML/Scripting/WorkerEnvironmentSettingsObject.cpp @@ -18,8 +18,6 @@ GC_DEFINE_ALLOCATOR(WorkerEnvironmentSettingsObject); // https://html.spec.whatwg.org/multipage/workers.html#set-up-a-worker-environment-settings-object GC::Ref WorkerEnvironmentSettingsObject::setup(GC::Ref page, NonnullOwnPtr execution_context, SerializedEnvironmentSettingsObject const& outside_settings, HighResolutionTime::DOMHighResTimeStamp unsafe_worker_creation_time) { - (void)unsafe_worker_creation_time; - // 1. Let inherited origin be outside settings's origin. auto inherited_origin = outside_settings.origin; @@ -32,7 +30,7 @@ GC::Ref WorkerEnvironmentSettingsObject::setup( // 4. Let settings object be a new environment settings object whose algorithms are defined as follows: // NOTE: See the functions defined for this class. - auto settings_object = realm->create(move(execution_context), worker); + auto settings_object = realm->create(move(execution_context), worker, unsafe_worker_creation_time); settings_object->target_browsing_context = nullptr; settings_object->m_origin = move(inherited_origin); @@ -80,6 +78,12 @@ CanUseCrossOriginIsolatedAPIs WorkerEnvironmentSettingsObject::cross_origin_isol return CanUseCrossOriginIsolatedAPIs::No; } +double WorkerEnvironmentSettingsObject::time_origin() const +{ + // Return the result of coarsening unsafeWorkerCreationTime with worker global scope's cross-origin isolated capability. + return HighResolutionTime::coarsen_time(m_unsafe_worker_creation_time, cross_origin_isolated_capability() == CanUseCrossOriginIsolatedAPIs::Yes); +} + void WorkerEnvironmentSettingsObject::visit_edges(JS::Cell::Visitor& visitor) { Base::visit_edges(visitor); diff --git a/Libraries/LibWeb/HTML/Scripting/WorkerEnvironmentSettingsObject.h b/Libraries/LibWeb/HTML/Scripting/WorkerEnvironmentSettingsObject.h index ade515050d5..a160a8a3173 100644 --- a/Libraries/LibWeb/HTML/Scripting/WorkerEnvironmentSettingsObject.h +++ b/Libraries/LibWeb/HTML/Scripting/WorkerEnvironmentSettingsObject.h @@ -18,9 +18,10 @@ class WorkerEnvironmentSettingsObject final GC_DECLARE_ALLOCATOR(WorkerEnvironmentSettingsObject); public: - WorkerEnvironmentSettingsObject(NonnullOwnPtr execution_context, GC::Ref global_scope) + WorkerEnvironmentSettingsObject(NonnullOwnPtr execution_context, GC::Ref global_scope, HighResolutionTime::DOMHighResTimeStamp unsafe_worker_creation_time) : EnvironmentSettingsObject(move(execution_context)) , m_global_scope(global_scope) + , m_unsafe_worker_creation_time(unsafe_worker_creation_time) { } @@ -34,6 +35,7 @@ public: URL::Origin origin() const override; PolicyContainer policy_container() const override; CanUseCrossOriginIsolatedAPIs cross_origin_isolated_capability() const override; + double time_origin() const override; private: virtual void visit_edges(JS::Cell::Visitor&) override; @@ -42,6 +44,8 @@ private: URL::Origin m_origin; GC::Ref m_global_scope; + + HighResolutionTime::DOMHighResTimeStamp m_unsafe_worker_creation_time { 0 }; }; }