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