Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(579)

Side by Side Diff: extensions/renderer/worker_thread_dispatcher.cc

Issue 2886923002: [extension SW]: Support event listener registration and event dispatching. (Closed)
Patch Set: sync Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « extensions/renderer/worker_thread_dispatcher.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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, &params.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
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
OLDNEW
« no previous file with comments | « extensions/renderer/worker_thread_dispatcher.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698