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"
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/aura/env.h"
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/aura/env_observer.h"
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/aura/window.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/clipboard/clipboard.h"
40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/base/test/ui_controls.h"
41d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/keycodes/keyboard_codes.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/button/menu_button.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/menu/menu_controller.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/menu/menu_item_view.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/menu/submenu_view.h"
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::ASCIIToUTF16;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::OpenURLParams;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::PageNavigator;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Waits for a views::Widget dialog to show up.
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class DialogWaiter : public aura::EnvObserver,
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                     public views::WidgetObserver {
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DialogWaiter()
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      : dialog_created_(false),
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        dialog_(NULL) {
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    aura::Env::GetInstance()->AddObserver(this);
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual ~DialogWaiter() {
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    aura::Env::GetInstance()->RemoveObserver(this);
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  views::Widget* WaitForDialog() {
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (dialog_created_)
72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return dialog_;
73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    base::MessageLoopForUI* loop = base::MessageLoopForUI::current();
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    base::MessageLoopForUI::ScopedNestableTaskAllower allow_nested(loop);
75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    base::RunLoop run_loop;
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    quit_closure_ = run_loop.QuitClosure();
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    run_loop.Run();
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return dialog_;
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private:
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // aura::EnvObserver:
83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnWindowInitialized(aura::Window* window) OVERRIDE {
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (dialog_)
85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return;
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    views::Widget* widget = views::Widget::GetWidgetForNativeView(window);
87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (!widget || !widget->IsDialogBox())
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return;
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    dialog_ = widget;
90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    dialog_->AddObserver(this);
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // views::WidgetObserver:
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnWidgetVisibilityChanged(views::Widget* widget,
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                         bool visible) OVERRIDE {
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    CHECK_EQ(dialog_, widget);
97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (visible) {
98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      dialog_created_ = true;
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      dialog_->RemoveObserver(this);
100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      if (!quit_closure_.is_null())
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        quit_closure_.Run();
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool dialog_created_;
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  views::Widget* dialog_;
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::Closure quit_closure_;
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DialogWaiter);
110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Waits for a dialog to terminate.
113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class DialogCloseWaiter : public views::WidgetObserver {
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  explicit DialogCloseWaiter(views::Widget* dialog)
116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      : dialog_closed_(false) {
117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    dialog->AddObserver(this);
118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual ~DialogCloseWaiter() {
121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // It is not necessary to remove |this| from the dialog's observer, since
122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // the dialog is destroyed before this waiter.
123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void WaitForDialogClose() {
126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (dialog_closed_)
127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return;
128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    base::MessageLoopForUI* loop = base::MessageLoopForUI::current();
129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    base::MessageLoopForUI::ScopedNestableTaskAllower allow_nested(loop);
130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    base::RunLoop run_loop;
131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    quit_closure_ = run_loop.QuitClosure();
132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    run_loop.Run();
133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private:
136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // views::WidgetObserver:
137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnWidgetDestroyed(views::Widget* widget) OVERRIDE {
138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    dialog_closed_ = true;
139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (!quit_closure_.is_null())
140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      quit_closure_.Run();
141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool dialog_closed_;
144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::Closure quit_closure_;
145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DialogCloseWaiter);
147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Waits for a views::Widget to receive a Tab key.
150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class TabKeyWaiter : public ui::EventHandler {
151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  explicit TabKeyWaiter(views::Widget* widget)
153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      : widget_(widget),
154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        received_tab_(false) {
155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    widget_->GetNativeView()->AddPreTargetHandler(this);
156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual ~TabKeyWaiter() {
159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    widget_->GetNativeView()->RemovePreTargetHandler(this);
160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void WaitForTab() {
163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (received_tab_)
164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return;
165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    base::MessageLoopForUI* loop = base::MessageLoopForUI::current();
166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    base::MessageLoopForUI::ScopedNestableTaskAllower allow_nested(loop);
167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    base::RunLoop run_loop;
168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    quit_closure_ = run_loop.QuitClosure();
169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    run_loop.Run();
170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private:
173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // ui::EventHandler:
174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnKeyEvent(ui::KeyEvent* event) OVERRIDE {
175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (event->type() == ui::ET_KEY_RELEASED &&
176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        event->key_code() == ui::VKEY_TAB) {
177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      received_tab_ = true;
178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      if (!quit_closure_.is_null())
179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        quit_closure_.Run();
180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  views::Widget* widget_;
184cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool received_tab_;
185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::Closure quit_closure_;
186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TabKeyWaiter);
188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MoveMouseAndPress(const gfx::Point& screen_pos,
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       ui_controls::MouseButton button,
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       int state,
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const base::Closure& closure) {
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_controls::SendMouseMove(screen_pos.x(), screen_pos.y());
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_controls::SendMouseEventsNotifyWhenDone(button, state, closure);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PageNavigator implementation that records the URL.
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestingPageNavigator : public PageNavigator {
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual WebContents* OpenURL(const OpenURLParams& params) OVERRIDE {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url_ = params.url;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url_;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// TODO(erg): Fix bookmark DND tests on linux_aura. crbug.com/163931
210a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(OS_LINUX) && defined(USE_AURA)
21190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define MAYBE(x) DISABLED_##x
21290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#else
21390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define MAYBE(x) x
21490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif
21590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Base class for event generating bookmark view tests. These test are intended
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to exercise View's menus, but that's easier done with BookmarkBarView rather
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// than View's menu itself.
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SetUp creates a bookmark model with the following structure.
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// All folders are in upper case, all URLs in lower case.
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// F1
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   f1a
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   F11
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     f11a
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   *
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// b
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// c
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// d
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// F2
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// e
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OTHER
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   oa
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   OF
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     ofa
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     ofb
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   OF2
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     of2a
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     of2b
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * if CreateBigMenu returns return true, 100 menu items are created here with
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   the names f1-f100.
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Subclasses should be sure and invoke super's implementation of SetUp and
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TearDown.
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkBarViewEventTestBase : public ViewEventTestBase {
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkBarViewEventTestBase()
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : ViewEventTestBase(),
253a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch        model_(NULL) {}
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp() OVERRIDE {
25623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    content_client_.reset(new ChromeContentClient);
25723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    content::SetContentClient(content_client_.get());
25823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    browser_content_client_.reset(new chrome::ChromeContentBrowserClient());
25923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    content::SetBrowserClientForTesting(browser_content_client_.get());
26023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
261424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    views::MenuController::TurnOffMenuSelectionHoldForTest();
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BookmarkBarView::DisableAnimationsForTesting(true);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile_.reset(new TestingProfile());
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile_->CreateBookmarkModel(true);
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    model_ = BookmarkModelFactory::GetForProfile(profile_.get());
26758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    test::WaitForBookmarkModelToLoad(model_);
2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    profile_->GetPrefs()->SetBoolean(bookmarks::prefs::kShowBookmarkBar, true);
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Browser::CreateParams native_params(profile_.get(),
271eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                        chrome::GetActiveDesktop());
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser_.reset(
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        chrome::CreateBrowserWithTestWindowForParams(&native_params));
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    local_state_.reset(new ScopedTestingLocalState(
276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        TestingBrowserProcess::GetGlobal()));
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model_->ClearStore();
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bb_view_.reset(new BookmarkBarView(browser_.get(), NULL));
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bb_view_->set_owned_by_client();
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bb_view_->SetPageNavigator(&navigator_);
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddTestData(CreateBigMenu());
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Calculate the preferred size so that one button doesn't fit, which
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // triggers the overflow button to appear.
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // BookmarkBarView::Layout does nothing if the parent is NULL and
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // GetPreferredSize hard codes a width of 1. For that reason we add the
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // BookmarkBarView to a dumby view as the parent.
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This code looks a bit hacky, but I've written it so that it shouldn't
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // be dependant upon any of the layout code in BookmarkBarView. Instead
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // we brute force search for a size that triggers the overflow button.
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::View tmp_parent;
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tmp_parent.AddChildView(bb_view_.get());
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bb_view_pref_ = bb_view_->GetPreferredSize();
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bb_view_pref_.set_width(1000);
301f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = GetBookmarkButton(6);
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (button->visible()) {
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bb_view_pref_.set_width(bb_view_pref_.width() - 25);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bb_view_->SetBounds(0, 0, bb_view_pref_.width(), bb_view_pref_.height());
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bb_view_->Layout();
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tmp_parent.RemoveChildView(bb_view_.get());
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ViewEventTestBase::SetUp();
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() {
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Destroy everything, then run the message loop to ensure we delete all
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Tasks and fully shut down.
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    browser_->tab_strip_model()->CloseAllTabs();
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bb_view_.reset();
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser_.reset();
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile_.reset();
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Run the message loop to ensure we delete allTasks and fully shut down.
322cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    base::MessageLoopForUI* loop = base::MessageLoopForUI::current();
323cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    base::MessageLoopForUI::ScopedNestableTaskAllower allow_nested(loop);
324cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    base::RunLoop run_loop;
325cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    loop->PostTask(FROM_HERE, run_loop.QuitClosure());
326cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    run_loop.Run();
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ViewEventTestBase::TearDown();
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BookmarkBarView::DisableAnimationsForTesting(false);
33023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
33123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    browser_content_client_.reset();
33223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    content_client_.reset();
33323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    content::SetContentClient(NULL);
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual views::View* CreateContentsView() OVERRIDE {
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return bb_view_.get();
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
341cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual gfx::Size GetPreferredSize() const OVERRIDE { return bb_view_pref_; }
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
343f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  views::LabelButton* GetBookmarkButton(int view_index) {
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return bb_view_->GetBookmarkButton(view_index);
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See comment above class description for what this does.
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool CreateBigMenu() { return false; }
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkModel* model_;
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<BookmarkBarView> bb_view_;
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestingPageNavigator navigator_;
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddTestData(bool big_menu) {
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const BookmarkNode* bb_node = model_->bookmark_bar_node();
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string test_base = "file:///c:/tmp/";
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const BookmarkNode* f1 = model_->AddFolder(bb_node, 0, ASCIIToUTF16("F1"));
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model_->AddURL(f1, 0, ASCIIToUTF16("f1a"), GURL(test_base + "f1a"));
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const BookmarkNode* f11 = model_->AddFolder(f1, 1, ASCIIToUTF16("F11"));
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model_->AddURL(f11, 0, ASCIIToUTF16("f11a"), GURL(test_base + "f11a"));
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (big_menu) {
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (int i = 1; i <= 100; ++i) {
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        model_->AddURL(f1, i + 1, ASCIIToUTF16("f") + base::IntToString16(i),
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       GURL(test_base + "f" + base::IntToString(i)));
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model_->AddURL(bb_node, 1, ASCIIToUTF16("a"), GURL(test_base + "a"));
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model_->AddURL(bb_node, 2, ASCIIToUTF16("b"), GURL(test_base + "b"));
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model_->AddURL(bb_node, 3, ASCIIToUTF16("c"), GURL(test_base + "c"));
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model_->AddURL(bb_node, 4, ASCIIToUTF16("d"), GURL(test_base + "d"));
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    model_->AddFolder(bb_node, 5, ASCIIToUTF16("F2"));
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    model_->AddURL(bb_node, 6, ASCIIToUTF16("d"), GURL(test_base + "d"));
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model_->AddURL(model_->other_node(), 0, ASCIIToUTF16("oa"),
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   GURL(test_base + "oa"));
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const BookmarkNode* of = model_->AddFolder(model_->other_node(), 1,
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               ASCIIToUTF16("OF"));
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model_->AddURL(of, 0, ASCIIToUTF16("ofa"), GURL(test_base + "ofa"));
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model_->AddURL(of, 1, ASCIIToUTF16("ofb"), GURL(test_base + "ofb"));
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const BookmarkNode* of2 = model_->AddFolder(model_->other_node(), 2,
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                ASCIIToUTF16("OF2"));
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model_->AddURL(of2, 0, ASCIIToUTF16("of2a"), GURL(test_base + "of2a"));
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model_->AddURL(of2, 1, ASCIIToUTF16("of2b"), GURL(test_base + "of2b"));
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size bb_view_pref_;
38823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<ChromeContentClient> content_client_;
38923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<chrome::ChromeContentBrowserClient> browser_content_client_;
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestingProfile> profile_;
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Browser> browser_;
392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<ScopedTestingLocalState> local_state_;
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Clicks on first menu, makes sure button is depressed. Moves mouse to first
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// child, clicks it and makes sure a navigation occurs.
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkBarViewTest1 : public BookmarkBarViewEventTestBase {
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DoTestOnMessageLoop() OVERRIDE {
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move the mouse to the first folder on the bookmark bar and press the
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // mouse.
402f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = GetBookmarkButton(0);
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest1::Step2));
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step2() {
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Menu should be showing.
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Button should be depressed.
416f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = GetBookmarkButton(0);
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(button->state() == views::CustomButton::STATE_PRESSED);
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Click on the 2nd menu item (A URL).
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu());
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu_to_select =
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        menu->GetSubmenu()->GetMenuItemAt(0);
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(menu_to_select, ui_controls::LEFT,
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest1::Step3));
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step3() {
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We should have navigated to URL f1a.
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(navigator_.url_ ==
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                model_->bookmark_bar_node()->GetChild(0)->GetChild(0)->url());
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure button is no longer pushed.
435f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = GetBookmarkButton(0);
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(button->state() == views::CustomButton::STATE_NORMAL);
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu == NULL || !menu->GetSubmenu()->IsShowing());
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Done();
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)VIEW_TEST(BookmarkBarViewTest1, Basic)
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Brings up menu, clicks on empty space and make sure menu hides.
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkBarViewTest2 : public BookmarkBarViewEventTestBase {
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DoTestOnMessageLoop() OVERRIDE {
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move the mouse to the first folder on the bookmark bar and press the
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // mouse.
453f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = GetBookmarkButton(0);
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest2::Step2));
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step2() {
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Menu should be showing.
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL && menu->GetSubmenu()->IsShowing());
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Click on 0x0, which should trigger closing menu.
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // NOTE: this code assume there is a left margin, which is currently
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // true. If that changes, this code will need to find another empty space
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // to press the mouse on.
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Point mouse_loc;
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::View::ConvertPointToScreen(bb_view_.get(), &mouse_loc);
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui_controls::SendMouseMoveNotifyWhenDone(0, 0,
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest2::Step3));
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step3() {
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // As the click is on the desktop the hook never sees the up, so we only
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // wait on the down. We still send the up though else the system thinks
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // the mouse is still down.
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui_controls::SendMouseEventsNotifyWhenDone(
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ui_controls::LEFT, ui_controls::DOWN,
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest2::Step4));
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui_controls::SendMouseEvents(ui_controls::LEFT, ui_controls::UP);
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Step4() {
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The menu shouldn't be showing.
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu == NULL || !menu->GetSubmenu()->IsShowing());
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure button is no longer pushed.
491f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = GetBookmarkButton(0);
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(button->state() == views::CustomButton::STATE_NORMAL);
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Done();
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA)
4991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// TODO(erg): linux_aura bringup: http://crbug.com/163931
5001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define MAYBE_HideOnDesktopClick DISABLED_HideOnDesktopClick
5011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#else
5021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define MAYBE_HideOnDesktopClick HideOnDesktopClick
5031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif
5041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)VIEW_TEST(BookmarkBarViewTest2, MAYBE_HideOnDesktopClick)
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Brings up menu. Moves over child to make sure submenu appears, moves over
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// another child and make sure next menu appears.
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkBarViewTest3 : public BookmarkBarViewEventTestBase {
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DoTestOnMessageLoop() OVERRIDE {
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move the mouse to the first folder on the bookmark bar and press the
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // mouse.
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuButton* button = bb_view_->other_bookmarked_button();
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest3::Step2));
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step2() {
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Menu should be showing.
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* child_menu =
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        menu->GetSubmenu()->GetMenuItemAt(1);
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(child_menu != NULL);
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Click on second child, which has a submenu.
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(child_menu, ui_controls::LEFT,
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest3::Step3));
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step3() {
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure sub menu is showing.
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu);
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* child_menu =
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        menu->GetSubmenu()->GetMenuItemAt(1);
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(child_menu->GetSubmenu() != NULL);
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(child_menu->GetSubmenu()->IsShowing());
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Click on third child, which has a submenu too.
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child_menu = menu->GetSubmenu()->GetMenuItemAt(2);
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(child_menu != NULL);
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(child_menu, ui_controls::LEFT,
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest3::Step4));
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step4() {
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure sub menu we first clicked isn't showing.
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* child_menu =
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        menu->GetSubmenu()->GetMenuItemAt(1);
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(child_menu->GetSubmenu() != NULL);
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(child_menu->GetSubmenu()->IsShowing());
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // And submenu we last clicked is showing.
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child_menu = menu->GetSubmenu()->GetMenuItemAt(2);
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(child_menu != NULL);
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(child_menu->GetSubmenu()->IsShowing());
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Nothing should have been selected.
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(GURL(), navigator_.url_);
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Hide menu.
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    menu->GetMenuController()->CancelAll();
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Done();
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)VIEW_TEST(BookmarkBarViewTest3, Submenus)
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Observer that posts task upon the context menu creation.
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is necessary for Linux as the context menu has to check
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the clipboard, which invokes the event loop.
5825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class BookmarkContextMenuNotificationObserver
5835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : public content::NotificationObserver {
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
5855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  explicit BookmarkContextMenuNotificationObserver(const base::Closure& task)
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : task_(task) {
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    registrar_.Add(this,
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   chrome::NOTIFICATION_BOOKMARK_CONTEXT_MENU_SHOWN,
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   content::NotificationService::AllSources());
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Observe(int type,
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const content::NotificationSource& source,
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       const content::NotificationDetails& details) OVERRIDE {
595b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    base::MessageLoop::current()->PostTask(FROM_HERE, task_);
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the task that is posted when the context menu is shown.
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_task(const base::Closure& task) { task_ = task; }
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationRegistrar registrar_;
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Closure task_;
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BookmarkContextMenuNotificationObserver);
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests context menus by way of opening a context menu for a bookmark,
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// then right clicking to get context menu and selecting the first menu item
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (open).
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkBarViewTest4 : public BookmarkBarViewEventTestBase {
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkBarViewTest4()
614c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : observer_(CreateEventTask(this, &BookmarkBarViewTest4::Step3)) {
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DoTestOnMessageLoop() OVERRIDE {
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move the mouse to the first folder on the bookmark bar and press the
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // mouse.
621f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = bb_view_->other_bookmarked_button();
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest4::Step2));
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step2() {
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Menu should be showing.
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* child_menu =
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        menu->GetSubmenu()->GetMenuItemAt(0);
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(child_menu != NULL);
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Right click on the first child to get its context menu.
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(child_menu, ui_controls::RIGHT,
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP, base::Closure());
6415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Step3 will be invoked by BookmarkContextMenuNotificationObserver.
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step3() {
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure the context menu is showing.
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetContextMenu();
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu());
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Select the first menu item (open).
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        menu->GetSubmenu()->GetMenuItemAt(0),
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::LEFT, ui_controls::DOWN | ui_controls::UP,
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest4::Step4));
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step4() {
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(navigator_.url_, model_->other_node()->GetChild(0)->url());
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Done();
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BookmarkContextMenuNotificationObserver observer_;
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)VIEW_TEST(BookmarkBarViewTest4, ContextMenus)
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests drag and drop within the same menu.
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkBarViewTest5 : public BookmarkBarViewEventTestBase {
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DoTestOnMessageLoop() OVERRIDE {
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url_dragging_ =
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        model_->bookmark_bar_node()->GetChild(0)->GetChild(0)->url();
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move the mouse to the first folder on the bookmark bar and press the
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // mouse.
677f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = GetBookmarkButton(0);
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest5::Step2));
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step2() {
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Menu should be showing.
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* child_menu =
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        menu->GetSubmenu()->GetMenuItemAt(0);
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(child_menu != NULL);
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move mouse to center of menu and press button.
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(child_menu, ui_controls::LEFT,
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN,
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest5::Step3));
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step3() {
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* target_menu =
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        bb_view_->GetMenu()->GetSubmenu()->GetMenuItemAt(1);
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Point loc(1, target_menu->height() - 1);
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::View::ConvertPointToScreen(target_menu, &loc);
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Start a drag.
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_controls::SendMouseMoveNotifyWhenDone(loc.x() + 10, loc.y(),
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest5::Step4));
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // See comment above this method as to why we do this.
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ScheduleMouseMoveInBackground(loc.x(), loc.y());
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step4() {
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Drop the item so that it's now the second item.
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* target_menu =
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        bb_view_->GetMenu()->GetSubmenu()->GetMenuItemAt(1);
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Point loc(1, target_menu->height() - 2);
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::View::ConvertPointToScreen(target_menu, &loc);
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_controls::SendMouseMove(loc.x(), loc.y());
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_controls::SendMouseEventsNotifyWhenDone(ui_controls::LEFT,
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::UP,
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest5::Step5));
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step5() {
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url = model_->bookmark_bar_node()->GetChild(0)->GetChild(1)->url();
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(url_dragging_, url);
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Done();
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url_dragging_;
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#if !defined(OS_WIN)  // flaky http://crbug.com/400578
73790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)VIEW_TEST(BookmarkBarViewTest5, MAYBE(DND))
7386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif
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)
11616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#if defined(USE_OZONE)
11626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// ozone bringup - http://crbug.com/401304
11636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define MAYBE_KeyEvents DISABLED_KeyEvents
11646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#else
11656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define MAYBE_KeyEvents KeyEvents
11666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif
11676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
11686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)VIEW_TEST(BookmarkBarViewTest10, MAYBE_KeyEvents)
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure the menu closes with the following sequence: show menu, show
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// context menu, close context menu (via escape), then click else where. This
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// effectively verifies we maintain mouse capture after the context menu is
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// hidden.
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkBarViewTest11 : public BookmarkBarViewEventTestBase {
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkBarViewTest11()
1177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : observer_(CreateEventTask(this, &BookmarkBarViewTest11::Step3)) {
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
11812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DoTestOnMessageLoop() OVERRIDE {
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move the mouse to the first folder on the bookmark bar and press the
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // mouse.
1184f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = bb_view_->other_bookmarked_button();
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest11::Step2));
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step2() {
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Menu should be showing.
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* child_menu =
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        menu->GetSubmenu()->GetMenuItemAt(0);
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(child_menu != NULL);
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Right click on the first child to get its context menu.
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(child_menu, ui_controls::RIGHT,
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP, base::Closure());
12045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Step3 will be invoked by BookmarkContextMenuNotificationObserver.
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step3() {
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Send escape so that the context menu hides.
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_controls::SendKeyPressNotifyWhenDone(
12102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        window_->GetNativeWindow(), ui::VKEY_ESCAPE, false, false, false, false,
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest11::Step4));
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step4() {
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure the context menu is no longer showing.
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetContextMenu();
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(!menu || !menu->GetSubmenu() ||
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                !menu->GetSubmenu()->IsShowing());
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // But the menu should be showing.
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    menu = bb_view_->GetMenu();
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu && menu->GetSubmenu() && menu->GetSubmenu()->IsShowing());
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Now click on empty space.
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Point mouse_loc;
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::View::ConvertPointToScreen(bb_view_.get(), &mouse_loc);
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_controls::SendMouseMove(mouse_loc.x(), mouse_loc.y());
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_controls::SendMouseEventsNotifyWhenDone(
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::LEFT, ui_controls::UP | ui_controls::DOWN,
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest11::Step5));
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step5() {
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure the menu is not showing.
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(!menu || !menu->GetSubmenu() ||
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                !menu->GetSubmenu()->IsShowing());
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Done();
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BookmarkContextMenuNotificationObserver observer_;
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA)
12451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// TODO(erg): linux_aura bringup: http://crbug.com/163931
12461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define MAYBE_CloseMenuAfterClosingContextMenu \
12471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DISABLED_CloseMenuAfterClosingContextMenu
12486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#elif defined(USE_OZONE)
12496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// ozone bringup - http://crbug.com/401304
12506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define MAYBE_CloseMenuAfterClosingContextMenu \
12516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DISABLED_CloseMenuAfterClosingContextMenu
12521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#else
12531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define MAYBE_CloseMenuAfterClosingContextMenu CloseMenuAfterClosingContextMenu
12541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif
12551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
12561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)VIEW_TEST(BookmarkBarViewTest11, MAYBE_CloseMenuAfterClosingContextMenu)
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests showing a modal dialog from a context menu.
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkBarViewTest12 : public BookmarkBarViewEventTestBase {
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DoTestOnMessageLoop() OVERRIDE {
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Open up the other folder.
1263f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = bb_view_->other_bookmarked_button();
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest12::Step2));
12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    chrome::num_bookmark_urls_before_prompting = 1;
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~BookmarkBarViewTest12() {
12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    chrome::num_bookmark_urls_before_prompting = 15;
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step2() {
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Menu should be showing.
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* child_menu =
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        menu->GetSubmenu()->GetMenuItemAt(1);
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(child_menu != NULL);
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Right click on the second child (a folder) to get its context menu.
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(child_menu, ui_controls::RIGHT,
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest12::Step3));
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step3() {
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure the context menu is showing.
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetContextMenu();
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu && menu->GetSubmenu() && menu->GetSubmenu()->IsShowing());
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Select the first item in the context menu (open all).
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* child_menu =
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        menu->GetSubmenu()->GetMenuItemAt(0);
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(child_menu != NULL);
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1301cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Click and wait until the dialog box appears.
1302cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    scoped_ptr<DialogWaiter> dialog_waiter(new DialogWaiter());
1303cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(
1304cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        child_menu,
1305cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        ui_controls::LEFT,
1306cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
1307cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        base::Bind(
1308cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            &BookmarkBarViewTest12::Step4, this, base::Passed(&dialog_waiter)));
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1311cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void Step4(scoped_ptr<DialogWaiter> waiter) {
1312cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    views::Widget* dialog = waiter->WaitForDialog();
1313cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    waiter.reset();
1314cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1315cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Press tab to give focus to the cancel button. Wait until the widget
1316cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // receives the tab key.
1317cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    TabKeyWaiter tab_waiter(dialog);
13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui_controls::SendKeyPress(
13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        window_->GetNativeWindow(), ui::VKEY_TAB, false, false, false, false);
1320cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    tab_waiter.WaitForTab();
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // For some reason return isn't processed correctly unless we delay.
1323b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    base::MessageLoop::current()->PostDelayedTask(
1324b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        FROM_HERE,
1325cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        base::Bind(
1326cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            &BookmarkBarViewTest12::Step5, this, base::Unretained(dialog)),
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::TimeDelta::FromSeconds(1));
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1330cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void Step5(views::Widget* dialog) {
1331cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DialogCloseWaiter waiter(dialog);
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // And press enter so that the cancel button is selected.
1333cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ui_controls::SendKeyPressNotifyWhenDone(window_->GetNativeWindow(),
1334cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                            ui::VKEY_RETURN,
1335cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                            false,
1336cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                            false,
1337cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                            false,
1338cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                            false,
1339cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                            base::Closure());
1340cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    waiter.WaitForDialogClose();
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Done();
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA)
13461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// TODO(erg): linux_aura bringup: http://crbug.com/163931
13471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define MAYBE_CloseWithModalDialog DISABLED_CloseWithModalDialog
13481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#else
13491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define MAYBE_CloseWithModalDialog CloseWithModalDialog
13501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif
13511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
13521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)VIEW_TEST(BookmarkBarViewTest12, MAYBE_CloseWithModalDialog)
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests clicking on the separator of a context menu (this is for coverage of
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bug 17862).
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkBarViewTest13 : public BookmarkBarViewEventTestBase {
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkBarViewTest13()
1359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : observer_(CreateEventTask(this, &BookmarkBarViewTest13::Step3)) {
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
13632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DoTestOnMessageLoop() OVERRIDE {
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move the mouse to the first folder on the bookmark bar and press the
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // mouse.
1366f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = bb_view_->other_bookmarked_button();
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest13::Step2));
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step2() {
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Menu should be showing.
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* child_menu =
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        menu->GetSubmenu()->GetMenuItemAt(0);
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(child_menu != NULL);
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Right click on the first child to get its context menu.
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(child_menu, ui_controls::RIGHT,
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP, base::Closure());
13865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Step3 will be invoked by BookmarkContextMenuNotificationObserver.
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step3() {
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure the context menu is showing.
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetContextMenu();
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu());
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Find the first separator.
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::SubmenuView* submenu = menu->GetSubmenu();
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::View* separator_view = NULL;
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int i = 0; i < submenu->child_count(); ++i) {
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (submenu->child_at(i)->id() != views::MenuItemView::kMenuItemViewID) {
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        separator_view = submenu->child_at(i);
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(separator_view);
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Click on the separator. Clicking on the separator shouldn't visually
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // change anything.
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(separator_view,
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::LEFT, ui_controls::DOWN | ui_controls::UP,
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest13::Step4));
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step4() {
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The context menu should still be showing.
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetContextMenu();
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu());
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Select the first context menu item.
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        menu->GetSubmenu()->GetMenuItemAt(0),
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::LEFT,
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest13::Step5));
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step5() {
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Done();
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BookmarkContextMenuNotificationObserver observer_;
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)VIEW_TEST(BookmarkBarViewTest13, ClickOnContextMenuSeparator)
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure right clicking on a folder on the bookmark bar doesn't result in
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// both a context menu and showing the menu.
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkBarViewTest14 : public BookmarkBarViewEventTestBase {
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkBarViewTest14()
1443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : observer_(CreateEventTask(this, &BookmarkBarViewTest14::Step2)) {
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
14472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DoTestOnMessageLoop() OVERRIDE {
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move the mouse to the first folder on the bookmark bar and press the
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // right mouse button.
1450f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = GetBookmarkButton(0);
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(button, ui_controls::RIGHT,
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP, base::Closure());
14535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Step2 will be invoked by BookmarkContextMenuNotificationObserver.
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step2() {
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Menu should NOT be showing.
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu == NULL);
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Send escape so that the context menu hides.
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_controls::SendKeyPressNotifyWhenDone(
14652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        window_->GetNativeWindow(), ui::VKEY_ESCAPE, false, false, false, false,
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest14::Step3));
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step3() {
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Done();
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BookmarkContextMenuNotificationObserver observer_;
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#if defined(USE_OZONE)
14776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// ozone bringup - http://crbug.com/401304
14786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define MAYBE_ContextMenus2 DISABLED_ContextMenus2
14796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#else
14806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define MAYBE_ContextMenus2 ContextMenus2
14816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif
14826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
14836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)VIEW_TEST(BookmarkBarViewTest14, MAYBE_ContextMenus2)
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure deleting from the context menu keeps the bookmark menu showing.
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkBarViewTest15 : public BookmarkBarViewEventTestBase {
14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkBarViewTest15()
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : deleted_menu_id_(0),
1490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        observer_(CreateEventTask(this, &BookmarkBarViewTest15::Step3)) {
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
14942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DoTestOnMessageLoop() OVERRIDE {
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Show the other bookmarks.
1496f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = bb_view_->other_bookmarked_button();
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest15::Step2));
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step2() {
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Menu should be showing.
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* child_menu =
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        menu->GetSubmenu()->GetMenuItemAt(1);
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(child_menu != NULL);
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    deleted_menu_id_ = child_menu->GetCommand();
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Right click on the second child to get its context menu.
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(child_menu, ui_controls::RIGHT,
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP, base::Closure());
15185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Step3 will be invoked by BookmarkContextMenuNotificationObserver.
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step3() {
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure the context menu is showing.
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetContextMenu();
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu());
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* delete_menu =
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        menu->GetMenuItemByID(IDC_BOOKMARK_BAR_REMOVE);
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(delete_menu);
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Click on the delete button.
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(delete_menu,
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::LEFT, ui_controls::DOWN | ui_controls::UP,
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest15::Step4));
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step4() {
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The context menu should not be showing.
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* context_menu = bb_view_->GetContextMenu();
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(context_menu == NULL);
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // But the menu should be showing.
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // And the deleted_menu_id_ should have been removed.
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetMenuItemByID(deleted_menu_id_) == NULL);
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bb_view_->GetMenu()->GetMenuController()->CancelAll();
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Done();
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int deleted_menu_id_;
15575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BookmarkContextMenuNotificationObserver observer_;
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)VIEW_TEST(BookmarkBarViewTest15, MenuStaysVisibleAfterDelete)
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we don't crash or get stuck if the parent of a menu is closed.
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkBarViewTest16 : public BookmarkBarViewEventTestBase {
15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
15652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DoTestOnMessageLoop() OVERRIDE {
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move the mouse to the first folder on the bookmark bar and press the
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // mouse.
1568f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = GetBookmarkButton(0);
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest16::Step2));
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step2() {
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Menu should be showing.
15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Button should be depressed.
1582f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = GetBookmarkButton(0);
15832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(button->state() == views::CustomButton::STATE_PRESSED);
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Close the window.
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window_->Close();
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window_ = NULL;
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1589b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    base::MessageLoop::current()->PostTask(
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FROM_HERE, CreateEventTask(this, &BookmarkBarViewTest16::Done));
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
15951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// TODO(erg): linux_aura bringup: http://crbug.com/163931
15961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define MAYBE_DeleteMenu DISABLED_DeleteMenu
15971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#else
15981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define MAYBE_DeleteMenu DeleteMenu
15991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif
16001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
16011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)VIEW_TEST(BookmarkBarViewTest16, MAYBE_DeleteMenu)
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure right clicking on an item while a context menu is already showing
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// doesn't crash and works.
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkBarViewTest17 : public BookmarkBarViewEventTestBase {
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkBarViewTest17()
1608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : observer_(CreateEventTask(this, &BookmarkBarViewTest17::Step3)) {
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
16122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DoTestOnMessageLoop() OVERRIDE {
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move the mouse to the other folder on the bookmark bar and press the
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // left mouse button.
1615f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = bb_view_->other_bookmarked_button();
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest17::Step2));
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step2() {
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Menu should be showing.
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Right click on the second item to show its context menu.
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* child_menu = menu->GetSubmenu()->GetMenuItemAt(2);
16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(child_menu != NULL);
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(child_menu, ui_controls::RIGHT,
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP, base::Closure());
16335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Step3 will be invoked by BookmarkContextMenuNotificationObserver.
16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step3() {
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure the context menu is showing.
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* context_menu = bb_view_->GetContextMenu();
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(context_menu != NULL);
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(context_menu->GetSubmenu());
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(context_menu->GetSubmenu()->IsShowing());
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Right click on the first menu item to trigger its context menu.
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* child_menu = menu->GetSubmenu()->GetMenuItemAt(1);
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(child_menu != NULL);
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The context menu and child_menu can be overlapped, calculate the
16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // non-intersected Rect of the child menu and click on its center to make
16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // sure the click is always on the child menu.
16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect context_rect = context_menu->GetSubmenu()->GetBoundsInScreen();
16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect child_menu_rect = child_menu->GetBoundsInScreen();
16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect clickable_rect =
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        gfx::SubtractRects(child_menu_rect, context_rect);
16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(clickable_rect.IsEmpty());
16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer_.set_task(CreateEventTask(this, &BookmarkBarViewTest17::Step4));
16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MoveMouseAndPress(clickable_rect.CenterPoint(), ui_controls::RIGHT,
16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP, base::Closure());
16615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Step4 will be invoked by BookmarkContextMenuNotificationObserver.
16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step4() {
16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The context menu should still be showing.
16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* context_menu = bb_view_->GetContextMenu();
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(context_menu != NULL);
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // And the menu should be showing.
16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bb_view_->GetMenu()->GetMenuController()->CancelAll();
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Done();
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BookmarkContextMenuNotificationObserver observer_;
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA)
16831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// TODO(erg): linux_aura bringup: http://crbug.com/163931
16841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define MAYBE_ContextMenus3 DISABLED_ContextMenus3
16856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#elif defined(USE_OZONE)
16866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// ozone bringup - http://crbug.com/401304
16876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define MAYBE_ContextMenus3 DISABLED_ContextMenus3
16886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#elif defined(OS_WIN)  // http://crbug.com/128961
16896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define MAYBE_ContextMenus3 DISABLED_ContextMenus3
16901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#else
16911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define MAYBE_ContextMenus3 ContextMenus3
16921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif
16931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
16941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)VIEW_TEST(BookmarkBarViewTest17, MAYBE_ContextMenus3)
16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies sibling menus works. Clicks on the 'other bookmarks' folder, then
16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// moves the mouse over the first item on the bookmark bar and makes sure the
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// menu appears.
16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkBarViewTest18 : public BookmarkBarViewEventTestBase {
17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
17012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DoTestOnMessageLoop() OVERRIDE {
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move the mouse to the other folder on the bookmark bar and press the
17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // left mouse button.
1704f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = bb_view_->other_bookmarked_button();
17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest18::Step2));
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step2() {
17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Menu should be showing.
17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move the mouse to the first folder on the bookmark bar
1718f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = GetBookmarkButton(0);
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Point button_center(button->width() / 2, button->height() / 2);
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::View::ConvertPointToScreen(button, &button_center);
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_controls::SendMouseMoveNotifyWhenDone(
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        button_center.x(), button_center.y(),
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest18::Step3));
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step3() {
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure the menu is showing.
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The menu for the first folder should be in the pressed state (since the
17332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // menu is showing for it).
17342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(views::CustomButton::STATE_PRESSED,
17352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              GetBookmarkButton(0)->state());
17362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    menu->GetMenuController()->CancelAll();
17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Done();
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
17441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// TODO(erg): linux_aura bringup: http://crbug.com/163931
17451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define MAYBE_BookmarkBarViewTest18_SiblingMenu \
17461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DISABLED_BookmarkBarViewTest18_SiblingMenu
17471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#else
17481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define MAYBE_BookmarkBarViewTest18_SiblingMenu \
17491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  BookmarkBarViewTest18_SiblingMenu
17501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif
17511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
17521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)VIEW_TEST(BookmarkBarViewTest18, MAYBE_BookmarkBarViewTest18_SiblingMenu)
17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies mousing over an already open sibling menu doesn't prematurely cancel
17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the menu.
17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkBarViewTest19 : public BookmarkBarViewEventTestBase {
17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
17582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DoTestOnMessageLoop() OVERRIDE {
17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move the mouse to the other folder on the bookmark bar and press the
17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // left mouse button.
1761f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = bb_view_->other_bookmarked_button();
17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest19::Step2));
17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step2() {
17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Menu should be showing.
17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Click on the first folder.
17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* child_menu = menu->GetSubmenu()->GetMenuItemAt(1);
17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(child_menu != NULL);
17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(
17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        child_menu, ui_controls::LEFT,
17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest19::Step3));
17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step3() {
17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure the menu is showing.
17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move the mouse back to the other bookmark button.
1790f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = bb_view_->other_bookmarked_button();
17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Point button_center(button->width() / 2, button->height() / 2);
17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::View::ConvertPointToScreen(button, &button_center);
17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_controls::SendMouseMoveNotifyWhenDone(
17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        button_center.x() + 1, button_center.y() + 1,
17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest19::Step4));
17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step4() {
17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Menu should be showing.
18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Click on the first folder.
18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* child_menu = menu->GetSubmenu()->GetMenuItemAt(1);
18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(child_menu != NULL);
18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(
18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        child_menu,
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::LEFT,
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest19::Step5));
18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step5() {
18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure the menu is showing.
18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu != NULL);
18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    menu->GetMenuController()->CancelAll();
18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Done();
18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)VIEW_TEST(BookmarkBarViewTest19, BookmarkBarViewTest19_SiblingMenu)
18272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verify that when clicking a mouse button outside a context menu,
18292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the context menu is dismissed *and* the underlying view receives
18302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the the mouse event (due to event reposting).
18312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class BookmarkBarViewTest20 : public BookmarkBarViewEventTestBase {
18322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
18332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BookmarkBarViewTest20() : test_view_(new TestViewForMenuExit) {}
18342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
18362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DoTestOnMessageLoop() OVERRIDE {
18372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Add |test_view_| next to |bb_view_|.
18382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::View* parent = bb_view_->parent();
18392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::View* container_view = new ContainerViewForMenuExit;
18402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    container_view->AddChildView(bb_view_.get());
18412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    container_view->AddChildView(test_view_);
18422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    parent->AddChildView(container_view);
18432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    parent->Layout();
18442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_EQ(test_view_->press_count(), 0);
18462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Move the mouse to the Test View and press the left mouse button.
18482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(
18492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        test_view_, ui_controls::LEFT, ui_controls::DOWN | ui_controls::UP,
18502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest20::Step1));
18512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
18522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
18542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Step1() {
18552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_EQ(test_view_->press_count(), 1);
18562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(bb_view_->GetMenu() == NULL);
18572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Move the mouse to the first folder on the bookmark bar and press the
18592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // left mouse button.
1860f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = GetBookmarkButton(0);
18612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(
18622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        button, ui_controls::LEFT, ui_controls::DOWN | ui_controls::UP,
18632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest20::Step2));
18642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
18652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Step2() {
18672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_EQ(test_view_->press_count(), 1);
18682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
18692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(menu != NULL);
18702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
18712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Move the mouse to the Test View and press the left mouse button.
18732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The context menu will consume the event and exit. Thereafter,
18742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // the event is reposted and delivered to the Test View which
18752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // increases its press-count.
18762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(
18772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        test_view_, ui_controls::LEFT, ui_controls::DOWN | ui_controls::UP,
18782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest20::Step3));
18792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
18802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Step3() {
18822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_EQ(test_view_->press_count(), 2);
18832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(bb_view_->GetMenu() == NULL);
18842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Done();
18852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
18862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class ContainerViewForMenuExit : public views::View {
18882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   public:
18892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ContainerViewForMenuExit() {
18902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
18912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void Layout() OVERRIDE {
18932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DCHECK_EQ(2, child_count());
18942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      views::View* bb_view = child_at(0);
18952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      views::View* test_view = child_at(1);
18962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const int width = bb_view->width();
18972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const int height = bb_view->height();
18982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bb_view->SetBounds(0,0, width - 22, height);
18992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_view->SetBounds(width - 20, 0, 20, height);
19002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
19012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   private:
19032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(ContainerViewForMenuExit);
19052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
19062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class TestViewForMenuExit : public views::View {
19082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   public:
19092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TestViewForMenuExit() : press_count_(0) {
19102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
19112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual bool OnMousePressed(const ui::MouseEvent& event) OVERRIDE {
19122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ++press_count_;
19132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return true;
19142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
19152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int press_count() const { return press_count_; }
19162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   private:
19182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int press_count_;
19192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(TestViewForMenuExit);
19212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
19222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestViewForMenuExit* test_view_;
19242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
19252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
19271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// TODO(erg): linux_aura bringup: http://crbug.com/163931
19281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define MAYBE_ContextMenuExitTest DISABLED_ContextMenuExitTest
19294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#else
19304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define MAYBE_ContextMenuExitTest ContextMenuExitTest
19314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
19322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)VIEW_TEST(BookmarkBarViewTest20, MAYBE_ContextMenuExitTest)
19342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests context menu by way of opening a context menu for a empty folder menu.
19362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The opened context menu should behave as it is from the folder button.
19372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class BookmarkBarViewTest21 : public BookmarkBarViewEventTestBase {
19382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
19392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BookmarkBarViewTest21()
1940c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : observer_(CreateEventTask(this, &BookmarkBarViewTest21::Step3)) {
19412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
19422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
19442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Move the mouse to the empty folder on the bookmark bar and press the
19452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // left mouse button.
1946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DoTestOnMessageLoop() OVERRIDE {
1947f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = GetBookmarkButton(5);
19482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
19492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
19502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest21::Step2));
19512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
19522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
19542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Confirm that a menu for empty folder shows and right click the menu.
19552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Step2() {
19562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Menu should be showing.
19572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetMenu();
19582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(menu != NULL);
19592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::SubmenuView* submenu = menu->GetSubmenu();
19612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(submenu->IsShowing());
19622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_EQ(1, submenu->child_count());
19632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::View* view = submenu->child_at(0);
19652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(view != NULL);
19662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(views::MenuItemView::kEmptyMenuItemViewID, view->id());
19672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Right click on the first child to get its context menu.
19692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(view, ui_controls::RIGHT,
19702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ui_controls::DOWN | ui_controls::UP, base::Closure());
19715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Step3 will be invoked by BookmarkContextMenuNotificationObserver.
19722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
19732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Confirm that context menu shows and click REMOVE menu.
19752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Step3() {
19762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Make sure the context menu is showing.
19772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::MenuItemView* menu = bb_view_->GetContextMenu();
19782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(menu != NULL);
19792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu());
19802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
19812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::MenuItemView* delete_menu =
19832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        menu->GetMenuItemByID(IDC_BOOKMARK_BAR_REMOVE);
19842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(delete_menu);
19852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Click on the delete menu item.
19872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(delete_menu,
19882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ui_controls::LEFT, ui_controls::DOWN | ui_controls::UP,
19892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CreateEventTask(this, &BookmarkBarViewTest21::Step4));
19902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
19912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Confirm that the empty folder gets removed and menu doesn't show.
19932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Step4() {
1994f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    views::LabelButton* button = GetBookmarkButton(5);
19952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(button);
1996f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("d"), button->GetText());
19972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(bb_view_->GetContextMenu() == NULL);
19982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(bb_view_->GetMenu() == NULL);
19992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Done();
20012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
20022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BookmarkContextMenuNotificationObserver observer_;
20042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
20052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)VIEW_TEST(BookmarkBarViewTest21, ContextMenusForEmptyFolder)
2007