initial import
[vuplus_webkit] / Tools / DumpRenderTree / mac / WebArchiveDumpSupportMac.mm
1 /*
2  * Copyright (C) 2010 Apple 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  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
18  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
21  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #import "config.h"
27 #import "WebArchiveDumpSupport.h"
28
29 #import <CFNetwork/CFHTTPMessage.h>
30 #import <Foundation/Foundation.h>
31 #import <WebKit/WebHTMLRepresentation.h>
32 #import <wtf/RetainPtr.h>
33
34 extern "C" {
35
36 enum CFURLCacheStoragePolicy {
37   kCFURLCacheStorageAllowed = 0,
38   kCFURLCacheStorageAllowedInMemoryOnly = 1,
39   kCFURLCacheStorageNotAllowed = 2
40 };
41 typedef enum CFURLCacheStoragePolicy CFURLCacheStoragePolicy;
42
43 extern const CFStringRef kCFHTTPVersion1_1;
44
45 CFURLResponseRef CFURLResponseCreate(CFAllocatorRef alloc, CFURLRef URL, CFStringRef mimeType, SInt64 expectedContentLength, CFStringRef textEncodingName, CFURLCacheStoragePolicy recommendedPolicy);
46 CFURLResponseRef CFURLResponseCreateWithHTTPResponse(CFAllocatorRef alloc, CFURLRef URL, CFHTTPMessageRef httpResponse, CFURLCacheStoragePolicy recommendedPolicy);
47 void CFURLResponseSetExpectedContentLength(CFURLResponseRef response, SInt64 length);
48 void CFURLResponseSetMIMEType(CFURLResponseRef response, CFStringRef mimeType);
49
50 }
51
52 CFURLResponseRef createCFURLResponseFromResponseData(CFDataRef responseData)
53 {
54     // Decode NSURLResponse
55     RetainPtr<NSKeyedUnarchiver> unarchiver(AdoptNS, [[NSKeyedUnarchiver alloc] initForReadingWithData:(NSData *)responseData]);
56     NSURLResponse *response = [unarchiver.get() decodeObjectForKey:@"WebResourceResponse"]; // WebResourceResponseKey in WebResource.m
57     [unarchiver.get() finishDecoding];
58
59     if (![response isKindOfClass:[NSHTTPURLResponse class]])
60         return CFURLResponseCreate(kCFAllocatorDefault, (CFURLRef)[response URL], (CFStringRef)[response MIMEType], [response expectedContentLength], (CFStringRef)[response textEncodingName], kCFURLCacheStorageAllowed);
61
62     NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
63
64     // NSURLResponse is not toll-free bridged to CFURLResponse.
65     RetainPtr<CFHTTPMessageRef> httpMessage(AdoptCF, CFHTTPMessageCreateResponse(kCFAllocatorDefault, [httpResponse statusCode], 0, kCFHTTPVersion1_1));
66
67     NSDictionary *headerFields = [httpResponse allHeaderFields];
68     for (NSString *headerField in [headerFields keyEnumerator])
69         CFHTTPMessageSetHeaderFieldValue(httpMessage.get(), (CFStringRef)headerField, (CFStringRef)[headerFields objectForKey:headerField]);
70
71     return CFURLResponseCreateWithHTTPResponse(kCFAllocatorDefault, (CFURLRef)[response URL], httpMessage.get(), kCFURLCacheStorageAllowed);
72 }
73
74 CFArrayRef supportedNonImageMIMETypes()
75 {
76     return (CFArrayRef)[WebHTMLRepresentation supportedNonImageMIMETypes];
77 }