Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(767)

Side by Side Diff: third_party/WebKit/Source/modules/indexeddb/IDBObjectStore.cpp

Issue 2276593002: Support renaming of IndexedDB indexes and object stores. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Added test coverage for the (slightly incorrect) behavior in strict mode when our flag is not enabl… Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2010 Google Inc. All rights reserved. 2 * Copyright (C) 2010 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 7 *
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
64 ASSERT(m_transaction); 64 ASSERT(m_transaction);
65 } 65 }
66 66
67 DEFINE_TRACE(IDBObjectStore) 67 DEFINE_TRACE(IDBObjectStore)
68 { 68 {
69 visitor->trace(m_transaction); 69 visitor->trace(m_transaction);
70 visitor->trace(m_indexMap); 70 visitor->trace(m_indexMap);
71 visitor->trace(m_createdIndexes); 71 visitor->trace(m_createdIndexes);
72 } 72 }
73 73
74 void IDBObjectStore::setName(const String& name, ExceptionState& exceptionState)
75 {
76 if (!RuntimeEnabledFeatures::indexedDBExperimentalEnabled())
77 return;
78
79 IDB_TRACE("IDBObjectStore::setName");
80 if (!m_transaction->isVersionChange()) {
81 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::notVers ionChangeTransactionErrorMessage);
82 return;
83 }
84 if (isDeleted()) {
85 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::objectS toreDeletedErrorMessage);
86 return;
87 }
88 if (m_transaction->isFinished() || m_transaction->isFinishing()) {
89 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase:: transactionFinishedErrorMessage);
90 return;
91 }
92 if (!m_transaction->isActive()) {
93 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase:: transactionInactiveErrorMessage);
94 return;
95 }
96
97 if (m_metadata.name == name)
98 return;
99 if (m_transaction->db()->containsObjectStore(name)) {
100 exceptionState.throwDOMException(ConstraintError, IDBDatabase::objectSto reNameTakenErrorMessage);
101 return;
102 }
103 if (!backendDB()) {
104 exceptionState.throwDOMException(InvalidStateError, IDBDatabase::databas eClosedErrorMessage);
105 return;
106 }
107
108 backendDB()->renameObjectStore(m_transaction->id(), id(), name);
109 m_transaction->objectStoreRenamed(m_metadata.name, name);
110 m_metadata.name = name;
111
112 // The name inside the database's version of the object store metadata is us ed by IDBDatabase.objectStoreNames().
113 // If the transaction is aborted, this name will be reverted when the metada ta is overwritten with the previousMetadata in IDBTransaction.
114 m_transaction->db()->objectStoreRenamed(id(), name);
115 }
116
74 ScriptValue IDBObjectStore::keyPath(ScriptState* scriptState) const 117 ScriptValue IDBObjectStore::keyPath(ScriptState* scriptState) const
75 { 118 {
76 return ScriptValue::from(scriptState, m_metadata.keyPath); 119 return ScriptValue::from(scriptState, m_metadata.keyPath);
77 } 120 }
78 121
79 DOMStringList* IDBObjectStore::indexNames() const 122 DOMStringList* IDBObjectStore::indexNames() const
80 { 123 {
81 IDB_TRACE("IDBObjectStore::indexNames"); 124 IDB_TRACE("IDBObjectStore::indexNames");
82 DOMStringList* indexNames = DOMStringList::create(DOMStringList::IndexedDB); 125 DOMStringList* indexNames = DOMStringList::create(DOMStringList::IndexedDB);
83 for (const auto& it : m_metadata.indexes) 126 for (const auto& it : m_metadata.indexes)
(...skipping 454 matching lines...) Expand 10 before | Expand all | Expand 10 after
538 } 581 }
539 if (m_transaction->isFinished() || m_transaction->isFinishing()) { 582 if (m_transaction->isFinished() || m_transaction->isFinishing()) {
540 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase:: transactionFinishedErrorMessage); 583 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase:: transactionFinishedErrorMessage);
541 return nullptr; 584 return nullptr;
542 } 585 }
543 if (!m_transaction->isActive()) { 586 if (!m_transaction->isActive()) {
544 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase:: transactionInactiveErrorMessage); 587 exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase:: transactionInactiveErrorMessage);
545 return nullptr; 588 return nullptr;
546 } 589 }
547 if (containsIndex(name)) { 590 if (containsIndex(name)) {
548 exceptionState.throwDOMException(ConstraintError, "An index with the spe cified name already exists."); 591 exceptionState.throwDOMException(ConstraintError, IDBDatabase::indexName TakenErrorMessage);
549 return nullptr; 592 return nullptr;
550 } 593 }
551 if (!keyPath.isValid()) { 594 if (!keyPath.isValid()) {
552 exceptionState.throwDOMException(SyntaxError, "The keyPath argument cont ains an invalid key path."); 595 exceptionState.throwDOMException(SyntaxError, "The keyPath argument cont ains an invalid key path.");
553 return nullptr; 596 return nullptr;
554 } 597 }
555 if (keyPath.getType() == IDBKeyPath::ArrayType && options.multiEntry()) { 598 if (keyPath.getType() == IDBKeyPath::ArrayType && options.multiEntry()) {
556 exceptionState.throwDOMException(InvalidAccessError, "The keyPath argume nt was an array and the multiEntry option is true."); 599 exceptionState.throwDOMException(InvalidAccessError, "The keyPath argume nt was an array and the multiEntry option is true.");
557 return nullptr; 600 return nullptr;
558 } 601 }
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
773 void IDBObjectStore::transactionFinished() 816 void IDBObjectStore::transactionFinished()
774 { 817 {
775 ASSERT(m_transaction->isFinished()); 818 ASSERT(m_transaction->isFinished());
776 819
777 // Break reference cycles. 820 // Break reference cycles.
778 // TODO(jsbell): This can be removed c/o Oilpan. 821 // TODO(jsbell): This can be removed c/o Oilpan.
779 m_indexMap.clear(); 822 m_indexMap.clear();
780 m_createdIndexes.clear(); 823 m_createdIndexes.clear();
781 } 824 }
782 825
826 void IDBObjectStore::indexRenamed(int64_t indexId, const String& newName)
827 {
828 DCHECK(m_transaction->isVersionChange());
829 DCHECK(m_transaction->isActive());
830
831 IDBObjectStoreMetadata::IndexMap::iterator metadataIterator = m_metadata.ind exes.find(indexId);
832 DCHECK(metadataIterator != m_metadata.indexes.end()) << "Invalid indexId";
833 const String& oldName = metadataIterator->value.name;
834
835 DCHECK(m_indexMap.contains(oldName)) << "The index had to be accessed in ord er to be renamed.";
836 DCHECK(!m_indexMap.contains(newName));
837 IDBIndexMap::iterator it = m_indexMap.find(oldName);
838 m_indexMap.set(newName, it->value);
839 m_indexMap.remove(oldName);
840
841 metadataIterator->value.name = newName;
842 }
843
783 int64_t IDBObjectStore::findIndexId(const String& name) const 844 int64_t IDBObjectStore::findIndexId(const String& name) const
784 { 845 {
785 for (const auto& it : m_metadata.indexes) { 846 for (const auto& it : m_metadata.indexes) {
786 if (it.value.name == name) { 847 if (it.value.name == name) {
787 ASSERT(it.key != IDBIndexMetadata::InvalidId); 848 ASSERT(it.key != IDBIndexMetadata::InvalidId);
788 return it.key; 849 return it.key;
789 } 850 }
790 } 851 }
791 return IDBIndexMetadata::InvalidId; 852 return IDBIndexMetadata::InvalidId;
792 } 853 }
793 854
794 WebIDBDatabase* IDBObjectStore::backendDB() const 855 WebIDBDatabase* IDBObjectStore::backendDB() const
795 { 856 {
796 return m_transaction->backendDB(); 857 return m_transaction->backendDB();
797 } 858 }
798 859
799 } // namespace blink 860 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698