| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chrome/browser/extensions/event_router.h" | 5 #include "chrome/browser/extensions/event_router.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 229 SystemInfoEventRouter::GetInstance()->RemoveEventListener(event_name); | 229 SystemInfoEventRouter::GetInstance()->RemoveEventListener(event_name); |
| 230 } | 230 } |
| 231 | 231 |
| 232 void EventRouter::AddLazyEventListener(const std::string& event_name, | 232 void EventRouter::AddLazyEventListener(const std::string& event_name, |
| 233 const std::string& extension_id) { | 233 const std::string& extension_id) { |
| 234 scoped_ptr<EventListener> listener(new EventListener( | 234 scoped_ptr<EventListener> listener(new EventListener( |
| 235 event_name, extension_id, NULL, scoped_ptr<DictionaryValue>())); | 235 event_name, extension_id, NULL, scoped_ptr<DictionaryValue>())); |
| 236 bool is_new = listeners_.AddListener(listener.Pass()); | 236 bool is_new = listeners_.AddListener(listener.Pass()); |
| 237 | 237 |
| 238 if (is_new) { | 238 if (is_new) { |
| 239 ExtensionPrefs* prefs = | 239 ExtensionPrefs* prefs = extensions::ExtensionSystem::Get(profile_)-> |
| 240 profile_->GetExtensionService()->extension_prefs(); | 240 extension_service()->extension_prefs(); |
| 241 std::set<std::string> events = prefs->GetRegisteredEvents(extension_id); | 241 std::set<std::string> events = prefs->GetRegisteredEvents(extension_id); |
| 242 bool prefs_is_new = events.insert(event_name).second; | 242 bool prefs_is_new = events.insert(event_name).second; |
| 243 if (prefs_is_new) | 243 if (prefs_is_new) |
| 244 prefs->SetRegisteredEvents(extension_id, events); | 244 prefs->SetRegisteredEvents(extension_id, events); |
| 245 } | 245 } |
| 246 } | 246 } |
| 247 | 247 |
| 248 void EventRouter::RemoveLazyEventListener(const std::string& event_name, | 248 void EventRouter::RemoveLazyEventListener(const std::string& event_name, |
| 249 const std::string& extension_id) { | 249 const std::string& extension_id) { |
| 250 EventListener listener(event_name, extension_id, NULL, | 250 EventListener listener(event_name, extension_id, NULL, |
| 251 scoped_ptr<DictionaryValue>()); | 251 scoped_ptr<DictionaryValue>()); |
| 252 bool did_exist = listeners_.RemoveListener(&listener); | 252 bool did_exist = listeners_.RemoveListener(&listener); |
| 253 | 253 |
| 254 if (did_exist) { | 254 if (did_exist) { |
| 255 ExtensionPrefs* prefs = | 255 ExtensionPrefs* prefs = extensions::ExtensionSystem::Get(profile_)-> |
| 256 profile_->GetExtensionService()->extension_prefs(); | 256 extension_service()->extension_prefs(); |
| 257 std::set<std::string> events = prefs->GetRegisteredEvents(extension_id); | 257 std::set<std::string> events = prefs->GetRegisteredEvents(extension_id); |
| 258 bool prefs_did_exist = events.erase(event_name) > 0; | 258 bool prefs_did_exist = events.erase(event_name) > 0; |
| 259 DCHECK(prefs_did_exist); | 259 DCHECK(prefs_did_exist); |
| 260 prefs->SetRegisteredEvents(extension_id, events); | 260 prefs->SetRegisteredEvents(extension_id, events); |
| 261 } | 261 } |
| 262 } | 262 } |
| 263 | 263 |
| 264 void EventRouter::AddFilteredEventListener(const std::string& event_name, | 264 void EventRouter::AddFilteredEventListener(const std::string& event_name, |
| 265 content::RenderProcessHost* process, | 265 content::RenderProcessHost* process, |
| 266 const std::string& extension_id, | 266 const std::string& extension_id, |
| 267 const base::DictionaryValue& filter, | 267 const base::DictionaryValue& filter, |
| 268 bool add_lazy_listener) { | 268 bool add_lazy_listener) { |
| 269 listeners_.AddListener(scoped_ptr<EventListener>(new EventListener( | 269 listeners_.AddListener(scoped_ptr<EventListener>(new EventListener( |
| 270 event_name, extension_id, process, | 270 event_name, extension_id, process, |
| 271 scoped_ptr<DictionaryValue>(filter.DeepCopy())))); | 271 scoped_ptr<DictionaryValue>(filter.DeepCopy())))); |
| 272 | 272 |
| 273 if (add_lazy_listener) { | 273 if (add_lazy_listener) { |
| 274 bool added = listeners_.AddListener(scoped_ptr<EventListener>( | 274 bool added = listeners_.AddListener(scoped_ptr<EventListener>( |
| 275 new EventListener(event_name, extension_id, NULL, | 275 new EventListener(event_name, extension_id, NULL, |
| 276 scoped_ptr<DictionaryValue>(filter.DeepCopy())))); | 276 scoped_ptr<DictionaryValue>(filter.DeepCopy())))); |
| 277 | 277 |
| 278 if (added) { | 278 if (added) { |
| 279 ExtensionPrefs* prefs = | 279 ExtensionPrefs* prefs = extensions::ExtensionSystem::Get(profile_)-> |
| 280 profile_->GetExtensionService()->extension_prefs(); | 280 extension_service()->extension_prefs(); |
| 281 prefs->AddFilterToEvent(event_name, extension_id, &filter); | 281 prefs->AddFilterToEvent(event_name, extension_id, &filter); |
| 282 } | 282 } |
| 283 } | 283 } |
| 284 } | 284 } |
| 285 | 285 |
| 286 void EventRouter::RemoveFilteredEventListener( | 286 void EventRouter::RemoveFilteredEventListener( |
| 287 const std::string& event_name, | 287 const std::string& event_name, |
| 288 content::RenderProcessHost* process, | 288 content::RenderProcessHost* process, |
| 289 const std::string& extension_id, | 289 const std::string& extension_id, |
| 290 const base::DictionaryValue& filter, | 290 const base::DictionaryValue& filter, |
| 291 bool remove_lazy_listener) { | 291 bool remove_lazy_listener) { |
| 292 EventListener listener(event_name, extension_id, process, | 292 EventListener listener(event_name, extension_id, process, |
| 293 scoped_ptr<DictionaryValue>(filter.DeepCopy())); | 293 scoped_ptr<DictionaryValue>(filter.DeepCopy())); |
| 294 | 294 |
| 295 listeners_.RemoveListener(&listener); | 295 listeners_.RemoveListener(&listener); |
| 296 | 296 |
| 297 if (remove_lazy_listener) { | 297 if (remove_lazy_listener) { |
| 298 listener.process = NULL; | 298 listener.process = NULL; |
| 299 bool removed = listeners_.RemoveListener(&listener); | 299 bool removed = listeners_.RemoveListener(&listener); |
| 300 | 300 |
| 301 if (removed) { | 301 if (removed) { |
| 302 ExtensionPrefs* prefs = | 302 ExtensionPrefs* prefs = extensions::ExtensionSystem::Get(profile_)-> |
| 303 profile_->GetExtensionService()->extension_prefs(); | 303 extension_service()->extension_prefs(); |
| 304 prefs->RemoveFilterFromEvent(event_name, extension_id, &filter); | 304 prefs->RemoveFilterFromEvent(event_name, extension_id, &filter); |
| 305 } | 305 } |
| 306 } | 306 } |
| 307 } | 307 } |
| 308 | 308 |
| 309 bool EventRouter::HasEventListener(const std::string& event_name) { | 309 bool EventRouter::HasEventListener(const std::string& event_name) { |
| 310 return listeners_.HasListenerForEvent(event_name); | 310 return listeners_.HasListenerForEvent(event_name); |
| 311 } | 311 } |
| 312 | 312 |
| 313 bool EventRouter::ExtensionHasEventListener(const std::string& extension_id, | 313 bool EventRouter::ExtensionHasEventListener(const std::string& extension_id, |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 447 } | 447 } |
| 448 } | 448 } |
| 449 } | 449 } |
| 450 } | 450 } |
| 451 } | 451 } |
| 452 | 452 |
| 453 void EventRouter::DispatchLazyEvent( | 453 void EventRouter::DispatchLazyEvent( |
| 454 const std::string& extension_id, | 454 const std::string& extension_id, |
| 455 const linked_ptr<Event>& event, | 455 const linked_ptr<Event>& event, |
| 456 std::set<EventDispatchIdentifier>* already_dispatched) { | 456 std::set<EventDispatchIdentifier>* already_dispatched) { |
| 457 ExtensionService* service = profile_->GetExtensionService(); | 457 ExtensionService* service = |
| 458 extensions::ExtensionSystem::Get(profile_)->extension_service(); |
| 458 // Check both the original and the incognito profile to see if we | 459 // Check both the original and the incognito profile to see if we |
| 459 // should load a lazy bg page to handle the event. The latter case | 460 // should load a lazy bg page to handle the event. The latter case |
| 460 // occurs in the case of split-mode extensions. | 461 // occurs in the case of split-mode extensions. |
| 461 const Extension* extension = service->extensions()->GetByID(extension_id); | 462 const Extension* extension = service->extensions()->GetByID(extension_id); |
| 462 if (extension) { | 463 if (extension) { |
| 463 if (MaybeLoadLazyBackgroundPageToDispatchEvent( | 464 if (MaybeLoadLazyBackgroundPageToDispatchEvent( |
| 464 profile_, extension, event)) { | 465 profile_, extension, event)) { |
| 465 already_dispatched->insert(std::make_pair(profile_, extension_id)); | 466 already_dispatched->insert(std::make_pair(profile_, extension_id)); |
| 466 } | 467 } |
| 467 | 468 |
| 468 if (profile_->HasOffTheRecordProfile() && | 469 if (profile_->HasOffTheRecordProfile() && |
| 469 extension->incognito_split_mode()) { | 470 extension->incognito_split_mode()) { |
| 470 if (MaybeLoadLazyBackgroundPageToDispatchEvent( | 471 if (MaybeLoadLazyBackgroundPageToDispatchEvent( |
| 471 profile_->GetOffTheRecordProfile(), extension, event)) { | 472 profile_->GetOffTheRecordProfile(), extension, event)) { |
| 472 already_dispatched->insert( | 473 already_dispatched->insert( |
| 473 std::make_pair(profile_->GetOffTheRecordProfile(), extension_id)); | 474 std::make_pair(profile_->GetOffTheRecordProfile(), extension_id)); |
| 474 } | 475 } |
| 475 } | 476 } |
| 476 } | 477 } |
| 477 } | 478 } |
| 478 | 479 |
| 479 void EventRouter::DispatchEventToProcess(const std::string& extension_id, | 480 void EventRouter::DispatchEventToProcess(const std::string& extension_id, |
| 480 content::RenderProcessHost* process, | 481 content::RenderProcessHost* process, |
| 481 const linked_ptr<Event>& event) { | 482 const linked_ptr<Event>& event) { |
| 482 ExtensionService* service = profile_->GetExtensionService(); | 483 ExtensionService* service = |
| 484 extensions::ExtensionSystem::Get(profile_)->extension_service(); |
| 483 const Extension* extension = service->extensions()->GetByID(extension_id); | 485 const Extension* extension = service->extensions()->GetByID(extension_id); |
| 484 | 486 |
| 485 // The extension could have been removed, but we do not unregister it until | 487 // The extension could have been removed, but we do not unregister it until |
| 486 // the extension process is unloaded. | 488 // the extension process is unloaded. |
| 487 if (!extension) | 489 if (!extension) |
| 488 return; | 490 return; |
| 489 | 491 |
| 490 Profile* listener_profile = Profile::FromBrowserContext( | 492 Profile* listener_profile = Profile::FromBrowserContext( |
| 491 process->GetBrowserContext()); | 493 process->GetBrowserContext()); |
| 492 ProcessMap* process_map = | 494 ProcessMap* process_map = extensions::ExtensionSystem::Get(listener_profile)-> |
| 493 listener_profile->GetExtensionService()->process_map(); | 495 extension_service()->process_map(); |
| 494 // If the event is privileged, only send to extension processes. Otherwise, | 496 // If the event is privileged, only send to extension processes. Otherwise, |
| 495 // it's OK to send to normal renderers (e.g., for content scripts). | 497 // it's OK to send to normal renderers (e.g., for content scripts). |
| 496 if (ExtensionAPI::GetSharedInstance()->IsPrivileged(event->event_name) && | 498 if (ExtensionAPI::GetSharedInstance()->IsPrivileged(event->event_name) && |
| 497 !process_map->Contains(extension->id(), process->GetID())) { | 499 !process_map->Contains(extension->id(), process->GetID())) { |
| 498 return; | 500 return; |
| 499 } | 501 } |
| 500 | 502 |
| 501 ListValue* event_args = NULL; | 503 ListValue* event_args = NULL; |
| 502 if (!CanDispatchEventToProfile(listener_profile, extension, | 504 if (!CanDispatchEventToProfile(listener_profile, extension, |
| 503 event, &event_args)) { | 505 event, &event_args)) { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 516 const linked_ptr<Event>& event, | 518 const linked_ptr<Event>& event, |
| 517 ListValue** event_args) { | 519 ListValue** event_args) { |
| 518 if (event_args) | 520 if (event_args) |
| 519 *event_args = event->event_args.get(); | 521 *event_args = event->event_args.get(); |
| 520 | 522 |
| 521 // Is this event from a different profile than the renderer (ie, an | 523 // Is this event from a different profile than the renderer (ie, an |
| 522 // incognito tab event sent to a normal process, or vice versa). | 524 // incognito tab event sent to a normal process, or vice versa). |
| 523 bool cross_incognito = | 525 bool cross_incognito = |
| 524 event->restrict_to_profile && profile != event->restrict_to_profile; | 526 event->restrict_to_profile && profile != event->restrict_to_profile; |
| 525 if (cross_incognito && | 527 if (cross_incognito && |
| 526 !profile->GetExtensionService()->CanCrossIncognito(extension)) { | 528 !extensions::ExtensionSystem::Get(profile)->extension_service()-> |
| 529 CanCrossIncognito(extension)) { |
| 527 if (!event->cross_incognito_args.get()) | 530 if (!event->cross_incognito_args.get()) |
| 528 return false; | 531 return false; |
| 529 // Send the event with different arguments to extensions that can't | 532 // Send the event with different arguments to extensions that can't |
| 530 // cross incognito. | 533 // cross incognito. |
| 531 if (event_args) | 534 if (event_args) |
| 532 *event_args = event->cross_incognito_args.get(); | 535 *event_args = event->cross_incognito_args.get(); |
| 533 } | 536 } |
| 534 | 537 |
| 535 return true; | 538 return true; |
| 536 } | 539 } |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 619 LazyBackgroundTaskQueue* queue = | 622 LazyBackgroundTaskQueue* queue = |
| 620 ExtensionSystem::Get(profile_)->lazy_background_task_queue(); | 623 ExtensionSystem::Get(profile_)->lazy_background_task_queue(); |
| 621 queue->AddPendingTask(profile_, extension->id(), | 624 queue->AddPendingTask(profile_, extension->id(), |
| 622 base::Bind(&DoNothing)); | 625 base::Bind(&DoNothing)); |
| 623 } | 626 } |
| 624 } | 627 } |
| 625 case chrome::NOTIFICATION_EXTENSION_LOADED: { | 628 case chrome::NOTIFICATION_EXTENSION_LOADED: { |
| 626 // Add all registered lazy listeners to our cache. | 629 // Add all registered lazy listeners to our cache. |
| 627 const Extension* extension = | 630 const Extension* extension = |
| 628 content::Details<const Extension>(details).ptr(); | 631 content::Details<const Extension>(details).ptr(); |
| 629 ExtensionPrefs* prefs = | 632 ExtensionPrefs* prefs = extensions::ExtensionSystem::Get(profile_)-> |
| 630 profile_->GetExtensionService()->extension_prefs(); | 633 extension_service()->extension_prefs(); |
| 631 std::set<std::string> registered_events = | 634 std::set<std::string> registered_events = |
| 632 prefs->GetRegisteredEvents(extension->id()); | 635 prefs->GetRegisteredEvents(extension->id()); |
| 633 listeners_.LoadUnfilteredLazyListeners(extension->id(), | 636 listeners_.LoadUnfilteredLazyListeners(extension->id(), |
| 634 registered_events); | 637 registered_events); |
| 635 const DictionaryValue* filtered_events = | 638 const DictionaryValue* filtered_events = |
| 636 prefs->GetFilteredEvents(extension->id()); | 639 prefs->GetFilteredEvents(extension->id()); |
| 637 if (filtered_events) | 640 if (filtered_events) |
| 638 listeners_.LoadFilteredLazyListeners(extension->id(), *filtered_events); | 641 listeners_.LoadFilteredLazyListeners(extension->id(), *filtered_events); |
| 639 | 642 |
| 640 if (dispatch_chrome_updated_event_) { | 643 if (dispatch_chrome_updated_event_) { |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 705 info(info) {} | 708 info(info) {} |
| 706 | 709 |
| 707 Event::~Event() {} | 710 Event::~Event() {} |
| 708 | 711 |
| 709 EventListenerInfo::EventListenerInfo(const std::string& event_name, | 712 EventListenerInfo::EventListenerInfo(const std::string& event_name, |
| 710 const std::string& extension_id) | 713 const std::string& extension_id) |
| 711 : event_name(event_name), | 714 : event_name(event_name), |
| 712 extension_id(extension_id) {} | 715 extension_id(extension_id) {} |
| 713 | 716 |
| 714 } // namespace extensions | 717 } // namespace extensions |
| OLD | NEW |