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 { ...@@ -212,9 +212,13 @@ gfx::Rect ScrollbarLayerImplBase::ComputeThumbQuadRect() const {
// With the length known, we can compute the thumb's position. // With the length known, we can compute the thumb's position.
float clamped_current_pos = float clamped_current_pos =
std::min(std::max(current_pos_, 0.f), static_cast<float>(maximum_)); 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 = TrackStart();
int thumb_offset = static_cast<int>(ratio * max_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 = float thumb_thickness_adjustment =
thumb_thickness * (1.f - thumb_thickness_scale_factor_); thumb_thickness * (1.f - thumb_thickness_scale_factor_);
......
...@@ -274,7 +274,7 @@ TEST(ScrollbarLayerTest, ThumbRect) { ...@@ -274,7 +274,7 @@ TEST(ScrollbarLayerTest, ThumbRect) {
TEST(ScrollbarLayerTest, SolidColorDrawQuads) { TEST(ScrollbarLayerTest, SolidColorDrawQuads) {
const int kThumbThickness = 3; const int kThumbThickness = 3;
const int kTrackStart = 0; const int kTrackStart = 1;
const int kTrackLength = 100; const int kTrackLength = 100;
LayerTreeSettings layer_tree_settings; LayerTreeSettings layer_tree_settings;
...@@ -303,7 +303,7 @@ TEST(ScrollbarLayerTest, SolidColorDrawQuads) { ...@@ -303,7 +303,7 @@ TEST(ScrollbarLayerTest, SolidColorDrawQuads) {
const QuadList& quads = render_pass->quad_list; const QuadList& quads = render_pass->quad_list;
ASSERT_EQ(1u, quads.size()); ASSERT_EQ(1u, quads.size());
EXPECT_EQ(DrawQuad::SOLID_COLOR, quads[0]->material); 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. // Contents scale should scale the draw quad.
...@@ -319,7 +319,7 @@ TEST(ScrollbarLayerTest, SolidColorDrawQuads) { ...@@ -319,7 +319,7 @@ TEST(ScrollbarLayerTest, SolidColorDrawQuads) {
const QuadList& quads = render_pass->quad_list; const QuadList& quads = render_pass->quad_list;
ASSERT_EQ(1u, quads.size()); ASSERT_EQ(1u, quads.size());
EXPECT_EQ(DrawQuad::SOLID_COLOR, quads[0]->material); 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_x = 1.f;
scrollbar_layer_impl->draw_properties().contents_scale_y = 1.f; scrollbar_layer_impl->draw_properties().contents_scale_y = 1.f;
...@@ -337,7 +337,23 @@ TEST(ScrollbarLayerTest, SolidColorDrawQuads) { ...@@ -337,7 +337,23 @@ TEST(ScrollbarLayerTest, SolidColorDrawQuads) {
const QuadList& quads = render_pass->quad_list; const QuadList& quads = render_pass->quad_list;
ASSERT_EQ(1u, quads.size()); ASSERT_EQ(1u, quads.size());
EXPECT_EQ(DrawQuad::SOLID_COLOR, quads[0]->material); 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