blob: 2838a0a4c49101b49dbfb8208f3aff5e342783f1 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_SERVICE_WORKER_WEB_SERVICE_WORKER_FETCH_CONTEXT_IMPL_H_
#define THIRD_PARTY_BLINK_RENDERER_MODULES_SERVICE_WORKER_WEB_SERVICE_WORKER_FETCH_CONTEXT_IMPL_H_
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "third_party/blink/public/common/renderer_preferences/renderer_preferences.h"
#include "third_party/blink/public/mojom/renderer_preference_watcher.mojom-blink.h"
#include "third_party/blink/public/mojom/service_worker/service_worker.mojom-forward.h"
#include "third_party/blink/public/mojom/worker/subresource_loader_updater.mojom-blink.h"
#include "third_party/blink/public/platform/modules/service_worker/web_service_worker_fetch_context.h"
#include "third_party/blink/public/platform/web_string.h"
#include "third_party/blink/public/platform/web_vector.h"
#include "third_party/blink/renderer/platform/weborigin/kurl.h"
namespace blink {
class InternetDisconnectedWebURLLoaderFactory;
class BLINK_EXPORT WebServiceWorkerFetchContextImpl final
: public WebServiceWorkerFetchContext,
public mojom::blink::RendererPreferenceWatcher,
public mojom::blink::SubresourceLoaderUpdater {
public:
// |pending_url_loader_factory| is used for regular loads from the service
// worker (i.e., Fetch API). It typically goes to network, but it might
// internally contain non-NetworkService factories for handling non-http(s)
// URLs like chrome-extension://. |pending_script_loader_factory| is used for
// importScripts() from the service worker when InstalledScriptsManager
// doesn't have the requested script. It is a
// ServiceWorkerScriptLoaderFactory, which loads and installs the script.
// |script_url_to_skip_throttling| is a URL which is already throttled in the
// browser process so that it doesn't need to be throttled in the renderer
// again.
WebServiceWorkerFetchContextImpl(
const RendererPreferences& renderer_preferences,
const KURL& worker_script_url,
std::unique_ptr<network::PendingSharedURLLoaderFactory>
pending_url_loader_factory,
std::unique_ptr<network::PendingSharedURLLoaderFactory>
pending_script_loader_factory,
const KURL& script_url_to_skip_throttling,
std::unique_ptr<URLLoaderThrottleProvider> throttle_provider,
std::unique_ptr<WebSocketHandshakeThrottleProvider>
websocket_handshake_throttle_provider,
mojo::PendingReceiver<mojom::blink::RendererPreferenceWatcher>
preference_watcher_receiver,
mojo::PendingReceiver<mojom::blink::SubresourceLoaderUpdater>
pending_subresource_loader_updater,
const WebVector<WebString>& cors_exempt_header_list);
// WebServiceWorkerFetchContext implementation:
void SetTerminateSyncLoadEvent(base::WaitableEvent*) override;
void InitializeOnWorkerThread(AcceptLanguagesWatcher*) override;
WebURLLoaderFactory* GetURLLoaderFactory() override;
std::unique_ptr<WebURLLoaderFactory> WrapURLLoaderFactory(
CrossVariantMojoRemote<network::mojom::URLLoaderFactoryInterfaceBase>
url_loader_factory) override;
WebURLLoaderFactory* GetScriptLoaderFactory() override;
void WillSendRequest(WebURLRequest&) override;
mojom::ControllerServiceWorkerMode GetControllerServiceWorkerMode()
const override;
net::SiteForCookies SiteForCookies() const override;
absl::optional<WebSecurityOrigin> TopFrameOrigin() const override;
std::unique_ptr<WebSocketHandshakeThrottle> CreateWebSocketHandshakeThrottle(
scoped_refptr<base::SingleThreadTaskRunner> task_runner) override;
WebString GetAcceptLanguages() const override;
CrossVariantMojoReceiver<mojom::WorkerTimingContainerInterfaceBase>
TakePendingWorkerTimingReceiver(int request_id) override;
void SetIsOfflineMode(bool) override;
// mojom::blink::SubresourceLoaderUpdater implementation:
void UpdateSubresourceLoaderFactories(
std::unique_ptr<PendingURLLoaderFactoryBundle>
subresource_loader_factories) override;
private:
~WebServiceWorkerFetchContextImpl() override;
// Implements mojom::blink::RendererPreferenceWatcher.
void NotifyUpdate(const RendererPreferences& new_prefs) override;
RendererPreferences renderer_preferences_;
const KURL worker_script_url_;
// Consumed on the worker thread to create |web_url_loader_factory_|.
std::unique_ptr<network::PendingSharedURLLoaderFactory>
pending_url_loader_factory_;
// Consumed on the worker thread to create |web_script_loader_factory_|.
std::unique_ptr<network::PendingSharedURLLoaderFactory>
pending_script_loader_factory_;
// A script URL that should skip throttling when loaded because it's already
// being loaded in the browser process and went through throttles there. It's
// valid only once and set to invalid KURL once the script is served.
KURL script_url_to_skip_throttling_;
// Responsible for regular loads from the service worker (i.e., Fetch API).
std::unique_ptr<WebURLLoaderFactory> web_url_loader_factory_;
// Responsible for loads which always fail as INTERNET_DISCONNECTED
// error, which is used in offline mode.
std::unique_ptr<InternetDisconnectedWebURLLoaderFactory>
internet_disconnected_web_url_loader_factory_;
// Responsible for script loads from the service worker (i.e., the
// classic/module main script, module imported scripts, or importScripts()).
std::unique_ptr<WebURLLoaderFactory> web_script_loader_factory_;
std::unique_ptr<URLLoaderThrottleProvider> throttle_provider_;
std::unique_ptr<WebSocketHandshakeThrottleProvider>
websocket_handshake_throttle_provider_;
mojo::Receiver<mojom::blink::RendererPreferenceWatcher>
preference_watcher_receiver_{this};
mojo::Receiver<mojom::blink::SubresourceLoaderUpdater>
subresource_loader_updater_{this};
// These mojo objects are kept while starting up the worker thread. Valid
// until InitializeOnWorkerThread().
mojo::PendingReceiver<mojom::blink::RendererPreferenceWatcher>
preference_watcher_pending_receiver_;
mojo::PendingReceiver<mojom::blink::SubresourceLoaderUpdater>
pending_subresource_loader_updater_;
// This is owned by ThreadedMessagingProxyBase on the main thread.
base::WaitableEvent* terminate_sync_load_event_ = nullptr;
AcceptLanguagesWatcher* accept_languages_watcher_ = nullptr;
WebVector<WebString> cors_exempt_header_list_;
bool is_offline_mode_ = false;
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_SERVICE_WORKER_WEB_SERVICE_WORKER_FETCH_CONTEXT_IMPL_H_