15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/disambiguation_popup_helper.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebRect.h" 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebVector.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size_conversions.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// these constants are copied from the implementation class 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const float kDisambiguationPopupMaxScale = 5.0; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const float kDisambiguationPopupMinScale = 2.0; 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // unnamed namespace 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DisambiguationPopupHelperUnittest : public testing::Test { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisambiguationPopupHelperUnittest() 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : kScreenSize_(640, 480) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) , kVisibleContentSize_(640, 480) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) , kImplScale_(1) { } 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Size kScreenSize_; 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Size kVisibleContentSize_; 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const float kImplScale_; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DisambiguationPopupHelperUnittest, ClipByViewport) { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect tap_rect(1000, 1000, 10, 10); 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebVector<blink::WebRect> target_rects(static_cast<size_t>(1)); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_rects[0] = gfx::Rect(-20, -20, 10, 10); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect zoom_rect; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float scale = DisambiguationPopupHelper::ComputeZoomAreaAndScaleFactor( 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tap_rect, target_rects, kScreenSize_, kVisibleContentSize_, kImplScale_, 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &zoom_rect); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(gfx::Rect(kVisibleContentSize_).Contains(zoom_rect)); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_LE(kDisambiguationPopupMinScale, scale); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size scaled_size = ToCeiledSize(ScaleSize(zoom_rect.size(), scale)); 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(gfx::Rect(kScreenSize_).Contains(gfx::Rect(scaled_size))); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DisambiguationPopupHelperUnittest, MiniTarget) { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect tap_rect(-5, -5, 20, 20); 53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebVector<blink::WebRect> target_rects(static_cast<size_t>(1)); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_rects[0] = gfx::Rect(10, 10, 1, 1); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect zoom_rect; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float scale = DisambiguationPopupHelper::ComputeZoomAreaAndScaleFactor( 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tap_rect, target_rects, kScreenSize_, kVisibleContentSize_, kImplScale_, 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &zoom_rect); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(gfx::Rect(kVisibleContentSize_).Contains(zoom_rect)); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kDisambiguationPopupMaxScale, scale); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(zoom_rect.Contains(target_rects[0])); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size scaled_size = ToCeiledSize(ScaleSize(zoom_rect.size(), scale)); 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(gfx::Rect(kScreenSize_).Contains(gfx::Rect(scaled_size))); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DisambiguationPopupHelperUnittest, LongLinks) { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect tap_rect(10, 10, 20, 20); 71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebVector<blink::WebRect> target_rects(static_cast<size_t>(2)); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_rects[0] = gfx::Rect(15, 15, 1000, 5); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_rects[1] = gfx::Rect(15, 25, 1000, 5); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect zoom_rect; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float scale = DisambiguationPopupHelper::ComputeZoomAreaAndScaleFactor( 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tap_rect, target_rects, kScreenSize_, kVisibleContentSize_, kImplScale_, 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &zoom_rect); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(gfx::Rect(kVisibleContentSize_).Contains(zoom_rect)); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kDisambiguationPopupMaxScale, scale); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(zoom_rect.Contains(tap_rect)); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size scaled_size = ToCeiledSize(ScaleSize(zoom_rect.size(), scale)); 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(gfx::Rect(kScreenSize_).Contains(gfx::Rect(scaled_size))); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace content 89