From bb0a1dab1302106ed3750497d689b2a6953a337c Mon Sep 17 00:00:00 2001 From: Dan Stillman Date: Sun, 21 Jun 2020 02:18:06 -0400 Subject: [PATCH] Don't normalize primary data values in Item.setField() Just enforce proper data types --- chrome/content/zotero/xpcom/data/item.js | 32 +++++++++++++++--------- test/tests/dataObjectTest.js | 2 +- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/chrome/content/zotero/xpcom/data/item.js b/chrome/content/zotero/xpcom/data/item.js index f55f6ba54d..601fe8b971 100644 --- a/chrome/content/zotero/xpcom/data/item.js +++ b/chrome/content/zotero/xpcom/data/item.js @@ -615,17 +615,6 @@ Zotero.Item.prototype.setField = function(field, value, loadIn) { throw new Error(`'${field}' value cannot be undefined`); } - // Normalize values - if (typeof value == 'number') { - value = "" + value; - } - else if (typeof value == 'string') { - value = value.trim().normalize(); - } - if (value === "" || value === null || value === false) { - value = false; - } - //Zotero.debug("Setting field '" + field + "' to '" + value + "' (loadIn: " + (loadIn ? 'true' : 'false') + ") for item " + this.id + " "); if (!field) { @@ -646,6 +635,9 @@ Zotero.Item.prototype.setField = function(field, value, loadIn) { switch (field) { case 'itemTypeID': + if (typeof value != 'number' || value != parseInt(value)) { + throw new Error(`${field} must be a number`); + } break; case 'dateAdded': @@ -664,10 +656,15 @@ Zotero.Item.prototype.setField = function(field, value, loadIn) { break; case 'version': - value = parseInt(value); + if (typeof value != 'number' || value != parseInt(value)) { + throw new Error(`${field} must be a number`); + } break; case 'synced': + if (typeof value != 'boolean') { + throw new Error(`${field} must be a boolean`); + } value = !!value; break; @@ -714,6 +711,17 @@ Zotero.Item.prototype.setField = function(field, value, loadIn) { return true; } + // Normalize values + if (typeof value == 'number') { + value = "" + value; + } + else if (typeof value == 'string') { + value = value.trim().normalize(); + } + if (value === "" || value === null || value === false) { + value = false; + } + if (!loadIn) { this._requireData('itemData'); } diff --git a/test/tests/dataObjectTest.js b/test/tests/dataObjectTest.js index 8b2c5a3a83..c6eb0f0582 100644 --- a/test/tests/dataObjectTest.js +++ b/test/tests/dataObjectTest.js @@ -141,7 +141,7 @@ describe("Zotero.DataObject", function() { var obj = createUnsavedDataObject(type); var id = yield obj.saveTx(); - obj.synced = 1; + obj.synced = true; yield obj.saveTx(); if (type == 'item') {