Commit 443898f5 authored by vollick@chromium.org's avatar vollick@chromium.org

Avoid div-by-zero in thumb quad computation

We used to have trouble when the max scroll offset was zero. With this
cl we detect this case and set a reasonable scroll thumb offset.

BUG=None

Review URL: https://codereview.chromium.org/409193002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@284773 0039d316-1c4b-4281-b951-d872f2087c98
parent 490598e1
......@@ -212,9 +212,13 @@ gfx::Rect ScrollbarLayerImplBase::ComputeThumbQuadRect() const {
// With the length known, we can compute the thumb's position.
float clamped_current_pos =
std::min(std::max(current_pos_, 0.f), static_cast<float>(maximum_));
float ratio = clamped_current_pos / maximum_;
float max_offset = track_length - thumb_length;
int thumb_offset = static_cast<int>(ratio * max_offset) + TrackStart();
int thumb_offset = TrackStart();
if (maximum_ > 0) {
float ratio = clamped_current_pos / maximum_;
float max_offset = track_length - thumb_length;
thumb_offset += static_cast<int>(ratio * max_offset);
}
float thumb_thickness_adjustment =
thumb_thickness * (1.f - thumb_thickness_scale_factor_);
......
......@@ -274,7 +274,7 @@ TEST(ScrollbarLayerTest, ThumbRect) {
TEST(ScrollbarLayerTest, SolidColorDrawQuads) {
const int kThumbThickness = 3;
const int kTrackStart = 0;
const int kTrackStart = 1;
const int kTrackLength = 100;
LayerTreeSettings layer_tree_settings;
......@@ -303,7 +303,7 @@ TEST(ScrollbarLayerTest, SolidColorDrawQuads) {
const QuadList& quads = render_pass->quad_list;
ASSERT_EQ(1u, quads.size());
EXPECT_EQ(DrawQuad::SOLID_COLOR, quads[0]->material);
EXPECT_RECT_EQ(gfx::Rect(6, 0, 40, 3), quads[0]->rect);
EXPECT_RECT_EQ(gfx::Rect(6, 0, 39, 3), quads[0]->rect);
}
// Contents scale should scale the draw quad.
......@@ -319,7 +319,7 @@ TEST(ScrollbarLayerTest, SolidColorDrawQuads) {
const QuadList& quads = render_pass->quad_list;
ASSERT_EQ(1u, quads.size());
EXPECT_EQ(DrawQuad::SOLID_COLOR, quads[0]->material);
EXPECT_RECT_EQ(gfx::Rect(12, 0, 80, 6), quads[0]->rect);
EXPECT_RECT_EQ(gfx::Rect(12, 0, 78, 6), quads[0]->rect);
}
scrollbar_layer_impl->draw_properties().contents_scale_x = 1.f;
scrollbar_layer_impl->draw_properties().contents_scale_y = 1.f;
......@@ -337,7 +337,23 @@ TEST(ScrollbarLayerTest, SolidColorDrawQuads) {
const QuadList& quads = render_pass->quad_list;
ASSERT_EQ(1u, quads.size());
EXPECT_EQ(DrawQuad::SOLID_COLOR, quads[0]->material);
EXPECT_RECT_EQ(gfx::Rect(8, 0, 20, 3), quads[0]->rect);
EXPECT_RECT_EQ(gfx::Rect(8, 0, 19, 3), quads[0]->rect);
}
// We shouldn't attempt div-by-zero when the maximum is zero.
scrollbar_layer_impl->SetCurrentPos(0.f);
scrollbar_layer_impl->SetMaximum(0);
{
MockOcclusionTracker<LayerImpl> occlusion_tracker;
scoped_ptr<RenderPass> render_pass = RenderPass::Create();
AppendQuadsData data;
scrollbar_layer_impl->AppendQuads(
render_pass.get(), occlusion_tracker, &data);
const QuadList& quads = render_pass->quad_list;
ASSERT_EQ(1u, quads.size());
EXPECT_EQ(DrawQuad::SOLID_COLOR, quads[0]->material);
EXPECT_RECT_EQ(gfx::Rect(1, 0, 19, 3), quads[0]->rect);
}
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment