view_unittest.cc revision 0f1bc08d4cfcc34181b0b5cbf065c40f687bf740
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" 95e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_util.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/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/l10n/l10n_util.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/compositor.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer_animator.h" 19d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h" 20d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/keycodes/keyboard_codes.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/canvas.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/path.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/transform.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/background.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/native/native_view_host.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/scroll_view.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/textfield/textfield.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/focus/accelerator_handler.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/focus/view_storage.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/test/views_test_base.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/view.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/views_delegate.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/native_widget.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/root_view.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/window/dialog_client_view.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/window/dialog_delegate.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/test/test_views_delegate.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/root_window.h" 4368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/events/gestures/gesture_recognizer.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true if |ancestor| is an ancestor of |layer|. 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool LayerIsAncestor(const ui::Layer* ancestor, const ui::Layer* layer) { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (layer && layer != ancestor) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layer = layer->parent(); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return layer == ancestor; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Convenience functions for walking a View tree. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const views::View* FirstView(const views::View* view) { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const views::View* v = view; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (v->has_children()) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v = v->child_at(0); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return v; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const views::View* NextView(const views::View* view) { 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const views::View* v = view; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const views::View* parent = v->parent(); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!parent) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int next = parent->GetIndexOf(v) + 1; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (next != parent->child_count()) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return FirstView(parent->child_at(next)); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return parent; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Convenience functions for walking a Layer tree. 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const ui::Layer* FirstLayer(const ui::Layer* layer) { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Layer* l = layer; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (l->children().size() > 0) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l = l->children()[0]; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return l; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const ui::Layer* NextLayer(const ui::Layer* layer) { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Layer* parent = layer->parent(); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!parent) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<ui::Layer*> children = parent->children(); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t index; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (index = 0; index < children.size(); index++) { 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (children[index] == layer) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t next = index + 1; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (next < children.size()) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return FirstLayer(children[next]); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return parent; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Given the root nodes of a View tree and a Layer tree, makes sure the two 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// trees are in sync. 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ViewAndLayerTreeAreConsistent(const views::View* view, 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Layer* layer) { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const views::View* v = FirstView(view); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Layer* l = FirstLayer(layer); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (v && l) { 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Find the view with a layer. 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (v && !v->layer()) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v = NextView(v); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!v) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check if the View tree and the Layer tree are in sync. 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(l, v->layer()); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (v->layer() != l) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check if the visibility states of the View and the Layer are in sync. 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(l->IsDrawn(), v->IsDrawn()); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (v->IsDrawn() != l->IsDrawn()) { 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (const views::View* vv = v; vv; vv = vv->parent()) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "V: " << vv << " " << vv->visible() << " " 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << vv->IsDrawn() << " " << vv->layer(); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (const ui::Layer* ll = l; ll; ll = ll->parent()) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "L: " << ll << " " << ll->IsDrawn(); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check if the size of the View and the Layer are in sync. 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(l->bounds(), v->bounds()); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (v->bounds() != l->bounds()) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (v == view || l == layer) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return v == view && l == layer; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v = NextView(v); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l = NextLayer(l); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Constructs a View tree with the specified depth. 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ConstructTree(views::View* view, int depth) { 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (depth == 0) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int count = base::RandInt(1, 5); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < count; i++) { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::View* v = new views::View; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->AddChildView(v); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base::RandDouble() > 0.5) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v->SetPaintToLayer(true); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base::RandDouble() < 0.2) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v->SetVisible(false); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConstructTree(v, depth - 1); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ScrambleTree(views::View* view) { 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int count = view->child_count(); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (count == 0) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < count; i++) { 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScrambleTree(view->child_at(i)); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (count > 1) { 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int a = base::RandInt(0, count - 1); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int b = base::RandInt(0, count - 1); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::View* view_a = view->child_at(a); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::View* view_b = view->child_at(b); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->ReorderChildView(view_a, b); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->ReorderChildView(view_b, a); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!view->layer() && base::RandDouble() < 0.1) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->SetPaintToLayer(true); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base::RandDouble() < 0.1) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->SetVisible(!view->visible()); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Convenience to make constructing a GestureEvent simpler. 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GestureEventForTest : public ui::GestureEvent { 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GestureEventForTest(ui::EventType type, int x, int y, int flags) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : GestureEvent(type, x, y, flags, base::TimeDelta(), 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::GestureEventDetails(type, 0.0f, 0.0f), 0) { 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(GestureEventForTest); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views { 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef ViewsTestBase ViewTest; 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A derived class for testing purpose. 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestView : public View { 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView() : View(), delete_on_pressed_(false), in_touch_sequence_(false) {} 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestView() {} 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reset all test state 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Reset() { 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_change_bounds_ = false; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_mouse_event_type_ = 0; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_.SetPoint(0, 0); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) received_mouse_enter_ = false; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) received_mouse_exit_ = false; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_touch_event_type_ = 0; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_touch_event_was_handled_ = false; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_gesture_event_type_ = 0; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_gesture_event_was_handled_ = false; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_clip_.setEmpty(); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerator_count_map_.clear(); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnBoundsChanged(const gfx::Rect& previous_bounds) OVERRIDE; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnMousePressed(const ui::MouseEvent& event) OVERRIDE; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnMouseDragged(const ui::MouseEvent& event) OVERRIDE; 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnMouseReleased(const ui::MouseEvent& event) OVERRIDE; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnMouseEntered(const ui::MouseEvent& event) OVERRIDE; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnMouseExited(const ui::MouseEvent& event) OVERRIDE; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnTouchEvent(ui::TouchEvent* event) OVERRIDE; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ignores GestureEvent by default. 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Paint(gfx::Canvas* canvas) OVERRIDE; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SchedulePaintInRect(const gfx::Rect& rect) OVERRIDE; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool AcceleratorPressed(const ui::Accelerator& accelerator) OVERRIDE; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OnBoundsChanged. 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_change_bounds_; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect new_bounds_; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // MouseEvent. 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int last_mouse_event_type_; 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point location_; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool received_mouse_enter_; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool received_mouse_exit_; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool delete_on_pressed_; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Painting. 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<gfx::Rect> scheduled_paint_rects_; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // GestureEvent 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int last_gesture_event_type_; 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool last_gesture_event_was_handled_; 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TouchEvent. 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int last_touch_event_type_; 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool last_touch_event_was_handled_; 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool in_touch_sequence_; 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Painting. 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkRect last_clip_; 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Accelerators. 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<ui::Accelerator, int> accelerator_count_map_; 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A view subclass that ignores all touch events for testing purposes. 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestViewIgnoreTouch : public TestView { 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestViewIgnoreTouch() : TestView() {} 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestViewIgnoreTouch() {} 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnTouchEvent(ui::TouchEvent* event) OVERRIDE; 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A view subclass that consumes all Gesture events for testing purposes. 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestViewConsumeGesture : public TestView { 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestViewConsumeGesture() : TestView() {} 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestViewConsumeGesture() {} 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE { 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_gesture_event_type_ = event->type(); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_.SetPoint(event->x(), event->y()); 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event->StopPropagation(); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestViewConsumeGesture); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A view subclass that ignores all Gesture events. 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestViewIgnoreGesture: public TestView { 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestViewIgnoreGesture() : TestView() {} 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestViewIgnoreGesture() {} 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE { 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestViewIgnoreGesture); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A view subclass that ignores all scroll-gesture events, but consume all other 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// gesture events. 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestViewIgnoreScrollGestures : public TestViewConsumeGesture { 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestViewIgnoreScrollGestures() {} 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestViewIgnoreScrollGestures() {} 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE { 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (event->IsScrollGestureEvent()) 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestViewConsumeGesture::OnGestureEvent(event); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestViewIgnoreScrollGestures); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OnBoundsChanged 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestView::OnBoundsChanged(const gfx::Rect& previous_bounds) { 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_change_bounds_ = true; 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_bounds_ = bounds(); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, OnBoundsChanged) { 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView v; 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect prev_rect(0, 0, 200, 200); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect new_rect(100, 100, 250, 250); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v.SetBoundsRect(prev_rect); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v.Reset(); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v.SetBoundsRect(new_rect); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v.did_change_bounds_); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v.new_bounds_, new_rect); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v.bounds(), new_rect); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MouseEvent 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestView::OnMousePressed(const ui::MouseEvent& event) { 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_mouse_event_type_ = event.type(); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_.SetPoint(event.x(), event.y()); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delete_on_pressed_) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete this; 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestView::OnMouseDragged(const ui::MouseEvent& event) { 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_mouse_event_type_ = event.type(); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_.SetPoint(event.x(), event.y()); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestView::OnMouseReleased(const ui::MouseEvent& event) { 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_mouse_event_type_ = event.type(); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_.SetPoint(event.x(), event.y()); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestView::OnMouseEntered(const ui::MouseEvent& event) { 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) received_mouse_enter_ = true; 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestView::OnMouseExited(const ui::MouseEvent& event) { 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) received_mouse_exit_ = true; 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, MouseEvent) { 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v1 = new TestView(); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetBoundsRect(gfx::Rect(0, 0, 300, 300)); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v2 = new TestView(); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetBoundsRect(gfx::Rect(100, 100, 100, 100)); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Widget> widget(new Widget); 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.bounds = gfx::Rect(50, 50, 650, 650); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Init(params); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::RootView* root = 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<internal::RootView*>(widget->GetRootView()); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->AddChildView(v1); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->AddChildView(v2); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->Reset(); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point p1(110, 120); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent pressed(ui::ET_MOUSE_PRESSED, p1, p1, 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->OnMousePressed(pressed); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2->last_mouse_event_type_, ui::ET_MOUSE_PRESSED); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2->location_.x(), 10); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2->location_.y(), 20); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure v1 did not receive the event 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v1->last_mouse_event_type_, 0); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Drag event out of bounds. Should still go to v2 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->Reset(); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point p2(50, 40); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent dragged(ui::ET_MOUSE_DRAGGED, p2, p2, 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->OnMouseDragged(dragged); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2->last_mouse_event_type_, ui::ET_MOUSE_DRAGGED); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2->location_.x(), -50); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2->location_.y(), -60); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure v1 did not receive the event 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v1->last_mouse_event_type_, 0); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Releasted event out of bounds. Should still go to v2 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->Reset(); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent released(ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(), 0); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->OnMouseDragged(released); 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2->last_mouse_event_type_, ui::ET_MOUSE_RELEASED); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2->location_.x(), -100); 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2->location_.y(), -100); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure v1 did not receive the event 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v1->last_mouse_event_type_, 0); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->CloseNow(); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Confirm that a view can be deleted as part of processing a mouse press. 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, DeleteOnPressed) { 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v1 = new TestView(); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetBoundsRect(gfx::Rect(0, 0, 300, 300)); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v2 = new TestView(); 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetBoundsRect(gfx::Rect(100, 100, 100, 100)); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->Reset(); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Widget> widget(new Widget); 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.bounds = gfx::Rect(50, 50, 650, 650); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Init(params); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* root = widget->GetRootView(); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->AddChildView(v1); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->AddChildView(v2); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->delete_on_pressed_ = true; 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point point(110, 120); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent pressed(ui::ET_MOUSE_PRESSED, point, point, 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->OnMousePressed(pressed); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, v1->child_count()); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->CloseNow(); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TouchEvent 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestView::OnTouchEvent(ui::TouchEvent* event) { 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_touch_event_type_ = event->type(); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_.SetPoint(event->x(), event->y()); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!in_touch_sequence_) { 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (event->type() == ui::ET_TOUCH_PRESSED) { 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) in_touch_sequence_ = true; 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event->StopPropagation(); 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (event->type() == ui::ET_TOUCH_RELEASED) { 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) in_touch_sequence_ = false; 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event->SetHandled(); 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event->StopPropagation(); 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (last_touch_event_was_handled_) 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event->StopPropagation(); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestViewIgnoreTouch::OnTouchEvent(ui::TouchEvent* event) { 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, TouchEvent) { 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v1 = new TestView(); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetBoundsRect(gfx::Rect(0, 0, 300, 300)); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v2 = new TestView(); 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetBoundsRect(gfx::Rect(100, 100, 100, 100)); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v3 = new TestViewIgnoreTouch(); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->SetBoundsRect(gfx::Rect(0, 0, 100, 100)); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Widget> widget(new Widget()); 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.bounds = gfx::Rect(50, 50, 650, 650); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Init(params); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::RootView* root = 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<internal::RootView*>(widget->GetRootView()); 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->AddChildView(v1); 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->AddChildView(v2); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->AddChildView(v3); 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |v3| completely obscures |v2|, but all the touch events on |v3| should 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reach |v2| because |v3| doesn't process any touch events. 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure if none of the views handle the touch event, the gesture manager 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // does. 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->Reset(); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TouchEvent unhandled(ui::ET_TOUCH_MOVED, 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point(400, 400), 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, /* no flags */ 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, /* first finger touch */ 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta(), 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1.0, 0.0, 1.0, 0.0); 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->DispatchTouchEvent(&unhandled); 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v1->last_touch_event_type_, 0); 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2->last_touch_event_type_, 0); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test press, drag, release touch sequence. 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->Reset(); 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TouchEvent pressed(ui::ET_TOUCH_PRESSED, 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point(110, 120), 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, /* no flags */ 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, /* first finger touch */ 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta(), 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1.0, 0.0, 1.0, 0.0); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->last_touch_event_was_handled_ = true; 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->DispatchTouchEvent(&pressed); 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2->last_touch_event_type_, ui::ET_TOUCH_PRESSED); 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2->location_.x(), 10); 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2->location_.y(), 20); 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure v1 did not receive the event 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v1->last_touch_event_type_, 0); 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Drag event out of bounds. Should still go to v2 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->Reset(); 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TouchEvent dragged(ui::ET_TOUCH_MOVED, 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point(50, 40), 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, /* no flags */ 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, /* first finger touch */ 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta(), 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1.0, 0.0, 1.0, 0.0); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->DispatchTouchEvent(&dragged); 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2->last_touch_event_type_, ui::ET_TOUCH_MOVED); 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2->location_.x(), -50); 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2->location_.y(), -60); 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure v1 did not receive the event 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v1->last_touch_event_type_, 0); 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Released event out of bounds. Should still go to v2 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->Reset(); 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TouchEvent released(ui::ET_TOUCH_RELEASED, gfx::Point(), 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, /* no flags */ 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, /* first finger */ 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta(), 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1.0, 0.0, 1.0, 0.0); 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->last_touch_event_was_handled_ = true; 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->DispatchTouchEvent(&released); 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2->last_touch_event_type_, ui::ET_TOUCH_RELEASED); 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2->location_.x(), -100); 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2->location_.y(), -100); 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure v1 did not receive the event 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v1->last_touch_event_type_, 0); 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->CloseNow(); 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestView::OnGestureEvent(ui::GestureEvent* event) { 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, GestureEvent) { 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Views hierarchy for non delivery of GestureEvent. 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v1 = new TestViewConsumeGesture(); 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetBoundsRect(gfx::Rect(0, 0, 300, 300)); 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v2 = new TestViewConsumeGesture(); 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetBoundsRect(gfx::Rect(100, 100, 100, 100)); 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v3 = new TestViewIgnoreGesture(); 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->SetBoundsRect(gfx::Rect(0, 0, 100, 100)); 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Widget> widget(new Widget()); 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.bounds = gfx::Rect(50, 50, 650, 650); 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Init(params); 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::RootView* root = 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<internal::RootView*>(widget->GetRootView()); 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->AddChildView(v1); 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->AddChildView(v2); 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->AddChildView(v3); 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |v3| completely obscures |v2|, but all the gesture events on |v3| should 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reach |v2| because |v3| doesn't process any gesture events. However, since 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |v2| does process gesture events, gesture events on |v3| or |v2| should not 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reach |v1|. 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->Reset(); 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->Reset(); 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gesture on |v3| 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GestureEventForTest g1(ui::ET_GESTURE_TAP, 110, 110, 0); 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->DispatchGestureEvent(&g1); 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_GESTURE_TAP, v2->last_gesture_event_type_); 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Point(10, 10), v2->location_); 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_UNKNOWN, v1->last_gesture_event_type_); 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate an up so that RootView is no longer targetting |v3|. 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GestureEventForTest g1_up(ui::ET_GESTURE_END, 110, 110, 0); 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->DispatchGestureEvent(&g1_up); 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->Reset(); 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->Reset(); 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gesture on |v1| 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GestureEventForTest g2(ui::ET_GESTURE_TAP, 80, 80, 0); 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->DispatchGestureEvent(&g2); 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_GESTURE_TAP, v1->last_gesture_event_type_); 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Point(80, 80), v1->location_); 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_UNKNOWN, v2->last_gesture_event_type_); 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send event |g1| again. Even though the coordinates target |v3| it should go 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to |v1| as that is the view the touch was initially down on. 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->last_gesture_event_type_ = ui::ET_UNKNOWN; 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->last_gesture_event_type_ = ui::ET_UNKNOWN; 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->DispatchGestureEvent(&g1); 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_GESTURE_TAP, v1->last_gesture_event_type_); 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_UNKNOWN, v3->last_gesture_event_type_); 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("110,110", v1->location_.ToString()); 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->CloseNow(); 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, ScrollGestureEvent) { 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Views hierarchy for non delivery of GestureEvent. 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v1 = new TestViewConsumeGesture(); 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetBoundsRect(gfx::Rect(0, 0, 300, 300)); 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v2 = new TestViewIgnoreScrollGestures(); 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetBoundsRect(gfx::Rect(100, 100, 100, 100)); 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v3 = new TestViewIgnoreGesture(); 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->SetBoundsRect(gfx::Rect(0, 0, 100, 100)); 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Widget> widget(new Widget()); 6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.bounds = gfx::Rect(50, 50, 650, 650); 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Init(params); 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::RootView* root = 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<internal::RootView*>(widget->GetRootView()); 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->AddChildView(v1); 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->AddChildView(v2); 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->AddChildView(v3); 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |v3| completely obscures |v2|, but all the gesture events on |v3| should 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reach |v2| because |v3| doesn't process any gesture events. However, since 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |v2| does process gesture events, gesture events on |v3| or |v2| should not 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reach |v1|. 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->Reset(); 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->Reset(); 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gesture on |v3| 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GestureEventForTest g1(ui::ET_GESTURE_TAP, 110, 110, 0); 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->DispatchGestureEvent(&g1); 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_GESTURE_TAP, v2->last_gesture_event_type_); 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Point(10, 10), v2->location_); 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_UNKNOWN, v1->last_gesture_event_type_); 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->Reset(); 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send scroll gestures on |v3|. The gesture should reach |v2|, however, 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // since it does not process scroll-gesture events, these events should reach 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |v1|. 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GestureEventForTest gscroll_begin(ui::ET_GESTURE_SCROLL_BEGIN, 115, 115, 0); 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->DispatchGestureEvent(&gscroll_begin); 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_UNKNOWN, v2->last_gesture_event_type_); 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_GESTURE_SCROLL_BEGIN, v1->last_gesture_event_type_); 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send a second tap on |v1|. The event should reach |v2| since it is the 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // default gesture handler, and not |v1| (even though it is the view under the 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // point, and is the scroll event handler). 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GestureEventForTest second_tap(ui::ET_GESTURE_TAP, 70, 70, 0); 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->DispatchGestureEvent(&second_tap); 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_GESTURE_TAP, v2->last_gesture_event_type_); 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_UNKNOWN, v1->last_gesture_event_type_); 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->Reset(); 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GestureEventForTest gscroll_end(ui::ET_GESTURE_SCROLL_END, 50, 50, 0); 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->DispatchGestureEvent(&gscroll_end); 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_GESTURE_SCROLL_END, v1->last_gesture_event_type_); 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate an up so that RootView is no longer targetting |v3|. 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GestureEventForTest g1_up(ui::ET_GESTURE_END, 110, 110, 0); 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->DispatchGestureEvent(&g1_up); 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_GESTURE_END, v2->last_gesture_event_type_); 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->Reset(); 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->Reset(); 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gesture on |v1| 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GestureEventForTest g2(ui::ET_GESTURE_TAP, 80, 80, 0); 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->DispatchGestureEvent(&g2); 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_GESTURE_TAP, v1->last_gesture_event_type_); 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Point(80, 80), v1->location_); 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_UNKNOWN, v2->last_gesture_event_type_); 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send event |g1| again. Even though the coordinates target |v3| it should go 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to |v1| as that is the view the touch was initially down on. 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->last_gesture_event_type_ = ui::ET_UNKNOWN; 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->last_gesture_event_type_ = ui::ET_UNKNOWN; 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->DispatchGestureEvent(&g1); 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_GESTURE_TAP, v1->last_gesture_event_type_); 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_UNKNOWN, v3->last_gesture_event_type_); 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("110,110", v1->location_.ToString()); 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->CloseNow(); 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Painting 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestView::Paint(gfx::Canvas* canvas) { 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas->sk_canvas()->getClipBounds(&last_clip_); 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestView::SchedulePaintInRect(const gfx::Rect& rect) { 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scheduled_paint_rects_.push_back(rect); 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View::SchedulePaintInRect(rect); 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CheckRect(const SkRect& check_rect, const SkRect& target_rect) { 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(target_rect.fLeft, check_rect.fLeft); 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(target_rect.fRight, check_rect.fRight); 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(target_rect.fTop, check_rect.fTop); 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(target_rect.fBottom, check_rect.fBottom); 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* This test is disabled because it is flakey on some systems. 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, DISABLED_Painting) { 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Determine if InvalidateRect generates an empty paint rectangle. 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EmptyWindow paint_window(CRect(50, 50, 650, 650)); 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) paint_window.RedrawWindow(CRect(0, 0, 600, 600), NULL, 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RDW_UPDATENOW | RDW_INVALIDATE | RDW_ALLCHILDREN); 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool empty_paint = paint_window.empty_paint(); 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NativeWidgetWin window; 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window.set_delete_on_destroy(false); 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window.set_window_style(WS_OVERLAPPEDWINDOW); 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window.Init(NULL, gfx::Rect(50, 50, 650, 650), NULL); 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* root = window.GetRootView(); 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v1 = new TestView(); 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetBoundsRect(gfx::Rect(0, 0, 650, 650)); 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->AddChildView(v1); 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v2 = new TestView(); 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetBoundsRect(gfx::Rect(10, 10, 80, 80)); 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->AddChildView(v2); 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v3 = new TestView(); 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->SetBoundsRect(gfx::Rect(10, 10, 60, 60)); 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->AddChildView(v3); 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v4 = new TestView(); 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v4->SetBoundsRect(gfx::Rect(10, 200, 100, 100)); 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->AddChildView(v4); 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure to paint current rects 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PaintRootView(root, empty_paint); 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->Reset(); 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->Reset(); 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v4->Reset(); 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->SchedulePaintInRect(gfx::Rect(10, 10, 10, 10)); 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PaintRootView(root, empty_paint); 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkRect tmp_rect; 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp_rect.iset(10, 10, 20, 20); 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckRect(v3->last_clip_, tmp_rect); 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp_rect.iset(20, 20, 30, 30); 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckRect(v2->last_clip_, tmp_rect); 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp_rect.iset(30, 30, 40, 40); 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckRect(v1->last_clip_, tmp_rect); 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure v4 was not painted 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp_rect.setEmpty(); 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckRect(v4->last_clip_, tmp_rect); 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window.DestroyWindow(); 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, RemoveNotification) { 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewStorage* vs = ViewStorage::GetInstance(); 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* widget = new Widget; 8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget->Init(CreateParams(Widget::InitParams::TYPE_POPUP)); 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* root_view = widget->GetRootView(); 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v1 = new View; 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int s1 = vs->CreateStorageID(); 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vs->StoreView(s1, v1); 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->AddChildView(v1); 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v11 = new View; 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int s11 = vs->CreateStorageID(); 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vs->StoreView(s11, v11); 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->AddChildView(v11); 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v111 = new View; 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int s111 = vs->CreateStorageID(); 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vs->StoreView(s111, v111); 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v11->AddChildView(v111); 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v112 = new View; 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int s112 = vs->CreateStorageID(); 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vs->StoreView(s112, v112); 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v11->AddChildView(v112); 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v113 = new View; 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int s113 = vs->CreateStorageID(); 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vs->StoreView(s113, v113); 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v11->AddChildView(v113); 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v1131 = new View; 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int s1131 = vs->CreateStorageID(); 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vs->StoreView(s1131, v1131); 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v113->AddChildView(v1131); 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v12 = new View; 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int s12 = vs->CreateStorageID(); 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vs->StoreView(s12, v12); 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->AddChildView(v12); 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v2 = new View; 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int s2 = vs->CreateStorageID(); 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vs->StoreView(s2, v2); 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->AddChildView(v2); 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v21 = new View; 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int s21 = vs->CreateStorageID(); 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vs->StoreView(s21, v21); 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->AddChildView(v21); 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v211 = new View; 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int s211 = vs->CreateStorageID(); 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vs->StoreView(s211, v211); 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v21->AddChildView(v211); 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t stored_views = vs->view_count(); 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try removing a leaf view. 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v21->RemoveChildView(v211); 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(stored_views - 1, vs->view_count()); 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, vs->RetrieveView(s211)); 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete v211; // We won't use this one anymore. 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now try removing a view with a hierarchy of depth 1. 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v11->RemoveChildView(v113); 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(stored_views - 3, vs->view_count()); 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, vs->RetrieveView(s113)); 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, vs->RetrieveView(s1131)); 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete v113; // We won't use this one anymore. 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now remove even more. 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->RemoveChildView(v1); 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, vs->RetrieveView(s1)); 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, vs->RetrieveView(s11)); 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, vs->RetrieveView(s12)); 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, vs->RetrieveView(s111)); 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, vs->RetrieveView(s112)); 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Put v1 back for more tests. 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->AddChildView(v1); 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vs->StoreView(s1, v1); 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Synchronously closing the window deletes the view hierarchy, which should 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // remove all its views from ViewStorage. 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->CloseNow(); 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(stored_views - 10, vs->view_count()); 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, vs->RetrieveView(s1)); 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, vs->RetrieveView(s12)); 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, vs->RetrieveView(s11)); 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, vs->RetrieveView(s12)); 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, vs->RetrieveView(s21)); 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, vs->RetrieveView(s111)); 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, vs->RetrieveView(s112)); 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HitTestView : public View { 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit HitTestView(bool has_hittest_mask) 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : has_hittest_mask_(has_hittest_mask) { 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~HitTestView() {} 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from View: 9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool HasHitTestMask() const OVERRIDE { 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return has_hittest_mask_; 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9390f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) virtual void GetHitTestMask(HitTestSource source, 9400f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) gfx::Path* mask) const OVERRIDE { 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(has_hittest_mask_); 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(mask); 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkScalar w = SkIntToScalar(width()); 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkScalar h = SkIntToScalar(height()); 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a triangular mask within the bounds of this View. 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mask->moveTo(w / 2, 0); 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mask->lineTo(w, h); 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mask->lineTo(0, h); 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mask->close(); 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_hittest_mask_; 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(HitTestView); 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Point ConvertPointToView(View* view, const gfx::Point& p) { 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point tmp(p); 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View::ConvertPointToTarget(view->GetWidget()->GetRootView(), view, &tmp); 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return tmp; 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect ConvertRectToView(View* view, const gfx::Rect& r) { 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect tmp(r); 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp.set_origin(ConvertPointToView(view, r.origin())); 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return tmp; 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RotateCounterclockwise(gfx::Transform* transform) { 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transform->matrix().set3x3(0, -1, 0, 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, 0, 0, 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 1); 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RotateClockwise(gfx::Transform* transform) { 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transform->matrix().set3x3( 0, 1, 0, 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) -1, 0, 0, 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 1); 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, HitTestMasks) { 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* widget = new Widget; 9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget->Init(params); 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* root_view = widget->GetRootView(); 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->SetBoundsRect(gfx::Rect(0, 0, 500, 500)); 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect v1_bounds = gfx::Rect(0, 0, 100, 100); 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HitTestView* v1 = new HitTestView(false); 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetBoundsRect(v1_bounds); 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->AddChildView(v1); 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect v2_bounds = gfx::Rect(105, 0, 100, 100); 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HitTestView* v2 = new HitTestView(true); 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetBoundsRect(v2_bounds); 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->AddChildView(v2); 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point v1_centerpoint = v1_bounds.CenterPoint(); 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point v2_centerpoint = v2_bounds.CenterPoint(); 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point v1_origin = v1_bounds.origin(); 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point v2_origin = v2_bounds.origin(); 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect r1(10, 10, 110, 15); 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect r2(106, 1, 98, 98); 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect r3(0, 0, 300, 300); 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect r4(115, 342, 200, 10); 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test HitTestPoint 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1->HitTestPoint(ConvertPointToView(v1, v1_centerpoint))); 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v2->HitTestPoint(ConvertPointToView(v2, v2_centerpoint))); 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1->HitTestPoint(ConvertPointToView(v1, v1_origin))); 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v2->HitTestPoint(ConvertPointToView(v2, v2_origin))); 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test HitTestRect 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1->HitTestRect(ConvertRectToView(v1, r1))); 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v2->HitTestRect(ConvertRectToView(v2, r1))); 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v1->HitTestRect(ConvertRectToView(v1, r2))); 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v2->HitTestRect(ConvertRectToView(v2, r2))); 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1->HitTestRect(ConvertRectToView(v1, r3))); 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v2->HitTestRect(ConvertRectToView(v2, r3))); 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v1->HitTestRect(ConvertRectToView(v1, r4))); 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v2->HitTestRect(ConvertRectToView(v2, r4))); 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test GetEventHandlerForPoint 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v1, root_view->GetEventHandlerForPoint(v1_centerpoint)); 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v2, root_view->GetEventHandlerForPoint(v2_centerpoint)); 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v1, root_view->GetEventHandlerForPoint(v1_origin)); 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(root_view, root_view->GetEventHandlerForPoint(v2_origin)); 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1040c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Test GetTooltipHandlerForPoint 1041c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(v1, root_view->GetTooltipHandlerForPoint(v1_centerpoint)); 1042c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(v2, root_view->GetTooltipHandlerForPoint(v2_centerpoint)); 1043c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1044c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(v1, root_view->GetTooltipHandlerForPoint(v1_origin)); 1045c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(root_view, root_view->GetTooltipHandlerForPoint(v2_origin)); 1046c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1047c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(v1->GetTooltipHandlerForPoint(v2_origin)); 1048c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->CloseNow(); 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, NotifyEnterExitOnChild) { 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* widget = new Widget; 10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget->Init(params); 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* root_view = widget->GetRootView(); 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->SetBoundsRect(gfx::Rect(0, 0, 500, 500)); 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Have this hierarchy of views (the coords here are in root coord): 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // v1 (0, 0, 100, 100) 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - v11 (0, 0, 20, 30) 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - v111 (5, 5, 5, 15) 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - v12 (50, 10, 30, 90) 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - v121 (60, 20, 10, 10) 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // v2 (105, 0, 100, 100) 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - v21 (120, 10, 50, 20) 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v1 = new TestView; 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetBounds(0, 0, 100, 100); 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->AddChildView(v1); 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->set_notify_enter_exit_on_child(true); 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v11 = new TestView; 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v11->SetBounds(0, 0, 20, 30); 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->AddChildView(v11); 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v111 = new TestView; 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v111->SetBounds(5, 5, 5, 15); 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v11->AddChildView(v111); 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v12 = new TestView; 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v12->SetBounds(50, 10, 30, 90); 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->AddChildView(v12); 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v121 = new TestView; 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v121->SetBounds(10, 10, 10, 10); 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v12->AddChildView(v121); 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v2 = new TestView; 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetBounds(105, 0, 100, 100); 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->AddChildView(v2); 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v21 = new TestView; 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v21->SetBounds(15, 10, 50, 20); 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->AddChildView(v21); 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v11->Reset(); 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v111->Reset(); 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v12->Reset(); 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v121->Reset(); 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->Reset(); 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v21->Reset(); 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move the mouse in v111. 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point p1(6, 6); 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent move1(ui::ET_MOUSE_MOVED, p1, p1, 0); 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->OnMouseMoved(move1); 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v111->received_mouse_enter_); 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v11->last_mouse_event_type_); 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1->received_mouse_enter_); 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v111->Reset(); 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now, move into v121. 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point p2(65, 21); 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent move2(ui::ET_MOUSE_MOVED, p2, p2, 0); 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->OnMouseMoved(move2); 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v111->received_mouse_exit_); 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v121->received_mouse_enter_); 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v1->last_mouse_event_type_); 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v111->Reset(); 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v121->Reset(); 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now, move into v11. 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point p3(1, 1); 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent move3(ui::ET_MOUSE_MOVED, p3, p3, 0); 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->OnMouseMoved(move3); 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v121->received_mouse_exit_); 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v11->received_mouse_enter_); 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v1->last_mouse_event_type_); 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v121->Reset(); 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v11->Reset(); 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move to v21. 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point p4(121, 15); 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent move4(ui::ET_MOUSE_MOVED, p4, p4, 0); 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->OnMouseMoved(move4); 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v21->received_mouse_enter_); 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v2->last_mouse_event_type_); 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v11->received_mouse_exit_); 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1->received_mouse_exit_); 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v21->Reset(); 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v11->Reset(); 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move to v1. 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point p5(21, 0); 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent move5(ui::ET_MOUSE_MOVED, p5, p5, 0); 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->OnMouseMoved(move5); 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v21->received_mouse_exit_); 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1->received_mouse_enter_); 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v21->Reset(); 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now, move into v11. 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point p6(15, 15); 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent mouse6(ui::ET_MOUSE_MOVED, p6, p6, 0); 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->OnMouseMoved(mouse6); 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v11->received_mouse_enter_); 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v1->last_mouse_event_type_); 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v11->Reset(); 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move back into v1. Although |v1| had already received an ENTER for mouse6, 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and the mouse remains inside |v1| the whole time, it receives another ENTER 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // when the mouse leaves v11. 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point p7(21, 0); 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent mouse7(ui::ET_MOUSE_MOVED, p7, p7, 0); 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->OnMouseMoved(mouse7); 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v11->received_mouse_exit_); 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v1->received_mouse_enter_); 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->CloseNow(); 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, Textfield) { 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16 kText = ASCIIToUTF16("Reality is that which, when you stop " 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "believing it, doesn't go away."); 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16 kExtraText = ASCIIToUTF16("Pretty deep, Philip!"); 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16 kEmptyString; 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* widget = new Widget; 11902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.bounds = gfx::Rect(0, 0, 100, 100); 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Init(params); 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* root_view = widget->GetRootView(); 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Textfield* textfield = new Textfield(); 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->AddChildView(textfield); 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test setting, appending text. 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield->SetText(kText); 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kText, textfield->text()); 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield->AppendText(kExtraText); 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kText + kExtraText, textfield->text()); 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield->SetText(string16()); 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kEmptyString, textfield->text()); 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test selection related methods. 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield->SetText(kText); 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kEmptyString, textfield->GetSelectedText()); 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield->SelectAll(false); 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kText, textfield->text()); 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield->ClearSelection(); 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kEmptyString, textfield->GetSelectedText()); 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->CloseNow(); 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the Textfield view respond appropiately to cut/copy/paste. 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, TextfieldCutCopyPaste) { 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16 kNormalText = ASCIIToUTF16("Normal"); 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16 kReadOnlyText = ASCIIToUTF16("Read only"); 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16 kPasswordText = ASCIIToUTF16("Password! ** Secret stuff **"); 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::Clipboard* clipboard = ui::Clipboard::GetForCurrentThread(); 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* widget = new Widget; 12262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.bounds = gfx::Rect(0, 0, 100, 100); 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Init(params); 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* root_view = widget->GetRootView(); 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Textfield* normal = new Textfield(); 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Textfield* read_only = new Textfield(); 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_only->SetReadOnly(true); 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Textfield* password = new Textfield(Textfield::STYLE_OBSCURED); 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->AddChildView(normal); 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->AddChildView(read_only); 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view->AddChildView(password); 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) normal->SetText(kNormalText); 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_only->SetText(kReadOnlyText); 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) password->SetText(kPasswordText); 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test cut. 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) normal->SelectAll(false); 12492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) normal->ExecuteCommand(IDS_APP_CUT); 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 result; 12514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) clipboard->ReadText(ui::CLIPBOARD_TYPE_COPY_PASTE, &result); 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kNormalText, result); 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) normal->SetText(kNormalText); // Let's revert to the original content. 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_only->SelectAll(false); 12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) read_only->ExecuteCommand(IDS_APP_CUT); 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.clear(); 12584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) clipboard->ReadText(ui::CLIPBOARD_TYPE_COPY_PASTE, &result); 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cut should have failed, so the clipboard content should not have changed. 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kNormalText, result); 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) password->SelectAll(false); 12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) password->ExecuteCommand(IDS_APP_CUT); 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.clear(); 12654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) clipboard->ReadText(ui::CLIPBOARD_TYPE_COPY_PASTE, &result); 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cut should have failed, so the clipboard content should not have changed. 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kNormalText, result); 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test copy. 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start with |read_only| to observe a change in clipboard text. 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_only->SelectAll(false); 12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) read_only->ExecuteCommand(IDS_APP_COPY); 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.clear(); 12774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) clipboard->ReadText(ui::CLIPBOARD_TYPE_COPY_PASTE, &result); 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kReadOnlyText, result); 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) normal->SelectAll(false); 12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) normal->ExecuteCommand(IDS_APP_COPY); 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.clear(); 12834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) clipboard->ReadText(ui::CLIPBOARD_TYPE_COPY_PASTE, &result); 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kNormalText, result); 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) password->SelectAll(false); 12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) password->ExecuteCommand(IDS_APP_COPY); 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.clear(); 12894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) clipboard->ReadText(ui::CLIPBOARD_TYPE_COPY_PASTE, &result); 12902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Text cannot be copied from an obscured field; the clipboard won't change. 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kNormalText, result); 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 12942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Test paste. 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Attempting to paste kNormalText in a read-only text-field should fail. 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_only->SelectAll(false); 12992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) read_only->ExecuteCommand(IDS_APP_PASTE); 13002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kReadOnlyText, read_only->text()); 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) password->SelectAll(false); 13032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) password->ExecuteCommand(IDS_APP_PASTE); 13042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kNormalText, password->text()); 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Copy from |read_only| to observe a change in the normal textfield text. 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_only->SelectAll(false); 13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) read_only->ExecuteCommand(IDS_APP_COPY); 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) normal->SelectAll(false); 13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) normal->ExecuteCommand(IDS_APP_PASTE); 13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kReadOnlyText, normal->text()); 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->CloseNow(); 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Accelerators 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestView::AcceleratorPressed(const ui::Accelerator& accelerator) { 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerator_count_map_[accelerator]++; 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) && !defined(USE_AURA) 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, ActivateAccelerator) { 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Register a keyboard accelerator before the view is added to a window. 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::Accelerator return_accelerator(ui::VKEY_RETURN, ui::EF_NONE); 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* view = new TestView(); 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->Reset(); 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->AddAccelerator(return_accelerator); 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(view->accelerator_count_map_[return_accelerator], 0); 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a window and add the view as its child. 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Widget> widget(new Widget); 13342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.bounds = gfx::Rect(0, 0, 100, 100); 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Init(params); 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* root = widget->GetRootView(); 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->AddChildView(view); 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Show(); 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the focus manager. 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FocusManager* focus_manager = widget->GetFocusManager(); 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(focus_manager); 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hit the return key and see if it takes effect. 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator)); 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(view->accelerator_count_map_[return_accelerator], 1); 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hit the escape key. Nothing should happen. 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::Accelerator escape_accelerator(ui::VKEY_ESCAPE, ui::EF_NONE); 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(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], 0); 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now register the escape key and hit it again. 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->AddAccelerator(escape_accelerator); 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(focus_manager->ProcessAccelerator(escape_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) // Remove the return key accelerator. 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->RemoveAccelerator(return_accelerator); 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(focus_manager->ProcessAccelerator(return_accelerator)); 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(view->accelerator_count_map_[return_accelerator], 1); 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(view->accelerator_count_map_[escape_accelerator], 1); 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add it again. Hit the return key and the escape key. 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->AddAccelerator(return_accelerator); 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator)); 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(view->accelerator_count_map_[return_accelerator], 2); 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(view->accelerator_count_map_[escape_accelerator], 1); 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(focus_manager->ProcessAccelerator(escape_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) 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove all the accelerators. 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->ResetAccelerators(); 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(focus_manager->ProcessAccelerator(return_accelerator)); 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(view->accelerator_count_map_[return_accelerator], 2); 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(view->accelerator_count_map_[escape_accelerator], 2); 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(focus_manager->ProcessAccelerator(escape_accelerator)); 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(view->accelerator_count_map_[return_accelerator], 2); 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(view->accelerator_count_map_[escape_accelerator], 2); 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->CloseNow(); 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) && !defined(USE_AURA) 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, HiddenViewWithAccelerator) { 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::Accelerator return_accelerator(ui::VKEY_RETURN, ui::EF_NONE); 13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* view = new TestView(); 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->Reset(); 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->AddAccelerator(return_accelerator); 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(view->accelerator_count_map_[return_accelerator], 0); 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Widget> widget(new Widget); 13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.bounds = gfx::Rect(0, 0, 100, 100); 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Init(params); 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* root = widget->GetRootView(); 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->AddChildView(view); 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Show(); 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FocusManager* focus_manager = widget->GetFocusManager(); 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(focus_manager); 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->SetVisible(false); 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(focus_manager->ProcessAccelerator(return_accelerator)); 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->SetVisible(true); 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator)); 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->CloseNow(); 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) && !defined(USE_AURA) 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, ViewInHiddenWidgetWithAccelerator) { 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::Accelerator return_accelerator(ui::VKEY_RETURN, ui::EF_NONE); 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* view = new TestView(); 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->Reset(); 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->AddAccelerator(return_accelerator); 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(view->accelerator_count_map_[return_accelerator], 0); 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Widget> widget(new Widget); 14292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.bounds = gfx::Rect(0, 0, 100, 100); 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Init(params); 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* root = widget->GetRootView(); 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->AddChildView(view); 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FocusManager* focus_manager = widget->GetFocusManager(); 14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(focus_manager); 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(focus_manager->ProcessAccelerator(return_accelerator)); 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, view->accelerator_count_map_[return_accelerator]); 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Show(); 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator)); 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, view->accelerator_count_map_[return_accelerator]); 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Hide(); 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(focus_manager->ProcessAccelerator(return_accelerator)); 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, view->accelerator_count_map_[return_accelerator]); 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->CloseNow(); 14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) && !defined(USE_AURA) 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Mouse-wheel message rerouting 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScrollableTestView : public View { 14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScrollableTestView() { } 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual gfx::Size GetPreferredSize() { 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Size(100, 10000); 14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Layout() { 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SizeToPreferredSize(); 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestViewWithControls : public View { 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestViewWithControls() { 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_field_ = new Textfield(); 14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChildView(text_field_); 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Textfield* text_field_; 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SimpleWidgetDelegate : public WidgetDelegate { 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit SimpleWidgetDelegate(View* contents) : contents_(contents) { } 14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DeleteDelegate() { delete this; } 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual View* GetContentsView() { return contents_; } 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual Widget* GetWidget() { return contents_->GetWidget(); } 14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual const Widget* GetWidget() const { return contents_->GetWidget(); } 14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* contents_; 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the mouse-wheel messages are correctly rerouted to the window 14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// under the mouse. 14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(jcampan): http://crbug.com/10572 Disabled as it fails on the Vista build 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bot. 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note that this fails for a variety of reasons: 15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - focused view is apparently reset across window activations and never 15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// properly restored 15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - this test depends on you not having any other window visible open under the 15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// area that it opens the test windows. --beng 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, DISABLED_RerouteMouseWheelTest) { 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestViewWithControls* view_with_controls = new TestViewWithControls(); 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* window1 = Widget::CreateWindowWithBounds( 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new SimpleWidgetDelegate(view_with_controls), 15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect(0, 0, 100, 100)); 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window1->Show(); 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScrollView* scroll_view = new ScrollView(); 15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scroll_view->SetContents(new ScrollableTestView()); 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* window2 = Widget::CreateWindowWithBounds( 15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new SimpleWidgetDelegate(scroll_view), 15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect(200, 200, 100, 100)); 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2->Show(); 15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, scroll_view->GetVisibleRect().y()); 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make the window1 active, as this is what it would be in real-world. 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window1->Activate(); 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Let's send a mouse-wheel message to the different controls and check that 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it is rerouted to the window under the mouse (effectively scrolling the 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // scroll-view). 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // First to the Window's HWND. 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::SendMessage(view_with_controls->GetWidget()->GetNativeView(), 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WM_MOUSEWHEEL, MAKEWPARAM(0, -20), MAKELPARAM(250, 250)); 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(20, scroll_view->GetVisibleRect().y()); 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Then the text-field. 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::SendMessage(view_with_controls->text_field_->GetTestingHandle(), 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WM_MOUSEWHEEL, MAKEWPARAM(0, -20), MAKELPARAM(250, 250)); 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(80, scroll_view->GetVisibleRect().y()); 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure we don't scroll when the mouse is not over that window. 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::SendMessage(view_with_controls->text_field_->GetTestingHandle(), 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WM_MOUSEWHEEL, MAKEWPARAM(0, -20), MAKELPARAM(50, 50)); 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(80, scroll_view->GetVisibleRect().y()); 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window1->CloseNow(); 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window2->CloseNow(); 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Native view hierachy 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 1549424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)class ToplevelWidgetObserverView : public View { 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1551424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ToplevelWidgetObserverView() : toplevel_(NULL) { 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1553424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) virtual ~ToplevelWidgetObserverView() { 15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1556424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // View overrides: 1557424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) virtual void ViewHierarchyChanged( 1558424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const ViewHierarchyChangedDetails& details) OVERRIDE { 1559424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (details.is_add) { 1560424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) toplevel_ = GetWidget() ? GetWidget()->GetTopLevelWidget() : NULL; 1561424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } else { 1562424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) toplevel_ = NULL; 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1565424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) virtual void NativeViewHierarchyChanged() OVERRIDE { 1566424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) toplevel_ = GetWidget() ? GetWidget()->GetTopLevelWidget() : NULL; 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1569424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) Widget* toplevel() { return toplevel_; } 1570424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 1571424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) private: 1572424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) Widget* toplevel_; 1573424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 1574424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ToplevelWidgetObserverView); 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1577424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Test that a view can track the current top level widget by overriding 1578424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// View::ViewHierarchyChanged() and View::NativeViewHierarchyChanged(). 1579424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)TEST_F(ViewTest, NativeViewHierarchyChanged) { 1580424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) scoped_ptr<Widget> toplevel1(new Widget); 1581424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) Widget::InitParams toplevel1_params = 1582424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) CreateParams(Widget::InitParams::TYPE_POPUP); 1583424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) toplevel1_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 1584424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) toplevel1->Init(toplevel1_params); 1585424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 1586424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) scoped_ptr<Widget> toplevel2(new Widget); 1587424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) Widget::InitParams toplevel2_params = 1588424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) CreateParams(Widget::InitParams::TYPE_POPUP); 1589424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) toplevel2_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 1590424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) toplevel2->Init(toplevel2_params); 1591424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 1592424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) Widget* child = new Widget; 1593424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) Widget::InitParams child_params(Widget::InitParams::TYPE_CONTROL); 1594424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) child_params.parent = toplevel1->GetNativeView(); 1595424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) child->Init(child_params); 1596424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 1597424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ToplevelWidgetObserverView* observer_view = 1598424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) new ToplevelWidgetObserverView(); 1599424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_EQ(NULL, observer_view->toplevel()); 1600424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 1601424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) child->SetContentsView(observer_view); 1602424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_EQ(toplevel1, observer_view->toplevel()); 1603424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 1604424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) Widget::ReparentNativeView(child->GetNativeView(), 1605424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) toplevel2->GetNativeView()); 1606424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_EQ(toplevel2, observer_view->toplevel()); 1607424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 1608424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) observer_view->parent()->RemoveChildView(observer_view); 1609424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_EQ(NULL, observer_view->toplevel()); 1610424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 1611424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Make |observer_view| |child|'s contents view again so that it gets deleted 1612424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // with the widget. 1613424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) child->SetContentsView(observer_view); 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Transformations 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TransformPaintView : public TestView { 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TransformPaintView() {} 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TransformPaintView() {} 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ClearScheduledPaintRect() { 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scheduled_paint_rect_ = gfx::Rect(); 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect scheduled_paint_rect() const { return scheduled_paint_rect_; } 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from View: 16322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SchedulePaintInRect(const gfx::Rect& rect) OVERRIDE { 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect xrect = ConvertRectToParent(rect); 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scheduled_paint_rect_.Union(xrect); 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect scheduled_paint_rect_; 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TransformPaintView); 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, TransformPaint) { 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TransformPaintView* v1 = new TransformPaintView(); 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetBoundsRect(gfx::Rect(0, 0, 500, 300)); 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v2 = new TestView(); 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetBoundsRect(gfx::Rect(100, 100, 200, 100)); 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* widget = new Widget; 16512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.bounds = gfx::Rect(50, 50, 650, 650); 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Init(params); 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Show(); 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* root = widget->GetRootView(); 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->AddChildView(v1); 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->AddChildView(v2); 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // At this moment, |v2| occupies (100, 100) to (300, 200) in |root|. 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->ClearScheduledPaintRect(); 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SchedulePaint(); 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(100, 100, 200, 100), v1->scheduled_paint_rect()); 16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Rotate |v1| counter-clockwise. 16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform transform; 16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RotateCounterclockwise(&transform); 16692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform.matrix().set(1, 3, 500.0); 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetTransform(transform); 16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |v2| now occupies (100, 200) to (200, 400) in |root|. 16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->ClearScheduledPaintRect(); 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SchedulePaint(); 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(100, 200, 100, 200), v1->scheduled_paint_rect()); 16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->CloseNow(); 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, TransformEvent) { 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v1 = new TestView(); 16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetBoundsRect(gfx::Rect(0, 0, 500, 300)); 16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v2 = new TestView(); 16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetBoundsRect(gfx::Rect(100, 100, 200, 100)); 16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* widget = new Widget; 16902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.bounds = gfx::Rect(50, 50, 650, 650); 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Init(params); 16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* root = widget->GetRootView(); 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->AddChildView(v1); 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->AddChildView(v2); 16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // At this moment, |v2| occupies (100, 100) to (300, 200) in |root|. 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Rotate |v1| counter-clockwise. 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform transform(v1->GetTransform()); 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RotateCounterclockwise(&transform); 17032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform.matrix().set(1, 3, 500.0); 17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetTransform(transform); 17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |v2| now occupies (100, 200) to (200, 400) in |root|. 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->Reset(); 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point p1(110, 210); 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent pressed(ui::ET_MOUSE_PRESSED, p1, p1, 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON); 17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->OnMousePressed(pressed); 17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, v1->last_mouse_event_type_); 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_MOUSE_PRESSED, v2->last_mouse_event_type_); 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(190, v2->location_.x()); 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(10, v2->location_.y()); 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent released(ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(), 0); 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->OnMouseReleased(released); 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now rotate |v2| inside |v1| clockwise. 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transform = v2->GetTransform(); 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RotateClockwise(&transform); 172568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) transform.matrix().set(0, 3, 100.f); 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetTransform(transform); 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now, |v2| occupies (100, 100) to (200, 300) in |v1|, and (100, 300) to 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (300, 400) in |root|. 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->Reset(); 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point point2(110, 320); 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent p2(ui::ET_MOUSE_PRESSED, point2, point2, 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON); 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->OnMousePressed(p2); 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, v1->last_mouse_event_type_); 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_MOUSE_PRESSED, v2->last_mouse_event_type_); 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(10, v2->location_.x()); 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(20, v2->location_.y()); 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->OnMouseReleased(released); 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetTransform(gfx::Transform()); 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetTransform(gfx::Transform()); 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v3 = new TestView(); 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->SetBoundsRect(gfx::Rect(10, 10, 20, 30)); 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->AddChildView(v3); 17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Rotate |v3| clockwise with respect to |v2|. 17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transform = v1->GetTransform(); 17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RotateClockwise(&transform); 175568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) transform.matrix().set(0, 3, 30.f); 17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->SetTransform(transform); 17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Scale |v2| with respect to |v1| along both axis. 17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transform = v2->GetTransform(); 176068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) transform.matrix().set(0, 0, 0.8f); 176168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) transform.matrix().set(1, 1, 0.5f); 17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetTransform(transform); 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |v3| occupies (108, 105) to (132, 115) in |root|. 17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->Reset(); 17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->Reset(); 17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point point(112, 110); 17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent p3(ui::ET_MOUSE_PRESSED, point, point, 17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON); 17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->OnMousePressed(p3); 17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_MOUSE_PRESSED, v3->last_mouse_event_type_); 17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(10, v3->location_.x()); 17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(25, v3->location_.y()); 17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->OnMouseReleased(released); 17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetTransform(gfx::Transform()); 17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetTransform(gfx::Transform()); 17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->SetTransform(gfx::Transform()); 17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->Reset(); 17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->Reset(); 17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->Reset(); 17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Rotate |v3| clockwise with respect to |v2|, and scale it along both axis. 17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transform = v3->GetTransform(); 17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RotateClockwise(&transform); 179268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) transform.matrix().set(0, 3, 30.f); 17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Rotation sets some scaling transformation. Using SetScale would overwrite 17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that and pollute the rotation. So combine the scaling with the existing 17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // transforamtion. 17962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform scale; 179768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) scale.Scale(0.8f, 0.5f); 17982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform.ConcatTransform(scale); 17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->SetTransform(transform); 18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Translate |v2| with respect to |v1|. 18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transform = v2->GetTransform(); 180368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) transform.matrix().set(0, 3, 10.f); 180468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) transform.matrix().set(1, 3, 10.f); 18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetTransform(transform); 18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |v3| now occupies (120, 120) to (144, 130) in |root|. 18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point point3(124, 125); 18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent p4(ui::ET_MOUSE_PRESSED, point3, point3, 18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON); 18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->OnMousePressed(p4); 18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_MOUSE_PRESSED, v3->last_mouse_event_type_); 18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(10, v3->location_.x()); 18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(25, v3->location_.y()); 18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->OnMouseReleased(released); 18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->CloseNow(); 18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, TransformVisibleBound) { 18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect viewport_bounds(0, 0, 100, 100); 18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Widget> widget(new Widget); 18272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.bounds = viewport_bounds; 18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Init(params); 18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->GetRootView()->SetBoundsRect(viewport_bounds); 18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* viewport = new View; 18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->SetContentsView(viewport); 18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* contents = new View; 18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) viewport->AddChildView(contents); 18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) viewport->SetBoundsRect(viewport_bounds); 18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents->SetBoundsRect(gfx::Rect(0, 0, 100, 200)); 18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* child = new View; 18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents->AddChildView(child); 18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->SetBoundsRect(gfx::Rect(10, 90, 50, 50)); 18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(0, 0, 50, 10), child->GetVisibleBounds()); 18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Rotate |child| counter-clockwise 18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform transform; 18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RotateCounterclockwise(&transform); 184868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) transform.matrix().set(1, 3, 50.f); 18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->SetTransform(transform); 18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(40, 0, 10, 50), child->GetVisibleBounds()); 18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->CloseNow(); 18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OnVisibleBoundsChanged() 18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VisibleBoundsView : public View { 18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisibleBoundsView() : received_notification_(false) {} 18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~VisibleBoundsView() {} 18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool received_notification() const { return received_notification_; } 18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_received_notification(bool received) { 18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) received_notification_ = received; 18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from View: 18702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool NeedsNotificationWhenVisibleBoundsChange() const OVERRIDE { 18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnVisibleBoundsChanged() OVERRIDE { 18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) received_notification_ = true; 18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool received_notification_; 18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(VisibleBoundsView); 18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, OnVisibleBoundsChanged) { 18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect viewport_bounds(0, 0, 100, 100); 18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Widget> widget(new Widget); 18862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.bounds = viewport_bounds; 18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Init(params); 18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->GetRootView()->SetBoundsRect(viewport_bounds); 18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* viewport = new View; 18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->SetContentsView(viewport); 18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* contents = new View; 18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) viewport->AddChildView(contents); 18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) viewport->SetBoundsRect(viewport_bounds); 18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents->SetBoundsRect(gfx::Rect(0, 0, 100, 200)); 18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a view that cares about visible bounds notifications, and position 19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it just outside the visible bounds of the viewport. 19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisibleBoundsView* child = new VisibleBoundsView; 19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents->AddChildView(child); 19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->SetBoundsRect(gfx::Rect(10, 110, 50, 50)); 19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The child bound should be fully clipped. 19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(child->GetVisibleBounds().IsEmpty()); 19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now scroll the contents, but not enough to make the child visible. 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents->SetY(contents->y() - 1); 19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should have received the notification since the visible bounds may have 19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // changed (even though they didn't). 19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(child->received_notification()); 19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(child->GetVisibleBounds().IsEmpty()); 19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->set_received_notification(false); 19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now scroll the contents, this time by enough to make the child visible by 19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // one pixel. 19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents->SetY(contents->y() - 10); 19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(child->received_notification()); 19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, child->GetVisibleBounds().height()); 19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->set_received_notification(false); 19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->CloseNow(); 19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BoundsChanged() 19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, SetBoundsPaint) { 19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView top_view; 19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* child_view = new TestView; 19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top_view.SetBoundsRect(gfx::Rect(0, 0, 100, 100)); 19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top_view.scheduled_paint_rects_.clear(); 19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child_view->SetBoundsRect(gfx::Rect(10, 10, 20, 20)); 19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top_view.AddChildView(child_view); 19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top_view.scheduled_paint_rects_.clear(); 19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child_view->SetBoundsRect(gfx::Rect(30, 30, 20, 20)); 19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2U, top_view.scheduled_paint_rects_.size()); 19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There should be 2 rects, spanning from (10, 10) to (50, 50). 19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect paint_rect = top_view.scheduled_paint_rects_[0]; 19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) paint_rect.Union(top_view.scheduled_paint_rects_[1]); 19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(10, 10, 40, 40), paint_rect); 19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests conversion methods with a transform. 19508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(ViewTest, ConversionsWithTransform) { 19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView top_view; 19528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 19538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // View hierarchy used to test scale transforms. 19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* child = new TestView; 19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* child_child = new TestView; 19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // View used to test a rotation transform. 19588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) TestView* child_2 = new TestView; 19598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top_view.AddChildView(child); 19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->AddChildView(child_child); 19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top_view.SetBoundsRect(gfx::Rect(0, 0, 1000, 1000)); 19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->SetBoundsRect(gfx::Rect(7, 19, 500, 500)); 19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform transform; 19672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform.Scale(3.0, 4.0); 19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->SetTransform(transform); 19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child_child->SetBoundsRect(gfx::Rect(17, 13, 100, 100)); 19712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform.MakeIdentity(); 19722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform.Scale(5.0, 7.0); 19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child_child->SetTransform(transform); 19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) top_view.AddChildView(child_2); 19768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) child_2->SetBoundsRect(gfx::Rect(700, 725, 100, 100)); 19778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) transform.MakeIdentity(); 19788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) RotateClockwise(&transform); 19798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) child_2->SetTransform(transform); 19808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sanity check to make sure basic transforms act as expected. 19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform transform; 19842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform.Translate(110.0, -110.0); 19852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform.Scale(100.0, 55.0); 19862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform.Translate(1.0, 1.0); 19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // convert to a 3x3 matrix. 19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SkMatrix& matrix = transform.matrix(); 19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(210, matrix.getTranslateX()); 19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-55, matrix.getTranslateY()); 19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(100, matrix.getScaleX()); 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(55, matrix.getScaleY()); 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, matrix.getSkewX()); 19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, matrix.getSkewY()); 19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform transform; 20012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform.Translate(1.0, 1.0); 20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform t2; 20032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) t2.Scale(100.0, 55.0); 20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform t3; 20052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) t3.Translate(110.0, -110.0); 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transform.ConcatTransform(t2); 20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transform.ConcatTransform(t3); 20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // convert to a 3x3 matrix 20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SkMatrix& matrix = transform.matrix(); 20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(210, matrix.getTranslateX()); 20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-55, matrix.getTranslateY()); 20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(100, matrix.getScaleX()); 20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(55, matrix.getScaleY()); 20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, matrix.getSkewX()); 20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, matrix.getSkewY()); 20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Conversions from child->top and top->child. 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point point(5, 5); 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View::ConvertPointToTarget(child, &top_view, &point); 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(22, point.x()); 20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(39, point.y()); 20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) gfx::RectF rect(5.0f, 5.0f, 10.0f, 20.0f); 20288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) View::ConvertRectToTarget(child, &top_view, &rect); 20298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_FLOAT_EQ(22.0f, rect.x()); 20308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_FLOAT_EQ(39.0f, rect.y()); 20318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_FLOAT_EQ(30.0f, rect.width()); 20328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_FLOAT_EQ(80.0f, rect.height()); 20338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) point.SetPoint(22, 39); 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View::ConvertPointToTarget(&top_view, child, &point); 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(5, point.x()); 20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(5, point.y()); 20388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 20398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) rect.SetRect(22.0f, 39.0f, 30.0f, 80.0f); 20408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) View::ConvertRectToTarget(&top_view, child, &rect); 20418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_FLOAT_EQ(5.0f, rect.x()); 20428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_FLOAT_EQ(5.0f, rect.y()); 20438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_FLOAT_EQ(10.0f, rect.width()); 20448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_FLOAT_EQ(20.0f, rect.height()); 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Conversions from child_child->top and top->child_child. 20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point point(5, 5); 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View::ConvertPointToTarget(child_child, &top_view, &point); 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(133, point.x()); 20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(211, point.y()); 20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) gfx::RectF rect(5.0f, 5.0f, 10.0f, 20.0f); 20558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) View::ConvertRectToTarget(child_child, &top_view, &rect); 20568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_FLOAT_EQ(133.0f, rect.x()); 20578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_FLOAT_EQ(211.0f, rect.y()); 20588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_FLOAT_EQ(150.0f, rect.width()); 20598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_FLOAT_EQ(560.0f, rect.height()); 20608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) point.SetPoint(133, 211); 20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View::ConvertPointToTarget(&top_view, child_child, &point); 20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(5, point.x()); 20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(5, point.y()); 20658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 20668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) rect.SetRect(133.0f, 211.0f, 150.0f, 560.0f); 20678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) View::ConvertRectToTarget(&top_view, child_child, &rect); 20688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_FLOAT_EQ(5.0f, rect.x()); 20698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_FLOAT_EQ(5.0f, rect.y()); 20708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_FLOAT_EQ(10.0f, rect.width()); 20718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_FLOAT_EQ(20.0f, rect.height()); 20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Conversions from child_child->child and child->child_child 20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point point(5, 5); 20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View::ConvertPointToTarget(child_child, child, &point); 20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(42, point.x()); 20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(48, point.y()); 20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) gfx::RectF rect(5.0f, 5.0f, 10.0f, 20.0f); 20828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) View::ConvertRectToTarget(child_child, child, &rect); 20838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_FLOAT_EQ(42.0f, rect.x()); 20848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_FLOAT_EQ(48.0f, rect.y()); 20858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_FLOAT_EQ(50.0f, rect.width()); 20868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_FLOAT_EQ(140.0f, rect.height()); 20878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) point.SetPoint(42, 48); 20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View::ConvertPointToTarget(child, child_child, &point); 20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(5, point.x()); 20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(5, point.y()); 20928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 20938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) rect.SetRect(42.0f, 48.0f, 50.0f, 140.0f); 20948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) View::ConvertRectToTarget(child, child_child, &rect); 20958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_FLOAT_EQ(5.0f, rect.x()); 20968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_FLOAT_EQ(5.0f, rect.y()); 20978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_FLOAT_EQ(10.0f, rect.width()); 20988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_FLOAT_EQ(20.0f, rect.height()); 20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Conversions from top_view to child with a value that should be negative. 21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This ensures we don't round up with negative numbers. 21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point point(6, 18); 21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View::ConvertPointToTarget(&top_view, child, &point); 21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-1, point.x()); 21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-1, point.y()); 21088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 21098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) float error = 0.01f; 21108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) gfx::RectF rect(6.0f, 18.0f, 10.0f, 39.0f); 21118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) View::ConvertRectToTarget(&top_view, child, &rect); 21128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_NEAR(-0.33f, rect.x(), error); 21138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_NEAR(-0.25f, rect.y(), error); 21148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_NEAR(3.33f, rect.width(), error); 21158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_NEAR(9.75f, rect.height(), error); 21168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 21178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 21188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Rect conversions from top_view->child_2 and child_2->top_view. 21198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) { 21208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) gfx::RectF rect(50.0f, 55.0f, 20.0f, 30.0f); 21218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) View::ConvertRectToTarget(child_2, &top_view, &rect); 21228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_FLOAT_EQ(615.0f, rect.x()); 21238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_FLOAT_EQ(775.0f, rect.y()); 21248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_FLOAT_EQ(30.0f, rect.width()); 21258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_FLOAT_EQ(20.0f, rect.height()); 21268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 21278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) rect.SetRect(615.0f, 775.0f, 30.0f, 20.0f); 21288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) View::ConvertRectToTarget(&top_view, child_2, &rect); 21298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_FLOAT_EQ(50.0f, rect.x()); 21308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_FLOAT_EQ(55.0f, rect.y()); 21318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_FLOAT_EQ(20.0f, rect.width()); 21328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_FLOAT_EQ(30.0f, rect.height()); 21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests conversion methods for rectangles. 21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, ConvertRectWithTransform) { 21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Widget> widget(new Widget); 21392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.bounds = gfx::Rect(50, 50, 650, 650); 21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Init(params); 21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* root = widget->GetRootView(); 21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v1 = new TestView; 21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestView* v2 = new TestView; 21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->AddChildView(v1); 21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->AddChildView(v2); 21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetBoundsRect(gfx::Rect(10, 10, 500, 500)); 21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetBoundsRect(gfx::Rect(20, 20, 100, 200)); 21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |v2| now occupies (30, 30) to (130, 230) in |widget| 21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect rect(5, 5, 15, 40); 21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(25, 25, 15, 40), v2->ConvertRectToParent(rect)); 21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(35, 35, 15, 40), v2->ConvertRectToWidget(rect)); 21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Rotate |v2| 21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform t2; 21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RotateCounterclockwise(&t2); 216168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) t2.matrix().set(1, 3, 100.f); 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetTransform(t2); 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |v2| now occupies (30, 30) to (230, 130) in |widget| 21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(25, 100, 40, 15), v2->ConvertRectToParent(rect)); 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(35, 110, 40, 15), v2->ConvertRectToWidget(rect)); 21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Scale down |v1| 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform t1; 21702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) t1.Scale(0.5, 0.5); 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetTransform(t1); 21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The rectangle should remain the same for |v1|. 21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(25, 100, 40, 15), v2->ConvertRectToParent(rect)); 21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |v2| now occupies (20, 20) to (120, 70) in |widget| 21772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(gfx::Rect(22, 60, 21, 8).ToString(), 21782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) v2->ConvertRectToWidget(rect).ToString()); 21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->CloseNow(); 21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ObserverView : public View { 21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObserverView(); 21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ObserverView(); 21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ResetTestState(); 21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2190a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) bool has_add_details() const { return has_add_details_; } 2191a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) bool has_remove_details() const { return has_remove_details_; } 2192a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 2193a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const ViewHierarchyChangedDetails& add_details() const { 2194a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return add_details_; 2195a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 2196a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 2197a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const ViewHierarchyChangedDetails& remove_details() const { 2198a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return remove_details_; 2199a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // View: 2203a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void ViewHierarchyChanged( 2204a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const ViewHierarchyChangedDetails& details) OVERRIDE; 22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2206a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) bool has_add_details_; 2207a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) bool has_remove_details_; 2208a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) ViewHierarchyChangedDetails add_details_; 2209a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) ViewHierarchyChangedDetails remove_details_; 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ObserverView); 22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ObserverView::ObserverView() 2215a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) : has_add_details_(false), 2216a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) has_remove_details_(false) { 22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ObserverView::~ObserverView() {} 22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ObserverView::ResetTestState() { 2222a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) has_add_details_ = false; 2223a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) has_remove_details_ = false; 2224a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) add_details_ = ViewHierarchyChangedDetails(); 2225a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) remove_details_ = ViewHierarchyChangedDetails(); 22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2228a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void ObserverView::ViewHierarchyChanged( 2229a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const ViewHierarchyChangedDetails& details) { 2230a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (details.is_add) { 2231a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) has_add_details_ = true; 2232a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) add_details_ = details; 2233a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } else { 2234a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) has_remove_details_ = true; 2235a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) remove_details_ = details; 2236a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that the ViewHierarchyChanged() notification is sent correctly when 22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a child view is added or removed to all the views in the hierarchy (up and 22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// down). 22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The tree looks like this: 22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// v1 22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// +-- v2 22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// +-- v3 2246a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// +-- v4 (starts here, then get reparented to v1) 22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, ViewHierarchyChanged) { 22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObserverView v1; 22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObserverView* v3 = new ObserverView(); 22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add |v3| to |v2|. 22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ObserverView> v2(new ObserverView()); 22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->AddChildView(v3); 22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure both |v2| and |v3| receive the ViewHierarchyChanged() 22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // notification. 2258a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_TRUE(v2->has_add_details()); 2259a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_FALSE(v2->has_remove_details()); 2260a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(v2.get(), v2->add_details().parent); 2261a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(v3, v2->add_details().child); 2262a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(NULL, v2->add_details().move_view); 2263a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 2264a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_TRUE(v3->has_add_details()); 2265a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_FALSE(v3->has_remove_details()); 2266a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(v2.get(), v3->add_details().parent); 2267a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(v3, v3->add_details().child); 2268a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(NULL, v3->add_details().move_view); 22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reset everything to the initial state. 22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->ResetTestState(); 22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->ResetTestState(); 22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add |v2| to v1. 22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1.AddChildView(v2.get()); 22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verifies that |v2| is the child view *added* and the parent view is |v1|. 22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure all the views (v1, v2, v3) received _that_ information. 2279a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_TRUE(v1.has_add_details()); 2280a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_FALSE(v1.has_remove_details()); 2281a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(&v1, v1.add_details().parent); 2282a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(v2.get(), v1.add_details().child); 2283a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(NULL, v1.add_details().move_view); 2284a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 2285a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_TRUE(v2->has_add_details()); 2286a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_FALSE(v2->has_remove_details()); 2287a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(&v1, v2->add_details().parent); 2288a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(v2.get(), v2->add_details().child); 2289a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(NULL, v2->add_details().move_view); 2290a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 2291a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_TRUE(v3->has_add_details()); 2292a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_FALSE(v3->has_remove_details()); 2293a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(&v1, v3->add_details().parent); 2294a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(v2.get(), v3->add_details().child); 2295a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(NULL, v3->add_details().move_view); 22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reset everything to the initial state. 22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1.ResetTestState(); 22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->ResetTestState(); 23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->ResetTestState(); 23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove |v2| from |v1|. 23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1.RemoveChildView(v2.get()); 23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verifies that |v2| is the child view *removed* and the parent view is |v1|. 23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure all the views (v1, v2, v3) received _that_ information. 2307a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_FALSE(v1.has_add_details()); 2308a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_TRUE(v1.has_remove_details()); 2309a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(&v1, v1.remove_details().parent); 2310a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(v2.get(), v1.remove_details().child); 2311a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(NULL, v1.remove_details().move_view); 2312a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 2313a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_FALSE(v2->has_add_details()); 2314a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_TRUE(v2->has_remove_details()); 2315a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(&v1, v2->remove_details().parent); 2316a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(v2.get(), v2->remove_details().child); 2317a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(NULL, v2->remove_details().move_view); 2318a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 2319a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_FALSE(v3->has_add_details()); 2320a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_TRUE(v3->has_remove_details()); 2321a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(&v1, v3->remove_details().parent); 2322a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(v3, v3->remove_details().child); 2323a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(NULL, v3->remove_details().move_view); 2324a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 2325a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // Verifies notifications when reparenting a view. 2326a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) ObserverView* v4 = new ObserverView(); 2327a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // Add |v4| to |v2|. 2328a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) v2->AddChildView(v4); 2329a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 2330a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // Reset everything to the initial state. 2331a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) v1.ResetTestState(); 2332a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) v2->ResetTestState(); 2333a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) v3->ResetTestState(); 2334a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) v4->ResetTestState(); 2335a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 2336a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // Reparent |v4| to |v1|. 2337a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) v1.AddChildView(v4); 2338a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 2339a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // Verifies that all views receive the correct information for all the child, 2340a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // parent and move views. 2341a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 2342a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // |v1| is the new parent, |v4| is the child for add, |v2| is the old parent. 2343a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_TRUE(v1.has_add_details()); 2344a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_FALSE(v1.has_remove_details()); 2345a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(&v1, v1.add_details().parent); 2346a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(v4, v1.add_details().child); 2347a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(v2.get(), v1.add_details().move_view); 2348a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 2349a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // |v2| is the old parent, |v4| is the child for remove, |v1| is the new 2350a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // parent. 2351a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_FALSE(v2->has_add_details()); 2352a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_TRUE(v2->has_remove_details()); 2353a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(v2.get(), v2->remove_details().parent); 2354a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(v4, v2->remove_details().child); 2355a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(&v1, v2->remove_details().move_view); 2356a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 2357a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // |v3| is not impacted by this operation, and hence receives no notification. 2358a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_FALSE(v3->has_add_details()); 2359a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_FALSE(v3->has_remove_details()); 2360a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 2361a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // |v4| is the reparented child, so it receives notifications for the remove 2362a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // and then the add. |v2| is its old parent, |v1| is its new parent. 2363a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_TRUE(v4->has_remove_details()); 2364a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_TRUE(v4->has_add_details()); 2365a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(v2.get(), v4->remove_details().parent); 2366a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(&v1, v4->add_details().parent); 2367a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(v4, v4->add_details().child); 2368a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(v4, v4->remove_details().child); 2369a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(&v1, v4->remove_details().move_view); 2370a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(v2.get(), v4->add_details().move_view); 23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies if the child views added under the root are all deleted when calling 23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RemoveAllChildViews. 23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The tree looks like this: 23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// root 23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// +-- child1 23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// +-- foo 23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// +-- bar0 23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// +-- bar1 23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// +-- bar2 23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// +-- child2 23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// +-- child3 23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, RemoveAllChildViews) { 23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View root; 23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* child1 = new View; 23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.AddChildView(child1); 23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 2; ++i) 23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.AddChildView(new View); 23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* foo = new View; 23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child1->AddChildView(foo); 23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add some nodes to |foo|. 23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 3; ++i) 23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) foo->AddChildView(new View); 23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3, root.child_count()); 24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, child1->child_count()); 24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3, foo->child_count()); 24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now remove all child views from root. 24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.RemoveAllChildViews(true); 24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, root.child_count()); 24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.has_children()); 24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, Contains) { 24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View v1; 24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v2 = new View; 24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v3 = new View; 24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1.AddChildView(v2); 24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->AddChildView(v3); 24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v1.Contains(NULL)); 24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1.Contains(&v1)); 24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1.Contains(v2)); 24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1.Contains(v3)); 24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v2->Contains(NULL)); 24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v2->Contains(v2)); 24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v2->Contains(&v1)); 24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v2->Contains(v3)); 24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v3->Contains(NULL)); 24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v3->Contains(v3)); 24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v3->Contains(&v1)); 24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v3->Contains(v2)); 24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies if GetIndexOf() returns the correct index for the specified child 24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// view. 24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The tree looks like this: 24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// root 24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// +-- child1 24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// +-- foo1 24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// +-- child2 24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, GetIndexOf) { 24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View root; 24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* child1 = new View; 24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.AddChildView(child1); 24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* child2 = new View; 24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.AddChildView(child2); 24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* foo1 = new View; 24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child1->AddChildView(foo1); 24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-1, root.GetIndexOf(NULL)); 24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-1, root.GetIndexOf(&root)); 24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, root.GetIndexOf(child1)); 24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, root.GetIndexOf(child2)); 24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-1, root.GetIndexOf(foo1)); 24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-1, child1->GetIndexOf(NULL)); 24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-1, child1->GetIndexOf(&root)); 24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-1, child1->GetIndexOf(child1)); 24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-1, child1->GetIndexOf(child2)); 24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, child1->GetIndexOf(foo1)); 24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-1, child2->GetIndexOf(NULL)); 24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-1, child2->GetIndexOf(&root)); 24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-1, child2->GetIndexOf(child2)); 24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-1, child2->GetIndexOf(child1)); 24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-1, child2->GetIndexOf(foo1)); 24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that the child views can be reordered correctly. 24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, ReorderChildren) { 24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View root; 24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* child = new View(); 24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.AddChildView(child); 24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* foo1 = new View(); 24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->AddChildView(foo1); 24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* foo2 = new View(); 24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->AddChildView(foo2); 24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* foo3 = new View(); 24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->AddChildView(foo3); 24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) foo1->set_focusable(true); 24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) foo2->set_focusable(true); 24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) foo3->set_focusable(true); 24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0, child->GetIndexOf(foo1)); 24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1, child->GetIndexOf(foo2)); 24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2, child->GetIndexOf(foo3)); 24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(foo2, foo1->GetNextFocusableView()); 24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(foo3, foo2->GetNextFocusableView()); 24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(NULL, foo3->GetNextFocusableView()); 24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move |foo2| at the end. 24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->ReorderChildView(foo2, -1); 24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0, child->GetIndexOf(foo1)); 25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1, child->GetIndexOf(foo3)); 25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2, child->GetIndexOf(foo2)); 25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(foo3, foo1->GetNextFocusableView()); 25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(foo2, foo3->GetNextFocusableView()); 25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(NULL, foo2->GetNextFocusableView()); 25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move |foo1| at the end. 25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->ReorderChildView(foo1, -1); 25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0, child->GetIndexOf(foo3)); 25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1, child->GetIndexOf(foo2)); 25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2, child->GetIndexOf(foo1)); 25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(NULL, foo1->GetNextFocusableView()); 25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(foo2, foo1->GetPreviousFocusableView()); 25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(foo2, foo3->GetNextFocusableView()); 25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(foo1, foo2->GetNextFocusableView()); 25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move |foo2| to the front. 25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->ReorderChildView(foo2, 0); 25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0, child->GetIndexOf(foo2)); 25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1, child->GetIndexOf(foo3)); 25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2, child->GetIndexOf(foo1)); 25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(NULL, foo1->GetNextFocusableView()); 25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(foo3, foo1->GetPreviousFocusableView()); 25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(foo3, foo2->GetNextFocusableView()); 25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(foo1, foo3->GetNextFocusableView()); 25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that GetViewByID returns the correctly child view from the specified 25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ID. 25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The tree looks like this: 25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// v1 25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// +-- v2 25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// +-- v3 25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// +-- v4 25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, GetViewByID) { 25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View v1; 25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kV1ID = 1; 25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1.set_id(kV1ID); 25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View v2; 25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kV2ID = 2; 25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2.set_id(kV2ID); 25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View v3; 25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kV3ID = 3; 25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3.set_id(kV3ID); 25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View v4; 25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kV4ID = 4; 25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v4.set_id(kV4ID); 25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kV5ID = 5; 25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1.AddChildView(&v2); 25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2.AddChildView(&v3); 25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2.AddChildView(&v4); 25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(&v1, v1.GetViewByID(kV1ID)); 25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(&v2, v1.GetViewByID(kV2ID)); 25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(&v4, v1.GetViewByID(kV4ID)); 25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, v1.GetViewByID(kV5ID)); // No V5 exists. 25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, v2.GetViewByID(kV1ID)); // It can get only from child views. 25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kGroup = 1; 25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3.SetGroup(kGroup); 25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v4.SetGroup(kGroup); 25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View::Views views; 25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1.GetViewsInGroup(kGroup, &views); 25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2U, views.size()); 25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View::Views::const_iterator i(std::find(views.begin(), views.end(), &v3)); 25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(views.end(), i); 25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i = std::find(views.begin(), views.end(), &v4); 25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(views.end(), i); 25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewTest, AddExistingChild) { 25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View v1, v2, v3; 25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1.AddChildView(&v2); 25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1.AddChildView(&v3); 25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, v1.GetIndexOf(&v2)); 25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, v1.GetIndexOf(&v3)); 25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that there's no change in order when adding at same index. 25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1.AddChildViewAt(&v2, 0); 25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, v1.GetIndexOf(&v2)); 25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, v1.GetIndexOf(&v3)); 25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1.AddChildViewAt(&v3, 1); 25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, v1.GetIndexOf(&v2)); 25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, v1.GetIndexOf(&v3)); 25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add it at a different index and check for change in order. 25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1.AddChildViewAt(&v2, 1); 25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, v1.GetIndexOf(&v2)); 25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, v1.GetIndexOf(&v3)); 25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1.AddChildViewAt(&v2, 0); 26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, v1.GetIndexOf(&v2)); 26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, v1.GetIndexOf(&v3)); 26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that calling |AddChildView()| does not change the order. 26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1.AddChildView(&v2); 26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, v1.GetIndexOf(&v2)); 26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, v1.GetIndexOf(&v3)); 26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1.AddChildView(&v3); 26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, v1.GetIndexOf(&v2)); 26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, v1.GetIndexOf(&v3)); 26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Layers 26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA) 26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test implementation of LayerAnimator. 26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestLayerAnimator : public ui::LayerAnimator { 26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestLayerAnimator(); 26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& last_bounds() const { return last_bounds_; } 26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // LayerAnimator. 26285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetBounds(const gfx::Rect& bounds) OVERRIDE; 26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 26312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~TestLayerAnimator() { } 26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect last_bounds_; 26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestLayerAnimator); 26375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 26385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestLayerAnimator::TestLayerAnimator() 26405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : ui::LayerAnimator(base::TimeDelta::FromMilliseconds(0)) { 26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestLayerAnimator::SetBounds(const gfx::Rect& bounds) { 26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_bounds_ = bounds; 26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ViewLayerTest : public ViewsTestBase { 26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewLayerTest() : widget_(NULL), old_use_acceleration_(false) {} 26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ViewLayerTest() { 26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the Layer used by the RootView. 26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::Layer* GetRootLayer() { 265890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return widget()->GetLayer(); 26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE { 26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewTest::SetUp(); 26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_use_acceleration_ = View::get_use_acceleration_when_possible(); 26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View::set_use_acceleration_when_possible(true); 26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_ = new Widget; 26672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.bounds = gfx::Rect(50, 50, 200, 200); 26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->Init(params); 26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->Show(); 26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->GetRootView()->SetBounds(0, 0, 200, 200); 26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() OVERRIDE { 26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View::set_use_acceleration_when_possible(old_use_acceleration_); 26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->CloseNow(); 26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewsTestBase::TearDown(); 26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* widget() { return widget_; } 26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* widget_; 26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool old_use_acceleration_; 26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewLayerTest, LayerToggling) { 26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Because we lazily create textures the calls to DrawTree are necessary to 26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ensure we trigger creation of textures. 269190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ui::Layer* root_layer = widget()->GetLayer(); 26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* content_view = new View; 26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget()->SetContentsView(content_view); 26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create v1, give it a bounds and verify everything is set up correctly. 26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v1 = new View; 26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetPaintToLayer(true); 26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1->layer() != NULL); 26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetBoundsRect(gfx::Rect(20, 30, 140, 150)); 27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_view->AddChildView(v1); 27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(v1->layer() != NULL); 27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(root_layer, v1->layer()->parent()); 27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(20, 30, 140, 150), v1->layer()->bounds()); 27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create v2 as a child of v1 and do basic assertion testing. 27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v2 = new View; 27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->AddChildView(v2); 27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v2->layer() == NULL); 27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetBoundsRect(gfx::Rect(10, 20, 30, 40)); 27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetPaintToLayer(true); 27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(v2->layer() != NULL); 27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v1->layer(), v2->layer()->parent()); 27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(10, 20, 30, 40), v2->layer()->bounds()); 27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Turn off v1s layer. v2 should still have a layer but its parent should have 27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // changed. 27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetPaintToLayer(false); 27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1->layer() == NULL); 27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v2->layer() != NULL); 27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(root_layer, v2->layer()->parent()); 27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, root_layer->children().size()); 27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(root_layer->children()[0], v2->layer()); 27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The bounds of the layer should have changed to be relative to the root view 27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // now. 27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(30, 50, 30, 40), v2->layer()->bounds()); 27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make v1 have a layer again and verify v2s layer is wired up correctly. 27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform transform; 27292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform.Scale(2.0, 2.0); 27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetTransform(transform); 27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1->layer() != NULL); 27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v2->layer() != NULL); 27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(root_layer, v1->layer()->parent()); 27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v1->layer(), v2->layer()->parent()); 27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, root_layer->children().size()); 27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(root_layer->children()[0], v1->layer()); 27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, v1->layer()->children().size()); 27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v1->layer()->children()[0], v2->layer()); 27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(10, 20, 30, 40), v2->layer()->bounds()); 27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies turning on a layer wires up children correctly. 27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewLayerTest, NestedLayerToggling) { 27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* content_view = new View; 27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget()->SetContentsView(content_view); 27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create v1, give it a bounds and verify everything is set up correctly. 27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v1 = new View; 27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_view->AddChildView(v1); 27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetBoundsRect(gfx::Rect(20, 30, 140, 150)); 27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v2 = new View; 27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->AddChildView(v2); 27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v3 = new View; 27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->SetPaintToLayer(true); 27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->AddChildView(v3); 27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(v3->layer() != NULL); 27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // At this point we have v1-v2-v3. v3 has a layer, v1 and v2 don't. 27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetPaintToLayer(true); 27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(v1->layer(), v3->layer()->parent()); 27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewLayerTest, LayerAnimator) { 27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* content_view = new View; 27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget()->SetContentsView(content_view); 27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v1 = new View; 27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_view->AddChildView(v1); 27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetPaintToLayer(true); 27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1->layer() != NULL); 27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestLayerAnimator* animator = new TestLayerAnimator(); 27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->layer()->SetAnimator(animator); 27775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect bounds(1, 2, 3, 4); 27795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetBoundsRect(bounds); 27805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(bounds, animator->last_bounds()); 27815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TestLayerAnimator doesn't update the layer. 27825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(bounds, v1->layer()->bounds()); 27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies the bounds of a layer are updated if the bounds of ancestor that 27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// doesn't have a layer change. 27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewLayerTest, BoundsChangeWithLayer) { 27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* content_view = new View; 27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget()->SetContentsView(content_view); 27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v1 = new View; 27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_view->AddChildView(v1); 27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetBoundsRect(gfx::Rect(20, 30, 140, 150)); 27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v2 = new View; 27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetBoundsRect(gfx::Rect(10, 11, 40, 50)); 27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->AddChildView(v2); 27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetPaintToLayer(true); 27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(v2->layer() != NULL); 28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(30, 41, 40, 50), v2->layer()->bounds()); 28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetPosition(gfx::Point(25, 36)); 28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(35, 47, 40, 50), v2->layer()->bounds()); 28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetPosition(gfx::Point(11, 12)); 28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(36, 48, 40, 50), v2->layer()->bounds()); 28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Bounds of the layer should change even if the view is not invisible. 28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetVisible(false); 28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetPosition(gfx::Point(20, 30)); 28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(31, 42, 40, 50), v2->layer()->bounds()); 28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetVisible(false); 28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetBoundsRect(gfx::Rect(10, 11, 20, 30)); 28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(30, 41, 20, 30), v2->layer()->bounds()); 28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure layers are positioned correctly in RTL. 28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewLayerTest, BoundInRTL) { 28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string locale = l10n_util::GetApplicationLocale(std::string()); 28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::SetICUDefaultLocale("he"); 28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* view = new View; 28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget()->SetContentsView(view); 28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int content_width = view->width(); 28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |v1| is initially not attached to anything. So its layer will have the same 28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // bounds as the view. 28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v1 = new View; 28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetPaintToLayer(true); 28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetBounds(10, 10, 20, 10); 28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(10, 10, 20, 10), 28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->layer()->bounds()); 28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Once |v1| is attached to the widget, its layer will get RTL-appropriate 28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // bounds. 28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->AddChildView(v1); 28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(content_width - 30, 10, 20, 10), 28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->layer()->bounds()); 28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect l1bounds = v1->layer()->bounds(); 28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now attach a View to the widget first, then create a layer for it. Make 28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // sure the bounds are correct. 28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v2 = new View; 28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetBounds(50, 10, 30, 10); 28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v2->layer()); 28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->AddChildView(v2); 28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetPaintToLayer(true); 28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(content_width - 80, 10, 30, 10), 28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->layer()->bounds()); 28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect l2bounds = v2->layer()->bounds(); 28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->SetPaintToLayer(true); 28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(l1bounds, v1->layer()->bounds()); 28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(l2bounds, v2->layer()->bounds()); 28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move one of the views. Make sure the layer is positioned correctly 28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // afterwards. 28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetBounds(v1->x() - 5, v1->y(), v1->width(), v1->height()); 28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l1bounds.set_x(l1bounds.x() + 5); 28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(l1bounds, v1->layer()->bounds()); 28635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->SetPaintToLayer(false); 28655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(l1bounds, v1->layer()->bounds()); 28665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(l2bounds, v2->layer()->bounds()); 28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move a view again. 28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetBounds(v2->x() + 5, v2->y(), v2->width(), v2->height()); 28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l2bounds.set_x(l2bounds.x() - 5); 28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(l2bounds, v2->layer()->bounds()); 28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reset locale. 28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::SetICUDefaultLocale(locale); 28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure a transform persists after toggling the visibility. 28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewLayerTest, ToggleVisibilityWithTransform) { 28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* view = new View; 28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform transform; 28812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform.Scale(2.0, 2.0); 28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->SetTransform(transform); 28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget()->SetContentsView(view); 28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2.0f, view->GetTransform().matrix().get(0, 0)); 28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->SetVisible(false); 28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2.0f, view->GetTransform().matrix().get(0, 0)); 28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->SetVisible(true); 28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2.0f, view->GetTransform().matrix().get(0, 0)); 28915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies a transform persists after removing/adding a view with a transform. 28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewLayerTest, ResetTransformOnLayerAfterAdd) { 28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* view = new View; 28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform transform; 28972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform.Scale(2.0, 2.0); 28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->SetTransform(transform); 28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget()->SetContentsView(view); 29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2.0f, view->GetTransform().matrix().get(0, 0)); 29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(view->layer() != NULL); 29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2.0f, view->layer()->transform().matrix().get(0, 0)); 29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* parent = view->parent(); 29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent->RemoveChildView(view); 29065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent->AddChildView(view); 29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2.0f, view->GetTransform().matrix().get(0, 0)); 29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(view->layer() != NULL); 29105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2.0f, view->layer()->transform().matrix().get(0, 0)); 29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure that layer visibility is correct after toggling View visibility. 29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewLayerTest, ToggleVisibilityWithLayer) { 29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* content_view = new View; 29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget()->SetContentsView(content_view); 29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The view isn't attached to a widget or a parent view yet. But it should 29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // still have a layer, but the layer should not be attached to the root 29205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // layer. 29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v1 = new View; 29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetPaintToLayer(true); 29235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1->layer()); 29245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(LayerIsAncestor(widget()->GetCompositor()->root_layer(), 29255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->layer())); 29265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Once the view is attached to a widget, its layer should be attached to the 29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // root layer and visible. 29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_view->AddChildView(v1); 29305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LayerIsAncestor(widget()->GetCompositor()->root_layer(), 29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->layer())); 29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1->layer()->IsDrawn()); 29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetVisible(false); 29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v1->layer()->IsDrawn()); 29365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetVisible(true); 29385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1->layer()->IsDrawn()); 29395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget()->Hide(); 29415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v1->layer()->IsDrawn()); 29425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget()->Show(); 29445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1->layer()->IsDrawn()); 29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the layers in the subtree are orphaned after a View is removed 29485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// from the parent. 29495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewLayerTest, OrphanLayerAfterViewRemove) { 29505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* content_view = new View; 29515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget()->SetContentsView(content_view); 29525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v1 = new View; 29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_view->AddChildView(v1); 29555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v2 = new View; 29575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->AddChildView(v2); 29585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetPaintToLayer(true); 29595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LayerIsAncestor(widget()->GetCompositor()->root_layer(), 29605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->layer())); 29615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v2->layer()->IsDrawn()); 29625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_view->RemoveChildView(v1); 29645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(LayerIsAncestor(widget()->GetCompositor()->root_layer(), 29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->layer())); 29675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reparent |v2|. 29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_view->AddChildView(v2); 29705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete v1; 29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1 = NULL; 29725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LayerIsAncestor(widget()->GetCompositor()->root_layer(), 29735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->layer())); 29745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v2->layer()->IsDrawn()); 29755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PaintTrackingView : public View { 29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PaintTrackingView() : painted_(false) { 29805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool painted() const { return painted_; } 29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_painted(bool value) { painted_ = value; } 29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE { 29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) painted_ = true; 29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 29905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool painted_; 29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(PaintTrackingView); 29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 29945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure child views with layers aren't painted when paint starts at an 29965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ancestor. 29975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewLayerTest, DontPaintChildrenWithLayers) { 29985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PaintTrackingView* content_view = new PaintTrackingView; 29995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget()->SetContentsView(content_view); 30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_view->SetPaintToLayer(true); 3001c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetRootLayer()->GetCompositor()->ScheduleDraw(); 3002c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui::DrawWaiterForTest::Wait(GetRootLayer()->GetCompositor()); 30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRootLayer()->SchedulePaint(gfx::Rect(0, 0, 10, 10)); 30045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_view->set_painted(false); 30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // content_view no longer has a dirty rect. Paint from the root and make sure 30065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PaintTrackingView isn't painted. 3007c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetRootLayer()->GetCompositor()->ScheduleDraw(); 3008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui::DrawWaiterForTest::Wait(GetRootLayer()->GetCompositor()); 30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(content_view->painted()); 30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make content_view have a dirty rect, paint the layers and make sure 30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PaintTrackingView is painted. 30135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_view->layer()->SchedulePaint(gfx::Rect(0, 0, 10, 10)); 3014c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetRootLayer()->GetCompositor()->ScheduleDraw(); 3015c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui::DrawWaiterForTest::Wait(GetRootLayer()->GetCompositor()); 30165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(content_view->painted()); 30175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the visibility of child layers are updated correctly when a View's 30205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// visibility changes. 30215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewLayerTest, VisibilityChildLayers) { 30225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v1 = new View; 30235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->SetPaintToLayer(true); 30245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget()->SetContentsView(v1); 30255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v2 = new View; 30275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->AddChildView(v2); 30285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v3 = new View; 30305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->AddChildView(v3); 30315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->SetVisible(false); 30325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v4 = new View; 30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v4->SetPaintToLayer(true); 30355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->AddChildView(v4); 30365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1->layer()->IsDrawn()); 30385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v4->layer()->IsDrawn()); 30395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetVisible(false); 30415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1->layer()->IsDrawn()); 30425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v4->layer()->IsDrawn()); 30435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetVisible(true); 30455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1->layer()->IsDrawn()); 30465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v4->layer()->IsDrawn()); 30475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2->SetVisible(false); 30495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1->layer()->IsDrawn()); 30505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v4->layer()->IsDrawn()); 30515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ViewAndLayerTreeAreConsistent(v1, v1->layer())); 30525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v3->SetVisible(true); 30545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1->layer()->IsDrawn()); 30555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(v4->layer()->IsDrawn()); 30565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ViewAndLayerTreeAreConsistent(v1, v1->layer())); 30575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reparent |v3| to |v1|. 30595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v1->AddChildView(v3); 30605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v1->layer()->IsDrawn()); 30615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(v4->layer()->IsDrawn()); 30625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ViewAndLayerTreeAreConsistent(v1, v1->layer())); 30635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test creates a random View tree, and then randomly reorders child views, 30665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// reparents views etc. Unrelated changes can appear to break this test. So 30675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// marking this as FLAKY. 30685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewLayerTest, DISABLED_ViewLayerTreesInSync) { 30695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* content = new View; 30705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content->SetPaintToLayer(true); 30715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget()->SetContentsView(content); 30725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget()->Show(); 30735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConstructTree(content, 5); 30755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ViewAndLayerTreeAreConsistent(content, content->layer())); 30765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScrambleTree(content); 30785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ViewAndLayerTreeAreConsistent(content, content->layer())); 30795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScrambleTree(content); 30815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ViewAndLayerTreeAreConsistent(content, content->layer())); 30825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScrambleTree(content); 30845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ViewAndLayerTreeAreConsistent(content, content->layer())); 30855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies when views are reordered the layer is also reordered. The widget is 30885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// providing the parent layer. 30895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewLayerTest, ReorderUnderWidget) { 30905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* content = new View; 30915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget()->SetContentsView(content); 30925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* c1 = new View; 30935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c1->SetPaintToLayer(true); 30945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content->AddChildView(c1); 30955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* c2 = new View; 30965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c2->SetPaintToLayer(true); 30975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content->AddChildView(c2); 30985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::Layer* parent_layer = c1->layer()->parent(); 31005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(parent_layer); 31015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2u, parent_layer->children().size()); 31025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(c1->layer(), parent_layer->children()[0]); 31035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(c2->layer(), parent_layer->children()[1]); 31045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move c1 to the front. The layers should have moved too. 31065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content->ReorderChildView(c1, -1); 31075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(c1->layer(), parent_layer->children()[1]); 31085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(c2->layer(), parent_layer->children()[0]); 31095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that the layer of a view can be acquired properly. 31125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ViewLayerTest, AcquireLayer) { 31135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* content = new View; 31145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget()->SetContentsView(content); 31155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<View> c1(new View); 31165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c1->SetPaintToLayer(true); 31175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(c1->layer()); 31185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content->AddChildView(c1.get()); 31195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ui::Layer> layer(c1->AcquireLayer()); 31215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(layer.get(), c1->layer()); 31225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ui::Layer> layer2(c1->RecreateLayer()); 31245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(c1->layer(), layer2.get()); 31255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Destroy view before destroying layer. 31275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c1.reset(); 31285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that new layer scales content only if the old layer does. 3131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(ViewLayerTest, RecreateLayerScaling) { 31325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<View> v(new View()); 31335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v->SetPaintToLayer(true); 31345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set to non default value. 31355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v->layer()->set_scale_content(false); 31365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ui::Layer> old_layer(v->RecreateLayer()); 31375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::Layer* new_layer = v->layer(); 31385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(new_layer->scale_content()); 31395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Verify the z-order of the layers as a result of calling RecreateLayer(). 3142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(ViewLayerTest, RecreateLayerZOrder) { 3143868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<View> v(new View()); 3144868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) v->SetPaintToLayer(true); 3145868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3146868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) View* v1 = new View(); 3147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) v1->SetPaintToLayer(true); 3148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) v->AddChildView(v1); 3149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) View* v2 = new View(); 3150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) v2->SetPaintToLayer(true); 3151868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) v->AddChildView(v2); 3152868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Test the initial z-order. 3154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::vector<ui::Layer*>& child_layers_pre = v->layer()->children(); 3155868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_EQ(2u, child_layers_pre.size()); 3156868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(v1->layer(), child_layers_pre[0]); 3157868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(v2->layer(), child_layers_pre[1]); 3158868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3159868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<ui::Layer> v1_old_layer(v1->RecreateLayer()); 3160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3161868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Test the new layer order. |v1_old_layer| should be above the layers 3162868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // for |v1| and |v2|. 3163868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::vector<ui::Layer*>& child_layers_post = v->layer()->children(); 3164868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_EQ(3u, child_layers_post.size()); 3165868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(v1->layer(), child_layers_post[0]); 3166868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(v2->layer(), child_layers_post[1]); 3167868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(v1_old_layer, child_layers_post[2]); 3168868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 3169868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3170868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Verify the z-order of the layers as a result of calling RecreateLayer when 3171868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// the widget is the parent with the layer. 3172868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(ViewLayerTest, RecreateLayerZOrderWidgetParent) { 3173868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) View* v = new View(); 3174868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) widget()->SetContentsView(v); 3175868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3176868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) View* v1 = new View(); 3177868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) v1->SetPaintToLayer(true); 3178868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) v->AddChildView(v1); 3179868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) View* v2 = new View(); 3180868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) v2->SetPaintToLayer(true); 3181868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) v->AddChildView(v2); 3182868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3183868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ui::Layer* root_layer = GetRootLayer(); 3184868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3185868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Test the initial z-order. 3186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::vector<ui::Layer*>& child_layers_pre = root_layer->children(); 3187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_EQ(2u, child_layers_pre.size()); 3188868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(v1->layer(), child_layers_pre[0]); 3189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(v2->layer(), child_layers_pre[1]); 3190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3191868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<ui::Layer> v1_old_layer(v1->RecreateLayer()); 3192868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Test the new layer order. |v1_old_layer| should be above the layers 3194868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // for |v1| and |v2|. 3195868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::vector<ui::Layer*>& child_layers_post = root_layer->children(); 3196868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_EQ(3u, child_layers_post.size()); 3197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(v1->layer(), child_layers_post[0]); 3198868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(v2->layer(), child_layers_post[1]); 3199868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(v1_old_layer, child_layers_post[2]); 3200868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 3201868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 32025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // USE_AURA 32035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace views 3205