WebKit:
authorsullivan <sullivan@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 11 Mar 2004 20:12:54 +0000 (20:12 +0000)
committersullivan <sullivan@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 11 Mar 2004 20:12:54 +0000 (20:12 +0000)
        - fixed <rdar://problem/3585056>: Assertion failure if error page is loaded from
        webView:unableToImplementPolicyWithError:
        - also added HeaderDoc comments to could-be-API-soon methods and fixed a
        conceptual problem with said methods

        Reviewed by Darin.

        * WebView.subproj/WebDataSourcePrivate.h:
        added HeaderDoc comment for -unreachableURL

        * WebView.subproj/WebFramePrivate.h:
        added HeaderDoc comment for -loadAlternateHTMLString:baseURL:forUnreachableURL:;
        also added boolean delegateIsHandlingUnimplementablePolicy ivar to WebFramePrivate
        * WebView.subproj/WebFrame.m:
        (-[WebFrame _shouldReloadToHandleUnreachableURLFromRequest:]):
        treat delegateIsHandlingUnimplementablePolicy like delegateIsDecidingNavigationPolicy.
        Safari serves up error pages during the latter but clients are equally or more likely
        to do so during the former.
        (-[WebFrame _handleUnimplementablePolicyWithErrorCode:forURL:]):
        set delegateIsHandlingUnimplementablePolicy during delegate callback
        (-[WebFrame _continueLoadRequestAfterNavigationPolicy:formState:]):
        tweaked assertion so it doesn't erroneously fire for clients that call
        loadAlternateHTML:baseURL:forUnreachableURL: while processing
        webView:unableToImplementPolicyWithError:

WebBrowser:

        Removed obsolete comment I happened to notice.

        Reviewed by Darin..

        * BrowserWebController.m:
        (-[BrowserWebView webView:unableToImplementPolicyWithError:frame:]):

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

WebKit/ChangeLog
WebKit/WebView.subproj/WebDataSourcePrivate.h
WebKit/WebView.subproj/WebFrame.m
WebKit/WebView.subproj/WebFramePrivate.h

index 763e5bc433da1da1f56d0a25966bb914ce526b78..6f0444ee83bb264c810a7c9ea8344d65a32d1a30 100644 (file)
@@ -1,3 +1,30 @@
+2004-03-11  John Sullivan  <sullivan@apple.com>
+
+        - fixed <rdar://problem/3585056>: Assertion failure if error page is loaded from 
+        webView:unableToImplementPolicyWithError:
+        - also added HeaderDoc comments to could-be-API-soon methods and fixed a
+        conceptual problem with said methods
+
+        Reviewed by Darin.
+
+        * WebView.subproj/WebDataSourcePrivate.h:
+        added HeaderDoc comment for -unreachableURL
+        
+        * WebView.subproj/WebFramePrivate.h:
+        added HeaderDoc comment for -loadAlternateHTMLString:baseURL:forUnreachableURL:;
+        also added boolean delegateIsHandlingUnimplementablePolicy ivar to WebFramePrivate
+        * WebView.subproj/WebFrame.m:
+        (-[WebFrame _shouldReloadToHandleUnreachableURLFromRequest:]):
+        treat delegateIsHandlingUnimplementablePolicy like delegateIsDecidingNavigationPolicy.
+        Safari serves up error pages during the latter but clients are equally or more likely
+        to do so during the former.
+        (-[WebFrame _handleUnimplementablePolicyWithErrorCode:forURL:]):
+        set delegateIsHandlingUnimplementablePolicy during delegate callback
+        (-[WebFrame _continueLoadRequestAfterNavigationPolicy:formState:]):
+        tweaked assertion so it doesn't erroneously fire for clients that call
+        loadAlternateHTML:baseURL:forUnreachableURL: while processing
+        webView:unableToImplementPolicyWithError:
+
 2004-03-11  Chris Blumenberg  <cblu@apple.com>
 
        Made WebArchive a class instead of a data object. This allows clients to easily get the main resource and subresources from a WebArchive.
index 3d95e64d076de221ce164992ed7f815c57380770..0e85ed3319da7e9a37e43bfa1984d74a6d22c83f 100644 (file)
 - (WebResource *)subresourceForURL:(NSURL *)URL;
 - (void)addSubresource:(WebResource *)subresource;
 - (void)addSubresources:(NSArray *)subresources;
+
+/*!
+    @method unreachableURL
+    @discussion This will be non-nil only for dataSources created by calls to the 
+    WebFrame method loadAlternateHTMLString:baseURL:forUnreachableURL:.
+    @result returns the unreachableURL for which this dataSource is showing alternate content, or nil
+ */
 - (NSURL *)unreachableURL;
 
