mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-04-21 03:55:24 +00:00
LibWeb: Add a time origin property for all ESOs
This acts as a baseline for performance related timestamps.
This commit is contained in:
parent
a8904451ff
commit
8963e62a5e
Notes:
github-actions[bot]
2025-01-27 13:54:41 +00:00
Author: https://github.com/tcl3 Commit: https://github.com/LadybirdBrowser/ladybird/commit/8963e62a5e3 Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/3341
9 changed files with 29 additions and 5 deletions
|
@ -16,12 +16,12 @@ EnvironmentSettingsSnapshot::EnvironmentSettingsSnapshot(NonnullOwnPtr<JS::Execu
|
|||
, m_url(serialized_settings.api_base_url)
|
||||
, m_origin(serialized_settings.origin)
|
||||
, m_policy_container(serialized_settings.policy_container)
|
||||
, m_time_origin(serialized_settings.time_origin)
|
||||
{
|
||||
// Why can't we put these in the init list? grandparent class members are strange it seems
|
||||
this->id = 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
|
||||
|
|
|
@ -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 };
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -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<String> encoding_parse_and_serialize_url(StringView);
|
||||
|
|
|
@ -22,6 +22,7 @@ ErrorOr<void> 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<Web::HTML::SerializedEnvironmentSettingsObject> decode(Decoder& decoder)
|
|||
object.origin = TRY(decoder.decode<URL::Origin>());
|
||||
object.policy_container = TRY(decoder.decode<Web::HTML::PolicyContainer>());
|
||||
object.cross_origin_isolated_capability = TRY(decoder.decode<Web::HTML::CanUseCrossOriginIsolatedAPIs>());
|
||||
object.time_origin = TRY(decoder.decode<double>());
|
||||
|
||||
return object;
|
||||
}
|
||||
|
|
|
@ -30,6 +30,7 @@ struct SerializedEnvironmentSettingsObject {
|
|||
URL::Origin origin;
|
||||
PolicyContainer policy_container;
|
||||
CanUseCrossOriginIsolatedAPIs cross_origin_isolated_capability;
|
||||
double time_origin;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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<JS::ExecutionContext>);
|
||||
|
|
|
@ -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> WorkerEnvironmentSettingsObject::setup(GC::Ref<Page> page, NonnullOwnPtr<JS::ExecutionContext> 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> 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<WorkerEnvironmentSettingsObject>(move(execution_context), worker);
|
||||
auto settings_object = realm->create<WorkerEnvironmentSettingsObject>(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);
|
||||
|
|
|
@ -18,9 +18,10 @@ class WorkerEnvironmentSettingsObject final
|
|||
GC_DECLARE_ALLOCATOR(WorkerEnvironmentSettingsObject);
|
||||
|
||||
public:
|
||||
WorkerEnvironmentSettingsObject(NonnullOwnPtr<JS::ExecutionContext> execution_context, GC::Ref<WorkerGlobalScope> global_scope)
|
||||
WorkerEnvironmentSettingsObject(NonnullOwnPtr<JS::ExecutionContext> execution_context, GC::Ref<WorkerGlobalScope> 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<WorkerGlobalScope> m_global_scope;
|
||||
|
||||
HighResolutionTime::DOMHighResTimeStamp m_unsafe_worker_creation_time { 0 };
|
||||
};
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue