| Index: chrome/browser/android/compositor/scene_layer/tab_list_scene_layer.cc
|
| diff --git a/chrome/browser/android/compositor/scene_layer/tab_list_scene_layer.cc b/chrome/browser/android/compositor/scene_layer/tab_list_scene_layer.cc
|
| index c61ff1f1389ae84ad1859eea62344e95c97a7034..a942971bd876fa20a420a2f3c64eda3d7953aa22 100644
|
| --- a/chrome/browser/android/compositor/scene_layer/tab_list_scene_layer.cc
|
| +++ b/chrome/browser/android/compositor/scene_layer/tab_list_scene_layer.cc
|
| @@ -19,6 +19,7 @@ namespace android {
|
| TabListSceneLayer::TabListSceneLayer(JNIEnv* env, jobject jobj)
|
| : SceneLayer(env, jobj),
|
| content_obscures_self_(false),
|
| + write_index_(0),
|
| resource_manager_(nullptr),
|
| layer_title_cache_(nullptr),
|
| tab_content_manager_(nullptr),
|
| @@ -32,25 +33,14 @@ TabListSceneLayer::~TabListSceneLayer() {
|
|
|
| void TabListSceneLayer::BeginBuildingFrame(JNIEnv* env,
|
| const JavaParamRef<jobject>& jobj) {
|
| + write_index_ = 0;
|
| content_obscures_self_ = false;
|
| -
|
| - // Remove (and re-add) all layers every frame to guarantee that z-order
|
| - // matches PutTabLayer call order.
|
| - for (auto tab : tab_map_)
|
| - tab.second->layer()->RemoveFromParent();
|
| }
|
|
|
| void TabListSceneLayer::FinishBuildingFrame(JNIEnv* env,
|
| const JavaParamRef<jobject>& jobj) {
|
| - // Destroy all tabs that weren't used this frame.
|
| - for (auto it = tab_map_.cbegin(); it != tab_map_.cend();) {
|
| - if (visible_tabs_this_frame_.find(it->first) ==
|
| - visible_tabs_this_frame_.end())
|
| - it = tab_map_.erase(it);
|
| - else
|
| - ++it;
|
| - }
|
| - visible_tabs_this_frame_.clear();
|
| + if (layers_.size() > write_index_)
|
| + RemoveTabLayersInRange(write_index_, layers_.size());
|
| }
|
|
|
| void TabListSceneLayer::UpdateLayer(
|
| @@ -135,18 +125,8 @@ void TabListSceneLayer::PutTabLayer(
|
| jfloat side_border_scale,
|
| jboolean attach_content,
|
| jboolean inset_border) {
|
| - scoped_refptr<TabLayer> layer;
|
| - auto iter = tab_map_.find(id);
|
| - if (iter != tab_map_.end()) {
|
| - layer = iter->second;
|
| - } else {
|
| - layer = TabLayer::Create(incognito, resource_manager_, layer_title_cache_,
|
| - tab_content_manager_);
|
| - tab_map_.insert(TabMap::value_type(id, layer));
|
| - }
|
| - own_tree_->AddChild(layer->layer());
|
| - visible_tabs_this_frame_.insert(id);
|
| -
|
| + scoped_refptr<TabLayer> layer = GetNextLayer(incognito);
|
| + // https://crbug.com/517314: GetNextLayer() returns null in some corner cases.
|
| DCHECK(layer);
|
| if (layer) {
|
| layer->SetProperties(
|
| @@ -180,9 +160,7 @@ base::android::ScopedJavaLocalRef<jobject> TabListSceneLayer::GetJavaObject(
|
|
|
| void TabListSceneLayer::OnDetach() {
|
| SceneLayer::OnDetach();
|
| - for (auto tab : tab_map_)
|
| - tab.second->layer()->RemoveFromParent();
|
| - tab_map_.clear();
|
| + RemoveAllRemainingTabLayers();
|
| }
|
|
|
| bool TabListSceneLayer::ShouldShowBackground() {
|
| @@ -193,6 +171,40 @@ SkColor TabListSceneLayer::GetBackgroundColor() {
|
| return background_color_;
|
| }
|
|
|
| +void TabListSceneLayer::RemoveAllRemainingTabLayers() {
|
| + if (layers_.size() > 0)
|
| + RemoveTabLayersInRange(0, layers_.size());
|
| +}
|
| +
|
| +void TabListSceneLayer::RemoveTabLayersInRange(unsigned start, unsigned end) {
|
| + DCHECK_LT(start, end);
|
| + DCHECK_LE(end, layers_.size());
|
| + DCHECK_LE(0u, start);
|
| + for (unsigned i = start; i < end; ++i)
|
| + layers_[i]->layer()->RemoveFromParent();
|
| + layers_.erase(layers_.begin() + start, layers_.begin() + end);
|
| +}
|
| +
|
| +scoped_refptr<TabLayer> TabListSceneLayer::GetNextLayer(bool incognito) {
|
| + while (write_index_ < layers_.size()) {
|
| + scoped_refptr<TabLayer> potential = layers_[write_index_];
|
| + if (potential->is_incognito() == incognito)
|
| + break;
|
| + potential->layer()->RemoveFromParent();
|
| + layers_.erase(layers_.begin() + write_index_);
|
| + }
|
| +
|
| + if (write_index_ < layers_.size())
|
| + return layers_[write_index_++];
|
| +
|
| + scoped_refptr<TabLayer> layer = TabLayer::Create(
|
| + incognito, resource_manager_, layer_title_cache_, tab_content_manager_);
|
| + layers_.push_back(layer);
|
| + own_tree_->AddChild(layer->layer());
|
| + write_index_++;
|
| + return layer;
|
| +}
|
| +
|
| static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& jobj) {
|
| // This will automatically bind to the Java object and pass ownership there.
|
| TabListSceneLayer* scene_layer = new TabListSceneLayer(env, jobj);
|
|
|