[SCM] WebKit Debian packaging branch, debian/unstable, updated. debian/1.1.15-1-40151-g37bb677

cblu cblu at 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Sat Sep 26 07:44:56 UTC 2009


The following commit has been merged in the debian/unstable branch:
commit c60443bab82c856a0452d8716b801ddf54f88736
Author: cblu <cblu at 268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Wed Jun 11 01:20:24 2003 +0000

    	Fixed: <rdar://problem/3156169>: cmd-click opens new win but stops loading in prev win
    
            Reviewed by rjw.
    
            * WebView.subproj/WebFrame.m:
            (-[WebFrame stopLoading]): set the provisional data source to nil to avoid a newly added assert in [WebFramePrivate setProvisionalDataSource:]
            and since it is wasteful to retain it in this case
            * WebView.subproj/WebFramePrivate.h: added policyDataSource and policyLoadType ivars
            * WebView.subproj/WebFramePrivate.m:
            (-[WebFramePrivate dealloc]): added an assert
            (-[WebFramePrivate setProvisionalDataSource:]): added an assert
            (-[WebFrame _isLoadComplete]): formatting tweak
            (-[WebFrame _invalidatePendingPolicyDecisionCallingDefaultAction:]): reset policyDataSource
            (-[WebFrame _checkNewWindowPolicyForRequest:action:frameName:formState:andCall:withSelector:]): formatting tweak
            (-[WebFrame _prepareForProvisionalLoadWithDataSource:loadType:]): new, calls stopLoading, _setLoadType and _setProvisionalDataSource
            (-[WebFrame _checkNavigationPolicyForRequest:dataSource:formState:andCall:withSelector:]): call _prepareForProvisionalLoadWithDataSource:loadType: only in the "use" policy case
            (-[WebFrame _continueAfterNavigationPolicy:]): call _setProvisionalDataSource:andLoadType:
            (-[WebFrame _continueFragmentScrollAfterNavigationPolicy:formState:]): formatting tweak
            (-[WebFrame _loadURL:referrer:loadType:target:triggeringEvent:form:formValues:]): formatting tweak
            (-[WebFrame _continueLoadRequestAfterNavigationPolicy:formState:]): if there is no request to continue with, don't reset things like the provisional data source since it was never unset in this case
            (-[WebFrame _loadDataSource:withLoadType:formState:]): don't call stopLoading, _setLoadType and _setProvisionalDataSource, since that stops the frame even for command-click and option-click. Do this work in _prepareForProvisionalLoadWithDataSource:loadType: instead.
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@4519 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebKit/ChangeLog b/WebKit/ChangeLog
index c4c1c92..018fc32 100644
--- a/WebKit/ChangeLog
+++ b/WebKit/ChangeLog
@@ -1,3 +1,27 @@
+2003-06-10  Chris Blumenberg  <cblu at apple.com>
+
+	Fixed: <rdar://problem/3156169>: cmd-click opens new win but stops loading in prev win
+
+        Reviewed by rjw.
+
+        * WebView.subproj/WebFrame.m:
+        (-[WebFrame stopLoading]): set the provisional data source to nil to avoid a newly added assert in [WebFramePrivate setProvisionalDataSource:] 
+        and since it is wasteful to retain it in this case
+        * WebView.subproj/WebFramePrivate.h: added policyDataSource and policyLoadType ivars
+        * WebView.subproj/WebFramePrivate.m:
+        (-[WebFramePrivate dealloc]): added an assert
+        (-[WebFramePrivate setProvisionalDataSource:]): added an assert
+        (-[WebFrame _isLoadComplete]): formatting tweak
+        (-[WebFrame _invalidatePendingPolicyDecisionCallingDefaultAction:]): reset policyDataSource
+        (-[WebFrame _checkNewWindowPolicyForRequest:action:frameName:formState:andCall:withSelector:]): formatting tweak
+        (-[WebFrame _prepareForProvisionalLoadWithDataSource:loadType:]): new, calls stopLoading, _setLoadType and _setProvisionalDataSource
+        (-[WebFrame _checkNavigationPolicyForRequest:dataSource:formState:andCall:withSelector:]): call _prepareForProvisionalLoadWithDataSource:loadType: only in the "use" policy case
+        (-[WebFrame _continueAfterNavigationPolicy:]): call _setProvisionalDataSource:andLoadType:
+        (-[WebFrame _continueFragmentScrollAfterNavigationPolicy:formState:]): formatting tweak
+        (-[WebFrame _loadURL:referrer:loadType:target:triggeringEvent:form:formValues:]): formatting tweak
+        (-[WebFrame _continueLoadRequestAfterNavigationPolicy:formState:]): if there is no request to continue with, don't reset things like the provisional data source since it was never unset in this case
+        (-[WebFrame _loadDataSource:withLoadType:formState:]): don't call stopLoading, _setLoadType and _setProvisionalDataSource, since that stops the frame even for command-click and option-click. Do this work in _prepareForProvisionalLoadWithDataSource:loadType: instead.
+
 2003-06-10  Richard Williams   <rjw at apple.com>
 
 	Fixed 3287862.  Don't override resize flags
