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 12 matching lines...) Expand all Loading... | |
| 23 #include "cc/output/copy_output_request.h" | 23 #include "cc/output/copy_output_request.h" |
| 24 #include "cc/output/copy_output_result.h" | 24 #include "cc/output/copy_output_result.h" |
| 25 #include "cc/resources/single_release_callback.h" | 25 #include "cc/resources/single_release_callback.h" |
| 26 #include "cc/trees/layer_tree_host.h" | 26 #include "cc/trees/layer_tree_host.h" |
| 27 #include "content/browser/accessibility/browser_accessibility_manager_android.h" | 27 #include "content/browser/accessibility/browser_accessibility_manager_android.h" |
| 28 #include "content/browser/android/content_view_core_impl.h" | 28 #include "content/browser/android/content_view_core_impl.h" |
| 29 #include "content/browser/android/in_process/synchronous_compositor_impl.h" | 29 #include "content/browser/android/in_process/synchronous_compositor_impl.h" |
| 30 #include "content/browser/android/overscroll_glow.h" | 30 #include "content/browser/android/overscroll_glow.h" |
| 31 #include "content/browser/gpu/gpu_surface_tracker.h" | 31 #include "content/browser/gpu/gpu_surface_tracker.h" |
| 32 #include "content/browser/renderer_host/compositor_impl_android.h" | 32 #include "content/browser/renderer_host/compositor_impl_android.h" |
| 33 #include "content/browser/renderer_host/compositor_observer.h" | |
| 33 #include "content/browser/renderer_host/dip_util.h" | 34 #include "content/browser/renderer_host/dip_util.h" |
| 34 #include "content/browser/renderer_host/generic_touch_gesture_android.h" | 35 #include "content/browser/renderer_host/generic_touch_gesture_android.h" |
| 35 #include "content/browser/renderer_host/image_transport_factory_android.h" | 36 #include "content/browser/renderer_host/image_transport_factory_android.h" |
| 36 #include "content/browser/renderer_host/render_widget_host_impl.h" | 37 #include "content/browser/renderer_host/render_widget_host_impl.h" |
| 37 #include "content/common/gpu/client/gl_helper.h" | 38 #include "content/common/gpu/client/gl_helper.h" |
| 38 #include "content/common/gpu/gpu_messages.h" | 39 #include "content/common/gpu/gpu_messages.h" |
| 39 #include "content/common/input_messages.h" | 40 #include "content/common/input_messages.h" |
| 40 #include "content/common/view_messages.h" | 41 #include "content/common/view_messages.h" |
| 41 #include "content/public/common/content_switches.h" | 42 #include "content/public/common/content_switches.h" |
| 42 #include "skia/ext/image_operations.h" | 43 #include "skia/ext/image_operations.h" |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 113 : host_(widget_host), | 114 : host_(widget_host), |
| 114 needs_begin_frame_(false), | 115 needs_begin_frame_(false), |
| 115 are_layers_attached_(true), | 116 are_layers_attached_(true), |
| 116 content_view_core_(NULL), | 117 content_view_core_(NULL), |
| 117 ime_adapter_android_(this), | 118 ime_adapter_android_(this), |
| 118 cached_background_color_(SK_ColorWHITE), | 119 cached_background_color_(SK_ColorWHITE), |
| 119 texture_id_in_layer_(0), | 120 texture_id_in_layer_(0), |
| 120 current_mailbox_output_surface_id_(kUndefinedOutputSurfaceId), | 121 current_mailbox_output_surface_id_(kUndefinedOutputSurfaceId), |
| 121 weak_ptr_factory_(this), | 122 weak_ptr_factory_(this), |
| 122 overscroll_effect_enabled_(true), | 123 overscroll_effect_enabled_(true), |
| 123 flush_input_requested_(false) { | 124 flush_input_requested_(false), |
| 125 compositor_(NULL) { | |
| 124 if (!UsingDelegatedRenderer()) { | 126 if (!UsingDelegatedRenderer()) { |
| 125 texture_layer_ = cc::TextureLayer::Create(this); | 127 texture_layer_ = cc::TextureLayer::Create(NULL); |
| 126 layer_ = texture_layer_; | 128 layer_ = texture_layer_; |
| 127 } | 129 } |
| 128 | 130 |
| 129 overscroll_effect_enabled_ = !CommandLine::ForCurrentProcess()-> | 131 overscroll_effect_enabled_ = !CommandLine::ForCurrentProcess()-> |
| 130 HasSwitch(switches::kDisableOverscrollEdgeEffect); | 132 HasSwitch(switches::kDisableOverscrollEdgeEffect); |
| 131 // Don't block the main thread with effect resource loading. | 133 // Don't block the main thread with effect resource loading. |
| 132 // Actual effect creation is deferred until an overscroll event is received. | 134 // Actual effect creation is deferred until an overscroll event is received. |
| 133 if (overscroll_effect_enabled_) { | 135 if (overscroll_effect_enabled_) { |
| 134 base::WorkerPool::PostTask(FROM_HERE, | 136 base::WorkerPool::PostTask(FROM_HERE, |
| 135 base::Bind(&OverscrollGlow::EnsureResources), | 137 base::Bind(&OverscrollGlow::EnsureResources), |
| 136 true); | 138 true); |
| 137 } | 139 } |
| 138 | 140 |
| 139 host_->SetView(this); | 141 host_->SetView(this); |
| 140 SetContentViewCore(content_view_core); | 142 SetContentViewCore(content_view_core); |
| 141 ImageTransportFactoryAndroid::AddObserver(this); | 143 ImageTransportFactoryAndroid::AddObserver(this); |
| 142 } | 144 } |
| 143 | 145 |
| 144 RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() { | 146 RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() { |
| 145 ImageTransportFactoryAndroid::RemoveObserver(this); | 147 ImageTransportFactoryAndroid::RemoveObserver(this); |
| 146 SetContentViewCore(NULL); | 148 SetContentViewCore(NULL); |
| 147 DCHECK(ack_callbacks_.empty()); | 149 DCHECK(ack_callbacks_.empty()); |
| 148 if (texture_id_in_layer_) { | 150 if (texture_id_in_layer_) { |
| 149 ImageTransportFactoryAndroid::GetInstance()->DeleteTexture( | 151 ImageTransportFactoryAndroid::GetInstance()->DeleteTexture( |
| 150 texture_id_in_layer_); | 152 texture_id_in_layer_); |
| 151 } | 153 } |
| 152 | 154 |
| 153 if (texture_layer_.get()) | 155 if (texture_layer_.get()) |
| 154 texture_layer_->ClearClient(); | 156 texture_layer_->ClearClient(); |
| 157 | |
| 158 if (compositor_) { | |
|
aelias_OOO_until_Jul13
2013/10/19 03:43:27
nit: no {}. Likewise in many other clauses with o
powei
2013/11/08 21:34:47
Done.
| |
| 159 compositor_->RemoveObserver(this); | |
| 160 } | |
| 155 } | 161 } |
| 156 | 162 |
| 157 | 163 |
| 158 bool RenderWidgetHostViewAndroid::OnMessageReceived( | 164 bool RenderWidgetHostViewAndroid::OnMessageReceived( |
| 159 const IPC::Message& message) { | 165 const IPC::Message& message) { |
| 160 bool handled = true; | 166 bool handled = true; |
| 161 IPC_BEGIN_MESSAGE_MAP(RenderWidgetHostViewAndroid, message) | 167 IPC_BEGIN_MESSAGE_MAP(RenderWidgetHostViewAndroid, message) |
| 162 IPC_MESSAGE_HANDLER(ViewHostMsg_StartContentIntent, OnStartContentIntent) | 168 IPC_MESSAGE_HANDLER(ViewHostMsg_StartContentIntent, OnStartContentIntent) |
| 163 IPC_MESSAGE_HANDLER(ViewHostMsg_DidChangeBodyBackgroundColor, | 169 IPC_MESSAGE_HANDLER(ViewHostMsg_DidChangeBodyBackgroundColor, |
| 164 OnDidChangeBodyBackgroundColor) | 170 OnDidChangeBodyBackgroundColor) |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 188 RenderWidgetHost* | 194 RenderWidgetHost* |
| 189 RenderWidgetHostViewAndroid::GetRenderWidgetHost() const { | 195 RenderWidgetHostViewAndroid::GetRenderWidgetHost() const { |
| 190 return host_; | 196 return host_; |
| 191 } | 197 } |
| 192 | 198 |
| 193 void RenderWidgetHostViewAndroid::WasShown() { | 199 void RenderWidgetHostViewAndroid::WasShown() { |
| 194 if (!host_ || !host_->is_hidden()) | 200 if (!host_ || !host_->is_hidden()) |
| 195 return; | 201 return; |
| 196 | 202 |
| 197 host_->WasShown(); | 203 host_->WasShown(); |
| 204 | |
| 205 if (compositor_ && !compositor_->HasObserver(this)) { | |
|
aelias_OOO_until_Jul13
2013/10/19 03:43:27
Please make the HasObserver check an early return
powei
2013/11/08 21:34:47
Done.
| |
| 206 compositor_->AddObserver(this); | |
| 207 } | |
| 198 } | 208 } |
| 199 | 209 |
| 200 void RenderWidgetHostViewAndroid::WasHidden() { | 210 void RenderWidgetHostViewAndroid::WasHidden() { |
| 201 RunAckCallbacks(); | 211 RunAckCallbacks(); |
| 202 | 212 |
| 203 if (!host_ || host_->is_hidden()) | 213 if (!host_ || host_->is_hidden()) |
| 204 return; | 214 return; |
| 205 | 215 |
| 206 // Inform the renderer that we are being hidden so it can reduce its resource | 216 // Inform the renderer that we are being hidden so it can reduce its resource |
| 207 // utilization. | 217 // utilization. |
| 208 host_->WasHidden(); | 218 host_->WasHidden(); |
| 219 | |
| 220 if (compositor_) { | |
| 221 compositor_->RemoveObserver(this); | |
| 222 } | |
| 209 } | 223 } |
| 210 | 224 |
| 211 void RenderWidgetHostViewAndroid::WasResized() { | 225 void RenderWidgetHostViewAndroid::WasResized() { |
| 212 host_->WasResized(); | 226 host_->WasResized(); |
| 213 } | 227 } |
| 214 | 228 |
| 215 void RenderWidgetHostViewAndroid::SetSize(const gfx::Size& size) { | 229 void RenderWidgetHostViewAndroid::SetSize(const gfx::Size& size) { |
| 216 // Ignore the given size as only the Java code has the power to | 230 // Ignore the given size as only the Java code has the power to |
| 217 // resize the view on Android. | 231 // resize the view on Android. |
| 218 WasResized(); | 232 WasResized(); |
| (...skipping 473 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 692 resource_collection_ = new cc::DelegatedFrameResourceCollection; | 706 resource_collection_ = new cc::DelegatedFrameResourceCollection; |
| 693 resource_collection_->SetClient(this); | 707 resource_collection_->SetClient(this); |
| 694 } | 708 } |
| 695 if (!frame_provider_ || | 709 if (!frame_provider_ || |
| 696 texture_size_in_layer_ != frame_provider_->frame_size()) { | 710 texture_size_in_layer_ != frame_provider_->frame_size()) { |
| 697 if (are_layers_attached_) | 711 if (are_layers_attached_) |
| 698 RemoveLayers(); | 712 RemoveLayers(); |
| 699 frame_provider_ = new cc::DelegatedFrameProvider( | 713 frame_provider_ = new cc::DelegatedFrameProvider( |
| 700 resource_collection_.get(), frame_data.Pass()); | 714 resource_collection_.get(), frame_data.Pass()); |
| 701 delegated_renderer_layer_ = | 715 delegated_renderer_layer_ = |
| 702 cc::DelegatedRendererLayer::Create(this, frame_provider_); | 716 cc::DelegatedRendererLayer::Create(NULL, frame_provider_); |
| 703 layer_ = delegated_renderer_layer_; | 717 layer_ = delegated_renderer_layer_; |
| 704 if (are_layers_attached_) | 718 if (are_layers_attached_) |
| 705 AttachLayers(); | 719 AttachLayers(); |
| 706 } else { | 720 } else { |
| 707 frame_provider_->SetFrameData(frame_data.Pass()); | 721 frame_provider_->SetFrameData(frame_data.Pass()); |
| 708 } | 722 } |
| 709 } | 723 } |
| 710 | 724 |
| 711 if (delegated_renderer_layer_.get()) { | 725 if (delegated_renderer_layer_.get()) { |
| 712 delegated_renderer_layer_->SetDisplaySize(texture_size_in_layer_); | 726 delegated_renderer_layer_->SetDisplaySize(texture_size_in_layer_); |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 854 ImageTransportFactoryAndroid* factory = | 868 ImageTransportFactoryAndroid* factory = |
| 855 ImageTransportFactoryAndroid::GetInstance(); | 869 ImageTransportFactoryAndroid::GetInstance(); |
| 856 | 870 |
| 857 // TODO(sievers): When running the impl thread in the browser we | 871 // TODO(sievers): When running the impl thread in the browser we |
| 858 // need to delay the ACK until after commit and use more than a single | 872 // need to delay the ACK until after commit and use more than a single |
| 859 // texture. | 873 // texture. |
| 860 DCHECK(!CompositorImpl::IsThreadingEnabled()); | 874 DCHECK(!CompositorImpl::IsThreadingEnabled()); |
| 861 | 875 |
| 862 if (!texture_id_in_layer_) { | 876 if (!texture_id_in_layer_) { |
| 863 texture_id_in_layer_ = factory->CreateTexture(); | 877 texture_id_in_layer_ = factory->CreateTexture(); |
| 878 texture_layer_->SetTextureId(texture_id_in_layer_); | |
| 864 texture_layer_->SetIsDrawable(true); | 879 texture_layer_->SetIsDrawable(true); |
| 865 texture_layer_->SetContentsOpaque(true); | 880 texture_layer_->SetContentsOpaque(true); |
| 866 } | 881 } |
| 867 | 882 |
| 868 ImageTransportFactoryAndroid::GetInstance()->AcquireTexture( | 883 ImageTransportFactoryAndroid::GetInstance()->AcquireTexture( |
| 869 texture_id_in_layer_, mailbox.name); | 884 texture_id_in_layer_, mailbox.name); |
| 870 | 885 |
| 871 ResetClipping(); | 886 ResetClipping(); |
| 872 | 887 |
| 873 current_mailbox_ = mailbox; | 888 current_mailbox_ = mailbox; |
| (...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1239 | 1254 |
| 1240 if (are_layers_attached_) | 1255 if (are_layers_attached_) |
| 1241 RemoveLayers(); | 1256 RemoveLayers(); |
| 1242 | 1257 |
| 1243 content_view_core_ = content_view_core; | 1258 content_view_core_ = content_view_core; |
| 1244 | 1259 |
| 1245 if (are_layers_attached_) | 1260 if (are_layers_attached_) |
| 1246 AttachLayers(); | 1261 AttachLayers(); |
| 1247 } | 1262 } |
| 1248 | 1263 |
| 1264 void RenderWidgetHostViewAndroid::SetCompositor(Compositor* compositor) { | |
| 1265 if (compositor_ == compositor) | |
| 1266 return; | |
| 1267 | |
| 1268 if (compositor_) { | |
| 1269 compositor_->RemoveObserver(this); | |
|
David Trainor- moved to gerrit
2013/10/21 15:26:08
Is it safe to call RemoveObserver if it isn't adde
powei
2013/11/08 21:34:47
It is safe. observer_list has an early out for re
| |
| 1270 } | |
| 1271 | |
| 1272 compositor_ = compositor; | |
| 1273 | |
| 1274 if (are_layers_attached_ && compositor_ && !compositor_->HasObserver(this)) { | |
|
David Trainor- moved to gerrit
2013/10/21 15:26:08
Can remove HasObserver if you put it into AddObser
powei
2013/11/08 21:34:47
Done.
| |
| 1275 compositor_->AddObserver(this); | |
| 1276 } | |
| 1277 } | |
| 1278 | |
| 1249 void RenderWidgetHostViewAndroid::RunAckCallbacks() { | 1279 void RenderWidgetHostViewAndroid::RunAckCallbacks() { |
| 1250 while (!ack_callbacks_.empty()) { | 1280 while (!ack_callbacks_.empty()) { |
| 1251 ack_callbacks_.front().Run(); | 1281 ack_callbacks_.front().Run(); |
| 1252 ack_callbacks_.pop(); | 1282 ack_callbacks_.pop(); |
| 1253 } | 1283 } |
| 1254 } | 1284 } |
| 1255 | 1285 |
| 1256 void RenderWidgetHostViewAndroid::HasTouchEventHandlers( | 1286 void RenderWidgetHostViewAndroid::HasTouchEventHandlers( |
| 1257 bool need_touch_events) { | 1287 bool need_touch_events) { |
| 1258 if (content_view_core_) | 1288 if (content_view_core_) |
| 1259 content_view_core_->HasTouchEventHandlers(need_touch_events); | 1289 content_view_core_->HasTouchEventHandlers(need_touch_events); |
| 1260 } | 1290 } |
| 1261 | 1291 |
| 1262 unsigned RenderWidgetHostViewAndroid::PrepareTexture() { | 1292 void RenderWidgetHostViewAndroid::OnCompositingDidCommit( |
| 1293 Compositor* compositor) { | |
| 1263 RunAckCallbacks(); | 1294 RunAckCallbacks(); |
| 1264 return texture_id_in_layer_; | |
| 1265 } | |
| 1266 | |
| 1267 void RenderWidgetHostViewAndroid::DidCommitFrameData() { | |
| 1268 RunAckCallbacks(); | |
| 1269 } | |
| 1270 | |
| 1271 WebKit::WebGraphicsContext3D* RenderWidgetHostViewAndroid::Context3d() { | |
| 1272 return ImageTransportFactoryAndroid::GetInstance()->GetContext3D(); | |
| 1273 } | |
| 1274 | |
| 1275 bool RenderWidgetHostViewAndroid::PrepareTextureMailbox( | |
| 1276 cc::TextureMailbox* mailbox, | |
| 1277 scoped_ptr<cc::SingleReleaseCallback>* release_callback, | |
| 1278 bool use_shared_memory) { | |
| 1279 return false; | |
| 1280 } | 1295 } |
| 1281 | 1296 |
| 1282 void RenderWidgetHostViewAndroid::OnLostResources() { | 1297 void RenderWidgetHostViewAndroid::OnLostResources() { |
| 1283 if (texture_layer_.get()) | 1298 if (texture_layer_.get()) |
| 1284 texture_layer_->SetIsDrawable(false); | 1299 texture_layer_->SetIsDrawable(false); |
| 1285 if (delegated_renderer_layer_.get()) | 1300 if (delegated_renderer_layer_.get()) |
| 1286 DestroyDelegatedContent(); | 1301 DestroyDelegatedContent(); |
| 1287 texture_id_in_layer_ = 0; | 1302 texture_id_in_layer_ = 0; |
| 1288 RunAckCallbacks(); | 1303 RunAckCallbacks(); |
| 1289 } | 1304 } |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1383 // RenderWidgetHostView, public: | 1398 // RenderWidgetHostView, public: |
| 1384 | 1399 |
| 1385 // static | 1400 // static |
| 1386 RenderWidgetHostView* | 1401 RenderWidgetHostView* |
| 1387 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { | 1402 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { |
| 1388 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); | 1403 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); |
| 1389 return new RenderWidgetHostViewAndroid(rwhi, NULL); | 1404 return new RenderWidgetHostViewAndroid(rwhi, NULL); |
| 1390 } | 1405 } |
| 1391 | 1406 |
| 1392 } // namespace content | 1407 } // namespace content |
| OLD | NEW |