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

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

Issue 2924213002: Draft: Dispatching extension events to stopped extension SW.
Patch Set: rebase @tott 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 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;
160 if (event_name == "tabs.onUpdated") {
161 LOG(ERROR) << "OnExtensionAddListener, process: " << process
162 << ", worker_thread_id: " << worker_thread_id;
163 }
154 164
165 const bool is_service_worker_context = worker_thread_id != kNonWorkerThreadId;
155 EventRouter* event_router = GetEventRouter(); 166 EventRouter* event_router = GetEventRouter();
156 if (crx_file::id_util::IdIsValid(extension_id)) { 167 if (is_service_worker_context) {
157 if (worker_thread_id != kNonWorkerThreadId) { 168 DCHECK(listener_or_worker_scope_url.is_valid());
158 event_router->AddServiceWorkerEventListener( 169 event_router->AddServiceWorkerEventListener(
159 event_name, process, extension_id, worker_thread_id); 170 event_name, process, extension_id, listener_or_worker_scope_url,
160 } else { 171 worker_thread_id);
161 event_router->AddEventListener(event_name, process, extension_id); 172 } else if (crx_file::id_util::IdIsValid(extension_id)) {
162 } 173 event_router->AddEventListener(event_name, process, extension_id);
163 } else if (listener_url.is_valid()) { 174 } else if (listener_or_worker_scope_url.is_valid()) {
164 event_router->AddEventListenerForURL(event_name, process, listener_url); 175 event_router->AddEventListenerForURL(event_name, process,
176 listener_or_worker_scope_url);
165 } else { 177 } else {
166 NOTREACHED() << "Tried to add an event listener without a valid " 178 NOTREACHED() << "Tried to add an event listener without a valid "
167 << "extension ID nor listener URL"; 179 << "extension ID nor listener URL";
168 } 180 }
169 } 181 }
170 182
171 void ExtensionMessageFilter::OnExtensionRemoveListener( 183 void ExtensionMessageFilter::OnExtensionRemoveListener(
172 const std::string& extension_id, 184 const std::string& extension_id,
173 const GURL& listener_url, 185 const GURL& listener_or_worker_scope_url,
174 const std::string& event_name, 186 const std::string& event_name,
175 int worker_thread_id) { 187 int worker_thread_id) {
176 DCHECK_CURRENTLY_ON(BrowserThread::UI); 188 DCHECK_CURRENTLY_ON(BrowserThread::UI);
177 if (!browser_context_) 189 if (!browser_context_)
178 return; 190 return;
179 191
180 RenderProcessHost* process = RenderProcessHost::FromID(render_process_id_); 192 RenderProcessHost* process = RenderProcessHost::FromID(render_process_id_);
181 if (!process) 193 if (!process)
182 return; 194 return;
195 if (event_name == "tabs.onUpdated") {
196 LOG(ERROR) << "OnExtensionRemoveListener, process: " << process
197 << ", worker_thread_id: " << worker_thread_id;
198 }
183 199
184 if (crx_file::id_util::IdIsValid(extension_id)) { 200 const bool is_service_worker_context = worker_thread_id != kNonWorkerThreadId;
185 if (worker_thread_id != kNonWorkerThreadId) { 201 if (is_service_worker_context) {
186 GetEventRouter()->RemoveServiceWorkerEventListener( 202 DCHECK(listener_or_worker_scope_url.is_valid());
187 event_name, process, extension_id, worker_thread_id); 203 GetEventRouter()->RemoveServiceWorkerEventListener(
188 } else { 204 event_name, process, extension_id, listener_or_worker_scope_url,
189 GetEventRouter()->RemoveEventListener(event_name, process, extension_id); 205 worker_thread_id);
190 } 206 } else if (crx_file::id_util::IdIsValid(extension_id)) {
191 } else if (listener_url.is_valid()) { 207 GetEventRouter()->RemoveEventListener(event_name, process, extension_id);
208 } else if (listener_or_worker_scope_url.is_valid()) {
192 GetEventRouter()->RemoveEventListenerForURL(event_name, process, 209 GetEventRouter()->RemoveEventListenerForURL(event_name, process,
193 listener_url); 210 listener_or_worker_scope_url);
194 } else { 211 } else {
195 NOTREACHED() << "Tried to remove an event listener without a valid " 212 NOTREACHED() << "Tried to remove an event listener without a valid "
196 << "extension ID nor listener URL"; 213 << "extension ID nor listener URL";
197 } 214 }
198 } 215 }
199 216
200 void ExtensionMessageFilter::OnExtensionAddLazyListener( 217 void ExtensionMessageFilter::OnExtensionAddLazyListener(
201 const std::string& extension_id, 218 const std::string& extension_id,
219 const std::string& event_name) {
220 DCHECK_CURRENTLY_ON(BrowserThread::UI);
221 if (!browser_context_)
222 return;
223 if (event_name == "tabs.onUpdated")
224 LOG(ERROR) << "OnExtensionAddLazyListener";
225
226 GetEventRouter()->AddLazyEventListener(event_name, extension_id);
227 }
228
229 void ExtensionMessageFilter::OnExtensionAddLazyServiceWorkerListener(
230 const std::string& extension_id,
202 const std::string& event_name, 231 const std::string& event_name,
203 int worker_thread_id) { 232 const GURL& service_worker_scope) {
204 DCHECK_CURRENTLY_ON(BrowserThread::UI); 233 DCHECK_CURRENTLY_ON(BrowserThread::UI);
205 if (!browser_context_) 234 if (!browser_context_)
206 return; 235 return;
207 236
208 if (worker_thread_id == kNonWorkerThreadId) { 237 if (event_name == "tabs.onUpdated")
209 GetEventRouter()->AddLazyEventListener(event_name, extension_id); 238 LOG(ERROR) << "OnExtensionAddLazyServiceWorkerListener";
210 } else { 239
211 GetEventRouter()->AddLazyServiceWorkerEventListener( 240 GetEventRouter()->AddLazyServiceWorkerEventListener(event_name, extension_id,
212 event_name, extension_id, worker_thread_id); 241 service_worker_scope);
213 }
214 } 242 }
215 243
216 void ExtensionMessageFilter::OnExtensionRemoveLazyListener( 244 void ExtensionMessageFilter::OnExtensionRemoveLazyListener(
217 const std::string& extension_id, 245 const std::string& extension_id,
246 const std::string& event_name) {
247 DCHECK_CURRENTLY_ON(BrowserThread::UI);
248 if (!browser_context_)
249 return;
250 if (event_name == "tabs.onUpdated")
251 LOG(ERROR) << "OnExtensionRemoveLazyListener";
252
253 GetEventRouter()->RemoveLazyEventListener(event_name, extension_id);
254 }
255
256 void ExtensionMessageFilter::OnExtensionRemoveLazyServiceWorkerListener(
257 const std::string& extension_id,
218 const std::string& event_name, 258 const std::string& event_name,
219 int worker_thread_id) { 259 const GURL& worker_scope_url) {
220 DCHECK_CURRENTLY_ON(BrowserThread::UI); 260 DCHECK_CURRENTLY_ON(BrowserThread::UI);
221 if (!browser_context_) 261 if (!browser_context_)
222 return; 262 return;
223 263
224 if (worker_thread_id == kNonWorkerThreadId) { 264 if (event_name == "tabs.onUpdated")
225 GetEventRouter()->RemoveLazyEventListener(event_name, extension_id); 265 LOG(ERROR) << "OnExtensionRemoveLazyServiceWorkerListener";
226 } else { 266
227 GetEventRouter()->RemoveLazyServiceWorkerEventListener( 267 GetEventRouter()->RemoveLazyServiceWorkerEventListener(
228 event_name, extension_id, worker_thread_id); 268 event_name, extension_id, worker_scope_url);
229 }
230 } 269 }
231 270
232 void ExtensionMessageFilter::OnExtensionAddFilteredListener( 271 void ExtensionMessageFilter::OnExtensionAddFilteredListener(
233 const std::string& extension_id, 272 const std::string& extension_id,
234 const std::string& event_name, 273 const std::string& event_name,
235 const base::DictionaryValue& filter, 274 const base::DictionaryValue& filter,
236 bool lazy) { 275 bool lazy) {
237 DCHECK_CURRENTLY_ON(BrowserThread::UI); 276 DCHECK_CURRENTLY_ON(BrowserThread::UI);
238 if (!browser_context_) 277 if (!browser_context_)
239 return; 278 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. 378 // The extension has no background page, so there is nothing to wake.
340 SendWakeEventPageResponse(request_id, false); 379 SendWakeEventPageResponse(request_id, false);
341 } 380 }
342 381
343 void ExtensionMessageFilter::SendWakeEventPageResponse(int request_id, 382 void ExtensionMessageFilter::SendWakeEventPageResponse(int request_id,
344 bool success) { 383 bool success) {
345 Send(new ExtensionMsg_WakeEventPageResponse(request_id, success)); 384 Send(new ExtensionMsg_WakeEventPageResponse(request_id, success));
346 } 385 }
347 386
348 } // namespace extensions 387 } // 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