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 |