Commit 6186e604 authored by Adrienne Walker's avatar Adrienne Walker Committed by Commit Bot

Expose IDBTransacation durability enum

Per discussion at TPAC, this value that was previously only a parameter
on IDBDatabase.transaction is now visible on the IDBTransaction itself.

This experimental option is behind the
RuntimeEnabledFeatures::IDBRelaxedDurabilityEnabled flag.

Bug: 965883
Change-Id: Iace6607b0b28702de3e9bd397f9942e9457f1cad
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1818462Reviewed-by: default avatarJoshua Bell <jsbell@chromium.org>
Reviewed-by: default avatarVictor Costan <pwnall@chromium.org>
Commit-Queue: enne <enne@chromium.org>
Cr-Commit-Position: refs/heads/master@{#699862}
parent cd25ee21
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
#include "third_party/blink/renderer/bindings/modules/v8/v8_idb_observer_callback.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_idb_observer_callback.h"
#include "third_party/blink/renderer/core/dom/events/event_queue.h" #include "third_party/blink/renderer/core/dom/events/event_queue.h"
#include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h"
#include "third_party/blink/renderer/modules/indexed_db_names.h"
#include "third_party/blink/renderer/modules/indexeddb/idb_any.h" #include "third_party/blink/renderer/modules/indexeddb/idb_any.h"
#include "third_party/blink/renderer/modules/indexeddb/idb_event_dispatcher.h" #include "third_party/blink/renderer/modules/indexeddb/idb_event_dispatcher.h"
#include "third_party/blink/renderer/modules/indexeddb/idb_index.h" #include "third_party/blink/renderer/modules/indexeddb/idb_index.h"
...@@ -433,9 +434,9 @@ IDBTransaction* IDBDatabase::transaction( ...@@ -433,9 +434,9 @@ IDBTransaction* IDBDatabase::transaction(
mojom::IDBTransactionDurability::Default; mojom::IDBTransactionDurability::Default;
if (options) { if (options) {
DCHECK(RuntimeEnabledFeatures::IDBRelaxedDurabilityEnabled()); DCHECK(RuntimeEnabledFeatures::IDBRelaxedDurabilityEnabled());
if (options->durability() == "relaxed") { if (options->durability() == indexed_db_names::kRelaxed) {
durability = mojom::IDBTransactionDurability::Relaxed; durability = mojom::IDBTransactionDurability::Relaxed;
} else if (options->durability() == "strict") { } else if (options->durability() == indexed_db_names::kStrict) {
durability = mojom::IDBTransactionDurability::Strict; durability = mojom::IDBTransactionDurability::Strict;
} }
} }
...@@ -446,7 +447,7 @@ IDBTransaction* IDBDatabase::transaction( ...@@ -446,7 +447,7 @@ IDBTransaction* IDBDatabase::transaction(
return IDBTransaction::CreateNonVersionChange( return IDBTransaction::CreateNonVersionChange(
script_state, std::move(transaction_backend), transaction_id, scope, mode, script_state, std::move(transaction_backend), transaction_id, scope, mode,
this); durability, this);
} }
void IDBDatabase::ForceClose() { void IDBDatabase::ForceClose() {
......
...@@ -197,7 +197,8 @@ class IDBRequestTest : public testing::Test { ...@@ -197,7 +197,8 @@ class IDBRequestTest : public testing::Test {
HashSet<String> transaction_scope = {"store"}; HashSet<String> transaction_scope = {"store"};
transaction_ = IDBTransaction::CreateNonVersionChange( transaction_ = IDBTransaction::CreateNonVersionChange(
scope.GetScriptState(), std::move(transaction_backend), kTransactionId, scope.GetScriptState(), std::move(transaction_backend), kTransactionId,
transaction_scope, mojom::IDBTransactionMode::ReadOnly, db_.Get()); transaction_scope, mojom::IDBTransactionMode::ReadOnly,
mojom::IDBTransactionDurability::Relaxed, db_.Get());
IDBKeyPath store_key_path("primaryKey"); IDBKeyPath store_key_path("primaryKey");
scoped_refptr<IDBObjectStoreMetadata> store_metadata = base::AdoptRef( scoped_refptr<IDBObjectStoreMetadata> store_metadata = base::AdoptRef(
......
...@@ -52,12 +52,14 @@ IDBTransaction* IDBTransaction::CreateNonVersionChange( ...@@ -52,12 +52,14 @@ IDBTransaction* IDBTransaction::CreateNonVersionChange(
int64_t id, int64_t id,
const HashSet<String>& scope, const HashSet<String>& scope,
mojom::IDBTransactionMode mode, mojom::IDBTransactionMode mode,
mojom::IDBTransactionDurability durability,
IDBDatabase* db) { IDBDatabase* db) {
DCHECK_NE(mode, mojom::IDBTransactionMode::VersionChange); DCHECK_NE(mode, mojom::IDBTransactionMode::VersionChange);
DCHECK(!scope.IsEmpty()) << "Non-version transactions should operate on a " DCHECK(!scope.IsEmpty()) << "Non-version transactions should operate on a "
"well-defined set of stores"; "well-defined set of stores";
return MakeGarbageCollected<IDBTransaction>( return MakeGarbageCollected<IDBTransaction>(script_state,
script_state, std::move(transaction_backend), id, scope, mode, db); std::move(transaction_backend),
id, scope, mode, durability, db);
} }
IDBTransaction* IDBTransaction::CreateVersionChange( IDBTransaction* IDBTransaction::CreateVersionChange(
...@@ -78,12 +80,14 @@ IDBTransaction::IDBTransaction( ...@@ -78,12 +80,14 @@ IDBTransaction::IDBTransaction(
int64_t id, int64_t id,
const HashSet<String>& scope, const HashSet<String>& scope,
mojom::IDBTransactionMode mode, mojom::IDBTransactionMode mode,
mojom::IDBTransactionDurability durability,
IDBDatabase* db) IDBDatabase* db)
: ContextLifecycleObserver(ExecutionContext::From(script_state)), : ContextLifecycleObserver(ExecutionContext::From(script_state)),
transaction_backend_(std::move(transaction_backend)), transaction_backend_(std::move(transaction_backend)),
id_(id), id_(id),
database_(db), database_(db),
mode_(mode), mode_(mode),
durability_(durability),
scope_(scope), scope_(scope),
event_queue_( event_queue_(
MakeGarbageCollected<EventQueue>(ExecutionContext::From(script_state), MakeGarbageCollected<EventQueue>(ExecutionContext::From(script_state),
...@@ -122,6 +126,7 @@ IDBTransaction::IDBTransaction( ...@@ -122,6 +126,7 @@ IDBTransaction::IDBTransaction(
database_(db), database_(db),
open_db_request_(open_db_request), open_db_request_(open_db_request),
mode_(mojom::IDBTransactionMode::VersionChange), mode_(mojom::IDBTransactionMode::VersionChange),
durability_(mojom::IDBTransactionDurability::Default),
state_(kInactive), state_(kInactive),
old_database_metadata_(old_metadata), old_database_metadata_(old_metadata),
event_queue_( event_queue_(
...@@ -495,6 +500,21 @@ const String& IDBTransaction::mode() const { ...@@ -495,6 +500,21 @@ const String& IDBTransaction::mode() const {
return indexed_db_names::kReadonly; return indexed_db_names::kReadonly;
} }
const String& IDBTransaction::durability() const {
switch (durability_) {
case mojom::IDBTransactionDurability::Default:
return indexed_db_names::kDefault;
case mojom::IDBTransactionDurability::Strict:
return indexed_db_names::kStrict;
case mojom::IDBTransactionDurability::Relaxed:
return indexed_db_names::kRelaxed;
}
NOTREACHED();
}
DOMStringList* IDBTransaction::objectStoreNames() const { DOMStringList* IDBTransaction::objectStoreNames() const {
if (IsVersionChange()) if (IsVersionChange())
return database_->objectStoreNames(); return database_->objectStoreNames();
......
...@@ -75,6 +75,7 @@ class MODULES_EXPORT IDBTransaction final ...@@ -75,6 +75,7 @@ class MODULES_EXPORT IDBTransaction final
int64_t transaction_id, int64_t transaction_id,
const HashSet<String>& scope, const HashSet<String>& scope,
mojom::IDBTransactionMode, mojom::IDBTransactionMode,
mojom::IDBTransactionDurability,
IDBDatabase* database); IDBDatabase* database);
static IDBTransaction* CreateVersionChange( static IDBTransaction* CreateVersionChange(
ExecutionContext*, ExecutionContext*,
...@@ -90,6 +91,7 @@ class MODULES_EXPORT IDBTransaction final ...@@ -90,6 +91,7 @@ class MODULES_EXPORT IDBTransaction final
int64_t, int64_t,
const HashSet<String>& scope, const HashSet<String>& scope,
mojom::IDBTransactionMode, mojom::IDBTransactionMode,
mojom::IDBTransactionDurability,
IDBDatabase*); IDBDatabase*);
// For upgrade transactions. // For upgrade transactions.
IDBTransaction(ExecutionContext*, IDBTransaction(ExecutionContext*,
...@@ -122,6 +124,7 @@ class MODULES_EXPORT IDBTransaction final ...@@ -122,6 +124,7 @@ class MODULES_EXPORT IDBTransaction final
// Implement the IDBTransaction IDL // Implement the IDBTransaction IDL
const String& mode() const; const String& mode() const;
const String& durability() const;
DOMStringList* objectStoreNames() const; DOMStringList* objectStoreNames() const;
IDBDatabase* db() const { return database_.Get(); } IDBDatabase* db() const { return database_.Get(); }
DOMException* error() const { return error_; } DOMException* error() const { return error_; }
...@@ -213,6 +216,7 @@ class MODULES_EXPORT IDBTransaction final ...@@ -213,6 +216,7 @@ class MODULES_EXPORT IDBTransaction final
Member<IDBDatabase> database_; Member<IDBDatabase> database_;
Member<IDBOpenDBRequest> open_db_request_; Member<IDBOpenDBRequest> open_db_request_;
const mojom::IDBTransactionMode mode_; const mojom::IDBTransactionMode mode_;
const mojom::IDBTransactionDurability durability_;
// The names of the object stores that make up this transaction's scope. // The names of the object stores that make up this transaction's scope.
// //
......
...@@ -42,6 +42,7 @@ enum IDBTransactionMode { ...@@ -42,6 +42,7 @@ enum IDBTransactionMode {
// Properties // Properties
readonly attribute DOMStringList objectStoreNames; readonly attribute DOMStringList objectStoreNames;
readonly attribute IDBTransactionMode mode; readonly attribute IDBTransactionMode mode;
[RuntimeEnabled=IDBRelaxedDurability] readonly attribute IDBTransactionDurability durability;
[SameObject] readonly attribute IDBDatabase db; [SameObject] readonly attribute IDBDatabase db;
readonly attribute DOMException error; readonly attribute DOMException error;
......
...@@ -98,7 +98,8 @@ class IDBTransactionTest : public testing::Test { ...@@ -98,7 +98,8 @@ class IDBTransactionTest : public testing::Test {
HashSet<String> transaction_scope = {"store"}; HashSet<String> transaction_scope = {"store"};
transaction_ = IDBTransaction::CreateNonVersionChange( transaction_ = IDBTransaction::CreateNonVersionChange(
scope.GetScriptState(), std::move(transaction_backend), kTransactionId, scope.GetScriptState(), std::move(transaction_backend), kTransactionId,
transaction_scope, mojom::IDBTransactionMode::ReadOnly, db_.Get()); transaction_scope, mojom::IDBTransactionMode::ReadOnly,
mojom::IDBTransactionDurability::Relaxed, db_.Get());
IDBKeyPath store_key_path("primaryKey"); IDBKeyPath store_key_path("primaryKey");
scoped_refptr<IDBObjectStoreMetadata> store_metadata = base::AdoptRef( scoped_refptr<IDBObjectStoreMetadata> store_metadata = base::AdoptRef(
......
...@@ -32,5 +32,11 @@ ...@@ -32,5 +32,11 @@
"put", "put",
"delete", "delete",
"clear", "clear",
// The IDBTransactionDurability enum is still being standardized.
// https://chromestatus.com/feature/5730701489995776
"default",
"relaxed",
"strict",
], ],
} }
...@@ -3,18 +3,18 @@ ...@@ -3,18 +3,18 @@
/** /**
* This file contains the webplatform smoke tests for the optional * This file contains the webplatform smoke tests for the optional
* relaxedDurability parameter of the IndexedDB transaction API. * durability parameter of the IndexedDB transaction API.
* *
* @author enne@chromium.org * @author enne@chromium.org
*/ */
// Smoke test optional parameter on IndexedDB.transaction. // Smoke test optional parameter on IndexedDB.transaction.
let cases = [ let cases = [
undefined, { options: undefined, expected: 'default' },
{}, { options: {}, expected: 'default' },
{durability: "default"}, { options: { durability: 'default'}, expected: 'default' },
{durability: "relaxed"}, { options: { durability: 'relaxed'}, expected: 'relaxed' },
{durability: "strict"}, { options: { durability: 'strict'}, expected: 'strict' },
]; ];
for (let i = 0; i < cases.length; ++i) { for (let i = 0; i < cases.length; ++i) {
...@@ -22,11 +22,13 @@ for (let i = 0; i < cases.length; ++i) { ...@@ -22,11 +22,13 @@ for (let i = 0; i < cases.length; ++i) {
const db = await createDatabase(testCase, db => { const db = await createDatabase(testCase, db => {
createBooksStore(testCase, db); createBooksStore(testCase, db);
}); });
const txn = db.transaction(['books'], 'readwrite', cases[i]); const txn = db.transaction(['books'], 'readwrite', cases[i].options);
const objectStore = txn.objectStore('books'); const objectStore = txn.objectStore('books');
objectStore.put({isbn: 'one', title: 'title1'}); objectStore.put({isbn: 'one', title: 'title1'});
await promiseForTransaction(testCase, txn); await promiseForTransaction(testCase, txn);
assert_equals(txn.durability, cases[i].expected);
const txn2 = db.transaction(['books'], 'readonly'); const txn2 = db.transaction(['books'], 'readonly');
const objectStore2 = txn2.objectStore('books'); const objectStore2 = txn2.objectStore('books');
const getTitle1 = objectStore2.get('one'); const getTitle1 = objectStore2.get('one');
...@@ -38,3 +40,14 @@ for (let i = 0; i < cases.length; ++i) { ...@@ -38,3 +40,14 @@ for (let i = 0; i < cases.length; ++i) {
db.close(); db.close();
}, 'Committed data can be read back out: case ' + i); }, 'Committed data can be read back out: case ' + i);
} }
promise_test(async testCase => {
const db = await createDatabase(testCase, db => {
createBooksStore(testCase, db);
});
assert_throws(new TypeError(), function() {
db.transaction(['books'], 'readwrite', { durability: 'invalid' });
});
db.close();
}, 'Invalid durability option throws a TypeError');
...@@ -736,6 +736,7 @@ interface IDBRequest : EventTarget ...@@ -736,6 +736,7 @@ interface IDBRequest : EventTarget
interface IDBTransaction : EventTarget interface IDBTransaction : EventTarget
attribute @@toStringTag attribute @@toStringTag
getter db getter db
getter durability
getter error getter error
getter mode getter mode
getter objectStoreNames getter objectStoreNames
......
...@@ -678,6 +678,7 @@ Starting worker: resources/global-interface-listing-worker.js ...@@ -678,6 +678,7 @@ Starting worker: resources/global-interface-listing-worker.js
[Worker] interface IDBTransaction : EventTarget [Worker] interface IDBTransaction : EventTarget
[Worker] attribute @@toStringTag [Worker] attribute @@toStringTag
[Worker] getter db [Worker] getter db
[Worker] getter durability
[Worker] getter error [Worker] getter error
[Worker] getter mode [Worker] getter mode
[Worker] getter objectStoreNames [Worker] getter objectStoreNames
......
...@@ -4407,6 +4407,7 @@ interface IDBRequest : EventTarget ...@@ -4407,6 +4407,7 @@ interface IDBRequest : EventTarget
interface IDBTransaction : EventTarget interface IDBTransaction : EventTarget
attribute @@toStringTag attribute @@toStringTag
getter db getter db
getter durability
getter error getter error
getter mode getter mode
getter objectStoreNames getter objectStoreNames
......
...@@ -673,6 +673,7 @@ Starting worker: resources/global-interface-listing-worker.js ...@@ -673,6 +673,7 @@ Starting worker: resources/global-interface-listing-worker.js
[Worker] interface IDBTransaction : EventTarget [Worker] interface IDBTransaction : EventTarget
[Worker] attribute @@toStringTag [Worker] attribute @@toStringTag
[Worker] getter db [Worker] getter db
[Worker] getter durability
[Worker] getter error [Worker] getter error
[Worker] getter mode [Worker] getter mode
[Worker] getter objectStoreNames [Worker] getter objectStoreNames
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment