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/android/sys_utils.h" | 9 #include "base/android/sys_utils.h" |
10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
116 0, | 116 0, |
117 0, | 117 0, |
118 base::TimeTicks() + base::TimeDelta::FromMicroseconds(time_micros), | 118 base::TimeTicks() + base::TimeDelta::FromMicroseconds(time_micros), |
119 1); | 119 1); |
120 } | 120 } |
121 return latency_info; | 121 return latency_info; |
122 } | 122 } |
123 | 123 |
124 } // anonymous namespace | 124 } // anonymous namespace |
125 | 125 |
| 126 RenderWidgetHostViewAndroid::LastFrameInfo::LastFrameInfo( |
| 127 uint32 output_id, |
| 128 scoped_ptr<cc::CompositorFrame> output_frame) |
| 129 : output_surface_id(output_id), frame(output_frame.Pass()) {} |
| 130 |
| 131 RenderWidgetHostViewAndroid::LastFrameInfo::~LastFrameInfo() {} |
| 132 |
126 RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( | 133 RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( |
127 RenderWidgetHostImpl* widget_host, | 134 RenderWidgetHostImpl* widget_host, |
128 ContentViewCoreImpl* content_view_core) | 135 ContentViewCoreImpl* content_view_core) |
129 : host_(widget_host), | 136 : host_(widget_host), |
130 needs_begin_frame_(false), | 137 needs_begin_frame_(false), |
131 is_showing_(!widget_host->is_hidden()), | 138 is_showing_(!widget_host->is_hidden()), |
132 content_view_core_(NULL), | 139 content_view_core_(NULL), |
133 ime_adapter_android_(this), | 140 ime_adapter_android_(this), |
134 cached_background_color_(SK_ColorWHITE), | 141 cached_background_color_(SK_ColorWHITE), |
135 texture_id_in_layer_(0), | 142 texture_id_in_layer_(0), |
136 last_output_surface_id_(kUndefinedOutputSurfaceId), | 143 last_output_surface_id_(kUndefinedOutputSurfaceId), |
137 weak_ptr_factory_(this), | 144 weak_ptr_factory_(this), |
138 overscroll_effect_enabled_( | 145 overscroll_effect_enabled_(!CommandLine::ForCurrentProcess()->HasSwitch( |
139 !CommandLine::ForCurrentProcess()-> | 146 switches::kDisableOverscrollEdgeEffect)), |
140 HasSwitch(switches::kDisableOverscrollEdgeEffect)), | |
141 overscroll_effect_(OverscrollGlow::Create(overscroll_effect_enabled_)), | 147 overscroll_effect_(OverscrollGlow::Create(overscroll_effect_enabled_)), |
142 flush_input_requested_(false), | 148 flush_input_requested_(false), |
143 accelerated_surface_route_id_(0), | 149 accelerated_surface_route_id_(0), |
144 using_synchronous_compositor_(SynchronousCompositorImpl::FromID( | 150 using_synchronous_compositor_(SynchronousCompositorImpl::FromID( |
145 widget_host->GetProcess()->GetID(), | 151 widget_host->GetProcess()->GetID(), |
146 widget_host->GetRoutingID()) != NULL), | 152 widget_host->GetRoutingID()) != NULL), |
147 frame_evictor_(new DelegatedFrameEvictor(this)), | 153 frame_evictor_(new DelegatedFrameEvictor(this)), |
148 using_delegated_renderer_(CommandLine::ForCurrentProcess()->HasSwitch( | 154 using_delegated_renderer_(CommandLine::ForCurrentProcess()->HasSwitch( |
149 switches::kEnableDelegatedRenderer) && | 155 switches::kEnableDelegatedRenderer) && |
150 !CommandLine::ForCurrentProcess()->HasSwitch( | 156 !CommandLine::ForCurrentProcess()->HasSwitch( |
151 switches::kDisableDelegatedRenderer)) { | 157 switches::kDisableDelegatedRenderer)), |
| 158 locks_on_frame_count_(0) { |
152 if (!using_delegated_renderer_) { | 159 if (!using_delegated_renderer_) { |
153 texture_layer_ = cc::TextureLayer::Create(NULL); | 160 texture_layer_ = cc::TextureLayer::Create(NULL); |
154 layer_ = texture_layer_; | 161 layer_ = texture_layer_; |
155 } | 162 } |
156 | 163 |
157 host_->SetView(this); | 164 host_->SetView(this); |
158 SetContentViewCore(content_view_core); | 165 SetContentViewCore(content_view_core); |
159 ImageTransportFactoryAndroid::AddObserver(this); | 166 ImageTransportFactoryAndroid::AddObserver(this); |
160 } | 167 } |
161 | 168 |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
279 | 286 |
280 bool RenderWidgetHostViewAndroid::HasValidFrame() const { | 287 bool RenderWidgetHostViewAndroid::HasValidFrame() const { |
281 if (!content_view_core_) | 288 if (!content_view_core_) |
282 return false; | 289 return false; |
283 if (!layer_) | 290 if (!layer_) |
284 return false; | 291 return false; |
285 | 292 |
286 if (texture_size_in_layer_.IsEmpty()) | 293 if (texture_size_in_layer_.IsEmpty()) |
287 return false; | 294 return false; |
288 | 295 |
| 296 if (!frame_evictor_->HasFrame()) |
| 297 return false; |
| 298 |
289 if (using_delegated_renderer_) { | 299 if (using_delegated_renderer_) { |
290 if (!delegated_renderer_layer_.get()) | 300 if (!delegated_renderer_layer_.get()) |
291 return false; | 301 return false; |
292 } else { | 302 } else { |
293 if (texture_id_in_layer_ == 0) | 303 if (texture_id_in_layer_ == 0) |
294 return false; | 304 return false; |
295 } | 305 } |
296 | 306 |
297 return true; | 307 return true; |
298 } | 308 } |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
369 WasHidden(); | 379 WasHidden(); |
370 } | 380 } |
371 | 381 |
372 bool RenderWidgetHostViewAndroid::IsShowing() { | 382 bool RenderWidgetHostViewAndroid::IsShowing() { |
373 // ContentViewCoreImpl represents the native side of the Java | 383 // ContentViewCoreImpl represents the native side of the Java |
374 // ContentViewCore. It being NULL means that it is not attached | 384 // ContentViewCore. It being NULL means that it is not attached |
375 // to the View system yet, so we treat this RWHVA as hidden. | 385 // to the View system yet, so we treat this RWHVA as hidden. |
376 return is_showing_ && content_view_core_; | 386 return is_showing_ && content_view_core_; |
377 } | 387 } |
378 | 388 |
379 void RenderWidgetHostViewAndroid::LockResources() { | 389 void RenderWidgetHostViewAndroid::LockCompositingSurface() { |
380 DCHECK(HasValidFrame()); | 390 DCHECK(HasValidFrame()); |
381 DCHECK(host_); | 391 DCHECK(host_); |
382 DCHECK(!host_->is_hidden()); | 392 DCHECK(frame_evictor_->HasFrame()); |
383 frame_evictor_->LockFrame(); | 393 frame_evictor_->LockFrame(); |
| 394 locks_on_frame_count_++; |
384 } | 395 } |
385 | 396 |
386 void RenderWidgetHostViewAndroid::UnlockResources() { | 397 void RenderWidgetHostViewAndroid::UnlockCompositingSurface() { |
| 398 if (!frame_evictor_->HasFrame() || locks_on_frame_count_ == 0) |
| 399 return; |
| 400 |
387 DCHECK(HasValidFrame()); | 401 DCHECK(HasValidFrame()); |
388 frame_evictor_->UnlockFrame(); | 402 frame_evictor_->UnlockFrame(); |
| 403 locks_on_frame_count_--; |
| 404 |
| 405 if (locks_on_frame_count_ == 0 && last_frame_info_) { |
| 406 InternalSwapCompositorFrame(last_frame_info_->output_surface_id, |
| 407 last_frame_info_->frame.Pass()); |
| 408 last_frame_info_.reset(); |
| 409 } |
| 410 } |
| 411 |
| 412 void RenderWidgetHostViewAndroid::ReleaseLocksOnSurface() { |
| 413 if (!frame_evictor_->HasFrame()) { |
| 414 DCHECK_EQ(locks_on_frame_count_, 0u); |
| 415 return; |
| 416 } |
| 417 while (locks_on_frame_count_ > 0) { |
| 418 UnlockCompositingSurface(); |
| 419 } |
389 } | 420 } |
390 | 421 |
391 gfx::Rect RenderWidgetHostViewAndroid::GetViewBounds() const { | 422 gfx::Rect RenderWidgetHostViewAndroid::GetViewBounds() const { |
392 if (!content_view_core_) | 423 if (!content_view_core_) |
393 return gfx::Rect(default_size_); | 424 return gfx::Rect(default_size_); |
394 | 425 |
395 gfx::Size size = content_view_core_->GetViewportSizeDip(); | 426 gfx::Size size = content_view_core_->GetViewportSizeDip(); |
396 gfx::Size offset = content_view_core_->GetViewportSizeOffsetDip(); | 427 gfx::Size offset = content_view_core_->GetViewportSizeOffsetDip(); |
397 size.Enlarge(-offset.width(), -offset.height()); | 428 size.Enlarge(-offset.width(), -offset.height()); |
398 | 429 |
(...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
748 delegated_renderer_layer_->SetContentsOpaque(true); | 779 delegated_renderer_layer_->SetContentsOpaque(true); |
749 delegated_renderer_layer_->SetBounds(content_size_in_layer_); | 780 delegated_renderer_layer_->SetBounds(content_size_in_layer_); |
750 delegated_renderer_layer_->SetNeedsDisplay(); | 781 delegated_renderer_layer_->SetNeedsDisplay(); |
751 } | 782 } |
752 | 783 |
753 base::Closure ack_callback = | 784 base::Closure ack_callback = |
754 base::Bind(&RenderWidgetHostViewAndroid::SendDelegatedFrameAck, | 785 base::Bind(&RenderWidgetHostViewAndroid::SendDelegatedFrameAck, |
755 weak_ptr_factory_.GetWeakPtr(), | 786 weak_ptr_factory_.GetWeakPtr(), |
756 output_surface_id); | 787 output_surface_id); |
757 | 788 |
| 789 ack_callbacks_.push(ack_callback); |
758 if (host_->is_hidden()) | 790 if (host_->is_hidden()) |
759 ack_callback.Run(); | 791 RunAckCallbacks(); |
760 else | |
761 ack_callbacks_.push(ack_callback); | |
762 } | 792 } |
763 | 793 |
764 void RenderWidgetHostViewAndroid::ComputeContentsSize( | 794 void RenderWidgetHostViewAndroid::ComputeContentsSize( |
765 const cc::CompositorFrameMetadata& frame_metadata) { | 795 const cc::CompositorFrameMetadata& frame_metadata) { |
766 // Calculate the content size. This should be 0 if the texture_size is 0. | 796 // Calculate the content size. This should be 0 if the texture_size is 0. |
767 gfx::Vector2dF offset; | 797 gfx::Vector2dF offset; |
768 if (texture_size_in_layer_.GetArea() > 0) | 798 if (texture_size_in_layer_.GetArea() > 0) |
769 offset = frame_metadata.location_bar_content_translation; | 799 offset = frame_metadata.location_bar_content_translation; |
770 offset.set_y(offset.y() + frame_metadata.overdraw_bottom_height); | 800 offset.set_y(offset.y() + frame_metadata.overdraw_bottom_height); |
771 offset.Scale(frame_metadata.device_scale_factor); | 801 offset.Scale(frame_metadata.device_scale_factor); |
772 content_size_in_layer_ = | 802 content_size_in_layer_ = |
773 gfx::Size(texture_size_in_layer_.width() - offset.x(), | 803 gfx::Size(texture_size_in_layer_.width() - offset.x(), |
774 texture_size_in_layer_.height() - offset.y()); | 804 texture_size_in_layer_.height() - offset.y()); |
775 // Content size changes should be reflected in associated animation effects. | 805 // Content size changes should be reflected in associated animation effects. |
776 UpdateAnimationSize(frame_metadata); | 806 UpdateAnimationSize(frame_metadata); |
777 } | 807 } |
778 | 808 |
779 void RenderWidgetHostViewAndroid::OnSwapCompositorFrame( | 809 void RenderWidgetHostViewAndroid::InternalSwapCompositorFrame( |
780 uint32 output_surface_id, | 810 uint32 output_surface_id, |
781 scoped_ptr<cc::CompositorFrame> frame) { | 811 scoped_ptr<cc::CompositorFrame> frame) { |
| 812 if (locks_on_frame_count_ > 0) { |
| 813 DCHECK(HasValidFrame()); |
| 814 RetainFrame(output_surface_id, frame.Pass()); |
| 815 return; |
| 816 } |
| 817 |
782 // Always let ContentViewCore know about the new frame first, so it can decide | 818 // Always let ContentViewCore know about the new frame first, so it can decide |
783 // to schedule a Draw immediately when it sees the texture layer invalidation. | 819 // to schedule a Draw immediately when it sees the texture layer invalidation. |
784 UpdateContentViewCoreFrameMetadata(frame->metadata); | 820 UpdateContentViewCoreFrameMetadata(frame->metadata); |
785 | 821 |
786 if (layer_ && layer_->layer_tree_host()) { | 822 if (layer_ && layer_->layer_tree_host()) { |
787 for (size_t i = 0; i < frame->metadata.latency_info.size(); i++) { | 823 for (size_t i = 0; i < frame->metadata.latency_info.size(); i++) { |
788 scoped_ptr<cc::SwapPromise> swap_promise( | 824 scoped_ptr<cc::SwapPromise> swap_promise( |
789 new cc::LatencyInfoSwapPromise(frame->metadata.latency_info[i])); | 825 new cc::LatencyInfoSwapPromise(frame->metadata.latency_info[i])); |
790 layer_->layer_tree_host()->QueueSwapPromise(swap_promise.Pass()); | 826 layer_->layer_tree_host()->QueueSwapPromise(swap_promise.Pass()); |
791 } | 827 } |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
826 ImageTransportFactoryAndroid::GetInstance()->WaitSyncPoint( | 862 ImageTransportFactoryAndroid::GetInstance()->WaitSyncPoint( |
827 frame->gl_frame_data->sync_point); | 863 frame->gl_frame_data->sync_point); |
828 | 864 |
829 texture_size_in_layer_ = frame->gl_frame_data->size; | 865 texture_size_in_layer_ = frame->gl_frame_data->size; |
830 ComputeContentsSize(frame->metadata); | 866 ComputeContentsSize(frame->metadata); |
831 | 867 |
832 BuffersSwapped(frame->gl_frame_data->mailbox, output_surface_id, callback); | 868 BuffersSwapped(frame->gl_frame_data->mailbox, output_surface_id, callback); |
833 frame_evictor_->SwappedFrame(!host_->is_hidden()); | 869 frame_evictor_->SwappedFrame(!host_->is_hidden()); |
834 } | 870 } |
835 | 871 |
| 872 void RenderWidgetHostViewAndroid::OnSwapCompositorFrame( |
| 873 uint32 output_surface_id, |
| 874 scoped_ptr<cc::CompositorFrame> frame) { |
| 875 InternalSwapCompositorFrame(output_surface_id, frame.Pass()); |
| 876 } |
| 877 |
| 878 void RenderWidgetHostViewAndroid::RetainFrame( |
| 879 uint32 output_surface_id, |
| 880 scoped_ptr<cc::CompositorFrame> frame) { |
| 881 DCHECK(locks_on_frame_count_); |
| 882 |
| 883 // Store the incoming frame so that it can be swapped when all the locks have |
| 884 // been released. If there is already a stored frame, then replace and skip |
| 885 // the previous one but make sure we still eventually send the ACK. Holding |
| 886 // the ACK also blocks the renderer when its max_frames_pending is reached. |
| 887 if (last_frame_info_) { |
| 888 base::Closure ack_callback = |
| 889 base::Bind(&RenderWidgetHostViewAndroid::SendDelegatedFrameAck, |
| 890 weak_ptr_factory_.GetWeakPtr(), |
| 891 last_frame_info_->output_surface_id); |
| 892 |
| 893 ack_callbacks_.push(ack_callback); |
| 894 } |
| 895 |
| 896 last_frame_info_.reset(new LastFrameInfo(output_surface_id, frame.Pass())); |
| 897 } |
| 898 |
836 void RenderWidgetHostViewAndroid::SynchronousFrameMetadata( | 899 void RenderWidgetHostViewAndroid::SynchronousFrameMetadata( |
837 const cc::CompositorFrameMetadata& frame_metadata) { | 900 const cc::CompositorFrameMetadata& frame_metadata) { |
838 // This is a subset of OnSwapCompositorFrame() used in the synchronous | 901 // This is a subset of OnSwapCompositorFrame() used in the synchronous |
839 // compositor flow. | 902 // compositor flow. |
840 UpdateContentViewCoreFrameMetadata(frame_metadata); | 903 UpdateContentViewCoreFrameMetadata(frame_metadata); |
841 ComputeContentsSize(frame_metadata); | 904 ComputeContentsSize(frame_metadata); |
842 | 905 |
843 // DevTools ScreenCast support for Android WebView. | 906 // DevTools ScreenCast support for Android WebView. |
844 if (DevToolsAgentHost::HasFor(RenderViewHost::From(GetRenderWidgetHost()))) { | 907 if (DevToolsAgentHost::HasFor(RenderViewHost::From(GetRenderWidgetHost()))) { |
845 scoped_refptr<DevToolsAgentHost> dtah = | 908 scoped_refptr<DevToolsAgentHost> dtah = |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
925 texture_layer_->SetIsDrawable(true); | 988 texture_layer_->SetIsDrawable(true); |
926 texture_layer_->SetContentsOpaque(true); | 989 texture_layer_->SetContentsOpaque(true); |
927 } | 990 } |
928 | 991 |
929 ImageTransportFactoryAndroid::GetInstance()->AcquireTexture( | 992 ImageTransportFactoryAndroid::GetInstance()->AcquireTexture( |
930 texture_id_in_layer_, mailbox.name); | 993 texture_id_in_layer_, mailbox.name); |
931 | 994 |
932 current_mailbox_ = mailbox; | 995 current_mailbox_ = mailbox; |
933 last_output_surface_id_ = output_surface_id; | 996 last_output_surface_id_ = output_surface_id; |
934 | 997 |
| 998 ack_callbacks_.push(ack_callback); |
935 if (host_->is_hidden()) | 999 if (host_->is_hidden()) |
936 ack_callback.Run(); | 1000 RunAckCallbacks(); |
937 else | |
938 ack_callbacks_.push(ack_callback); | |
939 } | 1001 } |
940 | 1002 |
941 void RenderWidgetHostViewAndroid::AttachLayers() { | 1003 void RenderWidgetHostViewAndroid::AttachLayers() { |
942 if (!content_view_core_) | 1004 if (!content_view_core_) |
943 return; | 1005 return; |
944 if (!layer_.get()) | 1006 if (!layer_.get()) |
945 return; | 1007 return; |
946 | 1008 |
947 content_view_core_->AttachLayer(layer_); | 1009 content_view_core_->AttachLayer(layer_); |
948 if (overscroll_effect_enabled_) | 1010 if (overscroll_effect_enabled_) |
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1242 } | 1304 } |
1243 | 1305 |
1244 void RenderWidgetHostViewAndroid::SetContentViewCore( | 1306 void RenderWidgetHostViewAndroid::SetContentViewCore( |
1245 ContentViewCoreImpl* content_view_core) { | 1307 ContentViewCoreImpl* content_view_core) { |
1246 RunAckCallbacks(); | 1308 RunAckCallbacks(); |
1247 | 1309 |
1248 RemoveLayers(); | 1310 RemoveLayers(); |
1249 if (content_view_core_ && !using_synchronous_compositor_) | 1311 if (content_view_core_ && !using_synchronous_compositor_) |
1250 content_view_core_->GetWindowAndroid()->RemoveObserver(this); | 1312 content_view_core_->GetWindowAndroid()->RemoveObserver(this); |
1251 | 1313 |
| 1314 if (content_view_core != content_view_core_) |
| 1315 ReleaseLocksOnSurface(); |
| 1316 |
1252 content_view_core_ = content_view_core; | 1317 content_view_core_ = content_view_core; |
1253 | 1318 |
1254 if (GetBrowserAccessibilityManager()) { | 1319 if (GetBrowserAccessibilityManager()) { |
1255 base::android::ScopedJavaLocalRef<jobject> obj; | 1320 base::android::ScopedJavaLocalRef<jobject> obj; |
1256 if (content_view_core_) | 1321 if (content_view_core_) |
1257 obj = content_view_core_->GetJavaObject(); | 1322 obj = content_view_core_->GetJavaObject(); |
1258 GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerAndroid()-> | 1323 GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerAndroid()-> |
1259 SetContentViewCore(obj); | 1324 SetContentViewCore(obj); |
1260 } | 1325 } |
1261 | 1326 |
(...skipping 13 matching lines...) Expand all Loading... |
1275 RunAckCallbacks(); | 1340 RunAckCallbacks(); |
1276 } | 1341 } |
1277 | 1342 |
1278 void RenderWidgetHostViewAndroid::OnDetachCompositor() { | 1343 void RenderWidgetHostViewAndroid::OnDetachCompositor() { |
1279 DCHECK(content_view_core_); | 1344 DCHECK(content_view_core_); |
1280 DCHECK(!using_synchronous_compositor_); | 1345 DCHECK(!using_synchronous_compositor_); |
1281 RunAckCallbacks(); | 1346 RunAckCallbacks(); |
1282 } | 1347 } |
1283 | 1348 |
1284 void RenderWidgetHostViewAndroid::OnLostResources() { | 1349 void RenderWidgetHostViewAndroid::OnLostResources() { |
| 1350 ReleaseLocksOnSurface(); |
1285 if (texture_layer_.get()) | 1351 if (texture_layer_.get()) |
1286 texture_layer_->SetIsDrawable(false); | 1352 texture_layer_->SetIsDrawable(false); |
1287 if (delegated_renderer_layer_.get()) | 1353 if (delegated_renderer_layer_.get()) |
1288 DestroyDelegatedContent(); | 1354 DestroyDelegatedContent(); |
1289 texture_id_in_layer_ = 0; | 1355 texture_id_in_layer_ = 0; |
1290 RunAckCallbacks(); | 1356 RunAckCallbacks(); |
1291 } | 1357 } |
1292 | 1358 |
1293 // static | 1359 // static |
1294 void RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult( | 1360 void RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult( |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1421 // RenderWidgetHostView, public: | 1487 // RenderWidgetHostView, public: |
1422 | 1488 |
1423 // static | 1489 // static |
1424 RenderWidgetHostView* | 1490 RenderWidgetHostView* |
1425 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { | 1491 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { |
1426 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); | 1492 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); |
1427 return new RenderWidgetHostViewAndroid(rwhi, NULL); | 1493 return new RenderWidgetHostViewAndroid(rwhi, NULL); |
1428 } | 1494 } |
1429 | 1495 |
1430 } // namespace content | 1496 } // namespace content |
OLD | NEW |