+// Other private methods
 - (NSDictionary *)_subresourcesDictionary;
 - (NSFileWrapper *)_fileWrapperForURL:(NSURL *)URL;
 
index 451252541ad49c39e74097b1d22a1f9f1a521ba4..054bda72d4484a2ce8d4a9eb65fb801b29854802 100644 (file)
@@ -307,7 +307,7 @@ NSString *WebPageCacheDocumentViewKey = @"WebPageCacheDocumentViewKey";
     // case handles malformed URLs and unknown schemes. Loading alternate content
     // at other times behaves like a standard load.
     WebDataSource *compareDataSource = nil;
-    if (_private->delegateIsDecidingNavigationPolicy) {
+    if (_private->delegateIsDecidingNavigationPolicy || _private->delegateIsHandlingUnimplementablePolicy) {
         compareDataSource = _private->policyDataSource;
     } else if (_private->delegateIsHandlingProvisionalLoadError) {
         compareDataSource = [self provisionalDataSource];
@@ -1214,7 +1214,9 @@ static CFAbsoluteTime _timeOfLastCompletedLoad;
 {
     NSError *error = [NSError _webKitErrorWithDomain:WebKitErrorDomain code:code URL:URL];
     WebView *wv = [self webView];
+    _private->delegateIsHandlingUnimplementablePolicy = YES;
     [[wv _policyDelegateForwarder] webView:wv unableToImplementPolicyWithError:error frame:self];    
+    _private->delegateIsHandlingUnimplementablePolicy = NO;
 }
 
 - (void)_clearProvisionalDataSource
@@ -2217,13 +2219,16 @@ static CFAbsoluteTime _timeOfLastCompletedLoad;
 
 -(void)_continueLoadRequestAfterNavigationPolicy:(NSURLRequest *)request formState:(WebFormState *)formState
 {
-    ASSERT(_private->policyDataSource);
-    
+    // If we loaded an alternate page to replace an unreachableURL, we'll get in here with a
+    // nil _private->policyDataSource because loading the alternate page will have passed
+    // through this method already, nested; otherwise, _private->policyDataSource should still be set.
+    ASSERT(_private->policyDataSource || [[self provisionalDataSource] unreachableURL] != nil);
+
     if (!request) {
         [self _setPolicyDataSource:nil];
         return;
     }
-
+    
     WebFrameLoadType loadType = _private->policyLoadType;
     WebDataSource *dataSource = [_private->policyDataSource retain];
     
index 1b67d18f0aeed030c0caec67a41a76391720a9a6..67b58e69c679005ba78359427f1c039896675c3c 100644 (file)
@@ -91,6 +91,7 @@ extern NSString *WebPageCacheDocumentViewKey;
     BOOL isStoppingLoad;
     BOOL delegateIsHandlingProvisionalLoadError;
     BOOL delegateIsDecidingNavigationPolicy;
+    BOOL delegateIsHandlingUnimplementablePolicy;
 }
 
 - (void)setName:(NSString *)name;
@@ -120,9 +121,22 @@ extern NSString *WebPageCacheDocumentViewKey;
 // API Considerations:
 - (void)loadWebArchive:(WebArchive *)webArchive;
 
-// unreachableURL represents a URL that couldn't be loaded; the HTML string acts as an error page for that URL
-- (void)loadAlternateHTMLString:(NSString *)string baseURL:(NSURL *)URL forUnreachableURL:(NSURL *)unreachableURL;
+/*!
+    @method loadAlternateHTMLString:baseURL:forUnreachableURL:
+    @abstract Loads a page to display as a substitute for a URL that could not be reached.
+    @discussion This allows clients to display page-loading errors in the webview itself.
+    This is typically called while processing the WebFrameLoadDelegate method
+    -webView:didFailProvisionalLoadWithError:forFrame: or one of the the WebPolicyDelegate methods
+    -webView:decidePolicyForMIMEType:request:frame:decisionListener: or
+    -webView:unableToImplementPolicyWithError:frame:. If it is called from within one of those
+    three delegate methods then the back/forward list will be maintained appropriately.
+    @param string The string to use for the main page of the document.
+    @param baseURL The baseURL to apply to relative URLs within the document.
+    @param unreachableURL The URL for which this page will serve as alternate content.
+*/
+- (void)loadAlternateHTMLString:(NSString *)string baseURL:(NSURL *)baseURL forUnreachableURL:(NSURL *)unreachableURL;
 
+// Other private methods
 - (NSURLRequest *)_webDataRequestForData:(NSData *)data MIMEType:(NSString *)MIMEType textEncodingName:(NSString *)encodingName baseURL:(NSURL *)URL unreachableURL:(NSURL *)unreachableURL;
 - (void)_loadRequest:(NSURLRequest *)request subresources:(NSArray *)subresources;