| 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 | 10 |
| (...skipping 2731 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2742 BrowserAccessibilityCocoa* focused_item_cocoa = | 2742 BrowserAccessibilityCocoa* focused_item_cocoa = |
| 2743 focused_item->ToBrowserAccessibilityCocoa(); | 2743 focused_item->ToBrowserAccessibilityCocoa(); |
| 2744 DCHECK(focused_item_cocoa); | 2744 DCHECK(focused_item_cocoa); |
| 2745 if (focused_item_cocoa) | 2745 if (focused_item_cocoa) |
| 2746 return focused_item_cocoa; | 2746 return focused_item_cocoa; |
| 2747 } | 2747 } |
| 2748 } | 2748 } |
| 2749 return [super accessibilityFocusedUIElement]; | 2749 return [super accessibilityFocusedUIElement]; |
| 2750 } | 2750 } |
| 2751 | 2751 |
| 2752 // Below is the nasty tooltip stuff -- copied from WebKit's WebHTMLView.mm | |
| 2753 // with minor modifications for code style and commenting. | |
| 2754 // | |
| 2755 // The 'public' interface is -setToolTipAtMousePoint:. This differs from | |
| 2756 // -setToolTip: in that the updated tooltip takes effect immediately, | |
| 2757 // without the user's having to move the mouse out of and back into the view. | |
| 2758 // | |
| 2759 // Unfortunately, doing this requires sending fake mouseEnter/Exit events to | |
| 2760 // the view, which in turn requires overriding some internal tracking-rect | |
| 2761 // methods (to keep track of its owner & userdata, which need to be filled out | |
| 2762 // in the fake events.) --snej 7/6/09 | |
| 2763 | |
| 2764 | |
| 2765 /* | |
| 2766 * Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. | |
| 2767 * (C) 2006, 2007 Graham Dennis (graham.dennis@gmail.com) | |
| 2768 * | |
| 2769 * Redistribution and use in source and binary forms, with or without | |
| 2770 * modification, are permitted provided that the following conditions | |
| 2771 * are met: | |
| 2772 * | |
| 2773 * 1. Redistributions of source code must retain the above copyright | |
| 2774 * notice, this list of conditions and the following disclaimer. | |
| 2775 * 2. Redistributions in binary form must reproduce the above copyright | |
| 2776 * notice, this list of conditions and the following disclaimer in the | |
| 2777 * documentation and/or other materials provided with the distribution. | |
| 2778 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of | |
| 2779 * its contributors may be used to endorse or promote products derived | |
| 2780 * from this software without specific prior written permission. | |
| 2781 * | |
| 2782 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY | |
| 2783 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | |
| 2784 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
| 2785 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY | |
| 2786 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |
| 2787 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |
| 2788 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |
| 2789 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
| 2790 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | |
| 2791 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| 2792 */ | |
| 2793 | |
| 2794 // Any non-zero value will do, but using something recognizable might help us | |
| 2795 // debug some day. | |
| 2796 static const NSTrackingRectTag kTrackingRectTag = 0xBADFACE; | |
| 2797 | |
| 2798 // Override of a public NSView method, replacing the inherited functionality. | |
| 2799 // See above for rationale. | |
| 2800 - (NSTrackingRectTag)addTrackingRect:(NSRect)rect | |
| 2801 owner:(id)owner | |
| 2802 userData:(void *)data | |
| 2803 assumeInside:(BOOL)assumeInside { | |
| 2804 DCHECK(trackingRectOwner_ == nil); | |
| 2805 trackingRectOwner_ = owner; | |
| 2806 trackingRectUserData_ = data; | |
| 2807 return kTrackingRectTag; | |
| 2808 } | |
| 2809 | |
| 2810 // Override of (apparently) a private NSView method(!) See above for rationale. | |
| 2811 - (NSTrackingRectTag)_addTrackingRect:(NSRect)rect | |
| 2812 owner:(id)owner | |
| 2813 userData:(void *)data | |
| 2814 assumeInside:(BOOL)assumeInside | |
| 2815 useTrackingNum:(int)tag { | |
| 2816 DCHECK(tag == 0 || tag == kTrackingRectTag); | |
| 2817 DCHECK(trackingRectOwner_ == nil); | |
| 2818 trackingRectOwner_ = owner; | |
| 2819 trackingRectUserData_ = data; | |
| 2820 return kTrackingRectTag; | |
| 2821 } | |
| 2822 | |
| 2823 // Override of (apparently) a private NSView method(!) See above for rationale. | |
| 2824 - (void)_addTrackingRects:(NSRect *)rects | |
| 2825 owner:(id)owner | |
| 2826 userDataList:(void **)userDataList | |
| 2827 assumeInsideList:(BOOL *)assumeInsideList | |
| 2828 trackingNums:(NSTrackingRectTag *)trackingNums | |
| 2829 count:(int)count { | |
| 2830 DCHECK(count == 1); | |
| 2831 DCHECK(trackingNums[0] == 0 || trackingNums[0] == kTrackingRectTag); | |
| 2832 DCHECK(trackingRectOwner_ == nil); | |
| 2833 trackingRectOwner_ = owner; | |
| 2834 trackingRectUserData_ = userDataList[0]; | |
| 2835 trackingNums[0] = kTrackingRectTag; | |
| 2836 } | |
| 2837 | |
| 2838 // Override of a public NSView method, replacing the inherited functionality. | |
| 2839 // See above for rationale. | |
| 2840 - (void)removeTrackingRect:(NSTrackingRectTag)tag { | |
| 2841 if (tag == 0) | |
| 2842 return; | |
| 2843 | |
| 2844 if (tag == kTrackingRectTag) { | |
| 2845 trackingRectOwner_ = nil; | |
| 2846 return; | |
| 2847 } | |
| 2848 | |
| 2849 if (tag == lastToolTipTag_) { | |
| 2850 [super removeTrackingRect:tag]; | |
| 2851 lastToolTipTag_ = 0; | |
| 2852 return; | |
| 2853 } | |
| 2854 | |
| 2855 // If any other tracking rect is being removed, we don't know how it was | |
| 2856 // created and it's possible there's a leak involved (see Radar 3500217). | |
| 2857 NOTREACHED(); | |
| 2858 } | |
| 2859 | |
| 2860 // Override of (apparently) a private NSView method(!) | |
| 2861 - (void)_removeTrackingRects:(NSTrackingRectTag *)tags count:(int)count { | |
| 2862 for (int i = 0; i < count; ++i) { | |
| 2863 int tag = tags[i]; | |
| 2864 if (tag == 0) | |
| 2865 continue; | |
| 2866 DCHECK(tag == kTrackingRectTag); | |
| 2867 trackingRectOwner_ = nil; | |
| 2868 } | |
| 2869 } | |
| 2870 | |
| 2871 // Sends a fake NSMouseExited event to the view for its current tracking rect. | |
| 2872 - (void)_sendToolTipMouseExited { | |
| 2873 // Nothing matters except window, trackingNumber, and userData. | |
| 2874 int windowNumber = [[self window] windowNumber]; | |
| 2875 NSEvent* fakeEvent = [NSEvent enterExitEventWithType:NSMouseExited | |
| 2876 location:NSZeroPoint | |
| 2877 modifierFlags:0 | |
| 2878 timestamp:0 | |
| 2879 windowNumber:windowNumber | |
| 2880 context:NULL | |
| 2881 eventNumber:0 | |
| 2882 trackingNumber:kTrackingRectTag | |
| 2883 userData:trackingRectUserData_]; | |
| 2884 [trackingRectOwner_ mouseExited:fakeEvent]; | |
| 2885 } | |
| 2886 | |
| 2887 // Sends a fake NSMouseEntered event to the view for its current tracking rect. | |
| 2888 - (void)_sendToolTipMouseEntered { | |
| 2889 // Nothing matters except window, trackingNumber, and userData. | |
| 2890 int windowNumber = [[self window] windowNumber]; | |
| 2891 NSEvent* fakeEvent = [NSEvent enterExitEventWithType:NSMouseEntered | |
| 2892 location:NSZeroPoint | |
| 2893 modifierFlags:0 | |
| 2894 timestamp:0 | |
| 2895 windowNumber:windowNumber | |
| 2896 context:NULL | |
| 2897 eventNumber:0 | |
| 2898 trackingNumber:kTrackingRectTag | |
| 2899 userData:trackingRectUserData_]; | |
| 2900 [trackingRectOwner_ mouseEntered:fakeEvent]; | |
| 2901 } | |
| 2902 | |
| 2903 // Sets the view's current tooltip, to be displayed at the current mouse | |
| 2904 // location. (This does not make the tooltip appear -- as usual, it only | |
| 2905 // appears after a delay.) Pass null to remove the tooltip. | |
| 2906 - (void)setToolTipAtMousePoint:(NSString *)string { | |
| 2907 NSString *toolTip = [string length] == 0 ? nil : string; | |
| 2908 if ((toolTip && toolTip_ && [toolTip isEqualToString:toolTip_]) || | |
| 2909 (!toolTip && !toolTip_)) { | |
| 2910 return; | |
| 2911 } | |
| 2912 | |
| 2913 if (toolTip_) { | |
| 2914 [self _sendToolTipMouseExited]; | |
| 2915 } | |
| 2916 | |
| 2917 toolTip_.reset([toolTip copy]); | |
| 2918 | |
| 2919 if (toolTip) { | |
| 2920 // See radar 3500217 for why we remove all tooltips | |
| 2921 // rather than just the single one we created. | |
| 2922 [self removeAllToolTips]; | |
| 2923 NSRect wideOpenRect = NSMakeRect(-100000, -100000, 200000, 200000); | |
| 2924 lastToolTipTag_ = [self addToolTipRect:wideOpenRect | |
| 2925 owner:self | |
| 2926 userData:NULL]; | |
| 2927 [self _sendToolTipMouseEntered]; | |
| 2928 } | |
| 2929 } | |
| 2930 | |
| 2931 // NSView calls this to get the text when displaying the tooltip. | |
| 2932 - (NSString *)view:(NSView *)view | |
| 2933 stringForToolTip:(NSToolTipTag)tag | |
| 2934 point:(NSPoint)point | |
| 2935 userData:(void *)data { | |
| 2936 return [[toolTip_ copy] autorelease]; | |
| 2937 } | |
| 2938 | |
| 2939 // Below is our NSTextInputClient implementation. | 2752 // Below is our NSTextInputClient implementation. |
| 2940 // | 2753 // |
| 2941 // When WebHTMLView receives a NSKeyDown event, WebHTMLView calls the following | 2754 // When WebHTMLView receives a NSKeyDown event, WebHTMLView calls the following |
| 2942 // functions to process this event. | 2755 // functions to process this event. |
| 2943 // | 2756 // |
| 2944 // [WebHTMLView keyDown] -> | 2757 // [WebHTMLView keyDown] -> |
| 2945 // EventHandler::keyEvent() -> | 2758 // EventHandler::keyEvent() -> |
| 2946 // ... | 2759 // ... |
| 2947 // [WebEditorClient handleKeyboardEvent] -> | 2760 // [WebEditorClient handleKeyboardEvent] -> |
| 2948 // [WebHTMLView _interceptEditingKeyEvent] -> | 2761 // [WebHTMLView _interceptEditingKeyEvent] -> |
| (...skipping 545 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3494 | 3307 |
| 3495 // "-webkit-app-region: drag | no-drag" is implemented on Mac by excluding | 3308 // "-webkit-app-region: drag | no-drag" is implemented on Mac by excluding |
| 3496 // regions that are not draggable. (See ControlRegionView in | 3309 // regions that are not draggable. (See ControlRegionView in |
| 3497 // native_app_window_cocoa.mm). This requires the render host view to be | 3310 // native_app_window_cocoa.mm). This requires the render host view to be |
| 3498 // draggable by default. | 3311 // draggable by default. |
| 3499 - (BOOL)mouseDownCanMoveWindow { | 3312 - (BOOL)mouseDownCanMoveWindow { |
| 3500 return YES; | 3313 return YES; |
| 3501 } | 3314 } |
| 3502 | 3315 |
| 3503 @end | 3316 @end |
| OLD | NEW |