Index: chrome/renderer/chrome_render_view_observer.cc |
diff --git a/chrome/renderer/chrome_render_view_observer.cc b/chrome/renderer/chrome_render_view_observer.cc |
index e05503b55f318d3b8ff948e87e235070a8b740af..9c00a1033a3a25cbd5c9f8e6bae3040efdd1509d 100644 |
--- a/chrome/renderer/chrome_render_view_observer.cc |
+++ b/chrome/renderer/chrome_render_view_observer.cc |
@@ -7,6 +7,7 @@ |
#include "base/command_line.h" |
#include "base/message_loop.h" |
#include "base/metrics/histogram.h" |
+#include "chrome/common/chrome_constants.h" |
#include "chrome/common/chrome_switches.h" |
#include "chrome/common/icon_messages.h" |
#include "chrome/common/render_messages.h" |
@@ -50,6 +51,7 @@ |
using WebKit::WebCString; |
using WebKit::WebDataSource; |
using WebKit::WebFrame; |
+using WebKit::WebIconURL; |
using WebKit::WebPageSerializer; |
using WebKit::WebPageSerializerClient; |
using WebKit::WebRect; |
@@ -113,6 +115,20 @@ static double CalculateBoringScore(SkBitmap* bitmap) { |
return static_cast<double>(color_count) / pixel_count; |
} |
+static FaviconURL::IconType ToFaviconType(WebIconURL::Type type) { |
+ switch (type) { |
+ case WebIconURL::TypeFavicon : |
sky
2011/05/17 16:08:50
no spaces between type and colon (here and on all
|
+ return FaviconURL::FAVICON; |
+ case WebIconURL::TypeTouch : |
+ return FaviconURL::TOUCH_ICON; |
+ case WebIconURL::TypeTouchPrecomposed : |
+ return FaviconURL::TOUCH_PRECOMPOSED_ICON; |
+ case WebIconURL::TypeInvalid : |
+ return FaviconURL::INVALID_ICON; |
+ } |
+ return FaviconURL::INVALID_ICON; |
+} |
+ |
ChromeRenderViewObserver::ChromeRenderViewObserver( |
RenderView* render_view, |
ContentSettingsObserver* content_settings, |
@@ -390,22 +406,39 @@ void ChromeRenderViewObserver::DidStopLoading() { |
search_provider::AUTODETECTED_PROVIDER)); |
} |
- // TODO : Get both favicon and touch icon url, and send them to the browser. |
- GURL favicon_url(render_view()->webview()->mainFrame()->favIconURL()); |
- if (!favicon_url.is_empty()) { |
- std::vector<FaviconURL> urls; |
- urls.push_back(FaviconURL(favicon_url, FaviconURL::FAVICON)); |
+ int icon_types = WebIconURL::TypeFavicon; |
+ if (chrome::kEnableTouchIcon) |
+ icon_types |= WebIconURL::TypeTouchPrecomposed | WebIconURL::TypeTouch; |
+ |
+ WebVector<WebIconURL> icon_urls = |
+ render_view()->webview()->mainFrame()->iconURLs(icon_types); |
+ std::vector<FaviconURL> urls; |
+ for (size_t i = 0; i < icon_urls.size(); i++) { |
+ WebURL url = icon_urls[i].iconURL(); |
+ if (!url.isEmpty()) |
+ urls.push_back(FaviconURL(url, ToFaviconType(icon_urls[i].iconType()))); |
+ } |
+ if (!urls.empty()) { |
Send(new IconHostMsg_UpdateFaviconURL( |
routing_id(), render_view()->page_id(), urls)); |
} |
} |
-void ChromeRenderViewObserver::DidChangeIcons(WebFrame* frame) { |
+void ChromeRenderViewObserver::DidChangeIcon(WebFrame* frame, |
+ WebIconURL::Type icon_type) { |
if (frame->parent()) |
return; |
+ if (!chrome::kEnableTouchIcon && |
+ icon_type != WebIconURL::TypeFavicon) |
+ return; |
+ |
+ WebVector<WebIconURL> icon_urls = frame->iconURLs(icon_type); |
std::vector<FaviconURL> urls; |
- urls.push_back(FaviconURL(frame->favIconURL(), FaviconURL::FAVICON)); |
+ for (size_t i = 0; i < icon_urls.size(); i++) { |
+ urls.push_back(FaviconURL(icon_urls[i].iconURL(), |
+ ToFaviconType(icon_urls[i].iconType()))); |
+ } |
Send(new IconHostMsg_UpdateFaviconURL( |
routing_id(), render_view()->page_id(), urls)); |
} |