Commit 897d0428 authored by pkotwicz's avatar pkotwicz Committed by Commit bot

[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}
parent bd6b2977
...@@ -6,7 +6,6 @@ ...@@ -6,7 +6,6 @@
#include "athena/activity/public/activity_view_model.h" #include "athena/activity/public/activity_view_model.h"
#include "athena/wm/public/window_manager.h" #include "athena/wm/public/window_manager.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/base/hit_test.h" #include "ui/base/hit_test.h"
#include "ui/gfx/canvas.h" #include "ui/gfx/canvas.h"
#include "ui/gfx/image/image_skia.h" #include "ui/gfx/image/image_skia.h"
...@@ -25,7 +24,7 @@ namespace { ...@@ -25,7 +24,7 @@ namespace {
const int kIconSize = 32; const int kIconSize = 32;
// The distance between the icon and the title when the icon is visible. // 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. // The height of the top border necessary to display the title without the icon.
const int kDefaultTitleHeight = 25; const int kDefaultTitleHeight = 25;
...@@ -54,17 +53,11 @@ ActivityFrameView::ActivityFrameView(views::Widget* frame, ...@@ -54,17 +53,11 @@ ActivityFrameView::ActivityFrameView(views::Widget* frame,
in_overview_(false) { in_overview_(false) {
title_->SetEnabledColor(SkColorSetA(SK_ColorBLACK, 0xe5)); 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(title_);
AddChildView(icon_); AddChildView(icon_);
SkColor bgcolor = view_model_->GetRepresentativeColor();
set_background(views::Background::CreateSolidBackground(bgcolor));
UpdateWindowTitle(); UpdateWindowTitle();
UpdateWindowIcon();
WindowManager::GetInstance()->AddObserver(this); WindowManager::GetInstance()->AddObserver(this);
} }
...@@ -105,12 +98,14 @@ void ActivityFrameView::ResetWindowControls() { ...@@ -105,12 +98,14 @@ void ActivityFrameView::ResetWindowControls() {
} }
void ActivityFrameView::UpdateWindowIcon() { void ActivityFrameView::UpdateWindowIcon() {
if (!view_model_->UsesFrame()) // The activity has a frame in overview mode regardless of the value of
return; // ActivityViewModel::UsesFrame().
SkColor bgcolor = view_model_->GetRepresentativeColor(); SkColor bgcolor = view_model_->GetRepresentativeColor();
set_background(views::Background::CreateSolidBackground(bgcolor)); set_background(views::Background::CreateSolidBackground(bgcolor));
title_->SetBackgroundColor(bgcolor); title_->SetBackgroundColor(bgcolor);
if (view_model_->UsesFrame())
icon_->SetImage(view_model_->GetIcon());
SchedulePaint(); SchedulePaint();
} }
......
...@@ -55,7 +55,6 @@ class ActivityViewManagerImpl : public ActivityViewManager, ...@@ -55,7 +55,6 @@ class ActivityViewManagerImpl : public ActivityViewManager,
views::Widget* container = CreateWidget(activity); views::Widget* container = CreateWidget(activity);
container->AddObserver(this); container->AddObserver(this);
activity_widgets_[activity] = container; activity_widgets_[activity] = container;
container->UpdateWindowTitle();
container->Show(); container->Show();
container->Activate(); container->Activate();
// Call the Activity model's initializer. It might re-order the activity // Call the Activity model's initializer. It might re-order the activity
......
...@@ -38,6 +38,9 @@ class ATHENA_EXPORT ActivityViewModel { ...@@ -38,6 +38,9 @@ class ATHENA_EXPORT ActivityViewModel {
// Returns a title for the activity. // Returns a title for the activity.
virtual base::string16 GetTitle() const = 0; 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 // True if the activity wants to use Widget's frame, or false if the activity
// draws its own frame. // draws its own frame.
virtual bool UsesFrame() const = 0; virtual bool UsesFrame() const = 0;
......
...@@ -5,6 +5,7 @@ include_rules = [ ...@@ -5,6 +5,7 @@ include_rules = [
"+athena/input/public", "+athena/input/public",
"+athena/resource_manager/public", "+athena/resource_manager/public",
"+athena/wm/public", "+athena/wm/public",
"+components/favicon_base",
"+components/renderer_context_menu", "+components/renderer_context_menu",
"+components/web_modal", "+components/web_modal",
"+content/public", "+content/public",
......
...@@ -110,6 +110,10 @@ base::string16 AppActivity::GetTitle() const { ...@@ -110,6 +110,10 @@ base::string16 AppActivity::GetTitle() const {
return web_view_->GetWebContents()->GetTitle(); return web_view_->GetWebContents()->GetTitle();
} }
gfx::ImageSkia AppActivity::GetIcon() const {
return gfx::ImageSkia();
}
bool AppActivity::UsesFrame() const { bool AppActivity::UsesFrame() const {
return false; return false;
} }
......
...@@ -37,6 +37,7 @@ class AppActivity : public Activity, ...@@ -37,6 +37,7 @@ class AppActivity : public Activity,
virtual void Init() OVERRIDE; virtual void Init() OVERRIDE;
virtual SkColor GetRepresentativeColor() const OVERRIDE; virtual SkColor GetRepresentativeColor() const OVERRIDE;
virtual base::string16 GetTitle() const OVERRIDE; virtual base::string16 GetTitle() const OVERRIDE;
virtual gfx::ImageSkia GetIcon() const OVERRIDE;
virtual bool UsesFrame() const OVERRIDE; virtual bool UsesFrame() const OVERRIDE;
virtual views::View* GetContentsView() OVERRIDE; virtual views::View* GetContentsView() OVERRIDE;
virtual void CreateOverviewModeImage() OVERRIDE; virtual void CreateOverviewModeImage() OVERRIDE;
......
...@@ -76,6 +76,10 @@ base::string16 AppActivityProxy::GetTitle() const { ...@@ -76,6 +76,10 @@ base::string16 AppActivityProxy::GetTitle() const {
return title_; return title_;
} }
gfx::ImageSkia AppActivityProxy::GetIcon() const {
return gfx::ImageSkia();
}
bool AppActivityProxy::UsesFrame() const { bool AppActivityProxy::UsesFrame() const {
return true; return true;
} }
......
...@@ -41,6 +41,7 @@ class AppActivityProxy : public Activity, ...@@ -41,6 +41,7 @@ class AppActivityProxy : public Activity,
virtual void Init() OVERRIDE; virtual void Init() OVERRIDE;
virtual SkColor GetRepresentativeColor() const OVERRIDE; virtual SkColor GetRepresentativeColor() const OVERRIDE;
virtual base::string16 GetTitle() const OVERRIDE; virtual base::string16 GetTitle() const OVERRIDE;
virtual gfx::ImageSkia GetIcon() const OVERRIDE;
virtual bool UsesFrame() const OVERRIDE; virtual bool UsesFrame() const OVERRIDE;
virtual views::View* GetContentsView() OVERRIDE; virtual views::View* GetContentsView() OVERRIDE;
virtual views::Widget* CreateWidget() OVERRIDE; virtual views::Widget* CreateWidget() OVERRIDE;
......
...@@ -11,11 +11,13 @@ ...@@ -11,11 +11,13 @@
#include "base/bind.h" #include "base/bind.h"
#include "base/command_line.h" #include "base/command_line.h"
#include "base/strings/utf_string_conversions.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/native_web_keyboard_event.h"
#include "content/public/browser/navigation_controller.h" #include "content/public/browser/navigation_controller.h"
#include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents.h"
#include "content/public/browser/web_contents_delegate.h" #include "content/public/browser/web_contents_delegate.h"
#include "content/public/common/content_switches.h" #include "content/public/common/content_switches.h"
#include "content/public/common/favicon_url.h"
#include "ui/aura/window.h" #include "ui/aura/window.h"
#include "ui/compositor/closure_animation_observer.h" #include "ui/compositor/closure_animation_observer.h"
#include "ui/compositor/scoped_layer_animation_settings.h" #include "ui/compositor/scoped_layer_animation_settings.h"
...@@ -146,6 +148,7 @@ class WebActivityController : public AcceleratorHandler { ...@@ -146,6 +148,7 @@ class WebActivityController : public AcceleratorHandler {
const SkColor kDefaultTitleColor = SkColorSetRGB(0xf2, 0xf2, 0xf2); const SkColor kDefaultTitleColor = SkColorSetRGB(0xf2, 0xf2, 0xf2);
const SkColor kDefaultUnavailableColor = SkColorSetRGB(0xbb, 0x77, 0x77); const SkColor kDefaultUnavailableColor = SkColorSetRGB(0xbb, 0x77, 0x77);
const int kIconSize = 32;
} // namespace } // namespace
...@@ -347,14 +350,16 @@ WebActivity::WebActivity(content::BrowserContext* browser_context, ...@@ -347,14 +350,16 @@ WebActivity::WebActivity(content::BrowserContext* browser_context,
url_(url), url_(url),
web_view_(NULL), web_view_(NULL),
title_color_(kDefaultTitleColor), title_color_(kDefaultTitleColor),
current_state_(ACTIVITY_UNLOADED) { current_state_(ACTIVITY_UNLOADED),
weak_ptr_factory_(this) {
} }
WebActivity::WebActivity(AthenaWebView* web_view) WebActivity::WebActivity(AthenaWebView* web_view)
: browser_context_(web_view->browser_context()), : browser_context_(web_view->browser_context()),
url_(web_view->GetWebContents()->GetURL()), url_(web_view->GetWebContents()->GetURL()),
web_view_(web_view), 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 // Transition to state ACTIVITY_INVISIBLE to perform the same setup steps
// as on new activities (namely adding a WebContentsObserver). // as on new activities (namely adding a WebContentsObserver).
SetCurrentState(ACTIVITY_INVISIBLE); SetCurrentState(ACTIVITY_INVISIBLE);
...@@ -436,7 +441,6 @@ void WebActivity::Init() { ...@@ -436,7 +441,6 @@ void WebActivity::Init() {
} }
SkColor WebActivity::GetRepresentativeColor() const { SkColor WebActivity::GetRepresentativeColor() const {
// TODO(sad): Compute the color from the favicon.
return web_view_ ? title_color_ : kDefaultUnavailableColor; return web_view_ ? title_color_ : kDefaultUnavailableColor;
} }
...@@ -449,6 +453,10 @@ base::string16 WebActivity::GetTitle() const { ...@@ -449,6 +453,10 @@ base::string16 WebActivity::GetTitle() const {
: base::string16(); : base::string16();
} }
gfx::ImageSkia WebActivity::GetIcon() const {
return icon_;
}
bool WebActivity::UsesFrame() const { bool WebActivity::UsesFrame() const {
return true; return true;
} }
...@@ -500,8 +508,43 @@ void WebActivity::TitleWasSet(content::NavigationEntry* entry, ...@@ -500,8 +508,43 @@ void WebActivity::TitleWasSet(content::NavigationEntry* entry,
ActivityManager::Get()->UpdateActivity(this); 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( void WebActivity::DidUpdateFaviconURL(
const std::vector<content::FaviconURL>& candidates) { 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); ActivityManager::Get()->UpdateActivity(this);
} }
......
...@@ -5,17 +5,26 @@ ...@@ -5,17 +5,26 @@
#ifndef ATHENA_CONTENT_PUBLIC_WEB_ACTIVITY_H_ #ifndef ATHENA_CONTENT_PUBLIC_WEB_ACTIVITY_H_
#define 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.h"
#include "athena/activity/public/activity_view_model.h" #include "athena/activity/public/activity_view_model.h"
#include "base/memory/weak_ptr.h"
#include "base/strings/string16.h" #include "base/strings/string16.h"
#include "content/public/browser/web_contents_observer.h" #include "content/public/browser/web_contents_observer.h"
#include "ui/gfx/image/image_skia.h" #include "ui/gfx/image/image_skia.h"
class SkBitmap;
namespace content { namespace content {
class BrowserContext; class BrowserContext;
class WebContents; class WebContents;
} }
namespace gfx {
class Size;
}
namespace views { namespace views {
class WebView; class WebView;
class WidgetDelegate; class WidgetDelegate;
...@@ -49,6 +58,7 @@ class WebActivity : public Activity, ...@@ -49,6 +58,7 @@ class WebActivity : public Activity,
virtual void Init() OVERRIDE; virtual void Init() OVERRIDE;
virtual SkColor GetRepresentativeColor() const OVERRIDE; virtual SkColor GetRepresentativeColor() const OVERRIDE;
virtual base::string16 GetTitle() const OVERRIDE; virtual base::string16 GetTitle() const OVERRIDE;
virtual gfx::ImageSkia GetIcon() const OVERRIDE;
virtual bool UsesFrame() const OVERRIDE; virtual bool UsesFrame() const OVERRIDE;
virtual views::View* GetContentsView() OVERRIDE; virtual views::View* GetContentsView() OVERRIDE;
virtual views::Widget* CreateWidget() OVERRIDE; virtual views::Widget* CreateWidget() OVERRIDE;
...@@ -58,6 +68,9 @@ class WebActivity : public Activity, ...@@ -58,6 +68,9 @@ class WebActivity : public Activity,
virtual void ResetContentsView() OVERRIDE; virtual void ResetContentsView() OVERRIDE;
// content::WebContentsObserver: // content::WebContentsObserver:
virtual void DidNavigateMainFrame(
const content::LoadCommittedDetails& details,
const content::FrameNavigateParams& params) OVERRIDE;
virtual void TitleWasSet(content::NavigationEntry* entry, virtual void TitleWasSet(content::NavigationEntry* entry,
bool explicit_set) OVERRIDE; bool explicit_set) OVERRIDE;
virtual void DidUpdateFaviconURL( virtual void DidUpdateFaviconURL(
...@@ -65,6 +78,15 @@ class WebActivity : public Activity, ...@@ -65,6 +78,15 @@ class WebActivity : public Activity,
virtual void DidChangeThemeColor(SkColor theme_color) OVERRIDE; virtual void DidChangeThemeColor(SkColor theme_color) OVERRIDE;
private: 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 // Make the content visible. This call should only be paired with
// MakeInvisible. Note: Upon object creation the content is visible. // MakeInvisible. Note: Upon object creation the content is visible.
void MakeVisible(); void MakeVisible();
...@@ -78,6 +100,7 @@ class WebActivity : public Activity, ...@@ -78,6 +100,7 @@ class WebActivity : public Activity,
content::BrowserContext* browser_context_; content::BrowserContext* browser_context_;
const base::string16 title_; const base::string16 title_;
gfx::ImageSkia icon_;
const GURL url_; const GURL url_;
AthenaWebView* web_view_; AthenaWebView* web_view_;
SkColor title_color_; SkColor title_color_;
...@@ -88,6 +111,8 @@ class WebActivity : public Activity, ...@@ -88,6 +111,8 @@ class WebActivity : public Activity,
// The image which will be used in overview mode. // The image which will be used in overview mode.
gfx::ImageSkia overview_mode_image_; gfx::ImageSkia overview_mode_image_;
base::WeakPtrFactory<WebActivity> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(WebActivity); DISALLOW_COPY_AND_ASSIGN(WebActivity);
}; };
......
...@@ -51,6 +51,7 @@ class TestActivity : public Activity, ...@@ -51,6 +51,7 @@ class TestActivity : public Activity,
virtual void Init() OVERRIDE {} virtual void Init() OVERRIDE {}
virtual SkColor GetRepresentativeColor() const OVERRIDE { return 0; } virtual SkColor GetRepresentativeColor() const OVERRIDE { return 0; }
virtual base::string16 GetTitle() const OVERRIDE { return title_; } 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 bool UsesFrame() const OVERRIDE { return true; }
virtual views::View* GetContentsView() OVERRIDE { return view_; } virtual views::View* GetContentsView() OVERRIDE { return view_; }
virtual views::Widget* CreateWidget() OVERRIDE { return NULL; } virtual views::Widget* CreateWidget() OVERRIDE { return NULL; }
......
...@@ -60,6 +60,10 @@ base::string16 SampleActivity::GetTitle() const { ...@@ -60,6 +60,10 @@ base::string16 SampleActivity::GetTitle() const {
return title_; return title_;
} }
gfx::ImageSkia SampleActivity::GetIcon() const {
return gfx::ImageSkia();
}
bool SampleActivity::UsesFrame() const { bool SampleActivity::UsesFrame() const {
return true; return true;
} }
......
...@@ -34,6 +34,7 @@ class SampleActivity : public Activity, ...@@ -34,6 +34,7 @@ class SampleActivity : public Activity,
virtual void Init() OVERRIDE; virtual void Init() OVERRIDE;
virtual SkColor GetRepresentativeColor() const OVERRIDE; virtual SkColor GetRepresentativeColor() const OVERRIDE;
virtual base::string16 GetTitle() const OVERRIDE; virtual base::string16 GetTitle() const OVERRIDE;
virtual gfx::ImageSkia GetIcon() const OVERRIDE;
virtual bool UsesFrame() const OVERRIDE; virtual bool UsesFrame() const OVERRIDE;
virtual views::View* GetContentsView() OVERRIDE; virtual views::View* GetContentsView() OVERRIDE;
virtual views::Widget* CreateWidget() OVERRIDE; virtual views::Widget* CreateWidget() OVERRIDE;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment