Chromium Code Reviews| 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 { |