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