1/*
2 * Copyright (C) 2018 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
18 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
21 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#include "config.h"
27#include "ServiceWorkerInternals.h"
28
29#if ENABLE(SERVICE_WORKER)
30
31#include "FetchEvent.h"
32#include "JSFetchResponse.h"
33#include "SWContextManager.h"
34
35namespace WebCore {
36
37ServiceWorkerInternals::ServiceWorkerInternals(ServiceWorkerIdentifier identifier)
38 : m_identifier(identifier)
39{
40}
41
42ServiceWorkerInternals::~ServiceWorkerInternals() = default;
43
44void ServiceWorkerInternals::setOnline(bool isOnline)
45{
46 callOnMainThread([identifier = m_identifier, isOnline] () {
47 if (auto* proxy = SWContextManager::singleton().workerByID(identifier))
48 proxy->notifyNetworkStateChange(isOnline);
49 });
50}
51
52void ServiceWorkerInternals::waitForFetchEventToFinish(FetchEvent& event, DOMPromiseDeferred<IDLInterface<FetchResponse>>&& promise)
53{
54 event.onResponse([promise = WTFMove(promise), event = makeRef(event)] (auto&& result) mutable {
55 if (result.has_value())
56 promise.resolve(WTFMove(result.value()));
57 else
58 promise.reject(TypeError, result.error().localizedDescription());
59 });
60}
61
62Ref<FetchEvent> ServiceWorkerInternals::createBeingDispatchedFetchEvent(ScriptExecutionContext& context)
63{
64 auto event = FetchEvent::createForTesting(context);
65 event->setEventPhase(Event::CAPTURING_PHASE);
66 return event;
67}
68
69Ref<FetchResponse> ServiceWorkerInternals::createOpaqueWithBlobBodyResponse(ScriptExecutionContext& context)
70{
71 auto blob = Blob::create();
72 auto formData = FormData::create();
73 formData->appendBlob(blob->url());
74
75 ResourceResponse response;
76 response.setType(ResourceResponse::Type::Cors);
77 response.setTainting(ResourceResponse::Tainting::Opaque);
78 auto fetchResponse = FetchResponse::create(context, FetchBody::fromFormData(formData), FetchHeaders::Guard::Response, WTFMove(response));
79 fetchResponse->initializeOpaqueLoadIdentifierForTesting();
80 return fetchResponse;
81}
82
83Vector<String> ServiceWorkerInternals::fetchResponseHeaderList(FetchResponse& response)
84{
85 Vector<String> headerNames;
86 headerNames.reserveInitialCapacity(response.internalResponseHeaders().size());
87 for (auto keyValue : response.internalResponseHeaders())
88 headerNames.uncheckedAppend(keyValue.key);
89 return headerNames;
90}
91
92#if !PLATFORM(MAC)
93String ServiceWorkerInternals::processName() const
94{
95 return "none"_s;
96}
97#endif
98
99bool ServiceWorkerInternals::isThrottleable() const
100{
101 auto* connection = SWContextManager::singleton().connection();
102 return connection ? connection->isThrottleable() : true;
103}
104
105} // namespace WebCore
106
107#endif
108