Changeset 158927 in webkit


Ignore:
Timestamp:
Nov 8, 2013 10:28:06 AM (10 years ago)
Author:
andersca@apple.com
Message:

Encode and decode NSURLRequests using NSCoder
https://bugs.webkit.org/show_bug.cgi?id=124051

Reviewed by Sam Weinig.

  • Shared/mac/WebCoreArgumentCodersMac.mm:

(CoreIPC::archiveAndEncodeObject):
(CoreIPC::decodeAndUnarchiveObject):
(CoreIPC::::encodePlatformData):
(CoreIPC::::decodePlatformData):

Location:
trunk/Source/WebKit2
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r158895 r158927  
     12013-11-08  Anders Carlsson  <andersca@apple.com>
     2
     3        Encode and decode NSURLRequests using NSCoder
     4        https://bugs.webkit.org/show_bug.cgi?id=124051
     5
     6        Reviewed by Sam Weinig.
     7
     8        * Shared/mac/WebCoreArgumentCodersMac.mm:
     9        (CoreIPC::archiveAndEncodeObject):
     10        (CoreIPC::decodeAndUnarchiveObject):
     11        (CoreIPC::::encodePlatformData):
     12        (CoreIPC::::decodePlatformData):
     13
    1142013-11-07  Anders Carlsson  <andersca@apple.com>
    215
  • trunk/Source/WebKit2/Shared/mac/WebCoreArgumentCodersMac.mm

    r158895 r158927  
    4040namespace CoreIPC {
    4141
     42#if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1090
     43static void archiveAndEncodeObject(ArgumentEncoder& encoder, id object, NSString *key)
     44{
     45    RetainPtr<NSMutableData> data = adoptNS([[NSMutableData alloc] init]);
     46    RetainPtr<NSKeyedArchiver> archiver = adoptNS([[NSKeyedArchiver alloc] initForWritingWithMutableData:data.get()]);
     47
     48    [archiver setRequiresSecureCoding:YES];
     49    [archiver.get() encodeObject:object forKey:key];
     50    [archiver finishEncoding];
     51    encoder << CoreIPC::DataReference(static_cast<const uint8_t*>([data bytes]), [data length]);
     52}
     53
     54template<typename T>
     55static bool decodeAndUnarchiveObject(ArgumentDecoder& decoder, NSString *key, RetainPtr<T>& result)
     56{
     57    CoreIPC::DataReference dataReference;
     58    if (!decoder.decode(dataReference))
     59        return false;
     60
     61    RetainPtr<NSData> data = adoptNS([[NSData alloc] initWithBytesNoCopy:const_cast<uint8_t*>(dataReference.data()) length:dataReference.size() freeWhenDone:NO]);
     62    RetainPtr<NSKeyedUnarchiver> unarchiver = adoptNS([[NSKeyedUnarchiver alloc] initForReadingWithData:data.get()]);
     63    [unarchiver setRequiresSecureCoding:YES];
     64    result = [unarchiver decodeObjectOfClass:[T class] forKey:key];
     65    return true;
     66}
     67#endif
     68
    4269void ArgumentCoder<ResourceRequest>::encodePlatformData(ArgumentEncoder& encoder, const ResourceRequest& resourceRequest)
    4370{
     
    5279    // We don't send HTTP body over IPC for better performance.
    5380    // Also, it's not always possible to do, as streams can only be created in process that does networking.
    54     if ([requestToSerialize.get() HTTPBody] || [requestToSerialize.get() HTTPBodyStream]) {
    55         requestToSerialize = adoptNS([requestToSerialize.get() mutableCopy]);
    56         [(NSMutableURLRequest *)requestToSerialize.get() setHTTPBody:nil];
    57         [(NSMutableURLRequest *)requestToSerialize.get() setHTTPBodyStream:nil];
    58     }
    59 
     81    if ([requestToSerialize HTTPBody] || [requestToSerialize HTTPBodyStream]) {
     82        requestToSerialize = adoptNS([requestToSerialize mutableCopy]);
     83        [(NSMutableURLRequest *)requestToSerialize setHTTPBody:nil];
     84        [(NSMutableURLRequest *)requestToSerialize setHTTPBodyStream:nil];
     85    }
     86
     87#if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1090
     88    archiveAndEncodeObject(encoder, requestToSerialize.get(), @"request");
     89#else
    6090    RetainPtr<CFDictionaryRef> dictionary = adoptCF(WKNSURLRequestCreateSerializableRepresentation(requestToSerialize.get(), CoreIPC::tokenNullTypeRef()));
    6191    CoreIPC::encode(encoder, dictionary.get());
     92#endif
    6293
    6394    // The fallback array is part of NSURLRequest, but it is not encoded by WKNSURLRequestCreateSerializableRepresentation.
     
    76107    }
    77108
     109#if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1090
     110    RetainPtr<NSURLRequest> nsURLRequest;
     111    if (!decodeAndUnarchiveObject(decoder, @"request", nsURLRequest))
     112        return false;
     113#else
    78114    RetainPtr<CFDictionaryRef> dictionary;
    79115    if (!CoreIPC::decode(decoder, dictionary))
    80116        return false;
    81117
    82     NSURLRequest *nsURLRequest = WKNSURLRequestFromSerializableRepresentation(dictionary.get(), CoreIPC::tokenNullTypeRef());
     118    RetainPtr<NSURLRequest> nsURLRequest = WKNSURLRequestFromSerializableRepresentation(dictionary.get(), CoreIPC::tokenNullTypeRef());
    83119    if (!nsURLRequest)
    84120        return false;
    85 
    86     resourceRequest = ResourceRequest(nsURLRequest);
     121#endif
     122
     123    resourceRequest = ResourceRequest(nsURLRequest.get());
    87124   
    88125    Vector<String> responseContentDispositionEncodingFallbackArray;
     
    108145
    109146#if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1090
    110     RetainPtr<NSMutableData> data = adoptNS([[NSMutableData alloc] init]);
    111     RetainPtr<NSKeyedArchiver> archiver = adoptNS([[NSKeyedArchiver alloc] initForWritingWithMutableData:data.get()]);
    112 
    113     [archiver setRequiresSecureCoding:YES];
    114     [archiver.get() encodeObject:resourceResponse.nsURLResponse() forKey:@"response"];
    115     [archiver finishEncoding];
    116 
    117     encoder << CoreIPC::DataReference(static_cast<const uint8_t*>([data bytes]), [data length]);
     147    archiveAndEncodeObject(encoder, resourceResponse.nsURLResponse(), @"response");
    118148#else
    119149    RetainPtr<CFDictionaryRef> dictionary = adoptCF(WKNSURLResponseCreateSerializableRepresentation(resourceResponse.nsURLResponse(), CoreIPC::tokenNullTypeRef()));
     
    134164
    135165#if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1090
    136     CoreIPC::DataReference dataReference;
    137     if (!decoder.decode(dataReference))
    138         return false;
    139 
    140     RetainPtr<NSData> data = adoptNS([[NSData alloc] initWithBytesNoCopy:const_cast<uint8_t*>(dataReference.data()) length:dataReference.size() freeWhenDone:NO]);
    141     RetainPtr<NSKeyedUnarchiver> unarchiver = adoptNS([[NSKeyedUnarchiver alloc] initForReadingWithData:data.get()]);
    142 
    143     [unarchiver setRequiresSecureCoding:YES];
    144     NSURLResponse *nsURLResponse = [unarchiver.get() decodeObjectOfClass:[NSURLResponse class] forKey:@"response"];
     166    RetainPtr<NSURLResponse> nsURLResponse;
     167    if (!decodeAndUnarchiveObject(decoder, @"response", nsURLResponse))
     168        return false;
    145169#else
    146170    RetainPtr<CFDictionaryRef> dictionary;
     
    148172        return false;
    149173
    150     NSURLResponse *nsURLResponse = WKNSURLResponseFromSerializableRepresentation(dictionary.get(), CoreIPC::tokenNullTypeRef());
     174    RetainPtr<NSURLResponse> nsURLResponse = WKNSURLResponseFromSerializableRepresentation(dictionary.get(), CoreIPC::tokenNullTypeRef());
    151175#endif
    152176
     
    154178        return false;
    155179
    156     resourceResponse = ResourceResponse(nsURLResponse);
     180    resourceResponse = ResourceResponse(nsURLResponse.get());
    157181    return true;
    158182}
Note: See TracChangeset for help on using the changeset viewer.