Reviewed by Timothy.
authorthatcher <thatcher@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 20 Apr 2006 02:18:56 +0000 (02:18 +0000)
committerthatcher <thatcher@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 20 Apr 2006 02:18:56 +0000 (02:18 +0000)
        http://bugzilla.opendarwin.org/show_bug.cgi?id=8442
        Bug 8442: improvements to Cocoa bindings support in WebView - code simplification

        Removes the WebController class added earlier; changes NSTreeController and
        WebView to together without it. Now you can just bind the contentObject binding
        of the tree controller directly to the mainFrameDocument key of the WebView.

        * WebCoreSupport/WebFrameBridge.m:
        (-[WebFrameBridge windowObjectCleared]):
        * WebView/WebDataSource.m:
        (-[WebDataSource _setTitle:]):
        * WebView/WebFrame.m:
        (-[WebFrame _closeOldDataSources]):
        * WebView/WebView.m:
        (-[WebView _progressStarted:]):
        (-[WebView _finalProgressComplete]):
        (-[WebView _commonInitializationWithFrameName:groupName:]):
        (-[WebView setMainFrameDocumentReady:]):
        (-[WebView mainFrameDocument]):
        * WebView/WebViewPrivate.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@13980 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebKit/ChangeLog
WebKit/WebCoreSupport/WebFrameBridge.m
WebKit/WebView/WebDataSource.m
WebKit/WebView/WebFrame.m
WebKit/WebView/WebView.m
WebKit/WebView/WebViewPrivate.h

index 1167997cb08a96dcc5bbff5c2cc6c508371f3128..822f40f423b5da19419d7db0831ca3326a827d87 100644 (file)
@@ -1,3 +1,28 @@
+2006-04-19  James G. Speth  <speth@end.com>
+
+        Reviewed by Timothy.
+
+        http://bugzilla.opendarwin.org/show_bug.cgi?id=8442
+        Bug 8442: improvements to Cocoa bindings support in WebView - code simplification
+
+        Removes the WebController class added earlier; changes NSTreeController and 
+        WebView to together without it. Now you can just bind the contentObject binding
+        of the tree controller directly to the mainFrameDocument key of the WebView.
+
+        * WebCoreSupport/WebFrameBridge.m:
+        (-[WebFrameBridge windowObjectCleared]):
+        * WebView/WebDataSource.m:
+        (-[WebDataSource _setTitle:]):
+        * WebView/WebFrame.m:
+        (-[WebFrame _closeOldDataSources]):
+        * WebView/WebView.m:
+        (-[WebView _progressStarted:]):
+        (-[WebView _finalProgressComplete]):
+        (-[WebView _commonInitializationWithFrameName:groupName:]):
+        (-[WebView setMainFrameDocumentReady:]):
+        (-[WebView mainFrameDocument]):
+        * WebView/WebViewPrivate.h:
+
 2006-04-19  James G. Speth  <speth@end.com>
 
         Reviewed by Timothy.
