From f0f2009170839b40f3127f427fabcd202b7259ed Mon Sep 17 00:00:00 2001 From: Alex M Date: Mon, 28 Feb 2022 09:50:11 -0400 Subject: [PATCH] LibWeb: Add origin property to window object --- .../LibWeb/Bindings/WindowObject.cpp | 8 ++++++ .../Libraries/LibWeb/Bindings/WindowObject.h | 1 + Userland/Libraries/LibWeb/Origin.h | 26 +++++++++++++++++++ 3 files changed, 35 insertions(+) diff --git a/Userland/Libraries/LibWeb/Bindings/WindowObject.cpp b/Userland/Libraries/LibWeb/Bindings/WindowObject.cpp index 8e88543733..123d25ff6e 100644 --- a/Userland/Libraries/LibWeb/Bindings/WindowObject.cpp +++ b/Userland/Libraries/LibWeb/Bindings/WindowObject.cpp @@ -115,6 +115,7 @@ void WindowObject::initialize_global_object() define_direct_property("CSS", heap().allocate(*this, *this), 0); define_native_accessor("localStorage", local_storage_getter, {}, attr); + define_native_accessor("origin", origin_getter, {}, attr); // Legacy define_native_accessor("event", event_getter, event_setter, JS::Attribute::Enumerable); @@ -651,6 +652,13 @@ JS_DEFINE_NATIVE_FUNCTION(WindowObject::post_message) return JS::js_undefined(); } +// https://html.spec.whatwg.org/multipage/webappapis.html#dom-origin +JS_DEFINE_NATIVE_FUNCTION(WindowObject::origin_getter) +{ + auto* impl = TRY(impl_from(vm, global_object)); + return JS::js_string(vm, impl->associated_document().origin().serialize()); +} + JS_DEFINE_NATIVE_FUNCTION(WindowObject::local_storage_getter) { auto* impl = TRY(impl_from(vm, global_object)); diff --git a/Userland/Libraries/LibWeb/Bindings/WindowObject.h b/Userland/Libraries/LibWeb/Bindings/WindowObject.h index 645d2992f0..008c5f993d 100644 --- a/Userland/Libraries/LibWeb/Bindings/WindowObject.h +++ b/Userland/Libraries/LibWeb/Bindings/WindowObject.h @@ -97,6 +97,7 @@ private: JS_DECLARE_NATIVE_FUNCTION(post_message); JS_DECLARE_NATIVE_FUNCTION(local_storage_getter); + JS_DECLARE_NATIVE_FUNCTION(origin_getter); JS_DECLARE_NATIVE_FUNCTION(alert); JS_DECLARE_NATIVE_FUNCTION(confirm); diff --git a/Userland/Libraries/LibWeb/Origin.h b/Userland/Libraries/LibWeb/Origin.h index d40555efa6..f22c888669 100644 --- a/Userland/Libraries/LibWeb/Origin.h +++ b/Userland/Libraries/LibWeb/Origin.h @@ -66,6 +66,32 @@ public: return false; } + // https://html.spec.whatwg.org/multipage/origin.html#ascii-serialisation-of-an-origin + String serialize() + { + // 1. If origin is an opaque origin, then return "null" + if (is_opaque()) + return "null"; + + // 2. Otherwise, let result be origin's scheme. + StringBuilder result; + result.append(protocol()); + + // 3. Append "://" to result. + result.append("://"); + + // 4. Append origin's host, serialized, to result. + result.append(host()); + + // 5. If origin's port is non-null, append a U+003A COLON character (:), and origin's port, serialized, to result. + if (port() != 0) { + result.append(":"); + result.append(String::number(port())); + } + // 6. Return result + return result.to_string(); + } + bool operator==(Origin const& other) const { return is_same_origin(other); } bool operator!=(Origin const& other) const { return !is_same_origin(other); }