OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "core/workers/ThreadedWorkletMessagingProxy.h" | 5 #include "core/workers/ThreadedWorkletMessagingProxy.h" |
6 | 6 |
7 #include "bindings/core/v8/ScriptSourceCode.h" | 7 #include "bindings/core/v8/ScriptSourceCode.h" |
8 #include "core/dom/Document.h" | 8 #include "core/dom/Document.h" |
9 #include "core/dom/SecurityContext.h" | 9 #include "core/dom/SecurityContext.h" |
10 #include "core/dom/TaskRunnerHelper.h" | 10 #include "core/dom/TaskRunnerHelper.h" |
11 #include "core/frame/csp/ContentSecurityPolicy.h" | 11 #include "core/frame/csp/ContentSecurityPolicy.h" |
| 12 #include "core/loader/WorkletScriptLoader.h" |
12 #include "core/origin_trials/OriginTrialContext.h" | 13 #include "core/origin_trials/OriginTrialContext.h" |
13 #include "core/workers/ThreadedWorkletObjectProxy.h" | 14 #include "core/workers/ThreadedWorkletObjectProxy.h" |
14 #include "core/workers/WorkerInspectorProxy.h" | 15 #include "core/workers/WorkerInspectorProxy.h" |
15 #include "core/workers/WorkerThreadStartupData.h" | 16 #include "core/workers/WorkerThreadStartupData.h" |
16 #include "core/workers/WorkletGlobalScope.h" | 17 #include "core/workers/WorkletGlobalScope.h" |
17 #include "platform/CrossThreadFunctional.h" | 18 #include "platform/CrossThreadFunctional.h" |
18 #include "platform/WebTaskRunner.h" | 19 #include "platform/WebTaskRunner.h" |
19 | 20 |
20 namespace blink { | 21 namespace blink { |
21 | 22 |
| 23 namespace { |
| 24 |
| 25 // TODO(nhiroki): This will be replaced with WorkletModuleTreeClient when module |
| 26 // loading is ready for threaded worklets. |
| 27 class LoaderClient final : public GarbageCollected<LoaderClient>, |
| 28 public WorkletScriptLoader::Client { |
| 29 USING_GARBAGE_COLLECTED_MIXIN(LoaderClient); |
| 30 |
| 31 public: |
| 32 LoaderClient(WorkletPendingTasks* pending_tasks, |
| 33 ThreadedWorkletMessagingProxy* proxy) |
| 34 : pending_tasks_(pending_tasks), proxy_(proxy) {} |
| 35 |
| 36 // WorkletScriptLoader::Client |
| 37 void NotifyWorkletScriptLoadingFinished( |
| 38 WorkletScriptLoader* script_loader, |
| 39 const ScriptSourceCode& source_code) final { |
| 40 DCHECK(IsMainThread()); |
| 41 if (!script_loader->WasScriptLoadSuccessful()) { |
| 42 pending_tasks_->Abort(); |
| 43 return; |
| 44 } |
| 45 proxy_->EvaluateScript(source_code); |
| 46 pending_tasks_->DecrementCounter(); |
| 47 } |
| 48 |
| 49 DEFINE_INLINE_TRACE() { visitor->Trace(pending_tasks_); } |
| 50 |
| 51 private: |
| 52 Member<WorkletPendingTasks> pending_tasks_; |
| 53 ThreadedWorkletMessagingProxy* proxy_; |
| 54 }; |
| 55 |
| 56 } // namespace |
| 57 |
22 ThreadedWorkletMessagingProxy::ThreadedWorkletMessagingProxy( | 58 ThreadedWorkletMessagingProxy::ThreadedWorkletMessagingProxy( |
23 ExecutionContext* execution_context) | 59 ExecutionContext* execution_context) |
24 : ThreadedMessagingProxyBase(execution_context), weak_ptr_factory_(this) { | 60 : ThreadedMessagingProxyBase(execution_context), weak_ptr_factory_(this) { |
25 worklet_object_proxy_ = ThreadedWorkletObjectProxy::Create( | 61 worklet_object_proxy_ = ThreadedWorkletObjectProxy::Create( |
26 weak_ptr_factory_.CreateWeakPtr(), GetParentFrameTaskRunners()); | 62 weak_ptr_factory_.CreateWeakPtr(), GetParentFrameTaskRunners()); |
27 } | 63 } |
28 | 64 |
29 void ThreadedWorkletMessagingProxy::Initialize() { | 65 void ThreadedWorkletMessagingProxy::Initialize() { |
30 DCHECK(IsParentContextThread()); | 66 DCHECK(IsParentContextThread()); |
31 if (AskedToTerminate()) | 67 if (AskedToTerminate()) |
(...skipping 18 matching lines...) Expand all Loading... |
50 csp->Headers().get(), /* referrerPolicy */ String(), starter_origin, | 86 csp->Headers().get(), /* referrerPolicy */ String(), starter_origin, |
51 nullptr, document->AddressSpace(), | 87 nullptr, document->AddressSpace(), |
52 OriginTrialContext::GetTokens(document).get(), | 88 OriginTrialContext::GetTokens(document).get(), |
53 std::move(worker_settings), WorkerV8Settings::Default()); | 89 std::move(worker_settings), WorkerV8Settings::Default()); |
54 | 90 |
55 InitializeWorkerThread(std::move(startup_data)); | 91 InitializeWorkerThread(std::move(startup_data)); |
56 GetWorkerInspectorProxy()->WorkerThreadCreated(document, GetWorkerThread(), | 92 GetWorkerInspectorProxy()->WorkerThreadCreated(document, GetWorkerThread(), |
57 script_url); | 93 script_url); |
58 } | 94 } |
59 | 95 |
| 96 void ThreadedWorkletMessagingProxy::FetchAndInvokeScript( |
| 97 const KURL& module_url_record, |
| 98 WebURLRequest::FetchCredentialsMode credentials_mode, |
| 99 WorkletPendingTasks* pending_tasks) { |
| 100 DCHECK(IsMainThread()); |
| 101 LoaderClient* client = new LoaderClient(pending_tasks, this); |
| 102 WorkletScriptLoader* script_loader = WorkletScriptLoader::Create( |
| 103 ToDocument(GetExecutionContext())->Fetcher(), client); |
| 104 script_loader->FetchScript(module_url_record); |
| 105 } |
| 106 |
60 void ThreadedWorkletMessagingProxy::EvaluateScript( | 107 void ThreadedWorkletMessagingProxy::EvaluateScript( |
61 const ScriptSourceCode& script_source_code) { | 108 const ScriptSourceCode& script_source_code) { |
| 109 DCHECK(IsMainThread()); |
62 TaskRunnerHelper::Get(TaskType::kMiscPlatformAPI, GetWorkerThread()) | 110 TaskRunnerHelper::Get(TaskType::kMiscPlatformAPI, GetWorkerThread()) |
63 ->PostTask( | 111 ->PostTask( |
64 BLINK_FROM_HERE, | 112 BLINK_FROM_HERE, |
65 CrossThreadBind(&ThreadedWorkletObjectProxy::EvaluateScript, | 113 CrossThreadBind(&ThreadedWorkletObjectProxy::EvaluateScript, |
66 CrossThreadUnretained(worklet_object_proxy_.get()), | 114 CrossThreadUnretained(worklet_object_proxy_.get()), |
67 script_source_code.Source(), script_source_code.Url(), | 115 script_source_code.Source(), script_source_code.Url(), |
68 CrossThreadUnretained(GetWorkerThread()))); | 116 CrossThreadUnretained(GetWorkerThread()))); |
69 } | 117 } |
70 | 118 |
71 void ThreadedWorkletMessagingProxy::TerminateWorkletGlobalScope() { | 119 void ThreadedWorkletMessagingProxy::TerminateWorkletGlobalScope() { |
| 120 DCHECK(IsMainThread()); |
72 TerminateGlobalScope(); | 121 TerminateGlobalScope(); |
73 } | 122 } |
74 | 123 |
75 } // namespace blink | 124 } // namespace blink |
OLD | NEW |