diff options
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/browser/browser_resources.grd | 2 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_host.cc | 65 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_host.h | 3 | ||||
-rw-r--r-- | chrome/browser/renderer_host/render_view_host.cc | 14 | ||||
-rw-r--r-- | chrome/browser/renderer_host/render_view_host.h | 6 | ||||
-rw-r--r-- | chrome/browser/resources/extensions_toolstrip.css | 10 | ||||
-rw-r--r-- | chrome/browser/views/bookmark_bar_view.cc | 43 | ||||
-rw-r--r-- | chrome/browser/views/bookmark_bar_view.h | 21 | ||||
-rw-r--r-- | chrome/browser/views/extensions/extension_shelf.cc | 257 | ||||
-rw-r--r-- | chrome/browser/views/extensions/extension_shelf.h | 41 | ||||
-rw-r--r-- | chrome/browser/views/frame/browser_view.cc | 275 | ||||
-rw-r--r-- | chrome/browser/views/frame/browser_view.h | 3 | ||||
-rw-r--r-- | chrome/chrome.gyp | 4 | ||||
-rw-r--r-- | chrome/common/render_messages_internal.h | 5 | ||||
-rw-r--r-- | chrome/renderer/render_view.cc | 10 | ||||
-rw-r--r-- | chrome/renderer/render_view.h | 10 | ||||
-rw-r--r-- | chrome/renderer/user_script_slave.cc | 2 |
17 files changed, 284 insertions, 487 deletions
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd index 15777e7..44ea2c3 100644 --- a/chrome/browser/browser_resources.grd +++ b/chrome/browser/browser_resources.grd @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- This comment is only here because changes to resources are not picked up -without changes to the corresponding grd file. mp2 --> +without changes to the corresponding grd file. fb01 --> <grit latest_public_release="0" current_release="1"> <outputs> <output filename="grit/browser_resources.h" type="rc_header"> diff --git a/chrome/browser/extensions/extension_host.cc b/chrome/browser/extensions/extension_host.cc index c483070..2a19667 100644 --- a/chrome/browser/extensions/extension_host.cc +++ b/chrome/browser/extensions/extension_host.cc @@ -8,6 +8,7 @@ #include "base/string_util.h" #include "chrome/browser/browser.h" #include "chrome/browser/browser_list.h" +#include "chrome/browser/browser_theme_provider.h" #include "chrome/browser/debugger/devtools_manager.h" #include "chrome/browser/extensions/extension_message_service.h" #include "chrome/browser/extensions/extension_tabs_module.h" @@ -36,6 +37,8 @@ using WebKit::WebDragOperationsMask; // static bool ExtensionHost::enable_dom_automation_ = false; +static const char* kToolstripTextColorSubstitution = "$TEXT_COLOR$"; + ExtensionHost::ExtensionHost(Extension* extension, SiteInstance* site_instance, const GURL& url, ViewType::Type host_type) : extension_(extension), @@ -150,33 +153,57 @@ void ExtensionHost::DidNavigate(RenderViewHost* render_view_host, new ExtensionFunctionDispatcher(render_view_host_, this, url_)); } -void ExtensionHost::DidStopLoading(RenderViewHost* render_view_host) { - static const base::StringPiece toolstrip_css( - ResourceBundle::GetSharedInstance().GetRawDataResource( - IDR_EXTENSIONS_TOOLSTRIP_CSS)); +void ExtensionHost::InsertCssIfToolstrip() { #if defined(TOOLKIT_VIEWS) ExtensionView* view = view_.get(); - if (view) { - // TODO(erikkay) this injection should really happen in the renderer. - // When the Jerry's view type change lands, investigate moving this there. - - // As a toolstrip, inject our toolstrip CSS to make it easier for toolstrips - // to blend in with the chrome UI. - if (view->is_toolstrip()) { - render_view_host->InsertCSSInWebFrame(L"", toolstrip_css.as_string()); - } else { - // No CSS injecting currently, but call SetDidInsertCSS to tell the view - // that it's OK to display. - view->SetDidInsertCSS(true); - } + if (!view) + return; + if (!view->is_toolstrip()) { + // No CSS injecting currently, but call SetDidInsertCSS to tell the view + // that it's OK to display. + view->SetDidInsertCSS(true); + return; } #elif defined(OS_LINUX) ExtensionViewGtk* view = view_.get(); - if (view && view->is_toolstrip()) { - render_view_host->InsertCSSInWebFrame(L"", toolstrip_css.as_string()); + if (!view || !view->is_toolstrip()) + return; +#endif + + static const base::StringPiece toolstrip_css( + ResourceBundle::GetSharedInstance().GetRawDataResource( + IDR_EXTENSIONS_TOOLSTRIP_CSS)); + + std::string css = toolstrip_css.as_string(); + ThemeProvider* theme_provider = + render_view_host()->process()->profile()->GetThemeProvider(); + + SkColor text_color = theme_provider ? + theme_provider->GetColor(BrowserThemeProvider::COLOR_BOOKMARK_TEXT) : + SK_ColorBLACK; + + std::string hex_color_string = StringPrintf( + "#%02x%02x%02x", SkColorGetR(text_color), + SkColorGetG(text_color), + SkColorGetB(text_color)); + size_t pos = css.find(kToolstripTextColorSubstitution); + while (pos != std::string::npos) { + css.replace(pos, 12, hex_color_string); + pos = css.find(kToolstripTextColorSubstitution); } + +#if defined(TOOLKIT_VIEWS) || defined(OS_LINUX) + // TODO(erikkay) this injection should really happen in the renderer. + // When the Jerry's view type change lands, investigate moving this there. + + // As a toolstrip, inject our toolstrip CSS to make it easier for toolstrips + // to blend in with the chrome UI. + render_view_host()->InsertCSSInWebFrame(L"", css, "ToolstripDefaultCss"); #endif +} +void ExtensionHost::DidStopLoading(RenderViewHost* render_view_host) { + InsertCssIfToolstrip(); if (!did_stop_loading_) { NotificationService::current()->Notify( NotificationType::EXTENSION_HOST_DID_STOP_LOADING, diff --git a/chrome/browser/extensions/extension_host.h b/chrome/browser/extensions/extension_host.h index 76c1014..b6e25e5 100644 --- a/chrome/browser/extensions/extension_host.h +++ b/chrome/browser/extensions/extension_host.h @@ -76,6 +76,9 @@ class ExtensionHost : public RenderViewHostDelegate, // Sets |url_| and navigates |render_view_host_|. void NavigateToURL(const GURL& url); + // Insert the CSS for a toolstrip. + void InsertCssIfToolstrip(); + // RenderViewHostDelegate implementation. virtual RenderViewHostDelegate::View* GetViewDelegate(); virtual const GURL& GetURL() const { return url_; } diff --git a/chrome/browser/renderer_host/render_view_host.cc b/chrome/browser/renderer_host/render_view_host.cc index bab8ac8..6d92b81 100644 --- a/chrome/browser/renderer_host/render_view_host.cc +++ b/chrome/browser/renderer_host/render_view_host.cc @@ -510,8 +510,10 @@ void RenderViewHost::ExecuteJavascriptInWebFrame( } void RenderViewHost::InsertCSSInWebFrame( - const std::wstring& frame_xpath, const std::string& css) { - Send(new ViewMsg_CSSInsertRequest(routing_id(), frame_xpath, css)); + const std::wstring& frame_xpath, + const std::string& css, + const std::string& id) { + Send(new ViewMsg_CSSInsertRequest(routing_id(), frame_xpath, css, id)); } void RenderViewHost::AddMessageToConsole( @@ -611,7 +613,7 @@ void RenderViewHost::JavaScriptMessageBoxClosed(IPC::Message* reply_msg, } void RenderViewHost::JavaScriptMessageBoxWindowDestroyed() { - ResetModalDialogEvent(); + ResetModalDialogEvent(); } void RenderViewHost::ModalHTMLDialogClosed(IPC::Message* reply_msg, @@ -1111,7 +1113,7 @@ void RenderViewHost::OnMsgFindReply(int request_id, void RenderViewHost::OnDeterminePageTextReply( const std::wstring& page_text) { -#if defined(OS_WIN) // Only for windows. +#if defined(OS_WIN) // Only for windows. int num_languages = 0; bool is_reliable = false; const char* language_iso_code = LanguageCodeISO639_1( @@ -1671,8 +1673,8 @@ void RenderViewHost::SignalModalDialogEvent() { } void RenderViewHost::ResetModalDialogEvent() { - if (--modal_dialog_count_ == 0) - modal_dialog_event_->Reset(); + if (--modal_dialog_count_ == 0) + modal_dialog_event_->Reset(); } void RenderViewHost::UpdateBrowserWindowId(int window_id) { diff --git a/chrome/browser/renderer_host/render_view_host.h b/chrome/browser/renderer_host/render_view_host.h index 5be72a4..30f9709 100644 --- a/chrome/browser/renderer_host/render_view_host.h +++ b/chrome/browser/renderer_host/render_view_host.h @@ -258,9 +258,11 @@ class RenderViewHost : public RenderWidgetHost, void ExecuteJavascriptInWebFrame(const std::wstring& frame_xpath, const std::wstring& jscript); - // Insert some css into a frame in the page. + // Insert some css into a frame in the page. |id| is optional, and specifies + // the element id given when inserting/replacing the style element. void InsertCSSInWebFrame(const std::wstring& frame_xpath, - const std::string& css); + const std::string& css, + const std::string& id); // Logs a message to the console of a frame in the page. void AddMessageToConsole(const string16& frame_xpath, diff --git a/chrome/browser/resources/extensions_toolstrip.css b/chrome/browser/resources/extensions_toolstrip.css index ee88de6..456978f 100644 --- a/chrome/browser/resources/extensions_toolstrip.css +++ b/chrome/browser/resources/extensions_toolstrip.css @@ -12,8 +12,7 @@ body { margin: 0; padding:0; font: menu; - color: #062D75; - text-shadow: #FFFFFF 1px 1px 0px; + color: $TEXT_COLOR$; -webkit-user-select:none; cursor:default; } @@ -53,8 +52,7 @@ div.toolstrip-button { border:6px solid transparent; font:menu; background:transparent; - color: #062D75; - text-shadow: #FFFFFF 1px 1px 0px; + color: $TEXT_COLOR$; line-height:100%; padding:0; } @@ -88,10 +86,10 @@ div.toolstrip-button>span { */ div.toolstrip-button:hover { border-width:6px; - -webkit-border-image:url(data:image/png;base64,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) 6 round round; + -webkit-border-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAaCAYAAACHD21cAAAAAXNSR0IArs4c6QAAAAZiS0dEAPYA+QD9Ry7YfAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9kJChUuJy+ouI4AAAFXSURBVDjL7dSxTsJQFIDh/95SmqpEYjASAgPGGI26wGv4BMbBVUZewBQfRBxAZ0cXG2d8AANoFEJgAGOAkqK31wEGJ23cTPiTs53vjEcAYj5RYAmwgAjQYlYG+AR8wAOmgAaQwLLjlHL1RrM4HI0rKtA1z1c1z1c1FejacDSu1BvNouOUcsAyIA3AcpzS7mmhcJxKpQ4Nw0yoQM9OAirQSCOSiMfjB3t7+6ux2ErHdd2BANbqjeZJNps9UsFs8adeX56rO9tbZQlYyWQyH4RAAIn1jTxgScCwbXsz0L8jANu2NwEjArSnn9okZEIIE2hL/tgCLuB/guloRHyEBVrrDyAtATWZTJ7CwvmukoDf7XYfpAgHe73uA+BLwKtWKu7bYHD/Gxr0+/fXV1UX8AwgcN2791hspZPJZIZm1Iqappn4DjzPe2y3W7eX5Yubc+fsEfDFXx/yF0HjkTNryckZAAAAAElFTkSuQmCC) 6 round round; } div.toolstrip-button:active { border-width:6px; - -webkit-border-image:url(data:image/png;base64,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) 6 round round; + -webkit-border-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAaCAYAAACHD21cAAAAAXNSR0IArs4c6QAAAAZiS0dEAPYA+QD9Ry7YfAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9kJChYWGmIZ9j0AAAGzSURBVDjLnZTBahNRFIa/c2+SyaRWBzddiBVCQ0Hqou67yCbgQnyC7NyluPUhHBCJeQLBVxDBbXwACY271iKBQBHbJE0nM3OPi9Q2qYqT+VeHyznn/89/7r2WBRhjSqpaBgTwgRRQ/gIB6HQ6prq1/ebx7u7+zQTVedbkfMLR4eHLrwe9V61WSwXgw8dP7Z1HO/t3bgfX7ZSlWFVJkoRe78vbOJq+KABsbj7YK3v+Ag1/xCJCsVikWt3au39vY874fTCM1m6tl6wxS/lyo4cAzrlZp/26bACMtSURIQtETMnzvAWKjLhSDjAYnmilsoZZYP2nVIVgvSzmcl+ZIUAYhiKAPxienOdhzIVc5oRhmMNVpwD+6lLnPsSrF+r1jFGOyqIBvByEkQGmOaR6udYhItOVr9z8V1DJO6MzQRBEUexms0Qzsjl837em2Wym4/G475zLVBhdTA9qtVpq2u327Pjb8fs0Sf/7MqJYOTs77TcaDbUAz54++awioqZ0V2xxI3UQp0qSKmmqJE4ZTyb9058/3j3crj6/+ld/o9vt2tFoVLHWXlweeQCFQmFSr9eXTPgFRPyveVqGdF0AAAAASUVORK5CYII=) 6 round round; } diff --git a/chrome/browser/views/bookmark_bar_view.cc b/chrome/browser/views/bookmark_bar_view.cc index 96dc4b7..24b287c 100644 --- a/chrome/browser/views/bookmark_bar_view.cc +++ b/chrome/browser/views/bookmark_bar_view.cc @@ -80,9 +80,6 @@ static SkBitmap* kFolderIcon = NULL; // Border colors for the BookmarBarView. static const SkColor kTopBorderColor = SkColorSetRGB(222, 234, 248); -// How round the 'new tab' style bookmarks bar is. -static const int kNewtabBarRoundness = 5; - // Offset for where the menu is shown relative to the bottom of the // BookmarkBarView. static const int kMenuOffset = 3; @@ -297,25 +294,10 @@ class BookmarkBarView::ButtonSeparatorView : public views::View { virtual ~ButtonSeparatorView() {} virtual void Paint(gfx::Canvas* canvas) { - SkPaint paint; - paint.setShader(skia::CreateGradientShader(0, - height() / 2, - kTopBorderColor, - kSeparatorColor))->safeUnref(); - SkRect rc = {SkIntToScalar(kSeparatorStartX), SkIntToScalar(0), - SkIntToScalar(1), SkIntToScalar(height() / 2) }; - canvas->drawRect(rc, paint); - - SkPaint paint_down; - paint_down.setShader(skia::CreateGradientShader(height() / 2, - height(), + DetachableToolbarView::PaintVerticalDivider( + canvas, kSeparatorStartX, height(), 1, kTopBorderColor, kSeparatorColor, - GetThemeProvider()->GetColor(BrowserThemeProvider::COLOR_TOOLBAR) - ))->safeUnref(); - SkRect rc_down = { - SkIntToScalar(kSeparatorStartX), SkIntToScalar(height() / 2), - SkIntToScalar(1), SkIntToScalar(height() - 1) }; - canvas->drawRect(rc_down, paint_down); + GetThemeProvider()->GetColor(BrowserThemeProvider::COLOR_TOOLBAR)); } virtual gfx::Size GetPreferredSize() { @@ -736,8 +718,8 @@ void BookmarkBarView::OnStateChanged() { // re-enter her password. If extension shelf appears along with the bookmark // shelf, it too needs to be layed out. Since both have the same parent, it is // enough to let the parent layout both of these children. - // TODO (sky): This should not require Layout() and SchedulePaint(). Needs - // some cleanup. + // TODO(sky): This should not require Layout() and SchedulePaint(). Needs + // some cleanup. PreferredSizeChanged(); Layout(); SchedulePaint(); @@ -751,15 +733,19 @@ void BookmarkBarView::OnFullscreenToggled(bool fullscreen) { size_animation_->Reset(0); } -bool BookmarkBarView::IsDetachedStyle() { +bool BookmarkBarView::IsDetached() const { return OnNewTabPage() && (size_animation_->GetCurrentValue() != 1); } -bool BookmarkBarView::IsAlwaysShown() { +bool BookmarkBarView::IsOnTop() const { + return true; +} + +bool BookmarkBarView::IsAlwaysShown() const { return profile_->GetPrefs()->GetBoolean(prefs::kShowBookmarkBar); } -bool BookmarkBarView::OnNewTabPage() { +bool BookmarkBarView::OnNewTabPage() const { return (browser_ && browser_->GetSelectedTabContents() && browser_->GetSelectedTabContents()->IsBookmarkBarAlwaysVisible()); } @@ -1090,7 +1076,7 @@ void BookmarkBarView::RunMenu(views::View* view, int x = view->GetX(APPLY_MIRRORING_TRANSFORMATION); int bar_height = height() - kMenuOffset; - if (IsDetachedStyle()) + if (IsDetached()) bar_height -= kNewtabVerticalPadding; int start_index = 0; @@ -1685,7 +1671,8 @@ gfx::Size BookmarkBarView::LayoutItems(bool compute_bounds_only) { if (should_show_sync_error_button) { x += kButtonPadding; if (!compute_bounds_only) { - sync_error_button_->SetBounds(x, y, sync_error_button_pref.width(), height); + sync_error_button_->SetBounds( + x, y, sync_error_button_pref.width(), height); sync_error_button_->SetVisible(true); } x += sync_error_button_pref.width(); diff --git a/chrome/browser/views/bookmark_bar_view.h b/chrome/browser/views/bookmark_bar_view.h index 06b44f2..20fcc07 100644 --- a/chrome/browser/views/bookmark_bar_view.h +++ b/chrome/browser/views/bookmark_bar_view.h @@ -11,6 +11,7 @@ #include "chrome/browser/extensions/extensions_service.h" #include "chrome/browser/sync/profile_sync_service.h" #include "chrome/browser/views/bookmark_menu_controller_views.h" +#include "chrome/browser/views/detachable_toolbar_view.h" #include "chrome/common/notification_registrar.h" #include "views/controls/button/menu_button.h" #include "views/controls/label.h" @@ -33,7 +34,7 @@ class MenuItemView; // BookmarkBarView shows the bookmarks from a specific Profile. BookmarkBarView // waits until the HistoryService for the profile has been loaded before // creating the BookmarkModel. -class BookmarkBarView : public views::View, +class BookmarkBarView : public DetachableToolbarView, #ifdef CHROME_PERSONALIZATION public ProfileSyncServiceObserver, #endif @@ -88,6 +89,13 @@ class BookmarkBarView : public views::View, // the bookmark bar. void SetPageNavigator(PageNavigator* navigator); + // DetachableToolbarView methods: + virtual bool IsDetached() const; + virtual bool IsOnTop() const; + virtual double GetAnimationValue() const { + return size_animation_->GetCurrentValue(); + } + // View methods: virtual gfx::Size GetPreferredSize(); virtual gfx::Size GetMinimumSize(); @@ -108,9 +116,6 @@ class BookmarkBarView : public views::View, virtual bool GetAccessibleName(std::wstring* name); virtual bool GetAccessibleRole(AccessibilityTypes::Role* role); virtual void SetAccessibleName(const std::wstring& name); - double GetSizeAnimationValue() const { - return size_animation_->GetCurrentValue(); - } #ifdef CHROME_PERSONALIZATION // ProfileSyncServiceObserver method. @@ -143,15 +148,11 @@ class BookmarkBarView : public views::View, // Returns the model. BookmarkModel* GetModel() { return model_; } - // Returns true if the bookmark bar is drawn detached from the toolbar. This - // can only be true when OnNewTabPage() is true (see below). - bool IsDetachedStyle(); - // Returns true if the bookmarks bar preference is set to 'always show'. - bool IsAlwaysShown(); + bool IsAlwaysShown() const; // True if we're on a page where the bookmarks bar is always visible. - bool OnNewTabPage(); + bool OnNewTabPage() const; // How much we want the bookmark bar to overlap the toolbar. If |return_max| // is true, we return the maximum overlap rather than the current overlap. diff --git a/chrome/browser/views/extensions/extension_shelf.cc b/chrome/browser/views/extensions/extension_shelf.cc index 8999434..2928f75 100644 --- a/chrome/browser/views/extensions/extension_shelf.cc +++ b/chrome/browser/views/extensions/extension_shelf.cc @@ -19,6 +19,7 @@ #include "chrome/browser/profile.h" #include "chrome/browser/tab_contents/tab_contents.h" #include "chrome/browser/views/extensions/extension_view.h" +#include "chrome/common/chrome_switches.h" #include "chrome/common/extensions/extension.h" #include "chrome/common/notification_service.h" #include "chrome/common/pref_names.h" @@ -45,7 +46,7 @@ static const int kToolstripDividerWidth = 2; static const int kShelfHeight = 29; // Preferred height of the Extension shelf when only shown on the new tab page. -const int kNewtabShelfHeight = 57; +const int kNewtabShelfHeight = 58; // How inset the extension shelf is when displayed on the new tab page. This is // in addition to the margins above. @@ -58,32 +59,18 @@ static const int kNewtabVerticalPadding = 12; static const int kNewtabExtraHorMargin = 2; static const int kNewtabExtraVerMargin = 2; -// How round the 'new tab' style extension shelf is. -static const int kNewtabBarRoundness = 5; - // Height of the toolstrip within the shelf. static const int kToolstripHeight = kShelfHeight - (kTopMargin + kBottomMargin); // Colors for the ExtensionShelf. -static const SkColor kBackgroundColor = SkColorSetRGB(230, 237, 244); -static const SkColor kBorderColor = SkColorSetRGB(201, 212, 225); static const SkColor kDividerHighlightColor = SkColorSetRGB(247, 250, 253); -// Text colors for the handle. -static const SkColor kHandleTextColor = SkColorSetRGB(6, 45, 117); -static const SkColor kHandleTextHighlightColor = - SkColorSetARGB(200, 255, 255, 255); - // Handle padding. static const int kHandlePadding = 4; -// TODO(erikkay) convert back to a gradient when Glen figures out the -// specs. -// static const SkColor kBackgroundColor = SkColorSetRGB(237, 244, 252); -// static const SkColor kTopGradientColor = SkColorSetRGB(222, 234, 248); - // Delays for showing and hiding the shelf handle. -static const int kHideDelayMs = 500; +static const int kShowDelayMs = 500; +static const int kHideDelayMs = 300; } // namespace @@ -122,7 +109,7 @@ class ExtensionShelf::Toolstrip : public views::View, // Convenience to calculate just the size of the handle. gfx::Size GetHandlePreferredSize(); - // View + // View methods: virtual void Paint(gfx::Canvas* canvas); virtual gfx::Size GetPreferredSize(); virtual void Layout(); @@ -255,9 +242,6 @@ ExtensionShelf::Toolstrip::Toolstrip(ExtensionShelf* shelf, // the various mouse events necessary for hovering and dragging. ResourceBundle& rb = ResourceBundle::GetSharedInstance(); title_.reset(new views::Label(name, rb.GetFont(ResourceBundle::BaseFont))); - title_->SetColor(kHandleTextColor); - title_->SetDrawHighlighted(true); - title_->SetHighlightColor(kHandleTextHighlightColor); title_->SetBounds(kHandlePadding, kHandlePadding, 100, 100); title_->SizeToPreferredSize(); @@ -270,14 +254,19 @@ ExtensionShelf::Toolstrip::~Toolstrip() { } void ExtensionShelf::Toolstrip::Paint(gfx::Canvas* canvas) { - canvas->FillRectInt(kBackgroundColor, 0, 0, width(), height()); - canvas->FillRectInt(kBorderColor, 0, 0, width(), 1); - canvas->FillRectInt(kBorderColor, 0, 0, 1, height() - 1); - canvas->FillRectInt(kBorderColor, width() - 1, 0, 1, height() - 1); + // Paints the handle for the toolstrip (only called on mouse-hover). + SkColor theme_toolbar_color = + shelf_->GetThemeProvider()->GetColor(BrowserThemeProvider::COLOR_TOOLBAR); + canvas->FillRectInt(theme_toolbar_color, 0, 0, width(), height()); + + SkColor border_color = ResourceBundle::toolbar_separator_color; + canvas->FillRectInt(border_color, 0, 0, width(), 1); + canvas->FillRectInt(border_color, 0, 0, 1, height() - 1); + canvas->FillRectInt(border_color, width() - 1, 0, 1, height() - 1); int ext_width = view()->width() + kToolstripPadding + kToolstripDividerWidth; if (ext_width < width()) { - canvas->FillRectInt(kBorderColor, ext_width, height() - 1, + canvas->FillRectInt(border_color, ext_width, height() - 1, width() - ext_width, 1); } @@ -286,8 +275,8 @@ void ExtensionShelf::Toolstrip::Paint(gfx::Canvas* canvas) { title_->ProcessPaint(canvas); if (dragging_) { - // when we're dragging, draw the bottom border. - canvas->FillRectInt(kBorderColor, 0, height() - 1, width(), 1); + // When we're dragging, draw the bottom border. + canvas->FillRectInt(border_color, 0, height() - 1, width(), 1); } } @@ -519,6 +508,11 @@ void ExtensionShelf::Toolstrip::AttachToShelf(bool browserAttach) { void ExtensionShelf::Toolstrip::DoShowShelfHandle() { GetHandle(); if (!handle_->visible()) { + // Make sure the text color for the title matches the theme colors. + title_->SetColor( + shelf_->GetThemeProvider()->GetColor( + BrowserThemeProvider::COLOR_BOOKMARK_TEXT)); + LayoutHandle(); handle_->Show(); } @@ -596,7 +590,7 @@ void ExtensionShelf::Toolstrip::ShowShelfHandle() { MessageLoop::current()->PostDelayedTask(FROM_HERE, timer_factory_.NewRunnableMethod( &ExtensionShelf::Toolstrip::DoShowShelfHandle), - 1000); + kShowDelayMs); } void ExtensionShelf::Toolstrip::HideShelfHandle(int delay_ms) { @@ -618,7 +612,9 @@ void ExtensionShelf::Toolstrip::HideShelfHandle(int delay_ms) { //////////////////////////////////////////////////////////////////////////////// ExtensionShelf::ExtensionShelf(Browser* browser) - : browser_(browser), + : background_needs_repaint_(true), + background_for_detached_(false), + browser_(browser), model_(browser->extension_shelf_model()) { model_->AddObserver(this); LoadFromModel(); @@ -645,95 +641,27 @@ ExtensionShelf::~ExtensionShelf() { } } -void ExtensionShelf::Paint(gfx::Canvas* canvas) { - if (IsDetachedStyle()) { - // Draw the background to match the new tab page. - ThemeProvider* tp = GetThemeProvider(); - canvas->FillRectInt( - tp->GetColor(BrowserThemeProvider::COLOR_NTP_BACKGROUND), - 0, 0, width(), height()); - - // As 'hidden' according to the animation is the full in-tab state, - // we invert the value - when current_state is at '0', we expect the - // shelf to be docked. - double current_state = 1 - size_animation_->GetCurrentValue(); - - // The 0.5 is to correct for Skia's "draw on pixel boundaries"ness. - double h_padding = static_cast<double> - (kNewtabHorizontalPadding) * current_state; - double v_padding = static_cast<double> - (kNewtabVerticalPadding) * current_state; - SkRect rect; - rect.set(SkDoubleToScalar(h_padding - 0.5), - SkDoubleToScalar(v_padding - 0.5), - SkDoubleToScalar(width() - h_padding - 0.5), - SkDoubleToScalar(height() - v_padding - 0.5)); - - double roundness = static_cast<double> - (kNewtabBarRoundness) * current_state; - - // Draw the background behind the toolstrips. - SkPaint paint; - paint.setAntiAlias(true); - paint.setColor(kBackgroundColor); - - canvas->drawRoundRect(rect, - SkDoubleToScalar(roundness), - SkDoubleToScalar(roundness), paint); - - SkRect background_rect = { - SkIntToScalar(h_padding), - SkIntToScalar(v_padding + 2), - SkIntToScalar(h_padding + 1), - SkIntToScalar(v_padding + kToolstripHeight - 3)}; - InitBackground(canvas, background_rect); - - // Draw the border around the toolstrips in the extension shelf. - SkPaint border_paint; - border_paint.setColor( - GetThemeProvider()->GetColor(BrowserThemeProvider::COLOR_NTP_HEADER)); - border_paint.setStyle(SkPaint::kStroke_Style); - border_paint.setAlpha(96); - border_paint.setAntiAlias(true); - canvas->drawRoundRect(rect, - SkDoubleToScalar(roundness), - SkDoubleToScalar(roundness), border_paint); - } else { -#if 0 - // TODO(erikkay) Re-enable when Glen has the gradient values worked out. - SkPaint paint; - paint.setShader(skia::CreateGradientShader(0, - height(), - kTopGradientColor, - kBackgroundColor))->safeUnref(); - canvas->FillRectInt(0, 0, width(), height(), paint); -#else - canvas->FillRectInt(kBackgroundColor, 0, 0, width(), height()); -#endif - - SkRect background_rect = { - SkIntToScalar(0), - SkIntToScalar(0), - SkIntToScalar(1), - SkIntToScalar(height()) - }; - InitBackground(canvas, background_rect); - - // Draw border around shelf in attached mode. If we are in detached mode - // we've already drawn the borders. - canvas->FillRectInt(kBorderColor, 0, 0, width(), 1); - canvas->FillRectInt(kBorderColor, 0, height() - 1, width(), 1); - } +void ExtensionShelf::PaintChildren(gfx::Canvas* canvas) { + // Capture a background bitmap to give to the toolstrips. + SkRect background_rect = { + SkIntToScalar(0), + SkIntToScalar(0), + SkIntToScalar(width()), + SkIntToScalar(height()) + }; + InitBackground(canvas, background_rect); // Draw vertical dividers between Toolstrip items in the Extension shelf. int count = GetChildViewCount(); for (int i = 0; i < count; ++i) { int right = GetChildViewAt(i)->bounds().right() + kToolstripPadding; - int y = IsDetachedStyle() ? kNewtabVerticalPadding : 1; - int h = IsDetachedStyle() ? height() - (2 * kNewtabVerticalPadding) - 1: - height() - 2; - canvas->FillRectInt(kBorderColor, right, y, 1, h); - canvas->FillRectInt(kDividerHighlightColor, right + 1, y, 1, h); + int vertical_padding = IsDetached() ? (height() - kShelfHeight) / 2 : 1; + + DetachableToolbarView::PaintVerticalDivider( + canvas, right, height(), vertical_padding, + SK_ColorWHITE, + kDividerHighlightColor, + GetThemeProvider()->GetColor(BrowserThemeProvider::COLOR_TOOLBAR)); } } @@ -771,7 +699,6 @@ void ExtensionShelf::Layout() { LayoutItems(false); } - void ExtensionShelf::OnMouseEntered(const views::MouseEvent& event) { } @@ -799,6 +726,17 @@ void ExtensionShelf::SetAccessibleName(const std::wstring& name) { accessible_name_.assign(name); } +void ExtensionShelf::ThemeChanged() { + background_needs_repaint_ = true; + + // Refresh the CSS to update toolstrip text colors from theme. + int count = model_->count(); + for (int i = 0; i < count; ++i) + ToolstripAtIndex(i)->view()->host()->InsertCssIfToolstrip(); + + Layout(); +} + void ExtensionShelf::ToolstripInsertedAt(ExtensionHost* host, int index) { model_->SetToolstripDataAt(index, @@ -806,8 +744,7 @@ void ExtensionShelf::ToolstripInsertedAt(ExtensionHost* host, bool had_views = GetChildViewCount() > 0; ExtensionView* view = host->view(); - if (!background_.empty()) - view->SetBackground(background_); + background_needs_repaint_ = true; AddChildView(view); view->SetContainer(this); if (!had_views) @@ -876,7 +813,8 @@ void ExtensionShelf::AnimationEnded(const Animation* animation) { if (browser_) browser_->ExtensionShelfSizeChanged(); - SchedulePaint(); + background_needs_repaint_ = true; + Layout(); } void ExtensionShelf::Observe(NotificationType type, @@ -936,38 +874,49 @@ void ExtensionShelf::CollapseToolstrip(ExtensionHost* host, const GURL& url) { model_->CollapseToolstrip(toolstrip, url); } -void ExtensionShelf::InitBackground(gfx::Canvas* canvas, const SkRect& subset) { - if (!background_.empty()) - return; - - const SkBitmap& background = canvas->getDevice()->accessBitmap(false); - - // Extract the correct subset of the toolstrip background into a bitmap. We - // must use a temporary here because extractSubset() returns a bitmap that - // references pixels in the original one and we want to actually make a copy - // that will have a long lifetime. - SkBitmap temp; - temp.setConfig(background.config(), - static_cast<int>(subset.width()), - static_cast<int>(subset.height())); - - SkRect mapped_subset = subset; - bool result = canvas->getTotalMatrix().mapRect(&mapped_subset); - DCHECK(result); - - SkIRect isubset; - mapped_subset.round(&isubset); - result = background.extractSubset(&temp, isubset); - if (!result) +void ExtensionShelf::InitBackground( + gfx::Canvas* canvas, const SkRect& subset) { + bool detached = IsDetached(); + if (!background_needs_repaint_ && background_for_detached_ == detached) return; - temp.copyTo(&background_, temp.config()); - DCHECK(background_.readyToDraw()); + background_for_detached_ = detached; // Tell all extension views about the new background int count = model_->count(); - for (int i = 0; i < count; ++i) - ToolstripAtIndex(i)->view()->SetBackground(background_); + for (int i = 0; i < count; ++i) { + ExtensionView* view = ToolstripAtIndex(i)->view(); + + const SkBitmap& background = canvas->getDevice()->accessBitmap(false); + + // Extract the correct subset of the toolstrip background into a bitmap. We + // must use a temporary here because extractSubset() returns a bitmap that + // references pixels in the original one and we want to actually make a copy + // that will have a long lifetime. + SkBitmap temp; + temp.setConfig(background.config(), + static_cast<int>(subset.width()), + static_cast<int>(subset.height())); + + SkRect mapped_subset = subset; + gfx::Rect view_bounds = view->bounds(); + mapped_subset.offset(SkIntToScalar(view_bounds.x()), + SkIntToScalar(view_bounds.y())); + bool result = canvas->getTotalMatrix().mapRect(&mapped_subset); + DCHECK(result); + + SkIRect isubset; + mapped_subset.round(&isubset); + result = background.extractSubset(&temp, isubset); + if (!result) + return; + + DCHECK(temp.readyToDraw()); + + view->SetBackground(temp); + } + + background_needs_repaint_ = false; } ExtensionShelf::Toolstrip* ExtensionShelf::ToolstripAtX(int x) { @@ -1033,13 +982,13 @@ gfx::Size ExtensionShelf::LayoutItems(bool compute_bounds_only) { int count = model_->count(); for (int i = 0; i < count; ++i) { - x += kToolstripPadding; // left padding + x += kToolstripPadding; // Left padding. Toolstrip* toolstrip = ToolstripAtIndex(i); - if (!toolstrip) // can be NULL while in the process of removing + if (!toolstrip) // Can be NULL while in the process of removing. continue; View* view = toolstrip->GetShelfView(); gfx::Size pref = view->GetPreferredSize(); - int next_x = x + pref.width() + kToolstripPadding; // right padding + int next_x = x + pref.width() + kToolstripPadding; // Right padding. if (!compute_bounds_only) { if (view == toolstrip->view()) toolstrip->view()->set_is_clipped(next_x >= max_x); @@ -1071,16 +1020,22 @@ gfx::Size ExtensionShelf::LayoutItems(bool compute_bounds_only) { return prefsize; } -bool ExtensionShelf::IsDetachedStyle() { +bool ExtensionShelf::IsOnTop() const { + static bool is_on_top = CommandLine::ForCurrentProcess()->HasSwitch( + switches::kShowExtensionsOnTop); + return is_on_top; +} + +bool ExtensionShelf::IsDetached() const { return OnNewTabPage() && (size_animation_->GetCurrentValue() != 1); } -bool ExtensionShelf::IsAlwaysShown() { +bool ExtensionShelf::IsAlwaysShown() const { Profile* profile = browser_->profile(); return profile->GetPrefs()->GetBoolean(prefs::kShowExtensionShelf); } -bool ExtensionShelf::OnNewTabPage() { +bool ExtensionShelf::OnNewTabPage() const { return (browser_ && browser_->GetSelectedTabContents() && browser_->GetSelectedTabContents()->IsExtensionShelfAlwaysVisible()); } diff --git a/chrome/browser/views/extensions/extension_shelf.h b/chrome/browser/views/extensions/extension_shelf.h index 3f994e4..c15921b 100644 --- a/chrome/browser/views/extensions/extension_shelf.h +++ b/chrome/browser/views/extensions/extension_shelf.h @@ -11,6 +11,7 @@ #include "chrome/browser/extensions/extension_shelf_model.h" #include "chrome/browser/extensions/extensions_service.h" #include "chrome/browser/views/browser_bubble.h" +#include "chrome/browser/views/detachable_toolbar_view.h" #include "views/view.h" class Browser; @@ -20,7 +21,7 @@ namespace views { } // A shelf that contains Extension toolstrips. -class ExtensionShelf : public views::View, +class ExtensionShelf : public DetachableToolbarView, public ExtensionContainer, public ExtensionShelfModelObserver, public AnimationDelegate, @@ -32,14 +33,18 @@ class ExtensionShelf : public views::View, // Get the current model. ExtensionShelfModel* model() { return model_; } - // Returns whether the extension shelf is detached from the Chrome frame. - bool IsDetachedStyle(); - // Toggles a preference for whether to always show the extension shelf. static void ToggleWhenExtensionShelfVisible(Profile* profile); - // View - virtual void Paint(gfx::Canvas* canvas); + // DetachableToolbarView methods: + virtual bool IsOnTop() const; + virtual bool IsDetached() const; + virtual double GetAnimationValue() const { + return size_animation_->GetCurrentValue(); + } + + // View methods: + virtual void PaintChildren(gfx::Canvas* canvas); virtual gfx::Size GetPreferredSize(); virtual void Layout(); virtual void OnMouseExited(const views::MouseEvent& event); @@ -47,12 +52,13 @@ class ExtensionShelf : public views::View, virtual bool GetAccessibleName(std::wstring* name); virtual bool GetAccessibleRole(AccessibilityTypes::Role* role); virtual void SetAccessibleName(const std::wstring& name); + virtual void ThemeChanged(); - // ExtensionContainer + // ExtensionContainer methods: virtual void OnExtensionMouseEvent(ExtensionView* view); virtual void OnExtensionMouseLeave(ExtensionView* view); - // ExtensionShelfModelObserver + // ExtensionShelfModelObserver methods: virtual void ToolstripInsertedAt(ExtensionHost* toolstrip, int index); virtual void ToolstripRemovingAt(ExtensionHost* toolstrip, int index); virtual void ToolstripDraggingFrom(ExtensionHost* toolstrip, int index); @@ -64,17 +70,17 @@ class ExtensionShelf : public views::View, virtual void ShelfModelReloaded(); virtual void ShelfModelDeleting(); - // AnimationDelegate + // AnimationDelegate methods: virtual void AnimationProgressed(const Animation* animation); virtual void AnimationEnded(const Animation* animation); - // NotificationObserver + // NotificationObserver methods: virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); protected: - // View + // View methods: virtual void ChildPreferredSizeChanged(View* child); private: @@ -92,7 +98,7 @@ class ExtensionShelf : public views::View, // Collapse the specified toolstrip, navigating to |url| if non-empty. void CollapseToolstrip(ExtensionHost* host, const GURL& url); - // Inits the background bitmap. + // Initializes the background bitmaps for all views. void InitBackground(gfx::Canvas* canvas, const SkRect& subset); // Returns the Toolstrip at |x| coordinate. If |x| is out of bounds, returns @@ -115,16 +121,21 @@ class ExtensionShelf : public views::View, gfx::Size LayoutItems(bool compute_bounds_only); // Returns whether the extension shelf always shown (checks pref value). - bool IsAlwaysShown(); + bool IsAlwaysShown() const; // Returns whether the extension shelf is being displayed over the new tab // page. - bool OnNewTabPage(); + bool OnNewTabPage() const; NotificationRegistrar registrar_; // Background bitmap to draw under extension views. - SkBitmap background_; + bool background_needs_repaint_; + + // Whether the background we are remembering is for detached mode or not. + // This allows us to switch backgrounds and remember if we've done so, so that + // we don't have to do it over and over again. + bool background_for_detached_; // The browser this extension shelf belongs to. Browser* browser_; diff --git a/chrome/browser/views/frame/browser_view.cc b/chrome/browser/views/frame/browser_view.cc index e42262d..beef3f4 100644 --- a/chrome/browser/views/frame/browser_view.cc +++ b/chrome/browser/views/frame/browser_view.cc @@ -127,254 +127,59 @@ static const char kBrowserViewClassName[] = "browser/views/BrowserView"; // and paint the bookmark bar. class BookmarkExtensionBackground : public views::Background { public: - explicit BookmarkExtensionBackground(BrowserView* browser_view); + explicit BookmarkExtensionBackground(BrowserView* browser_view, + DetachableToolbarView* host_view); // View methods overridden from views:Background. virtual void Paint(gfx::Canvas* canvas, views::View* view) const; private: - // Paint the theme background with the proper alignment. - void PaintThemeBackgroundTopAligned(gfx::Canvas* canvas, - SkBitmap* ntp_background, int tiling, int alignment) const; - void PaintThemeBackgroundBottomAligned(gfx::Canvas* canvas, - SkBitmap* ntp_background, int tiling, int alignment) const; - BrowserView* browser_view_; + // The view hosting this background. + DetachableToolbarView* host_view_; + DISALLOW_COPY_AND_ASSIGN(BookmarkExtensionBackground); }; BookmarkExtensionBackground::BookmarkExtensionBackground( - BrowserView* browser_view) - : browser_view_(browser_view) { + BrowserView* browser_view, + DetachableToolbarView* host_view) + : browser_view_(browser_view), + host_view_(host_view) { } void BookmarkExtensionBackground::Paint(gfx::Canvas* canvas, - views::View* view) const { - // Paint the bookmark bar. - BookmarkBarView* bookmark_bar_view = browser_view_->GetBookmarkBarView(); - if (bookmark_bar_view->IsDetachedStyle()) { + views::View* view) const { + ThemeProvider* tp = host_view_->GetThemeProvider(); + if (host_view_->IsDetached()) { // Draw the background to match the new tab page. - ThemeProvider* tp = bookmark_bar_view->GetThemeProvider(); - canvas->FillRectInt( - tp->GetColor(BrowserThemeProvider::COLOR_NTP_BACKGROUND), - 0, 0, bookmark_bar_view->width(), bookmark_bar_view->height()); - - if (tp->HasCustomImage(IDR_THEME_NTP_BACKGROUND)) { - int tiling = BrowserThemeProvider::NO_REPEAT; - tp->GetDisplayProperty(BrowserThemeProvider::NTP_BACKGROUND_TILING, - &tiling); - int alignment; - if (tp->GetDisplayProperty(BrowserThemeProvider::NTP_BACKGROUND_ALIGNMENT, - &alignment)) { - SkBitmap* ntp_background = tp->GetBitmapNamed( - IDR_THEME_NTP_BACKGROUND); - - if (alignment & BrowserThemeProvider::ALIGN_TOP) { - PaintThemeBackgroundTopAligned(canvas, ntp_background, tiling, - alignment); - } else { - PaintThemeBackgroundBottomAligned(canvas, ntp_background, tiling, - alignment); - } - } - } - - // Draw the 'bottom' of the toolbar above our bubble. - canvas->FillRectInt(ResourceBundle::toolbar_separator_color, 0, 0, - bookmark_bar_view->width(), 1); + DetachableToolbarView::PaintBackgroundDetachedMode(canvas, host_view_); SkRect rect; // As 'hidden' according to the animation is the full in-tab state, // we invert the value - when current_state is at '0', we expect the // bar to be docked. - double current_state = 1 - bookmark_bar_view->GetSizeAnimationValue(); + double current_state = 1 - host_view_->GetAnimationValue(); // The 0.5 is to correct for Skia's "draw on pixel boundaries"ness. double h_padding = static_cast<double> - (BookmarkBarView::kNewtabHorizontalPadding) * current_state; + (BookmarkBarView::kNewtabHorizontalPadding) * current_state; double v_padding = static_cast<double> - (BookmarkBarView::kNewtabVerticalPadding) * current_state; - rect.set(SkDoubleToScalar(h_padding - 0.5), - SkDoubleToScalar(v_padding - 0.5), - SkDoubleToScalar(bookmark_bar_view->width() - h_padding - 0.5), - SkDoubleToScalar(bookmark_bar_view->height() - v_padding - 0.5)); - - double roundness = static_cast<double> - (kNewtabBarRoundness) * current_state; - - // Draw our background. - SkPaint paint; - paint.setAntiAlias(true); - paint.setColor(bookmark_bar_view->GetThemeProvider()->GetColor( - BrowserThemeProvider::COLOR_TOOLBAR)); - - canvas->drawRoundRect(rect, - SkDoubleToScalar(roundness), - SkDoubleToScalar(roundness), paint); - - // Draw border - SkPaint border_paint; - border_paint.setColor(bookmark_bar_view->GetThemeProvider()->GetColor( - BrowserThemeProvider::COLOR_NTP_HEADER)); - border_paint.setStyle(SkPaint::kStroke_Style); - border_paint.setAlpha(96); - border_paint.setAntiAlias(true); - - canvas->drawRoundRect(rect, - SkDoubleToScalar(roundness), - SkDoubleToScalar(roundness), border_paint); + (BookmarkBarView::kNewtabVerticalPadding) * current_state; + double roundness = 0; + + DetachableToolbarView::CalculateContentArea(current_state, + h_padding, v_padding, + &rect, &roundness, host_view_); + DetachableToolbarView::PaintContentAreaBackground( + canvas, tp, rect, roundness); + DetachableToolbarView::PaintContentAreaBorder(canvas, tp, rect, roundness); + DetachableToolbarView::PaintHorizontalBorder(canvas, host_view_); } else { - gfx::Rect bounds = bookmark_bar_view->GetBounds(views::View:: - APPLY_MIRRORING_TRANSFORMATION); - - SkColor theme_toolbar_color = - bookmark_bar_view->GetThemeProvider()->GetColor(BrowserThemeProvider:: - COLOR_TOOLBAR); - canvas->FillRectInt(theme_toolbar_color, 0, 0, - bookmark_bar_view->width(), - bookmark_bar_view->height()); - - canvas->TileImageInt( - *browser_view_->GetBookmarkBarView()->GetThemeProvider()-> - GetBitmapNamed(IDR_THEME_TOOLBAR), - bookmark_bar_view->GetParent()->GetBounds(views:: - View::APPLY_MIRRORING_TRANSFORMATION).x() + bounds.x(), bounds.y(), - 0, 0, - bookmark_bar_view->width(), - bookmark_bar_view->height()); - canvas->FillRectInt(ResourceBundle::toolbar_separator_color, - 0, - bookmark_bar_view->height() - 1, - bookmark_bar_view->width(), 1); - } -} - -void BookmarkExtensionBackground::PaintThemeBackgroundTopAligned( - gfx::Canvas* canvas, SkBitmap* ntp_background, int tiling, - int alignment) const { - BookmarkBarView* bookmark_bar_view = browser_view_->GetBookmarkBarView(); - if (alignment & BrowserThemeProvider::ALIGN_LEFT) { - if (tiling == BrowserThemeProvider::REPEAT) - canvas->TileImageInt(*ntp_background, 0, 0, - bookmark_bar_view->width(), bookmark_bar_view->height()); - else if (tiling == BrowserThemeProvider::REPEAT_X) - canvas->TileImageInt(*ntp_background, 0, 0, - bookmark_bar_view->width(), - ntp_background->height()); - else - canvas->TileImageInt(*ntp_background, 0, 0, - ntp_background->width(), ntp_background->height()); - - } else if (alignment & BrowserThemeProvider::ALIGN_RIGHT) { - int x_pos = bookmark_bar_view->width() % ntp_background->width() - - ntp_background->width(); - if (tiling == BrowserThemeProvider::REPEAT) - canvas->TileImageInt(*ntp_background, x_pos, 0, - bookmark_bar_view->width() + ntp_background->width(), - bookmark_bar_view->height()); - else if (tiling == BrowserThemeProvider::REPEAT_X) - canvas->TileImageInt(*ntp_background, x_pos, - 0, bookmark_bar_view->width() + ntp_background->width(), - ntp_background->height()); - else - canvas->TileImageInt(*ntp_background, - bookmark_bar_view->width() - ntp_background->width(), 0, - ntp_background->width(), ntp_background->height()); - - } else { // ALIGN == CENTER - int x_pos = bookmark_bar_view->width() > ntp_background->width() ? - ((bookmark_bar_view->width() / 2 - ntp_background->width() / 2) % - ntp_background->width()) - ntp_background->width() : - bookmark_bar_view->width() / 2 - ntp_background->width() / 2; - if (tiling == BrowserThemeProvider::REPEAT) - canvas->TileImageInt(*ntp_background, x_pos, 0, - bookmark_bar_view->width() + ntp_background->width(), - bookmark_bar_view->height()); - else if (tiling == BrowserThemeProvider::REPEAT_X) - canvas->TileImageInt(*ntp_background, x_pos, 0, - bookmark_bar_view->width() + ntp_background->width(), - ntp_background->height()); - else - canvas->TileImageInt(*ntp_background, - bookmark_bar_view->width() / 2 - ntp_background->width() / 2, - 0, ntp_background->width(), ntp_background->height()); - } -} - -void BookmarkExtensionBackground::PaintThemeBackgroundBottomAligned( - gfx::Canvas* canvas, SkBitmap* ntp_background, int tiling, - int alignment) const { - BookmarkBarView* bookmark_bar_view = browser_view_->GetBookmarkBarView(); - int browser_height = bookmark_bar_view->GetParent()->GetBounds( - views::View::APPLY_MIRRORING_TRANSFORMATION).height(); - int border_width = 5; - int y_pos = ((tiling == BrowserThemeProvider::REPEAT_X) || - (tiling == BrowserThemeProvider::NO_REPEAT)) ? - browser_height - ntp_background->height() - bookmark_bar_view->height() - - border_width : - browser_height % ntp_background->height() - bookmark_bar_view->height() - - border_width - ntp_background->height(); - - if (alignment & BrowserThemeProvider::ALIGN_LEFT) { - if (tiling == BrowserThemeProvider::REPEAT) - canvas->TileImageInt(*ntp_background, 0, y_pos, - bookmark_bar_view->width(), - 2 * bookmark_bar_view->height() + ntp_background->height() + 5); - else if (tiling == BrowserThemeProvider::REPEAT_X) - canvas->TileImageInt(*ntp_background, 0, y_pos, - bookmark_bar_view->width(), ntp_background->height()); - else if (tiling == BrowserThemeProvider::REPEAT_Y) - canvas->TileImageInt(*ntp_background, 0, y_pos, - ntp_background->width(), - 2 * bookmark_bar_view->height() + ntp_background->height() + 5); - else - canvas->TileImageInt(*ntp_background, 0, y_pos, ntp_background->width(), - ntp_background->height()); - - } else if (alignment & BrowserThemeProvider::ALIGN_RIGHT) { - int x_pos = bookmark_bar_view->width() % ntp_background->width() - - ntp_background->width(); - if (tiling == BrowserThemeProvider::REPEAT) - canvas->TileImageInt(*ntp_background, x_pos, y_pos, - bookmark_bar_view->width() + ntp_background->width(), - 2 * bookmark_bar_view->height() + ntp_background->height() + 5); - else if (tiling == BrowserThemeProvider::REPEAT_X) - canvas->TileImageInt(*ntp_background, x_pos, y_pos, - bookmark_bar_view->width() + ntp_background->width(), - ntp_background->height()); - else if (tiling == BrowserThemeProvider::REPEAT_Y) - canvas->TileImageInt(*ntp_background, bookmark_bar_view->width() - - ntp_background->width(), y_pos, ntp_background->width(), - 2 * bookmark_bar_view->height() + ntp_background->height() + 5); - else - canvas->TileImageInt(*ntp_background, - bookmark_bar_view->width() - ntp_background->width(), - y_pos, ntp_background->width(), ntp_background->height()); - - } else { // ALIGN == CENTER - int x_pos = bookmark_bar_view->width() > ntp_background->width() ? - ((bookmark_bar_view->width() / 2 - ntp_background->width() / 2) % - ntp_background->width()) - ntp_background->width() : - bookmark_bar_view->width() / 2 - ntp_background->width() / 2; - if (tiling == BrowserThemeProvider::REPEAT) - canvas->TileImageInt(*ntp_background, x_pos, y_pos, - bookmark_bar_view->width() + ntp_background->width(), - 2 * bookmark_bar_view->height() + ntp_background->height() + 5); - else if (tiling == BrowserThemeProvider::REPEAT_X) - canvas->TileImageInt(*ntp_background, x_pos, y_pos, - bookmark_bar_view->width() + ntp_background->width(), - ntp_background->height()); - else if (tiling == BrowserThemeProvider::REPEAT_Y) - canvas->TileImageInt(*ntp_background, - bookmark_bar_view->width() / 2 - ntp_background->width() / 2, - y_pos, ntp_background->width(), - 2 * bookmark_bar_view->height() + ntp_background->height() + 5); - else - canvas->TileImageInt(*ntp_background, - bookmark_bar_view->width() / 2 - ntp_background->width() / 2, - y_pos, ntp_background->width(), ntp_background->height()); + DetachableToolbarView::PaintBackgroundAttachedMode(canvas, host_view_); + DetachableToolbarView::PaintHorizontalBorder(canvas, host_view_); } } @@ -1829,6 +1634,8 @@ void BrowserView::Init() { if (browser_->SupportsWindowFeature(Browser::FEATURE_EXTENSIONSHELF)) { extension_shelf_ = new ExtensionShelf(browser_.get()); + extension_shelf_->set_background( + new BookmarkExtensionBackground(this, extension_shelf_)); extension_shelf_-> SetAccessibleName(l10n_util::GetString(IDS_ACCNAME_EXTENSIONS)); AddChildView(extension_shelf_); @@ -1900,7 +1707,7 @@ int BrowserView::LayoutBookmarkAndInfoBars(int top) { // If we're showing the Bookmark bar in detached style, then we need to show // any Info bar _above_ the Bookmark bar, since the Bookmark bar is styled // to look like it's part of the page. - if (bookmark_bar_view_->IsDetachedStyle()) + if (bookmark_bar_view_->IsDetached()) return LayoutTopBar(LayoutInfoBar(top)); // Otherwise, Bookmark bar first, Info bar second. top = LayoutTopBar(top); @@ -1922,17 +1729,17 @@ int BrowserView::LayoutTopBar(int top) { if (!IsBookmarkBarVisible()) { bookmark_bar_view_->SetVisible(false); bookmark_bar_view_->SetBounds(0, y, width(), 0); - if (ShowExtensionsOnTop()) + if (extension_shelf_->IsOnTop()) extension_shelf_->SetVisible(false); return y; } int bookmark_bar_height = bookmark_bar_view_->GetPreferredSize().height(); - y -= kSeparationLineHeight + (bookmark_bar_view_->IsDetachedStyle() ? + y -= kSeparationLineHeight + (bookmark_bar_view_->IsDetached() ? 0 : bookmark_bar_view_->GetToolbarOverlap(false)); - if (ShowExtensionsOnTop()) { - if (!bookmark_bar_view_->IsDetachedStyle()) { + if (extension_shelf_->IsOnTop()) { + if (!bookmark_bar_view_->IsDetached()) { int extension_shelf_width = extension_shelf_->GetPreferredSize().width(); int bookmark_bar_given_width = width() - extension_shelf_width; @@ -1949,7 +1756,7 @@ int BrowserView::LayoutTopBar(int top) { bookmark_bar_height); x += extension_shelf_width; } else { - // TODO (sidchat): For detached style bookmark bar, set the extensions + // TODO(sidchat): For detached style bookmark bar, set the extensions // shelf in a better position. Issue = 20741. extension_shelf_->SetVisible(false); } @@ -1978,7 +1785,7 @@ int BrowserView::LayoutExtensionAndDownloadShelves() { // to look like it's part of the page. int bottom = height(); if (extension_shelf_) { - if (extension_shelf_->IsDetachedStyle()) { + if (extension_shelf_->IsDetached()) { bottom = LayoutDownloadShelf(bottom); return LayoutExtensionShelf(bottom); } @@ -2017,7 +1824,7 @@ void BrowserView::LayoutStatusBubble(int top) { } int BrowserView::LayoutExtensionShelf(int bottom) { - if (ShowExtensionsOnTop()) + if (!extension_shelf_ || extension_shelf_->IsOnTop()) return bottom; if (extension_shelf_) { @@ -2041,7 +1848,8 @@ bool BrowserView::MaybeShowBookmarkBar(TabContents* contents) { bookmark_bar_view_.reset(new BookmarkBarView(contents->profile(), browser_.get())); bookmark_bar_view_->SetParentOwned(false); - bookmark_bar_view_->set_background(new BookmarkExtensionBackground(this)); + bookmark_bar_view_->set_background( + new BookmarkExtensionBackground(this, bookmark_bar_view_.get())); } else { bookmark_bar_view_->SetProfile(contents->profile()); } @@ -2327,11 +2135,6 @@ void BrowserView::InitHangMonitor() { #endif } -bool BrowserView::ShowExtensionsOnTop() { - return extension_shelf_ && CommandLine::ForCurrentProcess()->HasSwitch( - switches::kShowExtensionsOnTop); -} - // static void BrowserView::InitClass() { static bool initialized = false; diff --git a/chrome/browser/views/frame/browser_view.h b/chrome/browser/views/frame/browser_view.h index 2d06f98..89cf05a 100644 --- a/chrome/browser/views/frame/browser_view.h +++ b/chrome/browser/views/frame/browser_view.h @@ -405,9 +405,6 @@ class BrowserView : public BrowserWindow, // Initialize the hung plugin detector. void InitHangMonitor(); - // Returns true if extensions and bookmarks are positioned next to each other. - bool ShowExtensionsOnTop(); - // Initialize class statics. static void InitClass(); diff --git a/chrome/chrome.gyp b/chrome/chrome.gyp index 0657691..eb799d7 100644 --- a/chrome/chrome.gyp +++ b/chrome/chrome.gyp @@ -1963,6 +1963,8 @@ 'browser/views/constrained_window_win.h', 'browser/views/confirm_message_box_dialog.cc', 'browser/views/confirm_message_box_dialog.h', + 'browser/views/detachable_toolbar_view.cc', + 'browser/views/detachable_toolbar_view.h', 'browser/views/dialog_stubs_gtk.cc', 'browser/views/dom_view.cc', 'browser/views/dom_view.h', @@ -2473,6 +2475,8 @@ ['include', '^browser/views/chrome_views_delegate.cc'], ['include', '^browser/views/clear_browsing_data.cc'], ['include', '^browser/views/clear_browsing_data.h'], + ['include', '^browser/views/detachable_toolbar_view.h'], + ['include', '^browser/views/detachable_toolbar_view.cc'], ['include', '^browser/views/dialog_stubs_gtk.cc'], ['include', '^browser/views/download_item_view.cc'], ['include', '^browser/views/download_item_view.h'], diff --git a/chrome/common/render_messages_internal.h b/chrome/common/render_messages_internal.h index a2b99b5..806c0e5 100644 --- a/chrome/common/render_messages_internal.h +++ b/chrome/common/render_messages_internal.h @@ -311,9 +311,10 @@ IPC_BEGIN_MESSAGES(View) // Request for the renderer to evaluate an xpath to a frame and insert css // into that frame's document. See ViewMsg_ScriptEvalRequest for details on // allowed xpath expressions. - IPC_MESSAGE_ROUTED2(ViewMsg_CSSInsertRequest, + IPC_MESSAGE_ROUTED3(ViewMsg_CSSInsertRequest, std::wstring, /* frame_xpath */ - std::string /* css string */) + std::string, /* css string */ + std::string /* element id */) // Log a message to the console of the target frame IPC_MESSAGE_ROUTED3(ViewMsg_AddMessageToConsole, diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc index f339309..b8ee661 100644 --- a/chrome/renderer/render_view.cc +++ b/chrome/renderer/render_view.cc @@ -2734,12 +2734,13 @@ void RenderView::EvaluateScript(const std::wstring& frame_xpath, } void RenderView::InsertCSS(const std::wstring& frame_xpath, - const std::string& css) { + const std::string& css, + const std::string& id) { WebFrame* web_frame = GetChildFrame(frame_xpath); if (!web_frame) return; - web_frame->insertStyleText(WebString::fromUTF8(css)); + web_frame->insertStyleText(WebString::fromUTF8(css), WebString::fromUTF8(id)); } void RenderView::OnScriptEvalRequest(const std::wstring& frame_xpath, @@ -2748,8 +2749,9 @@ void RenderView::OnScriptEvalRequest(const std::wstring& frame_xpath, } void RenderView::OnCSSInsertRequest(const std::wstring& frame_xpath, - const std::string& css) { - InsertCSS(frame_xpath, css); + const std::string& css, + const std::string& id) { + InsertCSS(frame_xpath, css, id); // Notify RenderViewHost that css has been inserted into the frame. Send(new ViewHostMsg_OnCSSInserted(routing_id_)); diff --git a/chrome/renderer/render_view.h b/chrome/renderer/render_view.h index 5836b52..2fe5201 100644 --- a/chrome/renderer/render_view.h +++ b/chrome/renderer/render_view.h @@ -405,9 +405,12 @@ class RenderView : public RenderWidget, void EvaluateScript(const std::wstring& frame_xpath, const std::wstring& jscript); - // Inserts a string of CSS in a particular frame. + // Inserts a string of CSS in a particular frame. |id| can be specified to + // give the CSS style element an id, and (if specified) will replace the + // element with the same id. void InsertCSS(const std::wstring& frame_xpath, - const std::string& css); + const std::string& css, + const std::string& id); int delay_seconds_for_form_state_sync() const { return delay_seconds_for_form_state_sync_; @@ -590,7 +593,8 @@ class RenderView : public RenderWidget, void OnScriptEvalRequest(const std::wstring& frame_xpath, const std::wstring& jscript); void OnCSSInsertRequest(const std::wstring& frame_xpath, - const std::string& css); + const std::string& css, + const std::string& id); void OnAddMessageToConsole(const string16& frame_xpath, const string16& message, const WebKit::WebConsoleMessage::Level&); diff --git a/chrome/renderer/user_script_slave.cc b/chrome/renderer/user_script_slave.cc index 2ebd68f..7f7ad31 100644 --- a/chrome/renderer/user_script_slave.cc +++ b/chrome/renderer/user_script_slave.cc @@ -130,7 +130,7 @@ bool UserScriptSlave::InjectScripts(WebFrame* frame, for (size_t j = 0; j < script->css_scripts().size(); ++j) { UserScript::File& file = script->css_scripts()[j]; frame->insertStyleText( - WebString::fromUTF8(file.GetContent().as_string())); + WebString::fromUTF8(file.GetContent().as_string()), WebString()); } } if (script->run_location() == location) { |