summaryrefslogtreecommitdiffstats
path: root/chrome/browser
diff options
context:
space:
mode:
authorbeng@google.com <beng@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2008-08-18 20:56:14 +0000
committerbeng@google.com <beng@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2008-08-18 20:56:14 +0000
commit54c2e1f9f389f089afcf0e12e5a2a0d5d6e7e509 (patch)
tree9461009430e409e153a2189a7f3ba1ab9b2a9ecd /chrome/browser
parent4fa725ecd63006b46f2693f219a10a7c62e1a617 (diff)
downloadchromium_src-54c2e1f9f389f089afcf0e12e5a2a0d5d6e7e509.zip
chromium_src-54c2e1f9f389f089afcf0e12e5a2a0d5d6e7e509.tar.gz
chromium_src-54c2e1f9f389f089afcf0e12e5a2a0d5d6e7e509.tar.bz2
Hook up the window icon for app windows, with a throbber etc.
Also add support for OTR icon.B=1031854 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@992 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser')
-rw-r--r--chrome/browser/tabs/tab_strip_model.h4
-rw-r--r--chrome/browser/views/frame/aero_glass_frame.cc8
-rw-r--r--chrome/browser/views/frame/aero_glass_frame.h3
-rw-r--r--chrome/browser/views/frame/browser_view2.cc26
-rw-r--r--chrome/browser/views/frame/browser_view2.h36
-rw-r--r--chrome/browser/views/frame/opaque_frame.cc12
-rw-r--r--chrome/browser/views/frame/opaque_frame.h3
-rw-r--r--chrome/browser/views/frame/opaque_non_client_view.cc87
-rw-r--r--chrome/browser/views/frame/opaque_non_client_view.h32
9 files changed, 174 insertions, 37 deletions
diff --git a/chrome/browser/tabs/tab_strip_model.h b/chrome/browser/tabs/tab_strip_model.h
index ab784d2..e7dc8a2 100644
--- a/chrome/browser/tabs/tab_strip_model.h
+++ b/chrome/browser/tabs/tab_strip_model.h
@@ -95,6 +95,10 @@ class TabStripModelObserver {
// The specified TabContents at |index| changed in some way.
virtual void TabChangedAt(TabContents* contents, int index) { }
// Loading progress representations for tabs should be validated/updated.
+ // TODO(beng): this wiring is cracktarded. consider revising. The loading
+ // animation timer should live in BrowserView2, and from there
+ // notify both the tabstrip and the window icon.
+ // clean this up once XPFrame and VistaFrame have retired.
virtual void TabValidateAnimations() { }
// The TabStripModel now no longer has any "significant" (user created or
// user manipulated) tabs. The implementer may use this as a trigger to try
diff --git a/chrome/browser/views/frame/aero_glass_frame.cc b/chrome/browser/views/frame/aero_glass_frame.cc
index 117ea52..a631020 100644
--- a/chrome/browser/views/frame/aero_glass_frame.cc
+++ b/chrome/browser/views/frame/aero_glass_frame.cc
@@ -115,6 +115,14 @@ ChromeViews::Window* AeroGlassFrame::GetWindow() {
}
///////////////////////////////////////////////////////////////////////////////
+// AeroGlassFrame, ChromeViews::Window overrides:
+
+void AeroGlassFrame::UpdateWindowIcon() {
+ Window::UpdateWindowIcon();
+ // TODO(beng): do something in the non-client view when this builds on Vista.
+}
+
+///////////////////////////////////////////////////////////////////////////////
// AeroGlassFrame, ChromeViews::HWNDViewContainer implementation:
LRESULT AeroGlassFrame::OnMouseActivate(HWND window, UINT hittest_code,
diff --git a/chrome/browser/views/frame/aero_glass_frame.h b/chrome/browser/views/frame/aero_glass_frame.h
index bbb5f8c..ed0cd2a 100644
--- a/chrome/browser/views/frame/aero_glass_frame.h
+++ b/chrome/browser/views/frame/aero_glass_frame.h
@@ -69,6 +69,9 @@ class AeroGlassFrame : public BrowserFrame,
virtual gfx::Rect GetBoundsForTabStrip(TabStrip* tabstrip) const;
virtual ChromeViews::Window* GetWindow();
+ // Overridden from ChromeViews::Window:
+ virtual void UpdateWindowIcon();
+
// Overridden from ChromeViews::HWNDViewContainer:
virtual bool AcceleratorPressed(ChromeViews::Accelerator* accelerator);
virtual bool GetAccelerator(int cmd_id,
diff --git a/chrome/browser/views/frame/browser_view2.cc b/chrome/browser/views/frame/browser_view2.cc
index 5db1c58..af62587 100644
--- a/chrome/browser/views/frame/browser_view2.cc
+++ b/chrome/browser/views/frame/browser_view2.cc
@@ -53,6 +53,7 @@
// static
SkBitmap BrowserView2::default_favicon_;
+SkBitmap BrowserView2::otr_avatar_;
static const int kToolbarTabStripVerticalOverlap = 3;
static const int kTabShadowSize = 2;
static const int kStatusBubbleHeight = 20;
@@ -132,6 +133,10 @@ gfx::Rect BrowserView2::GetClientAreaBounds() const {
return gfx::Rect(bounds);
}
+int BrowserView2::GetTabStripHeight() const {
+ return tabstrip_->GetPreferredHeight();
+}
+
bool BrowserView2::IsToolbarVisible() const {
return SupportsWindowFeature(FEATURE_TOOLBAR) ||
SupportsWindowFeature(FEATURE_LOCATIONBAR);
@@ -209,8 +214,16 @@ void BrowserView2::ActivationChanged(bool activated) {
browser_->WindowActivationChanged(activated);
}
-bool BrowserView2::SupportsWindowFeature(WindowFeature feature) const {
- return !!(FeaturesForBrowserType(browser_->GetType()) & feature);
+TabContents* BrowserView2::GetSelectedTabContents() const {
+ return browser_->GetSelectedTabContents();
+}
+
+SkBitmap BrowserView2::GetOTRAvatarIcon() {
+ if (otr_avatar_.isNull()) {
+ ResourceBundle& rb = ResourceBundle::GetSharedInstance();
+ otr_avatar_ = *rb.GetBitmapNamed(IDR_OTR_ICON);
+ }
+ return otr_avatar_;
}
void BrowserView2::PrepareToRunSystemMenu(Menu* menu) {
@@ -234,6 +247,10 @@ void BrowserView2::SystemMenuEnded() {
system_menu_.reset();
}
+bool BrowserView2::SupportsWindowFeature(WindowFeature feature) const {
+ return !!(FeaturesForBrowserType(browser_->GetType()) & feature);
+}
+
// static
unsigned int BrowserView2::FeaturesForBrowserType(BrowserType::Type type) {
unsigned int features = FEATURE_INFOBAR | FEATURE_DOWNLOADSHELF;
@@ -368,6 +385,7 @@ void BrowserView2::SetAcceleratorTable(
}
void BrowserView2::ValidateThrobber() {
+ frame_->GetWindow()->UpdateWindowIcon();
}
gfx::Rect BrowserView2::GetNormalBounds() {
@@ -860,8 +878,8 @@ void BrowserView2::LayoutStatusBubble(int top) {
bool BrowserView2::MaybeShowBookmarkBar(TabContents* contents) {
ChromeViews::View* new_bookmark_bar_view = NULL;
- if (SupportsWindowFeature(FEATURE_BOOKMARKBAR) &&
- (contents && contents->IsBookmarkBarAlwaysVisible() ||
+ if (SupportsWindowFeature(FEATURE_BOOKMARKBAR) && contents &&
+ (contents->IsBookmarkBarAlwaysVisible() ||
show_bookmark_bar_pref_.GetValue())) {
new_bookmark_bar_view = GetBookmarkBarView();
}
diff --git a/chrome/browser/views/frame/browser_view2.h b/chrome/browser/views/frame/browser_view2.h
index 312d710..903be7c 100644
--- a/chrome/browser/views/frame/browser_view2.h
+++ b/chrome/browser/views/frame/browser_view2.h
@@ -76,6 +76,10 @@ class BrowserView2 : public BrowserWindow,
// BrowserView2's parent.
gfx::Rect GetClientAreaBounds() const;
+ // Returns the preferred height of the TabStrip. Used to position the OTR
+ // avatar icon.
+ int GetTabStripHeight() const;
+
// Returns true if various window components are visible.
bool IsToolbarVisible() const;
bool IsTabStripVisible() const;
@@ -110,6 +114,26 @@ class BrowserView2 : public BrowserWindow,
// Called when the activation of the frame changes.
void ActivationChanged(bool activated);
+ // Returns the selected TabContents. Used by our NonClientView's
+ // TabIconView::TabContentsProvider implementations.
+ // TODO(beng): exposing this here is a bit bogus, since it's only used to
+ // determine loading state. It'd be nicer if we could change this to be
+ // bool IsSelectedTabLoading() const; or something like that. We could even
+ // move it to a WindowDelegate subclass.
+ TabContents* GetSelectedTabContents() const;
+
+ // Retrieves the icon to use in the frame to indicate an OTR window.
+ SkBitmap GetOTRAvatarIcon();
+
+ // Called right before displaying the system menu to allow the
+ // BrowserView to add or delete entries. BrowserView takes ownership
+ // of the passed in Menu object.
+ void PrepareToRunSystemMenu(Menu* menu);
+
+ // Called after the system menu has ended, and disposes of the
+ // current System menu object.
+ void SystemMenuEnded();
+
// Possible elements of the Browser window.
enum WindowFeature {
FEATURE_TITLEBAR = 1,
@@ -125,15 +149,6 @@ class BrowserView2 : public BrowserWindow,
// supports the specified feature.
bool SupportsWindowFeature(WindowFeature feature) const;
- // Called right before displaying the system menu to allow the
- // BrowserView to add or delete entries. BrowserView takes ownership
- // of the passed in Menu object.
- void PrepareToRunSystemMenu(Menu* menu);
-
- // Called after the system menu has ended, and disposes of the
- // current System menu object.
- void SystemMenuEnded();
-
// Returns the set of WindowFeatures supported by the specified BrowserType.
static unsigned int FeaturesForBrowserType(BrowserType::Type type);
@@ -347,6 +362,9 @@ class BrowserView2 : public BrowserWindow,
// Set of additional views drops are allowed on. We do NOT own these.
std::set<ChromeViews::View*> dropable_views_;
+ // The OTR avatar image.
+ static SkBitmap otr_avatar_;
+
DISALLOW_EVIL_CONSTRUCTORS(BrowserView2);
};
diff --git a/chrome/browser/views/frame/opaque_frame.cc b/chrome/browser/views/frame/opaque_frame.cc
index 56a26ad..f70eb31 100644
--- a/chrome/browser/views/frame/opaque_frame.cc
+++ b/chrome/browser/views/frame/opaque_frame.cc
@@ -39,8 +39,8 @@
// OpaqueFrame, public:
OpaqueFrame::OpaqueFrame(BrowserView2* browser_view)
- : CustomFrameWindow(browser_view, new OpaqueNonClientView(this,
- browser_view->IsOffTheRecord())),
+ : CustomFrameWindow(browser_view, new OpaqueNonClientView(
+ this, browser_view, browser_view->IsOffTheRecord())),
browser_view_(browser_view) {
browser_view_->set_frame(this);
}
@@ -88,6 +88,14 @@ ChromeViews::Window* OpaqueFrame::GetWindow() {
}
///////////////////////////////////////////////////////////////////////////////
+// OpaqueFrame, ChromeViews::CustomFrameWindow overrides:
+
+void OpaqueFrame::UpdateWindowIcon() {
+ CustomFrameWindow::UpdateWindowIcon();
+ GetOpaqueNonClientView()->UpdateWindowIcon();
+}
+
+///////////////////////////////////////////////////////////////////////////////
// OpaqueFrame, ChromeViews::HWNDViewContainer overrides:
bool OpaqueFrame::AcceleratorPressed(ChromeViews::Accelerator* accelerator) {
diff --git a/chrome/browser/views/frame/opaque_frame.h b/chrome/browser/views/frame/opaque_frame.h
index ebf6ce9..0d4a39c 100644
--- a/chrome/browser/views/frame/opaque_frame.h
+++ b/chrome/browser/views/frame/opaque_frame.h
@@ -69,6 +69,9 @@ class OpaqueFrame : public BrowserFrame,
virtual gfx::Rect GetBoundsForTabStrip(TabStrip* tabstrip) const;
virtual ChromeViews::Window* GetWindow();
+ // Overridden from ChromeViews::CustomFrameWindow:
+ virtual void UpdateWindowIcon();
+
// Overridden from ChromeViews::HWNDViewContainer:
virtual bool AcceleratorPressed(ChromeViews::Accelerator* accelerator);
virtual bool GetAccelerator(int cmd_id,
diff --git a/chrome/browser/views/frame/opaque_non_client_view.cc b/chrome/browser/views/frame/opaque_non_client_view.cc
index 235d901..505e367 100644
--- a/chrome/browser/views/frame/opaque_non_client_view.cc
+++ b/chrome/browser/views/frame/opaque_non_client_view.cc
@@ -31,6 +31,7 @@
#include "chrome/app/theme/theme_resources.h"
#include "chrome/browser/tabs/tab_strip.h"
+#include "chrome/browser/views/frame/browser_view2.h"
#include "chrome/common/gfx/chrome_canvas.h"
#include "chrome/common/gfx/chrome_font.h"
#include "chrome/common/gfx/path.h"
@@ -421,17 +422,27 @@ static const int kDistributorLogoHorizontalOffset = 7;
// The vertical distance of the top of the distributor logo from the top edge
// of the window.
static const int kDistributorLogoVerticalOffset = 3;
+// The distance from the left of the window of the OTR avatar icon.
+static const int kOTRAvatarIconMargin = 9;
+// The distance from the top of the window of the OTR avatar icon when the
+// window is maximized.
+static const int kNoTitleOTRZoomedTopSpacing = 3;
///////////////////////////////////////////////////////////////////////////////
// OpaqueNonClientView, public:
-OpaqueNonClientView::OpaqueNonClientView(OpaqueFrame* frame, bool is_otr)
+OpaqueNonClientView::OpaqueNonClientView(OpaqueFrame* frame,
+ BrowserView2* browser_view,
+ bool is_otr)
: NonClientView(),
minimize_button_(new ChromeViews::Button),
maximize_button_(new ChromeViews::Button),
restore_button_(new ChromeViews::Button),
close_button_(new ChromeViews::Button),
- frame_(frame) {
+ window_icon_(new TabIconView(this)),
+ frame_(frame),
+ browser_view_(browser_view),
+ is_otr_(is_otr) {
InitClass();
if (is_otr) {
if (!active_otr_resources_) {
@@ -494,6 +505,10 @@ OpaqueNonClientView::OpaqueNonClientView(OpaqueFrame* frame, bool is_otr)
resources->GetPartBitmap(FRAME_CLOSE_BUTTON_ICON_P));
close_button_->SetListener(this, -1);
AddChildView(close_button_);
+
+ window_icon_->set_is_light(true);
+ AddChildView(window_icon_);
+ window_icon_->Update();
}
OpaqueNonClientView::~OpaqueNonClientView() {
@@ -514,11 +529,26 @@ gfx::Rect OpaqueNonClientView::GetWindowBoundsForClientBounds(
gfx::Rect OpaqueNonClientView::GetBoundsForTabStrip(TabStrip* tabstrip) {
int tabstrip_height = tabstrip->GetPreferredHeight();
- int tabstrip_x = frame_->client_view()->GetX();
- return gfx::Rect(0, 0, minimize_button_->GetX() - tabstrip_x,
+ int tabstrip_x = otr_avatar_bounds_.right();
+ return gfx::Rect(tabstrip_x, 0, minimize_button_->GetX() - tabstrip_x,
tabstrip_height);
}
+void OpaqueNonClientView::UpdateWindowIcon() {
+ window_icon_->Update();
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// OpaqueNonClientView, TabIconView::TabContentsProvider implementation:
+
+TabContents* OpaqueNonClientView::GetCurrentTabContents() {
+ return browser_view_->GetSelectedTabContents();
+}
+
+SkBitmap OpaqueNonClientView::GetFavIcon() {
+ return frame_->window_delegate()->GetWindowIcon();
+}
+
///////////////////////////////////////////////////////////////////////////////
// OpaqueNonClientView, ChromeViews::BaseButton::ButtonListener implementation:
@@ -554,7 +584,8 @@ gfx::Size OpaqueNonClientView::CalculateWindowSizeForClientSize(
}
CPoint OpaqueNonClientView::GetSystemMenuPoint() const {
- CPoint system_menu_point(icon_bounds_.x(), icon_bounds_.bottom());
+ CPoint system_menu_point(window_icon_->GetX(),
+ window_icon_->GetY() + window_icon_->GetHeight());
MapWindowPoints(frame_->GetHWND(), HWND_DESKTOP, &system_menu_point, 1);
return system_menu_point;
}
@@ -582,11 +613,9 @@ int OpaqueNonClientView::NonClientHitTest(const gfx::Point& point) {
minimize_button_->GetBounds(&bounds, APPLY_MIRRORING_TRANSFORMATION);
if (bounds.PtInRect(test_point))
return HTMINBUTTON;
- /*
- system_menu_button_->GetBounds(&bounds, APPLY_MIRRORING_TRANSFORMATION);
+ window_icon_->GetBounds(&bounds, APPLY_MIRRORING_TRANSFORMATION);
if (bounds.PtInRect(test_point))
return HTSYSMENU;
- */
component = GetHTComponentForFrame(
point,
@@ -647,6 +676,7 @@ void OpaqueNonClientView::Paint(ChromeCanvas* canvas) {
} else {
PaintFrameBorder(canvas);
}
+ PaintOTRAvatar(canvas);
PaintDistributorLogo(canvas);
PaintTitleBar(canvas);
PaintToolbarBackground(canvas);
@@ -655,6 +685,7 @@ void OpaqueNonClientView::Paint(ChromeCanvas* canvas) {
void OpaqueNonClientView::Layout() {
LayoutWindowControls();
+ LayoutOTRAvatar();
LayoutDistributorLogo();
LayoutTitleBar();
LayoutClientView();
@@ -775,6 +806,13 @@ void OpaqueNonClientView::PaintMaximizedFrameBorder(ChromeCanvas* canvas) {
GetWidth(), bottom_edge->height());
}
+void OpaqueNonClientView::PaintOTRAvatar(ChromeCanvas* canvas) {
+ if (is_otr_) {
+ canvas->DrawBitmapInt(browser_view_->GetOTRAvatarIcon(),
+ otr_avatar_bounds_.x(), otr_avatar_bounds_.y());
+ }
+}
+
void OpaqueNonClientView::PaintDistributorLogo(ChromeCanvas* canvas) {
// The distributor logo is only painted when the frame is not maximized.
if (!frame_->IsMaximized() && !frame_->IsMinimized()) {
@@ -784,11 +822,8 @@ void OpaqueNonClientView::PaintDistributorLogo(ChromeCanvas* canvas) {
}
void OpaqueNonClientView::PaintTitleBar(ChromeCanvas* canvas) {
+ // The window icon is painted by the TabIconView.
ChromeViews::WindowDelegate* d = frame_->window_delegate();
- if (d->ShouldShowWindowIcon()) {
- canvas->DrawBitmapInt(d->GetWindowIcon(), icon_bounds_.x(),
- icon_bounds_.y());
- }
if (d->ShouldShowWindowTitle()) {
canvas->DrawStringInt(d->GetWindowTitle(),
resources()->GetTitleFont(),
@@ -956,6 +991,23 @@ void OpaqueNonClientView::LayoutWindowControls() {
}
}
+void OpaqueNonClientView::LayoutOTRAvatar() {
+ int otr_x = 0;
+ int top_spacing =
+ frame_->IsMaximized() ? kNoTitleOTRZoomedTopSpacing : kNoTitleTopSpacing;
+ int otr_y = browser_view_->GetTabStripHeight() + top_spacing;
+ int otr_width = 0;
+ int otr_height = 0;
+ if (is_otr_) {
+ SkBitmap otr_avatar_icon = browser_view_->GetOTRAvatarIcon();
+ otr_width = otr_avatar_icon.width();
+ otr_height = otr_avatar_icon.height();
+ otr_x = kOTRAvatarIconMargin;
+ otr_y -= otr_avatar_icon.height() + 2;
+ }
+ otr_avatar_bounds_.SetRect(otr_x, otr_y, otr_width, otr_height);
+}
+
void OpaqueNonClientView::LayoutDistributorLogo() {
int logo_w = distributor_logo_.width();
int logo_h = distributor_logo_.height();
@@ -971,21 +1023,22 @@ void OpaqueNonClientView::LayoutTitleBar() {
// Size the window icon, if visible.
if (d->ShouldShowWindowIcon()) {
- icon_bounds_.SetRect(kWindowIconLeftOffset, kWindowIconLeftOffset,
- kWindowIconSize, kWindowIconSize);
+ window_icon_->SetBounds(kWindowIconLeftOffset, kWindowIconLeftOffset,
+ kWindowIconSize, kWindowIconSize);
} else {
// Put the menu in the right place at least even if it is hidden so we
// can size the title based on its position.
- icon_bounds_.SetRect(kWindowIconLeftOffset, kWindowIconTopOffset, 0, 0);
+ window_icon_->SetBounds(kWindowIconLeftOffset, kWindowIconTopOffset, 0, 0);
}
// Size the title, if visible.
if (d->ShouldShowWindowTitle()) {
int spacing = d->ShouldShowWindowIcon() ? kWindowIconTitleSpacing : 0;
int title_right = minimize_button_->GetX();
- int title_left = icon_bounds_.right() + spacing;
+ int icon_right = window_icon_->GetX() + window_icon_->GetWidth();
+ int title_left = icon_right + spacing;
title_bounds_.SetRect(title_left, kTitleTopOffset + top_offset,
- std::max(0, static_cast<int>(title_right - icon_bounds_.right())),
+ std::max(0, static_cast<int>(title_right - icon_right)),
resources()->GetTitleFont().height());
}
}
diff --git a/chrome/browser/views/frame/opaque_non_client_view.h b/chrome/browser/views/frame/opaque_non_client_view.h
index 3290e26..309f58c 100644
--- a/chrome/browser/views/frame/opaque_non_client_view.h
+++ b/chrome/browser/views/frame/opaque_non_client_view.h
@@ -31,20 +31,26 @@
#define CHROME_BROWSER_VIEWS_FRAME_OPAQUE_NON_CLIENT_VIEW_H_
#include "chrome/browser/views/frame/opaque_frame.h"
+#include "chrome/browser/views/tab_icon_view.h"
#include "chrome/views/non_client_view.h"
#include "chrome/views/button.h"
+class BrowserView2;
class OpaqueFrame;
+class TabContents;
class TabStrip;
class WindowResources;
class OpaqueNonClientView : public ChromeViews::NonClientView,
- public ChromeViews::BaseButton::ButtonListener {
+ public ChromeViews::BaseButton::ButtonListener,
+ public TabIconView::TabContentsProvider {
public:
// Constructs a non-client view for an OpaqueFrame. |is_otr| specifies if the
// frame was created "off-the-record" and as such different bitmaps should be
// used to render the frame.
- OpaqueNonClientView(OpaqueFrame* frame, bool is_otr);
+ OpaqueNonClientView(OpaqueFrame* frame,
+ BrowserView2* browser_view,
+ bool is_otr);
virtual ~OpaqueNonClientView();
// Retrieve the bounds of the window for the specified contents bounds.
@@ -54,7 +60,14 @@ class OpaqueNonClientView : public ChromeViews::NonClientView,
// |tabstrip| will be laid out within.
gfx::Rect GetBoundsForTabStrip(TabStrip* tabstrip);
+ // Updates the window icon/throbber.
+ void UpdateWindowIcon();
+
protected:
+ // Overridden from TabIconView::TabContentsProvider:
+ virtual TabContents* GetCurrentTabContents();
+ virtual SkBitmap GetFavIcon();
+
// Overridden from ChromeViews::BaseButton::ButtonListener:
virtual void ButtonPressed(ChromeViews::BaseButton* sender);
@@ -89,6 +102,7 @@ class OpaqueNonClientView : public ChromeViews::NonClientView,
// Paint various sub-components of this view.
void PaintFrameBorder(ChromeCanvas* canvas);
void PaintMaximizedFrameBorder(ChromeCanvas* canvas);
+ void PaintOTRAvatar(ChromeCanvas* canvas);
void PaintDistributorLogo(ChromeCanvas* canvas);
void PaintTitleBar(ChromeCanvas* canvas);
void PaintToolbarBackground(ChromeCanvas* canvas);
@@ -96,6 +110,7 @@ class OpaqueNonClientView : public ChromeViews::NonClientView,
// Layout various sub-components of this view.
void LayoutWindowControls();
+ void LayoutOTRAvatar();
void LayoutDistributorLogo();
void LayoutTitleBar();
void LayoutClientView();
@@ -109,22 +124,29 @@ class OpaqueNonClientView : public ChromeViews::NonClientView,
// The layout rect of the title, if visible.
gfx::Rect title_bounds_;
- // The layout rect of the window icon, if visible.
- gfx::Rect icon_bounds_;
-
// The layout rect of the distributor logo, if visible.
gfx::Rect logo_bounds_;
+ // The layout rect of the OTR avatar icon, if visible.
+ gfx::Rect otr_avatar_bounds_;
+
// Window controls.
ChromeViews::Button* minimize_button_;
ChromeViews::Button* maximize_button_;
ChromeViews::Button* restore_button_;
ChromeViews::Button* close_button_;
+ // The Window icon.
+ TabIconView* window_icon_;
+
// The frame that hosts this view.
OpaqueFrame* frame_;
// The BrowserView hosted within this View.
+ BrowserView2* browser_view_;
+
+ // True if we are an OTR frame.
+ bool is_otr_;
// The resources currently used to paint this view.
WindowResources* current_active_resources_;