Commit 38451268 authored by David Reveman's avatar David Reveman Committed by Commit Bot

fast_ink: Fix DeleteWhenLastResourceHasBeenReclaimed.

Monitor the root window instead of the aura env to determine
when frame sink holder must be cleaned up. It's too late to
cleanup the holder when aura is being shutdown.

Bug: 814908
Test: Close chrome while fast ink view is visible.
Change-Id: Ia807c9469d791e4d8d4973711cf904592bc05471
Reviewed-on: https://chromium-review.googlesource.com/957222Reviewed-by: default avatarVladislav Kaznacheev <kaznacheev@chromium.org>
Commit-Queue: David Reveman <reveman@chromium.org>
Cr-Commit-Position: refs/heads/master@{#542179}
parent e6c7b426
...@@ -20,8 +20,8 @@ ...@@ -20,8 +20,8 @@
#include "gpu/command_buffer/client/gles2_interface.h" #include "gpu/command_buffer/client/gles2_interface.h"
#include "gpu/command_buffer/client/gpu_memory_buffer_manager.h" #include "gpu/command_buffer/client/gpu_memory_buffer_manager.h"
#include "ui/aura/env.h" #include "ui/aura/env.h"
#include "ui/aura/env_observer.h"
#include "ui/aura/window.h" #include "ui/aura/window.h"
#include "ui/aura/window_observer.h"
#include "ui/aura/window_tree_host.h" #include "ui/aura/window_tree_host.h"
#include "ui/base/layout.h" #include "ui/base/layout.h"
#include "ui/gfx/geometry/dip_util.h" #include "ui/gfx/geometry/dip_util.h"
...@@ -118,7 +118,7 @@ struct FastInkView::Resource { ...@@ -118,7 +118,7 @@ struct FastInkView::Resource {
class FastInkView::LayerTreeFrameSinkHolder class FastInkView::LayerTreeFrameSinkHolder
: public cc::LayerTreeFrameSinkClient, : public cc::LayerTreeFrameSinkClient,
public aura::EnvObserver { public aura::WindowObserver {
public: public:
LayerTreeFrameSinkHolder(FastInkView* view, LayerTreeFrameSinkHolder(FastInkView* view,
std::unique_ptr<cc::LayerTreeFrameSink> frame_sink) std::unique_ptr<cc::LayerTreeFrameSink> frame_sink)
...@@ -128,8 +128,8 @@ class FastInkView::LayerTreeFrameSinkHolder ...@@ -128,8 +128,8 @@ class FastInkView::LayerTreeFrameSinkHolder
~LayerTreeFrameSinkHolder() override { ~LayerTreeFrameSinkHolder() override {
if (frame_sink_) if (frame_sink_)
frame_sink_->DetachFromClient(); frame_sink_->DetachFromClient();
if (env_) if (root_window_)
env_->RemoveObserver(this); root_window_->RemoveObserver(this);
} }
// Delete frame sink after having reclaimed all exported resources. // Delete frame sink after having reclaimed all exported resources.
...@@ -165,15 +165,20 @@ class FastInkView::LayerTreeFrameSinkHolder ...@@ -165,15 +165,20 @@ class FastInkView::LayerTreeFrameSinkHolder
if (holder->exported_resources_.empty()) if (holder->exported_resources_.empty())
return; return;
aura::Env* env = aura::Env::GetInstance(); // Delete sink holder immediately if native window is already gone.
holder->env_ = env; aura::Window* window = holder->view_->GetWidget()->GetNativeView();
if (!window)
return;
aura::Window* root_window = window->GetRootWindow();
holder->root_window_ = root_window;
holder->view_ = nullptr; holder->view_ = nullptr;
// If we have exported resources to reclaim then extend the lifetime of // If we have exported resources to reclaim then extend the lifetime of
// holder by adding it as an aura env observer. The holder will delete // holder by adding it as a root window observer. The holder will delete
// itself when aura shuts down or when all exported resources have been // itself when the root window is removed or when all exported resources
// reclaimed. // have been reclaimed.
env->AddObserver(holder.release()); root_window->AddObserver(holder.release());
} }
void SubmitCompositorFrame(viz::CompositorFrame frame, void SubmitCompositorFrame(viz::CompositorFrame frame,
...@@ -204,7 +209,7 @@ class FastInkView::LayerTreeFrameSinkHolder ...@@ -204,7 +209,7 @@ class FastInkView::LayerTreeFrameSinkHolder
view_->ReclaimResource(std::move(resource)); view_->ReclaimResource(std::move(resource));
} }
if (env_ && exported_resources_.empty()) if (root_window_ && exported_resources_.empty())
ScheduleDelete(); ScheduleDelete();
} }
void SetTreeActivationCallback(const base::Closure& callback) override {} void SetTreeActivationCallback(const base::Closure& callback) override {}
...@@ -219,7 +224,7 @@ class FastInkView::LayerTreeFrameSinkHolder ...@@ -219,7 +224,7 @@ class FastInkView::LayerTreeFrameSinkHolder
void DidDiscardCompositorFrame(uint32_t presentation_token) override {} void DidDiscardCompositorFrame(uint32_t presentation_token) override {}
void DidLoseLayerTreeFrameSink() override { void DidLoseLayerTreeFrameSink() override {
exported_resources_.clear(); exported_resources_.clear();
if (env_) if (root_window_)
ScheduleDelete(); ScheduleDelete();
} }
void OnDraw(const gfx::Transform& transform, void OnDraw(const gfx::Transform& transform,
...@@ -230,11 +235,10 @@ class FastInkView::LayerTreeFrameSinkHolder ...@@ -230,11 +235,10 @@ class FastInkView::LayerTreeFrameSinkHolder
const gfx::Rect& viewport_rect, const gfx::Rect& viewport_rect,
const gfx::Transform& transform) override {} const gfx::Transform& transform) override {}
// Overridden from aura::EnvObserver: // Overridden from aura::WindowObserver:
void OnWindowInitialized(aura::Window* window) override {} void OnWindowDestroying(aura::Window* window) override {
void OnWillDestroyEnv() override { root_window_->RemoveObserver(this);
env_->RemoveObserver(this); root_window_ = nullptr;
env_ = nullptr;
// Make sure frame sink never outlives aura. // Make sure frame sink never outlives aura.
frame_sink_->DetachFromClient(); frame_sink_->DetachFromClient();
frame_sink_.reset(); frame_sink_.reset();
...@@ -255,7 +259,7 @@ class FastInkView::LayerTreeFrameSinkHolder ...@@ -255,7 +259,7 @@ class FastInkView::LayerTreeFrameSinkHolder
exported_resources_; exported_resources_;
gfx::Size last_frame_size_in_pixels_; gfx::Size last_frame_size_in_pixels_;
float last_frame_device_scale_factor_ = 1.0f; float last_frame_device_scale_factor_ = 1.0f;
aura::Env* env_ = nullptr; aura::Window* root_window_ = nullptr;
bool delete_pending_ = false; bool delete_pending_ = false;
DISALLOW_COPY_AND_ASSIGN(LayerTreeFrameSinkHolder); DISALLOW_COPY_AND_ASSIGN(LayerTreeFrameSinkHolder);
......
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