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

Side by Side 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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/android/compositor/tab_content_manager.h" 5 #include "chrome/browser/android/compositor/tab_content_manager.h"
6 6
7 #include <android/bitmap.h> 7 #include <android/bitmap.h>
8 8
9 #include "base/android/jni_android.h" 9 #include "base/android/jni_android.h"
10 #include "base/android/jni_string.h" 10 #include "base/android/jni_string.h"
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 // static 121 // static
122 TabContentManager* TabContentManager::FromJavaObject(jobject jobj) { 122 TabContentManager* TabContentManager::FromJavaObject(jobject jobj) {
123 if (!jobj) 123 if (!jobj)
124 return NULL; 124 return NULL;
125 return reinterpret_cast<TabContentManager*>( 125 return reinterpret_cast<TabContentManager*>(
126 Java_TabContentManager_getNativePtr(base::android::AttachCurrentThread(), 126 Java_TabContentManager_getNativePtr(base::android::AttachCurrentThread(),
127 jobj)); 127 jobj));
128 } 128 }
129 129
130 TabContentManager::TabContentManager(JNIEnv* env, 130 TabContentManager::TabContentManager(JNIEnv* env,
131 jobject obj, 131 jobject obj)
132 jstring disk_cache_path, 132 : weak_java_tab_content_manager_(env, obj), weak_factory_(this) {}
133 jint default_cache_size,
134 jint approximation_cache_size,
135 jint compression_queue_max_size,
136 jint write_queue_max_size,
137 jboolean use_approximation_thumbnail)
138 : weak_java_tab_content_manager_(env, obj), weak_factory_(this) {
139 std::string disk_cache_path_str =
140 base::android::ConvertJavaStringToUTF8(env, disk_cache_path);
141 thumbnail_cache_ = make_scoped_ptr(new ThumbnailCache(
142 disk_cache_path_str, (size_t)default_cache_size,
143 (size_t)approximation_cache_size, (size_t)compression_queue_max_size,
144 (size_t)write_queue_max_size, use_approximation_thumbnail));
145 thumbnail_cache_->AddThumbnailCacheObserver(this);
146 }
147 133
148 TabContentManager::~TabContentManager() { 134 TabContentManager::~TabContentManager() {
149 } 135 }
150 136
151 void TabContentManager::Destroy(JNIEnv* env, jobject obj) { 137 void TabContentManager::Destroy(JNIEnv* env, jobject obj) {
152 thumbnail_cache_->RemoveThumbnailCacheObserver(this); 138 GetThumbnailCache()->RemoveThumbnailCacheObserver(this);
153 delete this; 139 delete this;
154 } 140 }
155 141
156 void TabContentManager::SetUIResourceProvider(JNIEnv* env, 142 void TabContentManager::SetUIResourceProvider(JNIEnv* env,
157 jobject obj, 143 jobject obj,
158 jlong ui_resource_provider_ptr) { 144 jlong ui_resource_provider_ptr) {
159 ui::UIResourceProvider* ui_resource_provider = 145 ui::UIResourceProvider* ui_resource_provider =
160 reinterpret_cast<ui::UIResourceProvider*>(ui_resource_provider_ptr); 146 reinterpret_cast<ui::UIResourceProvider*>(ui_resource_provider_ptr);
161 SetUIResourceProvider(ui_resource_provider); 147 SetUIResourceProvider(ui_resource_provider);
162 } 148 }
163 149
164 void TabContentManager::SetUIResourceProvider( 150 void TabContentManager::SetUIResourceProvider(
165 ui::UIResourceProvider* ui_resource_provider) { 151 ui::UIResourceProvider* ui_resource_provider) {
166 thumbnail_cache_->SetUIResourceProvider(ui_resource_provider); 152 GetThumbnailCache()->SetUIResourceProvider(ui_resource_provider);
167 } 153 }
168 154
169 scoped_refptr<cc::Layer> TabContentManager::GetLiveLayer(int tab_id) { 155 scoped_refptr<cc::Layer> TabContentManager::GetLiveLayer(int tab_id) {
170 scoped_refptr<cc::Layer> layer = live_layer_list_[tab_id]; 156 scoped_refptr<cc::Layer> layer = live_layer_list_[tab_id];
171 if (!layer.get()) 157 if (!layer.get())
172 return NULL; 158 return NULL;
173 159
174 return layer; 160 return layer;
175 } 161 }
176 162
177 scoped_refptr<ThumbnailLayer> TabContentManager::GetStaticLayer( 163 scoped_refptr<ThumbnailLayer> TabContentManager::GetStaticLayer(
178 int tab_id, 164 int tab_id,
179 bool force_disk_read) { 165 bool force_disk_read) {
180 Thumbnail* thumbnail = thumbnail_cache_->Get(tab_id, force_disk_read, true); 166 Thumbnail* thumbnail =
167 GetThumbnailCache()->Get(tab_id, force_disk_read, true);
181 scoped_refptr<ThumbnailLayer> static_layer = static_layer_cache_[tab_id]; 168 scoped_refptr<ThumbnailLayer> static_layer = static_layer_cache_[tab_id];
182 169
183 if (!thumbnail || !thumbnail->ui_resource_id()) { 170 if (!thumbnail || !thumbnail->ui_resource_id()) {
184 if (static_layer.get()) { 171 if (static_layer.get()) {
185 static_layer->layer()->RemoveFromParent(); 172 static_layer->layer()->RemoveFromParent();
186 static_layer_cache_.erase(tab_id); 173 static_layer_cache_.erase(tab_id);
187 } 174 }
188 return NULL; 175 return NULL;
189 } 176 }
190 177
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
230 JNIEnv* env = base::android::AttachCurrentThread(); 217 JNIEnv* env = base::android::AttachCurrentThread();
231 ScopedJavaLocalRef<jobject> java_bitmap; 218 ScopedJavaLocalRef<jobject> java_bitmap;
232 if (success) 219 if (success)
233 java_bitmap = gfx::ConvertToJavaBitmap(&bitmap); 220 java_bitmap = gfx::ConvertToJavaBitmap(&bitmap);
234 221
235 Java_TabContentManager_notifyDecompressBitmapFinished( 222 Java_TabContentManager_notifyDecompressBitmapFinished(
236 env, weak_java_tab_content_manager_.get(env).obj(), tab_id, 223 env, weak_java_tab_content_manager_.get(env).obj(), tab_id,
237 java_bitmap.obj()); 224 java_bitmap.obj());
238 } 225 }
239 226
227 void TabContentManager::SetThumbnailCache(
228 JNIEnv* env,
229 jobject obj,
230 jlong thumbnail_cache_ptr) {
231 ThumbnailCache* cache =
232 reinterpret_cast<ThumbnailCache*>(thumbnail_cache_ptr);
233 // It is okay to call this twice with the same cache pointer, but we should
234 // only set and add the observer once.
235 DCHECK(!thumbnail_cache_ || thumbnail_cache_.get() == cache);
236 if (!thumbnail_cache_) {
237 thumbnail_cache_ = make_scoped_ptr(cache);
238 thumbnail_cache_->AddThumbnailCacheObserver(this);
239 }
240 }
241
240 jboolean TabContentManager::HasFullCachedThumbnail(JNIEnv* env, 242 jboolean TabContentManager::HasFullCachedThumbnail(JNIEnv* env,
241 jobject obj, 243 jobject obj,
242 jint tab_id) { 244 jint tab_id) {
243 return thumbnail_cache_->Get(tab_id, false, false) != nullptr; 245 return GetThumbnailCache()->Get(tab_id, false, false) != nullptr;
244 } 246 }
245 247
246 void TabContentManager::CacheTab(JNIEnv* env, 248 void TabContentManager::CacheTab(JNIEnv* env,
247 jobject obj, 249 jobject obj,
248 jobject tab, 250 jobject tab,
249 jobject content_view_core, 251 jobject content_view_core,
250 jfloat thumbnail_scale) { 252 jfloat thumbnail_scale) {
251 TabAndroid* tab_android = TabAndroid::GetNativeTab(env, tab); 253 TabAndroid* tab_android = TabAndroid::GetNativeTab(env, tab);
252 DCHECK(tab_android); 254 DCHECK(tab_android);
253 int tab_id = tab_android->GetAndroidId(); 255 int tab_id = tab_android->GetAndroidId();
254 GURL url = tab_android->GetURL(); 256 GURL url = tab_android->GetURL();
255 257
256 content::ContentViewCore* view = 258 content::ContentViewCore* view =
257 content::ContentViewCore::GetNativeContentViewCore(env, 259 content::ContentViewCore::GetNativeContentViewCore(env,
258 content_view_core); 260 content_view_core);
259 261
260 if (thumbnail_cache_->CheckAndUpdateThumbnailMetaData(tab_id, url)) { 262 if (GetThumbnailCache()->CheckAndUpdateThumbnailMetaData(tab_id, url)) {
261 if (!view || 263 if (!view ||
262 !view->GetWebContents() 264 !view->GetWebContents()
263 ->GetRenderViewHost() 265 ->GetRenderViewHost()
264 ->CanCopyFromBackingStore() || 266 ->CanCopyFromBackingStore() ||
265 pending_tab_readbacks_.find(tab_id) != pending_tab_readbacks_.end() || 267 pending_tab_readbacks_.find(tab_id) != pending_tab_readbacks_.end() ||
266 pending_tab_readbacks_.size() >= kMaxReadbacks) { 268 pending_tab_readbacks_.size() >= kMaxReadbacks) {
267 thumbnail_cache_->Remove(tab_id); 269 GetThumbnailCache()->Remove(tab_id);
268 return; 270 return;
269 } 271 }
270 272
271 TabReadbackCallback readback_done_callback = 273 TabReadbackCallback readback_done_callback =
272 base::Bind(&TabContentManager::PutThumbnailIntoCache, 274 base::Bind(&TabContentManager::PutThumbnailIntoCache,
273 weak_factory_.GetWeakPtr(), tab_id); 275 weak_factory_.GetWeakPtr(), tab_id);
274 scoped_ptr<TabReadbackRequest> readback_request = 276 scoped_ptr<TabReadbackRequest> readback_request =
275 make_scoped_ptr(new TabReadbackRequest( 277 make_scoped_ptr(new TabReadbackRequest(
276 content_view_core, thumbnail_scale, readback_done_callback)); 278 content_view_core, thumbnail_scale, readback_done_callback));
277 pending_tab_readbacks_.set(tab_id, readback_request.Pass()); 279 pending_tab_readbacks_.set(tab_id, readback_request.Pass());
278 pending_tab_readbacks_.get(tab_id)->Run(); 280 pending_tab_readbacks_.get(tab_id)->Run();
279 } 281 }
280 } 282 }
281 283
282 void TabContentManager::CacheTabWithBitmap(JNIEnv* env, 284 void TabContentManager::CacheTabWithBitmap(JNIEnv* env,
283 jobject obj, 285 jobject obj,
284 jobject tab, 286 jobject tab,
285 jobject bitmap, 287 jobject bitmap,
286 jfloat thumbnail_scale) { 288 jfloat thumbnail_scale) {
287 TabAndroid* tab_android = TabAndroid::GetNativeTab(env, tab); 289 TabAndroid* tab_android = TabAndroid::GetNativeTab(env, tab);
288 DCHECK(tab_android); 290 DCHECK(tab_android);
289 int tab_id = tab_android->GetAndroidId(); 291 int tab_id = tab_android->GetAndroidId();
290 GURL url = tab_android->GetURL(); 292 GURL url = tab_android->GetURL();
291 293
292 gfx::JavaBitmap java_bitmap_lock(bitmap); 294 gfx::JavaBitmap java_bitmap_lock(bitmap);
293 SkBitmap skbitmap = gfx::CreateSkBitmapFromJavaBitmap(java_bitmap_lock); 295 SkBitmap skbitmap = gfx::CreateSkBitmapFromJavaBitmap(java_bitmap_lock);
294 skbitmap.setImmutable(); 296 skbitmap.setImmutable();
295 297
296 if (thumbnail_cache_->CheckAndUpdateThumbnailMetaData(tab_id, url)) 298 if (GetThumbnailCache()->CheckAndUpdateThumbnailMetaData(tab_id, url))
297 PutThumbnailIntoCache(tab_id, thumbnail_scale, skbitmap); 299 PutThumbnailIntoCache(tab_id, thumbnail_scale, skbitmap);
298 } 300 }
299 301
300 void TabContentManager::InvalidateIfChanged(JNIEnv* env, 302 void TabContentManager::InvalidateIfChanged(JNIEnv* env,
301 jobject obj, 303 jobject obj,
302 jint tab_id, 304 jint tab_id,
303 jstring jurl) { 305 jstring jurl) {
304 thumbnail_cache_->InvalidateThumbnailIfChanged( 306 GetThumbnailCache()->InvalidateThumbnailIfChanged(
305 tab_id, GURL(base::android::ConvertJavaStringToUTF8(env, jurl))); 307 tab_id, GURL(base::android::ConvertJavaStringToUTF8(env, jurl)));
306 } 308 }
307 309
308 void TabContentManager::UpdateVisibleIds(JNIEnv* env, 310 void TabContentManager::UpdateVisibleIds(JNIEnv* env,
309 jobject obj, 311 jobject obj,
310 jintArray priority) { 312 jintArray priority) {
311 std::list<int> priority_ids; 313 std::list<int> priority_ids;
312 jsize length = env->GetArrayLength(priority); 314 jsize length = env->GetArrayLength(priority);
313 jint* ints = env->GetIntArrayElements(priority, NULL); 315 jint* ints = env->GetIntArrayElements(priority, NULL);
314 for (jsize i = 0; i < length; ++i) 316 for (jsize i = 0; i < length; ++i)
315 priority_ids.push_back(static_cast<int>(ints[i])); 317 priority_ids.push_back(static_cast<int>(ints[i]));
316 318
317 env->ReleaseIntArrayElements(priority, ints, JNI_ABORT); 319 env->ReleaseIntArrayElements(priority, ints, JNI_ABORT);
318 thumbnail_cache_->UpdateVisibleIds(priority_ids); 320 GetThumbnailCache()->UpdateVisibleIds(priority_ids);
319 } 321 }
320 322
321 void TabContentManager::RemoveTabThumbnail(JNIEnv* env, 323 void TabContentManager::RemoveTabThumbnail(JNIEnv* env,
322 jobject obj, 324 jobject obj,
323 jint tab_id) { 325 jint tab_id) {
324 TabReadbackRequestMap::iterator readback_iter = 326 TabReadbackRequestMap::iterator readback_iter =
325 pending_tab_readbacks_.find(tab_id); 327 pending_tab_readbacks_.find(tab_id);
326 if (readback_iter != pending_tab_readbacks_.end()) 328 if (readback_iter != pending_tab_readbacks_.end())
327 readback_iter->second->SetToDropAfterReadback(); 329 readback_iter->second->SetToDropAfterReadback();
328 thumbnail_cache_->Remove(tab_id); 330 GetThumbnailCache()->Remove(tab_id);
329 } 331 }
330 332
331 void TabContentManager::RemoveTabThumbnailFromDiskAtAndAboveId( 333 void TabContentManager::RemoveTabThumbnailFromDiskAtAndAboveId(
332 JNIEnv* env, 334 JNIEnv* env,
333 jobject obj, 335 jobject obj,
334 jint min_forbidden_id) { 336 jint min_forbidden_id) {
335 thumbnail_cache_->RemoveFromDiskAtAndAboveId(min_forbidden_id); 337 GetThumbnailCache()->RemoveFromDiskAtAndAboveId(min_forbidden_id);
336 } 338 }
337 339
338 void TabContentManager::GetDecompressedThumbnail(JNIEnv* env, 340 void TabContentManager::GetDecompressedThumbnail(JNIEnv* env,
339 jobject obj, 341 jobject obj,
340 jint tab_id) { 342 jint tab_id) {
341 base::Callback<void(bool, SkBitmap)> decompress_done_callback = 343 base::Callback<void(bool, SkBitmap)> decompress_done_callback =
342 base::Bind(&TabContentManager::OnFinishDecompressThumbnail, 344 base::Bind(&TabContentManager::OnFinishDecompressThumbnail,
343 weak_factory_.GetWeakPtr(), reinterpret_cast<int>(tab_id)); 345 weak_factory_.GetWeakPtr(), reinterpret_cast<int>(tab_id));
344 thumbnail_cache_->DecompressThumbnailFromFile(reinterpret_cast<int>(tab_id), 346 GetThumbnailCache()->DecompressThumbnailFromFile(
345 decompress_done_callback); 347 reinterpret_cast<int>(tab_id), decompress_done_callback);
346 } 348 }
347 349
348 void TabContentManager::OnFinishedThumbnailRead(int tab_id) { 350 void TabContentManager::OnFinishedThumbnailRead(int tab_id) {
349 JNIEnv* env = base::android::AttachCurrentThread(); 351 JNIEnv* env = base::android::AttachCurrentThread();
350 Java_TabContentManager_notifyListenersOfThumbnailChange( 352 Java_TabContentManager_notifyListenersOfThumbnailChange(
351 env, weak_java_tab_content_manager_.get(env).obj(), tab_id); 353 env, weak_java_tab_content_manager_.get(env).obj(), tab_id);
352 } 354 }
353 355
356 ThumbnailCache* TabContentManager::GetThumbnailCache() {
357 if (thumbnail_cache_ == nullptr) {
358 JNIEnv* env = base::android::AttachCurrentThread();
359
360 jlong thumbnail_cache_ptr =
361 Java_TabContentManager_blockOnThumbnailCacheCreation(
362 env, weak_java_tab_content_manager_.get(env).obj());
363 DCHECK(thumbnail_cache_ptr != 0);
364 SetThumbnailCache(env,
365 weak_java_tab_content_manager_.get(env).obj(),
366 thumbnail_cache_ptr);
367 }
368 DCHECK(thumbnail_cache_ != nullptr);
369 return thumbnail_cache_.get();
370 }
371
354 void TabContentManager::PutThumbnailIntoCache(int tab_id, 372 void TabContentManager::PutThumbnailIntoCache(int tab_id,
355 float thumbnail_scale, 373 float thumbnail_scale,
356 const SkBitmap& bitmap) { 374 const SkBitmap& bitmap) {
357 TabReadbackRequestMap::iterator readback_iter = 375 TabReadbackRequestMap::iterator readback_iter =
358 pending_tab_readbacks_.find(tab_id); 376 pending_tab_readbacks_.find(tab_id);
359 377
360 if (readback_iter != pending_tab_readbacks_.end()) 378 if (readback_iter != pending_tab_readbacks_.end())
361 pending_tab_readbacks_.erase(tab_id); 379 pending_tab_readbacks_.erase(tab_id);
362 380
363 if (thumbnail_scale > 0 && !bitmap.empty()) 381 if (thumbnail_scale > 0 && !bitmap.empty())
364 thumbnail_cache_->Put(tab_id, bitmap, thumbnail_scale); 382 GetThumbnailCache()->Put(tab_id, bitmap, thumbnail_scale);
365 } 383 }
366 384
367 bool RegisterTabContentManager(JNIEnv* env) { 385 bool RegisterTabContentManager(JNIEnv* env) {
368 return RegisterNativesImpl(env); 386 return RegisterNativesImpl(env);
369 } 387 }
370 388
371 // ---------------------------------------------------------------------------- 389 // ----------------------------------------------------------------------------
372 // Native JNI methods 390 // Native JNI methods
373 // ---------------------------------------------------------------------------- 391 // ----------------------------------------------------------------------------
374 392
375 jlong Init(JNIEnv* env, 393 jlong Init(JNIEnv* env, jobject obj) {
376 jobject obj, 394 TabContentManager* manager = new TabContentManager(env, obj);
377 jstring disk_cache_path,
378 jint default_cache_size,
379 jint approximation_cache_size,
380 jint compression_queue_max_size,
381 jint write_queue_max_size,
382 jboolean use_approximation_thumbnail) {
383 TabContentManager* manager = new TabContentManager(
384 env, obj, disk_cache_path, default_cache_size, approximation_cache_size,
385 compression_queue_max_size, write_queue_max_size,
386 use_approximation_thumbnail);
387 return reinterpret_cast<intptr_t>(manager); 395 return reinterpret_cast<intptr_t>(manager);
388 } 396 }
389 397
398 jlong CreateThumbnailCache(JNIEnv* env,
399 jclass caller,
400 jstring disk_cache_path,
401 jint default_cache_size,
402 jint approximation_cache_size,
403 jint compression_queue_max_size,
404 jint write_queue_max_size,
405 jboolean use_approximation_thumbnail) {
406 std::string disk_cache_path_str =
407 base::android::ConvertJavaStringToUTF8(env, disk_cache_path);
408 return reinterpret_cast<intptr_t>(new ThumbnailCache(
409 disk_cache_path_str, (size_t)default_cache_size,
410 (size_t)approximation_cache_size, (size_t)compression_queue_max_size,
411 (size_t)write_queue_max_size, use_approximation_thumbnail));
412 }
413
414 void DestroyThumbnailCache(JNIEnv* env,
415 jclass caller,
416 jlong thumbnail_cache_ptr) {
417 delete reinterpret_cast<ThumbnailCache*>(thumbnail_cache_ptr);
418 }
419
390 } // namespace android 420 } // namespace android
391 } // namespace chrome 421 } // namespace chrome
OLDNEW
« 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