From 25fb52da2e3ebaa9fbb004adcea3bccf4dbbc483 Mon Sep 17 00:00:00 2001 From: Jan Varga Date: Thu, 15 Nov 2018 18:02:18 +0100 Subject: [PATCH] Bug 1507403 - Add more tests for clone before key evaluation; r=asuth --- dom/indexedDB/test/mochitest.ini | 2 + .../test_clone_before_key_evaluation.html | 18 +++ .../unit/test_clone_before_key_evaluation.js | 131 ++++++++++++++++++ dom/indexedDB/test/unit/xpcshell-shared.ini | 1 + 4 files changed, 152 insertions(+) create mode 100644 dom/indexedDB/test/test_clone_before_key_evaluation.html create mode 100644 dom/indexedDB/test/unit/test_clone_before_key_evaluation.js diff --git a/dom/indexedDB/test/mochitest.ini b/dom/indexedDB/test/mochitest.ini index ec465a76eda3..6ea2d8dad96b 100644 --- a/dom/indexedDB/test/mochitest.ini +++ b/dom/indexedDB/test/mochitest.ini @@ -28,6 +28,7 @@ support-files = unit/test_blob_file_backed.js unit/test_blocked_order.js unit/test_clear.js + unit/test_clone_before_key_evaluation.js unit/test_complex_keyPaths.js unit/test_constraint_error_messages.js unit/test_count.js @@ -138,6 +139,7 @@ skip-if = e10s && os == 'win' && os_version == '6.1' # Bug 1342415 [test_blocked_order.html] [test_bug937006.html] [test_clear.html] +[test_clone_before_key_evaluation.html] [test_complex_keyPaths.html] [test_constraint_error_messages.html] [test_count.html] diff --git a/dom/indexedDB/test/test_clone_before_key_evaluation.html b/dom/indexedDB/test/test_clone_before_key_evaluation.html new file mode 100644 index 000000000000..3fff86844809 --- /dev/null +++ b/dom/indexedDB/test/test_clone_before_key_evaluation.html @@ -0,0 +1,18 @@ + + + + Indexed Database Test + + + + + + + + + + + diff --git a/dom/indexedDB/test/unit/test_clone_before_key_evaluation.js b/dom/indexedDB/test/unit/test_clone_before_key_evaluation.js new file mode 100644 index 000000000000..066bfdc8addd --- /dev/null +++ b/dom/indexedDB/test/unit/test_clone_before_key_evaluation.js @@ -0,0 +1,131 @@ +/** + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +var testGenerator = testSteps(); + +function* testSteps() +{ + const name = this.window ? window.location.pathname + : "test_clone_before_key_evaluation.js"; + const objectStoreInfo = { + name: "customers", + options: { keyPath: "ssn" }, + }; + const indexInfo = { + name: "customerIndex", + keyPath: ["id", "email", "name"], + options: { unique: false }, + }; + + for (let test of [1, 2]) { + info("Opening database"); + + let request = indexedDB.open(name); + request.onerror = errorHandler; + request.onupgradeneeded = continueToNextStepSync; + request.onsuccess = unexpectedSuccessHandler; + yield undefined; + + // upgradeneeded + + request.onupgradeneeded = unexpectedSuccessHandler; + request.onsuccess = continueToNextStepSync; + + let db = request.result; + db.onerror = errorHandler; + + info("Creating objectStore"); + + let objectStore = db.createObjectStore(objectStoreInfo.name, + objectStoreInfo.options); + + info("Creating index"); + + objectStore.createIndex(indexInfo.name, + indexInfo.keyPath, + indexInfo.options); + + switch (test) { + case 1: { + info("Adding data with a getter"); + + let idCount = 0; + + const customerData = { + ssn: "444-44-4444", name: "Bill", age: 25, email: "bill@company.com", + get id() + { + idCount++; + objectStore.deleteIndex(indexInfo.name); + return "ID_001"; + } + }; + + objectStore.add(customerData); + + ok(idCount == 1, "Getter was called only once"); + + ok(objectStore.indexNames.length == 0, "Index was removed"); + + break; + } + + case 2: { + info("Adding data with a prototype getter"); + + let idCount = 0; + + const customerData = { + ssn: "555-55-5555", name: "Joe", age: 52, email: "joe@company.com", + }; + + Object.defineProperty(Object.prototype, 'id', { + get() { + idCount++; + objectStore.deleteIndex(indexInfo.name); + return "ID_002"; + }, + enumerable: false, + configurable: true, + }); + + objectStore.add(customerData); + + ok(idCount == 0, "Prototype getter was not called"); + + // Paranoid checks, just to be sure that the protype getter is called + // in standard JS. + + let id = customerData.id; + + ok(id == "ID_002", "Prototype getter returned correct value"); + ok(idCount == 1, "Prototype getter was called only once"); + + delete Object.prototype["id"]; + + id = customerData.id; + + ok(id == undefined, "Prototype getter was removed"); + + ok(objectStore.indexNames.length == 0, "Index was removed"); + + break; + } + } + + yield undefined; + + // success + + db.close(); + + request = indexedDB.deleteDatabase(name); + request.onerror = errorHandler; + request.onsuccess = continueToNextStepSync; + yield undefined; + } + + finishTest(); +} diff --git a/dom/indexedDB/test/unit/xpcshell-shared.ini b/dom/indexedDB/test/unit/xpcshell-shared.ini index efc9bb0aae6a..6859ab674638 100644 --- a/dom/indexedDB/test/unit/xpcshell-shared.ini +++ b/dom/indexedDB/test/unit/xpcshell-shared.ini @@ -11,6 +11,7 @@ [test_autoIncrement_indexes.js] [test_blocked_order.js] [test_clear.js] +[test_clone_before_key_evaluation.js] [test_complex_keyPaths.js] [test_count.js] [test_create_index.js]