OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/web_contents/aura/window_slider.h" | 5 #include "content/browser/web_contents/aura/window_slider.h" |
6 | 6 |
| 7 #include <algorithm> |
| 8 |
7 #include "base/bind.h" | 9 #include "base/bind.h" |
8 #include "base/callback.h" | 10 #include "base/callback.h" |
9 #include "content/browser/web_contents/aura/shadow_layer_delegate.h" | 11 #include "content/browser/web_contents/aura/shadow_layer_delegate.h" |
10 #include "content/public/browser/overscroll_configuration.h" | 12 #include "content/public/browser/overscroll_configuration.h" |
11 #include "ui/aura/window.h" | 13 #include "ui/aura/window.h" |
12 #include "ui/base/events/event.h" | 14 #include "ui/base/events/event.h" |
13 #include "ui/compositor/layer_animation_observer.h" | 15 #include "ui/compositor/layer_animation_observer.h" |
14 #include "ui/compositor/scoped_layer_animation_settings.h" | 16 #include "ui/compositor/scoped_layer_animation_settings.h" |
15 | 17 |
16 namespace content { | 18 namespace content { |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
79 void WindowSlider::ChangeOwner(aura::Window* new_owner) { | 81 void WindowSlider::ChangeOwner(aura::Window* new_owner) { |
80 if (owner_) | 82 if (owner_) |
81 owner_->RemoveObserver(this); | 83 owner_->RemoveObserver(this); |
82 owner_ = new_owner; | 84 owner_ = new_owner; |
83 if (owner_) { | 85 if (owner_) { |
84 owner_->AddObserver(this); | 86 owner_->AddObserver(this); |
85 UpdateForScroll(0.f, 0.f); | 87 UpdateForScroll(0.f, 0.f); |
86 } | 88 } |
87 } | 89 } |
88 | 90 |
| 91 bool WindowSlider::SlideIsInProgress() const { |
| 92 return fabs(delta_x_) >= min_start_threshold_ || weak_factory_.HasWeakPtrs(); |
| 93 } |
| 94 |
89 void WindowSlider::SetupSliderLayer() { | 95 void WindowSlider::SetupSliderLayer() { |
90 ui::Layer* parent = owner_->layer()->parent(); | 96 ui::Layer* parent = owner_->layer()->parent(); |
91 parent->Add(slider_.get()); | 97 parent->Add(slider_.get()); |
92 if (delta_x_ < 0) | 98 if (delta_x_ < 0) |
93 parent->StackAbove(slider_.get(), owner_->layer()); | 99 parent->StackAbove(slider_.get(), owner_->layer()); |
94 else | 100 else |
95 parent->StackBelow(slider_.get(), owner_->layer()); | 101 parent->StackBelow(slider_.get(), owner_->layer()); |
96 slider_->SetBounds(owner_->layer()->bounds()); | 102 slider_->SetBounds(owner_->layer()->bounds()); |
97 slider_->SetVisible(true); | 103 slider_->SetVisible(true); |
98 } | 104 } |
99 | 105 |
100 void WindowSlider::UpdateForScroll(float x_offset, float y_offset) { | 106 void WindowSlider::UpdateForScroll(float x_offset, float y_offset) { |
101 float old_delta = delta_x_; | 107 float old_delta = delta_x_; |
102 delta_x_ += x_offset; | 108 delta_x_ += x_offset; |
103 if (fabs(delta_x_) < min_start_threshold_) { | 109 if (fabs(delta_x_) < min_start_threshold_ && !slider_.get()) |
104 ResetScroll(); | |
105 return; | 110 return; |
106 } | |
107 | 111 |
108 if ((old_delta < 0 && delta_x_ > 0) || | 112 if ((old_delta < 0 && delta_x_ > 0) || |
109 (old_delta > 0 && delta_x_ < 0)) { | 113 (old_delta > 0 && delta_x_ < 0)) { |
110 slider_.reset(); | 114 slider_.reset(); |
111 shadow_.reset(); | 115 shadow_.reset(); |
112 } | 116 } |
113 | 117 |
114 float translate = 0.f; | 118 float translate = 0.f; |
115 ui::Layer* translate_layer = NULL; | 119 ui::Layer* translate_layer = NULL; |
116 | 120 |
117 if (delta_x_ <= -min_start_threshold_) { | 121 if (delta_x_ <= -min_start_threshold_) { |
118 if (!slider_.get()) { | 122 if (!slider_.get()) { |
119 slider_.reset(delegate_->CreateFrontLayer()); | 123 slider_.reset(delegate_->CreateFrontLayer()); |
| 124 if (!slider_.get()) |
| 125 return; |
120 SetupSliderLayer(); | 126 SetupSliderLayer(); |
121 } | 127 } |
122 translate = event_window_->bounds().width() - | 128 translate = owner_->bounds().width() + |
123 fabs(delta_x_ - min_start_threshold_); | 129 std::max(delta_x_ + min_start_threshold_, |
| 130 static_cast<float>(-owner_->bounds().width())); |
124 translate_layer = slider_.get(); | 131 translate_layer = slider_.get(); |
125 } else if (delta_x_ >= min_start_threshold_) { | 132 } else if (delta_x_ >= min_start_threshold_) { |
126 if (!slider_.get()) { | 133 if (!slider_.get()) { |
127 slider_.reset(delegate_->CreateBackLayer()); | 134 slider_.reset(delegate_->CreateBackLayer()); |
| 135 if (!slider_.get()) |
| 136 return; |
128 SetupSliderLayer(); | 137 SetupSliderLayer(); |
129 } | 138 } |
130 translate = delta_x_ - min_start_threshold_; | 139 translate = std::min(delta_x_ - min_start_threshold_, |
| 140 static_cast<float>(owner_->bounds().width())); |
131 translate_layer = owner_->layer(); | 141 translate_layer = owner_->layer(); |
132 } else { | 142 } else { |
133 NOTREACHED(); | 143 NOTREACHED(); |
134 } | 144 } |
135 | 145 |
136 if (!shadow_.get()) | 146 if (!shadow_.get()) |
137 shadow_.reset(new ShadowLayerDelegate(translate_layer)); | 147 shadow_.reset(new ShadowLayerDelegate(translate_layer)); |
138 | 148 |
139 gfx::Transform transform; | 149 gfx::Transform transform; |
140 transform.Translate(translate, 0); | 150 transform.Translate(translate, 0); |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
207 } | 217 } |
208 | 218 |
209 delta_x_ = 0.f; | 219 delta_x_ = 0.f; |
210 } | 220 } |
211 | 221 |
212 void WindowSlider::CancelScroll() { | 222 void WindowSlider::CancelScroll() { |
213 ResetScroll(); | 223 ResetScroll(); |
214 } | 224 } |
215 | 225 |
216 void WindowSlider::CompleteWindowSlideAfterAnimation() { | 226 void WindowSlider::CompleteWindowSlideAfterAnimation() { |
| 227 // The delegate may delete the |owner_| from the |OnWindowSlideComplete()| |
| 228 // callback, which would trigger the |
| 229 // |WindowSlider::OnWindowRemovingFromRootWindow()| callback, which would try |
| 230 // to delete itself again. So avoid that by resetting |owner_| before calling |
| 231 // the |OnWindowSlideComplete()| callback on the delegate. |
| 232 owner_->RemoveObserver(this); |
| 233 owner_ = NULL; |
| 234 |
217 delegate_->OnWindowSlideComplete(); | 235 delegate_->OnWindowSlideComplete(); |
218 delete this; | 236 delete this; |
219 } | 237 } |
220 | 238 |
221 void WindowSlider::AbortWindowSlideAfterAnimation() { | 239 void WindowSlider::AbortWindowSlideAfterAnimation() { |
222 delegate_->OnWindowSlideAborted(); | 240 delegate_->OnWindowSlideAborted(); |
223 } | 241 } |
224 | 242 |
225 void WindowSlider::OnKeyEvent(ui::KeyEvent* event) { | 243 void WindowSlider::OnKeyEvent(ui::KeyEvent* event) { |
226 CancelScroll(); | 244 CancelScroll(); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
282 window->RemoveObserver(this); | 300 window->RemoveObserver(this); |
283 owner_ = NULL; | 301 owner_ = NULL; |
284 if (!slider_.get()) | 302 if (!slider_.get()) |
285 delete this; | 303 delete this; |
286 } else { | 304 } else { |
287 NOTREACHED(); | 305 NOTREACHED(); |
288 } | 306 } |
289 } | 307 } |
290 | 308 |
291 } // namespace content | 309 } // namespace content |
OLD | NEW |