0

rAc: reduce number of redundant layouts of DetailsContainerView

This cuts down total AutofillDialogViews layout time by about half (!).

BUG=285996, 272402

Review URL: https://chromiumcodereview.appspot.com/23526021

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@221584 0039d316-1c4b-4281-b951-d872f2087c98
This commit is contained in:
estade@chromium.org
2013-09-06 05:38:23 +00:00
parent 7c3b444b43
commit 5a19c38a98
2 changed files with 49 additions and 20 deletions
chrome/browser/ui/views/autofill

@ -240,24 +240,6 @@ class ErrorBubbleContents : public views::View {
DISALLOW_COPY_AND_ASSIGN(ErrorBubbleContents);
};
// A view that runs a callback whenever its bounds change.
class DetailsContainerView : public views::View {
public:
explicit DetailsContainerView(const base::Closure& callback)
: bounds_changed_callback_(callback) {}
virtual ~DetailsContainerView() {}
// views::View implementation.
virtual void OnBoundsChanged(const gfx::Rect& previous_bounds) OVERRIDE {
bounds_changed_callback_.Run();
}
private:
base::Closure bounds_changed_callback_;
DISALLOW_COPY_AND_ASSIGN(DetailsContainerView);
};
// A view that propagates visibility and preferred size changes.
class LayoutPropagationView : public views::View {
public:
@ -1067,6 +1049,25 @@ int AutofillDialogViews::SuggestedButton::ResourceIDForState() const {
return IDR_AUTOFILL_DIALOG_MENU_BUTTON;
}
// AutofillDialogViews::DetailsContainerView -----------------------------------
AutofillDialogViews::DetailsContainerView::DetailsContainerView(
const base::Closure& callback)
: bounds_changed_callback_(callback),
ignore_layouts_(false) {}
AutofillDialogViews::DetailsContainerView::~DetailsContainerView() {}
void AutofillDialogViews::DetailsContainerView::OnBoundsChanged(
const gfx::Rect& previous_bounds) {
bounds_changed_callback_.Run();
}
void AutofillDialogViews::DetailsContainerView::Layout() {
if (!ignore_layouts_)
views::View::Layout();
}
// AutofillDialogViews::SuggestionView -----------------------------------------
AutofillDialogViews::SuggestionView::SuggestionView(
@ -1558,8 +1559,12 @@ void AutofillDialogViews::Layout() {
scroll_y += notification_height + views::kRelatedControlVerticalSpacing;
int scroll_bottom = content_bounds.bottom();
scrollable_area_->contents()->SizeToPreferredSize();
DCHECK_EQ(scrollable_area_->contents(), details_container_);
details_container_->SizeToPreferredSize();
// TODO(estade): remove this hack. See crbug.com/285996
details_container_->set_ignore_layouts(true);
scrollable_area_->SetBounds(x, scroll_y, width, scroll_bottom - scroll_y);
details_container_->set_ignore_layouts(false);
}
if (loading_shield_->visible())

@ -398,6 +398,30 @@ class AutofillDialogViews : public AutofillDialogView,
DISALLOW_COPY_AND_ASSIGN(SuggestedButton);
};
// A view that runs a callback whenever its bounds change, and which can
// optionally suppress layout.
class DetailsContainerView : public views::View {
public:
explicit DetailsContainerView(const base::Closure& callback);
virtual ~DetailsContainerView();
void set_ignore_layouts(bool ignore_layouts) {
ignore_layouts_ = ignore_layouts;
}
// views::View implementation.
virtual void OnBoundsChanged(const gfx::Rect& previous_bounds) OVERRIDE;
virtual void Layout() OVERRIDE;
private:
base::Closure bounds_changed_callback_;
// The view ignores Layout() calls when this is true.
bool ignore_layouts_;
DISALLOW_COPY_AND_ASSIGN(DetailsContainerView);
};
// A view that contains a suggestion (such as a known address) and a link to
// edit the suggestion.
class SuggestionView : public views::View {
@ -612,7 +636,7 @@ class AutofillDialogViews : public AutofillDialogView,
views::ScrollView* scrollable_area_;
// View to host details sections.
views::View* details_container_;
DetailsContainerView* details_container_;
// A view that overlays |this| (for "loading..." messages).
views::View* loading_shield_;