Bug 1507403 - Add more tests for clone before key evaluation; r=asuth
authorJan Varga <jan.varga@gmail.com>
Fri, 16 Nov 2018 11:05:37 +0100
changeset 503198 2ea6c6932f6e45bb6f472dd8d5271d53a22788ac
parent 503197 e6604d308037fe4b42170840a12e9e3cc795cb55
child 503199 f970d9b9b00c57bef40a51639390a0b2d4c1502e
push id10290
push userffxbld-merge
push dateMon, 03 Dec 2018 16:23:23 +0000
treeherdermozilla-beta@700bed2445e6 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersasuth
bugs1507403
milestone65.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1507403 - Add more tests for clone before key evaluation; r=asuth
dom/indexedDB/test/mochitest.ini
dom/indexedDB/test/test_clone_before_key_evaluation.html
dom/indexedDB/test/unit/test_clone_before_key_evaluation.js
dom/indexedDB/test/unit/xpcshell-shared.ini
--- a/dom/indexedDB/test/mochitest.ini
+++ b/dom/indexedDB/test/mochitest.ini
@@ -23,16 +23,17 @@ support-files =
   unit/test_add_put.js
   unit/test_add_twice_failure.js
   unit/test_advance.js
   unit/test_autoIncrement.js
   unit/test_autoIncrement_indexes.js
   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
   unit/test_create_index.js
   unit/test_create_index_with_integer_keys.js
   unit/test_create_locale_aware_index.js
   unit/test_create_objectStore.js
   unit/test_cursor_mutation.js
@@ -133,16 +134,17 @@ skip-if = e10s && os == 'win' && os_vers
 skip-if = (e10s && os == 'win' && os_version == '6.1') || (verify && (os == 'win')) # Bug 1342415
 [test_blob_worker_xhr_post_multifile.html]
 skip-if = e10s && os == 'win' && os_version == '6.1' # Bug 1342415
 [test_blob_worker_xhr_read.html]
 [test_blob_worker_xhr_read_slice.html]
 [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]
 [test_create_index.html]
 [test_create_index_with_integer_keys.html]
 [test_create_objectStore.html]
 [test_cursor_mutation.html]
 [test_cursor_update_updates_indexes.html]
new file mode 100644
--- /dev/null
+++ b/dom/indexedDB/test/test_clone_before_key_evaluation.html
@@ -0,0 +1,18 @@
+<!--
+  Any copyright is dedicated to the Public Domain.
+  http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <title>Indexed Database Test</title>
+
+  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+
+  <script type="text/javascript" src="unit/test_clone_before_key_evaluation.js"></script>
+  <script type="text/javascript" src="helpers.js"></script>
+</head>
+
+<body onload="runTest();"></body>
+
+</html>
new file mode 100644
--- /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();
+}
--- a/dom/indexedDB/test/unit/xpcshell-shared.ini
+++ b/dom/indexedDB/test/unit/xpcshell-shared.ini
@@ -6,16 +6,17 @@
 [test_abort_deleted_objectStore.js]
 [test_add_put.js]
 [test_add_twice_failure.js]
 [test_advance.js]
 [test_autoIncrement.js]
 [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]
 [test_create_index_with_integer_keys.js]
 [test_create_locale_aware_index.js]
 skip-if = toolkit == 'android' # bug 864843
 [test_create_objectStore.js]
 [test_cursor_cycle.js]