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" | |
| 50 #include "ui/base/android/window_android_observer.h" | |
| 49 #include "ui/gfx/android/device_display_info.h" | 51 #include "ui/gfx/android/device_display_info.h" |
| 50 #include "ui/gfx/android/java_bitmap.h" | 52 #include "ui/gfx/android/java_bitmap.h" |
| 51 #include "ui/gfx/display.h" | 53 #include "ui/gfx/display.h" |
| 52 #include "ui/gfx/screen.h" | 54 #include "ui/gfx/screen.h" |
| 53 #include "ui/gfx/size_conversions.h" | 55 #include "ui/gfx/size_conversions.h" |
| 54 | 56 |
| 55 namespace content { | 57 namespace content { |
| 56 | 58 |
| 57 namespace { | 59 namespace { |
| 58 | 60 |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 109 content_view_core_(NULL), | 111 content_view_core_(NULL), |
| 110 ime_adapter_android_(this), | 112 ime_adapter_android_(this), |
| 111 cached_background_color_(SK_ColorWHITE), | 113 cached_background_color_(SK_ColorWHITE), |
| 112 texture_id_in_layer_(0), | 114 texture_id_in_layer_(0), |
| 113 last_output_surface_id_(kUndefinedOutputSurfaceId), | 115 last_output_surface_id_(kUndefinedOutputSurfaceId), |
| 114 weak_ptr_factory_(this), | 116 weak_ptr_factory_(this), |
| 115 overscroll_effect_enabled_(true), | 117 overscroll_effect_enabled_(true), |
| 116 flush_input_requested_(false), | 118 flush_input_requested_(false), |
| 117 accelerated_surface_route_id_(0) { | 119 accelerated_surface_route_id_(0) { |
| 118 if (!UsingDelegatedRenderer()) { | 120 if (!UsingDelegatedRenderer()) { |
| 119 texture_layer_ = cc::TextureLayer::Create(this); | 121 texture_layer_ = cc::TextureLayer::Create(NULL); |
| 120 layer_ = texture_layer_; | 122 layer_ = texture_layer_; |
| 121 } | 123 } |
| 122 | 124 |
| 123 overscroll_effect_enabled_ = !CommandLine::ForCurrentProcess()-> | 125 overscroll_effect_enabled_ = !CommandLine::ForCurrentProcess()-> |
| 124 HasSwitch(switches::kDisableOverscrollEdgeEffect); | 126 HasSwitch(switches::kDisableOverscrollEdgeEffect); |
| 125 // Don't block the main thread with effect resource loading. | 127 // Don't block the main thread with effect resource loading. |
| 126 // Actual effect creation is deferred until an overscroll event is received. | 128 // Actual effect creation is deferred until an overscroll event is received. |
| 127 if (overscroll_effect_enabled_) { | 129 if (overscroll_effect_enabled_) { |
| 128 base::WorkerPool::PostTask(FROM_HERE, | 130 base::WorkerPool::PostTask(FROM_HERE, |
| 129 base::Bind(&OverscrollGlow::EnsureResources), | 131 base::Bind(&OverscrollGlow::EnsureResources), |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 185 RenderWidgetHost* | 187 RenderWidgetHost* |
| 186 RenderWidgetHostViewAndroid::GetRenderWidgetHost() const { | 188 RenderWidgetHostViewAndroid::GetRenderWidgetHost() const { |
| 187 return host_; | 189 return host_; |
| 188 } | 190 } |
| 189 | 191 |
| 190 void RenderWidgetHostViewAndroid::WasShown() { | 192 void RenderWidgetHostViewAndroid::WasShown() { |
| 191 if (!host_ || !host_->is_hidden()) | 193 if (!host_ || !host_->is_hidden()) |
| 192 return; | 194 return; |
| 193 | 195 |
| 194 host_->WasShown(); | 196 host_->WasShown(); |
| 197 | |
| 198 if (content_view_core_ && !UsingSynchronousCompositor()) | |
| 199 content_view_core_->GetWindowAndroid()->AddObserver(this); | |
| 195 } | 200 } |
| 196 | 201 |
| 197 void RenderWidgetHostViewAndroid::WasHidden() { | 202 void RenderWidgetHostViewAndroid::WasHidden() { |
| 198 RunAckCallbacks(); | 203 RunAckCallbacks(); |
| 199 | 204 |
| 200 if (!host_ || host_->is_hidden()) | 205 if (!host_ || host_->is_hidden()) |
| 201 return; | 206 return; |
| 202 | 207 |
| 203 // Inform the renderer that we are being hidden so it can reduce its resource | 208 // Inform the renderer that we are being hidden so it can reduce its resource |
| 204 // utilization. | 209 // utilization. |
| 205 host_->WasHidden(); | 210 host_->WasHidden(); |
| 211 | |
| 212 if (content_view_core_ && !UsingSynchronousCompositor()) | |
| 213 content_view_core_->GetWindowAndroid()->RemoveObserver(this); | |
| 206 } | 214 } |
| 207 | 215 |
| 208 void RenderWidgetHostViewAndroid::WasResized() { | 216 void RenderWidgetHostViewAndroid::WasResized() { |
| 209 host_->WasResized(); | 217 host_->WasResized(); |
| 210 } | 218 } |
| 211 | 219 |
| 212 void RenderWidgetHostViewAndroid::SetSize(const gfx::Size& size) { | 220 void RenderWidgetHostViewAndroid::SetSize(const gfx::Size& size) { |
| 213 // Ignore the given size as only the Java code has the power to | 221 // Ignore the given size as only the Java code has the power to |
| 214 // resize the view on Android. | 222 // resize the view on Android. |
| 215 default_size_ = size; | 223 default_size_ = size; |
| (...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 499 NOTIMPLEMENTED(); | 507 NOTIMPLEMENTED(); |
| 500 } | 508 } |
| 501 | 509 |
| 502 void RenderWidgetHostViewAndroid::RenderProcessGone( | 510 void RenderWidgetHostViewAndroid::RenderProcessGone( |
| 503 base::TerminationStatus status, int error_code) { | 511 base::TerminationStatus status, int error_code) { |
| 504 Destroy(); | 512 Destroy(); |
| 505 } | 513 } |
| 506 | 514 |
| 507 void RenderWidgetHostViewAndroid::Destroy() { | 515 void RenderWidgetHostViewAndroid::Destroy() { |
| 508 RemoveLayers(); | 516 RemoveLayers(); |
| 509 content_view_core_ = NULL; | 517 // This must happen before setting host_ NULL. |
| 518 SetContentViewCore(NULL); | |
| 510 | 519 |
| 511 // The RenderWidgetHost's destruction led here, so don't call it. | 520 // The RenderWidgetHost's destruction led here, so don't call it. |
| 512 host_ = NULL; | 521 host_ = NULL; |
| 513 | 522 |
| 514 delete this; | 523 delete this; |
| 515 } | 524 } |
| 516 | 525 |
| 517 void RenderWidgetHostViewAndroid::SetTooltipText( | 526 void RenderWidgetHostViewAndroid::SetTooltipText( |
| 518 const string16& tooltip_text) { | 527 const string16& tooltip_text) { |
| 519 // Tooltips don't makes sense on Android. | 528 // 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; | 710 resource_collection_ = new cc::DelegatedFrameResourceCollection; |
| 702 resource_collection_->SetClient(this); | 711 resource_collection_->SetClient(this); |
| 703 } | 712 } |
| 704 if (!frame_provider_ || | 713 if (!frame_provider_ || |
| 705 texture_size_in_layer_ != frame_provider_->frame_size()) { | 714 texture_size_in_layer_ != frame_provider_->frame_size()) { |
| 706 if (are_layers_attached_) | 715 if (are_layers_attached_) |
| 707 RemoveLayers(); | 716 RemoveLayers(); |
| 708 frame_provider_ = new cc::DelegatedFrameProvider( | 717 frame_provider_ = new cc::DelegatedFrameProvider( |
| 709 resource_collection_.get(), frame_data.Pass()); | 718 resource_collection_.get(), frame_data.Pass()); |
| 710 delegated_renderer_layer_ = | 719 delegated_renderer_layer_ = |
| 711 cc::DelegatedRendererLayer::Create(this, frame_provider_); | 720 cc::DelegatedRendererLayer::Create(NULL, frame_provider_); |
| 712 layer_ = delegated_renderer_layer_; | 721 layer_ = delegated_renderer_layer_; |
| 713 if (are_layers_attached_) | 722 if (are_layers_attached_) |
| 714 AttachLayers(); | 723 AttachLayers(); |
| 715 } else { | 724 } else { |
| 716 frame_provider_->SetFrameData(frame_data.Pass()); | 725 frame_provider_->SetFrameData(frame_data.Pass()); |
| 717 } | 726 } |
| 718 } | 727 } |
| 719 | 728 |
| 720 if (delegated_renderer_layer_.get()) { | 729 if (delegated_renderer_layer_.get()) { |
| 721 delegated_renderer_layer_->SetDisplaySize(texture_size_in_layer_); | 730 delegated_renderer_layer_->SetDisplaySize(texture_size_in_layer_); |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 839 | 848 |
| 840 void RenderWidgetHostViewAndroid::BuffersSwapped( | 849 void RenderWidgetHostViewAndroid::BuffersSwapped( |
| 841 const gpu::Mailbox& mailbox, | 850 const gpu::Mailbox& mailbox, |
| 842 uint32_t output_surface_id, | 851 uint32_t output_surface_id, |
| 843 const base::Closure& ack_callback) { | 852 const base::Closure& ack_callback) { |
| 844 ImageTransportFactoryAndroid* factory = | 853 ImageTransportFactoryAndroid* factory = |
| 845 ImageTransportFactoryAndroid::GetInstance(); | 854 ImageTransportFactoryAndroid::GetInstance(); |
| 846 | 855 |
| 847 if (!texture_id_in_layer_) { | 856 if (!texture_id_in_layer_) { |
| 848 texture_id_in_layer_ = factory->CreateTexture(); | 857 texture_id_in_layer_ = factory->CreateTexture(); |
| 858 texture_layer_->SetTextureId(texture_id_in_layer_); | |
| 849 texture_layer_->SetIsDrawable(true); | 859 texture_layer_->SetIsDrawable(true); |
| 850 texture_layer_->SetContentsOpaque(true); | 860 texture_layer_->SetContentsOpaque(true); |
| 851 } | 861 } |
| 852 | 862 |
| 853 ImageTransportFactoryAndroid::GetInstance()->AcquireTexture( | 863 ImageTransportFactoryAndroid::GetInstance()->AcquireTexture( |
| 854 texture_id_in_layer_, mailbox.name); | 864 texture_id_in_layer_, mailbox.name); |
| 855 | 865 |
| 856 ResetClipping(); | 866 ResetClipping(); |
| 857 | 867 |
| 858 current_mailbox_ = mailbox; | 868 current_mailbox_ = mailbox; |
| (...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1237 ScheduleAnimationIfNecessary(); | 1247 ScheduleAnimationIfNecessary(); |
| 1238 } | 1248 } |
| 1239 | 1249 |
| 1240 void RenderWidgetHostViewAndroid::SetContentViewCore( | 1250 void RenderWidgetHostViewAndroid::SetContentViewCore( |
| 1241 ContentViewCoreImpl* content_view_core) { | 1251 ContentViewCoreImpl* content_view_core) { |
| 1242 RunAckCallbacks(); | 1252 RunAckCallbacks(); |
| 1243 | 1253 |
| 1244 if (are_layers_attached_) | 1254 if (are_layers_attached_) |
| 1245 RemoveLayers(); | 1255 RemoveLayers(); |
| 1246 | 1256 |
| 1257 if (content_view_core == NULL) { | |
| 1258 if (content_view_core_ && !UsingSynchronousCompositor()) | |
| 1259 content_view_core_->GetWindowAndroid()->RemoveObserver(this); | |
| 1260 } | |
| 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_ && !UsingSynchronousCompositor()) | |
| 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 bool RenderWidgetHostViewAndroid::UsingSynchronousCompositor() const { |
| 1275 RunAckCallbacks(); | 1293 DCHECK(host_); |
|
no sievers
2013/11/14 22:01:01
nit: Can this just become a member variable |using
powei
2013/11/15 02:18:26
Done.
| |
| 1276 return texture_id_in_layer_; | 1294 return SynchronousCompositorImpl::FromID(host_->GetProcess()->GetID(), |
| 1295 host_->GetRoutingID()) != NULL; | |
| 1277 } | 1296 } |
| 1278 | 1297 |
| 1279 void RenderWidgetHostViewAndroid::DidCommitFrameData() { | 1298 void RenderWidgetHostViewAndroid::OnCompositingDidCommit( |
| 1299 Compositor* compositor) { | |
| 1280 RunAckCallbacks(); | 1300 RunAckCallbacks(); |
| 1281 } | 1301 } |
| 1282 | 1302 |
| 1283 bool RenderWidgetHostViewAndroid::PrepareTextureMailbox( | 1303 void RenderWidgetHostViewAndroid::OnDetachCompositor( |
| 1284 cc::TextureMailbox* mailbox, | 1304 Compositor* compositor) { |
| 1285 scoped_ptr<cc::SingleReleaseCallback>* release_callback, | 1305 DCHECK(content_view_core_); |
| 1286 bool use_shared_memory) { | 1306 DCHECK(!UsingSynchronousCompositor()); |
| 1287 return false; | 1307 content_view_core_->GetWindowAndroid()->RemoveObserver(this); |
|
no sievers
2013/11/14 22:01:01
RunAckCallbacks() here.
And being removed as an ob
powei
2013/11/15 02:18:26
Done.
| |
| 1288 } | 1308 } |
| 1289 | 1309 |
| 1290 void RenderWidgetHostViewAndroid::OnLostResources() { | 1310 void RenderWidgetHostViewAndroid::OnLostResources() { |
| 1291 if (texture_layer_.get()) | 1311 if (texture_layer_.get()) |
| 1292 texture_layer_->SetIsDrawable(false); | 1312 texture_layer_->SetIsDrawable(false); |
| 1293 if (delegated_renderer_layer_.get()) | 1313 if (delegated_renderer_layer_.get()) |
| 1294 DestroyDelegatedContent(); | 1314 DestroyDelegatedContent(); |
| 1295 texture_id_in_layer_ = 0; | 1315 texture_id_in_layer_ = 0; |
| 1296 RunAckCallbacks(); | 1316 RunAckCallbacks(); |
| 1297 } | 1317 } |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1391 // RenderWidgetHostView, public: | 1411 // RenderWidgetHostView, public: |
| 1392 | 1412 |
| 1393 // static | 1413 // static |
| 1394 RenderWidgetHostView* | 1414 RenderWidgetHostView* |
| 1395 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { | 1415 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { |
| 1396 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); | 1416 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); |
| 1397 return new RenderWidgetHostViewAndroid(rwhi, NULL); | 1417 return new RenderWidgetHostViewAndroid(rwhi, NULL); |
| 1398 } | 1418 } |
| 1399 | 1419 |
| 1400 } // namespace content | 1420 } // namespace content |
| OLD | NEW |