Commit 8227f145 authored by Hiroshige Hayashizaki's avatar Hiroshige Hayashizaki Committed by Commit Bot

Introduce WorkerOrWorkletGlobalScope::CreateOutsideSettingsFetcher()

This CL
- Introduces CreateOutsideSettingsFetcher() that will be used in
  https://chromium-review.googlesource.com/1328164
- Extends pause/unpause mechanism that has been implemented for
  existing (insideSettings) ResourceFetcher to cover
  ResourceFetchers created by CreateOutsideSettingsFetcher().

This CL shouldn't change the behavior.

Bug: 880027
Change-Id: Ifa21b4d31f6d01fa7a9021410d5aa95a7bbf0a78
Reviewed-on: https://chromium-review.googlesource.com/c/1328043
Commit-Queue: Hiroshige Hayashizaki <hiroshige@chromium.org>
Reviewed-by: default avatarHiroki Nakagawa <nhiroki@chromium.org>
Reviewed-by: default avatarYutaka Hirano <yhirano@chromium.org>
Cr-Commit-Position: refs/heads/master@{#607939}
parent fbed28d4
...@@ -39,23 +39,25 @@ WorkerFetchContext::~WorkerFetchContext() = default; ...@@ -39,23 +39,25 @@ WorkerFetchContext::~WorkerFetchContext() = default;
WorkerFetchContext* WorkerFetchContext::Create( WorkerFetchContext* WorkerFetchContext::Create(
WorkerOrWorkletGlobalScope& global_scope, WorkerOrWorkletGlobalScope& global_scope,
scoped_refptr<WebWorkerFetchContext> web_context, scoped_refptr<WebWorkerFetchContext> web_context,
SubresourceFilter* subresource_filter) { SubresourceFilter* subresource_filter,
FetchClientSettingsObject* fetch_client_settings_object) {
if (!web_context) if (!web_context)
return nullptr; return nullptr;
return new WorkerFetchContext(global_scope, std::move(web_context), return new WorkerFetchContext(global_scope, std::move(web_context),
subresource_filter); subresource_filter,
fetch_client_settings_object);
} }
WorkerFetchContext::WorkerFetchContext( WorkerFetchContext::WorkerFetchContext(
WorkerOrWorkletGlobalScope& global_scope, WorkerOrWorkletGlobalScope& global_scope,
scoped_refptr<WebWorkerFetchContext> web_context, scoped_refptr<WebWorkerFetchContext> web_context,
SubresourceFilter* subresource_filter) SubresourceFilter* subresource_filter,
FetchClientSettingsObject* fetch_client_settings_object)
: BaseFetchContext(global_scope.GetTaskRunner(TaskType::kInternalLoading)), : BaseFetchContext(global_scope.GetTaskRunner(TaskType::kInternalLoading)),
global_scope_(global_scope), global_scope_(global_scope),
web_context_(std::move(web_context)), web_context_(std::move(web_context)),
subresource_filter_(subresource_filter), subresource_filter_(subresource_filter),
fetch_client_settings_object_( fetch_client_settings_object_(fetch_client_settings_object),
new FetchClientSettingsObjectImpl(*global_scope_)),
save_data_enabled_(GetNetworkStateNotifier().SaveDataEnabled()) { save_data_enabled_(GetNetworkStateNotifier().SaveDataEnabled()) {
DCHECK(global_scope.IsContextThread()); DCHECK(global_scope.IsContextThread());
DCHECK(web_context_); DCHECK(web_context_);
......
...@@ -30,7 +30,8 @@ class WorkerFetchContext final : public BaseFetchContext { ...@@ -30,7 +30,8 @@ class WorkerFetchContext final : public BaseFetchContext {
public: public:
static WorkerFetchContext* Create(WorkerOrWorkletGlobalScope&, static WorkerFetchContext* Create(WorkerOrWorkletGlobalScope&,
scoped_refptr<WebWorkerFetchContext>, scoped_refptr<WebWorkerFetchContext>,
SubresourceFilter*); SubresourceFilter*,
FetchClientSettingsObject*);
~WorkerFetchContext() override; ~WorkerFetchContext() override;
// BaseFetchContext implementation: // BaseFetchContext implementation:
...@@ -128,7 +129,8 @@ class WorkerFetchContext final : public BaseFetchContext { ...@@ -128,7 +129,8 @@ class WorkerFetchContext final : public BaseFetchContext {
private: private:
WorkerFetchContext(WorkerOrWorkletGlobalScope&, WorkerFetchContext(WorkerOrWorkletGlobalScope&,
scoped_refptr<WebWorkerFetchContext>, scoped_refptr<WebWorkerFetchContext>,
SubresourceFilter*); SubresourceFilter*,
FetchClientSettingsObject*);
void SetFirstPartyCookie(ResourceRequest&); void SetFirstPartyCookie(ResourceRequest&);
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include "third_party/blink/renderer/core/loader/subresource_filter.h" #include "third_party/blink/renderer/core/loader/subresource_filter.h"
#include "third_party/blink/renderer/core/loader/worker_fetch_context.h" #include "third_party/blink/renderer/core/loader/worker_fetch_context.h"
#include "third_party/blink/renderer/core/probe/core_probes.h" #include "third_party/blink/renderer/core/probe/core_probes.h"
#include "third_party/blink/renderer/core/script/fetch_client_settings_object_impl.h"
#include "third_party/blink/renderer/core/workers/worker_reporting_proxy.h" #include "third_party/blink/renderer/core/workers/worker_reporting_proxy.h"
#include "third_party/blink/renderer/core/workers/worker_thread.h" #include "third_party/blink/renderer/core/workers/worker_thread.h"
#include "third_party/blink/renderer/platform/cross_thread_functional.h" #include "third_party/blink/renderer/platform/cross_thread_functional.h"
...@@ -117,23 +118,37 @@ void WorkerOrWorkletGlobalScope::InitializeWebFetchContextIfNeeded() { ...@@ -117,23 +118,37 @@ void WorkerOrWorkletGlobalScope::InitializeWebFetchContextIfNeeded() {
ResourceFetcher* WorkerOrWorkletGlobalScope::EnsureFetcher() { ResourceFetcher* WorkerOrWorkletGlobalScope::EnsureFetcher() {
DCHECK(IsContextThread()); DCHECK(IsContextThread());
if (resource_fetcher_) if (inside_settings_resource_fetcher_)
return resource_fetcher_; return inside_settings_resource_fetcher_;
inside_settings_resource_fetcher_ =
CreateFetcherInternal(new FetchClientSettingsObjectImpl(*this));
return inside_settings_resource_fetcher_;
}
ResourceFetcher* WorkerOrWorkletGlobalScope::CreateFetcherInternal(
FetchClientSettingsObject* fetch_client_settings_object) {
DCHECK(IsContextThread());
InitializeWebFetchContextIfNeeded(); InitializeWebFetchContextIfNeeded();
WorkerFetchContext* fetch_context = WorkerFetchContext::Create( WorkerFetchContext* fetch_context = WorkerFetchContext::Create(
*this, web_worker_fetch_context_, subresource_filter_); *this, web_worker_fetch_context_, subresource_filter_,
resource_fetcher_ = ResourceFetcher::Create(fetch_context); fetch_client_settings_object);
ResourceFetcher* resource_fetcher = ResourceFetcher::Create(fetch_context);
if (IsContextPaused()) if (IsContextPaused())
resource_fetcher_->SetDefersLoading(true); resource_fetcher->SetDefersLoading(true);
DCHECK(resource_fetcher_); resource_fetchers_.insert(resource_fetcher);
return resource_fetcher_; return resource_fetcher;
} }
ResourceFetcher* WorkerOrWorkletGlobalScope::Fetcher() const { ResourceFetcher* WorkerOrWorkletGlobalScope::Fetcher() const {
DCHECK(IsContextThread()); DCHECK(IsContextThread());
DCHECK(resource_fetcher_); DCHECK(inside_settings_resource_fetcher_);
return resource_fetcher_; return inside_settings_resource_fetcher_;
}
ResourceFetcher* WorkerOrWorkletGlobalScope::CreateOutsideSettingsFetcher(
FetchClientSettingsObject* fetch_client_settings_object) {
DCHECK(IsContextThread());
return CreateFetcherInternal(fetch_client_settings_object);
} }
bool WorkerOrWorkletGlobalScope::IsJSExecutionForbidden() const { bool WorkerOrWorkletGlobalScope::IsJSExecutionForbidden() const {
...@@ -157,9 +172,9 @@ void WorkerOrWorkletGlobalScope::Dispose() { ...@@ -157,9 +172,9 @@ void WorkerOrWorkletGlobalScope::Dispose() {
script_controller_->Dispose(); script_controller_->Dispose();
script_controller_.Clear(); script_controller_.Clear();
if (resource_fetcher_) { for (ResourceFetcher* resource_fetcher : resource_fetchers_) {
resource_fetcher_->StopFetching(); resource_fetcher->StopFetching();
resource_fetcher_->ClearContext(); resource_fetcher->ClearContext();
} }
} }
...@@ -227,18 +242,19 @@ void WorkerOrWorkletGlobalScope::FetchModuleScript( ...@@ -227,18 +242,19 @@ void WorkerOrWorkletGlobalScope::FetchModuleScript(
void WorkerOrWorkletGlobalScope::TasksWerePaused() { void WorkerOrWorkletGlobalScope::TasksWerePaused() {
ExecutionContext::TasksWerePaused(); ExecutionContext::TasksWerePaused();
if (resource_fetcher_) for (ResourceFetcher* resource_fetcher : resource_fetchers_)
resource_fetcher_->SetDefersLoading(true); resource_fetcher->SetDefersLoading(true);
} }
void WorkerOrWorkletGlobalScope::TasksWereUnpaused() { void WorkerOrWorkletGlobalScope::TasksWereUnpaused() {
ExecutionContext::TasksWereUnpaused(); ExecutionContext::TasksWereUnpaused();
if (resource_fetcher_) for (ResourceFetcher* resource_fetcher : resource_fetchers_)
resource_fetcher_->SetDefersLoading(false); resource_fetcher->SetDefersLoading(false);
} }
void WorkerOrWorkletGlobalScope::Trace(blink::Visitor* visitor) { void WorkerOrWorkletGlobalScope::Trace(blink::Visitor* visitor) {
visitor->Trace(resource_fetcher_); visitor->Trace(inside_settings_resource_fetcher_);
visitor->Trace(resource_fetchers_);
visitor->Trace(subresource_filter_); visitor->Trace(subresource_filter_);
visitor->Trace(script_controller_); visitor->Trace(script_controller_);
visitor->Trace(modulator_); visitor->Trace(modulator_);
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
namespace blink { namespace blink {
class FetchClientSettingsObject;
class FetchClientSettingsObjectSnapshot; class FetchClientSettingsObjectSnapshot;
class Modulator; class Modulator;
class ModuleTreeClient; class ModuleTreeClient;
...@@ -93,6 +94,17 @@ class CORE_EXPORT WorkerOrWorkletGlobalScope : public EventTargetWithInlineData, ...@@ -93,6 +94,17 @@ class CORE_EXPORT WorkerOrWorkletGlobalScope : public EventTargetWithInlineData,
ResourceFetcher* Fetcher() const override; ResourceFetcher* Fetcher() const override;
ResourceFetcher* EnsureFetcher(); ResourceFetcher* EnsureFetcher();
// ResourceFetcher for off-the-main-thread worker top-level script fetching,
// corresponding to "outside" fetch client's settings object.
// CreateOutsideSettingsFetcher() is called for each invocation of top-level
// script fetch, which can occur multiple times in worklets.
// TODO(hiroshige, nhiroki): Currently this outside ResourceFetcher and its
// WorkerFetchContext is mostly the copy of the insideSettings
// ResourceFetcher, and have dependencies to WorkerOrWorkletGlobalScope. Plumb
// more data to the outside ResourceFetcher to fix the behavior and reduce the
// dependencies.
ResourceFetcher* CreateOutsideSettingsFetcher(FetchClientSettingsObject*);
WorkerClients* Clients() const { return worker_clients_.Get(); } WorkerClients* Clients() const { return worker_clients_.Get(); }
WorkerOrWorkletScriptController* ScriptController() { WorkerOrWorkletScriptController* ScriptController() {
...@@ -124,16 +136,23 @@ class CORE_EXPORT WorkerOrWorkletGlobalScope : public EventTargetWithInlineData, ...@@ -124,16 +136,23 @@ class CORE_EXPORT WorkerOrWorkletGlobalScope : public EventTargetWithInlineData,
private: private:
void InitializeWebFetchContextIfNeeded(); void InitializeWebFetchContextIfNeeded();
ResourceFetcher* CreateFetcherInternal(FetchClientSettingsObject*);
bool web_fetch_context_initialized_ = false; bool web_fetch_context_initialized_ = false;
CrossThreadPersistent<WorkerClients> worker_clients_; CrossThreadPersistent<WorkerClients> worker_clients_;
Member<ResourceFetcher> resource_fetcher_; Member<ResourceFetcher> inside_settings_resource_fetcher_;
// Keeps track of all ResourceFetchers (including
// |inside_settings_resource_fetcher_|) for disposing and pausing/unpausing.
HeapHashSet<WeakMember<ResourceFetcher>> resource_fetchers_;
// A WorkerOrWorkletGlobalScope has one WebWorkerFetchContext and one // A WorkerOrWorkletGlobalScope has one WebWorkerFetchContext and one
// corresponding SubresourceFilter, which are shared by all // corresponding SubresourceFilter, which are shared by all
// WorkerFetchContexts of |this| global scope after crbug.com/880027. // WorkerFetchContexts of |this| global scope, i.e. those behind
// ResourceFetchers created by EnsureFetcher() and
// CreateOutsideSettingsFetcher().
// As all references to |web_worker_fetch_context_| are on the context // As all references to |web_worker_fetch_context_| are on the context
// thread, |web_worker_fetch_context_| is destructed on the context // thread, |web_worker_fetch_context_| is destructed on the context
// thread. // thread.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment