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

Side by Side Diff: ui/views/controls/menu/menu_runner_unittest.cc

Issue 2682363002: Merge Prevent nested Menu Cancelling (Closed)
Patch Set: Created 3 years, 10 months 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
« no previous file with comments | « ui/views/controls/menu/menu_runner_impl.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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/controls/menu/menu_runner.h" 5 #include "ui/views/controls/menu/menu_runner.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <memory> 9 #include <memory>
10 10
11 #include "base/macros.h" 11 #include "base/macros.h"
12 #include "base/memory/ptr_util.h" 12 #include "base/memory/ptr_util.h"
13 #include "base/strings/utf_string_conversions.h" 13 #include "base/strings/utf_string_conversions.h"
14 #include "ui/base/ui_base_types.h" 14 #include "ui/base/ui_base_types.h"
15 #include "ui/events/test/event_generator.h" 15 #include "ui/events/test/event_generator.h"
16 #include "ui/views/controls/menu/menu_controller.h" 16 #include "ui/views/controls/menu/menu_controller.h"
17 #include "ui/views/controls/menu/menu_delegate.h" 17 #include "ui/views/controls/menu/menu_delegate.h"
18 #include "ui/views/controls/menu/menu_item_view.h" 18 #include "ui/views/controls/menu/menu_item_view.h"
19 #include "ui/views/controls/menu/menu_runner_impl.h" 19 #include "ui/views/controls/menu/menu_runner_impl.h"
20 #include "ui/views/controls/menu/menu_types.h" 20 #include "ui/views/controls/menu/menu_types.h"
21 #include "ui/views/controls/menu/submenu_view.h" 21 #include "ui/views/controls/menu/submenu_view.h"
22 #include "ui/views/test/menu_test_utils.h" 22 #include "ui/views/test/menu_test_utils.h"
23 #include "ui/views/test/test_views.h" 23 #include "ui/views/test/test_views.h"
24 #include "ui/views/test/test_views_delegate.h"
24 #include "ui/views/test/views_test_base.h" 25 #include "ui/views/test/views_test_base.h"
25 #include "ui/views/widget/native_widget_private.h" 26 #include "ui/views/widget/native_widget_private.h"
26 #include "ui/views/widget/widget.h" 27 #include "ui/views/widget/widget.h"
27 28
29 namespace {
30
31 // Accepts a MenuRunnerImpl to release when this is. Simulates shutdown
32 // occurring immediately during the release of ViewsDelegate.
33 class DeletingTestViewsDelegate : public views::TestViewsDelegate {
34 public:
35 DeletingTestViewsDelegate() : menu_runner_(nullptr) {}
36 ~DeletingTestViewsDelegate() override{};
37
38 void set_menu_runner(views::internal::MenuRunnerImpl* menu_runner) {
39 menu_runner_ = menu_runner;
40 }
41
42 // views::ViewsDelegate:
43 void ReleaseRef() override;
44
45 private:
46 // Not owned, deletes itself.
47 views::internal::MenuRunnerImpl* menu_runner_;
48
49 DISALLOW_COPY_AND_ASSIGN(DeletingTestViewsDelegate);
50 };
51
52 void DeletingTestViewsDelegate::ReleaseRef() {
53 if (menu_runner_)
54 menu_runner_->Release();
55 }
56
57 } // namespace
58
28 namespace views { 59 namespace views {
29 namespace test { 60 namespace test {
30 61
31 class MenuRunnerTest : public ViewsTestBase { 62 class MenuRunnerTest : public ViewsTestBase {
32 public: 63 public:
33 MenuRunnerTest(); 64 MenuRunnerTest();
34 ~MenuRunnerTest() override; 65 ~MenuRunnerTest() override;
35 66
36 // Initializes a MenuRunner with |run_types|. It takes ownership of 67 // Initializes a MenuRunner with |run_types|. It takes ownership of
37 // |menu_item_view_|. 68 // |menu_item_view_|.
(...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after
413 // controller that it created. 444 // controller that it created.
414 menu_runner->Release(); 445 menu_runner->Release();
415 446
416 // This is not expected to run, however this is from the origin ASAN stack 447 // This is not expected to run, however this is from the origin ASAN stack
417 // traces. So regressions will be caught with the same stack trace. 448 // traces. So regressions will be caught with the same stack trace.
418 if (menu_controller.controller()) 449 if (menu_controller.controller())
419 menu_controller.controller()->CancelAll(); 450 menu_controller.controller()->CancelAll();
420 EXPECT_EQ(nullptr, menu_controller.controller()); 451 EXPECT_EQ(nullptr, menu_controller.controller());
421 } 452 }
422 453
454 // Test class which overrides the ViewsDelegate. Allowing to simulate shutdown
455 // during its release.
456 class MenuRunnerDestructionTest : public MenuRunnerTest {
457 public:
458 MenuRunnerDestructionTest() {}
459 ~MenuRunnerDestructionTest() override {}
460
461 DeletingTestViewsDelegate* views_delegate() { return views_delegate_; }
462
463 base::WeakPtr<internal::MenuRunnerImpl> MenuRunnerAsWeakPtr(
464 internal::MenuRunnerImpl* menu_runner);
465
466 // ViewsTestBase:
467 void SetUp() override;
468
469 private:
470 // Not owned
471 DeletingTestViewsDelegate* views_delegate_;
472
473 DISALLOW_COPY_AND_ASSIGN(MenuRunnerDestructionTest);
474 };
475
476 base::WeakPtr<internal::MenuRunnerImpl>
477 MenuRunnerDestructionTest::MenuRunnerAsWeakPtr(
478 internal::MenuRunnerImpl* menu_runner) {
479 return menu_runner->weak_factory_.GetWeakPtr();
480 }
481
482 void MenuRunnerDestructionTest::SetUp() {
483 std::unique_ptr<DeletingTestViewsDelegate> views_delegate(
484 new DeletingTestViewsDelegate);
485 views_delegate_ = views_delegate.get();
486 set_views_delegate(std::move(views_delegate));
487 MenuRunnerTest::SetUp();
488 }
489
490 // Tests that when ViewsDelegate is released that a nested Cancel of the
491 // MenuRunner does not occur.
492 TEST_F(MenuRunnerDestructionTest, MenuRunnerDestroyedDuringReleaseRef) {
493 internal::MenuRunnerImpl* menu_runner =
494 new internal::MenuRunnerImpl(menu_item_view());
495 EXPECT_EQ(MenuRunner::NORMAL_EXIT,
496 menu_runner->RunMenuAt(owner(), nullptr, gfx::Rect(),
497 MENU_ANCHOR_TOPLEFT, MenuRunner::ASYNC));
498
499 views_delegate()->set_menu_runner(menu_runner);
500
501 base::WeakPtr<internal::MenuRunnerImpl> ref(MenuRunnerAsWeakPtr(menu_runner));
502 MenuControllerTestApi menu_controller;
503 // This will release the ref on ViewsDelegate. The test version will release
504 // |menu_runner| simulating device shutdown.
505 menu_controller.controller()->CancelAll();
506 // Both the |menu_runner| and |menu_controller| should have been deleted.
507 EXPECT_EQ(nullptr, ref);
508 EXPECT_EQ(nullptr, menu_controller.controller());
509 }
510
423 } // namespace test 511 } // namespace test
424 } // namespace views 512 } // namespace views
OLDNEW
« no previous file with comments | « ui/views/controls/menu/menu_runner_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698