[webkit-changes] cvs commit: WebKit/WebView.subproj WebHTMLView.m WebPDFView.m WebTextView.m WebView.m WebViewInternal.h

John sullivan at opensource.apple.com
Tue Sep 20 15:31:08 PDT 2005


sullivan    05/09/20 15:31:07

  Modified:    .        ChangeLog
               WebView.subproj WebHTMLView.m WebPDFView.m WebTextView.m
                        WebView.m WebViewInternal.h
  Log:
          Reviewed by Tim Omernick.
  
          - fixed <rdar://problem/3228554> We should enforce one selection per WebView instead of per window
  
          Note that this checkin does not mean that we will always maintain a selection in a WebView when
          the focus is elsewhere. Instead it means that there should never be more than one frame containing
          a selection in a WebView, and that it's possible to maintain a selection in a WebView when the focus
          is elsewhere.
  
          * WebView.subproj/WebView.m:
          (-[WebView searchFor:direction:caseSensitive:wrap:]):
          removed unnecessary and somewhat confusing comment
          (-[WebView selectedFrame]):
          now calls the extracted method -_focusedFrame
          (-[WebView _focusedFrame]):
          new method, extracted from -selectedFrame; returns frame containing first responder, if any
          (-[WebView _findSelectedFrameStartingFromFrame:skippingFrame:]):
          added skippingFrame parameter, which is never returned
          (-[WebView _findSelectedFrameSkippingFrame:]):
          new method, starts from main frame and passes a frame to skip
          (-[WebView _findSelectedFrame]):
          now calls _findSelectedFrameSkippingFrame:nil
          (-[WebView _selectedFrameDidChange]):
          new method, called by WebDocumentText protocol implementors; calls -deselectAll on frame that
          formerly displayed a selection, if any
  
          * WebView.subproj/WebViewInternal.h:
          added category WebDocumentSelectionExtras, with the one method _selectedFrameDidChange
  
          * WebView.subproj/WebHTMLView.m:
          (-[WebHTMLView becomeFirstResponder]):
          call -[WebView _selectedFrameDidChange]
  
          * WebView.subproj/WebPDFView.m:
          (-[WebPDFView becomeFirstResponder]):
          call -[WebView _selectedFrameDidChange]
          (-[WebPDFView resignFirstResponder]):
          deselect all unless webview says not to; note that this doesn't work in all cases due to:
          <rdar://problem/4265966> PDFs continue to show a (secondary) selection when the focus moves elsewhere
  
          * WebView.subproj/WebTextView.m:
          (-[WebTextView becomeFirstResponder]):
          call -[WebView _selectedFrameDidChange]
          (-[WebTextView resignFirstResponder]):
          deselect all unless webview says not to
  
  Revision  Changes    Path
  1.3327    +48 -0     WebKit/ChangeLog
  
  Index: ChangeLog
  ===================================================================
  RCS file: /cvs/root/WebKit/ChangeLog,v
  retrieving revision 1.3326
  retrieving revision 1.3327
  diff -u -r1.3326 -r1.3327
  --- ChangeLog	20 Sep 2005 08:32:58 -0000	1.3326
  +++ ChangeLog	20 Sep 2005 22:30:59 -0000	1.3327
  @@ -1,3 +1,51 @@
  +2005-09-20  John Sullivan  <sullivan at apple.com>
  +
  +        Reviewed by Tim Omernick.
  +
  +        - fixed <rdar://problem/3228554> We should enforce one selection per WebView instead of per window
  +        
  +        Note that this checkin does not mean that we will always maintain a selection in a WebView when
  +        the focus is elsewhere. Instead it means that there should never be more than one frame containing
  +        a selection in a WebView, and that it's possible to maintain a selection in a WebView when the focus 
  +        is elsewhere.
  +
  +        * WebView.subproj/WebView.m:
  +        (-[WebView searchFor:direction:caseSensitive:wrap:]):
  +        removed unnecessary and somewhat confusing comment
  +        (-[WebView selectedFrame]):
  +        now calls the extracted method -_focusedFrame
  +        (-[WebView _focusedFrame]):
  +        new method, extracted from -selectedFrame; returns frame containing first responder, if any
  +        (-[WebView _findSelectedFrameStartingFromFrame:skippingFrame:]):
  +        added skippingFrame parameter, which is never returned
  +        (-[WebView _findSelectedFrameSkippingFrame:]):
  +        new method, starts from main frame and passes a frame to skip
  +        (-[WebView _findSelectedFrame]):
  +        now calls _findSelectedFrameSkippingFrame:nil
  +        (-[WebView _selectedFrameDidChange]):
  +        new method, called by WebDocumentText protocol implementors; calls -deselectAll on frame that
  +        formerly displayed a selection, if any
  +
  +        * WebView.subproj/WebViewInternal.h:
  +        added category WebDocumentSelectionExtras, with the one method _selectedFrameDidChange
  +
  +        * WebView.subproj/WebHTMLView.m:
  +        (-[WebHTMLView becomeFirstResponder]):
  +        call -[WebView _selectedFrameDidChange]
  +
  +        * WebView.subproj/WebPDFView.m:
  +        (-[WebPDFView becomeFirstResponder]):
  +        call -[WebView _selectedFrameDidChange]
  +        (-[WebPDFView resignFirstResponder]):
  +        deselect all unless webview says not to; note that this doesn't work in all cases due to:
  +        <rdar://problem/4265966> PDFs continue to show a (secondary) selection when the focus moves elsewhere        
  +
  +        * WebView.subproj/WebTextView.m:
  +        (-[WebTextView becomeFirstResponder]):
  +        call -[WebView _selectedFrameDidChange]
  +        (-[WebTextView resignFirstResponder]):
  +        deselect all unless webview says not to
  +
   2005-09-20  Eric Seidel  <eseidel at apple.com>
   
           Reviewed by mjs.
  
  
  
  1.469     +1 -2      WebKit/WebView.subproj/WebHTMLView.m
  
  Index: WebHTMLView.m
  ===================================================================
  RCS file: /cvs/root/WebKit/WebView.subproj/WebHTMLView.m,v
  retrieving revision 1.468
  retrieving revision 1.469
  diff -u -r1.468 -r1.469
  --- WebHTMLView.m	20 Sep 2005 08:33:04 -0000	1.468
  +++ WebHTMLView.m	20 Sep 2005 22:31:05 -0000	1.469
  @@ -2947,14 +2947,13 @@
       if (view) {
           [[self window] makeFirstResponder:view];
       }
  +    [[self _webView] _selectedFrameDidChange];
       [self updateFocusState];
       [self _updateFontPanel];
       _private->startNewKillRingSequence = YES;
       return YES;
   }
   
  -// This approach could be relaxed when dealing with 3228554.
  -// Some alteration to the selection behavior was done to deal with 3672088.
   - (BOOL)resignFirstResponder
   {
       BOOL resign = [super resignFirstResponder];
  
  
  
  1.27      +19 -0     WebKit/WebView.subproj/WebPDFView.m
  
  Index: WebPDFView.m
  ===================================================================
  RCS file: /cvs/root/WebKit/WebView.subproj/WebPDFView.m,v
  retrieving revision 1.26
  retrieving revision 1.27
  diff -u -r1.26 -r1.27
  --- WebPDFView.m	20 Sep 2005 08:33:06 -0000	1.26
  +++ WebPDFView.m	20 Sep 2005 22:31:06 -0000	1.27
  @@ -40,6 +40,7 @@
   #import <WebKit/WebPDFView.h>
   #import <WebKit/WebUIDelegate.h>
   #import <WebKit/WebView.h>
  +#import <WebKit/WebViewInternal.h>
   #import <WebKit/WebViewPrivate.h>
   #import <WebKit/WebPreferencesPrivate.h>
   #import <WebKit/WebPDFRepresentation.h>
  @@ -724,6 +725,24 @@
       }
   }
   
  +- (BOOL)becomeFirstResponder
  +{
  +    BOOL result = [super becomeFirstResponder];
  +    if (result) {
  +        [[self _webView] _selectedFrameDidChange];
  +    }
  +    return result;
  +}
  +
  +- (BOOL)resignFirstResponder
  +{
  +    BOOL resign = [super resignFirstResponder];
  +    if (resign && ![[self _web_parentWebView] maintainsInactiveSelection]) {
  +        [self deselectAll];
  +    }
  +    return resign;
  +}
  +
   @end
   
   @implementation PDFPrefUpdatingProxy
  
  
  
  1.62      +11 -3     WebKit/WebView.subproj/WebTextView.m
  
  Index: WebTextView.m
  ===================================================================
  RCS file: /cvs/root/WebKit/WebView.subproj/WebTextView.m,v
  retrieving revision 1.61
  retrieving revision 1.62
  diff -u -r1.61 -r1.62
  --- WebTextView.m	20 Sep 2005 08:33:06 -0000	1.61
  +++ WebTextView.m	20 Sep 2005 22:31:06 -0000	1.62
  @@ -34,13 +34,13 @@
   #import <WebKit/WebDocumentInternal.h>
   #import <WebKit/WebFramePrivate.h>
   #import <WebKit/WebFrameInternal.h>
  -
   #import <WebKit/WebFrameView.h>
   #import <WebKit/WebNSObjectExtras.h>
   #import <WebKit/WebNSURLExtras.h>
   #import <WebKit/WebNSViewExtras.h>
   #import <WebKit/WebPreferences.h>
   #import <WebKit/WebTextRendererFactory.h>
  +#import <WebKit/WebViewInternal.h>
   #import <WebKit/WebViewPrivate.h>
   #import <WebKit/WebTextRepresentation.h>
   
  @@ -345,11 +345,19 @@
       return [webView _menuForElement:[self _elementAtWindowPoint:[event locationInWindow]] defaultItems:nil];
   }
   
  -// This approach could be relaxed when dealing with 3228554
  +- (BOOL)becomeFirstResponder
  +{
  +    BOOL result = [super becomeFirstResponder];
  +    if (result) {
  +        [[self _web_parentWebView] _selectedFrameDidChange];
  +    }
  +    return result;
  +}
  +
   - (BOOL)resignFirstResponder
   {
       BOOL resign = [super resignFirstResponder];
  -    if (resign) {
  +    if (resign && ![[self _web_parentWebView] maintainsInactiveSelection]) {
           [self deselectAll];
       }
       return resign;
  
  
  
  1.307     +46 -14    WebKit/WebView.subproj/WebView.m
  
  Index: WebView.m
  ===================================================================
  RCS file: /cvs/root/WebKit/WebView.subproj/WebView.m,v
  retrieving revision 1.306
  retrieving revision 1.307
  diff -u -r1.306 -r1.307
  --- WebView.m	20 Sep 2005 08:33:06 -0000	1.306
  +++ WebView.m	20 Sep 2005 22:31:06 -0000	1.307
  @@ -206,12 +206,14 @@
   - (void)_debugCheckForMultipleSelectedFrames;
   #endif
   - (WebFrame *)_findSelectedFrame;
  +- (WebFrame *)_findSelectedFrameSkippingFrame:(WebFrame *)frameToSkip;
   - (WebFrame *)_selectedOrMainFrame;
   - (WebBridge *)_bridgeForSelectedOrMainFrame;
   - (BOOL)_isLoading;
   - (WebFrameView *)_frameViewAtWindowPoint:(NSPoint)point;
   - (WebBridge *)_bridgeAtPoint:(NSPoint)point;
   - (void)_deselectFrame:(WebFrame *)frame;
  +- (WebFrame *)_focusedFrame;
   - (BOOL)_frameIsSelected:(WebFrame *)frame;
   - (void)_preflightSpellChecker;
   - (BOOL)_continuousCheckingAllowed;
  @@ -2213,8 +2215,6 @@
                   startSearchView = searchView;
               }
               
  -            // Note at this point we are assuming the search will be done top-to-bottom,
  -            // not starting at any selection that exists.  See 3228554.
               if ([searchView searchFor:string direction:forward caseSensitive:caseFlag wrap:NO]) {
                   WebFrame *newSelectedFrame = [(WebFrameView *)[searchView _web_superviewOfClass:[WebFrameView class]] webFrame];
                   if (newSelectedFrame != startFrame) {
  @@ -2517,18 +2517,14 @@
       // If the first responder is a view in our tree, we get the frame containing the first responder.
       // This is faster than searching the frame hierarchy, and will give us a result even in the case
       // where the focused frame doesn't actually contain a selection.
  -    NSResponder *resp = [[self window] firstResponder];
  -    if (resp && [resp isKindOfClass:[NSView class]] && [(NSView *)resp isDescendantOf:self]) {
  -        WebFrameView *frameView = [resp isKindOfClass:[WebFrameView class]] 
  -            ? (WebFrameView *)resp 
  -            : (WebFrameView *)[(NSView *)resp _web_superviewOfClass:[WebFrameView class]];
  -        ASSERT(frameView != nil);
  +    WebFrame *focusedFrame = [self _focusedFrame];
  +    if (focusedFrame != nil) {
   #ifndef NDEBUG
           WebFrame *frameWithSelection = [self _findSelectedFrame];
  -        ASSERT(frameWithSelection == nil || frameWithSelection == [frameView webFrame]);
  +        ASSERT(frameWithSelection == nil || frameWithSelection == focusedFrame);
           [self _debugCheckForMultipleSelectedFrames];
   #endif
  -        return [frameView webFrame];
  +        return focusedFrame;
       }
       
       // If the first responder is outside of our view tree, we search for a frame containing a selection.
  @@ -2971,6 +2967,20 @@
   
   @implementation WebView (WebFileInternal)
   
  +- (WebFrame *)_focusedFrame
  +{
  +    NSResponder *resp = [[self window] firstResponder];
  +    if (resp && [resp isKindOfClass:[NSView class]] && [(NSView *)resp isDescendantOf:self]) {
  +        WebFrameView *frameView = [resp isKindOfClass:[WebFrameView class]] 
  +        ? (WebFrameView *)resp 
  +        : (WebFrameView *)[(NSView *)resp _web_superviewOfClass:[WebFrameView class]];
  +        ASSERT(frameView != nil);
  +        return [frameView webFrame];
  +    }
  +    
  +    return nil;
  +}
  +
   - (BOOL)_frameIsSelected:(WebFrame *)frame
   {
       id documentView = [[frame frameView] documentView];    
  @@ -2996,9 +3006,9 @@
       }
   }
   
  -- (WebFrame *)_findSelectedFrameStartingFromFrame:(WebFrame *)frame
  +- (WebFrame *)_findSelectedFrameStartingFromFrame:(WebFrame *)frame skippingFrame:(WebFrame *)frameToSkip
   {
  -    if ([self _frameIsSelected:frame]) {
  +    if (frame != frameToSkip && [self _frameIsSelected:frame]) {
           return frame;
       }
       
  @@ -3006,7 +3016,7 @@
       int i;
       int count = [frames count];
       for (i = 0; i < count; i++) {
  -        WebFrame *selectedChildFrame = [self _findSelectedFrameStartingFromFrame:[frames objectAtIndex:i]];
  +        WebFrame *selectedChildFrame = [self _findSelectedFrameStartingFromFrame:[frames objectAtIndex:i] skippingFrame:frameToSkip];
           if (selectedChildFrame != nil) {
               return selectedChildFrame;
           }
  @@ -3015,9 +3025,14 @@
       return nil;
   }
   
  +- (WebFrame *)_findSelectedFrameSkippingFrame:(WebFrame *)frameToSkip
  +{
  +    return [self _findSelectedFrameStartingFromFrame:[self mainFrame] skippingFrame:frameToSkip];
  +}
  +
   - (WebFrame *)_findSelectedFrame
   {
  -    return [self _findSelectedFrameStartingFromFrame:[self mainFrame]];
  +    return [self _findSelectedFrameSkippingFrame:nil];
   }
   
   #ifndef DEBUG
  @@ -3205,3 +3220,20 @@
   }
   
   @end
  +
  + at implementation WebView (WebDocumentSelectionExtras)
  +
  +- (void)_selectedFrameDidChange
  +{
  +    // We rely on WebDocumentSelection protocol implementors to call this method when they become first 
  +    // responder. It would be nicer to just notice first responder changes here instead, but there's no 
  +    // notification sent when the first responder changes in general (Radar 2573089).
  +    [self _deselectFrame:[self _findSelectedFrameSkippingFrame:[self _focusedFrame]]];
  +
  +#ifndef NDEBUG
  +    // While we're in the general area of selection and frames, check that there is only one now.
  +    [self _debugCheckForMultipleSelectedFrames];
  +#endif
  +}
  +
  + at end
  
  
  
  1.22      +5 -0      WebKit/WebView.subproj/WebViewInternal.h
  
  Index: WebViewInternal.h
  ===================================================================
  RCS file: /cvs/root/WebKit/WebView.subproj/WebViewInternal.h,v
  retrieving revision 1.21
  retrieving revision 1.22
  diff -u -r1.21 -r1.22
  --- WebViewInternal.h	14 Aug 2005 09:12:48 -0000	1.21
  +++ WebViewInternal.h	20 Sep 2005 22:31:06 -0000	1.22
  @@ -127,3 +127,8 @@
   - (BOOL)_shouldEndEditingInDOMRange:(DOMRange *)range;
   - (BOOL)_canPaste;
   @end
  +
  + at interface WebView (WebDocumentSelectionExtras)
  +// WebDocumentSelection protocol implementors should call this in becomeFirstResponder
  +- (void)_selectedFrameDidChange;
  + at end
  
  
  



More information about the webkit-changes mailing list