From 7deaa81460cae8f40cbd3408a611527b2299c354 Mon Sep 17 00:00:00 2001 From: "aa@chromium.org" Date: Mon, 27 Apr 2009 23:04:48 +0000 Subject: Fix several painting glitches for toolstrips. * Reset HWND size when HWNDHtmlView changes size. The two should always be in sync. * Race: We might already have frames when RenderWidget receives a new background, need to set these to transparent too. * Race: Toolstrip background not always available by the time ExtensionToolstrip is constucted * Make images line up correctly for toolstrip buttons. Review URL: http://codereview.chromium.org/99042 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@14682 0039d316-1c4b-4281-b951-d872f2087c98 --- chrome/browser/browser_resources.grd | 2 +- chrome/browser/extensions/extension_view.cc | 33 +++++-- chrome/browser/extensions/extension_view.h | 17 +++- chrome/browser/resources/extensions_toolstrip.css | 101 +++++++++++++-------- chrome/browser/views/bookmark_bar_view.cc | 13 +-- chrome/browser/views/hwnd_html_view.cc | 22 +++++ chrome/browser/views/hwnd_html_view.h | 9 +- chrome/common/temp_scaffolding_stubs.h | 2 + .../test/data/extensions/test/Resizer/resizer.html | 2 - webkit/glue/webview_impl.cc | 8 ++ 10 files changed, 151 insertions(+), 58 deletions(-) diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd index a72b652..8ca4fd0 100644 --- a/chrome/browser/browser_resources.grd +++ b/chrome/browser/browser_resources.grd @@ -1,6 +1,6 @@ +without changes to the corresponding grd file. --> diff --git a/chrome/browser/extensions/extension_view.cc b/chrome/browser/extensions/extension_view.cc index b55c3aa..a26194c 100755 --- a/chrome/browser/extensions/extension_view.cc +++ b/chrome/browser/extensions/extension_view.cc @@ -34,21 +34,38 @@ ExtensionView::ExtensionView(Extension* extension, Browser* browser) : HWNDHtmlView(url, this, false, instance), extension_(extension), - browser_(browser) { - SetVisible(false); + browser_(browser), + did_stop_loading_(false), + pending_preferred_width_(0) { +} + +void ExtensionView::ShowIfCompletelyLoaded() { + // We wait to show the ExtensionView until it has loaded and our parent has + // given us a background. These can happen in different orders. + if (did_stop_loading_ && !render_view_host()->view()->background().empty()) { + SetVisible(true); + DidContentsPreferredWidthChange(pending_preferred_width_); + } +} + +void ExtensionView::SetBackground(const SkBitmap& background) { + HWNDHtmlView::SetBackground(background); + ShowIfCompletelyLoaded(); } void ExtensionView::DidStopLoading(RenderViewHost* render_view_host, int32 page_id) { render_view_host->WasResized(); - SetVisible(true); + did_stop_loading_ = true; + ShowIfCompletelyLoaded(); } void ExtensionView::DidContentsPreferredWidthChange(const int pref_width) { - if (pref_width > 0) { - // SchedulePaint first because new_width may be smaller and we want - // the Parent to paint the vacated space. - SchedulePaint(); + // Don't actually do anything with this information until we have been shown. + // Size changes will not be honored by lower layers while we are hidden. + if (!IsVisible()) { + pending_preferred_width_ = pref_width; + } else if (pref_width > 0) { set_preferred_size(gfx::Size(pref_width, height())); SizeToPreferredSize(); @@ -61,12 +78,12 @@ void ExtensionView::DidContentsPreferredWidthChange(const int pref_width) { } SchedulePaint(); - render_view_host()->WasResized(); } } void ExtensionView::CreatingRenderer() { render_view_host()->AllowExtensionBindings(); + SetVisible(false); } void ExtensionView::RenderViewCreated(RenderViewHost* rvh) { diff --git a/chrome/browser/extensions/extension_view.h b/chrome/browser/extensions/extension_view.h index 7c11371..51c84a3 100755 --- a/chrome/browser/extensions/extension_view.h +++ b/chrome/browser/extensions/extension_view.h @@ -7,6 +7,7 @@ #include "chrome/browser/renderer_host/render_view_host_delegate.h" #include "chrome/browser/tab_contents/render_view_host_delegate_helper.h" +#include "skia/include/SkBitmap.h" // TODO(port): Port these files. #if defined(OS_WIN) @@ -30,14 +31,19 @@ class ExtensionView : public HWNDHtmlView, public RenderViewHostDelegate, public RenderViewHostDelegate::View { public: + // ExtensionView ExtensionView(Extension* extension, const GURL& url, SiteInstance* instance, Browser* browser); + Extension* extension() { return extension_; } + // HWNDHtmlView virtual void CreatingRenderer(); + virtual void SetBackground(const SkBitmap& background); + // RenderViewHostDelegate // TODO(mpcomplete): GetProfile is unused. virtual Profile* GetProfile() const { return NULL; } @@ -73,8 +79,10 @@ class ExtensionView : public HWNDHtmlView, virtual void TakeFocus(bool reverse); virtual void HandleKeyboardEvent(const NativeWebKeyboardEvent& event); - Extension* extension() { return extension_; } private: + // We wait to show the ExtensionView until several things have loaded. + void ShowIfCompletelyLoaded(); + // The extension that we're hosting in this view. Extension* extension_; @@ -84,6 +92,13 @@ class ExtensionView : public HWNDHtmlView, // Common implementations of some RenderViewHostDelegate::View methods. RenderViewHostDelegateViewHelper delegate_view_helper_; + // Whether the RenderWidget has reported that it has stopped loading. + bool did_stop_loading_; + + // What we should set the preferred width to once the ExtensionView has + // loaded. + int pending_preferred_width_; + DISALLOW_COPY_AND_ASSIGN(ExtensionView); }; diff --git a/chrome/browser/resources/extensions_toolstrip.css b/chrome/browser/resources/extensions_toolstrip.css index fa8e804..c7778ff 100755 --- a/chrome/browser/resources/extensions_toolstrip.css +++ b/chrome/browser/resources/extensions_toolstrip.css @@ -5,11 +5,12 @@ */ body { display:-webkit-box; - -webkit-box-align:center; + -webkit-box-orient:horizontal; + -webkit-box-align:stretch; white-space:nowrap; overflow: hidden; margin: 0; - padding:0 6px; + padding:0; font: menu; color: #062D75; text-shadow: #FFFFFF 1px 1px 0px; @@ -18,41 +19,63 @@ body { } /** - * Buttons. The following styles make look - * like the bookmarkbar buttons. + * Toolstrip Buttons. The following styles make + *
Woot
look like the + * bookmarkbar buttons on Windows. + * + * TODO(aa): We may have to come up with a way to modify these slightly on + * different platforms. + * + * TODO(aa): It would be nice if we could use actual