mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 12:57:35 +00:00
LibWeb+WebContent: Plumb ability for WebContent process to hold N pages
In order for same-origin NavigableContainers (iframe, frame, embed, ...) and window.open() WindowProxies to have the proper JS access to their embedder/opener, we need to host multiple top level traversables in the same WebContent process. As a first step, make WebContent::PageHost hold a HashMap of PageClient objects, each holding their own Web::Page that represents a TraversableNavigable's API surface with the UI process.
This commit is contained in:
parent
34ae39478a
commit
fbfb70f81a
13 changed files with 769 additions and 660 deletions
|
@ -26,7 +26,6 @@ namespace Web {
|
|||
Page::Page(PageClient& client)
|
||||
: m_client(client)
|
||||
{
|
||||
m_top_level_traversable = JS::make_handle(HTML::TraversableNavigable::create_a_fresh_top_level_traversable(*this, AK::URL("about:blank")).release_value_but_fixme_should_propagate_errors());
|
||||
}
|
||||
|
||||
Page::~Page() = default;
|
||||
|
@ -161,6 +160,13 @@ bool Page::handle_keyup(KeyCode key, unsigned modifiers, u32 code_point)
|
|||
return focused_context().event_handler().handle_keyup(key, modifiers, code_point);
|
||||
}
|
||||
|
||||
void Page::set_top_level_traversable(JS::NonnullGCPtr<HTML::TraversableNavigable> navigable)
|
||||
{
|
||||
VERIFY(!m_top_level_traversable); // Replacement is not allowed!
|
||||
VERIFY(navigable->page() == this);
|
||||
m_top_level_traversable = navigable;
|
||||
}
|
||||
|
||||
bool Page::top_level_traversable_is_initialized() const
|
||||
{
|
||||
return m_top_level_traversable;
|
||||
|
|
|
@ -46,6 +46,8 @@ public:
|
|||
PageClient& client() { return m_client; }
|
||||
PageClient const& client() const { return m_client; }
|
||||
|
||||
void set_top_level_traversable(JS::NonnullGCPtr<HTML::TraversableNavigable>);
|
||||
|
||||
// FIXME: This is a hack.
|
||||
bool top_level_traversable_is_initialized() const;
|
||||
|
||||
|
|
|
@ -50,6 +50,7 @@ ErrorOr<NonnullRefPtr<SVGDecodedImageData>> SVGDecodedImageData::create(Page& ho
|
|||
auto page_client = make<SVGPageClient>(host_page);
|
||||
auto page = make<Page>(*page_client);
|
||||
page_client->m_svg_page = page.ptr();
|
||||
page->set_top_level_traversable(MUST(Web::HTML::TraversableNavigable::create_a_fresh_top_level_traversable(*page, AK::URL("about:blank"))));
|
||||
JS::NonnullGCPtr<HTML::Navigable> navigable = page->top_level_traversable();
|
||||
auto response = Fetch::Infrastructure::Response::create(navigable->vm());
|
||||
response->url_list().append(url);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue