Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3104)

Unified Diff: content/renderer/text_input_client_observer.cc

Issue 2526563004: Fix renderer crashes due to non-existing RenderFrameImpl or WebFrameWidget during Navigations (Closed)
Patch Set: Fixed a Bug (and failing tests) Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/renderer/text_input_client_observer.cc
diff --git a/content/renderer/text_input_client_observer.cc b/content/renderer/text_input_client_observer.cc
index 8de420704d7b04759703c3fda02f4f0d429e41b4..eb9ef89d1ae4281e23b73bfbcc50cb7d78e43f61 100644
--- a/content/renderer/text_input_client_observer.cc
+++ b/content/renderer/text_input_client_observer.cc
@@ -53,22 +53,30 @@ bool TextInputClientObserver::Send(IPC::Message* message) {
blink::WebFrameWidget* TextInputClientObserver::GetWebFrameWidget() const {
blink::WebWidget* widget = render_widget_->GetWebWidget();
- // We should always receive a WebFrameWidget in the call above. RenderViewImpl
- // however might return a WebView if the main frame is destroyed, but as long
- // as there is a rendered page, we should not be in that state and the RVImpl
- // should be returning a frame widget.
- DCHECK(widget->isWebFrameWidget());
- return static_cast<blink::WebFrameWidget*>(render_widget_->GetWebWidget());
+ if (!widget->isWebFrameWidget()) {
+ // When a page navigation occurs, for a brief period
+ // RenderViewImpl::GetWebWidget() will return a WebViewImpl instead of a
+ // WebViewFrameWidget. Therefore, casting to WebFrameWidget is invalid and
+ // could cause crashes. Also, WebView::mainFrame() could be a remote frame
+ // which will yield a nullptr for localRoot() (https://crbug.com/664890).
+ return nullptr;
+ }
+ return static_cast<blink::WebFrameWidget*>(widget);
}
blink::WebLocalFrame* TextInputClientObserver::GetFocusedFrame() const {
- blink::WebLocalFrame* focused =
- RenderFrameImpl::FromWebFrame(GetWebFrameWidget()->localRoot())
- ->render_view()
- ->webview()
- ->focusedFrame();
- return focused->localRoot() == GetWebFrameWidget()->localRoot() ? focused
- : nullptr;
+ if (auto* frame_widget = GetWebFrameWidget()) {
+ blink::WebLocalFrame* localRoot = frame_widget->localRoot();
+ RenderFrameImpl* render_frame = RenderFrameImpl::FromWebFrame(localRoot);
+ if (!render_frame) {
+ // TODO(ekaramad): Can this ever be nullptr? (https://crbug.com/664890).
+ return nullptr;
+ }
+ blink::WebLocalFrame* focused =
+ render_frame->render_view()->webview()->focusedFrame();
+ return focused->localRoot() == localRoot ? focused : nullptr;
+ }
+ return nullptr;
}
#if BUILDFLAG(ENABLE_PLUGINS)
@@ -85,8 +93,12 @@ PepperPluginInstanceImpl* TextInputClientObserver::GetFocusedPepperPlugin()
void TextInputClientObserver::OnStringAtPoint(gfx::Point point) {
#if defined(OS_MACOSX)
blink::WebPoint baselinePoint;
- NSAttributedString* string = blink::WebSubstringUtil::attributedWordAtPoint(
- GetWebFrameWidget(), point, baselinePoint);
+ NSAttributedString* string = nil;
+
+ if (auto* frame_widget = GetWebFrameWidget()) {
+ string = blink::WebSubstringUtil::attributedWordAtPoint(frame_widget, point,
+ baselinePoint);
+ }
std::unique_ptr<const mac::AttributedStringCoder::EncodedString> encoded(
mac::AttributedStringCoder::Encode(string));
@@ -99,8 +111,10 @@ void TextInputClientObserver::OnStringAtPoint(gfx::Point point) {
void TextInputClientObserver::OnCharacterIndexForPoint(gfx::Point point) {
blink::WebPoint web_point(point);
- uint32_t index = static_cast<uint32_t>(
- GetFocusedFrame()->characterIndexForPoint(web_point));
+ uint32_t index = 0U;
+ if (auto* frame = GetFocusedFrame())
+ index = static_cast<uint32_t>(frame->characterIndexForPoint(web_point));
+
Send(new TextInputClientReplyMsg_GotCharacterIndexForPoint(
render_widget_->routing_id(), index));
}
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698