diff options
author | avi@chromium.org <avi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-07 22:51:41 +0000 |
---|---|---|
committer | avi@chromium.org <avi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-07 22:51:41 +0000 |
commit | 0150cfcb238a357ce4daaa9d9c6d5a4516f9a8eb (patch) | |
tree | 0a21f40d09ea0394e75f4c34d99ac07c5a74de8d /content/browser | |
parent | 9017a7808e576c7faac46695ab7845ec30434197 (diff) | |
download | chromium_src-0150cfcb238a357ce4daaa9d9c6d5a4516f9a8eb.zip chromium_src-0150cfcb238a357ce4daaa9d9c6d5a4516f9a8eb.tar.gz chromium_src-0150cfcb238a357ce4daaa9d9c6d5a4516f9a8eb.tar.bz2 |
Revert 80519 - Move favicon from TabContents to TabContentsWrapper.
BUG=78732
Original BUG=71097
Original TEST=no visible change
Original Review URL: http://codereview.chromium.org/6735042
TBR=avi@chromium.org
Review URL: http://codereview.chromium.org/6814029
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@80860 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/browser')
-rw-r--r-- | content/browser/tab_contents/tab_contents.cc | 80 | ||||
-rw-r--r-- | content/browser/tab_contents/tab_contents.h | 36 | ||||
-rw-r--r-- | content/browser/tab_contents/tab_contents_observer.cc | 4 | ||||
-rw-r--r-- | content/browser/tab_contents/tab_contents_observer.h | 6 | ||||
-rw-r--r-- | content/browser/webui/web_ui_unittest.cc | 33 |
5 files changed, 127 insertions, 32 deletions
diff --git a/content/browser/tab_contents/tab_contents.cc b/content/browser/tab_contents/tab_contents.cc index d4ea97e..ebee41c 100644 --- a/content/browser/tab_contents/tab_contents.cc +++ b/content/browser/tab_contents/tab_contents.cc @@ -28,6 +28,7 @@ #include "chrome/browser/download/download_manager.h" #include "chrome/browser/download/download_request_limiter.h" #include "chrome/browser/external_protocol_handler.h" +#include "chrome/browser/favicon_service.h" #include "chrome/browser/google/google_util.h" #include "chrome/browser/history/history.h" #include "chrome/browser/history/history_types.h" @@ -370,6 +371,7 @@ TabContents::~TabContents() { } void TabContents::AddObservers() { + favicon_helper_.reset(new FaviconHelper(this)); desktop_notification_handler_.reset( new DesktopNotificationHandlerForTC(this, GetRenderProcessHost())); plugin_observer_.reset(new PluginObserver(this)); @@ -513,6 +515,42 @@ bool TabContents::ShouldDisplayURL() { return true; } +SkBitmap TabContents::GetFavicon() const { + // Like GetTitle(), we also want to use the favicon for the last committed + // entry rather than a pending navigation entry. + NavigationEntry* entry = controller_.GetTransientEntry(); + if (entry) + return entry->favicon().bitmap(); + + entry = controller_.GetLastCommittedEntry(); + if (entry) + return entry->favicon().bitmap(); + return SkBitmap(); +} + +bool TabContents::FaviconIsValid() const { + NavigationEntry* entry = controller_.GetTransientEntry(); + if (entry) + return entry->favicon().is_valid(); + + entry = controller_.GetLastCommittedEntry(); + if (entry) + return entry->favicon().is_valid(); + + return false; +} + +bool TabContents::ShouldDisplayFavicon() { + // Always display a throbber during pending loads. + if (controller_.GetLastCommittedEntry() && controller_.pending_entry()) + return true; + + WebUI* web_ui = GetWebUIForCurrentState(); + if (web_ui) + return !web_ui->hide_favicon(); + return true; +} + void TabContents::AddObserver(TabContentsObserver* observer) { observers_.AddObserver(observer); } @@ -664,8 +702,15 @@ bool TabContents::NavigateToEntry( } // Notify observers about navigation. - FOR_EACH_OBSERVER(TabContentsObserver, observers_, - NavigateToPendingEntry(entry.url(), reload_type)); + FOR_EACH_OBSERVER(TabContentsObserver, observers_, NavigateToPendingEntry()); + + if (reload_type != NavigationController::NO_RELOAD && + !profile()->IsOffTheRecord()) { + FaviconService* favicon_service = + profile()->GetFaviconService(Profile::IMPLICIT_ACCESS); + if (favicon_service) + favicon_service->SetFaviconOutOfDateForPage(entry.url()); + } return true; } @@ -699,6 +744,34 @@ void TabContents::ShowPageInfo(const GURL& url, delegate_->ShowPageInfo(profile(), url, ssl, show_history); } +void TabContents::SaveFavicon() { + NavigationEntry* entry = controller_.GetActiveEntry(); + if (!entry || entry->url().is_empty()) + return; + + // Make sure the page is in history, otherwise adding the favicon does + // nothing. + HistoryService* history = profile()->GetOriginalProfile()->GetHistoryService( + Profile::IMPLICIT_ACCESS); + if (!history) + return; + history->AddPageNoVisitForBookmark(entry->url()); + + FaviconService* service = profile()->GetOriginalProfile()->GetFaviconService( + Profile::IMPLICIT_ACCESS); + if (!service) + return; + const NavigationEntry::FaviconStatus& favicon(entry->favicon()); + if (!favicon.is_valid() || favicon.url().is_empty() || + favicon.bitmap().empty()) { + return; + } + std::vector<unsigned char> image_data; + gfx::PNGCodec::EncodeBGRASkBitmap(favicon.bitmap(), false, &image_data); + service->SetFavicon( + entry->url(), favicon.url(), image_data, history::FAVICON); +} + ConstrainedWindow* TabContents::CreateConstrainedDialog( ConstrainedWindowDelegate* delegate) { ConstrainedWindow* window = @@ -1488,6 +1561,9 @@ void TabContents::DidNavigateMainFramePostCommit( // Allow the new page to set the title again. received_page_title_ = false; + // Get the favicon, either from history or request it from the net. + favicon_helper_->FetchFavicon(details.entry->url()); + // Clear all page actions, blocked content notifications and browser actions // for this tab, unless this is an in-page navigation. if (!details.is_in_page) { diff --git a/content/browser/tab_contents/tab_contents.h b/content/browser/tab_contents/tab_contents.h index 09187c4..b458293 100644 --- a/content/browser/tab_contents/tab_contents.h +++ b/content/browser/tab_contents/tab_contents.h @@ -16,6 +16,7 @@ #include "base/memory/scoped_ptr.h" #include "base/string16.h" #include "chrome/browser/download/save_package.h" +#include "chrome/browser/favicon_helper.h" #include "chrome/browser/prefs/pref_change_registrar.h" #include "chrome/browser/tab_contents/tab_specific_content_settings.h" #include "chrome/browser/ui/app_modal_dialogs/js_modal_dialog.h" @@ -171,6 +172,11 @@ class TabContents : public PageNavigator, return view_.get(); } + // Returns the FaviconHelper of this TabContents. + FaviconHelper& favicon_helper() { + return *favicon_helper_.get(); + } + // Tab navigation state ------------------------------------------------------ // Returns the current navigation properties, which if a navigation is @@ -199,6 +205,18 @@ class TabContents : public PageNavigator, // the user is invited to type into it. virtual bool ShouldDisplayURL(); + // Returns the favicon for this tab, or an isNull() bitmap if the tab does not + // have a favicon. The default implementation uses the current navigation + // entry. + SkBitmap GetFavicon() const; + + // Returns true if we are not using the default favicon. + bool FaviconIsValid() const; + + // Returns whether the favicon should be displayed. If this returns false, no + // space is provided for the favicon, and the favicon is never displayed. + virtual bool ShouldDisplayFavicon(); + // Return whether this tab contents is loading a resource. bool is_loading() const { return is_loading_; } @@ -323,6 +341,9 @@ class TabContents : public PageNavigator, const NavigationEntry::SSLStatus& ssl, bool show_history); + // Saves the favicon for the current page. + void SaveFavicon(); + // Window management --------------------------------------------------------- // Create a new window constrained to this TabContents' clip and visibility. @@ -615,10 +636,6 @@ class TabContents : public PageNavigator, // Query the WebUIFactory for the TypeID for the current URL. WebUI::TypeID GetWebUITypeForCurrentState(); - // Returns the WebUI for the current state of the tab. This will either be - // the pending WebUI, the committed WebUI, or NULL. - WebUI* GetWebUIForCurrentState(); - protected: friend class TabContentsObserver; friend class TabContentsObserver::Registrar; @@ -728,6 +745,10 @@ class TabContents : public PageNavigator, void ExpireInfoBars( const NavigationController::LoadCommittedDetails& details); + // Returns the WebUI for the current state of the tab. This will either be + // the pending WebUI, the committed WebUI, or NULL. + WebUI* GetWebUIForCurrentState(); + // Navigation helpers -------------------------------------------------------- // // These functions are helpers for Navigate() and DidNavigate(). @@ -953,6 +974,9 @@ class TabContents : public PageNavigator, // Handles drag and drop event forwarding to extensions. BookmarkDrag* bookmark_drag_; + // Handles downloading favicons. + scoped_ptr<FaviconHelper> favicon_helper_; + // RenderViewHost::ContentSettingsDelegate. scoped_ptr<TabSpecificContentSettings> content_settings_delegate_; @@ -1038,6 +1062,10 @@ class TabContents : public PageNavigator, // once. bool notify_disconnection_; + // Maps from handle to page_id. + typedef std::map<FaviconService::Handle, int32> HistoryRequestMap; + HistoryRequestMap history_requests_; + #if defined(OS_WIN) // Handle to an event that's set when the page is showing a message box (or // equivalent constrained window). Plugin processes check this to know if diff --git a/content/browser/tab_contents/tab_contents_observer.cc b/content/browser/tab_contents/tab_contents_observer.cc index 3dff039..3dfda19 100644 --- a/content/browser/tab_contents/tab_contents_observer.cc +++ b/content/browser/tab_contents/tab_contents_observer.cc @@ -25,9 +25,7 @@ void TabContentsObserver::Registrar::Observe(TabContents* tab) { tab_->AddObserver(observer_); } -void TabContentsObserver::NavigateToPendingEntry( - const GURL& url, - NavigationController::ReloadType reload_type) { +void TabContentsObserver::NavigateToPendingEntry() { } void TabContentsObserver::DidNavigateMainFramePostCommit( diff --git a/content/browser/tab_contents/tab_contents_observer.h b/content/browser/tab_contents/tab_contents_observer.h index 3d7e887..fab9165 100644 --- a/content/browser/tab_contents/tab_contents_observer.h +++ b/content/browser/tab_contents/tab_contents_observer.h @@ -15,7 +15,7 @@ struct ViewHostMsg_FrameNavigate_Params; class TabContentsObserver : public IPC::Channel::Listener, public IPC::Message::Sender { public: - // Use this as a member variable in a class that uses the empty constructor + // Use this as a member variable in a class that uses the emptry constructor // version of this interface. class Registrar { public: @@ -35,9 +35,7 @@ class TabContentsObserver : public IPC::Channel::Listener, DISALLOW_COPY_AND_ASSIGN(Registrar); }; - virtual void NavigateToPendingEntry( - const GURL& url, - NavigationController::ReloadType reload_type); + virtual void NavigateToPendingEntry(); virtual void DidNavigateMainFramePostCommit( const NavigationController::LoadCommittedDetails& details, diff --git a/content/browser/webui/web_ui_unittest.cc b/content/browser/webui/web_ui_unittest.cc index e96642e..b81f3a8 100644 --- a/content/browser/webui/web_ui_unittest.cc +++ b/content/browser/webui/web_ui_unittest.cc @@ -2,19 +2,17 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/favicon_tab_helper.h" -#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" -#include "chrome/browser/ui/tab_contents/test_tab_contents_wrapper.h" #include "chrome/browser/ui/webui/new_tab_ui.h" #include "chrome/common/url_constants.h" #include "chrome/test/testing_profile.h" #include "content/browser/browser_thread.h" +#include "content/browser/renderer_host/test_render_view_host.h" #include "content/browser/site_instance.h" #include "content/browser/tab_contents/navigation_controller.h" #include "content/browser/tab_contents/test_tab_contents.h" #include "testing/gtest/include/gtest/gtest.h" -class WebUITest : public TabContentsWrapperTestHarness { +class WebUITest : public RenderViewHostTestHarness { public: WebUITest() : ui_thread_(BrowserThread::UI, MessageLoop::current()) {} @@ -22,8 +20,7 @@ class WebUITest : public TabContentsWrapperTestHarness { // state, through pending, committed, then another navigation. The first page // ID that we should use is passed as a parameter. We'll use the next two // values. This must be increasing for the life of the tests. - static void DoNavigationTest(TabContentsWrapper* wrapper, int page_id) { - TabContents* contents = wrapper->tab_contents(); + static void DoNavigationTest(TabContents* contents, int page_id) { NavigationController* controller = &contents->controller(); // Start a pending load. @@ -36,7 +33,7 @@ class WebUITest : public TabContentsWrapperTestHarness { // Check the things the pending Web UI should have set. EXPECT_FALSE(contents->ShouldDisplayURL()); - EXPECT_FALSE(wrapper->favicon_tab_helper()->ShouldDisplayFavicon()); + EXPECT_FALSE(contents->ShouldDisplayFavicon()); EXPECT_TRUE(contents->ShouldShowBookmarkBar()); EXPECT_TRUE(contents->FocusLocationBarByDefault()); @@ -46,7 +43,7 @@ class WebUITest : public TabContentsWrapperTestHarness { // The same flags should be set as before now that the load has committed. EXPECT_FALSE(contents->ShouldDisplayURL()); - EXPECT_FALSE(wrapper->favicon_tab_helper()->ShouldDisplayFavicon()); + EXPECT_FALSE(contents->ShouldDisplayFavicon()); EXPECT_TRUE(contents->ShouldShowBookmarkBar()); EXPECT_TRUE(contents->FocusLocationBarByDefault()); @@ -57,7 +54,7 @@ class WebUITest : public TabContentsWrapperTestHarness { // Check the flags. Some should reflect the new page (URL, title), some // should reflect the old one (bookmark bar) until it has committed. EXPECT_TRUE(contents->ShouldDisplayURL()); - EXPECT_TRUE(wrapper->favicon_tab_helper()->ShouldDisplayFavicon()); + EXPECT_TRUE(contents->ShouldDisplayFavicon()); EXPECT_TRUE(contents->ShouldShowBookmarkBar()); EXPECT_FALSE(contents->FocusLocationBarByDefault()); @@ -77,7 +74,7 @@ class WebUITest : public TabContentsWrapperTestHarness { // The state should now reflect a regular page. EXPECT_TRUE(contents->ShouldDisplayURL()); - EXPECT_TRUE(wrapper->favicon_tab_helper()->ShouldDisplayFavicon()); + EXPECT_TRUE(contents->ShouldDisplayFavicon()); EXPECT_FALSE(contents->ShouldShowBookmarkBar()); EXPECT_FALSE(contents->FocusLocationBarByDefault()); } @@ -92,16 +89,15 @@ class WebUITest : public TabContentsWrapperTestHarness { // TabContents when we first navigate to a Web UI page, then to a standard // non-DOM-UI page. TEST_F(WebUITest, WebUIToStandard) { - DoNavigationTest(contents_wrapper(), 1); + DoNavigationTest(contents(), 1); // Test the case where we're not doing the initial navigation. This is // slightly different than the very-first-navigation case since the // SiteInstance will be the same (the original TabContents must still be // alive), which will trigger different behavior in RenderViewHostManager. - TestTabContents* contents2 = new TestTabContents(profile_.get(), NULL); - TabContentsWrapper wrapper2(contents2); + TestTabContents contents2(profile_.get(), NULL); - DoNavigationTest(&wrapper2, 101); + DoNavigationTest(&contents2, 101); } TEST_F(WebUITest, WebUIToWebUI) { @@ -116,8 +112,7 @@ TEST_F(WebUITest, WebUIToWebUI) { // The flags should be the same as the non-pending state. EXPECT_FALSE(contents()->ShouldDisplayURL()); - EXPECT_FALSE( - contents_wrapper()->favicon_tab_helper()->ShouldDisplayFavicon()); + EXPECT_FALSE(contents()->ShouldDisplayFavicon()); EXPECT_TRUE(contents()->ShouldShowBookmarkBar()); EXPECT_TRUE(contents()->FocusLocationBarByDefault()); } @@ -130,14 +125,14 @@ TEST_F(WebUITest, StandardToWebUI) { // The state should now reflect the default. EXPECT_TRUE(contents()->ShouldDisplayURL()); - EXPECT_TRUE(contents_wrapper()->favicon_tab_helper()->ShouldDisplayFavicon()); + EXPECT_TRUE(contents()->ShouldDisplayFavicon()); EXPECT_FALSE(contents()->ShouldShowBookmarkBar()); EXPECT_FALSE(contents()->FocusLocationBarByDefault()); // Commit the load, the state should be the same. rvh()->SendNavigate(1, std_url); EXPECT_TRUE(contents()->ShouldDisplayURL()); - EXPECT_TRUE(contents_wrapper()->favicon_tab_helper()->ShouldDisplayFavicon()); + EXPECT_TRUE(contents()->ShouldDisplayFavicon()); EXPECT_FALSE(contents()->ShouldShowBookmarkBar()); EXPECT_FALSE(contents()->FocusLocationBarByDefault()); @@ -145,7 +140,7 @@ TEST_F(WebUITest, StandardToWebUI) { GURL new_tab_url(chrome::kChromeUINewTabURL); controller().LoadURL(new_tab_url, GURL(), PageTransition::LINK); EXPECT_FALSE(contents()->ShouldDisplayURL()); - EXPECT_TRUE(contents_wrapper()->favicon_tab_helper()->ShouldDisplayFavicon()); + EXPECT_TRUE(contents()->ShouldDisplayFavicon()); EXPECT_FALSE(contents()->ShouldShowBookmarkBar()); EXPECT_TRUE(contents()->FocusLocationBarByDefault()); |