| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/extensions/api/tabs/tabs_event_router.h" | 5 #include "chrome/browser/extensions/api/tabs/tabs_event_router.h" |
| 6 | 6 |
| 7 #include "base/json/json_writer.h" | 7 #include "base/json/json_writer.h" |
| 8 #include "base/values.h" | 8 #include "base/values.h" |
| 9 #include "chrome/browser/chrome_notification_types.h" | 9 #include "chrome/browser/chrome_notification_types.h" |
| 10 #include "chrome/browser/extensions/api/tabs/tabs_constants.h" | 10 #include "chrome/browser/extensions/api/tabs/tabs_constants.h" |
| 11 #include "chrome/browser/extensions/api/tabs/tabs_windows_api.h" | 11 #include "chrome/browser/extensions/api/tabs/tabs_windows_api.h" |
| 12 #include "chrome/browser/extensions/api/tabs/windows_event_router.h" | 12 #include "chrome/browser/extensions/api/tabs/windows_event_router.h" |
| 13 #include "chrome/browser/extensions/extension_tab_util.h" | 13 #include "chrome/browser/extensions/extension_tab_util.h" |
| 14 #include "chrome/browser/favicon/favicon_tab_helper.h" |
| 14 #include "chrome/browser/profiles/profile.h" | 15 #include "chrome/browser/profiles/profile.h" |
| 15 #include "chrome/browser/ui/browser.h" | 16 #include "chrome/browser/ui/browser.h" |
| 16 #include "chrome/browser/ui/browser_iterator.h" | 17 #include "chrome/browser/ui/browser_iterator.h" |
| 17 #include "chrome/browser/ui/browser_list.h" | 18 #include "chrome/browser/ui/browser_list.h" |
| 18 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 19 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| 19 #include "chrome/common/extensions/extension_constants.h" | 20 #include "chrome/common/extensions/extension_constants.h" |
| 20 #include "content/public/browser/favicon_status.h" | 21 #include "content/public/browser/favicon_status.h" |
| 21 #include "content/public/browser/navigation_controller.h" | 22 #include "content/public/browser/navigation_controller.h" |
| 22 #include "content/public/browser/navigation_entry.h" | 23 #include "content/public/browser/navigation_entry.h" |
| 23 #include "content/public/browser/notification_service.h" | 24 #include "content/public/browser/notification_service.h" |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 87 tabs_constants::kStatusValueLoading); | 88 tabs_constants::kStatusValueLoading); |
| 88 | 89 |
| 89 if (contents->GetURL() != url_) { | 90 if (contents->GetURL() != url_) { |
| 90 url_ = contents->GetURL(); | 91 url_ = contents->GetURL(); |
| 91 changed_properties->SetString(tabs_constants::kUrlKey, url_.spec()); | 92 changed_properties->SetString(tabs_constants::kUrlKey, url_.spec()); |
| 92 } | 93 } |
| 93 | 94 |
| 94 return changed_properties; | 95 return changed_properties; |
| 95 } | 96 } |
| 96 | 97 |
| 97 TabsEventRouter::TabsEventRouter(Profile* profile) : profile_(profile) { | 98 TabsEventRouter::TabsEventRouter(Profile* profile) |
| 99 : profile_(profile), favicon_scoped_observer_(this) { |
| 98 DCHECK(!profile->IsOffTheRecord()); | 100 DCHECK(!profile->IsOffTheRecord()); |
| 99 | 101 |
| 100 BrowserList::AddObserver(this); | 102 BrowserList::AddObserver(this); |
| 101 | 103 |
| 102 // Init() can happen after the browser is running, so catch up with any | 104 // Init() can happen after the browser is running, so catch up with any |
| 103 // windows that already exist. | 105 // windows that already exist. |
| 104 for (chrome::BrowserIterator it; !it.done(); it.Next()) { | 106 for (chrome::BrowserIterator it; !it.done(); it.Next()) { |
| 105 RegisterForBrowserNotifications(*it); | 107 RegisterForBrowserNotifications(*it); |
| 106 | 108 |
| 107 // Also catch up our internal bookkeeping of tab entries. | 109 // Also catch up our internal bookkeeping of tab entries. |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 141 this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, | 143 this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, |
| 142 content::Source<NavigationController>(&contents->GetController())); | 144 content::Source<NavigationController>(&contents->GetController())); |
| 143 | 145 |
| 144 // Observing NOTIFICATION_WEB_CONTENTS_DESTROYED is necessary because it's | 146 // Observing NOTIFICATION_WEB_CONTENTS_DESTROYED is necessary because it's |
| 145 // possible for tabs to be created, detached and then destroyed without | 147 // possible for tabs to be created, detached and then destroyed without |
| 146 // ever having been re-attached and closed. This happens in the case of | 148 // ever having been re-attached and closed. This happens in the case of |
| 147 // a devtools WebContents that is opened in window, docked, then closed. | 149 // a devtools WebContents that is opened in window, docked, then closed. |
| 148 registrar_.Add(this, content::NOTIFICATION_WEB_CONTENTS_DESTROYED, | 150 registrar_.Add(this, content::NOTIFICATION_WEB_CONTENTS_DESTROYED, |
| 149 content::Source<WebContents>(contents)); | 151 content::Source<WebContents>(contents)); |
| 150 | 152 |
| 151 registrar_.Add(this, chrome::NOTIFICATION_FAVICON_UPDATED, | 153 favicon_scoped_observer_.Add(FaviconTabHelper::FromWebContents(contents)); |
| 152 content::Source<WebContents>(contents)); | |
| 153 | 154 |
| 154 ZoomController::FromWebContents(contents)->AddObserver(this); | 155 ZoomController::FromWebContents(contents)->AddObserver(this); |
| 155 } | 156 } |
| 156 | 157 |
| 157 void TabsEventRouter::UnregisterForTabNotifications(WebContents* contents) { | 158 void TabsEventRouter::UnregisterForTabNotifications(WebContents* contents) { |
| 158 registrar_.Remove(this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, | 159 registrar_.Remove(this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, |
| 159 content::Source<NavigationController>(&contents->GetController())); | 160 content::Source<NavigationController>(&contents->GetController())); |
| 160 registrar_.Remove(this, content::NOTIFICATION_WEB_CONTENTS_DESTROYED, | 161 registrar_.Remove(this, content::NOTIFICATION_WEB_CONTENTS_DESTROYED, |
| 161 content::Source<WebContents>(contents)); | 162 content::Source<WebContents>(contents)); |
| 162 registrar_.Remove(this, chrome::NOTIFICATION_FAVICON_UPDATED, | 163 favicon_scoped_observer_.Remove(FaviconTabHelper::FromWebContents(contents)); |
| 163 content::Source<WebContents>(contents)); | |
| 164 | 164 |
| 165 ZoomController::FromWebContents(contents)->RemoveObserver(this); | 165 ZoomController::FromWebContents(contents)->RemoveObserver(this); |
| 166 } | 166 } |
| 167 | 167 |
| 168 void TabsEventRouter::OnBrowserRemoved(Browser* browser) { | 168 void TabsEventRouter::OnBrowserRemoved(Browser* browser) { |
| 169 if (!profile_->IsSameProfile(browser->profile())) | 169 if (!profile_->IsSameProfile(browser->profile())) |
| 170 return; | 170 return; |
| 171 | 171 |
| 172 // Stop listening to TabStripModel events for this browser. | 172 // Stop listening to TabStripModel events for this browser. |
| 173 browser->tab_strip_model()->RemoveObserver(this); | 173 browser->tab_strip_model()->RemoveObserver(this); |
| (...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 494 NavigationController* source_controller = | 494 NavigationController* source_controller = |
| 495 content::Source<NavigationController>(source).ptr(); | 495 content::Source<NavigationController>(source).ptr(); |
| 496 TabUpdated(source_controller->GetWebContents(), true); | 496 TabUpdated(source_controller->GetWebContents(), true); |
| 497 } else if (type == content::NOTIFICATION_WEB_CONTENTS_DESTROYED) { | 497 } else if (type == content::NOTIFICATION_WEB_CONTENTS_DESTROYED) { |
| 498 // Tab was destroyed after being detached (without being re-attached). | 498 // Tab was destroyed after being detached (without being re-attached). |
| 499 WebContents* contents = content::Source<WebContents>(source).ptr(); | 499 WebContents* contents = content::Source<WebContents>(source).ptr(); |
| 500 registrar_.Remove(this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, | 500 registrar_.Remove(this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, |
| 501 content::Source<NavigationController>(&contents->GetController())); | 501 content::Source<NavigationController>(&contents->GetController())); |
| 502 registrar_.Remove(this, content::NOTIFICATION_WEB_CONTENTS_DESTROYED, | 502 registrar_.Remove(this, content::NOTIFICATION_WEB_CONTENTS_DESTROYED, |
| 503 content::Source<WebContents>(contents)); | 503 content::Source<WebContents>(contents)); |
| 504 registrar_.Remove(this, chrome::NOTIFICATION_FAVICON_UPDATED, | 504 favicon_scoped_observer_.Remove( |
| 505 content::Source<WebContents>(contents)); | 505 FaviconTabHelper::FromWebContents(contents)); |
| 506 } else if (type == chrome::NOTIFICATION_FAVICON_UPDATED) { | |
| 507 bool icon_url_changed = *content::Details<bool>(details).ptr(); | |
| 508 if (icon_url_changed) | |
| 509 FaviconUrlUpdated(content::Source<WebContents>(source).ptr()); | |
| 510 } else { | 506 } else { |
| 511 NOTREACHED(); | 507 NOTREACHED(); |
| 512 } | 508 } |
| 513 } | 509 } |
| 514 | 510 |
| 515 void TabsEventRouter::TabChangedAt(WebContents* contents, | 511 void TabsEventRouter::TabChangedAt(WebContents* contents, |
| 516 int index, | 512 int index, |
| 517 TabChangeType change_type) { | 513 TabChangeType change_type) { |
| 518 TabUpdated(contents, false); | 514 TabUpdated(contents, false); |
| 519 } | 515 } |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 578 | 574 |
| 579 // Dispatch the |onZoomChange| event. | 575 // Dispatch the |onZoomChange| event. |
| 580 Profile* profile = Profile::FromBrowserContext( | 576 Profile* profile = Profile::FromBrowserContext( |
| 581 data.web_contents->GetBrowserContext()); | 577 data.web_contents->GetBrowserContext()); |
| 582 DispatchEvent(profile, | 578 DispatchEvent(profile, |
| 583 tabs::OnZoomChange::kEventName, | 579 tabs::OnZoomChange::kEventName, |
| 584 api::tabs::OnZoomChange::Create(zoom_change_info), | 580 api::tabs::OnZoomChange::Create(zoom_change_info), |
| 585 EventRouter::USER_GESTURE_UNKNOWN); | 581 EventRouter::USER_GESTURE_UNKNOWN); |
| 586 } | 582 } |
| 587 | 583 |
| 584 void TabsEventRouter::OnFaviconAvailable(const gfx::Image& image) { |
| 585 } |
| 586 |
| 587 void TabsEventRouter::OnFaviconUpdated(favicon::FaviconDriver* favicon_driver, |
| 588 bool icon_url_changed) { |
| 589 if (icon_url_changed) { |
| 590 FaviconTabHelper* favicon_tab_helper = |
| 591 static_cast<FaviconTabHelper*>(favicon_driver); |
| 592 FaviconUrlUpdated(favicon_tab_helper->web_contents()); |
| 593 } |
| 594 } |
| 595 |
| 588 } // namespace extensions | 596 } // namespace extensions |
| OLD | NEW |