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 "ui/views/widget/root_view.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
10ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/message_loop/message_loop.h"
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/accessibility/ax_view_state.h"
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/base/cursor/cursor.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/dragdrop/drag_drop_types.h"
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/base/ui_base_switches_util.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer.h"
16d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h"
17d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/keycodes/keyboard_codes.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/canvas.h"
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/views/drag_controller.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/focus/view_storage.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/fill_layout.h"
22c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/views/view_targeter.h"
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/views/widget/root_view_targeter.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/widget/widget_delegate.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)typedef ui::EventDispatchDetails DispatchDetails;
28d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum EventType {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EVENT_ENTER,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EVENT_EXIT
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MouseEnterExitEvent : public ui::MouseEvent {
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MouseEnterExitEvent(const ui::MouseEvent& event, ui::EventType type)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : ui::MouseEvent(event,
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       static_cast<View*>(NULL),
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       static_cast<View*>(NULL)) {
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(type == ui::ET_MOUSE_ENTERED ||
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           type == ui::ET_MOUSE_EXITED);
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetType(type);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~MouseEnterExitEvent() {}
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// This event handler receives events in the pre-target phase and takes care of
56e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// the following:
57e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch//   - Shows keyboard-triggered context menus.
58e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochclass PreEventDispatchHandler : public ui::EventHandler {
59e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch public:
60e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  explicit PreEventDispatchHandler(View* owner)
61e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      : owner_(owner) {
62e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
63e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  virtual ~PreEventDispatchHandler() {}
64e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
65e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch private:
66e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // ui::EventHandler:
67e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  virtual void OnKeyEvent(ui::KeyEvent* event) OVERRIDE {
68e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    CHECK_EQ(ui::EP_PRETARGET, event->phase());
69e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    if (event->handled())
70e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      return;
71e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
72e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    View* v = NULL;
73e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    if (owner_->GetFocusManager())  // Can be NULL in unittests.
74e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      v = owner_->GetFocusManager()->GetFocusedView();
75e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
76e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    // Special case to handle keyboard-triggered context menus.
77e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    if (v && v->enabled() && ((event->key_code() == ui::VKEY_APPS) ||
78e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch       (event->key_code() == ui::VKEY_F10 && event->IsShiftDown()))) {
79e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      // Clamp the menu location within the visible bounds of each ancestor view
80e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      // to avoid showing the menu over a completely different view or window.
81e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      gfx::Point location = v->GetKeyboardContextMenuLocation();
82e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      for (View* parent = v->parent(); parent; parent = parent->parent()) {
83e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        const gfx::Rect& parent_bounds = parent->GetBoundsInScreen();
84e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        location.SetToMax(parent_bounds.origin());
85e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        location.SetToMin(parent_bounds.bottom_right());
86e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      }
87e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      v->ShowContextMenu(location, ui::MENU_SOURCE_KEYBOARD);
88e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      event->StopPropagation();
89e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    }
90e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
91e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
92e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  View* owner_;
93e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
94e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DISALLOW_COPY_AND_ASSIGN(PreEventDispatchHandler);
95e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch};
96e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// This event handler receives events in the post-target phase and takes care of
98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// the following:
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//   - Generates context menu, or initiates drag-and-drop, from gesture events.
100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class PostEventDispatchHandler : public ui::EventHandler {
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  PostEventDispatchHandler()
103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      : touch_dnd_enabled_(::switches::IsTouchDragDropEnabled()) {
104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual ~PostEventDispatchHandler() {}
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private:
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Overridden from ui::EventHandler:
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE {
110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DCHECK_EQ(ui::EP_POSTTARGET, event->phase());
111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (event->handled())
112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return;
113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    View* target = static_cast<View*>(event->target());
115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    gfx::Point location = event->location();
116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (touch_dnd_enabled_ &&
117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        event->type() == ui::ET_GESTURE_LONG_PRESS &&
118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        (!target->drag_controller() ||
119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)         target->drag_controller()->CanStartDragForView(
120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)             target, location, location))) {
121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      if (target->DoDrag(*event, location,
122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          ui::DragDropTypes::DRAG_EVENT_SOURCE_TOUCH)) {
123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        event->StopPropagation();
124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        return;
125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      }
126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (target->context_menu_controller() &&
129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        (event->type() == ui::ET_GESTURE_LONG_PRESS ||
130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)         event->type() == ui::ET_GESTURE_LONG_TAP ||
131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)         event->type() == ui::ET_GESTURE_TWO_FINGER_TAP)) {
132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      gfx::Point screen_location(location);
133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      View::ConvertPointToScreen(target, &screen_location);
134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      target->ShowContextMenu(screen_location, ui::MENU_SOURCE_TOUCH);
135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      event->StopPropagation();
136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool touch_dnd_enabled_;
140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PostEventDispatchHandler);
142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
14590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const char RootView::kViewClassName[] = "RootView";
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RootView, public:
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Creation and lifetime -------------------------------------------------------
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RootView::RootView(Widget* widget)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : widget_(widget),
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mouse_pressed_handler_(NULL),
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mouse_move_handler_(NULL),
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      last_click_handler_(NULL),
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      explicit_mouse_handler_(false),
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      last_mouse_event_flags_(0),
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      last_mouse_event_x_(-1),
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      last_mouse_event_y_(-1),
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gesture_handler_(NULL),
1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      gesture_handler_set_before_processing_(false),
163e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      pre_dispatch_handler_(new internal::PreEventDispatchHandler(this)),
164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      post_dispatch_handler_(new internal::PostEventDispatchHandler),
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      focus_search_(this, false, false),
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      focus_traversable_parent_(NULL),
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      focus_traversable_parent_view_(NULL),
168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      event_dispatch_target_(NULL),
169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      old_dispatch_target_(NULL) {
170e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  AddPreTargetHandler(pre_dispatch_handler_.get());
171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AddPostTargetHandler(post_dispatch_handler_.get());
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetEventTargeter(scoped_ptr<ViewTargeter>(new RootViewTargeter(this, this)));
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RootView::~RootView() {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we have children remove them explicitly so to make sure a remove
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // notification is sent for each one of them.
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (has_children())
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RemoveAllChildViews(true);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tree operations -------------------------------------------------------------
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RootView::SetContentsView(View* contents_view) {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(contents_view && GetWidget()->native_widget()) <<
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Can't be called until after the native widget is created!";
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The ContentsView must be set up _after_ the window is created so that its
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Widget pointer is valid.
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetLayoutManager(new FillLayout);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (has_children())
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RemoveAllChildViews(true);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddChildView(contents_view);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Force a layout now, since the attached hierarchy won't be ready for the
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // containing window's bounds. Note that we call Layout directly rather than
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // calling the widget's size changed handler, since the RootView's bounds may
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // not have changed, which will cause the Layout not to be done otherwise.
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Layout();
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)View* RootView::GetContentsView() {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return child_count() > 0 ? child_at(0) : NULL;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void RootView::NotifyNativeViewHierarchyChanged() {
206424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  PropagateNativeViewHierarchyChanged();
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Focus -----------------------------------------------------------------------
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RootView::SetFocusTraversableParent(FocusTraversable* focus_traversable) {
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(focus_traversable != this);
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  focus_traversable_parent_ = focus_traversable;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RootView::SetFocusTraversableParentView(View* view) {
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  focus_traversable_parent_view_ = view;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// System events ---------------------------------------------------------------
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RootView::ThemeChanged() {
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  View::PropagateThemeChanged();
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RootView::LocaleChanged() {
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  View::PropagateLocaleChanged();
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RootView, FocusTraversable implementation:
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FocusSearch* RootView::GetFocusSearch() {
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return &focus_search_;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FocusTraversable* RootView::GetFocusTraversableParent() {
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return focus_traversable_parent_;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)View* RootView::GetFocusTraversableParentView() {
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return focus_traversable_parent_view_;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
246a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// RootView, ui::EventProcessor overrides:
247a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
248a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)ui::EventTarget* RootView::GetRootTarget() {
249a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return this;
250a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
251a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
252a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)ui::EventDispatchDetails RootView::OnEventFromSource(ui::Event* event) {
253a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (event->IsKeyEvent())
254c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return EventProcessor::OnEventFromSource(event);
2555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (event->IsScrollEvent())
257010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return EventProcessor::OnEventFromSource(event);
2585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (event->IsGestureEvent()) {
2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // TODO(tdanderson): Once DispatchGestureEvent() has been removed, move
2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    //                   all of this logic into an override of a new
2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    //                   virtual method
2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    //                   EventProcessor::OnEventProcessingStarted() (which
2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    //                   returns false if no processing should take place).
2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    //                   Also move the implementation of
2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    //                   PrepareEventForDispatch() into this new method.
2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    //                   Then RootView::OnEventFromSource() can be removed.
2685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ui::GestureEvent* gesture_event = event->AsGestureEvent();
2695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // Do not dispatch ui::ET_GESTURE_BEGIN events.
2715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (gesture_event->type() == ui::ET_GESTURE_BEGIN)
2725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      return DispatchDetails();
2735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // Ignore ui::ET_GESTURE_END events which do not correspond to the
2755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // removal of the final touch point.
2765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (gesture_event->type() == ui::ET_GESTURE_END &&
2775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        gesture_event->details().touch_points() > 1) {
2785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      return DispatchDetails();
2795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
2805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // Ignore subsequent gesture scroll events if no handler was set for a
2825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // ui::ET_GESTURE_SCROLL_BEGIN event.
2835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (!gesture_handler_ &&
2845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        (gesture_event->type() == ui::ET_GESTURE_SCROLL_UPDATE ||
2855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)         gesture_event->type() == ui::ET_GESTURE_SCROLL_END ||
2865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)         gesture_event->type() == ui::ET_SCROLL_FLING_START)) {
2875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      return DispatchDetails();
2885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
2895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    gesture_handler_set_before_processing_ = !!gesture_handler_;
2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return EventProcessor::OnEventFromSource(event);
2925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
2935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (event->IsTouchEvent())
295e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    NOTREACHED() << "Touch events should not be sent to RootView.";
2965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (event->IsMouseEvent())
298a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    NOTREACHED() << "Should not be called with a MouseEvent.";
299a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
300a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return DispatchDetails();
301a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
302a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
3031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid RootView::OnEventProcessingFinished(ui::Event* event) {
3041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // If |event| was not handled and |gesture_handler_| was not set by the
3051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // dispatch of a previous gesture event, then no default gesture handler
3061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // should be set prior to the next gesture event being received.
3071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (event->IsGestureEvent() &&
3081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      !event->handled() &&
3091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      !gesture_handler_set_before_processing_) {
3101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    gesture_handler_ = NULL;
3111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
3121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
314a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RootView, View overrides:
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Widget* RootView::GetWidget() const {
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return widget_;
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Widget* RootView::GetWidget() {
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return const_cast<Widget*>(const_cast<const RootView*>(this)->GetWidget());
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RootView::IsDrawn() const {
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return visible();
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void RootView::Layout() {
33058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  View::Layout();
33158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  widget_->OnRootViewLayout();
33258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
33358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
334b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)const char* RootView::GetClassName() const {
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return kViewClassName;
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RootView::SchedulePaintInRect(const gfx::Rect& rect) {
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (layer()) {
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    layer()->SchedulePaint(rect);
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect xrect = ConvertRectToParent(rect);
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect invalid_rect = gfx::IntersectRects(GetLocalBounds(), xrect);
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!invalid_rect.IsEmpty())
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      widget_->SchedulePaintInRect(invalid_rect);
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RootView::OnMousePressed(const ui::MouseEvent& event) {
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateCursor(event);
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMouseLocationAndFlags(event);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If mouse_pressed_handler_ is non null, we are currently processing
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a pressed -> drag -> released session. In that case we send the
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // event to mouse_pressed_handler_
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mouse_pressed_handler_) {
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::MouseEvent mouse_pressed_event(event, static_cast<View*>(this),
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       mouse_pressed_handler_);
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    drag_info_.Reset();
360a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ui::EventDispatchDetails dispatch_details =
361a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        DispatchEvent(mouse_pressed_handler_, &mouse_pressed_event);
362a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (dispatch_details.dispatcher_destroyed)
363a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return true;
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!explicit_mouse_handler_);
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool hit_disabled_view = false;
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Walk up the tree until we find a view that wants the mouse event.
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (mouse_pressed_handler_ = GetEventHandlerForPoint(event.location());
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       mouse_pressed_handler_ && (mouse_pressed_handler_ != this);
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       mouse_pressed_handler_ = mouse_pressed_handler_->parent()) {
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DVLOG(1) << "OnMousePressed testing "
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        << mouse_pressed_handler_->GetClassName();
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!mouse_pressed_handler_->enabled()) {
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Disabled views should eat events instead of propagating them upwards.
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      hit_disabled_view = true;
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // See if this view wants to handle the mouse press.
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::MouseEvent mouse_pressed_event(event, static_cast<View*>(this),
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       mouse_pressed_handler_);
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Remove the double-click flag if the handler is different than the
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // one which got the first click part of the double-click.
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (mouse_pressed_handler_ != last_click_handler_)
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mouse_pressed_event.set_flags(event.flags() & ~ui::EF_IS_DOUBLE_CLICK);
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    drag_info_.Reset();
391a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ui::EventDispatchDetails dispatch_details =
392a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        DispatchEvent(mouse_pressed_handler_, &mouse_pressed_event);
393a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (dispatch_details.dispatcher_destroyed)
394a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return mouse_pressed_event.handled();
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The view could have removed itself from the tree when handling
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // OnMousePressed().  In this case, the removal notification will have
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // reset mouse_pressed_handler_ to NULL out from under us.  Detect this
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // case and stop.  (See comments in view.h.)
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // NOTE: Don't return true here, because we don't want the frame to
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // forward future events to us when there's no handler.
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!mouse_pressed_handler_)
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If the view handled the event, leave mouse_pressed_handler_ set and
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // return true, which will cause subsequent drag/release events to get
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // forwarded to that view.
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (mouse_pressed_event.handled()) {
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      last_click_handler_ = mouse_pressed_handler_;
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DVLOG(1) << "OnMousePressed handled by "
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          << mouse_pressed_handler_->GetClassName();
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reset mouse_pressed_handler_ to indicate that no processing is occurring.
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_pressed_handler_ = NULL;
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // In the event that a double-click is not handled after traversing the
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // entire hierarchy (even as a single-click when sent to a different view),
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it must be marked as handled to avoid anything happening from default
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // processing if it the first click-part was handled by us.
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (last_click_handler_ && (event.flags() & ui::EF_IS_DOUBLE_CLICK))
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    hit_disabled_view = true;
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_click_handler_ = NULL;
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return hit_disabled_view;
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RootView::OnMouseDragged(const ui::MouseEvent& event) {
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mouse_pressed_handler_) {
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetMouseLocationAndFlags(event);
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::MouseEvent mouse_event(event, static_cast<View*>(this),
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               mouse_pressed_handler_);
437a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ui::EventDispatchDetails dispatch_details =
438a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        DispatchEvent(mouse_pressed_handler_, &mouse_event);
439a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (dispatch_details.dispatcher_destroyed)
440a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return false;
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RootView::OnMouseReleased(const ui::MouseEvent& event) {
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateCursor(event);
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mouse_pressed_handler_) {
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::MouseEvent mouse_released(event, static_cast<View*>(this),
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  mouse_pressed_handler_);
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // We allow the view to delete us from the event dispatch callback. As such,
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // configure state such that we're done first, then call View.
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    View* mouse_pressed_handler = mouse_pressed_handler_;
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetMouseHandler(NULL);
455a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ui::EventDispatchDetails dispatch_details =
456a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        DispatchEvent(mouse_pressed_handler, &mouse_released);
457a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (dispatch_details.dispatcher_destroyed)
458a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return;
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RootView::OnMouseCaptureLost() {
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO: this likely needs to reset touch handler too.
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mouse_pressed_handler_ || gesture_handler_) {
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Synthesize a release event for UpdateCursor.
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (mouse_pressed_handler_) {
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Point last_point(last_mouse_event_x_, last_mouse_event_y_);
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::MouseEvent release_event(ui::ET_MOUSE_RELEASED,
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   last_point, last_point,
4715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   last_mouse_event_flags_,
4725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   0);
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UpdateCursor(release_event);
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We allow the view to delete us from OnMouseCaptureLost. As such,
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // configure state such that we're done first, then call View.
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    View* mouse_pressed_handler = mouse_pressed_handler_;
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    View* gesture_handler = gesture_handler_;
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetMouseHandler(NULL);
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (mouse_pressed_handler)
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mouse_pressed_handler->OnMouseCaptureLost();
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gesture_handler->OnMouseCaptureLost();
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // WARNING: we may have been deleted.
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RootView::OnMouseMoved(const ui::MouseEvent& event) {
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  View* v = GetEventHandlerForPoint(event.location());
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Find the first enabled view, or the existing move handler, whichever comes
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // first.  The check for the existing handler is because if a view becomes
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // disabled while handling moves, it's wrong to suddenly send ET_MOUSE_EXITED
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and ET_MOUSE_ENTERED events, because the mouse hasn't actually exited yet.
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (v && !v->enabled() && (v != mouse_move_handler_))
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    v = v->parent();
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (v && v != this) {
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (v != mouse_move_handler_) {
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (mouse_move_handler_ != NULL &&
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          (!mouse_move_handler_->notify_enter_exit_on_child() ||
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           !mouse_move_handler_->Contains(v))) {
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        MouseEnterExitEvent exit(event, ui::ET_MOUSE_EXITED);
502a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        exit.ConvertLocationToTarget(static_cast<View*>(this),
503a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                     mouse_move_handler_);
504a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        ui::EventDispatchDetails dispatch_details =
505a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            DispatchEvent(mouse_move_handler_, &exit);
506a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        if (dispatch_details.dispatcher_destroyed)
507a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          return;
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        NotifyEnterExitOfDescendant(event, ui::ET_MOUSE_EXITED,
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            mouse_move_handler_, v);
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      View* old_handler = mouse_move_handler_;
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mouse_move_handler_ = v;
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!mouse_move_handler_->notify_enter_exit_on_child() ||
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          !mouse_move_handler_->Contains(old_handler)) {
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        MouseEnterExitEvent entered(event, ui::ET_MOUSE_ENTERED);
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        entered.ConvertLocationToTarget(static_cast<View*>(this),
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        mouse_move_handler_);
518a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        ui::EventDispatchDetails dispatch_details =
519a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            DispatchEvent(mouse_move_handler_, &entered);
520a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        if (dispatch_details.dispatcher_destroyed)
521a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          return;
522a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        NotifyEnterExitOfDescendant(event, ui::ET_MOUSE_ENTERED,
523a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            mouse_move_handler_, old_handler);
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::MouseEvent moved_event(event, static_cast<View*>(this),
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               mouse_move_handler_);
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mouse_move_handler_->OnMouseMoved(moved_event);
529a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // TODO(tdanderson): It may be possible to avoid setting the cursor twice
530a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    //                   (once here and once from CompoundEventFilter) on a
531a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    //                   mousemove. See crbug.com/351469.
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!(moved_event.flags() & ui::EF_IS_NON_CLIENT))
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      widget_->SetCursor(mouse_move_handler_->GetCursor(moved_event));
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (mouse_move_handler_ != NULL) {
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MouseEnterExitEvent exited(event, ui::ET_MOUSE_EXITED);
536a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ui::EventDispatchDetails dispatch_details =
537a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        DispatchEvent(mouse_move_handler_, &exited);
538a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (dispatch_details.dispatcher_destroyed)
539a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return;
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NotifyEnterExitOfDescendant(event, ui::ET_MOUSE_EXITED,
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        mouse_move_handler_, v);
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // On Aura the non-client area extends slightly outside the root view for
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // some windows.  Let the non-client cursor handling code set the cursor
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // as we do above.
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!(event.flags() & ui::EF_IS_NON_CLIENT))
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      widget_->SetCursor(gfx::kNullCursor);
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mouse_move_handler_ = NULL;
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RootView::OnMouseExited(const ui::MouseEvent& event) {
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mouse_move_handler_ != NULL) {
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MouseEnterExitEvent exited(event, ui::ET_MOUSE_EXITED);
554a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ui::EventDispatchDetails dispatch_details =
555a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        DispatchEvent(mouse_move_handler_, &exited);
556a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (dispatch_details.dispatcher_destroyed)
557a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return;
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NotifyEnterExitOfDescendant(event, ui::ET_MOUSE_EXITED,
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        mouse_move_handler_, NULL);
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mouse_move_handler_ = NULL;
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RootView::OnMouseWheel(const ui::MouseWheelEvent& event) {
565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (View* v = GetEventHandlerForPoint(event.location());
566a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)       v && v != this && !event.handled(); v = v->parent()) {
567a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ui::EventDispatchDetails dispatch_details =
568a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        DispatchEvent(v, const_cast<ui::MouseWheelEvent*>(&event));
569a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (dispatch_details.dispatcher_destroyed ||
570a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        dispatch_details.target_destroyed) {
571a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return event.handled();
572a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
573a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return event.handled();
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RootView::SetMouseHandler(View* new_mh) {
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we're clearing the mouse handler, clear explicit_mouse_handler_ as well.
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit_mouse_handler_ = (new_mh != NULL);
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_pressed_handler_ = new_mh;
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gesture_handler_ = new_mh;
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  drag_info_.Reset();
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void RootView::GetAccessibleState(ui::AXViewState* state) {
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  state->name = widget_->widget_delegate()->GetAccessibleWindowTitle();
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  state->role = widget_->widget_delegate()->GetAccessibleWindowRole();
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void RootView::UpdateParentLayer() {
59190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (layer())
59290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ReparentLayer(gfx::Vector2d(GetMirroredX(), y()), widget_->GetLayer());
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RootView, protected:
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
598116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid RootView::ViewHierarchyChanged(
599116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const ViewHierarchyChangedDetails& details) {
600116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  widget_->ViewHierarchyChanged(details);
601116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
602116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!details.is_add) {
603116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (!explicit_mouse_handler_ && mouse_pressed_handler_ == details.child)
604116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      mouse_pressed_handler_ = NULL;
605116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (mouse_move_handler_ == details.child)
606116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      mouse_move_handler_ = NULL;
607116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (gesture_handler_ == details.child)
608116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      gesture_handler_ = NULL;
609116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (event_dispatch_target_ == details.child)
610116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      event_dispatch_target_ = NULL;
611116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (old_dispatch_target_ == details.child)
612116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      old_dispatch_target_ = NULL;
613116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
614116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
615116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
616116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid RootView::VisibilityChanged(View* /*starting_from*/, bool is_visible) {
617116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!is_visible) {
618116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // When the root view is being hidden (e.g. when widget is minimized)
619116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // handlers are reset, so that after it is reshown, events are not captured
620116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // by old handlers.
621116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    explicit_mouse_handler_ = false;
622116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    mouse_pressed_handler_ = NULL;
623116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    mouse_move_handler_ = NULL;
624116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    gesture_handler_ = NULL;
625116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    event_dispatch_target_ = NULL;
626116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    old_dispatch_target_ = NULL;
627116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
628116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
629116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
630116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid RootView::OnPaint(gfx::Canvas* canvas) {
631116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!layer() || !layer()->fills_bounds_opaquely())
632116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    canvas->DrawColor(SK_ColorBLACK, SkXfermode::kClear_Mode);
633116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
634116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  View::OnPaint(canvas);
635116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
636116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
637116680a4aac90f2aa7413d9095a592090648e557Ben Murdochgfx::Vector2d RootView::CalculateOffsetToAncestorWithLayer(
638116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ui::Layer** layer_parent) {
639116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  gfx::Vector2d offset(View::CalculateOffsetToAncestorWithLayer(layer_parent));
640116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!layer() && layer_parent)
641116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    *layer_parent = widget_->GetLayer();
642116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return offset;
643116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
644116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
645116680a4aac90f2aa7413d9095a592090648e557Ben MurdochView::DragInfo* RootView::GetDragInfo() {
646116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return &drag_info_;
647116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
648116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
649116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch////////////////////////////////////////////////////////////////////////////////
650116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// RootView, private:
651116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
652116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Input -----------------------------------------------------------------------
653116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RootView::UpdateCursor(const ui::MouseEvent& event) {
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!(event.flags() & ui::EF_IS_NON_CLIENT)) {
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    View* v = GetEventHandlerForPoint(event.location());
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::MouseEvent me(event, static_cast<View*>(this), v);
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    widget_->SetCursor(v->GetCursor(me));
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RootView::SetMouseLocationAndFlags(const ui::MouseEvent& event) {
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_mouse_event_flags_ = event.flags();
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_mouse_event_x_ = event.x();
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_mouse_event_y_ = event.y();
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RootView::NotifyEnterExitOfDescendant(const ui::MouseEvent& event,
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           ui::EventType type,
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           View* view,
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           View* sibling) {
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (View* p = view->parent(); p; p = p->parent()) {
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!p->notify_enter_exit_on_child())
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      continue;
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (sibling && p->Contains(sibling))
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // It is necessary to recreate the notify-event for each dispatch, since one
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // of the callbacks can mark the event as handled, and that would cause
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // incorrect event dispatch.
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MouseEnterExitEvent notify_event(event, type);
681a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ui::EventDispatchDetails dispatch_details = DispatchEvent(p, &notify_event);
682a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (dispatch_details.dispatcher_destroyed ||
683a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        dispatch_details.target_destroyed) {
684424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      return;
685a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
686424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
687424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
688424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RootView::CanDispatchToTarget(ui::EventTarget* target) {
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return event_dispatch_target_ == target;
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
693a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)ui::EventDispatchDetails RootView::PreDispatchEvent(ui::EventTarget* target,
694a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                    ui::Event* event) {
6951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  View* view = static_cast<View*>(target);
6961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (event->IsGestureEvent()) {
6971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Update |gesture_handler_| to indicate which View is currently handling
6981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // gesture events.
6991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // TODO(tdanderson): Look into moving this to PostDispatchEvent() and
7001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    //                   using |event_dispatch_target_| instead of
7011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    //                   |gesture_handler_| to detect if the view has been
7021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    //                   removed from the tree.
7031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    gesture_handler_ = view;
7041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Disabled views are permitted to be targets of gesture events, but
7061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // gesture events should never actually be dispatched to them. Prevent
7071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // dispatch by marking the event as handled.
7081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!view->enabled())
7091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      event->SetHandled();
7101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
7111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
712a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  old_dispatch_target_ = event_dispatch_target_;
7131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  event_dispatch_target_ = view;
714a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return DispatchDetails();
715a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
716a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
717a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)ui::EventDispatchDetails RootView::PostDispatchEvent(ui::EventTarget* target,
718a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                     const ui::Event& event) {
7191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The GESTURE_END event corresponding to the removal of the final touch
7201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // point marks the end of a gesture sequence, so reset |gesture_handler_|
7211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // to NULL.
7221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (event.type() == ui::ET_GESTURE_END) {
7231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // In case a drag was in progress, reset all the handlers. Otherwise, just
7241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // reset the gesture handler.
7251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (gesture_handler_ && gesture_handler_ == mouse_pressed_handler_)
7261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      SetMouseHandler(NULL);
7271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    else
7281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      gesture_handler_ = NULL;
7291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
7301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
731a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DispatchDetails details;
732a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (target != event_dispatch_target_)
733a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    details.target_destroyed = true;
734a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
735a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  event_dispatch_target_ = old_dispatch_target_;
736a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  old_dispatch_target_ = NULL;
737a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
738a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#ifndef NDEBUG
739a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK(!event_dispatch_target_ || Contains(event_dispatch_target_));
740a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif
741a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
742a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return details;
743a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
744a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace internal
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace views
747