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

Side by Side Diff: extensions/browser/extension_message_filter.cc

Issue 2943583002: [extension SW] Support lazy events from extension service workers. (Closed)
Patch Set: sync @tott Created 3 years, 5 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/browser/extension_message_filter.h" 5 #include "extensions/browser/extension_message_filter.h"
6 6
7 #include "base/macros.h" 7 #include "base/macros.h"
8 #include "base/memory/singleton.h" 8 #include "base/memory/singleton.h"
9 #include "components/crx_file/id_util.h" 9 #include "components/crx_file/id_util.h"
10 #include "components/keyed_service/content/browser_context_keyed_service_shutdow n_notifier_factory.h" 10 #include "components/keyed_service/content/browser_context_keyed_service_shutdow n_notifier_factory.h"
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
83 } 83 }
84 84
85 void ExtensionMessageFilter::OverrideThreadForMessage( 85 void ExtensionMessageFilter::OverrideThreadForMessage(
86 const IPC::Message& message, 86 const IPC::Message& message,
87 BrowserThread::ID* thread) { 87 BrowserThread::ID* thread) {
88 switch (message.type()) { 88 switch (message.type()) {
89 case ExtensionHostMsg_AddListener::ID: 89 case ExtensionHostMsg_AddListener::ID:
90 case ExtensionHostMsg_RemoveListener::ID: 90 case ExtensionHostMsg_RemoveListener::ID:
91 case ExtensionHostMsg_AddLazyListener::ID: 91 case ExtensionHostMsg_AddLazyListener::ID:
92 case ExtensionHostMsg_RemoveLazyListener::ID: 92 case ExtensionHostMsg_RemoveLazyListener::ID:
93 case ExtensionHostMsg_AddLazyServiceWorkerListener::ID:
94 case ExtensionHostMsg_RemoveLazyServiceWorkerListener::ID:
93 case ExtensionHostMsg_AddFilteredListener::ID: 95 case ExtensionHostMsg_AddFilteredListener::ID:
94 case ExtensionHostMsg_RemoveFilteredListener::ID: 96 case ExtensionHostMsg_RemoveFilteredListener::ID:
95 case ExtensionHostMsg_ShouldSuspendAck::ID: 97 case ExtensionHostMsg_ShouldSuspendAck::ID:
96 case ExtensionHostMsg_SuspendAck::ID: 98 case ExtensionHostMsg_SuspendAck::ID:
97 case ExtensionHostMsg_TransferBlobsAck::ID: 99 case ExtensionHostMsg_TransferBlobsAck::ID:
98 case ExtensionHostMsg_WakeEventPage::ID: 100 case ExtensionHostMsg_WakeEventPage::ID:
99 *thread = BrowserThread::UI; 101 *thread = BrowserThread::UI;
100 break; 102 break;
101 default: 103 default:
102 break; 104 break;
(...skipping 12 matching lines...) Expand all
115 bool handled = true; 117 bool handled = true;
116 IPC_BEGIN_MESSAGE_MAP(ExtensionMessageFilter, message) 118 IPC_BEGIN_MESSAGE_MAP(ExtensionMessageFilter, message)
117 IPC_MESSAGE_HANDLER(ExtensionHostMsg_AddListener, 119 IPC_MESSAGE_HANDLER(ExtensionHostMsg_AddListener,
118 OnExtensionAddListener) 120 OnExtensionAddListener)
119 IPC_MESSAGE_HANDLER(ExtensionHostMsg_RemoveListener, 121 IPC_MESSAGE_HANDLER(ExtensionHostMsg_RemoveListener,
120 OnExtensionRemoveListener) 122 OnExtensionRemoveListener)
121 IPC_MESSAGE_HANDLER(ExtensionHostMsg_AddLazyListener, 123 IPC_MESSAGE_HANDLER(ExtensionHostMsg_AddLazyListener,
122 OnExtensionAddLazyListener) 124 OnExtensionAddLazyListener)
123 IPC_MESSAGE_HANDLER(ExtensionHostMsg_RemoveLazyListener, 125 IPC_MESSAGE_HANDLER(ExtensionHostMsg_RemoveLazyListener,
124 OnExtensionRemoveLazyListener) 126 OnExtensionRemoveLazyListener)
127 IPC_MESSAGE_HANDLER(ExtensionHostMsg_AddLazyServiceWorkerListener,
128 OnExtensionAddLazyServiceWorkerListener);
129 IPC_MESSAGE_HANDLER(ExtensionHostMsg_RemoveLazyServiceWorkerListener,
130 OnExtensionRemoveLazyServiceWorkerListener);
125 IPC_MESSAGE_HANDLER(ExtensionHostMsg_AddFilteredListener, 131 IPC_MESSAGE_HANDLER(ExtensionHostMsg_AddFilteredListener,
126 OnExtensionAddFilteredListener) 132 OnExtensionAddFilteredListener)
127 IPC_MESSAGE_HANDLER(ExtensionHostMsg_RemoveFilteredListener, 133 IPC_MESSAGE_HANDLER(ExtensionHostMsg_RemoveFilteredListener,
128 OnExtensionRemoveFilteredListener) 134 OnExtensionRemoveFilteredListener)
129 IPC_MESSAGE_HANDLER(ExtensionHostMsg_ShouldSuspendAck, 135 IPC_MESSAGE_HANDLER(ExtensionHostMsg_ShouldSuspendAck,
130 OnExtensionShouldSuspendAck) 136 OnExtensionShouldSuspendAck)
131 IPC_MESSAGE_HANDLER(ExtensionHostMsg_SuspendAck, 137 IPC_MESSAGE_HANDLER(ExtensionHostMsg_SuspendAck,
132 OnExtensionSuspendAck) 138 OnExtensionSuspendAck)
133 IPC_MESSAGE_HANDLER(ExtensionHostMsg_TransferBlobsAck, 139 IPC_MESSAGE_HANDLER(ExtensionHostMsg_TransferBlobsAck,
134 OnExtensionTransferBlobsAck) 140 OnExtensionTransferBlobsAck)
135 IPC_MESSAGE_HANDLER(ExtensionHostMsg_WakeEventPage, 141 IPC_MESSAGE_HANDLER(ExtensionHostMsg_WakeEventPage,
136 OnExtensionWakeEventPage) 142 OnExtensionWakeEventPage)
137 IPC_MESSAGE_UNHANDLED(handled = false) 143 IPC_MESSAGE_UNHANDLED(handled = false)
138 IPC_END_MESSAGE_MAP() 144 IPC_END_MESSAGE_MAP()
139 return handled; 145 return handled;
140 } 146 }
141 147
142 void ExtensionMessageFilter::OnExtensionAddListener( 148 void ExtensionMessageFilter::OnExtensionAddListener(
143 const std::string& extension_id, 149 const std::string& extension_id,
144 const GURL& listener_url, 150 const GURL& listener_or_worker_scope_url,
145 const std::string& event_name, 151 const std::string& event_name,
146 int worker_thread_id) { 152 int worker_thread_id) {
147 DCHECK_CURRENTLY_ON(BrowserThread::UI); 153 DCHECK_CURRENTLY_ON(BrowserThread::UI);
148 if (!browser_context_) 154 if (!browser_context_)
149 return; 155 return;
150 156
151 RenderProcessHost* process = RenderProcessHost::FromID(render_process_id_); 157 RenderProcessHost* process = RenderProcessHost::FromID(render_process_id_);
152 if (!process) 158 if (!process)
153 return; 159 return;
154 160
155 EventRouter* event_router = GetEventRouter(); 161 EventRouter* event_router = GetEventRouter();
156 if (crx_file::id_util::IdIsValid(extension_id)) { 162 if (crx_file::id_util::IdIsValid(extension_id)) {
157 if (worker_thread_id != kNonWorkerThreadId) { 163 const bool is_service_worker_context =
164 worker_thread_id != kNonWorkerThreadId;
165 if (is_service_worker_context) {
166 DCHECK(listener_or_worker_scope_url.is_valid());
158 event_router->AddServiceWorkerEventListener( 167 event_router->AddServiceWorkerEventListener(
159 event_name, process, extension_id, worker_thread_id); 168 event_name, process, extension_id, listener_or_worker_scope_url,
169 worker_thread_id);
160 } else { 170 } else {
161 event_router->AddEventListener(event_name, process, extension_id); 171 event_router->AddEventListener(event_name, process, extension_id);
162 } 172 }
163 } else if (listener_url.is_valid()) { 173 } else if (listener_or_worker_scope_url.is_valid()) {
164 event_router->AddEventListenerForURL(event_name, process, listener_url); 174 event_router->AddEventListenerForURL(event_name, process,
175 listener_or_worker_scope_url);
165 } else { 176 } else {
166 NOTREACHED() << "Tried to add an event listener without a valid " 177 NOTREACHED() << "Tried to add an event listener without a valid "
167 << "extension ID nor listener URL"; 178 << "extension ID nor listener URL";
168 } 179 }
169 } 180 }
170 181
171 void ExtensionMessageFilter::OnExtensionRemoveListener( 182 void ExtensionMessageFilter::OnExtensionRemoveListener(
172 const std::string& extension_id, 183 const std::string& extension_id,
173 const GURL& listener_url, 184 const GURL& listener_or_worker_scope_url,
174 const std::string& event_name, 185 const std::string& event_name,
175 int worker_thread_id) { 186 int worker_thread_id) {
176 DCHECK_CURRENTLY_ON(BrowserThread::UI); 187 DCHECK_CURRENTLY_ON(BrowserThread::UI);
177 if (!browser_context_) 188 if (!browser_context_)
178 return; 189 return;
179 190
180 RenderProcessHost* process = RenderProcessHost::FromID(render_process_id_); 191 RenderProcessHost* process = RenderProcessHost::FromID(render_process_id_);
181 if (!process) 192 if (!process)
182 return; 193 return;
183 194
184 if (crx_file::id_util::IdIsValid(extension_id)) { 195 if (crx_file::id_util::IdIsValid(extension_id)) {
185 if (worker_thread_id != kNonWorkerThreadId) { 196 const bool is_service_worker_context =
197 worker_thread_id != kNonWorkerThreadId;
198 if (is_service_worker_context) {
199 DCHECK(listener_or_worker_scope_url.is_valid());
186 GetEventRouter()->RemoveServiceWorkerEventListener( 200 GetEventRouter()->RemoveServiceWorkerEventListener(
187 event_name, process, extension_id, worker_thread_id); 201 event_name, process, extension_id, listener_or_worker_scope_url,
202 worker_thread_id);
188 } else { 203 } else {
189 GetEventRouter()->RemoveEventListener(event_name, process, extension_id); 204 GetEventRouter()->RemoveEventListener(event_name, process, extension_id);
190 } 205 }
191 } else if (listener_url.is_valid()) { 206 } else if (listener_or_worker_scope_url.is_valid()) {
192 GetEventRouter()->RemoveEventListenerForURL(event_name, process, 207 GetEventRouter()->RemoveEventListenerForURL(event_name, process,
193 listener_url); 208 listener_or_worker_scope_url);
194 } else { 209 } else {
195 NOTREACHED() << "Tried to remove an event listener without a valid " 210 NOTREACHED() << "Tried to remove an event listener without a valid "
196 << "extension ID nor listener URL"; 211 << "extension ID nor listener URL";
197 } 212 }
198 } 213 }
199 214
200 void ExtensionMessageFilter::OnExtensionAddLazyListener( 215 void ExtensionMessageFilter::OnExtensionAddLazyListener(
201 const std::string& extension_id, 216 const std::string& extension_id,
217 const std::string& event_name) {
218 DCHECK_CURRENTLY_ON(BrowserThread::UI);
219 if (!browser_context_)
220 return;
221 GetEventRouter()->AddLazyEventListener(event_name, extension_id);
222 }
223
224 void ExtensionMessageFilter::OnExtensionAddLazyServiceWorkerListener(
225 const std::string& extension_id,
202 const std::string& event_name, 226 const std::string& event_name,
203 int worker_thread_id) { 227 const GURL& service_worker_scope) {
204 DCHECK_CURRENTLY_ON(BrowserThread::UI); 228 DCHECK_CURRENTLY_ON(BrowserThread::UI);
205 if (!browser_context_) 229 if (!browser_context_)
206 return; 230 return;
207 231
208 if (worker_thread_id == kNonWorkerThreadId) { 232 GetEventRouter()->AddLazyServiceWorkerEventListener(event_name, extension_id,
209 GetEventRouter()->AddLazyEventListener(event_name, extension_id); 233 service_worker_scope);
210 } else {
211 GetEventRouter()->AddLazyServiceWorkerEventListener(
212 event_name, extension_id, worker_thread_id);
213 }
214 } 234 }
215 235
216 void ExtensionMessageFilter::OnExtensionRemoveLazyListener( 236 void ExtensionMessageFilter::OnExtensionRemoveLazyListener(
217 const std::string& extension_id, 237 const std::string& extension_id,
218 const std::string& event_name, 238 const std::string& event_name) {
219 int worker_thread_id) {
220 DCHECK_CURRENTLY_ON(BrowserThread::UI); 239 DCHECK_CURRENTLY_ON(BrowserThread::UI);
221 if (!browser_context_) 240 if (!browser_context_)
222 return; 241 return;
223 242
224 if (worker_thread_id == kNonWorkerThreadId) { 243 GetEventRouter()->RemoveLazyEventListener(event_name, extension_id);
225 GetEventRouter()->RemoveLazyEventListener(event_name, extension_id); 244 }
226 } else { 245
227 GetEventRouter()->RemoveLazyServiceWorkerEventListener( 246 void ExtensionMessageFilter::OnExtensionRemoveLazyServiceWorkerListener(
228 event_name, extension_id, worker_thread_id); 247 const std::string& extension_id,
229 } 248 const std::string& event_name,
249 const GURL& worker_scope_url) {
250 DCHECK_CURRENTLY_ON(BrowserThread::UI);
251 if (!browser_context_)
252 return;
253
254 GetEventRouter()->RemoveLazyServiceWorkerEventListener(
255 event_name, extension_id, worker_scope_url);
230 } 256 }
231 257
232 void ExtensionMessageFilter::OnExtensionAddFilteredListener( 258 void ExtensionMessageFilter::OnExtensionAddFilteredListener(
233 const std::string& extension_id, 259 const std::string& extension_id,
234 const std::string& event_name, 260 const std::string& event_name,
235 const base::DictionaryValue& filter, 261 const base::DictionaryValue& filter,
236 bool lazy) { 262 bool lazy) {
237 DCHECK_CURRENTLY_ON(BrowserThread::UI); 263 DCHECK_CURRENTLY_ON(BrowserThread::UI);
238 if (!browser_context_) 264 if (!browser_context_)
239 return; 265 return;
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
339 // The extension has no background page, so there is nothing to wake. 365 // The extension has no background page, so there is nothing to wake.
340 SendWakeEventPageResponse(request_id, false); 366 SendWakeEventPageResponse(request_id, false);
341 } 367 }
342 368
343 void ExtensionMessageFilter::SendWakeEventPageResponse(int request_id, 369 void ExtensionMessageFilter::SendWakeEventPageResponse(int request_id,
344 bool success) { 370 bool success) {
345 Send(new ExtensionMsg_WakeEventPageResponse(request_id, success)); 371 Send(new ExtensionMsg_WakeEventPageResponse(request_id, success));
346 } 372 }
347 373
348 } // namespace extensions 374 } // namespace extensions
OLDNEW
« no previous file with comments | « extensions/browser/extension_message_filter.h ('k') | extensions/browser/lazy_background_task_queue.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698