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

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

Issue 2886923002: [extension SW]: Support event listener registration and event dispatching. (Closed)
Patch Set: fix DCHECK 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
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/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
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);
dcheng 2017/06/06 04:55:07 Btw this seems pretty hard to understand. We shoul
lazyboy 2017/06/06 19:12:00 Yes, restored CHECK. This was previously a CHECK.
dcheng 2017/06/06 20:59:55 Something something mojo I think. But in principle
104 CHECK(found && worker_thread_id > 0); 106 if (!found || worker_thread_id <= 0)
dcheng 2017/06/05 20:23:15 Why would the worker_thread_id be < 0? Maybe just
lazyboy 2017/06/05 21:12:06 Done.
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
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, &params.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
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
OLDNEW
« extensions/renderer/event_bindings.cc ('K') | « extensions/renderer/worker_thread_dispatcher.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698