Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/browser/renderer_host/render_widget_host_view_android.h" | 5 #include "content/browser/renderer_host/render_widget_host_view_android.h" |
| 6 | 6 |
| 7 #include <android/bitmap.h> | 7 #include <android/bitmap.h> |
| 8 | 8 |
| 9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 39 #include "content/browser/renderer_host/render_widget_host_impl.h" | 39 #include "content/browser/renderer_host/render_widget_host_impl.h" |
| 40 #include "content/common/gpu/client/gl_helper.h" | 40 #include "content/common/gpu/client/gl_helper.h" |
| 41 #include "content/common/gpu/gpu_messages.h" | 41 #include "content/common/gpu/gpu_messages.h" |
| 42 #include "content/common/input_messages.h" | 42 #include "content/common/input_messages.h" |
| 43 #include "content/common/view_messages.h" | 43 #include "content/common/view_messages.h" |
| 44 #include "content/public/common/content_switches.h" | 44 #include "content/public/common/content_switches.h" |
| 45 #include "gpu/config/gpu_driver_bug_workaround_type.h" | 45 #include "gpu/config/gpu_driver_bug_workaround_type.h" |
| 46 #include "skia/ext/image_operations.h" | 46 #include "skia/ext/image_operations.h" |
| 47 #include "third_party/khronos/GLES2/gl2.h" | 47 #include "third_party/khronos/GLES2/gl2.h" |
| 48 #include "third_party/khronos/GLES2/gl2ext.h" | 48 #include "third_party/khronos/GLES2/gl2ext.h" |
| 49 #include "ui/base/android/window_android.h" | |
| 49 #include "ui/gfx/android/device_display_info.h" | 50 #include "ui/gfx/android/device_display_info.h" |
| 50 #include "ui/gfx/android/java_bitmap.h" | 51 #include "ui/gfx/android/java_bitmap.h" |
| 51 #include "ui/gfx/display.h" | 52 #include "ui/gfx/display.h" |
| 52 #include "ui/gfx/screen.h" | 53 #include "ui/gfx/screen.h" |
| 53 #include "ui/gfx/size_conversions.h" | 54 #include "ui/gfx/size_conversions.h" |
| 54 | 55 |
| 55 namespace content { | 56 namespace content { |
| 56 | 57 |
| 57 namespace { | 58 namespace { |
| 58 | 59 |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 107 needs_begin_frame_(false), | 108 needs_begin_frame_(false), |
| 108 are_layers_attached_(true), | 109 are_layers_attached_(true), |
| 109 content_view_core_(NULL), | 110 content_view_core_(NULL), |
| 110 ime_adapter_android_(this), | 111 ime_adapter_android_(this), |
| 111 cached_background_color_(SK_ColorWHITE), | 112 cached_background_color_(SK_ColorWHITE), |
| 112 texture_id_in_layer_(0), | 113 texture_id_in_layer_(0), |
| 113 last_output_surface_id_(kUndefinedOutputSurfaceId), | 114 last_output_surface_id_(kUndefinedOutputSurfaceId), |
| 114 weak_ptr_factory_(this), | 115 weak_ptr_factory_(this), |
| 115 overscroll_effect_enabled_(true), | 116 overscroll_effect_enabled_(true), |
| 116 flush_input_requested_(false), | 117 flush_input_requested_(false), |
| 117 accelerated_surface_route_id_(0) { | 118 accelerated_surface_route_id_(0), |
| 119 using_synchronous_compositor_(SynchronousCompositorImpl::FromID( | |
| 120 widget_host->GetProcess()->GetID(), | |
| 121 widget_host->GetRoutingID()) != NULL) { | |
| 118 if (!UsingDelegatedRenderer()) { | 122 if (!UsingDelegatedRenderer()) { |
| 119 texture_layer_ = cc::TextureLayer::Create(this); | 123 texture_layer_ = cc::TextureLayer::Create(NULL); |
| 120 layer_ = texture_layer_; | 124 layer_ = texture_layer_; |
| 121 } | 125 } |
| 122 | 126 |
| 123 overscroll_effect_enabled_ = !CommandLine::ForCurrentProcess()-> | 127 overscroll_effect_enabled_ = !CommandLine::ForCurrentProcess()-> |
| 124 HasSwitch(switches::kDisableOverscrollEdgeEffect); | 128 HasSwitch(switches::kDisableOverscrollEdgeEffect); |
| 125 // Don't block the main thread with effect resource loading. | 129 // Don't block the main thread with effect resource loading. |
| 126 // Actual effect creation is deferred until an overscroll event is received. | 130 // Actual effect creation is deferred until an overscroll event is received. |
| 127 if (overscroll_effect_enabled_) { | 131 if (overscroll_effect_enabled_) { |
| 128 base::WorkerPool::PostTask(FROM_HERE, | 132 base::WorkerPool::PostTask(FROM_HERE, |
| 129 base::Bind(&OverscrollGlow::EnsureResources), | 133 base::Bind(&OverscrollGlow::EnsureResources), |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 185 RenderWidgetHost* | 189 RenderWidgetHost* |
| 186 RenderWidgetHostViewAndroid::GetRenderWidgetHost() const { | 190 RenderWidgetHostViewAndroid::GetRenderWidgetHost() const { |
| 187 return host_; | 191 return host_; |
| 188 } | 192 } |
| 189 | 193 |
| 190 void RenderWidgetHostViewAndroid::WasShown() { | 194 void RenderWidgetHostViewAndroid::WasShown() { |
| 191 if (!host_ || !host_->is_hidden()) | 195 if (!host_ || !host_->is_hidden()) |
| 192 return; | 196 return; |
| 193 | 197 |
| 194 host_->WasShown(); | 198 host_->WasShown(); |
| 199 | |
| 200 if (content_view_core_ && !using_synchronous_compositor_) | |
| 201 content_view_core_->GetWindowAndroid()->AddObserver(this); | |
| 195 } | 202 } |
| 196 | 203 |
| 197 void RenderWidgetHostViewAndroid::WasHidden() { | 204 void RenderWidgetHostViewAndroid::WasHidden() { |
| 198 RunAckCallbacks(); | 205 RunAckCallbacks(); |
| 199 | 206 |
| 200 if (!host_ || host_->is_hidden()) | 207 if (!host_ || host_->is_hidden()) |
| 201 return; | 208 return; |
| 202 | 209 |
| 203 // Inform the renderer that we are being hidden so it can reduce its resource | 210 // Inform the renderer that we are being hidden so it can reduce its resource |
| 204 // utilization. | 211 // utilization. |
| 205 host_->WasHidden(); | 212 host_->WasHidden(); |
| 213 | |
| 214 if (content_view_core_ && !using_synchronous_compositor_) | |
| 215 content_view_core_->GetWindowAndroid()->RemoveObserver(this); | |
| 206 } | 216 } |
| 207 | 217 |
| 208 void RenderWidgetHostViewAndroid::WasResized() { | 218 void RenderWidgetHostViewAndroid::WasResized() { |
| 209 host_->WasResized(); | 219 host_->WasResized(); |
| 210 } | 220 } |
| 211 | 221 |
| 212 void RenderWidgetHostViewAndroid::SetSize(const gfx::Size& size) { | 222 void RenderWidgetHostViewAndroid::SetSize(const gfx::Size& size) { |
| 213 // Ignore the given size as only the Java code has the power to | 223 // Ignore the given size as only the Java code has the power to |
| 214 // resize the view on Android. | 224 // resize the view on Android. |
| 215 default_size_ = size; | 225 default_size_ = size; |
| (...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 499 NOTIMPLEMENTED(); | 509 NOTIMPLEMENTED(); |
| 500 } | 510 } |
| 501 | 511 |
| 502 void RenderWidgetHostViewAndroid::RenderProcessGone( | 512 void RenderWidgetHostViewAndroid::RenderProcessGone( |
| 503 base::TerminationStatus status, int error_code) { | 513 base::TerminationStatus status, int error_code) { |
| 504 Destroy(); | 514 Destroy(); |
| 505 } | 515 } |
| 506 | 516 |
| 507 void RenderWidgetHostViewAndroid::Destroy() { | 517 void RenderWidgetHostViewAndroid::Destroy() { |
| 508 RemoveLayers(); | 518 RemoveLayers(); |
| 509 content_view_core_ = NULL; | 519 SetContentViewCore(NULL); |
| 510 | 520 |
| 511 // The RenderWidgetHost's destruction led here, so don't call it. | 521 // The RenderWidgetHost's destruction led here, so don't call it. |
| 512 host_ = NULL; | 522 host_ = NULL; |
| 513 | 523 |
| 514 delete this; | 524 delete this; |
| 515 } | 525 } |
| 516 | 526 |
| 517 void RenderWidgetHostViewAndroid::SetTooltipText( | 527 void RenderWidgetHostViewAndroid::SetTooltipText( |
| 518 const string16& tooltip_text) { | 528 const string16& tooltip_text) { |
| 519 // Tooltips don't makes sense on Android. | 529 // Tooltips don't makes sense on Android. |
| (...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 701 resource_collection_ = new cc::DelegatedFrameResourceCollection; | 711 resource_collection_ = new cc::DelegatedFrameResourceCollection; |
| 702 resource_collection_->SetClient(this); | 712 resource_collection_->SetClient(this); |
| 703 } | 713 } |
| 704 if (!frame_provider_ || | 714 if (!frame_provider_ || |
| 705 texture_size_in_layer_ != frame_provider_->frame_size()) { | 715 texture_size_in_layer_ != frame_provider_->frame_size()) { |
| 706 if (are_layers_attached_) | 716 if (are_layers_attached_) |
| 707 RemoveLayers(); | 717 RemoveLayers(); |
| 708 frame_provider_ = new cc::DelegatedFrameProvider( | 718 frame_provider_ = new cc::DelegatedFrameProvider( |
| 709 resource_collection_.get(), frame_data.Pass()); | 719 resource_collection_.get(), frame_data.Pass()); |
| 710 delegated_renderer_layer_ = | 720 delegated_renderer_layer_ = |
| 711 cc::DelegatedRendererLayer::Create(this, frame_provider_); | 721 cc::DelegatedRendererLayer::Create(NULL, frame_provider_); |
| 712 layer_ = delegated_renderer_layer_; | 722 layer_ = delegated_renderer_layer_; |
| 713 if (are_layers_attached_) | 723 if (are_layers_attached_) |
| 714 AttachLayers(); | 724 AttachLayers(); |
| 715 } else { | 725 } else { |
| 716 frame_provider_->SetFrameData(frame_data.Pass()); | 726 frame_provider_->SetFrameData(frame_data.Pass()); |
| 717 } | 727 } |
| 718 } | 728 } |
| 719 | 729 |
| 720 if (delegated_renderer_layer_.get()) { | 730 if (delegated_renderer_layer_.get()) { |
| 721 delegated_renderer_layer_->SetDisplaySize(texture_size_in_layer_); | 731 delegated_renderer_layer_->SetDisplaySize(texture_size_in_layer_); |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 839 | 849 |
| 840 void RenderWidgetHostViewAndroid::BuffersSwapped( | 850 void RenderWidgetHostViewAndroid::BuffersSwapped( |
| 841 const gpu::Mailbox& mailbox, | 851 const gpu::Mailbox& mailbox, |
| 842 uint32_t output_surface_id, | 852 uint32_t output_surface_id, |
| 843 const base::Closure& ack_callback) { | 853 const base::Closure& ack_callback) { |
| 844 ImageTransportFactoryAndroid* factory = | 854 ImageTransportFactoryAndroid* factory = |
| 845 ImageTransportFactoryAndroid::GetInstance(); | 855 ImageTransportFactoryAndroid::GetInstance(); |
| 846 | 856 |
| 847 if (!texture_id_in_layer_) { | 857 if (!texture_id_in_layer_) { |
| 848 texture_id_in_layer_ = factory->CreateTexture(); | 858 texture_id_in_layer_ = factory->CreateTexture(); |
| 859 texture_layer_->SetTextureId(texture_id_in_layer_); | |
| 849 texture_layer_->SetIsDrawable(true); | 860 texture_layer_->SetIsDrawable(true); |
| 850 texture_layer_->SetContentsOpaque(true); | 861 texture_layer_->SetContentsOpaque(true); |
| 851 } | 862 } |
| 852 | 863 |
| 853 ImageTransportFactoryAndroid::GetInstance()->AcquireTexture( | 864 ImageTransportFactoryAndroid::GetInstance()->AcquireTexture( |
| 854 texture_id_in_layer_, mailbox.name); | 865 texture_id_in_layer_, mailbox.name); |
| 855 | 866 |
| 856 ResetClipping(); | 867 ResetClipping(); |
| 857 | 868 |
| 858 current_mailbox_ = mailbox; | 869 current_mailbox_ = mailbox; |
| (...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1237 ScheduleAnimationIfNecessary(); | 1248 ScheduleAnimationIfNecessary(); |
| 1238 } | 1249 } |
| 1239 | 1250 |
| 1240 void RenderWidgetHostViewAndroid::SetContentViewCore( | 1251 void RenderWidgetHostViewAndroid::SetContentViewCore( |
| 1241 ContentViewCoreImpl* content_view_core) { | 1252 ContentViewCoreImpl* content_view_core) { |
| 1242 RunAckCallbacks(); | 1253 RunAckCallbacks(); |
| 1243 | 1254 |
| 1244 if (are_layers_attached_) | 1255 if (are_layers_attached_) |
| 1245 RemoveLayers(); | 1256 RemoveLayers(); |
| 1246 | 1257 |
| 1258 if (content_view_core != content_view_core_ && content_view_core_ && | |
|
boliu
2013/11/18 19:39:25
This still doesn't seem to make sense. If content_
powei
2013/11/18 19:44:02
I'm not sure about the other calls so I'm hesitant
powei
2013/11/18 19:47:14
Maybe you'd be ok with just:
if (content_view_cor
powei
2013/11/18 21:40:05
Done.
| |
| 1259 !using_synchronous_compositor_) | |
| 1260 content_view_core_->GetWindowAndroid()->RemoveObserver(this); | |
| 1261 | |
| 1247 content_view_core_ = content_view_core; | 1262 content_view_core_ = content_view_core; |
| 1248 | 1263 |
| 1249 if (GetBrowserAccessibilityManager()) { | 1264 if (GetBrowserAccessibilityManager()) { |
| 1250 base::android::ScopedJavaLocalRef<jobject> obj; | 1265 base::android::ScopedJavaLocalRef<jobject> obj; |
| 1251 if (content_view_core_) | 1266 if (content_view_core_) |
| 1252 obj = content_view_core_->GetJavaObject(); | 1267 obj = content_view_core_->GetJavaObject(); |
| 1253 GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerAndroid()-> | 1268 GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerAndroid()-> |
| 1254 SetContentViewCore(obj); | 1269 SetContentViewCore(obj); |
| 1255 } | 1270 } |
| 1256 | 1271 |
| 1257 if (are_layers_attached_) | 1272 if (are_layers_attached_) { |
| 1258 AttachLayers(); | 1273 AttachLayers(); |
| 1274 if (content_view_core_ && !using_synchronous_compositor_) | |
| 1275 content_view_core_->GetWindowAndroid()->AddObserver(this); | |
| 1276 } | |
| 1259 } | 1277 } |
| 1260 | 1278 |
| 1261 void RenderWidgetHostViewAndroid::RunAckCallbacks() { | 1279 void RenderWidgetHostViewAndroid::RunAckCallbacks() { |
| 1262 while (!ack_callbacks_.empty()) { | 1280 while (!ack_callbacks_.empty()) { |
| 1263 ack_callbacks_.front().Run(); | 1281 ack_callbacks_.front().Run(); |
| 1264 ack_callbacks_.pop(); | 1282 ack_callbacks_.pop(); |
| 1265 } | 1283 } |
| 1266 } | 1284 } |
| 1267 | 1285 |
| 1268 void RenderWidgetHostViewAndroid::HasTouchEventHandlers( | 1286 void RenderWidgetHostViewAndroid::HasTouchEventHandlers( |
| 1269 bool need_touch_events) { | 1287 bool need_touch_events) { |
| 1270 if (content_view_core_) | 1288 if (content_view_core_) |
| 1271 content_view_core_->HasTouchEventHandlers(need_touch_events); | 1289 content_view_core_->HasTouchEventHandlers(need_touch_events); |
| 1272 } | 1290 } |
| 1273 | 1291 |
| 1274 unsigned RenderWidgetHostViewAndroid::PrepareTexture() { | 1292 void RenderWidgetHostViewAndroid::OnCompositingDidCommit() { |
| 1275 RunAckCallbacks(); | |
| 1276 return texture_id_in_layer_; | |
| 1277 } | |
| 1278 | |
| 1279 void RenderWidgetHostViewAndroid::DidCommitFrameData() { | |
| 1280 RunAckCallbacks(); | 1293 RunAckCallbacks(); |
| 1281 } | 1294 } |
| 1282 | 1295 |
| 1283 bool RenderWidgetHostViewAndroid::PrepareTextureMailbox( | 1296 void RenderWidgetHostViewAndroid::OnDetachCompositor() { |
| 1284 cc::TextureMailbox* mailbox, | 1297 DCHECK(content_view_core_); |
| 1285 scoped_ptr<cc::SingleReleaseCallback>* release_callback, | 1298 DCHECK(!using_synchronous_compositor_); |
| 1286 bool use_shared_memory) { | 1299 RunAckCallbacks(); |
| 1287 return false; | |
| 1288 } | 1300 } |
| 1289 | 1301 |
| 1290 void RenderWidgetHostViewAndroid::OnLostResources() { | 1302 void RenderWidgetHostViewAndroid::OnLostResources() { |
| 1291 if (texture_layer_.get()) | 1303 if (texture_layer_.get()) |
| 1292 texture_layer_->SetIsDrawable(false); | 1304 texture_layer_->SetIsDrawable(false); |
| 1293 if (delegated_renderer_layer_.get()) | 1305 if (delegated_renderer_layer_.get()) |
| 1294 DestroyDelegatedContent(); | 1306 DestroyDelegatedContent(); |
| 1295 texture_id_in_layer_ = 0; | 1307 texture_id_in_layer_ = 0; |
| 1296 RunAckCallbacks(); | 1308 RunAckCallbacks(); |
| 1297 } | 1309 } |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1391 // RenderWidgetHostView, public: | 1403 // RenderWidgetHostView, public: |
| 1392 | 1404 |
| 1393 // static | 1405 // static |
| 1394 RenderWidgetHostView* | 1406 RenderWidgetHostView* |
| 1395 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { | 1407 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { |
| 1396 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); | 1408 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); |
| 1397 return new RenderWidgetHostViewAndroid(rwhi, NULL); | 1409 return new RenderWidgetHostViewAndroid(rwhi, NULL); |
| 1398 } | 1410 } |
| 1399 | 1411 |
| 1400 } // namespace content | 1412 } // namespace content |
| OLD | NEW |