diff options
author | beng@google.com <beng@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-08-18 20:56:14 +0000 |
---|---|---|
committer | beng@google.com <beng@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-08-18 20:56:14 +0000 |
commit | 54c2e1f9f389f089afcf0e12e5a2a0d5d6e7e509 (patch) | |
tree | 9461009430e409e153a2189a7f3ba1ab9b2a9ecd /chrome | |
parent | 4fa725ecd63006b46f2693f219a10a7c62e1a617 (diff) | |
download | chromium_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')
-rw-r--r-- | chrome/browser/tabs/tab_strip_model.h | 4 | ||||
-rw-r--r-- | chrome/browser/views/frame/aero_glass_frame.cc | 8 | ||||
-rw-r--r-- | chrome/browser/views/frame/aero_glass_frame.h | 3 | ||||
-rw-r--r-- | chrome/browser/views/frame/browser_view2.cc | 26 | ||||
-rw-r--r-- | chrome/browser/views/frame/browser_view2.h | 36 | ||||
-rw-r--r-- | chrome/browser/views/frame/opaque_frame.cc | 12 | ||||
-rw-r--r-- | chrome/browser/views/frame/opaque_frame.h | 3 | ||||
-rw-r--r-- | chrome/browser/views/frame/opaque_non_client_view.cc | 87 | ||||
-rw-r--r-- | chrome/browser/views/frame/opaque_non_client_view.h | 32 |
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_; |