summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator.cpp23
-rw-r--r--Userland/Libraries/LibWeb/Bindings/WindowObject.cpp13
-rw-r--r--Userland/Libraries/LibWeb/Bindings/WindowObject.h1
-rw-r--r--Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h6
-rw-r--r--Userland/Libraries/LibWeb/CMakeLists.txt2
-rw-r--r--Userland/Libraries/LibWeb/DOM/Window.cpp8
-rw-r--r--Userland/Libraries/LibWeb/DOM/Window.h2
-rw-r--r--Userland/Libraries/LibWeb/Forward.h5
-rw-r--r--Userland/Libraries/LibWeb/Selection/Selection.cpp135
-rw-r--r--Userland/Libraries/LibWeb/Selection/Selection.h48
-rw-r--r--Userland/Libraries/LibWeb/Selection/Selection.idl27
11 files changed, 269 insertions, 1 deletions
diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator.cpp b/Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator.cpp
index 4f9fb2615b..3d850c7260 100644
--- a/Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator.cpp
+++ b/Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator.cpp
@@ -740,7 +740,7 @@ int main(int argc, char** argv)
auto interface = IDL::parse_interface(path, data, import_base_path);
- if (namespace_.is_one_of("Crypto", "CSS", "DOM", "HTML", "UIEvents", "Geometry", "HighResolutionTime", "NavigationTiming", "RequestIdleCallback", "SVG", "XHR", "URL")) {
+ if (namespace_.is_one_of("Crypto", "CSS", "DOM", "HTML", "UIEvents", "Geometry", "HighResolutionTime", "NavigationTiming", "RequestIdleCallback", "SVG", "Selection", "XHR", "URL")) {
StringBuilder builder;
builder.append(namespace_);
builder.append("::");
@@ -862,6 +862,10 @@ static bool is_wrappable_type(IDL::Type const& type)
return true;
if (type.name == "Window")
return true;
+ if (type.name == "Range")
+ return true;
+ if (type.name == "Selection")
+ return true;
return false;
}
@@ -1387,6 +1391,8 @@ static void generate_header(IDL::Interface const& interface)
# include <LibWeb/RequestIdleCallback/@name@.h>
#elif __has_include(<LibWeb/SVG/@name@.h>)
# include <LibWeb/SVG/@name@.h>
+#elif __has_include(<LibWeb/Selection/@name@.h>)
+# include <LibWeb/Selection/@name@.h>
#elif __has_include(<LibWeb/XHR/@name@.h>)
# include <LibWeb/XHR/@name@.h>
#elif __has_include(<LibWeb/URL/@name@.h>)
@@ -1553,6 +1559,7 @@ using namespace Web::DOM;
using namespace Web::Geometry;
using namespace Web::HTML;
using namespace Web::RequestIdleCallback;
+using namespace Web::Selection;
namespace Web::Bindings {
@@ -2468,6 +2475,8 @@ void generate_constructor_implementation(IDL::Interface const& interface)
# include <LibWeb/RequestIdleCallback/@name@.h>
#elif __has_include(<LibWeb/SVG/@name@.h>)
# include <LibWeb/SVG/@name@.h>
+#elif __has_include(<LibWeb/Selection/@name@.h>)
+# include <LibWeb/Selection/@name@.h>
#elif __has_include(<LibWeb/XHR/@name@.h>)
# include <LibWeb/XHR/@name@.h>
#elif __has_include(<LibWeb/URL/@name@.h>)
@@ -2480,6 +2489,7 @@ using namespace Web::DOM;
using namespace Web::Geometry;
using namespace Web::HTML;
using namespace Web::RequestIdleCallback;
+using namespace Web::Selection;
using namespace Web::UIEvents;
using namespace Web::XHR;
@@ -2775,6 +2785,8 @@ void generate_prototype_implementation(IDL::Interface const& interface)
# include <LibWeb/RequestIdleCallback/@name@.h>
#elif __has_include(<LibWeb/SVG/@name@.h>)
# include <LibWeb/SVG/@name@.h>
+#elif __has_include(<LibWeb/Selection/@name@.h>)
+# include <LibWeb/Selection/@name@.h>
#elif __has_include(<LibWeb/XHR/@name@.h>)
# include <LibWeb/XHR/@name@.h>
#elif __has_include(<LibWeb/URL/@name@.h>)
@@ -2803,6 +2815,8 @@ void generate_prototype_implementation(IDL::Interface const& interface)
# include <LibWeb/RequestIdleCallback/@iterator_name@.h>
#elif __has_include(<LibWeb/SVG/@iterator_name@.h>)
# include <LibWeb/SVG/@iterator_name@.h>
+#elif __has_include(<LibWeb/Selection/@name@.h>)
+# include <LibWeb/Selection/@name@.h>
#elif __has_include(<LibWeb/XHR/@iterator_name@.h>)
# include <LibWeb/XHR/@iterator_name@.h>
#elif __has_include(<LibWeb/URL/@iterator_name@.h>)
@@ -2820,6 +2834,7 @@ using namespace Web::Geometry;
using namespace Web::HTML;
using namespace Web::NavigationTiming;
using namespace Web::RequestIdleCallback;
+using namespace Web::Selection;
using namespace Web::XHR;
using namespace Web::URL;
@@ -3243,6 +3258,8 @@ static void generate_iterator_header(IDL::Interface const& interface)
# include <LibWeb/RequestIdleCallback/@name@.h>
#elif __has_include(<LibWeb/SVG/@name@.h>)
# include <LibWeb/SVG/@name@.h>
+#elif __has_include(<LibWeb/Selection/@name@.h>)
+# include <LibWeb/Selection/@name@.h>
#elif __has_include(<LibWeb/XHR/@name@.h>)
# include <LibWeb/XHR/@name@.h>
#elif __has_include(<LibWeb/URL/@name@.h>)
@@ -3307,6 +3324,7 @@ using namespace Web::DOM;
using namespace Web::Geometry;
using namespace Web::HTML;
using namespace Web::RequestIdleCallback;
+using namespace Web::Selection;
namespace Web::Bindings {
@@ -3422,6 +3440,8 @@ void generate_iterator_prototype_implementation(IDL::Interface const& interface)
# include <LibWeb/RequestIdleCallback/@name@.h>
#elif __has_include(<LibWeb/SVG/@name@.h>)
# include <LibWeb/SVG/@name@.h>
+#elif __has_include(<LibWeb/Selection/@name@.h>)
+# include <LibWeb/Selection/@name@.h>
#elif __has_include(<LibWeb/XHR/@name@.h>)
# include <LibWeb/XHR/@name@.h>
#elif __has_include(<LibWeb/URL/@name@.h>)
@@ -3435,6 +3455,7 @@ using namespace Web::Geometry;
using namespace Web::HTML;
using namespace Web::NavigationTiming;
using namespace Web::RequestIdleCallback;
+using namespace Web::Selection;
using namespace Web::XHR;
using namespace Web::URL;
diff --git a/Userland/Libraries/LibWeb/Bindings/WindowObject.cpp b/Userland/Libraries/LibWeb/Bindings/WindowObject.cpp
index d21887e170..5b6c93317e 100644
--- a/Userland/Libraries/LibWeb/Bindings/WindowObject.cpp
+++ b/Userland/Libraries/LibWeb/Bindings/WindowObject.cpp
@@ -31,6 +31,7 @@
#include <LibWeb/Bindings/PerformanceWrapper.h>
#include <LibWeb/Bindings/Replaceable.h>
#include <LibWeb/Bindings/ScreenWrapper.h>
+#include <LibWeb/Bindings/SelectionWrapper.h>
#include <LibWeb/Bindings/WindowObject.h>
#include <LibWeb/Bindings/WindowObjectHelper.h>
#include <LibWeb/Crypto/Crypto.h>
@@ -89,6 +90,7 @@ void WindowObject::initialize_global_object()
define_native_function("getComputedStyle", get_computed_style, 1, attr);
define_native_function("matchMedia", match_media, 1, attr);
+ define_native_function("getSelection", get_selection, 0, attr);
// FIXME: These properties should be [Replaceable] according to the spec, but [Writable+Configurable] is the closest we have.
define_native_accessor("scrollX", scroll_x_getter, {}, attr);
@@ -575,6 +577,17 @@ JS_DEFINE_NATIVE_FUNCTION(WindowObject::get_computed_style)
return wrap(global_object, impl->get_computed_style(static_cast<ElementWrapper*>(object)->impl()));
}
+JS_DEFINE_NATIVE_FUNCTION(WindowObject::get_selection)
+{
+ auto* impl = impl_from(vm, global_object);
+ if (!impl)
+ return {};
+ auto* selection = impl->get_selection();
+ if (!selection)
+ return JS::js_null();
+ return wrap(global_object, *selection);
+}
+
JS_DEFINE_NATIVE_FUNCTION(WindowObject::match_media)
{
auto* impl = impl_from(vm, global_object);
diff --git a/Userland/Libraries/LibWeb/Bindings/WindowObject.h b/Userland/Libraries/LibWeb/Bindings/WindowObject.h
index 2fb2609c53..82feef7c28 100644
--- a/Userland/Libraries/LibWeb/Bindings/WindowObject.h
+++ b/Userland/Libraries/LibWeb/Bindings/WindowObject.h
@@ -108,6 +108,7 @@ private:
JS_DECLARE_NATIVE_FUNCTION(get_computed_style);
JS_DECLARE_NATIVE_FUNCTION(match_media);
+ JS_DECLARE_NATIVE_FUNCTION(get_selection);
JS_DECLARE_NATIVE_FUNCTION(queue_microtask);
diff --git a/Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h b/Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h
index f089d25632..32f7e38578 100644
--- a/Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h
+++ b/Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h
@@ -231,6 +231,8 @@
#include <LibWeb/Bindings/ProcessingInstructionPrototype.h>
#include <LibWeb/Bindings/ProgressEventConstructor.h>
#include <LibWeb/Bindings/ProgressEventPrototype.h>
+#include <LibWeb/Bindings/RangeConstructor.h>
+#include <LibWeb/Bindings/RangePrototype.h>
#include <LibWeb/Bindings/SVGElementConstructor.h>
#include <LibWeb/Bindings/SVGElementPrototype.h>
#include <LibWeb/Bindings/SVGGeometryElementConstructor.h>
@@ -243,6 +245,8 @@
#include <LibWeb/Bindings/SVGSVGElementPrototype.h>
#include <LibWeb/Bindings/ScreenConstructor.h>
#include <LibWeb/Bindings/ScreenPrototype.h>
+#include <LibWeb/Bindings/SelectionConstructor.h>
+#include <LibWeb/Bindings/SelectionPrototype.h>
#include <LibWeb/Bindings/ShadowRootConstructor.h>
#include <LibWeb/Bindings/ShadowRootPrototype.h>
#include <LibWeb/Bindings/StyleSheetConstructor.h>
@@ -390,7 +394,9 @@
ADD_WINDOW_OBJECT_INTERFACE(PerformanceTiming) \
ADD_WINDOW_OBJECT_INTERFACE(ProcessingInstruction) \
ADD_WINDOW_OBJECT_INTERFACE(ProgressEvent) \
+ ADD_WINDOW_OBJECT_INTERFACE(Range) \
ADD_WINDOW_OBJECT_INTERFACE(Screen) \
+ ADD_WINDOW_OBJECT_INTERFACE(Selection) \
ADD_WINDOW_OBJECT_INTERFACE(ShadowRoot) \
ADD_WINDOW_OBJECT_INTERFACE(StyleSheet) \
ADD_WINDOW_OBJECT_INTERFACE(StyleSheetList) \
diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt
index 7916a57a12..8a7b3d96e6 100644
--- a/Userland/Libraries/LibWeb/CMakeLists.txt
+++ b/Userland/Libraries/LibWeb/CMakeLists.txt
@@ -253,6 +253,7 @@ set(SOURCES
SVG/SVGSVGElement.cpp
SVG/TagNames.cpp
SVG/ViewBox.cpp
+ Selection/Selection.cpp
StylePropertiesModel.cpp
UIEvents/EventNames.cpp
UIEvents/KeyboardEvent.cpp
@@ -476,6 +477,7 @@ libweb_js_wrapper(SVG/SVGGeometryElement)
libweb_js_wrapper(SVG/SVGGraphicsElement)
libweb_js_wrapper(SVG/SVGPathElement)
libweb_js_wrapper(SVG/SVGSVGElement)
+libweb_js_wrapper(Selection/Selection)
libweb_js_wrapper(UIEvents/KeyboardEvent)
libweb_js_wrapper(UIEvents/MouseEvent)
libweb_js_wrapper(UIEvents/UIEvent)
diff --git a/Userland/Libraries/LibWeb/DOM/Window.cpp b/Userland/Libraries/LibWeb/DOM/Window.cpp
index 2fe22feb6b..41d5314a2b 100644
--- a/Userland/Libraries/LibWeb/DOM/Window.cpp
+++ b/Userland/Libraries/LibWeb/DOM/Window.cpp
@@ -21,6 +21,7 @@
#include <LibWeb/Layout/InitialContainingBlock.h>
#include <LibWeb/Page/BrowsingContext.h>
#include <LibWeb/Page/Page.h>
+#include <LibWeb/Selection/Selection.h>
namespace Web::DOM {
@@ -404,4 +405,11 @@ int Window::screen_y() const
return 0;
}
+// https://w3c.github.io/selection-api/#dom-window-getselection
+Selection::Selection* Window::get_selection()
+{
+ // FIXME: Implement.
+ return nullptr;
+}
+
}
diff --git a/Userland/Libraries/LibWeb/DOM/Window.h b/Userland/Libraries/LibWeb/DOM/Window.h
index f521879cab..4a118b4498 100644
--- a/Userland/Libraries/LibWeb/DOM/Window.h
+++ b/Userland/Libraries/LibWeb/DOM/Window.h
@@ -96,6 +96,8 @@ public:
int screen_x() const;
int screen_y() const;
+ Selection::Selection* get_selection();
+
private:
explicit Window(Document&);
diff --git a/Userland/Libraries/LibWeb/Forward.h b/Userland/Libraries/LibWeb/Forward.h
index 4d01a66e97..9decf36e3c 100644
--- a/Userland/Libraries/LibWeb/Forward.h
+++ b/Userland/Libraries/LibWeb/Forward.h
@@ -219,6 +219,10 @@ class SVGPathElement;
class SVGSVGElement;
}
+namespace Web::Selection {
+class Selection;
+}
+
namespace Web::Layout {
enum class LayoutMode;
enum class PaintPhase;
@@ -400,6 +404,7 @@ class SVGGeometryElementWrapper;
class SVGGraphicsElementWrapper;
class SVGPathElementWrapper;
class SVGSVGElementWrapper;
+class SelectionWrapper;
class StyleSheetWrapper;
class StyleSheetListWrapper;
class TextWrapper;
diff --git a/Userland/Libraries/LibWeb/Selection/Selection.cpp b/Userland/Libraries/LibWeb/Selection/Selection.cpp
new file mode 100644
index 0000000000..da989b2c60
--- /dev/null
+++ b/Userland/Libraries/LibWeb/Selection/Selection.cpp
@@ -0,0 +1,135 @@
+/*
+ * Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include <LibWeb/Selection/Selection.h>
+
+namespace Web::Selection {
+
+NonnullRefPtr<Selection> Selection::create()
+{
+ return adopt_ref(*new Selection);
+}
+
+DOM::Node* Selection::anchor_node()
+{
+ TODO();
+}
+
+unsigned Selection::anchor_offset()
+{
+ TODO();
+}
+
+DOM::Node* Selection::focus_node()
+{
+ TODO();
+}
+
+unsigned Selection::focus_offset() const
+{
+ TODO();
+}
+
+bool Selection::is_collapsed() const
+{
+ TODO();
+}
+
+unsigned Selection::range_count() const
+{
+ TODO();
+}
+
+String Selection::type() const
+{
+ TODO();
+}
+
+NonnullRefPtr<DOM::Range> Selection::get_range_at(unsigned index)
+{
+ (void)index;
+ TODO();
+}
+
+void Selection::add_range(DOM::Range&)
+{
+ TODO();
+}
+
+void Selection::remove_range(DOM::Range&)
+{
+ TODO();
+}
+
+void Selection::remove_all_ranges()
+{
+ TODO();
+}
+
+void Selection::empty()
+{
+ TODO();
+}
+
+void Selection::collapse(DOM::Node*, unsigned offset)
+{
+ (void)offset;
+ TODO();
+}
+
+void Selection::set_position(DOM::Node*, unsigned offset)
+{
+ (void)offset;
+ TODO();
+}
+
+void Selection::collapse_to_start()
+{
+ TODO();
+}
+
+void Selection::collapse_to_end()
+{
+ TODO();
+}
+
+void Selection::extend(DOM::Node&, unsigned offset)
+{
+ (void)offset;
+ TODO();
+}
+
+void Selection::set_base_and_extent(DOM::Node& anchor_node, unsigned anchor_offset, DOM::Node& focus_node, unsigned focus_offset)
+{
+ (void)anchor_node;
+ (void)anchor_offset;
+ (void)focus_node;
+ (void)focus_offset;
+ TODO();
+}
+
+void Selection::select_all_children(DOM::Node&)
+{
+ TODO();
+}
+
+void Selection::delete_from_document()
+{
+ TODO();
+}
+
+bool Selection::contains_node(DOM::Node&, bool allow_partial_containment) const
+{
+ (void)allow_partial_containment;
+ TODO();
+}
+
+String Selection::to_string() const
+{
+ TODO();
+}
+
+}
diff --git a/Userland/Libraries/LibWeb/Selection/Selection.h b/Userland/Libraries/LibWeb/Selection/Selection.h
new file mode 100644
index 0000000000..56731c9aab
--- /dev/null
+++ b/Userland/Libraries/LibWeb/Selection/Selection.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <AK/NonnullRefPtr.h>
+#include <AK/RefCounted.h>
+#include <LibWeb/Bindings/Wrappable.h>
+
+namespace Web::Selection {
+
+class Selection
+ : public RefCounted<Selection>
+ , public Bindings::Wrappable {
+public:
+ using WrapperType = Bindings::SelectionWrapper;
+
+ static NonnullRefPtr<Selection> create();
+
+ DOM::Node* anchor_node();
+ unsigned anchor_offset();
+ DOM::Node* focus_node();
+ unsigned focus_offset() const;
+ bool is_collapsed() const;
+ unsigned range_count() const;
+ String type() const;
+ NonnullRefPtr<DOM::Range> get_range_at(unsigned index);
+ void add_range(DOM::Range&);
+ void remove_range(DOM::Range&);
+ void remove_all_ranges();
+ void empty();
+ void collapse(DOM::Node*, unsigned offset);
+ void set_position(DOM::Node*, unsigned offset);
+ void collapse_to_start();
+ void collapse_to_end();
+ void extend(DOM::Node&, unsigned offset);
+ void set_base_and_extent(DOM::Node& anchor_node, unsigned anchor_offset, DOM::Node& focus_node, unsigned focus_offset);
+ void select_all_children(DOM::Node&);
+ void delete_from_document();
+ bool contains_node(DOM::Node&, bool allow_partial_containment) const;
+
+ String to_string() const;
+};
+
+}
diff --git a/Userland/Libraries/LibWeb/Selection/Selection.idl b/Userland/Libraries/LibWeb/Selection/Selection.idl
new file mode 100644
index 0000000000..96a9b37a68
--- /dev/null
+++ b/Userland/Libraries/LibWeb/Selection/Selection.idl
@@ -0,0 +1,27 @@
+[Exposed=Window]
+interface Selection {
+
+ readonly attribute Node? anchorNode;
+ readonly attribute unsigned long anchorOffset;
+ readonly attribute Node? focusNode;
+ readonly attribute unsigned long focusOffset;
+ readonly attribute boolean isCollapsed;
+ readonly attribute unsigned long rangeCount;
+ readonly attribute DOMString type;
+ Range getRangeAt(unsigned long index);
+ undefined addRange(Range range);
+ undefined removeRange(Range range);
+ undefined removeAllRanges();
+ undefined empty();
+ undefined collapse(Node? node, optional unsigned long offset = 0);
+ undefined setPosition(Node? node, optional unsigned long offset = 0);
+ undefined collapseToStart();
+ undefined collapseToEnd();
+ undefined extend(Node node, optional unsigned long offset = 0);
+ undefined setBaseAndExtent(Node anchorNode, unsigned long anchorOffset, Node focusNode, unsigned long focusOffset);
+ undefined selectAllChildren(Node node);
+ [CEReactions] undefined deleteFromDocument();
+ boolean containsNode(Node node, optional boolean allowPartialContainment = false);
+ stringifier;
+
+};