9f2cb1114c1e3a82e321e6ebef8803cca1a6f90d
[WebKit-https.git] / WebKit / Loader / WebIconLoader.m
1 /*
2  * Copyright (C) 2005 Apple Computer, Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer. 
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution. 
13  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14  *     its contributors may be used to endorse or promote products derived
15  *     from this software without specific prior written permission. 
16  *
17  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28 #import <WebKit/WebIconLoader.h>
29
30 #import <JavaScriptCore/Assertions.h>
31 #import <WebKit/WebFrameLoader.h>
32 #import <WebKit/WebIconDatabase.h>
33 #import <WebKit/WebIconDatabaseBridge.h>
34 #import <WebKit/WebIconDatabasePrivate.h>
35 #import <WebKit/WebKitLogging.h>
36
37 #import <WebKit/WebNSURLExtras.h>
38
39 @interface WebIconLoaderPrivate : NSObject
40 {
41 @public
42     NSURLRequest *initialRequest;
43 }
44
45 @end;
46
47 @implementation WebIconLoaderPrivate
48
49 - (void)dealloc
50 {
51     [initialRequest release];
52     [super dealloc];
53 }
54
55 @end;
56
57 @implementation WebIconLoader
58
59 - (id)initWithRequest:(NSURLRequest *)initialRequest;
60 {
61     ASSERT([[WebIconDatabase sharedIconDatabase] _isEnabled]);
62     [super init];
63     _private = [[WebIconLoaderPrivate alloc] init];
64     _private->initialRequest = [initialRequest copy];
65     return self;
66 }
67
68 - (void)dealloc
69 {
70     [_private release];
71     [super dealloc];
72 }
73
74 - (NSURL *)URL
75 {
76     return [_private->initialRequest URL];
77 }
78
79 - (void)startLoading
80 {
81     [self loadWithRequest:_private->initialRequest];
82 }
83
84 - (void)stopLoading
85 {
86     [self cancel];
87 }
88
89 - (void)didFinishLoading
90 {
91 #ifdef ICONDEBUG
92     NSData *data;
93         
94     id response = [self response];
95     if ([response isKindOfClass:[NSHTTPURLResponse class]] && ([response statusCode] < 200 || [response statusCode] > 299))
96         data = nil;
97     else
98         data = [self resourceData];
99     
100     if (data) {
101         [[WebIconDatabaseBridge sharedBridgeInstance] _setIconData:data forIconURL:[[self URL] _web_originalDataAsString]];
102         LOG(IconDatabase, "NewDB - Icon data set for URL %@", [[self URL] _web_originalDataAsString]);
103     } else {
104         [[WebIconDatabaseBridge sharedBridgeInstance] _setHaveNoIconForIconURL:[[self URL] _web_originalDataAsString]];
105         LOG(IconDatabase, "NewDB - No icon for URL %@", [[self URL] _web_originalDataAsString]);
106     }
107     [frameLoader _iconLoaderReceivedPageIcon:[self URL]];
108     [super didFinishLoading];
109 #else
110     NSImage *icon;
111     
112     NS_DURING
113         NSData *data = [self resourceData];
114         icon = [data length] > 0 ? [[NSImage alloc] initWithData:data] : nil;
115     NS_HANDLER
116         icon = nil;
117     NS_ENDHANDLER
118     
119
120     if ([[icon representations] count] > 0) {
121         [[WebIconDatabase sharedIconDatabase] _setIcon:icon forIconURL:[[self URL] _web_originalDataAsString]];
122     } else {
123         [[WebIconDatabase sharedIconDatabase] _setHaveNoIconForIconURL:[[self URL] _web_originalDataAsString]];
124     }
125
126     [frameLoader _iconLoaderReceivedPageIcon:[self URL]];
127     [icon release];
128     [super didFinishLoading];
129 #endif
130 }
131
132 - (NSURLRequest *)willSendRequest:(NSURLRequest *)newRequest redirectResponse:(NSURLResponse *)redirectResponse;
133 {
134     ASSERT(!reachedTerminalState);
135     
136     // We now allow a WebIconLoader without an associated WebDataSource for kicking off a contextless icon load,
137     // so we override this special case in WebIconLoader only.  If we passed this through to the super class version,
138     // it would pass back a nil Request so the icon wouldn't actually load because it is designed to be part of a page load
139     if (!frameLoader) 
140         return newRequest;
141     return [super willSendRequest:newRequest redirectResponse:redirectResponse];
142 }
143
144 // We don't ever want to prompt for authentication just for a site icon, so
145 // override this WebBaseResourceDelegate method to refuse the challenge
146 - (void)didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
147 {
148     [[challenge sender] cancelAuthenticationChallenge:challenge];
149 }
150
151 - (void)didCancelAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
152 {
153 }
154
155 @end