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 "extensions/renderer/worker_thread_dispatcher.h" | 5 #include "extensions/renderer/worker_thread_dispatcher.h" |
6 | 6 |
7 #include "base/memory/ptr_util.h" | 7 #include "base/memory/ptr_util.h" |
8 #include "base/threading/platform_thread.h" | 8 #include "base/threading/platform_thread.h" |
9 #include "base/threading/thread_local.h" | 9 #include "base/threading/thread_local.h" |
10 #include "base/values.h" | 10 #include "base/values.h" |
11 #include "content/public/child/worker_thread.h" | 11 #include "content/public/child/worker_thread.h" |
12 #include "content/public/renderer/render_thread.h" | 12 #include "content/public/renderer/render_thread.h" |
| 13 #include "extensions/common/constants.h" |
13 #include "extensions/common/extension_messages.h" | 14 #include "extensions/common/extension_messages.h" |
14 #include "extensions/common/feature_switch.h" | 15 #include "extensions/common/feature_switch.h" |
| 16 #include "extensions/renderer/dispatcher.h" |
15 #include "extensions/renderer/extension_bindings_system.h" | 17 #include "extensions/renderer/extension_bindings_system.h" |
16 #include "extensions/renderer/js_extension_bindings_system.h" | 18 #include "extensions/renderer/js_extension_bindings_system.h" |
17 #include "extensions/renderer/native_extension_bindings_system.h" | 19 #include "extensions/renderer/native_extension_bindings_system.h" |
18 #include "extensions/renderer/service_worker_data.h" | 20 #include "extensions/renderer/service_worker_data.h" |
19 | 21 |
20 namespace extensions { | 22 namespace extensions { |
21 | 23 |
22 namespace { | 24 namespace { |
23 | 25 |
24 base::LazyInstance<WorkerThreadDispatcher>::DestructorAtExit g_instance = | 26 base::LazyInstance<WorkerThreadDispatcher>::DestructorAtExit g_instance = |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
79 } | 81 } |
80 | 82 |
81 // static | 83 // static |
82 V8SchemaRegistry* WorkerThreadDispatcher::GetV8SchemaRegistry() { | 84 V8SchemaRegistry* WorkerThreadDispatcher::GetV8SchemaRegistry() { |
83 return GetServiceWorkerData()->v8_schema_registry(); | 85 return GetServiceWorkerData()->v8_schema_registry(); |
84 } | 86 } |
85 | 87 |
86 // static | 88 // static |
87 bool WorkerThreadDispatcher::HandlesMessageOnWorkerThread( | 89 bool WorkerThreadDispatcher::HandlesMessageOnWorkerThread( |
88 const IPC::Message& message) { | 90 const IPC::Message& message) { |
89 return message.type() == ExtensionMsg_ResponseWorker::ID; | 91 return message.type() == ExtensionMsg_ResponseWorker::ID || |
| 92 message.type() == ExtensionMsg_DispatchEvent::ID; |
90 } | 93 } |
91 | 94 |
92 // static | 95 // static |
93 void WorkerThreadDispatcher::ForwardIPC(int worker_thread_id, | 96 void WorkerThreadDispatcher::ForwardIPC(int worker_thread_id, |
94 const IPC::Message& message) { | 97 const IPC::Message& message) { |
95 WorkerThreadDispatcher::Get()->OnMessageReceivedOnWorkerThread( | 98 WorkerThreadDispatcher::Get()->OnMessageReceivedOnWorkerThread( |
96 worker_thread_id, message); | 99 worker_thread_id, message); |
97 } | 100 } |
98 | 101 |
99 bool WorkerThreadDispatcher::OnControlMessageReceived( | 102 bool WorkerThreadDispatcher::OnControlMessageReceived( |
100 const IPC::Message& message) { | 103 const IPC::Message& message) { |
101 if (HandlesMessageOnWorkerThread(message)) { | 104 if (HandlesMessageOnWorkerThread(message)) { |
102 int worker_thread_id = base::kInvalidThreadId; | 105 int worker_thread_id = base::kInvalidThreadId; |
| 106 // TODO(lazyboy): Route |message| directly to the child thread using routed |
| 107 // IPC. Probably using mojo? |
103 bool found = base::PickleIterator(message).ReadInt(&worker_thread_id); | 108 bool found = base::PickleIterator(message).ReadInt(&worker_thread_id); |
104 CHECK(found && worker_thread_id > 0); | 109 CHECK(found); |
| 110 if (worker_thread_id == kNonWorkerThreadId) |
| 111 return false; |
105 base::TaskRunner* runner = GetTaskRunnerFor(worker_thread_id); | 112 base::TaskRunner* runner = GetTaskRunnerFor(worker_thread_id); |
106 bool task_posted = runner->PostTask( | 113 bool task_posted = runner->PostTask( |
107 FROM_HERE, base::Bind(&WorkerThreadDispatcher::ForwardIPC, | 114 FROM_HERE, base::Bind(&WorkerThreadDispatcher::ForwardIPC, |
108 worker_thread_id, message)); | 115 worker_thread_id, message)); |
109 DCHECK(task_posted) << "Could not PostTask IPC to worker thread."; | 116 DCHECK(task_posted) << "Could not PostTask IPC to worker thread."; |
110 return true; | 117 return true; |
111 } | 118 } |
112 return false; | 119 return false; |
113 } | 120 } |
114 | 121 |
115 void WorkerThreadDispatcher::OnMessageReceivedOnWorkerThread( | 122 void WorkerThreadDispatcher::OnMessageReceivedOnWorkerThread( |
116 int worker_thread_id, | 123 int worker_thread_id, |
117 const IPC::Message& message) { | 124 const IPC::Message& message) { |
118 CHECK_EQ(content::WorkerThread::GetCurrentId(), worker_thread_id); | 125 CHECK_EQ(content::WorkerThread::GetCurrentId(), worker_thread_id); |
119 bool handled = true; | 126 bool handled = true; |
120 IPC_BEGIN_MESSAGE_MAP(WorkerThreadDispatcher, message) | 127 IPC_BEGIN_MESSAGE_MAP(WorkerThreadDispatcher, message) |
121 IPC_MESSAGE_HANDLER(ExtensionMsg_ResponseWorker, OnResponseWorker) | 128 IPC_MESSAGE_HANDLER(ExtensionMsg_ResponseWorker, OnResponseWorker) |
| 129 IPC_MESSAGE_HANDLER(ExtensionMsg_DispatchEvent, OnDispatchEvent) |
122 IPC_MESSAGE_UNHANDLED(handled = false) | 130 IPC_MESSAGE_UNHANDLED(handled = false) |
123 IPC_END_MESSAGE_MAP() | 131 IPC_END_MESSAGE_MAP() |
124 CHECK(handled); | 132 CHECK(handled); |
125 } | 133 } |
126 | 134 |
127 base::TaskRunner* WorkerThreadDispatcher::GetTaskRunnerFor( | 135 base::TaskRunner* WorkerThreadDispatcher::GetTaskRunnerFor( |
128 int worker_thread_id) { | 136 int worker_thread_id) { |
129 base::AutoLock lock(task_runner_map_lock_); | 137 base::AutoLock lock(task_runner_map_lock_); |
130 return task_runner_map_[worker_thread_id]; | 138 return task_runner_map_[worker_thread_id]; |
131 } | 139 } |
(...skipping 10 matching lines...) Expand all Loading... |
142 // TODO(devlin): Using the RequestSender directly here won't work with | 150 // TODO(devlin): Using the RequestSender directly here won't work with |
143 // NativeExtensionBindingsSystem (since there is no associated RequestSender | 151 // NativeExtensionBindingsSystem (since there is no associated RequestSender |
144 // in that case). We should instead be going | 152 // in that case). We should instead be going |
145 // ExtensionBindingsSystem::HandleResponse(). | 153 // ExtensionBindingsSystem::HandleResponse(). |
146 ServiceWorkerData* data = g_data_tls.Pointer()->Get(); | 154 ServiceWorkerData* data = g_data_tls.Pointer()->Get(); |
147 WorkerThreadDispatcher::GetRequestSender()->HandleWorkerResponse( | 155 WorkerThreadDispatcher::GetRequestSender()->HandleWorkerResponse( |
148 request_id, data->service_worker_version_id(), succeeded, response, | 156 request_id, data->service_worker_version_id(), succeeded, response, |
149 error); | 157 error); |
150 } | 158 } |
151 | 159 |
| 160 void WorkerThreadDispatcher::OnDispatchEvent( |
| 161 const ExtensionMsg_DispatchEvent_Params& params, |
| 162 const base::ListValue& event_args) { |
| 163 ServiceWorkerData* data = g_data_tls.Pointer()->Get(); |
| 164 DCHECK(data); |
| 165 data->bindings_system()->DispatchEventInContext( |
| 166 params.event_name, &event_args, ¶ms.filtering_info, data->context()); |
| 167 } |
| 168 |
152 void WorkerThreadDispatcher::AddWorkerData( | 169 void WorkerThreadDispatcher::AddWorkerData( |
153 int64_t service_worker_version_id, | 170 int64_t service_worker_version_id, |
| 171 ScriptContext* context, |
154 ResourceBundleSourceMap* source_map) { | 172 ResourceBundleSourceMap* source_map) { |
155 ServiceWorkerData* data = g_data_tls.Pointer()->Get(); | 173 ServiceWorkerData* data = g_data_tls.Pointer()->Get(); |
156 if (!data) { | 174 if (!data) { |
157 std::unique_ptr<ExtensionBindingsSystem> bindings_system; | 175 std::unique_ptr<ExtensionBindingsSystem> bindings_system; |
158 if (FeatureSwitch::native_crx_bindings()->IsEnabled()) { | 176 if (FeatureSwitch::native_crx_bindings()->IsEnabled()) { |
159 bindings_system = base::MakeUnique<NativeExtensionBindingsSystem>( | 177 bindings_system = base::MakeUnique<NativeExtensionBindingsSystem>( |
160 base::Bind(&SendRequestIPC), base::Bind(&SendEventListenersIPC)); | 178 base::Bind(&SendRequestIPC), base::Bind(&SendEventListenersIPC)); |
161 } else { | 179 } else { |
162 bindings_system = base::MakeUnique<JsExtensionBindingsSystem>( | 180 bindings_system = base::MakeUnique<JsExtensionBindingsSystem>( |
163 source_map, base::MakeUnique<ServiceWorkerRequestSender>( | 181 source_map, base::MakeUnique<ServiceWorkerRequestSender>( |
164 this, service_worker_version_id)); | 182 this, service_worker_version_id)); |
165 } | 183 } |
166 ServiceWorkerData* new_data = new ServiceWorkerData( | 184 ServiceWorkerData* new_data = new ServiceWorkerData( |
167 service_worker_version_id, std::move(bindings_system)); | 185 service_worker_version_id, context, std::move(bindings_system)); |
168 g_data_tls.Pointer()->Set(new_data); | 186 g_data_tls.Pointer()->Set(new_data); |
169 } | 187 } |
170 | 188 |
171 int worker_thread_id = base::PlatformThread::CurrentId(); | 189 int worker_thread_id = base::PlatformThread::CurrentId(); |
172 DCHECK_EQ(content::WorkerThread::GetCurrentId(), worker_thread_id); | 190 DCHECK_EQ(content::WorkerThread::GetCurrentId(), worker_thread_id); |
173 { | 191 { |
174 base::AutoLock lock(task_runner_map_lock_); | 192 base::AutoLock lock(task_runner_map_lock_); |
175 auto* task_runner = base::ThreadTaskRunnerHandle::Get().get(); | 193 auto* task_runner = base::ThreadTaskRunnerHandle::Get().get(); |
176 CHECK(task_runner); | 194 CHECK(task_runner); |
177 task_runner_map_[worker_thread_id] = task_runner; | 195 task_runner_map_[worker_thread_id] = task_runner; |
(...skipping 11 matching lines...) Expand all Loading... |
189 | 207 |
190 int worker_thread_id = base::PlatformThread::CurrentId(); | 208 int worker_thread_id = base::PlatformThread::CurrentId(); |
191 DCHECK_EQ(content::WorkerThread::GetCurrentId(), worker_thread_id); | 209 DCHECK_EQ(content::WorkerThread::GetCurrentId(), worker_thread_id); |
192 { | 210 { |
193 base::AutoLock lock(task_runner_map_lock_); | 211 base::AutoLock lock(task_runner_map_lock_); |
194 task_runner_map_.erase(worker_thread_id); | 212 task_runner_map_.erase(worker_thread_id); |
195 } | 213 } |
196 } | 214 } |
197 | 215 |
198 } // namespace extensions | 216 } // namespace extensions |
OLD | NEW |