Chromium Code Reviews| 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/browser/renderer_host/render_widget_host_view_mac.h" | 5 #include "content/browser/renderer_host/render_widget_host_view_mac.h" |
| 6 | 6 |
| 7 #import <objc/runtime.h> | 7 #import <objc/runtime.h> |
| 8 #include <QuartzCore/QuartzCore.h> | 8 #include <QuartzCore/QuartzCore.h> |
| 9 | 9 |
| 10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 122 windowDelegateProtocol, | 122 windowDelegateProtocol, |
| 123 @selector(windowDidChangeBackingProperties:), | 123 @selector(windowDidChangeBackingProperties:), |
| 124 NO, | 124 NO, |
| 125 YES); | 125 YES); |
| 126 | 126 |
| 127 // If the protocol does not contain the method, the returned method | 127 // If the protocol does not contain the method, the returned method |
| 128 // description is {NULL, NULL} | 128 // description is {NULL, NULL} |
| 129 return methodDescription.name != NULL || methodDescription.types != NULL; | 129 return methodDescription.name != NULL || methodDescription.types != NULL; |
| 130 } | 130 } |
| 131 | 131 |
| 132 static float ScaleFactor(NSView* view) { | 132 static float ScaleFactorForView(NSView* view) { |
| 133 return ui::GetImageScale(ui::GetScaleFactorForNativeView(view)); | 133 return ui::GetImageScale(ui::GetScaleFactorForNativeView(view)); |
| 134 } | 134 } |
| 135 | 135 |
| 136 // Private methods: | 136 // Private methods: |
| 137 @interface RenderWidgetHostViewCocoa () | 137 @interface RenderWidgetHostViewCocoa () |
| 138 @property(nonatomic, assign) NSRange selectedRange; | 138 @property(nonatomic, assign) NSRange selectedRange; |
| 139 @property(nonatomic, assign) NSRange markedRange; | 139 @property(nonatomic, assign) NSRange markedRange; |
| 140 | 140 |
| 141 + (BOOL)shouldAutohideCursorForEvent:(NSEvent*)event; | 141 + (BOOL)shouldAutohideCursorForEvent:(NSEvent*)event; |
| 142 - (id)initWithRenderWidgetHostViewMac:(RenderWidgetHostViewMac*)r; | 142 - (id)initWithRenderWidgetHostViewMac:(RenderWidgetHostViewMac*)r; |
| 143 - (void)gotUnhandledWheelEvent; | 143 - (void)gotUnhandledWheelEvent; |
| 144 - (void)scrollOffsetPinnedToLeft:(BOOL)left toRight:(BOOL)right; | 144 - (void)scrollOffsetPinnedToLeft:(BOOL)left toRight:(BOOL)right; |
| 145 - (void)setHasHorizontalScrollbar:(BOOL)has_horizontal_scrollbar; | 145 - (void)setHasHorizontalScrollbar:(BOOL)has_horizontal_scrollbar; |
| 146 - (void)keyEvent:(NSEvent*)theEvent wasKeyEquivalent:(BOOL)equiv; | 146 - (void)keyEvent:(NSEvent*)theEvent wasKeyEquivalent:(BOOL)equiv; |
| 147 - (void)windowDidChangeBackingProperties:(NSNotification*)notification; | 147 - (void)windowDidChangeBackingProperties:(NSNotification*)notification; |
| 148 - (void)windowChangedGlobalFrame:(NSNotification*)notification; | 148 - (void)windowChangedGlobalFrame:(NSNotification*)notification; |
| 149 - (void)drawBackingStore:(BackingStoreMac*)backingStore | 149 - (void)drawBackingStore:(BackingStoreMac*)backingStore |
| 150 dirtyRect:(CGRect)dirtyRect | 150 dirtyRect:(CGRect)dirtyRect |
| 151 inContext:(CGContextRef)context; | 151 inContext:(CGContextRef)context; |
| 152 - (void)updateSoftwareLayerScaleFactor; | |
| 153 - (void)checkForPluginImeCancellation; | 152 - (void)checkForPluginImeCancellation; |
| 154 - (void)updateTabBackingStoreScaleFactor; | 153 - (void)updateTabBackingStoreScaleFactor; |
| 155 - (void)setResponderDelegate: | 154 - (void)setResponderDelegate: |
| 156 (NSObject<RenderWidgetHostViewMacDelegate>*)delegate; | 155 (NSObject<RenderWidgetHostViewMacDelegate>*)delegate; |
| 157 @end | 156 @end |
| 158 | 157 |
| 159 // A window subclass that allows the fullscreen window to become main and gain | 158 // A window subclass that allows the fullscreen window to become main and gain |
| 160 // keyboard focus. This is only used for pepper flash. Normal fullscreen is | 159 // keyboard focus. This is only used for pepper flash. Normal fullscreen is |
| 161 // handled by the browser. | 160 // handled by the browser. |
| 162 @interface PepperFlashFullscreenWindow : UnderlayOpenGLHostingWindow | 161 @interface PepperFlashFullscreenWindow : UnderlayOpenGLHostingWindow |
| (...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 408 last_frame_was_accelerated_(false), | 407 last_frame_was_accelerated_(false), |
| 409 text_input_type_(ui::TEXT_INPUT_TYPE_NONE), | 408 text_input_type_(ui::TEXT_INPUT_TYPE_NONE), |
| 410 can_compose_inline_(true), | 409 can_compose_inline_(true), |
| 411 compositing_iosurface_layer_async_timer_( | 410 compositing_iosurface_layer_async_timer_( |
| 412 FROM_HERE, base::TimeDelta::FromMilliseconds(250), | 411 FROM_HERE, base::TimeDelta::FromMilliseconds(250), |
| 413 this, &RenderWidgetHostViewMac::TimerSinceGotAcceleratedFrameFired), | 412 this, &RenderWidgetHostViewMac::TimerSinceGotAcceleratedFrameFired), |
| 414 allow_overlapping_views_(false), | 413 allow_overlapping_views_(false), |
| 415 use_core_animation_(false), | 414 use_core_animation_(false), |
| 416 pending_latency_info_delay_(0), | 415 pending_latency_info_delay_(0), |
| 417 pending_latency_info_delay_weak_ptr_factory_(this), | 416 pending_latency_info_delay_weak_ptr_factory_(this), |
| 417 backing_store_scale_factor_(1), | |
| 418 is_loading_(false), | 418 is_loading_(false), |
| 419 weak_factory_(this), | 419 weak_factory_(this), |
| 420 fullscreen_parent_host_view_(NULL), | 420 fullscreen_parent_host_view_(NULL), |
| 421 underlay_view_has_drawn_(false), | 421 underlay_view_has_drawn_(false), |
| 422 overlay_view_weak_factory_(this), | 422 overlay_view_weak_factory_(this), |
| 423 software_frame_weak_ptr_factory_(this) { | 423 software_frame_weak_ptr_factory_(this) { |
| 424 software_frame_manager_.reset(new SoftwareFrameManager( | 424 software_frame_manager_.reset(new SoftwareFrameManager( |
| 425 software_frame_weak_ptr_factory_.GetWeakPtr())); | 425 software_frame_weak_ptr_factory_.GetWeakPtr())); |
| 426 // |cocoa_view_| owns us and we will be deleted when |cocoa_view_| | 426 // |cocoa_view_| owns us and we will be deleted when |cocoa_view_| |
| 427 // goes away. Since we autorelease it, our caller must put | 427 // goes away. Since we autorelease it, our caller must put |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 484 // not use explicit setView and clearDrawable calls. | 484 // not use explicit setView and clearDrawable calls. |
| 485 ClearBoundContextDrawable(); | 485 ClearBoundContextDrawable(); |
| 486 | 486 |
| 487 software_layer_.reset([[CALayer alloc] init]); | 487 software_layer_.reset([[CALayer alloc] init]); |
| 488 if (!software_layer_) | 488 if (!software_layer_) |
| 489 LOG(ERROR) << "Failed to create CALayer for software rendering"; | 489 LOG(ERROR) << "Failed to create CALayer for software rendering"; |
| 490 [software_layer_ setBackgroundColor:CGColorGetConstantColor(kCGColorWhite)]; | 490 [software_layer_ setBackgroundColor:CGColorGetConstantColor(kCGColorWhite)]; |
| 491 [software_layer_ setDelegate:cocoa_view_]; | 491 [software_layer_ setDelegate:cocoa_view_]; |
| 492 [software_layer_ setContentsGravity:kCAGravityTopLeft]; | 492 [software_layer_ setContentsGravity:kCAGravityTopLeft]; |
| 493 [software_layer_ setFrame:NSRectToCGRect([cocoa_view_ bounds])]; | 493 [software_layer_ setFrame:NSRectToCGRect([cocoa_view_ bounds])]; |
| 494 if ([software_layer_ respondsToSelector:@selector(setContentsScale:)]) | |
| 495 [software_layer_ setContentsScale:backing_store_scale_factor_]; | |
| 494 [software_layer_ setNeedsDisplay]; | 496 [software_layer_ setNeedsDisplay]; |
| 495 [cocoa_view_ updateSoftwareLayerScaleFactor]; | |
| 496 | 497 |
| 497 [cocoa_view_ setLayer:software_layer_]; | 498 [cocoa_view_ setLayer:software_layer_]; |
| 498 [cocoa_view_ setWantsLayer:YES]; | 499 [cocoa_view_ setWantsLayer:YES]; |
| 499 | |
| 500 if (compositing_iosurface_) { | |
|
ccameron
2014/02/19 00:52:05
This block was a remnant from when dynamically ena
| |
| 501 if (!CreateCompositedIOSurfaceLayer()) { | |
| 502 LOG(ERROR) << "Failed to create CALayer for existing IOSurface"; | |
| 503 GotAcceleratedCompositingError(); | |
| 504 return; | |
| 505 } | |
| 506 } | |
| 507 } | 500 } |
| 508 | 501 |
| 509 bool RenderWidgetHostViewMac::CreateCompositedIOSurface() { | 502 bool RenderWidgetHostViewMac::CreateCompositedIOSurface() { |
| 510 int current_window_number = use_core_animation_ ? | 503 int current_window_number = use_core_animation_ ? |
| 511 CompositingIOSurfaceContext::kOffscreenContextWindowNumber : | 504 CompositingIOSurfaceContext::kOffscreenContextWindowNumber : |
| 512 window_number(); | 505 window_number(); |
| 513 bool new_surface_needed = !compositing_iosurface_; | 506 bool new_surface_needed = !compositing_iosurface_; |
| 514 bool new_context_needed = | 507 bool new_context_needed = |
| 515 !compositing_iosurface_context_ || | 508 !compositing_iosurface_context_ || |
| 516 (compositing_iosurface_context_ && | 509 (compositing_iosurface_context_ && |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 544 if (!compositing_iosurface_) { | 537 if (!compositing_iosurface_) { |
| 545 LOG(ERROR) << "Failed to create CompositingIOSurface"; | 538 LOG(ERROR) << "Failed to create CompositingIOSurface"; |
| 546 return false; | 539 return false; |
| 547 } | 540 } |
| 548 } | 541 } |
| 549 | 542 |
| 550 return true; | 543 return true; |
| 551 } | 544 } |
| 552 | 545 |
| 553 bool RenderWidgetHostViewMac::CreateCompositedIOSurfaceLayer() { | 546 bool RenderWidgetHostViewMac::CreateCompositedIOSurfaceLayer() { |
| 554 CHECK(compositing_iosurface_context_ && compositing_iosurface_); | |
| 555 if (compositing_iosurface_layer_ || !use_core_animation_) | 547 if (compositing_iosurface_layer_ || !use_core_animation_) |
| 556 return true; | 548 return true; |
| 557 | 549 |
| 558 ScopedCAActionDisabler disabler; | 550 ScopedCAActionDisabler disabler; |
| 559 | 551 |
| 560 // Create the GL CoreAnimation layer. | 552 // Create the GL CoreAnimation layer. |
| 561 if (!compositing_iosurface_layer_) { | 553 if (!compositing_iosurface_layer_) { |
| 562 compositing_iosurface_layer_.reset([[CompositingIOSurfaceLayer alloc] | 554 compositing_iosurface_layer_.reset([[CompositingIOSurfaceLayer alloc] |
| 563 initWithRenderWidgetHostViewMac:this]); | 555 initWithRenderWidgetHostViewMac:this]); |
| 564 if (!compositing_iosurface_layer_) { | 556 if (!compositing_iosurface_layer_) { |
| 565 LOG(ERROR) << "Failed to create CALayer for IOSurface"; | 557 LOG(ERROR) << "Failed to create CALayer for IOSurface"; |
| 566 return false; | 558 return false; |
| 567 } | 559 } |
| 568 [software_layer_ addSublayer:compositing_iosurface_layer_]; | 560 [software_layer_ addSublayer:compositing_iosurface_layer_]; |
| 569 } | 561 } |
| 570 | 562 |
| 571 // Creating the CompositingIOSurfaceLayer may attempt to draw in setLayer, | 563 // Creating the CompositingIOSurfaceLayer may attempt to draw in setLayer, |
| 572 // which, if it fails, will promptly tear down everything that was just | 564 // which, if it fails, will promptly tear down everything that was just |
| 573 // created. If that happened, return failure. | 565 // created. If that happened, return failure. |
| 574 return compositing_iosurface_context_ && | 566 return compositing_iosurface_layer_; |
| 575 compositing_iosurface_ && | |
| 576 (compositing_iosurface_layer_ || !use_core_animation_); | |
| 577 } | 567 } |
| 578 | 568 |
| 579 void RenderWidgetHostViewMac::DestroyCompositedIOSurfaceAndLayer( | 569 void RenderWidgetHostViewMac::DestroyCompositedIOSurfaceAndLayer( |
| 580 DestroyContextBehavior destroy_context_behavior) { | 570 DestroyContextBehavior destroy_context_behavior) { |
| 581 // Any pending frames will not be displayed, so ack them now. | 571 // Any pending frames will not be displayed, so ack them now. |
| 582 SendPendingSwapAck(); | 572 SendPendingSwapAck(); |
| 583 | 573 |
| 584 ScopedCAActionDisabler disabler; | 574 ScopedCAActionDisabler disabler; |
| 585 | 575 |
| 586 compositing_iosurface_.reset(); | 576 compositing_iosurface_.reset(); |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 720 pepper_fullscreen_window_.reset(); | 710 pepper_fullscreen_window_.reset(); |
| 721 } | 711 } |
| 722 | 712 |
| 723 int RenderWidgetHostViewMac::window_number() const { | 713 int RenderWidgetHostViewMac::window_number() const { |
| 724 NSWindow* window = [cocoa_view_ window]; | 714 NSWindow* window = [cocoa_view_ window]; |
| 725 if (!window) | 715 if (!window) |
| 726 return -1; | 716 return -1; |
| 727 return [window windowNumber]; | 717 return [window windowNumber]; |
| 728 } | 718 } |
| 729 | 719 |
| 730 float RenderWidgetHostViewMac::scale_factor() const { | 720 float RenderWidgetHostViewMac::ViewScaleFactor() const { |
| 731 return ScaleFactor(cocoa_view_); | 721 return ScaleFactorForView(cocoa_view_); |
| 722 } | |
| 723 | |
| 724 void RenderWidgetHostViewMac::UpdateBackingStoreScaleFactor() { | |
| 725 if (!render_widget_host_) | |
| 726 return; | |
| 727 | |
| 728 float new_scale_factor = ScaleFactorForView(cocoa_view_); | |
| 729 if (new_scale_factor == backing_store_scale_factor_) | |
| 730 return; | |
| 731 backing_store_scale_factor_ = new_scale_factor; | |
| 732 | |
| 733 BackingStoreMac* backing_store = static_cast<BackingStoreMac*>( | |
| 734 render_widget_host_->GetBackingStore(false)); | |
| 735 if (backing_store) | |
| 736 backing_store->ScaleFactorChanged(backing_store_scale_factor_); | |
| 737 | |
| 738 ScopedCAActionDisabler disabler; | |
| 739 | |
| 740 if ([software_layer_ respondsToSelector:@selector(setContentsScale:)]) | |
| 741 [software_layer_ setContentsScale:backing_store_scale_factor_]; | |
| 742 | |
| 743 // Dynamically calling setContentsScale on a CAOpenGLLayer for which | |
| 744 // setAsynchronous is dynamically toggled can result in flashes of corrupt | |
| 745 // content. Work around this by replacing the entire layer when the scale | |
| 746 // factor changes. | |
| 747 if (compositing_iosurface_layer_) { | |
| 748 [compositing_iosurface_layer_ disableCompositing]; | |
| 749 compositing_iosurface_layer_.reset(); | |
| 750 CreateCompositedIOSurfaceLayer(); | |
| 751 } | |
| 752 | |
| 753 render_widget_host_->NotifyScreenInfoChanged(); | |
| 732 } | 754 } |
| 733 | 755 |
| 734 RenderWidgetHost* RenderWidgetHostViewMac::GetRenderWidgetHost() const { | 756 RenderWidgetHost* RenderWidgetHostViewMac::GetRenderWidgetHost() const { |
| 735 return render_widget_host_; | 757 return render_widget_host_; |
| 736 } | 758 } |
| 737 | 759 |
| 738 void RenderWidgetHostViewMac::WasShown() { | 760 void RenderWidgetHostViewMac::WasShown() { |
| 739 if (!render_widget_host_->is_hidden()) | 761 if (!render_widget_host_->is_hidden()) |
| 740 return; | 762 return; |
| 741 | 763 |
| (...skipping 396 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1138 web_event.type = WebInputEvent::MouseLeave; | 1160 web_event.type = WebInputEvent::MouseLeave; |
| 1139 ForwardMouseEvent(web_event); | 1161 ForwardMouseEvent(web_event); |
| 1140 } | 1162 } |
| 1141 | 1163 |
| 1142 bool RenderWidgetHostViewMac::IsPopup() const { | 1164 bool RenderWidgetHostViewMac::IsPopup() const { |
| 1143 return popup_type_ != blink::WebPopupTypeNone; | 1165 return popup_type_ != blink::WebPopupTypeNone; |
| 1144 } | 1166 } |
| 1145 | 1167 |
| 1146 BackingStore* RenderWidgetHostViewMac::AllocBackingStore( | 1168 BackingStore* RenderWidgetHostViewMac::AllocBackingStore( |
| 1147 const gfx::Size& size) { | 1169 const gfx::Size& size) { |
| 1148 float scale = ScaleFactor(cocoa_view_); | 1170 float scale = ScaleFactorForView(cocoa_view_); |
| 1149 return new BackingStoreMac(render_widget_host_, size, scale); | 1171 return new BackingStoreMac(render_widget_host_, size, scale); |
| 1150 } | 1172 } |
| 1151 | 1173 |
| 1152 void RenderWidgetHostViewMac::CopyFromCompositingSurface( | 1174 void RenderWidgetHostViewMac::CopyFromCompositingSurface( |
| 1153 const gfx::Rect& src_subrect, | 1175 const gfx::Rect& src_subrect, |
| 1154 const gfx::Size& dst_size, | 1176 const gfx::Size& dst_size, |
| 1155 const base::Callback<void(bool, const SkBitmap&)>& callback, | 1177 const base::Callback<void(bool, const SkBitmap&)>& callback, |
| 1156 const SkBitmap::Config config) { | 1178 const SkBitmap::Config config) { |
| 1157 if (config != SkBitmap::kARGB_8888_Config) { | 1179 if (config != SkBitmap::kARGB_8888_Config) { |
| 1158 NOTIMPLEMENTED(); | 1180 NOTIMPLEMENTED(); |
| 1159 callback.Run(false, SkBitmap()); | 1181 callback.Run(false, SkBitmap()); |
| 1160 } | 1182 } |
| 1161 base::ScopedClosureRunner scoped_callback_runner( | 1183 base::ScopedClosureRunner scoped_callback_runner( |
| 1162 base::Bind(callback, false, SkBitmap())); | 1184 base::Bind(callback, false, SkBitmap())); |
| 1163 float scale = ScaleFactor(cocoa_view_); | 1185 float scale = ScaleFactorForView(cocoa_view_); |
| 1164 gfx::Size dst_pixel_size = gfx::ToFlooredSize( | 1186 gfx::Size dst_pixel_size = gfx::ToFlooredSize( |
| 1165 gfx::ScaleSize(dst_size, scale)); | 1187 gfx::ScaleSize(dst_size, scale)); |
| 1166 if (compositing_iosurface_ && compositing_iosurface_->HasIOSurface()) { | 1188 if (compositing_iosurface_ && compositing_iosurface_->HasIOSurface()) { |
| 1167 ignore_result(scoped_callback_runner.Release()); | 1189 ignore_result(scoped_callback_runner.Release()); |
| 1168 compositing_iosurface_->CopyTo(GetScaledOpenGLPixelRect(src_subrect), | 1190 compositing_iosurface_->CopyTo(GetScaledOpenGLPixelRect(src_subrect), |
| 1169 dst_pixel_size, | 1191 dst_pixel_size, |
| 1170 callback); | 1192 callback); |
| 1171 } else if (software_frame_manager_->HasCurrentFrame()) { | 1193 } else if (software_frame_manager_->HasCurrentFrame()) { |
| 1172 gfx::Rect src_pixel_rect = gfx::ToEnclosingRect(gfx::ScaleRect( | 1194 gfx::Rect src_pixel_rect = gfx::ToEnclosingRect(gfx::ScaleRect( |
| 1173 src_subrect, | 1195 src_subrect, |
| (...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1461 // Un-bind the overlay view's OpenGL context, since its content will be | 1483 // Un-bind the overlay view's OpenGL context, since its content will be |
| 1462 // drawn by this context. Not doing this can result in corruption. | 1484 // drawn by this context. Not doing this can result in corruption. |
| 1463 // http://crbug.com/330701 | 1485 // http://crbug.com/330701 |
| 1464 overlay_view_->ClearBoundContextDrawable(); | 1486 overlay_view_->ClearBoundContextDrawable(); |
| 1465 } | 1487 } |
| 1466 [compositing_iosurface_context_->nsgl_context() setView:cocoa_view_]; | 1488 [compositing_iosurface_context_->nsgl_context() setView:cocoa_view_]; |
| 1467 | 1489 |
| 1468 gfx::Rect view_rect(NSRectToCGRect([cocoa_view_ frame])); | 1490 gfx::Rect view_rect(NSRectToCGRect([cocoa_view_ frame])); |
| 1469 if (!compositing_iosurface_->DrawIOSurface( | 1491 if (!compositing_iosurface_->DrawIOSurface( |
| 1470 compositing_iosurface_context_, view_rect, | 1492 compositing_iosurface_context_, view_rect, |
| 1471 scale_factor(), !has_overlay)) { | 1493 ViewScaleFactor(), !has_overlay)) { |
| 1472 return false; | 1494 return false; |
| 1473 } | 1495 } |
| 1474 | 1496 |
| 1475 if (has_overlay) { | 1497 if (has_overlay) { |
| 1476 overlay_view_->underlay_view_has_drawn_ = true; | 1498 overlay_view_->underlay_view_has_drawn_ = true; |
| 1477 gfx::Rect overlay_view_rect( | 1499 gfx::Rect overlay_view_rect( |
| 1478 NSRectToCGRect([overlay_view_->cocoa_view() frame])); | 1500 NSRectToCGRect([overlay_view_->cocoa_view() frame])); |
| 1479 overlay_view_rect.set_x(overlay_view_offset_.x()); | 1501 overlay_view_rect.set_x(overlay_view_offset_.x()); |
| 1480 overlay_view_rect.set_y(view_rect.height() - | 1502 overlay_view_rect.set_y(view_rect.height() - |
| 1481 overlay_view_rect.height() - | 1503 overlay_view_rect.height() - |
| 1482 overlay_view_offset_.y()); | 1504 overlay_view_offset_.y()); |
| 1483 if (!overlay_view_->compositing_iosurface_->DrawIOSurface( | 1505 if (!overlay_view_->compositing_iosurface_->DrawIOSurface( |
| 1484 compositing_iosurface_context_, overlay_view_rect, | 1506 compositing_iosurface_context_, overlay_view_rect, |
| 1485 overlay_view_->scale_factor(), true)) { | 1507 overlay_view_->ViewScaleFactor(), true)) { |
| 1486 return false; | 1508 return false; |
| 1487 } | 1509 } |
| 1488 } | 1510 } |
| 1489 | 1511 |
| 1490 SendPendingLatencyInfoToHost(); | 1512 SendPendingLatencyInfoToHost(); |
| 1491 SendPendingSwapAck(); | 1513 SendPendingSwapAck(); |
| 1492 return true; | 1514 return true; |
| 1493 } | 1515 } |
| 1494 | 1516 |
| 1495 void RenderWidgetHostViewMac::GotAcceleratedCompositingError() { | 1517 void RenderWidgetHostViewMac::GotAcceleratedCompositingError() { |
| (...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1861 void RenderWidgetHostViewMac::GotAcceleratedFrame() { | 1883 void RenderWidgetHostViewMac::GotAcceleratedFrame() { |
| 1862 // Update the host with VSync parametrs. | 1884 // Update the host with VSync parametrs. |
| 1863 base::TimeTicks timebase; | 1885 base::TimeTicks timebase; |
| 1864 base::TimeDelta interval; | 1886 base::TimeDelta interval; |
| 1865 if (compositing_iosurface_context_ && | 1887 if (compositing_iosurface_context_ && |
| 1866 compositing_iosurface_context_->display_link()->GetVSyncParameters( | 1888 compositing_iosurface_context_->display_link()->GetVSyncParameters( |
| 1867 &timebase, &interval)) { | 1889 &timebase, &interval)) { |
| 1868 render_widget_host_->UpdateVSyncParameters(timebase, interval); | 1890 render_widget_host_->UpdateVSyncParameters(timebase, interval); |
| 1869 } | 1891 } |
| 1870 | 1892 |
| 1871 // Update the scale factor of the layer to match the scale factor of the | |
| 1872 // IOSurface. | |
| 1873 [compositing_iosurface_layer_ updateScaleFactor]; | |
| 1874 | |
| 1875 if (!last_frame_was_accelerated_) { | 1893 if (!last_frame_was_accelerated_) { |
| 1876 last_frame_was_accelerated_ = true; | 1894 last_frame_was_accelerated_ = true; |
| 1877 | 1895 |
| 1878 if (!use_core_animation_) { | 1896 if (!use_core_animation_) { |
| 1879 // Need to wipe the software view with transparency to expose the GL | 1897 // Need to wipe the software view with transparency to expose the GL |
| 1880 // underlay. Invalidate the whole window to do that. | 1898 // underlay. Invalidate the whole window to do that. |
| 1881 [cocoa_view_ setNeedsDisplay:YES]; | 1899 [cocoa_view_ setNeedsDisplay:YES]; |
| 1882 } | 1900 } |
| 1883 | 1901 |
| 1884 // Delete software backingstore. | 1902 // Delete software backingstore. |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1995 void RenderWidgetHostViewMac::OnStartPluginIme() { | 2013 void RenderWidgetHostViewMac::OnStartPluginIme() { |
| 1996 [cocoa_view_ setPluginImeActive:YES]; | 2014 [cocoa_view_ setPluginImeActive:YES]; |
| 1997 } | 2015 } |
| 1998 | 2016 |
| 1999 gfx::Rect RenderWidgetHostViewMac::GetScaledOpenGLPixelRect( | 2017 gfx::Rect RenderWidgetHostViewMac::GetScaledOpenGLPixelRect( |
| 2000 const gfx::Rect& rect) { | 2018 const gfx::Rect& rect) { |
| 2001 gfx::Rect src_gl_subrect = rect; | 2019 gfx::Rect src_gl_subrect = rect; |
| 2002 src_gl_subrect.set_y(GetViewBounds().height() - rect.bottom()); | 2020 src_gl_subrect.set_y(GetViewBounds().height() - rect.bottom()); |
| 2003 | 2021 |
| 2004 return gfx::ToEnclosingRect(gfx::ScaleRect(src_gl_subrect, | 2022 return gfx::ToEnclosingRect(gfx::ScaleRect(src_gl_subrect, |
| 2005 scale_factor())); | 2023 ViewScaleFactor())); |
| 2006 } | 2024 } |
| 2007 | 2025 |
| 2008 void RenderWidgetHostViewMac::AddPendingLatencyInfo( | 2026 void RenderWidgetHostViewMac::AddPendingLatencyInfo( |
| 2009 const std::vector<ui::LatencyInfo>& latency_info) { | 2027 const std::vector<ui::LatencyInfo>& latency_info) { |
| 2010 // If a screenshot is being taken when using CoreAnimation, send a few extra | 2028 // If a screenshot is being taken when using CoreAnimation, send a few extra |
| 2011 // calls to setNeedsDisplay and wait for their resulting display calls, | 2029 // calls to setNeedsDisplay and wait for their resulting display calls, |
| 2012 // before reporting that the frame has reached the screen. | 2030 // before reporting that the frame has reached the screen. |
| 2013 if (use_core_animation_) { | 2031 if (use_core_animation_) { |
| 2014 bool should_defer = false; | 2032 bool should_defer = false; |
| 2015 for (size_t i = 0; i < latency_info.size(); i++) { | 2033 for (size_t i = 0; i < latency_info.size(); i++) { |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2102 - (id)initWithRenderWidgetHostViewMac:(RenderWidgetHostViewMac*)r { | 2120 - (id)initWithRenderWidgetHostViewMac:(RenderWidgetHostViewMac*)r { |
| 2103 self = [super initWithFrame:NSZeroRect]; | 2121 self = [super initWithFrame:NSZeroRect]; |
| 2104 if (self) { | 2122 if (self) { |
| 2105 self.acceptsTouchEvents = YES; | 2123 self.acceptsTouchEvents = YES; |
| 2106 editCommand_helper_.reset(new RenderWidgetHostViewMacEditCommandHelper); | 2124 editCommand_helper_.reset(new RenderWidgetHostViewMacEditCommandHelper); |
| 2107 editCommand_helper_->AddEditingSelectorsToClass([self class]); | 2125 editCommand_helper_->AddEditingSelectorsToClass([self class]); |
| 2108 | 2126 |
| 2109 renderWidgetHostView_.reset(r); | 2127 renderWidgetHostView_.reset(r); |
| 2110 canBeKeyView_ = YES; | 2128 canBeKeyView_ = YES; |
| 2111 focusedPluginIdentifier_ = -1; | 2129 focusedPluginIdentifier_ = -1; |
| 2112 deviceScaleFactor_ = ScaleFactor(self); | 2130 renderWidgetHostView_->backing_store_scale_factor_ = |
| 2131 ScaleFactorForView(self); | |
| 2113 | 2132 |
| 2114 // OpenGL support: | 2133 // OpenGL support: |
| 2115 if ([self respondsToSelector: | 2134 if ([self respondsToSelector: |
| 2116 @selector(setWantsBestResolutionOpenGLSurface:)]) { | 2135 @selector(setWantsBestResolutionOpenGLSurface:)]) { |
| 2117 [self setWantsBestResolutionOpenGLSurface:YES]; | 2136 [self setWantsBestResolutionOpenGLSurface:YES]; |
| 2118 } | 2137 } |
| 2119 handlingGlobalFrameDidChange_ = NO; | 2138 handlingGlobalFrameDidChange_ = NO; |
| 2120 [[NSNotificationCenter defaultCenter] | 2139 [[NSNotificationCenter defaultCenter] |
| 2121 addObserver:self | 2140 addObserver:self |
| 2122 selector:@selector(globalFrameDidChange:) | 2141 selector:@selector(globalFrameDidChange:) |
| (...skipping 641 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2764 object:newWindow]; | 2783 object:newWindow]; |
| 2765 [notificationCenter | 2784 [notificationCenter |
| 2766 addObserver:self | 2785 addObserver:self |
| 2767 selector:@selector(windowChangedGlobalFrame:) | 2786 selector:@selector(windowChangedGlobalFrame:) |
| 2768 name:NSWindowDidEndLiveResizeNotification | 2787 name:NSWindowDidEndLiveResizeNotification |
| 2769 object:newWindow]; | 2788 object:newWindow]; |
| 2770 } | 2789 } |
| 2771 } | 2790 } |
| 2772 | 2791 |
| 2773 - (void)updateTabBackingStoreScaleFactor { | 2792 - (void)updateTabBackingStoreScaleFactor { |
| 2774 if (!renderWidgetHostView_->render_widget_host_) | 2793 renderWidgetHostView_->UpdateBackingStoreScaleFactor(); |
| 2775 return; | |
| 2776 | |
| 2777 float scaleFactor = ScaleFactor(self); | |
| 2778 if (scaleFactor == deviceScaleFactor_) | |
| 2779 return; | |
| 2780 deviceScaleFactor_ = scaleFactor; | |
| 2781 | |
| 2782 BackingStoreMac* backingStore = static_cast<BackingStoreMac*>( | |
| 2783 renderWidgetHostView_->render_widget_host_->GetBackingStore(false)); | |
| 2784 if (backingStore) // NULL in hardware path. | |
| 2785 backingStore->ScaleFactorChanged(scaleFactor); | |
| 2786 | |
| 2787 [self updateSoftwareLayerScaleFactor]; | |
| 2788 renderWidgetHostView_->render_widget_host_->NotifyScreenInfoChanged(); | |
| 2789 } | 2794 } |
| 2790 | 2795 |
| 2791 // http://developer.apple.com/library/mac/#documentation/GraphicsAnimation/Conce ptual/HighResolutionOSX/CapturingScreenContents/CapturingScreenContents.html#//a pple_ref/doc/uid/TP40012302-CH10-SW4 | 2796 // http://developer.apple.com/library/mac/#documentation/GraphicsAnimation/Conce ptual/HighResolutionOSX/CapturingScreenContents/CapturingScreenContents.html#//a pple_ref/doc/uid/TP40012302-CH10-SW4 |
| 2792 - (void)windowDidChangeBackingProperties:(NSNotification*)notification { | 2797 - (void)windowDidChangeBackingProperties:(NSNotification*)notification { |
| 2793 NSWindow* window = (NSWindow*)[notification object]; | 2798 NSWindow* window = (NSWindow*)[notification object]; |
| 2794 | 2799 |
| 2795 CGFloat newBackingScaleFactor = [window backingScaleFactor]; | 2800 CGFloat newBackingScaleFactor = [window backingScaleFactor]; |
| 2796 CGFloat oldBackingScaleFactor = [base::mac::ObjCCast<NSNumber>( | 2801 CGFloat oldBackingScaleFactor = [base::mac::ObjCCast<NSNumber>( |
| 2797 [[notification userInfo] objectForKey:NSBackingPropertyOldScaleFactorKey]) | 2802 [[notification userInfo] objectForKey:NSBackingPropertyOldScaleFactorKey]) |
| 2798 doubleValue]; | 2803 doubleValue]; |
| (...skipping 1247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4046 return; | 4051 return; |
| 4047 | 4052 |
| 4048 currentCursor_.reset([cursor retain]); | 4053 currentCursor_.reset([cursor retain]); |
| 4049 [[self window] invalidateCursorRectsForView:self]; | 4054 [[self window] invalidateCursorRectsForView:self]; |
| 4050 } | 4055 } |
| 4051 | 4056 |
| 4052 - (void)popupWindowWillClose:(NSNotification *)notification { | 4057 - (void)popupWindowWillClose:(NSNotification *)notification { |
| 4053 renderWidgetHostView_->KillSelf(); | 4058 renderWidgetHostView_->KillSelf(); |
| 4054 } | 4059 } |
| 4055 | 4060 |
| 4056 - (void)updateSoftwareLayerScaleFactor { | |
| 4057 if (![renderWidgetHostView_->software_layer_ | |
| 4058 respondsToSelector:@selector(setContentsScale:)]) | |
| 4059 return; | |
| 4060 | |
| 4061 ScopedCAActionDisabler disabler; | |
| 4062 [renderWidgetHostView_->software_layer_ setContentsScale:deviceScaleFactor_]; | |
| 4063 } | |
| 4064 | |
| 4065 // Delegate methods for the software CALayer | 4061 // Delegate methods for the software CALayer |
| 4066 - (void)drawLayer:(CALayer*)layer | 4062 - (void)drawLayer:(CALayer*)layer |
| 4067 inContext:(CGContextRef)context { | 4063 inContext:(CGContextRef)context { |
| 4068 TRACE_EVENT0("browser", "CompositingIOSurfaceLayer::drawLayer"); | 4064 TRACE_EVENT0("browser", "CompositingIOSurfaceLayer::drawLayer"); |
| 4069 | 4065 |
| 4070 DCHECK(renderWidgetHostView_->use_core_animation_); | 4066 DCHECK(renderWidgetHostView_->use_core_animation_); |
| 4071 DCHECK([layer isEqual:renderWidgetHostView_->software_layer_]); | 4067 DCHECK([layer isEqual:renderWidgetHostView_->software_layer_]); |
| 4072 | 4068 |
| 4073 CGRect clipRect = CGContextGetClipBoundingBox(context); | 4069 CGRect clipRect = CGContextGetClipBoundingBox(context); |
| 4074 | 4070 |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4131 return YES; | 4127 return YES; |
| 4132 } | 4128 } |
| 4133 | 4129 |
| 4134 - (BOOL)isOpaque { | 4130 - (BOOL)isOpaque { |
| 4135 if (renderWidgetHostView_->use_core_animation_) | 4131 if (renderWidgetHostView_->use_core_animation_) |
| 4136 return YES; | 4132 return YES; |
| 4137 return [super isOpaque]; | 4133 return [super isOpaque]; |
| 4138 } | 4134 } |
| 4139 | 4135 |
| 4140 @end | 4136 @end |
| OLD | NEW |