| // Copyright 2020 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_capture_request.h" |
| |
| #include "ui/aura/window.h" |
| |
| namespace aura { |
| |
| ScopedWindowCaptureRequest::ScopedWindowCaptureRequest( |
| ScopedWindowCaptureRequest&& other) |
| // Do not decrement requests on |other| nor increment them on |this| since |
| // we are moving the same request into here. |
| : window_(other.DetachFromCurrentWindow(/*decrement_requests=*/false)) { |
| if (window_) |
| AttachToCurrentWindow(/*increment_requests=*/false); |
| } |
| |
| ScopedWindowCaptureRequest& ScopedWindowCaptureRequest::operator=( |
| ScopedWindowCaptureRequest&& rhs) { |
| // Note that |this| might have been attached to a different window than that |
| // of |rhs|, so we need to detach from while decrementing the requests. |
| DetachFromCurrentWindow(/*decrement_requests=*/true); |
| |
| // However, |rhs| is moving into |this|, so it's essentially the same request, |
| // therefore, no need to either increment or decrement the requests. |
| window_ = rhs.DetachFromCurrentWindow(/*decrement_requests=*/false); |
| if (window_) |
| AttachToCurrentWindow(/*increment_requests=*/false); |
| |
| return *this; |
| } |
| |
| ScopedWindowCaptureRequest::~ScopedWindowCaptureRequest() { |
| DetachFromCurrentWindow(/*decrement_requests=*/true); |
| } |
| |
| viz::SubtreeCaptureId ScopedWindowCaptureRequest::GetCaptureId() const { |
| return window_ ? window_->subtree_capture_id() : viz::SubtreeCaptureId(); |
| } |
| |
| void ScopedWindowCaptureRequest::OnWindowDestroying(Window* window) { |
| // No need to call OnScopedWindowCaptureRequestRemoved() since the window is |
| // being destroyed. |
| DetachFromCurrentWindow(/*decrement_requests=*/false); |
| } |
| |
| ScopedWindowCaptureRequest::ScopedWindowCaptureRequest(Window* window) |
| : window_(window) { |
| AttachToCurrentWindow(/*increment_requests=*/true); |
| } |
| |
| void ScopedWindowCaptureRequest::AttachToCurrentWindow( |
| bool increment_requests) { |
| DCHECK(window_); |
| DCHECK(!window_->IsRootWindow()); |
| if (increment_requests) |
| window_->OnScopedWindowCaptureRequestAdded(); |
| window_->AddObserver(this); |
| } |
| |
| Window* ScopedWindowCaptureRequest::DetachFromCurrentWindow( |
| bool decrement_requests) { |
| Window* result = window_; |
| if (window_) { |
| window_->RemoveObserver(this); |
| if (decrement_requests) |
| window_->OnScopedWindowCaptureRequestRemoved(); |
| window_ = nullptr; |
| } |
| return result; |
| } |
| |
| } // namespace aura |