From 7f8f72556a2d3435f54cc4ecebf5c05295f7222b Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Thu, 1 May 2025 11:44:29 -0400 Subject: [PATCH] headless-browser: Implement a stubbed clipboard API We currently rely on UI-specific APIs to interact with the system clipboard from AppKit and Qt. We do not have access to these from headless-browser. We should ultimately implement these APIs without relying on the UI as a middle-man. For now, store a clipboard item so that we may exercise the clipboard WPT tests. --- UI/Headless/HeadlessWebView.cpp | 16 +++++++++++++++- UI/Headless/HeadlessWebView.h | 5 ++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/UI/Headless/HeadlessWebView.cpp b/UI/Headless/HeadlessWebView.cpp index b25fe17c110..c70ecb758ad 100644 --- a/UI/Headless/HeadlessWebView.cpp +++ b/UI/Headless/HeadlessWebView.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, Tim Flynn + * Copyright (c) 2024-2025, Tim Flynn * * SPDX-License-Identifier: BSD-2-Clause */ @@ -127,6 +127,20 @@ HeadlessWebView::HeadlessWebView(Core::AnonymousBuffer theme, Web::DevicePixelSi m_pending_prompt_text.clear(); }; + on_insert_clipboard_entry = [this](Web::Clipboard::SystemClipboardRepresentation entry, auto const&) { + Web::Clipboard::SystemClipboardItem item; + item.system_clipboard_representations.append(move(entry)); + + m_clipboard = move(item); + }; + + on_request_clipboard_entries = [this](auto request_id) { + if (m_clipboard.has_value()) + retrieved_clipboard_entries(request_id, { { *m_clipboard } }); + else + retrieved_clipboard_entries(request_id, {}); + }; + m_system_visibility_state = Web::HTML::VisibilityState::Visible; } diff --git a/UI/Headless/HeadlessWebView.h b/UI/Headless/HeadlessWebView.h index d0f45731601..fcf3bbb6355 100644 --- a/UI/Headless/HeadlessWebView.h +++ b/UI/Headless/HeadlessWebView.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, Tim Flynn + * Copyright (c) 2024-2025, Tim Flynn * * SPDX-License-Identifier: BSD-2-Clause */ @@ -51,6 +51,9 @@ private: Web::Page::PendingDialog m_pending_dialog { Web::Page::PendingDialog::None }; Optional m_pending_prompt_text; + + // FIXME: We should implement UI-agnostic platform APIs to interact with the system clipboard. + Optional m_clipboard; }; }