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

Side by Side Diff: content/renderer/pepper/pepper_plugin_instance_impl.cc

Issue 2860783002: Plugins: Fix crash in PepperPluginInstanceImpl when render frame gone (Closed)
Patch Set: Created 3 years, 7 months 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 unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/pepper/pepper_plugin_instance_impl.h" 5 #include "content/renderer/pepper/pepper_plugin_instance_impl.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/bit_cast.h" 10 #include "base/bit_cast.h"
(...skipping 1102 matching lines...) Expand 10 before | Expand all | Expand 10 after
1113 caret.Offset(view_data_.rect.point.x, view_data_.rect.point.y); 1113 caret.Offset(view_data_.rect.point.x, view_data_.rect.point.y);
1114 ConvertDIPToViewport(&caret); 1114 ConvertDIPToViewport(&caret);
1115 return caret; 1115 return caret;
1116 } 1116 }
1117 1117
1118 bool PepperPluginInstanceImpl::HandleInputEvent( 1118 bool PepperPluginInstanceImpl::HandleInputEvent(
1119 const blink::WebInputEvent& event, 1119 const blink::WebInputEvent& event,
1120 WebCursorInfo* cursor_info) { 1120 WebCursorInfo* cursor_info) {
1121 TRACE_EVENT0("ppapi", "PepperPluginInstanceImpl::HandleInputEvent"); 1121 TRACE_EVENT0("ppapi", "PepperPluginInstanceImpl::HandleInputEvent");
1122 1122
1123 if (!render_frame_)
1124 return false;
1125
1123 if (!has_been_clicked_ && is_flash_plugin_ && 1126 if (!has_been_clicked_ && is_flash_plugin_ &&
1124 event.GetType() == blink::WebInputEvent::kMouseDown && 1127 event.GetType() == blink::WebInputEvent::kMouseDown &&
1125 (event.GetModifiers() & blink::WebInputEvent::kLeftButtonDown)) { 1128 (event.GetModifiers() & blink::WebInputEvent::kLeftButtonDown)) {
1126 has_been_clicked_ = true; 1129 has_been_clicked_ = true;
1127 blink::WebRect bounds = container()->GetElement().BoundsInViewport(); 1130 blink::WebRect bounds = container()->GetElement().BoundsInViewport();
1128 render_frame()->GetRenderWidget()->ConvertViewportToWindow(&bounds); 1131 render_frame()->GetRenderWidget()->ConvertViewportToWindow(&bounds);
1129 RecordFlashClickSizeMetric(bounds.width, bounds.height); 1132 RecordFlashClickSizeMetric(bounds.width, bounds.height);
1130 } 1133 }
1131 1134
1132 if (throttler_ && throttler_->ConsumeInputEvent(event)) 1135 if (throttler_ && throttler_->ConsumeInputEvent(event))
1133 return true; 1136 return true;
1134 1137
1135 if (!render_frame_)
1136 return false;
1137 if (WebInputEvent::IsMouseEventType(event.GetType())) { 1138 if (WebInputEvent::IsMouseEventType(event.GetType())) {
1138 render_frame_->PepperDidReceiveMouseEvent(this); 1139 render_frame_->PepperDidReceiveMouseEvent(this);
1139 } 1140 }
1140 1141
1141 // Don't dispatch input events to crashed plugins. 1142 // Don't dispatch input events to crashed plugins.
1142 if (module()->is_crashed()) 1143 if (module()->is_crashed())
1143 return false; 1144 return false;
1144 1145
1145 // Don't send reserved system key events to plugins. 1146 // Don't send reserved system key events to plugins.
1146 if (IsReservedSystemInputEvent(event)) 1147 if (IsReservedSystemInputEvent(event))
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
1255 // instance object. 1256 // instance object.
1256 if (LoadPrivateInterface()) 1257 if (LoadPrivateInterface())
1257 return plugin_private_interface_->GetInstanceObject(pp_instance()); 1258 return plugin_private_interface_->GetInstanceObject(pp_instance());
1258 return PP_MakeUndefined(); 1259 return PP_MakeUndefined();
1259 } 1260 }
1260 1261
1261 void PepperPluginInstanceImpl::ViewChanged( 1262 void PepperPluginInstanceImpl::ViewChanged(
1262 const gfx::Rect& window, 1263 const gfx::Rect& window,
1263 const gfx::Rect& clip, 1264 const gfx::Rect& clip,
1264 const gfx::Rect& unobscured) { 1265 const gfx::Rect& unobscured) {
1266 if (!render_frame_)
1267 return;
1268
1265 // WebKit can give weird (x,y) positions for empty clip rects (since the 1269 // WebKit can give weird (x,y) positions for empty clip rects (since the
1266 // position technically doesn't matter). But we want to make these 1270 // position technically doesn't matter). But we want to make these
1267 // consistent since this is given to the plugin, so force everything to 0 1271 // consistent since this is given to the plugin, so force everything to 0
1268 // in the "everything is clipped" case. 1272 // in the "everything is clipped" case.
1269 gfx::Rect new_clip; 1273 gfx::Rect new_clip;
1270 if (!clip.IsEmpty()) 1274 if (!clip.IsEmpty())
1271 new_clip = clip; 1275 new_clip = clip;
1272 1276
1273 unobscured_rect_ = unobscured; 1277 unobscured_rect_ = unobscured;
1274 1278
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
1373 if (bound_graphics_2d_platform_) 1377 if (bound_graphics_2d_platform_)
1374 bound_graphics_2d_platform_->ViewInitiatedPaint(); 1378 bound_graphics_2d_platform_->ViewInitiatedPaint();
1375 else if (bound_graphics_3d_.get()) 1379 else if (bound_graphics_3d_.get())
1376 bound_graphics_3d_->ViewInitiatedPaint(); 1380 bound_graphics_3d_->ViewInitiatedPaint();
1377 else if (bound_compositor_) 1381 else if (bound_compositor_)
1378 bound_compositor_->ViewInitiatedPaint(); 1382 bound_compositor_->ViewInitiatedPaint();
1379 } 1383 }
1380 1384
1381 void PepperPluginInstanceImpl::SetSelectedText( 1385 void PepperPluginInstanceImpl::SetSelectedText(
1382 const base::string16& selected_text) { 1386 const base::string16& selected_text) {
1387 if (!render_frame_)
1388 return;
1389
1383 selected_text_ = selected_text; 1390 selected_text_ = selected_text;
1384 gfx::Range range(0, selected_text.length()); 1391 gfx::Range range(0, selected_text.length());
1385 render_frame_->SetSelectedText(selected_text, 0, range); 1392 render_frame_->SetSelectedText(selected_text, 0, range);
1386 } 1393 }
1387 1394
1388 void PepperPluginInstanceImpl::SetLinkUnderCursor(const std::string& url) { 1395 void PepperPluginInstanceImpl::SetLinkUnderCursor(const std::string& url) {
1389 link_under_cursor_ = base::UTF8ToUTF16(url); 1396 link_under_cursor_ = base::UTF8ToUTF16(url);
1390 } 1397 }
1391 1398
1392 void PepperPluginInstanceImpl::SetTextInputType(ui::TextInputType type) { 1399 void PepperPluginInstanceImpl::SetTextInputType(ui::TextInputType type) {
1400 if (!render_frame_)
1401 return;
1402
1393 text_input_type_ = type; 1403 text_input_type_ = type;
1394 render_frame_->PepperTextInputTypeChanged(this); 1404 render_frame_->PepperTextInputTypeChanged(this);
1395 } 1405 }
1396 1406
1397 void PepperPluginInstanceImpl::PostMessageToJavaScript(PP_Var message) { 1407 void PepperPluginInstanceImpl::PostMessageToJavaScript(PP_Var message) {
1398 if (message_channel_) 1408 if (message_channel_)
1399 message_channel_->PostMessageToJavaScript(message); 1409 message_channel_->PostMessageToJavaScript(message);
1400 } 1410 }
1401 1411
1402 int32_t PepperPluginInstanceImpl::RegisterMessageHandler( 1412 int32_t PepperPluginInstanceImpl::RegisterMessageHandler(
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after
1678 // The bound callback that owns the weak pointer is still valid until after 1688 // The bound callback that owns the weak pointer is still valid until after
1679 // this function returns. SendDidChangeView checks HasWeakPtrs, so we need to 1689 // this function returns. SendDidChangeView checks HasWeakPtrs, so we need to
1680 // invalidate them here. 1690 // invalidate them here.
1681 // NOTE: If we ever want to have more than one pending callback, it should 1691 // NOTE: If we ever want to have more than one pending callback, it should
1682 // use a different factory, or we should have a different strategy here. 1692 // use a different factory, or we should have a different strategy here.
1683 view_change_weak_ptr_factory_.InvalidateWeakPtrs(); 1693 view_change_weak_ptr_factory_.InvalidateWeakPtrs();
1684 SendDidChangeView(); 1694 SendDidChangeView();
1685 } 1695 }
1686 1696
1687 void PepperPluginInstanceImpl::SendDidChangeView() { 1697 void PepperPluginInstanceImpl::SendDidChangeView() {
1698 if (!render_frame_)
1699 return;
1700
1688 // An asynchronous view update is scheduled. Skip sending this update. 1701 // An asynchronous view update is scheduled. Skip sending this update.
1689 if (view_change_weak_ptr_factory_.HasWeakPtrs()) 1702 if (view_change_weak_ptr_factory_.HasWeakPtrs())
1690 return; 1703 return;
1691 1704
1692 // Don't send DidChangeView to crashed plugins. 1705 // Don't send DidChangeView to crashed plugins.
1693 if (module()->is_crashed()) 1706 if (module()->is_crashed())
1694 return; 1707 return;
1695 1708
1696 if (bound_compositor_) 1709 if (bound_compositor_)
1697 bound_compositor_->set_viewport_to_dip_scale(viewport_to_dip_scale_); 1710 bound_compositor_->set_viewport_to_dip_scale(viewport_to_dip_scale_);
(...skipping 450 matching lines...) Expand 10 before | Expand all | Expand 10 after
2148 bool PepperPluginInstanceImpl::PrepareTextureMailbox( 2161 bool PepperPluginInstanceImpl::PrepareTextureMailbox(
2149 cc::TextureMailbox* mailbox, 2162 cc::TextureMailbox* mailbox,
2150 std::unique_ptr<cc::SingleReleaseCallback>* release_callback) { 2163 std::unique_ptr<cc::SingleReleaseCallback>* release_callback) {
2151 if (!bound_graphics_2d_platform_) 2164 if (!bound_graphics_2d_platform_)
2152 return false; 2165 return false;
2153 return bound_graphics_2d_platform_->PrepareTextureMailbox(mailbox, 2166 return bound_graphics_2d_platform_->PrepareTextureMailbox(mailbox,
2154 release_callback); 2167 release_callback);
2155 } 2168 }
2156 2169
2157 void PepperPluginInstanceImpl::AccessibilityModeChanged() { 2170 void PepperPluginInstanceImpl::AccessibilityModeChanged() {
2158 if (render_frame_->render_accessibility() && LoadPdfInterface()) 2171 if (render_frame_ && render_frame_->render_accessibility() &&
2172 LoadPdfInterface()) {
2159 plugin_pdf_interface_->EnableAccessibility(pp_instance()); 2173 plugin_pdf_interface_->EnableAccessibility(pp_instance());
2174 }
2160 } 2175 }
2161 2176
2162 void PepperPluginInstanceImpl::OnDestruct() { 2177 void PepperPluginInstanceImpl::OnDestruct() {
2163 render_frame_ = nullptr; 2178 render_frame_ = nullptr;
2164 } 2179 }
2165 2180
2166 void PepperPluginInstanceImpl::OnThrottleStateChange() { 2181 void PepperPluginInstanceImpl::OnThrottleStateChange() {
2182 if (!render_frame_)
2183 return;
2184
2167 SendDidChangeView(); 2185 SendDidChangeView();
2168 2186
2169 bool is_throttled = throttler_->IsThrottled(); 2187 bool is_throttled = throttler_->IsThrottled();
2170 render_frame()->Send(new FrameHostMsg_PluginInstanceThrottleStateChange( 2188 render_frame()->Send(new FrameHostMsg_PluginInstanceThrottleStateChange(
2171 module_->GetPluginChildId(), pp_instance_, is_throttled)); 2189 module_->GetPluginChildId(), pp_instance_, is_throttled));
2172 } 2190 }
2173 2191
2174 void PepperPluginInstanceImpl::OnHiddenForPlaceholder(bool hidden) { 2192 void PepperPluginInstanceImpl::OnHiddenForPlaceholder(bool hidden) {
2175 UpdateLayer(false /* device_changed */); 2193 UpdateLayer(false /* device_changed */);
2176 } 2194 }
(...skipping 1276 matching lines...) Expand 10 before | Expand all | Expand 10 after
3453 const cc::TextureMailbox& mailbox) const { 3471 const cc::TextureMailbox& mailbox) const {
3454 auto it = 3472 auto it =
3455 std::find_if(texture_ref_counts_.begin(), texture_ref_counts_.end(), 3473 std::find_if(texture_ref_counts_.begin(), texture_ref_counts_.end(),
3456 [&mailbox](const TextureMailboxRefCount& ref_count) { 3474 [&mailbox](const TextureMailboxRefCount& ref_count) {
3457 return ref_count.first.mailbox() == mailbox.mailbox(); 3475 return ref_count.first.mailbox() == mailbox.mailbox();
3458 }); 3476 });
3459 return it != texture_ref_counts_.end(); 3477 return it != texture_ref_counts_.end();
3460 } 3478 }
3461 3479
3462 } // namespace content 3480 } // namespace content
OLDNEW
« 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