[FIX] web: JournalDashboardGraph widget crash Mk.II
Hardening of commit:995610c065bf0242cb5023cfad2940234395739e The JournalDashboardGraph requires nv, which is lazyloaded. However it requires nvd3.js which is loaded after nv.d3.js. A function called in destroy is defined by nv.d3.js, which can make the crashhappen with the right (wrong) timing. opw 1873749
This commit is contained in:
committed by
len-odoo
parent
70ed882088
commit
b83db27135
@@ -2055,7 +2055,7 @@ var JournalDashboardGraph = AbstractField.extend({
|
||||
return this._super.apply(this, arguments);
|
||||
},
|
||||
destroy: function () {
|
||||
if ('nv' in window) {
|
||||
if ('nv' in window && nv.utils && nv.utils.offWindowResize) {
|
||||
// if the widget is destroyed before the lazy loaded libs (nv) are
|
||||
// actually loaded (i.e. after the widget has actually started),
|
||||
// nv is undefined, but the handler isn't bound yet anyway
|
||||
|
||||
@@ -1902,6 +1902,45 @@ QUnit.module('basic_fields', {
|
||||
assert.verifySteps(['destroy']);
|
||||
});
|
||||
|
||||
QUnit.test('graph dashboard widget can be destroyed when nv is partially loaded', function (assert) {
|
||||
// this test ensures that the JournalDashboardGraph widget doesn't crash
|
||||
// when being destroyed before nv has been completely loaded
|
||||
assert.expect(2);
|
||||
|
||||
testUtils.patch(basicFields.JournalDashboardGraph, {
|
||||
destroy: function () {
|
||||
assert.step('destroy');
|
||||
// nv is fully loaded only when nvd3.js has been loaded
|
||||
// which happens sequentially after nv.d3.js
|
||||
// we simulate this race condition with:
|
||||
var offWindowResize = window.nv.utils.offWindowResize;
|
||||
window.nv.utils.offWindowResize = undefined;
|
||||
this._super.apply(this, arguments);
|
||||
window.nv.utils.offWindowResize = offWindowResize;
|
||||
},
|
||||
});
|
||||
|
||||
var kanban = createView({
|
||||
View: KanbanView,
|
||||
model: 'partner',
|
||||
data: this.data,
|
||||
arch: '<kanban class="o_kanban_test">' +
|
||||
'<field name="graph_type"/>' +
|
||||
'<templates><t t-name="kanban-box">' +
|
||||
'<div>' +
|
||||
'<field name="graph_data" t-att-graph_type="record.graph_type.raw_value" widget="dashboard_graph"/>' +
|
||||
'</div>' +
|
||||
'</t>' +
|
||||
'</templates></kanban>',
|
||||
domain: [['id', 'in', [1]]],
|
||||
});
|
||||
|
||||
kanban.destroy();
|
||||
testUtils.unpatch(basicFields.JournalDashboardGraph);
|
||||
|
||||
assert.verifySteps(['destroy']);
|
||||
});
|
||||
|
||||
QUnit.module('AceEditor');
|
||||
|
||||
QUnit.test('ace widget on text fields works', function (assert) {
|
||||
|
||||
Reference in New Issue
Block a user