clipboard reccursion fix
This commit is contained in:
parent
35118ca190
commit
3833ef2668
3 changed files with 70 additions and 10 deletions
|
|
@ -1,10 +1,18 @@
|
||||||
|
import { getClipboard } from "./native-clipboard.js";
|
||||||
|
|
||||||
export const clipboardShim = {
|
export const clipboardShim = {
|
||||||
readText() {
|
readText() {
|
||||||
return "";
|
return "";
|
||||||
},
|
},
|
||||||
|
|
||||||
writeText(text) {
|
writeText(text) {
|
||||||
navigator.clipboard.writeText(text).catch((e) => {
|
const clip = getClipboard();
|
||||||
|
|
||||||
|
if (!clip) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
clip.writeText(text).catch((e) => {
|
||||||
console.warn("[shim:clipboard] writeText failed:", e);
|
console.warn("[shim:clipboard] writeText failed:", e);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
@ -14,7 +22,13 @@ export const clipboardShim = {
|
||||||
},
|
},
|
||||||
|
|
||||||
writeHTML(html) {
|
writeHTML(html) {
|
||||||
navigator.clipboard
|
const clip = getClipboard();
|
||||||
|
|
||||||
|
if (!clip) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
clip
|
||||||
.write([
|
.write([
|
||||||
new ClipboardItem({
|
new ClipboardItem({
|
||||||
"text/html": new Blob([html], { type: "text/html" }),
|
"text/html": new Blob([html], { type: "text/html" }),
|
||||||
|
|
@ -35,6 +49,12 @@ export const clipboardShim = {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const clip = getClipboard();
|
||||||
|
|
||||||
|
if (!clip) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const pngData = image.toPNG();
|
const pngData = image.toPNG();
|
||||||
|
|
||||||
if (!pngData || pngData.length === 0) {
|
if (!pngData || pngData.length === 0) {
|
||||||
|
|
@ -43,9 +63,7 @@ export const clipboardShim = {
|
||||||
|
|
||||||
const blob = new Blob([pngData], { type: "image/png" });
|
const blob = new Blob([pngData], { type: "image/png" });
|
||||||
|
|
||||||
navigator.clipboard
|
clip.write([new ClipboardItem({ "image/png": blob })]).catch((e) => {
|
||||||
.write([new ClipboardItem({ "image/png": blob })])
|
|
||||||
.catch((e) => {
|
|
||||||
console.warn("[shim:clipboard] writeImage failed:", e);
|
console.warn("[shim:clipboard] writeImage failed:", e);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
@ -59,6 +77,12 @@ export const clipboardShim = {
|
||||||
},
|
},
|
||||||
|
|
||||||
clear() {
|
clear() {
|
||||||
navigator.clipboard.writeText("").catch(() => {});
|
const clip = getClipboard();
|
||||||
|
|
||||||
|
if (!clip) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
clip.writeText("").catch(() => {});
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
||||||
22
packages/shim/src/electron/remote/native-clipboard.js
Normal file
22
packages/shim/src/electron/remote/native-clipboard.js
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
// Obsidian points navigator.clipboard.writeText at electron.clipboard, which already points at this shim.
|
||||||
|
// To avoid recursion, use the untouched native prototype methods.
|
||||||
|
const proto = typeof Clipboard !== "undefined" ? Clipboard.prototype : null;
|
||||||
|
|
||||||
|
// Returns a native-backed clipboard facade, or null in insecure (non-localhost http) contexts.
|
||||||
|
export function getClipboard() {
|
||||||
|
const clip =
|
||||||
|
typeof navigator !== "undefined" ? navigator.clipboard : undefined;
|
||||||
|
|
||||||
|
if (!proto || !clip) {
|
||||||
|
console.warn(
|
||||||
|
"[shim:clipboard] clipboard API unavailable (insecure context?)",
|
||||||
|
);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
writeText: (text) => proto.writeText.call(clip, text),
|
||||||
|
write: (items) => proto.write.call(clip, items),
|
||||||
|
read: () => proto.read.call(clip),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
@ -1,3 +1,5 @@
|
||||||
|
import { getClipboard } from "./native-clipboard.js";
|
||||||
|
|
||||||
const currentWindowState = {
|
const currentWindowState = {
|
||||||
title: "Obsidian",
|
title: "Obsidian",
|
||||||
isMaximized: false,
|
isMaximized: false,
|
||||||
|
|
@ -196,7 +198,13 @@ const currentWebContents = {
|
||||||
document.execCommand("copy");
|
document.execCommand("copy");
|
||||||
},
|
},
|
||||||
paste() {
|
paste() {
|
||||||
navigator.clipboard
|
const clip = getClipboard();
|
||||||
|
|
||||||
|
if (!clip) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
clip
|
||||||
.read()
|
.read()
|
||||||
.then(async (items) => {
|
.then(async (items) => {
|
||||||
const dt = new DataTransfer();
|
const dt = new DataTransfer();
|
||||||
|
|
@ -233,7 +241,13 @@ const currentWebContents = {
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
pasteAndMatchStyle() {
|
pasteAndMatchStyle() {
|
||||||
navigator.clipboard
|
const clip = getClipboard();
|
||||||
|
|
||||||
|
if (!clip) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
clip
|
||||||
.read()
|
.read()
|
||||||
.then(async (items) => {
|
.then(async (items) => {
|
||||||
for (const item of items) {
|
for (const item of items) {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue