view_unittest.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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 <map> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/rand_util.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/string_util.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/utf_string_conversions.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/ui_strings.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/accelerators/accelerator.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/clipboard/clipboard.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/events/event.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/keycodes/keyboard_codes.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/models/simple_menu_model.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/compositor.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer_animator.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/canvas.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/path.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/transform.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/background.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/button/button_dropdown.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/button/checkbox.h" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/button/label_button.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/native/native_view_host.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/scroll_view.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/textfield/textfield.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/focus/accelerator_handler.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/focus/view_storage.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/test/views_test_base.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/view.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/views_delegate.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/native_widget.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/root_view.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/window/dialog_client_view.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/window/dialog_delegate.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/test/test_views_delegate.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/root_window.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/gestures/gesture_recognizer.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true if |ancestor| is an ancestor of |layer|. 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool LayerIsAncestor(const ui::Layer* ancestor, const ui::Layer* layer) { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (layer && layer != ancestor) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layer = layer->parent(); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return layer == ancestor; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Convenience functions for walking a View tree. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const views::View* FirstView(const views::View* view) { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const views::View* v = view; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (v->has_children()) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v = v->child_at(0); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return v; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const views::View* NextView(const views::View* view) { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const views::View* v = view; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const views::View* parent = v->parent(); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!parent) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int next = parent->GetIndexOf(v) + 1; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (next != parent->child_count()) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return FirstView(parent->child_at(next)); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return parent; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Convenience functions for walking a Layer tree. 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const ui::Layer* FirstLayer(const ui::Layer* layer) { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Layer* l = layer; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (l->children().size() > 0) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l = l->children()[0]; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return l; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const ui::Layer* NextLayer(const ui::Layer* layer) { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Layer* parent = layer->parent(); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!parent) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<ui::Layer*> children = parent->children(); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t index; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (index = 0; index < children.size(); index++) { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (children[index] == layer) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t next = index + 1; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (next < children.size()) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return FirstLayer(children[next]); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return parent; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Given the root nodes of a View tree and a Layer tree, makes sure the two 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// trees are in sync. 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ViewAndLayerTreeAreConsistent(const views::View* view, 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Layer* layer) { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const views::View* v = FirstView(view); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Layer* l = FirstLayer(layer); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (v && l) { 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Find the view with a layer. 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (v && !v->layer()) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v = NextView(v); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!v) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check if the View tree and the Layer tree are in sync. 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(l, v->layer()); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (v->layer() != l) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check if the visibility states of the View and the Layer are in sync. 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(l->IsDrawn(), v->IsDrawn()); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (v->IsDrawn() != l->IsDrawn()) { 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (const views::View* vv = v; vv; vv = vv->parent()) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "V: " << vv << " " << vv->visible() << " " 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << vv->IsDrawn() << " " << vv->layer(); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (const ui::Layer* ll = l; ll; ll = ll->parent()) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "L: " << ll << " " << ll->IsDrawn(); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check if the size of the View and the Layer are in sync. 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(l->bounds(), v->bounds()); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (v->bounds() != l->bounds()) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (v == view || l == layer) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return v == view && l == layer; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v = NextView(v); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l = NextLayer(l); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Constructs a View tree with the specified depth. 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ConstructTree(views::View* view, int depth) { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (depth == 0) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int count = base::RandInt(1, 5); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < count; i++) { 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::View* v = new views::View; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->AddChildView(v); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base::RandDouble() > 0.5) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v->SetPaintToLayer(true); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base::RandDouble() < 0.2) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v->SetVisible(false); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConstructTree(v, depth - 1); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ScrambleTree(views::View* view) { 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int count = view->child_count(); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (count == 0) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < count; i++) { 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScrambleTree(view->child_at(i)); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (count > 1) { 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int a = base::RandInt(0, count - 1); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int b = base::RandInt(0, count - 1); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::View* view_a = view->child_at(a); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::View* view_b = view->child_at(b); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->ReorderChildView(view_a, b); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->ReorderChildView(view_b, a); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!view->layer() && base::RandDouble() < 0.1) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->SetPaintToLayer(true); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base::RandDouble() < 0.1) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->SetVisible(!view->visible()); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Convenience to make constructing a GestureEvent simpler. 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GestureEventForTest : public ui::GestureEvent { 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GestureEventForTest(ui::EventType type, int x, int y, int flags) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : GestureEvent(type, x, y, flags, base::TimeDelta(), 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::GestureEventDetails(type, 0.0f, 0.0f), 0) { 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(GestureEventForTest); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views { 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef ViewsTestBase ViewTest; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A derived class for testing purpose. 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestView : public View { 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView() : View(), delete_on_pressed_(false), in_touch_sequence_(false) {} 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestView() {} 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reset all test state 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Reset() { 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_change_bounds_ = false; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_mouse_event_type_ = 0; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_.SetPoint(0, 0); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) received_mouse_enter_ = false; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) received_mouse_exit_ = false; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_touch_event_type_ = 0; 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_touch_event_was_handled_ = false; 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_gesture_event_type_ = 0; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_gesture_event_was_handled_ = false; 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_clip_.setEmpty(); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerator_count_map_.clear(); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnBoundsChanged(const gfx::Rect& previous_bounds) OVERRIDE; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnMousePressed(const ui::MouseEvent& event) OVERRIDE; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnMouseDragged(const ui::MouseEvent& event) OVERRIDE; 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnMouseReleased(const ui::MouseEvent& event) OVERRIDE; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnMouseEntered(const ui::MouseEvent& event) OVERRIDE; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnMouseExited(const ui::MouseEvent& event) OVERRIDE; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnTouchEvent(ui::TouchEvent* event) OVERRIDE; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ignores GestureEvent by default. 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Paint(gfx::Canvas* canvas) OVERRIDE; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SchedulePaintInRect(const gfx::Rect& rect) OVERRIDE; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool AcceleratorPressed(const ui::Accelerator& accelerator) OVERRIDE; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OnBoundsChanged. 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_change_bounds_; 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect new_bounds_; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // MouseEvent. 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int last_mouse_event_type_; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point location_; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool received_mouse_enter_; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool received_mouse_exit_; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool delete_on_pressed_; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Painting. 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<gfx::Rect> scheduled_paint_rects_; 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // GestureEvent 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int last_gesture_event_type_; 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool last_gesture_event_was_handled_; 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TouchEvent. 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int last_touch_event_type_; 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool last_touch_event_was_handled_; 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool in_touch_sequence_; 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Painting. 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkRect last_clip_; 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Accelerators. 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<ui::Accelerator, int> accelerator_count_map_; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A view subclass that ignores all touch events for testing purposes. 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestViewIgnoreTouch : public TestView { 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestViewIgnoreTouch() : TestView() {} 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestViewIgnoreTouch() {} 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnTouchEvent(ui::TouchEvent* event) OVERRIDE; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A view subclass that consumes all Gesture events for testing purposes. 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestViewConsumeGesture : public TestView { 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestViewConsumeGesture() : TestView() {} 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestViewConsumeGesture() {} 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE { 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_gesture_event_type_ = event->type(); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_.SetPoint(event->x(), event->y()); 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event->StopPropagation(); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestViewConsumeGesture); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A view subclass that ignores all Gesture events. 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestViewIgnoreGesture: public TestView { 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestViewIgnoreGesture() : TestView() {} 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestViewIgnoreGesture() {} 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE { 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestViewIgnoreGesture); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A view subclass that ignores all scroll-gesture events, but consume all other 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// gesture events. 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestViewIgnoreScrollGestures : public TestViewConsumeGesture { 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestViewIgnoreScrollGestures() {} 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestViewIgnoreScrollGestures() {} 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE { 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (event->IsScrollGestureEvent()) 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestViewConsumeGesture::OnGestureEvent(event); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestViewIgnoreScrollGestures); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OnBoundsChanged 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestView::OnBoundsChanged(const gfx::Rect& previous_bounds) { 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_change_bounds_ = true; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_bounds_ = bounds(); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, OnBoundsChanged) { 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView v; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect prev_rect(0, 0, 200, 200); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect new_rect(100, 100, 250, 250); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v.SetBoundsRect(prev_rect); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v.Reset(); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v.SetBoundsRect(new_rect); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v.did_change_bounds_); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v.new_bounds_, new_rect); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v.bounds(), new_rect); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MouseEvent 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestView::OnMousePressed(const ui::MouseEvent& event) { 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_mouse_event_type_ = event.type(); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_.SetPoint(event.x(), event.y()); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delete_on_pressed_) 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete this; 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestView::OnMouseDragged(const ui::MouseEvent& event) { 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_mouse_event_type_ = event.type(); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_.SetPoint(event.x(), event.y()); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestView::OnMouseReleased(const ui::MouseEvent& event) { 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_mouse_event_type_ = event.type(); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_.SetPoint(event.x(), event.y()); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestView::OnMouseEntered(const ui::MouseEvent& event) { 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) received_mouse_enter_ = true; 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestView::OnMouseExited(const ui::MouseEvent& event) { 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) received_mouse_exit_ = true; 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, MouseEvent) { 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v1 = new TestView(); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetBoundsRect(gfx::Rect(0, 0, 300, 300)); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v2 = new TestView(); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetBoundsRect(gfx::Rect(100, 100, 100, 100)); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Widget> widget(new Widget); 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.bounds = gfx::Rect(50, 50, 650, 650); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Init(params); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::RootView* root = 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<internal::RootView*>(widget->GetRootView()); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->AddChildView(v1); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->AddChildView(v2); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->Reset(); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point p1(110, 120); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent pressed(ui::ET_MOUSE_PRESSED, p1, p1, 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->OnMousePressed(pressed); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2->last_mouse_event_type_, ui::ET_MOUSE_PRESSED); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2->location_.x(), 10); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2->location_.y(), 20); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure v1 did not receive the event 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v1->last_mouse_event_type_, 0); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Drag event out of bounds. Should still go to v2 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->Reset(); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point p2(50, 40); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent dragged(ui::ET_MOUSE_DRAGGED, p2, p2, 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->OnMouseDragged(dragged); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2->last_mouse_event_type_, ui::ET_MOUSE_DRAGGED); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2->location_.x(), -50); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2->location_.y(), -60); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure v1 did not receive the event 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v1->last_mouse_event_type_, 0); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Releasted event out of bounds. Should still go to v2 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->Reset(); 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent released(ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(), 0); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->OnMouseDragged(released); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2->last_mouse_event_type_, ui::ET_MOUSE_RELEASED); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2->location_.x(), -100); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2->location_.y(), -100); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure v1 did not receive the event 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v1->last_mouse_event_type_, 0); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->CloseNow(); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Confirm that a view can be deleted as part of processing a mouse press. 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, DeleteOnPressed) { 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v1 = new TestView(); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetBoundsRect(gfx::Rect(0, 0, 300, 300)); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v2 = new TestView(); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetBoundsRect(gfx::Rect(100, 100, 100, 100)); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->Reset(); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Widget> widget(new Widget); 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.bounds = gfx::Rect(50, 50, 650, 650); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Init(params); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* root = widget->GetRootView(); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->AddChildView(v1); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->AddChildView(v2); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->delete_on_pressed_ = true; 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point point(110, 120); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent pressed(ui::ET_MOUSE_PRESSED, point, point, 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->OnMousePressed(pressed); 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, v1->child_count()); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->CloseNow(); 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TouchEvent 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestView::OnTouchEvent(ui::TouchEvent* event) { 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_touch_event_type_ = event->type(); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_.SetPoint(event->x(), event->y()); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!in_touch_sequence_) { 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (event->type() == ui::ET_TOUCH_PRESSED) { 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) in_touch_sequence_ = true; 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event->StopPropagation(); 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (event->type() == ui::ET_TOUCH_RELEASED) { 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) in_touch_sequence_ = false; 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event->SetHandled(); 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event->StopPropagation(); 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (last_touch_event_was_handled_) 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event->StopPropagation(); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestViewIgnoreTouch::OnTouchEvent(ui::TouchEvent* event) { 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, TouchEvent) { 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v1 = new TestView(); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetBoundsRect(gfx::Rect(0, 0, 300, 300)); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v2 = new TestView(); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetBoundsRect(gfx::Rect(100, 100, 100, 100)); 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v3 = new TestViewIgnoreTouch(); 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->SetBoundsRect(gfx::Rect(0, 0, 100, 100)); 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Widget> widget(new Widget()); 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.bounds = gfx::Rect(50, 50, 650, 650); 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Init(params); 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::RootView* root = 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<internal::RootView*>(widget->GetRootView()); 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->AddChildView(v1); 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->AddChildView(v2); 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->AddChildView(v3); 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |v3| completely obscures |v2|, but all the touch events on |v3| should 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reach |v2| because |v3| doesn't process any touch events. 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure if none of the views handle the touch event, the gesture manager 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // does. 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->Reset(); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TouchEvent unhandled(ui::ET_TOUCH_MOVED, 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point(400, 400), 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, /* no flags */ 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, /* first finger touch */ 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta(), 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1.0, 0.0, 1.0, 0.0); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->DispatchTouchEvent(&unhandled); 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v1->last_touch_event_type_, 0); 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2->last_touch_event_type_, 0); 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test press, drag, release touch sequence. 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->Reset(); 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TouchEvent pressed(ui::ET_TOUCH_PRESSED, 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point(110, 120), 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, /* no flags */ 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, /* first finger touch */ 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta(), 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1.0, 0.0, 1.0, 0.0); 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->last_touch_event_was_handled_ = true; 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->DispatchTouchEvent(&pressed); 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2->last_touch_event_type_, ui::ET_TOUCH_PRESSED); 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2->location_.x(), 10); 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2->location_.y(), 20); 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure v1 did not receive the event 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v1->last_touch_event_type_, 0); 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Drag event out of bounds. Should still go to v2 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->Reset(); 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TouchEvent dragged(ui::ET_TOUCH_MOVED, 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point(50, 40), 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, /* no flags */ 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, /* first finger touch */ 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta(), 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1.0, 0.0, 1.0, 0.0); 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->DispatchTouchEvent(&dragged); 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2->last_touch_event_type_, ui::ET_TOUCH_MOVED); 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2->location_.x(), -50); 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2->location_.y(), -60); 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure v1 did not receive the event 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v1->last_touch_event_type_, 0); 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Released event out of bounds. Should still go to v2 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->Reset(); 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TouchEvent released(ui::ET_TOUCH_RELEASED, gfx::Point(), 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, /* no flags */ 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, /* first finger */ 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta(), 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1.0, 0.0, 1.0, 0.0); 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->last_touch_event_was_handled_ = true; 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->DispatchTouchEvent(&released); 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2->last_touch_event_type_, ui::ET_TOUCH_RELEASED); 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2->location_.x(), -100); 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2->location_.y(), -100); 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure v1 did not receive the event 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v1->last_touch_event_type_, 0); 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->CloseNow(); 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestView::OnGestureEvent(ui::GestureEvent* event) { 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, GestureEvent) { 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Views hierarchy for non delivery of GestureEvent. 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v1 = new TestViewConsumeGesture(); 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetBoundsRect(gfx::Rect(0, 0, 300, 300)); 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v2 = new TestViewConsumeGesture(); 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetBoundsRect(gfx::Rect(100, 100, 100, 100)); 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v3 = new TestViewIgnoreGesture(); 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->SetBoundsRect(gfx::Rect(0, 0, 100, 100)); 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Widget> widget(new Widget()); 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.bounds = gfx::Rect(50, 50, 650, 650); 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Init(params); 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::RootView* root = 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<internal::RootView*>(widget->GetRootView()); 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->AddChildView(v1); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->AddChildView(v2); 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->AddChildView(v3); 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |v3| completely obscures |v2|, but all the gesture events on |v3| should 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reach |v2| because |v3| doesn't process any gesture events. However, since 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |v2| does process gesture events, gesture events on |v3| or |v2| should not 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reach |v1|. 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->Reset(); 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->Reset(); 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gesture on |v3| 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GestureEventForTest g1(ui::ET_GESTURE_TAP, 110, 110, 0); 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->DispatchGestureEvent(&g1); 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_GESTURE_TAP, v2->last_gesture_event_type_); 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Point(10, 10), v2->location_); 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_UNKNOWN, v1->last_gesture_event_type_); 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate an up so that RootView is no longer targetting |v3|. 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GestureEventForTest g1_up(ui::ET_GESTURE_END, 110, 110, 0); 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->DispatchGestureEvent(&g1_up); 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->Reset(); 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->Reset(); 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gesture on |v1| 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GestureEventForTest g2(ui::ET_GESTURE_TAP, 80, 80, 0); 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->DispatchGestureEvent(&g2); 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_GESTURE_TAP, v1->last_gesture_event_type_); 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Point(80, 80), v1->location_); 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_UNKNOWN, v2->last_gesture_event_type_); 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send event |g1| again. Even though the coordinates target |v3| it should go 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to |v1| as that is the view the touch was initially down on. 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->last_gesture_event_type_ = ui::ET_UNKNOWN; 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->last_gesture_event_type_ = ui::ET_UNKNOWN; 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->DispatchGestureEvent(&g1); 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_GESTURE_TAP, v1->last_gesture_event_type_); 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_UNKNOWN, v3->last_gesture_event_type_); 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("110,110", v1->location_.ToString()); 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->CloseNow(); 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, ScrollGestureEvent) { 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Views hierarchy for non delivery of GestureEvent. 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v1 = new TestViewConsumeGesture(); 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetBoundsRect(gfx::Rect(0, 0, 300, 300)); 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v2 = new TestViewIgnoreScrollGestures(); 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetBoundsRect(gfx::Rect(100, 100, 100, 100)); 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v3 = new TestViewIgnoreGesture(); 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->SetBoundsRect(gfx::Rect(0, 0, 100, 100)); 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Widget> widget(new Widget()); 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.bounds = gfx::Rect(50, 50, 650, 650); 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Init(params); 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::RootView* root = 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<internal::RootView*>(widget->GetRootView()); 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->AddChildView(v1); 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->AddChildView(v2); 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->AddChildView(v3); 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |v3| completely obscures |v2|, but all the gesture events on |v3| should 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reach |v2| because |v3| doesn't process any gesture events. However, since 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |v2| does process gesture events, gesture events on |v3| or |v2| should not 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reach |v1|. 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->Reset(); 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->Reset(); 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gesture on |v3| 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GestureEventForTest g1(ui::ET_GESTURE_TAP, 110, 110, 0); 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->DispatchGestureEvent(&g1); 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_GESTURE_TAP, v2->last_gesture_event_type_); 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Point(10, 10), v2->location_); 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_UNKNOWN, v1->last_gesture_event_type_); 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->Reset(); 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send scroll gestures on |v3|. The gesture should reach |v2|, however, 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // since it does not process scroll-gesture events, these events should reach 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |v1|. 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GestureEventForTest gscroll_begin(ui::ET_GESTURE_SCROLL_BEGIN, 115, 115, 0); 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->DispatchGestureEvent(&gscroll_begin); 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_UNKNOWN, v2->last_gesture_event_type_); 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_GESTURE_SCROLL_BEGIN, v1->last_gesture_event_type_); 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send a second tap on |v1|. The event should reach |v2| since it is the 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // default gesture handler, and not |v1| (even though it is the view under the 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // point, and is the scroll event handler). 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GestureEventForTest second_tap(ui::ET_GESTURE_TAP, 70, 70, 0); 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->DispatchGestureEvent(&second_tap); 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_GESTURE_TAP, v2->last_gesture_event_type_); 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_UNKNOWN, v1->last_gesture_event_type_); 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->Reset(); 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GestureEventForTest gscroll_end(ui::ET_GESTURE_SCROLL_END, 50, 50, 0); 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->DispatchGestureEvent(&gscroll_end); 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_GESTURE_SCROLL_END, v1->last_gesture_event_type_); 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate an up so that RootView is no longer targetting |v3|. 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GestureEventForTest g1_up(ui::ET_GESTURE_END, 110, 110, 0); 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->DispatchGestureEvent(&g1_up); 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_GESTURE_END, v2->last_gesture_event_type_); 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->Reset(); 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->Reset(); 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gesture on |v1| 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GestureEventForTest g2(ui::ET_GESTURE_TAP, 80, 80, 0); 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->DispatchGestureEvent(&g2); 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_GESTURE_TAP, v1->last_gesture_event_type_); 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Point(80, 80), v1->location_); 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_UNKNOWN, v2->last_gesture_event_type_); 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send event |g1| again. Even though the coordinates target |v3| it should go 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to |v1| as that is the view the touch was initially down on. 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->last_gesture_event_type_ = ui::ET_UNKNOWN; 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->last_gesture_event_type_ = ui::ET_UNKNOWN; 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->DispatchGestureEvent(&g1); 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_GESTURE_TAP, v1->last_gesture_event_type_); 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_UNKNOWN, v3->last_gesture_event_type_); 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("110,110", v1->location_.ToString()); 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->CloseNow(); 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Painting 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestView::Paint(gfx::Canvas* canvas) { 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas->sk_canvas()->getClipBounds(&last_clip_); 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestView::SchedulePaintInRect(const gfx::Rect& rect) { 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scheduled_paint_rects_.push_back(rect); 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View::SchedulePaintInRect(rect); 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CheckRect(const SkRect& check_rect, const SkRect& target_rect) { 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(target_rect.fLeft, check_rect.fLeft); 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(target_rect.fRight, check_rect.fRight); 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(target_rect.fTop, check_rect.fTop); 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(target_rect.fBottom, check_rect.fBottom); 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* This test is disabled because it is flakey on some systems. 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, DISABLED_Painting) { 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Determine if InvalidateRect generates an empty paint rectangle. 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EmptyWindow paint_window(CRect(50, 50, 650, 650)); 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) paint_window.RedrawWindow(CRect(0, 0, 600, 600), NULL, 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RDW_UPDATENOW | RDW_INVALIDATE | RDW_ALLCHILDREN); 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool empty_paint = paint_window.empty_paint(); 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NativeWidgetWin window; 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window.set_delete_on_destroy(false); 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window.set_window_style(WS_OVERLAPPEDWINDOW); 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window.Init(NULL, gfx::Rect(50, 50, 650, 650), NULL); 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* root = window.GetRootView(); 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v1 = new TestView(); 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetBoundsRect(gfx::Rect(0, 0, 650, 650)); 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->AddChildView(v1); 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v2 = new TestView(); 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetBoundsRect(gfx::Rect(10, 10, 80, 80)); 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->AddChildView(v2); 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v3 = new TestView(); 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->SetBoundsRect(gfx::Rect(10, 10, 60, 60)); 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->AddChildView(v3); 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v4 = new TestView(); 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v4->SetBoundsRect(gfx::Rect(10, 200, 100, 100)); 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->AddChildView(v4); 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure to paint current rects 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PaintRootView(root, empty_paint); 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->Reset(); 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->Reset(); 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v4->Reset(); 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->SchedulePaintInRect(gfx::Rect(10, 10, 10, 10)); 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PaintRootView(root, empty_paint); 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkRect tmp_rect; 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp_rect.iset(10, 10, 20, 20); 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckRect(v3->last_clip_, tmp_rect); 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp_rect.iset(20, 20, 30, 30); 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckRect(v2->last_clip_, tmp_rect); 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp_rect.iset(30, 30, 40, 40); 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckRect(v1->last_clip_, tmp_rect); 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure v4 was not painted 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp_rect.setEmpty(); 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckRect(v4->last_clip_, tmp_rect); 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window.DestroyWindow(); 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, RemoveNotification) { 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewStorage* vs = ViewStorage::GetInstance(); 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* widget = new Widget; 8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget->Init(CreateParams(Widget::InitParams::TYPE_POPUP)); 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* root_view = widget->GetRootView(); 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v1 = new View; 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int s1 = vs->CreateStorageID(); 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vs->StoreView(s1, v1); 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->AddChildView(v1); 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v11 = new View; 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int s11 = vs->CreateStorageID(); 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vs->StoreView(s11, v11); 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->AddChildView(v11); 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v111 = new View; 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int s111 = vs->CreateStorageID(); 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vs->StoreView(s111, v111); 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v11->AddChildView(v111); 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v112 = new View; 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int s112 = vs->CreateStorageID(); 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vs->StoreView(s112, v112); 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v11->AddChildView(v112); 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v113 = new View; 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int s113 = vs->CreateStorageID(); 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vs->StoreView(s113, v113); 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v11->AddChildView(v113); 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v1131 = new View; 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int s1131 = vs->CreateStorageID(); 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vs->StoreView(s1131, v1131); 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v113->AddChildView(v1131); 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v12 = new View; 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int s12 = vs->CreateStorageID(); 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vs->StoreView(s12, v12); 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->AddChildView(v12); 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v2 = new View; 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int s2 = vs->CreateStorageID(); 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vs->StoreView(s2, v2); 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->AddChildView(v2); 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v21 = new View; 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int s21 = vs->CreateStorageID(); 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vs->StoreView(s21, v21); 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->AddChildView(v21); 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v211 = new View; 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int s211 = vs->CreateStorageID(); 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vs->StoreView(s211, v211); 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v21->AddChildView(v211); 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t stored_views = vs->view_count(); 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try removing a leaf view. 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v21->RemoveChildView(v211); 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(stored_views - 1, vs->view_count()); 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, vs->RetrieveView(s211)); 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete v211; // We won't use this one anymore. 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now try removing a view with a hierarchy of depth 1. 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v11->RemoveChildView(v113); 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(stored_views - 3, vs->view_count()); 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, vs->RetrieveView(s113)); 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, vs->RetrieveView(s1131)); 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete v113; // We won't use this one anymore. 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now remove even more. 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->RemoveChildView(v1); 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, vs->RetrieveView(s1)); 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, vs->RetrieveView(s11)); 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, vs->RetrieveView(s12)); 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, vs->RetrieveView(s111)); 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, vs->RetrieveView(s112)); 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Put v1 back for more tests. 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->AddChildView(v1); 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vs->StoreView(s1, v1); 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Synchronously closing the window deletes the view hierarchy, which should 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // remove all its views from ViewStorage. 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->CloseNow(); 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(stored_views - 10, vs->view_count()); 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, vs->RetrieveView(s1)); 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, vs->RetrieveView(s12)); 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, vs->RetrieveView(s11)); 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, vs->RetrieveView(s12)); 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, vs->RetrieveView(s21)); 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, vs->RetrieveView(s111)); 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, vs->RetrieveView(s112)); 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HitTestView : public View { 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit HitTestView(bool has_hittest_mask) 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : has_hittest_mask_(has_hittest_mask) { 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~HitTestView() {} 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from View: 9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool HasHitTestMask() const OVERRIDE { 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return has_hittest_mask_; 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void GetHitTestMask(gfx::Path* mask) const OVERRIDE { 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(has_hittest_mask_); 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(mask); 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkScalar w = SkIntToScalar(width()); 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkScalar h = SkIntToScalar(height()); 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a triangular mask within the bounds of this View. 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mask->moveTo(w / 2, 0); 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mask->lineTo(w, h); 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mask->lineTo(0, h); 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mask->close(); 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_hittest_mask_; 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(HitTestView); 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Point ConvertPointToView(View* view, const gfx::Point& p) { 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point tmp(p); 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View::ConvertPointToTarget(view->GetWidget()->GetRootView(), view, &tmp); 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return tmp; 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect ConvertRectToView(View* view, const gfx::Rect& r) { 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect tmp(r); 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp.set_origin(ConvertPointToView(view, r.origin())); 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return tmp; 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RotateCounterclockwise(gfx::Transform* transform) { 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transform->matrix().set3x3(0, -1, 0, 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, 0, 0, 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 1); 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RotateClockwise(gfx::Transform* transform) { 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transform->matrix().set3x3( 0, 1, 0, 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) -1, 0, 0, 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 1); 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, HitTestMasks) { 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* widget = new Widget; 9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget->Init(params); 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* root_view = widget->GetRootView(); 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->SetBoundsRect(gfx::Rect(0, 0, 500, 500)); 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect v1_bounds = gfx::Rect(0, 0, 100, 100); 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HitTestView* v1 = new HitTestView(false); 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetBoundsRect(v1_bounds); 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->AddChildView(v1); 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect v2_bounds = gfx::Rect(105, 0, 100, 100); 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HitTestView* v2 = new HitTestView(true); 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetBoundsRect(v2_bounds); 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->AddChildView(v2); 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point v1_centerpoint = v1_bounds.CenterPoint(); 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point v2_centerpoint = v2_bounds.CenterPoint(); 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point v1_origin = v1_bounds.origin(); 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point v2_origin = v2_bounds.origin(); 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect r1(10, 10, 110, 15); 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect r2(106, 1, 98, 98); 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect r3(0, 0, 300, 300); 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect r4(115, 342, 200, 10); 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test HitTestPoint 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1->HitTestPoint(ConvertPointToView(v1, v1_centerpoint))); 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v2->HitTestPoint(ConvertPointToView(v2, v2_centerpoint))); 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1->HitTestPoint(ConvertPointToView(v1, v1_origin))); 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v2->HitTestPoint(ConvertPointToView(v2, v2_origin))); 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test HitTestRect 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1->HitTestRect(ConvertRectToView(v1, r1))); 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v2->HitTestRect(ConvertRectToView(v2, r1))); 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v1->HitTestRect(ConvertRectToView(v1, r2))); 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v2->HitTestRect(ConvertRectToView(v2, r2))); 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1->HitTestRect(ConvertRectToView(v1, r3))); 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v2->HitTestRect(ConvertRectToView(v2, r3))); 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v1->HitTestRect(ConvertRectToView(v1, r4))); 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v2->HitTestRect(ConvertRectToView(v2, r4))); 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test GetEventHandlerForPoint 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v1, root_view->GetEventHandlerForPoint(v1_centerpoint)); 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2, root_view->GetEventHandlerForPoint(v2_centerpoint)); 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v1, root_view->GetEventHandlerForPoint(v1_origin)); 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(root_view, root_view->GetEventHandlerForPoint(v2_origin)); 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->CloseNow(); 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, NotifyEnterExitOnChild) { 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* widget = new Widget; 10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget->Init(params); 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* root_view = widget->GetRootView(); 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->SetBoundsRect(gfx::Rect(0, 0, 500, 500)); 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Have this hierarchy of views (the coords here are in root coord): 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // v1 (0, 0, 100, 100) 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - v11 (0, 0, 20, 30) 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - v111 (5, 5, 5, 15) 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - v12 (50, 10, 30, 90) 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - v121 (60, 20, 10, 10) 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // v2 (105, 0, 100, 100) 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - v21 (120, 10, 50, 20) 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v1 = new TestView; 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetBounds(0, 0, 100, 100); 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->AddChildView(v1); 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->set_notify_enter_exit_on_child(true); 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v11 = new TestView; 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v11->SetBounds(0, 0, 20, 30); 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->AddChildView(v11); 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v111 = new TestView; 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v111->SetBounds(5, 5, 5, 15); 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v11->AddChildView(v111); 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v12 = new TestView; 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v12->SetBounds(50, 10, 30, 90); 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->AddChildView(v12); 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v121 = new TestView; 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v121->SetBounds(10, 10, 10, 10); 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v12->AddChildView(v121); 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v2 = new TestView; 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetBounds(105, 0, 100, 100); 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->AddChildView(v2); 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v21 = new TestView; 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v21->SetBounds(15, 10, 50, 20); 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->AddChildView(v21); 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v11->Reset(); 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v111->Reset(); 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v12->Reset(); 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v121->Reset(); 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->Reset(); 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v21->Reset(); 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move the mouse in v111. 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point p1(6, 6); 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent move1(ui::ET_MOUSE_MOVED, p1, p1, 0); 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->OnMouseMoved(move1); 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v111->received_mouse_enter_); 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v11->last_mouse_event_type_); 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1->received_mouse_enter_); 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v111->Reset(); 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now, move into v121. 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point p2(65, 21); 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent move2(ui::ET_MOUSE_MOVED, p2, p2, 0); 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->OnMouseMoved(move2); 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v111->received_mouse_exit_); 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v121->received_mouse_enter_); 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v1->last_mouse_event_type_); 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v111->Reset(); 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v121->Reset(); 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now, move into v11. 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point p3(1, 1); 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent move3(ui::ET_MOUSE_MOVED, p3, p3, 0); 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->OnMouseMoved(move3); 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v121->received_mouse_exit_); 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v11->received_mouse_enter_); 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v1->last_mouse_event_type_); 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v121->Reset(); 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v11->Reset(); 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move to v21. 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point p4(121, 15); 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent move4(ui::ET_MOUSE_MOVED, p4, p4, 0); 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->OnMouseMoved(move4); 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v21->received_mouse_enter_); 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v2->last_mouse_event_type_); 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v11->received_mouse_exit_); 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1->received_mouse_exit_); 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v21->Reset(); 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v11->Reset(); 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move to v1. 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point p5(21, 0); 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent move5(ui::ET_MOUSE_MOVED, p5, p5, 0); 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->OnMouseMoved(move5); 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v21->received_mouse_exit_); 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1->received_mouse_enter_); 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v21->Reset(); 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now, move into v11. 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point p6(15, 15); 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent mouse6(ui::ET_MOUSE_MOVED, p6, p6, 0); 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->OnMouseMoved(mouse6); 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v11->received_mouse_enter_); 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v1->last_mouse_event_type_); 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v11->Reset(); 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move back into v1. Although |v1| had already received an ENTER for mouse6, 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and the mouse remains inside |v1| the whole time, it receives another ENTER 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // when the mouse leaves v11. 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point p7(21, 0); 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent mouse7(ui::ET_MOUSE_MOVED, p7, p7, 0); 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->OnMouseMoved(mouse7); 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v11->received_mouse_exit_); 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v1->received_mouse_enter_); 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->CloseNow(); 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, Textfield) { 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16 kText = ASCIIToUTF16("Reality is that which, when you stop " 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "believing it, doesn't go away."); 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16 kExtraText = ASCIIToUTF16("Pretty deep, Philip!"); 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16 kEmptyString; 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* widget = new Widget; 11842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.bounds = gfx::Rect(0, 0, 100, 100); 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Init(params); 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* root_view = widget->GetRootView(); 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Textfield* textfield = new Textfield(); 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->AddChildView(textfield); 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test setting, appending text. 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield->SetText(kText); 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kText, textfield->text()); 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield->AppendText(kExtraText); 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kText + kExtraText, textfield->text()); 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield->SetText(string16()); 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kEmptyString, textfield->text()); 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test selection related methods. 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield->SetText(kText); 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kEmptyString, textfield->GetSelectedText()); 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield->SelectAll(false); 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kText, textfield->text()); 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield->ClearSelection(); 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kEmptyString, textfield->GetSelectedText()); 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->CloseNow(); 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the Textfield view respond appropiately to cut/copy/paste. 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, TextfieldCutCopyPaste) { 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16 kNormalText = ASCIIToUTF16("Normal"); 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16 kReadOnlyText = ASCIIToUTF16("Read only"); 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16 kPasswordText = ASCIIToUTF16("Password! ** Secret stuff **"); 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::Clipboard* clipboard = ui::Clipboard::GetForCurrentThread(); 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* widget = new Widget; 12202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.bounds = gfx::Rect(0, 0, 100, 100); 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Init(params); 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* root_view = widget->GetRootView(); 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Textfield* normal = new Textfield(); 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Textfield* read_only = new Textfield(); 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_only->SetReadOnly(true); 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Textfield* password = new Textfield(Textfield::STYLE_OBSCURED); 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->AddChildView(normal); 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->AddChildView(read_only); 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->AddChildView(password); 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) normal->SetText(kNormalText); 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_only->SetText(kReadOnlyText); 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) password->SetText(kPasswordText); 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test cut. 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) normal->SelectAll(false); 12432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) normal->ExecuteCommand(IDS_APP_CUT); 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 result; 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) clipboard->ReadText(ui::Clipboard::BUFFER_STANDARD, &result); 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kNormalText, result); 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) normal->SetText(kNormalText); // Let's revert to the original content. 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_only->SelectAll(false); 12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) read_only->ExecuteCommand(IDS_APP_CUT); 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.clear(); 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) clipboard->ReadText(ui::Clipboard::BUFFER_STANDARD, &result); 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cut should have failed, so the clipboard content should not have changed. 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kNormalText, result); 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) password->SelectAll(false); 12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) password->ExecuteCommand(IDS_APP_CUT); 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.clear(); 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) clipboard->ReadText(ui::Clipboard::BUFFER_STANDARD, &result); 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cut should have failed, so the clipboard content should not have changed. 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kNormalText, result); 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test copy. 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start with |read_only| to observe a change in clipboard text. 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_only->SelectAll(false); 12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) read_only->ExecuteCommand(IDS_APP_COPY); 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.clear(); 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) clipboard->ReadText(ui::Clipboard::BUFFER_STANDARD, &result); 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kReadOnlyText, result); 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) normal->SelectAll(false); 12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) normal->ExecuteCommand(IDS_APP_COPY); 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.clear(); 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) clipboard->ReadText(ui::Clipboard::BUFFER_STANDARD, &result); 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kNormalText, result); 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) password->SelectAll(false); 12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) password->ExecuteCommand(IDS_APP_COPY); 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.clear(); 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) clipboard->ReadText(ui::Clipboard::BUFFER_STANDARD, &result); 12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Text cannot be copied from an obscured field; the clipboard won't change. 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kNormalText, result); 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Test paste. 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Attempting to paste kNormalText in a read-only text-field should fail. 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_only->SelectAll(false); 12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) read_only->ExecuteCommand(IDS_APP_PASTE); 12942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kReadOnlyText, read_only->text()); 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) password->SelectAll(false); 12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) password->ExecuteCommand(IDS_APP_PASTE); 12982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kNormalText, password->text()); 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Copy from |read_only| to observe a change in the normal textfield text. 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_only->SelectAll(false); 13022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) read_only->ExecuteCommand(IDS_APP_COPY); 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) normal->SelectAll(false); 13042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) normal->ExecuteCommand(IDS_APP_PASTE); 13052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kReadOnlyText, normal->text()); 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->CloseNow(); 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Accelerators 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestView::AcceleratorPressed(const ui::Accelerator& accelerator) { 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerator_count_map_[accelerator]++; 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) && !defined(USE_AURA) 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, ActivateAccelerator) { 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Register a keyboard accelerator before the view is added to a window. 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::Accelerator return_accelerator(ui::VKEY_RETURN, ui::EF_NONE); 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* view = new TestView(); 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->Reset(); 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->AddAccelerator(return_accelerator); 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(view->accelerator_count_map_[return_accelerator], 0); 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a window and add the view as its child. 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Widget> widget(new Widget); 13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.bounds = gfx::Rect(0, 0, 100, 100); 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Init(params); 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* root = widget->GetRootView(); 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->AddChildView(view); 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Show(); 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the focus manager. 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FocusManager* focus_manager = widget->GetFocusManager(); 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(focus_manager); 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hit the return key and see if it takes effect. 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator)); 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(view->accelerator_count_map_[return_accelerator], 1); 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hit the escape key. Nothing should happen. 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::Accelerator escape_accelerator(ui::VKEY_ESCAPE, ui::EF_NONE); 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(focus_manager->ProcessAccelerator(escape_accelerator)); 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(view->accelerator_count_map_[return_accelerator], 1); 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(view->accelerator_count_map_[escape_accelerator], 0); 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now register the escape key and hit it again. 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->AddAccelerator(escape_accelerator); 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(focus_manager->ProcessAccelerator(escape_accelerator)); 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(view->accelerator_count_map_[return_accelerator], 1); 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(view->accelerator_count_map_[escape_accelerator], 1); 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove the return key accelerator. 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->RemoveAccelerator(return_accelerator); 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(focus_manager->ProcessAccelerator(return_accelerator)); 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(view->accelerator_count_map_[return_accelerator], 1); 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(view->accelerator_count_map_[escape_accelerator], 1); 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add it again. Hit the return key and the escape key. 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->AddAccelerator(return_accelerator); 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator)); 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(view->accelerator_count_map_[return_accelerator], 2); 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(view->accelerator_count_map_[escape_accelerator], 1); 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(focus_manager->ProcessAccelerator(escape_accelerator)); 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(view->accelerator_count_map_[return_accelerator], 2); 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(view->accelerator_count_map_[escape_accelerator], 2); 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove all the accelerators. 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->ResetAccelerators(); 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(focus_manager->ProcessAccelerator(return_accelerator)); 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(view->accelerator_count_map_[return_accelerator], 2); 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(view->accelerator_count_map_[escape_accelerator], 2); 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(focus_manager->ProcessAccelerator(escape_accelerator)); 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(view->accelerator_count_map_[return_accelerator], 2); 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(view->accelerator_count_map_[escape_accelerator], 2); 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->CloseNow(); 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) && !defined(USE_AURA) 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, HiddenViewWithAccelerator) { 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::Accelerator return_accelerator(ui::VKEY_RETURN, ui::EF_NONE); 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* view = new TestView(); 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->Reset(); 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->AddAccelerator(return_accelerator); 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(view->accelerator_count_map_[return_accelerator], 0); 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Widget> widget(new Widget); 13932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.bounds = gfx::Rect(0, 0, 100, 100); 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Init(params); 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* root = widget->GetRootView(); 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->AddChildView(view); 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Show(); 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FocusManager* focus_manager = widget->GetFocusManager(); 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(focus_manager); 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->SetVisible(false); 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(focus_manager->ProcessAccelerator(return_accelerator)); 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->SetVisible(true); 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator)); 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->CloseNow(); 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) && !defined(USE_AURA) 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, ViewInHiddenWidgetWithAccelerator) { 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::Accelerator return_accelerator(ui::VKEY_RETURN, ui::EF_NONE); 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* view = new TestView(); 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->Reset(); 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->AddAccelerator(return_accelerator); 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(view->accelerator_count_map_[return_accelerator], 0); 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Widget> widget(new Widget); 14232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.bounds = gfx::Rect(0, 0, 100, 100); 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Init(params); 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* root = widget->GetRootView(); 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->AddChildView(view); 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FocusManager* focus_manager = widget->GetFocusManager(); 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(focus_manager); 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(focus_manager->ProcessAccelerator(return_accelerator)); 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, view->accelerator_count_map_[return_accelerator]); 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Show(); 14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator)); 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, view->accelerator_count_map_[return_accelerator]); 14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Hide(); 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(focus_manager->ProcessAccelerator(return_accelerator)); 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, view->accelerator_count_map_[return_accelerator]); 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->CloseNow(); 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) && !defined(USE_AURA) 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Mouse-wheel message rerouting 14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScrollableTestView : public View { 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScrollableTestView() { } 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual gfx::Size GetPreferredSize() { 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Size(100, 10000); 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Layout() { 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SizeToPreferredSize(); 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestViewWithControls : public View { 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestViewWithControls() { 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_field_ = new Textfield(); 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChildView(text_field_); 14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Textfield* text_field_; 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SimpleWidgetDelegate : public WidgetDelegate { 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit SimpleWidgetDelegate(View* contents) : contents_(contents) { } 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DeleteDelegate() { delete this; } 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual View* GetContentsView() { return contents_; } 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual Widget* GetWidget() { return contents_->GetWidget(); } 14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual const Widget* GetWidget() const { return contents_->GetWidget(); } 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* contents_; 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the mouse-wheel messages are correctly rerouted to the window 14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// under the mouse. 14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(jcampan): http://crbug.com/10572 Disabled as it fails on the Vista build 14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bot. 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note that this fails for a variety of reasons: 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - focused view is apparently reset across window activations and never 14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// properly restored 14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - this test depends on you not having any other window visible open under the 14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// area that it opens the test windows. --beng 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, DISABLED_RerouteMouseWheelTest) { 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestViewWithControls* view_with_controls = new TestViewWithControls(); 15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* window1 = Widget::CreateWindowWithBounds( 15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new SimpleWidgetDelegate(view_with_controls), 15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect(0, 0, 100, 100)); 15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window1->Show(); 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScrollView* scroll_view = new ScrollView(); 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scroll_view->SetContents(new ScrollableTestView()); 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* window2 = Widget::CreateWindowWithBounds( 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new SimpleWidgetDelegate(scroll_view), 15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect(200, 200, 100, 100)); 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2->Show(); 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, scroll_view->GetVisibleRect().y()); 15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make the window1 active, as this is what it would be in real-world. 15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window1->Activate(); 15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Let's send a mouse-wheel message to the different controls and check that 15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it is rerouted to the window under the mouse (effectively scrolling the 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // scroll-view). 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // First to the Window's HWND. 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::SendMessage(view_with_controls->GetWidget()->GetNativeView(), 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WM_MOUSEWHEEL, MAKEWPARAM(0, -20), MAKELPARAM(250, 250)); 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(20, scroll_view->GetVisibleRect().y()); 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Then the text-field. 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::SendMessage(view_with_controls->text_field_->GetTestingHandle(), 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WM_MOUSEWHEEL, MAKEWPARAM(0, -20), MAKELPARAM(250, 250)); 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(80, scroll_view->GetVisibleRect().y()); 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure we don't scroll when the mouse is not over that window. 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::SendMessage(view_with_controls->text_field_->GetTestingHandle(), 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WM_MOUSEWHEEL, MAKEWPARAM(0, -20), MAKELPARAM(50, 50)); 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(80, scroll_view->GetVisibleRect().y()); 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window1->CloseNow(); 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2->CloseNow(); 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Dialogs' default button 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockMenuModel : public ui::MenuModel { 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_CONST_METHOD0(HasIcons, bool()); 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_CONST_METHOD0(GetItemCount, int()); 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_CONST_METHOD1(GetTypeAt, ItemType(int index)); 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_CONST_METHOD1(GetSeparatorTypeAt, ui::MenuSeparatorType(int index)); 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_CONST_METHOD1(GetCommandIdAt, int(int index)); 15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_CONST_METHOD1(GetLabelAt, string16(int index)); 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_CONST_METHOD1(IsItemDynamicAt, bool(int index)); 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_CONST_METHOD1(GetLabelFontAt, const gfx::Font* (int index)); 15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_CONST_METHOD2(GetAcceleratorAt, bool(int index, 15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::Accelerator* accelerator)); 15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_CONST_METHOD1(IsItemCheckedAt, bool(int index)); 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_CONST_METHOD1(GetGroupIdAt, int(int index)); 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD2(GetIconAt, bool(int index, gfx::Image* icon)); 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_CONST_METHOD1(GetButtonMenuItemAt, ui::ButtonMenuItemModel*(int index)); 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_CONST_METHOD1(IsEnabledAt, bool(int index)); 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_CONST_METHOD1(IsVisibleAt, bool(int index)); 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_CONST_METHOD1(GetSubmenuModelAt, MenuModel*(int index)); 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(HighlightChangedTo, void(int index)); 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(ActivatedAt, void(int index)); 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD2(ActivatedAt, void(int index, int disposition)); 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD0(MenuWillShow, void()); 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD0(MenuClosed, void()); 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(SetMenuModelDelegate, void(ui::MenuModelDelegate* delegate)); 15692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MOCK_CONST_METHOD0(GetMenuModelDelegate, ui::MenuModelDelegate*()); 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD3(GetModelAndIndexForCommandId, bool(int command_id, 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MenuModel** model, int* index)); 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestDialog : public DialogDelegate, public ButtonListener { 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit TestDialog(MockMenuModel* mock_menu_model) 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : contents_(NULL), 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) button1_(NULL), 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) button2_(NULL), 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) checkbox_(NULL), 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) button_drop_(NULL), 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_pressed_button_(NULL), 15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_menu_model_(mock_menu_model), 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canceled_(false), 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oked_(false), 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) closeable_(false), 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_(NULL) { 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void TearDown() { 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now we can close safely. 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) closeable_ = true; 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->Close(); 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_ = NULL; 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // delegate has to be alive while shutting down. 15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop::current()->DeleteSoon(FROM_HERE, this); 15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DialogDelegate implementation: 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int GetDefaultDialogButton() const OVERRIDE { 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::DIALOG_BUTTON_OK; 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual View* GetContentsView() OVERRIDE { 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!contents_) { 16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents_ = new View; 16072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) button1_ = new LabelButton(this, ASCIIToUTF16("Button1")); 16082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) button2_ = new LabelButton(this, ASCIIToUTF16("Button2")); 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) checkbox_ = new Checkbox(ASCIIToUTF16("My checkbox")); 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) button_drop_ = new ButtonDropDown(this, mock_menu_model_); 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents_->AddChildView(button1_); 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents_->AddChildView(button2_); 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents_->AddChildView(checkbox_); 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents_->AddChildView(button_drop_); 16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return contents_; 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Prevent the dialog from really closing (so we can click the OK/Cancel 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // buttons to our heart's content). 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Cancel() OVERRIDE { 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canceled_ = true; 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return closeable_; 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Accept() OVERRIDE { 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oked_ = true; 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return closeable_; 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual Widget* GetWidget() OVERRIDE { 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return widget_; 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual const Widget* GetWidget() const OVERRIDE { 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return widget_; 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ButtonListener implementation. 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ButtonPressed(Button* sender, const ui::Event& event) OVERRIDE { 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_pressed_button_ = sender; 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ResetStates() { 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oked_ = false; 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canceled_ = false; 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_pressed_button_ = NULL; 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up expectations for methods that are called when an (empty) menu is 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // shown from a drop down button. 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ExpectShowDropMenu() { 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mock_menu_model_) { 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*mock_menu_model_, HasIcons()); 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*mock_menu_model_, GetItemCount()); 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*mock_menu_model_, MenuClosed()); 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* contents_; 16592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LabelButton* button1_; 16602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LabelButton* button2_; 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Checkbox* checkbox_; 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ButtonDropDown* button_drop_; 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Button* last_pressed_button_; 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockMenuModel* mock_menu_model_; 16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool canceled_; 16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool oked_; 16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool closeable_; 16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* widget_; 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DefaultButtonTest : public ViewTest { 16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum ButtonID { 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OK, 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CANCEL, 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BUTTON1, 16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BUTTON2 16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DefaultButtonTest() 16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : focus_manager_(NULL), 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_dialog_(NULL), 16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_view_(NULL), 16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ok_button_(NULL), 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cancel_button_(NULL) { 16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE { 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewTest::SetUp(); 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_dialog_ = new TestDialog(NULL); 16922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget* window = new Widget; 16942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW); 16952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.delegate = test_dialog_; 16962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.bounds = gfx::Rect(0, 0, 100, 100); 16972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window->Init(params); 16982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_dialog_->widget_ = window; 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window->Show(); 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) focus_manager_ = test_dialog_->contents_->GetFocusManager(); 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(focus_manager_ != NULL); 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_view_ = 17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<DialogClientView*>(window->client_view()); 17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ok_button_ = client_view_->ok_button(); 17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cancel_button_ = client_view_->cancel_button(); 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() OVERRIDE { 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_dialog_->TearDown(); 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewTest::TearDown(); 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SimulatePressingEnterAndCheckDefaultButton(ButtonID button_id) { 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::KeyEvent event(ui::ET_KEY_PRESSED, ui::VKEY_RETURN, 0, false); 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) focus_manager_->OnKeyEvent(event); 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (button_id) { 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case OK: 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(test_dialog_->oked_); 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(test_dialog_->canceled_); 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(test_dialog_->last_pressed_button_); 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case CANCEL: 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(test_dialog_->oked_); 17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(test_dialog_->canceled_); 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(test_dialog_->last_pressed_button_); 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case BUTTON1: 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(test_dialog_->oked_); 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(test_dialog_->canceled_); 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(test_dialog_->last_pressed_button_ == 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_dialog_->button1_); 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case BUTTON2: 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(test_dialog_->oked_); 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(test_dialog_->canceled_); 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(test_dialog_->last_pressed_button_ == 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_dialog_->button2_); 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_dialog_->ResetStates(); 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FocusManager* focus_manager_; 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDialog* test_dialog_; 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DialogClientView* client_view_; 17472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LabelButton* ok_button_; 17482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LabelButton* cancel_button_; 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DefaultButtonTest, DialogDefaultButtonTest) { 17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Window has just been shown, we expect the default button specified in the 17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DialogDelegate. 17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ok_button_->is_default()); 17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate pressing enter, that should trigger the OK button. 17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulatePressingEnterAndCheckDefaultButton(OK); 17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate focusing another button, it should become the default button. 17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_view_->OnWillChangeFocus(ok_button_, test_dialog_->button1_); 17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(ok_button_->is_default()); 17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(test_dialog_->button1_->is_default()); 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate pressing enter, that should trigger button1. 17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulatePressingEnterAndCheckDefaultButton(BUTTON1); 17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now select something that is not a button, the OK should become the default 17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // button again. 17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_view_->OnWillChangeFocus(test_dialog_->button1_, 17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_dialog_->checkbox_); 17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ok_button_->is_default()); 17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(test_dialog_->button1_->is_default()); 17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulatePressingEnterAndCheckDefaultButton(OK); 17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Select yet another button. 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_view_->OnWillChangeFocus(test_dialog_->checkbox_, 17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_dialog_->button2_); 17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(ok_button_->is_default()); 17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(test_dialog_->button1_->is_default()); 17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(test_dialog_->button2_->is_default()); 17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulatePressingEnterAndCheckDefaultButton(BUTTON2); 17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Focus nothing. 17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_view_->OnWillChangeFocus(test_dialog_->button2_, NULL); 17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ok_button_->is_default()); 17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(test_dialog_->button1_->is_default()); 17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(test_dialog_->button2_->is_default()); 17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulatePressingEnterAndCheckDefaultButton(OK); 17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Focus the cancel button. 17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_view_->OnWillChangeFocus(NULL, cancel_button_); 17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(ok_button_->is_default()); 17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(cancel_button_->is_default()); 17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(test_dialog_->button1_->is_default()); 17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(test_dialog_->button2_->is_default()); 17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulatePressingEnterAndCheckDefaultButton(CANCEL); 17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ButtonDropDownTest : public ViewTest { 17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ButtonDropDownTest() 18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : test_dialog_(NULL), 18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) button_as_view_(NULL) { 18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE { 18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewTest::SetUp(); 18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_dialog_ = new TestDialog(new MockMenuModel()); 18082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget* window = new Widget; 18102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW); 18112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.delegate = test_dialog_; 18122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.bounds = gfx::Rect(0, 0, 100, 100); 18132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window->Init(params); 18142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_dialog_->widget_ = window; 18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window->Show(); 18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_dialog_->button_drop_->SetBoundsRect(gfx::Rect(0, 0, 100, 100)); 18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We have to cast the button back into a View in order to invoke it's 18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OnMouseReleased method. 18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) button_as_view_ = static_cast<View*>(test_dialog_->button_drop_); 18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() OVERRIDE { 18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_dialog_->TearDown(); 18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewTest::TearDown(); 18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDialog* test_dialog_; 18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is owned by test_dialog_. 18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* button_as_view_; 18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ButtonDropDownTest); 18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensure that regular clicks on the drop down button still work. (i.e. - the 18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// click events are processed and the listener gets the click) 18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ButtonDropDownTest, RegularClickTest) { 18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point point(1, 1); 18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent press_event(ui::ET_MOUSE_PRESSED, point, point, 18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON); 18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent release_event(ui::ET_MOUSE_RELEASED, point, point, 18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON); 18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) button_as_view_->OnMousePressed(press_event); 18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) button_as_view_->OnMouseReleased(release_event); 18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(test_dialog_->last_pressed_button_, test_dialog_->button_drop_); 18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// View hierarchy / Visibility changes 18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, ChangeVisibility) { 18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX) 18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make CRITICAL messages fatal 18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(oshima): we probably should enable this for entire tests on linux. 18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_log_set_always_fatal(G_LOG_LEVEL_CRITICAL); 18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Widget> window(CreateWidget()); 18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window->Init(NULL, gfx::Rect(0, 0, 500, 300)); 18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* root_view = window->GetRootView(); 18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NativeTextButton* native = new NativeTextButton(NULL, ASCIIToUTF16("Native")); 18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->SetContentsView(native); 18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native->SetVisible(true); 18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->RemoveChildView(native); 18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native->SetVisible(false); 18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Change visibility to true with no widget. 18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native->SetVisible(true); 18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->SetContentsView(native); 18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native->SetVisible(true); 18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Native view hierachy 18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestNativeViewHierarchy : public View { 18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNativeViewHierarchy() { 18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void NativeViewHierarchyChanged( 18862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool attached, 18872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::NativeView native_view, 18882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) internal::RootView* root_view) OVERRIDE { 18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationInfo info; 18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info.attached = attached; 18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info.native_view = native_view; 18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info.root_view = root_view; 18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notifications_.push_back(info); 18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct NotificationInfo { 18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool attached; 18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::NativeView native_view; 18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::RootView* root_view; 18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const size_t kTotalViews = 2; 19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<NotificationInfo> notifications_; 19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestChangeNativeViewHierarchy { 19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit TestChangeNativeViewHierarchy(ViewTest *view_test) { 19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_test_ = view_test; 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_host_ = new NativeViewHost(); 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_ = new Widget; 19102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = 19112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_test->CreateParams(Widget::InitParams::TYPE_POPUP); 19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.bounds = gfx::Rect(0, 0, 500, 300); 19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->Init(params); 19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->GetRootView()->AddChildView(native_host_); 19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < TestNativeViewHierarchy::kTotalViews; ++i) { 19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows_[i] = new Widget; 19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget::InitParams params(Widget::InitParams::TYPE_CONTROL); 19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.parent = host_->GetNativeView(); 19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.bounds = gfx::Rect(0, 0, 500, 300); 19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows_[i]->Init(params); 19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_views_[i] = windows_[i]->GetRootView(); 19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_views_[i] = new TestNativeViewHierarchy; 19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_views_[i]->AddChildView(test_views_[i]); 19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~TestChangeNativeViewHierarchy() { 19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < TestNativeViewHierarchy::kTotalViews; ++i) { 19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows_[i]->Close(); 19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->Close(); 19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Will close and self-delete widgets - no need to manually delete them. 19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_test_->RunPendingMessages(); 19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CheckEnumeratingNativeWidgets() { 19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!host_->GetTopLevelWidget()) 19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget::Widgets widgets; 19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget::GetAllChildWidgets(host_->GetNativeView(), &widgets); 19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(TestNativeViewHierarchy::kTotalViews + 1, widgets.size()); 19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unfortunately there is no guarantee the sequence of views here so always 19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // go through all of them. 19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (Widget::Widgets::iterator i = widgets.begin(); 19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i != widgets.end(); ++i) { 19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* root_view = (*i)->GetRootView(); 19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (host_->GetRootView() == root_view) 19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t j; 19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (j = 0; j < TestNativeViewHierarchy::kTotalViews; ++j) 19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (root_views_[j] == root_view) 19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // EXPECT_LT/GT/GE() fails to compile with class-defined constants 19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // with gcc, with error 19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // "error: undefined reference to 'TestNativeViewHierarchy::kTotalViews'" 19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so I forced to use EXPECT_TRUE() instead. 19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(TestNativeViewHierarchy::kTotalViews > j); 19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CheckChangingHierarhy() { 19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t i; 19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < TestNativeViewHierarchy::kTotalViews; ++i) { 19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(georgey): use actual hierarchy changes to send notifications. 19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<internal::RootView*>(root_views_[i])-> 19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyNativeViewHierarchyChanged(false, host_->GetNativeView()); 19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<internal::RootView*>(root_views_[i])-> 19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyNativeViewHierarchyChanged(true, host_->GetNativeView()); 19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < TestNativeViewHierarchy::kTotalViews; ++i) { 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(static_cast<size_t>(2), test_views_[i]->notifications_.size()); 19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(test_views_[i]->notifications_[0].attached); 19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(host_->GetNativeView(), 19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_views_[i]->notifications_[0].native_view); 19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(root_views_[i], test_views_[i]->notifications_[0].root_view); 19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(test_views_[i]->notifications_[1].attached); 19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(host_->GetNativeView(), 19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_views_[i]->notifications_[1].native_view); 19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(root_views_[i], test_views_[i]->notifications_[1].root_view); 19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NativeViewHost* native_host_; 19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* host_; 19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* windows_[TestNativeViewHierarchy::kTotalViews]; 19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* root_views_[TestNativeViewHierarchy::kTotalViews]; 19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNativeViewHierarchy* test_views_[TestNativeViewHierarchy::kTotalViews]; 19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewTest* view_test_; 19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, ChangeNativeViewHierarchyFindRoots) { 19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(georgey): Fix the test for Linux 19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestChangeNativeViewHierarchy test(this); 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test.CheckEnumeratingNativeWidgets(); 19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, ChangeNativeViewHierarchyChangeHierarchy) { 20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(georgey): Fix the test for Linux 20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestChangeNativeViewHierarchy test(this); 20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test.CheckChangingHierarhy(); 20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Transformations 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TransformPaintView : public TestView { 20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TransformPaintView() {} 20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TransformPaintView() {} 20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ClearScheduledPaintRect() { 20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scheduled_paint_rect_ = gfx::Rect(); 20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect scheduled_paint_rect() const { return scheduled_paint_rect_; } 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from View: 20232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SchedulePaintInRect(const gfx::Rect& rect) OVERRIDE { 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect xrect = ConvertRectToParent(rect); 20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scheduled_paint_rect_.Union(xrect); 20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect scheduled_paint_rect_; 20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TransformPaintView); 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, TransformPaint) { 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TransformPaintView* v1 = new TransformPaintView(); 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetBoundsRect(gfx::Rect(0, 0, 500, 300)); 20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v2 = new TestView(); 20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetBoundsRect(gfx::Rect(100, 100, 200, 100)); 20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* widget = new Widget; 20422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.bounds = gfx::Rect(50, 50, 650, 650); 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Init(params); 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Show(); 20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* root = widget->GetRootView(); 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->AddChildView(v1); 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->AddChildView(v2); 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // At this moment, |v2| occupies (100, 100) to (300, 200) in |root|. 20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->ClearScheduledPaintRect(); 20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SchedulePaint(); 20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(100, 100, 200, 100), v1->scheduled_paint_rect()); 20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Rotate |v1| counter-clockwise. 20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform transform; 20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RotateCounterclockwise(&transform); 20602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform.matrix().set(1, 3, 500.0); 20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetTransform(transform); 20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |v2| now occupies (100, 200) to (200, 400) in |root|. 20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->ClearScheduledPaintRect(); 20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SchedulePaint(); 20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(100, 200, 100, 200), v1->scheduled_paint_rect()); 20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->CloseNow(); 20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, TransformEvent) { 20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v1 = new TestView(); 20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetBoundsRect(gfx::Rect(0, 0, 500, 300)); 20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v2 = new TestView(); 20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetBoundsRect(gfx::Rect(100, 100, 200, 100)); 20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* widget = new Widget; 20812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.bounds = gfx::Rect(50, 50, 650, 650); 20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Init(params); 20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* root = widget->GetRootView(); 20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->AddChildView(v1); 20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->AddChildView(v2); 20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // At this moment, |v2| occupies (100, 100) to (300, 200) in |root|. 20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Rotate |v1| counter-clockwise. 20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform transform(v1->GetTransform()); 20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RotateCounterclockwise(&transform); 20942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform.matrix().set(1, 3, 500.0); 20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetTransform(transform); 20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |v2| now occupies (100, 200) to (200, 400) in |root|. 20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->Reset(); 21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point p1(110, 210); 21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent pressed(ui::ET_MOUSE_PRESSED, p1, p1, 21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON); 21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->OnMousePressed(pressed); 21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, v1->last_mouse_event_type_); 21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_MOUSE_PRESSED, v2->last_mouse_event_type_); 21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(190, v2->location_.x()); 21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(10, v2->location_.y()); 21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent released(ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(), 0); 21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->OnMouseReleased(released); 21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now rotate |v2| inside |v1| clockwise. 21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transform = v2->GetTransform(); 21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RotateClockwise(&transform); 21162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform.matrix().setDouble(0, 3, 100.0); 21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetTransform(transform); 21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now, |v2| occupies (100, 100) to (200, 300) in |v1|, and (100, 300) to 21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (300, 400) in |root|. 21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->Reset(); 21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point point2(110, 320); 21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent p2(ui::ET_MOUSE_PRESSED, point2, point2, 21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON); 21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->OnMousePressed(p2); 21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, v1->last_mouse_event_type_); 21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_MOUSE_PRESSED, v2->last_mouse_event_type_); 21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(10, v2->location_.x()); 21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(20, v2->location_.y()); 21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->OnMouseReleased(released); 21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetTransform(gfx::Transform()); 21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetTransform(gfx::Transform()); 21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v3 = new TestView(); 21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->SetBoundsRect(gfx::Rect(10, 10, 20, 30)); 21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->AddChildView(v3); 21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Rotate |v3| clockwise with respect to |v2|. 21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transform = v1->GetTransform(); 21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RotateClockwise(&transform); 21462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform.matrix().setDouble(0, 3, 30.0); 21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->SetTransform(transform); 21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Scale |v2| with respect to |v1| along both axis. 21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transform = v2->GetTransform(); 21512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform.matrix().setDouble(0, 0, 0.8); 21522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform.matrix().setDouble(1, 1, 0.5); 21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetTransform(transform); 21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |v3| occupies (108, 105) to (132, 115) in |root|. 21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->Reset(); 21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->Reset(); 21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point point(112, 110); 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent p3(ui::ET_MOUSE_PRESSED, point, point, 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON); 21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->OnMousePressed(p3); 21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_MOUSE_PRESSED, v3->last_mouse_event_type_); 21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(10, v3->location_.x()); 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(25, v3->location_.y()); 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->OnMouseReleased(released); 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetTransform(gfx::Transform()); 21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetTransform(gfx::Transform()); 21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->SetTransform(gfx::Transform()); 21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->Reset(); 21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->Reset(); 21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Rotate |v3| clockwise with respect to |v2|, and scale it along both axis. 21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transform = v3->GetTransform(); 21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RotateClockwise(&transform); 21832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform.matrix().setDouble(0, 3, 30.0); 21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Rotation sets some scaling transformation. Using SetScale would overwrite 21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that and pollute the rotation. So combine the scaling with the existing 21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // transforamtion. 21872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform scale; 21882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scale.Scale(0.8, 0.5); 21892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform.ConcatTransform(scale); 21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->SetTransform(transform); 21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Translate |v2| with respect to |v1|. 21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transform = v2->GetTransform(); 21942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform.matrix().setDouble(0, 3, 10.0); 21952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform.matrix().setDouble(1, 3, 10.0); 21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetTransform(transform); 21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |v3| now occupies (120, 120) to (144, 130) in |root|. 21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point point3(124, 125); 22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent p4(ui::ET_MOUSE_PRESSED, point3, point3, 22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON); 22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->OnMousePressed(p4); 22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_MOUSE_PRESSED, v3->last_mouse_event_type_); 22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(10, v3->location_.x()); 22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(25, v3->location_.y()); 22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->OnMouseReleased(released); 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->CloseNow(); 22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, TransformVisibleBound) { 22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect viewport_bounds(0, 0, 100, 100); 22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Widget> widget(new Widget); 22182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.bounds = viewport_bounds; 22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Init(params); 22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->GetRootView()->SetBoundsRect(viewport_bounds); 22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* viewport = new View; 22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->SetContentsView(viewport); 22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* contents = new View; 22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) viewport->AddChildView(contents); 22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) viewport->SetBoundsRect(viewport_bounds); 22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents->SetBoundsRect(gfx::Rect(0, 0, 100, 200)); 22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* child = new View; 22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents->AddChildView(child); 22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->SetBoundsRect(gfx::Rect(10, 90, 50, 50)); 22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(0, 0, 50, 10), child->GetVisibleBounds()); 22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Rotate |child| counter-clockwise 22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform transform; 22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RotateCounterclockwise(&transform); 22392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform.matrix().setDouble(1, 3, 50.0); 22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->SetTransform(transform); 22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(40, 0, 10, 50), child->GetVisibleBounds()); 22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->CloseNow(); 22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OnVisibleBoundsChanged() 22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VisibleBoundsView : public View { 22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisibleBoundsView() : received_notification_(false) {} 22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~VisibleBoundsView() {} 22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool received_notification() const { return received_notification_; } 22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_received_notification(bool received) { 22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) received_notification_ = received; 22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from View: 22612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool NeedsNotificationWhenVisibleBoundsChange() const OVERRIDE { 22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnVisibleBoundsChanged() OVERRIDE { 22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) received_notification_ = true; 22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool received_notification_; 22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(VisibleBoundsView); 22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, OnVisibleBoundsChanged) { 22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect viewport_bounds(0, 0, 100, 100); 22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Widget> widget(new Widget); 22772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.bounds = viewport_bounds; 22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Init(params); 22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->GetRootView()->SetBoundsRect(viewport_bounds); 22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* viewport = new View; 22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->SetContentsView(viewport); 22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* contents = new View; 22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) viewport->AddChildView(contents); 22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) viewport->SetBoundsRect(viewport_bounds); 22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents->SetBoundsRect(gfx::Rect(0, 0, 100, 200)); 22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a view that cares about visible bounds notifications, and position 22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it just outside the visible bounds of the viewport. 22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisibleBoundsView* child = new VisibleBoundsView; 22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents->AddChildView(child); 22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->SetBoundsRect(gfx::Rect(10, 110, 50, 50)); 22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The child bound should be fully clipped. 22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(child->GetVisibleBounds().IsEmpty()); 22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now scroll the contents, but not enough to make the child visible. 23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents->SetY(contents->y() - 1); 23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should have received the notification since the visible bounds may have 23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // changed (even though they didn't). 23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(child->received_notification()); 23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(child->GetVisibleBounds().IsEmpty()); 23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->set_received_notification(false); 23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now scroll the contents, this time by enough to make the child visible by 23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // one pixel. 23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents->SetY(contents->y() - 10); 23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(child->received_notification()); 23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, child->GetVisibleBounds().height()); 23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->set_received_notification(false); 23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->CloseNow(); 23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BoundsChanged() 23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, SetBoundsPaint) { 23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView top_view; 23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* child_view = new TestView; 23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top_view.SetBoundsRect(gfx::Rect(0, 0, 100, 100)); 23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top_view.scheduled_paint_rects_.clear(); 23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child_view->SetBoundsRect(gfx::Rect(10, 10, 20, 20)); 23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top_view.AddChildView(child_view); 23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top_view.scheduled_paint_rects_.clear(); 23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child_view->SetBoundsRect(gfx::Rect(30, 30, 20, 20)); 23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2U, top_view.scheduled_paint_rects_.size()); 23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There should be 2 rects, spanning from (10, 10) to (50, 50). 23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect paint_rect = top_view.scheduled_paint_rects_[0]; 23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) paint_rect.Union(top_view.scheduled_paint_rects_[1]); 23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(10, 10, 40, 40), paint_rect); 23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests conversion methods with a transform. 23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, ConvertPointToViewWithTransform) { 23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView top_view; 23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* child = new TestView; 23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* child_child = new TestView; 23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top_view.AddChildView(child); 23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->AddChildView(child_child); 23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top_view.SetBoundsRect(gfx::Rect(0, 0, 1000, 1000)); 23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->SetBoundsRect(gfx::Rect(7, 19, 500, 500)); 23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform transform; 23532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform.Scale(3.0, 4.0); 23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->SetTransform(transform); 23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child_child->SetBoundsRect(gfx::Rect(17, 13, 100, 100)); 23572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform.MakeIdentity(); 23582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform.Scale(5.0, 7.0); 23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child_child->SetTransform(transform); 23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sanity check to make sure basic transforms act as expected. 23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform transform; 23642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform.Translate(110.0, -110.0); 23652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform.Scale(100.0, 55.0); 23662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform.Translate(1.0, 1.0); 23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // convert to a 3x3 matrix. 23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SkMatrix& matrix = transform.matrix(); 23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(210, matrix.getTranslateX()); 23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-55, matrix.getTranslateY()); 23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(100, matrix.getScaleX()); 23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(55, matrix.getScaleY()); 23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, matrix.getSkewX()); 23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, matrix.getSkewY()); 23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform transform; 23812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform.Translate(1.0, 1.0); 23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform t2; 23832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) t2.Scale(100.0, 55.0); 23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform t3; 23852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) t3.Translate(110.0, -110.0); 23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transform.ConcatTransform(t2); 23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transform.ConcatTransform(t3); 23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // convert to a 3x3 matrix 23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SkMatrix& matrix = transform.matrix(); 23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(210, matrix.getTranslateX()); 23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-55, matrix.getTranslateY()); 23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(100, matrix.getScaleX()); 23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(55, matrix.getScaleY()); 23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, matrix.getSkewX()); 23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, matrix.getSkewY()); 23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Conversions from child->top and top->child. 24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point point(5, 5); 24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View::ConvertPointToTarget(child, &top_view, &point); 24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(22, point.x()); 24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(39, point.y()); 24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) point.SetPoint(22, 39); 24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View::ConvertPointToTarget(&top_view, child, &point); 24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(5, point.x()); 24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(5, point.y()); 24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Conversions from child_child->top and top->child_child. 24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point point(5, 5); 24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View::ConvertPointToTarget(child_child, &top_view, &point); 24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(133, point.x()); 24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(211, point.y()); 24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) point.SetPoint(133, 211); 24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View::ConvertPointToTarget(&top_view, child_child, &point); 24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(5, point.x()); 24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(5, point.y()); 24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Conversions from child_child->child and child->child_child 24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point point(5, 5); 24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View::ConvertPointToTarget(child_child, child, &point); 24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(42, point.x()); 24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(48, point.y()); 24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) point.SetPoint(42, 48); 24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View::ConvertPointToTarget(child, child_child, &point); 24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(5, point.x()); 24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(5, point.y()); 24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Conversions from top_view to child with a value that should be negative. 24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This ensures we don't round up with negative numbers. 24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point point(6, 18); 24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View::ConvertPointToTarget(&top_view, child, &point); 24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-1, point.x()); 24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-1, point.y()); 24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests conversion methods for rectangles. 24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, ConvertRectWithTransform) { 24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Widget> widget(new Widget); 24522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.bounds = gfx::Rect(50, 50, 650, 650); 24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Init(params); 24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* root = widget->GetRootView(); 24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v1 = new TestView; 24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v2 = new TestView; 24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->AddChildView(v1); 24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->AddChildView(v2); 24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetBoundsRect(gfx::Rect(10, 10, 500, 500)); 24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetBoundsRect(gfx::Rect(20, 20, 100, 200)); 24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |v2| now occupies (30, 30) to (130, 230) in |widget| 24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect rect(5, 5, 15, 40); 24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(25, 25, 15, 40), v2->ConvertRectToParent(rect)); 24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(35, 35, 15, 40), v2->ConvertRectToWidget(rect)); 24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Rotate |v2| 24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform t2; 24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RotateCounterclockwise(&t2); 24742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) t2.matrix().setDouble(1, 3, 100.0); 24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetTransform(t2); 24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |v2| now occupies (30, 30) to (230, 130) in |widget| 24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(25, 100, 40, 15), v2->ConvertRectToParent(rect)); 24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(35, 110, 40, 15), v2->ConvertRectToWidget(rect)); 24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Scale down |v1| 24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform t1; 24832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) t1.Scale(0.5, 0.5); 24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetTransform(t1); 24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The rectangle should remain the same for |v1|. 24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(25, 100, 40, 15), v2->ConvertRectToParent(rect)); 24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |v2| now occupies (20, 20) to (120, 70) in |widget| 24902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(gfx::Rect(22, 60, 21, 8).ToString(), 24912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) v2->ConvertRectToWidget(rect).ToString()); 24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->CloseNow(); 24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ObserverView : public View { 24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObserverView(); 24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ObserverView(); 25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ResetTestState(); 25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool child_added() const { return child_added_; } 25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool child_removed() const { return child_removed_; } 25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const View* parent_view() const { return parent_view_; } 25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const View* child_view() const { return child_view_; } 25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // View: 25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ViewHierarchyChanged(bool is_add, 25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* parent, 25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* child) OVERRIDE; 25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool child_added_; 25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool child_removed_; 25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* parent_view_; 25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* child_view_; 25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ObserverView); 25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ObserverView::ObserverView() 25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : child_added_(false), 25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child_removed_(false), 25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent_view_(NULL), 25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child_view_(NULL) { 25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ObserverView::~ObserverView() {} 25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ObserverView::ResetTestState() { 25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child_added_ = false; 25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child_removed_ = false; 25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent_view_ = NULL; 25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child_view_ = NULL; 25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ObserverView::ViewHierarchyChanged(bool is_add, 25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* parent, 25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* child) { 25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_add) 25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child_added_ = true; 25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child_removed_ = true; 25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent_view_ = parent; 25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child_view_ = child; 25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that the ViewHierarchyChanged() notification is sent correctly when 25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a child view is added or removed to all the views in the hierarchy (up and 25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// down). 25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The tree looks like this: 25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// v1 25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// +-- v2 25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// +-- v3 25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, ViewHierarchyChanged) { 25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObserverView v1; 25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObserverView* v3 = new ObserverView(); 25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add |v3| to |v2|. 25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ObserverView> v2(new ObserverView()); 25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->AddChildView(v3); 25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure both |v2| and |v3| receive the ViewHierarchyChanged() 25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // notification. 25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v2->child_added()); 25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v2->child_removed()); 25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2.get(), v2->parent_view()); 25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v3, v2->child_view()); 25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v3->child_added()); 25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v3->child_removed()); 25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2.get(), v3->parent_view()); 25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v3, v3->child_view()); 25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reset everything to the initial state. 25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->ResetTestState(); 25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->ResetTestState(); 25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add |v2| to v1. 25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1.AddChildView(v2.get()); 25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verifies that |v2| is the child view *added* and the parent view is |v1|. 25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure all the views (v1, v2, v3) received _that_ information. 25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1.child_added()); 25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v1.child_removed()); 25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(&v1, v1.parent_view()); 25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2.get(), v1.child_view()); 25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v2->child_added()); 25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v2->child_removed()); 25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(&v1, v2->parent_view()); 25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2.get(), v2->child_view()); 25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v3->child_added()); 25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v3->child_removed()); 25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(&v1, v3->parent_view()); 26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2.get(), v3->child_view()); 26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reset everything to the initial state. 26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1.ResetTestState(); 26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->ResetTestState(); 26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->ResetTestState(); 26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove |v2| from |v1|. 26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1.RemoveChildView(v2.get()); 26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verifies that |v2| is the child view *removed* and the parent view is |v1|. 26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure all the views (v1, v2, v3) received _that_ information. 26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v1.child_added()); 26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1.child_removed()); 26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(&v1, v1.parent_view()); 26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2.get(), v1.child_view()); 26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v2->child_added()); 26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v2->child_removed()); 26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(&v1, v2->parent_view()); 26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2.get(), v2->child_view()); 26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v3->child_added()); 26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v3->child_removed()); 26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(&v1, v3->parent_view()); 26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v3, v3->child_view()); 26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies if the child views added under the root are all deleted when calling 26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RemoveAllChildViews. 26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The tree looks like this: 26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// root 26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// +-- child1 26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// +-- foo 26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// +-- bar0 26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// +-- bar1 26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// +-- bar2 26375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// +-- child2 26385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// +-- child3 26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, RemoveAllChildViews) { 26405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View root; 26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* child1 = new View; 26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.AddChildView(child1); 26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 2; ++i) 26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.AddChildView(new View); 26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* foo = new View; 26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child1->AddChildView(foo); 26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add some nodes to |foo|. 26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 3; ++i) 26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) foo->AddChildView(new View); 26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3, root.child_count()); 26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, child1->child_count()); 26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3, foo->child_count()); 26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now remove all child views from root. 26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.RemoveAllChildViews(true); 26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, root.child_count()); 26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.has_children()); 26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, Contains) { 26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View v1; 26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v2 = new View; 26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v3 = new View; 26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1.AddChildView(v2); 26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->AddChildView(v3); 26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v1.Contains(NULL)); 26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1.Contains(&v1)); 26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1.Contains(v2)); 26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1.Contains(v3)); 26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v2->Contains(NULL)); 26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v2->Contains(v2)); 26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v2->Contains(&v1)); 26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v2->Contains(v3)); 26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v3->Contains(NULL)); 26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v3->Contains(v3)); 26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v3->Contains(&v1)); 26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v3->Contains(v2)); 26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies if GetIndexOf() returns the correct index for the specified child 26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// view. 26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The tree looks like this: 26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// root 26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// +-- child1 26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// +-- foo1 26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// +-- child2 26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, GetIndexOf) { 26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View root; 26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* child1 = new View; 27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.AddChildView(child1); 27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* child2 = new View; 27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.AddChildView(child2); 27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* foo1 = new View; 27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child1->AddChildView(foo1); 27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-1, root.GetIndexOf(NULL)); 27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-1, root.GetIndexOf(&root)); 27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, root.GetIndexOf(child1)); 27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, root.GetIndexOf(child2)); 27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-1, root.GetIndexOf(foo1)); 27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-1, child1->GetIndexOf(NULL)); 27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-1, child1->GetIndexOf(&root)); 27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-1, child1->GetIndexOf(child1)); 27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-1, child1->GetIndexOf(child2)); 27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, child1->GetIndexOf(foo1)); 27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-1, child2->GetIndexOf(NULL)); 27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-1, child2->GetIndexOf(&root)); 27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-1, child2->GetIndexOf(child2)); 27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-1, child2->GetIndexOf(child1)); 27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-1, child2->GetIndexOf(foo1)); 27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that the child views can be reordered correctly. 27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, ReorderChildren) { 27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View root; 27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* child = new View(); 27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.AddChildView(child); 27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* foo1 = new View(); 27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->AddChildView(foo1); 27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* foo2 = new View(); 27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->AddChildView(foo2); 27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* foo3 = new View(); 27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->AddChildView(foo3); 27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) foo1->set_focusable(true); 27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) foo2->set_focusable(true); 27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) foo3->set_focusable(true); 27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0, child->GetIndexOf(foo1)); 27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1, child->GetIndexOf(foo2)); 27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2, child->GetIndexOf(foo3)); 27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(foo2, foo1->GetNextFocusableView()); 27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(foo3, foo2->GetNextFocusableView()); 27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(NULL, foo3->GetNextFocusableView()); 27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move |foo2| at the end. 27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->ReorderChildView(foo2, -1); 27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0, child->GetIndexOf(foo1)); 27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1, child->GetIndexOf(foo3)); 27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2, child->GetIndexOf(foo2)); 27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(foo3, foo1->GetNextFocusableView()); 27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(foo2, foo3->GetNextFocusableView()); 27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(NULL, foo2->GetNextFocusableView()); 27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move |foo1| at the end. 27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->ReorderChildView(foo1, -1); 27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0, child->GetIndexOf(foo3)); 27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1, child->GetIndexOf(foo2)); 27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2, child->GetIndexOf(foo1)); 27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(NULL, foo1->GetNextFocusableView()); 27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(foo2, foo1->GetPreviousFocusableView()); 27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(foo2, foo3->GetNextFocusableView()); 27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(foo1, foo2->GetNextFocusableView()); 27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move |foo2| to the front. 27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->ReorderChildView(foo2, 0); 27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0, child->GetIndexOf(foo2)); 27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1, child->GetIndexOf(foo3)); 27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2, child->GetIndexOf(foo1)); 27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(NULL, foo1->GetNextFocusableView()); 27775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(foo3, foo1->GetPreviousFocusableView()); 27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(foo3, foo2->GetNextFocusableView()); 27795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(foo1, foo3->GetNextFocusableView()); 27805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that GetViewByID returns the correctly child view from the specified 27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ID. 27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The tree looks like this: 27855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// v1 27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// +-- v2 27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// +-- v3 27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// +-- v4 27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, GetViewByID) { 27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View v1; 27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kV1ID = 1; 27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1.set_id(kV1ID); 27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View v2; 27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kV2ID = 2; 27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2.set_id(kV2ID); 27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View v3; 27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kV3ID = 3; 28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3.set_id(kV3ID); 28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View v4; 28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kV4ID = 4; 28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v4.set_id(kV4ID); 28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kV5ID = 5; 28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1.AddChildView(&v2); 28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2.AddChildView(&v3); 28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2.AddChildView(&v4); 28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(&v1, v1.GetViewByID(kV1ID)); 28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(&v2, v1.GetViewByID(kV2ID)); 28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(&v4, v1.GetViewByID(kV4ID)); 28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, v1.GetViewByID(kV5ID)); // No V5 exists. 28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, v2.GetViewByID(kV1ID)); // It can get only from child views. 28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kGroup = 1; 28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3.SetGroup(kGroup); 28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v4.SetGroup(kGroup); 28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View::Views views; 28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1.GetViewsInGroup(kGroup, &views); 28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2U, views.size()); 28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View::Views::const_iterator i(std::find(views.begin(), views.end(), &v3)); 28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(views.end(), i); 28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i = std::find(views.begin(), views.end(), &v4); 28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(views.end(), i); 28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, AddExistingChild) { 28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View v1, v2, v3; 28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1.AddChildView(&v2); 28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1.AddChildView(&v3); 28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, v1.GetIndexOf(&v2)); 28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, v1.GetIndexOf(&v3)); 28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that there's no change in order when adding at same index. 28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1.AddChildViewAt(&v2, 0); 28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, v1.GetIndexOf(&v2)); 28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, v1.GetIndexOf(&v3)); 28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1.AddChildViewAt(&v3, 1); 28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, v1.GetIndexOf(&v2)); 28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, v1.GetIndexOf(&v3)); 28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add it at a different index and check for change in order. 28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1.AddChildViewAt(&v2, 1); 28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, v1.GetIndexOf(&v2)); 28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, v1.GetIndexOf(&v3)); 28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1.AddChildViewAt(&v2, 0); 28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, v1.GetIndexOf(&v2)); 28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, v1.GetIndexOf(&v3)); 28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that calling |AddChildView()| does not change the order. 28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1.AddChildView(&v2); 28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, v1.GetIndexOf(&v2)); 28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, v1.GetIndexOf(&v3)); 28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1.AddChildView(&v3); 28635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, v1.GetIndexOf(&v2)); 28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, v1.GetIndexOf(&v3)); 28655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Layers 28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA) 28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test implementation of LayerAnimator. 28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestLayerAnimator : public ui::LayerAnimator { 28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestLayerAnimator(); 28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& last_bounds() const { return last_bounds_; } 28815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // LayerAnimator. 28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetBounds(const gfx::Rect& bounds) OVERRIDE; 28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 28862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~TestLayerAnimator() { } 28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect last_bounds_; 28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestLayerAnimator); 28925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestLayerAnimator::TestLayerAnimator() 28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : ui::LayerAnimator(base::TimeDelta::FromMilliseconds(0)) { 28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestLayerAnimator::SetBounds(const gfx::Rect& bounds) { 28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_bounds_ = bounds; 29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ViewLayerTest : public ViewsTestBase { 29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 29065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewLayerTest() : widget_(NULL), old_use_acceleration_(false) {} 29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ViewLayerTest() { 29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the Layer used by the RootView. 29125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::Layer* GetRootLayer() { 29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::Layer* root_layer = NULL; 29142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget()->CalculateOffsetToAncestorWithLayer(&root_layer); 29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return root_layer; 29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE { 29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewTest::SetUp(); 29205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_use_acceleration_ = View::get_use_acceleration_when_possible(); 29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View::set_use_acceleration_when_possible(true); 29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_ = new Widget; 29242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 29255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.bounds = gfx::Rect(50, 50, 200, 200); 29265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->Init(params); 29275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->Show(); 29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->GetRootView()->SetBounds(0, 0, 200, 200); 29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() OVERRIDE { 29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View::set_use_acceleration_when_possible(old_use_acceleration_); 29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->CloseNow(); 29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewsTestBase::TearDown(); 29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* widget() { return widget_; } 29385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 29405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* widget_; 29415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool old_use_acceleration_; 29425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 29435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewLayerTest, LayerToggling) { 29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Because we lazily create textures the calls to DrawTree are necessary to 29475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ensure we trigger creation of textures. 29485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::Layer* root_layer = NULL; 29492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget()->CalculateOffsetToAncestorWithLayer(&root_layer); 29505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* content_view = new View; 29515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget()->SetContentsView(content_view); 29525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create v1, give it a bounds and verify everything is set up correctly. 29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v1 = new View; 29555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetPaintToLayer(true); 29565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1->layer() != NULL); 29575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetBoundsRect(gfx::Rect(20, 30, 140, 150)); 29585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_view->AddChildView(v1); 29595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(v1->layer() != NULL); 29605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(root_layer, v1->layer()->parent()); 29615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(20, 30, 140, 150), v1->layer()->bounds()); 29625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create v2 as a child of v1 and do basic assertion testing. 29645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v2 = new View; 29655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->AddChildView(v2); 29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v2->layer() == NULL); 29675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetBoundsRect(gfx::Rect(10, 20, 30, 40)); 29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetPaintToLayer(true); 29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(v2->layer() != NULL); 29705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v1->layer(), v2->layer()->parent()); 29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(10, 20, 30, 40), v2->layer()->bounds()); 29725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Turn off v1s layer. v2 should still have a layer but its parent should have 29745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // changed. 29755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetPaintToLayer(false); 29765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1->layer() == NULL); 29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v2->layer() != NULL); 29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(root_layer, v2->layer()->parent()); 29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, root_layer->children().size()); 29805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(root_layer->children()[0], v2->layer()); 29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The bounds of the layer should have changed to be relative to the root view 29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // now. 29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(30, 50, 30, 40), v2->layer()->bounds()); 29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make v1 have a layer again and verify v2s layer is wired up correctly. 29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform transform; 29872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform.Scale(2.0, 2.0); 29885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetTransform(transform); 29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1->layer() != NULL); 29905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v2->layer() != NULL); 29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(root_layer, v1->layer()->parent()); 29925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v1->layer(), v2->layer()->parent()); 29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, root_layer->children().size()); 29945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(root_layer->children()[0], v1->layer()); 29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, v1->layer()->children().size()); 29965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v1->layer()->children()[0], v2->layer()); 29975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(10, 20, 30, 40), v2->layer()->bounds()); 29985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies turning on a layer wires up children correctly. 30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewLayerTest, NestedLayerToggling) { 30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* content_view = new View; 30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget()->SetContentsView(content_view); 30045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create v1, give it a bounds and verify everything is set up correctly. 30065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v1 = new View; 30075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_view->AddChildView(v1); 30085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetBoundsRect(gfx::Rect(20, 30, 140, 150)); 30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v2 = new View; 30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->AddChildView(v2); 30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v3 = new View; 30145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->SetPaintToLayer(true); 30155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->AddChildView(v3); 30165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(v3->layer() != NULL); 30175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // At this point we have v1-v2-v3. v3 has a layer, v1 and v2 don't. 30195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetPaintToLayer(true); 30215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v1->layer(), v3->layer()->parent()); 30225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewLayerTest, LayerAnimator) { 30255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* content_view = new View; 30265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget()->SetContentsView(content_view); 30275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v1 = new View; 30295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_view->AddChildView(v1); 30305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetPaintToLayer(true); 30315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1->layer() != NULL); 30325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestLayerAnimator* animator = new TestLayerAnimator(); 30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->layer()->SetAnimator(animator); 30355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect bounds(1, 2, 3, 4); 30375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetBoundsRect(bounds); 30385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(bounds, animator->last_bounds()); 30395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TestLayerAnimator doesn't update the layer. 30405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(bounds, v1->layer()->bounds()); 30415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies the bounds of a layer are updated if the bounds of ancestor that 30445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// doesn't have a layer change. 30455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewLayerTest, BoundsChangeWithLayer) { 30465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* content_view = new View; 30475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget()->SetContentsView(content_view); 30485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v1 = new View; 30505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_view->AddChildView(v1); 30515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetBoundsRect(gfx::Rect(20, 30, 140, 150)); 30525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v2 = new View; 30545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetBoundsRect(gfx::Rect(10, 11, 40, 50)); 30555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->AddChildView(v2); 30565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetPaintToLayer(true); 30575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(v2->layer() != NULL); 30585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(30, 41, 40, 50), v2->layer()->bounds()); 30595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetPosition(gfx::Point(25, 36)); 30615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(35, 47, 40, 50), v2->layer()->bounds()); 30625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetPosition(gfx::Point(11, 12)); 30645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(36, 48, 40, 50), v2->layer()->bounds()); 30655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Bounds of the layer should change even if the view is not invisible. 30675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetVisible(false); 30685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetPosition(gfx::Point(20, 30)); 30695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(31, 42, 40, 50), v2->layer()->bounds()); 30705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetVisible(false); 30725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetBoundsRect(gfx::Rect(10, 11, 20, 30)); 30735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(30, 41, 20, 30), v2->layer()->bounds()); 30745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure layers are positioned correctly in RTL. 30775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewLayerTest, BoundInRTL) { 30785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string locale = l10n_util::GetApplicationLocale(std::string()); 30795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::SetICUDefaultLocale("he"); 30805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* view = new View; 30825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget()->SetContentsView(view); 30835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int content_width = view->width(); 30855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |v1| is initially not attached to anything. So its layer will have the same 30875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // bounds as the view. 30885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v1 = new View; 30895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetPaintToLayer(true); 30905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetBounds(10, 10, 20, 10); 30915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(10, 10, 20, 10), 30925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->layer()->bounds()); 30935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Once |v1| is attached to the widget, its layer will get RTL-appropriate 30955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // bounds. 30965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->AddChildView(v1); 30975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(content_width - 30, 10, 20, 10), 30985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->layer()->bounds()); 30995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect l1bounds = v1->layer()->bounds(); 31005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now attach a View to the widget first, then create a layer for it. Make 31025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // sure the bounds are correct. 31035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v2 = new View; 31045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetBounds(50, 10, 30, 10); 31055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v2->layer()); 31065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->AddChildView(v2); 31075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetPaintToLayer(true); 31085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(content_width - 80, 10, 30, 10), 31095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->layer()->bounds()); 31105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect l2bounds = v2->layer()->bounds(); 31115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->SetPaintToLayer(true); 31135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(l1bounds, v1->layer()->bounds()); 31145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(l2bounds, v2->layer()->bounds()); 31155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move one of the views. Make sure the layer is positioned correctly 31175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // afterwards. 31185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetBounds(v1->x() - 5, v1->y(), v1->width(), v1->height()); 31195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l1bounds.set_x(l1bounds.x() + 5); 31205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(l1bounds, v1->layer()->bounds()); 31215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->SetPaintToLayer(false); 31235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(l1bounds, v1->layer()->bounds()); 31245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(l2bounds, v2->layer()->bounds()); 31255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move a view again. 31275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetBounds(v2->x() + 5, v2->y(), v2->width(), v2->height()); 31285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l2bounds.set_x(l2bounds.x() - 5); 31295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(l2bounds, v2->layer()->bounds()); 31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reset locale. 31325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::SetICUDefaultLocale(locale); 31335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure a transform persists after toggling the visibility. 31365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewLayerTest, ToggleVisibilityWithTransform) { 31375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* view = new View; 31385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform transform; 31392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform.Scale(2.0, 2.0); 31405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->SetTransform(transform); 31415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget()->SetContentsView(view); 31425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2.0f, view->GetTransform().matrix().get(0, 0)); 31435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->SetVisible(false); 31455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2.0f, view->GetTransform().matrix().get(0, 0)); 31465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->SetVisible(true); 31485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2.0f, view->GetTransform().matrix().get(0, 0)); 31495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies a transform persists after removing/adding a view with a transform. 31525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewLayerTest, ResetTransformOnLayerAfterAdd) { 31535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* view = new View; 31545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform transform; 31552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform.Scale(2.0, 2.0); 31565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->SetTransform(transform); 31575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget()->SetContentsView(view); 31585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2.0f, view->GetTransform().matrix().get(0, 0)); 31595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(view->layer() != NULL); 31605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2.0f, view->layer()->transform().matrix().get(0, 0)); 31615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* parent = view->parent(); 31635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent->RemoveChildView(view); 31645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent->AddChildView(view); 31655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2.0f, view->GetTransform().matrix().get(0, 0)); 31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(view->layer() != NULL); 31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2.0f, view->layer()->transform().matrix().get(0, 0)); 31695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure that layer visibility is correct after toggling View visibility. 31725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewLayerTest, ToggleVisibilityWithLayer) { 31735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* content_view = new View; 31745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget()->SetContentsView(content_view); 31755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The view isn't attached to a widget or a parent view yet. But it should 31775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // still have a layer, but the layer should not be attached to the root 31785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // layer. 31795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v1 = new View; 31805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetPaintToLayer(true); 31815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1->layer()); 31825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(LayerIsAncestor(widget()->GetCompositor()->root_layer(), 31835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->layer())); 31845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Once the view is attached to a widget, its layer should be attached to the 31865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // root layer and visible. 31875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_view->AddChildView(v1); 31885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LayerIsAncestor(widget()->GetCompositor()->root_layer(), 31895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->layer())); 31905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1->layer()->IsDrawn()); 31915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetVisible(false); 31935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v1->layer()->IsDrawn()); 31945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetVisible(true); 31965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1->layer()->IsDrawn()); 31975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget()->Hide(); 31995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v1->layer()->IsDrawn()); 32005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget()->Show(); 32025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1->layer()->IsDrawn()); 32035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the layers in the subtree are orphaned after a View is removed 32065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// from the parent. 32075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewLayerTest, OrphanLayerAfterViewRemove) { 32085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* content_view = new View; 32095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget()->SetContentsView(content_view); 32105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v1 = new View; 32125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_view->AddChildView(v1); 32135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v2 = new View; 32155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->AddChildView(v2); 32165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetPaintToLayer(true); 32175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LayerIsAncestor(widget()->GetCompositor()->root_layer(), 32185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->layer())); 32195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v2->layer()->IsDrawn()); 32205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_view->RemoveChildView(v1); 32225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(LayerIsAncestor(widget()->GetCompositor()->root_layer(), 32245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->layer())); 32255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reparent |v2|. 32275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_view->AddChildView(v2); 32285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete v1; 32295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1 = NULL; 32305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LayerIsAncestor(widget()->GetCompositor()->root_layer(), 32315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->layer())); 32325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v2->layer()->IsDrawn()); 32335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PaintTrackingView : public View { 32365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 32375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PaintTrackingView() : painted_(false) { 32385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool painted() const { return painted_; } 32415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_painted(bool value) { painted_ = value; } 32425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE { 32445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) painted_ = true; 32455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 32485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool painted_; 32495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(PaintTrackingView); 32515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 32525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure child views with layers aren't painted when paint starts at an 32545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ancestor. 32555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewLayerTest, DontPaintChildrenWithLayers) { 32565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PaintTrackingView* content_view = new PaintTrackingView; 32575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget()->SetContentsView(content_view); 32585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_view->SetPaintToLayer(true); 32595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(piman): Compositor::Draw() won't work for the threaded compositor. 32605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRootLayer()->GetCompositor()->Draw(false); 32615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRootLayer()->SchedulePaint(gfx::Rect(0, 0, 10, 10)); 32625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_view->set_painted(false); 32635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // content_view no longer has a dirty rect. Paint from the root and make sure 32645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PaintTrackingView isn't painted. 32655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRootLayer()->GetCompositor()->Draw(false); 32665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(content_view->painted()); 32675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make content_view have a dirty rect, paint the layers and make sure 32695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PaintTrackingView is painted. 32705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_view->layer()->SchedulePaint(gfx::Rect(0, 0, 10, 10)); 32715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRootLayer()->GetCompositor()->Draw(false); 32725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(content_view->painted()); 32735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the visibility of child layers are updated correctly when a View's 32765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// visibility changes. 32775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewLayerTest, VisibilityChildLayers) { 32785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v1 = new View; 32795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetPaintToLayer(true); 32805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget()->SetContentsView(v1); 32815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v2 = new View; 32835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->AddChildView(v2); 32845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v3 = new View; 32865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->AddChildView(v3); 32875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->SetVisible(false); 32885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v4 = new View; 32905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v4->SetPaintToLayer(true); 32915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->AddChildView(v4); 32925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1->layer()->IsDrawn()); 32945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v4->layer()->IsDrawn()); 32955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetVisible(false); 32975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1->layer()->IsDrawn()); 32985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v4->layer()->IsDrawn()); 32995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetVisible(true); 33015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1->layer()->IsDrawn()); 33025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v4->layer()->IsDrawn()); 33035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetVisible(false); 33055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1->layer()->IsDrawn()); 33065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v4->layer()->IsDrawn()); 33075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ViewAndLayerTreeAreConsistent(v1, v1->layer())); 33085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->SetVisible(true); 33105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1->layer()->IsDrawn()); 33115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v4->layer()->IsDrawn()); 33125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ViewAndLayerTreeAreConsistent(v1, v1->layer())); 33135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reparent |v3| to |v1|. 33155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->AddChildView(v3); 33165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1->layer()->IsDrawn()); 33175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v4->layer()->IsDrawn()); 33185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ViewAndLayerTreeAreConsistent(v1, v1->layer())); 33195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test creates a random View tree, and then randomly reorders child views, 33225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// reparents views etc. Unrelated changes can appear to break this test. So 33235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// marking this as FLAKY. 33245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewLayerTest, DISABLED_ViewLayerTreesInSync) { 33255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* content = new View; 33265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content->SetPaintToLayer(true); 33275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget()->SetContentsView(content); 33285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget()->Show(); 33295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConstructTree(content, 5); 33315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ViewAndLayerTreeAreConsistent(content, content->layer())); 33325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScrambleTree(content); 33345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ViewAndLayerTreeAreConsistent(content, content->layer())); 33355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScrambleTree(content); 33375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ViewAndLayerTreeAreConsistent(content, content->layer())); 33385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScrambleTree(content); 33405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ViewAndLayerTreeAreConsistent(content, content->layer())); 33415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies when views are reordered the layer is also reordered. The widget is 33445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// providing the parent layer. 33455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewLayerTest, ReorderUnderWidget) { 33465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* content = new View; 33475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget()->SetContentsView(content); 33485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* c1 = new View; 33495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c1->SetPaintToLayer(true); 33505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content->AddChildView(c1); 33515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* c2 = new View; 33525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c2->SetPaintToLayer(true); 33535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content->AddChildView(c2); 33545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::Layer* parent_layer = c1->layer()->parent(); 33565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(parent_layer); 33575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2u, parent_layer->children().size()); 33585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(c1->layer(), parent_layer->children()[0]); 33595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(c2->layer(), parent_layer->children()[1]); 33605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move c1 to the front. The layers should have moved too. 33625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content->ReorderChildView(c1, -1); 33635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(c1->layer(), parent_layer->children()[1]); 33645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(c2->layer(), parent_layer->children()[0]); 33655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that the layer of a view can be acquired properly. 33685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewLayerTest, AcquireLayer) { 33695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* content = new View; 33705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget()->SetContentsView(content); 33715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<View> c1(new View); 33725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c1->SetPaintToLayer(true); 33735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(c1->layer()); 33745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content->AddChildView(c1.get()); 33755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ui::Layer> layer(c1->AcquireLayer()); 33775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(layer.get(), c1->layer()); 33785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ui::Layer> layer2(c1->RecreateLayer()); 33805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(c1->layer(), layer2.get()); 33815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Destroy view before destroying layer. 33835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c1.reset(); 33845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that new layer scales content only if the old layer does. 33875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewLayerTest, RecreateLayer) { 33885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<View> v(new View()); 33895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v->SetPaintToLayer(true); 33905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set to non default value. 33915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v->layer()->set_scale_content(false); 33925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ui::Layer> old_layer(v->RecreateLayer()); 33935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::Layer* new_layer = v->layer(); 33945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(new_layer->scale_content()); 33955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // USE_AURA 33985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace views 3400