[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