summaryrefslogtreecommitdiff
path: root/chromium/ui/events/scoped_target_handler.cc
blob: 08608b41c73a7dacd56ac8c3abc2218bd5319e6d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "ui/events/scoped_target_handler.h"

#include "ui/events/event.h"
#include "ui/events/event_handler.h"
#include "ui/events/event_target.h"

namespace ui {

ScopedTargetHandler::ScopedTargetHandler(EventTarget* target,
                                         EventHandler* handler)
    : destroyed_flag_(NULL), target_(target), new_handler_(handler) {
  original_handler_ = target_->SetTargetHandler(this);
}

ScopedTargetHandler::~ScopedTargetHandler() {
  EventHandler* handler = target_->SetTargetHandler(original_handler_);
  DCHECK_EQ(this, handler);
  if (destroyed_flag_)
    *destroyed_flag_ = true;
}

void ScopedTargetHandler::OnEvent(Event* event) {
  if (original_handler_) {
    bool destroyed = false;
    bool* old_destroyed_flag = destroyed_flag_;
    destroyed_flag_ = &destroyed;

    original_handler_->OnEvent(event);

    if (destroyed) {
      if (old_destroyed_flag)
        *old_destroyed_flag = true;
      return;
    }
    destroyed_flag_ = old_destroyed_flag;
  }
  new_handler_->OnEvent(event);
}

}  // namespace ui