bool SerializedScriptValueReaderForModules::read(
    v8::Local<v8::Value>* value,
    ScriptValueDeserializer& deserializer) {
  SerializationTag tag;
  if (!readTag(&tag))
    return false;
  switch (tag) {
    case DOMFileSystemTag:
      if (!readDOMFileSystem(value))
        return false;
      deserializer.pushObjectReference(*value);
      break;
    case CryptoKeyTag:
      if (!readCryptoKey(value))
        return false;
      deserializer.pushObjectReference(*value);
      break;
    case RTCCertificateTag:
      if (!readRTCCertificate(value))
        return false;
      deserializer.pushObjectReference(*value);
      break;
    default:
      return SerializedScriptValueReader::readWithTag(tag, value, deserializer);
  }
  return !value->IsEmpty();
}
bool SerializedScriptValueReaderForModules::read(v8::Local<v8::Value>* value, ScriptValueCompositeCreator& creator)
{
    SerializationTag tag;
    if (!readTag(&tag))
        return false;
    switch (tag) {
    case DOMFileSystemTag:
        if (!readDOMFileSystem(value))
            return false;
        creator.pushObjectReference(*value);
        break;
    case CryptoKeyTag:
        if (!readCryptoKey(value))
            return false;
        creator.pushObjectReference(*value);
        break;
    default:
        return SerializedScriptValueReader::readWithTag(tag, value, creator);
    }
    return !value->IsEmpty();
}
ScriptWrappable* V8ScriptValueDeserializerForModules::readDOMObject(
    SerializationTag tag) {
  // Give the core/ implementation a chance to try first.
  // If it didn't recognize the kind of wrapper, try the modules types.
  if (ScriptWrappable* wrappable =
          V8ScriptValueDeserializer::readDOMObject(tag))
    return wrappable;

  switch (tag) {
    case CryptoKeyTag:
      return readCryptoKey();
    case DOMFileSystemTag: {
      uint32_t rawType;
      String name;
      String rootURL;
      if (!readUint32(&rawType) || rawType > FileSystemTypeLast ||
          !readUTF8String(&name) || !readUTF8String(&rootURL))
        return nullptr;
      return DOMFileSystem::create(getScriptState()->getExecutionContext(),
                                   name, static_cast<FileSystemType>(rawType),
                                   KURL(ParsedURLString, rootURL));
    }
    case RTCCertificateTag: {
      String pemPrivateKey;
      String pemCertificate;
      if (!readUTF8String(&pemPrivateKey) || !readUTF8String(&pemCertificate))
        return nullptr;
      std::unique_ptr<WebRTCCertificateGenerator> certificateGenerator(
          Platform::current()->createRTCCertificateGenerator());
      std::unique_ptr<WebRTCCertificate> certificate =
          certificateGenerator->fromPEM(pemPrivateKey, pemCertificate);
      return new RTCCertificate(std::move(certificate));
    }
    default:
      break;
  }
  return nullptr;
}