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

Unified Diff: chrome/browser/android/compositor/tab_content_manager.cc

Issue 1124333002: Refactor TabContentManager to async create ThumbnailCache. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Native handle multiple calls. Created 5 years, 7 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
Index: chrome/browser/android/compositor/tab_content_manager.cc
diff --git a/chrome/browser/android/compositor/tab_content_manager.cc b/chrome/browser/android/compositor/tab_content_manager.cc
index 0340aac2e6c08de88c0b6449ad06a400dd81f596..b038636fa1cedb47cec76d0e6d3e8a6247fcaf7c 100644
--- a/chrome/browser/android/compositor/tab_content_manager.cc
+++ b/chrome/browser/android/compositor/tab_content_manager.cc
@@ -128,28 +128,14 @@ TabContentManager* TabContentManager::FromJavaObject(jobject jobj) {
}
TabContentManager::TabContentManager(JNIEnv* env,
- jobject obj,
- jstring disk_cache_path,
- jint default_cache_size,
- jint approximation_cache_size,
- jint compression_queue_max_size,
- jint write_queue_max_size,
- jboolean use_approximation_thumbnail)
- : weak_java_tab_content_manager_(env, obj), weak_factory_(this) {
- std::string disk_cache_path_str =
- base::android::ConvertJavaStringToUTF8(env, disk_cache_path);
- thumbnail_cache_ = make_scoped_ptr(new ThumbnailCache(
- disk_cache_path_str, (size_t)default_cache_size,
- (size_t)approximation_cache_size, (size_t)compression_queue_max_size,
- (size_t)write_queue_max_size, use_approximation_thumbnail));
- thumbnail_cache_->AddThumbnailCacheObserver(this);
-}
+ jobject obj)
+ : weak_java_tab_content_manager_(env, obj), weak_factory_(this) {}
TabContentManager::~TabContentManager() {
}
void TabContentManager::Destroy(JNIEnv* env, jobject obj) {
- thumbnail_cache_->RemoveThumbnailCacheObserver(this);
+ GetThumbnailCache()->RemoveThumbnailCacheObserver(this);
delete this;
}
@@ -163,7 +149,7 @@ void TabContentManager::SetUIResourceProvider(JNIEnv* env,
void TabContentManager::SetUIResourceProvider(
ui::UIResourceProvider* ui_resource_provider) {
- thumbnail_cache_->SetUIResourceProvider(ui_resource_provider);
+ GetThumbnailCache()->SetUIResourceProvider(ui_resource_provider);
}
scoped_refptr<cc::Layer> TabContentManager::GetLiveLayer(int tab_id) {
@@ -177,7 +163,8 @@ scoped_refptr<cc::Layer> TabContentManager::GetLiveLayer(int tab_id) {
scoped_refptr<ThumbnailLayer> TabContentManager::GetStaticLayer(
int tab_id,
bool force_disk_read) {
- Thumbnail* thumbnail = thumbnail_cache_->Get(tab_id, force_disk_read, true);
+ Thumbnail* thumbnail =
+ GetThumbnailCache()->Get(tab_id, force_disk_read, true);
scoped_refptr<ThumbnailLayer> static_layer = static_layer_cache_[tab_id];
if (!thumbnail || !thumbnail->ui_resource_id()) {
@@ -237,10 +224,25 @@ void TabContentManager::OnFinishDecompressThumbnail(int tab_id,
java_bitmap.obj());
}
+void TabContentManager::SetThumbnailCache(
+ JNIEnv* env,
+ jobject obj,
+ jlong thumbnail_cache_ptr) {
+ ThumbnailCache* cache =
+ reinterpret_cast<ThumbnailCache*>(thumbnail_cache_ptr);
+ // It is okay to call this twice with the same cache pointer, but we should
+ // only set and add the observer once.
+ DCHECK(!thumbnail_cache_ || thumbnail_cache_.get() == cache);
+ if (!thumbnail_cache_) {
+ thumbnail_cache_ = make_scoped_ptr(cache);
+ thumbnail_cache_->AddThumbnailCacheObserver(this);
+ }
+}
+
jboolean TabContentManager::HasFullCachedThumbnail(JNIEnv* env,
jobject obj,
jint tab_id) {
- return thumbnail_cache_->Get(tab_id, false, false) != nullptr;
+ return GetThumbnailCache()->Get(tab_id, false, false) != nullptr;
}
void TabContentManager::CacheTab(JNIEnv* env,
@@ -257,14 +259,14 @@ void TabContentManager::CacheTab(JNIEnv* env,
content::ContentViewCore::GetNativeContentViewCore(env,
content_view_core);
- if (thumbnail_cache_->CheckAndUpdateThumbnailMetaData(tab_id, url)) {
+ if (GetThumbnailCache()->CheckAndUpdateThumbnailMetaData(tab_id, url)) {
if (!view ||
!view->GetWebContents()
->GetRenderViewHost()
->CanCopyFromBackingStore() ||
pending_tab_readbacks_.find(tab_id) != pending_tab_readbacks_.end() ||
pending_tab_readbacks_.size() >= kMaxReadbacks) {
- thumbnail_cache_->Remove(tab_id);
+ GetThumbnailCache()->Remove(tab_id);
return;
}
@@ -293,7 +295,7 @@ void TabContentManager::CacheTabWithBitmap(JNIEnv* env,
SkBitmap skbitmap = gfx::CreateSkBitmapFromJavaBitmap(java_bitmap_lock);
skbitmap.setImmutable();
- if (thumbnail_cache_->CheckAndUpdateThumbnailMetaData(tab_id, url))
+ if (GetThumbnailCache()->CheckAndUpdateThumbnailMetaData(tab_id, url))
PutThumbnailIntoCache(tab_id, thumbnail_scale, skbitmap);
}
@@ -301,7 +303,7 @@ void TabContentManager::InvalidateIfChanged(JNIEnv* env,
jobject obj,
jint tab_id,
jstring jurl) {
- thumbnail_cache_->InvalidateThumbnailIfChanged(
+ GetThumbnailCache()->InvalidateThumbnailIfChanged(
tab_id, GURL(base::android::ConvertJavaStringToUTF8(env, jurl)));
}
@@ -315,7 +317,7 @@ void TabContentManager::UpdateVisibleIds(JNIEnv* env,
priority_ids.push_back(static_cast<int>(ints[i]));
env->ReleaseIntArrayElements(priority, ints, JNI_ABORT);
- thumbnail_cache_->UpdateVisibleIds(priority_ids);
+ GetThumbnailCache()->UpdateVisibleIds(priority_ids);
}
void TabContentManager::RemoveTabThumbnail(JNIEnv* env,
@@ -325,14 +327,14 @@ void TabContentManager::RemoveTabThumbnail(JNIEnv* env,
pending_tab_readbacks_.find(tab_id);
if (readback_iter != pending_tab_readbacks_.end())
readback_iter->second->SetToDropAfterReadback();
- thumbnail_cache_->Remove(tab_id);
+ GetThumbnailCache()->Remove(tab_id);
}
void TabContentManager::RemoveTabThumbnailFromDiskAtAndAboveId(
JNIEnv* env,
jobject obj,
jint min_forbidden_id) {
- thumbnail_cache_->RemoveFromDiskAtAndAboveId(min_forbidden_id);
+ GetThumbnailCache()->RemoveFromDiskAtAndAboveId(min_forbidden_id);
}
void TabContentManager::GetDecompressedThumbnail(JNIEnv* env,
@@ -341,8 +343,8 @@ void TabContentManager::GetDecompressedThumbnail(JNIEnv* env,
base::Callback<void(bool, SkBitmap)> decompress_done_callback =
base::Bind(&TabContentManager::OnFinishDecompressThumbnail,
weak_factory_.GetWeakPtr(), reinterpret_cast<int>(tab_id));
- thumbnail_cache_->DecompressThumbnailFromFile(reinterpret_cast<int>(tab_id),
- decompress_done_callback);
+ GetThumbnailCache()->DecompressThumbnailFromFile(
+ reinterpret_cast<int>(tab_id), decompress_done_callback);
}
void TabContentManager::OnFinishedThumbnailRead(int tab_id) {
@@ -351,6 +353,22 @@ void TabContentManager::OnFinishedThumbnailRead(int tab_id) {
env, weak_java_tab_content_manager_.get(env).obj(), tab_id);
}
+ThumbnailCache* TabContentManager::GetThumbnailCache() {
+ if (thumbnail_cache_ == nullptr) {
+ JNIEnv* env = base::android::AttachCurrentThread();
+
+ jlong thumbnail_cache_ptr =
+ Java_TabContentManager_blockOnThumbnailCacheCreation(
+ env, weak_java_tab_content_manager_.get(env).obj());
+ DCHECK(thumbnail_cache_ptr != 0);
+ SetThumbnailCache(env,
+ weak_java_tab_content_manager_.get(env).obj(),
+ thumbnail_cache_ptr);
+ }
+ DCHECK(thumbnail_cache_ != nullptr);
+ return thumbnail_cache_.get();
+}
+
void TabContentManager::PutThumbnailIntoCache(int tab_id,
float thumbnail_scale,
const SkBitmap& bitmap) {
@@ -361,7 +379,7 @@ void TabContentManager::PutThumbnailIntoCache(int tab_id,
pending_tab_readbacks_.erase(tab_id);
if (thumbnail_scale > 0 && !bitmap.empty())
- thumbnail_cache_->Put(tab_id, bitmap, thumbnail_scale);
+ GetThumbnailCache()->Put(tab_id, bitmap, thumbnail_scale);
}
bool RegisterTabContentManager(JNIEnv* env) {
@@ -372,20 +390,32 @@ bool RegisterTabContentManager(JNIEnv* env) {
// Native JNI methods
// ----------------------------------------------------------------------------
-jlong Init(JNIEnv* env,
- jobject obj,
- jstring disk_cache_path,
- jint default_cache_size,
- jint approximation_cache_size,
- jint compression_queue_max_size,
- jint write_queue_max_size,
- jboolean use_approximation_thumbnail) {
- TabContentManager* manager = new TabContentManager(
- env, obj, disk_cache_path, default_cache_size, approximation_cache_size,
- compression_queue_max_size, write_queue_max_size,
- use_approximation_thumbnail);
+jlong Init(JNIEnv* env, jobject obj) {
+ TabContentManager* manager = new TabContentManager(env, obj);
return reinterpret_cast<intptr_t>(manager);
}
+jlong CreateThumbnailCache(JNIEnv* env,
+ jclass caller,
+ jstring disk_cache_path,
+ jint default_cache_size,
+ jint approximation_cache_size,
+ jint compression_queue_max_size,
+ jint write_queue_max_size,
+ jboolean use_approximation_thumbnail) {
+ std::string disk_cache_path_str =
+ base::android::ConvertJavaStringToUTF8(env, disk_cache_path);
+ return reinterpret_cast<intptr_t>(new ThumbnailCache(
+ disk_cache_path_str, (size_t)default_cache_size,
+ (size_t)approximation_cache_size, (size_t)compression_queue_max_size,
+ (size_t)write_queue_max_size, use_approximation_thumbnail));
+}
+
+void DestroyThumbnailCache(JNIEnv* env,
+ jclass caller,
+ jlong thumbnail_cache_ptr) {
+ delete reinterpret_cast<ThumbnailCache*>(thumbnail_cache_ptr);
+}
+
} // namespace android
} // namespace chrome
« no previous file with comments | « chrome/browser/android/compositor/tab_content_manager.h ('k') | chrome/browser/android/thumbnail/thumbnail_cache.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698