Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(97)

Side by Side Diff: ui/views/widget/root_view.cc

Issue 996103009: Fix for a crasher in the browser seen while dispatching mouse enter or mouse exit messages via the … (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address review comments Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | ui/views/widget/root_view_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/views/widget/root_view.h" 5 #include "ui/views/widget/root_view.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/message_loop/message_loop.h" 10 #include "base/message_loop/message_loop.h"
(...skipping 475 matching lines...) Expand 10 before | Expand all | Expand 10 after
486 if (mouse_move_handler_ != NULL && 486 if (mouse_move_handler_ != NULL &&
487 (!mouse_move_handler_->notify_enter_exit_on_child() || 487 (!mouse_move_handler_->notify_enter_exit_on_child() ||
488 !mouse_move_handler_->Contains(v))) { 488 !mouse_move_handler_->Contains(v))) {
489 MouseEnterExitEvent exit(event, ui::ET_MOUSE_EXITED); 489 MouseEnterExitEvent exit(event, ui::ET_MOUSE_EXITED);
490 exit.ConvertLocationToTarget(static_cast<View*>(this), 490 exit.ConvertLocationToTarget(static_cast<View*>(this),
491 mouse_move_handler_); 491 mouse_move_handler_);
492 ui::EventDispatchDetails dispatch_details = 492 ui::EventDispatchDetails dispatch_details =
493 DispatchEvent(mouse_move_handler_, &exit); 493 DispatchEvent(mouse_move_handler_, &exit);
494 if (dispatch_details.dispatcher_destroyed) 494 if (dispatch_details.dispatcher_destroyed)
495 return; 495 return;
496 NotifyEnterExitOfDescendant(event, ui::ET_MOUSE_EXITED, 496 // The mouse_move_handler_ could have been destroyed in the context of
497 mouse_move_handler_, v); 497 // the mouse exit event.
498 if (!dispatch_details.target_destroyed) {
499 CHECK(mouse_move_handler_);
500 NotifyEnterExitOfDescendant(event, ui::ET_MOUSE_EXITED,
501 mouse_move_handler_, v);
502 }
498 } 503 }
499 View* old_handler = mouse_move_handler_; 504 View* old_handler = mouse_move_handler_;
500 mouse_move_handler_ = v; 505 mouse_move_handler_ = v;
501 if (!mouse_move_handler_->notify_enter_exit_on_child() || 506 if (!mouse_move_handler_->notify_enter_exit_on_child() ||
502 !mouse_move_handler_->Contains(old_handler)) { 507 !mouse_move_handler_->Contains(old_handler)) {
503 MouseEnterExitEvent entered(event, ui::ET_MOUSE_ENTERED); 508 MouseEnterExitEvent entered(event, ui::ET_MOUSE_ENTERED);
504 entered.ConvertLocationToTarget(static_cast<View*>(this), 509 entered.ConvertLocationToTarget(static_cast<View*>(this),
505 mouse_move_handler_); 510 mouse_move_handler_);
506 ui::EventDispatchDetails dispatch_details = 511 ui::EventDispatchDetails dispatch_details =
507 DispatchEvent(mouse_move_handler_, &entered); 512 DispatchEvent(mouse_move_handler_, &entered);
508 if (dispatch_details.dispatcher_destroyed) 513 if (dispatch_details.dispatcher_destroyed)
509 return; 514 return;
510 NotifyEnterExitOfDescendant(event, ui::ET_MOUSE_ENTERED, 515 // The mouse_move_handler_ could have been destroyed in the context of
511 mouse_move_handler_, old_handler); 516 // the mouse exit event.
517 if (!dispatch_details.target_destroyed) {
518 CHECK(mouse_move_handler_);
519 NotifyEnterExitOfDescendant(event, ui::ET_MOUSE_ENTERED,
520 mouse_move_handler_, old_handler);
521 }
512 } 522 }
513 } 523 }
514 ui::MouseEvent moved_event(event, static_cast<View*>(this), 524 ui::MouseEvent moved_event(event, static_cast<View*>(this),
515 mouse_move_handler_); 525 mouse_move_handler_);
516 mouse_move_handler_->OnMouseMoved(moved_event); 526 mouse_move_handler_->OnMouseMoved(moved_event);
517 // TODO(tdanderson): It may be possible to avoid setting the cursor twice 527 // TODO(tdanderson): It may be possible to avoid setting the cursor twice
518 // (once here and once from CompoundEventFilter) on a 528 // (once here and once from CompoundEventFilter) on a
519 // mousemove. See crbug.com/351469. 529 // mousemove. See crbug.com/351469.
520 if (!(moved_event.flags() & ui::EF_IS_NON_CLIENT)) 530 if (!(moved_event.flags() & ui::EF_IS_NON_CLIENT))
521 widget_->SetCursor(mouse_move_handler_->GetCursor(moved_event)); 531 widget_->SetCursor(mouse_move_handler_->GetCursor(moved_event));
522 } else if (mouse_move_handler_ != NULL) { 532 } else if (mouse_move_handler_ != NULL) {
523 MouseEnterExitEvent exited(event, ui::ET_MOUSE_EXITED); 533 MouseEnterExitEvent exited(event, ui::ET_MOUSE_EXITED);
524 ui::EventDispatchDetails dispatch_details = 534 ui::EventDispatchDetails dispatch_details =
525 DispatchEvent(mouse_move_handler_, &exited); 535 DispatchEvent(mouse_move_handler_, &exited);
526 if (dispatch_details.dispatcher_destroyed) 536 if (dispatch_details.dispatcher_destroyed)
527 return; 537 return;
528 NotifyEnterExitOfDescendant(event, ui::ET_MOUSE_EXITED, 538 // The mouse_move_handler_ could have been destroyed in the context of the
529 mouse_move_handler_, v); 539 // mouse exit event.
540 if (!dispatch_details.target_destroyed) {
541 CHECK(mouse_move_handler_);
542 NotifyEnterExitOfDescendant(event, ui::ET_MOUSE_EXITED,
543 mouse_move_handler_, v);
544 }
530 // On Aura the non-client area extends slightly outside the root view for 545 // On Aura the non-client area extends slightly outside the root view for
531 // some windows. Let the non-client cursor handling code set the cursor 546 // some windows. Let the non-client cursor handling code set the cursor
532 // as we do above. 547 // as we do above.
533 if (!(event.flags() & ui::EF_IS_NON_CLIENT)) 548 if (!(event.flags() & ui::EF_IS_NON_CLIENT))
534 widget_->SetCursor(gfx::kNullCursor); 549 widget_->SetCursor(gfx::kNullCursor);
535 mouse_move_handler_ = NULL; 550 mouse_move_handler_ = NULL;
536 } 551 }
537 } 552 }
538 553
539 void RootView::OnMouseExited(const ui::MouseEvent& event) { 554 void RootView::OnMouseExited(const ui::MouseEvent& event) {
540 if (mouse_move_handler_ != NULL) { 555 if (mouse_move_handler_ != NULL) {
541 MouseEnterExitEvent exited(event, ui::ET_MOUSE_EXITED); 556 MouseEnterExitEvent exited(event, ui::ET_MOUSE_EXITED);
542 ui::EventDispatchDetails dispatch_details = 557 ui::EventDispatchDetails dispatch_details =
543 DispatchEvent(mouse_move_handler_, &exited); 558 DispatchEvent(mouse_move_handler_, &exited);
544 if (dispatch_details.dispatcher_destroyed) 559 if (dispatch_details.dispatcher_destroyed)
545 return; 560 return;
546 NotifyEnterExitOfDescendant(event, ui::ET_MOUSE_EXITED, 561 // The mouse_move_handler_ could have been destroyed in the context of the
547 mouse_move_handler_, NULL); 562 // mouse exit event.
563 if (!dispatch_details.target_destroyed) {
564 CHECK(mouse_move_handler_);
565 NotifyEnterExitOfDescendant(event, ui::ET_MOUSE_EXITED,
566 mouse_move_handler_, NULL);
567 }
548 mouse_move_handler_ = NULL; 568 mouse_move_handler_ = NULL;
549 } 569 }
550 } 570 }
551 571
552 bool RootView::OnMouseWheel(const ui::MouseWheelEvent& event) { 572 bool RootView::OnMouseWheel(const ui::MouseWheelEvent& event) {
553 for (View* v = GetEventHandlerForPoint(event.location()); 573 for (View* v = GetEventHandlerForPoint(event.location());
554 v && v != this && !event.handled(); v = v->parent()) { 574 v && v != this && !event.handled(); v = v->parent()) {
555 ui::EventDispatchDetails dispatch_details = 575 ui::EventDispatchDetails dispatch_details =
556 DispatchEvent(v, const_cast<ui::MouseWheelEvent*>(&event)); 576 DispatchEvent(v, const_cast<ui::MouseWheelEvent*>(&event));
557 if (dispatch_details.dispatcher_destroyed || 577 if (dispatch_details.dispatcher_destroyed ||
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
725 745
726 #ifndef NDEBUG 746 #ifndef NDEBUG
727 DCHECK(!event_dispatch_target_ || Contains(event_dispatch_target_)); 747 DCHECK(!event_dispatch_target_ || Contains(event_dispatch_target_));
728 #endif 748 #endif
729 749
730 return details; 750 return details;
731 } 751 }
732 752
733 } // namespace internal 753 } // namespace internal
734 } // namespace views 754 } // namespace views
OLDNEW
« no previous file with comments | « no previous file | ui/views/widget/root_view_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698