diff --git a/Libraries/LibHTML/HtmlView.cpp b/Libraries/LibHTML/HtmlView.cpp
index 2a46a91ac5..3e9abd0e34 100644
--- a/Libraries/LibHTML/HtmlView.cpp
+++ b/Libraries/LibHTML/HtmlView.cpp
@@ -183,6 +183,40 @@ void HtmlView::mousedown_event(GMouseEvent& event)
event.accept();
}
+void HtmlView::keydown_event(GKeyEvent& event)
+{
+ if (event.modifiers() == 0) {
+ switch (event.key()) {
+ case Key_Home:
+ vertical_scrollbar().set_value(0);
+ break;
+ case Key_End:
+ vertical_scrollbar().set_value(vertical_scrollbar().max());
+ break;
+ case Key_Down:
+ vertical_scrollbar().set_value(vertical_scrollbar().value() + vertical_scrollbar().step());
+ break;
+ case Key_Up:
+ vertical_scrollbar().set_value(vertical_scrollbar().value() - vertical_scrollbar().step());
+ break;
+ case Key_Left:
+ horizontal_scrollbar().set_value(horizontal_scrollbar().value() + horizontal_scrollbar().step());
+ break;
+ case Key_Right:
+ horizontal_scrollbar().set_value(horizontal_scrollbar().value() - horizontal_scrollbar().step());
+ break;
+ case Key_PageDown:
+ vertical_scrollbar().set_value(vertical_scrollbar().value() + frame_inner_rect().height());
+ break;
+ case Key_PageUp:
+ vertical_scrollbar().set_value(vertical_scrollbar().value() - frame_inner_rect().height());
+ break;
+ }
+ }
+
+ event.accept();
+}
+
void HtmlView::reload()
{
load(main_frame().document()->url());
diff --git a/Libraries/LibHTML/HtmlView.h b/Libraries/LibHTML/HtmlView.h
index 5c47d1d591..19c18e7335 100644
--- a/Libraries/LibHTML/HtmlView.h
+++ b/Libraries/LibHTML/HtmlView.h
@@ -32,6 +32,8 @@ public:
Function on_title_change;
Function on_load_start;
+ virtual bool accepts_focus() const override { return true; }
+
protected:
HtmlView(GWidget* parent = nullptr);
@@ -39,6 +41,7 @@ protected:
virtual void paint_event(GPaintEvent&) override;
virtual void mousemove_event(GMouseEvent&) override;
virtual void mousedown_event(GMouseEvent&) override;
+ virtual void keydown_event(GKeyEvent&) override;
private:
void layout_and_sync_size();