ServiceWorkerJobData.h [plain text]
#pragma once
#if ENABLE(SERVICE_WORKER)
#include "SecurityOriginData.h"
#include "ServiceWorkerClientIdentifier.h"
#include "ServiceWorkerJobDataIdentifier.h"
#include "ServiceWorkerJobType.h"
#include "ServiceWorkerRegistrationKey.h"
#include "ServiceWorkerRegistrationOptions.h"
#include "ServiceWorkerTypes.h"
#include "URL.h"
namespace WebCore {
struct ServiceWorkerJobData {
using Identifier = ServiceWorkerJobDataIdentifier;
ServiceWorkerJobData(SWServerConnectionIdentifier, const DocumentOrWorkerIdentifier& sourceContext);
ServiceWorkerJobData(const ServiceWorkerJobData&) = default;
ServiceWorkerJobData() = default;
SWServerConnectionIdentifier connectionIdentifier() const { return m_identifier.connectionIdentifier; }
URL scriptURL;
URL clientCreationURL;
SecurityOriginData topOrigin;
URL scopeURL;
ServiceWorkerOrClientIdentifier sourceContext;
ServiceWorkerJobType type;
ServiceWorkerRegistrationOptions registrationOptions;
Identifier identifier() const { return m_identifier; }
ServiceWorkerRegistrationKey registrationKey() const;
ServiceWorkerJobData isolatedCopy() const;
template<class Encoder> void encode(Encoder&) const;
template<class Decoder> static std::optional<ServiceWorkerJobData> decode(Decoder&);
private:
WEBCORE_EXPORT explicit ServiceWorkerJobData(const Identifier&);
Identifier m_identifier;
};
template<class Encoder>
void ServiceWorkerJobData::encode(Encoder& encoder) const
{
encoder << identifier() << scriptURL << clientCreationURL << topOrigin << scopeURL << sourceContext;
encoder.encodeEnum(type);
switch (type) {
case ServiceWorkerJobType::Register:
encoder << registrationOptions;
break;
case ServiceWorkerJobType::Unregister:
case ServiceWorkerJobType::Update:
break;
}
}
template<class Decoder>
std::optional<ServiceWorkerJobData> ServiceWorkerJobData::decode(Decoder& decoder)
{
std::optional<ServiceWorkerJobDataIdentifier> identifier;
decoder >> identifier;
if (!identifier)
return std::nullopt;
ServiceWorkerJobData jobData { WTFMove(*identifier) };
if (!decoder.decode(jobData.scriptURL))
return std::nullopt;
if (!decoder.decode(jobData.clientCreationURL))
return std::nullopt;
std::optional<SecurityOriginData> topOrigin;
decoder >> topOrigin;
if (!topOrigin)
return std::nullopt;
jobData.topOrigin = WTFMove(*topOrigin);
if (!decoder.decode(jobData.scopeURL))
return std::nullopt;
if (!decoder.decode(jobData.sourceContext))
return std::nullopt;
if (!decoder.decodeEnum(jobData.type))
return std::nullopt;
switch (jobData.type) {
case ServiceWorkerJobType::Register: {
std::optional<ServiceWorkerRegistrationOptions> registrationOptions;
decoder >> registrationOptions;
if (!registrationOptions)
return std::nullopt;
jobData.registrationOptions = WTFMove(*registrationOptions);
break;
}
case ServiceWorkerJobType::Unregister:
case ServiceWorkerJobType::Update:
break;
}
return WTFMove(jobData);
}
}
#endif // ENABLE(SERVICE_WORKER)