| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |