From 51c283504440f194eba2a1d67380c181cc6e45f1 Mon Sep 17 00:00:00 2001 From: Andrew Kaster Date: Wed, 23 Aug 2023 10:53:11 -0600 Subject: [PATCH] LibWeb: Add NavigationCurrentEntryChangeEvent, fired when navigating This event will be fired by Navigation when changing the current NavigationHistoryEntry. --- .../BindingsGenerator/IDLGenerators.cpp | 1 + .../Userland/Libraries/LibWeb/HTML/BUILD.gn | 1 + .../Userland/Libraries/LibWeb/idl_files.gni | 1 + Userland/Libraries/LibWeb/CMakeLists.txt | 1 + Userland/Libraries/LibWeb/Forward.h | 1 + Userland/Libraries/LibWeb/HTML/EventNames.h | 1 + .../NavigationCurrentEntryChangeEvent.cpp | 42 +++++++++++++++++++ .../HTML/NavigationCurrentEntryChangeEvent.h | 40 ++++++++++++++++++ .../NavigationCurrentEntryChangeEvent.idl | 18 ++++++++ Userland/Libraries/LibWeb/idl_files.cmake | 1 + 10 files changed, 107 insertions(+) create mode 100644 Userland/Libraries/LibWeb/HTML/NavigationCurrentEntryChangeEvent.cpp create mode 100644 Userland/Libraries/LibWeb/HTML/NavigationCurrentEntryChangeEvent.h create mode 100644 Userland/Libraries/LibWeb/HTML/NavigationCurrentEntryChangeEvent.idl diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp b/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp index 4d86f4591b..fc1d887e5c 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp @@ -44,6 +44,7 @@ static bool is_platform_object(Type const& type) "Module"sv, "MutationRecord"sv, "NamedNodeMap"sv, + "NavigationHistoryEntry"sv, "Node"sv, "Path2D"sv, "PerformanceEntry"sv, diff --git a/Meta/gn/secondary/Userland/Libraries/LibWeb/HTML/BUILD.gn b/Meta/gn/secondary/Userland/Libraries/LibWeb/HTML/BUILD.gn index 3d90480ec8..d3b288175a 100644 --- a/Meta/gn/secondary/Userland/Libraries/LibWeb/HTML/BUILD.gn +++ b/Meta/gn/secondary/Userland/Libraries/LibWeb/HTML/BUILD.gn @@ -123,6 +123,7 @@ source_set("HTML") { "MimeTypeArray.cpp", "Navigable.cpp", "NavigableContainer.cpp", + "NavigationCurrentEntryChangeEvent.cpp", "NavigationHistoryEntry.cpp", "Navigator.cpp", "NavigatorID.cpp", diff --git a/Meta/gn/secondary/Userland/Libraries/LibWeb/idl_files.gni b/Meta/gn/secondary/Userland/Libraries/LibWeb/idl_files.gni index 5a3c2aa7a8..160306da21 100644 --- a/Meta/gn/secondary/Userland/Libraries/LibWeb/idl_files.gni +++ b/Meta/gn/secondary/Userland/Libraries/LibWeb/idl_files.gni @@ -182,6 +182,7 @@ standard_idl_files = [ "//Userland/Libraries/LibWeb/HTML/MessagePort.idl", "//Userland/Libraries/LibWeb/HTML/MimeType.idl", "//Userland/Libraries/LibWeb/HTML/MimeTypeArray.idl", + "//Userland/Libraries/LibWeb/HTML/NavigationCurrentEntryChangeEvent.idl", "//Userland/Libraries/LibWeb/HTML/NavigationHistoryEntry.idl", "//Userland/Libraries/LibWeb/HTML/Navigator.idl", "//Userland/Libraries/LibWeb/HTML/PageTransitionEvent.idl", diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index 4e2af82f84..8b3750d404 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -350,6 +350,7 @@ set(SOURCES HTML/MimeTypeArray.cpp HTML/Navigable.cpp HTML/NavigableContainer.cpp + HTML/NavigationCurrentEntryChangeEvent.cpp HTML/NavigationHistoryEntry.cpp HTML/Navigator.cpp HTML/NavigatorID.cpp diff --git a/Userland/Libraries/LibWeb/Forward.h b/Userland/Libraries/LibWeb/Forward.h index 00b6adb829..dd97b1c2a2 100644 --- a/Userland/Libraries/LibWeb/Forward.h +++ b/Userland/Libraries/LibWeb/Forward.h @@ -414,6 +414,7 @@ class MimeType; class MimeTypeArray; class Navigable; class NavigableContainer; +class NavigationCurrentEntryChangeEvent; class NavigationHistoryEntry; class Navigator; struct NavigationParams; diff --git a/Userland/Libraries/LibWeb/HTML/EventNames.h b/Userland/Libraries/LibWeb/HTML/EventNames.h index c5655e3a09..71cfca226c 100644 --- a/Userland/Libraries/LibWeb/HTML/EventNames.h +++ b/Userland/Libraries/LibWeb/HTML/EventNames.h @@ -34,6 +34,7 @@ namespace Web::HTML::EventNames { __ENUMERATE_HTML_EVENT(contextmenu) \ __ENUMERATE_HTML_EVENT(copy) \ __ENUMERATE_HTML_EVENT(cuechange) \ + __ENUMERATE_HTML_EVENT(currententrychange) \ __ENUMERATE_HTML_EVENT(dispose) \ __ENUMERATE_HTML_EVENT(cut) \ __ENUMERATE_HTML_EVENT(DOMContentLoaded) \ diff --git a/Userland/Libraries/LibWeb/HTML/NavigationCurrentEntryChangeEvent.cpp b/Userland/Libraries/LibWeb/HTML/NavigationCurrentEntryChangeEvent.cpp new file mode 100644 index 0000000000..1f478a06f9 --- /dev/null +++ b/Userland/Libraries/LibWeb/HTML/NavigationCurrentEntryChangeEvent.cpp @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2023, Andrew Kaster + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include +#include +#include +#include + +namespace Web::HTML { + +JS::NonnullGCPtr NavigationCurrentEntryChangeEvent::construct_impl(JS::Realm& realm, FlyString const& event_name, NavigationCurrentEntryChangeEventInit const& event_init) +{ + return realm.heap().allocate(realm, realm, event_name, event_init); +} + +NavigationCurrentEntryChangeEvent::NavigationCurrentEntryChangeEvent(JS::Realm& realm, FlyString const& event_name, NavigationCurrentEntryChangeEventInit const& event_init) + : DOM::Event(realm, event_name, event_init) + , m_navigation_type(event_init.navigation_type) + , m_from(*event_init.from) +{ +} + +NavigationCurrentEntryChangeEvent::~NavigationCurrentEntryChangeEvent() = default; + +void NavigationCurrentEntryChangeEvent::initialize(JS::Realm& realm) +{ + Base::initialize(realm); + set_prototype(&Bindings::ensure_web_prototype(realm, "NavigationCurrentEntryChangeEvent")); +} + +void NavigationCurrentEntryChangeEvent::visit_edges(JS::Cell::Visitor& visitor) +{ + Base::visit_edges(visitor); + visitor.visit(m_from); +} + +} diff --git a/Userland/Libraries/LibWeb/HTML/NavigationCurrentEntryChangeEvent.h b/Userland/Libraries/LibWeb/HTML/NavigationCurrentEntryChangeEvent.h new file mode 100644 index 0000000000..530c4d9d5a --- /dev/null +++ b/Userland/Libraries/LibWeb/HTML/NavigationCurrentEntryChangeEvent.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2023, Andrew Kaster + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include + +namespace Web::HTML { + +struct NavigationCurrentEntryChangeEventInit : public DOM::EventInit { + Optional navigation_type = {}; + JS::GCPtr from; +}; + +class NavigationCurrentEntryChangeEvent final : public DOM::Event { + WEB_PLATFORM_OBJECT(NavigationCurrentEntryChangeEvent, DOM::Event); + +public: + [[nodiscard]] static JS::NonnullGCPtr construct_impl(JS::Realm&, FlyString const& event_name, NavigationCurrentEntryChangeEventInit const&); + + virtual ~NavigationCurrentEntryChangeEvent() override; + + Optional const& navigation_type() const { return m_navigation_type; } + JS::NonnullGCPtr from() const { return m_from; } + +private: + NavigationCurrentEntryChangeEvent(JS::Realm&, FlyString const& event_name, NavigationCurrentEntryChangeEventInit const& event_init); + + virtual void initialize(JS::Realm&) override; + virtual void visit_edges(Cell::Visitor&) override; + + Optional m_navigation_type; + JS::NonnullGCPtr m_from; +}; + +} diff --git a/Userland/Libraries/LibWeb/HTML/NavigationCurrentEntryChangeEvent.idl b/Userland/Libraries/LibWeb/HTML/NavigationCurrentEntryChangeEvent.idl new file mode 100644 index 0000000000..a663c52c5d --- /dev/null +++ b/Userland/Libraries/LibWeb/HTML/NavigationCurrentEntryChangeEvent.idl @@ -0,0 +1,18 @@ +#import +#import +#import + +// https://html.spec.whatwg.org/multipage/nav-history-apis.html#the-navigationcurrententrychangeevent-interface +[Exposed=Window, UseNewAKString] +interface NavigationCurrentEntryChangeEvent : Event { + constructor(DOMString type, NavigationCurrentEntryChangeEventInit eventInitDict); + + readonly attribute NavigationType? navigationType; + readonly attribute NavigationHistoryEntry from; +}; + +dictionary NavigationCurrentEntryChangeEventInit : EventInit { + // FIXME: Set default value of null when IDL generator supports it + NavigationType? navigationType; + required NavigationHistoryEntry from; +}; diff --git a/Userland/Libraries/LibWeb/idl_files.cmake b/Userland/Libraries/LibWeb/idl_files.cmake index a0ac9f27d2..6e8cb487f4 100644 --- a/Userland/Libraries/LibWeb/idl_files.cmake +++ b/Userland/Libraries/LibWeb/idl_files.cmake @@ -168,6 +168,7 @@ libweb_js_bindings(HTML/MessageEvent) libweb_js_bindings(HTML/MessagePort) libweb_js_bindings(HTML/MimeType) libweb_js_bindings(HTML/MimeTypeArray) +libweb_js_bindings(HTML/NavigationCurrentEntryChangeEvent) libweb_js_bindings(HTML/NavigationHistoryEntry) libweb_js_bindings(HTML/Navigator) libweb_js_bindings(HTML/PageTransitionEvent)