| 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 27 matching lines...) Expand all Loading... |
| 38 #include "content/browser/renderer_host/render_widget_host_impl.h" | 38 #include "content/browser/renderer_host/render_widget_host_impl.h" |
| 39 #include "content/common/gpu/client/gl_helper.h" | 39 #include "content/common/gpu/client/gl_helper.h" |
| 40 #include "content/common/gpu/gpu_messages.h" | 40 #include "content/common/gpu/gpu_messages.h" |
| 41 #include "content/common/input_messages.h" | 41 #include "content/common/input_messages.h" |
| 42 #include "content/common/view_messages.h" | 42 #include "content/common/view_messages.h" |
| 43 #include "content/public/common/content_switches.h" | 43 #include "content/public/common/content_switches.h" |
| 44 #include "gpu/config/gpu_driver_bug_workaround_type.h" | 44 #include "gpu/config/gpu_driver_bug_workaround_type.h" |
| 45 #include "skia/ext/image_operations.h" | 45 #include "skia/ext/image_operations.h" |
| 46 #include "third_party/khronos/GLES2/gl2.h" | 46 #include "third_party/khronos/GLES2/gl2.h" |
| 47 #include "third_party/khronos/GLES2/gl2ext.h" | 47 #include "third_party/khronos/GLES2/gl2ext.h" |
| 48 #include "ui/base/android/window_android.h" |
| 48 #include "ui/gfx/android/device_display_info.h" | 49 #include "ui/gfx/android/device_display_info.h" |
| 49 #include "ui/gfx/android/java_bitmap.h" | 50 #include "ui/gfx/android/java_bitmap.h" |
| 50 #include "ui/gfx/display.h" | 51 #include "ui/gfx/display.h" |
| 51 #include "ui/gfx/screen.h" | 52 #include "ui/gfx/screen.h" |
| 52 #include "ui/gfx/size_conversions.h" | 53 #include "ui/gfx/size_conversions.h" |
| 53 | 54 |
| 54 namespace content { | 55 namespace content { |
| 55 | 56 |
| 56 namespace { | 57 namespace { |
| 57 | 58 |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 105 needs_begin_frame_(false), | 106 needs_begin_frame_(false), |
| 106 are_layers_attached_(true), | 107 are_layers_attached_(true), |
| 107 content_view_core_(NULL), | 108 content_view_core_(NULL), |
| 108 ime_adapter_android_(this), | 109 ime_adapter_android_(this), |
| 109 cached_background_color_(SK_ColorWHITE), | 110 cached_background_color_(SK_ColorWHITE), |
| 110 texture_id_in_layer_(0), | 111 texture_id_in_layer_(0), |
| 111 last_output_surface_id_(kUndefinedOutputSurfaceId), | 112 last_output_surface_id_(kUndefinedOutputSurfaceId), |
| 112 weak_ptr_factory_(this), | 113 weak_ptr_factory_(this), |
| 113 overscroll_effect_enabled_(true), | 114 overscroll_effect_enabled_(true), |
| 114 flush_input_requested_(false), | 115 flush_input_requested_(false), |
| 115 accelerated_surface_route_id_(0) { | 116 accelerated_surface_route_id_(0), |
| 117 using_synchronous_compositor_(SynchronousCompositorImpl::FromID( |
| 118 widget_host->GetProcess()->GetID(), |
| 119 widget_host->GetRoutingID()) != NULL) { |
| 116 if (!UsingDelegatedRenderer()) { | 120 if (!UsingDelegatedRenderer()) { |
| 117 texture_layer_ = cc::TextureLayer::Create(this); | 121 texture_layer_ = cc::TextureLayer::Create(NULL); |
| 118 layer_ = texture_layer_; | 122 layer_ = texture_layer_; |
| 119 } | 123 } |
| 120 | 124 |
| 121 overscroll_effect_enabled_ = !CommandLine::ForCurrentProcess()-> | 125 overscroll_effect_enabled_ = !CommandLine::ForCurrentProcess()-> |
| 122 HasSwitch(switches::kDisableOverscrollEdgeEffect); | 126 HasSwitch(switches::kDisableOverscrollEdgeEffect); |
| 123 // Don't block the main thread with effect resource loading. | 127 // Don't block the main thread with effect resource loading. |
| 124 // Actual effect creation is deferred until an overscroll event is received. | 128 // Actual effect creation is deferred until an overscroll event is received. |
| 125 if (overscroll_effect_enabled_) { | 129 if (overscroll_effect_enabled_) { |
| 126 base::WorkerPool::PostTask(FROM_HERE, | 130 base::WorkerPool::PostTask(FROM_HERE, |
| 127 base::Bind(&OverscrollGlow::EnsureResources), | 131 base::Bind(&OverscrollGlow::EnsureResources), |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 183 RenderWidgetHost* | 187 RenderWidgetHost* |
| 184 RenderWidgetHostViewAndroid::GetRenderWidgetHost() const { | 188 RenderWidgetHostViewAndroid::GetRenderWidgetHost() const { |
| 185 return host_; | 189 return host_; |
| 186 } | 190 } |
| 187 | 191 |
| 188 void RenderWidgetHostViewAndroid::WasShown() { | 192 void RenderWidgetHostViewAndroid::WasShown() { |
| 189 if (!host_ || !host_->is_hidden()) | 193 if (!host_ || !host_->is_hidden()) |
| 190 return; | 194 return; |
| 191 | 195 |
| 192 host_->WasShown(); | 196 host_->WasShown(); |
| 197 |
| 198 if (content_view_core_ && !using_synchronous_compositor_) |
| 199 content_view_core_->GetWindowAndroid()->AddObserver(this); |
| 193 } | 200 } |
| 194 | 201 |
| 195 void RenderWidgetHostViewAndroid::WasHidden() { | 202 void RenderWidgetHostViewAndroid::WasHidden() { |
| 196 RunAckCallbacks(); | 203 RunAckCallbacks(); |
| 197 | 204 |
| 198 if (!host_ || host_->is_hidden()) | 205 if (!host_ || host_->is_hidden()) |
| 199 return; | 206 return; |
| 200 | 207 |
| 201 // 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 |
| 202 // utilization. | 209 // utilization. |
| 203 host_->WasHidden(); | 210 host_->WasHidden(); |
| 211 |
| 212 if (content_view_core_ && !using_synchronous_compositor_) |
| 213 content_view_core_->GetWindowAndroid()->RemoveObserver(this); |
| 204 } | 214 } |
| 205 | 215 |
| 206 void RenderWidgetHostViewAndroid::WasResized() { | 216 void RenderWidgetHostViewAndroid::WasResized() { |
| 207 host_->WasResized(); | 217 host_->WasResized(); |
| 208 } | 218 } |
| 209 | 219 |
| 210 void RenderWidgetHostViewAndroid::SetSize(const gfx::Size& size) { | 220 void RenderWidgetHostViewAndroid::SetSize(const gfx::Size& size) { |
| 211 // 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 |
| 212 // resize the view on Android. | 222 // resize the view on Android. |
| 213 default_size_ = size; | 223 default_size_ = size; |
| (...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 497 NOTIMPLEMENTED(); | 507 NOTIMPLEMENTED(); |
| 498 } | 508 } |
| 499 | 509 |
| 500 void RenderWidgetHostViewAndroid::RenderProcessGone( | 510 void RenderWidgetHostViewAndroid::RenderProcessGone( |
| 501 base::TerminationStatus status, int error_code) { | 511 base::TerminationStatus status, int error_code) { |
| 502 Destroy(); | 512 Destroy(); |
| 503 } | 513 } |
| 504 | 514 |
| 505 void RenderWidgetHostViewAndroid::Destroy() { | 515 void RenderWidgetHostViewAndroid::Destroy() { |
| 506 RemoveLayers(); | 516 RemoveLayers(); |
| 507 content_view_core_ = NULL; | 517 SetContentViewCore(NULL); |
| 508 | 518 |
| 509 // The RenderWidgetHost's destruction led here, so don't call it. | 519 // The RenderWidgetHost's destruction led here, so don't call it. |
| 510 host_ = NULL; | 520 host_ = NULL; |
| 511 | 521 |
| 512 delete this; | 522 delete this; |
| 513 } | 523 } |
| 514 | 524 |
| 515 void RenderWidgetHostViewAndroid::SetTooltipText( | 525 void RenderWidgetHostViewAndroid::SetTooltipText( |
| 516 const string16& tooltip_text) { | 526 const string16& tooltip_text) { |
| 517 // Tooltips don't makes sense on Android. | 527 // Tooltips don't makes sense on Android. |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 675 resource_collection_ = new cc::DelegatedFrameResourceCollection; | 685 resource_collection_ = new cc::DelegatedFrameResourceCollection; |
| 676 resource_collection_->SetClient(this); | 686 resource_collection_->SetClient(this); |
| 677 } | 687 } |
| 678 if (!frame_provider_ || | 688 if (!frame_provider_ || |
| 679 texture_size_in_layer_ != frame_provider_->frame_size()) { | 689 texture_size_in_layer_ != frame_provider_->frame_size()) { |
| 680 if (are_layers_attached_) | 690 if (are_layers_attached_) |
| 681 RemoveLayers(); | 691 RemoveLayers(); |
| 682 frame_provider_ = new cc::DelegatedFrameProvider( | 692 frame_provider_ = new cc::DelegatedFrameProvider( |
| 683 resource_collection_.get(), frame_data.Pass()); | 693 resource_collection_.get(), frame_data.Pass()); |
| 684 delegated_renderer_layer_ = | 694 delegated_renderer_layer_ = |
| 685 cc::DelegatedRendererLayer::Create(this, frame_provider_); | 695 cc::DelegatedRendererLayer::Create(NULL, frame_provider_); |
| 686 layer_ = delegated_renderer_layer_; | 696 layer_ = delegated_renderer_layer_; |
| 687 if (are_layers_attached_) | 697 if (are_layers_attached_) |
| 688 AttachLayers(); | 698 AttachLayers(); |
| 689 } else { | 699 } else { |
| 690 frame_provider_->SetFrameData(frame_data.Pass()); | 700 frame_provider_->SetFrameData(frame_data.Pass()); |
| 691 } | 701 } |
| 692 } | 702 } |
| 693 | 703 |
| 694 if (delegated_renderer_layer_.get()) { | 704 if (delegated_renderer_layer_.get()) { |
| 695 delegated_renderer_layer_->SetDisplaySize(texture_size_in_layer_); | 705 delegated_renderer_layer_->SetDisplaySize(texture_size_in_layer_); |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 813 | 823 |
| 814 void RenderWidgetHostViewAndroid::BuffersSwapped( | 824 void RenderWidgetHostViewAndroid::BuffersSwapped( |
| 815 const gpu::Mailbox& mailbox, | 825 const gpu::Mailbox& mailbox, |
| 816 uint32_t output_surface_id, | 826 uint32_t output_surface_id, |
| 817 const base::Closure& ack_callback) { | 827 const base::Closure& ack_callback) { |
| 818 ImageTransportFactoryAndroid* factory = | 828 ImageTransportFactoryAndroid* factory = |
| 819 ImageTransportFactoryAndroid::GetInstance(); | 829 ImageTransportFactoryAndroid::GetInstance(); |
| 820 | 830 |
| 821 if (!texture_id_in_layer_) { | 831 if (!texture_id_in_layer_) { |
| 822 texture_id_in_layer_ = factory->CreateTexture(); | 832 texture_id_in_layer_ = factory->CreateTexture(); |
| 833 texture_layer_->SetTextureId(texture_id_in_layer_); |
| 823 texture_layer_->SetIsDrawable(true); | 834 texture_layer_->SetIsDrawable(true); |
| 824 texture_layer_->SetContentsOpaque(true); | 835 texture_layer_->SetContentsOpaque(true); |
| 825 } | 836 } |
| 826 | 837 |
| 827 ImageTransportFactoryAndroid::GetInstance()->AcquireTexture( | 838 ImageTransportFactoryAndroid::GetInstance()->AcquireTexture( |
| 828 texture_id_in_layer_, mailbox.name); | 839 texture_id_in_layer_, mailbox.name); |
| 829 | 840 |
| 830 ResetClipping(); | 841 ResetClipping(); |
| 831 | 842 |
| 832 current_mailbox_ = mailbox; | 843 current_mailbox_ = mailbox; |
| (...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1211 ScheduleAnimationIfNecessary(); | 1222 ScheduleAnimationIfNecessary(); |
| 1212 } | 1223 } |
| 1213 | 1224 |
| 1214 void RenderWidgetHostViewAndroid::SetContentViewCore( | 1225 void RenderWidgetHostViewAndroid::SetContentViewCore( |
| 1215 ContentViewCoreImpl* content_view_core) { | 1226 ContentViewCoreImpl* content_view_core) { |
| 1216 RunAckCallbacks(); | 1227 RunAckCallbacks(); |
| 1217 | 1228 |
| 1218 if (are_layers_attached_) | 1229 if (are_layers_attached_) |
| 1219 RemoveLayers(); | 1230 RemoveLayers(); |
| 1220 | 1231 |
| 1232 if (content_view_core_ && !using_synchronous_compositor_) |
| 1233 content_view_core_->GetWindowAndroid()->RemoveObserver(this); |
| 1234 |
| 1221 content_view_core_ = content_view_core; | 1235 content_view_core_ = content_view_core; |
| 1222 | 1236 |
| 1223 if (GetBrowserAccessibilityManager()) { | 1237 if (GetBrowserAccessibilityManager()) { |
| 1224 base::android::ScopedJavaLocalRef<jobject> obj; | 1238 base::android::ScopedJavaLocalRef<jobject> obj; |
| 1225 if (content_view_core_) | 1239 if (content_view_core_) |
| 1226 obj = content_view_core_->GetJavaObject(); | 1240 obj = content_view_core_->GetJavaObject(); |
| 1227 GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerAndroid()-> | 1241 GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerAndroid()-> |
| 1228 SetContentViewCore(obj); | 1242 SetContentViewCore(obj); |
| 1229 } | 1243 } |
| 1230 | 1244 |
| 1231 if (are_layers_attached_) | 1245 if (are_layers_attached_) { |
| 1232 AttachLayers(); | 1246 AttachLayers(); |
| 1247 if (content_view_core_ && !using_synchronous_compositor_) |
| 1248 content_view_core_->GetWindowAndroid()->AddObserver(this); |
| 1249 } |
| 1233 } | 1250 } |
| 1234 | 1251 |
| 1235 void RenderWidgetHostViewAndroid::RunAckCallbacks() { | 1252 void RenderWidgetHostViewAndroid::RunAckCallbacks() { |
| 1236 while (!ack_callbacks_.empty()) { | 1253 while (!ack_callbacks_.empty()) { |
| 1237 ack_callbacks_.front().Run(); | 1254 ack_callbacks_.front().Run(); |
| 1238 ack_callbacks_.pop(); | 1255 ack_callbacks_.pop(); |
| 1239 } | 1256 } |
| 1240 } | 1257 } |
| 1241 | 1258 |
| 1242 void RenderWidgetHostViewAndroid::HasTouchEventHandlers( | 1259 void RenderWidgetHostViewAndroid::HasTouchEventHandlers( |
| 1243 bool need_touch_events) { | 1260 bool need_touch_events) { |
| 1244 if (content_view_core_) | 1261 if (content_view_core_) |
| 1245 content_view_core_->HasTouchEventHandlers(need_touch_events); | 1262 content_view_core_->HasTouchEventHandlers(need_touch_events); |
| 1246 } | 1263 } |
| 1247 | 1264 |
| 1248 unsigned RenderWidgetHostViewAndroid::PrepareTexture() { | 1265 void RenderWidgetHostViewAndroid::OnCompositingDidCommit() { |
| 1249 RunAckCallbacks(); | |
| 1250 return texture_id_in_layer_; | |
| 1251 } | |
| 1252 | |
| 1253 void RenderWidgetHostViewAndroid::DidCommitFrameData() { | |
| 1254 RunAckCallbacks(); | 1266 RunAckCallbacks(); |
| 1255 } | 1267 } |
| 1256 | 1268 |
| 1257 bool RenderWidgetHostViewAndroid::PrepareTextureMailbox( | 1269 void RenderWidgetHostViewAndroid::OnDetachCompositor() { |
| 1258 cc::TextureMailbox* mailbox, | 1270 DCHECK(content_view_core_); |
| 1259 scoped_ptr<cc::SingleReleaseCallback>* release_callback, | 1271 DCHECK(!using_synchronous_compositor_); |
| 1260 bool use_shared_memory) { | 1272 RunAckCallbacks(); |
| 1261 return false; | |
| 1262 } | 1273 } |
| 1263 | 1274 |
| 1264 void RenderWidgetHostViewAndroid::OnLostResources() { | 1275 void RenderWidgetHostViewAndroid::OnLostResources() { |
| 1265 if (texture_layer_.get()) | 1276 if (texture_layer_.get()) |
| 1266 texture_layer_->SetIsDrawable(false); | 1277 texture_layer_->SetIsDrawable(false); |
| 1267 if (delegated_renderer_layer_.get()) | 1278 if (delegated_renderer_layer_.get()) |
| 1268 DestroyDelegatedContent(); | 1279 DestroyDelegatedContent(); |
| 1269 texture_id_in_layer_ = 0; | 1280 texture_id_in_layer_ = 0; |
| 1270 RunAckCallbacks(); | 1281 RunAckCallbacks(); |
| 1271 } | 1282 } |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1365 // RenderWidgetHostView, public: | 1376 // RenderWidgetHostView, public: |
| 1366 | 1377 |
| 1367 // static | 1378 // static |
| 1368 RenderWidgetHostView* | 1379 RenderWidgetHostView* |
| 1369 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { | 1380 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { |
| 1370 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); | 1381 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); |
| 1371 return new RenderWidgetHostViewAndroid(rwhi, NULL); | 1382 return new RenderWidgetHostViewAndroid(rwhi, NULL); |
| 1372 } | 1383 } |
| 1373 | 1384 |
| 1374 } // namespace content | 1385 } // namespace content |
| OLD | NEW |