| 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 |