Response InspectorDOMStorageAgent::getDOMStorageItems( std::unique_ptr<protocol::DOMStorage::StorageId> storageId, std::unique_ptr<protocol::Array<protocol::Array<String>>>* items) { LocalFrame* frame = nullptr; StorageArea* storageArea = nullptr; Response response = findStorageArea(std::move(storageId), frame, storageArea); if (!response.isSuccess()) return response; std::unique_ptr<protocol::Array<protocol::Array<String>>> storageItems = protocol::Array<protocol::Array<String>>::create(); TrackExceptionState exceptionState; for (unsigned i = 0; i < storageArea->length(exceptionState, frame); ++i) { String name(storageArea->key(i, exceptionState, frame)); response = toResponse(exceptionState); if (!response.isSuccess()) return response; String value(storageArea->getItem(name, exceptionState, frame)); response = toResponse(exceptionState); if (!response.isSuccess()) return response; std::unique_ptr<protocol::Array<String>> entry = protocol::Array<String>::create(); entry->addItem(name); entry->addItem(value); storageItems->addItem(std::move(entry)); } *items = std::move(storageItems); return Response::OK(); }
void InspectorDOMStorageAgent::getDOMStorageEntries(ErrorString*, const String& storageId, RefPtr<TypeBuilder::Array<TypeBuilder::Array<String> > >& entries) { // FIXME: consider initializing this array after 2 checks below. The checks should return error messages in this case. entries = TypeBuilder::Array<TypeBuilder::Array<String> >::create(); InspectorDOMStorageResource* storageResource = getDOMStorageResourceForId(storageId); if (!storageResource) return; Frame* frame = storageResource->frame(); if (!frame) return; // FIXME: Exceptions are not reported here. ExceptionCode ec = 0; StorageArea* storageArea = storageResource->storageArea(); for (unsigned i = 0; i < storageArea->length(ec, frame); ++i) { String name(storageArea->key(i, ec, frame)); if (ec) return; String value(storageArea->getItem(name, ec, frame)); if (ec) return; RefPtr<TypeBuilder::Array<String> > entry = TypeBuilder::Array<String>::create(); entry->addItem(name); entry->addItem(value); entries->addItem(entry); } }
void Storage::read( ConfigFile& cf ) { static int num_until_dot = 1000; unsigned long nobjects = 0; StorageArea *area = NULL; ConfigElem elem; clock_t start = clock(); while (cf.read( elem )) { if (--num_until_dot == 0) { cout << "."; num_until_dot = 1000; } if (elem.type_is( "StorageArea" )) { area = create_area( elem ); } else if (elem.type_is("Item")) { if (area != NULL) { try { area->load_item( elem ); } catch( std::exception& ) { if (!config.ignore_load_errors) throw; } } else { cerr << "Storage: Got an ITEM element, but don't have a StorageArea to put it." << endl; throw runtime_error( "Data file integrity error" ); } } else { cerr << "Unexpected element type " << elem.type() << " in storage file." << endl; throw runtime_error( "Data file integrity error" ); } ++nobjects; } clock_t end = clock(); long ms = static_cast<long>((end-start) * 1000.0 / CLOCKS_PER_SEC); cout << " " << nobjects << " elements in " << ms << " ms." << std::endl; }
void InspectorDOMStorageAgent::removeDOMStorageItem(ErrorString* errorString, const RefPtr<JSONObject>& storageId, const String& key) { LocalFrame* frame; StorageArea* storageArea = findStorageArea(0, storageId, frame); if (!storageArea) { *errorString = "Storage not found"; return; } TrackExceptionState exceptionState; storageArea->removeItem(key, exceptionState, frame); *errorString = toErrorString(exceptionState); }
Response InspectorDOMStorageAgent::removeDOMStorageItem( std::unique_ptr<protocol::DOMStorage::StorageId> storageId, const String& key) { LocalFrame* frame = nullptr; StorageArea* storageArea = nullptr; Response response = findStorageArea(std::move(storageId), frame, storageArea); if (!response.isSuccess()) return response; TrackExceptionState exceptionState; storageArea->removeItem(key, exceptionState, frame); return toResponse(exceptionState); }
void InspectorDOMStorageAgent::getDOMStorageEntries(ErrorString*, int storageId, RefPtr<InspectorArray>& entries) { InspectorDOMStorageResource* storageResource = getDOMStorageResourceForId(storageId); if (!storageResource) return; Frame* frame = storageResource->frame(); if (!frame) return; storageResource->startReportingChangesToFrontend(); StorageArea* storageArea = storageResource->storageArea(); for (unsigned i = 0; i < storageArea->length(frame); ++i) { String name(storageArea->key(i, frame)); String value(storageArea->getItem(name, frame)); RefPtr<InspectorArray> entry = InspectorArray::create(); entry->pushString(name); entry->pushString(value); entries->pushArray(entry); } }
Storage* DOMWindowStorage::sessionStorage(ExceptionState& exceptionState) const { if (!m_window->isCurrentlyDisplayedInFrame()) return nullptr; Document* document = m_window->document(); if (!document) return nullptr; String accessDeniedMessage = "Access is denied for this document."; if (!document->securityOrigin()->canAccessLocalStorage()) { if (document->isSandboxed(SandboxOrigin)) exceptionState.throwSecurityError("The document is sandboxed and lacks the 'allow-same-origin' flag."); else if (document->url().protocolIs("data")) exceptionState.throwSecurityError("Storage is disabled inside 'data:' URLs."); else exceptionState.throwSecurityError(accessDeniedMessage); return nullptr; } if (m_sessionStorage) { if (!m_sessionStorage->area()->canAccessStorage(m_window->frame())) { exceptionState.throwSecurityError(accessDeniedMessage); return nullptr; } return m_sessionStorage; } Page* page = document->page(); if (!page) return nullptr; StorageArea* storageArea = StorageNamespaceController::from(page)->sessionStorage()->storageArea(document->securityOrigin()); if (!storageArea->canAccessStorage(m_window->frame())) { exceptionState.throwSecurityError(accessDeniedMessage); return nullptr; } m_sessionStorage = Storage::create(m_window->frame(), storageArea); return m_sessionStorage; }
void InspectorDOMStorageAgent::getDOMStorageItems(ErrorString* errorString, const RefPtr<JSONObject>& storageId, RefPtr<TypeBuilder::Array<TypeBuilder::Array<String>>>& items) { LocalFrame* frame; StorageArea* storageArea = findStorageArea(errorString, storageId, frame); if (!storageArea) return; RefPtr<TypeBuilder::Array<TypeBuilder::Array<String>>> storageItems = TypeBuilder::Array<TypeBuilder::Array<String>>::create(); TrackExceptionState exceptionState; for (unsigned i = 0; i < storageArea->length(exceptionState, frame); ++i) { String name(storageArea->key(i, exceptionState, frame)); if (hadException(exceptionState, errorString)) return; String value(storageArea->getItem(name, exceptionState, frame)); if (hadException(exceptionState, errorString)) return; RefPtr<TypeBuilder::Array<String>> entry = TypeBuilder::Array<String>::create(); entry->addItem(name); entry->addItem(value); storageItems->addItem(entry); } items = storageItems.release(); }
Storage* DOMWindowStorage::localStorage(ExceptionState& exceptionState) const { if (!m_window->isCurrentlyDisplayedInFrame()) return nullptr; Document* document = m_window->document(); if (!document) return nullptr; String accessDeniedMessage = "Access is denied for this document."; if (!document->securityOrigin()->canAccessLocalStorage()) { if (document->isSandboxed(SandboxOrigin)) exceptionState.throwSecurityError("The document is sandboxed and lacks the 'allow-same-origin' flag."); else if (document->url().protocolIs("data")) exceptionState.throwSecurityError("Storage is disabled inside 'data:' URLs."); else exceptionState.throwSecurityError(accessDeniedMessage); return nullptr; } if (m_localStorage) { if (!m_localStorage->area()->canAccessStorage(m_window->frame())) { exceptionState.throwSecurityError(accessDeniedMessage); return nullptr; } return m_localStorage; } // FIXME: Seems this check should be much higher? FrameHost* host = document->frameHost(); if (!host || !host->settings().localStorageEnabled()) return nullptr; StorageArea* storageArea = StorageNamespace::localStorageArea(document->securityOrigin()); if (!storageArea->canAccessStorage(m_window->frame())) { exceptionState.throwSecurityError(accessDeniedMessage); return nullptr; } m_localStorage = Storage::create(m_window->frame(), storageArea); return m_localStorage; }