Chromium Code Reviews| 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/api/push_messaging/push_messaging_api.h" | 5 #include "chrome/browser/extensions/api/push_messaging/push_messaging_api.h" |
| 6 | 6 |
| 7 #include <set> | 7 #include <set> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/lazy_instance.h" | 10 #include "base/lazy_instance.h" |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 21 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h" | 21 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h" |
| 22 #include "chrome/browser/signin/signin_manager_factory.h" | 22 #include "chrome/browser/signin/signin_manager_factory.h" |
| 23 #include "chrome/common/extensions/api/push_messaging.h" | 23 #include "chrome/common/extensions/api/push_messaging.h" |
| 24 #include "components/invalidation/invalidation_service.h" | 24 #include "components/invalidation/invalidation_service.h" |
| 25 #include "components/signin/core/browser/profile_oauth2_token_service.h" | 25 #include "components/signin/core/browser/profile_oauth2_token_service.h" |
| 26 #include "components/signin/core/browser/signin_manager.h" | 26 #include "components/signin/core/browser/signin_manager.h" |
| 27 #include "content/public/browser/browser_thread.h" | 27 #include "content/public/browser/browser_thread.h" |
| 28 #include "content/public/browser/notification_details.h" | 28 #include "content/public/browser/notification_details.h" |
| 29 #include "content/public/browser/notification_source.h" | 29 #include "content/public/browser/notification_source.h" |
| 30 #include "extensions/browser/event_router.h" | 30 #include "extensions/browser/event_router.h" |
| 31 #include "extensions/browser/extension_registry.h" | |
| 31 #include "extensions/browser/extension_system_provider.h" | 32 #include "extensions/browser/extension_system_provider.h" |
| 32 #include "extensions/browser/extensions_browser_client.h" | 33 #include "extensions/browser/extensions_browser_client.h" |
| 33 #include "extensions/common/extension.h" | 34 #include "extensions/common/extension.h" |
| 34 #include "extensions/common/permissions/api_permission.h" | 35 #include "extensions/common/permissions/api_permission.h" |
| 35 #include "google_apis/gaia/gaia_constants.h" | 36 #include "google_apis/gaia/gaia_constants.h" |
| 36 #include "google_apis/gaia/identity_provider.h" | 37 #include "google_apis/gaia/identity_provider.h" |
| 37 | 38 |
| 38 using content::BrowserThread; | 39 using content::BrowserThread; |
| 39 | 40 |
| 40 const char kChannelIdSeparator[] = "/"; | 41 const char kChannelIdSeparator[] = "/"; |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 68 glue::Message message; | 69 glue::Message message; |
| 69 message.subchannel_id = subchannel; | 70 message.subchannel_id = subchannel; |
| 70 message.payload = payload; | 71 message.payload = payload; |
| 71 | 72 |
| 72 DVLOG(2) << "PushMessagingEventRouter::OnMessage" | 73 DVLOG(2) << "PushMessagingEventRouter::OnMessage" |
| 73 << " payload = '" << payload | 74 << " payload = '" << payload |
| 74 << "' subchannel = '" << subchannel | 75 << "' subchannel = '" << subchannel |
| 75 << "' extension = '" << extension_id << "'"; | 76 << "' extension = '" << extension_id << "'"; |
| 76 | 77 |
| 77 scoped_ptr<base::ListValue> args(glue::OnMessage::Create(message)); | 78 scoped_ptr<base::ListValue> args(glue::OnMessage::Create(message)); |
| 78 scoped_ptr<extensions::Event> event( | 79 scoped_ptr<Event> event(new Event(glue::OnMessage::kEventName, args.Pass())); |
| 79 new extensions::Event(glue::OnMessage::kEventName, args.Pass())); | |
| 80 event->restrict_to_browser_context = profile_; | 80 event->restrict_to_browser_context = profile_; |
| 81 EventRouter::Get(profile_)->DispatchEventToExtension( | 81 EventRouter::Get(profile_)->DispatchEventToExtension( |
| 82 extension_id, event.Pass()); | 82 extension_id, event.Pass()); |
| 83 } | 83 } |
| 84 | 84 |
| 85 // GetChannelId class functions | 85 // GetChannelId class functions |
| 86 | 86 |
| 87 PushMessagingGetChannelIdFunction::PushMessagingGetChannelIdFunction() | 87 PushMessagingGetChannelIdFunction::PushMessagingGetChannelIdFunction() |
| 88 : OAuth2TokenService::Consumer("push_messaging"), | 88 : OAuth2TokenService::Consumer("push_messaging"), |
| 89 interactive_(false) {} | 89 interactive_(false) {} |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 280 return; | 280 return; |
| 281 } | 281 } |
| 282 default: | 282 default: |
| 283 // Return error to caller. | 283 // Return error to caller. |
| 284 ReportResult(std::string(), error_text); | 284 ReportResult(std::string(), error_text); |
| 285 return; | 285 return; |
| 286 } | 286 } |
| 287 } | 287 } |
| 288 | 288 |
| 289 PushMessagingAPI::PushMessagingAPI(content::BrowserContext* context) | 289 PushMessagingAPI::PushMessagingAPI(content::BrowserContext* context) |
| 290 : profile_(Profile::FromBrowserContext(context)) { | 290 : extension_registry_observer_(this), |
| 291 profile_(Profile::FromBrowserContext(context)) { | |
| 292 extension_registry_observer_.Add(ExtensionRegistry::Get(profile_)); | |
| 291 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_INSTALLED, | 293 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_INSTALLED, |
| 292 content::Source<Profile>(profile_->GetOriginalProfile())); | 294 content::Source<Profile>(profile_->GetOriginalProfile())); |
| 293 registrar_.Add(this, | |
| 294 chrome::NOTIFICATION_EXTENSION_LOADED_DEPRECATED, | |
| 295 content::Source<Profile>(profile_->GetOriginalProfile())); | |
| 296 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED_DEPRECATED, | |
| 297 content::Source<Profile>(profile_->GetOriginalProfile())); | |
| 298 } | 295 } |
| 299 | 296 |
| 300 PushMessagingAPI::~PushMessagingAPI() { | 297 PushMessagingAPI::~PushMessagingAPI() { |
| 301 } | 298 } |
| 302 | 299 |
| 303 // static | 300 // static |
| 304 PushMessagingAPI* PushMessagingAPI::Get(content::BrowserContext* context) { | 301 PushMessagingAPI* PushMessagingAPI::Get(content::BrowserContext* context) { |
| 305 return BrowserContextKeyedAPIFactory<PushMessagingAPI>::Get(context); | 302 return BrowserContextKeyedAPIFactory<PushMessagingAPI>::Get(context); |
| 306 } | 303 } |
| 307 | 304 |
| 308 void PushMessagingAPI::Shutdown() { | 305 void PushMessagingAPI::Shutdown() { |
| 309 event_router_.reset(); | 306 event_router_.reset(); |
| 310 handler_.reset(); | 307 handler_.reset(); |
| 311 } | 308 } |
| 312 | 309 |
| 313 static base::LazyInstance<BrowserContextKeyedAPIFactory<PushMessagingAPI> > | 310 static base::LazyInstance<BrowserContextKeyedAPIFactory<PushMessagingAPI> > |
| 314 g_factory = LAZY_INSTANCE_INITIALIZER; | 311 g_factory = LAZY_INSTANCE_INITIALIZER; |
| 315 | 312 |
| 316 // static | 313 // static |
| 317 BrowserContextKeyedAPIFactory<PushMessagingAPI>* | 314 BrowserContextKeyedAPIFactory<PushMessagingAPI>* |
| 318 PushMessagingAPI::GetFactoryInstance() { | 315 PushMessagingAPI::GetFactoryInstance() { |
| 319 return g_factory.Pointer(); | 316 return g_factory.Pointer(); |
| 320 } | 317 } |
| 321 | 318 |
| 319 void PushMessagingAPI::OnExtensionLoaded( | |
| 320 content::BrowserContext* browser_context, | |
| 321 const Extension* extension) { | |
| 322 invalidation::InvalidationService* invalidation_service = | |
| 323 invalidation::InvalidationServiceFactory::GetForProfile(profile_); | |
| 324 if (!invalidation_service) | |
| 325 return; | |
| 326 | |
| 327 if (!event_router_) | |
| 328 event_router_.reset(new PushMessagingEventRouter(profile_)); | |
| 329 if (!handler_) { | |
| 330 handler_.reset(new PushMessagingInvalidationHandler(invalidation_service, | |
| 331 event_router_.get())); | |
| 332 } | |
|
not at google - send to devlin
2014/05/12 17:53:27
can you pull this initialization code into a funct
limasdf
2014/05/12 23:20:16
Done.
| |
| 333 if (extension->HasAPIPermission(APIPermission::kPushMessaging)) { | |
| 334 handler_->RegisterExtension(extension->id()); | |
| 335 } | |
| 336 } | |
| 337 | |
| 338 void PushMessagingAPI::OnExtensionUnloaded( | |
| 339 content::BrowserContext* browser_context, | |
| 340 const Extension* extension, | |
| 341 UnloadedExtensionInfo::Reason reason) { | |
| 342 invalidation::InvalidationService* invalidation_service = | |
| 343 invalidation::InvalidationServiceFactory::GetForProfile(profile_); | |
| 344 if (!invalidation_service) | |
| 345 return; | |
| 346 | |
| 347 if (!event_router_) | |
| 348 event_router_.reset(new PushMessagingEventRouter(profile_)); | |
| 349 if (!handler_) { | |
| 350 handler_.reset(new PushMessagingInvalidationHandler(invalidation_service, | |
| 351 event_router_.get())); | |
| 352 } | |
| 353 if (extension->HasAPIPermission(APIPermission::kPushMessaging)) { | |
| 354 handler_->UnregisterExtension(extension->id()); | |
| 355 } | |
| 356 } | |
| 357 | |
| 322 void PushMessagingAPI::Observe(int type, | 358 void PushMessagingAPI::Observe(int type, |
| 323 const content::NotificationSource& source, | 359 const content::NotificationSource& source, |
| 324 const content::NotificationDetails& details) { | 360 const content::NotificationDetails& details) { |
| 361 DCHECK_EQ(type, chrome::NOTIFICATION_EXTENSION_INSTALLED); | |
| 362 | |
| 325 invalidation::InvalidationService* invalidation_service = | 363 invalidation::InvalidationService* invalidation_service = |
| 326 invalidation::InvalidationServiceFactory::GetForProfile(profile_); | 364 invalidation::InvalidationServiceFactory::GetForProfile(profile_); |
| 327 if (!invalidation_service) | 365 if (!invalidation_service) |
| 328 return; | 366 return; |
| 329 | 367 |
| 330 if (!event_router_) | 368 if (!event_router_) |
| 331 event_router_.reset(new PushMessagingEventRouter(profile_)); | 369 event_router_.reset(new PushMessagingEventRouter(profile_)); |
| 332 if (!handler_) { | 370 if (!handler_) { |
| 333 handler_.reset(new PushMessagingInvalidationHandler( | 371 handler_.reset(new PushMessagingInvalidationHandler( |
| 334 invalidation_service, event_router_.get())); | 372 invalidation_service, event_router_.get())); |
| 335 } | 373 } |
| 336 switch (type) { | 374 |
| 337 case chrome::NOTIFICATION_EXTENSION_INSTALLED: { | 375 const Extension* extension = |
| 338 const Extension* extension = | 376 content::Details<const InstalledExtensionInfo>(details)->extension; |
| 339 content::Details<const InstalledExtensionInfo>(details)->extension; | 377 if (extension->HasAPIPermission(APIPermission::kPushMessaging)) { |
| 340 if (extension->HasAPIPermission(APIPermission::kPushMessaging)) { | 378 handler_->SuppressInitialInvalidationsForExtension(extension->id()); |
| 341 handler_->SuppressInitialInvalidationsForExtension(extension->id()); | |
| 342 } | |
| 343 break; | |
| 344 } | |
| 345 case chrome::NOTIFICATION_EXTENSION_LOADED_DEPRECATED: { | |
| 346 const Extension* extension = content::Details<Extension>(details).ptr(); | |
| 347 if (extension->HasAPIPermission(APIPermission::kPushMessaging)) { | |
| 348 handler_->RegisterExtension(extension->id()); | |
| 349 } | |
| 350 break; | |
| 351 } | |
| 352 case chrome::NOTIFICATION_EXTENSION_UNLOADED_DEPRECATED: { | |
| 353 const Extension* extension = | |
| 354 content::Details<UnloadedExtensionInfo>(details)->extension; | |
| 355 if (extension->HasAPIPermission(APIPermission::kPushMessaging)) { | |
| 356 handler_->UnregisterExtension(extension->id()); | |
| 357 } | |
| 358 break; | |
| 359 } | |
| 360 default: | |
| 361 NOTREACHED(); | |
| 362 } | 379 } |
| 363 } | 380 } |
| 364 | 381 |
| 365 void PushMessagingAPI::SetMapperForTest( | 382 void PushMessagingAPI::SetMapperForTest( |
| 366 scoped_ptr<PushMessagingInvalidationMapper> mapper) { | 383 scoped_ptr<PushMessagingInvalidationMapper> mapper) { |
| 367 handler_ = mapper.Pass(); | 384 handler_ = mapper.Pass(); |
| 368 } | 385 } |
| 369 | 386 |
| 370 template <> | 387 template <> |
| 371 void | 388 void |
| 372 BrowserContextKeyedAPIFactory<PushMessagingAPI>::DeclareFactoryDependencies() { | 389 BrowserContextKeyedAPIFactory<PushMessagingAPI>::DeclareFactoryDependencies() { |
| 373 DependsOn(ExtensionsBrowserClient::Get()->GetExtensionSystemFactory()); | 390 DependsOn(ExtensionsBrowserClient::Get()->GetExtensionSystemFactory()); |
| 374 DependsOn(invalidation::InvalidationServiceFactory::GetInstance()); | 391 DependsOn(invalidation::InvalidationServiceFactory::GetInstance()); |
| 375 } | 392 } |
| 376 | 393 |
| 377 } // namespace extensions | 394 } // namespace extensions |
| OLD | NEW |