diff --git a/WebKit/WebView.subproj/WebFrame.m b/WebKit/WebView.subproj/WebFrame.m
index 097bc91..7e76c15 100644
--- a/WebKit/WebView.subproj/WebFrame.m
+++ b/WebKit/WebView.subproj/WebFrame.m
@@ -146,6 +146,9 @@
     [_private->dataSource _stopLoading];
     [_private->scheduledLayoutTimer invalidate];
     _private->scheduledLayoutTimer = nil;
+
+    // Release the provisional data source because there's no point in keeping it around since it is unused in this case.
+    [self _setProvisionalDataSource:nil];
 }
 
 
diff --git a/WebKit/WebView.subproj/WebFramePrivate.h b/WebKit/WebView.subproj/WebFramePrivate.h
index 53cb543..bb6cfd0 100644
--- a/WebKit/WebView.subproj/WebFramePrivate.h
+++ b/WebKit/WebView.subproj/WebFramePrivate.h
@@ -82,6 +82,8 @@ extern NSString *WebCorePageCacheStateKey;
     id policyTarget;
     SEL policySelector;
     WebFormState *policyFormState;
+    WebDataSource *policyDataSource;
+    WebFrameLoadType policyLoadType;
 
     BOOL justOpenedForTargetedLink;
     BOOL quickRedirectComing;
diff --git a/WebKit/WebView.subproj/WebFramePrivate.m b/WebKit/WebView.subproj/WebFramePrivate.m
index 14de4c2..3bed67a 100644
--- a/WebKit/WebView.subproj/WebFramePrivate.m
+++ b/WebKit/WebView.subproj/WebFramePrivate.m
@@ -182,6 +182,7 @@ NSString *WebCorePageCacheStateKey = @"WebCorePageCacheState";
     ASSERT(policyFrameName == nil);
     ASSERT(policyTarget == nil);
     ASSERT(policyFormState == nil);
+    ASSERT(policyDataSource == nil);
 
     [super dealloc];
 }
@@ -218,7 +219,8 @@ NSString *WebCorePageCacheStateKey = @"WebCorePageCacheState";
 
 - (WebDataSource *)provisionalDataSource { return provisionalDataSource; }
 - (void)setProvisionalDataSource: (WebDataSource *)d
-{ 
+{
+    ASSERT(!d || !provisionalDataSource);
     [d retain];
     [provisionalDataSource release];
     provisionalDataSource = d;
@@ -923,8 +925,8 @@ static CFAbsoluteTime _timeOfLastCompletedLoad;
                     LOG(Loading, "%@:  checking complete in WebFrameStateProvisional, load done", [self name]);
 
                     [[[self webView] _frameLoadDelegateForwarder] webView:_private->webView
-                                               didFailProvisionalLoadWithError:[pd _mainDocumentError]
-                                                                      forFrame:self];
+                                          didFailProvisionalLoadWithError:[pd _mainDocumentError]
+                                                                 forFrame:self];
 
                     // We know the provisional data source didn't cut the muster, release it.
                     [self _setProvisionalDataSource:nil];
@@ -1422,12 +1424,14 @@ static CFAbsoluteTime _timeOfLastCompletedLoad;
     id target = _private->policyTarget;
     SEL selector = _private->policySelector;
     WebFormState *formState = _private->policyFormState;
+    WebDataSource *dataSource = _private->policyDataSource;
 
     _private->policyRequest = nil;
     _private->policyFrameName = nil;
     _private->policyTarget = nil;
     _private->policySelector = nil;
     _private->policyFormState = nil;
+    _private->policyDataSource = nil;
 
     if (call) {
 	if (frameName) {
@@ -1441,6 +1445,7 @@ static CFAbsoluteTime _timeOfLastCompletedLoad;
     [frameName release];
     [target release];
     [formState release];
+    [dataSource release];
 }
 
 - (void)_checkNewWindowPolicyForRequest:(NSURLRequest *)request action:(NSDictionary *)action frameName:(NSString *)frameName formState:(WebFormState *)formState andCall:(id)target withSelector:(SEL)selector
@@ -1456,10 +1461,11 @@ static CFAbsoluteTime _timeOfLastCompletedLoad;
     _private->policyFormState = [formState retain];
 
     WebView *wv = [self webView];
-    [[wv _policyDelegateForwarder] webView:wv decidePolicyForNewWindowAction:action
-                                                                   request:request
-                                                              newFrameName:frameName
-                                                          decisionListener:listener];
+    [[wv _policyDelegateForwarder] webView:wv
+            decidePolicyForNewWindowAction:action
+                                   request:request
+                              newFrameName:frameName
+                          decisionListener:listener];
     
     [listener release];
 }
@@ -1494,8 +1500,23 @@ static CFAbsoluteTime _timeOfLastCompletedLoad;
     [target performSelector:selector withObject:(shouldContinue ? request : nil) withObject:frameName withObject:formState];
 }
 
