summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authorestade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-06-07 16:56:12 +0000
committerestade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-06-07 16:56:12 +0000
commit996ae9b36dde904605c55bbb0cad8360f7a59ac6 (patch)
treeab9dd718ba9c440830240353c9e3e9286aa03aca /chrome
parentac9779c4301001bd05b63f15acf48f6eed0dd3be (diff)
downloadchromium_src-996ae9b36dde904605c55bbb0cad8360f7a59ac6.zip
chromium_src-996ae9b36dde904605c55bbb0cad8360f7a59ac6.tar.gz
chromium_src-996ae9b36dde904605c55bbb0cad8360f7a59ac6.tar.bz2
Add code to calculate the dominant color for a favicon.
Currently we calculate the dominant/representative color only for those favicons we need it for (i.e. the ones shown on the NTP). We don't do any caching either in memory or in the favicon db but that can be tacked on later if deemed suitable. Code in color_analysis.* authored by dtrainor BUG=none TEST=none Review URL: http://codereview.chromium.org/7099001 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@88137 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/favicon/favicon_handler.h2
-rw-r--r--chrome/browser/resources/ntp4/most_visited_page.js21
-rw-r--r--chrome/browser/ui/webui/ntp/favicon_webui_handler.cc72
-rw-r--r--chrome/browser/ui/webui/ntp/favicon_webui_handler.h44
-rw-r--r--chrome/browser/ui/webui/ntp/most_visited_handler.cc2
-rw-r--r--chrome/browser/ui/webui/ntp/new_tab_ui.cc5
-rw-r--r--chrome/chrome_browser.gypi2
7 files changed, 143 insertions, 5 deletions
diff --git a/chrome/browser/favicon/favicon_handler.h b/chrome/browser/favicon/favicon_handler.h
index 8cc26be..e47ace3 100644
--- a/chrome/browser/favicon/favicon_handler.h
+++ b/chrome/browser/favicon/favicon_handler.h
@@ -64,7 +64,7 @@ class TabContents;
// db knew about the favicon), or requests the renderer to download the
// favicon.
//
-// When the renderer downloads the favicon SetFaviconImageData is invoked,
+// When the renderer downloads the favicon SetFavicon is invoked,
// at which point we update the favicon of the NavigationEntry and notify
// the database to save the favicon.
diff --git a/chrome/browser/resources/ntp4/most_visited_page.js b/chrome/browser/resources/ntp4/most_visited_page.js
index bc1e8ea..b3b82c5 100644
--- a/chrome/browser/resources/ntp4/most_visited_page.js
+++ b/chrome/browser/resources/ntp4/most_visited_page.js
@@ -8,6 +8,10 @@ cr.define('ntp4', function() {
var TilePage = ntp4.TilePage;
/**
+ */
+ var tileID = 0;
+
+ /**
* Creates a new Most Visited object for tiling.
* @constructor
* @extends {HTMLAnchorElement}
@@ -63,6 +67,7 @@ cr.define('ntp4', function() {
this.tabIndex = -1;
this.data_ = null;
+ this.removeAttribute('id');
},
/**
@@ -76,6 +81,8 @@ cr.define('ntp4', function() {
return;
}
+ var id = tileID++;
+ this.setAttribute('id', 'tile' + id);
this.data_ = data;
this.tabIndex = 0;
this.classList.remove('filler');
@@ -84,7 +91,7 @@ cr.define('ntp4', function() {
var faviconUrl = data.faviconUrl || 'chrome://favicon/' + data.url;
colorBar.style.backgroundImage = url(faviconUrl);
colorBar.dir = data.direction;
- // TODO(estade): add a band of color based on the favicon.
+ chrome.send('getFaviconDominantColor', [faviconUrl, id]);
var title = this.querySelector('.title');
title.textContent = data.title;
@@ -99,6 +106,11 @@ cr.define('ntp4', function() {
this.updatePinnedState_();
},
+ setBarColor: function(r, g, b) {
+ var color = 'rgb(' + r + ', ' + g + ', ' + b + ')';
+ // TODO(estade): use color.
+ },
+
/**
* Handles a click on the tile.
* @param {Event} e The click event.
@@ -359,8 +371,15 @@ cr.define('ntp4', function() {
return oldData;
};
+ function setFaviconDominantColor(id, r, g, b) {
+ var tile = $('tile' + id);
+ if (tile)
+ tile.setBarColor(r, g, b);
+ };
+
return {
MostVisitedPage: MostVisitedPage,
refreshData: refreshData,
+ setFaviconDominantColor: setFaviconDominantColor,
};
});
diff --git a/chrome/browser/ui/webui/ntp/favicon_webui_handler.cc b/chrome/browser/ui/webui/ntp/favicon_webui_handler.cc
new file mode 100644
index 0000000..a51c116
--- /dev/null
+++ b/chrome/browser/ui/webui/ntp/favicon_webui_handler.cc
@@ -0,0 +1,72 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/ntp/favicon_webui_handler.h"
+
+#include "base/callback.h"
+#include "base/string_util.h"
+#include "base/values.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/common/url_constants.h"
+#include "grit/app_resources.h"
+#include "third_party/skia/include/core/SkBitmap.h"
+#include "ui/gfx/codec/png_codec.h"
+#include "ui/gfx/color_analysis.h"
+
+FaviconWebUIHandler::FaviconWebUIHandler() {
+}
+
+FaviconWebUIHandler::~FaviconWebUIHandler() {
+}
+
+void FaviconWebUIHandler::RegisterMessages() {
+ web_ui_->RegisterMessageCallback("getFaviconDominantColor",
+ NewCallback(this, &FaviconWebUIHandler::HandleGetFaviconDominantColor));
+}
+
+void FaviconWebUIHandler::HandleGetFaviconDominantColor(const ListValue* args) {
+ std::string path;
+ CHECK(args->GetString(0, &path));
+ DCHECK(StartsWithASCII(path, "chrome://favicon/", false));
+ path = path.substr(arraysize("chrome://favicon/") - 1);
+
+ double id;
+ CHECK(args->GetDouble(1, &id));
+
+ FaviconService* favicon_service =
+ web_ui_->GetProfile()->GetFaviconService(Profile::EXPLICIT_ACCESS);
+ if (!favicon_service || path.empty())
+ return;
+
+ FaviconService::Handle handle = favicon_service->GetFaviconForURL(
+ GURL(path),
+ history::FAVICON,
+ &consumer_,
+ NewCallback(this, &FaviconWebUIHandler::OnFaviconDataAvailable));
+ consumer_.SetClientData(favicon_service, handle, static_cast<int>(id));
+}
+
+void FaviconWebUIHandler::OnFaviconDataAvailable(
+ FaviconService::Handle request_handle,
+ history::FaviconData favicon) {
+ FaviconService* favicon_service =
+ web_ui_->GetProfile()->GetFaviconService(Profile::EXPLICIT_ACCESS);
+ int id = consumer_.GetClientData(favicon_service, request_handle);
+
+ if (favicon.is_valid()) {
+ // TODO(estade): cache the response
+ FundamentalValue id_value(id);
+
+ color_utils::GridSampler sampler;
+ SkColor color =
+ color_utils::CalculateKMeanColorOfPNG(favicon.image_data, 100, 665,
+ sampler);
+ FundamentalValue r(static_cast<int>(SkColorGetR(color)));
+ FundamentalValue g(static_cast<int>(SkColorGetG(color)));
+ FundamentalValue b(static_cast<int>(SkColorGetB(color)));
+
+ web_ui_->CallJavascriptFunction("ntp4.setFaviconDominantColor",
+ id_value, r, g, b);
+ }
+}
diff --git a/chrome/browser/ui/webui/ntp/favicon_webui_handler.h b/chrome/browser/ui/webui/ntp/favicon_webui_handler.h
new file mode 100644
index 0000000..557cb96
--- /dev/null
+++ b/chrome/browser/ui/webui/ntp/favicon_webui_handler.h
@@ -0,0 +1,44 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_NTP_FAVICON_WEBUI_HANDLER_H_
+#define CHROME_BROWSER_UI_WEBUI_NTP_FAVICON_WEBUI_HANDLER_H_
+#pragma once
+
+#include <string>
+
+#include "base/basictypes.h"
+#include "base/memory/ref_counted.h"
+#include "chrome/browser/favicon/favicon_service.h"
+#include "content/browser/webui/web_ui.h"
+
+class GURL;
+class ListValue;
+class Profile;
+
+class FaviconWebUIHandler : public WebUIMessageHandler {
+ public:
+ FaviconWebUIHandler();
+ virtual ~FaviconWebUIHandler();
+
+ // WebUIMessageHandler
+ virtual void RegisterMessages();
+
+ void HandleGetFaviconDominantColor(const ListValue* args);
+
+ private:
+ // Called when favicon data is available from the history backend.
+ void OnFaviconDataAvailable(FaviconService::Handle request_handle,
+ history::FaviconData favicon);
+
+ CancelableRequestConsumerTSimple<int> consumer_;
+
+ // Raw PNG representation of the favicon to show when the favicon
+ // database doesn't have a favicon for a webpage.
+ scoped_refptr<RefCountedMemory> default_favicon_;
+
+ DISALLOW_COPY_AND_ASSIGN(FaviconWebUIHandler);
+};
+
+#endif // CHROME_BROWSER_UI_WEBUI_NTP_FAVICON_WEBUI_HANDLER_H_
diff --git a/chrome/browser/ui/webui/ntp/most_visited_handler.cc b/chrome/browser/ui/webui/ntp/most_visited_handler.cc
index 8d78c4a..a37d6ca 100644
--- a/chrome/browser/ui/webui/ntp/most_visited_handler.cc
+++ b/chrome/browser/ui/webui/ntp/most_visited_handler.cc
@@ -84,8 +84,6 @@ WebUIMessageHandler* MostVisitedHandler::Attach(WebUI* web_ui) {
}
void MostVisitedHandler::RegisterMessages() {
- // Register ourselves as the handler for the "getMostSisited" message from
- // Javascript.
web_ui_->RegisterMessageCallback("getMostVisited",
NewCallback(this, &MostVisitedHandler::HandleGetMostVisited));
diff --git a/chrome/browser/ui/webui/ntp/new_tab_ui.cc b/chrome/browser/ui/webui/ntp/new_tab_ui.cc
index 56e81f6..e7223f7 100644
--- a/chrome/browser/ui/webui/ntp/new_tab_ui.cc
+++ b/chrome/browser/ui/webui/ntp/new_tab_ui.cc
@@ -30,6 +30,7 @@
#include "chrome/browser/themes/theme_service_factory.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/webui/ntp/app_launcher_handler.h"
+#include "chrome/browser/ui/webui/ntp/favicon_webui_handler.h"
#include "chrome/browser/ui/webui/ntp/foreign_session_handler.h"
#include "chrome/browser/ui/webui/ntp/most_visited_handler.h"
#include "chrome/browser/ui/webui/ntp/new_tab_page_sync_handler.h"
@@ -347,7 +348,7 @@ NewTabUI::NewTabUI(TabContents* contents)
AddMessageHandler((new NTPLoginHandler())->Attach(this));
AddMessageHandler((new ShownSectionsHandler(pref_service))->Attach(this));
AddMessageHandler((new browser_sync::ForeignSessionHandler())->
- Attach(this));
+ Attach(this));
AddMessageHandler((new MostVisitedHandler())->Attach(this));
AddMessageHandler((new RecentlyClosedTabsHandler())->Attach(this));
AddMessageHandler((new MetricsHandler())->Attach(this));
@@ -361,6 +362,8 @@ NewTabUI::NewTabUI(TabContents* contents)
AddMessageHandler((new NewTabPageSetHomePageHandler())->Attach(this));
AddMessageHandler((new NewTabPageClosePromoHandler())->Attach(this));
+ if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kNewTabPage4))
+ AddMessageHandler((new FaviconWebUIHandler())->Attach(this));
}
// Initializing the CSS and HTML can require some CPU, so do it after
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index 6bcab16..a69aa2e 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -3355,6 +3355,8 @@
'browser/ui/webui/net_internals_ui.h',
'browser/ui/webui/ntp/app_launcher_handler.cc',
'browser/ui/webui/ntp/app_launcher_handler.h',
+ 'browser/ui/webui/ntp/favicon_webui_handler.cc',
+ 'browser/ui/webui/ntp/favicon_webui_handler.h',
'browser/ui/webui/ntp/foreign_session_handler.cc',
'browser/ui/webui/ntp/foreign_session_handler.h',
'browser/ui/webui/ntp/most_visited_handler.cc',