[FIX] web: prevent missing 'data' argument error while uploading empty file

DataURL returns 'data:' in Chrome for empty files which is not valid dataURLas
it expects 'data:<mimetype>;base64' . This DataURL method is used to obtain
base64 representation of the file data,. That's why the 'data' argument is
missing and error is being generated.

Steps to reproduce:
1) Open Notes and create a new Note in Chrome.
2) Add a new attachment using /image command.
3) Add an empty file.

By applying this,it will return proper format for empty file.

sentry - 3749971166

closes odoo/odoo#120060

X-original-commit: fd6b904a97e7dab6e720675d9c805ed45eacef1e
Signed-off-by: Samuel Degueldre <sad@odoo.com>
This commit is contained in:
Mohit Beniwal
2023-04-28 13:33:25 +02:00
parent b303b20e7d
commit aeb199d77f
4 changed files with 30 additions and 3 deletions
+8 -1
View File
@@ -69,7 +69,14 @@ export function getDataURLFromFile(file) {
}
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.addEventListener("load", () => resolve(reader.result));
reader.addEventListener("load", () => {
// Handle Chrome bug that creates invalid data URLs for empty files
if (reader.result === "data:") {
resolve(`data:${file.type};base64,`);
} else {
resolve(reader.result);
}
});
reader.addEventListener("abort", reject);
reader.addEventListener("error", reject);
reader.readAsDataURL(file);
@@ -409,7 +409,12 @@ const utils = {
return new Promise(function (resolve, reject) {
var reader = new FileReader();
reader.addEventListener('load', function () {
resolve(reader.result);
// Handle Chrome bug that creates invalid data URLs for empty files
if (reader.result === "data:") {
resolve(`data:${file.type};base64,`);
} else {
resolve(reader.result);
}
});
reader.addEventListener('abort', reject);
reader.addEventListener('error', reject);
@@ -1,7 +1,7 @@
/** @odoo-module */
import { browser } from "@web/core/browser/browser";
import { getOrigin, url } from "@web/core/utils/urls";
import { getDataURLFromFile, getOrigin, url } from "@web/core/utils/urls";
import { patchWithCleanup } from "../../helpers/utils";
QUnit.module("URLS", (hooks) => {
@@ -59,4 +59,10 @@ QUnit.module("URLS", (hooks) => {
});
assert.strictEqual(testUrl, "https://cors_server/cors_route/?my_param=1%2C2");
});
QUnit.test("getDataURLFromFile handles empty file", async (assert) => {
const emptyFile = new File([""], "empty.txt", { type: "text/plain" });
const dataUrl = await getDataURLFromFile(emptyFile);
assert.strictEqual(dataUrl, "data:text/plain;base64,", "dataURL for empty file is not proper");
});
});
@@ -1,6 +1,7 @@
/** @odoo-module **/
import utils from "web.utils";
import { getDataURLFromFile } from "@web/core/utils/urls";
QUnit.module('core', {}, function () {
@@ -301,4 +302,12 @@ QUnit.module('core', {}, function () {
assert.deepEqual(sortBy(ints, null, 'desc'), [5, 2, 1]);
assert.deepEqual(sortBy(objstrss, prop, 'desc'), [{ x: 'z' }, { x: 'b' }, { x: 'a' }]);
});
QUnit.test('getDataURLFromFile handles empty file', async function (assert) {
assert.expect(1);
const emptyFile = new File([""], "empty.txt", { type: "text/plain" });
const dataUrl = await getDataURLFromFile(emptyFile);
assert.strictEqual(dataUrl, "data:text/plain;base64,", "dataURL for empty file is not proper");
});
});