Index: chrome/browser/extensions/api/web_navigation/web_navigation_api.cc |
diff --git a/chrome/browser/extensions/api/web_navigation/web_navigation_api.cc b/chrome/browser/extensions/api/web_navigation/web_navigation_api.cc |
index 82fe920c80c7217b6126fac03f45f1dc1834f97d..c170362e5786ff8f272fd3dfb8f88ebf8d9c688f 100644 |
--- a/chrome/browser/extensions/api/web_navigation/web_navigation_api.cc |
+++ b/chrome/browser/extensions/api/web_navigation/web_navigation_api.cc |
@@ -16,6 +16,7 @@ |
#include "chrome/browser/extensions/extension_tab_util.h" |
#include "chrome/browser/profiles/profile.h" |
#include "chrome/browser/tab_contents/retargeting_details.h" |
+#include "chrome/browser/ui/browser.h" |
#include "chrome/browser/ui/tab_contents/tab_contents.h" |
#include "chrome/browser/view_type_utils.h" |
#include "chrome/common/chrome_notification_types.h" |
@@ -206,6 +207,7 @@ void DispatchOnCreatedNavigationTarget( |
dict->SetDouble(keys::kTimeStampKey, MilliSecondsFromTime(base::Time::Now())); |
args.Append(dict); |
+ // TODO(koz): Why not web_contents->GetURL() instead of target_url or both? |
DispatchEvent(browser_context, keys::kOnCreatedNavigationTarget, args, |
target_url); |
} |
@@ -229,6 +231,25 @@ void DispatchOnErrorOccurred(WebContents* web_contents, |
args, url); |
} |
+// Constructs and dispatches an onTabReplaced event. |
+void DispatchOnTabReplaced( |
+ WebContents* old_web_contents, |
+ BrowserContext* browser_context, |
+ WebContents* new_web_contents) { |
+ ListValue args; |
+ DictionaryValue* dict = new DictionaryValue(); |
+ dict->SetInteger(keys::kSourceTabIdKey, |
+ ExtensionTabUtil::GetTabId(old_web_contents)); |
+ dict->SetInteger(keys::kTabIdKey, |
+ ExtensionTabUtil::GetTabId(new_web_contents)); |
+ dict->SetDouble(keys::kTimeStampKey, MilliSecondsFromTime(base::Time::Now())); |
+ args.Append(dict); |
+ |
+ // TODO(koz): Why not old_web_contents->GetURL() or both? |
+ DispatchEvent(browser_context, keys::kOnTabReplaced, args, |
+ new_web_contents->GetURL()); |
+} |
+ |
} // namespace |
@@ -400,19 +421,66 @@ WebNavigationEventRouter::WebNavigationEventRouter(Profile* profile) |
WebNavigationEventRouter::~WebNavigationEventRouter() {} |
battre
2012/07/05 15:38:46
The WebNavigationEventRouter is owned by the Exten
jochen (gone - plz use gerrit)
2012/07/06 11:13:50
Done.
|
void WebNavigationEventRouter::Init() { |
- if (registrar_.IsEmpty()) { |
- registrar_.Add(this, |
- chrome::NOTIFICATION_RETARGETING, |
- content::NotificationService::AllSources()); |
- registrar_.Add(this, |
- chrome::NOTIFICATION_TAB_ADDED, |
- content::NotificationService::AllSources()); |
- registrar_.Add(this, |
- content::NOTIFICATION_WEB_CONTENTS_DESTROYED, |
- content::NotificationService::AllSources()); |
+ if (!registrar_.IsEmpty()) |
+ return; |
+ registrar_.Add(this, |
+ chrome::NOTIFICATION_RETARGETING, |
+ content::NotificationService::AllSources()); |
+ registrar_.Add(this, |
+ chrome::NOTIFICATION_TAB_ADDED, |
+ content::NotificationService::AllSources()); |
+ registrar_.Add(this, |
+ content::NOTIFICATION_WEB_CONTENTS_DESTROYED, |
+ content::NotificationService::AllSources()); |
+ |
+ BrowserList::AddObserver(this); |
+ for (BrowserList::const_iterator iter = BrowserList::begin(); |
+ iter != BrowserList::end(); ++iter) { |
+ OnBrowserAdded(*iter); |
} |
} |
+void WebNavigationEventRouter::OnBrowserAdded(Browser* browser) { |
+ if (!profile_->IsSameProfile(browser->profile())) |
+ return; |
+ browser->tab_strip_model()->AddObserver(this); |
+} |
+ |
+void WebNavigationEventRouter::OnBrowserRemoved(Browser* browser) { |
+ if (!profile_->IsSameProfile(browser->profile())) |
+ return; |
+ browser->tab_strip_model()->RemoveObserver(this); |
+} |
+ |
+void WebNavigationEventRouter::TabReplacedAt( |
+ TabStripModel* tab_strip_model, |
+ TabContents* old_contents, |
+ TabContents* new_contents, |
+ int index) { |
+ WebNavigationTabObserver* tab_observer = |
+ WebNavigationTabObserver::Get(old_contents->web_contents()); |
+ if (!tab_observer) { |
+ // If you hit this DCHECK(), please add reproduction steps to |
+ // http://crbug.com/109464. |
+ DCHECK(chrome::GetViewType(old_contents->web_contents()) != |
+ chrome::VIEW_TYPE_TAB_CONTENTS); |
+ return; |
+ } |
+ const FrameNavigationState& frame_navigation_state = |
+ tab_observer->frame_navigation_state(); |
+ |
+ if (!frame_navigation_state.IsValidUrl( |
+ old_contents->web_contents()->GetURL()) || |
+ !frame_navigation_state.IsValidUrl( |
+ new_contents->web_contents()->GetURL())) |
+ return; |
+ |
+ DispatchOnTabReplaced( |
+ old_contents->web_contents(), |
+ profile_, |
+ new_contents->web_contents()); |
+} |
+ |
void WebNavigationEventRouter::Observe( |
int type, |
const content::NotificationSource& source, |