mirror of
				https://github.com/mozilla/gecko-dev.git
				synced 2025-11-04 02:09:05 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			182 lines
		
	
	
	
		
			6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			182 lines
		
	
	
	
		
			6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 | 
						|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
 | 
						|
/* This Source Code Form is subject to the terms of the Mozilla Public
 | 
						|
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 | 
						|
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | 
						|
 | 
						|
#ifndef IndexedDatabaseInlines_h
 | 
						|
#define IndexedDatabaseInlines_h
 | 
						|
 | 
						|
#ifndef mozilla_dom_indexeddatabase_h__
 | 
						|
#  error Must include IndexedDatabase.h first
 | 
						|
#endif
 | 
						|
 | 
						|
#include "DatabaseFileInfo.h"
 | 
						|
#include "mozilla/dom/ToJSValue.h"
 | 
						|
#include "mozilla/dom/indexedDB/PBackgroundIDBSharedTypes.h"
 | 
						|
#include "mozilla/dom/DOMStringList.h"
 | 
						|
#include "mozilla/dom/File.h"
 | 
						|
 | 
						|
namespace mozilla::dom::indexedDB {
 | 
						|
 | 
						|
#ifdef NS_BUILD_REFCNT_LOGGING
 | 
						|
inline StructuredCloneFileChild::StructuredCloneFileChild(
 | 
						|
    StructuredCloneFileChild&& aOther)
 | 
						|
    : StructuredCloneFileBase{std::move(aOther)},
 | 
						|
      mContents{std::move(aOther.mContents)} {
 | 
						|
  MOZ_COUNT_CTOR(StructuredCloneFileChild);
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
inline StructuredCloneFileChild::~StructuredCloneFileChild() {
 | 
						|
  MOZ_COUNT_DTOR(StructuredCloneFileChild);
 | 
						|
}
 | 
						|
 | 
						|
inline StructuredCloneFileChild::StructuredCloneFileChild(FileType aType)
 | 
						|
    : StructuredCloneFileBase{aType}, mContents{Nothing()} {
 | 
						|
  MOZ_COUNT_CTOR(StructuredCloneFileChild);
 | 
						|
}
 | 
						|
 | 
						|
inline StructuredCloneFileChild::StructuredCloneFileChild(
 | 
						|
    FileType aType, RefPtr<dom::Blob> aBlob)
 | 
						|
    : StructuredCloneFileBase{aType}, mContents{std::move(aBlob)} {
 | 
						|
  MOZ_ASSERT(eBlob == aType || eStructuredClone == aType);
 | 
						|
  MOZ_ASSERT(mContents->as<RefPtr<dom::Blob>>());
 | 
						|
  MOZ_COUNT_CTOR(StructuredCloneFileChild);
 | 
						|
}
 | 
						|
 | 
						|
inline StructuredCloneFileParent::StructuredCloneFileParent(
 | 
						|
    FileType aType, SafeRefPtr<DatabaseFileInfo> aFileInfo)
 | 
						|
    : StructuredCloneFileBase{aType}, mContents{Some(std::move(aFileInfo))} {
 | 
						|
  MOZ_ASSERT(**mContents);
 | 
						|
  MOZ_COUNT_CTOR(StructuredCloneFileParent);
 | 
						|
}
 | 
						|
 | 
						|
#ifdef NS_BUILD_REFCNT_LOGGING
 | 
						|
inline StructuredCloneFileParent::StructuredCloneFileParent(
 | 
						|
    StructuredCloneFileParent&& aOther)
 | 
						|
    : StructuredCloneFileBase{std::move(aOther)},
 | 
						|
      mContents{std::move(aOther.mContents)} {
 | 
						|
  MOZ_COUNT_CTOR(StructuredCloneFileParent);
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
inline StructuredCloneFileParent::~StructuredCloneFileParent() {
 | 
						|
  MOZ_COUNT_DTOR(StructuredCloneFileParent);
 | 
						|
}
 | 
						|
 | 
						|
inline SafeRefPtr<DatabaseFileInfo> StructuredCloneFileParent::FileInfoPtr()
 | 
						|
    const {
 | 
						|
  return (*mContents)->clonePtr();
 | 
						|
}
 | 
						|
 | 
						|
inline RefPtr<dom::Blob> StructuredCloneFileChild::BlobPtr() const {
 | 
						|
  return mContents->as<RefPtr<dom::Blob>>();
 | 
						|
}
 | 
						|
 | 
						|
template <typename StructuredCloneFile>
 | 
						|
inline StructuredCloneReadInfo<StructuredCloneFile>::StructuredCloneReadInfo(
 | 
						|
    JS::StructuredCloneScope aScope)
 | 
						|
    : StructuredCloneReadInfoBase(JSStructuredCloneData{aScope}) {
 | 
						|
  MOZ_COUNT_CTOR(StructuredCloneReadInfo);
 | 
						|
}
 | 
						|
 | 
						|
template <typename StructuredCloneFile>
 | 
						|
inline StructuredCloneReadInfo<StructuredCloneFile>::StructuredCloneReadInfo()
 | 
						|
    : StructuredCloneReadInfo(
 | 
						|
          JS::StructuredCloneScope::DifferentProcessForIndexedDB) {}
 | 
						|
 | 
						|
template <typename StructuredCloneFile>
 | 
						|
inline StructuredCloneReadInfo<StructuredCloneFile>::StructuredCloneReadInfo(
 | 
						|
    JSStructuredCloneData&& aData, nsTArray<StructuredCloneFile> aFiles)
 | 
						|
    : StructuredCloneReadInfoBase{std::move(aData)}, mFiles{std::move(aFiles)} {
 | 
						|
  MOZ_COUNT_CTOR(StructuredCloneReadInfo);
 | 
						|
}
 | 
						|
 | 
						|
#ifdef NS_BUILD_REFCNT_LOGGING
 | 
						|
template <typename StructuredCloneFile>
 | 
						|
inline StructuredCloneReadInfo<StructuredCloneFile>::StructuredCloneReadInfo(
 | 
						|
    StructuredCloneReadInfo&& aOther) noexcept
 | 
						|
    : StructuredCloneReadInfoBase{std::move(aOther)},
 | 
						|
      mFiles{std::move(aOther.mFiles)} {
 | 
						|
  MOZ_COUNT_CTOR(StructuredCloneReadInfo);
 | 
						|
}
 | 
						|
 | 
						|
template <typename StructuredCloneFile>
 | 
						|
inline StructuredCloneReadInfo<
 | 
						|
    StructuredCloneFile>::~StructuredCloneReadInfo() {
 | 
						|
  MOZ_COUNT_DTOR(StructuredCloneReadInfo);
 | 
						|
}
 | 
						|
 | 
						|
#endif
 | 
						|
 | 
						|
template <typename StructuredCloneFile>
 | 
						|
inline size_t StructuredCloneReadInfo<StructuredCloneFile>::Size() const {
 | 
						|
  size_t size = Data().Size();
 | 
						|
 | 
						|
  for (uint32_t i = 0, count = mFiles.Length(); i < count; ++i) {
 | 
						|
    // We don't want to calculate the size of files and so on, because are
 | 
						|
    // mainly file descriptors.
 | 
						|
    size += sizeof(uint64_t);
 | 
						|
  }
 | 
						|
 | 
						|
  return size;
 | 
						|
}
 | 
						|
 | 
						|
inline StructuredCloneReadInfoChild::StructuredCloneReadInfoChild(
 | 
						|
    JSStructuredCloneData&& aData, nsTArray<StructuredCloneFileChild> aFiles,
 | 
						|
    IDBDatabase* aDatabase)
 | 
						|
    : StructuredCloneReadInfo{std::move(aData), std::move(aFiles)},
 | 
						|
      mDatabase{aDatabase} {}
 | 
						|
 | 
						|
template <typename E, typename Map>
 | 
						|
RefPtr<DOMStringList> CreateSortedDOMStringList(const nsTArray<E>& aArray,
 | 
						|
                                                const Map& aMap) {
 | 
						|
  auto list = MakeRefPtr<DOMStringList>();
 | 
						|
 | 
						|
  if (!aArray.IsEmpty()) {
 | 
						|
    nsTArray<nsString>& mapped = list->StringArray();
 | 
						|
    mapped.SetCapacity(aArray.Length());
 | 
						|
 | 
						|
    std::transform(aArray.cbegin(), aArray.cend(), MakeBackInserter(mapped),
 | 
						|
                   aMap);
 | 
						|
 | 
						|
    mapped.Sort();
 | 
						|
  }
 | 
						|
 | 
						|
  return list;
 | 
						|
}
 | 
						|
 | 
						|
template <typename StructuredCloneReadInfoType>
 | 
						|
JSObject* StructuredCloneReadCallback(
 | 
						|
    JSContext* const aCx, JSStructuredCloneReader* const aReader,
 | 
						|
    const JS::CloneDataPolicy& aCloneDataPolicy, const uint32_t aTag,
 | 
						|
    const uint32_t aData, void* const aClosure) {
 | 
						|
  auto* const database = [aClosure]() -> IDBDatabase* {
 | 
						|
    if constexpr (std::is_same_v<StructuredCloneReadInfoType,
 | 
						|
                                 StructuredCloneReadInfoChild>) {
 | 
						|
      return static_cast<StructuredCloneReadInfoChild*>(aClosure)->Database();
 | 
						|
    }
 | 
						|
    Unused << aClosure;
 | 
						|
    return nullptr;
 | 
						|
  }();
 | 
						|
  return CommonStructuredCloneReadCallback(
 | 
						|
      aCx, aReader, aCloneDataPolicy, aTag, aData,
 | 
						|
      static_cast<StructuredCloneReadInfoType*>(aClosure), database);
 | 
						|
}
 | 
						|
 | 
						|
template <typename T>
 | 
						|
bool WrapAsJSObject(JSContext* const aCx, T& aBaseObject,
 | 
						|
                    JS::MutableHandle<JSObject*> aResult) {
 | 
						|
  JS::Rooted<JS::Value> wrappedValue(aCx);
 | 
						|
  if (!ToJSValue(aCx, aBaseObject, &wrappedValue)) {
 | 
						|
    return false;
 | 
						|
  }
 | 
						|
 | 
						|
  aResult.set(&wrappedValue.toObject());
 | 
						|
  return true;
 | 
						|
}
 | 
						|
 | 
						|
}  // namespace mozilla::dom::indexedDB
 | 
						|
 | 
						|
#endif  // IndexedDatabaseInlines_h
 |