From ee9a282c19d5c80f915f5764404f06ea73f2a07a Mon Sep 17 00:00:00 2001 From: William Braeckman Date: Mon, 3 Oct 2022 11:14:33 +0000 Subject: [PATCH] [FIX] web: fix file upload service event listeners The event listeners were added to the upload object instead of the xhr object making them being called before they were supposed to. closes odoo/odoo#102061 X-original-commit: 804467d7b0a583ab36a47212d482b41d29ca2203 Related: odoo/enterprise#32247 Signed-off-by: William Braeckman (wbr) --- .../static/tests/mrp_document_kanban_tests.js | 7 ++++--- .../src/core/file_upload/file_upload_service.js | 6 +++--- .../web/static/tests/core/file_upload_tests.js | 17 ++++++++--------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/addons/mrp/static/tests/mrp_document_kanban_tests.js b/addons/mrp/static/tests/mrp_document_kanban_tests.js index 15054ef7f68..b539c00f51f 100644 --- a/addons/mrp/static/tests/mrp_document_kanban_tests.js +++ b/addons/mrp/static/tests/mrp_document_kanban_tests.js @@ -33,11 +33,12 @@ QUnit.module('MrpDocumentsKanbanView', { this.ORIGINAL_CREATE_XHR = fileUploadService.createXhr; this.patchDocumentXHR = (mockedXHRs, customSend) => { fileUploadService.createXhr = () => { - const xhr = { + const xhr = new window.EventTarget(); + Object.assign(xhr, { upload: new window.EventTarget(), - open() { }, + open() {}, send(data) { customSend && customSend(data); }, - }; + }); mockedXHRs.push(xhr); return xhr; }; diff --git a/addons/web/static/src/core/file_upload/file_upload_service.js b/addons/web/static/src/core/file_upload/file_upload_service.js index b0209e637a5..e631eda812c 100644 --- a/addons/web/static/src/core/file_upload/file_upload_service.js +++ b/addons/web/static/src/core/file_upload/file_upload_service.js @@ -68,13 +68,13 @@ export const fileUploadService = { upload.state = "loading"; }); // Load listener - xhr.upload.addEventListener("load", async () => { + xhr.addEventListener("load", () => { delete uploads[upload.id]; upload.state = "loaded"; bus.trigger("FILE_UPLOAD_LOADED", { upload }); }); // Error listener - xhr.upload.addEventListener("error", async () => { + xhr.addEventListener("error", async () => { delete uploads[upload.id]; upload.state = "error"; // Disable this option if you need more explicit error handling. @@ -87,7 +87,7 @@ export const fileUploadService = { bus.trigger("FILE_UPLOAD_ERROR", { upload }); }); // Abort listener, considered as error - xhr.upload.addEventListener("abort", async () => { + xhr.addEventListener("abort", async () => { delete uploads[upload.id]; upload.state = "abort"; bus.trigger("FILE_UPLOAD_ERROR", { upload }); diff --git a/addons/web/static/tests/core/file_upload_tests.js b/addons/web/static/tests/core/file_upload_tests.js index 4aea710b1b8..443330cf161 100644 --- a/addons/web/static/tests/core/file_upload_tests.js +++ b/addons/web/static/tests/core/file_upload_tests.js @@ -49,13 +49,12 @@ QUnit.module("Components", ({ beforeEach }) => { patchUpload = (customSend) => { patchWithCleanup(fileUploadService, { createXhr() { - const xhr = { + const xhr = new window.EventTarget(); + Object.assign(xhr, { upload: new window.EventTarget(), open() {}, - send(data) { - customSend && customSend(data); - }, - }; + send(data) { customSend && customSend(data); }, + }); return xhr; }, }); @@ -92,7 +91,7 @@ QUnit.module("Components", ({ beforeEach }) => { const fileUploadService = env.services.file_upload; fileUploadService.upload("/test/", []); await nextTick(); - fileUploadService.uploads[1].xhr.upload.dispatchEvent(new Event("load")); + fileUploadService.uploads[1].xhr.dispatchEvent(new Event("load")); await nextTick(); assert.containsNone(target, ".file_upload"); }); @@ -104,7 +103,7 @@ QUnit.module("Components", ({ beforeEach }) => { const fileUploadService = env.services.file_upload; fileUploadService.upload("/test/", []); await nextTick(); - fileUploadService.uploads[1].xhr.upload.dispatchEvent(new Event("error")); + fileUploadService.uploads[1].xhr.dispatchEvent(new Event("error")); await nextTick(); assert.containsNone(target, ".file_upload"); }); @@ -116,7 +115,7 @@ QUnit.module("Components", ({ beforeEach }) => { const fileUploadService = env.services.file_upload; fileUploadService.upload("/test/", []); await nextTick(); - fileUploadService.uploads[1].xhr.upload.dispatchEvent(new Event("abort")); + fileUploadService.uploads[1].xhr.dispatchEvent(new Event("abort")); await nextTick(); assert.containsNone(target, ".file_upload"); }); @@ -130,7 +129,7 @@ QUnit.module("Components", ({ beforeEach }) => { await nextTick(); patchWithCleanup(env.services.dialog, { add: () => { - fileUploadService.uploads[1].xhr.upload.dispatchEvent(new Event("abort")); + fileUploadService.uploads[1].xhr.dispatchEvent(new Event("abort")); }, }); await click(target, ".o-file-upload-progress-bar-abort", true);