| 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 819155622e869f3e962f706d9c1ac332fe786bc2..45cac8342432eac1f3cbb4e879f4a188dd4e38df 100644
|
| --- a/third_party/WebKit/Source/modules/indexeddb/InspectorIndexedDBAgent.cpp
|
| +++ b/third_party/WebKit/Source/modules/indexeddb/InspectorIndexedDBAgent.cpp
|
| @@ -87,7 +87,8 @@ static const char indexedDBAgentEnabled[] = "indexedDBAgentEnabled";
|
|
|
| namespace {
|
|
|
| -static const char indexedDBObjectGroup[] = "indexeddb";
|
| +static const char kIndexedDBObjectGroup[] = "indexeddb";
|
| +static const char kNoDocumentError[] = "No document for given frame found";
|
|
|
| class GetDatabaseNamesCallback final : public EventListener {
|
| WTF_MAKE_NONCOPYABLE(GetDatabaseNamesCallback);
|
| @@ -108,14 +109,15 @@ class GetDatabaseNamesCallback final : public EventListener {
|
|
|
| void handleEvent(ExecutionContext*, Event* event) override {
|
| if (event->type() != EventTypeNames::success) {
|
| - m_requestCallback->sendFailure("Unexpected event type.");
|
| + m_requestCallback->sendFailure(Response::Error("Unexpected event type."));
|
| return;
|
| }
|
|
|
| IDBRequest* idbRequest = static_cast<IDBRequest*>(event->target());
|
| IDBAny* requestResult = idbRequest->resultAsAny();
|
| if (requestResult->getType() != IDBAny::DOMStringListType) {
|
| - m_requestCallback->sendFailure("Unexpected result type.");
|
| + m_requestCallback->sendFailure(
|
| + Response::Error("Unexpected result type."));
|
| return;
|
| }
|
|
|
| @@ -163,7 +165,8 @@ class ExecutableWithDatabase
|
| IDBOpenDBRequest* idbOpenDBRequest =
|
| idbFactory->open(getScriptState(), databaseName, exceptionState);
|
| if (exceptionState.hadException()) {
|
| - getRequestCallback()->sendFailure("Could not open database.");
|
| + getRequestCallback()->sendFailure(
|
| + Response::Error("Could not open database."));
|
| return;
|
| }
|
| idbOpenDBRequest->addEventListener(EventTypeNames::upgradeneeded,
|
| @@ -199,7 +202,7 @@ class OpenDatabaseCallback final : public EventListener {
|
| void handleEvent(ExecutionContext* context, Event* event) override {
|
| if (event->type() != EventTypeNames::success) {
|
| m_executableWithDatabase->getRequestCallback()->sendFailure(
|
| - "Unexpected event type.");
|
| + Response::Error("Unexpected event type."));
|
| return;
|
| }
|
|
|
| @@ -208,7 +211,7 @@ class OpenDatabaseCallback final : public EventListener {
|
| IDBAny* requestResult = idbOpenDBRequest->resultAsAny();
|
| if (requestResult->getType() != IDBAny::IDBDatabaseType) {
|
| m_executableWithDatabase->getRequestCallback()->sendFailure(
|
| - "Unexpected result type.");
|
| + Response::Error("Unexpected result type."));
|
| return;
|
| }
|
|
|
| @@ -245,7 +248,7 @@ class UpgradeDatabaseCallback final : public EventListener {
|
| void handleEvent(ExecutionContext* context, Event* event) override {
|
| if (event->type() != EventTypeNames::upgradeneeded) {
|
| m_executableWithDatabase->getRequestCallback()->sendFailure(
|
| - "Unexpected event type.");
|
| + Response::Error("Unexpected event type."));
|
| return;
|
| }
|
|
|
| @@ -257,7 +260,7 @@ class UpgradeDatabaseCallback final : public EventListener {
|
| NonThrowableExceptionState exceptionState;
|
| idbOpenDBRequest->transaction()->abort(exceptionState);
|
| m_executableWithDatabase->getRequestCallback()->sendFailure(
|
| - "Aborted upgrade.");
|
| + Response::Error("Aborted upgrade."));
|
| }
|
|
|
| private:
|
| @@ -483,7 +486,7 @@ class OpenCursorCallback final : public EventListener {
|
|
|
| void handleEvent(ExecutionContext*, Event* event) override {
|
| if (event->type() != EventTypeNames::success) {
|
| - m_requestCallback->sendFailure("Unexpected event type.");
|
| + m_requestCallback->sendFailure(Response::Error("Unexpected event type."));
|
| return;
|
| }
|
|
|
| @@ -494,7 +497,8 @@ class OpenCursorCallback final : public EventListener {
|
| return;
|
| }
|
| if (requestResult->getType() != IDBAny::IDBCursorWithValueType) {
|
| - m_requestCallback->sendFailure("Unexpected result type.");
|
| + m_requestCallback->sendFailure(
|
| + Response::Error("Unexpected result type."));
|
| return;
|
| }
|
|
|
| @@ -503,8 +507,10 @@ class OpenCursorCallback final : public EventListener {
|
| if (m_skipCount) {
|
| TrackExceptionState exceptionState;
|
| idbCursor->advance(m_skipCount, exceptionState);
|
| - if (exceptionState.hadException())
|
| - m_requestCallback->sendFailure("Could not advance cursor.");
|
| + if (exceptionState.hadException()) {
|
| + m_requestCallback->sendFailure(
|
| + Response::Error("Could not advance cursor."));
|
| + }
|
| m_skipCount = 0;
|
| return;
|
| }
|
| @@ -519,7 +525,8 @@ class OpenCursorCallback final : public EventListener {
|
| TrackExceptionState exceptionState;
|
| idbCursor->continueFunction(nullptr, nullptr, exceptionState);
|
| if (exceptionState.hadException()) {
|
| - m_requestCallback->sendFailure("Could not continue cursor.");
|
| + m_requestCallback->sendFailure(
|
| + Response::Error("Could not continue cursor."));
|
| return;
|
| }
|
|
|
| @@ -530,7 +537,7 @@ class OpenCursorCallback final : public EventListener {
|
| ScriptState::Scope scope(scriptState);
|
| v8::Local<v8::Context> context = scriptState->context();
|
| v8_inspector::StringView objectGroup =
|
| - toV8InspectorStringView(indexedDBObjectGroup);
|
| + toV8InspectorStringView(kIndexedDBObjectGroup);
|
| std::unique_ptr<DataEntry> dataEntry =
|
| DataEntry::create()
|
| .setKey(m_v8Session->wrapObject(
|
| @@ -595,13 +602,15 @@ class DataLoader final : public ExecutableWithDatabase<RequestDataCallback> {
|
| IDBTransaction* idbTransaction = transactionForDatabase(
|
| getScriptState(), idbDatabase, m_objectStoreName);
|
| if (!idbTransaction) {
|
| - m_requestCallback->sendFailure("Could not get transaction");
|
| + m_requestCallback->sendFailure(
|
| + Response::Error("Could not get transaction"));
|
| return;
|
| }
|
| IDBObjectStore* idbObjectStore =
|
| objectStoreForTransaction(idbTransaction, m_objectStoreName);
|
| if (!idbObjectStore) {
|
| - m_requestCallback->sendFailure("Could not get object store");
|
| + m_requestCallback->sendFailure(
|
| + Response::Error("Could not get object store"));
|
| return;
|
| }
|
|
|
| @@ -609,7 +618,7 @@ class DataLoader final : public ExecutableWithDatabase<RequestDataCallback> {
|
| if (!m_indexName.isEmpty()) {
|
| IDBIndex* idbIndex = indexForObjectStore(idbObjectStore, m_indexName);
|
| if (!idbIndex) {
|
| - m_requestCallback->sendFailure("Could not get index");
|
| + m_requestCallback->sendFailure(Response::Error("Could not get index"));
|
| return;
|
| }
|
|
|
| @@ -668,49 +677,39 @@ InspectorIndexedDBAgent::~InspectorIndexedDBAgent() {}
|
| void InspectorIndexedDBAgent::restore() {
|
| if (m_state->booleanProperty(IndexedDBAgentState::indexedDBAgentEnabled,
|
| false)) {
|
| - ErrorString error;
|
| - enable(&error);
|
| + enable();
|
| }
|
| }
|
|
|
| void InspectorIndexedDBAgent::didCommitLoadForLocalFrame(LocalFrame* frame) {
|
| - if (frame == m_inspectedFrames->root())
|
| + if (frame == m_inspectedFrames->root()) {
|
| m_v8Session->releaseObjectGroup(
|
| - toV8InspectorStringView(indexedDBObjectGroup));
|
| + toV8InspectorStringView(kIndexedDBObjectGroup));
|
| + }
|
| }
|
|
|
| -void InspectorIndexedDBAgent::enable(ErrorString*) {
|
| +Response InspectorIndexedDBAgent::enable() {
|
| m_state->setBoolean(IndexedDBAgentState::indexedDBAgentEnabled, true);
|
| + return Response::OK();
|
| }
|
|
|
| -void InspectorIndexedDBAgent::disable(ErrorString*) {
|
| +Response InspectorIndexedDBAgent::disable() {
|
| m_state->setBoolean(IndexedDBAgentState::indexedDBAgentEnabled, false);
|
| m_v8Session->releaseObjectGroup(
|
| - toV8InspectorStringView(indexedDBObjectGroup));
|
| + toV8InspectorStringView(kIndexedDBObjectGroup));
|
| + return Response::OK();
|
| }
|
|
|
| -static Document* assertDocument(ErrorString* errorString, LocalFrame* frame) {
|
| - Document* document = frame ? frame->document() : nullptr;
|
| -
|
| - if (!document)
|
| - *errorString = "No document for given frame found";
|
| -
|
| - return document;
|
| -}
|
| -
|
| -static IDBFactory* assertIDBFactory(ErrorString* errorString,
|
| - Document* document) {
|
| +static Response assertIDBFactory(Document* document, IDBFactory*& result) {
|
| LocalDOMWindow* domWindow = document->domWindow();
|
| - if (!domWindow) {
|
| - *errorString = "No IndexedDB factory for given frame found";
|
| - return nullptr;
|
| - }
|
| + if (!domWindow)
|
| + return Response::Error("No IndexedDB factory for given frame found");
|
| IDBFactory* idbFactory = GlobalIndexedDB::indexedDB(*domWindow);
|
|
|
| if (!idbFactory)
|
| - *errorString = "No IndexedDB factory for given frame found";
|
| -
|
| - return idbFactory;
|
| + return Response::Error("No IndexedDB factory for given frame found");
|
| + result = idbFactory;
|
| + return Response::OK();
|
| }
|
|
|
| void InspectorIndexedDBAgent::requestDatabaseNames(
|
| @@ -719,26 +718,30 @@ void InspectorIndexedDBAgent::requestDatabaseNames(
|
| LocalFrame* frame =
|
| m_inspectedFrames->frameWithSecurityOrigin(securityOrigin);
|
| ErrorString errorString;
|
| - Document* document = assertDocument(&errorString, frame);
|
| + Document* document = frame ? frame->document() : nullptr;
|
| if (!document) {
|
| - requestCallback->sendFailure(errorString);
|
| + requestCallback->sendFailure(Response::Error(kNoDocumentError));
|
| return;
|
| }
|
| - IDBFactory* idbFactory = assertIDBFactory(&errorString, document);
|
| - if (!idbFactory) {
|
| - requestCallback->sendFailure(errorString);
|
| + IDBFactory* idbFactory = nullptr;
|
| + Response response = assertIDBFactory(document, idbFactory);
|
| + if (!response.isSuccess()) {
|
| + requestCallback->sendFailure(response);
|
| return;
|
| }
|
|
|
| ScriptState* scriptState = ScriptState::forMainWorld(frame);
|
| - if (!scriptState)
|
| + if (!scriptState) {
|
| + requestCallback->sendFailure(Response::InternalError());
|
| return;
|
| + }
|
| ScriptState::Scope scope(scriptState);
|
| TrackExceptionState exceptionState;
|
| IDBRequest* idbRequest =
|
| idbFactory->getDatabaseNames(scriptState, exceptionState);
|
| if (exceptionState.hadException()) {
|
| - requestCallback->sendFailure("Could not obtain database names.");
|
| + requestCallback->sendFailure(
|
| + Response::Error("Could not obtain database names."));
|
| return;
|
| }
|
| idbRequest->addEventListener(
|
| @@ -756,20 +759,24 @@ void InspectorIndexedDBAgent::requestDatabase(
|
| LocalFrame* frame =
|
| m_inspectedFrames->frameWithSecurityOrigin(securityOrigin);
|
| ErrorString errorString;
|
| - Document* document = assertDocument(&errorString, frame);
|
| + Document* document = frame ? frame->document() : nullptr;
|
| if (!document) {
|
| - requestCallback->sendFailure(errorString);
|
| + requestCallback->sendFailure(Response::Error(kNoDocumentError));
|
| return;
|
| }
|
| - IDBFactory* idbFactory = assertIDBFactory(&errorString, document);
|
| - if (!idbFactory) {
|
| - requestCallback->sendFailure(errorString);
|
| + IDBFactory* idbFactory = nullptr;
|
| + Response response = assertIDBFactory(document, idbFactory);
|
| + if (!response.isSuccess()) {
|
| + requestCallback->sendFailure(response);
|
| return;
|
| }
|
|
|
| ScriptState* scriptState = ScriptState::forMainWorld(frame);
|
| - if (!scriptState)
|
| + if (!scriptState) {
|
| + requestCallback->sendFailure(Response::InternalError());
|
| return;
|
| + }
|
| +
|
| ScriptState::Scope scope(scriptState);
|
| RefPtr<DatabaseLoader> databaseLoader =
|
| DatabaseLoader::create(scriptState, std::move(requestCallback));
|
| @@ -784,19 +791,20 @@ void InspectorIndexedDBAgent::requestData(
|
| const String& indexName,
|
| int skipCount,
|
| int pageSize,
|
| - const Maybe<protocol::IndexedDB::KeyRange>& keyRange,
|
| + Maybe<protocol::IndexedDB::KeyRange> keyRange,
|
| std::unique_ptr<RequestDataCallback> requestCallback) {
|
| LocalFrame* frame =
|
| m_inspectedFrames->frameWithSecurityOrigin(securityOrigin);
|
| ErrorString errorString;
|
| - Document* document = assertDocument(&errorString, frame);
|
| + Document* document = frame ? frame->document() : nullptr;
|
| if (!document) {
|
| - requestCallback->sendFailure(errorString);
|
| + requestCallback->sendFailure(Response::Error(kNoDocumentError));
|
| return;
|
| }
|
| - IDBFactory* idbFactory = assertIDBFactory(&errorString, document);
|
| - if (!idbFactory) {
|
| - requestCallback->sendFailure(errorString);
|
| + IDBFactory* idbFactory = nullptr;
|
| + Response response = assertIDBFactory(document, idbFactory);
|
| + if (!response.isSuccess()) {
|
| + requestCallback->sendFailure(response);
|
| return;
|
| }
|
|
|
| @@ -804,13 +812,16 @@ void InspectorIndexedDBAgent::requestData(
|
| ? idbKeyRangeFromKeyRange(keyRange.fromJust())
|
| : nullptr;
|
| if (keyRange.isJust() && !idbKeyRange) {
|
| - requestCallback->sendFailure("Can not parse key range.");
|
| + requestCallback->sendFailure(Response::Error("Can not parse key range."));
|
| return;
|
| }
|
|
|
| ScriptState* scriptState = ScriptState::forMainWorld(frame);
|
| - if (!scriptState)
|
| + if (!scriptState) {
|
| + requestCallback->sendFailure(Response::InternalError());
|
| return;
|
| + }
|
| +
|
| ScriptState::Scope scope(scriptState);
|
| RefPtr<DataLoader> dataLoader = DataLoader::create(
|
| m_v8Session, scriptState, std::move(requestCallback), objectStoreName,
|
| @@ -835,7 +846,7 @@ class ClearObjectStoreListener final : public EventListener {
|
|
|
| void handleEvent(ExecutionContext*, Event* event) override {
|
| if (event->type() != EventTypeNames::complete) {
|
| - m_requestCallback->sendFailure("Unexpected event type.");
|
| + m_requestCallback->sendFailure(Response::Error("Unexpected event type."));
|
| return;
|
| }
|
|
|
| @@ -876,13 +887,15 @@ class ClearObjectStore final
|
| transactionForDatabase(getScriptState(), idbDatabase, m_objectStoreName,
|
| IndexedDBNames::readwrite);
|
| if (!idbTransaction) {
|
| - m_requestCallback->sendFailure("Could not get transaction");
|
| + m_requestCallback->sendFailure(
|
| + Response::Error("Could not get transaction"));
|
| return;
|
| }
|
| IDBObjectStore* idbObjectStore =
|
| objectStoreForTransaction(idbTransaction, m_objectStoreName);
|
| if (!idbObjectStore) {
|
| - m_requestCallback->sendFailure("Could not get object store");
|
| + m_requestCallback->sendFailure(
|
| + Response::Error("Could not get object store"));
|
| return;
|
| }
|
|
|
| @@ -891,9 +904,9 @@ class ClearObjectStore final
|
| ASSERT(!exceptionState.hadException());
|
| if (exceptionState.hadException()) {
|
| ExceptionCode ec = exceptionState.code();
|
| - m_requestCallback->sendFailure(
|
| + m_requestCallback->sendFailure(Response::Error(
|
| String::format("Could not clear object store '%s': %d",
|
| - m_objectStoreName.utf8().data(), ec));
|
| + m_objectStoreName.utf8().data(), ec)));
|
| return;
|
| }
|
| idbTransaction->addEventListener(
|
| @@ -918,20 +931,24 @@ void InspectorIndexedDBAgent::clearObjectStore(
|
| LocalFrame* frame =
|
| m_inspectedFrames->frameWithSecurityOrigin(securityOrigin);
|
| ErrorString errorString;
|
| - Document* document = assertDocument(&errorString, frame);
|
| + Document* document = frame ? frame->document() : nullptr;
|
| if (!document) {
|
| - requestCallback->sendFailure(errorString);
|
| + requestCallback->sendFailure(Response::Error(kNoDocumentError));
|
| return;
|
| }
|
| - IDBFactory* idbFactory = assertIDBFactory(&errorString, document);
|
| - if (!idbFactory) {
|
| - requestCallback->sendFailure(errorString);
|
| + IDBFactory* idbFactory = nullptr;
|
| + Response response = assertIDBFactory(document, idbFactory);
|
| + if (!response.isSuccess()) {
|
| + requestCallback->sendFailure(response);
|
| return;
|
| }
|
|
|
| ScriptState* scriptState = ScriptState::forMainWorld(frame);
|
| - if (!scriptState)
|
| + if (!scriptState) {
|
| + requestCallback->sendFailure(Response::InternalError());
|
| return;
|
| + }
|
| +
|
| ScriptState::Scope scope(scriptState);
|
| RefPtr<ClearObjectStore> clearObjectStore = ClearObjectStore::create(
|
| scriptState, objectStoreName, std::move(requestCallback));
|
|
|