| 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> |
| 11 | 11 |
| 12 #include "base/android/jni_android.h" | 12 #include "base/android/jni_android.h" |
| 13 #include "base/android/jni_string.h" | 13 #include "base/android/jni_string.h" |
| 14 #include "base/android/scoped_java_ref.h" | 14 #include "base/android/scoped_java_ref.h" |
| 15 #include "base/bind.h" | 15 #include "base/bind.h" |
| 16 #include "base/bind_helpers.h" | 16 #include "base/bind_helpers.h" |
| 17 #include "base/macros.h" | 17 #include "base/macros.h" |
| 18 #include "base/memory/ptr_util.h" | 18 #include "base/memory/ptr_util.h" |
| 19 #include "cc/layers/layer.h" | 19 #include "cc/layers/layer.h" |
| 20 #include "chrome/browser/android/compositor/layer/thumbnail_layer.h" | 20 #include "chrome/browser/android/compositor/layer/thumbnail_layer.h" |
| 21 #include "chrome/browser/android/tab_android.h" | 21 #include "chrome/browser/android/tab_android.h" |
| 22 #include "chrome/browser/android/thumbnail/thumbnail.h" | 22 #include "chrome/browser/android/thumbnail/thumbnail.h" |
| 23 #include "content/public/browser/interstitial_page.h" |
| 23 #include "content/public/browser/readback_types.h" | 24 #include "content/public/browser/readback_types.h" |
| 25 #include "content/public/browser/render_frame_host.h" |
| 24 #include "content/public/browser/render_view_host.h" | 26 #include "content/public/browser/render_view_host.h" |
| 25 #include "content/public/browser/render_widget_host.h" | 27 #include "content/public/browser/render_widget_host.h" |
| 26 #include "content/public/browser/render_widget_host_view.h" | 28 #include "content/public/browser/render_widget_host_view.h" |
| 27 #include "content/public/browser/web_contents.h" | 29 #include "content/public/browser/web_contents.h" |
| 28 #include "jni/TabContentManager_jni.h" | 30 #include "jni/TabContentManager_jni.h" |
| 29 #include "ui/android/resources/ui_resource_provider.h" | 31 #include "ui/android/resources/ui_resource_provider.h" |
| 30 #include "ui/gfx/android/java_bitmap.h" | 32 #include "ui/gfx/android/java_bitmap.h" |
| 31 #include "ui/gfx/geometry/dip_util.h" | 33 #include "ui/gfx/geometry/dip_util.h" |
| 32 #include "ui/gfx/geometry/rect.h" | 34 #include "ui/gfx/geometry/rect.h" |
| 33 #include "url/gurl.h" | 35 #include "url/gurl.h" |
| 34 | 36 |
| 35 using base::android::JavaParamRef; | 37 using base::android::JavaParamRef; |
| 36 | 38 |
| 37 namespace { | 39 namespace { |
| 38 | 40 |
| 39 const size_t kMaxReadbacks = 1; | 41 const size_t kMaxReadbacks = 1; |
| 40 typedef base::Callback<void(float, const SkBitmap&)> TabReadbackCallback; | 42 typedef base::Callback<void(float, const SkBitmap&)> TabReadbackCallback; |
| 41 | 43 |
| 42 } // namespace | 44 } // namespace |
| 43 | 45 |
| 44 namespace android { | 46 namespace android { |
| 45 | 47 |
| 46 class TabContentManager::TabReadbackRequest { | 48 class TabContentManager::TabReadbackRequest { |
| 47 public: | 49 public: |
| 48 TabReadbackRequest(content::WebContents* web_contents, | 50 TabReadbackRequest(content::RenderWidgetHost* rwh, |
| 49 float thumbnail_scale, | 51 float thumbnail_scale, |
| 50 const TabReadbackCallback& end_callback) | 52 const TabReadbackCallback& end_callback) |
| 51 : thumbnail_scale_(thumbnail_scale), | 53 : thumbnail_scale_(thumbnail_scale), |
| 52 end_callback_(end_callback), | 54 end_callback_(end_callback), |
| 53 drop_after_readback_(false), | 55 drop_after_readback_(false), |
| 54 weak_factory_(this) { | 56 weak_factory_(this) { |
| 55 DCHECK(web_contents); | 57 DCHECK(rwh); |
| 56 content::ReadbackRequestCallback result_callback = | 58 content::ReadbackRequestCallback result_callback = |
| 57 base::Bind(&TabReadbackRequest::OnFinishGetTabThumbnailBitmap, | 59 base::Bind(&TabReadbackRequest::OnFinishGetTabThumbnailBitmap, |
| 58 weak_factory_.GetWeakPtr()); | 60 weak_factory_.GetWeakPtr()); |
| 59 | 61 |
| 60 content::RenderWidgetHost* rwh = | |
| 61 web_contents->GetRenderViewHost()->GetWidget(); | |
| 62 DCHECK(rwh); | |
| 63 | |
| 64 SkColorType color_type = kN32_SkColorType; | 62 SkColorType color_type = kN32_SkColorType; |
| 65 gfx::Rect src_rect = rwh->GetView()->GetViewBounds(); | 63 gfx::Rect src_rect = rwh->GetView()->GetViewBounds(); |
| 66 gfx::Size dst_size( | 64 gfx::Size dst_size( |
| 67 gfx::ScaleToCeiledSize(src_rect.size(), thumbnail_scale_)); | 65 gfx::ScaleToCeiledSize(src_rect.size(), thumbnail_scale_)); |
| 68 rwh->CopyFromBackingStore(src_rect, dst_size, result_callback, color_type); | 66 rwh->CopyFromBackingStore(src_rect, dst_size, result_callback, color_type); |
| 69 } | 67 } |
| 70 | 68 |
| 71 virtual ~TabReadbackRequest() {} | 69 virtual ~TabReadbackRequest() {} |
| 72 | 70 |
| 73 void OnFinishGetTabThumbnailBitmap(const SkBitmap& bitmap, | 71 void OnFinishGetTabThumbnailBitmap(const SkBitmap& bitmap, |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 210 const JavaParamRef<jobject>& tab, | 208 const JavaParamRef<jobject>& tab, |
| 211 jfloat thumbnail_scale) { | 209 jfloat thumbnail_scale) { |
| 212 TabAndroid* tab_android = TabAndroid::GetNativeTab(env, tab); | 210 TabAndroid* tab_android = TabAndroid::GetNativeTab(env, tab); |
| 213 DCHECK(tab_android); | 211 DCHECK(tab_android); |
| 214 int tab_id = tab_android->GetAndroidId(); | 212 int tab_id = tab_android->GetAndroidId(); |
| 215 GURL url = tab_android->GetURL(); | 213 GURL url = tab_android->GetURL(); |
| 216 | 214 |
| 217 content::WebContents* web_contents = tab_android->web_contents(); | 215 content::WebContents* web_contents = tab_android->web_contents(); |
| 218 DCHECK(web_contents); | 216 DCHECK(web_contents); |
| 219 | 217 |
| 220 if (!web_contents->GetRenderViewHost() || | 218 content::RenderViewHost* rvh = web_contents->GetRenderViewHost(); |
| 221 !web_contents->GetRenderViewHost()->GetWidget() || | 219 if (web_contents->ShowingInterstitialPage()) { |
| 222 !web_contents->GetRenderViewHost() | 220 if (!web_contents->GetInterstitialPage()->GetMainFrame()) |
| 223 ->GetWidget() | 221 return; |
| 224 ->CanCopyFromBackingStore() || | 222 |
| 223 rvh = web_contents->GetInterstitialPage()->GetMainFrame()-> |
| 224 GetRenderViewHost(); |
| 225 } |
| 226 |
| 227 if (!rvh || !rvh->GetWidget() || |
| 228 !rvh->GetWidget()->CanCopyFromBackingStore() || |
| 225 pending_tab_readbacks_.find(tab_id) != pending_tab_readbacks_.end() || | 229 pending_tab_readbacks_.find(tab_id) != pending_tab_readbacks_.end() || |
| 226 pending_tab_readbacks_.size() >= kMaxReadbacks) { | 230 pending_tab_readbacks_.size() >= kMaxReadbacks) { |
| 227 return; | 231 return; |
| 228 } | 232 } |
| 229 | 233 |
| 230 if (thumbnail_cache_->CheckAndUpdateThumbnailMetaData(tab_id, url)) { | 234 if (thumbnail_cache_->CheckAndUpdateThumbnailMetaData(tab_id, url)) { |
| 231 TabReadbackCallback readback_done_callback = | 235 TabReadbackCallback readback_done_callback = |
| 232 base::Bind(&TabContentManager::PutThumbnailIntoCache, | 236 base::Bind(&TabContentManager::PutThumbnailIntoCache, |
| 233 weak_factory_.GetWeakPtr(), tab_id); | 237 weak_factory_.GetWeakPtr(), tab_id); |
| 234 pending_tab_readbacks_[tab_id] = base::MakeUnique<TabReadbackRequest>( | 238 pending_tab_readbacks_[tab_id] = base::MakeUnique<TabReadbackRequest>( |
| 235 web_contents, thumbnail_scale, readback_done_callback); | 239 rvh->GetWidget(), thumbnail_scale, readback_done_callback); |
| 236 } | 240 } |
| 237 } | 241 } |
| 238 | 242 |
| 239 void TabContentManager::CacheTabWithBitmap(JNIEnv* env, | 243 void TabContentManager::CacheTabWithBitmap(JNIEnv* env, |
| 240 const JavaParamRef<jobject>& obj, | 244 const JavaParamRef<jobject>& obj, |
| 241 const JavaParamRef<jobject>& tab, | 245 const JavaParamRef<jobject>& tab, |
| 242 const JavaParamRef<jobject>& bitmap, | 246 const JavaParamRef<jobject>& bitmap, |
| 243 jfloat thumbnail_scale) { | 247 jfloat thumbnail_scale) { |
| 244 TabAndroid* tab_android = TabAndroid::GetNativeTab(env, tab); | 248 TabAndroid* tab_android = TabAndroid::GetNativeTab(env, tab); |
| 245 DCHECK(tab_android); | 249 DCHECK(tab_android); |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 336 jint write_queue_max_size, | 340 jint write_queue_max_size, |
| 337 jboolean use_approximation_thumbnail) { | 341 jboolean use_approximation_thumbnail) { |
| 338 TabContentManager* manager = new TabContentManager( | 342 TabContentManager* manager = new TabContentManager( |
| 339 env, obj, default_cache_size, approximation_cache_size, | 343 env, obj, default_cache_size, approximation_cache_size, |
| 340 compression_queue_max_size, write_queue_max_size, | 344 compression_queue_max_size, write_queue_max_size, |
| 341 use_approximation_thumbnail); | 345 use_approximation_thumbnail); |
| 342 return reinterpret_cast<intptr_t>(manager); | 346 return reinterpret_cast<intptr_t>(manager); |
| 343 } | 347 } |
| 344 | 348 |
| 345 } // namespace android | 349 } // namespace android |
| OLD | NEW |