| 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/renderer/text_input_client_observer.h" | 5 #include "content/renderer/text_input_client_observer.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 | 10 |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 46 IPC_END_MESSAGE_MAP() | 46 IPC_END_MESSAGE_MAP() |
| 47 return handled; | 47 return handled; |
| 48 } | 48 } |
| 49 | 49 |
| 50 bool TextInputClientObserver::Send(IPC::Message* message) { | 50 bool TextInputClientObserver::Send(IPC::Message* message) { |
| 51 return render_widget_->Send(message); | 51 return render_widget_->Send(message); |
| 52 } | 52 } |
| 53 | 53 |
| 54 blink::WebFrameWidget* TextInputClientObserver::GetWebFrameWidget() const { | 54 blink::WebFrameWidget* TextInputClientObserver::GetWebFrameWidget() const { |
| 55 blink::WebWidget* widget = render_widget_->GetWebWidget(); | 55 blink::WebWidget* widget = render_widget_->GetWebWidget(); |
| 56 // We should always receive a WebFrameWidget in the call above. RenderViewImpl | 56 if (!widget->isWebFrameWidget()) { |
| 57 // however might return a WebView if the main frame is destroyed, but as long | 57 // When a page navigation occurs, for a brief period |
| 58 // as there is a rendered page, we should not be in that state and the RVImpl | 58 // RenderViewImpl::GetWebWidget() will return a WebViewImpl instead of a |
| 59 // should be returning a frame widget. | 59 // WebViewFrameWidget. Therefore, casting to WebFrameWidget is invalid and |
| 60 DCHECK(widget->isWebFrameWidget()); | 60 // could cause crashes. Also, WebView::mainFrame() could be a remote frame |
| 61 return static_cast<blink::WebFrameWidget*>(render_widget_->GetWebWidget()); | 61 // which will yield a nullptr for localRoot() (https://crbug.com/664890). |
| 62 return nullptr; |
| 63 } |
| 64 return static_cast<blink::WebFrameWidget*>(widget); |
| 62 } | 65 } |
| 63 | 66 |
| 64 blink::WebLocalFrame* TextInputClientObserver::GetFocusedFrame() const { | 67 blink::WebLocalFrame* TextInputClientObserver::GetFocusedFrame() const { |
| 65 blink::WebLocalFrame* focused = | 68 if (auto* frame_widget = GetWebFrameWidget()) { |
| 66 RenderFrameImpl::FromWebFrame(GetWebFrameWidget()->localRoot()) | 69 blink::WebLocalFrame* localRoot = frame_widget->localRoot(); |
| 67 ->render_view() | 70 RenderFrameImpl* render_frame = RenderFrameImpl::FromWebFrame(localRoot); |
| 68 ->webview() | 71 if (!render_frame) { |
| 69 ->focusedFrame(); | 72 // TODO(ekaramad): Can this ever be nullptr? (https://crbug.com/664890). |
| 70 return focused->localRoot() == GetWebFrameWidget()->localRoot() ? focused | 73 return nullptr; |
| 71 : nullptr; | 74 } |
| 75 blink::WebLocalFrame* focused = |
| 76 render_frame->render_view()->webview()->focusedFrame(); |
| 77 return focused->localRoot() == localRoot ? focused : nullptr; |
| 78 } |
| 79 return nullptr; |
| 72 } | 80 } |
| 73 | 81 |
| 74 #if BUILDFLAG(ENABLE_PLUGINS) | 82 #if BUILDFLAG(ENABLE_PLUGINS) |
| 75 PepperPluginInstanceImpl* TextInputClientObserver::GetFocusedPepperPlugin() | 83 PepperPluginInstanceImpl* TextInputClientObserver::GetFocusedPepperPlugin() |
| 76 const { | 84 const { |
| 77 blink::WebLocalFrame* focusedFrame = GetFocusedFrame(); | 85 blink::WebLocalFrame* focusedFrame = GetFocusedFrame(); |
| 78 return focusedFrame | 86 return focusedFrame |
| 79 ? RenderFrameImpl::FromWebFrame(focusedFrame) | 87 ? RenderFrameImpl::FromWebFrame(focusedFrame) |
| 80 ->focused_pepper_plugin() | 88 ->focused_pepper_plugin() |
| 81 : nullptr; | 89 : nullptr; |
| 82 } | 90 } |
| 83 #endif | 91 #endif |
| 84 | 92 |
| 85 void TextInputClientObserver::OnStringAtPoint(gfx::Point point) { | 93 void TextInputClientObserver::OnStringAtPoint(gfx::Point point) { |
| 86 #if defined(OS_MACOSX) | 94 #if defined(OS_MACOSX) |
| 87 blink::WebPoint baselinePoint; | 95 blink::WebPoint baselinePoint; |
| 88 NSAttributedString* string = blink::WebSubstringUtil::attributedWordAtPoint( | 96 NSAttributedString* string = nil; |
| 89 GetWebFrameWidget(), point, baselinePoint); | 97 |
| 98 if (auto* frame_widget = GetWebFrameWidget()) { |
| 99 string = blink::WebSubstringUtil::attributedWordAtPoint(frame_widget, point, |
| 100 baselinePoint); |
| 101 } |
| 90 | 102 |
| 91 std::unique_ptr<const mac::AttributedStringCoder::EncodedString> encoded( | 103 std::unique_ptr<const mac::AttributedStringCoder::EncodedString> encoded( |
| 92 mac::AttributedStringCoder::Encode(string)); | 104 mac::AttributedStringCoder::Encode(string)); |
| 93 Send(new TextInputClientReplyMsg_GotStringAtPoint( | 105 Send(new TextInputClientReplyMsg_GotStringAtPoint( |
| 94 render_widget_->routing_id(), *encoded.get(), baselinePoint)); | 106 render_widget_->routing_id(), *encoded.get(), baselinePoint)); |
| 95 #else | 107 #else |
| 96 NOTIMPLEMENTED(); | 108 NOTIMPLEMENTED(); |
| 97 #endif | 109 #endif |
| 98 } | 110 } |
| 99 | 111 |
| 100 void TextInputClientObserver::OnCharacterIndexForPoint(gfx::Point point) { | 112 void TextInputClientObserver::OnCharacterIndexForPoint(gfx::Point point) { |
| 101 blink::WebPoint web_point(point); | 113 blink::WebPoint web_point(point); |
| 102 uint32_t index = static_cast<uint32_t>( | 114 uint32_t index = 0U; |
| 103 GetFocusedFrame()->characterIndexForPoint(web_point)); | 115 if (auto* frame = GetFocusedFrame()) |
| 116 index = static_cast<uint32_t>(frame->characterIndexForPoint(web_point)); |
| 117 |
| 104 Send(new TextInputClientReplyMsg_GotCharacterIndexForPoint( | 118 Send(new TextInputClientReplyMsg_GotCharacterIndexForPoint( |
| 105 render_widget_->routing_id(), index)); | 119 render_widget_->routing_id(), index)); |
| 106 } | 120 } |
| 107 | 121 |
| 108 void TextInputClientObserver::OnFirstRectForCharacterRange(gfx::Range range) { | 122 void TextInputClientObserver::OnFirstRectForCharacterRange(gfx::Range range) { |
| 109 gfx::Rect rect; | 123 gfx::Rect rect; |
| 110 #if BUILDFLAG(ENABLE_PLUGINS) | 124 #if BUILDFLAG(ENABLE_PLUGINS) |
| 111 PepperPluginInstanceImpl* focused_plugin = GetFocusedPepperPlugin(); | 125 PepperPluginInstanceImpl* focused_plugin = GetFocusedPepperPlugin(); |
| 112 if (focused_plugin) { | 126 if (focused_plugin) { |
| 113 rect = focused_plugin->GetCaretBounds(); | 127 rect = focused_plugin->GetCaretBounds(); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 142 std::unique_ptr<const mac::AttributedStringCoder::EncodedString> encoded( | 156 std::unique_ptr<const mac::AttributedStringCoder::EncodedString> encoded( |
| 143 mac::AttributedStringCoder::Encode(string)); | 157 mac::AttributedStringCoder::Encode(string)); |
| 144 Send(new TextInputClientReplyMsg_GotStringForRange( | 158 Send(new TextInputClientReplyMsg_GotStringForRange( |
| 145 render_widget_->routing_id(), *encoded.get(), baselinePoint)); | 159 render_widget_->routing_id(), *encoded.get(), baselinePoint)); |
| 146 #else | 160 #else |
| 147 NOTIMPLEMENTED(); | 161 NOTIMPLEMENTED(); |
| 148 #endif | 162 #endif |
| 149 } | 163 } |
| 150 | 164 |
| 151 } // namespace content | 165 } // namespace content |
| OLD | NEW |