blob: 219076d75f42bd5ddadf4df9345fe26a95af2eba [file] [log] [blame]
// 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