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