9#include <private/qstdweb_p.h>
11#include <QCoreApplication>
12#include <qpa/qwindowsysteminterface.h>
16#include <emscripten/val.h>
28 if (_mimes->hasText()) {
29 event[
"clipboardData"].call<
void>(
"setData",
val(
"text/plain"),
30 _mimes->text().toEcmaString());
32 if (_mimes->hasHtml()) {
33 event[
"clipboardData"].call<
void>(
"setData",
val(
"text/html"), _mimes->html().toEcmaString());
36 for (
auto mimetype : _mimes->formats()) {
37 if (mimetype.contains(
"text/"))
41 event[
"clipboardData"].call<void>(
"setData", mimetype.toEcmaString(),
45 event.call<
void>(
"preventDefault");
71 event.call<
void>(
"preventDefault");
84 val clipboard = val::global(
"navigator")[
"clipboard"];
86 const bool hasPermissionsApi = !val::global(
"navigator")[
"permissions"].isUndefined();
87 m_hasClipboardApi = !clipboard.isUndefined() && !clipboard[
"readText"].isUndefined();
89 if (m_hasClipboardApi && hasPermissionsApi)
90 initClipboardPermissions();
109 if (m_hasClipboardApi)
110 writeToClipboardApi();
123 const bool isPaste =
event.key ==
Qt::Key_V;
125 return m_hasClipboardApi && !isPaste
141void QWasmClipboard::initClipboardPermissions()
143 val permissions = val::global(
"navigator")[
"permissions"];
146 val readPermissionsMap = val::object();
147 readPermissionsMap.set(
"name",
val(
"clipboard-read"));
148 return readPermissionsMap;
151 val readPermissionsMap = val::object();
152 readPermissionsMap.set(
"name",
val(
"clipboard-write"));
153 return readPermissionsMap;
159 emscripten::val cContext = val::undefined();
160 emscripten::val isChromium = val::global(
"window")[
"chrome"];
161 if (!isChromium.isUndefined()) {
162 cContext = val::global(
"document");
167 cContext.call<
void>(
"addEventListener",
val(
"cut"),
168 val::module_property(
"qtClipboardCutTo"),
true);
169 cContext.call<
void>(
"addEventListener",
val(
"copy"),
170 val::module_property(
"qtClipboardCopyTo"),
true);
171 cContext.call<
void>(
"addEventListener",
val(
"paste"),
172 val::module_property(
"qtClipboardPasteTo"),
true);
177 return m_hasClipboardApi;
180void QWasmClipboard::writeToClipboardApi()
192 emscripten::val clipboardWriteArray = emscripten::val::array();
195 for (
auto mimetype : _mimes->
formats()) {
203 if (_mimes->hasHtml()) {
204 ba = _mimes->html().toLocal8Bit();
206 mimetype =
"text/html";
207 }
else if (mimetype.contains(
"text/plain")) {
208 ba = _mimes->text().toLocal8Bit();
209 }
else if (mimetype.contains(
"image")) {
210 QImage img = qvariant_cast<QImage>( _mimes->imageData());
214 mimetype =
"image/png";
220 ba = _mimes->
data(mimetype);
224 const char *content =
ba.
data();
226 if (dataLength < 1) {
227 qDebug() <<
"no content found";
231 emscripten::val
document = emscripten::val::global(
"document");
232 emscripten::val
window = emscripten::val::global(
"window");
234 emscripten::val fileContentView =
235 emscripten::val(emscripten::typed_memory_view(dataLength, content));
236 emscripten::val fileContentCopy = emscripten::val::global(
"ArrayBuffer").new_(dataLength);
237 emscripten::val fileContentCopyView =
238 emscripten::val::global(
"Uint8Array").new_(fileContentCopy);
239 fileContentCopyView.call<
void>(
"set", fileContentView);
241 emscripten::val contentArray = emscripten::val::array();
242 contentArray.call<
void>(
"push", fileContentCopyView);
245 emscripten::val
type = emscripten::val::array();
246 type.set(
"type", mimetype.toEcmaString());
248 emscripten::val contentBlob = emscripten::val::global(
"Blob").new_(contentArray,
type);
250 emscripten::val clipboardItemObject = emscripten::val::object();
251 clipboardItemObject.set(mimetype.toEcmaString(), contentBlob);
253 val clipboardItemData = val::global(
"ClipboardItem").new_(clipboardItemObject);
255 clipboardWriteArray.call<
void>(
"push", clipboardItemData);
262 val navigator = val::global(
"navigator");
265 navigator[
"clipboard"],
"write",
267 .catchFunc = [](emscripten::val
error) {
273 clipboardWriteArray);
276void QWasmClipboard::writeToClipboard()
288 qDebug() <<
"sendClipboardData";
291 const auto mimeCallback = std::function([transfer](
QMimeData *
data) {
302 transfer->toMimeDataWithFile(mimeCallback);
\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
static QString fromStdString(const std::string &s)
virtual ~QWasmClipboard()
void sendClipboardData(emscripten::val event)
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()
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)
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)