| Index: third_party/WebKit/Source/modules/indexeddb/IDBDatabase.cpp | 
| diff --git a/third_party/WebKit/Source/modules/indexeddb/IDBDatabase.cpp b/third_party/WebKit/Source/modules/indexeddb/IDBDatabase.cpp | 
| index 42e7cacec839319b352669cf545a1a02dcdf391c..63a80680d5de740e99fa6f98ea4c95c26b37fad2 100644 | 
| --- a/third_party/WebKit/Source/modules/indexeddb/IDBDatabase.cpp | 
| +++ b/third_party/WebKit/Source/modules/indexeddb/IDBDatabase.cpp | 
| @@ -29,6 +29,7 @@ | 
| #include "bindings/core/v8/ExceptionStatePlaceholder.h" | 
| #include "bindings/core/v8/Nullable.h" | 
| #include "bindings/core/v8/SerializedScriptValue.h" | 
| +#include "bindings/modules/v8/IDBObserverCallback.h" | 
| #include "bindings/modules/v8/V8BindingForModules.h" | 
| #include "core/dom/ExceptionCode.h" | 
| #include "core/dom/ExecutionContext.h" | 
| @@ -37,6 +38,8 @@ | 
| #include "modules/indexeddb/IDBEventDispatcher.h" | 
| #include "modules/indexeddb/IDBIndex.h" | 
| #include "modules/indexeddb/IDBKeyPath.h" | 
| +#include "modules/indexeddb/IDBObserver.h" | 
| +#include "modules/indexeddb/IDBObserverChanges.h" | 
| #include "modules/indexeddb/IDBTracing.h" | 
| #include "modules/indexeddb/IDBVersionChangeEvent.h" | 
| #include "modules/indexeddb/WebIDBDatabaseCallbacksImpl.h" | 
| @@ -113,6 +116,7 @@ IDBDatabase::~IDBDatabase() { | 
| DEFINE_TRACE(IDBDatabase) { | 
| visitor->trace(m_versionChangeTransaction); | 
| visitor->trace(m_transactions); | 
| +  visitor->trace(m_observers); | 
| visitor->trace(m_enqueuedEvents); | 
| visitor->trace(m_databaseCallbacks); | 
| EventTargetWithInlineData::trace(visitor); | 
| @@ -126,6 +130,11 @@ int64_t IDBDatabase::nextTransactionId() { | 
| return atomicIncrement(¤tTransactionId); | 
| } | 
|  | 
| +int32_t IDBDatabase::nextObserverId() { | 
| +  static int currentObserverId = 0; | 
| +  return atomicIncrement(¤tObserverId); | 
| +} | 
| + | 
| void IDBDatabase::setMetadata(const IDBDatabaseMetadata& metadata) { | 
| m_metadata = metadata; | 
| } | 
| @@ -170,6 +179,21 @@ void IDBDatabase::onComplete(int64_t transactionId) { | 
| m_transactions.get(transactionId)->onComplete(); | 
| } | 
|  | 
| +void IDBDatabase::onChanges( | 
| +    const std::unordered_map<int32_t, std::vector<int32_t>>& | 
| +        observation_index_map, | 
| +    const WebVector<WebIDBObservation>& observations) { | 
| +  for (const auto& map_entry : observation_index_map) { | 
| +    auto it = m_observers.find(map_entry.first); | 
| +    if (it != m_observers.end()) { | 
| +      IDBObserver* observer = it->value; | 
| +      observer->callback()->call( | 
| +          observer, | 
| +          IDBObserverChanges::create(this, observations, map_entry.second)); | 
| +    } | 
| +  } | 
| +} | 
| + | 
| DOMStringList* IDBDatabase::objectStoreNames() const { | 
| DOMStringList* objectStoreNames = | 
| DOMStringList::create(DOMStringList::IndexedDB); | 
| @@ -185,6 +209,25 @@ const String& IDBDatabase::getObjectStoreName(int64_t objectStoreId) const { | 
| return it->value->name; | 
| } | 
|  | 
| +int32_t IDBDatabase::addObserver( | 
| +    IDBObserver* observer, | 
| +    int64_t transactionId, | 
| +    bool includeTransaction, | 
| +    bool noRecords, | 
| +    bool values, | 
| +    const std::bitset<WebIDBOperationTypeCount>& operationTypes) { | 
| +  int32_t observerId = nextObserverId(); | 
| +  m_observers.set(observerId, observer); | 
| +  backend()->addObserver(transactionId, observerId, includeTransaction, | 
| +                         noRecords, values, operationTypes); | 
| +  return observerId; | 
| +} | 
| + | 
| +void IDBDatabase::removeObservers(const Vector<int32_t>& observerIds) { | 
| +  m_observers.removeAll(observerIds); | 
| +  backend()->removeObservers(observerIds); | 
| +} | 
| + | 
| IDBObjectStore* IDBDatabase::createObjectStore(const String& name, | 
| const IDBKeyPath& keyPath, | 
| bool autoIncrement, | 
|  |