Skip to content
This repository was archived by the owner on Dec 25, 2022. It is now read-only.

Commit dd0931e

Browse files
committed
Add a very simple DOM inspector
We use a ModelTranslator to expose a DOMTreeModel from LibWebView :^) It allows you to select the currently inspected node, which causes the engine to render a little box model overlay above the web content.
1 parent 289c43e commit dd0931e

File tree

5 files changed

+53
-2
lines changed

5 files changed

+53
-2
lines changed

BrowserWindow.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,16 @@ BrowserWindow::BrowserWindow()
112112
}
113113
});
114114

115+
auto* inspector_action = new QAction("Open &Inspector");
116+
inspector_action->setIcon(QIcon(QString("%1/res/icons/browser/dom-tree.png").arg(s_serenity_resource_root.characters())));
117+
inspector_action->setShortcut(QKeySequence("Ctrl+Shift+I"));
118+
inspect_menu->addAction(inspector_action);
119+
QObject::connect(inspector_action, &QAction::triggered, this, [this] {
120+
if (m_current_tab) {
121+
m_current_tab->view().show_inspector();
122+
}
123+
});
124+
115125
auto* debug_menu = menuBar()->addMenu("&Debug");
116126

117127
auto* dump_dom_tree_action = new QAction("Dump DOM Tree");

CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ set(SOURCES
5454
EventLoopPluginQt.cpp
5555
FontPluginQt.cpp
5656
ImageCodecPluginLadybird.cpp
57+
ModelTranslator.cpp
5758
PageClientLadybird.cpp
5859
RequestManagerQt.cpp
5960
main.cpp
@@ -71,7 +72,7 @@ set(SOURCES
7172
qt_add_executable(ladybird ${SOURCES}
7273
MANUAL_FINALIZATION
7374
)
74-
target_link_libraries(ladybird PRIVATE Qt::Widgets Qt::Network LibWeb LibWebSocket LibGL LibSoftGPU LibMain)
75+
target_link_libraries(ladybird PRIVATE Qt::Widgets Qt::Network LibWeb LibWebSocket LibGUI LibWebView LibGL LibSoftGPU LibMain)
7576

7677
set_target_properties(ladybird PROPERTIES
7778
MACOSX_BUNDLE_GUI_IDENTIFIER org.serenityos.ladybird

ModelTranslator.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ GUI::ModelIndex ModelTranslator::to_gui(QModelIndex const& index) const
7878
{
7979
if (!index.isValid())
8080
return {};
81-
return m_model->create_index_unsafe(index.row(), index.column(), index.internalPointer());
81+
return m_model->unsafe_create_index(index.row(), index.column(), index.internalPointer());
8282
}
8383

8484
}

SimpleWebView.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "EventLoopPluginQt.h"
1414
#include "FontPluginQt.h"
1515
#include "ImageCodecPluginLadybird.h"
16+
#include "ModelTranslator.h"
1617
#include "PageClientLadybird.h"
1718
#include "RequestManagerQt.h"
1819
#include "Utilities.h"
@@ -53,6 +54,7 @@
5354
#include <LibWeb/Painting/PaintableBox.h>
5455
#include <LibWeb/Painting/StackingContext.h>
5556
#include <LibWeb/Platform/EventLoopPlugin.h>
57+
#include <LibWebView/DOMTreeModel.h>
5658
#include <QApplication>
5759
#include <QCursor>
5860
#include <QIcon>
@@ -64,6 +66,7 @@
6466
#include <QScrollBar>
6567
#include <QTextEdit>
6668
#include <QToolTip>
69+
#include <QTreeView>
6770
#include <QVBoxLayout>
6871

6972
String s_serenity_resource_root;
@@ -595,6 +598,38 @@ void SimpleWebView::show_js_console()
595598
m_js_console_input_edit->setFocus();
596599
}
597600

601+
void SimpleWebView::ensure_inspector_widget()
602+
{
603+
if (m_inspector_widget)
604+
return;
605+
m_inspector_widget = new QWidget;
606+
m_inspector_widget->setWindowTitle("Inspector");
607+
auto* layout = new QVBoxLayout;
608+
m_inspector_widget->setLayout(layout);
609+
auto* tree_view = new QTreeView;
610+
layout->addWidget(tree_view);
611+
612+
auto dom_tree = m_page_client->page().top_level_browsing_context().active_document()->dump_dom_tree_as_json();
613+
auto dom_tree_model = ::WebView::DOMTreeModel::create(dom_tree);
614+
auto* model = new Ladybird::ModelTranslator(dom_tree_model);
615+
tree_view->setModel(model);
616+
tree_view->setHeaderHidden(true);
617+
tree_view->expandToDepth(3);
618+
619+
m_inspector_widget->resize(640, 480);
620+
621+
QObject::connect(tree_view->selectionModel(), &QItemSelectionModel::currentChanged, [this](QModelIndex const& index, QModelIndex const&) {
622+
auto const* json = (JsonObject const*)index.internalPointer();
623+
m_page_client->page().top_level_browsing_context().active_document()->set_inspected_node(Web::DOM::Node::from_id(json->get("id"sv).to_i32()));
624+
});
625+
}
626+
627+
void SimpleWebView::show_inspector()
628+
{
629+
ensure_inspector_widget();
630+
m_inspector_widget->show();
631+
}
632+
598633
void SimpleWebView::set_color_scheme(ColorScheme color_scheme)
599634
{
600635
switch (color_scheme) {

SimpleWebView.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ class SimpleWebView final : public QAbstractScrollArea {
5656
void did_get_js_console_messages(i32 start_index, Vector<String> message_types, Vector<String> messages);
5757

5858
void show_js_console();
59+
void show_inspector();
5960

6061
Gfx::IntPoint to_content(Gfx::IntPoint) const;
6162
Gfx::IntPoint to_widget(Gfx::IntPoint) const;
@@ -71,14 +72,18 @@ class SimpleWebView final : public QAbstractScrollArea {
7172

7273
private:
7374
void update_viewport_rect();
75+
7476
void ensure_js_console_widget();
77+
void ensure_inspector_widget();
7578

7679
OwnPtr<Ladybird::PageClientLadybird> m_page_client;
7780

7881
qreal m_inverse_pixel_scaling_ratio { 1.0 };
7982
bool m_should_show_line_box_borders { false };
8083

8184
QPointer<QWidget> m_js_console_widget;
85+
QPointer<QWidget> m_inspector_widget;
86+
8287
QTextEdit* m_js_console_output_edit { nullptr };
8388
QLineEdit* m_js_console_input_edit { nullptr };
8489
};

0 commit comments

Comments
 (0)