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/bind.h" | 9 #include "base/bind.h" |
10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
66 if (!return_mailbox.IsZero()) { | 66 if (!return_mailbox.IsZero()) { |
67 ack.gl_frame_data->mailbox = return_mailbox; | 67 ack.gl_frame_data->mailbox = return_mailbox; |
68 ack.gl_frame_data->size = return_size; | 68 ack.gl_frame_data->size = return_size; |
69 ack.gl_frame_data->sync_point = | 69 ack.gl_frame_data->sync_point = |
70 ImageTransportFactoryAndroid::GetInstance()->InsertSyncPoint(); | 70 ImageTransportFactoryAndroid::GetInstance()->InsertSyncPoint(); |
71 } | 71 } |
72 RenderWidgetHostImpl::SendSwapCompositorFrameAck( | 72 RenderWidgetHostImpl::SendSwapCompositorFrameAck( |
73 route_id, renderer_host_id, ack); | 73 route_id, renderer_host_id, ack); |
74 } | 74 } |
75 | 75 |
| 76 // Sends an acknowledgement to the renderer of a processed IME event. |
| 77 void SendImeEventAck(RenderWidgetHostImpl* host) { |
| 78 host->Send(new ViewMsg_ImeEventAck(host->GetRoutingID())); |
| 79 } |
| 80 |
76 } // anonymous namespace | 81 } // anonymous namespace |
77 | 82 |
78 RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( | 83 RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( |
79 RenderWidgetHostImpl* widget_host, | 84 RenderWidgetHostImpl* widget_host, |
80 ContentViewCoreImpl* content_view_core) | 85 ContentViewCoreImpl* content_view_core) |
81 : host_(widget_host), | 86 : host_(widget_host), |
82 needs_begin_frame_(false), | 87 needs_begin_frame_(false), |
83 are_layers_attached_(true), | 88 are_layers_attached_(true), |
84 content_view_core_(NULL), | 89 content_view_core_(NULL), |
85 ime_adapter_android_(this), | 90 ime_adapter_android_(this), |
| 91 has_ordered_ime_processing_(false), |
86 cached_background_color_(SK_ColorWHITE), | 92 cached_background_color_(SK_ColorWHITE), |
87 texture_id_in_layer_(0), | 93 texture_id_in_layer_(0), |
88 weak_ptr_factory_(this), | 94 weak_ptr_factory_(this), |
89 overscroll_effect_enabled_(true) { | 95 overscroll_effect_enabled_(true) { |
90 if (CompositorImpl::UsesDirectGL()) { | 96 if (CompositorImpl::UsesDirectGL()) { |
91 surface_texture_transport_.reset(new SurfaceTextureTransportClient()); | 97 surface_texture_transport_.reset(new SurfaceTextureTransportClient()); |
92 layer_ = surface_texture_transport_->Initialize(); | 98 layer_ = surface_texture_transport_->Initialize(); |
93 layer_->SetIsDrawable(true); | 99 layer_->SetIsDrawable(true); |
94 } else { | 100 } else { |
95 if (CommandLine::ForCurrentProcess()->HasSwitch( | 101 if (CommandLine::ForCurrentProcess()->HasSwitch( |
(...skipping 11 matching lines...) Expand all Loading... |
107 overscroll_effect_enabled_ = !CommandLine::ForCurrentProcess()-> | 113 overscroll_effect_enabled_ = !CommandLine::ForCurrentProcess()-> |
108 HasSwitch(switches::kDisableOverscrollEdgeEffect); | 114 HasSwitch(switches::kDisableOverscrollEdgeEffect); |
109 // Don't block the main thread with effect resource loading. | 115 // Don't block the main thread with effect resource loading. |
110 // Actual effect creation is deferred until an overscroll event is received. | 116 // Actual effect creation is deferred until an overscroll event is received. |
111 if (overscroll_effect_enabled_) { | 117 if (overscroll_effect_enabled_) { |
112 base::WorkerPool::PostTask(FROM_HERE, | 118 base::WorkerPool::PostTask(FROM_HERE, |
113 base::Bind(&OverscrollGlow::EnsureResources), | 119 base::Bind(&OverscrollGlow::EnsureResources), |
114 true); | 120 true); |
115 } | 121 } |
116 | 122 |
| 123 has_ordered_ime_processing_ = |
| 124 CommandLine::ForCurrentProcess()->HasSwitch( |
| 125 switches::kEnableOrderedImeProcessing); |
| 126 |
117 host_->SetView(this); | 127 host_->SetView(this); |
118 SetContentViewCore(content_view_core); | 128 SetContentViewCore(content_view_core); |
119 } | 129 } |
120 | 130 |
121 RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() { | 131 RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() { |
122 SetContentViewCore(NULL); | 132 SetContentViewCore(NULL); |
123 DCHECK(ack_callbacks_.empty()); | 133 DCHECK(ack_callbacks_.empty()); |
124 if (texture_id_in_layer_) { | 134 if (texture_id_in_layer_) { |
125 ImageTransportFactoryAndroid::GetInstance()->DeleteTexture( | 135 ImageTransportFactoryAndroid::GetInstance()->DeleteTexture( |
126 texture_id_in_layer_); | 136 texture_id_in_layer_); |
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
383 bool can_compose_inline) { | 393 bool can_compose_inline) { |
384 // Unused on Android, which uses OnTextInputChanged instead. | 394 // Unused on Android, which uses OnTextInputChanged instead. |
385 } | 395 } |
386 | 396 |
387 int RenderWidgetHostViewAndroid::GetNativeImeAdapter() { | 397 int RenderWidgetHostViewAndroid::GetNativeImeAdapter() { |
388 return reinterpret_cast<int>(&ime_adapter_android_); | 398 return reinterpret_cast<int>(&ime_adapter_android_); |
389 } | 399 } |
390 | 400 |
391 void RenderWidgetHostViewAndroid::OnTextInputStateChanged( | 401 void RenderWidgetHostViewAndroid::OnTextInputStateChanged( |
392 const ViewHostMsg_TextInputState_Params& params) { | 402 const ViewHostMsg_TextInputState_Params& params) { |
| 403 if (has_ordered_ime_processing()) { |
| 404 // Regardless of how we exit from this method, we must acknowledge that we |
| 405 // processed the input state change. |
| 406 base::ScopedClosureRunner ackCaller(base::Bind(&SendImeEventAck, host_)); |
| 407 } |
393 if (!IsShowing()) | 408 if (!IsShowing()) |
394 return; | 409 return; |
395 | 410 |
396 content_view_core_->UpdateImeAdapter( | 411 content_view_core_->UpdateImeAdapter( |
397 GetNativeImeAdapter(), | 412 GetNativeImeAdapter(), |
398 static_cast<int>(params.type), | 413 static_cast<int>(params.type), |
399 params.value, params.selection_start, params.selection_end, | 414 params.value, params.selection_start, params.selection_end, |
400 params.composition_start, params.composition_end, | 415 params.composition_start, params.composition_end, |
401 params.show_ime_if_needed); | 416 params.show_ime_if_needed); |
402 } | 417 } |
(...skipping 711 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1114 // RenderWidgetHostView, public: | 1129 // RenderWidgetHostView, public: |
1115 | 1130 |
1116 // static | 1131 // static |
1117 RenderWidgetHostView* | 1132 RenderWidgetHostView* |
1118 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { | 1133 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { |
1119 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); | 1134 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); |
1120 return new RenderWidgetHostViewAndroid(rwhi, NULL); | 1135 return new RenderWidgetHostViewAndroid(rwhi, NULL); |
1121 } | 1136 } |
1122 | 1137 |
1123 } // namespace content | 1138 } // namespace content |
OLD | NEW |