Index: content/browser/android/overscroll_controller_android.cc |
diff --git a/content/browser/android/overscroll_controller_android.cc b/content/browser/android/overscroll_controller_android.cc |
index 5dda6d14eb6256c87fba2650a1b61215ebe14fd3..cce37538760cd4d044ff1b6e893332238a4b4aca 100644 |
--- a/content/browser/android/overscroll_controller_android.cc |
+++ b/content/browser/android/overscroll_controller_android.cc |
@@ -6,12 +6,14 @@ |
#include "base/android/build_info.h" |
#include "base/bind.h" |
+#include "base/command_line.h" |
#include "cc/layers/layer.h" |
#include "cc/output/compositor_frame_metadata.h" |
#include "content/browser/android/edge_effect.h" |
#include "content/browser/android/edge_effect_l.h" |
#include "content/common/input/did_overscroll_params.h" |
#include "content/public/browser/web_contents.h" |
+#include "content/public/common/content_switches.h" |
#include "third_party/WebKit/public/web/WebInputEvent.h" |
#include "ui/base/android/window_android_compositor.h" |
@@ -34,22 +36,47 @@ scoped_ptr<EdgeEffectBase> CreateGlowEdgeEffect( |
new EdgeEffect(resource_manager, dpi_scale)); |
} |
+scoped_ptr<OverscrollGlow> CreateGlowEffect( |
+ ui::WindowAndroidCompositor* compositor, |
+ float dpi_scale) { |
+ if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
+ switches::kDisableOverscrollEdgeEffect)) { |
+ return scoped_ptr<OverscrollGlow>(); |
boliu
2014/11/20 23:12:48
return nullptr should work, the new c++11 hotness
jdduke (slow)
2014/11/20 23:14:54
yay!
|
+ } |
+ |
+ return make_scoped_ptr(new OverscrollGlow( |
+ base::Bind(&CreateGlowEdgeEffect, |
+ &compositor->GetSystemUIResourceManager(), dpi_scale))); |
+} |
+ |
+scoped_ptr<OverscrollRefresh> CreateRefreshEffect( |
+ ui::WindowAndroidCompositor* compositor, |
+ OverscrollRefreshClient* client) { |
+ if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
+ switches::kDisablePullToRefreshEffect)) { |
+ return scoped_ptr<OverscrollRefresh>(); |
boliu
2014/11/20 23:12:48
ditto
jdduke (slow)
2014/11/20 23:14:54
Done.
|
+ } |
+ |
+ return make_scoped_ptr( |
+ new OverscrollRefresh(&compositor->GetSystemUIResourceManager(), client)); |
+} |
+ |
} // namespace |
OverscrollControllerAndroid::OverscrollControllerAndroid( |
WebContents* web_contents, |
ui::WindowAndroidCompositor* compositor, |
float dpi_scale) |
- : WebContentsObserver(web_contents), |
- compositor_(compositor), |
+ : compositor_(compositor), |
dpi_scale_(dpi_scale), |
enabled_(true), |
- glow_effect_(base::Bind(&CreateGlowEdgeEffect, |
- &compositor->GetSystemUIResourceManager(), |
- dpi_scale_)), |
- refresh_effect_(&compositor->GetSystemUIResourceManager(), this), |
+ glow_effect_(CreateGlowEffect(compositor, dpi_scale)), |
+ refresh_effect_(CreateRefreshEffect(compositor, this)), |
triggered_refresh_active_(false) { |
DCHECK(web_contents); |
+ DCHECK(compositor); |
+ if (refresh_effect_) |
+ Observe(web_contents); |
} |
OverscrollControllerAndroid::~OverscrollControllerAndroid() { |
@@ -60,11 +87,14 @@ bool OverscrollControllerAndroid::WillHandleGestureEvent( |
if (!enabled_) |
return false; |
+ if (!refresh_effect_) |
+ return false; |
+ |
bool handled = false; |
bool maybe_needs_animate = false; |
switch (event.type) { |
case blink::WebInputEvent::GestureScrollBegin: |
- refresh_effect_.OnScrollBegin(); |
+ refresh_effect_->OnScrollBegin(); |
break; |
case blink::WebInputEvent::GestureScrollUpdate: { |
@@ -72,11 +102,11 @@ bool OverscrollControllerAndroid::WillHandleGestureEvent( |
event.data.scrollUpdate.deltaY); |
scroll_delta.Scale(dpi_scale_); |
maybe_needs_animate = true; |
- handled = refresh_effect_.WillHandleScrollUpdate(scroll_delta); |
+ handled = refresh_effect_->WillHandleScrollUpdate(scroll_delta); |
} break; |
case blink::WebInputEvent::GestureScrollEnd: |
- refresh_effect_.OnScrollEnd(gfx::Vector2dF()); |
+ refresh_effect_->OnScrollEnd(gfx::Vector2dF()); |
maybe_needs_animate = true; |
break; |
@@ -84,8 +114,8 @@ bool OverscrollControllerAndroid::WillHandleGestureEvent( |
gfx::Vector2dF scroll_velocity(event.data.flingStart.velocityX, |
event.data.flingStart.velocityY); |
scroll_velocity.Scale(dpi_scale_); |
- refresh_effect_.OnScrollEnd(scroll_velocity); |
- if (refresh_effect_.IsActive()) { |
+ refresh_effect_->OnScrollEnd(scroll_velocity); |
+ if (refresh_effect_->IsActive()) { |
// TODO(jdduke): Figure out a cleaner way of suppressing a fling. |
// It's important that the any downstream code sees a scroll-ending |
// event (in this case GestureFlingStart) if it has seen a scroll begin. |
@@ -105,7 +135,7 @@ bool OverscrollControllerAndroid::WillHandleGestureEvent( |
break; |
} |
- if (maybe_needs_animate && refresh_effect_.IsActive()) |
+ if (maybe_needs_animate && refresh_effect_->IsActive()) |
SetNeedsAnimate(); |
return handled; |
@@ -124,12 +154,13 @@ void OverscrollControllerAndroid::OnGestureEventAck( |
OnOverscrolled(DidOverscrollParams()); |
} |
- if (event.type == blink::WebInputEvent::GestureScrollUpdate) { |
+ if (event.type == blink::WebInputEvent::GestureScrollUpdate && |
+ refresh_effect_) { |
// The effect should only be allowed if both the causal touch events go |
// unconsumed and the generated scroll events go unconsumed. |
bool consumed = ack_result == INPUT_EVENT_ACK_STATE_CONSUMED || |
event.data.scrollUpdate.previousUpdateInSequencePrevented; |
- refresh_effect_.OnScrollUpdateAck(consumed); |
+ refresh_effect_->OnScrollUpdateAck(consumed); |
} |
} |
@@ -138,14 +169,16 @@ void OverscrollControllerAndroid::OnOverscrolled( |
if (!enabled_) |
return; |
- if (refresh_effect_.IsActive() || |
- refresh_effect_.IsAwaitingScrollUpdateAck()) { |
+ if (refresh_effect_ && |
+ (refresh_effect_->IsActive() || |
+ refresh_effect_->IsAwaitingScrollUpdateAck())) { |
// An active (or potentially active) refresh effect should always pre-empt |
// the passive glow effect. |
return; |
} |
- if (glow_effect_.OnOverscrolled( |
+ if (glow_effect_ && |
+ glow_effect_->OnOverscrolled( |
base::TimeTicks::Now(), |
gfx::ScaleVector2d(params.accumulated_overscroll, dpi_scale_), |
gfx::ScaleVector2d(params.latest_overscroll_delta, dpi_scale_), |
@@ -162,13 +195,19 @@ bool OverscrollControllerAndroid::Animate(base::TimeTicks current_time, |
if (!enabled_) |
return false; |
- bool needs_animate = refresh_effect_.Animate(current_time, parent_layer); |
- needs_animate |= glow_effect_.Animate(current_time, parent_layer); |
+ bool needs_animate = false; |
+ if (refresh_effect_) |
+ needs_animate |= refresh_effect_->Animate(current_time, parent_layer); |
+ if (glow_effect_) |
+ needs_animate |= glow_effect_->Animate(current_time, parent_layer); |
return needs_animate; |
} |
void OverscrollControllerAndroid::OnFrameMetadataUpdated( |
const cc::CompositorFrameMetadata& frame_metadata) { |
+ if (!refresh_effect_ && !glow_effect_) |
+ return; |
+ |
const float scale_factor = |
frame_metadata.page_scale_factor * frame_metadata.device_scale_factor; |
gfx::SizeF viewport_size = |
@@ -178,9 +217,13 @@ void OverscrollControllerAndroid::OnFrameMetadataUpdated( |
gfx::Vector2dF content_scroll_offset = |
gfx::ScaleVector2d(frame_metadata.root_scroll_offset, scale_factor); |
- refresh_effect_.UpdateDisplay(viewport_size, content_scroll_offset); |
- glow_effect_.UpdateDisplay(viewport_size, content_size, |
- content_scroll_offset); |
+ if (refresh_effect_) |
+ refresh_effect_->UpdateDisplay(viewport_size, content_scroll_offset); |
+ |
+ if (glow_effect_) { |
+ glow_effect_->UpdateDisplay(viewport_size, content_size, |
+ content_scroll_offset); |
+ } |
} |
void OverscrollControllerAndroid::Enable() { |
@@ -192,8 +235,10 @@ void OverscrollControllerAndroid::Disable() { |
return; |
enabled_ = false; |
if (!enabled_) { |
- refresh_effect_.Reset(); |
- glow_effect_.Reset(); |
+ if (refresh_effect_) |
+ refresh_effect_->Reset(); |
+ if (glow_effect_) |
+ glow_effect_->Reset(); |
} |
} |