| 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 #include <stddef.h> | 8 #include <stddef.h> |
| 9 | 9 |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 29 matching lines...) Expand all Loading... |
| 40 | 40 |
| 41 const size_t kMaxReadbacks = 1; | 41 const size_t kMaxReadbacks = 1; |
| 42 typedef base::Callback<void(float, const SkBitmap&)> TabReadbackCallback; | 42 typedef base::Callback<void(float, const SkBitmap&)> TabReadbackCallback; |
| 43 | 43 |
| 44 } // namespace | 44 } // namespace |
| 45 | 45 |
| 46 namespace android { | 46 namespace android { |
| 47 | 47 |
| 48 class TabContentManager::TabReadbackRequest { | 48 class TabContentManager::TabReadbackRequest { |
| 49 public: | 49 public: |
| 50 TabReadbackRequest(content::RenderWidgetHost* rwh, | 50 TabReadbackRequest(content::RenderWidgetHostView* rwhv, |
| 51 float thumbnail_scale, | 51 float thumbnail_scale, |
| 52 const TabReadbackCallback& end_callback) | 52 const TabReadbackCallback& end_callback) |
| 53 : thumbnail_scale_(thumbnail_scale), | 53 : thumbnail_scale_(thumbnail_scale), |
| 54 end_callback_(end_callback), | 54 end_callback_(end_callback), |
| 55 drop_after_readback_(false), | 55 drop_after_readback_(false), |
| 56 weak_factory_(this) { | 56 weak_factory_(this) { |
| 57 DCHECK(rwh); | 57 DCHECK(rwhv); |
| 58 content::ReadbackRequestCallback result_callback = | 58 content::ReadbackRequestCallback result_callback = |
| 59 base::Bind(&TabReadbackRequest::OnFinishGetTabThumbnailBitmap, | 59 base::Bind(&TabReadbackRequest::OnFinishGetTabThumbnailBitmap, |
| 60 weak_factory_.GetWeakPtr()); | 60 weak_factory_.GetWeakPtr()); |
| 61 | 61 |
| 62 SkColorType color_type = kN32_SkColorType; | 62 SkColorType color_type = kN32_SkColorType; |
| 63 gfx::Rect src_rect = rwh->GetView()->GetViewBounds(); | 63 gfx::Size view_size_on_screen = rwhv->GetViewBounds().size(); |
| 64 gfx::Size dst_size( | 64 gfx::Size thumbnail_size( |
| 65 gfx::ScaleToCeiledSize(src_rect.size(), thumbnail_scale_)); | 65 gfx::ScaleToCeiledSize(view_size_on_screen, thumbnail_scale_)); |
| 66 rwh->CopyFromBackingStore(src_rect, dst_size, result_callback, color_type); | 66 rwhv->CopyFromSurface(gfx::Rect(), thumbnail_size, result_callback, |
| 67 color_type); |
| 67 } | 68 } |
| 68 | 69 |
| 69 virtual ~TabReadbackRequest() {} | 70 virtual ~TabReadbackRequest() {} |
| 70 | 71 |
| 71 void OnFinishGetTabThumbnailBitmap(const SkBitmap& bitmap, | 72 void OnFinishGetTabThumbnailBitmap(const SkBitmap& bitmap, |
| 72 content::ReadbackResponse response) { | 73 content::ReadbackResponse response) { |
| 73 if (response != content::READBACK_SUCCESS || drop_after_readback_) { | 74 if (response != content::READBACK_SUCCESS || drop_after_readback_) { |
| 74 end_callback_.Run(0.f, SkBitmap()); | 75 end_callback_.Run(0.f, SkBitmap()); |
| 75 return; | 76 return; |
| 76 } | 77 } |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 206 jint tab_id) { | 207 jint tab_id) { |
| 207 return thumbnail_cache_->Get(tab_id, false, false) != nullptr; | 208 return thumbnail_cache_->Get(tab_id, false, false) != nullptr; |
| 208 } | 209 } |
| 209 | 210 |
| 210 void TabContentManager::CacheTab(JNIEnv* env, | 211 void TabContentManager::CacheTab(JNIEnv* env, |
| 211 const JavaParamRef<jobject>& obj, | 212 const JavaParamRef<jobject>& obj, |
| 212 const JavaParamRef<jobject>& tab, | 213 const JavaParamRef<jobject>& tab, |
| 213 jfloat thumbnail_scale) { | 214 jfloat thumbnail_scale) { |
| 214 TabAndroid* tab_android = TabAndroid::GetNativeTab(env, tab); | 215 TabAndroid* tab_android = TabAndroid::GetNativeTab(env, tab); |
| 215 DCHECK(tab_android); | 216 DCHECK(tab_android); |
| 216 int tab_id = tab_android->GetAndroidId(); | 217 const int tab_id = tab_android->GetAndroidId(); |
| 217 GURL url = tab_android->GetURL(); | 218 if (pending_tab_readbacks_.find(tab_id) != pending_tab_readbacks_.end() || |
| 219 pending_tab_readbacks_.size() >= kMaxReadbacks) { |
| 220 return; |
| 221 } |
| 218 | 222 |
| 219 content::WebContents* web_contents = tab_android->web_contents(); | 223 content::WebContents* web_contents = tab_android->web_contents(); |
| 220 DCHECK(web_contents); | 224 DCHECK(web_contents); |
| 221 | 225 |
| 222 content::RenderViewHost* rvh = web_contents->GetRenderViewHost(); | 226 content::RenderViewHost* rvh = web_contents->GetRenderViewHost(); |
| 223 if (web_contents->ShowingInterstitialPage()) { | 227 if (web_contents->ShowingInterstitialPage()) { |
| 224 if (!web_contents->GetInterstitialPage()->GetMainFrame()) | 228 if (!web_contents->GetInterstitialPage()->GetMainFrame()) |
| 225 return; | 229 return; |
| 226 | 230 |
| 227 rvh = web_contents->GetInterstitialPage()->GetMainFrame()-> | 231 rvh = web_contents->GetInterstitialPage()->GetMainFrame()-> |
| 228 GetRenderViewHost(); | 232 GetRenderViewHost(); |
| 229 } | 233 } |
| 234 if (!rvh) |
| 235 return; |
| 230 | 236 |
| 231 if (!rvh || !rvh->GetWidget() || | 237 content::RenderWidgetHost* rwh = rvh->GetWidget(); |
| 232 !rvh->GetWidget()->CanCopyFromBackingStore() || | 238 content::RenderWidgetHostView* rwhv = rwh ? rwh->GetView() : nullptr; |
| 233 pending_tab_readbacks_.find(tab_id) != pending_tab_readbacks_.end() || | 239 if (!rwhv || !rwhv->IsSurfaceAvailableForCopy()) |
| 234 pending_tab_readbacks_.size() >= kMaxReadbacks) { | |
| 235 return; | 240 return; |
| 236 } | |
| 237 | 241 |
| 238 if (thumbnail_cache_->CheckAndUpdateThumbnailMetaData(tab_id, url)) { | 242 if (thumbnail_cache_->CheckAndUpdateThumbnailMetaData( |
| 243 tab_id, tab_android->GetURL())) { |
| 239 TabReadbackCallback readback_done_callback = | 244 TabReadbackCallback readback_done_callback = |
| 240 base::Bind(&TabContentManager::PutThumbnailIntoCache, | 245 base::Bind(&TabContentManager::PutThumbnailIntoCache, |
| 241 weak_factory_.GetWeakPtr(), tab_id); | 246 weak_factory_.GetWeakPtr(), tab_id); |
| 242 pending_tab_readbacks_[tab_id] = base::MakeUnique<TabReadbackRequest>( | 247 pending_tab_readbacks_[tab_id] = base::MakeUnique<TabReadbackRequest>( |
| 243 rvh->GetWidget(), thumbnail_scale, readback_done_callback); | 248 rwhv, thumbnail_scale, readback_done_callback); |
| 244 } | 249 } |
| 245 } | 250 } |
| 246 | 251 |
| 247 void TabContentManager::CacheTabWithBitmap(JNIEnv* env, | 252 void TabContentManager::CacheTabWithBitmap(JNIEnv* env, |
| 248 const JavaParamRef<jobject>& obj, | 253 const JavaParamRef<jobject>& obj, |
| 249 const JavaParamRef<jobject>& tab, | 254 const JavaParamRef<jobject>& tab, |
| 250 const JavaParamRef<jobject>& bitmap, | 255 const JavaParamRef<jobject>& bitmap, |
| 251 jfloat thumbnail_scale) { | 256 jfloat thumbnail_scale) { |
| 252 TabAndroid* tab_android = TabAndroid::GetNativeTab(env, tab); | 257 TabAndroid* tab_android = TabAndroid::GetNativeTab(env, tab); |
| 253 DCHECK(tab_android); | 258 DCHECK(tab_android); |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 344 jint write_queue_max_size, | 349 jint write_queue_max_size, |
| 345 jboolean use_approximation_thumbnail) { | 350 jboolean use_approximation_thumbnail) { |
| 346 TabContentManager* manager = new TabContentManager( | 351 TabContentManager* manager = new TabContentManager( |
| 347 env, obj, default_cache_size, approximation_cache_size, | 352 env, obj, default_cache_size, approximation_cache_size, |
| 348 compression_queue_max_size, write_queue_max_size, | 353 compression_queue_max_size, write_queue_max_size, |
| 349 use_approximation_thumbnail); | 354 use_approximation_thumbnail); |
| 350 return reinterpret_cast<intptr_t>(manager); | 355 return reinterpret_cast<intptr_t>(manager); |
| 351 } | 356 } |
| 352 | 357 |
| 353 } // namespace android | 358 } // namespace android |
| OLD | NEW |