scoped_target_handler.cc 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. // Copyright 2015 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "ui/events/scoped_target_handler.h"
  5. #include "ui/events/event.h"
  6. #include "ui/events/event_handler.h"
  7. #include "ui/events/event_target.h"
  8. namespace ui {
  9. ScopedTargetHandler::ScopedTargetHandler(EventTarget* target,
  10. EventHandler* handler)
  11. : target_(target), new_handler_(handler) {
  12. original_handler_ = target_->SetTargetHandler(this);
  13. }
  14. ScopedTargetHandler::~ScopedTargetHandler() {
  15. EventHandler* handler = target_->SetTargetHandler(original_handler_);
  16. DCHECK_EQ(this, handler);
  17. }
  18. void ScopedTargetHandler::OnEvent(Event* event) {
  19. if (original_handler_) {
  20. auto weak_this = weak_factory_.GetWeakPtr();
  21. original_handler_->OnEvent(event);
  22. if (!weak_this)
  23. return;
  24. }
  25. // This check is needed due to nested event loops when starting DragDrop.
  26. if (event->stopped_propagation())
  27. return;
  28. new_handler_->OnEvent(event);
  29. }
  30. base::StringPiece ScopedTargetHandler::GetLogContext() const {
  31. return "ScopedTargetHandler";
  32. }
  33. } // namespace ui