Index: content/browser/renderer_host/render_widget_host_view_mac.mm |
diff --git a/content/browser/renderer_host/render_widget_host_view_mac.mm b/content/browser/renderer_host/render_widget_host_view_mac.mm |
index 0fd304e71da38d26002045e5f79f83bf7aed0389..984d57d3ed9fb37cad49de75d8953d58102aef4c 100644 |
--- a/content/browser/renderer_host/render_widget_host_view_mac.mm |
+++ b/content/browser/renderer_host/render_widget_host_view_mac.mm |
@@ -162,8 +162,6 @@ static BOOL SupportsBackingPropertiesChangedNotification() { |
- (void)keyEvent:(NSEvent*)theEvent wasKeyEquivalent:(BOOL)equiv; |
- (void)windowDidChangeBackingProperties:(NSNotification*)notification; |
- (void)windowChangedGlobalFrame:(NSNotification*)notification; |
-- (void)drawWithDirtyRect:(CGRect)dirtyRect |
- inContext:(CGContextRef)context; |
- (void)checkForPluginImeCancellation; |
- (void)updateScreenProperties; |
- (void)setResponderDelegate: |
@@ -205,8 +203,6 @@ static BOOL SupportsBackingPropertiesChangedNotification() { |
styleMask:windowStyle |
backing:bufferingType |
defer:deferCreation]) { |
- DCHECK_EQ(content::CORE_ANIMATION_DISABLED, |
- content::GetCoreAnimationStatus()); |
ccameron
2014/06/05 03:05:14
I think this DCHECK_EQ was added by accident.
Ken Russell (switch to Gerrit)
2014/06/05 17:49:44
I wonder why it wasn't noticed earlier.
|
[self setOpaque:NO]; |
[self setBackgroundColor:[NSColor clearColor]]; |
[self startObservingClicks]; |
@@ -492,18 +488,14 @@ void RenderWidgetHostViewBase::GetDefaultScreenInfo( |
RenderWidgetHostViewMac::RenderWidgetHostViewMac(RenderWidgetHost* widget) |
: render_widget_host_(RenderWidgetHostImpl::From(widget)), |
- last_frame_was_accelerated_(false), |
text_input_type_(ui::TEXT_INPUT_TYPE_NONE), |
can_compose_inline_(true), |
- allow_overlapping_views_(false), |
- use_core_animation_(false), |
pending_latency_info_delay_(0), |
pending_latency_info_delay_weak_ptr_factory_(this), |
backing_store_scale_factor_(1), |
is_loading_(false), |
weak_factory_(this), |
fullscreen_parent_host_view_(NULL), |
- underlay_view_has_drawn_(false), |
overlay_view_weak_factory_(this), |
software_frame_weak_ptr_factory_(this) { |
software_frame_manager_.reset(new SoftwareFrameManager( |
@@ -514,14 +506,11 @@ RenderWidgetHostViewMac::RenderWidgetHostViewMac(RenderWidgetHost* widget) |
cocoa_view_ = [[[RenderWidgetHostViewCocoa alloc] |
initWithRenderWidgetHostViewMac:this] autorelease]; |
- if (GetCoreAnimationStatus() == CORE_ANIMATION_ENABLED) { |
- use_core_animation_ = true; |
- background_layer_.reset([[CALayer alloc] init]); |
- [background_layer_ |
- setBackgroundColor:CGColorGetConstantColor(kCGColorWhite)]; |
- [cocoa_view_ setLayer:background_layer_]; |
- [cocoa_view_ setWantsLayer:YES]; |
- } |
+ background_layer_.reset([[CALayer alloc] init]); |
+ [background_layer_ |
+ setBackgroundColor:CGColorGetConstantColor(kCGColorWhite)]; |
+ [cocoa_view_ setLayer:background_layer_]; |
+ [cocoa_view_ setWantsLayer:YES]; |
render_widget_host_->SetView(this); |
} |
@@ -534,7 +523,7 @@ RenderWidgetHostViewMac::~RenderWidgetHostViewMac() { |
UnlockMouse(); |
// Make sure that the layer doesn't reach into the now-invalid object. |
- DestroyCompositedIOSurfaceAndLayer(kDestroyContext); |
+ DestroyCompositedIOSurfaceAndLayer(); |
DestroySoftwareLayer(); |
// We are owned by RenderWidgetHostViewCocoa, so if we go away before the |
@@ -550,11 +539,7 @@ void RenderWidgetHostViewMac::SetDelegate( |
} |
void RenderWidgetHostViewMac::SetAllowOverlappingViews(bool overlapping) { |
- if (allow_overlapping_views_ == overlapping) |
- return; |
- allow_overlapping_views_ = overlapping; |
- [cocoa_view_ setNeedsDisplay:YES]; |
- [[cocoa_view_ window] disableScreenUpdatesUntilFlush]; |
+ // TODO(ccameron): Remove callers of this function. |
} |
/////////////////////////////////////////////////////////////////////////////// |
@@ -576,9 +561,8 @@ bool RenderWidgetHostViewMac::EnsureCompositedIOSurface() { |
return false; |
} |
- int current_window_number = use_core_animation_ ? |
- CompositingIOSurfaceContext::kOffscreenContextWindowNumber : |
- window_number(); |
+ int current_window_number = |
+ CompositingIOSurfaceContext::kOffscreenContextWindowNumber; |
bool new_surface_needed = !compositing_iosurface_; |
bool new_context_needed = |
!compositing_iosurface_context_ || |
@@ -597,7 +581,6 @@ bool RenderWidgetHostViewMac::EnsureCompositedIOSurface() { |
// context. Having two GL contexts bound to a view will result in |
// crashes and corruption. |
// http://crbug.com/230883 |
- ClearBoundContextDrawable(); |
if (!new_context) { |
LOG(ERROR) << "Failed to create CompositingIOSurfaceContext"; |
return false; |
@@ -619,7 +602,7 @@ bool RenderWidgetHostViewMac::EnsureCompositedIOSurface() { |
void RenderWidgetHostViewMac::EnsureSoftwareLayer() { |
TRACE_EVENT0("browser", "RenderWidgetHostViewMac::EnsureSoftwareLayer"); |
- if (software_layer_ || !use_core_animation_) |
+ if (software_layer_) |
return; |
software_layer_.reset([[SoftwareLayer alloc] init]); |
@@ -644,7 +627,7 @@ void RenderWidgetHostViewMac::EnsureCompositedIOSurfaceLayer() { |
TRACE_EVENT0("browser", |
"RenderWidgetHostViewMac::EnsureCompositedIOSurfaceLayer"); |
DCHECK(compositing_iosurface_context_); |
- if (compositing_iosurface_layer_ || !use_core_animation_) |
+ if (compositing_iosurface_layer_) |
return; |
compositing_iosurface_layer_.reset([[CompositingIOSurfaceLayer alloc] |
@@ -672,40 +655,13 @@ void RenderWidgetHostViewMac::DestroyCompositedIOSurfaceLayer( |
compositing_iosurface_layer_.reset(); |
} |
-void RenderWidgetHostViewMac::DestroyCompositedIOSurfaceAndLayer( |
- DestroyContextBehavior destroy_context_behavior) { |
+void RenderWidgetHostViewMac::DestroyCompositedIOSurfaceAndLayer() { |
// Any pending frames will not be displayed, so ack them now. |
SendPendingSwapAck(); |
DestroyCompositedIOSurfaceLayer(kRemoveLayerFromHierarchy); |
compositing_iosurface_ = NULL; |
- |
- switch (destroy_context_behavior) { |
- case kLeaveContextBoundToView: |
- break; |
- case kDestroyContext: |
- ClearBoundContextDrawable(); |
- compositing_iosurface_context_ = NULL; |
- break; |
- default: |
- NOTREACHED(); |
- break; |
- } |
-} |
- |
-void RenderWidgetHostViewMac::ClearBoundContextDrawable() { |
- if (use_core_animation_) |
- return; |
- |
- if (compositing_iosurface_context_ && |
- cocoa_view_ && |
- [[compositing_iosurface_context_->nsgl_context() view] |
- isEqual:cocoa_view_]) { |
- // Disable screen updates because removing the GL context from below can |
- // cause flashes. |
- [[cocoa_view_ window] disableScreenUpdatesUntilFlush]; |
- [compositing_iosurface_context_->nsgl_context() clearDrawable]; |
- } |
+ compositing_iosurface_context_ = NULL; |
} |
bool RenderWidgetHostViewMac::OnMessageReceived(const IPC::Message& message) { |
@@ -891,8 +847,6 @@ void RenderWidgetHostViewMac::WasShown() { |
if (!render_widget_host_->is_hidden()) |
return; |
- if (web_contents_switch_paint_time_.is_null()) |
- web_contents_switch_paint_time_ = base::TimeTicks::Now(); |
render_widget_host_->WasShown(); |
software_frame_manager_->SetVisibility(true); |
if (delegated_frame_host_) |
@@ -902,10 +856,6 @@ void RenderWidgetHostViewMac::WasShown() { |
// do, and are drawn, then the needsDisplay bit will be cleared. |
[compositing_iosurface_layer_ setNeedsDisplay]; |
PauseForPendingResizeOrRepaintsAndDraw(); |
- |
- // We're messing with the window, so do this to ensure no flashes. |
- if (!use_core_animation_) |
- [[cocoa_view_ window] disableScreenUpdatesUntilFlush]; |
} |
void RenderWidgetHostViewMac::WasHidden() { |
@@ -923,16 +873,6 @@ void RenderWidgetHostViewMac::WasHidden() { |
software_frame_manager_->SetVisibility(false); |
if (delegated_frame_host_) |
delegated_frame_host_->WasHidden(); |
- |
- // There can be a transparent flash as this view is removed and the next is |
- // added, because of OSX windowing races between displaying the contents of |
- // the NSView and its corresponding OpenGL context. |
- // disableScreenUpdatesUntilFlush prevents the transparent flash by avoiding |
- // screen updates until the next tab draws. |
- if (!use_core_animation_) |
- [[cocoa_view_ window] disableScreenUpdatesUntilFlush]; |
- |
- web_contents_switch_paint_time_ = base::TimeTicks(); |
} |
void RenderWidgetHostViewMac::SetSize(const gfx::Size& size) { |
@@ -1038,10 +978,6 @@ void RenderWidgetHostViewMac::Show() { |
} |
void RenderWidgetHostViewMac::Hide() { |
- // We're messing with the window, so do this to ensure no flashes. |
- if (!use_core_animation_) |
- [[cocoa_view_ window] disableScreenUpdatesUntilFlush]; |
- |
[cocoa_view_ setHidden:YES]; |
WasHidden(); |
@@ -1481,7 +1417,7 @@ void RenderWidgetHostViewMac::CompositorSwapBuffers( |
scoped_layer_remover.Reset( |
base::Bind(RemoveLayerFromSuperlayer, compositing_iosurface_layer_)); |
DestroyCompositedIOSurfaceLayer(kLeaveLayerInHierarchy); |
- DestroyCompositedIOSurfaceAndLayer(kDestroyContext); |
+ DestroyCompositedIOSurfaceAndLayer(); |
} |
// Ensure compositing_iosurface_ and compositing_iosurface_context_ be |
@@ -1590,14 +1526,8 @@ void RenderWidgetHostViewMac::CompositorSwapBuffers( |
// If we reach here, then the frame will be displayed by a future draw |
// call, so don't make the callback. |
ignore_result(scoped_ack.Release()); |
- if (use_core_animation_) { |
- DCHECK(compositing_iosurface_layer_); |
- [compositing_iosurface_layer_ gotNewFrame]; |
- } else { |
- gfx::ScopedCGLSetCurrentContext scoped_set_current_context( |
- compositing_iosurface_context_->cgl_context()); |
- DrawIOSurfaceWithoutCoreAnimation(); |
- } |
+ DCHECK(compositing_iosurface_layer_); |
+ [compositing_iosurface_layer_ gotNewFrame]; |
// Try to finish previous copy requests after draw to get better pipelining. |
if (compositing_iosurface_) |
@@ -1608,72 +1538,6 @@ void RenderWidgetHostViewMac::CompositorSwapBuffers( |
LayoutLayers(); |
} |
-void RenderWidgetHostViewMac::DrawIOSurfaceWithoutCoreAnimation() { |
- CHECK(!use_core_animation_); |
- CHECK(compositing_iosurface_); |
- |
- // If there is a pending frame, it should be acked by the end of this |
- // function. Note that the ack should happen only after all drawing is |
- // complete, so that the ack happens after any blocking due to vsync. |
- base::ScopedClosureRunner scoped_ack( |
- base::Bind(&RenderWidgetHostViewMac::SendPendingSwapAck, |
- weak_factory_.GetWeakPtr())); |
- |
- GLint old_gl_surface_order = 0; |
- GLint new_gl_surface_order = allow_overlapping_views_ ? -1 : 1; |
- [compositing_iosurface_context_->nsgl_context() |
- getValues:&old_gl_surface_order |
- forParameter:NSOpenGLCPSurfaceOrder]; |
- if (old_gl_surface_order != new_gl_surface_order) { |
- [compositing_iosurface_context_->nsgl_context() |
- setValues:&new_gl_surface_order |
- forParameter:NSOpenGLCPSurfaceOrder]; |
- } |
- |
- // Instead of drawing, request that underlay view redraws. |
- if (underlay_view_ && |
- underlay_view_->compositing_iosurface_ && |
- underlay_view_has_drawn_) { |
- [underlay_view_->cocoa_view() setNeedsDisplayInRect:NSMakeRect(0, 0, 1, 1)]; |
- return; |
- } |
- |
- bool has_overlay = overlay_view_ && overlay_view_->compositing_iosurface_; |
- if (has_overlay) { |
- // Un-bind the overlay view's OpenGL context, since its content will be |
- // drawn by this context. Not doing this can result in corruption. |
- // http://crbug.com/330701 |
- overlay_view_->ClearBoundContextDrawable(); |
- } |
- [compositing_iosurface_context_->nsgl_context() setView:cocoa_view_]; |
- |
- gfx::Rect view_rect(NSRectToCGRect([cocoa_view_ frame])); |
- if (!compositing_iosurface_->DrawIOSurface( |
- compositing_iosurface_context_, view_rect, |
- ViewScaleFactor(), !has_overlay)) { |
- GotAcceleratedCompositingError(); |
- return; |
- } |
- |
- if (has_overlay) { |
- overlay_view_->underlay_view_has_drawn_ = true; |
- gfx::Rect overlay_view_rect( |
- NSRectToCGRect([overlay_view_->cocoa_view() frame])); |
- overlay_view_rect.set_x(overlay_view_offset_.x()); |
- overlay_view_rect.set_y(view_rect.height() - |
- overlay_view_rect.height() - |
- overlay_view_offset_.y()); |
- if (!overlay_view_->compositing_iosurface_->DrawIOSurface( |
- compositing_iosurface_context_, overlay_view_rect, |
- overlay_view_->ViewScaleFactor(), true)) { |
- GotAcceleratedCompositingError(); |
- return; |
- } |
- } |
- |
- SendPendingLatencyInfoToHost(); |
-} |
- |
void RenderWidgetHostViewMac::GotAcceleratedCompositingError() { |
LOG(ERROR) << "Encountered accelerated compositing error"; |
base::MessageLoop::current()->PostTask( |
@@ -1692,17 +1556,13 @@ void RenderWidgetHostViewMac::DestroyCompositingStateOnError() { |
if (compositing_iosurface_context_) |
compositing_iosurface_context_->PoisonContextAndSharegroup(); |
- DestroyCompositedIOSurfaceAndLayer(kDestroyContext); |
+ DestroyCompositedIOSurfaceAndLayer(); |
// Request that a new frame be generated and dirty the view. |
if (render_widget_host_) |
render_widget_host_->ScheduleComposite(); |
[cocoa_view_ setNeedsDisplay:YES]; |
- // Mark the last frame as not accelerated (so that the window is prepared for |
- // an underlay next time an accelerated frame comes in). |
- last_frame_was_accelerated_ = false; |
- |
// TODO(ccameron): It may be a good idea to request that the renderer recreate |
// its GL context as well, and fall back to software if this happens |
// repeatedly. |
@@ -1715,14 +1575,6 @@ void RenderWidgetHostViewMac::SetOverlayView( |
overlay_view_ = overlay->overlay_view_weak_factory_.GetWeakPtr(); |
overlay_view_->underlay_view_ = overlay_view_weak_factory_.GetWeakPtr(); |
- if (use_core_animation_) |
- return; |
- |
- overlay_view_offset_ = offset; |
- overlay_view_->underlay_view_has_drawn_ = false; |
- |
- [cocoa_view_ setNeedsDisplay:YES]; |
- [[cocoa_view_ window] disableScreenUpdatesUntilFlush]; |
} |
void RenderWidgetHostViewMac::RemoveOverlayView() { |
@@ -1730,11 +1582,6 @@ void RenderWidgetHostViewMac::RemoveOverlayView() { |
overlay_view_->underlay_view_.reset(); |
overlay_view_.reset(); |
} |
- if (use_core_animation_) |
- return; |
- |
- [cocoa_view_ setNeedsDisplay:YES]; |
- [[cocoa_view_ window] disableScreenUpdatesUntilFlush]; |
} |
bool RenderWidgetHostViewMac::GetLineBreakIndex( |
@@ -1910,21 +1757,20 @@ void RenderWidgetHostViewMac::AcceleratedSurfaceSuspend() { |
} |
void RenderWidgetHostViewMac::AcceleratedSurfaceRelease() { |
- DestroyCompositedIOSurfaceAndLayer(kDestroyContext); |
+ DestroyCompositedIOSurfaceAndLayer(); |
} |
bool RenderWidgetHostViewMac::HasAcceleratedSurface( |
const gfx::Size& desired_size) { |
- if (last_frame_was_accelerated_) { |
- return compositing_iosurface_ && |
- compositing_iosurface_->HasIOSurface() && |
+ if (compositing_iosurface_) { |
+ return compositing_iosurface_->HasIOSurface() && |
(desired_size.IsEmpty() || |
compositing_iosurface_->dip_io_surface_size() == desired_size); |
- } else { |
- return (software_frame_manager_->HasCurrentFrame() && |
- (desired_size.IsEmpty() || |
+ } |
+ if (software_frame_manager_->HasCurrentFrame()) { |
+ return (desired_size.IsEmpty() || |
software_frame_manager_->GetCurrentFrameSizeInDIP() == |
- desired_size)); |
+ desired_size); |
} |
return false; |
} |
@@ -1968,21 +1814,19 @@ void RenderWidgetHostViewMac::OnSwapCompositorFrame( |
// Add latency info to report when the frame finishes drawing. |
AddPendingLatencyInfo(frame->metadata.latency_info); |
- if (use_core_animation_) { |
- const void* pixels = software_frame_manager_->GetCurrentFramePixels(); |
- gfx::Size size_in_pixels = |
- software_frame_manager_->GetCurrentFrameSizeInPixels(); |
+ const void* pixels = software_frame_manager_->GetCurrentFramePixels(); |
+ gfx::Size size_in_pixels = |
+ software_frame_manager_->GetCurrentFrameSizeInPixels(); |
- EnsureSoftwareLayer(); |
- [software_layer_ setContentsToData:pixels |
- withRowBytes:4 * size_in_pixels.width() |
- withPixelSize:size_in_pixels |
- withScaleFactor:frame->metadata.device_scale_factor]; |
+ EnsureSoftwareLayer(); |
+ [software_layer_ setContentsToData:pixels |
+ withRowBytes:4 * size_in_pixels.width() |
+ withPixelSize:size_in_pixels |
+ withScaleFactor:frame->metadata.device_scale_factor]; |
- // Send latency information to the host immediately, as there will be no |
- // subsequent draw call in which to do so. |
- SendPendingLatencyInfoToHost(); |
- } |
+ // Send latency information to the host immediately, as there will be no |
+ // subsequent draw call in which to do so. |
+ SendPendingLatencyInfoToHost(); |
GotSoftwareFrame(); |
@@ -2115,19 +1959,10 @@ void RenderWidgetHostViewMac::ShutdownHost() { |
void RenderWidgetHostViewMac::GotAcceleratedFrame() { |
EnsureCompositedIOSurfaceLayer(); |
SendVSyncParametersToRenderer(); |
- if (!last_frame_was_accelerated_) { |
- last_frame_was_accelerated_ = true; |
- if (!use_core_animation_) { |
- // Need to wipe the software view with transparency to expose the GL |
- // underlay. Invalidate the whole window to do that. |
- [cocoa_view_ setNeedsDisplay:YES]; |
- } |
- |
- // Delete software backingstore and layer. |
- software_frame_manager_->DiscardCurrentFrame(); |
- DestroySoftwareLayer(); |
- } |
+ // Delete software backingstore and layer. |
+ software_frame_manager_->DiscardCurrentFrame(); |
+ DestroySoftwareLayer(); |
} |
void RenderWidgetHostViewMac::GotSoftwareFrame() { |
@@ -2143,34 +1978,9 @@ void RenderWidgetHostViewMac::GotSoftwareFrame() { |
// Draw the contents of the frame immediately. It is critical that this |
// happen before the frame be acked, otherwise the new frame will likely be |
// ready before the drawing is complete, thrashing the browser main thread. |
- if (use_core_animation_) { |
- [software_layer_ displayIfNeeded]; |
- } else { |
- [cocoa_view_ setNeedsDisplay:YES]; |
- [cocoa_view_ displayIfNeeded]; |
- } |
+ [software_layer_ displayIfNeeded]; |
- if (last_frame_was_accelerated_) { |
- last_frame_was_accelerated_ = false; |
- |
- // If overlapping views are allowed, then don't unbind the context |
- // from the view (that is, don't call clearDrawble -- just delete the |
- // texture and IOSurface). Rather, let it sit behind the software frame |
- // that will be put up in front. This will prevent transparent |
- // flashes. |
- // http://crbug.com/154531 |
- // Also note that it is necessary that clearDrawable be called if |
- // overlapping views are not allowed, e.g, for content shell. |
- // http://crbug.com/178408 |
- // Disable screen updates so that the changes of flashes is minimized. |
- // http://crbug.com/279472 |
- if (!use_core_animation_) |
- [[cocoa_view_ window] disableScreenUpdatesUntilFlush]; |
- if (allow_overlapping_views_) |
- DestroyCompositedIOSurfaceAndLayer(kLeaveContextBoundToView); |
- else |
- DestroyCompositedIOSurfaceAndLayer(kDestroyContext); |
- } |
+ DestroyCompositedIOSurfaceAndLayer(); |
} |
void RenderWidgetHostViewMac::SetActive(bool active) { |
@@ -2204,12 +2014,6 @@ void RenderWidgetHostViewMac::WindowFrameChanged() { |
render_widget_host_->GetRoutingID(), GetBoundsInRootWindow(), |
GetViewBounds())); |
} |
- |
- if (compositing_iosurface_ && !use_core_animation_) { |
- // This will migrate the context to the appropriate window. |
- if (!EnsureCompositedIOSurface()) |
- GotAcceleratedCompositingError(); |
- } |
} |
void RenderWidgetHostViewMac::ShowDefinitionForSelection() { |
@@ -2328,30 +2132,28 @@ void RenderWidgetHostViewMac::AddPendingLatencyInfo( |
// If a screenshot is being taken when using CoreAnimation, send a few extra |
// calls to setNeedsDisplay and wait for their resulting display calls, |
// before reporting that the frame has reached the screen. |
- if (use_core_animation_) { |
- bool should_defer = false; |
- for (size_t i = 0; i < latency_info.size(); i++) { |
- if (latency_info[i].FindLatency( |
- ui::WINDOW_SNAPSHOT_FRAME_NUMBER_COMPONENT, |
- render_widget_host_->GetLatencyComponentId(), |
- NULL)) { |
- should_defer = true; |
- } |
- } |
- if (should_defer) { |
- // Multiple pending screenshot requests will work, but if every frame |
- // requests a screenshot, then the delay will never expire. Assert this |
- // here to avoid this. |
- CHECK_EQ(pending_latency_info_delay_, 0u); |
- // Wait a fixed number of frames (calls to CALayer::display) before |
- // claiming that the screenshot has reached the screen. This number |
- // comes from taking the first number where tests didn't fail (six), |
- // and doubling it. |
- const uint32 kScreenshotLatencyDelayInFrames = 12; |
- pending_latency_info_delay_ = kScreenshotLatencyDelayInFrames; |
- TickPendingLatencyInfoDelay(); |
+ bool should_defer = false; |
+ for (size_t i = 0; i < latency_info.size(); i++) { |
+ if (latency_info[i].FindLatency( |
+ ui::WINDOW_SNAPSHOT_FRAME_NUMBER_COMPONENT, |
+ render_widget_host_->GetLatencyComponentId(), |
+ NULL)) { |
+ should_defer = true; |
} |
} |
+ if (should_defer) { |
+ // Multiple pending screenshot requests will work, but if every frame |
+ // requests a screenshot, then the delay will never expire. Assert this |
+ // here to avoid this. |
+ CHECK_EQ(pending_latency_info_delay_, 0u); |
+ // Wait a fixed number of frames (calls to CALayer::display) before |
+ // claiming that the screenshot has reached the screen. This number |
+ // comes from taking the first number where tests didn't fail (six), |
+ // and doubling it. |
+ const uint32 kScreenshotLatencyDelayInFrames = 12; |
+ pending_latency_info_delay_ = kScreenshotLatencyDelayInFrames; |
+ TickPendingLatencyInfoDelay(); |
+ } |
for (size_t i = 0; i < latency_info.size(); i++) { |
pending_latency_info_.push_back(latency_info[i]); |
@@ -2442,9 +2244,6 @@ void RenderWidgetHostViewMac::PauseForPendingResizeOrRepaintsAndDraw() { |
} |
void RenderWidgetHostViewMac::LayoutLayers() { |
- if (!use_core_animation_) |
- return; |
- |
if (browser_compositor_view_) { |
[browser_compositor_view_ layoutLayers]; |
return; |
@@ -2560,11 +2359,6 @@ void RenderWidgetHostViewMac::AcceleratedLayerDidDrawFrame(bool succeeded) { |
handlingGlobalFrameDidChange_ = NO; |
[[NSNotificationCenter defaultCenter] |
addObserver:self |
- selector:@selector(globalFrameDidChange:) |
- name:NSViewGlobalFrameDidChangeNotification |
- object:self]; |
- [[NSNotificationCenter defaultCenter] |
- addObserver:self |
selector:@selector(didChangeScreenParameters:) |
name:NSApplicationDidChangeScreenParametersNotification |
object:nil]; |
@@ -3199,11 +2993,6 @@ void RenderWidgetHostViewMac::AcceleratedLayerDidDrawFrame(bool succeeded) { |
- (void)viewWillMoveToWindow:(NSWindow*)newWindow { |
NSWindow* oldWindow = [self window]; |
- // We're messing with the window, so do this to ensure no flashes. This one |
- // prevents a flash when the current tab is closed. |
- if (!renderWidgetHostView_->use_core_animation_) |
- [oldWindow disableScreenUpdatesUntilFlush]; |
- |
NSNotificationCenter* notificationCenter = |
[NSNotificationCenter defaultCenter]; |
@@ -3268,19 +3057,6 @@ void RenderWidgetHostViewMac::AcceleratedLayerDidDrawFrame(bool succeeded) { |
afterDelay:0]; |
} |
-- (void)globalFrameDidChange:(NSNotification*)notification { |
- if (handlingGlobalFrameDidChange_) |
- return; |
- |
- handlingGlobalFrameDidChange_ = YES; |
- if (!renderWidgetHostView_->use_core_animation_ && |
- renderWidgetHostView_->compositing_iosurface_context_) { |
- [renderWidgetHostView_->compositing_iosurface_context_->nsgl_context() |
- update]; |
- } |
- handlingGlobalFrameDidChange_ = NO; |
-} |
- |
- (void)windowChangedGlobalFrame:(NSNotification*)notification { |
renderWidgetHostView_->UpdateScreenInfo( |
renderWidgetHostView_->GetNativeView()); |
@@ -3313,181 +3089,6 @@ void RenderWidgetHostViewMac::AcceleratedLayerDidDrawFrame(bool succeeded) { |
renderWidgetHostView_->PauseForPendingResizeOrRepaintsAndDraw(); |
} |
-// Fills with white the parts of the area to the right and bottom for |rect| |
-// that intersect |damagedRect|. |
-- (void)fillBottomRightRemainderOfRect:(gfx::Rect)rect |
- dirtyRect:(gfx::Rect)damagedRect |
- inContext:(CGContextRef)context { |
- if (damagedRect.right() > rect.right()) { |
- int x = std::max(rect.right(), damagedRect.x()); |
- int y = std::min(rect.bottom(), damagedRect.bottom()); |
- int width = damagedRect.right() - x; |
- int height = damagedRect.y() - y; |
- |
- // Extra fun to get around the fact that gfx::Rects can't have |
- // negative sizes. |
- if (width < 0) { |
- x += width; |
- width = -width; |
- } |
- if (height < 0) { |
- y += height; |
- height = -height; |
- } |
- |
- NSRect r = [self flipRectToNSRect:gfx::Rect(x, y, width, height)]; |
- CGContextSetFillColorWithColor(context, |
- CGColorGetConstantColor(kCGColorWhite)); |
- CGContextFillRect(context, NSRectToCGRect(r)); |
- } |
- if (damagedRect.bottom() > rect.bottom()) { |
- int x = damagedRect.x(); |
- int y = damagedRect.bottom(); |
- int width = damagedRect.right() - x; |
- int height = std::max(rect.bottom(), damagedRect.y()) - y; |
- |
- // Extra fun to get around the fact that gfx::Rects can't have |
- // negative sizes. |
- if (width < 0) { |
- x += width; |
- width = -width; |
- } |
- if (height < 0) { |
- y += height; |
- height = -height; |
- } |
- |
- NSRect r = [self flipRectToNSRect:gfx::Rect(x, y, width, height)]; |
- CGContextSetFillColorWithColor(context, |
- CGColorGetConstantColor(kCGColorWhite)); |
- CGContextFillRect(context, NSRectToCGRect(r)); |
- } |
-} |
- |
-- (void)drawRect:(NSRect)dirtyRect { |
- TRACE_EVENT0("browser", "RenderWidgetHostViewCocoa::drawRect"); |
- DCHECK(!renderWidgetHostView_->use_core_animation_); |
- |
- if (!renderWidgetHostView_->render_widget_host_) { |
- // When using CoreAnimation, this path is used to paint the contents area |
- // white before any frames come in. When layers to draw frames exist, this |
- // is not hit. |
- [[NSColor whiteColor] set]; |
- NSRectFill(dirtyRect); |
- return; |
- } |
- |
- const gfx::Rect damagedRect([self flipNSRectToRect:dirtyRect]); |
- |
- if (renderWidgetHostView_->last_frame_was_accelerated_ && |
- renderWidgetHostView_->compositing_iosurface_) { |
- if (renderWidgetHostView_->allow_overlapping_views_) { |
- // If overlapping views need to be allowed, punch a hole in the window |
- // to expose the GL underlay. |
- TRACE_EVENT2("gpu", "NSRectFill clear", "w", damagedRect.width(), |
- "h", damagedRect.height()); |
- // NSRectFill is extremely slow (15ms for a window on a fast MacPro), so |
- // this is only done when it's a real invalidation from window damage (not |
- // when a BuffersSwapped was received). Note that even a 1x1 NSRectFill |
- // can take many milliseconds sometimes (!) so this is skipped completely |
- // for drawRects that are triggered by BuffersSwapped messages. |
- [[NSColor clearColor] set]; |
- NSRectFill(dirtyRect); |
- } |
- |
- gfx::ScopedCGLSetCurrentContext scoped_set_current_context( |
- renderWidgetHostView_->compositing_iosurface_context_->cgl_context()); |
- renderWidgetHostView_->DrawIOSurfaceWithoutCoreAnimation(); |
- return; |
- } |
- |
- CGContextRef context = static_cast<CGContextRef>( |
- [[NSGraphicsContext currentContext] graphicsPort]); |
- [self drawWithDirtyRect:NSRectToCGRect(dirtyRect) |
- inContext:context]; |
-} |
- |
-- (void)drawWithDirtyRect:(CGRect)dirtyRect |
- inContext:(CGContextRef)context { |
- content::SoftwareFrameManager* software_frame_manager = |
- renderWidgetHostView_->software_frame_manager_.get(); |
- if (software_frame_manager->HasCurrentFrame()) { |
- // Note: All coordinates are in view units, not pixels. |
- gfx::Rect bitmapRect( |
- software_frame_manager->GetCurrentFrameSizeInDIP()); |
- |
- // Specify the proper y offset to ensure that the view is rooted to the |
- // upper left corner. This can be negative, if the window was resized |
- // smaller and the renderer hasn't yet repainted. |
- int yOffset = NSHeight([self bounds]) - bitmapRect.height(); |
- |
- NSRect nsDirtyRect = NSRectFromCGRect(dirtyRect); |
- const gfx::Rect damagedRect([self flipNSRectToRect:nsDirtyRect]); |
- |
- gfx::Rect paintRect = gfx::IntersectRects(bitmapRect, damagedRect); |
- if (!paintRect.IsEmpty()) { |
- gfx::Size sizeInPixels = |
- software_frame_manager->GetCurrentFrameSizeInPixels(); |
- base::ScopedCFTypeRef<CGDataProviderRef> dataProvider( |
- CGDataProviderCreateWithData( |
- NULL, |
- software_frame_manager->GetCurrentFramePixels(), |
- 4 * sizeInPixels.width() * sizeInPixels.height(), |
- NULL)); |
- base::ScopedCFTypeRef<CGImageRef> image( |
- CGImageCreate( |
- sizeInPixels.width(), |
- sizeInPixels.height(), |
- 8, |
- 32, |
- 4 * sizeInPixels.width(), |
- base::mac::GetSystemColorSpace(), |
- kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host, |
- dataProvider, |
- NULL, |
- false, |
- kCGRenderingIntentDefault)); |
- CGRect imageRect = bitmapRect.ToCGRect(); |
- imageRect.origin.y = yOffset; |
- CGContextDrawImage(context, imageRect, image); |
- } |
- |
- renderWidgetHostView_->SendPendingLatencyInfoToHost(); |
- |
- // Fill the remaining portion of the damagedRect with white |
- [self fillBottomRightRemainderOfRect:bitmapRect |
- dirtyRect:damagedRect |
- inContext:context]; |
- |
- if (!renderWidgetHostView_->whiteout_start_time_.is_null()) { |
- base::TimeDelta whiteout_duration = base::TimeTicks::Now() - |
- renderWidgetHostView_->whiteout_start_time_; |
- UMA_HISTOGRAM_TIMES("MPArch.RWHH_WhiteoutDuration", whiteout_duration); |
- |
- // Reset the start time to 0 so that we start recording again the next |
- // time the backing store is NULL... |
- renderWidgetHostView_->whiteout_start_time_ = base::TimeTicks(); |
- } |
- if (!renderWidgetHostView_->web_contents_switch_paint_time_.is_null()) { |
- base::TimeDelta web_contents_switch_paint_duration = |
- base::TimeTicks::Now() - |
- renderWidgetHostView_->web_contents_switch_paint_time_; |
- UMA_HISTOGRAM_TIMES("MPArch.RWH_TabSwitchPaintDuration", |
- web_contents_switch_paint_duration); |
- // Reset contents_switch_paint_time_ to 0 so future tab selections are |
- // recorded. |
- renderWidgetHostView_->web_contents_switch_paint_time_ = |
- base::TimeTicks(); |
- } |
- } else { |
- CGContextSetFillColorWithColor(context, |
- CGColorGetConstantColor(kCGColorWhite)); |
- CGContextFillRect(context, dirtyRect); |
- if (renderWidgetHostView_->whiteout_start_time_.is_null()) |
- renderWidgetHostView_->whiteout_start_time_ = base::TimeTicks::Now(); |
- } |
-} |
- |
- (BOOL)canBecomeKeyView { |
if (!renderWidgetHostView_->render_widget_host_) |
return NO; |
@@ -4417,9 +4018,7 @@ extern NSString *NSTextInputReplacementRangeAttributeName; |
} |
- (BOOL)isOpaque { |
- if (renderWidgetHostView_->use_core_animation_) |
- return YES; |
- return [super isOpaque]; |
+ return YES; |
} |
// "-webkit-app-region: drag | no-drag" is implemented on Mac by excluding |