mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-07-29 20:29:18 +00:00
LibDevTools+LibWebView: Implement getting document style sheets
This commit is contained in:
parent
cf601a49bb
commit
0b86bcfba7
Notes:
github-actions[bot]
2025-03-13 20:57:24 +00:00
Author: https://github.com/trflynn89
Commit: 0b86bcfba7
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/3920
10 changed files with 274 additions and 6 deletions
89
Libraries/LibDevTools/Actors/StyleSheetsActor.cpp
Normal file
89
Libraries/LibDevTools/Actors/StyleSheetsActor.cpp
Normal file
|
@ -0,0 +1,89 @@
|
|||
/*
|
||||
* Copyright (c) 2025, Tim Flynn <trflynn89@ladybird.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#include <AK/JsonObject.h>
|
||||
#include <LibDevTools/Actors/InspectorActor.h>
|
||||
#include <LibDevTools/Actors/StyleSheetsActor.h>
|
||||
#include <LibDevTools/Actors/TabActor.h>
|
||||
#include <LibDevTools/DevToolsDelegate.h>
|
||||
#include <LibDevTools/DevToolsServer.h>
|
||||
|
||||
namespace DevTools {
|
||||
|
||||
NonnullRefPtr<StyleSheetsActor> StyleSheetsActor::create(DevToolsServer& devtools, String name, WeakPtr<TabActor> tab)
|
||||
{
|
||||
return adopt_ref(*new StyleSheetsActor(devtools, move(name), move(tab)));
|
||||
}
|
||||
|
||||
StyleSheetsActor::StyleSheetsActor(DevToolsServer& devtools, String name, WeakPtr<TabActor> tab)
|
||||
: Actor(devtools, move(name))
|
||||
, m_tab(move(tab))
|
||||
{
|
||||
if (auto tab = m_tab.strong_ref()) {
|
||||
devtools.delegate().listen_for_style_sheet_sources(
|
||||
tab->description(),
|
||||
[weak_self = make_weak_ptr<StyleSheetsActor>()](Web::CSS::StyleSheetIdentifier const& style_sheet, String source) {
|
||||
if (auto self = weak_self.strong_ref())
|
||||
self->style_sheet_source_received(style_sheet, move(source));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
StyleSheetsActor::~StyleSheetsActor()
|
||||
{
|
||||
if (auto tab = m_tab.strong_ref())
|
||||
devtools().delegate().stop_listening_for_style_sheet_sources(tab->description());
|
||||
}
|
||||
|
||||
void StyleSheetsActor::handle_message(Message const& message)
|
||||
{
|
||||
if (message.type == "getText"sv) {
|
||||
auto resource_id = get_required_parameter<String>(message, "resourceId"sv);
|
||||
if (!resource_id.has_value())
|
||||
return;
|
||||
|
||||
auto index = resource_id->bytes_as_string_view().find_last_split_view(':').to_number<size_t>();
|
||||
if (!index.has_value() || *index >= m_style_sheets.size()) {
|
||||
send_unknown_actor_error(message, *resource_id);
|
||||
return;
|
||||
}
|
||||
|
||||
if (auto tab = m_tab.strong_ref()) {
|
||||
devtools().delegate().retrieve_style_sheet_source(tab->description(), m_style_sheets[*index]);
|
||||
m_pending_style_sheet_source_requests.set(*index, { .id = message.id });
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
send_unrecognized_packet_type_error(message);
|
||||
}
|
||||
|
||||
void StyleSheetsActor::set_style_sheets(Vector<Web::CSS::StyleSheetIdentifier> style_sheets)
|
||||
{
|
||||
m_style_sheets = move(style_sheets);
|
||||
}
|
||||
|
||||
void StyleSheetsActor::style_sheet_source_received(Web::CSS::StyleSheetIdentifier const& style_sheet, String source)
|
||||
{
|
||||
auto index = m_style_sheets.find_first_index_if([&](auto const& candidate) {
|
||||
return candidate.type == style_sheet.type && candidate.url == style_sheet.url;
|
||||
});
|
||||
if (!index.has_value())
|
||||
return;
|
||||
|
||||
auto pending_message = m_pending_style_sheet_source_requests.take(*index);
|
||||
if (!pending_message.has_value())
|
||||
return;
|
||||
|
||||
// FIXME: Support the `longString` message type so that we don't have to send the entire style sheet
|
||||
// source at once for large sheets.
|
||||
JsonObject response;
|
||||
response.set("text"sv, move(source));
|
||||
send_response(*pending_message, move(response));
|
||||
}
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue