Index: chrome/browser/extensions/extension_browser_event_router.cc |
diff --git a/chrome/browser/extensions/extension_browser_event_router.cc b/chrome/browser/extensions/extension_browser_event_router.cc |
index 52d26da2efb57dda779fe32ccd6a2128043acb14..1932552f093537d9f88b2d788aa931af14ab9d81 100644 |
--- a/chrome/browser/extensions/extension_browser_event_router.cc |
+++ b/chrome/browser/extensions/extension_browser_event_router.cc |
@@ -22,61 +22,39 @@ namespace tab_keys = extension_tabs_module_constants; |
namespace page_action_keys = extension_page_actions_module_constants; |
ExtensionBrowserEventRouter::TabEntry::TabEntry() |
- : state_(ExtensionTabUtil::TAB_COMPLETE), |
- pending_navigate_(false), |
+ : complete_waiting_on_load_(false), |
url_() { |
} |
-ExtensionBrowserEventRouter::TabEntry::TabEntry(const TabContents* contents) |
- : state_(ExtensionTabUtil::TAB_COMPLETE), |
- pending_navigate_(false), |
- url_(contents->GetURL()) { |
- UpdateLoadState(contents); |
-} |
- |
DictionaryValue* ExtensionBrowserEventRouter::TabEntry::UpdateLoadState( |
const TabContents* contents) { |
- ExtensionTabUtil::TabStatus old_state = state_; |
- state_ = ExtensionTabUtil::GetTabStatus(contents); |
- |
- if (old_state == state_) |
- return false; |
- |
- if (state_ == ExtensionTabUtil::TAB_LOADING) { |
- // Do not send "loading" state changed now. Wait for navigate so the new |
- // url is available. |
- pending_navigate_ = true; |
+ // The tab may go in & out of loading (for instance if iframes navigate). |
+ // We only want to respond to the first change from loading to !loading after |
+ // the NAV_ENTRY_COMMITTED was fired. |
+ if (!complete_waiting_on_load_ || contents->is_loading()) |
return NULL; |
- } else if (state_ == ExtensionTabUtil::TAB_COMPLETE) { |
- // Send "complete" state change. |
- DictionaryValue* changed_properties = new DictionaryValue(); |
- changed_properties->SetString(tab_keys::kStatusKey, |
- tab_keys::kStatusValueComplete); |
- return changed_properties; |
- |
- } else { |
- NOTREACHED(); |
- return NULL; |
- } |
+ // Send "complete" state change. |
+ complete_waiting_on_load_ = false; |
+ DictionaryValue* changed_properties = new DictionaryValue(); |
+ changed_properties->SetString(tab_keys::kStatusKey, |
+ tab_keys::kStatusValueComplete); |
+ return changed_properties; |
} |
DictionaryValue* ExtensionBrowserEventRouter::TabEntry::DidNavigate( |
const TabContents* contents) { |
- if (!pending_navigate_) |
- return NULL; |
- |
+ // Send "loading" state change. |
+ complete_waiting_on_load_ = true; |
DictionaryValue* changed_properties = new DictionaryValue(); |
changed_properties->SetString(tab_keys::kStatusKey, |
tab_keys::kStatusValueLoading); |
- GURL new_url = contents->GetURL(); |
- if (new_url != url_) { |
- url_ = new_url; |
+ if (contents->GetURL() != url_) { |
+ url_ = contents->GetURL(); |
changed_properties->SetString(tab_keys::kUrlKey, url_.spec()); |
} |
- pending_navigate_ = false; |
return changed_properties; |
} |
@@ -133,7 +111,7 @@ void ExtensionBrowserEventRouter::Init() { |
for (int i = 0; i < browser->tabstrip_model()->count(); ++i) { |
TabContents* contents = browser->tabstrip_model()->GetTabContentsAt(i); |
int tab_id = ExtensionTabUtil::GetTabId(contents); |
- tab_entries_[tab_id] = TabEntry(contents); |
+ tab_entries_[tab_id] = TabEntry(); |
} |
} |
} |
@@ -225,7 +203,7 @@ void ExtensionBrowserEventRouter::TabInsertedAt(TabContents* contents, |
// If tab is new, send created event. |
int tab_id = ExtensionTabUtil::GetTabId(contents); |
if (tab_entries_.find(tab_id) == tab_entries_.end()) { |
- tab_entries_[tab_id] = TabEntry(contents); |
+ tab_entries_[tab_id] = TabEntry(); |
TabCreatedAt(contents, index, foreground); |
return; |