+- (void)_prepareForProvisionalLoadWithDataSource:(WebDataSource *)provisionalDataSource loadType:(WebFrameLoadType)loadType
+{
+    // This method is called after the client has decided a navigation policy of "use" for a request.
+    // Since we also do navigation policy checks for redirects, this method may be called multiple times
+    // per frame load, but it should only do the below work after the first navigation policy check. 
+    if (_private->provisionalDataSource != provisionalDataSource) {
+        [self stopLoading];
+        [self _setLoadType:loadType];
+        [self _setProvisionalDataSource:provisionalDataSource];
+    }
+}
 
-- (void)_checkNavigationPolicyForRequest:(NSURLRequest *)request dataSource:(WebDataSource *)dataSource formState:(WebFormState *)formState andCall:(id)target withSelector:(SEL)selector
+- (void)_checkNavigationPolicyForRequest:(NSURLRequest *)request
+                              dataSource:(WebDataSource *)dataSource
+                               formState:(WebFormState *)formState
+                                 andCall:(id)target
+                            withSelector:(SEL)selector
 {
     NSDictionary *action = [dataSource _triggeringAction];
     if (action == nil) {
@@ -1503,35 +1524,31 @@ static CFAbsoluteTime _timeOfLastCompletedLoad;
         [dataSource _setTriggeringAction:action];
     }
 
-    // Don't ask more than once for the same request
-    if ([request isEqual:[dataSource _lastCheckedRequest]]) {
-        [target performSelector:selector withObject:request withObject:nil];
-        return;
-    }
-
-    // If we are loading the empty URL, don't bother to ask - clients
-    // are likely to get confused.
-    if ([[[request URL] absoluteString] length] == 0) {
+    // Don't ask more than once for the same request or if we are loading an empty URL.
+    // This avoids confusion on the part of the client.
+    if ([request isEqual:[dataSource _lastCheckedRequest]] || [[[request URL] absoluteString] length] == 0) {
+        [self _prepareForProvisionalLoadWithDataSource:dataSource loadType:_private->policyLoadType];
         [target performSelector:selector withObject:request withObject:nil];
         return;
     }
 
     [dataSource _setLastCheckedRequest:request];
 
-    WebPolicyDecisionListener *listener = [[WebPolicyDecisionListener alloc]
-        _initWithTarget:self action:@selector(_continueAfterNavigationPolicy:)];
-
+    WebPolicyDecisionListener *listener = [[WebPolicyDecisionListener alloc] _initWithTarget:self action:@selector(_continueAfterNavigationPolicy:)];
+    
     _private->policyRequest = [request retain];
     _private->policyTarget = [target retain];
     _private->policySelector = selector;
     _private->listener = [listener retain];
     _private->policyFormState = [formState retain];
+    _private->policyDataSource = [dataSource retain];
 
     WebView *wv = [self webView];
-    [[wv _policyDelegateForwarder] webView:wv decidePolicyForNavigationAction:action
-                                                                    request:request
-                                                                      frame:self
-                                                           decisionListener:listener];
+    [[wv _policyDelegateForwarder] webView:wv
+           decidePolicyForNavigationAction:action
+                                   request:request
+                                     frame:self
+                          decisionListener:listener];
     
     [listener release];
 }
@@ -1542,7 +1559,9 @@ static CFAbsoluteTime _timeOfLastCompletedLoad;
     id target = [[_private->policyTarget retain] autorelease];
     SEL selector = _private->policySelector;
     WebFormState *formState = [[_private->policyFormState retain] autorelease];
-
+    WebDataSource *dataSource = [[_private->policyDataSource retain] autorelease];
+    WebFrameLoadType loadType = _private->policyLoadType;
+    
     // will release _private->policy* objects, hence the above retains
     [self _invalidatePendingPolicyDecisionCallingDefaultAction:NO];
 
@@ -1559,6 +1578,7 @@ static CFAbsoluteTime _timeOfLastCompletedLoad;
         if (![WebView _canHandleRequest:request]) {
             [self _handleUnimplementablePolicyWithErrorCode:WebKitErrorCannotShowURL forURL:[request URL]];
         } else {
+            [self _prepareForProvisionalLoadWithDataSource:dataSource loadType:loadType];
             shouldContinue = YES;
         }
         break;
@@ -1606,7 +1626,7 @@ static CFAbsoluteTime _timeOfLastCompletedLoad;
     }
 
     [[[self webView] _frameLoadDelegateForwarder] webView:_private->webView
-                           didChangeLocationWithinPageForFrame:self];
+                      didChangeLocationWithinPageForFrame:self];
 }
 
 - (void)_addExtraFieldsToRequest:(NSMutableURLRequest *)request alwaysFromRequest: (BOOL)f
