Chromium Code Reviews| Index: third_party/WebKit/Source/modules/indexeddb/IDBObserver.cpp |
| diff --git a/third_party/WebKit/Source/modules/indexeddb/IDBObserver.cpp b/third_party/WebKit/Source/modules/indexeddb/IDBObserver.cpp |
| index 219b81832bebfc898a2e679fa329c0a2b21d26c8..25a0fff96b6d826698421e82b75805d464f3537b 100644 |
| --- a/third_party/WebKit/Source/modules/indexeddb/IDBObserver.cpp |
| +++ b/third_party/WebKit/Source/modules/indexeddb/IDBObserver.cpp |
| @@ -7,8 +7,12 @@ |
| #include "bindings/core/v8/ExceptionState.h" |
| #include "bindings/modules/v8/ToV8ForModules.h" |
| #include "bindings/modules/v8/V8BindingForModules.h" |
| +#include "core/dom/ExceptionCode.h" |
| +#include "modules/indexeddb/IDBDatabase.h" |
| #include "modules/indexeddb/IDBObserverCallback.h" |
| #include "modules/indexeddb/IDBObserverInit.h" |
| +#include "modules/indexeddb/IDBTransaction.h" |
| +#include "modules/indexeddb/WebIDBObserverImpl.h" |
| namespace blink { |
| @@ -25,9 +29,53 @@ IDBObserver::IDBObserver(IDBObserverCallback& callback, const IDBObserverInit& o |
| { |
| } |
| +IDBObserver::~IDBObserver() {} |
| + |
| void IDBObserver::observe(IDBDatabase* database, IDBTransaction* transaction, ExceptionState& exceptionState) |
| { |
| - // TODO(palakj): Finish implementation. |
| + if (transaction->isFinished() || transaction->isFinishing()) { |
| + exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::transactionFinishedErrorMessage); |
| + return; |
| + } |
| + if (!transaction->isActive()) { |
| + exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::transactionInactiveErrorMessage); |
| + return; |
| + } |
| + if (!database->backend()) { |
| + exceptionState.throwDOMException(InvalidStateError, IDBDatabase::databaseClosedErrorMessage); |
| + return; |
| + } |
| + |
| + std::unique_ptr<WebIDBObserverImpl> observer = WebIDBObserverImpl::create(this); |
| + WebIDBObserverImpl* observerPtr = observer.get(); |
| + int32_t observerId = database->backend()->addObserver(std::move(observer), transaction->id()); |
| + m_observerIds.insert(observerId); |
| + observerPtr->setId(observerId); |
|
haraken
2016/07/01 01:55:02
Would you help me understand why you need to intro
dmurph
2016/07/01 19:01:57
Do you mean in the browser process? It's because e
|
| +} |
| + |
| +void IDBObserver::unobserve(IDBDatabase* database, ExceptionState& exceptionState) |
| +{ |
| + if (!database->backend()) { |
| + exceptionState.throwDOMException(InvalidStateError, IDBDatabase::databaseClosedErrorMessage); |
| + return; |
| + } |
| + std::set<int32_t>::iterator it = m_observerIds.begin(); |
| + std::vector<int32_t> observerIdsToRemove; |
| + while (it != m_observerIds.end()) { |
| + if (database->backend()->containsObserverId(*it)) { |
| + observerIdsToRemove.push_back(*it); |
| + it = m_observerIds.erase(it); |
| + } else { |
| + it++; |
| + } |
| + } |
| + if (!observerIdsToRemove.empty()) |
| + database->backend()->removeObservers(observerIdsToRemove); |
| +} |
| + |
| +void IDBObserver::removeObserver(int32_t id) |
| +{ |
| + m_observerIds.erase(id); |
| } |
| DEFINE_TRACE(IDBObserver) |