| Index: ui/aura/window_targeter.cc
|
| diff --git a/ui/aura/window_targeter.cc b/ui/aura/window_targeter.cc
|
| index 9853585d3cda3a6a0dddb1503f668abb4b34c7d5..14798911ade802902c51a8c810b5ad28243d3759 100644
|
| --- a/ui/aura/window_targeter.cc
|
| +++ b/ui/aura/window_targeter.cc
|
| @@ -59,6 +59,40 @@ bool WindowTargeter::EventLocationInsideBounds(
|
| return gfx::Rect(window->bounds().size()).Contains(point);
|
| }
|
|
|
| +bool WindowTargeter::EventLocationInsideBoundsRecursive(
|
| + Window* window,
|
| + gfx::Point point, gfx::Point location) {
|
| + Window* parent = window->parent();
|
| + bool canAccept = true;
|
| + if (parent){
|
| + if (parent->delegate_ && !parent->delegate_->
|
| + ShouldDescendIntoChildForEventHandling(window, location)) {
|
| + canAccept = false;
|
| + }
|
| + Window::ConvertPointToTarget(window->parent(), window, &point);
|
| + }
|
| +
|
| + bool inBounds = gfx::Rect(window->bounds().size()).Contains(point);
|
| + canAccept = canAccept && (window->IsVisible() && !window->ignore_events());
|
| + client::EventClient* client = client::GetEventClient(window->GetRootWindow());
|
| + if (client && !client->CanProcessEventsWithinSubtree(window))
|
| + canAccept = false;
|
| + if (inBounds && canAccept){
|
| + return true;
|
| + }
|
| + std::unique_ptr<ui::EventTargetIterator> iter =
|
| + window->GetChildIterator();
|
| + if (iter) {
|
| + for (ui::EventTarget* child = iter->GetNextTarget(); child;
|
| + child = iter->GetNextTarget()) {
|
| + if (EventLocationInsideBoundsRecursive(static_cast<Window*>(child),
|
| + point, location))
|
| + return true;
|
| + }
|
| + }
|
| + return false;
|
| +}
|
| +
|
| ui::EventTarget* WindowTargeter::FindTargetForEvent(ui::EventTarget* root,
|
| ui::Event* event) {
|
| Window* window = static_cast<Window*>(root);
|
| @@ -100,7 +134,8 @@ bool WindowTargeter::SubtreeShouldBeExploredForEvent(
|
| Window* window,
|
| const ui::LocatedEvent& event) {
|
| return SubtreeCanAcceptEvent(window, event) &&
|
| - EventLocationInsideBounds(window, event);
|
| + EventLocationInsideBoundsRecursive(window, event.location(),
|
| + event.location());
|
| }
|
|
|
| Window* WindowTargeter::FindTargetForKeyEvent(Window* window,
|
|
|