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 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 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) { |
| 118 if (!UsingDelegatedRenderer()) { | 119 if (!UsingDelegatedRenderer()) { |
| 119 texture_layer_ = cc::TextureLayer::Create(this); | 120 texture_layer_ = cc::TextureLayer::Create(NULL); |
| 120 layer_ = texture_layer_; | 121 layer_ = texture_layer_; |
| 121 } | 122 } |
| 122 | 123 |
| 123 overscroll_effect_enabled_ = !CommandLine::ForCurrentProcess()-> | 124 overscroll_effect_enabled_ = !CommandLine::ForCurrentProcess()-> |
| 124 HasSwitch(switches::kDisableOverscrollEdgeEffect); | 125 HasSwitch(switches::kDisableOverscrollEdgeEffect); |
| 125 // Don't block the main thread with effect resource loading. | 126 // Don't block the main thread with effect resource loading. |
| 126 // Actual effect creation is deferred until an overscroll event is received. | 127 // Actual effect creation is deferred until an overscroll event is received. |
| 127 if (overscroll_effect_enabled_) { | 128 if (overscroll_effect_enabled_) { |
| 128 base::WorkerPool::PostTask(FROM_HERE, | 129 base::WorkerPool::PostTask(FROM_HERE, |
| 129 base::Bind(&OverscrollGlow::EnsureResources), | 130 base::Bind(&OverscrollGlow::EnsureResources), |
| 130 true); | 131 true); |
| 131 } | 132 } |
| 132 | 133 |
| 133 host_->SetView(this); | 134 host_->SetView(this); |
| 134 SetContentViewCore(content_view_core); | 135 SetContentViewCore(content_view_core); |
| 135 ImageTransportFactoryAndroid::AddObserver(this); | 136 ImageTransportFactoryAndroid::AddObserver(this); |
| 137 | |
| 138 using_synchronous_compositor_ = | |
| 139 SynchronousCompositorImpl::FromID(host_->GetProcess()->GetID(), | |
| 140 host_->GetRoutingID()) != NULL; | |
| 136 } | 141 } |
| 137 | 142 |
| 138 RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() { | 143 RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() { |
| 139 ImageTransportFactoryAndroid::RemoveObserver(this); | 144 ImageTransportFactoryAndroid::RemoveObserver(this); |
| 140 SetContentViewCore(NULL); | 145 SetContentViewCore(NULL); |
| 141 DCHECK(ack_callbacks_.empty()); | 146 DCHECK(ack_callbacks_.empty()); |
| 142 if (texture_id_in_layer_) { | 147 if (texture_id_in_layer_) { |
| 143 ImageTransportFactoryAndroid::GetInstance()->DeleteTexture( | 148 ImageTransportFactoryAndroid::GetInstance()->DeleteTexture( |
| 144 texture_id_in_layer_); | 149 texture_id_in_layer_); |
| 145 } | 150 } |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 185 RenderWidgetHost* | 190 RenderWidgetHost* |
| 186 RenderWidgetHostViewAndroid::GetRenderWidgetHost() const { | 191 RenderWidgetHostViewAndroid::GetRenderWidgetHost() const { |
| 187 return host_; | 192 return host_; |
| 188 } | 193 } |
| 189 | 194 |
| 190 void RenderWidgetHostViewAndroid::WasShown() { | 195 void RenderWidgetHostViewAndroid::WasShown() { |
| 191 if (!host_ || !host_->is_hidden()) | 196 if (!host_ || !host_->is_hidden()) |
| 192 return; | 197 return; |
| 193 | 198 |
| 194 host_->WasShown(); | 199 host_->WasShown(); |
| 200 | |
| 201 if (content_view_core_ && !using_synchronous_compositor_) | |
| 202 content_view_core_->GetWindowAndroid()->AddObserver(this); | |
|
Ted C
2013/11/16 01:04:08
-2 indent.
In the event content_view_core_ wasn't
powei
2013/11/18 19:29:59
Done for indent.
I don't think we're necessarily
| |
| 195 } | 203 } |
| 196 | 204 |
| 197 void RenderWidgetHostViewAndroid::WasHidden() { | 205 void RenderWidgetHostViewAndroid::WasHidden() { |
| 198 RunAckCallbacks(); | 206 RunAckCallbacks(); |
| 199 | 207 |
| 200 if (!host_ || host_->is_hidden()) | 208 if (!host_ || host_->is_hidden()) |
| 201 return; | 209 return; |
| 202 | 210 |
| 203 // Inform the renderer that we are being hidden so it can reduce its resource | 211 // Inform the renderer that we are being hidden so it can reduce its resource |
| 204 // utilization. | 212 // utilization. |
| 205 host_->WasHidden(); | 213 host_->WasHidden(); |
| 214 | |
| 215 if (content_view_core_ && !using_synchronous_compositor_) | |
| 216 content_view_core_->GetWindowAndroid()->RemoveObserver(this); | |
|
Ted C
2013/11/16 01:04:08
-2 indent
powei
2013/11/18 19:29:59
Done.
| |
| 206 } | 217 } |
| 207 | 218 |
| 208 void RenderWidgetHostViewAndroid::WasResized() { | 219 void RenderWidgetHostViewAndroid::WasResized() { |
| 209 host_->WasResized(); | 220 host_->WasResized(); |
| 210 } | 221 } |
| 211 | 222 |
| 212 void RenderWidgetHostViewAndroid::SetSize(const gfx::Size& size) { | 223 void RenderWidgetHostViewAndroid::SetSize(const gfx::Size& size) { |
| 213 // Ignore the given size as only the Java code has the power to | 224 // Ignore the given size as only the Java code has the power to |
| 214 // resize the view on Android. | 225 // resize the view on Android. |
| 215 default_size_ = size; | 226 default_size_ = size; |
| (...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 499 NOTIMPLEMENTED(); | 510 NOTIMPLEMENTED(); |
| 500 } | 511 } |
| 501 | 512 |
| 502 void RenderWidgetHostViewAndroid::RenderProcessGone( | 513 void RenderWidgetHostViewAndroid::RenderProcessGone( |
| 503 base::TerminationStatus status, int error_code) { | 514 base::TerminationStatus status, int error_code) { |
| 504 Destroy(); | 515 Destroy(); |
| 505 } | 516 } |
| 506 | 517 |
| 507 void RenderWidgetHostViewAndroid::Destroy() { | 518 void RenderWidgetHostViewAndroid::Destroy() { |
| 508 RemoveLayers(); | 519 RemoveLayers(); |
| 509 content_view_core_ = NULL; | 520 SetContentViewCore(NULL); |
| 510 | 521 |
| 511 // The RenderWidgetHost's destruction led here, so don't call it. | 522 // The RenderWidgetHost's destruction led here, so don't call it. |
| 512 host_ = NULL; | 523 host_ = NULL; |
| 513 | 524 |
| 514 delete this; | 525 delete this; |
| 515 } | 526 } |
| 516 | 527 |
| 517 void RenderWidgetHostViewAndroid::SetTooltipText( | 528 void RenderWidgetHostViewAndroid::SetTooltipText( |
| 518 const string16& tooltip_text) { | 529 const string16& tooltip_text) { |
| 519 // Tooltips don't makes sense on Android. | 530 // 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; | 712 resource_collection_ = new cc::DelegatedFrameResourceCollection; |
| 702 resource_collection_->SetClient(this); | 713 resource_collection_->SetClient(this); |
| 703 } | 714 } |
| 704 if (!frame_provider_ || | 715 if (!frame_provider_ || |
| 705 texture_size_in_layer_ != frame_provider_->frame_size()) { | 716 texture_size_in_layer_ != frame_provider_->frame_size()) { |
| 706 if (are_layers_attached_) | 717 if (are_layers_attached_) |
| 707 RemoveLayers(); | 718 RemoveLayers(); |
| 708 frame_provider_ = new cc::DelegatedFrameProvider( | 719 frame_provider_ = new cc::DelegatedFrameProvider( |
| 709 resource_collection_.get(), frame_data.Pass()); | 720 resource_collection_.get(), frame_data.Pass()); |
| 710 delegated_renderer_layer_ = | 721 delegated_renderer_layer_ = |
| 711 cc::DelegatedRendererLayer::Create(this, frame_provider_); | 722 cc::DelegatedRendererLayer::Create(NULL, frame_provider_); |
| 712 layer_ = delegated_renderer_layer_; | 723 layer_ = delegated_renderer_layer_; |
| 713 if (are_layers_attached_) | 724 if (are_layers_attached_) |
| 714 AttachLayers(); | 725 AttachLayers(); |
| 715 } else { | 726 } else { |
| 716 frame_provider_->SetFrameData(frame_data.Pass()); | 727 frame_provider_->SetFrameData(frame_data.Pass()); |
| 717 } | 728 } |
| 718 } | 729 } |
| 719 | 730 |
| 720 if (delegated_renderer_layer_.get()) { | 731 if (delegated_renderer_layer_.get()) { |
| 721 delegated_renderer_layer_->SetDisplaySize(texture_size_in_layer_); | 732 delegated_renderer_layer_->SetDisplaySize(texture_size_in_layer_); |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 839 | 850 |
| 840 void RenderWidgetHostViewAndroid::BuffersSwapped( | 851 void RenderWidgetHostViewAndroid::BuffersSwapped( |
| 841 const gpu::Mailbox& mailbox, | 852 const gpu::Mailbox& mailbox, |
| 842 uint32_t output_surface_id, | 853 uint32_t output_surface_id, |
| 843 const base::Closure& ack_callback) { | 854 const base::Closure& ack_callback) { |
| 844 ImageTransportFactoryAndroid* factory = | 855 ImageTransportFactoryAndroid* factory = |
| 845 ImageTransportFactoryAndroid::GetInstance(); | 856 ImageTransportFactoryAndroid::GetInstance(); |
| 846 | 857 |
| 847 if (!texture_id_in_layer_) { | 858 if (!texture_id_in_layer_) { |
| 848 texture_id_in_layer_ = factory->CreateTexture(); | 859 texture_id_in_layer_ = factory->CreateTexture(); |
| 860 texture_layer_->SetTextureId(texture_id_in_layer_); | |
| 849 texture_layer_->SetIsDrawable(true); | 861 texture_layer_->SetIsDrawable(true); |
| 850 texture_layer_->SetContentsOpaque(true); | 862 texture_layer_->SetContentsOpaque(true); |
| 851 } | 863 } |
| 852 | 864 |
| 853 ImageTransportFactoryAndroid::GetInstance()->AcquireTexture( | 865 ImageTransportFactoryAndroid::GetInstance()->AcquireTexture( |
| 854 texture_id_in_layer_, mailbox.name); | 866 texture_id_in_layer_, mailbox.name); |
| 855 | 867 |
| 856 ResetClipping(); | 868 ResetClipping(); |
| 857 | 869 |
| 858 current_mailbox_ = mailbox; | 870 current_mailbox_ = mailbox; |
| (...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1237 ScheduleAnimationIfNecessary(); | 1249 ScheduleAnimationIfNecessary(); |
| 1238 } | 1250 } |
| 1239 | 1251 |
| 1240 void RenderWidgetHostViewAndroid::SetContentViewCore( | 1252 void RenderWidgetHostViewAndroid::SetContentViewCore( |
| 1241 ContentViewCoreImpl* content_view_core) { | 1253 ContentViewCoreImpl* content_view_core) { |
| 1242 RunAckCallbacks(); | 1254 RunAckCallbacks(); |
| 1243 | 1255 |
| 1244 if (are_layers_attached_) | 1256 if (are_layers_attached_) |
| 1245 RemoveLayers(); | 1257 RemoveLayers(); |
| 1246 | 1258 |
| 1259 if (content_view_core == NULL) { | |
|
Ted C
2013/11/16 01:04:08
Shouldn't need the == NULL
powei
2013/11/18 19:29:59
Done. Followed suggestion below.
| |
| 1260 if (content_view_core_ && !using_synchronous_compositor_) | |
|
boliu
2013/11/16 00:42:56
Why does value of new content_view_core matter her
Ted C
2013/11/16 01:04:08
Yeah, maybe it should be content_view_core != cont
powei
2013/11/18 19:29:59
Done.
| |
| 1261 content_view_core_->GetWindowAndroid()->RemoveObserver(this); | |
| 1262 } | |
| 1263 | |
| 1247 content_view_core_ = content_view_core; | 1264 content_view_core_ = content_view_core; |
| 1248 | 1265 |
| 1249 if (GetBrowserAccessibilityManager()) { | 1266 if (GetBrowserAccessibilityManager()) { |
| 1250 base::android::ScopedJavaLocalRef<jobject> obj; | 1267 base::android::ScopedJavaLocalRef<jobject> obj; |
| 1251 if (content_view_core_) | 1268 if (content_view_core_) |
| 1252 obj = content_view_core_->GetJavaObject(); | 1269 obj = content_view_core_->GetJavaObject(); |
| 1253 GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerAndroid()-> | 1270 GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerAndroid()-> |
| 1254 SetContentViewCore(obj); | 1271 SetContentViewCore(obj); |
| 1255 } | 1272 } |
| 1256 | 1273 |
| 1257 if (are_layers_attached_) | 1274 if (are_layers_attached_) { |
| 1258 AttachLayers(); | 1275 AttachLayers(); |
| 1276 if (content_view_core_ && !using_synchronous_compositor_) | |
| 1277 content_view_core_->GetWindowAndroid()->AddObserver(this); | |
| 1278 } | |
| 1259 } | 1279 } |
| 1260 | 1280 |
| 1261 void RenderWidgetHostViewAndroid::RunAckCallbacks() { | 1281 void RenderWidgetHostViewAndroid::RunAckCallbacks() { |
| 1262 while (!ack_callbacks_.empty()) { | 1282 while (!ack_callbacks_.empty()) { |
| 1263 ack_callbacks_.front().Run(); | 1283 ack_callbacks_.front().Run(); |
| 1264 ack_callbacks_.pop(); | 1284 ack_callbacks_.pop(); |
| 1265 } | 1285 } |
| 1266 } | 1286 } |
| 1267 | 1287 |
| 1268 void RenderWidgetHostViewAndroid::HasTouchEventHandlers( | 1288 void RenderWidgetHostViewAndroid::HasTouchEventHandlers( |
| 1269 bool need_touch_events) { | 1289 bool need_touch_events) { |
| 1270 if (content_view_core_) | 1290 if (content_view_core_) |
| 1271 content_view_core_->HasTouchEventHandlers(need_touch_events); | 1291 content_view_core_->HasTouchEventHandlers(need_touch_events); |
| 1272 } | 1292 } |
| 1273 | 1293 |
| 1274 unsigned RenderWidgetHostViewAndroid::PrepareTexture() { | 1294 void RenderWidgetHostViewAndroid::OnCompositingDidCommit() { |
| 1275 RunAckCallbacks(); | |
| 1276 return texture_id_in_layer_; | |
| 1277 } | |
| 1278 | |
| 1279 void RenderWidgetHostViewAndroid::DidCommitFrameData() { | |
| 1280 RunAckCallbacks(); | 1295 RunAckCallbacks(); |
| 1281 } | 1296 } |
| 1282 | 1297 |
| 1283 bool RenderWidgetHostViewAndroid::PrepareTextureMailbox( | 1298 void RenderWidgetHostViewAndroid::OnDetachCompositor() { |
| 1284 cc::TextureMailbox* mailbox, | 1299 DCHECK(content_view_core_); |
| 1285 scoped_ptr<cc::SingleReleaseCallback>* release_callback, | 1300 DCHECK(!using_synchronous_compositor_); |
| 1286 bool use_shared_memory) { | 1301 RunAckCallbacks(); |
| 1287 return false; | |
| 1288 } | 1302 } |
| 1289 | 1303 |
| 1290 void RenderWidgetHostViewAndroid::OnLostResources() { | 1304 void RenderWidgetHostViewAndroid::OnLostResources() { |
| 1291 if (texture_layer_.get()) | 1305 if (texture_layer_.get()) |
| 1292 texture_layer_->SetIsDrawable(false); | 1306 texture_layer_->SetIsDrawable(false); |
| 1293 if (delegated_renderer_layer_.get()) | 1307 if (delegated_renderer_layer_.get()) |
| 1294 DestroyDelegatedContent(); | 1308 DestroyDelegatedContent(); |
| 1295 texture_id_in_layer_ = 0; | 1309 texture_id_in_layer_ = 0; |
| 1296 RunAckCallbacks(); | 1310 RunAckCallbacks(); |
| 1297 } | 1311 } |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1391 // RenderWidgetHostView, public: | 1405 // RenderWidgetHostView, public: |
| 1392 | 1406 |
| 1393 // static | 1407 // static |
| 1394 RenderWidgetHostView* | 1408 RenderWidgetHostView* |
| 1395 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { | 1409 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { |
| 1396 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); | 1410 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); |
| 1397 return new RenderWidgetHostViewAndroid(rwhi, NULL); | 1411 return new RenderWidgetHostViewAndroid(rwhi, NULL); |
| 1398 } | 1412 } |
| 1399 | 1413 |
| 1400 } // namespace content | 1414 } // namespace content |
| OLD | NEW |