index 4dd561b130f22115b1dad0d8018fc8aad18bedda..7efeb4e2f784c7480b88fc003abb3627db78dd0e 100644 (file)
@@ -1503,10 +1503,6 @@ static id <WebFormDelegate> formDelegate(WebFrameBridge *self)
 {
     WebView *wv = [self webView];
     [[wv _frameLoadDelegateForwarder] webView:wv windowScriptObjectAvailable:[self windowScriptObject]];
-    // this KVO notification first started in WebView's _progressStarted:, and gets finished here
-    [wv _didChangeValueForKey:_WebMainFrameDocumentKey];
-    // start another change notification that will be completed in WebView's _finalProgressComplete:
-    [wv _willChangeValueForKey:_WebMainFrameDocumentKey];
     if ([wv scriptDebugDelegate]) {
         [_frame _attachScriptDebugger];
     }
index bd7066e52de9dd255c6a2aea12336e73d590712c..58a17fa059813a6f321599051566ad4898e215cf 100644 (file)
             // it has the right notion of the current b/f item.
             [[self webFrame] _setTitle:_private->pageTitle];
             
+            [[self _webView] setMainFrameDocumentReady:YES];    // update observers with new DOMDocument
             [[[self _webView] _frameLoadDelegateForwarder] webView:[self _webView]
                                                      didReceiveTitle:_private->pageTitle
                                                             forFrame:[self webFrame]];
index 6e854772311505291a54973ec9fa736640534c96..403e8431d51f8d952035fe729e2b4de47c5a74ca 100644 (file)
@@ -545,6 +545,7 @@ static inline WebFrame *Frame(WebCoreFrameBridge *bridge)
 
     if (_private->dataSource)
         [[[self webView] _frameLoadDelegateForwarder] webView:[self webView] willCloseFrame:self];
+    [[self webView] setMainFrameDocumentReady:NO];  // stop giving out the actual DOMDocument to observers
 }
 
 - (void)_detachFromParent
index 0c779aeb7b7b57d52d0e3b86630cd47c8c0f1190..6dcfee9f3d6e674483bc4fcf05a5e4fb1b2c71da 100644 (file)
@@ -270,6 +270,7 @@ macro(yankAndSelect) \
     
     void *observationInfo;
     
+    BOOL mainFrameDocumentReady;
     BOOL drawsBackground;
     BOOL editable;
     BOOL initiatedDrag;
@@ -1039,7 +1040,6 @@ static bool debugWidget = true;
         _private->progressValue = INITIAL_PROGRESS_VALUE;
         _private->originatingProgressFrame = [frame retain];
         [[NSNotificationCenter defaultCenter] postNotificationName:WebViewProgressStartedNotification object:self];
-        [self _willChangeValueForKey:_WebMainFrameDocumentKey];     // paired with didChange.. in windowObjectCleared
     }
     _private->numProgressTrackedFrames++;
     [self _didChangeValueForKey: @"estimatedProgress"];
@@ -1054,12 +1054,11 @@ static bool debugWidget = true;
     if (!_private->finalProgressChangedSent) {
         _private->progressValue = 1;
         [[NSNotificationCenter defaultCenter] postNotificationName:WebViewProgressEstimateChangedNotification object:self];
-        // send the final KVO message, ending the willChange.. from WebFrameBridge windowObjectCleared
-        [self _didChangeValueForKey:_WebMainFrameDocumentKey];
     }
     
     [self _resetProgress];
     
+    [self setMainFrameDocumentReady:YES];   // make sure this is turned on at this point
     [[NSNotificationCenter defaultCenter] postNotificationName:WebViewProgressFinishedNotification object:self];
 }
 
