summaryrefslogtreecommitdiffstats
path: root/content/browser
diff options
context:
space:
mode:
authoravi@chromium.org <avi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-04-07 22:51:41 +0000
committeravi@chromium.org <avi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-04-07 22:51:41 +0000
commit0150cfcb238a357ce4daaa9d9c6d5a4516f9a8eb (patch)
tree0a21f40d09ea0394e75f4c34d99ac07c5a74de8d /content/browser
parent9017a7808e576c7faac46695ab7845ec30434197 (diff)
downloadchromium_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.cc80
-rw-r--r--content/browser/tab_contents/tab_contents.h36
-rw-r--r--content/browser/tab_contents/tab_contents_observer.cc4
-rw-r--r--content/browser/tab_contents/tab_contents_observer.h6
-rw-r--r--content/browser/webui/web_ui_unittest.cc33
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());