diff options
author | pkotwicz <pkotwicz@chromium.org> | 2014-09-11 09:23:03 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-09-11 16:28:05 +0000 |
commit | 897d04289e23b3d02ff4de08b9c327c3bb574324 (patch) | |
tree | e3379119d4d9d30c8b6eaa0a981a4303d34e8525 /athena | |
parent | bd6b2977815dfded89735335f0d63a0c382bd322 (diff) | |
download | chromium_src-897d04289e23b3d02ff4de08b9c327c3bb574324.zip chromium_src-897d04289e23b3d02ff4de08b9c327c3bb574324.tar.gz chromium_src-897d04289e23b3d02ff4de08b9c327c3bb574324.tar.bz2 |
[Athena] Hack to display favicons for web activities in overview mode.
BUG=411631
TEST=None
TBR=oshima,sadrul (TBR for changes to athena/content/DEPS)
Review URL: https://codereview.chromium.org/550643002
Cr-Commit-Position: refs/heads/master@{#294400}
Diffstat (limited to 'athena')
-rw-r--r-- | athena/activity/activity_frame_view.cc | 19 | ||||
-rw-r--r-- | athena/activity/activity_view_manager_impl.cc | 1 | ||||
-rw-r--r-- | athena/activity/public/activity_view_model.h | 3 | ||||
-rw-r--r-- | athena/content/DEPS | 1 | ||||
-rw-r--r-- | athena/content/app_activity.cc | 4 | ||||
-rw-r--r-- | athena/content/app_activity.h | 1 | ||||
-rw-r--r-- | athena/content/app_activity_proxy.cc | 4 | ||||
-rw-r--r-- | athena/content/app_activity_proxy.h | 1 | ||||
-rw-r--r-- | athena/content/web_activity.cc | 49 | ||||
-rw-r--r-- | athena/content/web_activity.h | 25 | ||||
-rw-r--r-- | athena/resource_manager/resource_manager_unittest.cc | 1 | ||||
-rw-r--r-- | athena/test/sample_activity.cc | 4 | ||||
-rw-r--r-- | athena/test/sample_activity.h | 1 |
13 files changed, 98 insertions, 16 deletions
diff --git a/athena/activity/activity_frame_view.cc b/athena/activity/activity_frame_view.cc index e0e6457..67cd024 100644 --- a/athena/activity/activity_frame_view.cc +++ b/athena/activity/activity_frame_view.cc @@ -6,7 +6,6 @@ #include "athena/activity/public/activity_view_model.h" #include "athena/wm/public/window_manager.h" -#include "third_party/skia/include/core/SkBitmap.h" #include "ui/base/hit_test.h" #include "ui/gfx/canvas.h" #include "ui/gfx/image/image_skia.h" @@ -25,7 +24,7 @@ namespace { const int kIconSize = 32; // The distance between the icon and the title when the icon is visible. -const int kIconTitleSpacing = 5; +const int kIconTitleSpacing = 10; // The height of the top border necessary to display the title without the icon. const int kDefaultTitleHeight = 25; @@ -54,17 +53,11 @@ ActivityFrameView::ActivityFrameView(views::Widget* frame, in_overview_(false) { title_->SetEnabledColor(SkColorSetA(SK_ColorBLACK, 0xe5)); - SkBitmap bitmap; - bitmap.allocN32Pixels(kIconSize, kIconSize); - bitmap.eraseARGB(255, 0, 255, 0); - icon_->SetImage(gfx::ImageSkia::CreateFrom1xBitmap(bitmap)); - AddChildView(title_); AddChildView(icon_); - SkColor bgcolor = view_model_->GetRepresentativeColor(); - set_background(views::Background::CreateSolidBackground(bgcolor)); UpdateWindowTitle(); + UpdateWindowIcon(); WindowManager::GetInstance()->AddObserver(this); } @@ -105,12 +98,14 @@ void ActivityFrameView::ResetWindowControls() { } void ActivityFrameView::UpdateWindowIcon() { - if (!view_model_->UsesFrame()) - return; - + // The activity has a frame in overview mode regardless of the value of + // ActivityViewModel::UsesFrame(). SkColor bgcolor = view_model_->GetRepresentativeColor(); set_background(views::Background::CreateSolidBackground(bgcolor)); title_->SetBackgroundColor(bgcolor); + + if (view_model_->UsesFrame()) + icon_->SetImage(view_model_->GetIcon()); SchedulePaint(); } diff --git a/athena/activity/activity_view_manager_impl.cc b/athena/activity/activity_view_manager_impl.cc index 240e5bd..129822e 100644 --- a/athena/activity/activity_view_manager_impl.cc +++ b/athena/activity/activity_view_manager_impl.cc @@ -55,7 +55,6 @@ class ActivityViewManagerImpl : public ActivityViewManager, views::Widget* container = CreateWidget(activity); container->AddObserver(this); activity_widgets_[activity] = container; - container->UpdateWindowTitle(); container->Show(); container->Activate(); // Call the Activity model's initializer. It might re-order the activity diff --git a/athena/activity/public/activity_view_model.h b/athena/activity/public/activity_view_model.h index 3406244..2621585 100644 --- a/athena/activity/public/activity_view_model.h +++ b/athena/activity/public/activity_view_model.h @@ -38,6 +38,9 @@ class ATHENA_EXPORT ActivityViewModel { // Returns a title for the activity. virtual base::string16 GetTitle() const = 0; + // Returns an icon for the activity. + virtual gfx::ImageSkia GetIcon() const = 0; + // True if the activity wants to use Widget's frame, or false if the activity // draws its own frame. virtual bool UsesFrame() const = 0; diff --git a/athena/content/DEPS b/athena/content/DEPS index 4412db7..ea0dc28 100644 --- a/athena/content/DEPS +++ b/athena/content/DEPS @@ -5,6 +5,7 @@ include_rules = [ "+athena/input/public", "+athena/resource_manager/public", "+athena/wm/public", + "+components/favicon_base", "+components/renderer_context_menu", "+components/web_modal", "+content/public", diff --git a/athena/content/app_activity.cc b/athena/content/app_activity.cc index c87ed61..4fb2045 100644 --- a/athena/content/app_activity.cc +++ b/athena/content/app_activity.cc @@ -110,6 +110,10 @@ base::string16 AppActivity::GetTitle() const { return web_view_->GetWebContents()->GetTitle(); } +gfx::ImageSkia AppActivity::GetIcon() const { + return gfx::ImageSkia(); +} + bool AppActivity::UsesFrame() const { return false; } diff --git a/athena/content/app_activity.h b/athena/content/app_activity.h index c721446..e3aaed3 100644 --- a/athena/content/app_activity.h +++ b/athena/content/app_activity.h @@ -37,6 +37,7 @@ class AppActivity : public Activity, virtual void Init() OVERRIDE; virtual SkColor GetRepresentativeColor() const OVERRIDE; virtual base::string16 GetTitle() const OVERRIDE; + virtual gfx::ImageSkia GetIcon() const OVERRIDE; virtual bool UsesFrame() const OVERRIDE; virtual views::View* GetContentsView() OVERRIDE; virtual void CreateOverviewModeImage() OVERRIDE; diff --git a/athena/content/app_activity_proxy.cc b/athena/content/app_activity_proxy.cc index 491aaef..2625ab7 100644 --- a/athena/content/app_activity_proxy.cc +++ b/athena/content/app_activity_proxy.cc @@ -76,6 +76,10 @@ base::string16 AppActivityProxy::GetTitle() const { return title_; } +gfx::ImageSkia AppActivityProxy::GetIcon() const { + return gfx::ImageSkia(); +} + bool AppActivityProxy::UsesFrame() const { return true; } diff --git a/athena/content/app_activity_proxy.h b/athena/content/app_activity_proxy.h index 0d18d7b..ab9e0fb 100644 --- a/athena/content/app_activity_proxy.h +++ b/athena/content/app_activity_proxy.h @@ -41,6 +41,7 @@ class AppActivityProxy : public Activity, virtual void Init() OVERRIDE; virtual SkColor GetRepresentativeColor() const OVERRIDE; virtual base::string16 GetTitle() const OVERRIDE; + virtual gfx::ImageSkia GetIcon() const OVERRIDE; virtual bool UsesFrame() const OVERRIDE; virtual views::View* GetContentsView() OVERRIDE; virtual views::Widget* CreateWidget() OVERRIDE; diff --git a/athena/content/web_activity.cc b/athena/content/web_activity.cc index 6d8b217..a169e24 100644 --- a/athena/content/web_activity.cc +++ b/athena/content/web_activity.cc @@ -11,11 +11,13 @@ #include "base/bind.h" #include "base/command_line.h" #include "base/strings/utf_string_conversions.h" +#include "components/favicon_base/select_favicon_frames.h" #include "content/public/browser/native_web_keyboard_event.h" #include "content/public/browser/navigation_controller.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents_delegate.h" #include "content/public/common/content_switches.h" +#include "content/public/common/favicon_url.h" #include "ui/aura/window.h" #include "ui/compositor/closure_animation_observer.h" #include "ui/compositor/scoped_layer_animation_settings.h" @@ -146,6 +148,7 @@ class WebActivityController : public AcceleratorHandler { const SkColor kDefaultTitleColor = SkColorSetRGB(0xf2, 0xf2, 0xf2); const SkColor kDefaultUnavailableColor = SkColorSetRGB(0xbb, 0x77, 0x77); +const int kIconSize = 32; } // namespace @@ -347,14 +350,16 @@ WebActivity::WebActivity(content::BrowserContext* browser_context, url_(url), web_view_(NULL), title_color_(kDefaultTitleColor), - current_state_(ACTIVITY_UNLOADED) { + current_state_(ACTIVITY_UNLOADED), + weak_ptr_factory_(this) { } WebActivity::WebActivity(AthenaWebView* web_view) : browser_context_(web_view->browser_context()), url_(web_view->GetWebContents()->GetURL()), web_view_(web_view), - current_state_(ACTIVITY_UNLOADED) { + current_state_(ACTIVITY_UNLOADED), + weak_ptr_factory_(this) { // Transition to state ACTIVITY_INVISIBLE to perform the same setup steps // as on new activities (namely adding a WebContentsObserver). SetCurrentState(ACTIVITY_INVISIBLE); @@ -436,7 +441,6 @@ void WebActivity::Init() { } SkColor WebActivity::GetRepresentativeColor() const { - // TODO(sad): Compute the color from the favicon. return web_view_ ? title_color_ : kDefaultUnavailableColor; } @@ -449,6 +453,10 @@ base::string16 WebActivity::GetTitle() const { : base::string16(); } +gfx::ImageSkia WebActivity::GetIcon() const { + return icon_; +} + bool WebActivity::UsesFrame() const { return true; } @@ -500,8 +508,43 @@ void WebActivity::TitleWasSet(content::NavigationEntry* entry, ActivityManager::Get()->UpdateActivity(this); } +void WebActivity::DidNavigateMainFrame( + const content::LoadCommittedDetails& details, + const content::FrameNavigateParams& params) { + // Prevent old image requests from calling back to OnDidDownloadFavicon(). + weak_ptr_factory_.InvalidateWeakPtrs(); + + icon_ = gfx::ImageSkia(); + ActivityManager::Get()->UpdateActivity(this); +} + void WebActivity::DidUpdateFaviconURL( const std::vector<content::FaviconURL>& candidates) { + // Pick an arbitrary favicon of type FAVICON to use. + // TODO(pkotwicz): Do something better once the favicon code is componentized. + // (crbug.com/401997) + weak_ptr_factory_.InvalidateWeakPtrs(); + for (size_t i = 0; i < candidates.size(); ++i) { + if (candidates[i].icon_type == content::FaviconURL::FAVICON) { + web_view_->GetWebContents()->DownloadImage( + candidates[i].icon_url, + true, + 0, + base::Bind(&WebActivity::OnDidDownloadFavicon, + weak_ptr_factory_.GetWeakPtr())); + break; + } + } +} + +void WebActivity::OnDidDownloadFavicon( + int id, + int http_status_code, + const GURL& url, + const std::vector<SkBitmap>& bitmaps, + const std::vector<gfx::Size>& original_bitmap_sizes) { + icon_ = CreateFaviconImageSkia( + bitmaps, original_bitmap_sizes, kIconSize, NULL); ActivityManager::Get()->UpdateActivity(this); } diff --git a/athena/content/web_activity.h b/athena/content/web_activity.h index 4200e84..ddd833c 100644 --- a/athena/content/web_activity.h +++ b/athena/content/web_activity.h @@ -5,17 +5,26 @@ #ifndef ATHENA_CONTENT_PUBLIC_WEB_ACTIVITY_H_ #define ATHENA_CONTENT_PUBLIC_WEB_ACTIVITY_H_ +#include <vector> + #include "athena/activity/public/activity.h" #include "athena/activity/public/activity_view_model.h" +#include "base/memory/weak_ptr.h" #include "base/strings/string16.h" #include "content/public/browser/web_contents_observer.h" #include "ui/gfx/image/image_skia.h" +class SkBitmap; + namespace content { class BrowserContext; class WebContents; } +namespace gfx { +class Size; +} + namespace views { class WebView; class WidgetDelegate; @@ -49,6 +58,7 @@ class WebActivity : public Activity, virtual void Init() OVERRIDE; virtual SkColor GetRepresentativeColor() const OVERRIDE; virtual base::string16 GetTitle() const OVERRIDE; + virtual gfx::ImageSkia GetIcon() const OVERRIDE; virtual bool UsesFrame() const OVERRIDE; virtual views::View* GetContentsView() OVERRIDE; virtual views::Widget* CreateWidget() OVERRIDE; @@ -58,6 +68,9 @@ class WebActivity : public Activity, virtual void ResetContentsView() OVERRIDE; // content::WebContentsObserver: + virtual void DidNavigateMainFrame( + const content::LoadCommittedDetails& details, + const content::FrameNavigateParams& params) OVERRIDE; virtual void TitleWasSet(content::NavigationEntry* entry, bool explicit_set) OVERRIDE; virtual void DidUpdateFaviconURL( @@ -65,6 +78,15 @@ class WebActivity : public Activity, virtual void DidChangeThemeColor(SkColor theme_color) OVERRIDE; private: + // Called when a favicon download initiated in DidUpdateFaviconURL() + // has completed. + void OnDidDownloadFavicon( + int id, + int http_status_code, + const GURL& url, + const std::vector<SkBitmap>& bitmaps, + const std::vector<gfx::Size>& original_bitmap_sizes); + // Make the content visible. This call should only be paired with // MakeInvisible. Note: Upon object creation the content is visible. void MakeVisible(); @@ -78,6 +100,7 @@ class WebActivity : public Activity, content::BrowserContext* browser_context_; const base::string16 title_; + gfx::ImageSkia icon_; const GURL url_; AthenaWebView* web_view_; SkColor title_color_; @@ -88,6 +111,8 @@ class WebActivity : public Activity, // The image which will be used in overview mode. gfx::ImageSkia overview_mode_image_; + base::WeakPtrFactory<WebActivity> weak_ptr_factory_; + DISALLOW_COPY_AND_ASSIGN(WebActivity); }; diff --git a/athena/resource_manager/resource_manager_unittest.cc b/athena/resource_manager/resource_manager_unittest.cc index ccc89f8..5f35d57 100644 --- a/athena/resource_manager/resource_manager_unittest.cc +++ b/athena/resource_manager/resource_manager_unittest.cc @@ -51,6 +51,7 @@ class TestActivity : public Activity, virtual void Init() OVERRIDE {} virtual SkColor GetRepresentativeColor() const OVERRIDE { return 0; } virtual base::string16 GetTitle() const OVERRIDE { return title_; } + virtual gfx::ImageSkia GetIcon() const OVERRIDE { return gfx::ImageSkia(); } virtual bool UsesFrame() const OVERRIDE { return true; } virtual views::View* GetContentsView() OVERRIDE { return view_; } virtual views::Widget* CreateWidget() OVERRIDE { return NULL; } diff --git a/athena/test/sample_activity.cc b/athena/test/sample_activity.cc index 10bf263..a77e194 100644 --- a/athena/test/sample_activity.cc +++ b/athena/test/sample_activity.cc @@ -60,6 +60,10 @@ base::string16 SampleActivity::GetTitle() const { return title_; } +gfx::ImageSkia SampleActivity::GetIcon() const { + return gfx::ImageSkia(); +} + bool SampleActivity::UsesFrame() const { return true; } diff --git a/athena/test/sample_activity.h b/athena/test/sample_activity.h index 01706ca..989aca9 100644 --- a/athena/test/sample_activity.h +++ b/athena/test/sample_activity.h @@ -34,6 +34,7 @@ class SampleActivity : public Activity, virtual void Init() OVERRIDE; virtual SkColor GetRepresentativeColor() const OVERRIDE; virtual base::string16 GetTitle() const OVERRIDE; + virtual gfx::ImageSkia GetIcon() const OVERRIDE; virtual bool UsesFrame() const OVERRIDE; virtual views::View* GetContentsView() OVERRIDE; virtual views::Widget* CreateWidget() OVERRIDE; |