9#include <private/qstdweb_p.h>
11#include <QCoreApplication>
12#include <qpa/qwindowsysteminterface.h>
16#include <emscripten/val.h>
29 event[
"clipboardData"].call<
void>(
"setData",
val(
"text/plain"),
30 _mimes->
text().toJsString());
33 event[
"clipboardData"].call<
void>(
"setData",
val(
"text/html"), _mimes->
html().toJsString());
36 for (
auto mimetype : _mimes->
formats()) {
37 if (mimetype.contains(
"text/"))
41 event[
"clipboardData"].call<void>(
"setData", mimetype.toJsString(),
45 event.call<
void>(
"preventDefault");
71 event.call<
void>(
"preventDefault");
73 static std::shared_ptr<qstdweb::CancellationFlag> readDataCancellation =
nullptr;
75 event[
"clipboardData"],
78 image.loadFromData(fileContent,
nullptr);
81 [
event](std::unique_ptr<QMimeData>
data) {
82 if (
data->formats().isEmpty())
102 val clipboard = val::global(
"navigator")[
"clipboard"];
104 const bool hasPermissionsApi = !val::global(
"navigator")[
"permissions"].isUndefined();
105 m_hasClipboardApi = !clipboard.isUndefined() && !clipboard[
"readText"].isUndefined();
107 if (m_hasClipboardApi && hasPermissionsApi)
108 initClipboardPermissions();
127 if (m_hasClipboardApi)
128 writeToClipboardApi();
141 const bool isPaste =
event.key ==
Qt::Key_V;
143 return m_hasClipboardApi && !isPaste
159void QWasmClipboard::initClipboardPermissions()
161 val permissions = val::global(
"navigator")[
"permissions"];
164 val readPermissionsMap = val::object();
165 readPermissionsMap.set(
"name",
val(
"clipboard-read"));
166 return readPermissionsMap;
169 val readPermissionsMap = val::object();
170 readPermissionsMap.set(
"name",
val(
"clipboard-write"));
171 return readPermissionsMap;
177 emscripten::val cContext = val::undefined();
178 emscripten::val isChromium = val::global(
"window")[
"chrome"];
179 if (!isChromium.isUndefined()) {
180 cContext = val::global(
"document");
185 cContext.call<
void>(
"addEventListener",
val(
"cut"),
186 val::module_property(
"qtClipboardCutTo"),
true);
187 cContext.call<
void>(
"addEventListener",
val(
"copy"),
188 val::module_property(
"qtClipboardCopyTo"),
true);
189 cContext.call<
void>(
"addEventListener",
val(
"paste"),
190 val::module_property(
"qtClipboardPasteTo"),
true);
195 return m_hasClipboardApi;
198void QWasmClipboard::writeToClipboardApi()
210 emscripten::val clipboardWriteArray = emscripten::val::array();
213 for (
auto mimetype : _mimes->
formats()) {
224 mimetype =
"text/html";
225 }
else if (mimetype.contains(
"text/plain")) {
227 }
else if (mimetype.contains(
"image")) {
232 mimetype =
"image/png";
238 ba = _mimes->
data(mimetype);
242 const char *content =
ba.
data();
244 if (dataLength < 1) {
245 qDebug() <<
"no content found";
249 emscripten::val
document = emscripten::val::global(
"document");
250 emscripten::val
window = emscripten::val::global(
"window");
252 emscripten::val fileContentView =
253 emscripten::val(emscripten::typed_memory_view(dataLength, content));
254 emscripten::val fileContentCopy = emscripten::val::global(
"ArrayBuffer").new_(dataLength);
255 emscripten::val fileContentCopyView =
256 emscripten::val::global(
"Uint8Array").new_(fileContentCopy);
257 fileContentCopyView.call<
void>(
"set", fileContentView);
259 emscripten::val contentArray = emscripten::val::array();
260 contentArray.call<
void>(
"push", fileContentCopyView);
263 emscripten::val
type = emscripten::val::array();
264 type.set(
"type", mimetype.toJsString());
266 emscripten::val contentBlob = emscripten::val::global(
"Blob").new_(contentArray,
type);
268 emscripten::val clipboardItemObject = emscripten::val::object();
269 clipboardItemObject.set(mimetype.toJsString(), contentBlob);
271 val clipboardItemData = val::global(
"ClipboardItem").new_(clipboardItemObject);
273 clipboardWriteArray.call<
void>(
"push", clipboardItemData);
280 val navigator = val::global(
"navigator");
283 navigator[
"clipboard"],
"write",
285 .catchFunc = [](emscripten::val
error) {
291 clipboardWriteArray);
294void QWasmClipboard::writeToClipboard()
\inmodule QtCore \reentrant
char * data()
\macro QT_NO_CAST_FROM_BYTEARRAY
const char * constData() const noexcept
Returns a pointer to the const data stored in the byte array.
qsizetype length() const noexcept
Same as size().
bool isEmpty() const noexcept
Returns true if the byte array has size 0; otherwise returns false.
Mode
\keyword clipboard mode
QVariant imageData() const
Returns a QVariant storing a QImage if the object can return an image; otherwise returns a null varia...
bool hasHtml() const
Returns true if the object can return HTML (MIME type text/html); otherwise returns false.
bool hasText() const
Returns true if the object can return plain text (MIME type text/plain); otherwise returns false.
QString html() const
Returns a string if the data stored in the object is HTML (MIME type text/html); otherwise returns an...
QByteArray data(const QString &mimetype) const
Returns the data stored in the object in the format described by the MIME type specified by mimeType.
virtual QStringList formats() const
Returns a list of formats supported by the object.
QString text() const
Returns a plain text (MIME type text/plain) representation of the data.
static QString fromStdString(const std::string &s)
QByteArray toLocal8Bit() const &
virtual ~QWasmClipboard()
static void installEventHandlers(const emscripten::val &target)
void setMimeData(QMimeData *data, QClipboard::Mode mode=QClipboard::Clipboard) override
@ NativeClipboardEventNeeded
@ NativeClipboardEventAndCopiedDataNeeded
bool supportsMode(QClipboard::Mode mode) const override
QMimeData * mimeData(QClipboard::Mode mode=QClipboard::Clipboard) override
ProcessKeyboardResult processKeyboard(const KeyEvent &event)
bool ownsMode(QClipboard::Mode mode) const override
static QWasmIntegration * get()
QWasmClipboard * getWasmClipboard()
QPlatformClipboard * clipboard() const override
Accessor for the platform integration's clipboard.
static bool handleKeyEvent(QWindow *window, QEvent::Type t, int k, Qt::KeyboardModifiers mods, const QString &text=QString(), bool autorep=false, ushort count=1)
Combined button and popup list for selecting options.
emscripten::val document()
void make(emscripten::val target, QString methodName, PromiseCallbacks callbacks, Args... args)
std::shared_ptr< CancellationFlag > readDataTransfer(emscripten::val webDataTransfer, std::function< QVariant(QByteArray)> imageReader, std::function< void(std::unique_ptr< QMimeData >)> onDone)
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction function
DBusConnection const char DBusError * error
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
static void qClipboardCutTo(val event)
static void qClipboardPasteTo(val event)
static void commonCopyEvent(val event)
static void qClipboardCopyTo(val event)
EMSCRIPTEN_BINDINGS(qtClipboardModule)