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 22 matching lines...) Expand all Loading... | |
| 33 #include "content/browser/gpu/gpu_surface_tracker.h" | 33 #include "content/browser/gpu/gpu_surface_tracker.h" |
| 34 #include "content/browser/renderer_host/compositor_impl_android.h" | 34 #include "content/browser/renderer_host/compositor_impl_android.h" |
| 35 #include "content/browser/renderer_host/dip_util.h" | 35 #include "content/browser/renderer_host/dip_util.h" |
| 36 #include "content/browser/renderer_host/generic_touch_gesture_android.h" | 36 #include "content/browser/renderer_host/generic_touch_gesture_android.h" |
| 37 #include "content/browser/renderer_host/image_transport_factory_android.h" | 37 #include "content/browser/renderer_host/image_transport_factory_android.h" |
| 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/browser/android/compositor_observer.h" | |
| 44 #include "content/public/browser/android/compositor_provider.h" | |
| 43 #include "content/public/common/content_switches.h" | 45 #include "content/public/common/content_switches.h" |
| 44 #include "gpu/config/gpu_driver_bug_workaround_type.h" | 46 #include "gpu/config/gpu_driver_bug_workaround_type.h" |
| 45 #include "skia/ext/image_operations.h" | 47 #include "skia/ext/image_operations.h" |
| 46 #include "third_party/khronos/GLES2/gl2.h" | 48 #include "third_party/khronos/GLES2/gl2.h" |
| 47 #include "third_party/khronos/GLES2/gl2ext.h" | 49 #include "third_party/khronos/GLES2/gl2ext.h" |
| 48 #include "ui/gfx/android/device_display_info.h" | 50 #include "ui/gfx/android/device_display_info.h" |
| 49 #include "ui/gfx/android/java_bitmap.h" | 51 #include "ui/gfx/android/java_bitmap.h" |
| 50 #include "ui/gfx/display.h" | 52 #include "ui/gfx/display.h" |
| 51 #include "ui/gfx/screen.h" | 53 #include "ui/gfx/screen.h" |
| 52 #include "ui/gfx/size_conversions.h" | 54 #include "ui/gfx/size_conversions.h" |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 94 | 96 |
| 95 bool UsingDelegatedRenderer() { | 97 bool UsingDelegatedRenderer() { |
| 96 return CommandLine::ForCurrentProcess()->HasSwitch( | 98 return CommandLine::ForCurrentProcess()->HasSwitch( |
| 97 switches::kEnableDelegatedRenderer); | 99 switches::kEnableDelegatedRenderer); |
| 98 } | 100 } |
| 99 | 101 |
| 100 } // anonymous namespace | 102 } // anonymous namespace |
| 101 | 103 |
| 102 RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( | 104 RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( |
| 103 RenderWidgetHostImpl* widget_host, | 105 RenderWidgetHostImpl* widget_host, |
| 104 ContentViewCoreImpl* content_view_core) | 106 ContentViewCoreImpl* content_view_core, |
| 107 CompositorProvider* compositor_provider) | |
| 105 : host_(widget_host), | 108 : host_(widget_host), |
| 106 needs_begin_frame_(false), | 109 needs_begin_frame_(false), |
| 107 are_layers_attached_(true), | 110 are_layers_attached_(true), |
| 108 content_view_core_(NULL), | 111 content_view_core_(NULL), |
| 109 ime_adapter_android_(this), | 112 ime_adapter_android_(this), |
| 110 cached_background_color_(SK_ColorWHITE), | 113 cached_background_color_(SK_ColorWHITE), |
| 111 texture_id_in_layer_(0), | 114 texture_id_in_layer_(0), |
| 112 last_output_surface_id_(kUndefinedOutputSurfaceId), | 115 last_output_surface_id_(kUndefinedOutputSurfaceId), |
| 113 weak_ptr_factory_(this), | 116 weak_ptr_factory_(this), |
| 114 overscroll_effect_enabled_(true), | 117 overscroll_effect_enabled_(true), |
| 115 flush_input_requested_(false), | 118 flush_input_requested_(false), |
| 116 accelerated_surface_route_id_(0) { | 119 accelerated_surface_route_id_(0), |
| 120 compositor_provider_(NULL) { | |
|
no sievers
2013/11/08 22:14:04
nit: init to |compositor_provider| here
powei
2013/11/08 22:51:16
Done.
| |
| 117 if (!UsingDelegatedRenderer()) { | 121 if (!UsingDelegatedRenderer()) { |
| 118 texture_layer_ = cc::TextureLayer::Create(this); | 122 texture_layer_ = cc::TextureLayer::Create(NULL); |
| 119 layer_ = texture_layer_; | 123 layer_ = texture_layer_; |
| 120 } | 124 } |
| 121 | 125 |
| 122 overscroll_effect_enabled_ = !CommandLine::ForCurrentProcess()-> | 126 overscroll_effect_enabled_ = !CommandLine::ForCurrentProcess()-> |
| 123 HasSwitch(switches::kDisableOverscrollEdgeEffect); | 127 HasSwitch(switches::kDisableOverscrollEdgeEffect); |
| 124 // Don't block the main thread with effect resource loading. | 128 // Don't block the main thread with effect resource loading. |
| 125 // Actual effect creation is deferred until an overscroll event is received. | 129 // Actual effect creation is deferred until an overscroll event is received. |
| 126 if (overscroll_effect_enabled_) { | 130 if (overscroll_effect_enabled_) { |
| 127 base::WorkerPool::PostTask(FROM_HERE, | 131 base::WorkerPool::PostTask(FROM_HERE, |
| 128 base::Bind(&OverscrollGlow::EnsureResources), | 132 base::Bind(&OverscrollGlow::EnsureResources), |
| 129 true); | 133 true); |
| 130 } | 134 } |
| 131 | 135 |
| 132 host_->SetView(this); | 136 host_->SetView(this); |
| 133 SetContentViewCore(content_view_core); | 137 SetContentViewCore(content_view_core); |
| 138 SetCompositorProvider(compositor_provider); | |
| 134 ImageTransportFactoryAndroid::AddObserver(this); | 139 ImageTransportFactoryAndroid::AddObserver(this); |
| 135 } | 140 } |
| 136 | 141 |
| 137 RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() { | 142 RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() { |
| 138 ImageTransportFactoryAndroid::RemoveObserver(this); | 143 ImageTransportFactoryAndroid::RemoveObserver(this); |
| 139 SetContentViewCore(NULL); | 144 SetContentViewCore(NULL); |
| 140 DCHECK(ack_callbacks_.empty()); | 145 DCHECK(ack_callbacks_.empty()); |
| 141 if (texture_id_in_layer_) { | 146 if (texture_id_in_layer_) { |
| 142 ImageTransportFactoryAndroid::GetInstance()->DeleteTexture( | 147 ImageTransportFactoryAndroid::GetInstance()->DeleteTexture( |
| 143 texture_id_in_layer_); | 148 texture_id_in_layer_); |
| 144 } | 149 } |
| 145 | 150 |
| 146 if (texture_layer_.get()) | 151 if (texture_layer_.get()) |
| 147 texture_layer_->ClearClient(); | 152 texture_layer_->ClearClient(); |
| 148 | 153 |
| 149 if (resource_collection_.get()) | 154 if (resource_collection_.get()) |
| 150 resource_collection_->SetClient(NULL); | 155 resource_collection_->SetClient(NULL); |
| 156 | |
| 157 UnobserveCompositor(GetCompositor()); | |
| 151 } | 158 } |
| 152 | 159 |
| 153 | 160 |
| 154 bool RenderWidgetHostViewAndroid::OnMessageReceived( | 161 bool RenderWidgetHostViewAndroid::OnMessageReceived( |
| 155 const IPC::Message& message) { | 162 const IPC::Message& message) { |
| 156 bool handled = true; | 163 bool handled = true; |
| 157 IPC_BEGIN_MESSAGE_MAP(RenderWidgetHostViewAndroid, message) | 164 IPC_BEGIN_MESSAGE_MAP(RenderWidgetHostViewAndroid, message) |
| 158 IPC_MESSAGE_HANDLER(ViewHostMsg_StartContentIntent, OnStartContentIntent) | 165 IPC_MESSAGE_HANDLER(ViewHostMsg_StartContentIntent, OnStartContentIntent) |
| 159 IPC_MESSAGE_HANDLER(ViewHostMsg_DidChangeBodyBackgroundColor, | 166 IPC_MESSAGE_HANDLER(ViewHostMsg_DidChangeBodyBackgroundColor, |
| 160 OnDidChangeBodyBackgroundColor) | 167 OnDidChangeBodyBackgroundColor) |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 184 RenderWidgetHost* | 191 RenderWidgetHost* |
| 185 RenderWidgetHostViewAndroid::GetRenderWidgetHost() const { | 192 RenderWidgetHostViewAndroid::GetRenderWidgetHost() const { |
| 186 return host_; | 193 return host_; |
| 187 } | 194 } |
| 188 | 195 |
| 189 void RenderWidgetHostViewAndroid::WasShown() { | 196 void RenderWidgetHostViewAndroid::WasShown() { |
| 190 if (!host_ || !host_->is_hidden()) | 197 if (!host_ || !host_->is_hidden()) |
| 191 return; | 198 return; |
| 192 | 199 |
| 193 host_->WasShown(); | 200 host_->WasShown(); |
| 201 | |
| 202 ObserveCompositor(GetCompositor()); | |
| 194 } | 203 } |
| 195 | 204 |
| 196 void RenderWidgetHostViewAndroid::WasHidden() { | 205 void RenderWidgetHostViewAndroid::WasHidden() { |
| 197 RunAckCallbacks(); | 206 RunAckCallbacks(); |
| 198 | 207 |
| 199 if (!host_ || host_->is_hidden()) | 208 if (!host_ || host_->is_hidden()) |
| 200 return; | 209 return; |
| 201 | 210 |
| 202 // 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 |
| 203 // utilization. | 212 // utilization. |
| 204 host_->WasHidden(); | 213 host_->WasHidden(); |
| 214 | |
| 215 UnobserveCompositor(GetCompositor()); | |
| 205 } | 216 } |
| 206 | 217 |
| 207 void RenderWidgetHostViewAndroid::WasResized() { | 218 void RenderWidgetHostViewAndroid::WasResized() { |
| 208 host_->WasResized(); | 219 host_->WasResized(); |
| 209 } | 220 } |
| 210 | 221 |
| 211 void RenderWidgetHostViewAndroid::SetSize(const gfx::Size& size) { | 222 void RenderWidgetHostViewAndroid::SetSize(const gfx::Size& size) { |
| 212 // 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 |
| 213 // resize the view on Android. | 224 // resize the view on Android. |
| 214 WasResized(); | 225 WasResized(); |
| (...skipping 478 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 693 resource_collection_ = new cc::DelegatedFrameResourceCollection; | 704 resource_collection_ = new cc::DelegatedFrameResourceCollection; |
| 694 resource_collection_->SetClient(this); | 705 resource_collection_->SetClient(this); |
| 695 } | 706 } |
| 696 if (!frame_provider_ || | 707 if (!frame_provider_ || |
| 697 texture_size_in_layer_ != frame_provider_->frame_size()) { | 708 texture_size_in_layer_ != frame_provider_->frame_size()) { |
| 698 if (are_layers_attached_) | 709 if (are_layers_attached_) |
| 699 RemoveLayers(); | 710 RemoveLayers(); |
| 700 frame_provider_ = new cc::DelegatedFrameProvider( | 711 frame_provider_ = new cc::DelegatedFrameProvider( |
| 701 resource_collection_.get(), frame_data.Pass()); | 712 resource_collection_.get(), frame_data.Pass()); |
| 702 delegated_renderer_layer_ = | 713 delegated_renderer_layer_ = |
| 703 cc::DelegatedRendererLayer::Create(this, frame_provider_); | 714 cc::DelegatedRendererLayer::Create(NULL, frame_provider_); |
| 704 layer_ = delegated_renderer_layer_; | 715 layer_ = delegated_renderer_layer_; |
| 705 if (are_layers_attached_) | 716 if (are_layers_attached_) |
| 706 AttachLayers(); | 717 AttachLayers(); |
| 707 } else { | 718 } else { |
| 708 frame_provider_->SetFrameData(frame_data.Pass()); | 719 frame_provider_->SetFrameData(frame_data.Pass()); |
| 709 } | 720 } |
| 710 } | 721 } |
| 711 | 722 |
| 712 if (delegated_renderer_layer_.get()) { | 723 if (delegated_renderer_layer_.get()) { |
| 713 delegated_renderer_layer_->SetDisplaySize(texture_size_in_layer_); | 724 delegated_renderer_layer_->SetDisplaySize(texture_size_in_layer_); |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 831 | 842 |
| 832 void RenderWidgetHostViewAndroid::BuffersSwapped( | 843 void RenderWidgetHostViewAndroid::BuffersSwapped( |
| 833 const gpu::Mailbox& mailbox, | 844 const gpu::Mailbox& mailbox, |
| 834 uint32_t output_surface_id, | 845 uint32_t output_surface_id, |
| 835 const base::Closure& ack_callback) { | 846 const base::Closure& ack_callback) { |
| 836 ImageTransportFactoryAndroid* factory = | 847 ImageTransportFactoryAndroid* factory = |
| 837 ImageTransportFactoryAndroid::GetInstance(); | 848 ImageTransportFactoryAndroid::GetInstance(); |
| 838 | 849 |
| 839 if (!texture_id_in_layer_) { | 850 if (!texture_id_in_layer_) { |
| 840 texture_id_in_layer_ = factory->CreateTexture(); | 851 texture_id_in_layer_ = factory->CreateTexture(); |
| 852 texture_layer_->SetTextureId(texture_id_in_layer_); | |
| 841 texture_layer_->SetIsDrawable(true); | 853 texture_layer_->SetIsDrawable(true); |
| 842 texture_layer_->SetContentsOpaque(true); | 854 texture_layer_->SetContentsOpaque(true); |
| 843 } | 855 } |
| 844 | 856 |
| 845 ImageTransportFactoryAndroid::GetInstance()->AcquireTexture( | 857 ImageTransportFactoryAndroid::GetInstance()->AcquireTexture( |
| 846 texture_id_in_layer_, mailbox.name); | 858 texture_id_in_layer_, mailbox.name); |
| 847 | 859 |
| 848 ResetClipping(); | 860 ResetClipping(); |
| 849 | 861 |
| 850 current_mailbox_ = mailbox; | 862 current_mailbox_ = mailbox; |
| (...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1237 if (content_view_core_) | 1249 if (content_view_core_) |
| 1238 obj = content_view_core_->GetJavaObject(); | 1250 obj = content_view_core_->GetJavaObject(); |
| 1239 GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerAndroid()-> | 1251 GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerAndroid()-> |
| 1240 SetContentViewCore(obj); | 1252 SetContentViewCore(obj); |
| 1241 } | 1253 } |
| 1242 | 1254 |
| 1243 if (are_layers_attached_) | 1255 if (are_layers_attached_) |
| 1244 AttachLayers(); | 1256 AttachLayers(); |
| 1245 } | 1257 } |
| 1246 | 1258 |
| 1259 void RenderWidgetHostViewAndroid::SetCompositorProvider( | |
| 1260 CompositorProvider* compositor_provider) { | |
| 1261 compositor_provider_ = compositor_provider; | |
| 1262 if (compositor_provider_) { | |
| 1263 compositor_provider_->AddCompositorProviderClient(this); | |
| 1264 ObserveCompositor(GetCompositor()); | |
| 1265 } | |
| 1266 } | |
| 1267 | |
| 1268 void RenderWidgetHostViewAndroid::ChangeCompositor(Compositor* new_compositor) { | |
| 1269 UnobserveCompositor(GetCompositor()); | |
| 1270 ObserveCompositor(new_compositor); | |
| 1271 } | |
| 1272 | |
| 1273 Compositor* RenderWidgetHostViewAndroid::GetCompositor() { | |
| 1274 if (!compositor_provider_) | |
| 1275 return NULL; | |
| 1276 Compositor* comp = compositor_provider_->GetCompositor(); | |
| 1277 return comp; | |
| 1278 } | |
| 1279 | |
| 1280 void RenderWidgetHostViewAndroid::UnobserveCompositor( | |
|
no sievers
2013/11/08 22:14:04
No need for an extra function. And then it avoids
powei
2013/11/08 22:51:16
Done.
| |
| 1281 Compositor* compositor) { | |
| 1282 if (compositor) | |
| 1283 compositor->RemoveObserver(this); | |
| 1284 } | |
| 1285 | |
| 1286 void RenderWidgetHostViewAndroid::ObserveCompositor( | |
| 1287 Compositor* compositor) { | |
| 1288 if (compositor) | |
| 1289 compositor->AddObserver(this); | |
| 1290 } | |
| 1291 | |
| 1247 void RenderWidgetHostViewAndroid::RunAckCallbacks() { | 1292 void RenderWidgetHostViewAndroid::RunAckCallbacks() { |
| 1248 while (!ack_callbacks_.empty()) { | 1293 while (!ack_callbacks_.empty()) { |
| 1249 ack_callbacks_.front().Run(); | 1294 ack_callbacks_.front().Run(); |
| 1250 ack_callbacks_.pop(); | 1295 ack_callbacks_.pop(); |
| 1251 } | 1296 } |
| 1252 } | 1297 } |
| 1253 | 1298 |
| 1254 void RenderWidgetHostViewAndroid::HasTouchEventHandlers( | 1299 void RenderWidgetHostViewAndroid::HasTouchEventHandlers( |
| 1255 bool need_touch_events) { | 1300 bool need_touch_events) { |
| 1256 if (content_view_core_) | 1301 if (content_view_core_) |
| 1257 content_view_core_->HasTouchEventHandlers(need_touch_events); | 1302 content_view_core_->HasTouchEventHandlers(need_touch_events); |
| 1258 } | 1303 } |
| 1259 | 1304 |
| 1260 unsigned RenderWidgetHostViewAndroid::PrepareTexture() { | 1305 void RenderWidgetHostViewAndroid::OnCompositingDidCommit( |
| 1261 RunAckCallbacks(); | 1306 Compositor* compositor) { |
| 1262 return texture_id_in_layer_; | |
| 1263 } | |
| 1264 | |
| 1265 void RenderWidgetHostViewAndroid::DidCommitFrameData() { | |
| 1266 RunAckCallbacks(); | 1307 RunAckCallbacks(); |
| 1267 } | 1308 } |
| 1268 | 1309 |
| 1269 bool RenderWidgetHostViewAndroid::PrepareTextureMailbox( | |
| 1270 cc::TextureMailbox* mailbox, | |
| 1271 scoped_ptr<cc::SingleReleaseCallback>* release_callback, | |
| 1272 bool use_shared_memory) { | |
| 1273 return false; | |
| 1274 } | |
| 1275 | |
| 1276 void RenderWidgetHostViewAndroid::OnLostResources() { | 1310 void RenderWidgetHostViewAndroid::OnLostResources() { |
| 1277 if (texture_layer_.get()) | 1311 if (texture_layer_.get()) |
| 1278 texture_layer_->SetIsDrawable(false); | 1312 texture_layer_->SetIsDrawable(false); |
| 1279 if (delegated_renderer_layer_.get()) | 1313 if (delegated_renderer_layer_.get()) |
| 1280 DestroyDelegatedContent(); | 1314 DestroyDelegatedContent(); |
| 1281 texture_id_in_layer_ = 0; | 1315 texture_id_in_layer_ = 0; |
| 1282 RunAckCallbacks(); | 1316 RunAckCallbacks(); |
| 1283 } | 1317 } |
| 1284 | 1318 |
| 1285 // static | 1319 // static |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1373 results->isMonochrome = (results->depthPerComponent == 0); | 1407 results->isMonochrome = (results->depthPerComponent == 0); |
| 1374 } | 1408 } |
| 1375 | 1409 |
| 1376 //////////////////////////////////////////////////////////////////////////////// | 1410 //////////////////////////////////////////////////////////////////////////////// |
| 1377 // RenderWidgetHostView, public: | 1411 // RenderWidgetHostView, public: |
| 1378 | 1412 |
| 1379 // static | 1413 // static |
| 1380 RenderWidgetHostView* | 1414 RenderWidgetHostView* |
| 1381 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { | 1415 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { |
| 1382 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); | 1416 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); |
| 1383 return new RenderWidgetHostViewAndroid(rwhi, NULL); | 1417 return new RenderWidgetHostViewAndroid(rwhi, NULL, NULL); |
|
no sievers
2013/11/08 22:14:04
Hmm what's the point if we can't create it with th
powei
2013/11/08 22:51:16
I don't think this is ever called. Maybe a NOTREA
| |
| 1384 } | 1418 } |
| 1385 | 1419 |
| 1386 } // namespace content | 1420 } // namespace content |
| OLD | NEW |