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

Unified Diff: chrome/browser/android/compositor/scene_layer/tab_list_scene_layer.cc

Issue 2272603004: Revert "Make TabLayer recycling sticky to tab_id." (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@2785
Patch Set: Created 4 years, 4 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/android/compositor/scene_layer/tab_list_scene_layer.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
« no previous file with comments | « chrome/browser/android/compositor/scene_layer/tab_list_scene_layer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698