Index: chrome/browser/extensions/browser_event_router.cc |
diff --git a/chrome/browser/extensions/browser_event_router.cc b/chrome/browser/extensions/browser_event_router.cc |
index d2c8b5de13864b2abdf83a05844bff928db3f5b0..2caecc41af66170f6971bfdbde48216cb9a33ab3 100644 |
--- a/chrome/browser/extensions/browser_event_router.cc |
+++ b/chrome/browser/extensions/browser_event_router.cc |
@@ -20,6 +20,7 @@ |
#include "chrome/browser/ui/browser.h" |
#include "chrome/browser/ui/browser_iterator.h" |
#include "chrome/browser/ui/browser_list.h" |
+#include "chrome/browser/ui/tab_contents/core_tab_helper.h" |
#include "chrome/browser/ui/tabs/tab_strip_model.h" |
#include "chrome/common/chrome_notification_types.h" |
#include "chrome/common/extensions/api/extension_action/action_info.h" |
@@ -215,50 +216,31 @@ void BrowserEventRouter::TabInsertedAt(WebContents* contents, |
EventRouter::USER_GESTURE_UNKNOWN); |
} |
-void BrowserEventRouter::TabDetachedAt(WebContents* contents, int index) { |
+void BrowserEventRouter::TabDetachedAt(WebContents* contents, |
+ int index, |
+ bool closing_all) { |
if (!GetTabEntry(contents)) { |
- // The tab was removed. Don't send detach event. |
+ // The tab was removed. Don't send detach/remove event. |
return; |
} |
- scoped_ptr<ListValue> args(new ListValue()); |
- args->Append(Value::CreateIntegerValue(ExtensionTabUtil::GetTabId(contents))); |
- |
- DictionaryValue* object_args = new DictionaryValue(); |
- object_args->Set(tab_keys::kOldWindowIdKey, Value::CreateIntegerValue( |
- ExtensionTabUtil::GetWindowIdOfTab(contents))); |
- object_args->Set(tab_keys::kOldPositionKey, Value::CreateIntegerValue( |
- index)); |
- args->Append(object_args); |
- |
- Profile* profile = Profile::FromBrowserContext(contents->GetBrowserContext()); |
- DispatchEvent(profile, events::kOnTabDetached, args.Pass(), |
- EventRouter::USER_GESTURE_UNKNOWN); |
+ // If this detach is occuring as part of the process of closing |contents| |
+ // then dispatch a remove event rather than a detach event. |
+ CoreTabHelper* core_tab_helper = CoreTabHelper::FromWebContents(contents); |
+ if (core_tab_helper->GetWebContentsDetachedToClose()) { |
+ int tab_id = ExtensionTabUtil::GetTabId(contents); |
+ DispatchTabRemovedAndUnregisterNotifications(contents, tab_id, closing_all); |
+ } else { |
+ DispatchTabDetached(contents, index); |
+ } |
} |
void BrowserEventRouter::TabClosingAt(TabStripModel* tab_strip_model, |
WebContents* contents, |
int index) { |
int tab_id = ExtensionTabUtil::GetTabId(contents); |
- |
- scoped_ptr<ListValue> args(new ListValue()); |
- args->Append(Value::CreateIntegerValue(tab_id)); |
- |
- DictionaryValue* object_args = new DictionaryValue(); |
- object_args->SetInteger(tab_keys::kWindowIdKey, |
- ExtensionTabUtil::GetWindowIdOfTab(contents)); |
- object_args->SetBoolean(tab_keys::kWindowClosing, |
- tab_strip_model->closing_all()); |
- args->Append(object_args); |
- |
- Profile* profile = Profile::FromBrowserContext(contents->GetBrowserContext()); |
- DispatchEvent(profile, events::kOnTabRemoved, args.Pass(), |
- EventRouter::USER_GESTURE_UNKNOWN); |
- |
- int removed_count = tab_entries_.erase(tab_id); |
- DCHECK_GT(removed_count, 0); |
- |
- UnregisterForTabNotifications(contents); |
+ DispatchTabRemovedAndUnregisterNotifications(contents, tab_id, |
+ tab_strip_model->closing_all()); |
} |
void BrowserEventRouter::ActiveTabChanged(WebContents* old_contents, |
@@ -478,6 +460,44 @@ BrowserEventRouter::TabEntry* BrowserEventRouter::GetTabEntry( |
return &i->second; |
} |
+void BrowserEventRouter::DispatchTabDetached(WebContents* contents, |
+ int index) { |
+ scoped_ptr<ListValue> args(new ListValue()); |
+ args->Append(Value::CreateIntegerValue(ExtensionTabUtil::GetTabId(contents))); |
+ |
+ DictionaryValue* object_args = new DictionaryValue(); |
+ object_args->Set(tab_keys::kOldWindowIdKey, Value::CreateIntegerValue( |
+ ExtensionTabUtil::GetWindowIdOfTab(contents))); |
+ object_args->Set(tab_keys::kOldPositionKey, Value::CreateIntegerValue( |
+ index)); |
+ args->Append(object_args); |
+ |
+ Profile* profile = Profile::FromBrowserContext(contents->GetBrowserContext()); |
+ DispatchEvent(profile, events::kOnTabDetached, args.Pass(), |
+ EventRouter::USER_GESTURE_UNKNOWN); |
+} |
+ |
+void BrowserEventRouter::DispatchTabRemovedAndUnregisterNotifications( |
+ WebContents* contents, int tab_id, bool window_closing) { |
+ scoped_ptr<ListValue> args(new ListValue()); |
+ args->Append(Value::CreateIntegerValue(tab_id)); |
+ |
+ DictionaryValue* object_args = new DictionaryValue(); |
+ object_args->SetInteger(tab_keys::kWindowIdKey, |
+ ExtensionTabUtil::GetWindowIdOfTab(contents)); |
+ object_args->SetBoolean(tab_keys::kWindowClosing, |
+ window_closing); |
+ args->Append(object_args); |
+ |
+ Profile* profile = Profile::FromBrowserContext(contents->GetBrowserContext()); |
+ DispatchEvent(profile, events::kOnTabRemoved, args.Pass(), |
+ EventRouter::USER_GESTURE_UNKNOWN); |
+ |
+ int removed_count = tab_entries_.erase(tab_id); |
+ DCHECK_GT(removed_count, 0); |
+ UnregisterForTabNotifications(contents); |
+} |
+ |
void BrowserEventRouter::Observe(int type, |
const content::NotificationSource& source, |
const content::NotificationDetails& details) { |