Page IDs were allocated independently by each WebContent PageHost, starting at zero for every process. That made them unsuitable as a global identity for page-presenting compositor contexts, because the same numeric page ID could exist in multiple WebContent processes. Move page ID allocation to WebView::Application and initialize each WebContent process with its browser-assigned first page ID over IPC. New view requests now get a browser-assigned page ID before WebContent creates the PageClient, and PageHost no longer owns a local page counter. This gives page-presenting compositor contexts a stable global page identity, which will allow their context IDs to be derived from page IDs and simplify compositor context allocation in a follow-up.
64 lines
2.6 KiB
C++
64 lines
2.6 KiB
C++
/*
|
|
* Copyright (c) 2025, Tim Flynn <trflynn89@ladybird.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/Function.h>
|
|
#include <AK/HashMap.h>
|
|
#include <AK/JsonValue.h>
|
|
#include <AK/NonnullRefPtr.h>
|
|
#include <AK/RefPtr.h>
|
|
#include <AK/String.h>
|
|
#include <AK/Types.h>
|
|
#include <LibIPC/ConnectionToServer.h>
|
|
#include <LibIPC/Transport.h>
|
|
#include <LibWebView/Forward.h>
|
|
#include <WebContent/WebUIClientEndpoint.h>
|
|
#include <WebContent/WebUIServerEndpoint.h>
|
|
|
|
namespace WebView {
|
|
|
|
class WEBVIEW_API WebUI
|
|
: public IPC::ConnectionToServer<WebUIClientEndpoint, WebUIServerEndpoint>
|
|
, public WebUIClientEndpoint {
|
|
public:
|
|
static ErrorOr<RefPtr<WebUI>> create(WebContentClient&, u64 page_id, String host);
|
|
virtual ~WebUI();
|
|
|
|
String const& host() const { return m_host; }
|
|
|
|
protected:
|
|
WebUI(WebContentClient&, NonnullOwnPtr<IPC::Transport>, String host);
|
|
|
|
using Interface = Function<void(JsonValue)>;
|
|
|
|
virtual void register_interfaces() { }
|
|
void register_interface(StringView name, Interface);
|
|
|
|
private:
|
|
virtual void die() override;
|
|
virtual void received_message(String name, JsonValue data) override;
|
|
|
|
WebContentClient& m_client;
|
|
String m_host;
|
|
|
|
HashMap<StringView, Interface> m_interfaces;
|
|
};
|
|
|
|
#define WEB_UI(WebUIType) \
|
|
public: \
|
|
static NonnullRefPtr<WebUIType> create(WebContentClient& client, NonnullOwnPtr<IPC::Transport> transport, String host) \
|
|
{ \
|
|
return adopt_ref(*new WebUIType(client, move(transport), move(host))); \
|
|
} \
|
|
\
|
|
private: \
|
|
WebUIType(WebContentClient& client, NonnullOwnPtr<IPC::Transport> transport, String host) \
|
|
: WebView::WebUI(client, move(transport), move(host)) \
|
|
{ \
|
|
}
|
|
|
|
}
|