Commit ba709b18 authored by Jinsuk Kim's avatar Jinsuk Kim Committed by Commit Bot

GestureNav: Fix a bug in OverlaySceneLayer destruction

The crash at OverlaySceneLayer destructor comes apparently from
ui::WindowAndroid being in the destroyed state while its
::RemoveObserver method is called. It makes OverlaySceneLayer
destructor not the appropriate place to call it, since the
destruction order of the objects are not clear.

This CL changes the place where WindowAndroidObserver is added
or deleted i.e. when WindowAndroid's compositor is attached
or detached. WindowAndroid is guaranteed to be available
when these observer event is invoked, so it's safe to do the
operation.

Bug: 1120832
Change-Id: Ib43c420f4d5af51fca4377e92d46a408d41e86f8
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2371384Reviewed-by: default avatarMatthew Jones <mdjones@chromium.org>
Commit-Queue: Jinsuk Kim <jinsukkim@chromium.org>
Cr-Commit-Position: refs/heads/master@{#801125}
parent cfea72ea
...@@ -18,12 +18,11 @@ OverscrollSceneLayer::OverscrollSceneLayer(JNIEnv* env, ...@@ -18,12 +18,11 @@ OverscrollSceneLayer::OverscrollSceneLayer(JNIEnv* env,
: SceneLayer(env, jobj), : SceneLayer(env, jobj),
window_(ui::WindowAndroid::FromJavaWindowAndroid(jwindow)), window_(ui::WindowAndroid::FromJavaWindowAndroid(jwindow)),
glow_effect_(std::make_unique<ui::OverscrollGlow>(this)) { glow_effect_(std::make_unique<ui::OverscrollGlow>(this)) {
window_->AddObserver(this); if (window_->GetCompositor())
window_->AddObserver(this);
} }
OverscrollSceneLayer::~OverscrollSceneLayer() { OverscrollSceneLayer::~OverscrollSceneLayer() {}
window_->RemoveObserver(this);
}
std::unique_ptr<ui::EdgeEffect> OverscrollSceneLayer::CreateEdgeEffect() { std::unique_ptr<ui::EdgeEffect> OverscrollSceneLayer::CreateEdgeEffect() {
return std::make_unique<ui::EdgeEffect>(resource_manager_); return std::make_unique<ui::EdgeEffect>(resource_manager_);
...@@ -72,6 +71,14 @@ void OverscrollSceneLayer::OnAnimate(base::TimeTicks frame_time) { ...@@ -72,6 +71,14 @@ void OverscrollSceneLayer::OnAnimate(base::TimeTicks frame_time) {
window_->SetNeedsAnimate(); window_->SetNeedsAnimate();
} }
void OverscrollSceneLayer::OnAttachCompositor() {
window_->AddObserver(this);
}
void OverscrollSceneLayer::OnDetachCompositor() {
window_->RemoveObserver(this);
}
void OverscrollSceneLayer::SetContentTree( void OverscrollSceneLayer::SetContentTree(
JNIEnv* env, JNIEnv* env,
const JavaParamRef<jobject>& jobj, const JavaParamRef<jobject>& jobj,
......
...@@ -52,8 +52,8 @@ class OverscrollSceneLayer : public SceneLayer, ...@@ -52,8 +52,8 @@ class OverscrollSceneLayer : public SceneLayer,
// ui::WindowAndroidObserver implementation. // ui::WindowAndroidObserver implementation.
void OnCompositingDidCommit() override {} void OnCompositingDidCommit() override {}
void OnRootWindowVisibilityChanged(bool visible) override {} void OnRootWindowVisibilityChanged(bool visible) override {}
void OnAttachCompositor() override {} void OnAttachCompositor() override;
void OnDetachCompositor() override {} void OnDetachCompositor() override;
void OnAnimate(base::TimeTicks begin_frame_time) override; void OnAnimate(base::TimeTicks begin_frame_time) override;
void OnActivityStopped() override {} void OnActivityStopped() override {}
void OnActivityStarted() override {} void OnActivityStarted() override {}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment