Index: ui/views/controls/webview/webview.cc |
diff --git a/ui/views/controls/webview/webview.cc b/ui/views/controls/webview/webview.cc |
index 5794c56e6722c2dac261fcdf03dcffe1a87a1a06..11d8acd5d99f11a27cf8089cf3559f7a8f134352 100644 |
--- a/ui/views/controls/webview/webview.cc |
+++ b/ui/views/controls/webview/webview.cc |
@@ -13,6 +13,7 @@ |
#include "ipc/ipc_message.h" |
#include "ui/accessibility/ax_enums.h" |
#include "ui/accessibility/ax_view_state.h" |
+#include "ui/base/ui_base_switches_util.h" |
#include "ui/events/event.h" |
#include "ui/views/accessibility/native_view_accessibility.h" |
#include "ui/views/controls/native/native_view_host.h" |
@@ -66,6 +67,7 @@ void WebView::SetWebContents(content::WebContents* replacement) { |
DCHECK(!is_embedding_fullscreen_widget_); |
} |
AttachWebContents(); |
+ NotifyMaybeTextInputClientChanged(); |
} |
void WebView::SetEmbedFullscreenWidgetMode(bool enable) { |
@@ -102,6 +104,24 @@ const char* WebView::GetClassName() const { |
return kViewClassName; |
} |
+ui::TextInputClient* WebView::GetTextInputClient() { |
+ // This function delegates the text input handling to the underlying |
+ // content::RenderWidgetHostView. So when the underlying RWHV is destroyed or |
+ // replaced with another one, we have to notify the FocusManager through |
+ // FocusManager::OnTextInputClientChanged() that the focused TextInputClient |
+ // needs to be updated. |
+ if (switches::IsTextInputFocusManagerEnabled() && |
+ web_contents() && !web_contents()->IsBeingDestroyed()) { |
+ content::RenderWidgetHostView* host_view = |
+ is_embedding_fullscreen_widget_ ? |
+ web_contents()->GetFullscreenRenderWidgetHostView() : |
+ web_contents()->GetRenderWidgetHostView(); |
+ if (host_view) |
+ return host_view->GetTextInputClient(); |
+ } |
+ return NULL; |
+} |
+ |
void WebView::OnBoundsChanged(const gfx::Rect& previous_bounds) { |
// In most cases, the holder is simply sized to fill this WebView's bounds. |
// Only WebContentses that are in fullscreen mode and being screen-captured |
@@ -228,11 +248,16 @@ bool WebView::EmbedsFullscreenWidget() const { |
//////////////////////////////////////////////////////////////////////////////// |
// WebView, content::WebContentsObserver implementation: |
+void WebView::RenderViewDeleted(content::RenderViewHost* render_view_host) { |
+ NotifyMaybeTextInputClientChanged(); |
+} |
+ |
void WebView::RenderViewHostChanged(content::RenderViewHost* old_host, |
content::RenderViewHost* new_host) { |
FocusManager* const focus_manager = GetFocusManager(); |
if (focus_manager && focus_manager->GetFocusedView() == this) |
OnFocus(); |
+ NotifyMaybeTextInputClientChanged(); |
} |
void WebView::DidShowFullscreenWidget(int routing_id) { |
@@ -308,6 +333,14 @@ void WebView::ReattachForFullscreenChange(bool enter_fullscreen) { |
// the same. So, do not change attachment. |
OnBoundsChanged(bounds()); |
} |
+ NotifyMaybeTextInputClientChanged(); |
+} |
+ |
+void WebView::NotifyMaybeTextInputClientChanged() { |
+ // Update the TextInputClient as needed; see GetTextInputClient(). |
+ FocusManager* const focus_manager = GetFocusManager(); |
+ if (focus_manager) |
+ focus_manager->OnTextInputClientChanged(this); |
} |
content::WebContents* WebView::CreateWebContents( |