Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(164)

Side by Side Diff: content/browser/web_contents/aura/window_slider.cc

Issue 16950023: aura: Use the WindowSlider for gesture-nav while the page is reloading. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: test-self-review Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698