Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1496)

Side by Side Diff: components/infobars/core/infobar.cc

Issue 765643003: Remove dependency from infobars component to the embedder (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix compilation Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « components/infobars/core/infobar.h ('k') | components/infobars/core/infobar_android.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/infobars/core/infobar.h" 5 #include "components/infobars/core/infobar.h"
6 6
7 #include <cmath> 7 #include <cmath>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "build/build_config.h" 10 #include "build/build_config.h"
11 #include "components/infobars/core/infobar_container.h" 11 #include "components/infobars/core/infobar_container.h"
12 #include "components/infobars/core/infobar_manager.h" 12 #include "components/infobars/core/infobar_manager.h"
13 #include "ui/gfx/animation/slide_animation.h" 13 #include "ui/gfx/animation/slide_animation.h"
14 14
15 namespace infobars { 15 namespace infobars {
16 16
17 InfoBar::InfoBar(scoped_ptr<InfoBarDelegate> delegate) 17 InfoBar::InfoBar(scoped_ptr<InfoBarDelegate> delegate)
18 : owner_(NULL), 18 : owner_(nullptr),
19 delegate_(delegate.Pass()), 19 delegate_(delegate.Pass()),
20 container_(NULL), 20 container_(nullptr),
21 animation_(this), 21 animation_(this),
22 arrow_height_(0), 22 arrow_height_(0),
23 arrow_target_height_(kDefaultArrowTargetHeight), 23 arrow_target_height_(0),
24 arrow_half_width_(0), 24 arrow_half_width_(0),
25 bar_height_(0), 25 bar_height_(0),
26 bar_target_height_(kDefaultBarTargetHeight) { 26 bar_target_height_(0) {
27 DCHECK(delegate_ != NULL); 27 DCHECK(delegate_ != nullptr);
28 animation_.SetTweenType(gfx::Tween::LINEAR); 28 animation_.SetTweenType(gfx::Tween::LINEAR);
29 delegate_->set_infobar(this); 29 delegate_->set_infobar(this);
30 } 30 }
31 31
32 InfoBar::~InfoBar() { 32 InfoBar::~InfoBar() {
33 DCHECK(!owner_); 33 DCHECK(!owner_);
34 } 34 }
35 35
36 // static 36 // static
37 SkColor InfoBar::GetTopColor(InfoBarDelegate::Type infobar_type) { 37 SkColor InfoBar::GetTopColor(InfoBarDelegate::Type infobar_type) {
(...skipping 11 matching lines...) Expand all
49 SkColorSetRGB(250, 230, 145); // Yellow 49 SkColorSetRGB(250, 230, 145); // Yellow
50 static const SkColor kPageActionBackgroundColorBottom = 50 static const SkColor kPageActionBackgroundColorBottom =
51 SkColorSetRGB(217, 217, 217); // Gray 51 SkColorSetRGB(217, 217, 217); // Gray
52 return (infobar_type == InfoBarDelegate::WARNING_TYPE) ? 52 return (infobar_type == InfoBarDelegate::WARNING_TYPE) ?
53 kWarningBackgroundColorBottom : kPageActionBackgroundColorBottom; 53 kWarningBackgroundColorBottom : kPageActionBackgroundColorBottom;
54 } 54 }
55 55
56 void InfoBar::SetOwner(InfoBarManager* owner) { 56 void InfoBar::SetOwner(InfoBarManager* owner) {
57 DCHECK(!owner_); 57 DCHECK(!owner_);
58 owner_ = owner; 58 owner_ = owner;
59 const InfoBarConstants& constants = owner_->GetInfoBarConstants();
60 arrow_target_height_ = constants.default_arrow_target_height;
61 bar_target_height_ = constants.default_bar_target_height;
59 delegate_->StoreActiveEntryUniqueID(); 62 delegate_->StoreActiveEntryUniqueID();
60 PlatformSpecificSetOwner(); 63 PlatformSpecificSetOwner();
61 } 64 }
62 65
63 void InfoBar::Show(bool animate) { 66 void InfoBar::Show(bool animate) {
64 PlatformSpecificShow(animate); 67 PlatformSpecificShow(animate);
65 if (animate) { 68 if (animate) {
66 animation_.Show(); 69 animation_.Show();
67 } else { 70 } else {
68 animation_.Reset(1.0); 71 animation_.Reset(1.0);
69 RecalculateHeights(true); 72 RecalculateHeights(true);
70 } 73 }
71 } 74 }
72 75
73 void InfoBar::Hide(bool animate) { 76 void InfoBar::Hide(bool animate) {
74 PlatformSpecificHide(animate); 77 PlatformSpecificHide(animate);
75 if (animate) { 78 if (animate) {
76 animation_.Hide(); 79 animation_.Hide();
77 } else { 80 } else {
78 animation_.Reset(0.0); 81 animation_.Reset(0.0);
79 // We want to remove ourselves from the container immediately even if we 82 // We want to remove ourselves from the container immediately even if we
80 // still have an owner, which MaybeDelete() won't do. 83 // still have an owner, which MaybeDelete() won't do.
81 DCHECK(container_); 84 DCHECK(container_);
82 container_->RemoveInfoBar(this); 85 container_->RemoveInfoBar(this);
83 MaybeDelete(); // Necessary if the infobar was already closing. 86 MaybeDelete(); // Necessary if the infobar was already closing.
84 } 87 }
85 } 88 }
86 89
87 void InfoBar::SetArrowTargetHeight(int height) { 90 void InfoBar::SetArrowTargetHeight(int height) {
88 DCHECK_LE(height, kMaximumArrowTargetHeight); 91 DCHECK(owner_);
92 DCHECK_LE(height, owner_->GetInfoBarConstants().maximum_arrow_target_height);
89 // Once the closing animation starts, we ignore further requests to change the 93 // Once the closing animation starts, we ignore further requests to change the
90 // target height. 94 // target height.
91 if ((arrow_target_height_ != height) && !animation_.IsClosing()) { 95 if ((arrow_target_height_ != height) && !animation_.IsClosing()) {
92 arrow_target_height_ = height; 96 arrow_target_height_ = height;
93 RecalculateHeights(false); 97 RecalculateHeights(false);
94 } 98 }
95 } 99 }
96 100
97 void InfoBar::CloseSoon() { 101 void InfoBar::CloseSoon() {
98 owner_ = NULL; 102 owner_ = nullptr;
99 PlatformSpecificOnCloseSoon(); 103 PlatformSpecificOnCloseSoon();
100 MaybeDelete(); 104 MaybeDelete();
101 } 105 }
102 106
103 void InfoBar::RemoveSelf() { 107 void InfoBar::RemoveSelf() {
104 if (owner_) 108 if (owner_)
105 owner_->RemoveInfoBar(this); 109 owner_->RemoveInfoBar(this);
106 } 110 }
107 111
108 void InfoBar::SetBarTargetHeight(int height) { 112 void InfoBar::SetBarTargetHeight(int height) {
(...skipping 10 matching lines...) Expand all
119 void InfoBar::AnimationEnded(const gfx::Animation* animation) { 123 void InfoBar::AnimationEnded(const gfx::Animation* animation) {
120 // When the animation ends, we must ensure the container is notified even if 124 // When the animation ends, we must ensure the container is notified even if
121 // the heights haven't changed, lest it never get an "animation finished" 125 // the heights haven't changed, lest it never get an "animation finished"
122 // notification. (If the browser doesn't get this notification, it will not 126 // notification. (If the browser doesn't get this notification, it will not
123 // bother to re-layout the content area for the new infobar size.) 127 // bother to re-layout the content area for the new infobar size.)
124 RecalculateHeights(true); 128 RecalculateHeights(true);
125 MaybeDelete(); 129 MaybeDelete();
126 } 130 }
127 131
128 void InfoBar::RecalculateHeights(bool force_notify) { 132 void InfoBar::RecalculateHeights(bool force_notify) {
133 DCHECK(owner_);
134 const InfoBarConstants& constants = owner_->GetInfoBarConstants();
129 int old_arrow_height = arrow_height_; 135 int old_arrow_height = arrow_height_;
130 int old_bar_height = bar_height_; 136 int old_bar_height = bar_height_;
131 137
132 // Find the desired arrow height/half-width. The arrow area is 138 // Find the desired arrow height/half-width. The arrow area is
133 // |arrow_height_| * |arrow_half_width_|. When the bar is opening or closing, 139 // |arrow_height_| * |arrow_half_width_|. When the bar is opening or closing,
134 // scaling each of these with the square root of the animation value causes a 140 // scaling each of these with the square root of the animation value causes a
135 // linear animation of the area, which matches the perception of the animation 141 // linear animation of the area, which matches the perception of the animation
136 // of the bar portion. 142 // of the bar portion.
137 double scale_factor = sqrt(animation_.GetCurrentValue()); 143 double scale_factor = sqrt(animation_.GetCurrentValue());
138 arrow_height_ = static_cast<int>(arrow_target_height_ * scale_factor); 144 arrow_height_ = static_cast<int>(arrow_target_height_ * scale_factor);
139 if (animation_.is_animating()) { 145 if (animation_.is_animating()) {
140 arrow_half_width_ = static_cast<int>(std::min(arrow_target_height_, 146 arrow_half_width_ =
141 kMaximumArrowTargetHalfWidth) * scale_factor); 147 static_cast<int>(std::min(arrow_target_height_,
148 constants.maximum_arrow_target_half_width) *
149 scale_factor);
142 } else { 150 } else {
143 // When the infobar is not animating (i.e. fully open), we set the 151 // When the infobar is not animating (i.e. fully open), we set the
144 // half-width to be proportionally the same distance between its default and 152 // half-width to be proportionally the same distance between its default and
145 // maximum values as the height is between its. 153 // maximum values as the height is between its.
146 arrow_half_width_ = kDefaultArrowTargetHalfWidth + 154 arrow_half_width_ =
147 ((kMaximumArrowTargetHalfWidth - kDefaultArrowTargetHalfWidth) * 155 constants.default_arrow_target_half_width +
148 ((arrow_height_ - kDefaultArrowTargetHeight) / 156 ((constants.maximum_arrow_target_half_width -
149 (kMaximumArrowTargetHeight - kDefaultArrowTargetHeight))); 157 constants.default_arrow_target_half_width) *
158 ((arrow_height_ - constants.default_arrow_target_height) /
159 (constants.maximum_arrow_target_height -
160 constants.default_arrow_target_height)));
150 } 161 }
151 // Add pixels for the stroke, if the arrow is to be visible at all. Without 162 // Add pixels for the stroke, if the arrow is to be visible at all. Without
152 // this, changing the arrow height from 0 to kSeparatorLineHeight would 163 // this, changing the arrow height from 0 to constants.separator_line_height
153 // produce no visible effect, because the stroke would paint atop the divider 164 // would produce no visible effect, because the stroke would paint atop the
154 // line above the infobar. 165 // divider line above the infobar.
155 if (arrow_height_) 166 if (arrow_height_)
156 arrow_height_ += kSeparatorLineHeight; 167 arrow_height_ += constants.separator_line_height;
157 168
158 bar_height_ = animation_.CurrentValueBetween(0, bar_target_height_); 169 bar_height_ = animation_.CurrentValueBetween(0, bar_target_height_);
159 170
160 // Don't re-layout if nothing has changed, e.g. because the animation step was 171 // Don't re-layout if nothing has changed, e.g. because the animation step was
161 // not large enough to actually change the heights by at least a pixel. 172 // not large enough to actually change the heights by at least a pixel.
162 bool heights_differ = 173 bool heights_differ =
163 (old_arrow_height != arrow_height_) || (old_bar_height != bar_height_); 174 (old_arrow_height != arrow_height_) || (old_bar_height != bar_height_);
164 if (heights_differ) 175 if (heights_differ)
165 PlatformSpecificOnHeightsRecalculated(); 176 PlatformSpecificOnHeightsRecalculated();
166 177
167 if (container_ && (heights_differ || force_notify)) 178 if (container_ && (heights_differ || force_notify))
168 container_->OnInfoBarStateChanged(animation_.is_animating()); 179 container_->OnInfoBarStateChanged(animation_.is_animating());
169 } 180 }
170 181
171 void InfoBar::MaybeDelete() { 182 void InfoBar::MaybeDelete() {
172 if (!owner_ && (animation_.GetCurrentValue() == 0.0)) { 183 if (!owner_ && (animation_.GetCurrentValue() == 0.0)) {
173 if (container_) 184 if (container_)
174 container_->RemoveInfoBar(this); 185 container_->RemoveInfoBar(this);
175 delete this; 186 delete this;
176 } 187 }
177 } 188 }
178 189
179 } // namespace infobars 190 } // namespace infobars
OLDNEW
« no previous file with comments | « components/infobars/core/infobar.h ('k') | components/infobars/core/infobar_android.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698