| Index: third_party/WebKit/Source/modules/indexeddb/InspectorIndexedDBAgent.cpp
|
| diff --git a/third_party/WebKit/Source/modules/indexeddb/InspectorIndexedDBAgent.cpp b/third_party/WebKit/Source/modules/indexeddb/InspectorIndexedDBAgent.cpp
|
| index f0cb0d80163f2be68b7f658109acfc6a2cedb745..8590db3c58da1bd988732ecfe98352b912671a7d 100644
|
| --- a/third_party/WebKit/Source/modules/indexeddb/InspectorIndexedDBAgent.cpp
|
| +++ b/third_party/WebKit/Source/modules/indexeddb/InspectorIndexedDBAgent.cpp
|
| @@ -194,16 +194,55 @@ private:
|
| RefPtr<ExecutableWithDatabase> m_executableWithDatabase;
|
| };
|
|
|
| +class UpgradeDatabaseCallback final : public EventListener {
|
| +public:
|
| + static PassRefPtrWillBeRawPtr<UpgradeDatabaseCallback> create(ExecutableWithDatabase* executableWithDatabase)
|
| + {
|
| + return adoptRefWillBeNoop(new UpgradeDatabaseCallback(executableWithDatabase));
|
| + }
|
| +
|
| + ~UpgradeDatabaseCallback() override { }
|
| +
|
| + bool operator==(const EventListener& other) override
|
| + {
|
| + return this == &other;
|
| + }
|
| +
|
| + void handleEvent(ExecutionContext* context, Event* event) override
|
| + {
|
| + if (event->type() != EventTypeNames::upgradeneeded) {
|
| + m_executableWithDatabase->requestCallback()->sendFailure("Unexpected event type.");
|
| + return;
|
| + }
|
| +
|
| + // If an "upgradeneeded" event comes through then the database that
|
| + // had previously been enumerated was deleted. We don't want to
|
| + // implicitly re-create it here, so abort the transaction.
|
| + IDBOpenDBRequest* idbOpenDBRequest = static_cast<IDBOpenDBRequest*>(event->target());
|
| + NonThrowableExceptionState exceptionState;
|
| + idbOpenDBRequest->transaction()->abort(exceptionState);
|
| + m_executableWithDatabase->requestCallback()->sendFailure("Aborted upgrade.");
|
| + }
|
| +
|
| +private:
|
| + UpgradeDatabaseCallback(ExecutableWithDatabase* executableWithDatabase)
|
| + : EventListener(EventListener::CPPEventListenerType)
|
| + , m_executableWithDatabase(executableWithDatabase) { }
|
| + RefPtr<ExecutableWithDatabase> m_executableWithDatabase;
|
| +};
|
| +
|
| void ExecutableWithDatabase::start(IDBFactory* idbFactory, SecurityOrigin*, const String& databaseName)
|
| {
|
| - RefPtrWillBeRawPtr<OpenDatabaseCallback> callback = OpenDatabaseCallback::create(this);
|
| + RefPtrWillBeRawPtr<OpenDatabaseCallback> openCallback = OpenDatabaseCallback::create(this);
|
| + RefPtrWillBeRawPtr<UpgradeDatabaseCallback> upgradeCallback = UpgradeDatabaseCallback::create(this);
|
| TrackExceptionState exceptionState;
|
| IDBOpenDBRequest* idbOpenDBRequest = idbFactory->open(scriptState(), databaseName, exceptionState);
|
| if (exceptionState.hadException()) {
|
| requestCallback()->sendFailure("Could not open database.");
|
| return;
|
| }
|
| - idbOpenDBRequest->addEventListener(EventTypeNames::success, callback, false);
|
| + idbOpenDBRequest->addEventListener(EventTypeNames::upgradeneeded, upgradeCallback, false);
|
| + idbOpenDBRequest->addEventListener(EventTypeNames::success, openCallback, false);
|
| }
|
|
|
| static IDBTransaction* transactionForDatabase(ScriptState* scriptState, IDBDatabase* idbDatabase, const String& objectStoreName, const String& mode = IndexedDBNames::readonly)
|
|
|