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);
    }
}
Beispiel #3
0
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);
}
Beispiel #6
0
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;
}