diff --git a/Userland/Libraries/LibWeb/Bindings/LocationObject.cpp b/Userland/Libraries/LibWeb/Bindings/LocationObject.cpp index a5946d2d908..e9160e2296d 100644 --- a/Userland/Libraries/LibWeb/Bindings/LocationObject.cpp +++ b/Userland/Libraries/LibWeb/Bindings/LocationObject.cpp @@ -33,6 +33,7 @@ void LocationObject::initialize(JS::GlobalObject& global_object) define_native_accessor("port", port_getter, {}, attr); define_native_function("reload", reload, 0, JS::Attribute::Enumerable); + define_native_function("replace", replace, 1, JS::Attribute::Enumerable); } LocationObject::~LocationObject() @@ -125,6 +126,17 @@ JS_DEFINE_NATIVE_FUNCTION(LocationObject::reload) return JS::js_undefined(); } +JS_DEFINE_NATIVE_FUNCTION(LocationObject::replace) +{ + auto& window = static_cast(global_object); + auto url = vm.argument(0).to_string(global_object); + if (vm.exception()) + return {}; + // FIXME: This needs spec compliance work. + window.impl().did_call_location_replace({}, move(url)); + return JS::js_undefined(); +} + // https://html.spec.whatwg.org/multipage/history.html#location-setprototypeof JS::ThrowCompletionOr LocationObject::internal_set_prototype_of(Object* prototype) { diff --git a/Userland/Libraries/LibWeb/Bindings/LocationObject.h b/Userland/Libraries/LibWeb/Bindings/LocationObject.h index 7062c4ae257..e89d82b22e2 100644 --- a/Userland/Libraries/LibWeb/Bindings/LocationObject.h +++ b/Userland/Libraries/LibWeb/Bindings/LocationObject.h @@ -30,6 +30,7 @@ public: private: JS_DECLARE_NATIVE_FUNCTION(reload); + JS_DECLARE_NATIVE_FUNCTION(replace); JS_DECLARE_NATIVE_FUNCTION(href_getter); JS_DECLARE_NATIVE_FUNCTION(href_setter); diff --git a/Userland/Libraries/LibWeb/DOM/Window.cpp b/Userland/Libraries/LibWeb/DOM/Window.cpp index aa02decf671..79960998cf0 100644 --- a/Userland/Libraries/LibWeb/DOM/Window.cpp +++ b/Userland/Libraries/LibWeb/DOM/Window.cpp @@ -234,6 +234,15 @@ void Window::did_call_location_reload(Badge) frame->loader().load(associated_document().url(), FrameLoader::Type::Reload); } +void Window::did_call_location_replace(Badge, String url) +{ + auto* frame = associated_document().browsing_context(); + if (!frame) + return; + auto new_url = associated_document().parse_url(url); + frame->loader().load(move(new_url), FrameLoader::Type::Navigation); +} + bool Window::dispatch_event(NonnullRefPtr event) { return EventDispatcher::dispatch(*this, event, true); diff --git a/Userland/Libraries/LibWeb/DOM/Window.h b/Userland/Libraries/LibWeb/DOM/Window.h index 563afc4ed18..3ee7d723c43 100644 --- a/Userland/Libraries/LibWeb/DOM/Window.h +++ b/Userland/Libraries/LibWeb/DOM/Window.h @@ -62,6 +62,7 @@ public: void did_set_location_href(Badge, AK::URL const& new_href); void did_call_location_reload(Badge); + void did_call_location_replace(Badge, String url); Bindings::WindowObject* wrapper() { return m_wrapper; } Bindings::WindowObject const* wrapper() const { return m_wrapper; }