| 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 #include <QuartzCore/QuartzCore.h> | 7 #include <QuartzCore/QuartzCore.h> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
| 11 #include "base/command_line.h" |
| 11 #include "base/debug/crash_logging.h" | 12 #include "base/debug/crash_logging.h" |
| 12 #include "base/debug/trace_event.h" | 13 #include "base/debug/trace_event.h" |
| 13 #include "base/logging.h" | 14 #include "base/logging.h" |
| 14 #include "base/mac/mac_util.h" | 15 #include "base/mac/mac_util.h" |
| 15 #include "base/mac/scoped_cftyperef.h" | 16 #include "base/mac/scoped_cftyperef.h" |
| 17 #include "base/mac/sdk_forward_declarations.h" |
| 16 #import "base/memory/scoped_nsobject.h" | 18 #import "base/memory/scoped_nsobject.h" |
| 17 #include "base/message_loop.h" | 19 #include "base/message_loop.h" |
| 18 #include "base/metrics/histogram.h" | 20 #include "base/metrics/histogram.h" |
| 19 #include "base/string_util.h" | 21 #include "base/string_util.h" |
| 20 #include "base/stringprintf.h" | 22 #include "base/stringprintf.h" |
| 21 #include "base/strings/sys_string_conversions.h" | 23 #include "base/strings/sys_string_conversions.h" |
| 22 #include "base/sys_info.h" | 24 #include "base/sys_info.h" |
| 23 #include "base/utf_string_conversions.h" | 25 #include "base/utf_string_conversions.h" |
| 24 #import "content/browser/accessibility/browser_accessibility_cocoa.h" | 26 #import "content/browser/accessibility/browser_accessibility_cocoa.h" |
| 25 #include "content/browser/accessibility/browser_accessibility_manager_mac.h" | 27 #include "content/browser/accessibility/browser_accessibility_manager_mac.h" |
| 26 #include "content/browser/renderer_host/backing_store_mac.h" | 28 #include "content/browser/renderer_host/backing_store_mac.h" |
| 27 #include "content/browser/renderer_host/backing_store_manager.h" | 29 #include "content/browser/renderer_host/backing_store_manager.h" |
| 30 #include "content/browser/renderer_host/compositing_iosurface_context_mac.h" |
| 31 #include "content/browser/renderer_host/compositing_iosurface_layer_mac.h" |
| 28 #include "content/browser/renderer_host/compositing_iosurface_mac.h" | 32 #include "content/browser/renderer_host/compositing_iosurface_mac.h" |
| 29 #include "content/browser/renderer_host/render_view_host_impl.h" | 33 #include "content/browser/renderer_host/render_view_host_impl.h" |
| 30 #import "content/browser/renderer_host/render_widget_host_view_mac_editcommand_h
elper.h" | 34 #import "content/browser/renderer_host/render_widget_host_view_mac_editcommand_h
elper.h" |
| 31 #import "content/browser/renderer_host/text_input_client_mac.h" | 35 #import "content/browser/renderer_host/text_input_client_mac.h" |
| 32 #include "content/common/accessibility_messages.h" | 36 #include "content/common/accessibility_messages.h" |
| 33 #include "content/common/edit_command.h" | 37 #include "content/common/edit_command.h" |
| 34 #include "content/common/gpu/gpu_messages.h" | 38 #include "content/common/gpu/gpu_messages.h" |
| 35 #include "content/common/input_messages.h" | 39 #include "content/common/input_messages.h" |
| 36 #include "content/common/view_messages.h" | 40 #include "content/common/view_messages.h" |
| 37 #include "content/port/browser/render_widget_host_view_frame_subscriber.h" | 41 #include "content/port/browser/render_widget_host_view_frame_subscriber.h" |
| 38 #include "content/public/browser/browser_thread.h" | 42 #include "content/public/browser/browser_thread.h" |
| 39 #include "content/public/browser/native_web_keyboard_event.h" | 43 #include "content/public/browser/native_web_keyboard_event.h" |
| 40 #import "content/public/browser/render_widget_host_view_mac_delegate.h" | 44 #import "content/public/browser/render_widget_host_view_mac_delegate.h" |
| 45 #include "content/public/common/content_switches.h" |
| 41 #include "skia/ext/platform_canvas.h" | 46 #include "skia/ext/platform_canvas.h" |
| 42 #include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h" | 47 #include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h" |
| 43 #include "third_party/WebKit/Source/WebKit/chromium/public/WebScreenInfo.h" | 48 #include "third_party/WebKit/Source/WebKit/chromium/public/WebScreenInfo.h" |
| 44 #include "third_party/WebKit/Source/WebKit/chromium/public/mac/WebInputEventFact
ory.h" | 49 #include "third_party/WebKit/Source/WebKit/chromium/public/mac/WebInputEventFact
ory.h" |
| 45 #include "third_party/WebKit/Source/WebKit/chromium/public/mac/WebScreenInfoFact
ory.h" | 50 #include "third_party/WebKit/Source/WebKit/chromium/public/mac/WebScreenInfoFact
ory.h" |
| 46 #import "third_party/mozilla/ComplexTextInputPanel.h" | 51 #import "third_party/mozilla/ComplexTextInputPanel.h" |
| 52 #include "ui/base/cocoa/animation_utils.h" |
| 47 #import "ui/base/cocoa/fullscreen_window_manager.h" | 53 #import "ui/base/cocoa/fullscreen_window_manager.h" |
| 48 #import "ui/base/cocoa/underlay_opengl_hosting_window.h" | 54 #import "ui/base/cocoa/underlay_opengl_hosting_window.h" |
| 49 #include "ui/base/keycodes/keyboard_codes.h" | 55 #include "ui/base/keycodes/keyboard_codes.h" |
| 50 #include "ui/base/layout.h" | 56 #include "ui/base/layout.h" |
| 51 #include "ui/gfx/point.h" | 57 #include "ui/gfx/point.h" |
| 52 #include "ui/gfx/rect_conversions.h" | 58 #include "ui/gfx/rect_conversions.h" |
| 53 #include "ui/gfx/scoped_ns_graphics_context_save_gstate_mac.h" | 59 #include "ui/gfx/scoped_ns_graphics_context_save_gstate_mac.h" |
| 54 #include "ui/gfx/size_conversions.h" | 60 #include "ui/gfx/size_conversions.h" |
| 55 #include "ui/surface/io_surface_support_mac.h" | 61 #include "ui/surface/io_surface_support_mac.h" |
| 56 #include "webkit/plugins/npapi/webplugin.h" | 62 #include "webkit/plugins/npapi/webplugin.h" |
| (...skipping 16 matching lines...) Expand all Loading... |
| 73 // These are not documented, so use only after checking -respondsToSelector:. | 79 // These are not documented, so use only after checking -respondsToSelector:. |
| 74 @interface NSApplication (UndocumentedSpeechMethods) | 80 @interface NSApplication (UndocumentedSpeechMethods) |
| 75 - (void)speakString:(NSString*)string; | 81 - (void)speakString:(NSString*)string; |
| 76 - (void)stopSpeaking:(id)sender; | 82 - (void)stopSpeaking:(id)sender; |
| 77 - (BOOL)isSpeaking; | 83 - (BOOL)isSpeaking; |
| 78 @end | 84 @end |
| 79 | 85 |
| 80 // Declare things that are part of the 10.7 SDK. | 86 // Declare things that are part of the 10.7 SDK. |
| 81 #if !defined(MAC_OS_X_VERSION_10_7) || \ | 87 #if !defined(MAC_OS_X_VERSION_10_7) || \ |
| 82 MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7 | 88 MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7 |
| 83 enum { | |
| 84 NSEventPhaseNone = 0, // event not associated with a phase. | |
| 85 NSEventPhaseBegan = 0x1 << 0, | |
| 86 NSEventPhaseStationary = 0x1 << 1, | |
| 87 NSEventPhaseChanged = 0x1 << 2, | |
| 88 NSEventPhaseEnded = 0x1 << 3, | |
| 89 NSEventPhaseCancelled = 0x1 << 4, | |
| 90 }; | |
| 91 typedef NSUInteger NSEventPhase; | |
| 92 | 89 |
| 93 @interface NSEvent (LionAPI) | 90 @interface NSEvent (LionAPI) |
| 94 - (NSEventPhase)phase; | 91 - (NSEventPhase)phase; |
| 95 @end | 92 @end |
| 96 | 93 |
| 97 @interface NSWindow (LionAPI) | 94 @interface NSWindow (LionAPI) |
| 98 - (CGFloat)backingScaleFactor; | 95 - (CGFloat)backingScaleFactor; |
| 99 @end | 96 @end |
| 100 | 97 |
| 101 @interface NSView (NSOpenGLSurfaceResolutionLionAPI) | 98 @interface NSView (NSOpenGLSurfaceResolutionLionAPI) |
| 102 - (void)setWantsBestResolutionOpenGLSurface:(BOOL)flag; | 99 - (void)setWantsBestResolutionOpenGLSurface:(BOOL)flag; |
| 103 @end | 100 @end |
| 104 | 101 |
| 105 static NSString* const NSWindowDidChangeBackingPropertiesNotification = | 102 static NSString* const NSWindowDidChangeBackingPropertiesNotification = |
| 106 @"NSWindowDidChangeBackingPropertiesNotification"; | 103 @"NSWindowDidChangeBackingPropertiesNotification"; |
| 107 static NSString* const NSBackingPropertyOldScaleFactorKey = | 104 static NSString* const NSBackingPropertyOldScaleFactorKey = |
| 108 @"NSBackingPropertyOldScaleFactorKey"; | 105 @"NSBackingPropertyOldScaleFactorKey"; |
| 109 // Note: Apple's example code (linked from the comment above | 106 // Note: Apple's example code (linked from the comment above |
| 110 // -windowDidChangeBackingProperties:) uses | 107 // -windowDidChangeBackingProperties:) uses |
| 111 // @"NSWindowBackingPropertiesChangeOldBackingScaleFactorKey", but that always | 108 // @"NSWindowBackingPropertiesChangeOldBackingScaleFactorKey", but that always |
| 112 // returns an old scale of 0. @"NSBackingPropertyOldScaleFactorKey" seems to | 109 // returns an old scale of 0. @"NSBackingPropertyOldScaleFactorKey" seems to |
| 113 // work in practice, and it's what's used in Apple's WebKit port | 110 // work in practice, and it's what's used in Apple's WebKit port |
| 114 // (WebKit/mac/WebView/WebView.mm). | 111 // (WebKit/mac/WebView/WebView.mm). |
| 115 | 112 |
| 116 #endif // 10.7 | 113 #endif // 10.7 |
| 117 | 114 |
| 118 | |
| 119 static inline int ToWebKitModifiers(NSUInteger flags) { | 115 static inline int ToWebKitModifiers(NSUInteger flags) { |
| 120 int modifiers = 0; | 116 int modifiers = 0; |
| 121 if (flags & NSControlKeyMask) modifiers |= WebInputEvent::ControlKey; | 117 if (flags & NSControlKeyMask) modifiers |= WebInputEvent::ControlKey; |
| 122 if (flags & NSShiftKeyMask) modifiers |= WebInputEvent::ShiftKey; | 118 if (flags & NSShiftKeyMask) modifiers |= WebInputEvent::ShiftKey; |
| 123 if (flags & NSAlternateKeyMask) modifiers |= WebInputEvent::AltKey; | 119 if (flags & NSAlternateKeyMask) modifiers |= WebInputEvent::AltKey; |
| 124 if (flags & NSCommandKeyMask) modifiers |= WebInputEvent::MetaKey; | 120 if (flags & NSCommandKeyMask) modifiers |= WebInputEvent::MetaKey; |
| 125 return modifiers; | 121 return modifiers; |
| 126 } | 122 } |
| 127 | 123 |
| 128 static float ScaleFactor(NSView* view) { | 124 static float ScaleFactor(NSView* view) { |
| 129 return ui::GetScaleFactorScale(ui::GetScaleFactorForNativeView(view)); | 125 return ui::GetScaleFactorScale(ui::GetScaleFactorForNativeView(view)); |
| 130 } | 126 } |
| 131 | 127 |
| 132 // Private methods: | 128 // Private methods: |
| 133 @interface RenderWidgetHostViewCocoa () | 129 @interface RenderWidgetHostViewCocoa () |
| 134 @property(nonatomic, assign) NSRange selectedRange; | 130 @property(nonatomic, assign) NSRange selectedRange; |
| 135 @property(nonatomic, assign) NSRange markedRange; | 131 @property(nonatomic, assign) NSRange markedRange; |
| 136 @property(nonatomic, assign) | 132 @property(nonatomic, assign) |
| 137 NSObject<RenderWidgetHostViewMacDelegate>* delegate; | 133 NSObject<RenderWidgetHostViewMacDelegate>* delegate; |
| 138 | 134 |
| 139 + (BOOL)shouldAutohideCursorForEvent:(NSEvent*)event; | 135 + (BOOL)shouldAutohideCursorForEvent:(NSEvent*)event; |
| 140 - (id)initWithRenderWidgetHostViewMac:(RenderWidgetHostViewMac*)r; | 136 - (id)initWithRenderWidgetHostViewMac:(RenderWidgetHostViewMac*)r; |
| 141 - (void)gotUnhandledWheelEvent; | 137 - (void)gotUnhandledWheelEvent; |
| 142 - (void)scrollOffsetPinnedToLeft:(BOOL)left toRight:(BOOL)right; | 138 - (void)scrollOffsetPinnedToLeft:(BOOL)left toRight:(BOOL)right; |
| 143 - (void)setHasHorizontalScrollbar:(BOOL)has_horizontal_scrollbar; | 139 - (void)setHasHorizontalScrollbar:(BOOL)has_horizontal_scrollbar; |
| 144 - (void)keyEvent:(NSEvent*)theEvent wasKeyEquivalent:(BOOL)equiv; | 140 - (void)keyEvent:(NSEvent*)theEvent wasKeyEquivalent:(BOOL)equiv; |
| 145 - (void)windowDidChangeBackingProperties:(NSNotification*)notification; | 141 - (void)windowDidChangeBackingProperties:(NSNotification*)notification; |
| 146 - (void)windowChangedGlobalFrame:(NSNotification*)notification; | 142 - (void)windowChangedGlobalFrame:(NSNotification*)notification; |
| 143 - (void)drawBackingStore:(BackingStoreMac*)backingStore |
| 144 dirtyRect:(CGRect)dirtyRect |
| 145 inContext:(CGContextRef)context; |
| 146 - (void)updateSoftwareLayerScaleFactor; |
| 147 - (void)checkForPluginImeCancellation; | 147 - (void)checkForPluginImeCancellation; |
| 148 - (void)updateTabBackingStoreScaleFactor; | 148 - (void)updateTabBackingStoreScaleFactor; |
| 149 - (NSRect)firstViewRectForCharacterRange:(NSRange)theRange | 149 - (NSRect)firstViewRectForCharacterRange:(NSRange)theRange |
| 150 actualRange:(NSRangePointer)actualRange; | 150 actualRange:(NSRangePointer)actualRange; |
| 151 @end | 151 @end |
| 152 | 152 |
| 153 // NSEvent subtype for scroll gestures events. | 153 // NSEvent subtype for scroll gestures events. |
| 154 static const short kIOHIDEventTypeScroll = 6; | 154 static const short kIOHIDEventTypeScroll = 6; |
| 155 | 155 |
| 156 // A window subclass that allows the fullscreen window to become main and gain | 156 // A window subclass that allows the fullscreen window to become main and gain |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 359 // RenderWidgetHostViewMac, public: | 359 // RenderWidgetHostViewMac, public: |
| 360 | 360 |
| 361 RenderWidgetHostViewMac::RenderWidgetHostViewMac(RenderWidgetHost* widget) | 361 RenderWidgetHostViewMac::RenderWidgetHostViewMac(RenderWidgetHost* widget) |
| 362 : render_widget_host_(RenderWidgetHostImpl::From(widget)), | 362 : render_widget_host_(RenderWidgetHostImpl::From(widget)), |
| 363 about_to_validate_and_paint_(false), | 363 about_to_validate_and_paint_(false), |
| 364 call_set_needs_display_in_rect_pending_(false), | 364 call_set_needs_display_in_rect_pending_(false), |
| 365 last_frame_was_accelerated_(false), | 365 last_frame_was_accelerated_(false), |
| 366 text_input_type_(ui::TEXT_INPUT_TYPE_NONE), | 366 text_input_type_(ui::TEXT_INPUT_TYPE_NONE), |
| 367 can_compose_inline_(true), | 367 can_compose_inline_(true), |
| 368 allow_overlapping_views_(false), | 368 allow_overlapping_views_(false), |
| 369 use_core_animation_(false), |
| 369 is_loading_(false), | 370 is_loading_(false), |
| 370 is_hidden_(false), | 371 is_hidden_(false), |
| 371 weak_factory_(this), | 372 weak_factory_(this), |
| 372 fullscreen_parent_host_view_(NULL) { | 373 fullscreen_parent_host_view_(NULL) { |
| 373 // |cocoa_view_| owns us and we will be deleted when |cocoa_view_| | 374 // |cocoa_view_| owns us and we will be deleted when |cocoa_view_| |
| 374 // goes away. Since we autorelease it, our caller must put | 375 // goes away. Since we autorelease it, our caller must put |
| 375 // |GetNativeView()| into the view hierarchy right after calling us. | 376 // |GetNativeView()| into the view hierarchy right after calling us. |
| 376 cocoa_view_ = [[[RenderWidgetHostViewCocoa alloc] | 377 cocoa_view_ = [[[RenderWidgetHostViewCocoa alloc] |
| 377 initWithRenderWidgetHostViewMac:this] autorelease]; | 378 initWithRenderWidgetHostViewMac:this] autorelease]; |
| 379 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kUseCoreAnimation)) |
| 380 EnableCoreAnimation(); |
| 378 render_widget_host_->SetView(this); | 381 render_widget_host_->SetView(this); |
| 379 } | 382 } |
| 380 | 383 |
| 381 RenderWidgetHostViewMac::~RenderWidgetHostViewMac() { | 384 RenderWidgetHostViewMac::~RenderWidgetHostViewMac() { |
| 382 AckPendingSwapBuffers(); | 385 AckPendingSwapBuffers(); |
| 383 UnlockMouse(); | 386 UnlockMouse(); |
| 387 |
| 388 // Make sure that the layer doesn't reach into the now-invalid object. |
| 389 compositing_iosurface_.reset(); |
| 390 if (compositing_iosurface_layer_) |
| 391 [compositing_iosurface_layer_ disableCompositing]; |
| 392 compositing_iosurface_layer_.reset(); |
| 393 |
| 384 // We are owned by RenderWidgetHostViewCocoa, so if we go away before the | 394 // We are owned by RenderWidgetHostViewCocoa, so if we go away before the |
| 385 // RenderWidgetHost does we need to tell it not to hold a stale pointer to | 395 // RenderWidgetHost does we need to tell it not to hold a stale pointer to |
| 386 // us. | 396 // us. |
| 387 if (render_widget_host_) | 397 if (render_widget_host_) |
| 388 render_widget_host_->SetView(NULL); | 398 render_widget_host_->SetView(NULL); |
| 389 } | 399 } |
| 390 | 400 |
| 391 void RenderWidgetHostViewMac::SetDelegate( | 401 void RenderWidgetHostViewMac::SetDelegate( |
| 392 NSObject<RenderWidgetHostViewMacDelegate>* delegate) { | 402 NSObject<RenderWidgetHostViewMacDelegate>* delegate) { |
| 393 [cocoa_view_ setDelegate:delegate]; | 403 [cocoa_view_ setDelegate:delegate]; |
| 394 } | 404 } |
| 395 | 405 |
| 396 void RenderWidgetHostViewMac::SetAllowOverlappingViews(bool overlapping) { | 406 void RenderWidgetHostViewMac::SetAllowOverlappingViews(bool overlapping) { |
| 407 if (use_core_animation_) |
| 408 return; |
| 397 if (allow_overlapping_views_ == overlapping) | 409 if (allow_overlapping_views_ == overlapping) |
| 398 return; | 410 return; |
| 399 allow_overlapping_views_ = overlapping; | 411 allow_overlapping_views_ = overlapping; |
| 400 [cocoa_view_ setNeedsDisplay:YES]; | 412 [cocoa_view_ setNeedsDisplay:YES]; |
| 401 [[cocoa_view_ window] disableScreenUpdatesUntilFlush]; | 413 [[cocoa_view_ window] disableScreenUpdatesUntilFlush]; |
| 402 } | 414 } |
| 403 | 415 |
| 404 /////////////////////////////////////////////////////////////////////////////// | 416 /////////////////////////////////////////////////////////////////////////////// |
| 405 // RenderWidgetHostViewMac, RenderWidgetHostView implementation: | 417 // RenderWidgetHostViewMac, RenderWidgetHostView implementation: |
| 406 | 418 |
| 419 void RenderWidgetHostViewMac::EnableCoreAnimation() { |
| 420 if (use_core_animation_) |
| 421 return; |
| 422 use_core_animation_ = true; |
| 423 |
| 424 software_layer_.reset([[CALayer alloc] init]); |
| 425 [software_layer_ setDelegate:cocoa_view_]; |
| 426 [software_layer_ setAutoresizingMask:kCALayerWidthSizable | |
| 427 kCALayerHeightSizable]; |
| 428 [software_layer_ setContentsGravity:kCAGravityTopLeft]; |
| 429 [cocoa_view_ updateSoftwareLayerScaleFactor]; |
| 430 [cocoa_view_ setLayer:software_layer_]; |
| 431 [cocoa_view_ setWantsLayer:YES]; |
| 432 } |
| 433 |
| 407 bool RenderWidgetHostViewMac::OnMessageReceived(const IPC::Message& message) { | 434 bool RenderWidgetHostViewMac::OnMessageReceived(const IPC::Message& message) { |
| 408 bool handled = true; | 435 bool handled = true; |
| 409 IPC_BEGIN_MESSAGE_MAP(RenderWidgetHostViewMac, message) | 436 IPC_BEGIN_MESSAGE_MAP(RenderWidgetHostViewMac, message) |
| 410 IPC_MESSAGE_HANDLER(ViewHostMsg_PluginFocusChanged, OnPluginFocusChanged) | 437 IPC_MESSAGE_HANDLER(ViewHostMsg_PluginFocusChanged, OnPluginFocusChanged) |
| 411 IPC_MESSAGE_HANDLER(ViewHostMsg_StartPluginIme, OnStartPluginIme) | 438 IPC_MESSAGE_HANDLER(ViewHostMsg_StartPluginIme, OnStartPluginIme) |
| 412 IPC_MESSAGE_UNHANDLED(handled = false) | 439 IPC_MESSAGE_UNHANDLED(handled = false) |
| 413 IPC_END_MESSAGE_MAP() | 440 IPC_END_MESSAGE_MAP() |
| 414 return handled; | 441 return handled; |
| 415 } | 442 } |
| 416 | 443 |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 509 pepper_fullscreen_window_.reset(); | 536 pepper_fullscreen_window_.reset(); |
| 510 } | 537 } |
| 511 | 538 |
| 512 int RenderWidgetHostViewMac::window_number() const { | 539 int RenderWidgetHostViewMac::window_number() const { |
| 513 NSWindow* window = [cocoa_view_ window]; | 540 NSWindow* window = [cocoa_view_ window]; |
| 514 if (!window) | 541 if (!window) |
| 515 return -1; | 542 return -1; |
| 516 return [window windowNumber]; | 543 return [window windowNumber]; |
| 517 } | 544 } |
| 518 | 545 |
| 546 float RenderWidgetHostViewMac::scale_factor() const { |
| 547 return ScaleFactor(cocoa_view_); |
| 548 } |
| 549 |
| 519 RenderWidgetHost* RenderWidgetHostViewMac::GetRenderWidgetHost() const { | 550 RenderWidgetHost* RenderWidgetHostViewMac::GetRenderWidgetHost() const { |
| 520 return render_widget_host_; | 551 return render_widget_host_; |
| 521 } | 552 } |
| 522 | 553 |
| 523 void RenderWidgetHostViewMac::WasShown() { | 554 void RenderWidgetHostViewMac::WasShown() { |
| 524 if (!is_hidden_) | 555 if (!is_hidden_) |
| 525 return; | 556 return; |
| 526 | 557 |
| 527 if (web_contents_switch_paint_time_.is_null()) | 558 if (web_contents_switch_paint_time_.is_null()) |
| 528 web_contents_switch_paint_time_ = base::TimeTicks::Now(); | 559 web_contents_switch_paint_time_ = base::TimeTicks::Now(); |
| 529 is_hidden_ = false; | 560 is_hidden_ = false; |
| 530 render_widget_host_->WasShown(); | 561 render_widget_host_->WasShown(); |
| 531 | 562 |
| 532 // We're messing with the window, so do this to ensure no flashes. | 563 // We're messing with the window, so do this to ensure no flashes. |
| 533 [[cocoa_view_ window] disableScreenUpdatesUntilFlush]; | 564 if (!use_core_animation_) |
| 565 [[cocoa_view_ window] disableScreenUpdatesUntilFlush]; |
| 566 |
| 567 if (compositing_iosurface_layer_) |
| 568 [compositing_iosurface_layer_ setNeedsDisplay]; |
| 534 } | 569 } |
| 535 | 570 |
| 536 void RenderWidgetHostViewMac::WasHidden() { | 571 void RenderWidgetHostViewMac::WasHidden() { |
| 537 if (is_hidden_) | 572 if (is_hidden_) |
| 538 return; | 573 return; |
| 539 | 574 |
| 540 // Send ACKs for any pending SwapBuffers (if any) since we won't be displaying | 575 // Send ACKs for any pending SwapBuffers (if any) since we won't be displaying |
| 541 // them and the GPU process is waiting. | 576 // them and the GPU process is waiting. |
| 542 AckPendingSwapBuffers(); | 577 AckPendingSwapBuffers(); |
| 543 | 578 |
| 544 // If we receive any more paint messages while we are hidden, we want to | 579 // If we receive any more paint messages while we are hidden, we want to |
| 545 // ignore them so we don't re-allocate the backing store. We will paint | 580 // ignore them so we don't re-allocate the backing store. We will paint |
| 546 // everything again when we become selected again. | 581 // everything again when we become selected again. |
| 547 is_hidden_ = true; | 582 is_hidden_ = true; |
| 548 | 583 |
| 549 // If we have a renderer, then inform it that we are being hidden so it can | 584 // If we have a renderer, then inform it that we are being hidden so it can |
| 550 // reduce its resource utilization. | 585 // reduce its resource utilization. |
| 551 render_widget_host_->WasHidden(); | 586 render_widget_host_->WasHidden(); |
| 552 | 587 |
| 553 // There can be a transparent flash as this view is removed and the next is | 588 // There can be a transparent flash as this view is removed and the next is |
| 554 // added, because of OSX windowing races between displaying the contents of | 589 // added, because of OSX windowing races between displaying the contents of |
| 555 // the NSView and its corresponding OpenGL context. | 590 // the NSView and its corresponding OpenGL context. |
| 556 // disableScreenUpdatesUntilFlush prevents the transparent flash by avoiding | 591 // disableScreenUpdatesUntilFlush prevents the transparent flash by avoiding |
| 557 // screen updates until the next tab draws. | 592 // screen updates until the next tab draws. |
| 558 [[cocoa_view_ window] disableScreenUpdatesUntilFlush]; | 593 if (!use_core_animation_) |
| 594 [[cocoa_view_ window] disableScreenUpdatesUntilFlush]; |
| 559 | 595 |
| 560 web_contents_switch_paint_time_ = base::TimeTicks(); | 596 web_contents_switch_paint_time_ = base::TimeTicks(); |
| 561 } | 597 } |
| 562 | 598 |
| 563 void RenderWidgetHostViewMac::SetSize(const gfx::Size& size) { | 599 void RenderWidgetHostViewMac::SetSize(const gfx::Size& size) { |
| 564 gfx::Rect rect = GetViewBounds(); | 600 gfx::Rect rect = GetViewBounds(); |
| 565 rect.set_size(size); | 601 rect.set_size(size); |
| 566 SetBounds(rect); | 602 SetBounds(rect); |
| 567 } | 603 } |
| 568 | 604 |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 640 UnlockMouse(); | 676 UnlockMouse(); |
| 641 [[cocoa_view_ window] makeFirstResponder:nil]; | 677 [[cocoa_view_ window] makeFirstResponder:nil]; |
| 642 } | 678 } |
| 643 | 679 |
| 644 bool RenderWidgetHostViewMac::HasFocus() const { | 680 bool RenderWidgetHostViewMac::HasFocus() const { |
| 645 return [[cocoa_view_ window] firstResponder] == cocoa_view_; | 681 return [[cocoa_view_ window] firstResponder] == cocoa_view_; |
| 646 } | 682 } |
| 647 | 683 |
| 648 bool RenderWidgetHostViewMac::IsSurfaceAvailableForCopy() const { | 684 bool RenderWidgetHostViewMac::IsSurfaceAvailableForCopy() const { |
| 649 return !!render_widget_host_->GetBackingStore(false) || | 685 return !!render_widget_host_->GetBackingStore(false) || |
| 650 (compositing_iosurface_.get() && compositing_iosurface_->HasIOSurface()); | 686 (compositing_iosurface_ && compositing_iosurface_->HasIOSurface()); |
| 651 } | 687 } |
| 652 | 688 |
| 653 void RenderWidgetHostViewMac::Show() { | 689 void RenderWidgetHostViewMac::Show() { |
| 654 [cocoa_view_ setHidden:NO]; | 690 [cocoa_view_ setHidden:NO]; |
| 655 | 691 |
| 656 WasShown(); | 692 WasShown(); |
| 657 } | 693 } |
| 658 | 694 |
| 659 void RenderWidgetHostViewMac::Hide() { | 695 void RenderWidgetHostViewMac::Hide() { |
| 660 [cocoa_view_ setHidden:YES]; | 696 [cocoa_view_ setHidden:YES]; |
| (...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 929 float scale = ScaleFactor(cocoa_view_); | 965 float scale = ScaleFactor(cocoa_view_); |
| 930 return new BackingStoreMac(render_widget_host_, size, scale); | 966 return new BackingStoreMac(render_widget_host_, size, scale); |
| 931 } | 967 } |
| 932 | 968 |
| 933 void RenderWidgetHostViewMac::CopyFromCompositingSurface( | 969 void RenderWidgetHostViewMac::CopyFromCompositingSurface( |
| 934 const gfx::Rect& src_subrect, | 970 const gfx::Rect& src_subrect, |
| 935 const gfx::Size& dst_size, | 971 const gfx::Size& dst_size, |
| 936 const base::Callback<void(bool, const SkBitmap&)>& callback) { | 972 const base::Callback<void(bool, const SkBitmap&)>& callback) { |
| 937 base::ScopedClosureRunner scoped_callback_runner( | 973 base::ScopedClosureRunner scoped_callback_runner( |
| 938 base::Bind(callback, false, SkBitmap())); | 974 base::Bind(callback, false, SkBitmap())); |
| 939 if (!compositing_iosurface_.get() || | 975 if (!compositing_iosurface_ || |
| 940 !compositing_iosurface_->HasIOSurface()) | 976 !compositing_iosurface_->HasIOSurface()) |
| 941 return; | 977 return; |
| 942 | 978 |
| 943 float scale = ScaleFactor(cocoa_view_); | 979 float scale = ScaleFactor(cocoa_view_); |
| 944 gfx::Size dst_pixel_size = gfx::ToFlooredSize( | 980 gfx::Size dst_pixel_size = gfx::ToFlooredSize( |
| 945 gfx::ScaleSize(dst_size, scale)); | 981 gfx::ScaleSize(dst_size, scale)); |
| 946 | 982 |
| 947 scoped_callback_runner.Release(); | 983 scoped_callback_runner.Release(); |
| 948 | 984 |
| 949 compositing_iosurface_->CopyTo(GetScaledOpenGLPixelRect(src_subrect), | 985 compositing_iosurface_->CopyTo(GetScaledOpenGLPixelRect(src_subrect), |
| 950 dst_pixel_size, | 986 dst_pixel_size, |
| 951 callback); | 987 callback); |
| 952 } | 988 } |
| 953 | 989 |
| 954 void RenderWidgetHostViewMac::CopyFromCompositingSurfaceToVideoFrame( | 990 void RenderWidgetHostViewMac::CopyFromCompositingSurfaceToVideoFrame( |
| 955 const gfx::Rect& src_subrect, | 991 const gfx::Rect& src_subrect, |
| 956 const scoped_refptr<media::VideoFrame>& target, | 992 const scoped_refptr<media::VideoFrame>& target, |
| 957 const base::Callback<void(bool)>& callback) { | 993 const base::Callback<void(bool)>& callback) { |
| 958 base::ScopedClosureRunner scoped_callback_runner(base::Bind(callback, false)); | 994 base::ScopedClosureRunner scoped_callback_runner(base::Bind(callback, false)); |
| 959 if (!render_widget_host_->is_accelerated_compositing_active() || | 995 if (!render_widget_host_->is_accelerated_compositing_active() || |
| 960 !compositing_iosurface_.get() || | 996 !compositing_iosurface_ || |
| 961 !compositing_iosurface_->HasIOSurface()) | 997 !compositing_iosurface_->HasIOSurface()) |
| 962 return; | 998 return; |
| 963 | 999 |
| 964 if (!target) { | 1000 if (!target) { |
| 965 NOTREACHED(); | 1001 NOTREACHED(); |
| 966 return; | 1002 return; |
| 967 } | 1003 } |
| 968 | 1004 |
| 969 if (target->format() != media::VideoFrame::YV12 && | 1005 if (target->format() != media::VideoFrame::YV12 && |
| 970 target->format() != media::VideoFrame::I420) { | 1006 target->format() != media::VideoFrame::I420) { |
| 971 NOTREACHED(); | 1007 NOTREACHED(); |
| 972 return; | 1008 return; |
| 973 } | 1009 } |
| 974 | 1010 |
| 975 if (src_subrect.IsEmpty()) | 1011 if (src_subrect.IsEmpty()) |
| 976 return; | 1012 return; |
| 977 | 1013 |
| 978 scoped_callback_runner.Release(); | 1014 scoped_callback_runner.Release(); |
| 979 compositing_iosurface_->CopyToVideoFrame( | 1015 compositing_iosurface_->CopyToVideoFrame( |
| 980 GetScaledOpenGLPixelRect(src_subrect), | 1016 GetScaledOpenGLPixelRect(src_subrect), |
| 981 target, | 1017 target, |
| 982 callback); | 1018 callback); |
| 983 } | 1019 } |
| 984 | 1020 |
| 985 bool RenderWidgetHostViewMac::CanCopyToVideoFrame() const { | 1021 bool RenderWidgetHostViewMac::CanCopyToVideoFrame() const { |
| 986 return (!render_widget_host_->GetBackingStore(false) && | 1022 return (!render_widget_host_->GetBackingStore(false) && |
| 987 render_widget_host_->is_accelerated_compositing_active() && | 1023 render_widget_host_->is_accelerated_compositing_active() && |
| 988 compositing_iosurface_.get() && | 1024 compositing_iosurface_ && |
| 989 compositing_iosurface_->HasIOSurface()); | 1025 compositing_iosurface_->HasIOSurface()); |
| 990 } | 1026 } |
| 991 | 1027 |
| 992 bool RenderWidgetHostViewMac::CanSubscribeFrame() const { | 1028 bool RenderWidgetHostViewMac::CanSubscribeFrame() const { |
| 993 return true; | 1029 return true; |
| 994 } | 1030 } |
| 995 | 1031 |
| 996 void RenderWidgetHostViewMac::BeginFrameSubscription( | 1032 void RenderWidgetHostViewMac::BeginFrameSubscription( |
| 997 scoped_ptr<RenderWidgetHostViewFrameSubscriber> subscriber) { | 1033 scoped_ptr<RenderWidgetHostViewFrameSubscriber> subscriber) { |
| 998 frame_subscriber_ = subscriber.Pass(); | 1034 frame_subscriber_ = subscriber.Pass(); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1043 const string16& text, int plugin_id) { | 1079 const string16& text, int plugin_id) { |
| 1044 if (render_widget_host_) { | 1080 if (render_widget_host_) { |
| 1045 render_widget_host_->Send(new ViewMsg_PluginImeCompositionCompleted( | 1081 render_widget_host_->Send(new ViewMsg_PluginImeCompositionCompleted( |
| 1046 render_widget_host_->GetRoutingID(), text, plugin_id)); | 1082 render_widget_host_->GetRoutingID(), text, plugin_id)); |
| 1047 } | 1083 } |
| 1048 } | 1084 } |
| 1049 | 1085 |
| 1050 bool RenderWidgetHostViewMac::CompositorSwapBuffers( | 1086 bool RenderWidgetHostViewMac::CompositorSwapBuffers( |
| 1051 uint64 surface_handle, | 1087 uint64 surface_handle, |
| 1052 const gfx::Size& size, | 1088 const gfx::Size& size, |
| 1053 float scale_factor, | 1089 float surface_scale_factor, |
| 1054 const ui::LatencyInfo& latency_info) { | 1090 const ui::LatencyInfo& latency_info) { |
| 1055 if (is_hidden_) | 1091 if (is_hidden_) |
| 1056 return true; | 1092 return true; |
| 1057 | 1093 |
| 1058 NSWindow* window = [cocoa_view_ window]; | 1094 NSWindow* window = [cocoa_view_ window]; |
| 1059 if (window_number() <= 0) { | 1095 if (window_number() <= 0) { |
| 1060 // There is no window to present so capturing during present won't work. | 1096 // There is no window to present so capturing during present won't work. |
| 1061 // We check if frame subscriber wants this frame and capture manually. | 1097 // We check if frame subscriber wants this frame and capture manually. |
| 1062 if (compositing_iosurface_.get() && frame_subscriber_) { | 1098 if (compositing_iosurface_ && frame_subscriber_) { |
| 1063 const base::Time present_time = base::Time::Now(); | 1099 const base::Time present_time = base::Time::Now(); |
| 1064 scoped_refptr<media::VideoFrame> frame; | 1100 scoped_refptr<media::VideoFrame> frame; |
| 1065 RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback callback; | 1101 RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback callback; |
| 1066 if (frame_subscriber_->ShouldCaptureFrame(present_time, | 1102 if (frame_subscriber_->ShouldCaptureFrame(present_time, |
| 1067 &frame, &callback)) { | 1103 &frame, &callback)) { |
| 1068 compositing_iosurface_->SetIOSurface( | 1104 compositing_iosurface_->SetIOSurface( |
| 1069 surface_handle, size, scale_factor, latency_info); | 1105 surface_handle, size, surface_scale_factor, latency_info); |
| 1070 compositing_iosurface_->CopyToVideoFrame( | 1106 compositing_iosurface_->CopyToVideoFrame( |
| 1071 gfx::Rect(size), frame, | 1107 gfx::Rect(size), frame, |
| 1072 base::Bind(callback, present_time)); | 1108 base::Bind(callback, present_time)); |
| 1073 return true; | 1109 return true; |
| 1074 } | 1110 } |
| 1075 } | 1111 } |
| 1076 | 1112 |
| 1077 // TODO(shess) If the view does not have a window, or the window | 1113 // TODO(shess) If the view does not have a window, or the window |
| 1078 // does not have backing, the IOSurface will log "invalid drawable" | 1114 // does not have backing, the IOSurface will log "invalid drawable" |
| 1079 // in -setView:. It is not clear how this code is reached with such | 1115 // in -setView:. It is not clear how this code is reached with such |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1090 object_getClassName([window delegate]), | 1126 object_getClassName([window delegate]), |
| 1091 object_getClassName([window windowController])); | 1127 object_getClassName([window windowController])); |
| 1092 base::debug::SetCrashKeyValue(kCrashKey, value); | 1128 base::debug::SetCrashKeyValue(kCrashKey, value); |
| 1093 } | 1129 } |
| 1094 | 1130 |
| 1095 return true; | 1131 return true; |
| 1096 } | 1132 } |
| 1097 | 1133 |
| 1098 bool should_post_notification = false; | 1134 bool should_post_notification = false; |
| 1099 if (!compositing_iosurface_) { | 1135 if (!compositing_iosurface_) { |
| 1100 compositing_iosurface_.reset( | 1136 if (use_core_animation_) { |
| 1101 CompositingIOSurfaceMac::Create(window_number())); | 1137 if (!compositing_iosurface_layer_) { |
| 1138 compositing_iosurface_layer_.reset([[CompositingIOSurfaceLayer alloc] |
| 1139 initWithRenderWidgetHostViewMac:this]); |
| 1140 } |
| 1141 if (!compositing_iosurface_layer_) { |
| 1142 LOG(WARNING) << "Failed to create CALayer for IOSurface"; |
| 1143 return true; |
| 1144 } |
| 1145 if (![compositing_iosurface_layer_ ensureContext]) { |
| 1146 LOG(WARNING) << "Failed to create context for IOSurface"; |
| 1147 return true; |
| 1148 } |
| 1149 compositing_iosurface_.reset(CompositingIOSurfaceMac::Create( |
| 1150 [compositing_iosurface_layer_ context])); |
| 1151 } else { |
| 1152 compositing_iosurface_.reset( |
| 1153 CompositingIOSurfaceMac::Create(window_number())); |
| 1154 } |
| 1102 should_post_notification = true; | 1155 should_post_notification = true; |
| 1103 } | 1156 } |
| 1104 | 1157 |
| 1105 if (!compositing_iosurface_) | 1158 if (!compositing_iosurface_) { |
| 1159 LOG(WARNING) << "Failed to create CompositingIOSurfaceMac"; |
| 1106 return true; | 1160 return true; |
| 1161 } |
| 1107 | 1162 |
| 1108 compositing_iosurface_->SetIOSurface( | 1163 compositing_iosurface_->SetIOSurface( |
| 1109 surface_handle, size, scale_factor, latency_info); | 1164 surface_handle, size, surface_scale_factor, latency_info); |
| 1165 |
| 1166 // TODO(ccameron): If we've failed to allocate the GL texture for the |
| 1167 // IOSurface, or basically anything else along the way, we'll just display |
| 1168 // a white out, potentially forever. Instead, kick the renderer back to |
| 1169 // software mode (like a context lost or a GPU process death). |
| 1110 | 1170 |
| 1111 GotAcceleratedFrame(); | 1171 GotAcceleratedFrame(); |
| 1112 | 1172 |
| 1113 gfx::Size window_size(NSSizeToCGSize([cocoa_view_ frame].size)); | 1173 gfx::Size window_size(NSSizeToCGSize([cocoa_view_ frame].size)); |
| 1114 if (window_size.IsEmpty()) { | 1174 if (window_size.IsEmpty()) { |
| 1115 // setNeedsDisplay will never display and we'll never ack if the window is | 1175 // setNeedsDisplay will never display and we'll never ack if the window is |
| 1116 // empty, so ack now and don't bother calling setNeedsDisplay below. | 1176 // empty, so ack now and don't bother calling setNeedsDisplay below. |
| 1117 return true; | 1177 return true; |
| 1118 } | 1178 } |
| 1119 | 1179 |
| 1120 // No need to draw the surface if we are inside a drawRect. It will be done | 1180 // No need to draw the surface if we are inside a drawRect. It will be done |
| 1121 // later. | 1181 // later. |
| 1122 if (!about_to_validate_and_paint_) { | 1182 if (!about_to_validate_and_paint_) { |
| 1123 CompositingIOSurfaceMac::SurfaceOrder order = allow_overlapping_views_ ? | 1183 if (use_core_animation_) { |
| 1124 CompositingIOSurfaceMac::SURFACE_ORDER_BELOW_WINDOW : | 1184 DCHECK(compositing_iosurface_layer_); |
| 1125 CompositingIOSurfaceMac::SURFACE_ORDER_ABOVE_WINDOW; | 1185 [compositing_iosurface_layer_ setNeedsDisplay]; |
| 1126 compositing_iosurface_->DrawIOSurface(cocoa_view_, | 1186 } else { |
| 1127 ScaleFactor(cocoa_view_), | 1187 compositing_iosurface_->DrawIOSurface(this); |
| 1128 window_number(), | 1188 } |
| 1129 order, | |
| 1130 frame_subscriber_.get()); | |
| 1131 } | 1189 } |
| 1132 | 1190 |
| 1133 if (should_post_notification && [[cocoa_view_ delegate] | 1191 if (should_post_notification && [[cocoa_view_ delegate] |
| 1134 respondsToSelector:@selector(compositingIOSurfaceCreated)]) { | 1192 respondsToSelector:@selector(compositingIOSurfaceCreated)]) { |
| 1135 [[cocoa_view_ delegate] compositingIOSurfaceCreated]; | 1193 [[cocoa_view_ delegate] compositingIOSurfaceCreated]; |
| 1136 } | 1194 } |
| 1137 | 1195 |
| 1196 // Don't ack the new frame until it is drawn. |
| 1197 if (use_core_animation_) |
| 1198 return false; |
| 1199 |
| 1138 return true; | 1200 return true; |
| 1139 } | 1201 } |
| 1140 | 1202 |
| 1141 void RenderWidgetHostViewMac::AckPendingSwapBuffers() { | 1203 void RenderWidgetHostViewMac::AckPendingSwapBuffers() { |
| 1142 TRACE_EVENT0("browser", "RenderWidgetHostViewMac::AckPendingSwapBuffers"); | 1204 TRACE_EVENT0("browser", "RenderWidgetHostViewMac::AckPendingSwapBuffers"); |
| 1143 while (!pending_swap_buffers_acks_.empty()) { | 1205 while (!pending_swap_buffers_acks_.empty()) { |
| 1144 if (pending_swap_buffers_acks_.front().first != 0) { | 1206 if (pending_swap_buffers_acks_.front().first != 0) { |
| 1145 AcceleratedSurfaceMsg_BufferPresented_Params ack_params; | 1207 AcceleratedSurfaceMsg_BufferPresented_Params ack_params; |
| 1146 ack_params.sync_point = 0; | 1208 ack_params.sync_point = 0; |
| 1147 if (compositing_iosurface_) | 1209 if (compositing_iosurface_) |
| (...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1340 AckPendingSwapBuffers(); | 1402 AckPendingSwapBuffers(); |
| 1341 } | 1403 } |
| 1342 | 1404 |
| 1343 void RenderWidgetHostViewMac::AcceleratedSurfaceSuspend() { | 1405 void RenderWidgetHostViewMac::AcceleratedSurfaceSuspend() { |
| 1344 if (compositing_iosurface_) | 1406 if (compositing_iosurface_) |
| 1345 compositing_iosurface_->UnrefIOSurface(); | 1407 compositing_iosurface_->UnrefIOSurface(); |
| 1346 } | 1408 } |
| 1347 | 1409 |
| 1348 void RenderWidgetHostViewMac::AcceleratedSurfaceRelease() { | 1410 void RenderWidgetHostViewMac::AcceleratedSurfaceRelease() { |
| 1349 compositing_iosurface_.reset(); | 1411 compositing_iosurface_.reset(); |
| 1412 if (compositing_iosurface_layer_) |
| 1413 [compositing_iosurface_layer_ disableCompositing]; |
| 1414 compositing_iosurface_layer_.reset(); |
| 1350 } | 1415 } |
| 1351 | 1416 |
| 1352 bool RenderWidgetHostViewMac::HasAcceleratedSurface( | 1417 bool RenderWidgetHostViewMac::HasAcceleratedSurface( |
| 1353 const gfx::Size& desired_size) { | 1418 const gfx::Size& desired_size) { |
| 1354 return last_frame_was_accelerated_ && | 1419 return last_frame_was_accelerated_ && |
| 1355 compositing_iosurface_.get() && | 1420 compositing_iosurface_ && |
| 1356 compositing_iosurface_->HasIOSurface() && | 1421 compositing_iosurface_->HasIOSurface() && |
| 1357 (desired_size.IsEmpty() || | 1422 (desired_size.IsEmpty() || |
| 1358 compositing_iosurface_->dip_io_surface_size() == desired_size); | 1423 compositing_iosurface_->dip_io_surface_size() == desired_size); |
| 1359 } | 1424 } |
| 1360 | 1425 |
| 1361 void RenderWidgetHostViewMac::AboutToWaitForBackingStoreMsg() { | 1426 void RenderWidgetHostViewMac::AboutToWaitForBackingStoreMsg() { |
| 1362 AckPendingSwapBuffers(); | 1427 AckPendingSwapBuffers(); |
| 1363 } | 1428 } |
| 1364 | 1429 |
| 1365 void RenderWidgetHostViewMac::OnAcceleratedCompositingStateChange() { | 1430 void RenderWidgetHostViewMac::OnAcceleratedCompositingStateChange() { |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1443 } | 1508 } |
| 1444 | 1509 |
| 1445 | 1510 |
| 1446 void RenderWidgetHostViewMac::ShutdownHost() { | 1511 void RenderWidgetHostViewMac::ShutdownHost() { |
| 1447 weak_factory_.InvalidateWeakPtrs(); | 1512 weak_factory_.InvalidateWeakPtrs(); |
| 1448 render_widget_host_->Shutdown(); | 1513 render_widget_host_->Shutdown(); |
| 1449 // Do not touch any members at this point, |this| has been deleted. | 1514 // Do not touch any members at this point, |this| has been deleted. |
| 1450 } | 1515 } |
| 1451 | 1516 |
| 1452 void RenderWidgetHostViewMac::GotAcceleratedFrame() { | 1517 void RenderWidgetHostViewMac::GotAcceleratedFrame() { |
| 1518 // Update the scale factor of the layer to match the scale factor of the |
| 1519 // IOSurface. |
| 1520 if (compositing_iosurface_layer_) |
| 1521 [compositing_iosurface_layer_ updateScaleFactor]; |
| 1522 |
| 1453 if (!last_frame_was_accelerated_) { | 1523 if (!last_frame_was_accelerated_) { |
| 1454 last_frame_was_accelerated_ = true; | 1524 last_frame_was_accelerated_ = true; |
| 1455 | 1525 |
| 1456 // Need to wipe the software view with transparency to expose the GL | 1526 if (!use_core_animation_) { |
| 1457 // underlay. Invalidate the whole window to do that. | 1527 // Need to wipe the software view with transparency to expose the GL |
| 1458 [cocoa_view_ setNeedsDisplay:YES]; | 1528 // underlay. Invalidate the whole window to do that. |
| 1529 [cocoa_view_ setNeedsDisplay:YES]; |
| 1530 } |
| 1459 | 1531 |
| 1460 // Delete software backingstore. | 1532 // Delete software backingstore. |
| 1461 BackingStoreManager::RemoveBackingStore(render_widget_host_); | 1533 BackingStoreManager::RemoveBackingStore(render_widget_host_); |
| 1462 } | 1534 } |
| 1463 } | 1535 } |
| 1464 | 1536 |
| 1465 void RenderWidgetHostViewMac::GotSoftwareFrame() { | 1537 void RenderWidgetHostViewMac::GotSoftwareFrame() { |
| 1466 if (last_frame_was_accelerated_) { | 1538 if (last_frame_was_accelerated_) { |
| 1467 last_frame_was_accelerated_ = false; | 1539 last_frame_was_accelerated_ = false; |
| 1468 | 1540 |
| 1469 AckPendingSwapBuffers(); | 1541 AckPendingSwapBuffers(); |
| 1470 | 1542 |
| 1471 // Forget IOSurface since we are drawing a software frame now. | 1543 // Forget IOSurface since we are drawing a software frame now. |
| 1472 if (compositing_iosurface_.get() && | 1544 if (use_core_animation_) { |
| 1473 compositing_iosurface_->HasIOSurface()) { | 1545 compositing_iosurface_.reset(); |
| 1474 compositing_iosurface_->ClearDrawable(); | 1546 if (compositing_iosurface_layer_) |
| 1547 [compositing_iosurface_layer_ disableCompositing]; |
| 1548 compositing_iosurface_layer_.reset(); |
| 1549 } |
| 1550 else { |
| 1551 if (compositing_iosurface_ && |
| 1552 compositing_iosurface_->HasIOSurface()) { |
| 1553 compositing_iosurface_->ClearDrawable(); |
| 1554 } |
| 1475 } | 1555 } |
| 1476 } | 1556 } |
| 1477 } | 1557 } |
| 1478 | 1558 |
| 1479 void RenderWidgetHostViewMac::SetActive(bool active) { | 1559 void RenderWidgetHostViewMac::SetActive(bool active) { |
| 1480 if (render_widget_host_) { | 1560 if (render_widget_host_) { |
| 1481 render_widget_host_->SetActive(active); | 1561 render_widget_host_->SetActive(active); |
| 1482 if (active) { | 1562 if (active) { |
| 1483 if (HasFocus()) | 1563 if (HasFocus()) |
| 1484 render_widget_host_->Focus(); | 1564 render_widget_host_->Focus(); |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1584 void RenderWidgetHostViewMac::OnStartPluginIme() { | 1664 void RenderWidgetHostViewMac::OnStartPluginIme() { |
| 1585 [cocoa_view_ setPluginImeActive:YES]; | 1665 [cocoa_view_ setPluginImeActive:YES]; |
| 1586 } | 1666 } |
| 1587 | 1667 |
| 1588 gfx::Rect RenderWidgetHostViewMac::GetScaledOpenGLPixelRect( | 1668 gfx::Rect RenderWidgetHostViewMac::GetScaledOpenGLPixelRect( |
| 1589 const gfx::Rect& rect) { | 1669 const gfx::Rect& rect) { |
| 1590 gfx::Rect src_gl_subrect = rect; | 1670 gfx::Rect src_gl_subrect = rect; |
| 1591 src_gl_subrect.set_y(GetViewBounds().height() - rect.bottom()); | 1671 src_gl_subrect.set_y(GetViewBounds().height() - rect.bottom()); |
| 1592 | 1672 |
| 1593 return gfx::ToEnclosingRect(gfx::ScaleRect(src_gl_subrect, | 1673 return gfx::ToEnclosingRect(gfx::ScaleRect(src_gl_subrect, |
| 1594 ScaleFactor(cocoa_view_))); | 1674 scale_factor())); |
| 1595 } | 1675 } |
| 1596 | 1676 |
| 1597 } // namespace content | 1677 } // namespace content |
| 1598 | 1678 |
| 1599 // RenderWidgetHostViewCocoa --------------------------------------------------- | 1679 // RenderWidgetHostViewCocoa --------------------------------------------------- |
| 1600 | 1680 |
| 1601 @implementation RenderWidgetHostViewCocoa | 1681 @implementation RenderWidgetHostViewCocoa |
| 1602 | 1682 |
| 1603 @synthesize selectedRange = selectedRange_; | 1683 @synthesize selectedRange = selectedRange_; |
| 1604 @synthesize suppressNextEscapeKeyUp = suppressNextEscapeKeyUp_; | 1684 @synthesize suppressNextEscapeKeyUp = suppressNextEscapeKeyUp_; |
| (...skipping 531 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2136 const WebMouseWheelEvent& webEvent = | 2216 const WebMouseWheelEvent& webEvent = |
| 2137 WebInputEventFactory::mouseWheelEvent(event, self); | 2217 WebInputEventFactory::mouseWheelEvent(event, self); |
| 2138 renderWidgetHostView_->render_widget_host_->ForwardWheelEvent(webEvent); | 2218 renderWidgetHostView_->render_widget_host_->ForwardWheelEvent(webEvent); |
| 2139 } | 2219 } |
| 2140 } | 2220 } |
| 2141 | 2221 |
| 2142 - (void)viewWillMoveToWindow:(NSWindow*)newWindow { | 2222 - (void)viewWillMoveToWindow:(NSWindow*)newWindow { |
| 2143 // We're messing with the window, so do this to ensure no flashes. This one | 2223 // We're messing with the window, so do this to ensure no flashes. This one |
| 2144 // prevents a flash when the current tab is closed. | 2224 // prevents a flash when the current tab is closed. |
| 2145 NSWindow* oldWindow = [self window]; | 2225 NSWindow* oldWindow = [self window]; |
| 2146 [oldWindow disableScreenUpdatesUntilFlush]; | 2226 |
| 2227 if (!renderWidgetHostView_->use_core_animation_) |
| 2228 [oldWindow disableScreenUpdatesUntilFlush]; |
| 2147 | 2229 |
| 2148 NSNotificationCenter* notificationCenter = | 2230 NSNotificationCenter* notificationCenter = |
| 2149 [NSNotificationCenter defaultCenter]; | 2231 [NSNotificationCenter defaultCenter]; |
| 2150 if (oldWindow) { | 2232 if (oldWindow) { |
| 2151 [notificationCenter | 2233 [notificationCenter |
| 2152 removeObserver:self | 2234 removeObserver:self |
| 2153 name:NSWindowDidChangeBackingPropertiesNotification | 2235 name:NSWindowDidChangeBackingPropertiesNotification |
| 2154 object:oldWindow]; | 2236 object:oldWindow]; |
| 2155 [notificationCenter | 2237 [notificationCenter |
| 2156 removeObserver:self | 2238 removeObserver:self |
| (...skipping 30 matching lines...) Expand all Loading... |
| 2187 float scaleFactor = ScaleFactor(self); | 2269 float scaleFactor = ScaleFactor(self); |
| 2188 if (scaleFactor == deviceScaleFactor_) | 2270 if (scaleFactor == deviceScaleFactor_) |
| 2189 return; | 2271 return; |
| 2190 deviceScaleFactor_ = scaleFactor; | 2272 deviceScaleFactor_ = scaleFactor; |
| 2191 | 2273 |
| 2192 BackingStoreMac* backingStore = static_cast<BackingStoreMac*>( | 2274 BackingStoreMac* backingStore = static_cast<BackingStoreMac*>( |
| 2193 renderWidgetHostView_->render_widget_host_->GetBackingStore(false)); | 2275 renderWidgetHostView_->render_widget_host_->GetBackingStore(false)); |
| 2194 if (backingStore) // NULL in hardware path. | 2276 if (backingStore) // NULL in hardware path. |
| 2195 backingStore->ScaleFactorChanged(scaleFactor); | 2277 backingStore->ScaleFactorChanged(scaleFactor); |
| 2196 | 2278 |
| 2279 [self updateSoftwareLayerScaleFactor]; |
| 2197 renderWidgetHostView_->render_widget_host_->NotifyScreenInfoChanged(); | 2280 renderWidgetHostView_->render_widget_host_->NotifyScreenInfoChanged(); |
| 2198 } | 2281 } |
| 2199 | 2282 |
| 2200 // http://developer.apple.com/library/mac/#documentation/GraphicsAnimation/Conce
ptual/HighResolutionOSX/CapturingScreenContents/CapturingScreenContents.html#//a
pple_ref/doc/uid/TP40012302-CH10-SW4 | 2283 // http://developer.apple.com/library/mac/#documentation/GraphicsAnimation/Conce
ptual/HighResolutionOSX/CapturingScreenContents/CapturingScreenContents.html#//a
pple_ref/doc/uid/TP40012302-CH10-SW4 |
| 2201 - (void)windowDidChangeBackingProperties:(NSNotification*)notification { | 2284 - (void)windowDidChangeBackingProperties:(NSNotification*)notification { |
| 2202 NSWindow* window = (NSWindow*)[notification object]; | 2285 NSWindow* window = (NSWindow*)[notification object]; |
| 2203 | 2286 |
| 2204 CGFloat newBackingScaleFactor = [window backingScaleFactor]; | 2287 CGFloat newBackingScaleFactor = [window backingScaleFactor]; |
| 2205 CGFloat oldBackingScaleFactor = [base::mac::ObjCCast<NSNumber>( | 2288 CGFloat oldBackingScaleFactor = [base::mac::ObjCCast<NSNumber>( |
| 2206 [[notification userInfo] objectForKey:NSBackingPropertyOldScaleFactorKey]) | 2289 [[notification userInfo] objectForKey:NSBackingPropertyOldScaleFactorKey]) |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2243 renderWidgetHostView_->render_widget_host_->WasResized(); | 2326 renderWidgetHostView_->render_widget_host_->WasResized(); |
| 2244 } | 2327 } |
| 2245 } | 2328 } |
| 2246 | 2329 |
| 2247 - (void)callSetNeedsDisplayInRect { | 2330 - (void)callSetNeedsDisplayInRect { |
| 2248 DCHECK([NSThread isMainThread]); | 2331 DCHECK([NSThread isMainThread]); |
| 2249 DCHECK(renderWidgetHostView_->call_set_needs_display_in_rect_pending_); | 2332 DCHECK(renderWidgetHostView_->call_set_needs_display_in_rect_pending_); |
| 2250 [self setNeedsDisplayInRect:renderWidgetHostView_->invalid_rect_]; | 2333 [self setNeedsDisplayInRect:renderWidgetHostView_->invalid_rect_]; |
| 2251 renderWidgetHostView_->call_set_needs_display_in_rect_pending_ = false; | 2334 renderWidgetHostView_->call_set_needs_display_in_rect_pending_ = false; |
| 2252 renderWidgetHostView_->invalid_rect_ = NSZeroRect; | 2335 renderWidgetHostView_->invalid_rect_ = NSZeroRect; |
| 2336 |
| 2337 if (renderWidgetHostView_->compositing_iosurface_layer_) |
| 2338 [renderWidgetHostView_->compositing_iosurface_layer_ setNeedsDisplay]; |
| 2253 } | 2339 } |
| 2254 | 2340 |
| 2255 // Fills with white the parts of the area to the right and bottom for |rect| | 2341 // Fills with white the parts of the area to the right and bottom for |rect| |
| 2256 // that intersect |damagedRect|. | 2342 // that intersect |damagedRect|. |
| 2257 - (void)fillBottomRightRemainderOfRect:(gfx::Rect)rect | 2343 - (void)fillBottomRightRemainderOfRect:(gfx::Rect)rect |
| 2258 dirtyRect:(gfx::Rect)damagedRect { | 2344 dirtyRect:(gfx::Rect)damagedRect |
| 2345 inContext:(CGContextRef)context { |
| 2259 if (damagedRect.right() > rect.right()) { | 2346 if (damagedRect.right() > rect.right()) { |
| 2260 int x = std::max(rect.right(), damagedRect.x()); | 2347 int x = std::max(rect.right(), damagedRect.x()); |
| 2261 int y = std::min(rect.bottom(), damagedRect.bottom()); | 2348 int y = std::min(rect.bottom(), damagedRect.bottom()); |
| 2262 int width = damagedRect.right() - x; | 2349 int width = damagedRect.right() - x; |
| 2263 int height = damagedRect.y() - y; | 2350 int height = damagedRect.y() - y; |
| 2264 | 2351 |
| 2265 // Extra fun to get around the fact that gfx::Rects can't have | 2352 // Extra fun to get around the fact that gfx::Rects can't have |
| 2266 // negative sizes. | 2353 // negative sizes. |
| 2267 if (width < 0) { | 2354 if (width < 0) { |
| 2268 x += width; | 2355 x += width; |
| 2269 width = -width; | 2356 width = -width; |
| 2270 } | 2357 } |
| 2271 if (height < 0) { | 2358 if (height < 0) { |
| 2272 y += height; | 2359 y += height; |
| 2273 height = -height; | 2360 height = -height; |
| 2274 } | 2361 } |
| 2275 | 2362 |
| 2276 NSRect r = [self flipRectToNSRect:gfx::Rect(x, y, width, height)]; | 2363 NSRect r = [self flipRectToNSRect:gfx::Rect(x, y, width, height)]; |
| 2277 [[NSColor whiteColor] set]; | 2364 CGContextSetFillColorWithColor(context, |
| 2278 NSRectFill(r); | 2365 CGColorGetConstantColor(kCGColorWhite)); |
| 2366 CGContextFillRect(context, NSRectToCGRect(r)); |
| 2279 } | 2367 } |
| 2280 if (damagedRect.bottom() > rect.bottom()) { | 2368 if (damagedRect.bottom() > rect.bottom()) { |
| 2281 int x = damagedRect.x(); | 2369 int x = damagedRect.x(); |
| 2282 int y = damagedRect.bottom(); | 2370 int y = damagedRect.bottom(); |
| 2283 int width = damagedRect.right() - x; | 2371 int width = damagedRect.right() - x; |
| 2284 int height = std::max(rect.bottom(), damagedRect.y()) - y; | 2372 int height = std::max(rect.bottom(), damagedRect.y()) - y; |
| 2285 | 2373 |
| 2286 // Extra fun to get around the fact that gfx::Rects can't have | 2374 // Extra fun to get around the fact that gfx::Rects can't have |
| 2287 // negative sizes. | 2375 // negative sizes. |
| 2288 if (width < 0) { | 2376 if (width < 0) { |
| 2289 x += width; | 2377 x += width; |
| 2290 width = -width; | 2378 width = -width; |
| 2291 } | 2379 } |
| 2292 if (height < 0) { | 2380 if (height < 0) { |
| 2293 y += height; | 2381 y += height; |
| 2294 height = -height; | 2382 height = -height; |
| 2295 } | 2383 } |
| 2296 | 2384 |
| 2297 NSRect r = [self flipRectToNSRect:gfx::Rect(x, y, width, height)]; | 2385 NSRect r = [self flipRectToNSRect:gfx::Rect(x, y, width, height)]; |
| 2298 [[NSColor whiteColor] set]; | 2386 CGContextSetFillColorWithColor(context, |
| 2299 NSRectFill(r); | 2387 CGColorGetConstantColor(kCGColorWhite)); |
| 2388 CGContextFillRect(context, NSRectToCGRect(r)); |
| 2300 } | 2389 } |
| 2301 } | 2390 } |
| 2302 | 2391 |
| 2303 - (void)drawRect:(NSRect)dirtyRect { | 2392 - (void)drawRect:(NSRect)dirtyRect { |
| 2304 TRACE_EVENT0("browser", "RenderWidgetHostViewCocoa::drawRect"); | 2393 TRACE_EVENT0("browser", "RenderWidgetHostViewCocoa::drawRect"); |
| 2394 DCHECK(!renderWidgetHostView_->use_core_animation_); |
| 2395 |
| 2305 if (!renderWidgetHostView_->render_widget_host_) { | 2396 if (!renderWidgetHostView_->render_widget_host_) { |
| 2306 // TODO(shess): Consider using something more noticable? | 2397 // TODO(shess): Consider using something more noticable? |
| 2307 [[NSColor whiteColor] set]; | 2398 [[NSColor whiteColor] set]; |
| 2308 NSRectFill(dirtyRect); | 2399 NSRectFill(dirtyRect); |
| 2309 return; | 2400 return; |
| 2310 } | 2401 } |
| 2311 | 2402 |
| 2312 DCHECK(!renderWidgetHostView_->about_to_validate_and_paint_); | 2403 DCHECK(!renderWidgetHostView_->about_to_validate_and_paint_); |
| 2313 | 2404 |
| 2314 // GetBackingStore works for both software and accelerated frames. If a | 2405 // GetBackingStore works for both software and accelerated frames. If a |
| 2315 // SwapBuffers occurs while GetBackingStore is blocking, we will continue to | 2406 // SwapBuffers occurs while GetBackingStore is blocking, we will continue to |
| 2316 // blit the IOSurface below. | 2407 // blit the IOSurface below. |
| 2317 renderWidgetHostView_->about_to_validate_and_paint_ = true; | 2408 renderWidgetHostView_->about_to_validate_and_paint_ = true; |
| 2318 BackingStoreMac* backingStore = static_cast<BackingStoreMac*>( | 2409 BackingStoreMac* backingStore = static_cast<BackingStoreMac*>( |
| 2319 renderWidgetHostView_->render_widget_host_->GetBackingStore(true)); | 2410 renderWidgetHostView_->render_widget_host_->GetBackingStore(true)); |
| 2320 renderWidgetHostView_->about_to_validate_and_paint_ = false; | 2411 renderWidgetHostView_->about_to_validate_and_paint_ = false; |
| 2321 | 2412 |
| 2322 const gfx::Rect damagedRect([self flipNSRectToRect:dirtyRect]); | 2413 const gfx::Rect damagedRect([self flipNSRectToRect:dirtyRect]); |
| 2323 | 2414 |
| 2324 if (renderWidgetHostView_->last_frame_was_accelerated_ && | 2415 if (renderWidgetHostView_->last_frame_was_accelerated_ && |
| 2325 renderWidgetHostView_->compositing_iosurface_.get()) { | 2416 renderWidgetHostView_->compositing_iosurface_) { |
| 2326 if (renderWidgetHostView_->allow_overlapping_views_) { | 2417 if (renderWidgetHostView_->allow_overlapping_views_) { |
| 2327 // If overlapping views need to be allowed, punch a hole in the window | 2418 // If overlapping views need to be allowed, punch a hole in the window |
| 2328 // to expose the GL underlay. | 2419 // to expose the GL underlay. |
| 2329 TRACE_EVENT2("gpu", "NSRectFill clear", "w", damagedRect.width(), | 2420 TRACE_EVENT2("gpu", "NSRectFill clear", "w", damagedRect.width(), |
| 2330 "h", damagedRect.height()); | 2421 "h", damagedRect.height()); |
| 2331 // NSRectFill is extremely slow (15ms for a window on a fast MacPro), so | 2422 // NSRectFill is extremely slow (15ms for a window on a fast MacPro), so |
| 2332 // this is only done when it's a real invalidation from window damage (not | 2423 // this is only done when it's a real invalidation from window damage (not |
| 2333 // when a BuffersSwapped was received). Note that even a 1x1 NSRectFill | 2424 // when a BuffersSwapped was received). Note that even a 1x1 NSRectFill |
| 2334 // can take many milliseconds sometimes (!) so this is skipped completely | 2425 // can take many milliseconds sometimes (!) so this is skipped completely |
| 2335 // for drawRects that are triggered by BuffersSwapped messages. | 2426 // for drawRects that are triggered by BuffersSwapped messages. |
| 2336 [[NSColor clearColor] set]; | 2427 [[NSColor clearColor] set]; |
| 2337 NSRectFill(dirtyRect); | 2428 NSRectFill(dirtyRect); |
| 2338 } | 2429 } |
| 2339 | 2430 |
| 2340 content::CompositingIOSurfaceMac::SurfaceOrder order = | |
| 2341 renderWidgetHostView_->allow_overlapping_views_ | |
| 2342 ? content::CompositingIOSurfaceMac::SURFACE_ORDER_BELOW_WINDOW | |
| 2343 : content::CompositingIOSurfaceMac::SURFACE_ORDER_ABOVE_WINDOW; | |
| 2344 renderWidgetHostView_->compositing_iosurface_->DrawIOSurface( | 2431 renderWidgetHostView_->compositing_iosurface_->DrawIOSurface( |
| 2345 self, | 2432 renderWidgetHostView_.get()); |
| 2346 ScaleFactor(self), | |
| 2347 renderWidgetHostView_->window_number(), | |
| 2348 order, | |
| 2349 renderWidgetHostView_->frame_subscriber()); | |
| 2350 return; | 2433 return; |
| 2351 } | 2434 } |
| 2352 | 2435 |
| 2436 CGContextRef context = static_cast<CGContextRef>( |
| 2437 [[NSGraphicsContext currentContext] graphicsPort]); |
| 2438 [self drawBackingStore:backingStore |
| 2439 dirtyRect:NSRectToCGRect(dirtyRect) |
| 2440 inContext:context]; |
| 2441 } |
| 2442 |
| 2443 - (void)drawBackingStore:(BackingStoreMac*)backingStore |
| 2444 dirtyRect:(CGRect)dirtyRect |
| 2445 inContext:(CGContextRef)context { |
| 2353 if (backingStore) { | 2446 if (backingStore) { |
| 2354 // Note: All coordinates are in view units, not pixels. | 2447 // Note: All coordinates are in view units, not pixels. |
| 2355 gfx::Rect bitmapRect(0, 0, | 2448 gfx::Rect bitmapRect(0, 0, |
| 2356 backingStore->size().width(), | 2449 backingStore->size().width(), |
| 2357 backingStore->size().height()); | 2450 backingStore->size().height()); |
| 2358 | 2451 |
| 2359 // Specify the proper y offset to ensure that the view is rooted to the | 2452 // Specify the proper y offset to ensure that the view is rooted to the |
| 2360 // upper left corner. This can be negative, if the window was resized | 2453 // upper left corner. This can be negative, if the window was resized |
| 2361 // smaller and the renderer hasn't yet repainted. | 2454 // smaller and the renderer hasn't yet repainted. |
| 2362 int yOffset = NSHeight([self bounds]) - backingStore->size().height(); | 2455 int yOffset = NSHeight([self bounds]) - backingStore->size().height(); |
| 2363 | 2456 |
| 2457 NSRect nsDirtyRect = NSRectFromCGRect(dirtyRect); |
| 2458 const gfx::Rect damagedRect([self flipNSRectToRect:nsDirtyRect]); |
| 2459 |
| 2364 gfx::Rect paintRect = gfx::IntersectRects(bitmapRect, damagedRect); | 2460 gfx::Rect paintRect = gfx::IntersectRects(bitmapRect, damagedRect); |
| 2365 if (!paintRect.IsEmpty()) { | 2461 if (!paintRect.IsEmpty()) { |
| 2366 // if we have a CGLayer, draw that into the window | 2462 // if we have a CGLayer, draw that into the window |
| 2367 if (backingStore->cg_layer()) { | 2463 if (backingStore->cg_layer()) { |
| 2368 CGContextRef context = static_cast<CGContextRef>( | |
| 2369 [[NSGraphicsContext currentContext] graphicsPort]); | |
| 2370 | |
| 2371 // TODO: add clipping to dirtyRect if it improves drawing performance. | 2464 // TODO: add clipping to dirtyRect if it improves drawing performance. |
| 2372 CGContextDrawLayerAtPoint(context, CGPointMake(0.0, yOffset), | 2465 CGContextDrawLayerAtPoint(context, CGPointMake(0.0, yOffset), |
| 2373 backingStore->cg_layer()); | 2466 backingStore->cg_layer()); |
| 2374 } else { | 2467 } else { |
| 2375 // if we haven't created a layer yet, draw the cached bitmap into | 2468 // if we haven't created a layer yet, draw the cached bitmap into |
| 2376 // the window. The CGLayer will be created the next time the renderer | 2469 // the window. The CGLayer will be created the next time the renderer |
| 2377 // paints. | 2470 // paints. |
| 2378 CGContextRef context = static_cast<CGContextRef>( | |
| 2379 [[NSGraphicsContext currentContext] graphicsPort]); | |
| 2380 base::mac::ScopedCFTypeRef<CGImageRef> image( | 2471 base::mac::ScopedCFTypeRef<CGImageRef> image( |
| 2381 CGBitmapContextCreateImage(backingStore->cg_bitmap())); | 2472 CGBitmapContextCreateImage(backingStore->cg_bitmap())); |
| 2382 CGRect imageRect = bitmapRect.ToCGRect(); | 2473 CGRect imageRect = bitmapRect.ToCGRect(); |
| 2383 imageRect.origin.y = yOffset; | 2474 imageRect.origin.y = yOffset; |
| 2384 CGContextDrawImage(context, imageRect, image); | 2475 CGContextDrawImage(context, imageRect, image); |
| 2385 } | 2476 } |
| 2386 } | 2477 } |
| 2387 | 2478 |
| 2388 // Fill the remaining portion of the damagedRect with white | 2479 // Fill the remaining portion of the damagedRect with white |
| 2389 [self fillBottomRightRemainderOfRect:bitmapRect dirtyRect:damagedRect]; | 2480 [self fillBottomRightRemainderOfRect:bitmapRect |
| 2481 dirtyRect:damagedRect |
| 2482 inContext:context]; |
| 2390 | 2483 |
| 2391 if (!renderWidgetHostView_->whiteout_start_time_.is_null()) { | 2484 if (!renderWidgetHostView_->whiteout_start_time_.is_null()) { |
| 2392 base::TimeDelta whiteout_duration = base::TimeTicks::Now() - | 2485 base::TimeDelta whiteout_duration = base::TimeTicks::Now() - |
| 2393 renderWidgetHostView_->whiteout_start_time_; | 2486 renderWidgetHostView_->whiteout_start_time_; |
| 2394 UMA_HISTOGRAM_TIMES("MPArch.RWHH_WhiteoutDuration", whiteout_duration); | 2487 UMA_HISTOGRAM_TIMES("MPArch.RWHH_WhiteoutDuration", whiteout_duration); |
| 2395 | 2488 |
| 2396 // Reset the start time to 0 so that we start recording again the next | 2489 // Reset the start time to 0 so that we start recording again the next |
| 2397 // time the backing store is NULL... | 2490 // time the backing store is NULL... |
| 2398 renderWidgetHostView_->whiteout_start_time_ = base::TimeTicks(); | 2491 renderWidgetHostView_->whiteout_start_time_ = base::TimeTicks(); |
| 2399 } | 2492 } |
| 2400 if (!renderWidgetHostView_->web_contents_switch_paint_time_.is_null()) { | 2493 if (!renderWidgetHostView_->web_contents_switch_paint_time_.is_null()) { |
| 2401 base::TimeDelta web_contents_switch_paint_duration = | 2494 base::TimeDelta web_contents_switch_paint_duration = |
| 2402 base::TimeTicks::Now() - | 2495 base::TimeTicks::Now() - |
| 2403 renderWidgetHostView_->web_contents_switch_paint_time_; | 2496 renderWidgetHostView_->web_contents_switch_paint_time_; |
| 2404 UMA_HISTOGRAM_TIMES("MPArch.RWH_TabSwitchPaintDuration", | 2497 UMA_HISTOGRAM_TIMES("MPArch.RWH_TabSwitchPaintDuration", |
| 2405 web_contents_switch_paint_duration); | 2498 web_contents_switch_paint_duration); |
| 2406 // Reset contents_switch_paint_time_ to 0 so future tab selections are | 2499 // Reset contents_switch_paint_time_ to 0 so future tab selections are |
| 2407 // recorded. | 2500 // recorded. |
| 2408 renderWidgetHostView_->web_contents_switch_paint_time_ = | 2501 renderWidgetHostView_->web_contents_switch_paint_time_ = |
| 2409 base::TimeTicks(); | 2502 base::TimeTicks(); |
| 2410 } | 2503 } |
| 2411 } else { | 2504 } else { |
| 2412 [[NSColor whiteColor] set]; | 2505 CGContextSetFillColorWithColor(context, |
| 2413 NSRectFill(dirtyRect); | 2506 CGColorGetConstantColor(kCGColorWhite)); |
| 2507 CGContextFillRect(context, dirtyRect); |
| 2414 if (renderWidgetHostView_->whiteout_start_time_.is_null()) | 2508 if (renderWidgetHostView_->whiteout_start_time_.is_null()) |
| 2415 renderWidgetHostView_->whiteout_start_time_ = base::TimeTicks::Now(); | 2509 renderWidgetHostView_->whiteout_start_time_ = base::TimeTicks::Now(); |
| 2416 } | 2510 } |
| 2417 } | 2511 } |
| 2418 | 2512 |
| 2419 - (BOOL)canBecomeKeyView { | 2513 - (BOOL)canBecomeKeyView { |
| 2420 if (!renderWidgetHostView_->render_widget_host_) | 2514 if (!renderWidgetHostView_->render_widget_host_) |
| 2421 return NO; | 2515 return NO; |
| 2422 | 2516 |
| 2423 return canBeKeyView_; | 2517 return canBeKeyView_; |
| (...skipping 952 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3376 return; | 3470 return; |
| 3377 | 3471 |
| 3378 currentCursor_.reset([cursor retain]); | 3472 currentCursor_.reset([cursor retain]); |
| 3379 [[self window] invalidateCursorRectsForView:self]; | 3473 [[self window] invalidateCursorRectsForView:self]; |
| 3380 } | 3474 } |
| 3381 | 3475 |
| 3382 - (void)popupWindowWillClose:(NSNotification *)notification { | 3476 - (void)popupWindowWillClose:(NSNotification *)notification { |
| 3383 renderWidgetHostView_->KillSelf(); | 3477 renderWidgetHostView_->KillSelf(); |
| 3384 } | 3478 } |
| 3385 | 3479 |
| 3480 - (void)updateSoftwareLayerScaleFactor { |
| 3481 if (![renderWidgetHostView_->software_layer_ |
| 3482 respondsToSelector:@selector(setContentsScale:)]) |
| 3483 return; |
| 3484 |
| 3485 ScopedCAActionDisabler disabler; |
| 3486 [renderWidgetHostView_->software_layer_ setContentsScale:deviceScaleFactor_]; |
| 3487 } |
| 3488 |
| 3489 // Delegate methods for the software CALayer |
| 3490 - (void)drawLayer:(CALayer*)layer |
| 3491 inContext:(CGContextRef)context { |
| 3492 DCHECK(renderWidgetHostView_->use_core_animation_); |
| 3493 DCHECK([layer isEqual:renderWidgetHostView_->software_layer_]); |
| 3494 |
| 3495 CGRect clipRect = CGContextGetClipBoundingBox(context); |
| 3496 |
| 3497 if (!renderWidgetHostView_->render_widget_host_ || |
| 3498 renderWidgetHostView_->is_hidden()) { |
| 3499 CGContextSetFillColorWithColor(context, |
| 3500 CGColorGetConstantColor(kCGColorWhite)); |
| 3501 CGContextFillRect(context, clipRect); |
| 3502 return; |
| 3503 } |
| 3504 |
| 3505 renderWidgetHostView_->about_to_validate_and_paint_ = true; |
| 3506 BackingStoreMac* backingStore = static_cast<BackingStoreMac*>( |
| 3507 renderWidgetHostView_->render_widget_host_->GetBackingStore(true)); |
| 3508 renderWidgetHostView_->about_to_validate_and_paint_ = false; |
| 3509 |
| 3510 [self drawBackingStore:backingStore |
| 3511 dirtyRect:clipRect |
| 3512 inContext:context]; |
| 3513 } |
| 3514 |
| 3515 - (void)setNeedsDisplay:(BOOL)flag { |
| 3516 [renderWidgetHostView_->software_layer_ setNeedsDisplay]; |
| 3517 [super setNeedsDisplay:flag]; |
| 3518 } |
| 3519 |
| 3520 - (void)setNeedsDisplayInRect:(NSRect)rect { |
| 3521 [renderWidgetHostView_->software_layer_ |
| 3522 setNeedsDisplayInRect:NSRectToCGRect(rect)]; |
| 3523 [super setNeedsDisplayInRect:rect]; |
| 3524 } |
| 3525 |
| 3386 @end | 3526 @end |
| 3387 | 3527 |
| 3388 // | 3528 // |
| 3389 // Supporting application services | 3529 // Supporting application services |
| 3390 // | 3530 // |
| 3391 @implementation RenderWidgetHostViewCocoa(NSServicesRequests) | 3531 @implementation RenderWidgetHostViewCocoa(NSServicesRequests) |
| 3392 | 3532 |
| 3393 - (BOOL)writeSelectionToPasteboard:(NSPasteboard*)pboard | 3533 - (BOOL)writeSelectionToPasteboard:(NSPasteboard*)pboard |
| 3394 types:(NSArray*)types { | 3534 types:(NSArray*)types { |
| 3395 const std::string& str = renderWidgetHostView_->selected_text(); | 3535 const std::string& str = renderWidgetHostView_->selected_text(); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 3406 NSString *string = [pboard stringForType:NSStringPboardType]; | 3546 NSString *string = [pboard stringForType:NSStringPboardType]; |
| 3407 if (!string) return NO; | 3547 if (!string) return NO; |
| 3408 | 3548 |
| 3409 // If the user is currently using an IME, confirm the IME input, | 3549 // If the user is currently using an IME, confirm the IME input, |
| 3410 // and then insert the text from the service, the same as TextEdit and Safari. | 3550 // and then insert the text from the service, the same as TextEdit and Safari. |
| 3411 [self confirmComposition]; | 3551 [self confirmComposition]; |
| 3412 [self insertText:string]; | 3552 [self insertText:string]; |
| 3413 return YES; | 3553 return YES; |
| 3414 } | 3554 } |
| 3415 | 3555 |
| 3556 - (BOOL)isOpaque { |
| 3557 if (renderWidgetHostView_->use_core_animation_) |
| 3558 return YES; |
| 3559 return [super isOpaque]; |
| 3560 } |
| 3561 |
| 3416 @end | 3562 @end |
| OLD | NEW |