summaryrefslogtreecommitdiff
path: root/Libraries/LibWeb/Page
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2020-08-02 12:10:01 +0200
committerAndreas Kling <kling@serenityos.org>2020-08-02 17:34:50 +0200
commitbc299754f648d89d901824472b54d73b6ce6e3ed (patch)
treedc2e0a89de13d617758973a88efa160905aca0ef /Libraries/LibWeb/Page
parent2c679d0c8b38b89bf67d55dae21daafc9ad4dccb (diff)
downloadserenity-bc299754f648d89d901824472b54d73b6ce6e3ed.zip
LibWeb: Allow inserting text at the cursor by typing characters :^)
This works everywhere right now, but it's obviously not going to stay that way forever. :^) Note that this does not advance the cursor correctly for whitespace since the cursor is DOM-based and doesn't take whitespace collapsing into account yet.
Diffstat (limited to 'Libraries/LibWeb/Page')
-rw-r--r--Libraries/LibWeb/Page/EventHandler.cpp19
-rw-r--r--Libraries/LibWeb/Page/EventHandler.h3
-rw-r--r--Libraries/LibWeb/Page/Frame.h1
-rw-r--r--Libraries/LibWeb/Page/Page.cpp5
-rw-r--r--Libraries/LibWeb/Page/Page.h3
5 files changed, 31 insertions, 0 deletions
diff --git a/Libraries/LibWeb/Page/EventHandler.cpp b/Libraries/LibWeb/Page/EventHandler.cpp
index b9e6e618b2..9a25bd3a32 100644
--- a/Libraries/LibWeb/Page/EventHandler.cpp
+++ b/Libraries/LibWeb/Page/EventHandler.cpp
@@ -28,6 +28,7 @@
#include <LibGUI/Window.h>
#include <LibJS/Runtime/Value.h>
#include <LibWeb/DOM/Document.h>
+#include <LibWeb/DOM/Text.h>
#include <LibWeb/HTML/HTMLAnchorElement.h>
#include <LibWeb/HTML/HTMLIFrameElement.h>
#include <LibWeb/Layout/LayoutDocument.h>
@@ -228,4 +229,22 @@ void EventHandler::dump_selection(const char* event_name) const
#endif
}
+bool EventHandler::handle_keydown(KeyCode, unsigned, u32 code_point)
+{
+ if (code_point && m_frame.cursor_position().is_valid() && is<DOM::Text>(*m_frame.cursor_position().node())) {
+ auto& text_node = downcast<DOM::Text>(*m_frame.cursor_position().node());
+ StringBuilder builder;
+ builder.append(text_node.data().substring_view(0, m_frame.cursor_position().offset()));
+ builder.append_codepoint(code_point);
+ builder.append(text_node.data().substring_view(m_frame.cursor_position().offset(), text_node.data().length() - m_frame.cursor_position().offset()));
+ text_node.set_data(builder.to_string());
+ // FIXME: This will advance the cursor incorrectly when inserting multiple whitespaces (DOM vs layout whitespace collapse difference.)
+ m_frame.set_cursor_position({ *m_frame.cursor_position().node(), m_frame.cursor_position().offset() + 1 });
+ // FIXME: This should definitely use incremental layout invalidation instead!
+ text_node.document().force_layout();
+ return true;
+ }
+ return true;
+}
+
}
diff --git a/Libraries/LibWeb/Page/EventHandler.h b/Libraries/LibWeb/Page/EventHandler.h
index 9a06a83c2e..6db5a6e2cc 100644
--- a/Libraries/LibWeb/Page/EventHandler.h
+++ b/Libraries/LibWeb/Page/EventHandler.h
@@ -27,6 +27,7 @@
#pragma once
#include <AK/Forward.h>
+#include <Kernel/API/KeyCode.h>
#include <LibGUI/Forward.h>
#include <LibGfx/Forward.h>
#include <LibWeb/Forward.h>
@@ -44,6 +45,8 @@ public:
bool handle_mousedown(const Gfx::IntPoint&, unsigned button, unsigned modifiers);
bool handle_mousemove(const Gfx::IntPoint&, unsigned buttons, unsigned modifiers);
+ bool handle_keydown(KeyCode, unsigned modifiers, u32 code_point);
+
private:
LayoutDocument* layout_root();
const LayoutDocument* layout_root() const;
diff --git a/Libraries/LibWeb/Page/Frame.h b/Libraries/LibWeb/Page/Frame.h
index 74a88f2c18..8ee452a29e 100644
--- a/Libraries/LibWeb/Page/Frame.h
+++ b/Libraries/LibWeb/Page/Frame.h
@@ -85,6 +85,7 @@ public:
Gfx::IntPoint to_main_frame_position(const Gfx::IntPoint&);
Gfx::IntRect to_main_frame_rect(const Gfx::IntRect&);
+ DOM::Position& cursor_position() { return m_cursor_position; }
const DOM::Position& cursor_position() const { return m_cursor_position; }
void set_cursor_position(const DOM::Position&);
diff --git a/Libraries/LibWeb/Page/Page.cpp b/Libraries/LibWeb/Page/Page.cpp
index f02cfc9385..a9a1bfccbe 100644
--- a/Libraries/LibWeb/Page/Page.cpp
+++ b/Libraries/LibWeb/Page/Page.cpp
@@ -65,4 +65,9 @@ bool Page::handle_mousemove(const Gfx::IntPoint& position, unsigned buttons, uns
return main_frame().event_handler().handle_mousemove(position, buttons, modifiers);
}
+bool Page::handle_keydown(KeyCode key, unsigned modifiers, u32 code_point)
+{
+ return main_frame().event_handler().handle_keydown(key, modifiers, code_point);
+}
+
}
diff --git a/Libraries/LibWeb/Page/Page.h b/Libraries/LibWeb/Page/Page.h
index a0bf0b635f..7becdef055 100644
--- a/Libraries/LibWeb/Page/Page.h
+++ b/Libraries/LibWeb/Page/Page.h
@@ -29,6 +29,7 @@
#include <AK/Noncopyable.h>
#include <AK/OwnPtr.h>
#include <AK/RefPtr.h>
+#include <Kernel/API/KeyCode.h>
#include <LibGUI/Window.h>
#include <LibGfx/Forward.h>
#include <LibGfx/Palette.h>
@@ -58,6 +59,8 @@ public:
bool handle_mousedown(const Gfx::IntPoint&, unsigned button, unsigned modifiers);
bool handle_mousemove(const Gfx::IntPoint&, unsigned buttons, unsigned modifiers);
+ bool handle_keydown(KeyCode, unsigned modifiers, u32 code_point);
+
Gfx::Palette palette() const;
private: