Index: chrome/browser/android/dev_tools_discovery_provider_android.cc |
diff --git a/chrome/browser/android/dev_tools_discovery_provider_android.cc b/chrome/browser/android/dev_tools_discovery_provider_android.cc |
index aea64f638149379b852504353c2ca554233a81de..b9dc247cc4dda673015a667d10ed83f729120f74 100644 |
--- a/chrome/browser/android/dev_tools_discovery_provider_android.cc |
+++ b/chrome/browser/android/dev_tools_discovery_provider_android.cc |
@@ -4,6 +4,7 @@ |
#include "chrome/browser/android/dev_tools_discovery_provider_android.h" |
+#include "base/base64.h" |
#include "base/basictypes.h" |
#include "base/bind.h" |
#include "base/compiler_specific.h" |
@@ -19,20 +20,14 @@ |
#include "content/public/browser/favicon_status.h" |
#include "content/public/browser/navigation_entry.h" |
#include "content/public/browser/web_contents.h" |
+#include "third_party/skia/include/core/SkBitmap.h" |
+#include "ui/gfx/codec/png_codec.h" |
using content::DevToolsAgentHost; |
using content::WebContents; |
namespace { |
-GURL GetFaviconURLForContents(WebContents* web_contents) { |
- content::NavigationController& controller = web_contents->GetController(); |
- content::NavigationEntry* entry = controller.GetActiveEntry(); |
- if (entry != NULL && entry->GetURL().is_valid()) |
- return entry->GetFavicon().url; |
- return GURL(); |
-} |
- |
class TabDescriptor : public devtools_discovery::DevToolsTargetDescriptor { |
public: |
static TabDescriptor* CreateForWebContents(int tab_id, |
@@ -138,14 +133,45 @@ class TabDescriptor : public devtools_discovery::DevToolsTargetDescriptor { |
: tab_id_(tab_id), |
title_(base::UTF16ToUTF8(web_contents->GetTitle())), |
url_(web_contents->GetURL()), |
- favicon_url_(GetFaviconURLForContents(web_contents)), |
+ favicon_url_(GetFaviconURL()), |
last_activity_time_(web_contents->GetLastActiveTime()) { |
} |
TabDescriptor(int tab_id, const base::string16& title, const GURL& url) |
: tab_id_(tab_id), |
title_(base::UTF16ToUTF8(title)), |
- url_(url) { |
+ url_(url), |
+ favicon_url_(GetFaviconURL()) { |
+ } |
+ |
+ GURL GetFaviconURL() { |
+ TabModel* model; |
+ int index; |
+ if (FindTab(&model, &index)) { |
+ if (TabAndroid* tab = model->GetTabAt(index)) { |
dgozman
2015/05/13 01:12:22
Let's have early return instead.
vkuzkokov
2015/05/13 16:40:56
Done.
|
+ SkBitmap bitmap = tab->GetFaviconBitmap(); |
+ if (bitmap.empty()) |
+ return GURL(); |
+ |
+ std::vector<unsigned char> data; |
+ SkAutoLockPixels lock_image(bitmap); |
+ bool encoded = gfx::PNGCodec::Encode( |
dgozman
2015/05/13 01:12:21
I don't like sync encoding on UI. Let's make GetFa
vkuzkokov
2015/05/13 16:40:56
With FastEncodeBGRASkBitmap it's 1ms per tab compa
dgozman
2015/05/13 21:58:04
You are right, it's just a small favicon.
|
+ reinterpret_cast<unsigned char*>(bitmap.getAddr32(0, 0)), |
+ gfx::PNGCodec::FORMAT_SkBitmap, |
+ gfx::Size(bitmap.width(), bitmap.height()), |
+ bitmap.width() * bitmap.bytesPerPixel(), |
+ false, std::vector<gfx::PNGCodec::Comment>(), &data); |
dgozman
2015/05/13 01:12:21
nit: one parameter per line?
vkuzkokov
2015/05/13 16:40:56
Done.
|
+ if (!encoded) |
+ return GURL(); |
+ |
+ std::string base_64_data; |
+ base::Base64Encode( |
+ base::StringPiece(reinterpret_cast<char*>(&data[0]), data.size()), |
+ &base_64_data); |
+ return GURL("data:image/png;base64," + base_64_data); |
+ } |
+ } |
+ return GURL(); |
} |
bool FindTab(TabModel** model_result, int* index_result) const { |