1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/renderer_context_menu/render_view_context_menu_browsertest_util.h"
6
7 #include "base/bind.h"
8 #include "base/location.h"
9 #include "base/run_loop.h"
10 #include "base/single_thread_task_runner.h"
11 #include "base/threading/thread_task_runner_handle.h"
12 #include "chrome/app/chrome_command_ids.h"
13 #include "chrome/browser/renderer_context_menu/render_view_context_menu.h"
14 #include "content/public/test/test_utils.h"
15
ContextMenuNotificationObserver(int command_to_execute)16 ContextMenuNotificationObserver::ContextMenuNotificationObserver(
17 int command_to_execute)
18 : command_to_execute_(command_to_execute) {
19 RenderViewContextMenu::RegisterMenuShownCallbackForTesting(base::BindOnce(
20 &ContextMenuNotificationObserver::MenuShown, base::Unretained(this)));
21 }
22
~ContextMenuNotificationObserver()23 ContextMenuNotificationObserver::~ContextMenuNotificationObserver() {
24 }
25
MenuShown(RenderViewContextMenu * context_menu)26 void ContextMenuNotificationObserver::MenuShown(
27 RenderViewContextMenu* context_menu) {
28 base::ThreadTaskRunnerHandle::Get()->PostTask(
29 FROM_HERE,
30 base::BindOnce(&ContextMenuNotificationObserver::ExecuteCommand,
31 base::Unretained(this), context_menu));
32 }
33
ExecuteCommand(RenderViewContextMenu * context_menu)34 void ContextMenuNotificationObserver::ExecuteCommand(
35 RenderViewContextMenu* context_menu) {
36 context_menu->ExecuteCommand(command_to_execute_, 0);
37 context_menu->Cancel();
38 }
39
ContextMenuWaiter()40 ContextMenuWaiter::ContextMenuWaiter() {
41 RenderViewContextMenu::RegisterMenuShownCallbackForTesting(
42 base::BindOnce(&ContextMenuWaiter::MenuShown, base::Unretained(this)));
43 }
44
ContextMenuWaiter(int command_to_execute)45 ContextMenuWaiter::ContextMenuWaiter(int command_to_execute)
46 : ContextMenuWaiter() {
47 maybe_command_to_execute_ = command_to_execute;
48 }
49
~ContextMenuWaiter()50 ContextMenuWaiter::~ContextMenuWaiter() {
51 }
52
MenuShown(RenderViewContextMenu * context_menu)53 void ContextMenuWaiter::MenuShown(RenderViewContextMenu* context_menu) {
54 base::ThreadTaskRunnerHandle::Get()->PostTask(
55 FROM_HERE, base::BindOnce(&ContextMenuWaiter::Cancel,
56 base::Unretained(this), context_menu));
57 }
58
WaitForMenuOpenAndClose()59 void ContextMenuWaiter::WaitForMenuOpenAndClose() {
60 run_loop_.Run();
61 }
62
params()63 content::ContextMenuParams& ContextMenuWaiter::params() {
64 return params_;
65 }
66
GetCapturedCommandIds() const67 const std::vector<int>& ContextMenuWaiter::GetCapturedCommandIds() const {
68 return captured_command_ids_;
69 }
70
Cancel(RenderViewContextMenu * context_menu)71 void ContextMenuWaiter::Cancel(RenderViewContextMenu* context_menu) {
72 params_ = context_menu->params();
73
74 const ui::SimpleMenuModel& menu_model = context_menu->menu_model();
75 captured_command_ids_.reserve(menu_model.GetItemCount());
76 for (int i = 0; i < menu_model.GetItemCount(); ++i)
77 captured_command_ids_.push_back(menu_model.GetCommandIdAt(i));
78
79 if (maybe_command_to_execute_)
80 context_menu->ExecuteCommand(*maybe_command_to_execute_, 0);
81 context_menu->Cancel();
82 run_loop_.Quit();
83 }
84