1// Copyright 2014 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
5#include "content/browser/renderer_host/compositor_resize_lock_aura.h"
6
7#include "base/debug/trace_event.h"
8#include "content/public/browser/browser_thread.h"
9#include "ui/aura/window_event_dispatcher.h"
10#include "ui/aura/window_tree_host.h"
11#include "ui/compositor/compositor.h"
12
13namespace content {
14
15CompositorResizeLock::CompositorResizeLock(
16    aura::WindowTreeHost* host,
17    const gfx::Size new_size,
18    bool defer_compositor_lock,
19    const base::TimeDelta& timeout)
20    : ResizeLock(new_size, defer_compositor_lock),
21      host_(host),
22      cancelled_(false),
23      weak_ptr_factory_(this) {
24  DCHECK(host_);
25
26  TRACE_EVENT_ASYNC_BEGIN2("ui", "CompositorResizeLock", this,
27                           "width", expected_size().width(),
28                           "height", expected_size().height());
29  host_->dispatcher()->HoldPointerMoves();
30
31  BrowserThread::PostDelayedTask(
32      BrowserThread::UI, FROM_HERE,
33      base::Bind(&CompositorResizeLock::CancelLock,
34                 weak_ptr_factory_.GetWeakPtr()),
35      timeout);
36}
37
38CompositorResizeLock::~CompositorResizeLock() {
39  CancelLock();
40  TRACE_EVENT_ASYNC_END2("ui", "CompositorResizeLock", this,
41                         "width", expected_size().width(),
42                         "height", expected_size().height());
43}
44
45bool CompositorResizeLock::GrabDeferredLock() {
46  return ResizeLock::GrabDeferredLock();
47}
48
49void CompositorResizeLock::UnlockCompositor() {
50  ResizeLock::UnlockCompositor();
51  compositor_lock_ = NULL;
52}
53
54void CompositorResizeLock::LockCompositor() {
55  ResizeLock::LockCompositor();
56  compositor_lock_ = host_->compositor()->GetCompositorLock();
57}
58
59void CompositorResizeLock::CancelLock() {
60  if (cancelled_)
61    return;
62  cancelled_ = true;
63  UnlockCompositor();
64  host_->dispatcher()->ReleasePointerMoves();
65}
66
67}  // namespace content
68