PluginProbe
OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin / 0.8.7
OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin v0.8.7
1.1.10 1.1.9 1.1.8 1.1.7 1.1.6 1.1.5 1.1.4 1.1.3 1.1.2 1.1.1 1.1.0 1.0.1 1.0.0 0.9.8 0.9.7 0.9.6 0.9.4 0.9.5 0.9.3 0.9.2 0.9.1 0.9.0 0.8.9 0.8.8 0.8.7 All 34 releases
desktop-mode / assets / js / gutenberg-drop-receiver.js

gutenberg-drop-receiver.js in OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin 0.8.7, at assets/js/gutenberg-drop-receiver.js

158 lines 4.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 var desktopModeGutenbergDropReceiver = function(exports) {
2 "use strict";
3 function escapeHtml(s) {
4 return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#039;");
5 }
6 function isSafeUrl(raw) {
7 const lower = raw.trimStart().toLowerCase();
8 if (lower.startsWith("javascript:")) {
9 return false;
10 }
11 if (lower.startsWith("data:")) {
12 return false;
13 }
14 if (lower.startsWith("vbscript:")) {
15 return false;
16 }
17 return true;
18 }
19 function buildBlockSpec(payload) {
20 if (payload.kind === "attachment") {
21 if (!payload.url || !isSafeUrl(payload.url)) {
22 return null;
23 }
24 const mime = payload.mime || "";
25 if (mime.startsWith("image/")) {
26 return {
27 name: "core/image",
28 attributes: {
29 id: payload.id,
30 url: payload.url,
31 alt: payload.alt || "",
32 caption: ""
33 }
34 };
35 }
36 if (mime.startsWith("video/")) {
37 return {
38 name: "core/video",
39 attributes: {
40 id: payload.id,
41 src: payload.url
42 }
43 };
44 }
45 if (mime.startsWith("audio/")) {
46 return {
47 name: "core/audio",
48 attributes: {
49 id: payload.id,
50 src: payload.url
51 }
52 };
53 }
54 return {
55 name: "core/file",
56 attributes: {
57 id: payload.id,
58 href: payload.url,
59 fileName: payload.title
60 }
61 };
62 }
63 if (!payload.url || !isSafeUrl(payload.url)) {
64 return null;
65 }
66 const safeTitle = escapeHtml(payload.title || payload.url);
67 const safeHref = escapeHtml(payload.url);
68 return {
69 name: "core/paragraph",
70 attributes: {
71 content: `<a href="${safeHref}">${safeTitle}</a>`
72 }
73 };
74 }
75 async function waitForEditor() {
76 return new Promise((resolve, reject) => {
77 let ticks = 0;
78 const MAX_TICKS = 300;
79 const tick = () => {
80 const wp = window.wp;
81 if (wp?.blocks && wp.data) {
82 resolve({ blocks: wp.blocks, data: wp.data });
83 return;
84 }
85 ticks++;
86 if (ticks > MAX_TICKS) {
87 reject(
88 new Error(
89 "desktop-mode/gutenberg-drop-receiver: timed out waiting for wp.blocks + wp.data"
90 )
91 );
92 return;
93 }
94 requestAnimationFrame(tick);
95 };
96 tick();
97 });
98 }
99 async function performInsert(payload) {
100 const spec = buildBlockSpec(payload);
101 if (!spec) {
102 return;
103 }
104 const { blocks, data } = await waitForEditor();
105 const block = blocks.createBlock(spec.name, spec.attributes);
106 data.dispatch("core/block-editor").insertBlocks([block]);
107 }
108 function notifyParentOfFailure(reason) {
109 if (window.parent === window) {
110 return;
111 }
112 try {
113 window.parent.postMessage(
114 { type: "desktop-mode-drop-failed", reason },
115 window.location.origin
116 );
117 } catch {
118 }
119 }
120 function isDropMsg(m) {
121 if (!m || typeof m !== "object") {
122 return false;
123 }
124 const obj = m;
125 if (obj.type !== "desktop-mode-drop") {
126 return false;
127 }
128 const p = obj.payload;
129 if (!p || typeof p !== "object") {
130 return false;
131 }
132 return p.kind === "attachment" || p.kind === "post" || p.kind === "user";
133 }
134 function install() {
135 const expectedOrigin = window.location.origin;
136 window.addEventListener("message", (e) => {
137 if (e.origin !== expectedOrigin) {
138 return;
139 }
140 if (!isDropMsg(e.data)) {
141 return;
142 }
143 void performInsert(e.data.payload).catch((err) => {
144 const reason = err instanceof Error ? err.message : String(err);
145 console.error(
146 "[desktop-mode] Gutenberg drop receiver insert failed:",
147 err
148 );
149 notifyParentOfFailure(reason);
150 });
151 });
152 }
153 install();
154 exports.buildBlockSpec = buildBlockSpec;
155 Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
156 return exports;
157 }({});
158