Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(615)

Side by Side Diff: ui/views/view_unittest.cc

Issue 2505943002: MacViews: Fix accelerator handling while Omnibox is in focus. (Closed)
Patch Set: Fixed TextfieldTest.*, disable ViewTest.ActivateAcceleratorOnMac on non-MacViews. Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/views/view.h" 5 #include "ui/views/view.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <map> 9 #include <map>
10 #include <memory> 10 #include <memory>
(...skipping 12 matching lines...) Expand all
23 #include "ui/base/l10n/l10n_util.h" 23 #include "ui/base/l10n/l10n_util.h"
24 #include "ui/compositor/compositor.h" 24 #include "ui/compositor/compositor.h"
25 #include "ui/compositor/layer.h" 25 #include "ui/compositor/layer.h"
26 #include "ui/compositor/layer_animator.h" 26 #include "ui/compositor/layer_animator.h"
27 #include "ui/compositor/paint_context.h" 27 #include "ui/compositor/paint_context.h"
28 #include "ui/compositor/test/draw_waiter_for_test.h" 28 #include "ui/compositor/test/draw_waiter_for_test.h"
29 #include "ui/events/event.h" 29 #include "ui/events/event.h"
30 #include "ui/events/event_utils.h" 30 #include "ui/events/event_utils.h"
31 #include "ui/events/keycodes/keyboard_codes.h" 31 #include "ui/events/keycodes/keyboard_codes.h"
32 #include "ui/events/scoped_target_handler.h" 32 #include "ui/events/scoped_target_handler.h"
33 #include "ui/events/test/event_generator.h"
33 #include "ui/gfx/canvas.h" 34 #include "ui/gfx/canvas.h"
34 #include "ui/gfx/path.h" 35 #include "ui/gfx/path.h"
35 #include "ui/gfx/transform.h" 36 #include "ui/gfx/transform.h"
36 #include "ui/native_theme/native_theme.h" 37 #include "ui/native_theme/native_theme.h"
37 #include "ui/strings/grit/ui_strings.h" 38 #include "ui/strings/grit/ui_strings.h"
38 #include "ui/views/background.h" 39 #include "ui/views/background.h"
39 #include "ui/views/controls/native/native_view_host.h" 40 #include "ui/views/controls/native/native_view_host.h"
40 #include "ui/views/controls/scroll_view.h" 41 #include "ui/views/controls/scroll_view.h"
41 #include "ui/views/controls/textfield/textfield.h" 42 #include "ui/views/controls/textfield/textfield.h"
42 #include "ui/views/focus/view_storage.h" 43 #include "ui/views/focus/view_storage.h"
(...skipping 2053 matching lines...) Expand 10 before | Expand all | Expand 10 after
2096 } 2097 }
2097 2098
2098 //////////////////////////////////////////////////////////////////////////////// 2099 ////////////////////////////////////////////////////////////////////////////////
2099 // Accelerators 2100 // Accelerators
2100 //////////////////////////////////////////////////////////////////////////////// 2101 ////////////////////////////////////////////////////////////////////////////////
2101 bool TestView::AcceleratorPressed(const ui::Accelerator& accelerator) { 2102 bool TestView::AcceleratorPressed(const ui::Accelerator& accelerator) {
2102 accelerator_count_map_[accelerator]++; 2103 accelerator_count_map_[accelerator]++;
2103 return true; 2104 return true;
2104 } 2105 }
2105 2106
2107 namespace {
2108
2109 // A Widget with a TestView in the view hierarchy. Used for accelerator tests.
2110 class TestViewWidget {
2111 public:
2112 TestViewWidget(const Widget::InitParams& create_params,
2113 ui::Accelerator* initial_accelerator,
2114 bool show_after_init = true)
2115 : view_(new TestView) {
2116 view_->Reset();
2117
2118 // Register a keyboard accelerator before the view is added to a window.
2119 if (initial_accelerator) {
2120 view_->AddAccelerator(*initial_accelerator);
2121 EXPECT_EQ(view_->accelerator_count_map_[*initial_accelerator], 0);
2122 }
2123
2124 // Create a window and add the view as its child.
2125 Widget::InitParams params = create_params;
2126 params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
2127 params.bounds = gfx::Rect(0, 0, 100, 100);
2128 widget_.Init(params);
2129 View* root = widget_.GetRootView();
2130 root->AddChildView(view_);
2131 if (show_after_init)
2132 widget_.Show();
2133
2134 EXPECT_TRUE(widget_.GetFocusManager());
2135 }
2136
2137 TestView* view() { return view_; }
2138 Widget* widget() { return &widget_; }
2139
2140 private:
2141 TestView* view_;
2142 Widget widget_;
2143
2144 DISALLOW_COPY_AND_ASSIGN(TestViewWidget);
2145 };
2146
2147 } // namespace
2148
2106 // On non-ChromeOS aura there is extra logic to determine whether a view should 2149 // On non-ChromeOS aura there is extra logic to determine whether a view should
2107 // handle accelerators or not (see View::CanHandleAccelerators for details). 2150 // handle accelerators or not (see View::CanHandleAccelerators for details).
2108 // This test targets that extra logic, but should also work on other platforms. 2151 // This test targets that extra logic, but should also work on other platforms.
2109 TEST_F(ViewTest, HandleAccelerator) { 2152 TEST_F(ViewTest, HandleAccelerator) {
2110 ui::Accelerator return_accelerator(ui::VKEY_RETURN, ui::EF_NONE); 2153 ui::Accelerator return_accelerator(ui::VKEY_RETURN, ui::EF_NONE);
2111 TestView* view = new TestView(); 2154 TestViewWidget test_widget(CreateParams(Widget::InitParams::TYPE_POPUP),
2112 view->Reset(); 2155 &return_accelerator);
2113 view->AddAccelerator(return_accelerator); 2156 TestView* view = test_widget.view();
2114 EXPECT_EQ(view->accelerator_count_map_[return_accelerator], 0); 2157 Widget* widget = test_widget.widget();
2115
2116 // Create a window and add the view as its child.
2117 std::unique_ptr<Widget> widget(new Widget);
2118 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
2119 params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
2120 params.bounds = gfx::Rect(0, 0, 100, 100);
2121 widget->Init(params);
2122 View* root = widget->GetRootView();
2123 root->AddChildView(view);
2124 widget->Show();
2125
2126 FocusManager* focus_manager = widget->GetFocusManager(); 2158 FocusManager* focus_manager = widget->GetFocusManager();
2127 ASSERT_TRUE(focus_manager);
2128 2159
2129 #if defined(USE_AURA) && !defined(OS_CHROMEOS) 2160 #if defined(USE_AURA) && !defined(OS_CHROMEOS)
2130 // When a non-child view is not active, it shouldn't handle accelerators. 2161 // When a non-child view is not active, it shouldn't handle accelerators.
2131 EXPECT_FALSE(widget->IsActive()); 2162 EXPECT_FALSE(widget->IsActive());
2132 EXPECT_FALSE(focus_manager->ProcessAccelerator(return_accelerator)); 2163 EXPECT_FALSE(focus_manager->ProcessAccelerator(return_accelerator));
2133 EXPECT_EQ(0, view->accelerator_count_map_[return_accelerator]); 2164 EXPECT_EQ(0, view->accelerator_count_map_[return_accelerator]);
2134 #endif 2165 #endif
2135 2166
2136 // TYPE_POPUP widgets default to non-activatable, so the Show() above wouldn't 2167 // TYPE_POPUP widgets default to non-activatable, so the Show() above wouldn't
2137 // have activated the Widget. First, allow activation. 2168 // have activated the Widget. First, allow activation.
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
2174 child_view->accelerator_count_map_[return_accelerator] = 0; 2205 child_view->accelerator_count_map_[return_accelerator] = 0;
2175 view->accelerator_count_map_[return_accelerator] = 0; 2206 view->accelerator_count_map_[return_accelerator] = 0;
2176 child_focus_manager->ClearFocus(); 2207 child_focus_manager->ClearFocus();
2177 EXPECT_FALSE(child_view->GetWidget()->IsActive()); 2208 EXPECT_FALSE(child_view->GetWidget()->IsActive());
2178 EXPECT_TRUE(child_focus_manager->ProcessAccelerator(return_accelerator)); 2209 EXPECT_TRUE(child_focus_manager->ProcessAccelerator(return_accelerator));
2179 EXPECT_EQ(0, child_view->accelerator_count_map_[return_accelerator]); 2210 EXPECT_EQ(0, child_view->accelerator_count_map_[return_accelerator]);
2180 EXPECT_EQ(1, view->accelerator_count_map_[return_accelerator]); 2211 EXPECT_EQ(1, view->accelerator_count_map_[return_accelerator]);
2181 #endif 2212 #endif
2182 } 2213 }
2183 2214
2184 // TODO: these tests were initially commented out when getting aura to 2215 // TODO: these tests were initially commented out when getting aura to
tapted 2016/11/23 02:09:31 This comment about aura doesn't apply to this test
themblsha 2016/11/23 15:16:39 Yeah, TestView::AcceleratorPressed() is not invoke
2185 // run. Figure out if still valuable and either nuke or fix. 2216 // run. Figure out if still valuable and either nuke or fix. crbug.com/667757.
themblsha 2016/11/22 14:33:48 This test fails on non-MacViews, so I've created a
2186 #if 0 2217 #if defined(OS_MACOSX)
2218 // Test that BridgedContentView correctly handles Accelerator key events when
2219 // subject to OS event dispatch.
2220 TEST_F(ViewTest, ActivateAcceleratorOnMac) {
2221 #if defined(OS_MACOSX)
2222 // Only use EF_COMMAND_DOWN on Mac.
2223 const ui::EventFlags kPlatformModifier = ui::EF_COMMAND_DOWN;
2224 #else
2225 const ui::EventFlags kPlatformModifier = ui::EF_CONTROL_DOWN;
tapted 2016/11/23 02:09:31 this case can be omitted if it's not being brought
themblsha 2016/11/23 15:16:39 I thought it could live so it could be used in the
2226 #endif // OS_MACOSX
2227
2228 // Cmd+1 translates to "noop:" command by interpretKeyEvents.
2229 ui::Accelerator command_accelerator(ui::VKEY_1, kPlatformModifier);
2230 TestViewWidget test_widget(CreateParams(Widget::InitParams::TYPE_POPUP),
2231 &command_accelerator);
2232 TestView* view = test_widget.view();
2233
2234 ui::test::EventGenerator event_generator(
2235 test_widget.widget()->GetNativeWindow());
2236 // Emulate normal event dispatch through -[NSWindow sendEvent:].
2237 event_generator.set_target(ui::test::EventGenerator::Target::WINDOW);
2238
2239 event_generator.PressKey(command_accelerator.key_code(),
2240 command_accelerator.modifiers());
2241 event_generator.ReleaseKey(command_accelerator.key_code(),
2242 command_accelerator.modifiers());
2243 EXPECT_EQ(view->accelerator_count_map_[command_accelerator], 1);
2244
2245 // Without an _wantsKeyDownForEvent: override we'll only get a keyUp: event
2246 // for this accelerator.
2247 ui::Accelerator key_up_accelerator(ui::VKEY_TAB,
2248 ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN);
2249 view->AddAccelerator(key_up_accelerator);
2250 event_generator.PressKey(key_up_accelerator.key_code(),
2251 key_up_accelerator.modifiers());
2252 event_generator.ReleaseKey(key_up_accelerator.key_code(),
2253 key_up_accelerator.modifiers());
2254 EXPECT_EQ(view->accelerator_count_map_[key_up_accelerator], 1);
2255
2256 // We should handle this accelerator inside keyDown: as it doesn't translate
2257 // to any command by default.
2258 ui::Accelerator key_down_accelerator(
2259 ui::VKEY_L, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_SHIFT_DOWN);
2260 view->AddAccelerator(key_down_accelerator);
2261 event_generator.PressKey(key_down_accelerator.key_code(),
2262 key_down_accelerator.modifiers());
2263 event_generator.ReleaseKey(key_down_accelerator.key_code(),
2264 key_down_accelerator.modifiers());
2265 EXPECT_EQ(view->accelerator_count_map_[key_down_accelerator], 1);
2266 }
2267
2187 TEST_F(ViewTest, ActivateAccelerator) { 2268 TEST_F(ViewTest, ActivateAccelerator) {
2188 // Register a keyboard accelerator before the view is added to a window.
2189 ui::Accelerator return_accelerator(ui::VKEY_RETURN, ui::EF_NONE); 2269 ui::Accelerator return_accelerator(ui::VKEY_RETURN, ui::EF_NONE);
2190 TestView* view = new TestView(); 2270 TestViewWidget test_widget(CreateParams(Widget::InitParams::TYPE_POPUP),
2191 view->Reset(); 2271 &return_accelerator);
2192 view->AddAccelerator(return_accelerator); 2272 TestView* view = test_widget.view();
2193 EXPECT_EQ(view->accelerator_count_map_[return_accelerator], 0); 2273 FocusManager* focus_manager = test_widget.widget()->GetFocusManager();
2194
2195 // Create a window and add the view as its child.
2196 std::unique_ptr<Widget> widget(new Widget);
2197 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
2198 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
2199 params.bounds = gfx::Rect(0, 0, 100, 100);
2200 widget->Init(params);
2201 View* root = widget->GetRootView();
2202 root->AddChildView(view);
2203 widget->Show();
2204
2205 // Get the focus manager.
2206 FocusManager* focus_manager = widget->GetFocusManager();
2207 ASSERT_TRUE(focus_manager);
2208 2274
2209 // Hit the return key and see if it takes effect. 2275 // Hit the return key and see if it takes effect.
2210 EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator)); 2276 EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator));
2211 EXPECT_EQ(view->accelerator_count_map_[return_accelerator], 1); 2277 EXPECT_EQ(view->accelerator_count_map_[return_accelerator], 1);
2212 2278
2213 // Hit the escape key. Nothing should happen. 2279 // Hit the escape key. Nothing should happen.
2214 ui::Accelerator escape_accelerator(ui::VKEY_ESCAPE, ui::EF_NONE); 2280 ui::Accelerator escape_accelerator(ui::VKEY_ESCAPE, ui::EF_NONE);
2215 EXPECT_FALSE(focus_manager->ProcessAccelerator(escape_accelerator)); 2281 EXPECT_FALSE(focus_manager->ProcessAccelerator(escape_accelerator));
2216 EXPECT_EQ(view->accelerator_count_map_[return_accelerator], 1); 2282 EXPECT_EQ(view->accelerator_count_map_[return_accelerator], 1);
2217 EXPECT_EQ(view->accelerator_count_map_[escape_accelerator], 0); 2283 EXPECT_EQ(view->accelerator_count_map_[escape_accelerator], 0);
(...skipping 20 matching lines...) Expand all
2238 EXPECT_EQ(view->accelerator_count_map_[escape_accelerator], 2); 2304 EXPECT_EQ(view->accelerator_count_map_[escape_accelerator], 2);
2239 2305
2240 // Remove all the accelerators. 2306 // Remove all the accelerators.
2241 view->ResetAccelerators(); 2307 view->ResetAccelerators();
2242 EXPECT_FALSE(focus_manager->ProcessAccelerator(return_accelerator)); 2308 EXPECT_FALSE(focus_manager->ProcessAccelerator(return_accelerator));
2243 EXPECT_EQ(view->accelerator_count_map_[return_accelerator], 2); 2309 EXPECT_EQ(view->accelerator_count_map_[return_accelerator], 2);
2244 EXPECT_EQ(view->accelerator_count_map_[escape_accelerator], 2); 2310 EXPECT_EQ(view->accelerator_count_map_[escape_accelerator], 2);
2245 EXPECT_FALSE(focus_manager->ProcessAccelerator(escape_accelerator)); 2311 EXPECT_FALSE(focus_manager->ProcessAccelerator(escape_accelerator));
2246 EXPECT_EQ(view->accelerator_count_map_[return_accelerator], 2); 2312 EXPECT_EQ(view->accelerator_count_map_[return_accelerator], 2);
2247 EXPECT_EQ(view->accelerator_count_map_[escape_accelerator], 2); 2313 EXPECT_EQ(view->accelerator_count_map_[escape_accelerator], 2);
2248
2249 widget->CloseNow();
2250 } 2314 }
2251 2315
2252 TEST_F(ViewTest, HiddenViewWithAccelerator) { 2316 TEST_F(ViewTest, HiddenViewWithAccelerator) {
2253 ui::Accelerator return_accelerator(ui::VKEY_RETURN, ui::EF_NONE); 2317 ui::Accelerator return_accelerator(ui::VKEY_RETURN, ui::EF_NONE);
2254 TestView* view = new TestView(); 2318 TestViewWidget test_widget(CreateParams(Widget::InitParams::TYPE_POPUP),
2255 view->Reset(); 2319 &return_accelerator);
2256 view->AddAccelerator(return_accelerator); 2320 TestView* view = test_widget.view();
2257 EXPECT_EQ(view->accelerator_count_map_[return_accelerator], 0); 2321 FocusManager* focus_manager = test_widget.widget()->GetFocusManager();
2258
2259 std::unique_ptr<Widget> widget(new Widget);
2260 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
2261 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
2262 params.bounds = gfx::Rect(0, 0, 100, 100);
2263 widget->Init(params);
2264 View* root = widget->GetRootView();
2265 root->AddChildView(view);
2266 widget->Show();
2267
2268 FocusManager* focus_manager = widget->GetFocusManager();
2269 ASSERT_TRUE(focus_manager);
2270 2322
2271 view->SetVisible(false); 2323 view->SetVisible(false);
2272 EXPECT_FALSE(focus_manager->ProcessAccelerator(return_accelerator)); 2324 EXPECT_FALSE(focus_manager->ProcessAccelerator(return_accelerator));
2273 2325
2274 view->SetVisible(true); 2326 view->SetVisible(true);
2275 EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator)); 2327 EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator));
2276
2277 widget->CloseNow();
2278 } 2328 }
2279 2329
2280 TEST_F(ViewTest, ViewInHiddenWidgetWithAccelerator) { 2330 TEST_F(ViewTest, ViewInHiddenWidgetWithAccelerator) {
2281 ui::Accelerator return_accelerator(ui::VKEY_RETURN, ui::EF_NONE); 2331 ui::Accelerator return_accelerator(ui::VKEY_RETURN, ui::EF_NONE);
2282 TestView* view = new TestView(); 2332 TestViewWidget test_widget(CreateParams(Widget::InitParams::TYPE_POPUP),
2283 view->Reset(); 2333 &return_accelerator, false);
2284 view->AddAccelerator(return_accelerator); 2334 TestView* view = test_widget.view();
2285 EXPECT_EQ(view->accelerator_count_map_[return_accelerator], 0); 2335 Widget* widget = test_widget.widget();
2286 2336 FocusManager* focus_manager = test_widget.widget()->GetFocusManager();
2287 std::unique_ptr<Widget> widget(new Widget);
2288 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
2289 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
2290 params.bounds = gfx::Rect(0, 0, 100, 100);
2291 widget->Init(params);
2292 View* root = widget->GetRootView();
2293 root->AddChildView(view);
2294
2295 FocusManager* focus_manager = widget->GetFocusManager();
2296 ASSERT_TRUE(focus_manager);
2297 2337
2298 EXPECT_FALSE(focus_manager->ProcessAccelerator(return_accelerator)); 2338 EXPECT_FALSE(focus_manager->ProcessAccelerator(return_accelerator));
2299 EXPECT_EQ(0, view->accelerator_count_map_[return_accelerator]); 2339 EXPECT_EQ(0, view->accelerator_count_map_[return_accelerator]);
2300 2340
2301 widget->Show(); 2341 widget->Show();
2302 EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator)); 2342 EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator));
2303 EXPECT_EQ(1, view->accelerator_count_map_[return_accelerator]); 2343 EXPECT_EQ(1, view->accelerator_count_map_[return_accelerator]);
2304 2344
2305 widget->Hide(); 2345 widget->Hide();
2306 EXPECT_FALSE(focus_manager->ProcessAccelerator(return_accelerator)); 2346 EXPECT_FALSE(focus_manager->ProcessAccelerator(return_accelerator));
2307 EXPECT_EQ(1, view->accelerator_count_map_[return_accelerator]); 2347 EXPECT_EQ(1, view->accelerator_count_map_[return_accelerator]);
2348 }
2349 #endif // OS_MACOSX
2308 2350
2309 widget->CloseNow(); 2351 // TODO: these tests were initially commented out when getting aura to
2310 } 2352 // run. Figure out if still valuable and either nuke or fix.
2311 2353 #if 0
2312 //////////////////////////////////////////////////////////////////////////////// 2354 ////////////////////////////////////////////////////////////////////////////////
2313 // Mouse-wheel message rerouting 2355 // Mouse-wheel message rerouting
2314 //////////////////////////////////////////////////////////////////////////////// 2356 ////////////////////////////////////////////////////////////////////////////////
2315 class ScrollableTestView : public View { 2357 class ScrollableTestView : public View {
2316 public: 2358 public:
2317 ScrollableTestView() { } 2359 ScrollableTestView() { }
2318 2360
2319 virtual gfx::Size GetPreferredSize() { 2361 virtual gfx::Size GetPreferredSize() {
2320 return gfx::Size(100, 10000); 2362 return gfx::Size(100, 10000);
2321 } 2363 }
(...skipping 2249 matching lines...) Expand 10 before | Expand all | Expand 10 after
4571 widget.Init(params); 4613 widget.Init(params);
4572 4614
4573 AddViewWithChildLayer(widget.GetRootView()); 4615 AddViewWithChildLayer(widget.GetRootView());
4574 ViewThatAddsViewInOnNativeThemeChanged* v = 4616 ViewThatAddsViewInOnNativeThemeChanged* v =
4575 new ViewThatAddsViewInOnNativeThemeChanged; 4617 new ViewThatAddsViewInOnNativeThemeChanged;
4576 widget.GetRootView()->AddChildView(v); 4618 widget.GetRootView()->AddChildView(v);
4577 EXPECT_TRUE(v->on_native_theme_changed_called()); 4619 EXPECT_TRUE(v->on_native_theme_changed_called());
4578 } 4620 }
4579 4621
4580 } // namespace views 4622 } // namespace views
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698