summaryrefslogtreecommitdiffstats
path: root/athena
diff options
context:
space:
mode:
authorpkotwicz <pkotwicz@chromium.org>2014-09-11 09:23:03 -0700
committerCommit bot <commit-bot@chromium.org>2014-09-11 16:28:05 +0000
commit897d04289e23b3d02ff4de08b9c327c3bb574324 (patch)
treee3379119d4d9d30c8b6eaa0a981a4303d34e8525 /athena
parentbd6b2977815dfded89735335f0d63a0c382bd322 (diff)
downloadchromium_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.cc19
-rw-r--r--athena/activity/activity_view_manager_impl.cc1
-rw-r--r--athena/activity/public/activity_view_model.h3
-rw-r--r--athena/content/DEPS1
-rw-r--r--athena/content/app_activity.cc4
-rw-r--r--athena/content/app_activity.h1
-rw-r--r--athena/content/app_activity_proxy.cc4
-rw-r--r--athena/content/app_activity_proxy.h1
-rw-r--r--athena/content/web_activity.cc49
-rw-r--r--athena/content/web_activity.h25
-rw-r--r--athena/resource_manager/resource_manager_unittest.cc1
-rw-r--r--athena/test/sample_activity.cc4
-rw-r--r--athena/test/sample_activity.h1
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;