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 "base/bind.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/app/chrome_command_ids.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/bookmarks/bookmark_model_factory.h"
1323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "chrome/browser/chrome_content_browser_client.h"
147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/bookmarks/bookmark_utils.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_tabstrip.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/bookmarks/bookmark_bar_view.h"
2223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "chrome/common/chrome_content_client.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/interactive_test_utils.h"
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/test/base/scoped_testing_local_state.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/test_browser_window.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_browser_process.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/view_event_test_base.h"
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/browser/bookmark_model.h"
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/test/bookmark_test_helpers.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/page_navigator.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h"
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/aura/env.h"
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/aura/env_observer.h"
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/aura/window.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/clipboard/clipboard.h"
41868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/base/test/ui_controls.h"
42d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/keycodes/keyboard_codes.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/button/menu_button.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/button/text_button.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/menu/menu_controller.h"
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/menu/menu_item_view.h"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/menu/submenu_view.h"
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::ASCIIToUTF16;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::OpenURLParams;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::PageNavigator;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Waits for a views::Widget dialog to show up.
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class DialogWaiter : public aura::EnvObserver,
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                     public views::WidgetObserver {
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DialogWaiter()
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      : dialog_created_(false),
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        dialog_(NULL) {
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    aura::Env::GetInstance()->AddObserver(this);
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual ~DialogWaiter() {
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    aura::Env::GetInstance()->RemoveObserver(this);
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  views::Widget* WaitForDialog() {
73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (dialog_created_)
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return dialog_;
75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    base::MessageLoopForUI* loop = base::MessageLoopForUI::current();
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    base::MessageLoopForUI::ScopedNestableTaskAllower allow_nested(loop);
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    base::RunLoop run_loop;
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    quit_closure_ = run_loop.QuitClosure();
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    run_loop.Run();
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return dialog_;
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private:
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // aura::EnvObserver:
85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnWindowInitialized(aura::Window* window) OVERRIDE {
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (dialog_)
87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return;
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    views::Widget* widget = views::Widget::GetWidgetForNativeView(window);
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (!widget || !widget->IsDialogBox())
90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return;
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    dialog_ = widget;
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    dialog_->AddObserver(this);
93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // views::WidgetObserver:
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnWidgetVisibilityChanged(views::Widget* widget,
97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                         bool visible) OVERRIDE {
98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    CHECK_EQ(dialog_, widget);
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (visible) {
100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      dialog_created_ = true;
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      dialog_->RemoveObserver(this);
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      if (!quit_closure_.is_null())
103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        quit_closure_.Run();
104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool dialog_created_;
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  views::Widget* dialog_;
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::Closure quit_closure_;
110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DialogWaiter);
112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Waits for a dialog to terminate.
115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class DialogCloseWaiter : public views::WidgetObserver {
116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  explicit DialogCloseWaiter(views::Widget* dialog)
118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      : dialog_closed_(false) {
119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    dialog->AddObserver(this);
120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual ~DialogCloseWaiter() {
123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // It is not necessary to remove |this| from the dialog's observer, since
124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // the dialog is destroyed before this waiter.
125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void WaitForDialogClose() {
128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (dialog_closed_)
129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return;
130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    base::MessageLoopForUI* loop = base::MessageLoopForUI::current();
131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    base::MessageLoopForUI::ScopedNestableTaskAllower allow_nested(loop);
132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    base::RunLoop run_loop;
133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    quit_closure_ = run_loop.QuitClosure();
134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    run_loop.Run();
135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private:
138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // views::WidgetObserver:
139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnWidgetDestroyed(views::Widget* widget) OVERRIDE {
140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    dialog_closed_ = true;
141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (!quit_closure_.is_null())
142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      quit_closure_.Run();
143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool dialog_closed_;
146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::Closure quit_closure_;
147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DialogCloseWaiter);
149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Waits for a views::Widget to receive a Tab key.
152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class TabKeyWaiter : public ui::EventHandler {
153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  explicit TabKeyWaiter(views::Widget* widget)
155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      : widget_(widget),
156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        received_tab_(false) {
157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    widget_->GetNativeView()->AddPreTargetHandler(this);
158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual ~TabKeyWaiter() {
161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    widget_->GetNativeView()->RemovePreTargetHandler(this);
162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void WaitForTab() {
165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (received_tab_)
166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return;
167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    base::MessageLoopForUI* loop = base::MessageLoopForUI::current();
168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    base::MessageLoopForUI::ScopedNestableTaskAllower allow_nested(loop);
169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    base::RunLoop run_loop;
170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    quit_closure_ = run_loop.QuitClosure();
171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    run_loop.Run();
172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private:
175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // ui::EventHandler:
176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnKeyEvent(ui::KeyEvent* event) OVERRIDE {
177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (event->type() == ui::ET_KEY_RELEASED &&
178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        event->key_code() == ui::VKEY_TAB) {
179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      received_tab_ = true;
180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      if (!quit_closure_.is_null())
181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        quit_closure_.Run();
182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
184cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  views::Widget* widget_;
186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool received_tab_;
187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::Closure quit_closure_;
188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TabKeyWaiter);
190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MoveMouseAndPress(const gfx::Point& screen_pos,
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       ui_controls::MouseButton button,
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       int state,
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const base::Closure& closure) {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_controls::SendMouseMove(screen_pos.x(), screen_pos.y());
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_controls::SendMouseEventsNotifyWhenDone(button, state, closure);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PageNavigator implementation that records the URL.
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestingPageNavigator : public PageNavigator {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual WebContents* OpenURL(const OpenURLParams& params) OVERRIDE {
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url_ = params.url;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url_;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// TODO(erg): Fix bookmark DBD tests on linux_aura. crbug.com/163931
212a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(OS_LINUX) && defined(USE_AURA)
21390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define MAYBE(x) DISABLED_##x
21490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#else
21590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define MAYBE(x) x
21690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif
21790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Base class for event generating bookmark view tests. These test are intended
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to exercise View's menus, but that's easier done with BookmarkBarView rather
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// than View's menu itself.
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SetUp creates a bookmark model with the following structure.
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// All folders are in upper case, all URLs in lower case.
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// F1
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   f1a
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   F11
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     f11a
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   *
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// b
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// c
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// d
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// F2
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// e
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OTHER
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   oa
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   OF
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     ofa
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     ofb
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   OF2
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     of2a
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     of2b
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * if CreateBigMenu returns return true, 100 menu items are created here with
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   the names f1-f100.
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Subclasses should be sure and invoke super's implementation of SetUp and
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TearDown.
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkBarViewEventTestBase : public ViewEventTestBase {
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkBarViewEventTestBase()
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : ViewEventTestBase(),
255a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch        model_(NULL) {}
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp() OVERRIDE {
25823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    content_client_.reset(new ChromeContentClient);
25923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    content::SetContentClient(content_client_.get());
26023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    browser_content_client_.reset(new chrome::ChromeContentBrowserClient());
26123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    content::SetBrowserClientForTesting(browser_content_client_.get());
26223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
263424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    views::MenuController::TurnOffMenuSelectionHoldForTest();
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BookmarkBarView::DisableAnimationsForTesting(true);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile_.reset(new TestingProfile());
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile_->CreateBookmarkModel(true);
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    model_ = BookmarkModelFactory::GetForProfile(profile_.get());
26958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    test::WaitForBookmarkModelToLoad(model_);
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile_->GetPrefs()->SetBoolean(prefs::kShowBookmarkBar, true);
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Browser::CreateParams native_params(profile_.get(),
273eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                        chrome::GetActiveDesktop());
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser_.reset(
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        chrome::CreateBrowserWithTestWindowForParams(&native_params));
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    local_state_.reset(new ScopedTestingLocalState(
278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        TestingBrowserProcess::GetGlobal()));
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model_->ClearStore();
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bb_view_.reset(new BookmarkBarView(browser_.get(), NULL));
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bb_view_->set_owned_by_client();
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bb_view_->SetPageNavigator(&navigator_);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddTestData(CreateBigMenu());
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Calculate the preferred size so that one button doesn't fit, which
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // triggers the overflow button to appear.
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // BookmarkBarView::Layout does nothing if the parent is NULL and
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // GetPreferredSize hard codes a width of 1. For that reason we add the
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // BookmarkBarView to a dumby view as the parent.
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This code looks a bit hacky, but I've written it so that it shouldn't
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // be dependant upon any of the layout code in BookmarkBarView. Instead
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // we brute force search for a size that triggers the overflow button.
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::View tmp_parent;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tmp_parent.AddChildView(bb_view_.get());
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bb_view_pref_ = bb_view_->GetPreferredSize();
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bb_view_pref_.set_width(1000);
303f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = GetBookmarkButton(6);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (button->visible()) {
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bb_view_pref_.set_width(bb_view_pref_.width() - 25);
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bb_view_->SetBounds(0, 0, bb_view_pref_.width(), bb_view_pref_.height());
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bb_view_->Layout();
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tmp_parent.RemoveChildView(bb_view_.get());
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ViewEventTestBase::SetUp();
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() {
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Destroy everything, then run the message loop to ensure we delete all
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Tasks and fully shut down.
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    browser_->tab_strip_model()->CloseAllTabs();
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bb_view_.reset();
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser_.reset();
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile_.reset();
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Run the message loop to ensure we delete allTasks and fully shut down.
324cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    base::MessageLoopForUI* loop = base::MessageLoopForUI::current();
325cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    base::MessageLoopForUI::ScopedNestableTaskAllower allow_nested(loop);
326cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    base::RunLoop run_loop;
327cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    loop->PostTask(FROM_HERE, run_loop.QuitClosure());
328cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    run_loop.Run();
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ViewEventTestBase::TearDown();
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BookmarkBarView::DisableAnimationsForTesting(false);
33223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
33323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    browser_content_client_.reset();
33423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    content_client_.reset();
33523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    content::SetContentClient(NULL);
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual views::View* CreateContentsView() OVERRIDE {
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return bb_view_.get();
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
343cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual gfx::Size GetPreferredSize() const OVERRIDE { return bb_view_pref_; }
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  views::LabelButton* GetBookmarkButton(int view_index) {
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return bb_view_->GetBookmarkButton(view_index);
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See comment above class description for what this does.
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool CreateBigMenu() { return false; }
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkModel* model_;
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<BookmarkBarView> bb_view_;
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestingPageNavigator navigator_;
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddTestData(bool big_menu) {
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const BookmarkNode* bb_node = model_->bookmark_bar_node();
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string test_base = "file:///c:/tmp/";
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const BookmarkNode* f1 = model_->AddFolder(bb_node, 0, ASCIIToUTF16("F1"));
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model_->AddURL(f1, 0, ASCIIToUTF16("f1a"), GURL(test_base + "f1a"));
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const BookmarkNode* f11 = model_->AddFolder(f1, 1, ASCIIToUTF16("F11"));
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model_->AddURL(f11, 0, ASCIIToUTF16("f11a"), GURL(test_base + "f11a"));
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (big_menu) {
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (int i = 1; i <= 100; ++i) {
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        model_->AddURL(f1, i + 1, ASCIIToUTF16("f") + base::IntToString16(i),
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       GURL(test_base + "f" + base::IntToString(i)));
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model_->AddURL(bb_node, 1, ASCIIToUTF16("a"), GURL(test_base + "a"));
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model_->AddURL(bb_node, 2, ASCIIToUTF16("b"), GURL(test_base + "b"));
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model_->AddURL(bb_node, 3, ASCIIToUTF16("c"), GURL(test_base + "c"));
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model_->AddURL(bb_node, 4, ASCIIToUTF16("d"), GURL(test_base + "d"));
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    model_->AddFolder(bb_node, 5, ASCIIToUTF16("F2"));
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    model_->AddURL(bb_node, 6, ASCIIToUTF16("d"), GURL(test_base + "d"));
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model_->AddURL(model_->other_node(), 0, ASCIIToUTF16("oa"),
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   GURL(test_base + "oa"));
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const BookmarkNode* of = model_->AddFolder(model_->other_node(), 1,
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               ASCIIToUTF16("OF"));
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model_->AddURL(of, 0, ASCIIToUTF16("ofa"), GURL(test_base + "ofa"));
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model_->AddURL(of, 1, ASCIIToUTF16("ofb"), GURL(test_base + "ofb"));
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const BookmarkNode* of2 = model_->AddFolder(model_->other_node(), 2,
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                ASCIIToUTF16("OF2"));
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model_->AddURL(of2, 0, ASCIIToUTF16("of2a"), GURL(test_base + "of2a"));
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model_->AddURL(of2, 1, ASCIIToUTF16("of2b"), GURL(test_base + "of2b"));
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size bb_view_pref_;
39023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<ChromeContentClient> content_client_;
39123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<chrome::ChromeContentBrowserClient> browser_content_client_;
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestingProfile> profile_;
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Browser> browser_;
394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<ScopedTestingLocalState> local_state_;
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Clicks on first menu, makes sure button is depressed. Moves mouse to first
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// child, clicks it and makes sure a navigation occurs.
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkBarViewTest1 : public BookmarkBarViewEventTestBase {
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DoTestOnMessageLoop() OVERRIDE {
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move the mouse to the first folder on the bookmark bar and press the
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // mouse.
404f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = GetBookmarkButton(0);
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest1::Step2));
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step2() {
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Menu should be showing.
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Button should be depressed.
418f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = GetBookmarkButton(0);
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(button->state() == views::CustomButton::STATE_PRESSED);
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Click on the 2nd menu item (A URL).
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu());
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu_to_select =
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        menu->GetSubmenu()->GetMenuItemAt(0);
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(menu_to_select, ui_controls::LEFT,
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest1::Step3));
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step3() {
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We should have navigated to URL f1a.
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(navigator_.url_ ==
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                model_->bookmark_bar_node()->GetChild(0)->GetChild(0)->url());
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure button is no longer pushed.
437f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = GetBookmarkButton(0);
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(button->state() == views::CustomButton::STATE_NORMAL);
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu == NULL || !menu->GetSubmenu()->IsShowing());
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Done();
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)VIEW_TEST(BookmarkBarViewTest1, Basic)
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Brings up menu, clicks on empty space and make sure menu hides.
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkBarViewTest2 : public BookmarkBarViewEventTestBase {
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DoTestOnMessageLoop() OVERRIDE {
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move the mouse to the first folder on the bookmark bar and press the
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // mouse.
455f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = GetBookmarkButton(0);
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest2::Step2));
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step2() {
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Menu should be showing.
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL && menu->GetSubmenu()->IsShowing());
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Click on 0x0, which should trigger closing menu.
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // NOTE: this code assume there is a left margin, which is currently
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // true. If that changes, this code will need to find another empty space
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // to press the mouse on.
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Point mouse_loc;
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::View::ConvertPointToScreen(bb_view_.get(), &mouse_loc);
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui_controls::SendMouseMoveNotifyWhenDone(0, 0,
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest2::Step3));
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step3() {
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // As the click is on the desktop the hook never sees the up, so we only
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // wait on the down. We still send the up though else the system thinks
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // the mouse is still down.
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui_controls::SendMouseEventsNotifyWhenDone(
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ui_controls::LEFT, ui_controls::DOWN,
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest2::Step4));
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui_controls::SendMouseEvents(ui_controls::LEFT, ui_controls::UP);
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Step4() {
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The menu shouldn't be showing.
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu == NULL || !menu->GetSubmenu()->IsShowing());
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure button is no longer pushed.
493f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = GetBookmarkButton(0);
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(button->state() == views::CustomButton::STATE_NORMAL);
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Done();
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA)
5011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// TODO(erg): linux_aura bringup: http://crbug.com/163931
5021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define MAYBE_HideOnDesktopClick DISABLED_HideOnDesktopClick
5031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#else
5041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define MAYBE_HideOnDesktopClick HideOnDesktopClick
5051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif
5061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)VIEW_TEST(BookmarkBarViewTest2, MAYBE_HideOnDesktopClick)
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Brings up menu. Moves over child to make sure submenu appears, moves over
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// another child and make sure next menu appears.
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkBarViewTest3 : public BookmarkBarViewEventTestBase {
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DoTestOnMessageLoop() OVERRIDE {
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move the mouse to the first folder on the bookmark bar and press the
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // mouse.
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuButton* button = bb_view_->other_bookmarked_button();
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest3::Step2));
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step2() {
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Menu should be showing.
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* child_menu =
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        menu->GetSubmenu()->GetMenuItemAt(1);
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(child_menu != NULL);
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Click on second child, which has a submenu.
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(child_menu, ui_controls::LEFT,
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest3::Step3));
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step3() {
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure sub menu is showing.
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu);
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* child_menu =
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        menu->GetSubmenu()->GetMenuItemAt(1);
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(child_menu->GetSubmenu() != NULL);
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(child_menu->GetSubmenu()->IsShowing());
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Click on third child, which has a submenu too.
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child_menu = menu->GetSubmenu()->GetMenuItemAt(2);
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(child_menu != NULL);
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(child_menu, ui_controls::LEFT,
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest3::Step4));
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step4() {
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure sub menu we first clicked isn't showing.
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* child_menu =
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        menu->GetSubmenu()->GetMenuItemAt(1);
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(child_menu->GetSubmenu() != NULL);
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(child_menu->GetSubmenu()->IsShowing());
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // And submenu we last clicked is showing.
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child_menu = menu->GetSubmenu()->GetMenuItemAt(2);
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(child_menu != NULL);
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(child_menu->GetSubmenu()->IsShowing());
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Nothing should have been selected.
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(GURL(), navigator_.url_);
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Hide menu.
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    menu->GetMenuController()->CancelAll();
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Done();
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)VIEW_TEST(BookmarkBarViewTest3, Submenus)
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Observer that posts task upon the context menu creation.
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is necessary for Linux as the context menu has to check
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the clipboard, which invokes the event loop.
5845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class BookmarkContextMenuNotificationObserver
5855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : public content::NotificationObserver {
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
5875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  explicit BookmarkContextMenuNotificationObserver(const base::Closure& task)
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : task_(task) {
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    registrar_.Add(this,
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   chrome::NOTIFICATION_BOOKMARK_CONTEXT_MENU_SHOWN,
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   content::NotificationService::AllSources());
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Observe(int type,
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const content::NotificationSource& source,
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       const content::NotificationDetails& details) OVERRIDE {
597b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    base::MessageLoop::current()->PostTask(FROM_HERE, task_);
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the task that is posted when the context menu is shown.
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_task(const base::Closure& task) { task_ = task; }
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationRegistrar registrar_;
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Closure task_;
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BookmarkContextMenuNotificationObserver);
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests context menus by way of opening a context menu for a bookmark,
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// then right clicking to get context menu and selecting the first menu item
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (open).
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkBarViewTest4 : public BookmarkBarViewEventTestBase {
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkBarViewTest4()
616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : observer_(CreateEventTask(this, &BookmarkBarViewTest4::Step3)) {
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DoTestOnMessageLoop() OVERRIDE {
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move the mouse to the first folder on the bookmark bar and press the
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // mouse.
623f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = bb_view_->other_bookmarked_button();
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest4::Step2));
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step2() {
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Menu should be showing.
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* child_menu =
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        menu->GetSubmenu()->GetMenuItemAt(0);
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(child_menu != NULL);
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Right click on the first child to get its context menu.
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(child_menu, ui_controls::RIGHT,
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP, base::Closure());
6435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Step3 will be invoked by BookmarkContextMenuNotificationObserver.
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step3() {
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure the context menu is showing.
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetContextMenu();
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu());
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Select the first menu item (open).
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        menu->GetSubmenu()->GetMenuItemAt(0),
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::LEFT, ui_controls::DOWN | ui_controls::UP,
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest4::Step4));
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step4() {
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(navigator_.url_, model_->other_node()->GetChild(0)->url());
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Done();
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BookmarkContextMenuNotificationObserver observer_;
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)VIEW_TEST(BookmarkBarViewTest4, ContextMenus)
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests drag and drop within the same menu.
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkBarViewTest5 : public BookmarkBarViewEventTestBase {
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DoTestOnMessageLoop() OVERRIDE {
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url_dragging_ =
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        model_->bookmark_bar_node()->GetChild(0)->GetChild(0)->url();
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move the mouse to the first folder on the bookmark bar and press the
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // mouse.
679f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = GetBookmarkButton(0);
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest5::Step2));
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step2() {
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Menu should be showing.
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* child_menu =
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        menu->GetSubmenu()->GetMenuItemAt(0);
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(child_menu != NULL);
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move mouse to center of menu and press button.
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(child_menu, ui_controls::LEFT,
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN,
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest5::Step3));
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step3() {
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* target_menu =
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        bb_view_->GetMenu()->GetSubmenu()->GetMenuItemAt(1);
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Point loc(1, target_menu->height() - 1);
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::View::ConvertPointToScreen(target_menu, &loc);
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Start a drag.
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_controls::SendMouseMoveNotifyWhenDone(loc.x() + 10, loc.y(),
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest5::Step4));
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // See comment above this method as to why we do this.
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ScheduleMouseMoveInBackground(loc.x(), loc.y());
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step4() {
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Drop the item so that it's now the second item.
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* target_menu =
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        bb_view_->GetMenu()->GetSubmenu()->GetMenuItemAt(1);
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Point loc(1, target_menu->height() - 2);
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::View::ConvertPointToScreen(target_menu, &loc);
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_controls::SendMouseMove(loc.x(), loc.y());
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_controls::SendMouseEventsNotifyWhenDone(ui_controls::LEFT,
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::UP,
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest5::Step5));
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step5() {
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url = model_->bookmark_bar_node()->GetChild(0)->GetChild(1)->url();
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(url_dragging_, url);
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Done();
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url_dragging_;
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)VIEW_TEST(BookmarkBarViewTest5, MAYBE(DND))
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests holding mouse down on overflow button, dragging such that menu pops up
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// then selecting an item.
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkBarViewTest6 : public BookmarkBarViewEventTestBase {
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DoTestOnMessageLoop() OVERRIDE {
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Press the mouse button on the overflow button. Don't release it though.
746f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = bb_view_->overflow_button();
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN, CreateEventTask(this, &BookmarkBarViewTest6::Step2));
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step2() {
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Menu should be showing.
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* child_menu =
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        menu->GetSubmenu()->GetMenuItemAt(0);
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(child_menu != NULL);
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move mouse to center of menu and release mouse.
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(child_menu, ui_controls::LEFT,
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::UP, CreateEventTask(this, &BookmarkBarViewTest6::Step3));
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step3() {
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(navigator_.url_ ==
7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                model_->bookmark_bar_node()->GetChild(6)->url());
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Done();
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url_dragging_;
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)VIEW_TEST(BookmarkBarViewTest6, OpenMenuOnClickAndHold)
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests drag and drop to different menu.
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkBarViewTest7 : public BookmarkBarViewEventTestBase {
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DoTestOnMessageLoop() OVERRIDE {
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url_dragging_ =
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        model_->bookmark_bar_node()->GetChild(0)->GetChild(0)->url();
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move the mouse to the first folder on the bookmark bar and press the
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // mouse.
787f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = GetBookmarkButton(0);
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest7::Step2));
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step2() {
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Menu should be showing.
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* child_menu =
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        menu->GetSubmenu()->GetMenuItemAt(0);
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(child_menu != NULL);
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move mouse to center of menu and press button.
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(child_menu, ui_controls::LEFT,
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN,
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest7::Step3));
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step3() {
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Drag over other button.
812f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* other_button =
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        bb_view_->other_bookmarked_button();
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Point loc(other_button->width() / 2, other_button->height() / 2);
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::View::ConvertPointToScreen(other_button, &loc);
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA)
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO: fix this. Aura requires an additional mouse event to trigger drag
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // and drop checking state.
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_controls::SendMouseMoveNotifyWhenDone(loc.x() + 10, loc.y(),
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&BookmarkBarViewTest7::Step3A, this));
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Start a drag.
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_controls::SendMouseMoveNotifyWhenDone(loc.x() + 10, loc.y(),
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&BookmarkBarViewTest7::Step4, this));
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // See comment above this method as to why we do this.
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ScheduleMouseMoveInBackground(loc.x(), loc.y());
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step3A() {
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Drag over other button.
834f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* other_button =
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        bb_view_->other_bookmarked_button();
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Point loc(other_button->width() / 2, other_button->height() / 2);
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::View::ConvertPointToScreen(other_button, &loc);
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_controls::SendMouseMoveNotifyWhenDone(loc.x(), loc.y(),
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&BookmarkBarViewTest7::Step4, this));
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step4() {
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* drop_menu = bb_view_->GetDropMenu();
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(drop_menu != NULL);
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(drop_menu->GetSubmenu()->IsShowing());
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* target_menu =
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        drop_menu->GetSubmenu()->GetMenuItemAt(0);
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Point loc(1, 1);
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::View::ConvertPointToScreen(target_menu, &loc);
8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui_controls::SendMouseMoveNotifyWhenDone(loc.x(), loc.y(),
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest7::Step5));
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step5() {
8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui_controls::SendMouseEventsNotifyWhenDone(
8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ui_controls::LEFT, ui_controls::UP,
8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest7::Step6));
8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Step6() {
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(model_->other_node()->GetChild(0)->url() == url_dragging_);
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Done();
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url_dragging_;
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if !defined(OS_WIN)
8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This test passes locally (on aero and non-aero) but fails on the trybots and
8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// buildbot.
8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// http://crbug.com/154081
87490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)VIEW_TEST(BookmarkBarViewTest7, MAYBE(DNDToDifferentMenu))
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Drags from one menu to next so that original menu closes, then back to
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// original menu.
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkBarViewTest8 : public BookmarkBarViewEventTestBase {
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DoTestOnMessageLoop() OVERRIDE {
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url_dragging_ =
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        model_->bookmark_bar_node()->GetChild(0)->GetChild(0)->url();
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move the mouse to the first folder on the bookmark bar and press the
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // mouse.
887f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = GetBookmarkButton(0);
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest8::Step2));
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step2() {
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Menu should be showing.
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* child_menu =
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        menu->GetSubmenu()->GetMenuItemAt(0);
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(child_menu != NULL);
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move mouse to center of menu and press button.
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(child_menu, ui_controls::LEFT,
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN,
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest8::Step3));
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step3() {
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Drag over other button.
912f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* other_button =
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        bb_view_->other_bookmarked_button();
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Point loc(other_button->width() / 2, other_button->height() / 2);
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::View::ConvertPointToScreen(other_button, &loc);
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Start a drag.
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA)
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO: fix this. Aura requires an additional mouse event to trigger drag
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // and drop checking state.
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_controls::SendMouseMoveNotifyWhenDone(loc.x() + 10, loc.y(),
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&BookmarkBarViewTest8::Step3A, this));
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_controls::SendMouseMoveNotifyWhenDone(loc.x() + 10, loc.y(),
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&BookmarkBarViewTest8::Step4, this));
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // See comment above this method as to why we do this.
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ScheduleMouseMoveInBackground(loc.x(), loc.y());
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step3A() {
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Drag over other button.
933f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* other_button =
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        bb_view_->other_bookmarked_button();
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Point loc(other_button->width() / 2, other_button->height() / 2);
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::View::ConvertPointToScreen(other_button, &loc);
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_controls::SendMouseMoveNotifyWhenDone(loc.x() + 10, loc.y(),
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&BookmarkBarViewTest8::Step4, this));
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step4() {
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* drop_menu = bb_view_->GetDropMenu();
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(drop_menu != NULL);
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(drop_menu->GetSubmenu()->IsShowing());
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Now drag back over first menu.
948f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = GetBookmarkButton(0);
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Point loc(button->width() / 2, button->height() / 2);
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::View::ConvertPointToScreen(button, &loc);
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_controls::SendMouseMoveNotifyWhenDone(loc.x(), loc.y(),
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&BookmarkBarViewTest8::Step5, this));
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step5() {
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Drop on folder F11.
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* drop_menu = bb_view_->GetDropMenu();
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(drop_menu != NULL);
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(drop_menu->GetSubmenu()->IsShowing());
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* target_menu =
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        drop_menu->GetSubmenu()->GetMenuItemAt(1);
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        target_menu, ui_controls::LEFT, ui_controls::UP,
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest8::Step6));
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step6() {
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure drop was processed.
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL final_url = model_->bookmark_bar_node()->GetChild(0)->GetChild(0)->
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetChild(1)->url();
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(final_url == url_dragging_);
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Done();
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url_dragging_;
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if !defined(OS_WIN)
9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This test passes locally (on aero and non-aero) but fails on the trybots and
9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// buildbot.
9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// http://crbug.com/154081
98390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)VIEW_TEST(BookmarkBarViewTest8, MAYBE(DNDBackToOriginatingMenu))
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Moves the mouse over the scroll button and makes sure we get scrolling.
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkBarViewTest9 : public BookmarkBarViewEventTestBase {
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool CreateBigMenu() OVERRIDE { return true; }
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DoTestOnMessageLoop() OVERRIDE {
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move the mouse to the first folder on the bookmark bar and press the
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // mouse.
994f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = GetBookmarkButton(0);
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest9::Step2));
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step2() {
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Menu should be showing.
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_menu_ = menu->GetSubmenu()->GetMenuItemAt(0);
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Point menu_loc;
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::View::ConvertPointToScreen(first_menu_, &menu_loc);
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    start_y_ = menu_loc.y();
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move the mouse over the scroll button.
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::View* scroll_container = menu->GetSubmenu()->parent();
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(scroll_container != NULL);
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scroll_container = scroll_container->parent();
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(scroll_container != NULL);
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::View* scroll_down_button = scroll_container->child_at(1);
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(scroll_down_button);
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Point loc(scroll_down_button->width() / 2,
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   scroll_down_button->height() / 2);
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::View::ConvertPointToScreen(scroll_down_button, &loc);
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // On linux, the sending one location isn't enough.
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_controls::SendMouseMove(loc.x() - 1 , loc.y() - 1);
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_controls::SendMouseMoveNotifyWhenDone(
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        loc.x(), loc.y(), CreateEventTask(this, &BookmarkBarViewTest9::Step3));
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step3() {
1030b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    base::MessageLoop::current()->PostDelayedTask(
1031b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        FROM_HERE,
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&BookmarkBarViewTest9::Step4, this),
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::TimeDelta::FromMilliseconds(200));
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step4() {
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Point menu_loc;
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::View::ConvertPointToScreen(first_menu_, &menu_loc);
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NE(start_y_, menu_loc.y());
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Hide menu.
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bb_view_->GetMenu()->GetMenuController()->CancelAll();
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // On linux, Cancelling menu will call Quit on the message loop,
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // which can interfere with Done. We need to run Done in the
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // next execution loop.
1047b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    base::MessageLoop::current()->PostTask(
1048b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        FROM_HERE, base::Bind(&ViewEventTestBase::Done, this));
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int start_y_;
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::MenuItemView* first_menu_;
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)VIEW_TEST(BookmarkBarViewTest9, ScrollButtonScrolls)
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests up/down/left/enter key messages.
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkBarViewTest10 : public BookmarkBarViewEventTestBase {
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
10602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DoTestOnMessageLoop() OVERRIDE {
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move the mouse to the first folder on the bookmark bar and press the
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // mouse.
1063f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = GetBookmarkButton(0);
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest10::Step2));
1067b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    base::MessageLoop::current()->RunUntilIdle();
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step2() {
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Menu should be showing.
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Send a down event, which should select the first item.
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_controls::SendKeyPressNotifyWhenDone(
10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        window_->GetNativeWindow(), ui::VKEY_DOWN, false, false, false, false,
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest10::Step3));
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step3() {
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure menu is showing and item is selected.
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->GetMenuItemAt(0)->IsSelected());
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Send a key down event, which should select the next item.
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_controls::SendKeyPressNotifyWhenDone(
10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        window_->GetNativeWindow(), ui::VKEY_DOWN, false, false, false, false,
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest10::Step4));
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step4() {
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(menu->GetSubmenu()->GetMenuItemAt(0)->IsSelected());
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->GetMenuItemAt(1)->IsSelected());
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Send a right arrow to force the menu to open.
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_controls::SendKeyPressNotifyWhenDone(
11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        window_->GetNativeWindow(), ui::VKEY_RIGHT, false, false, false, false,
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest10::Step5));
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step5() {
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure the submenu is showing.
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* submenu = menu->GetSubmenu()->GetMenuItemAt(1);
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(submenu->IsSelected());
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(submenu->GetSubmenu());
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(submenu->GetSubmenu()->IsShowing());
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Send a left arrow to close the submenu.
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_controls::SendKeyPressNotifyWhenDone(
11212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        window_->GetNativeWindow(), ui::VKEY_LEFT, false, false, false, false,
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest10::Step6));
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step6() {
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure the submenu is showing.
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* submenu = menu->GetSubmenu()->GetMenuItemAt(1);
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(submenu->IsSelected());
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(!submenu->GetSubmenu() || !submenu->GetSubmenu()->IsShowing());
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Send a down arrow to wrap back to f1a
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_controls::SendKeyPressNotifyWhenDone(
11362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        window_->GetNativeWindow(), ui::VKEY_DOWN, false, false, false, false,
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest10::Step7));
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step7() {
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure menu is showing and item is selected.
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->GetMenuItemAt(0)->IsSelected());
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Send enter, which should select the item.
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_controls::SendKeyPressNotifyWhenDone(
11492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        window_->GetNativeWindow(), ui::VKEY_RETURN, false, false, false, false,
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest10::Step8));
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step8() {
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        model_->bookmark_bar_node()->GetChild(0)->GetChild(0)->url() ==
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        navigator_.url_);
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Done();
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)VIEW_TEST(BookmarkBarViewTest10, KeyEvents)
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure the menu closes with the following sequence: show menu, show
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// context menu, close context menu (via escape), then click else where. This
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// effectively verifies we maintain mouse capture after the context menu is
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// hidden.
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkBarViewTest11 : public BookmarkBarViewEventTestBase {
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkBarViewTest11()
1170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : observer_(CreateEventTask(this, &BookmarkBarViewTest11::Step3)) {
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
11742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DoTestOnMessageLoop() OVERRIDE {
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move the mouse to the first folder on the bookmark bar and press the
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // mouse.
1177f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = bb_view_->other_bookmarked_button();
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest11::Step2));
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step2() {
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Menu should be showing.
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* child_menu =
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        menu->GetSubmenu()->GetMenuItemAt(0);
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(child_menu != NULL);
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Right click on the first child to get its context menu.
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(child_menu, ui_controls::RIGHT,
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP, base::Closure());
11975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Step3 will be invoked by BookmarkContextMenuNotificationObserver.
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step3() {
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Send escape so that the context menu hides.
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_controls::SendKeyPressNotifyWhenDone(
12032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        window_->GetNativeWindow(), ui::VKEY_ESCAPE, false, false, false, false,
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest11::Step4));
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step4() {
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure the context menu is no longer showing.
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetContextMenu();
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(!menu || !menu->GetSubmenu() ||
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                !menu->GetSubmenu()->IsShowing());
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // But the menu should be showing.
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    menu = bb_view_->GetMenu();
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu && menu->GetSubmenu() && menu->GetSubmenu()->IsShowing());
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Now click on empty space.
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Point mouse_loc;
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::View::ConvertPointToScreen(bb_view_.get(), &mouse_loc);
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_controls::SendMouseMove(mouse_loc.x(), mouse_loc.y());
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_controls::SendMouseEventsNotifyWhenDone(
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::LEFT, ui_controls::UP | ui_controls::DOWN,
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest11::Step5));
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step5() {
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure the menu is not showing.
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(!menu || !menu->GetSubmenu() ||
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                !menu->GetSubmenu()->IsShowing());
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Done();
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BookmarkContextMenuNotificationObserver observer_;
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA)
12381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// TODO(erg): linux_aura bringup: http://crbug.com/163931
12391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define MAYBE_CloseMenuAfterClosingContextMenu \
12401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DISABLED_CloseMenuAfterClosingContextMenu
12411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#else
12421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define MAYBE_CloseMenuAfterClosingContextMenu CloseMenuAfterClosingContextMenu
12431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif
12441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
12451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)VIEW_TEST(BookmarkBarViewTest11, MAYBE_CloseMenuAfterClosingContextMenu)
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests showing a modal dialog from a context menu.
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkBarViewTest12 : public BookmarkBarViewEventTestBase {
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DoTestOnMessageLoop() OVERRIDE {
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Open up the other folder.
1252f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = bb_view_->other_bookmarked_button();
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest12::Step2));
12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    chrome::num_bookmark_urls_before_prompting = 1;
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~BookmarkBarViewTest12() {
12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    chrome::num_bookmark_urls_before_prompting = 15;
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step2() {
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Menu should be showing.
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* child_menu =
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        menu->GetSubmenu()->GetMenuItemAt(1);
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(child_menu != NULL);
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Right click on the second child (a folder) to get its context menu.
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(child_menu, ui_controls::RIGHT,
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest12::Step3));
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step3() {
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure the context menu is showing.
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetContextMenu();
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu && menu->GetSubmenu() && menu->GetSubmenu()->IsShowing());
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Select the first item in the context menu (open all).
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* child_menu =
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        menu->GetSubmenu()->GetMenuItemAt(0);
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(child_menu != NULL);
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Click and wait until the dialog box appears.
1291cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    scoped_ptr<DialogWaiter> dialog_waiter(new DialogWaiter());
1292cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(
1293cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        child_menu,
1294cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        ui_controls::LEFT,
1295cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
1296cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        base::Bind(
1297cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            &BookmarkBarViewTest12::Step4, this, base::Passed(&dialog_waiter)));
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void Step4(scoped_ptr<DialogWaiter> waiter) {
1301cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    views::Widget* dialog = waiter->WaitForDialog();
1302cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    waiter.reset();
1303cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1304cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Press tab to give focus to the cancel button. Wait until the widget
1305cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // receives the tab key.
1306cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    TabKeyWaiter tab_waiter(dialog);
13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui_controls::SendKeyPress(
13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        window_->GetNativeWindow(), ui::VKEY_TAB, false, false, false, false);
1309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    tab_waiter.WaitForTab();
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // For some reason return isn't processed correctly unless we delay.
1312b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    base::MessageLoop::current()->PostDelayedTask(
1313b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        FROM_HERE,
1314cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        base::Bind(
1315cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            &BookmarkBarViewTest12::Step5, this, base::Unretained(dialog)),
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::TimeDelta::FromSeconds(1));
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1319cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void Step5(views::Widget* dialog) {
1320cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DialogCloseWaiter waiter(dialog);
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // And press enter so that the cancel button is selected.
1322cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ui_controls::SendKeyPressNotifyWhenDone(window_->GetNativeWindow(),
1323cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                            ui::VKEY_RETURN,
1324cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                            false,
1325cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                            false,
1326cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                            false,
1327cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                            false,
1328cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                            base::Closure());
1329cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    waiter.WaitForDialogClose();
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Done();
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA)
13351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// TODO(erg): linux_aura bringup: http://crbug.com/163931
13361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define MAYBE_CloseWithModalDialog DISABLED_CloseWithModalDialog
13371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#else
13381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define MAYBE_CloseWithModalDialog CloseWithModalDialog
13391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif
13401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
13411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)VIEW_TEST(BookmarkBarViewTest12, MAYBE_CloseWithModalDialog)
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests clicking on the separator of a context menu (this is for coverage of
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bug 17862).
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkBarViewTest13 : public BookmarkBarViewEventTestBase {
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkBarViewTest13()
1348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : observer_(CreateEventTask(this, &BookmarkBarViewTest13::Step3)) {
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
13522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DoTestOnMessageLoop() OVERRIDE {
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move the mouse to the first folder on the bookmark bar and press the
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // mouse.
1355f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = bb_view_->other_bookmarked_button();
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest13::Step2));
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step2() {
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Menu should be showing.
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* child_menu =
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        menu->GetSubmenu()->GetMenuItemAt(0);
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(child_menu != NULL);
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Right click on the first child to get its context menu.
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(child_menu, ui_controls::RIGHT,
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP, base::Closure());
13755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Step3 will be invoked by BookmarkContextMenuNotificationObserver.
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step3() {
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure the context menu is showing.
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetContextMenu();
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu());
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Find the first separator.
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::SubmenuView* submenu = menu->GetSubmenu();
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::View* separator_view = NULL;
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int i = 0; i < submenu->child_count(); ++i) {
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (submenu->child_at(i)->id() != views::MenuItemView::kMenuItemViewID) {
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        separator_view = submenu->child_at(i);
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(separator_view);
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Click on the separator. Clicking on the separator shouldn't visually
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // change anything.
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(separator_view,
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::LEFT, ui_controls::DOWN | ui_controls::UP,
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest13::Step4));
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step4() {
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The context menu should still be showing.
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetContextMenu();
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu());
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Select the first context menu item.
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        menu->GetSubmenu()->GetMenuItemAt(0),
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::LEFT,
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest13::Step5));
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step5() {
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Done();
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BookmarkContextMenuNotificationObserver observer_;
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)VIEW_TEST(BookmarkBarViewTest13, ClickOnContextMenuSeparator)
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure right clicking on a folder on the bookmark bar doesn't result in
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// both a context menu and showing the menu.
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkBarViewTest14 : public BookmarkBarViewEventTestBase {
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkBarViewTest14()
1432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : observer_(CreateEventTask(this, &BookmarkBarViewTest14::Step2)) {
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
14362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DoTestOnMessageLoop() OVERRIDE {
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move the mouse to the first folder on the bookmark bar and press the
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // right mouse button.
1439f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = GetBookmarkButton(0);
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(button, ui_controls::RIGHT,
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP, base::Closure());
14425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Step2 will be invoked by BookmarkContextMenuNotificationObserver.
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step2() {
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Menu should NOT be showing.
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu == NULL);
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Send escape so that the context menu hides.
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_controls::SendKeyPressNotifyWhenDone(
14542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        window_->GetNativeWindow(), ui::VKEY_ESCAPE, false, false, false, false,
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest14::Step3));
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step3() {
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Done();
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BookmarkContextMenuNotificationObserver observer_;
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)VIEW_TEST(BookmarkBarViewTest14, ContextMenus2)
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure deleting from the context menu keeps the bookmark menu showing.
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkBarViewTest15 : public BookmarkBarViewEventTestBase {
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkBarViewTest15()
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : deleted_menu_id_(0),
1472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        observer_(CreateEventTask(this, &BookmarkBarViewTest15::Step3)) {
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
14762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DoTestOnMessageLoop() OVERRIDE {
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Show the other bookmarks.
1478f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = bb_view_->other_bookmarked_button();
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest15::Step2));
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step2() {
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Menu should be showing.
14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* child_menu =
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        menu->GetSubmenu()->GetMenuItemAt(1);
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(child_menu != NULL);
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    deleted_menu_id_ = child_menu->GetCommand();
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Right click on the second child to get its context menu.
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(child_menu, ui_controls::RIGHT,
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP, base::Closure());
15005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Step3 will be invoked by BookmarkContextMenuNotificationObserver.
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step3() {
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure the context menu is showing.
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetContextMenu();
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu());
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* delete_menu =
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        menu->GetMenuItemByID(IDC_BOOKMARK_BAR_REMOVE);
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(delete_menu);
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Click on the delete button.
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(delete_menu,
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::LEFT, ui_controls::DOWN | ui_controls::UP,
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest15::Step4));
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step4() {
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The context menu should not be showing.
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* context_menu = bb_view_->GetContextMenu();
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(context_menu == NULL);
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // But the menu should be showing.
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // And the deleted_menu_id_ should have been removed.
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetMenuItemByID(deleted_menu_id_) == NULL);
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bb_view_->GetMenu()->GetMenuController()->CancelAll();
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Done();
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int deleted_menu_id_;
15395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BookmarkContextMenuNotificationObserver observer_;
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)VIEW_TEST(BookmarkBarViewTest15, MenuStaysVisibleAfterDelete)
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we don't crash or get stuck if the parent of a menu is closed.
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkBarViewTest16 : public BookmarkBarViewEventTestBase {
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
15472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DoTestOnMessageLoop() OVERRIDE {
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move the mouse to the first folder on the bookmark bar and press the
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // mouse.
1550f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = GetBookmarkButton(0);
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest16::Step2));
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step2() {
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Menu should be showing.
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Button should be depressed.
1564f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = GetBookmarkButton(0);
15652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(button->state() == views::CustomButton::STATE_PRESSED);
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Close the window.
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window_->Close();
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window_ = NULL;
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1571b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    base::MessageLoop::current()->PostTask(
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FROM_HERE, CreateEventTask(this, &BookmarkBarViewTest16::Done));
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
15771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// TODO(erg): linux_aura bringup: http://crbug.com/163931
15781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define MAYBE_DeleteMenu DISABLED_DeleteMenu
15791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#else
15801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define MAYBE_DeleteMenu DeleteMenu
15811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif
15821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
15831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)VIEW_TEST(BookmarkBarViewTest16, MAYBE_DeleteMenu)
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure right clicking on an item while a context menu is already showing
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// doesn't crash and works.
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkBarViewTest17 : public BookmarkBarViewEventTestBase {
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkBarViewTest17()
1590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : observer_(CreateEventTask(this, &BookmarkBarViewTest17::Step3)) {
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
15942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DoTestOnMessageLoop() OVERRIDE {
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move the mouse to the other folder on the bookmark bar and press the
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // left mouse button.
1597f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = bb_view_->other_bookmarked_button();
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest17::Step2));
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step2() {
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Menu should be showing.
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Right click on the second item to show its context menu.
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* child_menu = menu->GetSubmenu()->GetMenuItemAt(2);
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(child_menu != NULL);
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(child_menu, ui_controls::RIGHT,
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP, base::Closure());
16155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Step3 will be invoked by BookmarkContextMenuNotificationObserver.
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step3() {
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure the context menu is showing.
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* context_menu = bb_view_->GetContextMenu();
16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(context_menu != NULL);
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(context_menu->GetSubmenu());
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(context_menu->GetSubmenu()->IsShowing());
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Right click on the first menu item to trigger its context menu.
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* child_menu = menu->GetSubmenu()->GetMenuItemAt(1);
16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(child_menu != NULL);
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The context menu and child_menu can be overlapped, calculate the
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // non-intersected Rect of the child menu and click on its center to make
16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // sure the click is always on the child menu.
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect context_rect = context_menu->GetSubmenu()->GetBoundsInScreen();
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect child_menu_rect = child_menu->GetBoundsInScreen();
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect clickable_rect =
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        gfx::SubtractRects(child_menu_rect, context_rect);
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(clickable_rect.IsEmpty());
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer_.set_task(CreateEventTask(this, &BookmarkBarViewTest17::Step4));
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MoveMouseAndPress(clickable_rect.CenterPoint(), ui_controls::RIGHT,
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP, base::Closure());
16435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Step4 will be invoked by BookmarkContextMenuNotificationObserver.
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step4() {
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The context menu should still be showing.
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* context_menu = bb_view_->GetContextMenu();
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(context_menu != NULL);
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // And the menu should be showing.
16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bb_view_->GetMenu()->GetMenuController()->CancelAll();
16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Done();
16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BookmarkContextMenuNotificationObserver observer_;
16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA)
16651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// TODO(erg): linux_aura bringup: http://crbug.com/163931
16661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define MAYBE_ContextMenus3 DISABLED_ContextMenus3
16671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#else
16681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define MAYBE_ContextMenus3 ContextMenus3
16691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif
16701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
16711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)VIEW_TEST(BookmarkBarViewTest17, MAYBE_ContextMenus3)
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies sibling menus works. Clicks on the 'other bookmarks' folder, then
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// moves the mouse over the first item on the bookmark bar and makes sure the
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// menu appears.
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkBarViewTest18 : public BookmarkBarViewEventTestBase {
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
16782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DoTestOnMessageLoop() OVERRIDE {
16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move the mouse to the other folder on the bookmark bar and press the
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // left mouse button.
1681f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = bb_view_->other_bookmarked_button();
16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest18::Step2));
16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step2() {
16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Menu should be showing.
16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move the mouse to the first folder on the bookmark bar
1695f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = GetBookmarkButton(0);
16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Point button_center(button->width() / 2, button->height() / 2);
16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::View::ConvertPointToScreen(button, &button_center);
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_controls::SendMouseMoveNotifyWhenDone(
16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        button_center.x(), button_center.y(),
17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest18::Step3));
17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step3() {
17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure the menu is showing.
17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The menu for the first folder should be in the pressed state (since the
17102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // menu is showing for it).
17112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(views::CustomButton::STATE_PRESSED,
17122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              GetBookmarkButton(0)->state());
17132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    menu->GetMenuController()->CancelAll();
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Done();
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
17211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// TODO(erg): linux_aura bringup: http://crbug.com/163931
17221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define MAYBE_BookmarkBarViewTest18_SiblingMenu \
17231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DISABLED_BookmarkBarViewTest18_SiblingMenu
17241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#else
17251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define MAYBE_BookmarkBarViewTest18_SiblingMenu \
17261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  BookmarkBarViewTest18_SiblingMenu
17271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif
17281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
17291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)VIEW_TEST(BookmarkBarViewTest18, MAYBE_BookmarkBarViewTest18_SiblingMenu)
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies mousing over an already open sibling menu doesn't prematurely cancel
17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the menu.
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkBarViewTest19 : public BookmarkBarViewEventTestBase {
17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
17352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DoTestOnMessageLoop() OVERRIDE {
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move the mouse to the other folder on the bookmark bar and press the
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // left mouse button.
1738f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = bb_view_->other_bookmarked_button();
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest19::Step2));
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step2() {
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Menu should be showing.
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Click on the first folder.
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* child_menu = menu->GetSubmenu()->GetMenuItemAt(1);
17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(child_menu != NULL);
17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(
17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        child_menu, ui_controls::LEFT,
17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest19::Step3));
17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step3() {
17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure the menu is showing.
17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move the mouse back to the other bookmark button.
1767f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = bb_view_->other_bookmarked_button();
17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Point button_center(button->width() / 2, button->height() / 2);
17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::View::ConvertPointToScreen(button, &button_center);
17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_controls::SendMouseMoveNotifyWhenDone(
17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        button_center.x() + 1, button_center.y() + 1,
17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest19::Step4));
17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step4() {
17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Menu should be showing.
17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Click on the first folder.
17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* child_menu = menu->GetSubmenu()->GetMenuItemAt(1);
17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(child_menu != NULL);
17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(
17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        child_menu,
17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::LEFT,
17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest19::Step5));
17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step5() {
17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure the menu is showing.
17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    menu->GetMenuController()->CancelAll();
17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Done();
18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)VIEW_TEST(BookmarkBarViewTest19, BookmarkBarViewTest19_SiblingMenu)
18042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verify that when clicking a mouse button outside a context menu,
18062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the context menu is dismissed *and* the underlying view receives
18072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the the mouse event (due to event reposting).
18082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class BookmarkBarViewTest20 : public BookmarkBarViewEventTestBase {
18092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
18102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BookmarkBarViewTest20() : test_view_(new TestViewForMenuExit) {}
18112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
18132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DoTestOnMessageLoop() OVERRIDE {
18142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Add |test_view_| next to |bb_view_|.
18152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::View* parent = bb_view_->parent();
18162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::View* container_view = new ContainerViewForMenuExit;
18172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    container_view->AddChildView(bb_view_.get());
18182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    container_view->AddChildView(test_view_);
18192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    parent->AddChildView(container_view);
18202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    parent->Layout();
18212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_EQ(test_view_->press_count(), 0);
18232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Move the mouse to the Test View and press the left mouse button.
18252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(
18262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        test_view_, ui_controls::LEFT, ui_controls::DOWN | ui_controls::UP,
18272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest20::Step1));
18282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
18292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
18312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Step1() {
18322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_EQ(test_view_->press_count(), 1);
18332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(bb_view_->GetMenu() == NULL);
18342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Move the mouse to the first folder on the bookmark bar and press the
18362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // left mouse button.
1837f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = GetBookmarkButton(0);
18382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(
18392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        button, ui_controls::LEFT, ui_controls::DOWN | ui_controls::UP,
18402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest20::Step2));
18412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
18422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Step2() {
18442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_EQ(test_view_->press_count(), 1);
18452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
18462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(menu != NULL);
18472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
18482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Move the mouse to the Test View and press the left mouse button.
18502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The context menu will consume the event and exit. Thereafter,
18512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // the event is reposted and delivered to the Test View which
18522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // increases its press-count.
18532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(
18542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        test_view_, ui_controls::LEFT, ui_controls::DOWN | ui_controls::UP,
18552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest20::Step3));
18562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
18572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Step3() {
18592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_EQ(test_view_->press_count(), 2);
18602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(bb_view_->GetMenu() == NULL);
18612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Done();
18622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
18632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class ContainerViewForMenuExit : public views::View {
18652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   public:
18662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ContainerViewForMenuExit() {
18672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
18682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void Layout() OVERRIDE {
18702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DCHECK_EQ(2, child_count());
18712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      views::View* bb_view = child_at(0);
18722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      views::View* test_view = child_at(1);
18732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const int width = bb_view->width();
18742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const int height = bb_view->height();
18752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bb_view->SetBounds(0,0, width - 22, height);
18762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_view->SetBounds(width - 20, 0, 20, height);
18772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
18782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   private:
18802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(ContainerViewForMenuExit);
18822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
18832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class TestViewForMenuExit : public views::View {
18852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   public:
18862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TestViewForMenuExit() : press_count_(0) {
18872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
18882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual bool OnMousePressed(const ui::MouseEvent& event) OVERRIDE {
18892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ++press_count_;
18902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return true;
18912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
18922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int press_count() const { return press_count_; }
18932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   private:
18952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int press_count_;
18962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(TestViewForMenuExit);
18982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
18992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestViewForMenuExit* test_view_;
19012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
19022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
19041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// TODO(erg): linux_aura bringup: http://crbug.com/163931
19051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define MAYBE_ContextMenuExitTest DISABLED_ContextMenuExitTest
19064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#else
19074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define MAYBE_ContextMenuExitTest ContextMenuExitTest
19084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
19092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)VIEW_TEST(BookmarkBarViewTest20, MAYBE_ContextMenuExitTest)
19112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests context menu by way of opening a context menu for a empty folder menu.
19132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The opened context menu should behave as it is from the folder button.
19142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class BookmarkBarViewTest21 : public BookmarkBarViewEventTestBase {
19152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
19162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BookmarkBarViewTest21()
1917c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : observer_(CreateEventTask(this, &BookmarkBarViewTest21::Step3)) {
19182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
19192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
19212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Move the mouse to the empty folder on the bookmark bar and press the
19222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // left mouse button.
1923c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DoTestOnMessageLoop() OVERRIDE {
1924f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = GetBookmarkButton(5);
19252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
19262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
19272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest21::Step2));
19282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
19292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
19312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Confirm that a menu for empty folder shows and right click the menu.
19322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Step2() {
19332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Menu should be showing.
19342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
19352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(menu != NULL);
19362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::SubmenuView* submenu = menu->GetSubmenu();
19382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(submenu->IsShowing());
19392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_EQ(1, submenu->child_count());
19402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::View* view = submenu->child_at(0);
19422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(view != NULL);
19432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(views::MenuItemView::kEmptyMenuItemViewID, view->id());
19442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Right click on the first child to get its context menu.
19462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(view, ui_controls::RIGHT,
19472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ui_controls::DOWN | ui_controls::UP, base::Closure());
19485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Step3 will be invoked by BookmarkContextMenuNotificationObserver.
19492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
19502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Confirm that context menu shows and click REMOVE menu.
19522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Step3() {
19532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Make sure the context menu is showing.
19542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetContextMenu();
19552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(menu != NULL);
19562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu());
19572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
19582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::MenuItemView* delete_menu =
19602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        menu->GetMenuItemByID(IDC_BOOKMARK_BAR_REMOVE);
19612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(delete_menu);
19622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Click on the delete menu item.
19642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(delete_menu,
19652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ui_controls::LEFT, ui_controls::DOWN | ui_controls::UP,
19662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest21::Step4));
19672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
19682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Confirm that the empty folder gets removed and menu doesn't show.
19702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Step4() {
1971f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = GetBookmarkButton(5);
19722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(button);
1973f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("d"), button->GetText());
19742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(bb_view_->GetContextMenu() == NULL);
19752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(bb_view_->GetMenu() == NULL);
19762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Done();
19782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
19792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BookmarkContextMenuNotificationObserver observer_;
19812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
19822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)VIEW_TEST(BookmarkBarViewTest21, ContextMenusForEmptyFolder)
1984