| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/renderer_host/render_widget_host_view_mac.h" | 5 #include "content/browser/renderer_host/render_widget_host_view_mac.h" |
| 6 | 6 |
| 7 #import <objc/runtime.h> | 7 #import <objc/runtime.h> |
| 8 #include <OpenGL/gl.h> | 8 #include <OpenGL/gl.h> |
| 9 #include <QuartzCore/QuartzCore.h> | 9 #include <QuartzCore/QuartzCore.h> |
| 10 #include <stdint.h> | 10 #include <stdint.h> |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 139 | 139 |
| 140 } // namespace | 140 } // namespace |
| 141 | 141 |
| 142 // These are not documented, so use only after checking -respondsToSelector:. | 142 // These are not documented, so use only after checking -respondsToSelector:. |
| 143 @interface NSApplication (UndocumentedSpeechMethods) | 143 @interface NSApplication (UndocumentedSpeechMethods) |
| 144 - (void)speakString:(NSString*)string; | 144 - (void)speakString:(NSString*)string; |
| 145 - (void)stopSpeaking:(id)sender; | 145 - (void)stopSpeaking:(id)sender; |
| 146 - (BOOL)isSpeaking; | 146 - (BOOL)isSpeaking; |
| 147 @end | 147 @end |
| 148 | 148 |
| 149 // This method will return YES for OS X versions 10.7.3 and later, and NO | |
| 150 // otherwise. | |
| 151 // Used to prevent a crash when building with the 10.7 SDK and accessing the | |
| 152 // notification below. See: http://crbug.com/260595. | |
| 153 static BOOL SupportsBackingPropertiesChangedNotification() { | |
| 154 // windowDidChangeBackingProperties: method has been added to the | |
| 155 // NSWindowDelegate protocol in 10.7.3, at the same time as the | |
| 156 // NSWindowDidChangeBackingPropertiesNotification notification was added. | |
| 157 // If the protocol contains this method description, the notification should | |
| 158 // be supported as well. | |
| 159 Protocol* windowDelegateProtocol = NSProtocolFromString(@"NSWindowDelegate"); | |
| 160 struct objc_method_description methodDescription = | |
| 161 protocol_getMethodDescription( | |
| 162 windowDelegateProtocol, | |
| 163 @selector(windowDidChangeBackingProperties:), | |
| 164 NO, | |
| 165 YES); | |
| 166 | |
| 167 // If the protocol does not contain the method, the returned method | |
| 168 // description is {NULL, NULL} | |
| 169 return methodDescription.name != NULL || methodDescription.types != NULL; | |
| 170 } | |
| 171 | |
| 172 // Private methods: | 149 // Private methods: |
| 173 @interface RenderWidgetHostViewCocoa () | 150 @interface RenderWidgetHostViewCocoa () |
| 174 @property(nonatomic, assign) NSRange selectedRange; | 151 @property(nonatomic, assign) NSRange selectedRange; |
| 175 @property(nonatomic, assign) NSRange markedRange; | 152 @property(nonatomic, assign) NSRange markedRange; |
| 176 | 153 |
| 177 + (BOOL)shouldAutohideCursorForEvent:(NSEvent*)event; | 154 + (BOOL)shouldAutohideCursorForEvent:(NSEvent*)event; |
| 178 - (id)initWithRenderWidgetHostViewMac:(RenderWidgetHostViewMac*)r; | 155 - (id)initWithRenderWidgetHostViewMac:(RenderWidgetHostViewMac*)r; |
| 179 - (void)processedWheelEvent:(const blink::WebMouseWheelEvent&)event | 156 - (void)processedWheelEvent:(const blink::WebMouseWheelEvent&)event |
| 180 consumed:(BOOL)consumed; | 157 consumed:(BOOL)consumed; |
| 181 - (void)processedGestureScrollEvent:(const blink::WebGestureEvent&)event | 158 - (void)processedGestureScrollEvent:(const blink::WebGestureEvent&)event |
| (...skipping 2162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2344 if ([RenderWidgetHostViewCocoa shouldAutohideCursorForEvent:theEvent]) | 2321 if ([RenderWidgetHostViewCocoa shouldAutohideCursorForEvent:theEvent]) |
| 2345 [NSCursor setHiddenUntilMouseMoves:YES]; | 2322 [NSCursor setHiddenUntilMouseMoves:YES]; |
| 2346 } | 2323 } |
| 2347 | 2324 |
| 2348 - (void)forceTouchEvent:(NSEvent*)theEvent { | 2325 - (void)forceTouchEvent:(NSEvent*)theEvent { |
| 2349 if (ui::ForceClickInvokesQuickLook()) | 2326 if (ui::ForceClickInvokesQuickLook()) |
| 2350 [self quickLookWithEvent:theEvent]; | 2327 [self quickLookWithEvent:theEvent]; |
| 2351 } | 2328 } |
| 2352 | 2329 |
| 2353 - (void)shortCircuitScrollWheelEvent:(NSEvent*)event { | 2330 - (void)shortCircuitScrollWheelEvent:(NSEvent*)event { |
| 2354 DCHECK(base::mac::IsOSLionOrLater()); | |
| 2355 | |
| 2356 if ([event phase] != NSEventPhaseEnded && | 2331 if ([event phase] != NSEventPhaseEnded && |
| 2357 [event phase] != NSEventPhaseCancelled) { | 2332 [event phase] != NSEventPhaseCancelled) { |
| 2358 return; | 2333 return; |
| 2359 } | 2334 } |
| 2360 | 2335 |
| 2361 if (renderWidgetHostView_->render_widget_host_) { | 2336 if (renderWidgetHostView_->render_widget_host_) { |
| 2362 // History-swiping is not possible if the logic reaches this point. | 2337 // History-swiping is not possible if the logic reaches this point. |
| 2363 // Allow rubber-banding in both directions. | 2338 // Allow rubber-banding in both directions. |
| 2364 bool canRubberbandLeft = true; | 2339 bool canRubberbandLeft = true; |
| 2365 bool canRubberbandRight = true; | 2340 bool canRubberbandRight = true; |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2511 [responderDelegate_ respondsToSelector:@selector(handleEvent:)]) { | 2486 [responderDelegate_ respondsToSelector:@selector(handleEvent:)]) { |
| 2512 BOOL handled = [responderDelegate_ handleEvent:event]; | 2487 BOOL handled = [responderDelegate_ handleEvent:event]; |
| 2513 if (handled) | 2488 if (handled) |
| 2514 return; | 2489 return; |
| 2515 } | 2490 } |
| 2516 | 2491 |
| 2517 // Use an NSEvent monitor to listen for the wheel-end end. This ensures that | 2492 // Use an NSEvent monitor to listen for the wheel-end end. This ensures that |
| 2518 // the event is received even when the mouse cursor is no longer over the view | 2493 // the event is received even when the mouse cursor is no longer over the view |
| 2519 // when the scrolling ends (e.g. if the tab was switched). This is necessary | 2494 // when the scrolling ends (e.g. if the tab was switched). This is necessary |
| 2520 // for ending rubber-banding in such cases. | 2495 // for ending rubber-banding in such cases. |
| 2521 if (base::mac::IsOSLionOrLater() && [event phase] == NSEventPhaseBegan && | 2496 if ([event phase] == NSEventPhaseBegan && !endWheelMonitor_) { |
| 2522 !endWheelMonitor_) { | |
| 2523 endWheelMonitor_ = | 2497 endWheelMonitor_ = |
| 2524 [NSEvent addLocalMonitorForEventsMatchingMask:NSScrollWheelMask | 2498 [NSEvent addLocalMonitorForEventsMatchingMask:NSScrollWheelMask |
| 2525 handler:^(NSEvent* blockEvent) { | 2499 handler:^(NSEvent* blockEvent) { |
| 2526 [self shortCircuitScrollWheelEvent:blockEvent]; | 2500 [self shortCircuitScrollWheelEvent:blockEvent]; |
| 2527 return blockEvent; | 2501 return blockEvent; |
| 2528 }]; | 2502 }]; |
| 2529 } | 2503 } |
| 2530 | 2504 |
| 2531 // This is responsible for content scrolling! | 2505 // This is responsible for content scrolling! |
| 2532 if (renderWidgetHostView_->render_widget_host_) { | 2506 if (renderWidgetHostView_->render_widget_host_) { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2575 updateEvent.data.pinchUpdate.zoomDisabled = !pinchHasReachedZoomThreshold_; | 2549 updateEvent.data.pinchUpdate.zoomDisabled = !pinchHasReachedZoomThreshold_; |
| 2576 renderWidgetHostView_->render_widget_host_->ForwardGestureEvent(updateEvent); | 2550 renderWidgetHostView_->render_widget_host_->ForwardGestureEvent(updateEvent); |
| 2577 } | 2551 } |
| 2578 | 2552 |
| 2579 - (void)viewWillMoveToWindow:(NSWindow*)newWindow { | 2553 - (void)viewWillMoveToWindow:(NSWindow*)newWindow { |
| 2580 NSWindow* oldWindow = [self window]; | 2554 NSWindow* oldWindow = [self window]; |
| 2581 | 2555 |
| 2582 NSNotificationCenter* notificationCenter = | 2556 NSNotificationCenter* notificationCenter = |
| 2583 [NSNotificationCenter defaultCenter]; | 2557 [NSNotificationCenter defaultCenter]; |
| 2584 | 2558 |
| 2585 // Backing property notifications crash on 10.6 when building with the 10.7 | |
| 2586 // SDK, see http://crbug.com/260595. | |
| 2587 static BOOL supportsBackingPropertiesNotification = | |
| 2588 SupportsBackingPropertiesChangedNotification(); | |
| 2589 | |
| 2590 if (oldWindow) { | 2559 if (oldWindow) { |
| 2591 if (supportsBackingPropertiesNotification) { | 2560 [notificationCenter |
| 2592 [notificationCenter | 2561 removeObserver:self |
| 2593 removeObserver:self | 2562 name:NSWindowDidChangeBackingPropertiesNotification |
| 2594 name:NSWindowDidChangeBackingPropertiesNotification | 2563 object:oldWindow]; |
| 2595 object:oldWindow]; | |
| 2596 } | |
| 2597 [notificationCenter | 2564 [notificationCenter |
| 2598 removeObserver:self | 2565 removeObserver:self |
| 2599 name:NSWindowDidMoveNotification | 2566 name:NSWindowDidMoveNotification |
| 2600 object:oldWindow]; | 2567 object:oldWindow]; |
| 2601 [notificationCenter | 2568 [notificationCenter |
| 2602 removeObserver:self | 2569 removeObserver:self |
| 2603 name:NSWindowDidEndLiveResizeNotification | 2570 name:NSWindowDidEndLiveResizeNotification |
| 2604 object:oldWindow]; | 2571 object:oldWindow]; |
| 2605 [notificationCenter | 2572 [notificationCenter |
| 2606 removeObserver:self | 2573 removeObserver:self |
| 2607 name:NSWindowDidBecomeKeyNotification | 2574 name:NSWindowDidBecomeKeyNotification |
| 2608 object:oldWindow]; | 2575 object:oldWindow]; |
| 2609 [notificationCenter | 2576 [notificationCenter |
| 2610 removeObserver:self | 2577 removeObserver:self |
| 2611 name:NSWindowDidResignKeyNotification | 2578 name:NSWindowDidResignKeyNotification |
| 2612 object:oldWindow]; | 2579 object:oldWindow]; |
| 2613 } | 2580 } |
| 2614 if (newWindow) { | 2581 if (newWindow) { |
| 2615 if (supportsBackingPropertiesNotification) { | 2582 [notificationCenter |
| 2616 [notificationCenter | 2583 addObserver:self |
| 2617 addObserver:self | 2584 selector:@selector(windowDidChangeBackingProperties:) |
| 2618 selector:@selector(windowDidChangeBackingProperties:) | 2585 name:NSWindowDidChangeBackingPropertiesNotification |
| 2619 name:NSWindowDidChangeBackingPropertiesNotification | 2586 object:newWindow]; |
| 2620 object:newWindow]; | |
| 2621 } | |
| 2622 [notificationCenter | 2587 [notificationCenter |
| 2623 addObserver:self | 2588 addObserver:self |
| 2624 selector:@selector(windowChangedGlobalFrame:) | 2589 selector:@selector(windowChangedGlobalFrame:) |
| 2625 name:NSWindowDidMoveNotification | 2590 name:NSWindowDidMoveNotification |
| 2626 object:newWindow]; | 2591 object:newWindow]; |
| 2627 [notificationCenter | 2592 [notificationCenter |
| 2628 addObserver:self | 2593 addObserver:self |
| 2629 selector:@selector(windowChangedGlobalFrame:) | 2594 selector:@selector(windowChangedGlobalFrame:) |
| 2630 name:NSWindowDidEndLiveResizeNotification | 2595 name:NSWindowDidEndLiveResizeNotification |
| 2631 object:newWindow]; | 2596 object:newWindow]; |
| (...skipping 807 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3439 | 3404 |
| 3440 // "-webkit-app-region: drag | no-drag" is implemented on Mac by excluding | 3405 // "-webkit-app-region: drag | no-drag" is implemented on Mac by excluding |
| 3441 // regions that are not draggable. (See ControlRegionView in | 3406 // regions that are not draggable. (See ControlRegionView in |
| 3442 // native_app_window_cocoa.mm). This requires the render host view to be | 3407 // native_app_window_cocoa.mm). This requires the render host view to be |
| 3443 // draggable by default. | 3408 // draggable by default. |
| 3444 - (BOOL)mouseDownCanMoveWindow { | 3409 - (BOOL)mouseDownCanMoveWindow { |
| 3445 return YES; | 3410 return YES; |
| 3446 } | 3411 } |
| 3447 | 3412 |
| 3448 @end | 3413 @end |
| OLD | NEW |