diff --git a/addons/web/static/src/core/registry.js b/addons/web/static/src/core/registry.js index ec88c0fd4a555..4936cdd3a6747 100644 --- a/addons/web/static/src/core/registry.js +++ b/addons/web/static/src/core/registry.js @@ -80,11 +80,12 @@ export class Registry extends EventBus { * @param {string} key * @returns {any} */ - get(key) { - if (!(key in this.content)) { + get(key, defaultValue) { + if (arguments.length < 2 && !(key in this.content)) { throw new KeyNotFoundError(`Cannot find ${key} in this registry!`); } - return this.content[key][1]; + const info = this.content[key]; + return info ? info[1] : defaultValue; } /** diff --git a/addons/web/static/src/webclient/actions/action_service.js b/addons/web/static/src/webclient/actions/action_service.js index eb6121ddff852..324ff6672bbff 100644 --- a/addons/web/static/src/webclient/actions/action_service.js +++ b/addons/web/static/src/webclient/actions/action_service.js @@ -946,15 +946,8 @@ function makeActionManager(env) { case "ir.actions.server": return _executeServerAction(action, options); default: { - let handler; - try { - handler = actionHandlersRegistry.get(action.type); - } catch (e) { - if (!(e instanceof KeyNotFoundError)) { - throw e; - } - } - if (handler) { + let handler = actionHandlersRegistry.get(action.type, null); + if (handler !== null) { return handler({ env, action, options }); } throw new Error( diff --git a/addons/web/static/tests/core/registry_test.js b/addons/web/static/tests/core/registry_test.js index f868cb227daa0..5b2e60ca02dd4 100644 --- a/addons/web/static/tests/core/registry_test.js +++ b/addons/web/static/tests/core/registry_test.js @@ -13,6 +13,46 @@ QUnit.test("key set and get", function (assert) { assert.strictEqual(registry.get("foo"), foo); }); +QUnit.test("can set and get falsy values", function (assert) { + const registry = new Registry(); + registry.add("foo1", false); + registry.add("foo2", 0); + registry.add("foo3", ""); + registry.add("foo4", undefined); + registry.add("foo5", null); + assert.strictEqual(registry.get("foo1"), false); + assert.strictEqual(registry.get("foo2"), 0); + assert.strictEqual(registry.get("foo3"), ""); + assert.strictEqual(registry.get("foo4"), undefined); + assert.strictEqual(registry.get("foo5"), null); +}); + +QUnit.test("can set and get falsy values with default value", function (assert) { + const registry = new Registry(); + registry.add("foo1", false); + registry.add("foo2", 0); + registry.add("foo3", ""); + registry.add("foo4", undefined); + registry.add("foo5", null); + assert.strictEqual(registry.get("foo1", 1), false); + assert.strictEqual(registry.get("foo2", 1), 0); + assert.strictEqual(registry.get("foo3", 1), ""); + assert.strictEqual(registry.get("foo4", 1), undefined); + assert.strictEqual(registry.get("foo5", 1), null); +}); + +QUnit.test("can get a default value when missing key", function (assert) { + const registry = new Registry(); + assert.strictEqual(registry.get("missing", "default"), "default"); + assert.strictEqual(registry.get("missing", null), null); + assert.strictEqual(registry.get("missing", false), false); +}); + +QUnit.test("throws if key is missing", function (assert) { + const registry = new Registry(); + assert.throws(() => registry.get("missing")); +}); + QUnit.test("contains method", function (assert) { const registry = new Registry();