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

Side by Side Diff: content/browser/frame_host/render_widget_host_view_guest.cc

Issue 1199963011: Force new surface on BrowserPluginGuest reattach. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix test, and add check for null surface id in test. Created 5 years, 5 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
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "base/bind_helpers.h" 5 #include "base/bind_helpers.h"
6 #include "base/command_line.h" 6 #include "base/command_line.h"
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/message_loop/message_loop.h" 8 #include "base/message_loop/message_loop.h"
9 #include "cc/surfaces/surface.h" 9 #include "cc/surfaces/surface.h"
10 #include "cc/surfaces/surface_factory.h" 10 #include "cc/surfaces/surface_factory.h"
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
200 200
201 void RenderWidgetHostViewGuest::SetTooltipText( 201 void RenderWidgetHostViewGuest::SetTooltipText(
202 const base::string16& tooltip_text) { 202 const base::string16& tooltip_text) {
203 if (guest_) 203 if (guest_)
204 guest_->SetTooltipText(tooltip_text); 204 guest_->SetTooltipText(tooltip_text);
205 } 205 }
206 206
207 void RenderWidgetHostViewGuest::OnSwapCompositorFrame( 207 void RenderWidgetHostViewGuest::OnSwapCompositorFrame(
208 uint32 output_surface_id, 208 uint32 output_surface_id,
209 scoped_ptr<cc::CompositorFrame> frame) { 209 scoped_ptr<cc::CompositorFrame> frame) {
210 if (!guest_) 210 if (!guest_ || !guest_->attached()) {
211 // We shouldn't hang on to a surface while we are detached.
212 ClearCompositorSurfaceIfNecessary();
211 return; 213 return;
214 }
212 215
213 last_scroll_offset_ = frame->metadata.root_scroll_offset; 216 last_scroll_offset_ = frame->metadata.root_scroll_offset;
214 // When not using surfaces, the frame just gets proxied to 217 // When not using surfaces, the frame just gets proxied to
215 // the embedder's renderer to be composited. 218 // the embedder's renderer to be composited.
216 if (!frame->delegated_frame_data || !use_surfaces_) { 219 if (!frame->delegated_frame_data || !use_surfaces_) {
217 guest_->SwapCompositorFrame(output_surface_id, 220 guest_->SwapCompositorFrame(output_surface_id,
218 host_->GetProcess()->GetID(), 221 host_->GetProcess()->GetID(),
219 host_->GetRoutingID(), 222 host_->GetRoutingID(),
220 frame.Pass()); 223 frame.Pass());
221 return; 224 return;
222 } 225 }
223 226
224 cc::RenderPass* root_pass = 227 cc::RenderPass* root_pass =
225 frame->delegated_frame_data->render_pass_list.back(); 228 frame->delegated_frame_data->render_pass_list.back();
226 229
227 gfx::Size frame_size = root_pass->output_rect.size(); 230 gfx::Size frame_size = root_pass->output_rect.size();
228 float scale_factor = frame->metadata.device_scale_factor; 231 float scale_factor = frame->metadata.device_scale_factor;
229 232
230 guest_->UpdateGuestSizeIfNecessary(frame_size, scale_factor); 233 guest_->UpdateGuestSizeIfNecessary(frame_size, scale_factor);
231 234
232 // Check whether we need to recreate the cc::Surface, which means the child 235 // Check whether we need to recreate the cc::Surface, which means the child
233 // frame renderer has changed its output surface, or size, or scale factor. 236 // frame renderer has changed its output surface, or size, or scale factor.
234 if (output_surface_id != last_output_surface_id_ && surface_factory_) { 237 if (output_surface_id != last_output_surface_id_ && surface_factory_) {
235 surface_factory_->Destroy(surface_id_); 238 surface_factory_->Destroy(surface_id_);
236 surface_factory_.reset(); 239 surface_factory_.reset();
237 } 240 }
238 if (output_surface_id != last_output_surface_id_ || 241 if (output_surface_id != last_output_surface_id_ ||
239 frame_size != current_surface_size_ || 242 frame_size != current_surface_size_ ||
240 scale_factor != current_surface_scale_factor_) { 243 scale_factor != current_surface_scale_factor_ ||
241 if (surface_factory_ && !surface_id_.is_null()) 244 guest_->has_attached_since_surface_set()) {
242 surface_factory_->Destroy(surface_id_); 245 ClearCompositorSurfaceIfNecessary();
243 surface_id_ = cc::SurfaceId();
244 last_output_surface_id_ = output_surface_id; 246 last_output_surface_id_ = output_surface_id;
245 current_surface_size_ = frame_size; 247 current_surface_size_ = frame_size;
246 current_surface_scale_factor_ = scale_factor; 248 current_surface_scale_factor_ = scale_factor;
247 } 249 }
248 250
249 if (!surface_factory_) { 251 if (!surface_factory_) {
250 cc::SurfaceManager* manager = GetSurfaceManager(); 252 cc::SurfaceManager* manager = GetSurfaceManager();
251 surface_factory_ = make_scoped_ptr(new cc::SurfaceFactory(manager, this)); 253 surface_factory_ = make_scoped_ptr(new cc::SurfaceFactory(manager, this));
252 } 254 }
253 255
(...skipping 404 matching lines...) Expand 10 before | Expand all | Expand 10 after
658 } 660 }
659 661
660 if (blink::WebInputEvent::isGestureEventType(event->type)) { 662 if (blink::WebInputEvent::isGestureEventType(event->type)) {
661 host_->ForwardGestureEvent( 663 host_->ForwardGestureEvent(
662 *static_cast<const blink::WebGestureEvent*>(event)); 664 *static_cast<const blink::WebGestureEvent*>(event));
663 return; 665 return;
664 } 666 }
665 } 667 }
666 668
667 } // namespace content 669 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698