| 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" |
| (...skipping 29 matching lines...) Expand all Loading... |
| 40 #include "content/public/browser/browser_thread.h" | 40 #include "content/public/browser/browser_thread.h" |
| 41 #include "content/public/browser/native_web_keyboard_event.h" | 41 #include "content/public/browser/native_web_keyboard_event.h" |
| 42 #import "content/public/browser/render_widget_host_view_mac_delegate.h" | 42 #import "content/public/browser/render_widget_host_view_mac_delegate.h" |
| 43 #include "skia/ext/platform_canvas.h" | 43 #include "skia/ext/platform_canvas.h" |
| 44 #include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h" | 44 #include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h" |
| 45 #include "third_party/WebKit/Source/WebKit/chromium/public/WebScreenInfo.h" | 45 #include "third_party/WebKit/Source/WebKit/chromium/public/WebScreenInfo.h" |
| 46 #include "third_party/WebKit/Source/WebKit/chromium/public/mac/WebInputEventFact
ory.h" | 46 #include "third_party/WebKit/Source/WebKit/chromium/public/mac/WebInputEventFact
ory.h" |
| 47 #include "third_party/WebKit/Source/WebKit/chromium/public/mac/WebScreenInfoFact
ory.h" | 47 #include "third_party/WebKit/Source/WebKit/chromium/public/mac/WebScreenInfoFact
ory.h" |
| 48 #import "third_party/mozilla/ComplexTextInputPanel.h" | 48 #import "third_party/mozilla/ComplexTextInputPanel.h" |
| 49 #include "third_party/skia/include/core/SkColor.h" | 49 #include "third_party/skia/include/core/SkColor.h" |
| 50 #import "ui/base/cocoa/event_hook_application.h" |
| 50 #import "ui/base/cocoa/fullscreen_window_manager.h" | 51 #import "ui/base/cocoa/fullscreen_window_manager.h" |
| 51 #import "ui/base/cocoa/underlay_opengl_hosting_window.h" | 52 #import "ui/base/cocoa/underlay_opengl_hosting_window.h" |
| 52 #include "ui/base/keycodes/keyboard_codes.h" | 53 #include "ui/base/keycodes/keyboard_codes.h" |
| 53 #include "ui/base/layout.h" | 54 #include "ui/base/layout.h" |
| 54 #include "ui/gfx/point.h" | 55 #include "ui/gfx/point.h" |
| 55 #include "ui/gfx/rect_conversions.h" | 56 #include "ui/gfx/rect_conversions.h" |
| 56 #include "ui/gfx/size_conversions.h" | 57 #include "ui/gfx/size_conversions.h" |
| 57 #include "ui/gfx/scoped_ns_graphics_context_save_gstate_mac.h" | 58 #include "ui/gfx/scoped_ns_graphics_context_save_gstate_mac.h" |
| 58 #include "ui/surface/io_surface_support_mac.h" | 59 #include "ui/surface/io_surface_support_mac.h" |
| 59 #include "webkit/plugins/npapi/webplugin.h" | 60 #include "webkit/plugins/npapi/webplugin.h" |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 130 @property(nonatomic, assign) NSRange selectedRange; | 131 @property(nonatomic, assign) NSRange selectedRange; |
| 131 @property(nonatomic, assign) NSRange markedRange; | 132 @property(nonatomic, assign) NSRange markedRange; |
| 132 | 133 |
| 133 + (BOOL)shouldAutohideCursorForEvent:(NSEvent*)event; | 134 + (BOOL)shouldAutohideCursorForEvent:(NSEvent*)event; |
| 134 - (id)initWithRenderWidgetHostViewMac:(RenderWidgetHostViewMac*)r; | 135 - (id)initWithRenderWidgetHostViewMac:(RenderWidgetHostViewMac*)r; |
| 135 - (void)setRWHVDelegate:(NSObject<RenderWidgetHostViewMacDelegate>*)delegate; | 136 - (void)setRWHVDelegate:(NSObject<RenderWidgetHostViewMacDelegate>*)delegate; |
| 136 - (void)gotUnhandledWheelEvent; | 137 - (void)gotUnhandledWheelEvent; |
| 137 - (void)scrollOffsetPinnedToLeft:(BOOL)left toRight:(BOOL)right; | 138 - (void)scrollOffsetPinnedToLeft:(BOOL)left toRight:(BOOL)right; |
| 138 - (void)setHasHorizontalScrollbar:(BOOL)has_horizontal_scrollbar; | 139 - (void)setHasHorizontalScrollbar:(BOOL)has_horizontal_scrollbar; |
| 139 - (void)keyEvent:(NSEvent*)theEvent wasKeyEquivalent:(BOOL)equiv; | 140 - (void)keyEvent:(NSEvent*)theEvent wasKeyEquivalent:(BOOL)equiv; |
| 140 - (void)cancelChildPopups; | |
| 141 - (void)windowDidChangeBackingProperties:(NSNotification*)notification; | 141 - (void)windowDidChangeBackingProperties:(NSNotification*)notification; |
| 142 - (void)windowChangedGlobalFrame:(NSNotification*)notification; | 142 - (void)windowChangedGlobalFrame:(NSNotification*)notification; |
| 143 - (void)checkForPluginImeCancellation; | 143 - (void)checkForPluginImeCancellation; |
| 144 - (void)updateTabBackingStoreScaleFactor; | 144 - (void)updateTabBackingStoreScaleFactor; |
| 145 - (NSRect)firstViewRectForCharacterRange:(NSRange)theRange | 145 - (NSRect)firstViewRectForCharacterRange:(NSRange)theRange |
| 146 actualRange:(NSRangePointer)actualRange; | 146 actualRange:(NSRangePointer)actualRange; |
| 147 @end | 147 @end |
| 148 | 148 |
| 149 // NSEvent subtype for scroll gestures events. | 149 // NSEvent subtype for scroll gestures events. |
| 150 static const short kIOHIDEventTypeScroll = 6; | 150 static const short kIOHIDEventTypeScroll = 6; |
| 151 | 151 |
| 152 // A window subclass that allows the fullscreen window to become main and gain | 152 // A window subclass that allows the fullscreen window to become main and gain |
| 153 // keyboard focus. This is only used for pepper flash. Normal fullscreen is | 153 // keyboard focus. This is only used for pepper flash. Normal fullscreen is |
| 154 // handled by the browser. | 154 // handled by the browser. |
| 155 @interface PepperFlashFullscreenWindow : UnderlayOpenGLHostingWindow | 155 @interface PepperFlashFullscreenWindow : UnderlayOpenGLHostingWindow |
| 156 @end | 156 @end |
| 157 | 157 |
| 158 @implementation PepperFlashFullscreenWindow | 158 @implementation PepperFlashFullscreenWindow |
| 159 | 159 |
| 160 - (BOOL)canBecomeKeyWindow { | 160 - (BOOL)canBecomeKeyWindow { |
| 161 return YES; | 161 return YES; |
| 162 } | 162 } |
| 163 | 163 |
| 164 - (BOOL)canBecomeMainWindow { | 164 - (BOOL)canBecomeMainWindow { |
| 165 return YES; | 165 return YES; |
| 166 } | 166 } |
| 167 | 167 |
| 168 @end | 168 @end |
| 169 | 169 |
| 170 @interface RenderWidgetPopupWindow : NSWindow<CrEventHookProtocol> |
| 171 @end |
| 172 |
| 173 @implementation RenderWidgetPopupWindow |
| 174 |
| 175 - (id)initWithContentRect:(NSRect)contentRect |
| 176 styleMask:(NSUInteger)windowStyle |
| 177 backing:(NSBackingStoreType)bufferingType |
| 178 defer:(BOOL)deferCreation { |
| 179 if (self = [super initWithContentRect:contentRect |
| 180 styleMask:windowStyle |
| 181 backing:bufferingType |
| 182 defer:deferCreation]) { |
| 183 [self setOpaque:NO]; |
| 184 [self setBackgroundColor:[NSColor clearColor]]; |
| 185 [self startObservingClicks]; |
| 186 } |
| 187 return self; |
| 188 } |
| 189 |
| 190 - (void)close { |
| 191 [self stopObservingClicks]; |
| 192 [super close]; |
| 193 } |
| 194 |
| 195 // Gets called for all events in application. Watching for a click outside the |
| 196 // window so we can close. |
| 197 - (void)hookForEvent:(NSEvent*)theEvent { |
| 198 if ([theEvent window] == self) |
| 199 return; |
| 200 NSEventType eventType = [theEvent type]; |
| 201 if (eventType == NSLeftMouseDown || eventType == NSRightMouseDown) |
| 202 [self close]; |
| 203 } |
| 204 |
| 205 // Gets called when the menubar is clicked. |
| 206 // Needed because the hookForEvent method doesn't see the click on the menubar. |
| 207 - (void)begunTracking:(NSNotification*)notification { |
| 208 [self close]; |
| 209 } |
| 210 |
| 211 // Install the callback. |
| 212 - (void)startObservingClicks { |
| 213 CrEventHookApplication* app = static_cast<CrEventHookApplication*>( |
| 214 [CrEventHookApplication sharedApplication]); |
| 215 [app addEventHook:self]; |
| 216 |
| 217 NSNotificationCenter* nc = [NSNotificationCenter defaultCenter]; |
| 218 [nc addObserver:self |
| 219 selector:@selector(begunTracking:) |
| 220 name:NSMenuDidBeginTrackingNotification |
| 221 object:[NSApp mainMenu]]; |
| 222 } |
| 223 |
| 224 // Remove the callback. |
| 225 - (void)stopObservingClicks { |
| 226 CrEventHookApplication* app = static_cast<CrEventHookApplication*>( |
| 227 [CrEventHookApplication sharedApplication]); |
| 228 [app removeEventHook:self]; |
| 229 |
| 230 NSNotificationCenter* nc = [NSNotificationCenter defaultCenter]; |
| 231 [nc removeObserver:self |
| 232 name:NSMenuDidBeginTrackingNotification |
| 233 object:[NSApp mainMenu]]; |
| 234 } |
| 235 |
| 236 @end |
| 237 |
| 170 namespace { | 238 namespace { |
| 171 | 239 |
| 172 // Maximum number of characters we allow in a tooltip. | 240 // Maximum number of characters we allow in a tooltip. |
| 173 const size_t kMaxTooltipLength = 1024; | 241 const size_t kMaxTooltipLength = 1024; |
| 174 | 242 |
| 175 // TODO(suzhe): Upstream this function. | 243 // TODO(suzhe): Upstream this function. |
| 176 WebKit::WebColor WebColorFromNSColor(NSColor *color) { | 244 WebKit::WebColor WebColorFromNSColor(NSColor *color) { |
| 177 CGFloat r, g, b, a; | 245 CGFloat r, g, b, a; |
| 178 [color getRed:&r green:&g blue:&b alpha:&a]; | 246 [color getRed:&r green:&g blue:&b alpha:&a]; |
| 179 | 247 |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 327 void RenderWidgetHostViewMac::InitAsChild( | 395 void RenderWidgetHostViewMac::InitAsChild( |
| 328 gfx::NativeView parent_view) { | 396 gfx::NativeView parent_view) { |
| 329 } | 397 } |
| 330 | 398 |
| 331 void RenderWidgetHostViewMac::InitAsPopup( | 399 void RenderWidgetHostViewMac::InitAsPopup( |
| 332 RenderWidgetHostView* parent_host_view, | 400 RenderWidgetHostView* parent_host_view, |
| 333 const gfx::Rect& pos) { | 401 const gfx::Rect& pos) { |
| 334 bool activatable = popup_type_ == WebKit::WebPopupTypeNone; | 402 bool activatable = popup_type_ == WebKit::WebPopupTypeNone; |
| 335 [cocoa_view_ setCloseOnDeactivate:YES]; | 403 [cocoa_view_ setCloseOnDeactivate:YES]; |
| 336 [cocoa_view_ setCanBeKeyView:activatable ? YES : NO]; | 404 [cocoa_view_ setCanBeKeyView:activatable ? YES : NO]; |
| 337 [parent_host_view->GetNativeView() addSubview:cocoa_view_]; | |
| 338 | 405 |
| 339 NSPoint origin_global = NSPointFromCGPoint(pos.origin().ToCGPoint()); | 406 NSPoint origin_global = NSPointFromCGPoint(pos.origin().ToCGPoint()); |
| 340 if ([[NSScreen screens] count] > 0) { | 407 if ([[NSScreen screens] count] > 0) { |
| 341 origin_global.y = [[[NSScreen screens] objectAtIndex:0] frame].size.height - | 408 origin_global.y = [[[NSScreen screens] objectAtIndex:0] frame].size.height - |
| 342 pos.height() - origin_global.y; | 409 pos.height() - origin_global.y; |
| 343 } | 410 } |
| 344 NSPoint origin_window = | 411 |
| 345 [[cocoa_view_ window] convertScreenToBase:origin_global]; | 412 popup_window_.reset([[RenderWidgetPopupWindow alloc] |
| 346 NSPoint origin_view = | 413 initWithContentRect:NSMakeRect(origin_global.x, origin_global.y, |
| 347 [cocoa_view_ convertPoint:origin_window fromView:nil]; | 414 pos.width(), pos.height()) |
| 348 NSRect initial_frame = NSMakeRect(origin_view.x, | 415 styleMask:NSBorderlessWindowMask |
| 349 origin_view.y, | 416 backing:NSBackingStoreBuffered |
| 350 pos.width(), | 417 defer:NO]); |
| 351 pos.height()); | 418 [popup_window_ setLevel:NSPopUpMenuWindowLevel]; |
| 352 [cocoa_view_ setFrame:initial_frame]; | 419 [popup_window_ setReleasedWhenClosed:NO]; |
| 420 [popup_window_ makeKeyAndOrderFront:nil]; |
| 421 [[popup_window_ contentView] addSubview:cocoa_view_]; |
| 422 [cocoa_view_ setFrame:[[popup_window_ contentView] bounds]]; |
| 423 [cocoa_view_ setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; |
| 424 [[NSNotificationCenter defaultCenter] |
| 425 addObserver:cocoa_view_ |
| 426 selector:@selector(popupWindowWillClose:) |
| 427 name:NSWindowWillCloseNotification |
| 428 object:popup_window_]; |
| 353 } | 429 } |
| 354 | 430 |
| 355 // This function creates the fullscreen window and hides the dock and menubar if | 431 // This function creates the fullscreen window and hides the dock and menubar if |
| 356 // necessary. Note, this codepath is only used for pepper flash when | 432 // necessary. Note, this codepath is only used for pepper flash when |
| 357 // pp::FlashFullScreen::SetFullscreen() is called. If | 433 // pp::FlashFullScreen::SetFullscreen() is called. If |
| 358 // pp::FullScreen::SetFullscreen() is called then the entire browser window | 434 // pp::FullScreen::SetFullscreen() is called then the entire browser window |
| 359 // will enter fullscreen instead. | 435 // will enter fullscreen instead. |
| 360 void RenderWidgetHostViewMac::InitAsFullscreen( | 436 void RenderWidgetHostViewMac::InitAsFullscreen( |
| 361 RenderWidgetHostView* reference_host_view) { | 437 RenderWidgetHostView* reference_host_view) { |
| 362 fullscreen_parent_host_view_ = | 438 fullscreen_parent_host_view_ = |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 451 if (rect.size().IsEmpty()) | 527 if (rect.size().IsEmpty()) |
| 452 return; | 528 return; |
| 453 | 529 |
| 454 // Ignore the position of |rect| for non-popup rwhvs. This is because | 530 // Ignore the position of |rect| for non-popup rwhvs. This is because |
| 455 // background tabs do not have a window, but the window is required for the | 531 // background tabs do not have a window, but the window is required for the |
| 456 // coordinate conversions. Popups are always for a visible tab. | 532 // coordinate conversions. Popups are always for a visible tab. |
| 457 if (IsPopup()) { | 533 if (IsPopup()) { |
| 458 // The position of |rect| is screen coordinate system and we have to | 534 // The position of |rect| is screen coordinate system and we have to |
| 459 // consider Cocoa coordinate system is upside-down and also multi-screen. | 535 // consider Cocoa coordinate system is upside-down and also multi-screen. |
| 460 NSPoint origin_global = NSPointFromCGPoint(rect.origin().ToCGPoint()); | 536 NSPoint origin_global = NSPointFromCGPoint(rect.origin().ToCGPoint()); |
| 537 NSSize size = NSMakeSize(rect.width(), rect.height()); |
| 538 size = [cocoa_view_ convertSize:size toView:nil]; |
| 461 if ([[NSScreen screens] count] > 0) { | 539 if ([[NSScreen screens] count] > 0) { |
| 462 NSSize size = NSMakeSize(rect.width(), rect.height()); | |
| 463 size = [cocoa_view_ convertSize:size toView:nil]; | |
| 464 NSScreen* screen = | 540 NSScreen* screen = |
| 465 static_cast<NSScreen*>([[NSScreen screens] objectAtIndex:0]); | 541 static_cast<NSScreen*>([[NSScreen screens] objectAtIndex:0]); |
| 466 origin_global.y = | 542 origin_global.y = |
| 467 NSHeight([screen frame]) - size.height - origin_global.y; | 543 NSHeight([screen frame]) - size.height - origin_global.y; |
| 468 } | 544 } |
| 469 | 545 [popup_window_ setFrame:NSMakeRect(origin_global.x, origin_global.y, |
| 470 // Then |origin_global| is converted to client coordinate system. | 546 size.width, size.height) |
| 471 DCHECK([cocoa_view_ window]); | 547 display:YES]; |
| 472 NSPoint origin_window = | |
| 473 [[cocoa_view_ window] convertScreenToBase:origin_global]; | |
| 474 NSPoint origin_view = | |
| 475 [[cocoa_view_ superview] convertPoint:origin_window fromView:nil]; | |
| 476 NSRect frame = NSMakeRect(origin_view.x, origin_view.y, | |
| 477 rect.width(), rect.height()); | |
| 478 [cocoa_view_ setFrame:frame]; | |
| 479 } else { | 548 } else { |
| 480 DCHECK([[cocoa_view_ superview] isKindOfClass:[BaseView class]]); | 549 DCHECK([[cocoa_view_ superview] isKindOfClass:[BaseView class]]); |
| 481 BaseView* superview = static_cast<BaseView*>([cocoa_view_ superview]); | 550 BaseView* superview = static_cast<BaseView*>([cocoa_view_ superview]); |
| 482 gfx::Rect rect2 = [superview flipNSRectToRect:[cocoa_view_ frame]]; | 551 gfx::Rect rect2 = [superview flipNSRectToRect:[cocoa_view_ frame]]; |
| 483 rect2.set_width(rect.width()); | 552 rect2.set_width(rect.width()); |
| 484 rect2.set_height(rect.height()); | 553 rect2.set_height(rect.height()); |
| 485 [cocoa_view_ setFrame:[superview flipRectToNSRect:rect2]]; | 554 [cocoa_view_ setFrame:[superview flipRectToNSRect:rect2]]; |
| 486 } | 555 } |
| 487 } | 556 } |
| 488 | 557 |
| (...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 698 } | 767 } |
| 699 | 768 |
| 700 void RenderWidgetHostViewMac::RenderViewGone(base::TerminationStatus status, | 769 void RenderWidgetHostViewMac::RenderViewGone(base::TerminationStatus status, |
| 701 int error_code) { | 770 int error_code) { |
| 702 Destroy(); | 771 Destroy(); |
| 703 } | 772 } |
| 704 | 773 |
| 705 void RenderWidgetHostViewMac::Destroy() { | 774 void RenderWidgetHostViewMac::Destroy() { |
| 706 AckPendingSwapBuffers(); | 775 AckPendingSwapBuffers(); |
| 707 | 776 |
| 708 // On Windows, popups are implemented with a popup window style, so that when | |
| 709 // an event comes in that would "cancel" it, it receives the OnCancelMode | |
| 710 // message and can kill itself. Alas, on the Mac, views cannot capture events | |
| 711 // outside of themselves. On Windows, if Destroy is being called on a view, | |
| 712 // then the event causing the destroy had also cancelled any popups by the | |
| 713 // time Destroy() was called. On the Mac we have to destroy all the popups | |
| 714 // ourselves. | |
| 715 | |
| 716 // Depth-first destroy all popups. Use ShutdownHost() to enforce | |
| 717 // deepest-first ordering. | |
| 718 for (NSView* subview in [cocoa_view_ subviews]) { | 777 for (NSView* subview in [cocoa_view_ subviews]) { |
| 719 if ([subview isKindOfClass:[RenderWidgetHostViewCocoa class]]) { | 778 if ([subview isKindOfClass:[AcceleratedPluginView class]]) { |
| 720 [static_cast<RenderWidgetHostViewCocoa*>(subview) | |
| 721 renderWidgetHostViewMac]->ShutdownHost(); | |
| 722 } else if ([subview isKindOfClass:[AcceleratedPluginView class]]) { | |
| 723 [static_cast<AcceleratedPluginView*>(subview) | 779 [static_cast<AcceleratedPluginView*>(subview) |
| 724 onRenderWidgetHostViewGone]; | 780 onRenderWidgetHostViewGone]; |
| 725 } | 781 } |
| 726 } | 782 } |
| 727 | 783 |
| 784 [[NSNotificationCenter defaultCenter] |
| 785 removeObserver:cocoa_view_ |
| 786 name:NSWindowWillCloseNotification |
| 787 object:popup_window_]; |
| 788 |
| 728 // We've been told to destroy. | 789 // We've been told to destroy. |
| 729 [cocoa_view_ retain]; | 790 [cocoa_view_ retain]; |
| 730 [cocoa_view_ removeFromSuperview]; | 791 [cocoa_view_ removeFromSuperview]; |
| 731 [cocoa_view_ autorelease]; | 792 [cocoa_view_ autorelease]; |
| 732 | 793 |
| 794 [popup_window_ close]; |
| 795 popup_window_.autorelease(); |
| 796 |
| 733 [fullscreen_window_manager_ exitFullscreenMode]; | 797 [fullscreen_window_manager_ exitFullscreenMode]; |
| 734 fullscreen_window_manager_.reset(); | 798 fullscreen_window_manager_.reset(); |
| 735 [pepper_fullscreen_window_ close]; | 799 [pepper_fullscreen_window_ close]; |
| 736 | 800 |
| 737 // This can be called as part of processing the window's responder | 801 // This can be called as part of processing the window's responder |
| 738 // chain, for instance |-performKeyEquivalent:|. In that case the | 802 // chain, for instance |-performKeyEquivalent:|. In that case the |
| 739 // object needs to survive until the stack unwinds. | 803 // object needs to survive until the stack unwinds. |
| 740 pepper_fullscreen_window_.autorelease(); | 804 pepper_fullscreen_window_.autorelease(); |
| 741 | 805 |
| 742 // We get this call just before |render_widget_host_| deletes | 806 // We get this call just before |render_widget_host_| deletes |
| (...skipping 1336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2079 widgetHost->ForwardKeyboardEvent(event); | 2143 widgetHost->ForwardKeyboardEvent(event); |
| 2080 } | 2144 } |
| 2081 } | 2145 } |
| 2082 | 2146 |
| 2083 // Possibly autohide the cursor. | 2147 // Possibly autohide the cursor. |
| 2084 if ([RenderWidgetHostViewCocoa shouldAutohideCursorForEvent:theEvent]) | 2148 if ([RenderWidgetHostViewCocoa shouldAutohideCursorForEvent:theEvent]) |
| 2085 [NSCursor setHiddenUntilMouseMoves:YES]; | 2149 [NSCursor setHiddenUntilMouseMoves:YES]; |
| 2086 } | 2150 } |
| 2087 | 2151 |
| 2088 - (void)scrollWheel:(NSEvent*)theEvent { | 2152 - (void)scrollWheel:(NSEvent*)theEvent { |
| 2089 // Cancel popups before calling the delegate because even if the delegate eats | |
| 2090 // the event, it's still an explicit user action outside the popup. | |
| 2091 [self cancelChildPopups]; | |
| 2092 | |
| 2093 if (delegate_ && [delegate_ respondsToSelector:@selector(handleEvent:)]) { | 2153 if (delegate_ && [delegate_ respondsToSelector:@selector(handleEvent:)]) { |
| 2094 BOOL handled = [delegate_ handleEvent:theEvent]; | 2154 BOOL handled = [delegate_ handleEvent:theEvent]; |
| 2095 if (handled) | 2155 if (handled) |
| 2096 return; | 2156 return; |
| 2097 } | 2157 } |
| 2098 | 2158 |
| 2099 const WebMouseWheelEvent& event = | 2159 const WebMouseWheelEvent& event = |
| 2100 WebInputEventFactory::mouseWheelEvent(theEvent, self); | 2160 WebInputEventFactory::mouseWheelEvent(theEvent, self); |
| 2101 if (renderWidgetHostView_->render_widget_host_) | 2161 if (renderWidgetHostView_->render_widget_host_) |
| 2102 renderWidgetHostView_->render_widget_host_->ForwardWheelEvent(event); | 2162 renderWidgetHostView_->render_widget_host_->ForwardWheelEvent(event); |
| 2103 } | 2163 } |
| 2104 | 2164 |
| 2105 // See the comment in RenderWidgetHostViewMac::Destroy() about cancellation | |
| 2106 // events. On the Mac we must kill popups on outside events, thus this lovely | |
| 2107 // case of filicide caused by events on parent views. | |
| 2108 - (void)cancelChildPopups { | |
| 2109 // If this view can be the key view, it is not a popup. Therefore, if it has | |
| 2110 // any children, they are popups that need to be canceled. | |
| 2111 if (canBeKeyView_) { | |
| 2112 for (NSView* subview in [self subviews]) { | |
| 2113 if (![subview isKindOfClass:[RenderWidgetHostViewCocoa class]]) | |
| 2114 continue; // Skip plugin views. | |
| 2115 | |
| 2116 [static_cast<RenderWidgetHostViewCocoa*>(subview) | |
| 2117 renderWidgetHostViewMac]->KillSelf(); | |
| 2118 } | |
| 2119 } | |
| 2120 } | |
| 2121 | |
| 2122 - (void)viewWillMoveToWindow:(NSWindow*)newWindow { | 2165 - (void)viewWillMoveToWindow:(NSWindow*)newWindow { |
| 2123 // We're messing with the window, so do this to ensure no flashes. This one | 2166 // We're messing with the window, so do this to ensure no flashes. This one |
| 2124 // prevents a flash when the current tab is closed. | 2167 // prevents a flash when the current tab is closed. |
| 2125 NSWindow* oldWindow = [self window]; | 2168 NSWindow* oldWindow = [self window]; |
| 2126 [oldWindow disableScreenUpdatesUntilFlush]; | 2169 [oldWindow disableScreenUpdatesUntilFlush]; |
| 2127 | 2170 |
| 2128 NSNotificationCenter* notificationCenter = | 2171 NSNotificationCenter* notificationCenter = |
| 2129 [NSNotificationCenter defaultCenter]; | 2172 [NSNotificationCenter defaultCenter]; |
| 2130 if (oldWindow) { | 2173 if (oldWindow) { |
| 2131 [notificationCenter | 2174 [notificationCenter |
| (...skipping 1198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3330 } | 3373 } |
| 3331 | 3374 |
| 3332 - (void)updateCursor:(NSCursor*)cursor { | 3375 - (void)updateCursor:(NSCursor*)cursor { |
| 3333 if (currentCursor_ == cursor) | 3376 if (currentCursor_ == cursor) |
| 3334 return; | 3377 return; |
| 3335 | 3378 |
| 3336 currentCursor_.reset(cursor, base::scoped_policy::RETAIN); | 3379 currentCursor_.reset(cursor, base::scoped_policy::RETAIN); |
| 3337 [[self window] invalidateCursorRectsForView:self]; | 3380 [[self window] invalidateCursorRectsForView:self]; |
| 3338 } | 3381 } |
| 3339 | 3382 |
| 3383 - (void)popupWindowWillClose:(NSNotification *)notification { |
| 3384 renderWidgetHostView_->KillSelf(); |
| 3385 } |
| 3386 |
| 3340 @end | 3387 @end |
| 3341 | 3388 |
| 3342 // | 3389 // |
| 3343 // Supporting application services | 3390 // Supporting application services |
| 3344 // | 3391 // |
| 3345 @implementation RenderWidgetHostViewCocoa(NSServicesRequests) | 3392 @implementation RenderWidgetHostViewCocoa(NSServicesRequests) |
| 3346 | 3393 |
| 3347 - (BOOL)writeSelectionToPasteboard:(NSPasteboard*)pboard | 3394 - (BOOL)writeSelectionToPasteboard:(NSPasteboard*)pboard |
| 3348 types:(NSArray*)types { | 3395 types:(NSArray*)types { |
| 3349 const std::string& str = renderWidgetHostView_->selected_text(); | 3396 const std::string& str = renderWidgetHostView_->selected_text(); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 3361 if (!string) return NO; | 3408 if (!string) return NO; |
| 3362 | 3409 |
| 3363 // If the user is currently using an IME, confirm the IME input, | 3410 // If the user is currently using an IME, confirm the IME input, |
| 3364 // and then insert the text from the service, the same as TextEdit and Safari. | 3411 // and then insert the text from the service, the same as TextEdit and Safari. |
| 3365 [self confirmComposition]; | 3412 [self confirmComposition]; |
| 3366 [self insertText:string]; | 3413 [self insertText:string]; |
| 3367 return YES; | 3414 return YES; |
| 3368 } | 3415 } |
| 3369 | 3416 |
| 3370 @end | 3417 @end |
| OLD | NEW |