| // Copyright 2019 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/aura/scoped_window_event_targeting_blocker.h" |
| |
| #include "ui/aura/window.h" |
| |
| namespace aura { |
| |
| ScopedWindowEventTargetingBlocker::ScopedWindowEventTargetingBlocker( |
| Window* window) |
| : window_(window) { |
| if (window_->event_targeting_blocker_count_ == 0) { |
| window_->restore_event_targeting_policy_ = window_->event_targeting_policy_; |
| window_->SetEventTargetingPolicy(EventTargetingPolicy::kNone); |
| } |
| // Increase |Window::event_targeting_blocker_count_| after setting the event |
| // targeting policy to kNone as Window::SetEventTargetingPolicy() relies on |
| // |Window::event_targeting_blocker_count_| to see if the policy is allowed |
| // to be changed. |
| window_->event_targeting_blocker_count_++; |
| window_->AddObserver(this); |
| } |
| |
| ScopedWindowEventTargetingBlocker::~ScopedWindowEventTargetingBlocker() { |
| if (!window_) |
| return; |
| window_->RemoveObserver(this); |
| window_->event_targeting_blocker_count_--; |
| DCHECK_GE(window_->event_targeting_blocker_count_, 0); |
| if (window_->event_targeting_blocker_count_ == 0) |
| window_->SetEventTargetingPolicy(window_->restore_event_targeting_policy_); |
| } |
| |
| void ScopedWindowEventTargetingBlocker::OnWindowDestroying(Window* window) { |
| DCHECK_EQ(window, window_); |
| window_->RemoveObserver(this); |
| window_ = nullptr; |
| } |
| |
| } // namespace aura |