Chromium Code Reviews| Index: chrome/browser/ui/intents/web_intent_picker_controller.cc |
| diff --git a/chrome/browser/ui/intents/web_intent_picker_controller.cc b/chrome/browser/ui/intents/web_intent_picker_controller.cc |
| index 1e753cadc23babde67b4b7c46e228b8c5429d844..93c7fe8b5902903fd53fd91b047cbe6a1d5e54be 100644 |
| --- a/chrome/browser/ui/intents/web_intent_picker_controller.cc |
| +++ b/chrome/browser/ui/intents/web_intent_picker_controller.cc |
| @@ -135,6 +135,48 @@ class SourceWindowObserver : content::WebContentsObserver { |
| base::WeakPtr<WebIntentPickerController> controller_; |
| }; |
| +// A WebIntentsDispatcher wrapper that deletes a itself, |
| +// and a service once a response is received. |
|
Greg Billock
2012/10/10 17:12:51
I think we can just do this with a closure using R
Steve McKay
2012/10/10 23:12:57
Done.
|
| +class DeletingDispatcherWrapper : public content::WebIntentsDispatcher { |
| + public: |
| + explicit DeletingDispatcherWrapper( |
| + web_intents::IntentServiceHost* service, |
| + content::WebIntentsDispatcher* delegate) |
| + : service_(service), |
| + delegate_(delegate) {} |
| + |
| + virtual const webkit_glue::WebIntentData& GetIntent() OVERRIDE { |
| + return delegate_->GetIntent(); |
| + } |
| + |
| + virtual void DispatchIntent(content::WebContents* web_contents) OVERRIDE { |
| + NOTREACHED(); |
| + } |
| + virtual void ResetDispatch() OVERRIDE { |
| + NOTREACHED(); |
| + } |
| + |
| + virtual void SendReplyMessage( |
| + webkit_glue::WebIntentReplyType reply_type, |
| + const string16& data) OVERRIDE { |
| + delegate_->SendReplyMessage(reply_type, data); |
| + } |
| + |
| + virtual void RegisterReplyNotification( |
| + const base::Callback<void(webkit_glue::WebIntentReplyType)>&) OVERRIDE { |
| + NOTREACHED(); |
| + } |
| + |
| + private: |
| + ~DeletingDispatcherWrapper() { |
| + delete service_; |
| + delete this; |
| + } |
| + |
| + web_intents::IntentServiceHost* service_; |
| + content::WebIntentsDispatcher* delegate_; |
| +}; |
| + |
| } // namespace |
| // UMAReporter handles reporting Web Intents events to UMA. |
| @@ -362,9 +404,10 @@ void WebIntentPickerController::OnServiceChosen( |
| case webkit_glue::WebIntentServiceData::DISPOSITION_NATIVE: { |
| web_intents::IntentServiceHost* service = |
| native_services_->CreateServiceInstance( |
| - url, intents_dispatcher_->GetIntent()); |
| + url, intents_dispatcher_->GetIntent(), web_contents_); |
| DCHECK(service); |
| - service->HandleIntent(intents_dispatcher_); |
| + service->HandleIntent( |
| + new DeletingDispatcherWrapper(service, intents_dispatcher_)); |
| break; |
| } |