@@ -1674,7 +1694,12 @@ static CFAbsoluteTime _timeOfLastCompletedLoad;
 	if (targetFrame != nil) {
 	    [targetFrame _loadURL:URL referrer:referrer loadType:loadType target:nil triggeringEvent:event form:form formValues:values];
 	} else {
-	    [self _checkNewWindowPolicyForRequest:request action:action frameName:target formState:formState andCall:self withSelector:@selector(_continueLoadRequestAfterNewWindowPolicy:frameName:formState:)];
+	    [self _checkNewWindowPolicyForRequest:request
+                                    action:action
+                                 frameName:target
+                                 formState:formState
+                                   andCall:self
+                              withSelector:@selector(_continueLoadRequestAfterNewWindowPolicy:frameName:formState:)];
 	}
 	[request release];
 	[formState release];
@@ -1708,7 +1733,11 @@ static CFAbsoluteTime _timeOfLastCompletedLoad;
 
         [oldDataSource _setTriggeringAction:action];
         [self _invalidatePendingPolicyDecisionCallingDefaultAction:YES];
-        [self _checkNavigationPolicyForRequest:request dataSource:oldDataSource formState:formState andCall:self withSelector:@selector(_continueFragmentScrollAfterNavigationPolicy:formState:)];
+        [self _checkNavigationPolicyForRequest:request
+                                    dataSource:oldDataSource
+                                     formState:formState
+                                       andCall:self
+                                  withSelector:@selector(_continueFragmentScrollAfterNavigationPolicy:formState:)];
     } else {
         [self _loadRequest:request triggeringAction:action loadType:loadType formState:formState];
         if (_private->quickRedirectComing) {
@@ -2035,9 +2064,6 @@ static CFAbsoluteTime _timeOfLastCompletedLoad;
 -(void)_continueLoadRequestAfterNavigationPolicy:(NSURLRequest *)request formState:(WebFormState *)formState
 {
     if (!request) {
-        [self _resetBackForwardListToCurrent];
-        [self _setLoadType: WebFrameLoadTypeStandard];
-        [self _setProvisionalDataSource:nil];
         return;
     }
     
@@ -2084,9 +2110,7 @@ static CFAbsoluteTime _timeOfLastCompletedLoad;
 
     ASSERT([self frameView] != nil);
 
-    [self stopLoading];
-
-    [self _setLoadType:loadType];
+    _private->policyLoadType = loadType;
 
     WebFrame *parentFrame = [self parentFrame];
     if (parentFrame) {
@@ -2096,11 +2120,11 @@ static CFAbsoluteTime _timeOfLastCompletedLoad;
     [newDataSource _setJustOpenedForTargetedLink:_private->justOpenedForTargetedLink];
     _private->justOpenedForTargetedLink = NO;
 
-    [self _setProvisionalDataSource:newDataSource];
-    
-    ASSERT([newDataSource webFrame] == self);
-
-    [self _checkNavigationPolicyForRequest:[newDataSource request] dataSource:newDataSource formState:formState andCall:self withSelector:@selector(_continueLoadRequestAfterNavigationPolicy:formState:)];
+    [self _checkNavigationPolicyForRequest:[newDataSource request]
+                                dataSource:newDataSource
+                                 formState:formState
+                                   andCall:self
+                              withSelector:@selector(_continueLoadRequestAfterNavigationPolicy:formState:)];
 }
 
 - (void)_setJustOpenedForTargetedLink:(BOOL)justOpened

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list