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 thumbnail_cache_ = make_scoped_ptr( | |
David Trainor- moved to gerrit
2015/05/08 06:12:38
DCHECK(!thumbnail_cache_). Or handle the case whe
Peter Wen
2015/05/11 16:48:19
Added DCHECK.
We either DCHECK here and keep the
| |
232 reinterpret_cast<ThumbnailCache*>(thumbnail_cache_ptr)); | |
233 GetThumbnailCache()->AddThumbnailCacheObserver(this); | |
234 } | |
235 | |
240 jboolean TabContentManager::HasFullCachedThumbnail(JNIEnv* env, | 236 jboolean TabContentManager::HasFullCachedThumbnail(JNIEnv* env, |
241 jobject obj, | 237 jobject obj, |
242 jint tab_id) { | 238 jint tab_id) { |
243 return thumbnail_cache_->Get(tab_id, false, false) != nullptr; | 239 return GetThumbnailCache()->Get(tab_id, false, false) != nullptr; |
244 } | 240 } |
245 | 241 |
246 void TabContentManager::CacheTab(JNIEnv* env, | 242 void TabContentManager::CacheTab(JNIEnv* env, |
247 jobject obj, | 243 jobject obj, |
248 jobject tab, | 244 jobject tab, |
249 jobject content_view_core, | 245 jobject content_view_core, |
250 jfloat thumbnail_scale) { | 246 jfloat thumbnail_scale) { |
251 TabAndroid* tab_android = TabAndroid::GetNativeTab(env, tab); | 247 TabAndroid* tab_android = TabAndroid::GetNativeTab(env, tab); |
252 DCHECK(tab_android); | 248 DCHECK(tab_android); |
253 int tab_id = tab_android->GetAndroidId(); | 249 int tab_id = tab_android->GetAndroidId(); |
254 GURL url = tab_android->GetURL(); | 250 GURL url = tab_android->GetURL(); |
255 | 251 |
256 content::ContentViewCore* view = | 252 content::ContentViewCore* view = |
257 content::ContentViewCore::GetNativeContentViewCore(env, | 253 content::ContentViewCore::GetNativeContentViewCore(env, |
258 content_view_core); | 254 content_view_core); |
259 | 255 |
260 if (thumbnail_cache_->CheckAndUpdateThumbnailMetaData(tab_id, url)) { | 256 if (GetThumbnailCache()->CheckAndUpdateThumbnailMetaData(tab_id, url)) { |
261 if (!view || | 257 if (!view || |
262 !view->GetWebContents() | 258 !view->GetWebContents() |
263 ->GetRenderViewHost() | 259 ->GetRenderViewHost() |
264 ->CanCopyFromBackingStore() || | 260 ->CanCopyFromBackingStore() || |
265 pending_tab_readbacks_.find(tab_id) != pending_tab_readbacks_.end() || | 261 pending_tab_readbacks_.find(tab_id) != pending_tab_readbacks_.end() || |
266 pending_tab_readbacks_.size() >= kMaxReadbacks) { | 262 pending_tab_readbacks_.size() >= kMaxReadbacks) { |
267 thumbnail_cache_->Remove(tab_id); | 263 GetThumbnailCache()->Remove(tab_id); |
268 return; | 264 return; |
269 } | 265 } |
270 | 266 |
271 TabReadbackCallback readback_done_callback = | 267 TabReadbackCallback readback_done_callback = |
272 base::Bind(&TabContentManager::PutThumbnailIntoCache, | 268 base::Bind(&TabContentManager::PutThumbnailIntoCache, |
273 weak_factory_.GetWeakPtr(), tab_id); | 269 weak_factory_.GetWeakPtr(), tab_id); |
274 scoped_ptr<TabReadbackRequest> readback_request = | 270 scoped_ptr<TabReadbackRequest> readback_request = |
275 make_scoped_ptr(new TabReadbackRequest( | 271 make_scoped_ptr(new TabReadbackRequest( |
276 content_view_core, thumbnail_scale, readback_done_callback)); | 272 content_view_core, thumbnail_scale, readback_done_callback)); |
277 pending_tab_readbacks_.set(tab_id, readback_request.Pass()); | 273 pending_tab_readbacks_.set(tab_id, readback_request.Pass()); |
278 pending_tab_readbacks_.get(tab_id)->Run(); | 274 pending_tab_readbacks_.get(tab_id)->Run(); |
279 } | 275 } |
280 } | 276 } |
281 | 277 |
282 void TabContentManager::CacheTabWithBitmap(JNIEnv* env, | 278 void TabContentManager::CacheTabWithBitmap(JNIEnv* env, |
283 jobject obj, | 279 jobject obj, |
284 jobject tab, | 280 jobject tab, |
285 jobject bitmap, | 281 jobject bitmap, |
286 jfloat thumbnail_scale) { | 282 jfloat thumbnail_scale) { |
287 TabAndroid* tab_android = TabAndroid::GetNativeTab(env, tab); | 283 TabAndroid* tab_android = TabAndroid::GetNativeTab(env, tab); |
288 DCHECK(tab_android); | 284 DCHECK(tab_android); |
289 int tab_id = tab_android->GetAndroidId(); | 285 int tab_id = tab_android->GetAndroidId(); |
290 GURL url = tab_android->GetURL(); | 286 GURL url = tab_android->GetURL(); |
291 | 287 |
292 gfx::JavaBitmap java_bitmap_lock(bitmap); | 288 gfx::JavaBitmap java_bitmap_lock(bitmap); |
293 SkBitmap skbitmap = gfx::CreateSkBitmapFromJavaBitmap(java_bitmap_lock); | 289 SkBitmap skbitmap = gfx::CreateSkBitmapFromJavaBitmap(java_bitmap_lock); |
294 skbitmap.setImmutable(); | 290 skbitmap.setImmutable(); |
295 | 291 |
296 if (thumbnail_cache_->CheckAndUpdateThumbnailMetaData(tab_id, url)) | 292 if (GetThumbnailCache()->CheckAndUpdateThumbnailMetaData(tab_id, url)) |
297 PutThumbnailIntoCache(tab_id, thumbnail_scale, skbitmap); | 293 PutThumbnailIntoCache(tab_id, thumbnail_scale, skbitmap); |
298 } | 294 } |
299 | 295 |
300 void TabContentManager::InvalidateIfChanged(JNIEnv* env, | 296 void TabContentManager::InvalidateIfChanged(JNIEnv* env, |
301 jobject obj, | 297 jobject obj, |
302 jint tab_id, | 298 jint tab_id, |
303 jstring jurl) { | 299 jstring jurl) { |
304 thumbnail_cache_->InvalidateThumbnailIfChanged( | 300 GetThumbnailCache()->InvalidateThumbnailIfChanged( |
305 tab_id, GURL(base::android::ConvertJavaStringToUTF8(env, jurl))); | 301 tab_id, GURL(base::android::ConvertJavaStringToUTF8(env, jurl))); |
306 } | 302 } |
307 | 303 |
308 void TabContentManager::UpdateVisibleIds(JNIEnv* env, | 304 void TabContentManager::UpdateVisibleIds(JNIEnv* env, |
309 jobject obj, | 305 jobject obj, |
310 jintArray priority) { | 306 jintArray priority) { |
311 std::list<int> priority_ids; | 307 std::list<int> priority_ids; |
312 jsize length = env->GetArrayLength(priority); | 308 jsize length = env->GetArrayLength(priority); |
313 jint* ints = env->GetIntArrayElements(priority, NULL); | 309 jint* ints = env->GetIntArrayElements(priority, NULL); |
314 for (jsize i = 0; i < length; ++i) | 310 for (jsize i = 0; i < length; ++i) |
315 priority_ids.push_back(static_cast<int>(ints[i])); | 311 priority_ids.push_back(static_cast<int>(ints[i])); |
316 | 312 |
317 env->ReleaseIntArrayElements(priority, ints, JNI_ABORT); | 313 env->ReleaseIntArrayElements(priority, ints, JNI_ABORT); |
318 thumbnail_cache_->UpdateVisibleIds(priority_ids); | 314 GetThumbnailCache()->UpdateVisibleIds(priority_ids); |
319 } | 315 } |
320 | 316 |
321 void TabContentManager::RemoveTabThumbnail(JNIEnv* env, | 317 void TabContentManager::RemoveTabThumbnail(JNIEnv* env, |
322 jobject obj, | 318 jobject obj, |
323 jint tab_id) { | 319 jint tab_id) { |
324 TabReadbackRequestMap::iterator readback_iter = | 320 TabReadbackRequestMap::iterator readback_iter = |
325 pending_tab_readbacks_.find(tab_id); | 321 pending_tab_readbacks_.find(tab_id); |
326 if (readback_iter != pending_tab_readbacks_.end()) | 322 if (readback_iter != pending_tab_readbacks_.end()) |
327 readback_iter->second->SetToDropAfterReadback(); | 323 readback_iter->second->SetToDropAfterReadback(); |
328 thumbnail_cache_->Remove(tab_id); | 324 GetThumbnailCache()->Remove(tab_id); |
329 } | 325 } |
330 | 326 |
331 void TabContentManager::RemoveTabThumbnailFromDiskAtAndAboveId( | 327 void TabContentManager::RemoveTabThumbnailFromDiskAtAndAboveId( |
332 JNIEnv* env, | 328 JNIEnv* env, |
333 jobject obj, | 329 jobject obj, |
334 jint min_forbidden_id) { | 330 jint min_forbidden_id) { |
335 thumbnail_cache_->RemoveFromDiskAtAndAboveId(min_forbidden_id); | 331 GetThumbnailCache()->RemoveFromDiskAtAndAboveId(min_forbidden_id); |
336 } | 332 } |
337 | 333 |
338 void TabContentManager::GetDecompressedThumbnail(JNIEnv* env, | 334 void TabContentManager::GetDecompressedThumbnail(JNIEnv* env, |
339 jobject obj, | 335 jobject obj, |
340 jint tab_id) { | 336 jint tab_id) { |
341 base::Callback<void(bool, SkBitmap)> decompress_done_callback = | 337 base::Callback<void(bool, SkBitmap)> decompress_done_callback = |
342 base::Bind(&TabContentManager::OnFinishDecompressThumbnail, | 338 base::Bind(&TabContentManager::OnFinishDecompressThumbnail, |
343 weak_factory_.GetWeakPtr(), reinterpret_cast<int>(tab_id)); | 339 weak_factory_.GetWeakPtr(), reinterpret_cast<int>(tab_id)); |
344 thumbnail_cache_->DecompressThumbnailFromFile(reinterpret_cast<int>(tab_id), | 340 GetThumbnailCache()->DecompressThumbnailFromFile( |
345 decompress_done_callback); | 341 reinterpret_cast<int>(tab_id), decompress_done_callback); |
346 } | 342 } |
347 | 343 |
348 void TabContentManager::OnFinishedThumbnailRead(int tab_id) { | 344 void TabContentManager::OnFinishedThumbnailRead(int tab_id) { |
349 JNIEnv* env = base::android::AttachCurrentThread(); | 345 JNIEnv* env = base::android::AttachCurrentThread(); |
350 Java_TabContentManager_notifyListenersOfThumbnailChange( | 346 Java_TabContentManager_notifyListenersOfThumbnailChange( |
351 env, weak_java_tab_content_manager_.get(env).obj(), tab_id); | 347 env, weak_java_tab_content_manager_.get(env).obj(), tab_id); |
352 } | 348 } |
353 | 349 |
350 ThumbnailCache* TabContentManager::GetThumbnailCache() { | |
351 if (thumbnail_cache_ == nullptr) { | |
352 JNIEnv* env = base::android::AttachCurrentThread(); | |
353 | |
354 Java_TabContentManager_blockOnThumbnailCacheCreation( | |
355 env, weak_java_tab_content_manager_.get(env).obj()); | |
356 } | |
357 DCHECK(thumbnail_cache_ != nullptr); | |
358 return thumbnail_cache_.get(); | |
359 } | |
360 | |
354 void TabContentManager::PutThumbnailIntoCache(int tab_id, | 361 void TabContentManager::PutThumbnailIntoCache(int tab_id, |
355 float thumbnail_scale, | 362 float thumbnail_scale, |
356 const SkBitmap& bitmap) { | 363 const SkBitmap& bitmap) { |
357 TabReadbackRequestMap::iterator readback_iter = | 364 TabReadbackRequestMap::iterator readback_iter = |
358 pending_tab_readbacks_.find(tab_id); | 365 pending_tab_readbacks_.find(tab_id); |
359 | 366 |
360 if (readback_iter != pending_tab_readbacks_.end()) | 367 if (readback_iter != pending_tab_readbacks_.end()) |
361 pending_tab_readbacks_.erase(tab_id); | 368 pending_tab_readbacks_.erase(tab_id); |
362 | 369 |
363 if (thumbnail_scale > 0 && !bitmap.empty()) | 370 if (thumbnail_scale > 0 && !bitmap.empty()) |
364 thumbnail_cache_->Put(tab_id, bitmap, thumbnail_scale); | 371 GetThumbnailCache()->Put(tab_id, bitmap, thumbnail_scale); |
365 } | 372 } |
366 | 373 |
367 bool RegisterTabContentManager(JNIEnv* env) { | 374 bool RegisterTabContentManager(JNIEnv* env) { |
368 return RegisterNativesImpl(env); | 375 return RegisterNativesImpl(env); |
369 } | 376 } |
370 | 377 |
371 // ---------------------------------------------------------------------------- | 378 // ---------------------------------------------------------------------------- |
372 // Native JNI methods | 379 // Native JNI methods |
373 // ---------------------------------------------------------------------------- | 380 // ---------------------------------------------------------------------------- |
374 | 381 |
375 jlong Init(JNIEnv* env, | 382 jlong Init(JNIEnv* env, jobject obj) { |
376 jobject obj, | 383 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); | 384 return reinterpret_cast<intptr_t>(manager); |
388 } | 385 } |
389 | 386 |
387 jlong CreateThumbnailCache(JNIEnv* env, | |
388 jclass caller, | |
389 jstring disk_cache_path, | |
390 jint default_cache_size, | |
391 jint approximation_cache_size, | |
392 jint compression_queue_max_size, | |
393 jint write_queue_max_size, | |
394 jboolean use_approximation_thumbnail) { | |
395 std::string disk_cache_path_str = | |
396 base::android::ConvertJavaStringToUTF8(env, disk_cache_path); | |
397 return reinterpret_cast<intptr_t>(new ThumbnailCache( | |
398 disk_cache_path_str, (size_t)default_cache_size, | |
399 (size_t)approximation_cache_size, (size_t)compression_queue_max_size, | |
400 (size_t)write_queue_max_size, use_approximation_thumbnail)); | |
401 } | |
402 | |
403 void DestroyThumbnailCache(JNIEnv* env, | |
404 jclass caller, | |
405 jlong thumbnail_cache_ptr) { | |
406 delete reinterpret_cast<ThumbnailCache*>(thumbnail_cache_ptr); | |
407 } | |
408 | |
390 } // namespace android | 409 } // namespace android |
391 } // namespace chrome | 410 } // namespace chrome |
OLD | NEW |