diff --git a/public/scripts/ui.js b/public/scripts/ui.js index fb44352..94542bb 100644 --- a/public/scripts/ui.js +++ b/public/scripts/ui.js @@ -1607,27 +1607,33 @@ class WebShareTargetUI { let shareTargetText; if (url) { - shareTargetText = url; // We share only the Link - no text. Because link-only text becomes clickable. + shareTargetText = url; // we share only the link - no text. } else if (title && text) { shareTargetText = title + '\r\n' + text; } else { shareTargetText = title + text; } - console.log('Shared Target Text:', '"' + shareTargetText + '"'); Events.fire('activate-paste-mode', {files: [], text: shareTargetText}) } else if (share_target_type === "files") { - const openRequest = window.indexedDB.open('pairdrop_store') - openRequest.onsuccess( db => { + let openRequest = window.indexedDB.open('pairdrop_store') + openRequest.onsuccess = e => { + const db = e.target.result; const tx = db.transaction('share_target_files', 'readwrite'); const store = tx.objectStore('share_target_files'); const request = store.getAll(); request.onsuccess = _ => { - Events.fire('activate-paste-mode', {files: request.result, text: ""}) + const fileObjects = request.result; + let filesReceived = []; + for (let i=0; i db.close(); + + Events.fire('activate-paste-mode', {files: filesReceived, text: ""}) } - }) + } } window.history.replaceState({}, "Rewrite URL", '/'); } @@ -1684,7 +1690,7 @@ class PersistentStorage { PersistentStorage.logBrowserNotCapable(); return; } - const DBOpenRequest = window.indexedDB.open('pairdrop_store', 2); + const DBOpenRequest = window.indexedDB.open('pairdrop_store', 3); DBOpenRequest.onerror = (e) => { PersistentStorage.logBrowserNotCapable(); console.log('Error initializing database: '); @@ -1710,7 +1716,10 @@ class PersistentStorage { } try { - db.createObjectStore('share_target_files'); + if (db.objectStoreNames.contains('share_target_files')) { + db.deleteObjectStore('share_target_files'); + } + db.createObjectStore('share_target_files', {autoIncrement: true}); } catch (error) { console.log("Object store named 'share_target_files' already exists") } diff --git a/public/service-worker.js b/public/service-worker.js index d286eb9..24c8d08 100644 --- a/public/service-worker.js +++ b/public/service-worker.js @@ -71,30 +71,11 @@ const update = request => self.addEventListener('fetch', function(event) { if (event.request.method === "POST") { // Requests related to Web Share Target. - event.respondWith( - (async () => { - const formData = await event.request.formData(); - const title = formData.get("title"); - const text = formData.get("text"); - const url = formData.get("url"); - const files = formData.get("files"); - let share_url = "/"; - if (files.length > 0) { - share_url = "/?share-target=files"; - const db = await window.indexedDB.open('pairdrop_store'); - const tx = db.transaction('share_target_files', 'readwrite'); - const store = tx.objectStore('share_target_files'); - for (let i=0; i 0 || text.length > 0 || url.length) { - share_url = `/?share-target=text&title=${title}&text=${text}&url=${url}`; - } - return Response.redirect(encodeURI(share_url), 303); - })() - ); + event.respondWith((async () => { + let share_url = await evaluateRequestData(event.request); + share_url = event.request.url + share_url; + return Response.redirect(encodeURI(share_url), 302); + })()); } else { // Regular requests not related to Web Share Target. event.respondWith( @@ -119,3 +100,49 @@ self.addEventListener('activate', evt => }) ) ); + +const evaluateRequestData = async function (request) { + const formData = await request.formData(); + const title = formData.get("title"); + const text = formData.get("text"); + const url = formData.get("url"); + const files = formData.getAll("allfiles"); + + + return new Promise(async (resolve) => { + if (files && files.length > 0) { + let fileObjects = []; + for (let i=0; i { + const db = e.target.result; + for (let i = 0; i < fileObjects.length; i++) { + const transaction = db.transaction('share_target_files', 'readwrite'); + const objectStore = transaction.objectStore('share_target_files'); + + const objectStoreRequest = objectStore.add(fileObjects[i]); + objectStoreRequest.onsuccess = _ => { + if (i === fileObjects.length - 1) resolve('?share-target=files'); + } + } + } + DBOpenRequest.onerror = _ => { + resolve(''); + } + } else { + let share_url = '?share-target=text'; + + if (title) share_url += `&title=${title}`; + if (text) share_url += `&text=${text}`; + if (url) share_url += `&url=${url}`; + + resolve(share_url); + } + }); +} diff --git a/public_included_ws_fallback/scripts/ui.js b/public_included_ws_fallback/scripts/ui.js index 8a28a19..9c72d12 100644 --- a/public_included_ws_fallback/scripts/ui.js +++ b/public_included_ws_fallback/scripts/ui.js @@ -1608,27 +1608,33 @@ class WebShareTargetUI { let shareTargetText; if (url) { - shareTargetText = url; // We share only the Link - no text. Because link-only text becomes clickable. + shareTargetText = url; // we share only the link - no text. } else if (title && text) { shareTargetText = title + '\r\n' + text; } else { shareTargetText = title + text; } - console.log('Shared Target Text:', '"' + shareTargetText + '"'); Events.fire('activate-paste-mode', {files: [], text: shareTargetText}) } else if (share_target_type === "files") { - const openRequest = window.indexedDB.open('pairdrop_store') - openRequest.onsuccess( db => { + let openRequest = window.indexedDB.open('pairdrop_store') + openRequest.onsuccess = e => { + const db = e.target.result; const tx = db.transaction('share_target_files', 'readwrite'); const store = tx.objectStore('share_target_files'); const request = store.getAll(); request.onsuccess = _ => { - Events.fire('activate-paste-mode', {files: request.result, text: ""}) + const fileObjects = request.result; + let filesReceived = []; + for (let i=0; i db.close(); + + Events.fire('activate-paste-mode', {files: filesReceived, text: ""}) } - }) + } } window.history.replaceState({}, "Rewrite URL", '/'); } @@ -1685,7 +1691,7 @@ class PersistentStorage { PersistentStorage.logBrowserNotCapable(); return; } - const DBOpenRequest = window.indexedDB.open('pairdrop_store', 2); + const DBOpenRequest = window.indexedDB.open('pairdrop_store', 3); DBOpenRequest.onerror = (e) => { PersistentStorage.logBrowserNotCapable(); console.log('Error initializing database: '); @@ -1711,7 +1717,10 @@ class PersistentStorage { } try { - db.createObjectStore('share_target_files'); + if (db.objectStoreNames.contains('share_target_files')) { + db.deleteObjectStore('share_target_files'); + } + db.createObjectStore('share_target_files', {autoIncrement: true}); } catch (error) { console.log("Object store named 'share_target_files' already exists") } diff --git a/public_included_ws_fallback/service-worker.js b/public_included_ws_fallback/service-worker.js index 25bc379..ea0886d 100644 --- a/public_included_ws_fallback/service-worker.js +++ b/public_included_ws_fallback/service-worker.js @@ -71,30 +71,11 @@ const update = request => self.addEventListener('fetch', function(event) { if (event.request.method === "POST") { // Requests related to Web Share Target. - event.respondWith( - (async () => { - const formData = await event.request.formData(); - const title = formData.get("title"); - const text = formData.get("text"); - const url = formData.get("url"); - const files = formData.get("files"); - let share_url = "/"; - if (files.length > 0) { - share_url = "/?share-target=files"; - const db = await window.indexedDB.open('pairdrop_store'); - const tx = db.transaction('share_target_files', 'readwrite'); - const store = tx.objectStore('share_target_files'); - for (let i=0; i 0 || text.length > 0 || url.length) { - share_url = `/?share-target=text&title=${title}&text=${text}&url=${url}`; - } - return Response.redirect(encodeURI(share_url), 303); - })() - ); + event.respondWith((async () => { + let share_url = await evaluateRequestData(event.request); + share_url = event.request.url + share_url; + return Response.redirect(encodeURI(share_url), 302); + })()); } else { // Regular requests not related to Web Share Target. event.respondWith( @@ -119,3 +100,49 @@ self.addEventListener('activate', evt => }) ) ); + +const evaluateRequestData = async function (request) { + const formData = await request.formData(); + const title = formData.get("title"); + const text = formData.get("text"); + const url = formData.get("url"); + const files = formData.getAll("allfiles"); + + + return new Promise(async (resolve) => { + if (files && files.length > 0) { + let fileObjects = []; + for (let i=0; i { + const db = e.target.result; + for (let i = 0; i < fileObjects.length; i++) { + const transaction = db.transaction('share_target_files', 'readwrite'); + const objectStore = transaction.objectStore('share_target_files'); + + const objectStoreRequest = objectStore.add(fileObjects[i]); + objectStoreRequest.onsuccess = _ => { + if (i === fileObjects.length - 1) resolve('?share-target=files'); + } + } + } + DBOpenRequest.onerror = _ => { + resolve(''); + } + } else { + let share_url = '?share-target=text'; + + if (title) share_url += `&title=${title}`; + if (text) share_url += `&text=${text}`; + if (url) share_url += `&url=${url}`; + + resolve(share_url); + } + }); +}