| 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 bb65d1ad1e5e6a77863a9c2822408bf2a5c395ac..b35444e2b8f654b3839cc84d130e72bb46dbeb84 100644
|
| --- a/chrome/browser/ui/intents/web_intent_picker_controller.cc
|
| +++ b/chrome/browser/ui/intents/web_intent_picker_controller.cc
|
| @@ -13,6 +13,7 @@
|
| #include "chrome/browser/intents/web_intents_registry.h"
|
| #include "chrome/browser/intents/web_intents_registry_factory.h"
|
| #include "chrome/browser/profiles/profile.h"
|
| +#include "chrome/browser/tabs/tab_strip_model.h"
|
| #include "chrome/browser/ui/browser_navigator.h"
|
| #include "chrome/browser/ui/intents/web_intent_picker.h"
|
| #include "chrome/browser/ui/intents/web_intent_picker_factory.h"
|
| @@ -114,7 +115,8 @@ WebIntentPickerController::WebIntentPickerController(
|
| picker_(NULL),
|
| pending_async_count_(0),
|
| routing_id_(0),
|
| - intent_id_(0) {
|
| + intent_id_(0),
|
| + service_tab_(NULL) {
|
| NavigationController* controller = &wrapper->controller();
|
| registrar_.Add(this, content::NOTIFICATION_LOAD_START,
|
| content::Source<NavigationController>(controller));
|
| @@ -176,6 +178,7 @@ class InvokingTabObserver : public TabContentsObserver {
|
| virtual void TabContentsDestroyed(TabContents* tab) OVERRIDE {
|
| if (intent_injector_)
|
| intent_injector_->SourceTabContentsDestroyed(tab);
|
| + wrapper_ = NULL;
|
| }
|
|
|
| virtual bool Send(IPC::Message* message) OVERRIDE {
|
| @@ -183,6 +186,14 @@ class InvokingTabObserver : public TabContentsObserver {
|
| // to it again, since it may have deleted itself.
|
| intent_injector_ = NULL;
|
|
|
| + if (!wrapper_)
|
| + return false;
|
| +
|
| + MessageLoopForUI::current()->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&WebIntentPickerController::OnSendReturnMessage,
|
| + base::Unretained(wrapper_->web_intent_picker_controller())));
|
| +
|
| message->set_routing_id(routing_id_);
|
| return wrapper_->Send(message);
|
| }
|
| @@ -221,6 +232,7 @@ void WebIntentPickerController::OnServiceChosen(size_t index) {
|
| params.profile = wrapper_->profile();
|
| browser::Navigate(¶ms);
|
| new_tab_contents = params.target_contents->tab_contents();
|
| + service_tab_ = new_tab_contents;
|
|
|
| ClosePicker();
|
| }
|
| @@ -233,12 +245,33 @@ void WebIntentPickerController::OnServiceChosen(size_t index) {
|
|
|
| void WebIntentPickerController::OnCancelled() {
|
| InvokingTabObserver forwarder(wrapper_, NULL, routing_id_);
|
| - forwarder.Send(new IntentsMsg_WebIntentReply(
|
| - 0, webkit_glue::WEB_INTENT_PICKER_CANCELLED, string16(), intent_id_));
|
| + if (service_tab_) {
|
| + forwarder.Send(new IntentsMsg_WebIntentReply(
|
| + 0, webkit_glue::WEB_INTENT_SERVICE_TAB_CLOSED, string16(), intent_id_));
|
| + } else {
|
| + forwarder.Send(new IntentsMsg_WebIntentReply(
|
| + 0, webkit_glue::WEB_INTENT_PICKER_CANCELLED, string16(), intent_id_));
|
| + }
|
| +
|
| + ClosePicker();
|
| }
|
|
|
| void WebIntentPickerController::OnClosing() {
|
| +}
|
| +
|
| +void WebIntentPickerController::OnSendReturnMessage() {
|
| ClosePicker();
|
| +
|
| + if (service_tab_) {
|
| + int index = TabStripModel::kNoTab;
|
| + Browser* browser = Browser::GetBrowserForController(
|
| + &service_tab_->controller(), &index);
|
| + if (browser) {
|
| + browser->tabstrip_model()->CloseTabContentsAt(
|
| + index, TabStripModel::CLOSE_CREATE_HISTORICAL_TAB);
|
| + }
|
| + service_tab_ = NULL;
|
| + }
|
| }
|
|
|
| void WebIntentPickerController::OnWebIntentDataAvailable(
|
|
|