@@ -1577,6 +1576,7 @@ NSMutableDictionary *countInvocations;
 
 - (void)_commonInitializationWithFrameName:(NSString *)frameName groupName:(NSString *)groupName
 {
+    _private->mainFrameDocumentReady = NO;
     _private->drawsBackground = YES;
     _private->smartInsertDeleteEnabled = YES;
 
@@ -2524,82 +2524,6 @@ static WebFrame *incrementFrame(WebFrame *curr, BOOL forward, BOOL wrapFlag)
 
 @end
 
-@implementation WebController
-
-- (id)init
-{
-    self = [super init];
-    if (self == nil)
-        return nil;
-    [self setChildrenKeyPath:@"childNodes"];
-    [self setObjectClass:[DOMNode class]];
-    return self;
-}
-
-- (NSArray *)exposedBindings
-{
-    NSArray *bindings = [super exposedBindings];
-    return [bindings arrayByAddingObject:@"webView"];
-}
-
-- (Class)valueClassForBinding:(NSString *)binding
-{
-    if ([binding isEqualToString:@"webView"])
-        return [WebView class];
-    return [super valueClassForBinding:binding];
-}
-
-- (void)setContent:(id)newContent
-{
-    // override NSTreeController's setContent: to prevent crash when changing the tree
-    //   see http://www.cocoadev.com/index.pl?NSTreeControllerBugOrDeveloperError
-    
-    // in our case, it prevents a crash in NSTreeController that occurs when:
-    // 1. an outline view has a column bound to arrangedObjects.nodeName
-    // 2. a text field has its value bound to selection.innerHTML
-    // 3. a node is selected in the outline view
-    // 4. a new page is loaded in the WebView
-    //    -> crash
-    // step 3 is necessary for the crash, it does not happen when there's no selection
-    
-    // retain original values while the content changes
-    id content = [[self content] retain];
-    NSArray *paths = [[self selectionIndexPaths] retain];
-    NSString *childrenKeyPath = [[self childrenKeyPath] retain];
-    
-    // clear the tree controller state as much as possible
-    [self setSelectionIndexPaths:nil];
-    [super setContent:nil];
-    
-    // set the new content and restore the configuration
-    [super setContent:newContent];
-    [self setChildrenKeyPath:childrenKeyPath];
-    [self setSelectionIndexPaths:paths];
-    
-    // release the original content and the temporary storage
-    [content release];
-    [paths release];
-    [childrenKeyPath release];
-}
-
-- (WebView *)webView
-{
-    return [[webView retain] autorelease];
-}
-
-- (void)setWebView:(WebView *)newWebView
-{
-    if (newWebView == webView)
-        return;
-    [self unbind:@"contentObject"];
-    id old = webView;
-    webView = [newWebView retain];
-    [old release];
-    [self bind:@"contentObject" toObject:webView withKeyPath:_WebMainFrameDocumentKey options:nil];
-}
-
-@end
-
 @implementation WebView (WebPendingPublic)
 
 - (void)setMainFrameURL:(NSString *)URLString
@@ -2633,9 +2557,26 @@ static WebFrame *incrementFrame(WebFrame *curr, BOOL forward, BOOL wrapFlag)
     return [[WebIconDatabase sharedIconDatabase] iconForURL:[[[[self mainFrame] dataSource] _URL] _web_originalDataAsString] withSize:WebIconSmallSize];
 }
 
+- (void)setMainFrameDocumentReady:(BOOL)mainFrameDocumentReady
+{
+    // by setting this to NO, calls to mainFrameDocument are forced to return nil
+    // setting this to YES lets it return the actual DOMDocument value
+    // we use this to tell NSTreeController to reset its observers and clear its state
+    if (_private->mainFrameDocumentReady == mainFrameDocumentReady)
+        return;
+    [self _willChangeValueForKey:_WebMainFrameDocumentKey];
+    _private->mainFrameDocumentReady = mainFrameDocumentReady;
+    [self _didChangeValueForKey:_WebMainFrameDocumentKey];
+    // this will cause observers to call mainFrameDocument where this flag will be checked
+}
+
 - (DOMDocument *)mainFrameDocument
 {
-    return [[self mainFrame] DOMDocument];
+    // only return the actual value if the state we're in gives NSTreeController
+    // enough time to release its observers on the old model
+    if (_private->mainFrameDocumentReady)
+        return [[self mainFrame] DOMDocument];
+    return nil;
 }
 
 - (void)setDrawsBackground:(BOOL)drawsBackground
index ccc8547797bf6945f00ba38d888a046e41b82659..777ce5b9e0fa884ef11201f6e6ef95800b224ea3 100644 (file)
@@ -89,6 +89,8 @@ typedef enum {
 - (BOOL)isLoading;
 - (NSString *)mainFrameTitle;
 - (NSImage *)mainFrameIcon;
+
+- (void)setMainFrameDocumentReady:(BOOL)mainFrameDocumentReady;
 - (DOMDocument *)mainFrameDocument;
 
 - (void)setDrawsBackground:(BOOL)drawsBackround;